basic Party Manager

This commit is contained in:
anonoe 2026-02-15 17:08:46 +01:00
parent c141e6a169
commit 6f1d5ea681
Signed by: anonoe
SSH key fingerprint: SHA256:OnAs6gNQelOnDiY5tBpDYKQiuTgBvnmIdMo5P09cdqg
10 changed files with 158 additions and 8 deletions

View file

@ -73,6 +73,11 @@ capture_mash={
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(389, 19),"global_position":Vector2(398, 67),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(389, 19),"global_position":Vector2(398, 67),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
] ]
} }
battle_attack={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
]
}
[physics] [physics]

View file

@ -10,6 +10,8 @@
[ext_resource type="Script" uid="uid://boip0mbmeqmhk" path="res://scripts/core/GameRoot.cs" id="8_jlsqs"] [ext_resource type="Script" uid="uid://boip0mbmeqmhk" path="res://scripts/core/GameRoot.cs" id="8_jlsqs"]
[ext_resource type="PackedScene" uid="uid://bffdg1ki45e4e" path="res://ui/CaptureUI.tscn" id="9_lhr70"] [ext_resource type="PackedScene" uid="uid://bffdg1ki45e4e" path="res://ui/CaptureUI.tscn" id="9_lhr70"]
[ext_resource type="Script" uid="uid://bl7xagtutg20w" path="res://scripts/core/CaptureController.cs" id="10_wp0k4"] [ext_resource type="Script" uid="uid://bl7xagtutg20w" path="res://scripts/core/CaptureController.cs" id="10_wp0k4"]
[ext_resource type="Script" uid="uid://cbqbnpj2451y4" path="res://scripts/core/PartyManager.cs" id="11_wp0k4"]
[ext_resource type="PackedScene" uid="uid://jfswyfq1eswl" path="res://ui/PartyHUD.tscn" id="12_bjd11"]
[node name="Main" type="Node2D" unique_id=1194367579] [node name="Main" type="Node2D" unique_id=1194367579]
@ -39,7 +41,15 @@ script = ExtResource("6_c01mt")
script = ExtResource("8_jlsqs") script = ExtResource("8_jlsqs")
[node name="CaptureUi" parent="." unique_id=1650401906 instance=ExtResource("9_lhr70")] [node name="CaptureUi" parent="." unique_id=1650401906 instance=ExtResource("9_lhr70")]
PartyManagerPath = NodePath("../PartyManager")
[node name="CaptureController" type="Node" parent="." unique_id=68644702] [node name="CaptureController" type="Node" parent="." unique_id=68644702]
script = ExtResource("10_wp0k4") script = ExtResource("10_wp0k4")
CaptureUIPath = NodePath("../CaptureUi") CaptureUIPath = NodePath("../CaptureUi")
[node name="PartyManager" type="Node" parent="." unique_id=1307007773]
script = ExtResource("11_wp0k4")
SaveManagerPath = NodePath("../SaveManager")
[node name="PartyHud" parent="." unique_id=1636873718 instance=ExtResource("12_bjd11")]
PartyManagerPath = NodePath("../PartyManager")

View file

@ -0,0 +1,65 @@
using Godot;
using System.Collections.Generic;
using System.Text.Json;
public partial class CreatureRegistry : Node
{
public record CreatureDef(
string id,
string name,
List<string> types,
List<string> biomes,
List<string> time_windows,
int base_hp,
int base_atk,
int base_def,
int capture_difficulty
);
public record CreatureFile(int schema, List<CreatureDef> creatures);
private readonly Dictionary<string, CreatureDef> _byId = new();
public CreatureDef Get(string id)
{
if (_byId.TryGetValue(id, out var def)) return def;
throw new KeyNotFoundException($"Unknown creature id: {id}");
}
public bool TryGet(string id, out CreatureDef def) => _byId.TryGetValue(id, out def!);
[Export] public NodePath PackManagerPath { get; set; }
private PackManager? _packs;
public override void _Ready()
{
_packs = GetNodeOrNull<PackManager>(PackManagerPath);
if (_packs == null)
{
GD.PrintErr("CreatureRegistry: PackManagerPath not set.");
return;
}
var path = _packs.Resolve("data/creatures/creatures.json");
if (path == null)
{
GD.PrintErr("CreatureRegistry: Could not resolve data/creatures/creatures.json");
return;
}
var json = FileAccess.GetFileAsString(path);
var file = JsonSerializer.Deserialize<CreatureFile>(json);
if (file?.creatures == null)
{
GD.PrintErr("CreatureRegistry: Failed to parse creatures.json");
return;
}
_byId.Clear();
foreach (var c in file.creatures)
_byId[c.id] = c;
GD.Print($"CreatureRegistry: loaded {_byId.Count} creatures");
}
}

View file

@ -0,0 +1 @@
uid://bi2q7xkb1pew3

View file

@ -0,0 +1,38 @@
using Godot;
using System.Collections.Generic;
using System.Linq;
public partial class PartyManager : Node
{
public List<string> PartyCreatureIds { get; private set; } = new();
[Export] public NodePath SaveManagerPath { get; set; }
private SaveManager? _save;
public override void _Ready()
{
_save = GetNodeOrNull<SaveManager>(SaveManagerPath);
if (_save == null)
{
GD.PrintErr("PartyManager: SaveManagerPath not set.");
return;
}
// v0: party is all captured creatures (later: cap to 6 and add boxes)
PartyCreatureIds = _save.State.CapturedCreatures.ToList();
GD.Print($"Party loaded: {string.Join(", ", PartyCreatureIds)}");
}
public void AddToParty(string creatureId)
{
if (_save == null) return;
_save.State.CapturedCreatures.Add(creatureId);
_save.Save();
if (!PartyCreatureIds.Contains(creatureId))
PartyCreatureIds.Add(creatureId);
GD.Print($"Party updated: {string.Join(", ", PartyCreatureIds)}");
}
}

View file

@ -0,0 +1 @@
uid://cbqbnpj2451y4

View file

@ -5,6 +5,8 @@ public partial class CaptureUI : CanvasLayer
[Export] public float BaseTimeLimit = 3.0f; [Export] public float BaseTimeLimit = 3.0f;
[Export] public float BaseRequired = 14.0f; // “energy” required [Export] public float BaseRequired = 14.0f; // “energy” required
[Export] public float EnergyPerPress = 1.0f; [Export] public float EnergyPerPress = 1.0f;
[Export] public NodePath PartyManagerPath { get; set; }
private PartyManager? _party;
private Creature? _target; private Creature? _target;
private SaveManager? _save; private SaveManager? _save;
@ -32,7 +34,8 @@ public partial class CaptureUI : CanvasLayer
_ballOption.AddItem("Basic Soulball (easy)", 0); _ballOption.AddItem("Basic Soulball (easy)", 0);
_ballOption.AddItem("Heavy Soulball (hard)", 1); _ballOption.AddItem("Heavy Soulball (hard)", 1);
_save = GetNodeOrNull<SaveManager>("/root/Main/SaveManager"); // or export a path if you prefer _party = GetNodeOrNull<PartyManager>(PartyManagerPath);
if (_party == null) GD.PrintErr("CaptureUI: PartyManagerPath not set.");
} }
public void StartCapture(Creature target) public void StartCapture(Creature target)
@ -102,13 +105,7 @@ public partial class CaptureUI : CanvasLayer
GD.Print($"Captured {_target.CreatureId}"); GD.Print($"Captured {_target.CreatureId}");
// v0: store captured creature IDs _party?.AddToParty(_target.CreatureId);
if (_save != null)
{
_save.State.CapturedCreatures.Add(_target.CreatureId);
_save.Save();
}
_target.Despawn(); _target.Despawn();
EndCapture(); EndCapture();
} }

22
scripts/ui/PartyHUD.cs Normal file
View file

@ -0,0 +1,22 @@
using Godot;
using System.Linq;
public partial class PartyHUD : CanvasLayer
{
[Export] public NodePath PartyManagerPath { get; set; }
private PartyManager? _party;
private Label _label = null!;
public override void _Ready()
{
_label = GetNode<Label>("PartyLabel");
_party = GetNodeOrNull<PartyManager>(PartyManagerPath);
if (_party == null) GD.PrintErr("PartyHUD: PartyManagerPath not set.");
}
public override void _Process(double delta)
{
if (_party == null) return;
_label.Text = "Party: " + string.Join(", ", _party.PartyCreatureIds.Take(6));
}
}

View file

@ -0,0 +1 @@
uid://lonokky58akh

10
ui/PartyHUD.tscn Normal file
View file

@ -0,0 +1,10 @@
[gd_scene format=3 uid="uid://jfswyfq1eswl"]
[ext_resource type="Script" uid="uid://lonokky58akh" path="res://scripts/ui/PartyHUD.cs" id="1_gubqd"]
[node name="PartyHud" type="CanvasLayer" unique_id=1636873718]
script = ExtResource("1_gubqd")
[node name="PartyLabel" type="Label" parent="." unique_id=939167348]
offset_right = 40.0
offset_bottom = 23.0