From 990da695f2add6b13ddc9549aa8ae0c2a4258e02 Mon Sep 17 00:00:00 2001 From: Zenny Date: Mon, 3 Mar 2025 01:48:56 -0800 Subject: [PATCH] Add Effect items, implement teleport enemies to current room --- src/enemy/Enemy.cs | 1 - src/items/effect/EffectItem.cs | 91 ++++++++++++++++++ src/items/effect/EffectItem.cs.uid | 1 + src/items/effect/EffectItem.tscn | 27 ++++++ src/items/effect/EffectItemStats.cs | 10 ++ src/items/effect/EffectItemStats.cs.uid | 1 + src/items/effect/resources/DevicRecall.tres | 18 ++++ src/items/effect/textures/entropic seal.PNG | Bin 0 -> 7081 bytes .../effect/textures/entropic seal.PNG.import | 34 +++++++ src/items/throwable/ThrowableItem.cs | 2 - src/items/throwable/ThrowableItemTag.cs | 18 ++-- src/map/dungeon/floors/Floor00.tscn | 12 +-- 12 files changed, 195 insertions(+), 20 deletions(-) create mode 100644 src/items/effect/EffectItem.cs create mode 100644 src/items/effect/EffectItem.cs.uid create mode 100644 src/items/effect/EffectItem.tscn create mode 100644 src/items/effect/EffectItemStats.cs create mode 100644 src/items/effect/EffectItemStats.cs.uid create mode 100644 src/items/effect/resources/DevicRecall.tres create mode 100644 src/items/effect/textures/entropic seal.PNG create mode 100644 src/items/effect/textures/entropic seal.PNG.import diff --git a/src/enemy/Enemy.cs b/src/enemy/Enemy.cs index c63cddb2..a178d588 100644 --- a/src/enemy/Enemy.cs +++ b/src/enemy/Enemy.cs @@ -183,7 +183,6 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide if (enemiesInCurrentRoom.Contains(this)) return room; } - return null; } diff --git a/src/items/effect/EffectItem.cs b/src/items/effect/EffectItem.cs new file mode 100644 index 00000000..359e2851 --- /dev/null +++ b/src/items/effect/EffectItem.cs @@ -0,0 +1,91 @@ +using Chickensoft.AutoInject; +using Chickensoft.Introspection; +using Godot; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace GameJamDungeon; + +[Meta(typeof(IAutoNode))] +public partial class EffectItem : Node3D, IUsableItem +{ + public override void _Notification(int what) => this.Notify(what); + + [Dependency] public IGame Game => this.DependOn(); + + [Dependency] public IPlayer Player => this.DependOn(); + + [Export] + private EffectItemStats _effectItemStats { get; set; } + + [Node] private Sprite3D Sprite { get; set; } = new Sprite3D(); + + [Node] private Area3D Pickup { get; set; } = default!; + + public Guid ID => Guid.NewGuid(); + + public string ItemName => _effectItemStats.Name; + + public string Description => _effectItemStats.Description; + + public float SpawnRate => _effectItemStats.SpawnRate; + + public Texture2D GetTexture() => _effectItemStats.Texture; + + public double ThrowDamage => _effectItemStats.ThrowDamage; + + public float ThrowSpeed => _effectItemStats.ThrowSpeed; + + public void Use() + { + if (_effectItemStats.UsableItemTags.Contains(UsableItemTag.DoubleEXP)) + Game.DoubleEXP(TimeSpan.FromSeconds(30)); + if (_effectItemStats.UsableItemTags.Contains(UsableItemTag.TeleportAllEnemiesToRoom)) + TeleportEnemiesToCurrentRoom(); + } + + public void SetItemStats(InventoryItemStats inventoryItemStats) + { + _effectItemStats = (EffectItemStats)inventoryItemStats; + } + + public void OnReady() + { + Pickup.BodyEntered += OnEntered; + Sprite.Texture = _effectItemStats.Texture; + } + + public void OnEntered(Node3D body) + { + var isAdded = Player.Inventory.TryAdd(this); + if (isAdded) + QueueFree(); + } + + private void TeleportEnemiesToCurrentRoom() + { + var currentFloor = Game.CurrentFloor; + var rooms = currentFloor.Rooms; + var currentRoom = Player.GetCurrentRoom(); + + if (currentRoom is not MonsterRoom) + return; + + var validRooms = rooms.OfType().ToList(); + if (currentRoom is MonsterRoom monsterRoom) + validRooms.Remove(monsterRoom); + + var currentMonsterRoom = (MonsterRoom)currentRoom; + + var enemyList = validRooms.SelectMany(x => x.GetEnemiesInCurrentRoom()); + + foreach (var enemy in enemyList) + { + var spawnPoints = currentMonsterRoom.EnemySpawnPoints.GetChildren().OfType().ToList(); + var spawnPointsGodotCollection = new Godot.Collections.Array(spawnPoints); + var randomSpawnPoint = spawnPointsGodotCollection.PickRandom(); + enemy.SetEnemyGlobalPosition(randomSpawnPoint.GlobalPosition); + } + } +} diff --git a/src/items/effect/EffectItem.cs.uid b/src/items/effect/EffectItem.cs.uid new file mode 100644 index 00000000..a60e153e --- /dev/null +++ b/src/items/effect/EffectItem.cs.uid @@ -0,0 +1 @@ +uid://bl16bjcbosq5j diff --git a/src/items/effect/EffectItem.tscn b/src/items/effect/EffectItem.tscn new file mode 100644 index 00000000..3bbb2f2c --- /dev/null +++ b/src/items/effect/EffectItem.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=3 format=3 uid="uid://d0pl1n1jf77jm"] + +[ext_resource type="Script" uid="uid://bl16bjcbosq5j" path="res://src/items/effect/EffectItem.cs" id="1_yw2rj"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_03cqg"] +size = Vector3(0.778381, 0.929947, 0.731567) + +[node name="EffectItem" type="Node3D"] +script = ExtResource("1_yw2rj") + +[node name="Pickup" type="Area3D" parent="."] +unique_name_in_owner = true +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Pickup"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0600509, 0.26725, 0.180481) +shape = SubResource("BoxShape3D_03cqg") + +[node name="Sprite" type="Sprite3D" parent="Pickup"] +unique_name_in_owner = true +transform = Transform3D(0.999973, 0.00489444, -0.00548299, -0.00488109, 0.999985, 0.00244357, 0.00549488, -0.00241672, 0.999982, 0, 0, 0) +pixel_size = 0.0005 +billboard = 2 +shaded = true +texture_filter = 0 +render_priority = 100 diff --git a/src/items/effect/EffectItemStats.cs b/src/items/effect/EffectItemStats.cs new file mode 100644 index 00000000..8a7a171c --- /dev/null +++ b/src/items/effect/EffectItemStats.cs @@ -0,0 +1,10 @@ +using Godot; + +namespace GameJamDungeon; + +[GlobalClass] +public partial class EffectItemStats : InventoryItemStats +{ + [Export] + public Godot.Collections.Array UsableItemTags { get; set; } = new Godot.Collections.Array(); +} diff --git a/src/items/effect/EffectItemStats.cs.uid b/src/items/effect/EffectItemStats.cs.uid new file mode 100644 index 00000000..8f75abc8 --- /dev/null +++ b/src/items/effect/EffectItemStats.cs.uid @@ -0,0 +1 @@ +uid://b5w4iw4iqmxtn diff --git a/src/items/effect/resources/DevicRecall.tres b/src/items/effect/resources/DevicRecall.tres new file mode 100644 index 00000000..0f98458c --- /dev/null +++ b/src/items/effect/resources/DevicRecall.tres @@ -0,0 +1,18 @@ +[gd_resource type="Resource" script_class="EffectItemStats" load_steps=3 format=3 uid="uid://bptg6eybj5dxk"] + +[ext_resource type="Script" uid="uid://b5w4iw4iqmxtn" path="res://src/items/effect/EffectItemStats.cs" id="1_0uaie"] +[ext_resource type="Texture2D" uid="uid://c7v5pm32sedkg" path="res://src/items/effect/textures/entropic seal.PNG" id="1_j462p"] + +[resource] +script = ExtResource("1_0uaie") +UsableItemTags = Array[int]([4]) +Name = "Devic Recall" +Description = "Teleports all enemies to current room." +Texture = ExtResource("1_j462p") +SpawnRate = 0.5 +ThrowSpeed = 12.0 +HealHPAmount = 0 +HealVTAmount = 0 +ThrowDamage = 5 +ItemTags = Array[int]([]) +metadata/_custom_type_script = "uid://b5w4iw4iqmxtn" diff --git a/src/items/effect/textures/entropic seal.PNG b/src/items/effect/textures/entropic seal.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bbdd1143d70cecbd2474c2929548ae23df212b95 GIT binary patch literal 7081 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 literal 0 HcmV?d00001 diff --git a/src/items/effect/textures/entropic seal.PNG.import b/src/items/effect/textures/entropic seal.PNG.import new file mode 100644 index 00000000..91844f19 --- /dev/null +++ b/src/items/effect/textures/entropic seal.PNG.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7v5pm32sedkg" +path="res://.godot/imported/entropic seal.PNG-b7de800370bf83e9e4b096c62532ef11.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/items/effect/textures/entropic seal.PNG" +dest_files=["res://.godot/imported/entropic seal.PNG-b7de800370bf83e9e4b096c62532ef11.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/src/items/throwable/ThrowableItem.cs b/src/items/throwable/ThrowableItem.cs index 1a35ce85..09f9ebfa 100644 --- a/src/items/throwable/ThrowableItem.cs +++ b/src/items/throwable/ThrowableItem.cs @@ -68,8 +68,6 @@ public partial class ThrowableItem : Node3D, IUsableItem if (_throwableItemStats.HealVTAmount > 0) Player.HealVT(_throwableItemStats.HealVTAmount); - if (_throwableItemStats.UsableItemTags.Contains(UsableItemTag.DoubleEXP)) - Game.DoubleEXP(TimeSpan.FromSeconds(30)); if (_throwableItemStats.ThrowableItemTags.Contains(ThrowableItemTag.TeleportToRandomLocation)) TeleportToRandomRoom(Player); diff --git a/src/items/throwable/ThrowableItemTag.cs b/src/items/throwable/ThrowableItemTag.cs index 51d3369f..ccb617b6 100644 --- a/src/items/throwable/ThrowableItemTag.cs +++ b/src/items/throwable/ThrowableItemTag.cs @@ -13,17 +13,6 @@ public enum UsableItemTag DoubleEXP, IdentifyAllItemsCostHP, BriefImmunity, -} - -public enum EnhancingItemTag -{ - Add1ATK, - Add1DEF, - RaiseLevelBy1, -} - -public enum EffectorItemTag -{ SwapHPandVTWithEntitiesInRoom, TeleportAllEnemiesToRoom, TurnAllEnemiesIntoHealingItem, @@ -33,6 +22,13 @@ public enum EffectorItemTag RandomEffect, } +public enum EnhancingItemTag +{ + Add1ATK, + Add1DEF, + RaiseLevelBy1, +} + public enum BoxItemTag { RandomNewItem, diff --git a/src/map/dungeon/floors/Floor00.tscn b/src/map/dungeon/floors/Floor00.tscn index 7f685167..9040746b 100644 --- a/src/map/dungeon/floors/Floor00.tscn +++ b/src/map/dungeon/floors/Floor00.tscn @@ -15,8 +15,8 @@ [ext_resource type="Texture2D" uid="uid://dyufabjcwlago" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_HAND_CYCLE_MOTIF.png" id="13_1i307"] [ext_resource type="Texture2D" uid="uid://4k6vtn4oip5f" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_TILE4.png" id="14_qqc7i"] [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://lo37qfyxlhx1" path="res://src/items/throwable/resources/Gospel of Dimension.tres" id="17_db2o3"] +[ext_resource type="PackedScene" uid="uid://d0pl1n1jf77jm" path="res://src/items/effect/EffectItem.tscn" id="16_aqomv"] +[ext_resource type="Resource" uid="uid://bptg6eybj5dxk" path="res://src/items/effect/resources/DevicRecall.tres" id="17_db2o3"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3ubi4"] shading_mode = 0 @@ -857,10 +857,6 @@ libraries = { transform = Transform3D(0.857993, 0, 0.513661, 0, 1, 0, -0.513661, 0, 0.857993, -12.7574, -2.40091, 0.250378) shape = SubResource("BoxShape3D_xh2ej") -[node name="ThrowableItem" parent="." instance=ExtResource("16_db2o3")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.469, -2.5, 0) -_throwableItemStats = ExtResource("17_db2o3") - [node name="CSGBox3D" type="CSGBox3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2.22379, 0) size = Vector3(1, 1.7, 1) @@ -891,3 +887,7 @@ collision_mask = 8 [node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 149.05, -4.02862, -1.76389) shape = SubResource("BoxShape3D_ntxe5") + +[node name="EffectItem" parent="." instance=ExtResource("16_aqomv")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.65239, -2.58967, -1.14642) +_effectItemStats = ExtResource("17_db2o3")