Fix some boxes and global positioning
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
}
|
||||
@@ -229,11 +229,12 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
|
||||
|
||||
protected void LookAtTarget(Vector3 targetPosition)
|
||||
{
|
||||
if (GlobalPosition.IsEqualApprox(targetPosition))
|
||||
var target = new Vector3(GlobalPosition.X, targetPosition.Y, GlobalPosition.Z);
|
||||
if (target.IsEqualApprox(targetPosition))
|
||||
return;
|
||||
var lookDirection = GlobalPosition - targetPosition;
|
||||
var lookDirection = target - targetPosition;
|
||||
var look = new Vector3(lookDirection.X, GlobalPosition.Y, lookDirection.Z);
|
||||
if (GlobalPosition.DistanceTo(look) > 0.01)
|
||||
if (target.DistanceTo(look) > 0.01)
|
||||
LookAt(look, Vector3.Up);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ public partial class FleeBehavior : Node3D, IBehavior
|
||||
var rooms = _game.CurrentFloor.Rooms;
|
||||
var validRooms = new Godot.Collections.Array<MonsterRoom>(rooms.OfType<MonsterRoom>());
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -468,6 +468,16 @@ public partial class Game : Node3D, IGame
|
||||
case ItemTag.DropTo1HPAndGainRareItem:
|
||||
_effectService.DropTo1HPAndGainRareItem<IBaseInventoryItem>();
|
||||
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<IBaseInventoryItem>();
|
||||
_player.Inventory.TryAdd(newItem);
|
||||
break;
|
||||
case ItemTag.TradeAllRandomItems:
|
||||
var newInventory = _effectService.TradeAllRandomItems(boxItem);
|
||||
_player.Inventory.Items.Clear();
|
||||
|
||||
@@ -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<IStackable>();
|
||||
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<BoxItem>
|
||||
{
|
||||
public int Compare(BoxItem x, BoxItem y)
|
||||
{
|
||||
return x.ItemName.CompareTo(y.ItemName);
|
||||
}
|
||||
}
|
||||
|
||||
public class ConsumableComparer : IComparer<ConsumableItem>
|
||||
{
|
||||
public int Compare(ConsumableItem x, ConsumableItem y)
|
||||
|
||||
@@ -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<int> Count { get; private set; }
|
||||
public AutoProp<int> Count { get; private set; } = new AutoProp<int>(3);
|
||||
|
||||
public void SetCount(int count) => Count.OnNext(count);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>(T gameData)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user