Implementation of saving inventory items (had to resturcture texture loading)

This commit is contained in:
2025-03-04 22:21:18 -08:00
parent d35e81a9a8
commit 8cc6d85265
55 changed files with 797 additions and 727 deletions

View File

@@ -1,146 +1,37 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System;
using System.Collections.Immutable;
using System.Linq;
namespace GameJamDungeon;
[Meta(typeof(IAutoNode))]
public partial class ThrowableItem : Node3D, IUsableItem
[Meta, Id("throwable_item")]
public partial class ThrowableItem : InventoryItem
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] public IGame Game => this.DependOn<IGame>();
[Dependency] public IPlayer Player => this.DependOn<IPlayer>();
public Guid ID => Guid.NewGuid();
public string ItemName => _throwableItemStats.Name;
public string Description => _throwableItemStats.Description;
public float SpawnRate => _throwableItemStats.SpawnRate;
public Texture2D GetTexture() => _throwableItemStats.Texture;
public double ThrowDamage => _throwableItemStats.ThrowDamage;
public float ThrowSpeed => _throwableItemStats.ThrowSpeed;
public ElementType ElementType => _throwableItemStats.ElementType;
public ImmutableList<ThrowableItemTag> ThrowableItemTags => [.. _throwableItemStats.ThrowableItemTags];
public int Count { get; }
public void SetItemStats(InventoryItemStats inventoryItemStats)
{
_throwableItemStats = (ThrowableItemStats)inventoryItemStats;
}
public void OnEntered(Node3D body)
{
var isAdded = Player.Inventory.TryAdd(this);
if (isAdded)
QueueFree();
}
[Export]
private ThrowableItemStats _throwableItemStats { get; set; }
[Node] private Sprite3D Sprite { get; set; } = new Sprite3D();
public override string ItemName => _throwableItemStats.Name;
[Node] private Area3D Pickup { get; set; } = default!;
public override string Description => _throwableItemStats.Description;
public void OnResolved()
{
Pickup.BodyEntered += OnEntered;
Sprite.Texture = _throwableItemStats.Texture;
}
public override float SpawnRate => _throwableItemStats.SpawnRate;
public void Use()
{
if (_throwableItemStats.HealHPAmount > 0)
Player.HealHP(_throwableItemStats.HealHPAmount);
if (_throwableItemStats.HealVTAmount > 0)
Player.HealVT(_throwableItemStats.HealVTAmount);
public override double ThrowDamage => _throwableItemStats.ThrowDamage;
if (_throwableItemStats.ThrowableItemTags.Contains(ThrowableItemTag.TeleportToRandomLocation))
TeleportToRandomRoom(Player);
public override float ThrowSpeed => _throwableItemStats.ThrowSpeed;
if (_throwableItemStats.ThrowableItemTags.Contains(ThrowableItemTag.CanChangeAffinity))
ChangeAffinity();
public ElementType ElementType => _throwableItemStats.ElementType;
if (_throwableItemStats.ThrowableItemTags.Contains(ThrowableItemTag.WarpToExitIfFound))
WarpToExit(Player);
}
public ThrowableItemTag ThrowableItemTag => _throwableItemStats.ThrowableItemTag;
public void TeleportToRandomRoom(IEnemy enemy)
{
var currentFloor = Game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = enemy.GetCurrentRoom();
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
public int HealHPAmount => _throwableItemStats.HealHPAmount;
if (validRooms.Count == 0)
return;
public int HealVTAmount => _throwableItemStats.HealVTAmount;
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var spawnPoints = randomRoom.EnemySpawnPoints.GetChildren().OfType<Marker3D>().ToList();
var spawnPointsGodotCollection = new Godot.Collections.Array<Marker3D>(spawnPoints);
var randomSpawnPoint = spawnPointsGodotCollection.PickRandom();
public void SetElementType(ElementType elementType) => _throwableItemStats.ElementType = elementType;
enemy.SetEnemyGlobalPosition(randomSpawnPoint.GlobalPosition);
}
public void SetDescription(string description) => _throwableItemStats.Description = description;
private void TeleportToRandomRoom(IPlayer player)
{
var currentFloor = Game.CurrentFloor;
var rooms = currentFloor.Rooms;
public int Count { get; }
var currentRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
if (validRooms.Count == 0)
return;
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var spawnPoint = randomRoom.PlayerSpawn;
Game.ToggleInventory();
player.TeleportPlayer(spawnPoint.GlobalPosition);
}
private void ChangeAffinity()
{
var maximumElements = Enum.GetNames(typeof(ElementType)).Length;
_throwableItemStats.ElementType = _throwableItemStats.ElementType + 1 % maximumElements;
// TODO: Make this an inventory animation to cycle through elements.
_throwableItemStats.Description =
$"Inflicts {_throwableItemStats.ElementType} damage when thrown." +
$"{System.Environment.NewLine}Use item to change Affinity.";
}
private void WarpToExit(IPlayer player)
{
var exitRoom = Game.CurrentFloor.Rooms.OfType<ExitRoom>().Single();
if (exitRoom.PlayerDiscoveredRoom)
player.TeleportPlayer(exitRoom.PlayerSpawn.GlobalPosition);
}
public void WarpToExit(IEnemy enemy)
{
var exitRoom = Game.CurrentFloor.Rooms.OfType<ExitRoom>().Single();
enemy.SetEnemyGlobalPosition(exitRoom.PlayerSpawn.GlobalPosition);
}
public override InventoryItemStats ItemStats { get => _throwableItemStats; set => _throwableItemStats = (ThrowableItemStats)value; }
}