From 721a45c6bb315483e77670fbd84481f73ca70201 Mon Sep 17 00:00:00 2001 From: Zenny Date: Thu, 26 Feb 2026 22:56:57 -0800 Subject: [PATCH] Fix some boxes and global positioning --- .../JsonConverters/EnumConverters.cs | 9 ++++++ Zennysoft.Game.Ma/src/enemy/Enemy.cs | 7 +++-- .../src/enemy/behaviors/FleeBehavior.cs | 2 +- .../src/enemy/behaviors/FollowBehavior.cs | 7 +++-- .../src/enemy/behaviors/PatrolBehavior.cs | 3 +- .../enemy_types/03. filth_eater/FilthEater.cs | 3 +- Zennysoft.Game.Ma/src/game/Game.cs | 10 ++++++ Zennysoft.Game.Ma/src/items/Inventory.cs | 11 ++++++- Zennysoft.Game.Ma/src/items/ammo/Ammo.cs | 3 +- Zennysoft.Game.Ma/src/player/Player.tscn | 31 ++++++++++++++++++- .../src/save/MaSaveFileManager.cs | 2 +- .../src/ui/inventory_menu/InventoryMenu.cs | 9 ++++++ 12 files changed, 83 insertions(+), 14 deletions(-) diff --git a/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs b/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs index 78a0567c7..3cf3472d3 100644 --- a/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs +++ b/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs @@ -20,8 +20,17 @@ public partial class BoxItemTagEnumContext : JsonSerializerContext; [JsonSerializable(typeof(ElementType))] public partial class ElementTypeEnumContext : JsonSerializerContext; +[JsonSerializable(typeof(JewelTags))] +public partial class JewelTagsEnumContext : JsonSerializerContext; + [JsonSerializable(typeof(IBaseInventoryItem))] public partial class BaseInventoryItemContext : JsonSerializerContext { +} + +[JsonSerializable(typeof(RescuedItemDatabase))] +public partial class RescuedItemDatabaseContext : JsonSerializerContext +{ + } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/Enemy.cs b/Zennysoft.Game.Ma/src/enemy/Enemy.cs index 0a96ed12e..de85cd319 100644 --- a/Zennysoft.Game.Ma/src/enemy/Enemy.cs +++ b/Zennysoft.Game.Ma/src/enemy/Enemy.cs @@ -229,11 +229,12 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide 0.01) + if (target.DistanceTo(look) > 0.01) LookAt(look, Vector3.Up); } diff --git a/Zennysoft.Game.Ma/src/enemy/behaviors/FleeBehavior.cs b/Zennysoft.Game.Ma/src/enemy/behaviors/FleeBehavior.cs index 33cda195b..4ff8a17f1 100644 --- a/Zennysoft.Game.Ma/src/enemy/behaviors/FleeBehavior.cs +++ b/Zennysoft.Game.Ma/src/enemy/behaviors/FleeBehavior.cs @@ -39,7 +39,7 @@ public partial class FleeBehavior : Node3D, IBehavior var rooms = _game.CurrentFloor.Rooms; var validRooms = new Godot.Collections.Array(rooms.OfType()); var randomRoom = validRooms.PickRandom(); - _navigationAgent.TargetPosition = randomRoom.PlayerSpawn.GlobalPosition; + _navigationAgent.TargetPosition = new Vector3(randomRoom.PlayerSpawn.GlobalPosition.X, GlobalPosition.Y, randomRoom.PlayerSpawn.GlobalPosition.Z); SetPhysicsProcess(true); } diff --git a/Zennysoft.Game.Ma/src/enemy/behaviors/FollowBehavior.cs b/Zennysoft.Game.Ma/src/enemy/behaviors/FollowBehavior.cs index 42a92934f..349696126 100644 --- a/Zennysoft.Game.Ma/src/enemy/behaviors/FollowBehavior.cs +++ b/Zennysoft.Game.Ma/src/enemy/behaviors/FollowBehavior.cs @@ -37,11 +37,11 @@ public partial class FollowBehavior : Node3D, IBehavior SetPhysicsProcess(false); } - private void OnTimeout() => _navigationAgent.TargetPosition = _player.GlobalPosition; + private void OnTimeout() => _navigationAgent.TargetPosition = new Vector3(_player.GlobalPosition.X, GlobalPosition.Y, _player.GlobalPosition.Z); public void StartFollow(NavigationAgent3D navigationAgent) { - _navigationAgent.TargetPosition = _player.GlobalPosition; + _navigationAgent.TargetPosition = new Vector3(_player.GlobalPosition.X, GlobalPosition.Y, _player.GlobalPosition.Z); _thinkTimer.Start(); SetPhysicsProcess(true); } @@ -56,7 +56,8 @@ public partial class FollowBehavior : Node3D, IBehavior { var nextVelocity = _navigationAgent.GetNextPathPosition(); var parent = GetParent() as Node3D; - var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_followSpeed * (float)delta; + var position = new Vector3(parent.GlobalPosition.X, GlobalPosition.Y, parent.GlobalPosition.Z); + var velocity = position.DirectionTo(nextVelocity) * (float)_followSpeed * (float)delta; EmitSignal(SignalName.OnVelocityComputed, velocity); } diff --git a/Zennysoft.Game.Ma/src/enemy/behaviors/PatrolBehavior.cs b/Zennysoft.Game.Ma/src/enemy/behaviors/PatrolBehavior.cs index bd9542e46..663cedda1 100644 --- a/Zennysoft.Game.Ma/src/enemy/behaviors/PatrolBehavior.cs +++ b/Zennysoft.Game.Ma/src/enemy/behaviors/PatrolBehavior.cs @@ -72,7 +72,8 @@ public partial class PatrolBehavior : Node3D, IBehavior { var nextVelocity = _navigationAgent.GetNextPathPosition(); var parent = GetParent() as Node3D; - var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_patrolSpeed * (float)delta; + var position = new Vector3(parent.GlobalPosition.X, GlobalPosition.Y, parent.GlobalPosition.Z); + var velocity = position.DirectionTo(nextVelocity) * (float)_patrolSpeed * (float)delta; EmitSignal(SignalName.OnVelocityComputed, velocity); } diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs index 123adf5f6..5b678a993 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs @@ -42,7 +42,8 @@ public partial class FilthEater : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye public override void PerformAction() { - if (GlobalPosition.DistanceTo(_player.GlobalPosition) > 3) + var enemyPosition = new Vector3(GlobalPosition.X, _player.GlobalPosition.Y, GlobalPosition.Z); + if (enemyPosition.DistanceTo(_player.GlobalPosition) > 3) EnemyModelView.PlaySecondaryAttackAnimation(); else EnemyModelView.PlayPrimaryAttackAnimation(); diff --git a/Zennysoft.Game.Ma/src/game/Game.cs b/Zennysoft.Game.Ma/src/game/Game.cs index 3cdfc45fd..7dd810e69 100644 --- a/Zennysoft.Game.Ma/src/game/Game.cs +++ b/Zennysoft.Game.Ma/src/game/Game.cs @@ -468,6 +468,16 @@ public partial class Game : Node3D, IGame case ItemTag.DropTo1HPAndGainRareItem: _effectService.DropTo1HPAndGainRareItem(); break; + case ItemTag.TradeOneRandomItem: + var itemsWithoutBox = _player.Inventory.Items.Where(x => x != boxItem).ToList(); + var rng = new RandomNumberGenerator(); + rng.Randomize(); + var index = rng.RandiRange(0, itemsWithoutBox.Count - 1); + var randomItem = itemsWithoutBox[index]; + _player.Inventory.Remove(randomItem); + var newItem = _effectService.GetRandomItemOfType(); + _player.Inventory.TryAdd(newItem); + break; case ItemTag.TradeAllRandomItems: var newInventory = _effectService.TradeAllRandomItems(boxItem); _player.Inventory.Items.Clear(); diff --git a/Zennysoft.Game.Ma/src/items/Inventory.cs b/Zennysoft.Game.Ma/src/items/Inventory.cs index c5b682008..f046ff9da 100644 --- a/Zennysoft.Game.Ma/src/items/Inventory.cs +++ b/Zennysoft.Game.Ma/src/items/Inventory.cs @@ -93,7 +93,8 @@ public partial class Inventory : Node, IInventory var effectItems = listToSort.Where(x => x is EffectItem).OrderBy(x => x as EffectItem, new EffectComparer()); var jewelItems = listToSort.Where(x => x is Jewel).OrderBy(x => x as Jewel, new JewelComparer()); var setItems = listToSort.Where(x => x is Plastique).OrderBy(x => x as Plastique, new SetItemComparer()); - Items = [.. equippedItems, .. weapons, .. armor, .. accessories, .. ammo, .. consumables, .. throwables, .. effectItems, .. jewelItems, .. setItems]; + var boxItems = listToSort.Where(x => x is BoxItem).OrderBy(x => x as BoxItem, new BoxItemComparer()); + Items = [.. equippedItems, .. weapons, .. armor, .. accessories, .. ammo, .. consumables, .. throwables, .. effectItems, .. jewelItems, ..boxItems, .. setItems]; var stackableItems = Items.OfType(); var itemsToStack = stackableItems.GroupBy(x => ((IBaseInventoryItem)x).ItemName).Where(x => x.Count() > 1); @@ -163,6 +164,14 @@ public partial class Inventory : Node, IInventory } } + public class BoxItemComparer : IComparer + { + public int Compare(BoxItem x, BoxItem y) + { + return x.ItemName.CompareTo(y.ItemName); + } + } + public class ConsumableComparer : IComparer { public int Compare(ConsumableItem x, ConsumableItem y) diff --git a/Zennysoft.Game.Ma/src/items/ammo/Ammo.cs b/Zennysoft.Game.Ma/src/items/ammo/Ammo.cs index 3aa884006..f2349d74a 100644 --- a/Zennysoft.Game.Ma/src/items/ammo/Ammo.cs +++ b/Zennysoft.Game.Ma/src/items/ammo/Ammo.cs @@ -21,7 +21,6 @@ public partial class Ammo : Node3D, IEquipableItem, IStackable _sprite.Texture = Stats.Texture; } - public string ItemName => Stats.Name; public string FlavorText => Stats.FlavorText; @@ -39,7 +38,7 @@ public partial class Ammo : Node3D, IEquipableItem, IStackable public Texture2D GetTexture() => Stats.Texture; [Save("ammo_item_count")] - public AutoProp Count { get; private set; } + public AutoProp Count { get; private set; } = new AutoProp(3); public void SetCount(int count) => Count.OnNext(count); diff --git a/Zennysoft.Game.Ma/src/player/Player.tscn b/Zennysoft.Game.Ma/src/player/Player.tscn index bbcd217ac..b92c43a20 100644 --- a/Zennysoft.Game.Ma/src/player/Player.tscn +++ b/Zennysoft.Game.Ma/src/player/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=1591 format=3 uid="uid://cfecvvav8kkp6"] +[gd_scene load_steps=1596 format=3 uid="uid://cfecvvav8kkp6"] [ext_resource type="Script" uid="uid://yxmiqy7i0t7r" path="res://src/player/Player.cs" id="1_xcol5"] [ext_resource type="PackedScene" uid="uid://dqvlemme0iwa" path="res://src/camera/ShakeCamera.tscn" id="2_jtmj1"] @@ -542,6 +542,7 @@ [ext_resource type="Texture2D" uid="uid://cl2woq73pn2ab" path="res://src/vfx/Weapon Strikes/hydric_attack/tile027.png" id="527_nilvr"] [ext_resource type="Texture2D" uid="uid://d3e8jnj7q6sdk" path="res://src/vfx/Weapon Strikes/hydric_attack/tile028.png" id="528_ynv1q"] [ext_resource type="Texture2D" uid="uid://def40t23awj4c" path="res://src/vfx/Weapon Strikes/hydric_attack/tile029.png" id="529_3e7br"] +[ext_resource type="Script" uid="uid://ctshiyffvt4y5" path="res://src/system/AttackDataResource.cs" id="543_cqsul"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_dw45s"] radius = 1.0 @@ -10442,6 +10443,30 @@ animations = [{ "speed": 24.0 }] +[sub_resource type="Resource" id="Resource_w5dir"] +script = ExtResource("543_cqsul") +Damage = 25 +ElementType = 4 +metadata/_custom_type_script = "uid://ctshiyffvt4y5" + +[sub_resource type="Resource" id="Resource_7rguc"] +script = ExtResource("543_cqsul") +Damage = 25 +ElementType = 1 +metadata/_custom_type_script = "uid://ctshiyffvt4y5" + +[sub_resource type="Resource" id="Resource_cqsul"] +script = ExtResource("543_cqsul") +Damage = 25 +ElementType = 3 +metadata/_custom_type_script = "uid://ctshiyffvt4y5" + +[sub_resource type="Resource" id="Resource_ajbah"] +script = ExtResource("543_cqsul") +Damage = 99 +ElementType = 0 +metadata/_custom_type_script = "uid://ctshiyffvt4y5" + [node name="Player" type="CharacterBody3D"] collision_layer = 802 collision_mask = 775 @@ -10656,16 +10681,20 @@ stream = ExtResource("6_v7rlw") [node name="FireReactor" parent="Projectiles" instance=ExtResource("509_14f5p")] unique_name_in_owner = true +AttackData = SubResource("Resource_w5dir") [node name="AirReactor" parent="Projectiles" instance=ExtResource("510_k6pkx")] unique_name_in_owner = true +AttackData = SubResource("Resource_7rguc") [node name="WaterReactor" parent="Projectiles" instance=ExtResource("511_sq73w")] unique_name_in_owner = true +AttackData = SubResource("Resource_cqsul") [node name="PersuaderBullet" parent="Projectiles" instance=ExtResource("512_k6pkx")] unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.125) +AttackData = SubResource("Resource_ajbah") [node name="BulletSFX" type="AudioStreamPlayer3D" parent="Projectiles/PersuaderBullet/Bullet/ProjectileHitbox" index="1"] process_mode = 3 diff --git a/Zennysoft.Game.Ma/src/save/MaSaveFileManager.cs b/Zennysoft.Game.Ma/src/save/MaSaveFileManager.cs index c06fe29a9..57ebea6ae 100644 --- a/Zennysoft.Game.Ma/src/save/MaSaveFileManager.cs +++ b/Zennysoft.Game.Ma/src/save/MaSaveFileManager.cs @@ -22,7 +22,7 @@ public sealed class MaSaveFileManager : IMaSaveFileManager public MaSaveFileManager() { _saveFileManager = new SaveFileManager(new FileSystem()); - _converters = [WeaponTagEnumContext.Default, ItemTagEnumContext.Default, ElementTypeEnumContext.Default, AccessoryTagEnumContext.Default, UsableItemTagEnumContext.Default, BoxItemTagEnumContext.Default, BaseInventoryItemContext.Default]; + _converters = [WeaponTagEnumContext.Default, ItemTagEnumContext.Default, ElementTypeEnumContext.Default, AccessoryTagEnumContext.Default, UsableItemTagEnumContext.Default, BoxItemTagEnumContext.Default, JewelTagsEnumContext.Default, BaseInventoryItemContext.Default, RescuedItemDatabaseContext.Default]; } public async Task Save(T gameData) diff --git a/Zennysoft.Game.Ma/src/ui/inventory_menu/InventoryMenu.cs b/Zennysoft.Game.Ma/src/ui/inventory_menu/InventoryMenu.cs index 2e20c32b9..e97c4ef38 100644 --- a/Zennysoft.Game.Ma/src/ui/inventory_menu/InventoryMenu.cs +++ b/Zennysoft.Game.Ma/src/ui/inventory_menu/InventoryMenu.cs @@ -85,6 +85,15 @@ public partial class InventoryMenu : Control, IInventoryMenu SfxDatabase.Instance.Play(SoundEffect.MoveUI); if (Input.IsActionJustPressed(GameInputs.Interact)) SfxDatabase.Instance.Play(SoundEffect.CancelUI); + if (Input.IsActionJustPressed(GameInputs.InventorySort)) + { + var sorted = _player.Inventory.Sort(_player.EquipmentComponent.EquippedWeapon.Value, _player.EquipmentComponent.EquippedArmor.Value, _player.EquipmentComponent.EquippedAccessory.Value, _player.EquipmentComponent.EquippedAmmo.Value); + if (sorted) + { + ResetInventoryState(); + SfxDatabase.Instance.Play(SoundEffect.SortInventory); + } + } } private void ActionPanel_AugmentMenuRequested()