Compare commits

...

66 Commits

Author SHA1 Message Date
zenny 0a71978db2 Fix breakable wall lighting (hopefully) 2026-06-17 23:10:11 -07:00
zenny 8939460eda Walking SFX on different materials 2026-06-17 22:46:43 -07:00
zenny 30758cd28d Add more sigil component behavior 2026-06-17 20:58:08 -07:00
zenny 68a8769834 HP Drain sigil (shura) implementation
Drains 15% of damage done but HP isn't restored by VT timer
2026-06-17 19:09:09 -07:00
zenny 35f4b2018d Apply lighting fix to all Set A rooms, need to check Set B to see if same behavior occurs 2026-06-17 02:33:41 -07:00
zenny f6573607d9 Move spawn points around, fix lighting issue in statue room 2026-06-17 02:20:11 -07:00
zenny 138b4538e1 Make altar spawn behavior consistent with dungeon floors
Add missing audio/vfx/hitboxes to other directional attacks for most enemies
Play hit sound and pause slightly before playing death animation
2026-06-17 01:13:23 -07:00
zenny 9decb2a02d Fix issue where enemies will take a long time to attack after re-initiating combat timers.
Modified filth eater's behavior to shoot from far/attack from close
2026-06-16 23:03:42 -07:00
zenny f7c0476fa6 Stop animations when enemy dies, fix pixel melt issue (was melting all of the elemental damage effects too) 2026-06-16 21:53:53 -07:00
zenny 8158156f09 Add more sound effect implementations 2026-06-16 21:17:23 -07:00
zenny bbadf9ccec Mess with enemy lighting, time bad end better 2026-06-16 02:03:36 -07:00
zenny d4a27f6d4d Make key items (flower and key staff)
Implement fog door for unlockable doors
2026-06-16 00:01:49 -07:00
zenny 3e1ad0d0cb Fix light layer on accessories 2026-06-15 11:11:56 -07:00
zenny 4c9497de68 Lighting adjustments (make lights only affect enemy and not environment), collision box adjustments for agni demon 2026-06-15 01:12:53 -07:00
zenny 3afa0c4eeb Adjust lighting of all items and enemies 2026-06-15 00:08:25 -07:00
zenny 83624012b8 Add lighting to items too (might need to increase the light or find some way to visually indicate them in the world) 2026-06-14 02:10:02 -07:00
zenny 03d6957d3b Add small light to every 2D enemy, utilize CanMove tag to prevent some enemies (like Filth Eater) from moving while attacking (if it makes sense to do so) 2026-06-14 01:53:31 -07:00
zenny cdfb7e95a9 Check in annoying .import files that have stuck around for weeks 2026-06-13 21:52:57 -07:00
zenny 6620c86f57 Additional collision/avoidance changes for monstos 2026-06-13 21:42:42 -07:00
zenny 7b2483ee74 Adjust navigation avoidance code so that enemies attempt to avoid each other 2026-06-13 13:17:01 -07:00
zenny f55d7935f6 Set enemy spawn rates 2026-06-13 02:40:26 -07:00
zenny 3ab491e0af Fix mystery items not spawning, adjust spawning rates, fix pause/unpausing for debug menu 2026-06-13 01:26:38 -07:00
zenny 8575cd6ddf Revamp item spawn behavior 2026-06-12 18:09:52 -07:00
zenny 403b136c5c Revamp map route stuff 2026-06-11 20:53:16 -07:00
zenny fc598ab48f Enemy loot table, start revamping floor node code structure 2026-06-10 17:07:49 -07:00
zenny e889709a91 Add Key Item tag and restrict it from being used/thrown/dropped 2026-06-09 01:39:00 -07:00
zenny fa248e5ba1 Fix string for next floor on load screen to use display string name of next floor 2026-06-09 01:02:49 -07:00
zenny 714d3a771c Start cleaning up some UI, specifically Options menu. Use anchors to correctly position options after resizing window 2026-06-09 00:44:19 -07:00
zenny 31fcb275f5 Fix clipping sprites for dropped item (same fix for thrown item), fix regression on inventory selection, fix action result menu box (glitched text font)
Fix animation name for Tepotztli, fix centering of unarmed strike
2026-06-08 23:42:50 -07:00
zenny 1a7ee21fb5 Use mystery restorative right away 2026-06-08 23:18:38 -07:00
zenny 38177babc2 Fix issue where equipping a mystery item selected the wrong inventory item 2026-06-08 23:06:56 -07:00
zenny c7b47cb32e Remove chariot 2026-06-08 22:11:19 -07:00
zenny 5acfac10a5 Fix inverse sync of weapon attack for Last Reward
Fix typo for mystery weapon
2026-06-08 21:27:01 -07:00
zenny b30a8f3eb4 Break item on floor change whether its equipped or not 2026-06-08 20:55:21 -07:00
zenny 10a0dd69d1 Spawn timer for bad ending 2026-06-08 16:45:38 -07:00
zenny 5665e3306c Add unlock conditions for gallery 2026-06-08 16:00:27 -07:00
zenny 9b2e79dbd2 Add placeholder image for locked images, disable locked images in UI 2026-06-08 11:29:06 -07:00
zenny d2be390aa7 Start implementing specific image unlock conditions and gallery behavior 2026-06-08 01:26:08 -07:00
zenny 2ab6158849 Make adjustments to bad end map
Modify debug menu slightly to pause while open (need to close the menu to load floors, etc)
Clear map when game over screen appears
2026-06-08 00:08:25 -07:00
zenny 19bf9563b6 Minor UI fixes, add SFX 2026-06-07 19:07:15 -07:00
zenny d934461b23 (Hopefully) Persist inventory index when using/throwing/dropping items from inventory 2026-06-07 18:55:33 -07:00
zenny 696d995e61 Set equipment stats in item slot 2026-06-07 18:27:04 -07:00
zenny 380e275766 Use button prompt for inventory rescue menu 2026-06-07 18:15:00 -07:00
zenny 90242f7950 Center minimap, adjust weapon collision shape 2026-06-07 17:59:58 -07:00
zenny 71bf3046fc Fix sprite cutoff 2026-06-07 17:37:03 -07:00
zenny 1ec278d0bb Fix pause menu 2026-06-07 16:46:23 -07:00
zenny 313fbbd759 In progress changes for fixing minimaps in Set B rooms 2026-06-07 00:35:36 -07:00
zenny 2a16e2277b Swap SFX for level up and VT gain 2026-06-06 23:37:04 -07:00
zenny d2a81bb1cf Implement some Sigil behaviors 2026-06-06 23:32:13 -07:00
zenny 72f8b5c050 Small tweak to floor number display, increased chinthe speed, fix Return To Overworld option on floor clear menu 2026-06-06 17:19:48 -07:00
zenny 947d311f27 Fix swapped names of SetItem and Plastique
Add plastique to debug menu spawn
Make plastique damage player
Make plastique deal double damage to demon wall
Fix prompt for setting vs using plastique
2026-06-06 16:35:54 -07:00
zenny 85e74821ad Add rust immunity to rusted plate
Throw items in spray pattern for trickster's box
2026-06-06 15:58:31 -07:00
zenny 09db0ccd88 Enable/Disable environment when entering/exiting breakable wall room 2026-06-06 15:24:34 -07:00
zenny 011f72fb63 Plastique Explosion 2026-06-06 14:04:56 -07:00
zenny 543a967fd5 Add buff/debuff/heal/rust shaders for enemies and throwing glue jar immobilization 2026-06-06 13:54:47 -07:00
zenny 7b4fe37dd5 Fix animation players for demon wall arms 2026-06-06 12:14:12 -07:00
zenny 765821895b Add attack descriptions to lore info 2026-06-06 11:57:59 -07:00
zenny 07a7942d6d More generic implementation of enemies defeated count that relies on the EnemyLoreInfo name and puts that into a dictionary 2026-06-06 11:30:51 -07:00
zenny 0f849f11dc In progress changes for saving enemy defeated data 2026-06-06 10:52:08 -07:00
zenny bb46f0dcd9 Separate Stele concept from Npc 2026-06-04 23:38:59 -07:00
zenny d8b99e07de Save when talking to stele and record their ID in the save file 2026-06-04 23:06:01 -07:00
zenny 22ca9076e8 Set Sarco affinity types 2026-06-04 15:59:27 -07:00
zenny b9c1058566 Restructure Sigil implementation, add all sigils to debug menu 2026-06-04 14:59:35 -07:00
zenny 6b7bbd71af Persist Sarco data 2026-06-04 13:02:40 -07:00
zenny 150a21aabc Basic implementation for acquiring affinity sigil from Sarco 2026-06-04 12:24:58 -07:00
zenny 189497458d Fix minimap 2026-06-02 21:00:58 -07:00
601 changed files with 17523 additions and 15889 deletions
@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Zennysoft.Game.Abstractions.Audio
{
public enum SoundEffect
{
HealHP,
TakeDamage,
HealVT,
IncreaseStat,
DecreaseStat,
Crit,
PickupItem,
PickupFailure,
OpenInventory,
MoveUI,
Equip,
Unequip,
SortInventory,
SelectUI,
CancelUI,
LevelUp,
Transfer,
RecallEnemies,
KillHalfEnemies,
TeleportToRandomRoom,
TeleportToExit,
AbsorbHPFromAllEnemies,
SwapHPAndVT,
TurnAllEnemiesIntoHealingItems,
WeaponQuickSlash,
WeaponSlowSlash,
WeaponPlasmaSword,
Eucharistia,
Buff,
Debuff,
Death,
Glue,
Identify,
IdentifyAll,
Rust,
FireDamage,
WaterDamage,
AirDamage,
EarthDamage,
HolyDamage,
CurseDamage,
AbsorbHP,
}
}
@@ -0,0 +1,6 @@
namespace Zennysoft.Game.Abstractions
{
public interface IFloorSpawnTable
{
}
}
@@ -8,7 +8,7 @@ public enum ElementType
Hydric,
Igneous,
Ferrum,
Holy,
Curse,
Sankta,
Shura,
All
}
@@ -1,26 +1,37 @@
using Godot;
using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity;
namespace Zennysoft.Ma;
public interface ISigil : IEntityComponent
public interface ISigil
{
public double AttackModifier { get; set; }
[Export]
public double DamageModifier { get; }
[Export]
public double DefenseModifier { get; set; }
public double DefenseModifier { get; }
[Export]
public int HealthModifier { get; set; }
public double MoveSpeedModifier { get; }
[Export]
public int VTModifier { get; set; }
public double HealAmountModifier { get; }
[Export]
public double LuckModifier { get; set; }
public double VTDrainSpeedModifier { get; }
[Export]
public double ElementalModifier { get; set; }
public ElementType ElementType { get; }
[Export]
public ElementType ElementType { get; set; }
public ElementalResistanceSet ElementalResistanceSet { get; }
[Export] public SigilTag SigilTag { get; }
}
public enum SigilTag
{
None,
AutoRevive,
HPDrain,
}
@@ -19,8 +19,8 @@ namespace Zennysoft.Ma.Adapter.Entity
{ ElementType.Igneous, igneousResistance },
{ ElementType.Ferrum, ferrumResistance },
{ ElementType.Telluric, telluricResistance },
{ ElementType.Holy, holyResistance },
{ ElementType.Curse, curseResistance },
{ ElementType.Sankta, holyResistance },
{ ElementType.Shura, curseResistance },
{ ElementType.All, aeolicResistance + hydricResistance + igneousResistance + ferrumResistance + telluricResistance + holyResistance + curseResistance },
};
}
@@ -33,8 +33,8 @@ namespace Zennysoft.Ma.Adapter.Entity
left.ElementalResistance[ElementType.Igneous] + right.ElementalResistance[ElementType.Igneous],
left.ElementalResistance[ElementType.Ferrum] + right.ElementalResistance[ElementType.Ferrum],
left.ElementalResistance[ElementType.Telluric] + right.ElementalResistance[ElementType.Telluric],
left.ElementalResistance[ElementType.Holy] + right.ElementalResistance[ElementType.Holy],
left.ElementalResistance[ElementType.Curse] + right.ElementalResistance[ElementType.Curse]);
left.ElementalResistance[ElementType.Sankta] + right.ElementalResistance[ElementType.Sankta],
left.ElementalResistance[ElementType.Shura] + right.ElementalResistance[ElementType.Shura]);
}
}
}
@@ -21,6 +21,14 @@ namespace Zennysoft.Ma.Adapter.Entity
public void OnMorph();
public void OnBuff();
public void OnDebuff();
public void OnHealed();
public int GetDefeatCount(IEnemy enemyType);
public IDungeonRoom GetCurrentRoom(ImmutableList<IDungeonRoom> dungeonRooms);
public void MoveEnemyToNewRoom(IDungeonRoom newRoom);
@@ -35,6 +43,10 @@ namespace Zennysoft.Ma.Adapter.Entity
public ElementalResistanceSet ElementalResistanceSet { get; }
public void SetEnemySpeedByMultiplier(double multiplier);
public IEnemyLootTable LootTable { get; }
public int InitialHP { get; }
public int InitialAttack { get; }
@@ -0,0 +1,6 @@
namespace Zennysoft.Ma.Adapter.Entity;
public interface IEnemyLootTable
{
}
@@ -202,3 +202,23 @@ public class RevivePlayerAugment : IAugmentType
_player.AutoRevive = false;
}
}
public class KeyStaffAugment : IAugmentType
{
private readonly IPlayer _player;
public KeyStaffAugment(IPlayer player)
{
_player = player;
}
public void Apply()
{
_player.CanOpenDoors = true;
}
public void Remove()
{
_player.CanOpenDoors &= false;
}
}
@@ -3,5 +3,6 @@
public enum ArmorTag
{
None,
DegradeOnHit
DegradeOnHit,
ImmuneToRust
}
@@ -23,5 +23,6 @@ public enum ItemTag
UseAllItems,
GlueOnEquip,
BreaksOnUnequip,
ContainsJewel
ContainsJewel,
KeyItem
}
@@ -17,5 +17,6 @@ public enum JewelTags
ReviveUserOnce,
TelluricElement,
IncreaseAtkDefLuck,
IncreaseLuck
IncreaseLuck,
KeyStaff
}
@@ -12,6 +12,8 @@ public partial class GameState
public readonly record struct LoadNextFloor;
public readonly record struct ReturnToOverworld;
public readonly record struct InventoryButtonPressed;
public readonly record struct InteractButtonPressed;
@@ -20,6 +20,8 @@ public partial class GameState
public readonly record struct LoadNextFloor;
public readonly record struct ReturnToOverworld;
public readonly record struct OpenTeleportScreen;
public readonly record struct OpenFloorExitScreen;
@@ -8,11 +8,12 @@ public partial class GameState
public partial record State
{
[Meta, LogicBlock(typeof(State), Diagram = true)]
public partial record FloorExitScreen : State, IGet<Input.LoadNextFloor>
public partial record FloorExitScreen : State, IGet<Input.LoadNextFloor>, IGet<Input.ReturnToOverworld>
{
public FloorExitScreen()
{
OnAttach(() => Get<IGameRepo>().Pause());
OnDetach(() => Get<IGameRepo>().Resume());
}
public Transition On(in Input.LoadNextFloor input)
@@ -20,6 +21,12 @@ public partial class GameState
Output(new Output.LoadNextFloor());
return To<InGame>();
}
public Transition On(in Input.ReturnToOverworld input)
{
Output(new Output.ReturnToOverworld());
return To<InGame>();
}
}
}
}
@@ -1,5 +1,6 @@
using Godot;
using Zennysoft.Game.Abstractions;
using Zennysoft.Ma.Adapter;
public interface IBaseInventoryItem
@@ -7,10 +8,15 @@ public interface IBaseInventoryItem
public string ItemName { get; }
public string StatDescription { get; }
public string FlavorText { get; }
public float SpawnRate { get; }
public int ThrowDamage { get; }
public float ThrowSpeed { get; }
public ItemTag ItemTag { get; }
public abstract Texture2D GetTexture();
public float SpawnRate { get; }
public RarityTag RarityTag { get; }
public IFloorSpawnTable SpawnsOn { get; }
}
@@ -8,6 +8,11 @@ public class RescuedItemDatabase
private List<IBaseInventoryItem> _items { get; init; }
private int _maxSize { get; init; } = 20;
public RescuedItemDatabase()
{
_items = [];
}
public RescuedItemDatabase(int maxSize)
{
_items = [];
@@ -0,0 +1,33 @@
namespace Zennysoft.Ma.Adapter;
public enum FloorType
{
Overworld,
Altar,
Floor01,
Floor02,
Floor03,
Floor04,
Floor05,
Floor06,
Floor07,
Floor09,
Floor10,
Floor11,
Floor12,
Floor13,
Floor14,
Floor15,
BossFloorA,
BossFloorB,
GoddessOfGuidance,
TrueGoddessOfGuidance,
Cellular,
Grassland,
Platform,
River,
Server,
FinalFloor,
BadEnd,
HeartOfAllThings
}
@@ -11,5 +11,7 @@ public interface IDungeonFloor : INode3D
public ImmutableList<IDungeonRoom> Rooms { get; }
public IDungeonRoom GetPlayersCurrentRoom();
public bool FloorIsLoaded { get; set; }
}
@@ -0,0 +1,12 @@
using Godot.Collections;
namespace Zennysoft.Ma.Adapter;
public enum RarityTag
{
Common, // 50%
Uncommon, // 35%
Rare, // 14%
Legendary, // 1%
NotSpawnable
}
@@ -0,0 +1,9 @@
namespace Zennysoft.Ma.Adapter;
public enum GroundType
{
Dirt,
Concrete,
Metal,
Marble
}
@@ -1,6 +1,7 @@
using Chickensoft.GodotNodeInterfaces;
using Godot;
using Zennysoft.Game.Abstractions;
using Zennysoft.Game.Abstractions.Audio;
namespace Zennysoft.Ma.Adapter;
@@ -30,10 +31,14 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void SetSigil(ISigil sigil);
public void ShowCamera(bool showCamera);
public void ApplyNewAugment(IAugmentItem jewel, IAugmentableItem equipableItem);
public IBaseInventoryItem IdentifyItem(IBaseInventoryItem unidentifiedItem);
public void ShakePlayerCamera(float shakeIntensity, float shakeAmount);
public IInventory Inventory { get; }
public IHealthComponent HealthComponent { get; }
@@ -60,6 +65,9 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void PlaySpellFX(SpellFXEnum spellEnum);
public void SetPlayerWalkSFX(GroundType groundType);
public bool AutoRevive { get; set; }
public int TotalAttack { get; }
@@ -74,6 +82,8 @@ public interface IPlayer : IKillable, ICharacterBody3D
public bool BriefImmunity { get; set; }
public bool CanOpenDoors { get; set; }
public event Action PlayerDied;
public delegate IBaseInventoryItem RerollItem(IBaseInventoryItem item);
}
@@ -0,0 +1,11 @@
using Chickensoft.Introspection;
using Chickensoft.Serialization;
namespace Zennysoft.Ma.Adapter;
[Meta, Id("npc_data")]
public partial record NpcData
{
[Save("stele_list")]
public required List<int> SteleDiscovered { get; set; }
}
@@ -0,0 +1,29 @@
using Chickensoft.Introspection;
using Chickensoft.Serialization;
namespace Zennysoft.Ma.Adapter;
[Meta, Id("sarco_data")]
public partial record SarcoData
{
[Save("aeolic_sarco")]
public bool AeolicSarcoAcquired { get; set; } = false;
[Save("igneous_sarco")]
public bool IgneousSarcoAcquired { get; set; } = false;
[Save("telluric_sarco")]
public bool TelluricSarcoAcquired { get; set; } = false;
[Save("hydric_sarco")]
public bool HydricSarcoAcquired { get; set; } = false;
[Save("ferrum_sarco")]
public bool FerrumSarcoAcquired { get; set; } = false;
[Save("sankta_sarco")]
public bool SanktaSarcoAcquired { get; set; } = false;
[Save("shura_sarco")]
public bool ShuraSarcoAcquired { get; set; } = false;
}
@@ -0,0 +1,13 @@
using Chickensoft.Introspection;
using Chickensoft.Serialization;
namespace Zennysoft.Ma.Adapter;
[Meta, Id("stat_data")]
public partial record StatData
{
[Save("enemies_defeated")]
public Dictionary<string, int> EnemiesDefeated { get; set; } = [];
public int TotalEnemiesDefeated => EnemiesDefeated.Values.Sum();
}
+1 -1
View File
@@ -284,7 +284,7 @@ EnemyViewerWalk={
[internationalization]
locale/translations_pot_files=PackedStringArray("res://src/dialog/Dialogue.dialogue", "res://src/npc/Ran/ran.dialogue", "res://src/npc/Rat/ratdialogue.dialogue", "res://src/dialog/Altar.dialogue", "res://stone.dialogue", "res://src/npc/Proscenium/JumpScare.dialogue")
locale/translations_pot_files=PackedStringArray("res://src/dialog/Dialogue.dialogue", "res://src/npc/Ran/ran.dialogue", "res://src/npc/Rat/ratdialogue.dialogue", "res://src/dialog/Altar.dialogue", "res://stone.dialogue", "res://src/npc/Proscenium/JumpScare.dialogue", "res://src/map/Placeables/sarco.dialogue")
[layer_names]
@@ -1,6 +1,7 @@
using Chickensoft.Collections;
using Godot;
using System;
using Zennysoft.Game.Abstractions.Audio;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
+133 -5
View File
@@ -1,9 +1,12 @@
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using Chickensoft.SaveFileBuilder;
using Chickensoft.Serialization;
using Godot;
using NathanHoad;
using SimpleInjector.Lifestyles;
using System.IO;
using System.IO.Abstractions;
using System.Threading.Tasks;
using Zennysoft.Game.Abstractions;
@@ -12,10 +15,13 @@ using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
public interface IApp : INode, IProvide<IAppRepo>;
public interface IApp : INode, IProvide<IAppRepo>, IProvide<IApp>
{
public GalleryData GalleryData { get; }
}
[Meta(typeof(IAutoNode))]
public partial class App : Node, IApp
public partial class App : Node, IApp, IProvide<ISaveChunk<GalleryData>>
{
public override void _Notification(int what) => this.Notify(what);
@@ -33,22 +39,31 @@ public partial class App : Node, IApp
IAppRepo IProvide<IAppRepo>.Value() => AppRepo;
IApp IProvide<IApp>.Value() => this;
public IAppRepo AppRepo { get; set; } = default!;
public IAppLogic AppLogic { get; set; } = default!;
public AppLogic.IBinding AppBinding { get; set; } = default!;
private Godot.Collections.Array _progress;
private SimpleInjector.Container _container;
private IMaSaveFileManager _gallerySaveDataManager;
private EnemyViewer _dataViewer;
private bool _loadingGame = false;
private bool _loadingEnemyViewer = false;
private string _optionsSavePath = string.Empty;
private string _controllerSavePath = string.Empty;
private string _gallerySavePath = string.Empty;
private ISaveFileManager _saveFileManager;
private IGame _game;
private IEnemyViewer _enemyViewer;
public ISaveChunk<GalleryData> GameChunk { get; set; } = default!;
ISaveChunk<GalleryData> IProvide<ISaveChunk<GalleryData>>.Value() => GameChunk;
public ISaveFile<GalleryData> GallerySaveFile { get; set; } = default!;
public GalleryData GalleryData { get; private set; }
private double _reportedProgress = 0;
public void Initialize()
@@ -63,6 +78,64 @@ public partial class App : Node, IApp
_saveFileManager = _container.GetInstance<ISaveFileManager>();
_optionsSavePath = $"{OS.GetUserDataDir()}/options.json";
_controllerSavePath = $"{OS.GetUserDataDir()}/controls.json";
_gallerySavePath = $"{OS.GetUserDataDir()}/gallery.json";
GalleryData = new GalleryData();
GameChunk = new SaveChunk<GalleryData>(
(chunk) =>
{
var galleryData = new GalleryData()
{
SproingyFifty = GalleryData.SproingyFifty,
MichaelFifty = GalleryData.MichaelFifty,
FilthEaterFifty = GalleryData.FilthEaterFifty,
SaraFifty = GalleryData.SaraFifty,
BallosFifty = GalleryData.BallosFifty,
PlanterFifty = GalleryData.PlanterFifty,
ChintheFifty = GalleryData.ChintheFifty,
AmbassadorGreenFifty = GalleryData.AmbassadorGreenFifty,
AmbassadorRedFifty = GalleryData.AmbassadorRedFifty,
AmbassadorSteelFifty = GalleryData.AmbassadorSteelFifty,
AgniDemonFifty = GalleryData.AgniDemonFifty,
AqueousDemonFifty = GalleryData.AqueousDemonFifty,
EdenPillarFifty = GalleryData.EdenPillarFifty,
PalanFifty = GalleryData.PalanFifty,
ShieldOfHeavenFifty = GalleryData.ShieldOfHeavenFifty,
GoldSproingFifty = GalleryData.GoldSproingFifty,
TotalEnemiesFifty = GalleryData.TotalEnemiesFifty,
TotalEnemiesHundred = GalleryData.TotalEnemiesHundred,
NormalEnd = GalleryData.NormalEnd,
TrueEnd = GalleryData.TrueEnd,
BadEnd = GalleryData.BadEnd,
StelesTen = GalleryData.StelesTen
};
return galleryData;
},
onLoad:
(chunk, data) =>
{
GalleryData = data ?? new GalleryData();
});
_gallerySaveDataManager = new MaSaveFileManager(_gallerySavePath);
GallerySaveFile = new SaveFile<GalleryData>(
root: GameChunk,
onSave: _gallerySaveDataManager.Save,
onLoad: async () =>
{
try
{
var galleryData = await _gallerySaveDataManager.Load<GalleryData>();
return galleryData;
}
catch (FileNotFoundException)
{
GD.Print("No save file found.");
}
return null;
}
);
MainMenu.StartGame += OnStartGame;
MainMenu.EnemyViewer += OnEnemyViewer;
@@ -119,7 +192,7 @@ public partial class App : Node, IApp
MainMenu.OptionsButton.GrabFocus();
}
private void GalleryExited()
private async void GalleryExited()
{
GalleryMenu.Hide();
MainMenu.GalleryButton.GrabFocus();
@@ -204,6 +277,7 @@ public partial class App : Node, IApp
_game.GameLoaded += OnGameLoaded;
_game.GameExitRequested += GameExitRequested;
CallDeferred(MethodName.AddChild, scene);
_game.UnlockGalleryItem += UnlockGalleryItem;
}
private void OnGameLoaded() => LoadingScreen.HideLoadingScreen();
@@ -216,6 +290,56 @@ public partial class App : Node, IApp
LoadingScreen.HideLoadingScreen();
}
private void UnlockGalleryItem(string obj)
{
if (obj == nameof(GalleryData.SproingyFifty))
GalleryData.SproingyFifty = true;
if (obj == nameof(GalleryData.MichaelFifty))
GalleryData.MichaelFifty = true;
if (obj == nameof(GalleryData.FilthEaterFifty))
GalleryData.FilthEaterFifty = true;
if (obj == nameof(GalleryData.SaraFifty))
GalleryData.SaraFifty = true;
if (obj == nameof(GalleryData.BallosFifty))
GalleryData.BallosFifty = true;
if (obj == nameof(GalleryData.PlanterFifty))
GalleryData.PlanterFifty = true;
if (obj == nameof(GalleryData.ChintheFifty))
GalleryData.ChintheFifty = true;
if (obj == nameof(GalleryData.AmbassadorGreenFifty))
GalleryData.AmbassadorGreenFifty = true;
if (obj == nameof(GalleryData.AmbassadorRedFifty))
GalleryData.AmbassadorRedFifty = true;
if (obj == nameof(GalleryData.AmbassadorSteelFifty))
GalleryData.AmbassadorSteelFifty = true;
if (obj == nameof(GalleryData.AgniDemonFifty))
GalleryData.AgniDemonFifty = true;
if (obj == nameof(GalleryData.AqueousDemonFifty))
GalleryData.AqueousDemonFifty = true;
if (obj == nameof(GalleryData.EdenPillarFifty))
GalleryData.EdenPillarFifty = true;
if (obj == nameof(GalleryData.PalanFifty))
GalleryData.PalanFifty = true;
if (obj == nameof(GalleryData.ShieldOfHeavenFifty))
GalleryData.ShieldOfHeavenFifty = true;
if (obj == nameof(GalleryData.GoldSproingFifty))
GalleryData.GoldSproingFifty = true;
if (obj == nameof(GalleryData.TotalEnemiesFifty))
GalleryData.TotalEnemiesFifty = true;
if (obj == nameof(GalleryData.TotalEnemiesHundred))
GalleryData.TotalEnemiesHundred = true;
if (obj == nameof(GalleryData.NormalEnd))
GalleryData.NormalEnd = true;
if (obj == nameof(GalleryData.TrueEnd))
GalleryData.TrueEnd = true;
if (obj == nameof(GalleryData.BadEnd))
GalleryData.BadEnd = true;
if (obj == nameof(GalleryData.StelesTen))
GalleryData.StelesTen = true;
GallerySaveFile.Save();
}
private async Task<Node> LoadSceneInternal(string sceneName)
{
LoadingScreen.ShowLoadingScreen();
@@ -239,7 +363,11 @@ public partial class App : Node, IApp
OptionsMenu.GameTab.GrabFocus();
}
private async void OnGallery() => GalleryMenu.Show();
private async void OnGallery()
{
GalleryData = await _gallerySaveDataManager.Load<GalleryData>();
GalleryMenu.Show();
}
public void OnQuit() => AppLogic.Input(new AppLogic.Input.QuitGame());
+4 -3
View File
@@ -8,12 +8,12 @@ namespace Zennysoft.Game.Ma;
public partial class BGMPlayer : DimmableAudioStreamPlayer
{
private static string _bgmPath = $"res://src/audio/bgm/";
private IDictionary<BackgroundMusic, AudioStream> _bgmDictionary;
private static readonly string _bgmPath = $"res://src/audio/bgm/";
private Dictionary<BackgroundMusic, AudioStream> _bgmDictionary;
public override void _Ready()
{
_bgmDictionary = new Dictionary<BackgroundMusic, AudioStream>();
_bgmDictionary = [];
var backgroundMusic = Enum.GetValues(typeof(BackgroundMusic));
foreach (var bgm in backgroundMusic)
_bgmDictionary.Add((BackgroundMusic)bgm, GD.Load<AudioStream>(_bgmPath + bgm + ".ogg"));
@@ -21,6 +21,7 @@ public partial class BGMPlayer : DimmableAudioStreamPlayer
public void Play(BackgroundMusic backgroundMusic)
{
FadeOut();
_bgmDictionary.TryGetValue(backgroundMusic, out var stream);
Stream = stream;
FadeIn();
+95 -4
View File
@@ -1,8 +1,7 @@
[gd_scene load_steps=29 format=3 uid="uid://brgi35xj3b4ud"]
[gd_scene load_steps=42 format=3 uid="uid://brgi35xj3b4ud"]
[ext_resource type="Script" uid="uid://cw100tox0ufsy" path="res://src/audio/SfxDatabase.cs" id="1_ojkqd"]
[ext_resource type="AudioStream" uid="uid://cye8wlqbx66h4" path="res://src/audio/sfx/player_heal.ogg" id="2_158j8"]
[ext_resource type="AudioStream" uid="uid://1nuk6xpkwujl" path="res://src/audio/sfx/player_gain_VT.ogg" id="3_kac56"]
[ext_resource type="AudioStream" uid="uid://bfrp34y2m8b1l" path="res://src/audio/sfx/item_number_increase.ogg" id="4_fa8i8"]
[ext_resource type="AudioStream" uid="uid://xjdv23q5cqhm" path="res://src/audio/sfx/UI_PAUSE.ogg" id="5_p5cio"]
[ext_resource type="AudioStream" uid="uid://clhdcrs4dxt6h" path="res://src/audio/sfx/UI_MOVE.ogg" id="6_r16t0"]
@@ -15,6 +14,8 @@
[ext_resource type="AudioStream" uid="uid://ilf2s8ct2stt" path="res://src/audio/sfx/PLAYER_slower_slash.ogg" id="10_vyvit"]
[ext_resource type="AudioStream" uid="uid://oslvh60ec5gc" path="res://src/audio/sfx/UI_CANCEL_BACK.ogg" id="11_rloay"]
[ext_resource type="AudioStream" uid="uid://bo2u1ceci6k1i" path="res://src/audio/sfx/PLAYER_quicker_slash.ogg" id="13_fa8i8"]
[ext_resource type="AudioStream" uid="uid://d1ugsv7abo0jb" path="res://src/audio/sfx/player_misc.ogg" id="14_bi4v5"]
[ext_resource type="AudioStream" uid="uid://b0l5a8lg6wtig" path="res://src/audio/sfx/UI_FAILURE TO PICK UP.ogg" id="14_k25ba"]
[ext_resource type="AudioStream" uid="uid://na0lxb1lib11" path="res://src/audio/sfx/player_crit.ogg" id="14_p5cio"]
[ext_resource type="AudioStream" uid="uid://bsc83jkt7uisg" path="res://src/audio/sfx/PLAYER_GET_ITEM.ogg" id="15_r16t0"]
[ext_resource type="AudioStream" uid="uid://ckf3md1ujxhvm" path="res://src/audio/sfx/player_levelup.ogg" id="16_sew62"]
@@ -22,12 +23,24 @@
[ext_resource type="AudioStream" uid="uid://brb8xj4vsgcw4" path="res://src/audio/sfx/player_DEBUFF.ogg" id="18_bi4v5"]
[ext_resource type="AudioStream" uid="uid://coeynqnn61c43" path="res://src/audio/sfx/environment_ITEM_TRANSFER.ogg" id="18_l6w22"]
[ext_resource type="AudioStream" uid="uid://bfrmm07vthpwt" path="res://src/audio/sfx/item_divine_recall.ogg" id="19_nerso"]
[ext_resource type="AudioStream" uid="uid://dl6svxp5ow2vk" path="res://src/audio/sfx/player_death_1.ogg" id="19_uv31i"]
[ext_resource type="AudioStream" uid="uid://bu8akh5uh3ioo" path="res://src/audio/sfx/item_devic_balance_element1.ogg" id="20_rloay"]
[ext_resource type="AudioStream" uid="uid://nk8m8xwqpfho" path="res://src/audio/sfx/general_RUST.ogg" id="21_6auhl"]
[ext_resource type="AudioStream" uid="uid://bjkn6s2xjxuji" path="res://src/audio/sfx/item_gospel_dimension.ogg" id="21_6hsck"]
[ext_resource type="AudioStream" uid="uid://droe1wrqv7oau" path="res://src/audio/sfx/general_fire_damage.ogg" id="21_8d214"]
[ext_resource type="AudioStream" uid="uid://c3ur4bgvmsidi" path="res://src/audio/sfx/item_gospel_escape.ogg" id="22_3wq6u"]
[ext_resource type="AudioStream" uid="uid://4fx3xkjgffsq" path="res://src/audio/sfx/generaL_water_damage.ogg" id="22_rrmug"]
[ext_resource type="AudioStream" uid="uid://bc2pe0l5nr5ro" path="res://src/audio/sfx/ITEM_kyuu_hit.ogg" id="23_aaerj"]
[ext_resource type="AudioStream" uid="uid://bdb2wp6hc8dvh" path="res://src/audio/sfx/generaL_wind_damage.ogg" id="23_gcy74"]
[ext_resource type="AudioStream" uid="uid://ck0nc757t0jq5" path="res://src/audio/sfx/ITEM_PERSPECTIVE.ogg" id="23_jdwj3"]
[ext_resource type="AudioStream" uid="uid://dblijlgm8njjv" path="res://src/audio/sfx/item_sine_morphization.ogg" id="24_jdwj3"]
[ext_resource type="AudioStream" uid="uid://bfpxwnxn2o0cy" path="res://src/audio/sfx/general_telluric_damage.ogg" id="24_vn70h"]
[ext_resource type="AudioStream" uid="uid://n8anuovfoqmp" path="res://src/audio/sfx/general_holy_damage_2.ogg" id="25_153g4"]
[ext_resource type="AudioStream" uid="uid://b4ks6pgrqn0gh" path="res://src/audio/sfx/general_curse_damage.ogg" id="26_je0ug"]
[ext_resource type="AudioStream" uid="uid://ba8xendacec6" path="res://src/audio/sfx/item_kyuu_layer_2.ogg" id="28_ur8ax"]
[ext_resource type="AudioStream" uid="uid://d2h4l0gxcs5i2" path="res://src/audio/sfx/item_glued.ogg" id="30_cx2n8"]
[ext_resource type="AudioStream" uid="uid://dcfqkapxwvmdd" path="res://src/audio/sfx/iTEM_identify_ALL.ogg" id="31_vpeit"]
[ext_resource type="AudioStream" uid="uid://bio3xjbanwas1" path="res://src/audio/sfx/player_item_identified.ogg" id="40_rqu44"]
[node name="SfxDatabase" type="Node"]
script = ExtResource("1_ojkqd")
@@ -76,7 +89,7 @@ bus = &"SFX"
[node name="HealVTSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("3_kac56")
stream = ExtResource("16_sew62")
bus = &"SFX"
[node name="WeaponQuickSlashSound" type="AudioStreamPlayer" parent="Player"]
@@ -109,10 +122,16 @@ process_mode = 3
stream = ExtResource("15_r16t0")
bus = &"SFX"
[node name="PickupFailureSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("14_k25ba")
bus = &"SFX"
[node name="LevelUpSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("16_sew62")
stream = ExtResource("14_bi4v5")
bus = &"SFX"
[node name="EquipSound" type="AudioStreamPlayer" parent="Player"]
@@ -139,6 +158,60 @@ process_mode = 3
stream = ExtResource("18_bi4v5")
bus = &"SFX"
[node name="DeathSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("19_uv31i")
bus = &"SFX"
[node name="RustSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("21_6auhl")
bus = &"SFX"
[node name="FireDamageSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("21_8d214")
bus = &"SFX"
[node name="WaterDamageSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("22_rrmug")
bus = &"SFX"
[node name="AirDamageSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("23_gcy74")
bus = &"SFX"
[node name="EarthDamageSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("24_vn70h")
bus = &"SFX"
[node name="HolyDamageSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("25_153g4")
bus = &"SFX"
[node name="CurseDamageSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("26_je0ug")
bus = &"SFX"
[node name="AbsorbHPSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("28_ur8ax")
bus = &"SFX"
[node name="Item" type="Node" parent="."]
[node name="TransferItemSound" type="AudioStreamPlayer" parent="Item"]
@@ -206,3 +279,21 @@ unique_name_in_owner = true
process_mode = 3
stream = ExtResource("24_jdwj3")
bus = &"SFX"
[node name="GlueSound" type="AudioStreamPlayer" parent="Item"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("30_cx2n8")
bus = &"SFX"
[node name="IdentifyAllSound" type="AudioStreamPlayer" parent="Item"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("31_vpeit")
bus = &"SFX"
[node name="IdentifySound" type="AudioStreamPlayer" parent="Item"]
unique_name_in_owner = true
process_mode = 3
stream = ExtResource("40_rqu44")
bus = &"SFX"
+27 -38
View File
@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Collections.Generic;
using Zennysoft.Game.Abstractions.Audio;
[Meta(typeof(IAutoNode)), Id("sfx_database")]
public partial class SfxDatabase : Node
@@ -27,12 +28,14 @@ public partial class SfxDatabase : Node
{SoundEffect.DecreaseStat, DecreaseStatSound },
{SoundEffect.Crit, CritSound },
{SoundEffect.PickupItem, PickupItemSound },
{SoundEffect.PickupFailure, PickupFailureSound },
{SoundEffect.OpenInventory, OpenInventorySound },
{SoundEffect.MoveUI, MoveSound },
{SoundEffect.Equip, EquipSound },
{SoundEffect.Unequip, UnequipSound },
{SoundEffect.Buff, BuffSound },
{SoundEffect.Debuff, DebuffSound },
{SoundEffect.Death, DeathSound },
{SoundEffect.SortInventory, SortSound },
{SoundEffect.SelectUI, SelectSound },
{SoundEffect.CancelUI, CancelSound },
@@ -44,9 +47,17 @@ public partial class SfxDatabase : Node
{SoundEffect.TeleportToExit, TeleportToExitSound},
{SoundEffect.AbsorbHPFromAllEnemies, AbsorbHPFromAllEnemiesSound},
{SoundEffect.TurnAllEnemiesIntoHealingItems, TurnAllEnemiesIntoHealingItemsSound},
{SoundEffect.WeaponQuickSlash, WeaponQuickSlashSound },
{SoundEffect.WeaponSlowSlash, WeaponSlowSlashSound },
{SoundEffect.WeaponPlasmaSword, WeaponPlasmaSword },
{SoundEffect.Glue, GlueSound },
{SoundEffect.Identify, IdentifySound},
{SoundEffect.IdentifyAll, IdentifyAllSound},
{SoundEffect.Rust, RustSound },
{SoundEffect.FireDamage, FireDamageSound},
{SoundEffect.AirDamage, AirDamageSound},
{SoundEffect.WaterDamage, WaterDamageSound},
{SoundEffect.EarthDamage, EarthDamageSound},
{SoundEffect.HolyDamage, HolyDamageSound},
{SoundEffect.CurseDamage, CurseDamageSound },
{SoundEffect.AbsorbHP, AbsorbHPSound},
};
}
@@ -54,19 +65,19 @@ public partial class SfxDatabase : Node
[Node] private AudioStreamPlayer TakeDamageSound { get; set; } = default!;
[Node] private AudioStreamPlayer HealVTSound { get; set; } = default!;
[Node] private AudioStreamPlayer IncreaseStatSound { get; set; } = default!;
[Node] private AudioStreamPlayer DecreaseStatSound { get; set; } = default!;
[Node] private AudioStreamPlayer WeaponQuickSlashSound { get; set; } = default!;
[Node] private AudioStreamPlayer WeaponSlowSlashSound { get; set; } = default!;
[Node] private AudioStreamPlayer WeaponPlasmaSword { get; set; } = default!;
[Node] private AudioStreamPlayer CritSound { get; set; } = default!;
[Node] private AudioStreamPlayer PickupItemSound { get; set; } = default!;
[Node] private AudioStreamPlayer PickupFailureSound { get; set; } = default!;
[Node] private AudioStreamPlayer OpenInventorySound { get; set; }
[Node] private AudioStreamPlayer MoveSound { get; set; }
[Node] private AudioStreamPlayer EquipSound { get; set; }
[Node] private AudioStreamPlayer UnequipSound { get; set; }
[Node] private AudioStreamPlayer BuffSound { get; set; }
[Node] private AudioStreamPlayer DebuffSound { get; set; }
[Node] private AudioStreamPlayer DeathSound { get; set; }
[Node] private AudioStreamPlayer SortSound { get; set; }
[Node] private AudioStreamPlayer SelectSound { get; set; }
[Node] private AudioStreamPlayer CancelSound { get; set; }
@@ -79,6 +90,17 @@ public partial class SfxDatabase : Node
[Node] private AudioStreamPlayer AbsorbHPFromAllEnemiesSound { get; set; }
[Node] private AudioStreamPlayer SwapHPAndVTSound { get; set; }
[Node] private AudioStreamPlayer TurnAllEnemiesIntoHealingItemsSound { get; set; }
[Node] private AudioStreamPlayer GlueSound { get; set; }
[Node] private AudioStreamPlayer IdentifySound { get; set; }
[Node] private AudioStreamPlayer IdentifyAllSound { get; set; }
[Node] private AudioStreamPlayer RustSound { get; set; }
[Node] private AudioStreamPlayer FireDamageSound { get; set; }
[Node] private AudioStreamPlayer AirDamageSound { get; set; }
[Node] private AudioStreamPlayer WaterDamageSound { get; set; }
[Node] private AudioStreamPlayer EarthDamageSound { get; set; }
[Node] private AudioStreamPlayer HolyDamageSound { get; set; }
[Node] private AudioStreamPlayer CurseDamageSound { get; set; }
[Node] private AudioStreamPlayer AbsorbHPSound { get; set; }
private Dictionary<SoundEffect, AudioStreamPlayer> _sfxMap;
@@ -90,36 +112,3 @@ public partial class SfxDatabase : Node
}
}
public enum SoundEffect
{
HealHP,
TakeDamage,
HealVT,
IncreaseStat,
DecreaseStat,
Crit,
PickupItem,
OpenInventory,
MoveUI,
Equip,
Unequip,
SortInventory,
SelectUI,
CancelUI,
LevelUp,
Transfer,
RecallEnemies,
KillHalfEnemies,
TeleportToRandomRoom,
TeleportToExit,
AbsorbHPFromAllEnemies,
SwapHPAndVT,
TurnAllEnemiesIntoHealingItems,
WeaponQuickSlash,
WeaponSlowSlash,
WeaponPlasmaSword,
Eucharistia,
Buff,
Debuff
}
@@ -3,17 +3,17 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://7esvkguxl3cb"
path="res://.godot/imported/AMB_BAD_END_EARTHQUAKE.ogg-e9eab5a667607eac71d31fddf6267597.oggvorbisstr"
path="res://.godot/imported/AMB_BAD_END_EARTHQUAKE.ogg-03e817303decd8b8e41745609f87f10c.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/AMB_BAD_END_EARTHQUAKE.ogg"
dest_files=["res://.godot/imported/AMB_BAD_END_EARTHQUAKE.ogg-e9eab5a667607eac71d31fddf6267597.oggvorbisstr"]
source_file="res://src/audio/AMB/AMB_BAD_END_EARTHQUAKE.ogg"
dest_files=["res://.godot/imported/AMB_BAD_END_EARTHQUAKE.ogg-03e817303decd8b8e41745609f87f10c.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
loop=true
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://b5vhghigr263m"
path="res://.godot/imported/amb_ATMOSTPHERE.ogg-d626a91a96dc0c9dd858ae437ed3ce9d.oggvorbisstr"
path="res://.godot/imported/amb_ATMOSTPHERE.ogg-45d9a9c09d45b233375d8c723e42c852.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_ATMOSTPHERE.ogg"
dest_files=["res://.godot/imported/amb_ATMOSTPHERE.ogg-d626a91a96dc0c9dd858ae437ed3ce9d.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_ATMOSTPHERE.ogg"
dest_files=["res://.godot/imported/amb_ATMOSTPHERE.ogg-45d9a9c09d45b233375d8c723e42c852.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://dun1mdjlmv2iy"
path="res://.godot/imported/amb_CRICKETS.ogg-a3e94c03a4a4855112cb9771eb5d7995.oggvorbisstr"
path="res://.godot/imported/amb_CRICKETS.ogg-ee8db802e6163ca5c5e3101e3337d9d3.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_CRICKETS.ogg"
dest_files=["res://.godot/imported/amb_CRICKETS.ogg-a3e94c03a4a4855112cb9771eb5d7995.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_CRICKETS.ogg"
dest_files=["res://.godot/imported/amb_CRICKETS.ogg-ee8db802e6163ca5c5e3101e3337d9d3.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cstt5t4tspgll"
path="res://.godot/imported/amb_RIVER.ogg-76238514419f87d38ee6d9dc2c51ca64.oggvorbisstr"
path="res://.godot/imported/amb_RIVER.ogg-a5ed08fd6d161ef0a5f38f804143c9f8.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_RIVER.ogg"
dest_files=["res://.godot/imported/amb_RIVER.ogg-76238514419f87d38ee6d9dc2c51ca64.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_RIVER.ogg"
dest_files=["res://.godot/imported/amb_RIVER.ogg-a5ed08fd6d161ef0a5f38f804143c9f8.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://db0e4p4b11tyf"
path="res://.godot/imported/amb_beach.ogg-224ac40038a27ecc37bbaeb6ba133451.oggvorbisstr"
path="res://.godot/imported/amb_beach.ogg-8f340d18fd5888c59c80580ed33b86be.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_beach.ogg"
dest_files=["res://.godot/imported/amb_beach.ogg-224ac40038a27ecc37bbaeb6ba133451.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_beach.ogg"
dest_files=["res://.godot/imported/amb_beach.ogg-8f340d18fd5888c59c80580ed33b86be.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://btkbelic75ecn"
path="res://.godot/imported/amb_cellular.ogg-10f77202fdba4396453746a6dff1163f.oggvorbisstr"
path="res://.godot/imported/amb_cellular.ogg-58bcb88de2f576fd0d8bea7152aba8e8.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_cellular.ogg"
dest_files=["res://.godot/imported/amb_cellular.ogg-10f77202fdba4396453746a6dff1163f.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_cellular.ogg"
dest_files=["res://.godot/imported/amb_cellular.ogg-58bcb88de2f576fd0d8bea7152aba8e8.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://b306wov6yfaan"
path="res://.godot/imported/amb_flame_burning.ogg-a2d4a15c4e42af6cc417263c48ceac99.oggvorbisstr"
path="res://.godot/imported/amb_flame_burning.ogg-9ffba7ace9b30cdc0b929e1ee4bc8717.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_flame_burning.ogg"
dest_files=["res://.godot/imported/amb_flame_burning.ogg-a2d4a15c4e42af6cc417263c48ceac99.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_flame_burning.ogg"
dest_files=["res://.godot/imported/amb_flame_burning.ogg-9ffba7ace9b30cdc0b929e1ee4bc8717.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cgk17d8erskht"
path="res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr"
path="res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_ocean.ogg"
dest_files=["res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_ocean.ogg"
dest_files=["res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://60hn13ryqn88"
path="res://.godot/imported/amb_perlin.ogg-64b80cc5587fac618d4038cf1d8fac57.oggvorbisstr"
path="res://.godot/imported/amb_perlin.ogg-369d474f40ce79fe9f5b6c639a907e11.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_perlin.ogg"
dest_files=["res://.godot/imported/amb_perlin.ogg-64b80cc5587fac618d4038cf1d8fac57.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_perlin.ogg"
dest_files=["res://.godot/imported/amb_perlin.ogg-369d474f40ce79fe9f5b6c639a907e11.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://bxrlehky1833a"
path="res://.godot/imported/amb_pipe_loop_brokenloop.ogg-002366fec6a5ad3285732ef207958668.oggvorbisstr"
path="res://.godot/imported/amb_pipe_loop_brokenloop.ogg-01835f0cb823262b3486e1d51b3fabed.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_pipe_loop_brokenloop.ogg"
dest_files=["res://.godot/imported/amb_pipe_loop_brokenloop.ogg-002366fec6a5ad3285732ef207958668.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_pipe_loop_brokenloop.ogg"
dest_files=["res://.godot/imported/amb_pipe_loop_brokenloop.ogg-01835f0cb823262b3486e1d51b3fabed.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cdweiwl17xnn6"
path="res://.godot/imported/amb_water_lapping1.ogg-d0e545dbc1fa1d1d2f7f7ffee566dbd2.oggvorbisstr"
path="res://.godot/imported/amb_water_lapping1.ogg-b2ad73abfaf60b4ac41451d7cf3abd27.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_water_lapping1.ogg"
dest_files=["res://.godot/imported/amb_water_lapping1.ogg-d0e545dbc1fa1d1d2f7f7ffee566dbd2.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_water_lapping1.ogg"
dest_files=["res://.godot/imported/amb_water_lapping1.ogg-b2ad73abfaf60b4ac41451d7cf3abd27.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://d3uj87dsngy22"
path="res://.godot/imported/amb_water_lapping2.ogg-48391199b506ee32adf8ac3cf8800f8d.oggvorbisstr"
path="res://.godot/imported/amb_water_lapping2.ogg-2e0e4c928ee7675858fe0c117f293287.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_water_lapping2.ogg"
dest_files=["res://.godot/imported/amb_water_lapping2.ogg-48391199b506ee32adf8ac3cf8800f8d.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_water_lapping2.ogg"
dest_files=["res://.godot/imported/amb_water_lapping2.ogg-2e0e4c928ee7675858fe0c117f293287.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://b7g0tnn43an8"
path="res://.godot/imported/amb_white_noise.ogg-245b3fec83d54c77ba8886688002bdc1.oggvorbisstr"
path="res://.godot/imported/amb_white_noise.ogg-9d7d55b3e4f0f6e201e09e41d6f75ee0.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_white_noise.ogg"
dest_files=["res://.godot/imported/amb_white_noise.ogg-245b3fec83d54c77ba8886688002bdc1.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_white_noise.ogg"
dest_files=["res://.godot/imported/amb_white_noise.ogg-9d7d55b3e4f0f6e201e09e41d6f75ee0.oggvorbisstr"]
[params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://2veneecq76n7"
path="res://.godot/imported/amb_wind_loop_altar.ogg-c7176da6dd27414689e07f2c34c08519.oggvorbisstr"
path="res://.godot/imported/amb_wind_loop_altar.ogg-91bb4566a15451ea55b40bb8105195b0.oggvorbisstr"
[deps]
source_file="res://src/audio/amb/amb_wind_loop_altar.ogg"
dest_files=["res://.godot/imported/amb_wind_loop_altar.ogg-c7176da6dd27414689e07f2c34c08519.oggvorbisstr"]
source_file="res://src/audio/AMB/amb_wind_loop_altar.ogg"
dest_files=["res://.godot/imported/amb_wind_loop_altar.ogg-91bb4566a15451ea55b40bb8105195b0.oggvorbisstr"]
[params]
Binary file not shown.
@@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/iTEM_identify_ALL.ogg-41b5f26b3ea1b630ca215a5
[params]
loop=false
loop_offset=0
bpm=0
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4
Binary file not shown.
@@ -1,19 +0,0 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://yjm1usonqxpw"
path="res://.godot/imported/item_persuader.ogg-c3c3292adcec7bbf7eb5289059116cde.oggvorbisstr"
[deps]
source_file="res://src/audio/sfx/item_persuader.ogg"
dest_files=["res://.godot/imported/item_persuader.ogg-c3c3292adcec7bbf7eb5289059116cde.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4
+1 -1
View File
@@ -8,7 +8,7 @@ public partial class ShakeCamera : Camera3D
{
public override void _Notification(int what) => this.Notify(what);
[Export] private double _shakeIntensity = 1.0;
[Export] public double _shakeIntensity { get; set; } = 1.0;
[Export] private double _maxX = 10;
[Export] private double _maxY = 10;
+47 -3
View File
@@ -4,6 +4,7 @@ using Godot;
using System;
using System.Collections.Immutable;
using System.Linq;
using Zennysoft.Game.Abstractions.Audio;
using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity;
@@ -26,6 +27,8 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
[Dependency] protected IPlayer _player => this.DependOn(() => GetParent().GetChildren().OfType<IPlayer>().Single());
[Dependency] protected IGameRepo _gameRepo => this.DependOn<IGameRepo>();
[Dependency] public IGame _game => this.DependOn<IGame>();
#endregion
public IHealthComponent HealthComponent { get; private set; }
@@ -38,6 +41,10 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
public virtual IEnemyModelView EnemyModelView { get; set; } = default!;
public IEnemyLootTable LootTable => _lootTable;
[Export] public EnemyLootTable _lootTable { get; set; }
public Vector3 TargetPosition { get; private set; }
[ExportGroup("Enemy Stats")]
@@ -174,20 +181,24 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
EnemyModelView.PlayElementalDamageAnimation(damageElementType);
_enemyLogic.Input(new EnemyLogic.Input.Alert());
EnemyModelView.PlayHitAnimation();
if (damageElementType == ElementType.None || damageElementType == ElementType.Ferrum)
_hitSFX.Play();
}
public virtual void Die()
public virtual async void Die()
{
SetPhysicsProcess(false);
_rustDuration.Stop();
_rustTimer.Stop();
_enemyLogic.Input(new EnemyLogic.Input.Defeated());
_player.ExperiencePointsComponent.Gain(ExpGiven);
EnemyModelView.PlayDeathAnimation();
EnemyModelView.PlayHitAnimation();
_hitSFX.Play();
await ToSignal(GetTree().CreateTimer(0.1f), "timeout");
EnemyModelView.PlayDeathAnimation();
_dieSFX.Play();
_gameRepo.OnEnemyDied(this);
await _game.IncrementEnemyDefeatedCount(EnemyModelView.EnemyLoreInfo.Name);
var tweener = CreateTween();
tweener.TweenInterval(1.0f);
tweener.TweenCallback(Callable.From(QueueFree));
@@ -209,6 +220,23 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
tweener.TweenCallback(Callable.From(QueueFree));
}
public virtual void OnBuff()
{
EnemyModelView.PlayBuffAnimation();
SfxDatabase.Instance.Play(SoundEffect.IncreaseStat);
}
public virtual void OnDebuff()
{
EnemyModelView.PlayDebuffAnimation();
SfxDatabase.Instance.Play(SoundEffect.DecreaseStat);
}
public virtual void OnHealed()
{
EnemyModelView.PlayHealAnimation();
}
public IDungeonRoom GetCurrentRoom(ImmutableList<IDungeonRoom> roomList)
{
foreach (var room in roomList)
@@ -229,6 +257,16 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
EnemyModelView.HitPlayer -= EnemyModelView_HitPlayer;
}
public void SetEnemySpeedByMultiplier(double multiplier)
{
if (this is IHaveFleeBehavior fleeBehavior)
fleeBehavior.FleeBehavior.FleeSpeed *= multiplier;
if (this is IHavePatrolBehavior patrolBehavior)
patrolBehavior.PatrolBehavior.PatrolSpeed *= multiplier;
if (this is IHaveFollowBehavior followBehavior)
followBehavior.FollowBehavior.FollowSpeed *= multiplier;
}
public virtual void MoveEnemyToNewRoom(IDungeonRoom newRoom)
{
if (newRoom is MonsterRoom monsterRoom)
@@ -273,6 +311,7 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
{
_rustTimer.Start();
_rustDuration.Start();
EnemyModelView.PlayRustActivateAnimation();
}
else
{
@@ -283,11 +322,16 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
private void _rustTimer_Timeout()
{
HealthComponent.Damage(3, ElementType.Ferrum);
TakeHit(ElementType.Ferrum);
EnemyModelView.PlayRustDamageAnimation();
}
private void _rustDuration_Timeout()
{
StatusEffectComponent.Rust.OnNext(false);
}
public int GetDefeatCount(IEnemy enemyType)
{
return 0;
}
}
+3
View File
@@ -55,11 +55,14 @@ public abstract partial class Enemy2D : Enemy
}
protected void OnVelocityComputed(Vector3 safeVelocity)
{
if (_enemyModelView.CanMove)
{
Velocity = new Vector3(safeVelocity.X, 0, safeVelocity.Z);
LookAtTarget(safeVelocity);
MoveAndSlide();
}
}
protected void EngagePlayerBehavior_TakeAction()
{
@@ -0,0 +1,11 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://gvgpe17jldat"]
[ext_resource type="Shader" uid="uid://cjvysm0rhhdgi" path="res://src/vfx/shaders/DamageHit.gdshader" id="1_23uje"]
[resource]
resource_local_to_scene = true
shader = ExtResource("1_23uje")
shader_parameter/shock_color = Color(1, 0, 0, 1)
shader_parameter/amplitude = 30.0
shader_parameter/progress = -1.0
shader_parameter/frequecy = 10.0
@@ -0,0 +1,13 @@
using Godot;
using Godot.Collections;
using Zennysoft.Ma.Adapter.Entity;
namespace Zennysoft.Game.Ma;
[GlobalClass]
public partial class EnemyLootTable : Resource, IEnemyLootTable
{
[Export]
public Array<InventoryItemStats> Items { get; set; } = [];
}
@@ -0,0 +1 @@
uid://bei3s7yr6xkc0
+14 -2
View File
@@ -1,4 +1,5 @@
using Godot;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
@@ -25,9 +26,20 @@ public partial class EnemyLoreInfo : Resource
public string Weakness { get; set; }
[Export]
public string Drop1 { get; set; }
public string PrimaryAttackName { get; set; }
[Export]
public string Drop2 { get; set; }
public ElementType PrimaryAttackType { get; set; }
[Export]
public string SecondaryAttackName { get; set; }
[Export]
public ElementType SecondaryAttackType { get; set; }
[Export]
public string TertiaryAttackName { get; set; }
[Export]
public ElementType TertiaryAttackType { get; set; }
}
@@ -117,6 +117,16 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView
public virtual void PlayHitAnimation() => throw new System.NotImplementedException();
public virtual void PlayBuffAnimation() => throw new System.NotImplementedException();
public virtual void PlayDebuffAnimation() => throw new System.NotImplementedException();
public virtual void PlayHealAnimation() => throw new System.NotImplementedException();
public virtual void PlayRustActivateAnimation() => throw new System.NotImplementedException();
public virtual void PlayRustDamageAnimation() => throw new System.NotImplementedException();
protected virtual void OnPlayerHit(AttackEventArgs arg) => HitPlayer?.Invoke(this, arg);
protected void AnimationTree_AnimationFinished(StringName animName)
@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Linq;
using Zennysoft.Game.Abstractions.Audio;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
@@ -26,6 +27,7 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
[Node] public AnimationPlayer WaterHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer CurseHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer EarthHitAnimation { get; set; } = default!;
[Node] public Node2D VFXSprites { get; set; } = default!;
[ExportGroup("Enemy Model Properties")]
[Export(PropertyHint.Range, "0.0, 1.0")]
@@ -60,12 +62,47 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
public override void PlayDeathAnimation()
{
_stateMachine.Stop();
AnimationPlayer.Stop();
VFXSprites.Hide();
LoadShader("res://src/vfx/shaders/PixelMelt.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f);
}
public override void PlayBuffAnimation()
{
LoadShader("res://src/vfx/shaders/EnemyBuff.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
}
public override void PlayDebuffAnimation()
{
LoadShader("res://src/vfx/shaders/EnemyDebuff.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
}
public override void PlayHealAnimation()
{
LoadShader("res://src/vfx/shaders/EnemyHeal.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
}
public override void PlayRustActivateAnimation()
{
RustHitAnimation.Play("RustActivate");
}
public override void PlayRustDamageAnimation()
{
LoadShader("res://src/vfx/shaders/EnemyRust.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
}
public override void PlayElementalDamageAnimation(ElementType elementType)
{
if (elementType == ElementType.Igneous)
@@ -73,38 +110,43 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
if (FlameHitAnimation.IsPlaying())
FlameHitAnimation.Stop();
FlameHitAnimation.Play("FireHit");
SfxDatabase.Instance.Play(SoundEffect.FireDamage);
}
else if (elementType == ElementType.Holy)
else if (elementType == ElementType.Sankta)
{
if (HolyHitAnimation.IsPlaying())
HolyHitAnimation.Stop();
HolyHitAnimation.Play("HolyHit");
SfxDatabase.Instance.Play(SoundEffect.HolyDamage);
}
else if (elementType == ElementType.Aeolic)
{
if (WindHitAnimation.IsPlaying())
WindHitAnimation.Stop();
WindHitAnimation.Play("WindHit");
SfxDatabase.Instance.Play(SoundEffect.AirDamage);
}
else if (elementType == ElementType.Curse)
else if (elementType == ElementType.Shura)
{
if (CurseHitAnimation.IsPlaying())
CurseHitAnimation.Stop();
CurseHitAnimation.Play("CurseHit");
SfxDatabase.Instance.Play(SoundEffect.CurseDamage);
}
else if (elementType == ElementType.Hydric)
{
if (WaterHitAnimation.IsPlaying())
WaterHitAnimation.Stop();
WaterHitAnimation.Play("WaterHit");
SfxDatabase.Instance.Play(SoundEffect.WaterDamage);
}
else if (elementType == ElementType.Telluric)
{
if (EarthHitAnimation.IsPlaying())
EarthHitAnimation.Stop();
EarthHitAnimation.Play("EarthHit");
SfxDatabase.Instance.Play(SoundEffect.EarthDamage);
}
}
private EnemyDirection GetEnemyDirection(
+1 -1
View File
@@ -7,7 +7,7 @@ public enum EnemyType
FilthEater,
Sara,
Ballos,
Chariot,
Planter,
Chinthe,
AmbassadorGreen,
AmbassadorRed,
@@ -23,8 +23,8 @@ public static class EnemyTypeToEnemyConverter
return InstantiateFromPath(@$"{_folderPath}/04. sara/Sara.tscn");
case EnemyType.Ballos:
return InstantiateFromPath(@$"{_folderPath}/05. ballos/Ballos.tscn");
case EnemyType.Chariot:
return InstantiateFromPath(@$"{_folderPath}/06. chariot/Chariot.tscn");
case EnemyType.Planter:
return InstantiateFromPath(@$"{_folderPath}/06. Planter/Planter.tscn");
case EnemyType.Chinthe:
return InstantiateFromPath(@$"{_folderPath}/07. chinthe/Chinthe.tscn");
case EnemyType.AmbassadorGreen:
@@ -62,8 +62,8 @@ public static class EnemyTypeToEnemyConverter
return EnemyType.Sara;
if (enemy is Ballos)
return EnemyType.Ballos;
if (enemy is Chariot)
return EnemyType.Chariot;
if (enemy is Planter)
return EnemyType.Planter;
if (enemy is Chinthe)
return EnemyType.Chinthe;
if (enemy is Ambassador ambassador)
@@ -27,6 +27,16 @@ public interface IEnemyModelView : INode3D
public void PlayDeathAnimation();
public void PlayBuffAnimation();
public void PlayDebuffAnimation();
public void PlayHealAnimation();
public void PlayRustActivateAnimation();
public void PlayRustDamageAnimation();
public void PlayElementalDamageAnimation(ElementType elementType);
public double ViewerSize { get; }
@@ -23,7 +23,7 @@ public partial class EngagePlayerBehavior : Node, IEngagePlayerBehavior
{
_actionTimer = new Timer();
_acquireTargetTimer = new Timer() { WaitTime = _acquireTargetTime };
_actionTimer.WaitTime = 0.8f;
_actionTimer.WaitTime = 0.3f;
_actionTimer.Timeout += OnAttackTimeout;
_acquireTargetTimer.Timeout += OnAcquireTargetTimeout;
AddChild(_actionTimer);
@@ -39,6 +39,7 @@ public partial class EngagePlayerBehavior : Node, IEngagePlayerBehavior
public void Disengage()
{
_actionTimer.Stop();
_actionTimer.WaitTime = 0.3f;
_acquireTargetTimer.Stop();
}
@@ -11,7 +11,7 @@ public partial class FleeBehavior : Node3D, IBehavior
{
public override void _Notification(int what) => this.Notify(what);
[Export] private double _fleeSpeed { get; set; } = 300f;
[Export] public double FleeSpeed { get; set; } = 300f;
[Export] private double _thinkTime { get; set; } = 2f;
@@ -35,7 +35,7 @@ public partial class FleeBehavior : Node3D, IBehavior
public void StartFlee(NavigationAgent3D navigationAgent)
{
var currentRoom = _map.GetPlayersCurrentRoom();
var currentRoom = _map.CurrentFloor.GetPlayersCurrentRoom();
var rooms = _game.CurrentFloor.Rooms;
var validRooms = new Godot.Collections.Array<MonsterRoom>(rooms.OfType<MonsterRoom>());
var randomRoom = validRooms.PickRandom();
@@ -46,13 +46,14 @@ public partial class FleeBehavior : Node3D, IBehavior
public void StopFlee()
{
SetPhysicsProcess(false);
_navigationAgent.Velocity = Vector3.Zero;
}
public void OnPhysicsProcess(double delta)
{
var nextVelocity = _navigationAgent.GetNextPathPosition();
var parent = GetParent() as Node3D;
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_fleeSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity);
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)FleeSpeed * (float)delta;
_navigationAgent.Velocity = velocity;
}
}
@@ -12,7 +12,7 @@ public partial class FollowBehavior : Node3D, IBehavior
{
public override void _Notification(int what) => this.Notify(what);
[Export] private double _followSpeed { get; set; } = 100f;
[Export] public double FollowSpeed { get; set; } = 100f;
[Export] private double _thinkTime { get; set; } = 2f;
@@ -27,9 +27,15 @@ public partial class FollowBehavior : Node3D, IBehavior
public void Init(NavigationAgent3D navigationAgent)
{
_navigationAgent = navigationAgent;
_navigationAgent.VelocityComputed += _navigationAgent_VelocityComputed;
}
public void OnReady()
private void _navigationAgent_VelocityComputed(Vector3 safeVelocity)
{
EmitSignal(SignalName.OnVelocityComputed, safeVelocity);
}
public override void _EnterTree()
{
_thinkTimer = new Timer() { WaitTime = _thinkTime };
_thinkTimer.Timeout += OnTimeout;
@@ -50,19 +56,21 @@ public partial class FollowBehavior : Node3D, IBehavior
{
SetPhysicsProcess(false);
_thinkTimer.Stop();
_navigationAgent.Velocity = Vector3.Zero;
}
public void OnPhysicsProcess(double delta)
{
var nextVelocity = _navigationAgent.GetNextPathPosition();
var parent = GetParent() as Node3D;
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_followSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity);
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)FollowSpeed * (float)delta;
_navigationAgent.Velocity = velocity;
}
public void OnExitTree()
{
_thinkTimer.Stop();
_thinkTimer.Timeout -= OnTimeout;
_navigationAgent.VelocityComputed -= _navigationAgent_VelocityComputed;
}
}
@@ -12,7 +12,7 @@ public partial class PatrolBehavior : Node3D, IBehavior
{
public override void _Notification(int what) => this.Notify(what);
[Export] private double _patrolSpeed { get; set; } = 100f;
[Export] public double PatrolSpeed { get; set; } = 100f;
[Export] private double _thinkTime { get; set; } = 0.8f;
@@ -49,6 +49,12 @@ public partial class PatrolBehavior : Node3D, IBehavior
{
_navigationAgent = navigationAgent;
_navigationAgent.WaypointReached += NavigationAgent_WaypointReached;
_navigationAgent.VelocityComputed += _navigationAgent_VelocityComputed;
}
private void _navigationAgent_VelocityComputed(Vector3 safeVelocity)
{
EmitSignal(SignalName.OnVelocityComputed, safeVelocity);
}
private async void NavigationAgent_WaypointReached(Dictionary details)
@@ -66,14 +72,15 @@ public partial class PatrolBehavior : Node3D, IBehavior
{
SetPhysicsProcess(false);
_patrolTimer?.Stop();
_navigationAgent.Velocity = Vector3.Zero;
}
public void OnPhysicsProcess(double delta)
{
var nextVelocity = _navigationAgent.GetNextPathPosition();
var parent = GetParent() as Node3D;
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_patrolSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity);
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)PatrolSpeed * (float)delta;
_navigationAgent.Velocity = velocity;
}
public void SetPatrolTarget()
@@ -94,5 +101,6 @@ public partial class PatrolBehavior : Node3D, IBehavior
_patrolTimer.Stop();
_patrolTimer.Timeout -= PatrolTimer_Timeout;
_navigationAgent.WaypointReached -= NavigationAgent_WaypointReached;
_navigationAgent.VelocityComputed -= _navigationAgent_VelocityComputed;
}
}
@@ -1,7 +1,6 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Linq;
namespace Zennysoft.Game.Ma;
@@ -1,8 +1,13 @@
[gd_scene load_steps=16 format=3 uid="uid://crsy7gygjy317"]
[gd_scene load_steps=22 format=3 uid="uid://crsy7gygjy317"]
[ext_resource type="Script" uid="uid://cq6b4ma3sy1en" path="res://src/enemy/enemy_types/01. sproingy/Sproingy.cs" id="1_xsluo"]
[ext_resource type="Script" uid="uid://b6vgwsjlshci" path="res://src/items/InventoryItemStats.cs" id="2_515no"]
[ext_resource type="Resource" uid="uid://d0cxrf0nldona" path="res://src/items/consumable/resources/Somalata Electuary.tres" id="3_4i0u2"]
[ext_resource type="Resource" uid="uid://75fpkwfp0t0k" path="res://src/items/consumable/resources/Catholicon Draught.tres" id="3_515no"]
[ext_resource type="Script" uid="uid://bei3s7yr6xkc0" path="res://src/enemy/EnemyLootTable.cs" id="4_515no"]
[ext_resource type="PackedScene" uid="uid://cn4fv2gv6raql" path="res://src/enemy/behaviors/PatrolBehavior.tscn" id="4_drfkj"]
[ext_resource type="PackedScene" uid="uid://bjcqrhtifpcvr" path="res://src/enemy/enemy_types/01. sproingy/SproingyModelView.tscn" id="4_o3b7p"]
[ext_resource type="Resource" uid="uid://d2rdaghcccw0f" path="res://src/items/jewels/resources/MeditativeOrb.tres" id="4_orghr"]
[ext_resource type="PackedScene" uid="uid://cmhem5xknjsvc" path="res://src/enemy/behaviors/EngagePlayerBehavior.tscn" id="5_drfkj"]
[ext_resource type="PackedScene" uid="uid://cve5oouhowtff" path="res://src/enemy/behaviors/FollowBehavior.tscn" id="6_moun4"]
[ext_resource type="AudioStream" uid="uid://ba8xendacec6" path="res://src/audio/sfx/item_kyuu_layer_2.ogg" id="6_ungov"]
@@ -10,6 +15,11 @@
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="8_agkuf"]
[ext_resource type="AudioStream" uid="uid://bn6ns3jxkw03b" path="res://src/audio/sfx/ENEMY_SPROING_death.ogg" id="9_icstk"]
[sub_resource type="Resource" id="Resource_fa44e"]
script = ExtResource("4_515no")
Items = Array[ExtResource("2_515no")]([ExtResource("3_4i0u2"), ExtResource("3_515no"), ExtResource("4_orghr")])
metadata/_custom_type_script = "uid://bei3s7yr6xkc0"
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.106078
height = 1.23076
@@ -30,7 +40,7 @@ material = SubResource("StandardMaterial3D_p4gkk")
top_radius = 0.0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_drfkj"]
radius = 1.0
radius = 1.33398
[node name="Sproingy" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1
@@ -39,6 +49,7 @@ axis_lock_linear_y = true
axis_lock_angular_x = true
axis_lock_angular_z = true
script = ExtResource("1_xsluo")
_lootTable = SubResource("Resource_fa44e")
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
@@ -96,7 +107,7 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_moun4")]
unique_name_in_owner = true
_followSpeed = 150.0
FollowSpeed = 175.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("5_drfkj")]
unique_name_in_owner = true
@@ -106,7 +117,9 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 3.0
use_3d_avoidance = true
avoidance_layers = 9
avoidance_mask = 9
[node name="SFX" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.0617, 0)
@@ -11,6 +11,10 @@ ATK = ""
DEF = ""
Affinity = "Igneous"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Baleful Strike"
PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -80,8 +80,12 @@ ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = ""
PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
@@ -3177,7 +3181,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.332842, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3221,7 +3225,7 @@ tracks/1/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.332842, 0.4167),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3238,6 +3242,21 @@ tracks/2/keys = {
"update": 1,
"values": [&"attack"]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("67_dnvt3")
}],
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
[sub_resource type="Animation" id="Animation_ivy74"]
resource_name = "primary_attack_left"
@@ -3262,7 +3281,7 @@ tracks/1/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.332842, 0.4167),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3279,6 +3298,21 @@ tracks/2/keys = {
"update": 1,
"values": [&"attack"]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("67_dnvt3")
}],
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
[sub_resource type="Animation" id="Animation_x7uye"]
resource_name = "primary_attack_right"
@@ -3303,7 +3337,7 @@ tracks/1/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.332842, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3332,6 +3366,21 @@ tracks/3/keys = {
"update": 1,
"values": [&"attack"]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("67_dnvt3")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_6tj5r"]
_data = {
@@ -3842,14 +3891,18 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_oh25a")
CanMove = true
EnemyLoreInfo = SubResource("Resource_ivy74")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 2.05501, 0)
layers = 5
cast_shadow = 0
modulate = Color(0.83, 0.83, 0.83, 1)
pixel_size = 0.001
billboard = 2
shaded = true
alpha_cut = 1
texture_filter = 0
render_priority = 100
@@ -3876,6 +3929,7 @@ sprite_frames = SubResource("SpriteFrames_6drt6")
animation = &"idle_left_walk"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -4015,3 +4069,35 @@ libraries = {
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
bus = &"SFX"
[node name="SpotLight3D" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.366956, 0.930238, 0, -0.930238, 0.366956, 0.00325984, 2.75088, 0.773075)
light_energy = 0.05
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 2.0
[node name="SpotLight3D2" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.1912, 2.95882, -1.04038)
light_energy = 0.05
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 2.0
[node name="SpotLight3D3" type="SpotLight3D" parent="."]
transform = Transform3D(0.619848, -0.663442, -0.419086, 0, -0.534057, 0.845448, -0.784722, -0.524049, -0.331034, -0.901541, 2.75088, -0.392173)
light_energy = 0.05
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 2.0
[node name="SpotLight3D4" type="SpotLight3D" parent="."]
transform = Transform3D(-0.0257408, 0.845168, 0.53388, 1.84729e-08, -0.534057, 0.845448, 0.999669, 0.0217625, 0.013747, 0.89876, 2.87897, -0.00373673)
light_energy = 0.05
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 2.0
@@ -1,7 +1,6 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Linq;
namespace Zennysoft.Game.Ma;
@@ -8,7 +8,7 @@
[ext_resource type="AudioStream" uid="uid://b7ycb6qvitpmw" path="res://src/audio/sfx/player_HITENEMY_3.ogg" id="7_kwkfv"]
[ext_resource type="PackedScene" uid="uid://cmhem5xknjsvc" path="res://src/enemy/behaviors/EngagePlayerBehavior.tscn" id="7_x8mrp"]
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="8_upf7y"]
[ext_resource type="AudioStream" uid="uid://bn6ns3jxkw03b" path="res://src/audio/sfx/ENEMY_SPROING_death.ogg" id="9_fm627"]
[ext_resource type="AudioStream" uid="uid://bvokiqp1pqgfs" path="res://src/audio/sfx/ENEMY_michael_death.ogg" id="9_bun8r"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0
@@ -19,7 +19,7 @@ radius = 0.34933
height = 2.66932
[sub_resource type="CylinderShape3D" id="CylinderShape3D_eek1b"]
radius = 1.0
radius = 1.51025
[sub_resource type="SphereShape3D" id="SphereShape3D_wrps7"]
radius = 0.552847
@@ -31,7 +31,6 @@ collision_mask = 11
axis_lock_linear_y = true
axis_lock_angular_x = true
axis_lock_angular_z = true
motion_mode = 1
script = ExtResource("1_lb5oy")
AeolicResistance = -20.0
HydricResistance = -20.0
@@ -90,13 +89,12 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("5_fkx5j")]
unique_name_in_owner = true
_patrolSpeed = 60.0
_patrolRange = 15.0
_patrolTime = 20.0
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_bun8r")]
unique_name_in_owner = true
_followSpeed = 150.0
FollowSpeed = 175.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_x8mrp")]
unique_name_in_owner = true
@@ -107,7 +105,9 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 3.0
use_3d_avoidance = true
avoidance_layers = 9
avoidance_mask = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0)
@@ -129,7 +129,7 @@ bus = &"SFX"
[node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("9_fm627")
stream = ExtResource("9_bun8r")
bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
@@ -13,6 +13,10 @@ ATK = ""
DEF = ""
Affinity = "Ferrum"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Limbic Shock"
PrimaryAttackType = 6
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -3216,7 +3216,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3),
"times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3282,7 +3282,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3),
"times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3347,7 +3347,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3),
"times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3412,7 +3412,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3),
"times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4350,13 +4350,17 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_o4cc2")
CanMove = true
EnemyLoreInfo = ExtResource("2_pqohf")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.98924, 0)
modulate = Color(0.68, 0.68, 0.68, 1)
layers = 5
cast_shadow = 0
gi_mode = 0
billboard = 2
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -4385,6 +4389,7 @@ animation = &"idle_front_walk"
offset = Vector2(400, 400)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -4439,6 +4444,50 @@ scale = Vector2(2.005, 2.005)
sprite_frames = SubResource("SpriteFrames_kp6q4")
animation = &"WATER DAMAGE"
[node name="SpotLight3D" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(1, 0, 0, 0, 0.366956, 0.930238, 0, -0.930238, 0.366956, 0, 0.895226, 0.771256)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 10.0
distance_fade_length = 40.0
spot_range = 4.0
[node name="SpotLight3D2" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.19446, 1.10317, -1.0422)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 10.0
distance_fade_length = 40.0
spot_range = 4.0
[node name="SpotLight3D3" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.619848, -0.663442, -0.419087, 0, -0.534057, 0.845448, -0.784722, -0.524049, -0.331034, -0.904801, 0.895226, -0.393992)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 10.0
distance_fade_length = 40.0
spot_range = 4.0
[node name="SpotLight3D4" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(-0.0257408, 0.845168, 0.53388, 1.84729e-08, -0.534057, 0.845448, 0.999669, 0.0217625, 0.0137471, 0.8955, 1.02332, -0.00555617)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 10.0
distance_fade_length = 40.0
spot_range = 4.0
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 1.34076, 0)
@@ -36,14 +36,13 @@ public partial class FilthEater : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye
public void OnResolved()
{
_enemyLogic.Input(new EnemyLogic.Input.Activate());
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
}
public override void PerformAction()
{
var enemyPosition = new Vector3(GlobalPosition.X, _player.GlobalPosition.Y, GlobalPosition.Z);
if (enemyPosition.DistanceTo(_player.GlobalPosition) > 3)
if (enemyPosition.DistanceTo(_player.Position) > 4)
EnemyModelView.PlaySecondaryAttackAnimation();
else
EnemyModelView.PlayPrimaryAttackAnimation();
@@ -1,6 +1,8 @@
[gd_scene load_steps=16 format=3 uid="uid://bl426uws0i86l"]
[gd_scene load_steps=19 format=3 uid="uid://bl426uws0i86l"]
[ext_resource type="Script" uid="uid://cohal8w5ceneg" path="res://src/enemy/enemy_types/03. filth_eater/FilthEater.cs" id="1_p438s"]
[ext_resource type="Script" uid="uid://b6vgwsjlshci" path="res://src/items/InventoryItemStats.cs" id="2_m7220"]
[ext_resource type="Script" uid="uid://bei3s7yr6xkc0" path="res://src/enemy/EnemyLootTable.cs" id="3_g602r"]
[ext_resource type="PackedScene" uid="uid://b6sa6ntu4rbrm" path="res://src/enemy/enemy_types/03. filth_eater/FilthEaterModelView.tscn" id="3_rrwed"]
[ext_resource type="Script" uid="uid://dlsgyx4i1jmp3" path="res://src/enemy/EnemyLoreInfo.cs" id="4_5eid5"]
[ext_resource type="PackedScene" uid="uid://cn4fv2gv6raql" path="res://src/enemy/behaviors/PatrolBehavior.tscn" id="5_pvjvo"]
@@ -9,18 +11,12 @@
[ext_resource type="AudioStream" uid="uid://ba8xendacec6" path="res://src/audio/sfx/item_kyuu_layer_2.ogg" id="7_qbmfg"]
[ext_resource type="AudioStream" uid="uid://b7ycb6qvitpmw" path="res://src/audio/sfx/player_HITENEMY_3.ogg" id="8_m7220"]
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="9_g602r"]
[ext_resource type="AudioStream" uid="uid://6r74nka4oh20" path="res://src/audio/sfx/ENEMY_filth_aggro.ogg" id="11_qbmfg"]
[ext_resource type="AudioStream" uid="uid://bn6ns3jxkw03b" path="res://src/audio/sfx/ENEMY_SPROING_death.ogg" id="12_m7220"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0
radius = 1.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 2.54294
height = 5.08589
[sub_resource type="SphereShape3D" id="SphereShape3D_0y048"]
radius = 2.30121
[sub_resource type="Resource" id="Resource_06aiy"]
script = ExtResource("3_g602r")
Items = Array[ExtResource("2_m7220")]([])
metadata/_custom_type_script = "uid://bei3s7yr6xkc0"
[sub_resource type="Resource" id="Resource_fv5vf"]
script = ExtResource("4_5eid5")
@@ -31,89 +27,111 @@ ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = ""
PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = ExtResource("4_5eid5")
[sub_resource type="CylinderShape3D" id="CylinderShape3D_qbmfg"]
height = 5.81738
radius = 3.91016
[sub_resource type="CylinderShape3D" id="CylinderShape3D_g602r"]
height = 13.8621
radius = 1.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_06aiy"]
radius = 1.8
height = 6.0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_ygtll"]
radius = 6.70264
[sub_resource type="SphereShape3D" id="SphereShape3D_ebx6c"]
radius = 2.64628
[node name="FilthEater" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1
collision_layer = 10
collision_mask = 11
collision_mask = 3
axis_lock_linear_y = true
axis_lock_angular_x = true
axis_lock_angular_z = true
script = ExtResource("1_p438s")
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 2.25757, 0)
collision_layer = 2
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="LineOfSight"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -2)
shape = SubResource("CylinderShape3D_jbgmx")
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 2.25757, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="Raycast" type="RayCast3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.31086, 0)
target_position = Vector3(0, 0, -5)
collision_mask = 3
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25757, 0)
collision_layer = 2048
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.120117, 0.221246, 0)
shape = SubResource("SphereShape3D_0y048")
_lootTable = SubResource("Resource_06aiy")
[node name="EnemyModelView" parent="." instance=ExtResource("3_rrwed")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.114099, 0)
EnemyLoreInfo = SubResource("Resource_fv5vf")
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.71715, 0)
collision_layer = 2
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="LineOfSight"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, -1.19209e-07, -6.43103)
shape = SubResource("CylinderShape3D_g602r")
[node name="Raycast" type="RayCast3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.71715, 0)
target_position = Vector3(0, 0, -5)
collision_mask = 3
debug_shape_custom_color = Color(1, 0, 0, 1)
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.0824751, 3.16485, -0.0366802)
shape = SubResource("CapsuleShape3D_06aiy")
[node name="PlayerDetector" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25757, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0)
collision_layer = 0
collision_mask = 34
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2771, 0)
shape = SubResource("CylinderShape3D_qbmfg")
shape = SubResource("CylinderShape3D_ygtll")
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0)
collision_layer = 2048
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.120117, 0.221246, 0)
shape = SubResource("SphereShape3D_ebx6c")
[node name="Components" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25757, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("5_pvjvo")]
unique_name_in_owner = true
_patrolRange = 15.0
_patrolTime = 20.0
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_fccr3")]
unique_name_in_owner = true
_followSpeed = 150.0
FollowSpeed = 175.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_8l567")]
unique_name_in_owner = true
_minimumAttackTime = 1.0
_maximumAttackTime = 3.0
_acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
height = 2.0
radius = 3.0
use_3d_avoidance = true
avoidance_layers = 9
avoidance_mask = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25757, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0)
[node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
@@ -132,9 +150,9 @@ bus = &"SFX"
[node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("12_m7220")
bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("11_qbmfg")
bus = &"SFX"
@@ -13,6 +13,10 @@ ATK = ""
DEF = ""
Affinity = "Eolic"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Aero Cannon"
PrimaryAttackType = 1
SecondaryAttackName = "Metal Cutter"
SecondaryAttackType = 5
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -1,7 +1,7 @@
[gd_scene load_steps=706 format=3 uid="uid://b6sa6ntu4rbrm"]
[gd_scene load_steps=705 format=3 uid="uid://b6sa6ntu4rbrm"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_718m1"]
[ext_resource type="Script" uid="uid://dlsgyx4i1jmp3" path="res://src/enemy/EnemyLoreInfo.cs" id="2_krqul"]
[ext_resource type="Resource" uid="uid://bwo656s0fq3ew" path="res://src/enemy/enemy_types/03. filth_eater/FilthEaterLoreInfo.tres" id="2_p4ilm"]
[ext_resource type="Texture2D" uid="uid://bdar3daydbkge" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 1.png" id="2_vpn42"]
[ext_resource type="Texture2D" uid="uid://o214hr614jit" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 2.png" id="3_7tggm"]
[ext_resource type="Texture2D" uid="uid://hyipatqsvukp" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 3.png" id="4_usgpm"]
@@ -215,19 +215,6 @@
[ext_resource type="AudioStream" uid="uid://bajfar6pey7tm" path="res://src/audio/sfx/enemy_filth_1.ogg" id="205_01v4k"]
[ext_resource type="AudioStream" uid="uid://bpuwajdvn5bp1" path="res://src/audio/sfx/enemy_filth_blast.ogg" id="206_jltoa"]
[sub_resource type="Resource" id="Resource_pyy2h"]
script = ExtResource("2_krqul")
Name = "Filth Eater"
Description = "yuck"
MaximumHP = ""
ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="ViewportTexture" id="ViewportTexture_7tggm"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -3803,6 +3790,18 @@ tracks/5/keys = {
"update": 1,
"values": [0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath(".:CanMove")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_b1kem"]
resource_name = "idle_back"
@@ -4157,7 +4156,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705),
"times": PackedFloat32Array(0, 0.588603, 0.666667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4230,6 +4229,18 @@ tracks/6/keys = {
"times": PackedFloat32Array(0.426553)
}
tracks/6/use_blend = true
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath(".:CanMove")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 1.16667),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_krqul"]
resource_name = "primary_attack_back"
@@ -4266,7 +4277,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705),
"times": PackedFloat32Array(0, 0.588603, 0.666666),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4286,6 +4297,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0.333333)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:CanMove")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 1.08333),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_hsn02"]
resource_name = "primary_attack_left"
@@ -4322,7 +4345,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705),
"times": PackedFloat32Array(0, 0.588603, 0.666666),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4354,6 +4377,18 @@ tracks/4/keys = {
"times": PackedFloat32Array(0.333333)
}
tracks/4/use_blend = true
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath(".:CanMove")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 1.16667),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_eslbn"]
resource_name = "primary_attack_right"
@@ -4390,7 +4425,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705),
"times": PackedFloat32Array(0, 0.588603, 0.666666),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4422,6 +4457,18 @@ tracks/4/keys = {
"times": PackedFloat32Array(0.333333)
}
tracks/4/use_blend = true
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath(".:CanMove")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 1.16667),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_usgpm"]
resource_name = "secondary_attack"
@@ -4552,6 +4599,18 @@ tracks/7/keys = {
"times": PackedFloat32Array(0.015234, 0.984766, 1.42112, 1.91667)
}
tracks/7/use_blend = true
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath(".:CanMove")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0, 3.25),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_7a6is"]
resource_name = "secondary_attack_back"
@@ -4593,6 +4652,18 @@ tracks/2/keys = {
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_pyy2h"]
resource_name = "secondary_attack_left"
@@ -4646,6 +4717,18 @@ tracks/3/keys = {
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:CanMove")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="Animation" id="Animation_smxxh"]
resource_name = "secondary_attack_right"
@@ -4699,6 +4782,18 @@ tracks/3/keys = {
"update": 1,
"values": [true]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:CanMove")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_tbr0l"]
_data = {
@@ -5757,12 +5852,16 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_718m1")
EnemyLoreInfo = SubResource("Resource_pyy2h")
CanMove = true
EnemyLoreInfo = ExtResource("2_p4ilm")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 1.088, 0)
layers = 5
cast_shadow = 0
billboard = 2
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -5789,6 +5888,7 @@ sprite_frames = SubResource("SpriteFrames_673a4")
animation = &"idle_back_walk"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -5845,13 +5945,44 @@ animation = &"WATER DAMAGE"
[node name="Shadow" type="Sprite3D" parent="Sprite3D"]
transform = Transform3D(0.93, 0, 0, 0, -4.06516e-08, 0.93, 0, -0.93, -4.06516e-08, 0.00393164, -0.670112, 0.0077811)
visible = false
transparency = 0.1
cast_shadow = 0
modulate = Color(1, 1, 1, 0.591)
texture_filter = 0
texture = ExtResource("193_e5pq0")
[node name="SpotLight3D" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.568025, 0.293152, -0.189351, -0.162412, 0.542214, 0.352237, 0.308892, -0.25399, 0.533404, -0.22092, 0.407914, 0.496013)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 4.0
[node name="SpotLight3D2" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.666667, 0, 0, 0, -0.356038, 0.563632, 0, -0.563632, -0.356038, 0.102954, 0.564758, -1.0422)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 2.0
[node name="SpotLight3D3" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.413232, -0.442295, -0.279391, -3.11258e-08, -0.356038, 0.563632, -0.523148, -0.349366, -0.220689, -0.607387, 0.356814, -0.393992)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 4.0
[node name="SpotLight3D4" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(-0.0169814, 0.506246, 0.433441, 0.00247344, -0.433531, 0.506448, 0.666446, 0.0145084, 0.00916469, 1.01706, 0.905553, -0.00555617)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_range = 4.0
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 0.901429, 0)
@@ -5908,6 +6039,7 @@ unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0509949, 1.00697, 0.684851)
script = ExtResource("200_4h5gj")
ProjectileScene = ExtResource("200_mno7m")
_projectileForce = 20.0
[node name="Marker3D" type="Marker3D" parent="ProjectileSystem"]
@@ -831,6 +831,7 @@ collision_mask = 64
shape = SubResource("SphereShape3D_kct8n")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Bullet"]
process_mode = 1
[node name="AnimationPlayer" type="AnimationPlayer" parent="Bullet"]
unique_name_in_owner = true
@@ -844,6 +845,7 @@ autoplay = "Fire"
shape = SubResource("SphereShape3D_ka3x7")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
process_mode = 1
stream = ExtResource("5_m4i4a")
autoplay = true
bus = &"SFX"
@@ -23,7 +23,7 @@ height = 5.0
radius = 1.0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_746fv"]
radius = 1.25
radius = 1.59424
[node name="Sara" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1
@@ -89,16 +89,17 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_lxgpb")]
unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_ddchx")]
unique_name_in_owner = true
_acquireTargetTime = 2.0
_minimumAttackTime = 1.5
_maximumAttackTime = 3.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 1.0
use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.95329, 0)
@@ -128,9 +129,10 @@ stream = ExtResource("10_ddchx")
bus = &"SFX"
[node name="Shadow" type="Sprite3D" parent="."]
transform = Transform3D(0.925, 0, 0, 0, -4.0433e-08, 0.925, 0, -0.925, -4.0433e-08, 0.00393164, 0.101466, 0.0077811)
transform = Transform3D(0.925, 0, 0, 0, -4.0433e-08, 0.925, 0, -0.925, -4.0433e-08, 0.00393164, 0.110065, 0.0077811)
transparency = 0.1
cast_shadow = 0
modulate = Color(1, 1, 1, 0.591)
texture_filter = 0
render_priority = 100
texture = ExtResource("10_746fv")
@@ -13,6 +13,10 @@ ATK = ""
DEF = ""
Affinity = "Telluric"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Tetra Strike"
PrimaryAttackType = 5
SecondaryAttackName = "Miasma Vex"
SecondaryAttackType = 7
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -3720,7 +3720,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215),
"times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3776,7 +3776,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215),
"times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3832,7 +3832,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215),
"times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3888,7 +3888,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215),
"times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3920,7 +3920,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.5),
"times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4010,7 +4010,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.413635),
"times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4076,7 +4076,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.413635),
"times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4142,7 +4142,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.413635),
"times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4990,14 +4990,18 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_oh25a")
CanMove = true
EnemyLoreInfo = ExtResource("2_cftgd")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0.88609, 0)
layers = 5
cast_shadow = 0
modulate = Color(0.91, 0.91, 0.91, 1)
pixel_size = 0.005
billboard = 1
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -5024,6 +5028,7 @@ sprite_frames = SubResource("SpriteFrames_sobol")
animation = &"idle_front"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -5078,6 +5083,34 @@ scale = Vector2(2.605, 2.605)
sprite_frames = SubResource("SpriteFrames_bsjfy")
animation = &"WATER DAMAGE"
[node name="SpotLight3D" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.666667, 0, 0, 0, 0.540614, 0.390104, 0, -0.390104, 0.540614, 0, 0.895226, 1.17112)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D2" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.19446, 1.10317, -1.0422)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D3" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.619848, -0.663442, -0.419087, 0, -0.534057, 0.845448, -0.784722, -0.524049, -0.331034, -0.904801, 0.895226, -0.393992)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D4" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(-0.188919, 0.423463, 0.478992, 0.052598, -0.487478, 0.451711, 0.637171, 0.165797, 0.104731, 1.08038, 1.13857, 0.101536)
light_energy = 0.1
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 0.72758, 0)
@@ -78,13 +78,13 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("4_bjnvx")]
unique_name_in_owner = true
_patrolSpeed = 325.0
PatrolSpeed = 200.0
_thinkTime = 2.0
_patrolTime = 30.0
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_55sdf")]
unique_name_in_owner = true
_followSpeed = 400.0
FollowSpeed = 500.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_2xj0s")]
unique_name_in_owner = true
@@ -93,7 +93,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 1.0
use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
@@ -13,6 +13,10 @@ ATK = ""
DEF = ""
Affinity = "Telluric"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Telluric Strike"
PrimaryAttackType = 2
SecondaryAttackName = "Three Colors Gaze"
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -1,6 +1,7 @@
[gd_scene load_steps=570 format=3 uid="uid://dppmk4nx2le20"]
[gd_scene load_steps=571 format=3 uid="uid://dppmk4nx2le20"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_ueqp5"]
[ext_resource type="Resource" uid="uid://cq6inhr48gc0y" path="res://src/enemy/enemy_types/05. ballos/BallosLoreInfo.tres" id="2_ice28"]
[ext_resource type="Texture2D" uid="uid://bgkx485uy065" path="res://src/enemy/enemy_types/05. ballos/animations/WALK BACK/1.png" id="3_b3ny6"]
[ext_resource type="Texture2D" uid="uid://bb27nhsj1d30l" path="res://src/enemy/enemy_types/05. ballos/animations/WALK FRONT/1.png" id="3_mlptn"]
[ext_resource type="Texture2D" uid="uid://s46wl5rtsp6k" path="res://src/enemy/enemy_types/05. ballos/animations/WALK FRONT/2.png" id="4_qgnoe"]
@@ -3485,7 +3486,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.335728, 0.749375),
"times": PackedFloat32Array(0, 0.335728, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -3555,11 +3556,41 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.335728, 0.749375),
"times": PackedFloat32Array(0, 0.335728, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 3.5333,
"start_offset": 2.1795,
"stream": ExtResource("94_i3hgg")
}],
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("102_8xbn0")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_7d2d3"]
resource_name = "primary_attack_left"
@@ -3600,6 +3631,36 @@ tracks/2/keys = {
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 3.5333,
"start_offset": 2.1795,
"stream": ExtResource("94_i3hgg")
}],
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("102_8xbn0")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_poqxf"]
resource_name = "primary_attack_right"
@@ -3640,6 +3701,40 @@ tracks/2/keys = {
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": null
}, {
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("102_8xbn0")
}],
"times": PackedFloat32Array(0, 0.0001)
}
tracks/3/use_blend = true
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 3.5333,
"start_offset": 2.1795,
"stream": ExtResource("94_i3hgg")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_airxj"]
resource_name = "secondary_attack"
@@ -3762,6 +3857,36 @@ tracks/2/keys = {
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 3.8412,
"start_offset": 0.5968,
"stream": ExtResource("94_i3hgg")
}],
"times": PackedFloat32Array(-0.583333)
}
tracks/3/use_blend = true
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("104_ice28")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_o6ljw"]
resource_name = "secondary_attack_left"
@@ -3803,6 +3928,36 @@ tracks/2/keys = {
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "audio"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("AudioStreamPlayer3D")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": [{
"end_offset": 3.8412,
"start_offset": 0.5968,
"stream": ExtResource("94_i3hgg")
}],
"times": PackedFloat32Array(-0.583333)
}
tracks/3/use_blend = true
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("104_ice28")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_cyiv5"]
resource_name = "secondary_attack_right"
@@ -3856,6 +4011,40 @@ tracks/3/keys = {
"update": 1,
"values": [true]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 3.8412,
"start_offset": 0.5968,
"stream": ExtResource("94_i3hgg")
}],
"times": PackedFloat32Array(-0.583333)
}
tracks/4/use_blend = true
tracks/5/type = "audio"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("AudioStreamPlayer3D")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": null
}, {
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("104_ice28")
}],
"times": PackedFloat32Array(0, 0.0001)
}
tracks/5/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xidnl"]
_data = {
@@ -4695,12 +4884,17 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_ueqp5")
CanMove = true
EnemyLoreInfo = ExtResource("2_ice28")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 1.76027, 0)
layers = 5
cast_shadow = 0
pixel_size = 0.015
billboard = 2
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -4726,6 +4920,7 @@ animation = &"idle_front_walk"
offset = Vector2(400, 400)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -4816,13 +5011,11 @@ libraries = {
[node name="WalkSFX" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.86303, 0)
stream = ExtResource("94_i3hgg")
autoplay = true
bus = &"SFX"
[node name="Shadow" type="Sprite3D" parent="."]
transform = Transform3D(1.265, 0, 0, 0, -5.52949e-08, 1.265, 0, -1.265, -5.52949e-08, 0.00393164, -0.0238594, 0.0077811)
visible = false
transparency = 0.1
cast_shadow = 0
modulate = Color(1, 1, 1, 0.591)
@@ -4876,3 +5069,31 @@ libraries = {
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
max_distance = 518.62
bus = &"SFX"
[node name="SpotLight3D" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.752335, 0.658781, 0, -0.658781, 0.752335, 0, 3.57796, 1.74705)
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_attenuation = 0.8
[node name="SpotLight3D2" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.19446, 4.03218, -1.75588)
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_attenuation = 0.8
[node name="SpotLight3D3" type="SpotLight3D" parent="."]
transform = Transform3D(0.598758, -0.502743, -0.623489, 0.160314, -0.687475, 0.708292, -0.784722, -0.52405, -0.331034, -2.50296, 4.04564, -0.393992)
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_attenuation = 0.8
[node name="SpotLight3D4" type="SpotLight3D" parent="."]
transform = Transform3D(-0.0253979, 0.747023, 0.664313, 0.00418776, -0.664442, 0.747328, 0.999669, 0.0217625, 0.013747, 2.02917, 3.61058, -0.00555617)
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
spot_attenuation = 0.8
@@ -14,6 +14,10 @@ ATK = ""
DEF = ""
Affinity = "Telluric"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Biohazard Spray"
PrimaryAttackType = 5
SecondaryAttackName = "Green-Earth Flare"
SecondaryAttackType = 2
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -1,7 +1,7 @@
[gd_scene load_steps=851 format=3 uid="uid://dfih3tw51mumf"]
[gd_scene load_steps=850 format=3 uid="uid://dfih3tw51mumf"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_lp3cr"]
[ext_resource type="Script" uid="uid://dlsgyx4i1jmp3" path="res://src/enemy/EnemyLoreInfo.cs" id="2_olcu2"]
[ext_resource type="Resource" uid="uid://y0eanqffc1pf" path="res://src/enemy/enemy_types/06. Planter/PlanterLoreInfo.tres" id="2_xn42l"]
[ext_resource type="AnimationNodeStateMachine" uid="uid://clybvwx3itfeo" path="res://src/enemy/animation_state_machines/SecondaryAttackStateMachine.tres" id="3_4l2tb"]
[ext_resource type="AudioStream" uid="uid://dpsqle6gghgrq" path="res://src/audio/sfx/planter_moving_layer.ogg" id="3_xn42l"]
[ext_resource type="AudioStream" uid="uid://b6xdgfp1ttdg4" path="res://src/audio/sfx/enemy_planter_ranged_attack.ogg" id="4_xf3uf"]
@@ -412,19 +412,6 @@
[ext_resource type="Texture2D" uid="uid://dwuu7ik20m5yq" path="res://src/vfx/Enemy/chariot_attack2/chariot_attack2_071.png" id="407_ruvnx"]
[ext_resource type="Texture2D" uid="uid://cv83xpm5cd8mv" path="res://src/vfx/Enemy/chariot_blast.png" id="408_6oqs0"]
[sub_resource type="Resource" id="Resource_ivy74"]
script = ExtResource("2_olcu2")
Name = "Sproingy"
Description = "He's smaller than I expected..."
MaximumHP = ""
ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="BoxShape3D" id="BoxShape3D_53wuj"]
size = Vector3(1, 1.07938, 3.51416)
@@ -683,7 +670,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.76, 1.16),
"times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -790,7 +777,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -843,7 +830,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -896,7 +883,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857),
"times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -5827,7 +5814,7 @@ animations = [{
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_lp3cr")
EnemyLoreInfo = SubResource("Resource_ivy74")
EnemyLoreInfo = ExtResource("2_xn42l")
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
@@ -5920,8 +5907,11 @@ libraries = {
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0)
layers = 5
cast_shadow = 0
pixel_size = 0.006
billboard = 2
shaded = true
alpha_cut = 1
texture_filter = 0
render_priority = 100
@@ -5946,6 +5936,7 @@ animation = &"Idle FRONT"
offset = Vector2(402.745, 400)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -6000,6 +5991,50 @@ scale = Vector2(4.28, 4.28)
sprite_frames = SubResource("SpriteFrames_6tam3")
animation = &"WATER DAMAGE"
[node name="SpotLight3D" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(1, 0, 0, 0, 0.366956, 0.930238, 0, -0.930238, 0.366956, 0, 1.4208, 0.771256)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 20.0
distance_fade_length = 20.0
spot_range = 6.0
[node name="SpotLight3D2" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.19446, 1.62875, -1.0422)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 20.0
distance_fade_length = 20.0
spot_range = 6.0
[node name="SpotLight3D3" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.619848, -0.663442, -0.419086, 0, -0.534057, 0.845448, -0.784722, -0.524049, -0.331034, -0.904801, 1.4208, -0.393992)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 20.0
distance_fade_length = 20.0
spot_range = 6.0
[node name="SpotLight3D4" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(-0.0257408, 0.845168, 0.53388, 1.84729e-08, -0.534057, 0.845448, 0.999669, 0.0217625, 0.013747, 0.8955, 1.5489, -0.00555617)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
distance_fade_enabled = true
distance_fade_begin = 20.0
distance_fade_length = 20.0
spot_range = 6.0
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."]
transform = Transform3D(0.705, 0, 0, 0, 0.705, 0, 0, 0, 0.705, 0, 2.86141, 0.0472305)
modulate = Color(1, 1, 1, 0.627451)
@@ -1,103 +0,0 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System;
using System.Collections.Generic;
using Zennysoft.Game.Ma;
using Zennysoft.Ma.Adapter;
[Meta(typeof(IAutoNode))]
public partial class Chariot : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBehavior, IHaveFollowBehavior
{
public override void _Notification(int what) => this.Notify(what);
[Export] private float PrimaryAttackChance { get; set; } = 0.75f;
[Export] private float SecondaryAttackChance { get; set; } = 0.25f;
[Node] public NavigationAgent3D NavigationAgent { get; set; }
[Node] public PatrolBehavior PatrolBehavior { get; set; } = default!;
[Node] public FollowBehavior FollowBehavior { get; set; } = default!;
[Node] public EngagePlayerBehavior EngagePlayerBehavior { get; set; } = default!;
[Node] public Area3D PlayerDetector { get; set; } = default!;
public void OnReady()
{
FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnChariotVelocityComputed;
FollowBehavior.OnVelocityComputed += OnChariotVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += Chariot_PlayerDetected;
PlayerDetector.BodyExited += Chariot_PlayerExitArea;
((EnemyModelView)EnemyModelView).CanMove = true;
SetPhysicsProcess(true);
}
private void Chariot_PlayerExitArea(Node3D body)
{
EngagePlayerBehavior.Disengage();
}
private void Chariot_PlayerDetected(Node3D body)
{
if (body is not IPlayer)
return;
if (!_activated)
_enemyLogic.Input(new EnemyLogic.Input.Activate());
EngagePlayerBehavior.Engage();
}
public override void Idle()
{
if (!_activated)
base.Idle();
}
public override void Move()
{
if (!_activated)
base.Move();
}
public void OnResolved()
{
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
}
public override void Activate()
{
if (!_activated)
{
((EnemyModelView)EnemyModelView).CanMove = false;
Velocity = Vector3.Zero;
EnemyModelView.PlayActivateAnimation();
}
}
public override void _Process(double delta)
{
if (!_activated)
base._Process(delta);
}
public override void PerformAction()
{
var rng = new RandomNumberGenerator();
var options = new List<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
options[(int)selection].Invoke();
}
public void OnChariotVelocityComputed(Vector3 safeVelocity)
{
Velocity = safeVelocity;
LookAtTarget(safeVelocity);
if (((EnemyModelView)EnemyModelView).CanMove)
MoveAndSlide();
}
}
@@ -1 +0,0 @@
uid://djx5x5bhkku85
@@ -1,121 +0,0 @@
[gd_scene load_steps=14 format=3 uid="uid://cd12cj1g37bn4"]
[ext_resource type="Script" uid="uid://djx5x5bhkku85" path="res://src/enemy/enemy_types/06. chariot/Chariot.cs" id="1_q1q0f"]
[ext_resource type="PackedScene" uid="uid://dwgq2bxolnx8l" path="res://src/enemy/enemy_types/06. chariot/ChariotModelView.tscn" id="3_q1q0f"]
[ext_resource type="PackedScene" uid="uid://cn4fv2gv6raql" path="res://src/enemy/behaviors/PatrolBehavior.tscn" id="4_ee8v4"]
[ext_resource type="PackedScene" uid="uid://cve5oouhowtff" path="res://src/enemy/behaviors/FollowBehavior.tscn" id="5_uv8in"]
[ext_resource type="AudioStream" uid="uid://ba8xendacec6" path="res://src/audio/sfx/item_kyuu_layer_2.ogg" id="6_582pa"]
[ext_resource type="PackedScene" uid="uid://cmhem5xknjsvc" path="res://src/enemy/behaviors/EngagePlayerBehavior.tscn" id="6_cfqmf"]
[ext_resource type="AudioStream" uid="uid://b7ycb6qvitpmw" path="res://src/audio/sfx/player_HITENEMY_3.ogg" id="7_jemva"]
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="8_ave6n"]
[ext_resource type="AudioStream" uid="uid://daye7334d7rfe" path="res://src/audio/sfx/ENEMY_CHARIOT_DEATH.ogg" id="9_cfqmf"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 1.67281
height = 3.34563
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0
radius = 1.0
[sub_resource type="SphereShape3D" id="SphereShape3D_lqifn"]
radius = 1.20703
[sub_resource type="CylinderShape3D" id="CylinderShape3D_582pa"]
radius = 2.34863
[node name="Chariot" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1
collision_layer = 10
collision_mask = 3
axis_lock_linear_y = true
axis_lock_angular_x = true
script = ExtResource("1_q1q0f")
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.40414, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.40414, 0)
collision_layer = 2
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="LineOfSight"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -2)
shape = SubResource("CylinderShape3D_jbgmx")
[node name="Raycast" type="RayCast3D" parent="LineOfSight"]
unique_name_in_owner = true
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0)
target_position = Vector3(0, 0, 3)
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
collision_layer = 2048
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"]
shape = SubResource("SphereShape3D_lqifn")
[node name="EnemyModelView" parent="." instance=ExtResource("3_q1q0f")]
unique_name_in_owner = true
transform = Transform3D(0.999848, 0, 0.0174524, 0, 1, 0, -0.0174524, 0, 0.999848, 0, 0.0547004, 0)
[node name="PlayerDetector" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
collision_layer = 0
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"]
shape = SubResource("CylinderShape3D_582pa")
[node name="Components" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("4_ee8v4")]
unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_uv8in")]
unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_cfqmf")]
unique_name_in_owner = true
_acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
height = 3.0
radius = 1.0
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
[node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("6_582pa")
bus = &"SFX"
[node name="HitSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("7_jemva")
bus = &"SFX"
[node name="MorphSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("8_ave6n")
bus = &"SFX"
[node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("9_cfqmf")
bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
bus = &"SFX"
@@ -1,21 +0,0 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class ChariotModelView : EnemyModelView2D, IEnemyModelView
{
public override void _Notification(int what) => this.Notify(what);
[Node] AnimationTree ScrollAnimationTree { get; set; } = default!;
public override void PlayActivateAnimation()
{
_stateMachine.Travel(_activateName);
var scrollStateMachine = (AnimationNodeStateMachinePlayback)ScrollAnimationTree.Get(_parametersPlayback);
scrollStateMachine.Travel(_activateName);
}
}
@@ -1 +0,0 @@
uid://ckxqmb4tu4rml
File diff suppressed because it is too large Load Diff
@@ -13,6 +13,10 @@ ATK = ""
DEF = ""
Affinity = "Eolic"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Matter Shift"
PrimaryAttackType = 0
SecondaryAttackName = "Mid-Century Pulsar"
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -10,8 +10,8 @@
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="8_a4ku4"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.226425
height = 2.02807
radius = 1.0
height = 3.90429
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0
@@ -26,8 +26,12 @@ ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = ""
PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"]
@@ -48,7 +52,7 @@ script = ExtResource("1_120m2")
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.46013, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.92003, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="LineOfSight" type="Area3D" parent="."]
@@ -88,7 +92,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.46013, 0)
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_t7elt")]
unique_name_in_owner = true
_followSpeed = 500.0
FollowSpeed = 800.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_24q6i")]
unique_name_in_owner = true
@@ -97,7 +101,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 1.0
use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.46013, 0)
@@ -1,7 +1,8 @@
[gd_scene load_steps=898 format=3 uid="uid://de6e8yv6mv4fe"]
[gd_scene load_steps=900 format=3 uid="uid://de6e8yv6mv4fe"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_6dej3"]
[ext_resource type="Texture2D" uid="uid://dnd6d5cx7x7i8" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0400.png" id="2_3sdh3"]
[ext_resource type="Resource" uid="uid://2j714tuwhbdu" path="res://src/enemy/enemy_types/07. chinthe/ChinteLoreInfo.tres" id="2_y2ova"]
[ext_resource type="Texture2D" uid="uid://c0unwba144tls" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0402.png" id="3_dbwem"]
[ext_resource type="Texture2D" uid="uid://ca1im2so1vkym" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0404.png" id="4_y7pe6"]
[ext_resource type="Texture2D" uid="uid://cgnm3v0t63aiw" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0406.png" id="5_xu4hf"]
@@ -407,6 +408,7 @@
[ext_resource type="Texture2D" uid="uid://cot4wx5fg5pfs" path="res://src/vfx/Enemy Affected/water_hit_layer2.png" id="397_3iqav"]
[ext_resource type="Texture2D" uid="uid://cbei66g134fgv" path="res://src/vfx/Enemy Affected/water layer 1.png" id="398_ii52r"]
[ext_resource type="Texture2D" uid="uid://bp6npqoco5fl3" path="res://src/vfx/Enemy Affected/curse_damage.png" id="399_v8fg0"]
[ext_resource type="AudioStream" uid="uid://6hbvxrms14mg" path="res://src/audio/sfx/enemy_chinthe_teleport_IN.ogg" id="404_8vs7h"]
[sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -5711,6 +5713,21 @@ tracks/6/keys = {
"update": 0,
"values": [Color(1, 1, 1, 1), Color(100, 100, 100, 1), Color(1, 1, 1, 1)]
}
tracks/7/type = "audio"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Chinthe SFX")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("404_8vs7h")
}],
"times": PackedFloat32Array(0)
}
tracks/7/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_46p8q"]
_data = {
@@ -5906,13 +5923,13 @@ states/Start/position = Vector2(199, 100)
"states/Stop Walk/node" = SubResource("AnimationNodeStateMachine_li182")
"states/Stop Walk/position" = Vector2(72.437, 334.144)
"states/Teleport In/node" = SubResource("AnimationNodeAnimation_li182")
"states/Teleport In/position" = Vector2(-67.563, 254.144)
"states/Teleport In/position" = Vector2(-67.563, 253.144)
"states/Unactivated Idle/node" = ExtResource("245_gr3tp")
"states/Unactivated Idle/position" = Vector2(357, 100)
states/Walking/node = SubResource("AnimationNodeStateMachine_7dl50")
states/Walking/position = Vector2(348, 400.144)
transitions = ["Start", "Unactivated Idle", SubResource("AnimationNodeStateMachineTransition_umemc"), "Unactivated Idle", "Activate", SubResource("AnimationNodeStateMachineTransition_t3xhd"), "Activate", "Idle", SubResource("AnimationNodeStateMachineTransition_5jjkq"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_keq07"), "Idle", "Primary Skill", SubResource("AnimationNodeStateMachineTransition_manul"), "Primary Skill", "Teleport In", SubResource("AnimationNodeStateMachineTransition_auprl"), "Teleport In", "Idle", SubResource("AnimationNodeStateMachineTransition_i5vf2"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_jbhro"), "Stop Walk", "Idle", SubResource("AnimationNodeStateMachineTransition_yu6fp"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_sgkk0"), "Walking", "Stop Walk", SubResource("AnimationNodeStateMachineTransition_8e7of")]
graph_offset = Vector2(-313.563, 209.889)
graph_offset = Vector2(-216.563, -3.11099)
[sub_resource type="AtlasTexture" id="AtlasTexture_tawq7"]
atlas = ExtResource("395_ymova")
@@ -6513,7 +6530,7 @@ tracks/15/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
"values": [&"EARTH DAMAGE"]
}
tracks/16/type = "value"
tracks/16/imported = false
@@ -6652,6 +6669,7 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_6dej3")
EnemyLoreInfo = ExtResource("2_y2ova")
[node name="Shadow" type="Sprite3D" parent="."]
transform = Transform3D(0.75, 0, 0, 0, -3.27836e-08, 0.75, 0, -0.75, -3.27836e-08, 0.00589746, -0.0179769, 0.0116717)
@@ -6664,9 +6682,12 @@ texture = ExtResource("392_sgkk0")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0)
layers = 5
cast_shadow = 0
offset = Vector2(0, 200)
pixel_size = 0.005
billboard = 2
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -6693,6 +6714,7 @@ animation = &"idle_front_walk"
offset = Vector2(500, 500)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -6745,7 +6767,35 @@ frame = 47
position = Vector2(500, 500)
scale = Vector2(4, 4)
sprite_frames = SubResource("SpriteFrames_8u7he")
animation = &"WATER DAMAGE"
animation = &"EARTH DAMAGE"
[node name="SpotLight3D" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.666667, 0, 0, 0, 0.244637, 0.620159, 0, -0.620159, 0.244637, 0, 1.78929, 0.771256)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D2" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.666667, 0, 0, 0, -0.356038, 0.563632, 0, -0.563632, -0.356038, -0.19446, 1.99723, -1.0422)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D3" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(0.413232, -0.442295, -0.279391, 0, -0.356038, 0.563632, -0.523148, -0.349366, -0.220689, -0.904801, 1.78929, -0.393992)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D4" type="SpotLight3D" parent="Sprite3D"]
transform = Transform3D(-0.0171605, 0.563446, 0.35592, 1.23153e-08, -0.356038, 0.563632, 0.666446, 0.0145083, 0.00916467, 0.8955, 1.91738, -0.00555617)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
@@ -12,11 +12,12 @@
[ext_resource type="AudioStream" uid="uid://6aje2myxas3d" path="res://src/audio/sfx/enemy_ambassador_aggro.ogg" id="10_sjoyv"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.106078
height = 1.23076
radius = 0.9672
height = 3.20843
[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"]
radius = 0.57308
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_sjoyv"]
radius = 0.908537
height = 3.36877
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0
@@ -47,7 +48,7 @@ collision_layer = 2048
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision/Collision"]
shape = SubResource("SphereShape3D_8vcnq")
shape = SubResource("CapsuleShape3D_sjoyv")
[node name="LineOfSight" type="Area3D" parent="Collision"]
unique_name_in_owner = true
@@ -89,7 +90,6 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_gy5yi")]
unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_7f1qq")]
unique_name_in_owner = true
@@ -98,7 +98,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 1.0
use_3d_avoidance = true
avoidance_mask = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.29778, 0)
@@ -13,6 +13,10 @@ ATK = ""
DEF = ""
Affinity = "Ferrum"
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = "Embargo Kick"
PrimaryAttackType = 5
SecondaryAttackName = "Treaty Punch"
SecondaryAttackType = 5
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -1,7 +1,7 @@
[gd_scene load_steps=695 format=3 uid="uid://7eo16vsbrgi3"]
[gd_scene load_steps=694 format=3 uid="uid://7eo16vsbrgi3"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_h27bt"]
[ext_resource type="Script" uid="uid://dlsgyx4i1jmp3" path="res://src/enemy/EnemyLoreInfo.cs" id="2_yyynn"]
[ext_resource type="Resource" uid="uid://bcg3dsd3jcxpb" path="res://src/enemy/enemy_types/08a. Ambassador/AmbassadorLoreInfo.tres" id="2_vh04b"]
[ext_resource type="Texture2D" uid="uid://7ef67gqhcb3d" path="res://src/enemy/enemy_types/08a. Ambassador/animations/B/Layer 173.png" id="3_mhafn"]
[ext_resource type="Texture2D" uid="uid://i0pmr2jtdhu5" path="res://src/enemy/enemy_types/08a. Ambassador/animations/B/Layer 174.png" id="4_tuqu4"]
[ext_resource type="Texture2D" uid="uid://dxo32giakqy8n" path="res://src/enemy/enemy_types/08a. Ambassador/animations/B/Layer 175.png" id="5_66kkx"]
@@ -276,19 +276,6 @@
[ext_resource type="Texture2D" uid="uid://dafpnwkwcukp4" path="res://src/vfx/shadow_test_1.png" id="267_evddb"]
[ext_resource type="Texture2D" uid="uid://bp6npqoco5fl3" path="res://src/vfx/Enemy Affected/curse_damage.png" id="267_qpodb"]
[sub_resource type="Resource" id="Resource_f45wt"]
script = ExtResource("2_yyynn")
Name = "Ambassador"
Description = "Running guy"
MaximumHP = ""
ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -4375,6 +4362,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_fmw6u"]
resource_name = "primary_attack_left"
@@ -4431,6 +4430,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_psv15"]
resource_name = "primary_attack_right"
@@ -4487,6 +4498,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_5y02v"]
resource_name = "secondary_attack"
@@ -4611,6 +4634,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_m347f"]
resource_name = "secondary_attack_left"
@@ -4667,6 +4702,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_xe0e6"]
resource_name = "secondary_attack_right"
@@ -4723,6 +4770,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_x0ep5"]
_data = {
@@ -5258,14 +5317,17 @@ _data = {
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_h27bt")
EnemyLoreInfo = SubResource("Resource_f45wt")
EnemyLoreInfo = ExtResource("2_vh04b")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0.345, 0)
layers = 5
cast_shadow = 0
offset = Vector2(0, 75)
pixel_size = 0.02
billboard = 2
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -5292,6 +5354,7 @@ sprite_frames = SubResource("SpriteFrames_6drt6")
animation = &"idle_front"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -5430,3 +5493,31 @@ unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="SpotLight3D" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.366956, 0.930238, 0, -0.930238, 0.366956, 0, 3.146, 0.771256)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D2" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.19446, 3.35395, -1.0422)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D3" type="SpotLight3D" parent="."]
transform = Transform3D(0.619848, -0.663442, -0.419086, 0, -0.534057, 0.845448, -0.784722, -0.524049, -0.331034, -0.904801, 3.146, -0.393992)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D4" type="SpotLight3D" parent="."]
transform = Transform3D(-0.0257408, 0.845168, 0.53388, 1.84729e-08, -0.534057, 0.845448, 0.999669, 0.0217625, 0.013747, 0.8955, 3.2741, -0.00555617)
light_energy = 0.5
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
@@ -88,7 +88,6 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_v4xmn")]
unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_a21yr")]
unique_name_in_owner = true
@@ -97,7 +96,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 1.0
use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.69068, 0)
@@ -1,4 +1,4 @@
[gd_scene load_steps=695 format=3 uid="uid://d02te8cwjistl"]
[gd_scene load_steps=696 format=3 uid="uid://d02te8cwjistl"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_a8qtn"]
[ext_resource type="Script" uid="uid://dlsgyx4i1jmp3" path="res://src/enemy/EnemyLoreInfo.cs" id="2_xa3ug"]
@@ -275,6 +275,7 @@
[ext_resource type="Texture2D" uid="uid://cot4wx5fg5pfs" path="res://src/vfx/Enemy Affected/water_hit_layer2.png" id="266_ewlwi"]
[ext_resource type="Texture2D" uid="uid://cbei66g134fgv" path="res://src/vfx/Enemy Affected/water layer 1.png" id="267_ucfs5"]
[ext_resource type="Texture2D" uid="uid://bp6npqoco5fl3" path="res://src/vfx/Enemy Affected/curse_damage.png" id="268_4it51"]
[ext_resource type="AudioStream" uid="uid://ugc77goiwht0" path="res://src/audio/sfx/enemy_ambassador_punch.ogg" id="270_i3uxw"]
[sub_resource type="Resource" id="Resource_f45wt"]
script = ExtResource("2_xa3ug")
@@ -285,8 +286,12 @@ ATK = ""
DEF = ""
Affinity = ""
Weakness = ""
Drop1 = ""
Drop2 = ""
PrimaryAttackName = ""
PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
@@ -4329,7 +4334,7 @@ tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.0833333, 0.25),
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
@@ -4390,6 +4395,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_fmw6u"]
resource_name = "primary_attack_left"
@@ -4446,6 +4463,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_psv15"]
resource_name = "primary_attack_right"
@@ -4502,6 +4531,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_5y02v"]
resource_name = "secondary_attack"
@@ -4555,6 +4596,21 @@ tracks/3/keys = {
"update": 1,
"values": [true, false, true]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("270_i3uxw")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_tlm8w"]
resource_name = "secondary_attack_back"
@@ -4596,6 +4652,33 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("270_i3uxw")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_m347f"]
resource_name = "secondary_attack_left"
@@ -4637,6 +4720,33 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("270_i3uxw")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_xe0e6"]
resource_name = "secondary_attack_right"
@@ -4678,6 +4788,33 @@ tracks/2/keys = {
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AudioStreamPlayer3D")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("270_i3uxw")
}],
"times": PackedFloat32Array(0)
}
tracks/4/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_x0ep5"]
_data = {
@@ -5219,8 +5356,11 @@ EnemyLoreInfo = SubResource("Resource_f45wt")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(0.49, 0, 0, 0, 0.49, 0, 0, 0, 0.49, 0, 0.405037, 0)
layers = 5
cast_shadow = 0
offset = Vector2(0, 75)
billboard = 2
shaded = true
alpha_cut = 2
alpha_antialiasing_mode = 1
texture_filter = 0
@@ -5251,6 +5391,7 @@ sprite_frames = SubResource("SpriteFrames_6drt6")
animation = &"idle_front"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1
@@ -5388,3 +5529,31 @@ unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="SpotLight3D" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.366956, 0.930238, 0, -0.930238, 0.366956, 0, 1.73576, 0.771256)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D2" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -0.534057, 0.845448, 0, -0.845448, -0.534057, -0.19446, 1.9437, -1.0422)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D3" type="SpotLight3D" parent="."]
transform = Transform3D(0.619848, -0.663442, -0.419086, -4.66887e-08, -0.534057, 0.845448, -0.784722, -0.524049, -0.331034, -0.904801, 1.73576, -0.393992)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
[node name="SpotLight3D4" type="SpotLight3D" parent="."]
transform = Transform3D(-0.0257408, 0.845168, 0.53388, 8.06404e-08, -0.534057, 0.845448, 0.999669, 0.0217626, 0.013747, 0.8955, 1.86385, -0.00555617)
light_energy = 0.25
light_indirect_energy = 0.0
light_bake_mode = 0
light_cull_mask = 4293918724
@@ -87,7 +87,6 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_g5uri")]
unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_5r3ee")]
unique_name_in_owner = true
@@ -96,7 +95,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
radius = 1.0
use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.32738, 0)

Some files were not shown because too many files have changed in this diff Show More