From f060229b5e46e13229fd01b297d605976b1d78b0 Mon Sep 17 00:00:00 2001 From: Zenny Date: Tue, 11 Mar 2025 16:00:46 -0700 Subject: [PATCH] Add stackable items --- .../Entity/IStackable.cs | 8 ++ .../States/InGameUI.State.InventoryOpen.cs | 2 +- .../States/InGameUI.State.MinimapOpen.cs | 2 +- Zennysoft.Game.Ma/project.godot | 4 +- Zennysoft.Game.Ma/src/audio/InGameAudio.cs | 76 +++++++++--------- Zennysoft.Game.Ma/src/audio/InGameAudio.tscn | 8 +- .../src/audio/sfx/PlayerHitEnemySFX.wav | Bin 0 -> 100110 bytes .../audio/sfx/PlayerHitEnemySFX.wav.import | 24 ++++++ Zennysoft.Game.Ma/src/game/Game.cs | 8 +- .../InventoryLabelSettings.tres | 5 +- .../src/inventory_menu/ItemSlot.cs | 9 +++ .../src/inventory_menu/ItemSlot.tscn | 14 +++- Zennysoft.Game.Ma/src/items/Inventory.cs | 11 +++ .../src/items/effect/EffectItem.cs | 1 + .../src/items/throwable/ThrowableItem.cs | 9 ++- .../src/map/dungeon/code/Floor0.cs | 8 +- .../src/map/dungeon/floors/Floor00.tscn | 19 ++++- 17 files changed, 151 insertions(+), 57 deletions(-) create mode 100644 Zennysoft.Game.Abstractions/Entity/IStackable.cs create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav.import diff --git a/Zennysoft.Game.Abstractions/Entity/IStackable.cs b/Zennysoft.Game.Abstractions/Entity/IStackable.cs new file mode 100644 index 00000000..e70cab9c --- /dev/null +++ b/Zennysoft.Game.Abstractions/Entity/IStackable.cs @@ -0,0 +1,8 @@ +namespace Zennysoft.Game.Abstractions; + +public interface IStackable +{ + int Count { get; } + + void SetCount(int count); +} diff --git a/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.InventoryOpen.cs b/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.InventoryOpen.cs index ccff79d1..9dadb647 100644 --- a/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.InventoryOpen.cs +++ b/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.InventoryOpen.cs @@ -7,7 +7,7 @@ public partial class InGameUILogic public partial record State { [Meta] - public partial record InventoryOpen : Active, IGet + public partial record InventoryOpen : State, IGet { public InventoryOpen() { diff --git a/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.MinimapOpen.cs b/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.MinimapOpen.cs index 46375b7e..5dc70509 100644 --- a/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.MinimapOpen.cs +++ b/Zennysoft.Game.Ma.Implementation/UI/InGameUI/state/States/InGameUI.State.MinimapOpen.cs @@ -7,7 +7,7 @@ public partial class InGameUILogic public partial record State { [Meta] - public partial record MinimapOpen : Active, IGet + public partial record MinimapOpen : State, IGet { public MinimapOpen() { diff --git a/Zennysoft.Game.Ma/project.godot b/Zennysoft.Game.Ma/project.godot index 184f1ac4..38b90f89 100644 --- a/Zennysoft.Game.Ma/project.godot +++ b/Zennysoft.Game.Ma/project.godot @@ -29,8 +29,8 @@ general/balloon_path="res://src/ui/dialogue/Balloon.tscn" [display] -window/size/viewport_width=1280 -window/size/viewport_height=960 +window/size/viewport_width=1920 +window/size/viewport_height=1080 [dotnet] diff --git a/Zennysoft.Game.Ma/src/audio/InGameAudio.cs b/Zennysoft.Game.Ma/src/audio/InGameAudio.cs index 8db09312..fdee1386 100644 --- a/Zennysoft.Game.Ma/src/audio/InGameAudio.cs +++ b/Zennysoft.Game.Ma/src/audio/InGameAudio.cs @@ -57,86 +57,86 @@ public partial class InGameAudio : Node public void Setup() { - InGameAudioLogic = new InGameAudioLogic(); + InGameAudioLogic = new InGameAudioLogic(); } public void OnResolved() { - InGameAudioLogic.Set(AppRepo); - InGameAudioLogic.Set(GameEventDepot); - InGameAudioLogic.Set(Player); - InGameAudioLogic.Set(GameRepo); + InGameAudioLogic.Set(AppRepo); + InGameAudioLogic.Set(GameEventDepot); + InGameAudioLogic.Set(Player); + InGameAudioLogic.Set(GameRepo); - InGameAudioBinding = InGameAudioLogic.Bind(); + InGameAudioBinding = InGameAudioLogic.Bind(); - InGameAudioBinding - .Handle((in InGameAudioLogic.Output.PlayOverworldMusic _) => StartOverworldMusic()) - .Handle((in InGameAudioLogic.Output.PlayDungeonThemeAMusic _) => StartDungeonThemeA()) - .Handle((in InGameAudioLogic.Output.PlayMenuScrollSound _) => PlayMenuScrollSound()) - .Handle((in InGameAudioLogic.Output.PlayEquipSound _) => PlayEquipSound()) - .Handle((in InGameAudioLogic.Output.PlayMenuBackSound _) => PlayMenuBackSound()) - .Handle((in InGameAudioLogic.Output.PlayInventorySortedSound _) => PlayInventorySortedSound()) - .Handle((in InGameAudioLogic.Output.PlayHealingItemSound _) => PlayHealingItemSound()) - .Handle((in InGameAudioLogic.Output.PlayTeleportSound _) => PlayTeleportSound()) - .Handle((in InGameAudioLogic.Output.PlayPlayerAttackSound _) => { PlayerAttackSFX.Stop(); PlayerAttackSFX.Play(); }) - .Handle((in InGameAudioLogic.Output.PlayPlayerAttackWallSound _) => { PlayerAttackWallSFX.Stop(); PlayerAttackWallSFX.Play(); }) - .Handle((in InGameAudioLogic.Output.PlayPlayerAttackEnemySound _) => { PlayerAttackEnemySFX.Stop(); PlayerAttackEnemySFX.Play(); }); + InGameAudioBinding + .Handle((in InGameAudioLogic.Output.PlayOverworldMusic _) => StartOverworldMusic()) + .Handle((in InGameAudioLogic.Output.PlayDungeonThemeAMusic _) => StartDungeonThemeA()) + .Handle((in InGameAudioLogic.Output.PlayMenuScrollSound _) => PlayMenuScrollSound()) + .Handle((in InGameAudioLogic.Output.PlayEquipSound _) => PlayEquipSound()) + .Handle((in InGameAudioLogic.Output.PlayMenuBackSound _) => PlayMenuBackSound()) + .Handle((in InGameAudioLogic.Output.PlayInventorySortedSound _) => PlayInventorySortedSound()) + .Handle((in InGameAudioLogic.Output.PlayHealingItemSound _) => PlayHealingItemSound()) + .Handle((in InGameAudioLogic.Output.PlayTeleportSound _) => PlayTeleportSound()) + .Handle((in InGameAudioLogic.Output.PlayPlayerAttackSound _) => { PlayerAttackSFX.Stop(); PlayerAttackSFX.Play(); }) + .Handle((in InGameAudioLogic.Output.PlayPlayerAttackWallSound _) => { PlayerAttackWallSFX.Stop(); PlayerAttackWallSFX.Play(); }) + .Handle((in InGameAudioLogic.Output.PlayPlayerAttackEnemySound _) => { PlayerAttackEnemySFX.Stop(); PlayerAttackEnemySFX.Play(); }); - InGameAudioLogic.Start(); + InGameAudioLogic.Start(); } public void OnExitTree() { - InGameAudioLogic.Stop(); - InGameAudioBinding.Dispose(); + InGameAudioLogic.Stop(); + InGameAudioBinding.Dispose(); } private void StartOverworldMusic() { - OverworldBgm.Stop(); - OverworldBgm.FadeIn(); + OverworldBgm.Stop(); + OverworldBgm.FadeIn(); } private void StartDungeonThemeA() { - OverworldBgm.FadeOut(); - DungeonThemeABgm.Stop(); - DungeonThemeABgm.FadeIn(); + OverworldBgm.FadeOut(); + DungeonThemeABgm.Stop(); + DungeonThemeABgm.FadeIn(); } private void PlayMenuScrollSound() { - MenuScrollSFX.Stop(); - MenuScrollSFX.Play(); + MenuScrollSFX.Stop(); + MenuScrollSFX.Play(); } private void PlayEquipSound() { - EquipSFX.Stop(); - EquipSFX.Play(); + EquipSFX.Stop(); + EquipSFX.Play(); } private void PlayMenuBackSound() { - MenuBackSFX.Stop(); - MenuBackSFX.Play(); + MenuBackSFX.Stop(); + MenuBackSFX.Play(); } private void PlayInventorySortedSound() { - InventorySortedSFX.Stop(); - InventorySortedSFX.Play(); + InventorySortedSFX.Stop(); + InventorySortedSFX.Play(); } private void PlayHealingItemSound() { - HealingItemSFX.Stop(); - HealingItemSFX.Play(); + HealingItemSFX.Stop(); + HealingItemSFX.Play(); } private void PlayTeleportSound() { - TeleportSFX.Stop(); - TeleportSFX.Play(); + TeleportSFX.Stop(); + TeleportSFX.Play(); } } diff --git a/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn b/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn index 394afc34..797300ce 100644 --- a/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn +++ b/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://b16ejcwanod72"] +[gd_scene load_steps=16 format=3 uid="uid://b16ejcwanod72"] [ext_resource type="Script" uid="uid://2mnouyn1jcqs" path="res://src/audio/InGameAudio.cs" id="1_gpmcr"] [ext_resource type="AudioStream" uid="uid://dfu0fksb6slhx" path="res://src/audio/music/droney.mp3" id="2_8hfyr"] @@ -11,6 +11,7 @@ [ext_resource type="AudioStream" uid="uid://d1mlduwauechv" path="res://src/audio/sfx/PlayerAttackSFX.wav" id="7_wtvpb"] [ext_resource type="AudioStream" uid="uid://r1tryiit38i8" path="res://src/audio/sfx/MenuBackSFX.ogg" id="8_1xcgo"] [ext_resource type="AudioStream" uid="uid://bjj61s8q2gwb8" path="res://src/audio/sfx/EquipSFX.ogg" id="8_kwybb"] +[ext_resource type="AudioStream" uid="uid://4u8f1tpgs08b" path="res://src/audio/sfx/PlayerHitEnemySFX.wav" id="9_hertr"] [ext_resource type="AudioStream" uid="uid://myx4s8lmarc2" path="res://src/audio/sfx/HealSFX.ogg" id="10_3lcw5"] [ext_resource type="AudioStream" uid="uid://dci08kmwsu6k1" path="res://src/audio/sfx/ExitSFX.ogg" id="11_offhc"] [ext_resource type="AudioStream" uid="uid://d3sn7c614uj2n" path="res://src/audio/sfx/SortSFX.ogg" id="12_wprjr"] @@ -70,6 +71,11 @@ unique_name_in_owner = true stream = ExtResource("7_8vh2f") volume_db = -5.0 +[node name="PlayerAttackEnemySFX" type="AudioStreamPlayer" parent="SFX"] +unique_name_in_owner = true +stream = ExtResource("9_hertr") +volume_db = -5.0 + [node name="MenuScrollSFX" type="AudioStreamPlayer" parent="SFX"] unique_name_in_owner = true stream = ExtResource("7_777nl") diff --git a/Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav b/Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav new file mode 100644 index 0000000000000000000000000000000000000000..d4d1e3a661872865d815d0d32e6c9e508da95dd1 GIT binary patch literal 100110 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 literal 0 HcmV?d00001 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav.import b/Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav.import new file mode 100644 index 00000000..a6940cb1 --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/PlayerHitEnemySFX.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://4u8f1tpgs08b" +path="res://.godot/imported/PlayerHitEnemySFX.wav-7235df5e0b579a1c2793d138bb462425.sample" + +[deps] + +source_file="res://src/audio/sfx/PlayerHitEnemySFX.wav" +dest_files=["res://.godot/imported/PlayerHitEnemySFX.wav-7235df5e0b579a1c2793d138bb462425.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/Zennysoft.Game.Ma/src/game/Game.cs b/Zennysoft.Game.Ma/src/game/Game.cs index 4d730a40..68dc8120 100644 --- a/Zennysoft.Game.Ma/src/game/Game.cs +++ b/Zennysoft.Game.Ma/src/game/Game.cs @@ -320,8 +320,12 @@ public partial class Game : Node3D, IGame Player.HealVT(throwableItem.HealVTAmount); } - await ToSignal(GetTree().CreateTimer(1f), "timeout"); - GameRepo.RemoveItemFromInventory(item); + await ToSignal(GetTree().CreateTimer(0.3f), "timeout"); + + if (item is IStackable stackableItem && stackableItem.Count > 1) + stackableItem.SetCount(stackableItem.Count - 1); + else + GameRepo.RemoveItemFromInventory(item); } public void DropItem(InventoryItem item) diff --git a/Zennysoft.Game.Ma/src/inventory_menu/InventoryLabelSettings.tres b/Zennysoft.Game.Ma/src/inventory_menu/InventoryLabelSettings.tres index 7ff5f0e9..35ce0fd4 100644 --- a/Zennysoft.Game.Ma/src/inventory_menu/InventoryLabelSettings.tres +++ b/Zennysoft.Game.Ma/src/inventory_menu/InventoryLabelSettings.tres @@ -1,6 +1,7 @@ [gd_resource type="LabelSettings" load_steps=2 format=3 uid="uid://bl5xpqyq8vjtv"] -[sub_resource type="SystemFont" id="SystemFont_1ibjc"] +[ext_resource type="FontFile" uid="uid://dit3vylt7hmmx" path="res://src/ui/fonts/FT88-Regular.ttf" id="1_1lnq2"] [resource] -font = SubResource("SystemFont_1ibjc") +font = ExtResource("1_1lnq2") +font_size = 30 diff --git a/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.cs b/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.cs index 941c6b7d..16d24680 100644 --- a/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.cs +++ b/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.cs @@ -2,6 +2,7 @@ using Chickensoft.AutoInject; using Chickensoft.GodotNodeInterfaces; using Chickensoft.Introspection; using Godot; +using Zennysoft.Game.Abstractions; using Zennysoft.Ma.Adapter; namespace Zennysoft.Game.Ma; @@ -32,6 +33,8 @@ public partial class ItemSlot : HBoxContainer, IItemSlot [Node] public Label ItemName { get; set; } = default!; + [Node] public Label ItemCount { get; set; } = default!; + private static LabelSettings ItemFont => GD.Load("res://src/ui/label_settings/MainTextRegular.tres"); private static LabelSettings SelectedItemFont => GD.Load("res://src/ui/label_settings/MainTextFontItalicized.tres"); private static LabelSettings EquippedItemFont => GD.Load("res://src/ui/label_settings/MainTextFontEquipped.tres"); @@ -45,6 +48,12 @@ public partial class ItemSlot : HBoxContainer, IItemSlot Player.EquippedWeapon.Sync += EquipableItem_Sync; Player.EquippedArmor.Sync += EquipableItem_Sync; Player.EquippedAccessory.Sync += EquipableItem_Sync; + + if (Item is IStackable stackableItem) + { + ItemCount.Text = $"{stackableItem.Count:D2}"; + ItemCount.Visible = true; + } } private void EquipableItem_Sync(EquipableItem obj) diff --git a/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.tscn b/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.tscn index 68eb14f5..b4a4714c 100644 --- a/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.tscn +++ b/Zennysoft.Game.Ma/src/inventory_menu/ItemSlot.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=6 format=3 uid="uid://c005nd0m2eim"] +[gd_scene load_steps=7 format=3 uid="uid://c005nd0m2eim"] -[ext_resource type="Script" path="res://src/inventory_menu/ItemSlot.cs" id="1_yttxt"] +[ext_resource type="Script" uid="uid://cglxk7v8hpesn" path="res://src/inventory_menu/ItemSlot.cs" id="1_yttxt"] [ext_resource type="Texture2D" uid="uid://0r1dws4ajhdx" path="res://src/items/accessory/textures/MASK 01.PNG" id="2_7kdbd"] -[ext_resource type="Script" path="res://src/inventory_menu/ItemLabel.cs" id="3_xlgl0"] +[ext_resource type="Script" uid="uid://b0rrpkpsfdga8" path="res://src/inventory_menu/ItemLabel.cs" id="3_xlgl0"] [ext_resource type="FontFile" uid="uid://bohbd123672ea" path="res://src/ui/fonts/FT88-Italic.ttf" id="4_vcxwm"] +[ext_resource type="LabelSettings" uid="uid://bl5xpqyq8vjtv" path="res://src/inventory_menu/InventoryLabelSettings.tres" id="5_a7hko"] [sub_resource type="LabelSettings" id="LabelSettings_lgjx0"] font = ExtResource("4_vcxwm") @@ -39,3 +40,10 @@ label_settings = SubResource("LabelSettings_lgjx0") vertical_alignment = 1 autowrap_mode = 2 script = ExtResource("3_xlgl0") + +[node name="ItemCount" type="Label" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 2 +text = "x99" +label_settings = ExtResource("5_a7hko") diff --git a/Zennysoft.Game.Ma/src/items/Inventory.cs b/Zennysoft.Game.Ma/src/items/Inventory.cs index 90ebd58b..ededc0be 100644 --- a/Zennysoft.Game.Ma/src/items/Inventory.cs +++ b/Zennysoft.Game.Ma/src/items/Inventory.cs @@ -4,6 +4,7 @@ using Chickensoft.Serialization; using Godot; using System.Collections.Generic; using System.Linq; +using Zennysoft.Game.Abstractions; using Zennysoft.Ma.Adapter; namespace Zennysoft.Game.Ma; @@ -52,6 +53,16 @@ public partial class Inventory : Node, IInventory var consumables = listToSort.Where(x => x is ConsumableItem).OrderBy(x => x as ConsumableItem, new ConsumableComparer()); var throwables = listToSort.Where(x => x is ThrowableItem).OrderBy(x => x as ThrowableItem, new ThrowableComparer()); Items = [.. equippedItems, .. weapons, .. armor, .. accessories, .. consumables, .. throwables]; + + var stackableItems = Items.OfType(); + var itemsToStack = stackableItems.GroupBy(x => ((InventoryItem)x).ItemName).Where(x => x.Count() > 1); + foreach (var itemStack in itemsToStack) + { + var firstItem = itemStack.First(); + firstItem.SetCount(itemStack.Count()); + var itemsToRemove = itemStack.Except([firstItem]).Cast(); + Items = [.. Items.Except(itemsToRemove)]; + } } public class WeaponComparer : IComparer diff --git a/Zennysoft.Game.Ma/src/items/effect/EffectItem.cs b/Zennysoft.Game.Ma/src/items/effect/EffectItem.cs index 04dabe24..932cbee8 100644 --- a/Zennysoft.Game.Ma/src/items/effect/EffectItem.cs +++ b/Zennysoft.Game.Ma/src/items/effect/EffectItem.cs @@ -35,5 +35,6 @@ public partial class EffectItem : InventoryItem [Export] [Save("effect_item_stats")] public EffectItemStats Stats { get; set; } = new EffectItemStats(); + public override Texture2D GetTexture() => Stats.Texture; } diff --git a/Zennysoft.Game.Ma/src/items/throwable/ThrowableItem.cs b/Zennysoft.Game.Ma/src/items/throwable/ThrowableItem.cs index 82e7c8e6..3fed3443 100644 --- a/Zennysoft.Game.Ma/src/items/throwable/ThrowableItem.cs +++ b/Zennysoft.Game.Ma/src/items/throwable/ThrowableItem.cs @@ -2,12 +2,13 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Chickensoft.Serialization; using Godot; +using Zennysoft.Game.Abstractions; using Zennysoft.Ma.Adapter; namespace Zennysoft.Game.Ma; [Meta(typeof(IAutoNode)), Id("throwable_item")] -public partial class ThrowableItem : InventoryItem +public partial class ThrowableItem : InventoryItem, IStackable { public override void _Notification(int what) => this.Notify(what); @@ -40,10 +41,14 @@ public partial class ThrowableItem : InventoryItem public void SetDescription(string description) => Stats.Description = description; - public int Count { get; } + [Save("throwable_item_count")] + public int Count { get; private set; } = 1; [Export] [Save("throwable_item_stats")] public ThrowableItemStats Stats { get; set; } + public override Texture2D GetTexture() => Stats.Texture; + + public void SetCount(int count) => Count = count; } diff --git a/Zennysoft.Game.Ma/src/map/dungeon/code/Floor0.cs b/Zennysoft.Game.Ma/src/map/dungeon/code/Floor0.cs index 187f0ea1..b8e19fc5 100644 --- a/Zennysoft.Game.Ma/src/map/dungeon/code/Floor0.cs +++ b/Zennysoft.Game.Ma/src/map/dungeon/code/Floor0.cs @@ -1,4 +1,4 @@ -using Chickensoft.AutoInject; +using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; using System.Collections.Immutable; @@ -22,9 +22,9 @@ public partial class Floor0 : Node3D, IDungeonFloor public override void _Ready() { - Show(); - Exit.AreaEntered += Exit_AreaEntered; - FloorIsLoaded = true; + Show(); + Exit.AreaEntered += Exit_AreaEntered; + FloorIsLoaded = true; } private void Exit_AreaEntered(Area3D area) => ExitReached(); diff --git a/Zennysoft.Game.Ma/src/map/dungeon/floors/Floor00.tscn b/Zennysoft.Game.Ma/src/map/dungeon/floors/Floor00.tscn index d9d2e249..3c87e650 100644 --- a/Zennysoft.Game.Ma/src/map/dungeon/floors/Floor00.tscn +++ b/Zennysoft.Game.Ma/src/map/dungeon/floors/Floor00.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=63 format=4 uid="uid://dl6h1djc27ddl"] +[gd_scene load_steps=64 format=4 uid="uid://dl6h1djc27ddl"] [ext_resource type="Script" uid="uid://c1nhqlem1ew3m" path="res://src/map/dungeon/code/Floor0.cs" id="1_db2o3"] [ext_resource type="Texture2D" uid="uid://b27ksiyfefb33" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_outside_desert.png" id="2_xh2ej"] @@ -17,6 +17,7 @@ [ext_resource type="Texture2D" uid="uid://cururtxtgylxf" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_COLUMN.jpg" id="15_ojbcg"] [ext_resource type="PackedScene" uid="uid://1fl6s352e2ej" path="res://src/items/throwable/ThrowableItem.tscn" id="16_db2o3"] [ext_resource type="Resource" uid="uid://qqg0gdcb8fwg" path="res://src/items/throwable/resources/SpellSignKnowledge.tres" id="17_ntxe5"] +[ext_resource type="Resource" uid="uid://bph8c6by4s047" path="res://src/items/throwable/resources/GeomanticDice.tres" id="18_ntxe5"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3ubi4"] shading_mode = 0 @@ -902,3 +903,19 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.00384, 1.80761, 11.3571) [node name="ThrowableItem" parent="." instance=ExtResource("16_db2o3")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.78811, -3.32789, 0) Stats = ExtResource("17_ntxe5") + +[node name="ThrowableItem2" parent="." instance=ExtResource("16_db2o3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.78811, -3.32789, 0) +Stats = ExtResource("17_ntxe5") + +[node name="ThrowableItem3" parent="." instance=ExtResource("16_db2o3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.78811, -3.32789, 0) +Stats = ExtResource("17_ntxe5") + +[node name="ThrowableItem4" parent="." instance=ExtResource("16_db2o3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.78811, -3.32789, 0) +Stats = ExtResource("17_ntxe5") + +[node name="DifferentThrowable" parent="." instance=ExtResource("16_db2o3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2442, -2.60258, -2.96088) +Stats = ExtResource("18_ntxe5")