diff --git a/src/item_rescue/RescuedItems.cs b/src/item_rescue/RescuedItems.cs index 488f7533..c24b0e00 100644 --- a/src/item_rescue/RescuedItems.cs +++ b/src/item_rescue/RescuedItems.cs @@ -2,14 +2,42 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using GameJamDungeon; using Godot; +using System.Collections.Generic; +using System.Linq; [Meta(typeof(IAutoNode))] -public partial class RescuedItems : Marker3D +public partial class RescuedItems : Node3D { public override void _Notification(int what) => this.Notify(what); [Dependency] public IGame Game => this.DependOn(); + [Node] public Marker3D Spawn1 { get; set; } = default!; + [Node] public Marker3D Spawn2 { get; set; } = default!; + [Node] public Marker3D Spawn3 { get; set; } = default!; + [Node] public Marker3D Spawn4 { get; set; } = default!; + [Node] public Marker3D Spawn5 { get; set; } = default!; + [Node] public Marker3D Spawn6 { get; set; } = default!; + [Node] public Marker3D Spawn7 { get; set; } = default!; + [Node] public Marker3D Spawn8 { get; set; } = default!; + + private List SpawnLocations; + + public void Initialize() + { + SpawnLocations = new List() + { + Spawn1, + Spawn2, + Spawn3, + Spawn4, + Spawn5, + Spawn6, + Spawn7, + Spawn8 + }; + } + public void SpawnRescuedItems() { foreach (var item in Game.RescuedItems.Items) @@ -17,8 +45,9 @@ public partial class RescuedItems : Marker3D var droppedScene = GD.Load("res://src/items/dropped/DroppedItem.tscn"); var dropped = droppedScene.Instantiate(); dropped.Item = item; - dropped.GlobalPosition = GlobalPosition; - AddChild(dropped); + SpawnLocations.First().AddChild(dropped); + dropped.GlobalPosition = SpawnLocations.First().GlobalPosition; + SpawnLocations.Remove(SpawnLocations.First()); } Game.RescuedItems.Items.Clear(); diff --git a/src/item_rescue/RescuedItems.tscn b/src/item_rescue/RescuedItems.tscn index d7626a86..73eb23d4 100644 --- a/src/item_rescue/RescuedItems.tscn +++ b/src/item_rescue/RescuedItems.tscn @@ -2,5 +2,37 @@ [ext_resource type="Script" path="res://src/item_rescue/RescuedItems.cs" id="1_m08l5"] -[node name="Rescued Items" type="Marker3D"] +[node name="Rescued Items" type="Node3D"] script = ExtResource("1_m08l5") + +[node name="Spawn1" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1) + +[node name="Spawn2" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0) + +[node name="Spawn3" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0) + +[node name="Spawn4" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1) + +[node name="Spawn5" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1) + +[node name="Spawn6" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, -1) + +[node name="Spawn7" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, -1) + +[node name="Spawn8" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 1) diff --git a/src/items/dropped/DroppedItem.cs b/src/items/dropped/DroppedItem.cs index eb96096b..07006771 100644 --- a/src/items/dropped/DroppedItem.cs +++ b/src/items/dropped/DroppedItem.cs @@ -25,14 +25,15 @@ namespace GameJamDungeon public void OnResolved() { + ContactMonitor = true; BodyEntered += DroppedItem_BodyEntered; - GlobalPosition = Game.Player.GlobalPosition + Vector3.Up; Sprite.Texture = Item.Info.Texture; - AddCollisionExceptionWith((Node)Game.Player); } public async void Drop() { + AddCollisionExceptionWith((Node)Game.Player); + GlobalPosition = Game.Player.GlobalPosition + Vector3.Up; ApplyCentralImpulse(-Game.Player.GlobalBasis.Z.Normalized() * 5.0f); await ToSignal(GetTree().CreateTimer(1.5), "timeout"); RemoveCollisionExceptionWith((Node)Game.Player);