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, Hydric,
Igneous, Igneous,
Ferrum, Ferrum,
Holy, Sankta,
Curse, Shura,
All All
} }
@@ -1,26 +1,37 @@
using Godot; using Godot;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity;
namespace Zennysoft.Ma; namespace Zennysoft.Ma;
public interface ISigil : IEntityComponent public interface ISigil
{ {
public double AttackModifier { get; set; } [Export]
public double DamageModifier { get; }
[Export] [Export]
public double DefenseModifier { get; set; } public double DefenseModifier { get; }
[Export] [Export]
public int HealthModifier { get; set; } public double MoveSpeedModifier { get; }
[Export] [Export]
public int VTModifier { get; set; } public double HealAmountModifier { get; }
[Export] [Export]
public double LuckModifier { get; set; } public double VTDrainSpeedModifier { get; }
[Export] [Export]
public double ElementalModifier { get; set; } public ElementType ElementType { get; }
[Export] [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.Igneous, igneousResistance },
{ ElementType.Ferrum, ferrumResistance }, { ElementType.Ferrum, ferrumResistance },
{ ElementType.Telluric, telluricResistance }, { ElementType.Telluric, telluricResistance },
{ ElementType.Holy, holyResistance }, { ElementType.Sankta, holyResistance },
{ ElementType.Curse, curseResistance }, { ElementType.Shura, curseResistance },
{ ElementType.All, aeolicResistance + hydricResistance + igneousResistance + ferrumResistance + telluricResistance + holyResistance + 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.Igneous] + right.ElementalResistance[ElementType.Igneous],
left.ElementalResistance[ElementType.Ferrum] + right.ElementalResistance[ElementType.Ferrum], left.ElementalResistance[ElementType.Ferrum] + right.ElementalResistance[ElementType.Ferrum],
left.ElementalResistance[ElementType.Telluric] + right.ElementalResistance[ElementType.Telluric], left.ElementalResistance[ElementType.Telluric] + right.ElementalResistance[ElementType.Telluric],
left.ElementalResistance[ElementType.Holy] + right.ElementalResistance[ElementType.Holy], left.ElementalResistance[ElementType.Sankta] + right.ElementalResistance[ElementType.Sankta],
left.ElementalResistance[ElementType.Curse] + right.ElementalResistance[ElementType.Curse]); left.ElementalResistance[ElementType.Shura] + right.ElementalResistance[ElementType.Shura]);
} }
} }
} }
@@ -21,6 +21,14 @@ namespace Zennysoft.Ma.Adapter.Entity
public void OnMorph(); public void OnMorph();
public void OnBuff();
public void OnDebuff();
public void OnHealed();
public int GetDefeatCount(IEnemy enemyType);
public IDungeonRoom GetCurrentRoom(ImmutableList<IDungeonRoom> dungeonRooms); public IDungeonRoom GetCurrentRoom(ImmutableList<IDungeonRoom> dungeonRooms);
public void MoveEnemyToNewRoom(IDungeonRoom newRoom); public void MoveEnemyToNewRoom(IDungeonRoom newRoom);
@@ -35,6 +43,10 @@ namespace Zennysoft.Ma.Adapter.Entity
public ElementalResistanceSet ElementalResistanceSet { get; } public ElementalResistanceSet ElementalResistanceSet { get; }
public void SetEnemySpeedByMultiplier(double multiplier);
public IEnemyLootTable LootTable { get; }
public int InitialHP { get; } public int InitialHP { get; }
public int InitialAttack { get; } public int InitialAttack { get; }
@@ -0,0 +1,6 @@
namespace Zennysoft.Ma.Adapter.Entity;
public interface IEnemyLootTable
{
}
@@ -201,4 +201,24 @@ public class RevivePlayerAugment : IAugmentType
else else
_player.AutoRevive = false; _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 public enum ArmorTag
{ {
None, None,
DegradeOnHit DegradeOnHit,
ImmuneToRust
} }
@@ -23,5 +23,6 @@ public enum ItemTag
UseAllItems, UseAllItems,
GlueOnEquip, GlueOnEquip,
BreaksOnUnequip, BreaksOnUnequip,
ContainsJewel ContainsJewel,
KeyItem
} }
@@ -17,5 +17,6 @@ public enum JewelTags
ReviveUserOnce, ReviveUserOnce,
TelluricElement, TelluricElement,
IncreaseAtkDefLuck, IncreaseAtkDefLuck,
IncreaseLuck IncreaseLuck,
KeyStaff
} }
@@ -12,6 +12,8 @@ public partial class GameState
public readonly record struct LoadNextFloor; public readonly record struct LoadNextFloor;
public readonly record struct ReturnToOverworld;
public readonly record struct InventoryButtonPressed; public readonly record struct InventoryButtonPressed;
public readonly record struct InteractButtonPressed; public readonly record struct InteractButtonPressed;
@@ -20,6 +20,8 @@ public partial class GameState
public readonly record struct LoadNextFloor; public readonly record struct LoadNextFloor;
public readonly record struct ReturnToOverworld;
public readonly record struct OpenTeleportScreen; public readonly record struct OpenTeleportScreen;
public readonly record struct OpenFloorExitScreen; public readonly record struct OpenFloorExitScreen;
@@ -8,11 +8,12 @@ public partial class GameState
public partial record State public partial record State
{ {
[Meta, LogicBlock(typeof(State), Diagram = true)] [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() public FloorExitScreen()
{ {
OnAttach(() => Get<IGameRepo>().Pause()); OnAttach(() => Get<IGameRepo>().Pause());
OnDetach(() => Get<IGameRepo>().Resume());
} }
public Transition On(in Input.LoadNextFloor input) public Transition On(in Input.LoadNextFloor input)
@@ -20,6 +21,12 @@ public partial class GameState
Output(new Output.LoadNextFloor()); Output(new Output.LoadNextFloor());
return To<InGame>(); return To<InGame>();
} }
public Transition On(in Input.ReturnToOverworld input)
{
Output(new Output.ReturnToOverworld());
return To<InGame>();
}
} }
} }
} }
@@ -1,5 +1,6 @@
using Godot; using Godot;
using Zennysoft.Game.Abstractions;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
public interface IBaseInventoryItem public interface IBaseInventoryItem
@@ -7,10 +8,15 @@ public interface IBaseInventoryItem
public string ItemName { get; } public string ItemName { get; }
public string StatDescription { get; } public string StatDescription { get; }
public string FlavorText { get; } public string FlavorText { get; }
public float SpawnRate { get; }
public int ThrowDamage { get; } public int ThrowDamage { get; }
public float ThrowSpeed { get; } public float ThrowSpeed { get; }
public ItemTag ItemTag { get; } public ItemTag ItemTag { get; }
public abstract Texture2D GetTexture(); 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 List<IBaseInventoryItem> _items { get; init; }
private int _maxSize { get; init; } = 20; private int _maxSize { get; init; } = 20;
public RescuedItemDatabase()
{
_items = [];
}
public RescuedItemDatabase(int maxSize) public RescuedItemDatabase(int maxSize)
{ {
_items = []; _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 ImmutableList<IDungeonRoom> Rooms { get; }
public IDungeonRoom GetPlayersCurrentRoom();
public bool FloorIsLoaded { get; set; } 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 Chickensoft.GodotNodeInterfaces;
using Godot; using Godot;
using Zennysoft.Game.Abstractions; using Zennysoft.Game.Abstractions;
using Zennysoft.Game.Abstractions.Audio;
namespace Zennysoft.Ma.Adapter; namespace Zennysoft.Ma.Adapter;
@@ -30,10 +31,14 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void SetSigil(ISigil sigil); public void SetSigil(ISigil sigil);
public void ShowCamera(bool showCamera);
public void ApplyNewAugment(IAugmentItem jewel, IAugmentableItem equipableItem); public void ApplyNewAugment(IAugmentItem jewel, IAugmentableItem equipableItem);
public IBaseInventoryItem IdentifyItem(IBaseInventoryItem unidentifiedItem); public IBaseInventoryItem IdentifyItem(IBaseInventoryItem unidentifiedItem);
public void ShakePlayerCamera(float shakeIntensity, float shakeAmount);
public IInventory Inventory { get; } public IInventory Inventory { get; }
public IHealthComponent HealthComponent { get; } public IHealthComponent HealthComponent { get; }
@@ -52,7 +57,7 @@ public interface IPlayer : IKillable, ICharacterBody3D
public IStatusEffectComponent StatusEffectComponent { get; } public IStatusEffectComponent StatusEffectComponent { get; }
public ISigilComponent SigilComponent { get; } public ISigilComponent SigilComponent { get; }
public void SetHealthTimerStatus(bool isActive); public void SetHealthTimerStatus(bool isActive);
@@ -60,6 +65,9 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void PlaySpellFX(SpellFXEnum spellEnum); public void PlaySpellFX(SpellFXEnum spellEnum);
public void SetPlayerWalkSFX(GroundType groundType);
public bool AutoRevive { get; set; } public bool AutoRevive { get; set; }
public int TotalAttack { get; } public int TotalAttack { get; }
@@ -74,6 +82,8 @@ public interface IPlayer : IKillable, ICharacterBody3D
public bool BriefImmunity { get; set; } public bool BriefImmunity { get; set; }
public bool CanOpenDoors { get; set; }
public event Action PlayerDied; public event Action PlayerDied;
public delegate IBaseInventoryItem RerollItem(IBaseInventoryItem item); 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; }
}
@@ -11,4 +11,4 @@ public partial record QuestData
[Save("quest_data_1")] [Save("quest_data_1")]
public bool QuestMarker1 { get; set; } = false; public bool QuestMarker1 { get; set; } = false;
} }
@@ -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] [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] [layer_names]
@@ -1,6 +1,7 @@
using Chickensoft.Collections; using Chickensoft.Collections;
using Godot; using Godot;
using System; using System;
using Zennysoft.Game.Abstractions.Audio;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
+133 -5
View File
@@ -1,9 +1,12 @@
using Chickensoft.AutoInject; using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces; using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Chickensoft.SaveFileBuilder;
using Chickensoft.Serialization;
using Godot; using Godot;
using NathanHoad; using NathanHoad;
using SimpleInjector.Lifestyles; using SimpleInjector.Lifestyles;
using System.IO;
using System.IO.Abstractions; using System.IO.Abstractions;
using System.Threading.Tasks; using System.Threading.Tasks;
using Zennysoft.Game.Abstractions; using Zennysoft.Game.Abstractions;
@@ -12,10 +15,13 @@ using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; 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))] [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); public override void _Notification(int what) => this.Notify(what);
@@ -33,22 +39,31 @@ public partial class App : Node, IApp
IAppRepo IProvide<IAppRepo>.Value() => AppRepo; IAppRepo IProvide<IAppRepo>.Value() => AppRepo;
IApp IProvide<IApp>.Value() => this;
public IAppRepo AppRepo { get; set; } = default!; public IAppRepo AppRepo { get; set; } = default!;
public IAppLogic AppLogic { get; set; } = default!; public IAppLogic AppLogic { get; set; } = default!;
public AppLogic.IBinding AppBinding { get; set; } = default!; public AppLogic.IBinding AppBinding { get; set; } = default!;
private Godot.Collections.Array _progress; private Godot.Collections.Array _progress;
private SimpleInjector.Container _container; private SimpleInjector.Container _container;
private IMaSaveFileManager _gallerySaveDataManager;
private EnemyViewer _dataViewer; private EnemyViewer _dataViewer;
private bool _loadingGame = false; private bool _loadingGame = false;
private bool _loadingEnemyViewer = false; private bool _loadingEnemyViewer = false;
private string _optionsSavePath = string.Empty; private string _optionsSavePath = string.Empty;
private string _controllerSavePath = string.Empty; private string _controllerSavePath = string.Empty;
private string _gallerySavePath = string.Empty;
private ISaveFileManager _saveFileManager; private ISaveFileManager _saveFileManager;
private IGame _game; private IGame _game;
private IEnemyViewer _enemyViewer; 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; private double _reportedProgress = 0;
public void Initialize() public void Initialize()
@@ -63,6 +78,64 @@ public partial class App : Node, IApp
_saveFileManager = _container.GetInstance<ISaveFileManager>(); _saveFileManager = _container.GetInstance<ISaveFileManager>();
_optionsSavePath = $"{OS.GetUserDataDir()}/options.json"; _optionsSavePath = $"{OS.GetUserDataDir()}/options.json";
_controllerSavePath = $"{OS.GetUserDataDir()}/controls.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.StartGame += OnStartGame;
MainMenu.EnemyViewer += OnEnemyViewer; MainMenu.EnemyViewer += OnEnemyViewer;
@@ -119,7 +192,7 @@ public partial class App : Node, IApp
MainMenu.OptionsButton.GrabFocus(); MainMenu.OptionsButton.GrabFocus();
} }
private void GalleryExited() private async void GalleryExited()
{ {
GalleryMenu.Hide(); GalleryMenu.Hide();
MainMenu.GalleryButton.GrabFocus(); MainMenu.GalleryButton.GrabFocus();
@@ -204,6 +277,7 @@ public partial class App : Node, IApp
_game.GameLoaded += OnGameLoaded; _game.GameLoaded += OnGameLoaded;
_game.GameExitRequested += GameExitRequested; _game.GameExitRequested += GameExitRequested;
CallDeferred(MethodName.AddChild, scene); CallDeferred(MethodName.AddChild, scene);
_game.UnlockGalleryItem += UnlockGalleryItem;
} }
private void OnGameLoaded() => LoadingScreen.HideLoadingScreen(); private void OnGameLoaded() => LoadingScreen.HideLoadingScreen();
@@ -216,6 +290,56 @@ public partial class App : Node, IApp
LoadingScreen.HideLoadingScreen(); 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) private async Task<Node> LoadSceneInternal(string sceneName)
{ {
LoadingScreen.ShowLoadingScreen(); LoadingScreen.ShowLoadingScreen();
@@ -239,7 +363,11 @@ public partial class App : Node, IApp
OptionsMenu.GameTab.GrabFocus(); 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()); public void OnQuit() => AppLogic.Input(new AppLogic.Input.QuitGame());
+10 -9
View File
@@ -8,21 +8,22 @@ namespace Zennysoft.Game.Ma;
public partial class BGMPlayer : DimmableAudioStreamPlayer public partial class BGMPlayer : DimmableAudioStreamPlayer
{ {
private static string _bgmPath = $"res://src/audio/bgm/"; private static readonly string _bgmPath = $"res://src/audio/bgm/";
private IDictionary<BackgroundMusic, AudioStream> _bgmDictionary; private Dictionary<BackgroundMusic, AudioStream> _bgmDictionary;
public override void _Ready() public override void _Ready()
{ {
_bgmDictionary = new Dictionary<BackgroundMusic, AudioStream>(); _bgmDictionary = [];
var backgroundMusic = Enum.GetValues(typeof(BackgroundMusic)); var backgroundMusic = Enum.GetValues(typeof(BackgroundMusic));
foreach (var bgm in backgroundMusic) foreach (var bgm in backgroundMusic)
_bgmDictionary.Add((BackgroundMusic)bgm, GD.Load<AudioStream>(_bgmPath + bgm + ".ogg")); _bgmDictionary.Add((BackgroundMusic)bgm, GD.Load<AudioStream>(_bgmPath + bgm + ".ogg"));
} }
public void Play(BackgroundMusic backgroundMusic) public void Play(BackgroundMusic backgroundMusic)
{ {
_bgmDictionary.TryGetValue(backgroundMusic, out var stream); FadeOut();
Stream = stream; _bgmDictionary.TryGetValue(backgroundMusic, out var stream);
FadeIn(); 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="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://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://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://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"] [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://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://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://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://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://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"] [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://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://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://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://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://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://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://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://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://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"] [node name="SfxDatabase" type="Node"]
script = ExtResource("1_ojkqd") script = ExtResource("1_ojkqd")
@@ -76,7 +89,7 @@ bus = &"SFX"
[node name="HealVTSound" type="AudioStreamPlayer" parent="Player"] [node name="HealVTSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true unique_name_in_owner = true
process_mode = 3 process_mode = 3
stream = ExtResource("3_kac56") stream = ExtResource("16_sew62")
bus = &"SFX" bus = &"SFX"
[node name="WeaponQuickSlashSound" type="AudioStreamPlayer" parent="Player"] [node name="WeaponQuickSlashSound" type="AudioStreamPlayer" parent="Player"]
@@ -109,10 +122,16 @@ process_mode = 3
stream = ExtResource("15_r16t0") stream = ExtResource("15_r16t0")
bus = &"SFX" 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"] [node name="LevelUpSound" type="AudioStreamPlayer" parent="Player"]
unique_name_in_owner = true unique_name_in_owner = true
process_mode = 3 process_mode = 3
stream = ExtResource("16_sew62") stream = ExtResource("14_bi4v5")
bus = &"SFX" bus = &"SFX"
[node name="EquipSound" type="AudioStreamPlayer" parent="Player"] [node name="EquipSound" type="AudioStreamPlayer" parent="Player"]
@@ -139,6 +158,60 @@ process_mode = 3
stream = ExtResource("18_bi4v5") stream = ExtResource("18_bi4v5")
bus = &"SFX" 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="Item" type="Node" parent="."]
[node name="TransferItemSound" type="AudioStreamPlayer" parent="Item"] [node name="TransferItemSound" type="AudioStreamPlayer" parent="Item"]
@@ -206,3 +279,21 @@ unique_name_in_owner = true
process_mode = 3 process_mode = 3
stream = ExtResource("24_jdwj3") stream = ExtResource("24_jdwj3")
bus = &"SFX" 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 Chickensoft.Introspection;
using Godot; using Godot;
using System.Collections.Generic; using System.Collections.Generic;
using Zennysoft.Game.Abstractions.Audio;
[Meta(typeof(IAutoNode)), Id("sfx_database")] [Meta(typeof(IAutoNode)), Id("sfx_database")]
public partial class SfxDatabase : Node public partial class SfxDatabase : Node
@@ -27,12 +28,14 @@ public partial class SfxDatabase : Node
{SoundEffect.DecreaseStat, DecreaseStatSound }, {SoundEffect.DecreaseStat, DecreaseStatSound },
{SoundEffect.Crit, CritSound }, {SoundEffect.Crit, CritSound },
{SoundEffect.PickupItem, PickupItemSound }, {SoundEffect.PickupItem, PickupItemSound },
{SoundEffect.PickupFailure, PickupFailureSound },
{SoundEffect.OpenInventory, OpenInventorySound }, {SoundEffect.OpenInventory, OpenInventorySound },
{SoundEffect.MoveUI, MoveSound }, {SoundEffect.MoveUI, MoveSound },
{SoundEffect.Equip, EquipSound }, {SoundEffect.Equip, EquipSound },
{SoundEffect.Unequip, UnequipSound }, {SoundEffect.Unequip, UnequipSound },
{SoundEffect.Buff, BuffSound }, {SoundEffect.Buff, BuffSound },
{SoundEffect.Debuff, DebuffSound }, {SoundEffect.Debuff, DebuffSound },
{SoundEffect.Death, DeathSound },
{SoundEffect.SortInventory, SortSound }, {SoundEffect.SortInventory, SortSound },
{SoundEffect.SelectUI, SelectSound }, {SoundEffect.SelectUI, SelectSound },
{SoundEffect.CancelUI, CancelSound }, {SoundEffect.CancelUI, CancelSound },
@@ -44,9 +47,17 @@ public partial class SfxDatabase : Node
{SoundEffect.TeleportToExit, TeleportToExitSound}, {SoundEffect.TeleportToExit, TeleportToExitSound},
{SoundEffect.AbsorbHPFromAllEnemies, AbsorbHPFromAllEnemiesSound}, {SoundEffect.AbsorbHPFromAllEnemies, AbsorbHPFromAllEnemiesSound},
{SoundEffect.TurnAllEnemiesIntoHealingItems, TurnAllEnemiesIntoHealingItemsSound}, {SoundEffect.TurnAllEnemiesIntoHealingItems, TurnAllEnemiesIntoHealingItemsSound},
{SoundEffect.WeaponQuickSlash, WeaponQuickSlashSound }, {SoundEffect.Glue, GlueSound },
{SoundEffect.WeaponSlowSlash, WeaponSlowSlashSound }, {SoundEffect.Identify, IdentifySound},
{SoundEffect.WeaponPlasmaSword, WeaponPlasmaSword }, {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 TakeDamageSound { get; set; } = default!;
[Node] private AudioStreamPlayer HealVTSound { get; set; } = default!; [Node] private AudioStreamPlayer HealVTSound { get; set; } = default!;
[Node] private AudioStreamPlayer IncreaseStatSound { get; set; } = default!; [Node] private AudioStreamPlayer IncreaseStatSound { get; set; } = default!;
[Node] private AudioStreamPlayer DecreaseStatSound { get; set; } = default!; [Node] private AudioStreamPlayer DecreaseStatSound { get; set; } = default!;
[Node] private AudioStreamPlayer WeaponQuickSlashSound { get; set; } = default!; [Node] private AudioStreamPlayer WeaponQuickSlashSound { get; set; } = default!;
[Node] private AudioStreamPlayer WeaponSlowSlashSound { 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 CritSound { get; set; } = default!;
[Node] private AudioStreamPlayer PickupItemSound { 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 OpenInventorySound { get; set; }
[Node] private AudioStreamPlayer MoveSound { get; set; } [Node] private AudioStreamPlayer MoveSound { get; set; }
[Node] private AudioStreamPlayer EquipSound { get; set; } [Node] private AudioStreamPlayer EquipSound { get; set; }
[Node] private AudioStreamPlayer UnequipSound { get; set; } [Node] private AudioStreamPlayer UnequipSound { get; set; }
[Node] private AudioStreamPlayer BuffSound { get; set; } [Node] private AudioStreamPlayer BuffSound { get; set; }
[Node] private AudioStreamPlayer DebuffSound { get; set; } [Node] private AudioStreamPlayer DebuffSound { get; set; }
[Node] private AudioStreamPlayer DeathSound { get; set; }
[Node] private AudioStreamPlayer SortSound { get; set; } [Node] private AudioStreamPlayer SortSound { get; set; }
[Node] private AudioStreamPlayer SelectSound { get; set; } [Node] private AudioStreamPlayer SelectSound { get; set; }
[Node] private AudioStreamPlayer CancelSound { 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 AbsorbHPFromAllEnemiesSound { get; set; }
[Node] private AudioStreamPlayer SwapHPAndVTSound { get; set; } [Node] private AudioStreamPlayer SwapHPAndVTSound { get; set; }
[Node] private AudioStreamPlayer TurnAllEnemiesIntoHealingItemsSound { 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; 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" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://7esvkguxl3cb" 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] [deps]
source_file="res://src/audio/amb/AMB_BAD_END_EARTHQUAKE.ogg" source_file="res://src/audio/AMB/AMB_BAD_END_EARTHQUAKE.ogg"
dest_files=["res://.godot/imported/AMB_BAD_END_EARTHQUAKE.ogg-e9eab5a667607eac71d31fddf6267597.oggvorbisstr"] dest_files=["res://.godot/imported/AMB_BAD_END_EARTHQUAKE.ogg-03e817303decd8b8e41745609f87f10c.oggvorbisstr"]
[params] [params]
loop=false loop=true
loop_offset=0 loop_offset=0.0
bpm=0 bpm=0.0
beat_count=0 beat_count=0
bar_beats=4 bar_beats=4
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://b5vhghigr263m" uid="uid://b5vhghigr263m"
path="res://.godot/imported/amb_ATMOSTPHERE.ogg-d626a91a96dc0c9dd858ae437ed3ce9d.oggvorbisstr" path="res://.godot/imported/amb_ATMOSTPHERE.ogg-45d9a9c09d45b233375d8c723e42c852.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_ATMOSTPHERE.ogg" source_file="res://src/audio/AMB/amb_ATMOSTPHERE.ogg"
dest_files=["res://.godot/imported/amb_ATMOSTPHERE.ogg-d626a91a96dc0c9dd858ae437ed3ce9d.oggvorbisstr"] dest_files=["res://.godot/imported/amb_ATMOSTPHERE.ogg-45d9a9c09d45b233375d8c723e42c852.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://dun1mdjlmv2iy" uid="uid://dun1mdjlmv2iy"
path="res://.godot/imported/amb_CRICKETS.ogg-a3e94c03a4a4855112cb9771eb5d7995.oggvorbisstr" path="res://.godot/imported/amb_CRICKETS.ogg-ee8db802e6163ca5c5e3101e3337d9d3.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_CRICKETS.ogg" source_file="res://src/audio/AMB/amb_CRICKETS.ogg"
dest_files=["res://.godot/imported/amb_CRICKETS.ogg-a3e94c03a4a4855112cb9771eb5d7995.oggvorbisstr"] dest_files=["res://.godot/imported/amb_CRICKETS.ogg-ee8db802e6163ca5c5e3101e3337d9d3.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://cstt5t4tspgll" uid="uid://cstt5t4tspgll"
path="res://.godot/imported/amb_RIVER.ogg-76238514419f87d38ee6d9dc2c51ca64.oggvorbisstr" path="res://.godot/imported/amb_RIVER.ogg-a5ed08fd6d161ef0a5f38f804143c9f8.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_RIVER.ogg" source_file="res://src/audio/AMB/amb_RIVER.ogg"
dest_files=["res://.godot/imported/amb_RIVER.ogg-76238514419f87d38ee6d9dc2c51ca64.oggvorbisstr"] dest_files=["res://.godot/imported/amb_RIVER.ogg-a5ed08fd6d161ef0a5f38f804143c9f8.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://db0e4p4b11tyf" uid="uid://db0e4p4b11tyf"
path="res://.godot/imported/amb_beach.ogg-224ac40038a27ecc37bbaeb6ba133451.oggvorbisstr" path="res://.godot/imported/amb_beach.ogg-8f340d18fd5888c59c80580ed33b86be.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_beach.ogg" source_file="res://src/audio/AMB/amb_beach.ogg"
dest_files=["res://.godot/imported/amb_beach.ogg-224ac40038a27ecc37bbaeb6ba133451.oggvorbisstr"] dest_files=["res://.godot/imported/amb_beach.ogg-8f340d18fd5888c59c80580ed33b86be.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://btkbelic75ecn" uid="uid://btkbelic75ecn"
path="res://.godot/imported/amb_cellular.ogg-10f77202fdba4396453746a6dff1163f.oggvorbisstr" path="res://.godot/imported/amb_cellular.ogg-58bcb88de2f576fd0d8bea7152aba8e8.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_cellular.ogg" source_file="res://src/audio/AMB/amb_cellular.ogg"
dest_files=["res://.godot/imported/amb_cellular.ogg-10f77202fdba4396453746a6dff1163f.oggvorbisstr"] dest_files=["res://.godot/imported/amb_cellular.ogg-58bcb88de2f576fd0d8bea7152aba8e8.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://b306wov6yfaan" uid="uid://b306wov6yfaan"
path="res://.godot/imported/amb_flame_burning.ogg-a2d4a15c4e42af6cc417263c48ceac99.oggvorbisstr" path="res://.godot/imported/amb_flame_burning.ogg-9ffba7ace9b30cdc0b929e1ee4bc8717.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_flame_burning.ogg" source_file="res://src/audio/AMB/amb_flame_burning.ogg"
dest_files=["res://.godot/imported/amb_flame_burning.ogg-a2d4a15c4e42af6cc417263c48ceac99.oggvorbisstr"] dest_files=["res://.godot/imported/amb_flame_burning.ogg-9ffba7ace9b30cdc0b929e1ee4bc8717.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://cgk17d8erskht" uid="uid://cgk17d8erskht"
path="res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr" path="res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_ocean.ogg" source_file="res://src/audio/AMB/amb_ocean.ogg"
dest_files=["res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr"] dest_files=["res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://60hn13ryqn88" uid="uid://60hn13ryqn88"
path="res://.godot/imported/amb_perlin.ogg-64b80cc5587fac618d4038cf1d8fac57.oggvorbisstr" path="res://.godot/imported/amb_perlin.ogg-369d474f40ce79fe9f5b6c639a907e11.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_perlin.ogg" source_file="res://src/audio/AMB/amb_perlin.ogg"
dest_files=["res://.godot/imported/amb_perlin.ogg-64b80cc5587fac618d4038cf1d8fac57.oggvorbisstr"] dest_files=["res://.godot/imported/amb_perlin.ogg-369d474f40ce79fe9f5b6c639a907e11.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://bxrlehky1833a" 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] [deps]
source_file="res://src/audio/amb/amb_pipe_loop_brokenloop.ogg" source_file="res://src/audio/AMB/amb_pipe_loop_brokenloop.ogg"
dest_files=["res://.godot/imported/amb_pipe_loop_brokenloop.ogg-002366fec6a5ad3285732ef207958668.oggvorbisstr"] dest_files=["res://.godot/imported/amb_pipe_loop_brokenloop.ogg-01835f0cb823262b3486e1d51b3fabed.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://cdweiwl17xnn6" uid="uid://cdweiwl17xnn6"
path="res://.godot/imported/amb_water_lapping1.ogg-d0e545dbc1fa1d1d2f7f7ffee566dbd2.oggvorbisstr" path="res://.godot/imported/amb_water_lapping1.ogg-b2ad73abfaf60b4ac41451d7cf3abd27.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_water_lapping1.ogg" source_file="res://src/audio/AMB/amb_water_lapping1.ogg"
dest_files=["res://.godot/imported/amb_water_lapping1.ogg-d0e545dbc1fa1d1d2f7f7ffee566dbd2.oggvorbisstr"] dest_files=["res://.godot/imported/amb_water_lapping1.ogg-b2ad73abfaf60b4ac41451d7cf3abd27.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://d3uj87dsngy22" uid="uid://d3uj87dsngy22"
path="res://.godot/imported/amb_water_lapping2.ogg-48391199b506ee32adf8ac3cf8800f8d.oggvorbisstr" path="res://.godot/imported/amb_water_lapping2.ogg-2e0e4c928ee7675858fe0c117f293287.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_water_lapping2.ogg" source_file="res://src/audio/AMB/amb_water_lapping2.ogg"
dest_files=["res://.godot/imported/amb_water_lapping2.ogg-48391199b506ee32adf8ac3cf8800f8d.oggvorbisstr"] dest_files=["res://.godot/imported/amb_water_lapping2.ogg-2e0e4c928ee7675858fe0c117f293287.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://b7g0tnn43an8" uid="uid://b7g0tnn43an8"
path="res://.godot/imported/amb_white_noise.ogg-245b3fec83d54c77ba8886688002bdc1.oggvorbisstr" path="res://.godot/imported/amb_white_noise.ogg-9d7d55b3e4f0f6e201e09e41d6f75ee0.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_white_noise.ogg" source_file="res://src/audio/AMB/amb_white_noise.ogg"
dest_files=["res://.godot/imported/amb_white_noise.ogg-245b3fec83d54c77ba8886688002bdc1.oggvorbisstr"] dest_files=["res://.godot/imported/amb_white_noise.ogg-9d7d55b3e4f0f6e201e09e41d6f75ee0.oggvorbisstr"]
[params] [params]
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://2veneecq76n7" 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] [deps]
source_file="res://src/audio/amb/amb_wind_loop_altar.ogg" source_file="res://src/audio/AMB/amb_wind_loop_altar.ogg"
dest_files=["res://.godot/imported/amb_wind_loop_altar.ogg-c7176da6dd27414689e07f2c34c08519.oggvorbisstr"] dest_files=["res://.godot/imported/amb_wind_loop_altar.ogg-91bb4566a15451ea55b40bb8105195b0.oggvorbisstr"]
[params] [params]
Binary file not shown.
@@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/iTEM_identify_ALL.ogg-41b5f26b3ea1b630ca215a5
[params] [params]
loop=false loop=false
loop_offset=0 loop_offset=0.0
bpm=0 bpm=0.0
beat_count=0 beat_count=0
bar_beats=4 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
+11 -11
View File
@@ -8,7 +8,7 @@ public partial class ShakeCamera : Camera3D
{ {
public override void _Notification(int what) => this.Notify(what); 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 _maxX = 10;
[Export] private double _maxY = 10; [Export] private double _maxY = 10;
@@ -24,28 +24,28 @@ public partial class ShakeCamera : Camera3D
public override void _Ready() public override void _Ready()
{ {
_initialRotation = RotationDegrees; _initialRotation = RotationDegrees;
} }
public override void _Process(double delta) public override void _Process(double delta)
{ {
_time += delta; _time += delta;
_shake = Mathf.Max(_shake - delta * _shakeIntensity, 0.0); _shake = Mathf.Max(_shake - delta * _shakeIntensity, 0.0);
RotationDegrees = new Vector3( RotationDegrees = new Vector3(
(float)(_initialRotation.X + _maxX * Mathf.Pow(_shake, 2) * GetNoiseFromSeed(0)), (float)(_initialRotation.X + _maxX * Mathf.Pow(_shake, 2) * GetNoiseFromSeed(0)),
(float)(_initialRotation.Y + _maxY * Mathf.Pow(_shake, 2) * GetNoiseFromSeed(1)), (float)(_initialRotation.Y + _maxY * Mathf.Pow(_shake, 2) * GetNoiseFromSeed(1)),
(float)(_initialRotation.Z + _maxZ * Mathf.Pow(_shake, 2) * GetNoiseFromSeed(2))); (float)(_initialRotation.Z + _maxZ * Mathf.Pow(_shake, 2) * GetNoiseFromSeed(2)));
} }
public void AddShake(float shakeAmount) public void AddShake(float shakeAmount)
{ {
_shake = Mathf.Clamp(_shake + shakeAmount, 0.0, 1.0); _shake = Mathf.Clamp(_shake + shakeAmount, 0.0, 1.0);
} }
private double GetNoiseFromSeed(int seed) private double GetNoiseFromSeed(int seed)
{ {
_noise.Seed = seed; _noise.Seed = seed;
return _noise.GetNoise1D((float)(_time * _noiseSpeed)); return _noise.GetNoise1D((float)(_time * _noiseSpeed));
} }
} }
+48 -4
View File
@@ -4,6 +4,7 @@ using Godot;
using System; using System;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using Zennysoft.Game.Abstractions.Audio;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity; 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 IPlayer _player => this.DependOn(() => GetParent().GetChildren().OfType<IPlayer>().Single());
[Dependency] protected IGameRepo _gameRepo => this.DependOn<IGameRepo>(); [Dependency] protected IGameRepo _gameRepo => this.DependOn<IGameRepo>();
[Dependency] public IGame _game => this.DependOn<IGame>();
#endregion #endregion
public IHealthComponent HealthComponent { get; private set; } 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 virtual IEnemyModelView EnemyModelView { get; set; } = default!;
public IEnemyLootTable LootTable => _lootTable;
[Export] public EnemyLootTable _lootTable { get; set; }
public Vector3 TargetPosition { get; private set; } public Vector3 TargetPosition { get; private set; }
[ExportGroup("Enemy Stats")] [ExportGroup("Enemy Stats")]
@@ -174,20 +181,24 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
EnemyModelView.PlayElementalDamageAnimation(damageElementType); EnemyModelView.PlayElementalDamageAnimation(damageElementType);
_enemyLogic.Input(new EnemyLogic.Input.Alert()); _enemyLogic.Input(new EnemyLogic.Input.Alert());
EnemyModelView.PlayHitAnimation(); EnemyModelView.PlayHitAnimation();
_hitSFX.Play(); if (damageElementType == ElementType.None || damageElementType == ElementType.Ferrum)
_hitSFX.Play();
} }
public virtual void Die() public virtual async void Die()
{ {
SetPhysicsProcess(false); SetPhysicsProcess(false);
_rustDuration.Stop(); _rustDuration.Stop();
_rustTimer.Stop(); _rustTimer.Stop();
_enemyLogic.Input(new EnemyLogic.Input.Defeated()); _enemyLogic.Input(new EnemyLogic.Input.Defeated());
_player.ExperiencePointsComponent.Gain(ExpGiven); _player.ExperiencePointsComponent.Gain(ExpGiven);
EnemyModelView.PlayDeathAnimation(); EnemyModelView.PlayHitAnimation();
_hitSFX.Play(); _hitSFX.Play();
await ToSignal(GetTree().CreateTimer(0.1f), "timeout");
EnemyModelView.PlayDeathAnimation();
_dieSFX.Play(); _dieSFX.Play();
_gameRepo.OnEnemyDied(this); _gameRepo.OnEnemyDied(this);
await _game.IncrementEnemyDefeatedCount(EnemyModelView.EnemyLoreInfo.Name);
var tweener = CreateTween(); var tweener = CreateTween();
tweener.TweenInterval(1.0f); tweener.TweenInterval(1.0f);
tweener.TweenCallback(Callable.From(QueueFree)); tweener.TweenCallback(Callable.From(QueueFree));
@@ -209,6 +220,23 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
tweener.TweenCallback(Callable.From(QueueFree)); 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) public IDungeonRoom GetCurrentRoom(ImmutableList<IDungeonRoom> roomList)
{ {
foreach (var room in roomList) foreach (var room in roomList)
@@ -229,6 +257,16 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
EnemyModelView.HitPlayer -= EnemyModelView_HitPlayer; 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) public virtual void MoveEnemyToNewRoom(IDungeonRoom newRoom)
{ {
if (newRoom is MonsterRoom monsterRoom) if (newRoom is MonsterRoom monsterRoom)
@@ -273,6 +311,7 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
{ {
_rustTimer.Start(); _rustTimer.Start();
_rustDuration.Start(); _rustDuration.Start();
EnemyModelView.PlayRustActivateAnimation();
} }
else else
{ {
@@ -283,11 +322,16 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
private void _rustTimer_Timeout() private void _rustTimer_Timeout()
{ {
HealthComponent.Damage(3, ElementType.Ferrum); HealthComponent.Damage(3, ElementType.Ferrum);
TakeHit(ElementType.Ferrum); EnemyModelView.PlayRustDamageAnimation();
} }
private void _rustDuration_Timeout() private void _rustDuration_Timeout()
{ {
StatusEffectComponent.Rust.OnNext(false); StatusEffectComponent.Rust.OnNext(false);
} }
public int GetDefeatCount(IEnemy enemyType)
{
return 0;
}
} }
+6 -3
View File
@@ -56,9 +56,12 @@ public abstract partial class Enemy2D : Enemy
protected void OnVelocityComputed(Vector3 safeVelocity) protected void OnVelocityComputed(Vector3 safeVelocity)
{ {
Velocity = new Vector3(safeVelocity.X, 0, safeVelocity.Z); if (_enemyModelView.CanMove)
LookAtTarget(safeVelocity); {
MoveAndSlide(); Velocity = new Vector3(safeVelocity.X, 0, safeVelocity.Z);
LookAtTarget(safeVelocity);
MoveAndSlide();
}
} }
protected void EngagePlayerBehavior_TakeAction() 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 Godot;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -25,9 +26,20 @@ public partial class EnemyLoreInfo : Resource
public string Weakness { get; set; } public string Weakness { get; set; }
[Export] [Export]
public string Drop1 { get; set; } public string PrimaryAttackName { get; set; }
[Export] [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 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 virtual void OnPlayerHit(AttackEventArgs arg) => HitPlayer?.Invoke(this, arg);
protected void AnimationTree_AnimationFinished(StringName animName) protected void AnimationTree_AnimationFinished(StringName animName)
+143 -101
View File
@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq; using System.Linq;
using Zennysoft.Game.Abstractions.Audio;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -26,6 +27,7 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
[Node] public AnimationPlayer WaterHitAnimation { get; set; } = default!; [Node] public AnimationPlayer WaterHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer CurseHitAnimation { get; set; } = default!; [Node] public AnimationPlayer CurseHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer EarthHitAnimation { get; set; } = default!; [Node] public AnimationPlayer EarthHitAnimation { get; set; } = default!;
[Node] public Node2D VFXSprites { get; set; } = default!;
[ExportGroup("Enemy Model Properties")] [ExportGroup("Enemy Model Properties")]
[Export(PropertyHint.Range, "0.0, 1.0")] [Export(PropertyHint.Range, "0.0, 1.0")]
@@ -37,14 +39,14 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
public new void OnReady() public new void OnReady()
{ {
Hitbox.AreaEntered += Hitbox_AreaEntered; Hitbox.AreaEntered += Hitbox_AreaEntered;
base.OnReady(); base.OnReady();
} }
public override Vector2 GetSize() public override Vector2 GetSize()
{ {
return Sprite3D.GetItemRect().Size; return Sprite3D.GetItemRect().Size;
} }
private void Hitbox_AreaEntered(Area3D area) => OnPlayerHit(new AttackEventArgs(AttackData)); private void Hitbox_AreaEntered(Area3D area) => OnPlayerHit(new AttackEventArgs(AttackData));
@@ -53,144 +55,184 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
public override void PlayHitAnimation() public override void PlayHitAnimation()
{ {
LoadShader("res://src/vfx/shaders/DamageHit.gdshader"); LoadShader("res://src/vfx/shaders/DamageHit.gdshader");
var tweener = GetTree().CreateTween(); var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f); tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
} }
public override void PlayDeathAnimation() public override void PlayDeathAnimation()
{ {
AnimationPlayer.Stop(); _stateMachine.Stop();
LoadShader("res://src/vfx/shaders/PixelMelt.gdshader"); AnimationPlayer.Stop();
var tweener = GetTree().CreateTween(); VFXSprites.Hide();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f); 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) public override void PlayElementalDamageAnimation(ElementType elementType)
{ {
if (elementType == ElementType.Igneous) if (elementType == ElementType.Igneous)
{ {
if (FlameHitAnimation.IsPlaying()) if (FlameHitAnimation.IsPlaying())
FlameHitAnimation.Stop(); FlameHitAnimation.Stop();
FlameHitAnimation.Play("FireHit"); FlameHitAnimation.Play("FireHit");
} SfxDatabase.Instance.Play(SoundEffect.FireDamage);
else if (elementType == ElementType.Holy) }
{ else if (elementType == ElementType.Sankta)
if (HolyHitAnimation.IsPlaying()) {
HolyHitAnimation.Stop(); if (HolyHitAnimation.IsPlaying())
HolyHitAnimation.Play("HolyHit"); HolyHitAnimation.Stop();
} HolyHitAnimation.Play("HolyHit");
else if (elementType == ElementType.Aeolic) SfxDatabase.Instance.Play(SoundEffect.HolyDamage);
{ }
if (WindHitAnimation.IsPlaying()) else if (elementType == ElementType.Aeolic)
WindHitAnimation.Stop(); {
WindHitAnimation.Play("WindHit"); if (WindHitAnimation.IsPlaying())
} WindHitAnimation.Stop();
else if (elementType == ElementType.Curse) WindHitAnimation.Play("WindHit");
{ SfxDatabase.Instance.Play(SoundEffect.AirDamage);
if (CurseHitAnimation.IsPlaying()) }
CurseHitAnimation.Stop(); else if (elementType == ElementType.Shura)
CurseHitAnimation.Play("CurseHit"); {
} if (CurseHitAnimation.IsPlaying())
else if (elementType == ElementType.Hydric) CurseHitAnimation.Stop();
{ CurseHitAnimation.Play("CurseHit");
if (WaterHitAnimation.IsPlaying()) SfxDatabase.Instance.Play(SoundEffect.CurseDamage);
WaterHitAnimation.Stop(); }
WaterHitAnimation.Play("WaterHit"); else if (elementType == ElementType.Hydric)
} {
else if (elementType == ElementType.Telluric) if (WaterHitAnimation.IsPlaying())
{ WaterHitAnimation.Stop();
if (EarthHitAnimation.IsPlaying()) WaterHitAnimation.Play("WaterHit");
EarthHitAnimation.Stop(); SfxDatabase.Instance.Play(SoundEffect.WaterDamage);
EarthHitAnimation.Play("EarthHit"); }
} else if (elementType == ElementType.Telluric)
{
if (EarthHitAnimation.IsPlaying())
EarthHitAnimation.Stop();
EarthHitAnimation.Play("EarthHit");
SfxDatabase.Instance.Play(SoundEffect.EarthDamage);
}
} }
private EnemyDirection GetEnemyDirection( private EnemyDirection GetEnemyDirection(
Basis enemyBasis, Basis enemyBasis,
Vector3 cameraDirection, Vector3 cameraDirection,
float rotateUpperThreshold, float rotateUpperThreshold,
float rotateLowerThreshold) float rotateLowerThreshold)
{ {
var enemyForwardDirection = enemyBasis.Z; var enemyForwardDirection = enemyBasis.Z;
var enemyLeftDirection = enemyBasis.X; var enemyLeftDirection = enemyBasis.X;
var leftDotProduct = enemyLeftDirection.Dot(cameraDirection); var leftDotProduct = enemyLeftDirection.Dot(cameraDirection);
var forwardDotProduct = enemyForwardDirection.Dot(cameraDirection); var forwardDotProduct = enemyForwardDirection.Dot(cameraDirection);
// Check if forward facing. If the dot product is -1, the enemy is facing the camera. // Check if forward facing. If the dot product is -1, the enemy is facing the camera.
if (forwardDotProduct < _lowerThreshold) if (forwardDotProduct < _lowerThreshold)
{ {
SetForward(); SetForward();
return EnemyDirection.Forward; return EnemyDirection.Forward;
} }
// Check if backward facing. If the dot product is 1, the enemy is facing the same direction as the camera. // Check if backward facing. If the dot product is 1, the enemy is facing the same direction as the camera.
else if (forwardDotProduct > rotateUpperThreshold) else if (forwardDotProduct > rotateUpperThreshold)
{ {
SetBack(); SetBack();
return EnemyDirection.Backward; return EnemyDirection.Backward;
} }
else else
{ {
// If the dot product of the perpendicular direction is positive (up to 1), the enemy is facing to the left (since it's mirrored). // If the dot product of the perpendicular direction is positive (up to 1), the enemy is facing to the left (since it's mirrored).
if (leftDotProduct < _lowerThreshold) if (leftDotProduct < _lowerThreshold)
{ {
SetRight(); SetRight();
return EnemyDirection.Left; return EnemyDirection.Left;
} }
// Check if side facing. If the dot product is close to zero in the positive or negative direction, its close to the threshold for turning. // Check if side facing. If the dot product is close to zero in the positive or negative direction, its close to the threshold for turning.
if (leftDotProduct > rotateUpperThreshold) if (leftDotProduct > rotateUpperThreshold)
{ {
SetLeft(); SetLeft();
return EnemyDirection.Right; return EnemyDirection.Right;
} }
} }
return _enemyDirection; return _enemyDirection;
} }
private void LoadShader(string shaderPath) private void LoadShader(string shaderPath)
{ {
var shader = GD.Load<Shader>(shaderPath); var shader = GD.Load<Shader>(shaderPath);
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>(); var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites) foreach (var sprite in sprites)
{ {
sprite.Material = new ShaderMaterial(); sprite.Material = new ShaderMaterial();
var shaderMaterial = (ShaderMaterial)sprite.Material; var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.Shader = shader; shaderMaterial.Shader = shader;
} }
} }
private void SetShaderValue(float shaderValue) private void SetShaderValue(float shaderValue)
{ {
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>(); var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites) foreach (var sprite in sprites)
{ {
var shaderMaterial = (ShaderMaterial)sprite.Material; var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.SetShaderParameter("progress", shaderValue); shaderMaterial.SetShaderParameter("progress", shaderValue);
} }
} }
private void SetForward() private void SetForward()
{ {
_enemyDirection = EnemyDirection.Forward; _enemyDirection = EnemyDirection.Forward;
} }
private void SetLeft() private void SetLeft()
{ {
_enemyDirection = EnemyDirection.Left; _enemyDirection = EnemyDirection.Left;
} }
private void SetRight() private void SetRight()
{ {
_enemyDirection = EnemyDirection.Right; _enemyDirection = EnemyDirection.Right;
} }
private void SetBack() private void SetBack()
{ {
_enemyDirection = EnemyDirection.Backward; _enemyDirection = EnemyDirection.Backward;
} }
} }
+1 -1
View File
@@ -7,7 +7,7 @@ public enum EnemyType
FilthEater, FilthEater,
Sara, Sara,
Ballos, Ballos,
Chariot, Planter,
Chinthe, Chinthe,
AmbassadorGreen, AmbassadorGreen,
AmbassadorRed, AmbassadorRed,
@@ -23,8 +23,8 @@ public static class EnemyTypeToEnemyConverter
return InstantiateFromPath(@$"{_folderPath}/04. sara/Sara.tscn"); return InstantiateFromPath(@$"{_folderPath}/04. sara/Sara.tscn");
case EnemyType.Ballos: case EnemyType.Ballos:
return InstantiateFromPath(@$"{_folderPath}/05. ballos/Ballos.tscn"); return InstantiateFromPath(@$"{_folderPath}/05. ballos/Ballos.tscn");
case EnemyType.Chariot: case EnemyType.Planter:
return InstantiateFromPath(@$"{_folderPath}/06. chariot/Chariot.tscn"); return InstantiateFromPath(@$"{_folderPath}/06. Planter/Planter.tscn");
case EnemyType.Chinthe: case EnemyType.Chinthe:
return InstantiateFromPath(@$"{_folderPath}/07. chinthe/Chinthe.tscn"); return InstantiateFromPath(@$"{_folderPath}/07. chinthe/Chinthe.tscn");
case EnemyType.AmbassadorGreen: case EnemyType.AmbassadorGreen:
@@ -62,8 +62,8 @@ public static class EnemyTypeToEnemyConverter
return EnemyType.Sara; return EnemyType.Sara;
if (enemy is Ballos) if (enemy is Ballos)
return EnemyType.Ballos; return EnemyType.Ballos;
if (enemy is Chariot) if (enemy is Planter)
return EnemyType.Chariot; return EnemyType.Planter;
if (enemy is Chinthe) if (enemy is Chinthe)
return EnemyType.Chinthe; return EnemyType.Chinthe;
if (enemy is Ambassador ambassador) if (enemy is Ambassador ambassador)
@@ -27,6 +27,16 @@ public interface IEnemyModelView : INode3D
public void PlayDeathAnimation(); public void PlayDeathAnimation();
public void PlayBuffAnimation();
public void PlayDebuffAnimation();
public void PlayHealAnimation();
public void PlayRustActivateAnimation();
public void PlayRustDamageAnimation();
public void PlayElementalDamageAnimation(ElementType elementType); public void PlayElementalDamageAnimation(ElementType elementType);
public double ViewerSize { get; } public double ViewerSize { get; }
@@ -23,7 +23,7 @@ public partial class EngagePlayerBehavior : Node, IEngagePlayerBehavior
{ {
_actionTimer = new Timer(); _actionTimer = new Timer();
_acquireTargetTimer = new Timer() { WaitTime = _acquireTargetTime }; _acquireTargetTimer = new Timer() { WaitTime = _acquireTargetTime };
_actionTimer.WaitTime = 0.8f; _actionTimer.WaitTime = 0.3f;
_actionTimer.Timeout += OnAttackTimeout; _actionTimer.Timeout += OnAttackTimeout;
_acquireTargetTimer.Timeout += OnAcquireTargetTimeout; _acquireTargetTimer.Timeout += OnAcquireTargetTimeout;
AddChild(_actionTimer); AddChild(_actionTimer);
@@ -39,6 +39,7 @@ public partial class EngagePlayerBehavior : Node, IEngagePlayerBehavior
public void Disengage() public void Disengage()
{ {
_actionTimer.Stop(); _actionTimer.Stop();
_actionTimer.WaitTime = 0.3f;
_acquireTargetTimer.Stop(); _acquireTargetTimer.Stop();
} }
@@ -11,7 +11,7 @@ public partial class FleeBehavior : Node3D, IBehavior
{ {
public override void _Notification(int what) => this.Notify(what); 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; [Export] private double _thinkTime { get; set; } = 2f;
@@ -35,7 +35,7 @@ public partial class FleeBehavior : Node3D, IBehavior
public void StartFlee(NavigationAgent3D navigationAgent) public void StartFlee(NavigationAgent3D navigationAgent)
{ {
var currentRoom = _map.GetPlayersCurrentRoom(); var currentRoom = _map.CurrentFloor.GetPlayersCurrentRoom();
var rooms = _game.CurrentFloor.Rooms; var rooms = _game.CurrentFloor.Rooms;
var validRooms = new Godot.Collections.Array<MonsterRoom>(rooms.OfType<MonsterRoom>()); var validRooms = new Godot.Collections.Array<MonsterRoom>(rooms.OfType<MonsterRoom>());
var randomRoom = validRooms.PickRandom(); var randomRoom = validRooms.PickRandom();
@@ -46,13 +46,14 @@ public partial class FleeBehavior : Node3D, IBehavior
public void StopFlee() public void StopFlee()
{ {
SetPhysicsProcess(false); SetPhysicsProcess(false);
_navigationAgent.Velocity = Vector3.Zero;
} }
public void OnPhysicsProcess(double delta) public void OnPhysicsProcess(double delta)
{ {
var nextVelocity = _navigationAgent.GetNextPathPosition(); var nextVelocity = _navigationAgent.GetNextPathPosition();
var parent = GetParent() as Node3D; var parent = GetParent() as Node3D;
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_fleeSpeed * (float)delta; var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)FleeSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity); _navigationAgent.Velocity = velocity;
} }
} }
@@ -12,7 +12,7 @@ public partial class FollowBehavior : Node3D, IBehavior
{ {
public override void _Notification(int what) => this.Notify(what); 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; [Export] private double _thinkTime { get; set; } = 2f;
@@ -27,9 +27,15 @@ public partial class FollowBehavior : Node3D, IBehavior
public void Init(NavigationAgent3D navigationAgent) public void Init(NavigationAgent3D navigationAgent)
{ {
_navigationAgent = 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 = new Timer() { WaitTime = _thinkTime };
_thinkTimer.Timeout += OnTimeout; _thinkTimer.Timeout += OnTimeout;
@@ -50,19 +56,21 @@ public partial class FollowBehavior : Node3D, IBehavior
{ {
SetPhysicsProcess(false); SetPhysicsProcess(false);
_thinkTimer.Stop(); _thinkTimer.Stop();
_navigationAgent.Velocity = Vector3.Zero;
} }
public void OnPhysicsProcess(double delta) public void OnPhysicsProcess(double delta)
{ {
var nextVelocity = _navigationAgent.GetNextPathPosition(); var nextVelocity = _navigationAgent.GetNextPathPosition();
var parent = GetParent() as Node3D; var parent = GetParent() as Node3D;
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_followSpeed * (float)delta; var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)FollowSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity); _navigationAgent.Velocity = velocity;
} }
public void OnExitTree() public void OnExitTree()
{ {
_thinkTimer.Stop(); _thinkTimer.Stop();
_thinkTimer.Timeout -= OnTimeout; _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); 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; [Export] private double _thinkTime { get; set; } = 0.8f;
@@ -49,6 +49,12 @@ public partial class PatrolBehavior : Node3D, IBehavior
{ {
_navigationAgent = navigationAgent; _navigationAgent = navigationAgent;
_navigationAgent.WaypointReached += NavigationAgent_WaypointReached; _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) private async void NavigationAgent_WaypointReached(Dictionary details)
@@ -66,14 +72,15 @@ public partial class PatrolBehavior : Node3D, IBehavior
{ {
SetPhysicsProcess(false); SetPhysicsProcess(false);
_patrolTimer?.Stop(); _patrolTimer?.Stop();
_navigationAgent.Velocity = Vector3.Zero;
} }
public void OnPhysicsProcess(double delta) public void OnPhysicsProcess(double delta)
{ {
var nextVelocity = _navigationAgent.GetNextPathPosition(); var nextVelocity = _navigationAgent.GetNextPathPosition();
var parent = GetParent() as Node3D; var parent = GetParent() as Node3D;
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_patrolSpeed * (float)delta; var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)PatrolSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity); _navigationAgent.Velocity = velocity;
} }
public void SetPatrolTarget() public void SetPatrolTarget()
@@ -94,5 +101,6 @@ public partial class PatrolBehavior : Node3D, IBehavior
_patrolTimer.Stop(); _patrolTimer.Stop();
_patrolTimer.Timeout -= PatrolTimer_Timeout; _patrolTimer.Timeout -= PatrolTimer_Timeout;
_navigationAgent.WaypointReached -= NavigationAgent_WaypointReached; _navigationAgent.WaypointReached -= NavigationAgent_WaypointReached;
_navigationAgent.VelocityComputed -= _navigationAgent_VelocityComputed;
} }
} }
@@ -1,7 +1,6 @@
using Chickensoft.AutoInject; using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq;
namespace Zennysoft.Game.Ma; 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://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://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="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://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="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"] [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://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"] [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"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.106078 radius = 0.106078
height = 1.23076 height = 1.23076
@@ -30,7 +40,7 @@ material = SubResource("StandardMaterial3D_p4gkk")
top_radius = 0.0 top_radius = 0.0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_drfkj"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_drfkj"]
radius = 1.0 radius = 1.33398
[node name="Sproingy" type="CharacterBody3D" groups=["enemy"]] [node name="Sproingy" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1 process_mode = 1
@@ -39,6 +49,7 @@ axis_lock_linear_y = true
axis_lock_angular_x = true axis_lock_angular_x = true
axis_lock_angular_z = true axis_lock_angular_z = true
script = ExtResource("1_xsluo") script = ExtResource("1_xsluo")
_lootTable = SubResource("Resource_fa44e")
[node name="CollisionShape" type="CollisionShape3D" parent="."] [node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@@ -96,7 +107,7 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_moun4")] [node name="FollowBehavior" parent="Components" instance=ExtResource("6_moun4")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 150.0 FollowSpeed = 175.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("5_drfkj")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("5_drfkj")]
unique_name_in_owner = true unique_name_in_owner = true
@@ -106,7 +117,9 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 3.0 use_3d_avoidance = true
avoidance_layers = 9
avoidance_mask = 9
[node name="SFX" type="Node3D" parent="."] [node name="SFX" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.0617, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.0617, 0)
@@ -11,6 +11,10 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "Igneous" Affinity = "Igneous"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Baleful Strike"
Drop2 = "" PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -80,8 +80,12 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "" Affinity = ""
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = ""
Drop2 = "" PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"] [sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
@@ -3177,7 +3181,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.332842, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3221,7 +3225,7 @@ tracks/1/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.332842, 0.4167),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3238,6 +3242,21 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [&"attack"] "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"] [sub_resource type="Animation" id="Animation_ivy74"]
resource_name = "primary_attack_left" resource_name = "primary_attack_left"
@@ -3262,7 +3281,7 @@ tracks/1/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.332842, 0.4167),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3279,6 +3298,21 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [&"attack"] "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"] [sub_resource type="Animation" id="Animation_x7uye"]
resource_name = "primary_attack_right" resource_name = "primary_attack_right"
@@ -3303,7 +3337,7 @@ tracks/1/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.332842, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3332,6 +3366,21 @@ tracks/3/keys = {
"update": 1, "update": 1,
"values": [&"attack"] "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"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_6tj5r"]
_data = { _data = {
@@ -3842,14 +3891,18 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_oh25a") script = ExtResource("1_oh25a")
CanMove = true
EnemyLoreInfo = SubResource("Resource_ivy74") EnemyLoreInfo = SubResource("Resource_ivy74")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 2.05501, 0) 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) modulate = Color(0.83, 0.83, 0.83, 1)
pixel_size = 0.001 pixel_size = 0.001
billboard = 2 billboard = 2
shaded = true
alpha_cut = 1 alpha_cut = 1
texture_filter = 0 texture_filter = 0
render_priority = 100 render_priority = 100
@@ -3876,6 +3929,7 @@ sprite_frames = SubResource("SpriteFrames_6drt6")
animation = &"idle_left_walk" animation = &"idle_left_walk"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -4015,3 +4069,35 @@ libraries = {
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
bus = &"SFX" 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.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -19,33 +18,33 @@ public partial class Michael : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBe
public void OnReady() public void OnReady()
{ {
FollowBehavior.Init(NavigationAgent); FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent); PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition; PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnVelocityComputed; PatrolBehavior.OnVelocityComputed += OnVelocityComputed;
FollowBehavior.OnVelocityComputed += OnVelocityComputed; FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited; PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetPhysicsProcess(true); SetPhysicsProcess(true);
} }
public void OnResolved() public void OnResolved()
{ {
_enemyLogic.Input(new EnemyLogic.Input.Patrol()); _enemyLogic.Input(new EnemyLogic.Input.Patrol());
} }
public override void Move() => EnemyModelView.PlayIdleAnimation(); public override void Move() => EnemyModelView.PlayIdleAnimation();
public new void OnExitTree() public new void OnExitTree()
{ {
base.OnExitTree(); base.OnExitTree();
PatrolBehavior.OnVelocityComputed -= OnVelocityComputed; PatrolBehavior.OnVelocityComputed -= OnVelocityComputed;
FollowBehavior.OnVelocityComputed -= OnVelocityComputed; FollowBehavior.OnVelocityComputed -= OnVelocityComputed;
EngagePlayerBehavior.TakeAction -= EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.TakeAction -= EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget -= EngagePlayerBehavior_AcquireTarget; EngagePlayerBehavior.AcquireTarget -= EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered; PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited; PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
} }
} }
@@ -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="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="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://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"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0 height = 5.0
@@ -19,7 +19,7 @@ radius = 0.34933
height = 2.66932 height = 2.66932
[sub_resource type="CylinderShape3D" id="CylinderShape3D_eek1b"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_eek1b"]
radius = 1.0 radius = 1.51025
[sub_resource type="SphereShape3D" id="SphereShape3D_wrps7"] [sub_resource type="SphereShape3D" id="SphereShape3D_wrps7"]
radius = 0.552847 radius = 0.552847
@@ -31,7 +31,6 @@ collision_mask = 11
axis_lock_linear_y = true axis_lock_linear_y = true
axis_lock_angular_x = true axis_lock_angular_x = true
axis_lock_angular_z = true axis_lock_angular_z = true
motion_mode = 1
script = ExtResource("1_lb5oy") script = ExtResource("1_lb5oy")
AeolicResistance = -20.0 AeolicResistance = -20.0
HydricResistance = -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")] [node name="PatrolBehavior" parent="Components" instance=ExtResource("5_fkx5j")]
unique_name_in_owner = true unique_name_in_owner = true
_patrolSpeed = 60.0
_patrolRange = 15.0 _patrolRange = 15.0
_patrolTime = 20.0 _patrolTime = 20.0
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_bun8r")] [node name="FollowBehavior" parent="Components" instance=ExtResource("6_bun8r")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 150.0 FollowSpeed = 175.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_x8mrp")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_x8mrp")]
unique_name_in_owner = true unique_name_in_owner = true
@@ -107,7 +105,9 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 3.0 use_3d_avoidance = true
avoidance_layers = 9
avoidance_mask = 9
[node name="HitSounds" type="Node3D" parent="."] [node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71715, 0) 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"] [node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true unique_name_in_owner = true
stream = ExtResource("9_fm627") stream = ExtResource("9_bun8r")
bus = &"SFX" bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"] [node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
@@ -13,6 +13,10 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "Ferrum" Affinity = "Ferrum"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Limbic Shock"
Drop2 = "" PrimaryAttackType = 6
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -3216,7 +3216,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3), "times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3282,7 +3282,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3), "times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3347,7 +3347,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3), "times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3412,7 +3412,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0333333, 0.3), "times": PackedFloat32Array(0, 0.0333333, 0.0500001),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4350,13 +4350,17 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_o4cc2") script = ExtResource("1_o4cc2")
CanMove = true
EnemyLoreInfo = ExtResource("2_pqohf") EnemyLoreInfo = ExtResource("2_pqohf")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.98924, 0) 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 billboard = 2
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -4385,6 +4389,7 @@ animation = &"idle_front_walk"
offset = Vector2(400, 400) offset = Vector2(400, 400)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -4439,6 +4444,50 @@ scale = Vector2(2.005, 2.005)
sprite_frames = SubResource("SpriteFrames_kp6q4") sprite_frames = SubResource("SpriteFrames_kp6q4")
animation = &"WATER DAMAGE" 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="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true 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) 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() public void OnResolved()
{ {
_enemyLogic.Input(new EnemyLogic.Input.Activate());
_enemyLogic.Input(new EnemyLogic.Input.Patrol()); _enemyLogic.Input(new EnemyLogic.Input.Patrol());
} }
public override void PerformAction() public override void PerformAction()
{ {
var enemyPosition = new Vector3(GlobalPosition.X, _player.GlobalPosition.Y, GlobalPosition.Z); 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(); EnemyModelView.PlaySecondaryAttackAnimation();
else else
EnemyModelView.PlayPrimaryAttackAnimation(); 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://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="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="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"] [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://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://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://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"] [sub_resource type="Resource" id="Resource_06aiy"]
height = 5.0 script = ExtResource("3_g602r")
radius = 1.0 Items = Array[ExtResource("2_m7220")]([])
metadata/_custom_type_script = "uid://bei3s7yr6xkc0"
[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_fv5vf"] [sub_resource type="Resource" id="Resource_fv5vf"]
script = ExtResource("4_5eid5") script = ExtResource("4_5eid5")
@@ -31,89 +27,111 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "" Affinity = ""
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = ""
Drop2 = "" PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = ExtResource("4_5eid5") metadata/_custom_type_script = ExtResource("4_5eid5")
[sub_resource type="CylinderShape3D" id="CylinderShape3D_qbmfg"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_g602r"]
height = 5.81738 height = 13.8621
radius = 3.91016 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"]] [node name="FilthEater" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1 process_mode = 1
collision_layer = 10 collision_layer = 10
collision_mask = 11 collision_mask = 3
axis_lock_linear_y = true axis_lock_linear_y = true
axis_lock_angular_x = true axis_lock_angular_x = true
axis_lock_angular_z = true
script = ExtResource("1_p438s") script = ExtResource("1_p438s")
_lootTable = SubResource("Resource_06aiy")
[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")
[node name="EnemyModelView" parent="." instance=ExtResource("3_rrwed")] [node name="EnemyModelView" parent="." instance=ExtResource("3_rrwed")]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.114099, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.114099, 0)
EnemyLoreInfo = SubResource("Resource_fv5vf") 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="."] [node name="PlayerDetector" type="Area3D" parent="."]
unique_name_in_owner = true 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_layer = 0
collision_mask = 34 collision_mask = 34
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"] [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_ygtll")
shape = SubResource("CylinderShape3D_qbmfg")
[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="."] [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")] [node name="PatrolBehavior" parent="Components" instance=ExtResource("5_pvjvo")]
unique_name_in_owner = true unique_name_in_owner = true
_patrolRange = 15.0
_patrolTime = 20.0
[node name="FollowBehavior" parent="Components" instance=ExtResource("6_fccr3")] [node name="FollowBehavior" parent="Components" instance=ExtResource("6_fccr3")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 150.0 FollowSpeed = 175.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_8l567")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_8l567")]
unique_name_in_owner = true unique_name_in_owner = true
_minimumAttackTime = 1.0
_maximumAttackTime = 3.0
_acquireTargetTime = 2.0 _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
height = 2.0
radius = 3.0 radius = 3.0
use_3d_avoidance = true
avoidance_layers = 9
avoidance_mask = 9
[node name="HitSounds" type="Node3D" parent="."] [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"] [node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true unique_name_in_owner = true
@@ -132,9 +150,9 @@ bus = &"SFX"
[node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"] [node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true unique_name_in_owner = true
stream = ExtResource("12_m7220")
bus = &"SFX" bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"] [node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true unique_name_in_owner = true
stream = ExtResource("11_qbmfg")
bus = &"SFX" bus = &"SFX"
@@ -13,6 +13,10 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "Eolic" Affinity = "Eolic"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Aero Cannon"
Drop2 = "" PrimaryAttackType = 1
SecondaryAttackName = "Metal Cutter"
SecondaryAttackType = 5
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" 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://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://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://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"] [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://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"] [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"] [sub_resource type="ViewportTexture" id="ViewportTexture_7tggm"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport") viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -3803,6 +3790,18 @@ tracks/5/keys = {
"update": 1, "update": 1,
"values": [0] "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"] [sub_resource type="Animation" id="Animation_b1kem"]
resource_name = "idle_back" resource_name = "idle_back"
@@ -4157,7 +4156,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705), "times": PackedFloat32Array(0, 0.588603, 0.666667),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4230,6 +4229,18 @@ tracks/6/keys = {
"times": PackedFloat32Array(0.426553) "times": PackedFloat32Array(0.426553)
} }
tracks/6/use_blend = true 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"] [sub_resource type="Animation" id="Animation_krqul"]
resource_name = "primary_attack_back" resource_name = "primary_attack_back"
@@ -4266,7 +4277,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705), "times": PackedFloat32Array(0, 0.588603, 0.666666),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4286,6 +4297,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0.333333) "times": PackedFloat32Array(0.333333)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_hsn02"]
resource_name = "primary_attack_left" resource_name = "primary_attack_left"
@@ -4322,7 +4345,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705), "times": PackedFloat32Array(0, 0.588603, 0.666666),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4354,6 +4377,18 @@ tracks/4/keys = {
"times": PackedFloat32Array(0.333333) "times": PackedFloat32Array(0.333333)
} }
tracks/4/use_blend = true 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"] [sub_resource type="Animation" id="Animation_eslbn"]
resource_name = "primary_attack_right" resource_name = "primary_attack_right"
@@ -4390,7 +4425,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.588603, 0.833705), "times": PackedFloat32Array(0, 0.588603, 0.666666),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4422,6 +4457,18 @@ tracks/4/keys = {
"times": PackedFloat32Array(0.333333) "times": PackedFloat32Array(0.333333)
} }
tracks/4/use_blend = true 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"] [sub_resource type="Animation" id="Animation_usgpm"]
resource_name = "secondary_attack" resource_name = "secondary_attack"
@@ -4552,6 +4599,18 @@ tracks/7/keys = {
"times": PackedFloat32Array(0.015234, 0.984766, 1.42112, 1.91667) "times": PackedFloat32Array(0.015234, 0.984766, 1.42112, 1.91667)
} }
tracks/7/use_blend = true 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"] [sub_resource type="Animation" id="Animation_7a6is"]
resource_name = "secondary_attack_back" resource_name = "secondary_attack_back"
@@ -4593,6 +4652,18 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_pyy2h"]
resource_name = "secondary_attack_left" resource_name = "secondary_attack_left"
@@ -4646,6 +4717,18 @@ tracks/3/keys = {
"update": 1, "update": 1,
"values": [false] "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"] [sub_resource type="Animation" id="Animation_smxxh"]
resource_name = "secondary_attack_right" resource_name = "secondary_attack_right"
@@ -4699,6 +4782,18 @@ tracks/3/keys = {
"update": 1, "update": 1,
"values": [true] "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"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_tbr0l"]
_data = { _data = {
@@ -5757,12 +5852,16 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_718m1") script = ExtResource("1_718m1")
EnemyLoreInfo = SubResource("Resource_pyy2h") CanMove = true
EnemyLoreInfo = ExtResource("2_p4ilm")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 1.088, 0) 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 billboard = 2
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -5789,6 +5888,7 @@ sprite_frames = SubResource("SpriteFrames_673a4")
animation = &"idle_back_walk" animation = &"idle_back_walk"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -5845,13 +5945,44 @@ animation = &"WATER DAMAGE"
[node name="Shadow" type="Sprite3D" parent="Sprite3D"] [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) 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 transparency = 0.1
cast_shadow = 0 cast_shadow = 0
modulate = Color(1, 1, 1, 0.591) modulate = Color(1, 1, 1, 0.591)
texture_filter = 0 texture_filter = 0
texture = ExtResource("193_e5pq0") 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="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true 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) 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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0509949, 1.00697, 0.684851)
script = ExtResource("200_4h5gj") script = ExtResource("200_4h5gj")
ProjectileScene = ExtResource("200_mno7m") ProjectileScene = ExtResource("200_mno7m")
_projectileForce = 20.0
[node name="Marker3D" type="Marker3D" parent="ProjectileSystem"] [node name="Marker3D" type="Marker3D" parent="ProjectileSystem"]
@@ -831,6 +831,7 @@ collision_mask = 64
shape = SubResource("SphereShape3D_kct8n") shape = SubResource("SphereShape3D_kct8n")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Bullet"] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Bullet"]
process_mode = 1
[node name="AnimationPlayer" type="AnimationPlayer" parent="Bullet"] [node name="AnimationPlayer" type="AnimationPlayer" parent="Bullet"]
unique_name_in_owner = true unique_name_in_owner = true
@@ -844,6 +845,7 @@ autoplay = "Fire"
shape = SubResource("SphereShape3D_ka3x7") shape = SubResource("SphereShape3D_ka3x7")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
process_mode = 1
stream = ExtResource("5_m4i4a") stream = ExtResource("5_m4i4a")
autoplay = true autoplay = true
bus = &"SFX" bus = &"SFX"
@@ -23,7 +23,7 @@ height = 5.0
radius = 1.0 radius = 1.0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_746fv"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_746fv"]
radius = 1.25 radius = 1.59424
[node name="Sara" type="CharacterBody3D" groups=["enemy"]] [node name="Sara" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1 process_mode = 1
@@ -89,16 +89,17 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_lxgpb")] [node name="FollowBehavior" parent="Components" instance=ExtResource("5_lxgpb")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_ddchx")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_ddchx")]
unique_name_in_owner = true unique_name_in_owner = true
_acquireTargetTime = 2.0 _minimumAttackTime = 1.5
_maximumAttackTime = 3.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 1.0 use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."] [node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.95329, 0) 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" bus = &"SFX"
[node name="Shadow" type="Sprite3D" parent="."] [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 transparency = 0.1
cast_shadow = 0 cast_shadow = 0
modulate = Color(1, 1, 1, 0.591) modulate = Color(1, 1, 1, 0.591)
texture_filter = 0 texture_filter = 0
render_priority = 100
texture = ExtResource("10_746fv") texture = ExtResource("10_746fv")
@@ -13,6 +13,10 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "Telluric" Affinity = "Telluric"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Tetra Strike"
Drop2 = "" PrimaryAttackType = 5
SecondaryAttackName = "Miasma Vex"
SecondaryAttackType = 7
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
@@ -3720,7 +3720,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215), "times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3776,7 +3776,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215), "times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3832,7 +3832,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215), "times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3888,7 +3888,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.189498, 0.499215), "times": PackedFloat32Array(0, 0.189498, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3920,7 +3920,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.5), "times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4010,7 +4010,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.413635), "times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4076,7 +4076,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.413635), "times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4142,7 +4142,7 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.167084, 0.413635), "times": PackedFloat32Array(0, 0.167084, 0.25),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4990,14 +4990,18 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_oh25a") script = ExtResource("1_oh25a")
CanMove = true
EnemyLoreInfo = ExtResource("2_cftgd") EnemyLoreInfo = ExtResource("2_cftgd")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0.88609, 0) 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) modulate = Color(0.91, 0.91, 0.91, 1)
pixel_size = 0.005 pixel_size = 0.005
billboard = 1 billboard = 1
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -5024,6 +5028,7 @@ sprite_frames = SubResource("SpriteFrames_sobol")
animation = &"idle_front" animation = &"idle_front"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -5078,6 +5083,34 @@ scale = Vector2(2.605, 2.605)
sprite_frames = SubResource("SpriteFrames_bsjfy") sprite_frames = SubResource("SpriteFrames_bsjfy")
animation = &"WATER DAMAGE" 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="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true 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) 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")] [node name="PatrolBehavior" parent="Components" instance=ExtResource("4_bjnvx")]
unique_name_in_owner = true unique_name_in_owner = true
_patrolSpeed = 325.0 PatrolSpeed = 200.0
_thinkTime = 2.0 _thinkTime = 2.0
_patrolTime = 30.0 _patrolTime = 30.0
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_55sdf")] [node name="FollowBehavior" parent="Components" instance=ExtResource("5_55sdf")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 400.0 FollowSpeed = 500.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_2xj0s")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_2xj0s")]
unique_name_in_owner = true unique_name_in_owner = true
@@ -93,7 +93,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 1.0 use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."] [node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
@@ -13,6 +13,10 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "Telluric" Affinity = "Telluric"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Telluric Strike"
Drop2 = "" PrimaryAttackType = 2
SecondaryAttackName = "Three Colors Gaze"
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" 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="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://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://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"] [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/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.335728, 0.749375), "times": PackedFloat32Array(0, 0.335728, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -3555,11 +3556,41 @@ tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0, 0.335728, 0.749375), "times": PackedFloat32Array(0, 0.335728, 0.416667),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_7d2d3"]
resource_name = "primary_attack_left" resource_name = "primary_attack_left"
@@ -3600,6 +3631,36 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_poqxf"]
resource_name = "primary_attack_right" resource_name = "primary_attack_right"
@@ -3640,6 +3701,40 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_airxj"]
resource_name = "secondary_attack" resource_name = "secondary_attack"
@@ -3762,6 +3857,36 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_o6ljw"]
resource_name = "secondary_attack_left" resource_name = "secondary_attack_left"
@@ -3803,6 +3928,36 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_cyiv5"]
resource_name = "secondary_attack_right" resource_name = "secondary_attack_right"
@@ -3856,6 +4011,40 @@ tracks/3/keys = {
"update": 1, "update": 1,
"values": [true] "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"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_xidnl"]
_data = { _data = {
@@ -4695,12 +4884,17 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_ueqp5") script = ExtResource("1_ueqp5")
CanMove = true
EnemyLoreInfo = ExtResource("2_ice28")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 1.76027, 0) 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 pixel_size = 0.015
billboard = 2 billboard = 2
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -4726,6 +4920,7 @@ animation = &"idle_front_walk"
offset = Vector2(400, 400) offset = Vector2(400, 400)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -4816,13 +5011,11 @@ libraries = {
[node name="WalkSFX" type="AudioStreamPlayer3D" parent="."] [node name="WalkSFX" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.86303, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.86303, 0)
stream = ExtResource("94_i3hgg")
autoplay = true autoplay = true
bus = &"SFX" bus = &"SFX"
[node name="Shadow" type="Sprite3D" parent="."] [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) 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 transparency = 0.1
cast_shadow = 0 cast_shadow = 0
modulate = Color(1, 1, 1, 0.591) modulate = Color(1, 1, 1, 0.591)
@@ -4876,3 +5069,31 @@ libraries = {
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
max_distance = 518.62 max_distance = 518.62
bus = &"SFX" 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 = "" DEF = ""
Affinity = "Telluric" Affinity = "Telluric"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Biohazard Spray"
Drop2 = "" PrimaryAttackType = 5
SecondaryAttackName = "Green-Earth Flare"
SecondaryAttackType = 2
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" 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://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="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://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"] [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://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"] [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"] [sub_resource type="BoxShape3D" id="BoxShape3D_53wuj"]
size = Vector3(1, 1.07938, 3.51416) size = Vector3(1, 1.07938, 3.51416)
@@ -683,7 +670,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.76, 1.16), "times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -790,7 +777,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -843,7 +830,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -896,7 +883,7 @@ tracks/0/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"times": PackedFloat32Array(0, 0.332842, 0.66857), "times": PackedFloat32Array(0, 0.76, 0.8),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -5827,7 +5814,7 @@ animations = [{
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_lp3cr") script = ExtResource("1_lp3cr")
EnemyLoreInfo = SubResource("Resource_ivy74") EnemyLoreInfo = ExtResource("2_xn42l")
[node name="Hitbox" type="Area3D" parent="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@@ -5920,8 +5907,11 @@ libraries = {
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0)
layers = 5
cast_shadow = 0
pixel_size = 0.006 pixel_size = 0.006
billboard = 2 billboard = 2
shaded = true
alpha_cut = 1 alpha_cut = 1
texture_filter = 0 texture_filter = 0
render_priority = 100 render_priority = 100
@@ -5946,6 +5936,7 @@ animation = &"Idle FRONT"
offset = Vector2(402.745, 400) offset = Vector2(402.745, 400)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -6000,6 +5991,50 @@ scale = Vector2(4.28, 4.28)
sprite_frames = SubResource("SpriteFrames_6tam3") sprite_frames = SubResource("SpriteFrames_6tam3")
animation = &"WATER DAMAGE" 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="."] [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) 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) 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 = "" DEF = ""
Affinity = "Eolic" Affinity = "Eolic"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Matter Shift"
Drop2 = "" PrimaryAttackType = 0
SecondaryAttackName = "Mid-Century Pulsar"
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" 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"] [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"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.226425 radius = 1.0
height = 2.02807 height = 3.90429
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0 height = 5.0
@@ -26,8 +26,12 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "" Affinity = ""
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = ""
Drop2 = "" PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"] [sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"]
@@ -48,7 +52,7 @@ script = ExtResource("1_120m2")
[node name="CollisionShape" type="CollisionShape3D" parent="."] [node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true 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") shape = SubResource("CapsuleShape3D_cwfph")
[node name="LineOfSight" type="Area3D" parent="."] [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")] [node name="FollowBehavior" parent="Components" instance=ExtResource("6_t7elt")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 500.0 FollowSpeed = 800.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_24q6i")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_24q6i")]
unique_name_in_owner = true unique_name_in_owner = true
@@ -97,7 +101,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 1.0 use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."] [node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.46013, 0) 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="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="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://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://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"] [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://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://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="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"] [sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport") viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -5711,6 +5713,21 @@ tracks/6/keys = {
"update": 0, "update": 0,
"values": [Color(1, 1, 1, 1), Color(100, 100, 100, 1), Color(1, 1, 1, 1)] "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"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_46p8q"]
_data = { _data = {
@@ -5906,13 +5923,13 @@ states/Start/position = Vector2(199, 100)
"states/Stop Walk/node" = SubResource("AnimationNodeStateMachine_li182") "states/Stop Walk/node" = SubResource("AnimationNodeStateMachine_li182")
"states/Stop Walk/position" = Vector2(72.437, 334.144) "states/Stop Walk/position" = Vector2(72.437, 334.144)
"states/Teleport In/node" = SubResource("AnimationNodeAnimation_li182") "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/node" = ExtResource("245_gr3tp")
"states/Unactivated Idle/position" = Vector2(357, 100) "states/Unactivated Idle/position" = Vector2(357, 100)
states/Walking/node = SubResource("AnimationNodeStateMachine_7dl50") states/Walking/node = SubResource("AnimationNodeStateMachine_7dl50")
states/Walking/position = Vector2(348, 400.144) 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")] 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"] [sub_resource type="AtlasTexture" id="AtlasTexture_tawq7"]
atlas = ExtResource("395_ymova") atlas = ExtResource("395_ymova")
@@ -6513,7 +6530,7 @@ tracks/15/keys = {
"times": PackedFloat32Array(0), "times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1), "transitions": PackedFloat32Array(1),
"update": 1, "update": 1,
"values": [&"WATER DAMAGE"] "values": [&"EARTH DAMAGE"]
} }
tracks/16/type = "value" tracks/16/type = "value"
tracks/16/imported = false tracks/16/imported = false
@@ -6652,6 +6669,7 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_6dej3") script = ExtResource("1_6dej3")
EnemyLoreInfo = ExtResource("2_y2ova")
[node name="Shadow" type="Sprite3D" parent="."] [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) 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="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0) 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) offset = Vector2(0, 200)
pixel_size = 0.005 pixel_size = 0.005
billboard = 2 billboard = 2
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -6693,6 +6714,7 @@ animation = &"idle_front_walk"
offset = Vector2(500, 500) offset = Vector2(500, 500)
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -6745,7 +6767,35 @@ frame = 47
position = Vector2(500, 500) position = Vector2(500, 500)
scale = Vector2(4, 4) scale = Vector2(4, 4)
sprite_frames = SubResource("SpriteFrames_8u7he") 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="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true 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"] [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"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.106078 radius = 0.9672
height = 1.23076 height = 3.20843
[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_sjoyv"]
radius = 0.57308 radius = 0.908537
height = 3.36877
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0 height = 5.0
@@ -47,7 +48,7 @@ collision_layer = 2048
collision_mask = 0 collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision/Collision"] [node name="CollisionShape3D" type="CollisionShape3D" parent="Collision/Collision"]
shape = SubResource("SphereShape3D_8vcnq") shape = SubResource("CapsuleShape3D_sjoyv")
[node name="LineOfSight" type="Area3D" parent="Collision"] [node name="LineOfSight" type="Area3D" parent="Collision"]
unique_name_in_owner = true unique_name_in_owner = true
@@ -89,7 +90,6 @@ unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_gy5yi")] [node name="FollowBehavior" parent="Components" instance=ExtResource("5_gy5yi")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_7f1qq")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_7f1qq")]
unique_name_in_owner = true unique_name_in_owner = true
@@ -98,7 +98,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 1.0 use_3d_avoidance = true
avoidance_mask = 9
[node name="HitSounds" type="Node3D" parent="."] [node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.29778, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.29778, 0)
@@ -13,6 +13,10 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "Ferrum" Affinity = "Ferrum"
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = "Embargo Kick"
Drop2 = "" PrimaryAttackType = 5
SecondaryAttackName = "Treaty Punch"
SecondaryAttackType = 5
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" 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://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://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://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"] [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://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"] [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"] [sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport") viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -4375,6 +4362,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_fmw6u"]
resource_name = "primary_attack_left" resource_name = "primary_attack_left"
@@ -4431,6 +4430,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_psv15"]
resource_name = "primary_attack_right" resource_name = "primary_attack_right"
@@ -4487,6 +4498,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_5y02v"]
resource_name = "secondary_attack" resource_name = "secondary_attack"
@@ -4611,6 +4634,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_m347f"]
resource_name = "secondary_attack_left" resource_name = "secondary_attack_left"
@@ -4667,6 +4702,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_xe0e6"]
resource_name = "secondary_attack_right" resource_name = "secondary_attack_right"
@@ -4723,6 +4770,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_x0ep5"]
_data = { _data = {
@@ -5258,14 +5317,17 @@ _data = {
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_h27bt") script = ExtResource("1_h27bt")
EnemyLoreInfo = SubResource("Resource_f45wt") EnemyLoreInfo = ExtResource("2_vh04b")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0.345, 0) 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) offset = Vector2(0, 75)
pixel_size = 0.02 pixel_size = 0.02
billboard = 2 billboard = 2
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -5292,6 +5354,7 @@ sprite_frames = SubResource("SpriteFrames_6drt6")
animation = &"idle_front" animation = &"idle_front"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -5430,3 +5493,31 @@ unique_name_in_owner = true
libraries = { libraries = {
&"": SubResource("AnimationLibrary_0tqwp") &"": 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")] [node name="FollowBehavior" parent="Components" instance=ExtResource("6_v4xmn")]
unique_name_in_owner = true unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_a21yr")] [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_a21yr")]
unique_name_in_owner = true unique_name_in_owner = true
@@ -97,7 +96,8 @@ _acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"] [node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true unique_name_in_owner = true
avoidance_enabled = true avoidance_enabled = true
radius = 1.0 use_3d_avoidance = true
avoidance_layers = 9
[node name="HitSounds" type="Node3D" parent="."] [node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.69068, 0) 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://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"] [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://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://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="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"] [sub_resource type="Resource" id="Resource_f45wt"]
script = ExtResource("2_xa3ug") script = ExtResource("2_xa3ug")
@@ -285,8 +286,12 @@ ATK = ""
DEF = "" DEF = ""
Affinity = "" Affinity = ""
Weakness = "" Weakness = ""
Drop1 = "" PrimaryAttackName = ""
Drop2 = "" PrimaryAttackType = 0
SecondaryAttackName = ""
SecondaryAttackType = 0
TertiaryAttackName = ""
TertiaryAttackType = 0
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"] [sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"]
@@ -4329,7 +4334,7 @@ tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1 tracks/4/interp = 1
tracks/4/loop_wrap = true tracks/4/loop_wrap = true
tracks/4/keys = { tracks/4/keys = {
"times": PackedFloat32Array(0, 0.0833333, 0.25), "times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1), "transitions": PackedFloat32Array(1, 1, 1),
"update": 1, "update": 1,
"values": [true, false, true] "values": [true, false, true]
@@ -4390,6 +4395,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_fmw6u"]
resource_name = "primary_attack_left" resource_name = "primary_attack_left"
@@ -4446,6 +4463,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_psv15"]
resource_name = "primary_attack_right" resource_name = "primary_attack_right"
@@ -4502,6 +4531,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/3/use_blend = true 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"] [sub_resource type="Animation" id="Animation_5y02v"]
resource_name = "secondary_attack" resource_name = "secondary_attack"
@@ -4555,6 +4596,21 @@ tracks/3/keys = {
"update": 1, "update": 1,
"values": [true, false, true] "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"] [sub_resource type="Animation" id="Animation_tlm8w"]
resource_name = "secondary_attack_back" resource_name = "secondary_attack_back"
@@ -4596,6 +4652,33 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [false] "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"] [sub_resource type="Animation" id="Animation_m347f"]
resource_name = "secondary_attack_left" resource_name = "secondary_attack_left"
@@ -4637,6 +4720,33 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [false] "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"] [sub_resource type="Animation" id="Animation_xe0e6"]
resource_name = "secondary_attack_right" resource_name = "secondary_attack_right"
@@ -4678,6 +4788,33 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [true] "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"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_x0ep5"]
_data = { _data = {
@@ -5219,8 +5356,11 @@ EnemyLoreInfo = SubResource("Resource_f45wt")
[node name="Sprite3D" type="Sprite3D" parent="."] [node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(0.49, 0, 0, 0, 0.49, 0, 0, 0, 0.49, 0, 0.405037, 0) 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) offset = Vector2(0, 75)
billboard = 2 billboard = 2
shaded = true
alpha_cut = 2 alpha_cut = 2
alpha_antialiasing_mode = 1 alpha_antialiasing_mode = 1
texture_filter = 0 texture_filter = 0
@@ -5251,6 +5391,7 @@ sprite_frames = SubResource("SpriteFrames_6drt6")
animation = &"idle_front" animation = &"idle_front"
[node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [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"] [node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
@@ -5388,3 +5529,31 @@ unique_name_in_owner = true
libraries = { libraries = {
&"": SubResource("AnimationLibrary_0tqwp") &"": 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

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