From c141e6a169ba896fcc4c15b105ef3d2b6e496679 Mon Sep 17 00:00:00 2001 From: anonoe <8bdd1ef7-1633-4e26-83a0-8dda8605bcd0@aleeas.com> Date: Tue, 10 Feb 2026 21:17:17 +0100 Subject: [PATCH] basic capture functionality --- project.godot | 17 +++- scenes/Main.tscn | 14 ++- scenes/Player.tscn | 10 +++ scenes/world/Creature.tscn | 15 ++++ scenes/world/CreatureMarker.tscn | 3 + scripts/core/CaptureController.cs | 28 ++++++ scripts/core/CaptureController.cs.uid | 1 + scripts/core/GameRoot.cs | 14 +++ scripts/core/GameRoot.cs.uid | 1 + scripts/core/SaveState.cs | 2 + scripts/ui/CaptureUI.cs | 121 ++++++++++++++++++++++++++ scripts/ui/CaptureUI.cs.uid | 1 + scripts/world/ChunkManager.cs | 89 ++++++++++++++++--- scripts/world/Creature.cs | 20 +++++ scripts/world/Creature.cs.uid | 1 + scripts/world/PlayerInteractor.cs | 52 +++++++++++ scripts/world/PlayerInteractor.cs.uid | 1 + scripts/world/RectOutline.cs | 14 +++ scripts/world/RectOutline.cs.uid | 1 + ui/CaptureUI.tscn | 39 +++++++++ 20 files changed, 430 insertions(+), 14 deletions(-) create mode 100644 scenes/world/Creature.tscn create mode 100644 scripts/core/CaptureController.cs create mode 100644 scripts/core/CaptureController.cs.uid create mode 100644 scripts/core/GameRoot.cs create mode 100644 scripts/core/GameRoot.cs.uid create mode 100644 scripts/ui/CaptureUI.cs create mode 100644 scripts/ui/CaptureUI.cs.uid create mode 100644 scripts/world/Creature.cs create mode 100644 scripts/world/Creature.cs.uid create mode 100644 scripts/world/PlayerInteractor.cs create mode 100644 scripts/world/PlayerInteractor.cs.uid create mode 100644 scripts/world/RectOutline.cs create mode 100644 scripts/world/RectOutline.cs.uid create mode 100644 ui/CaptureUI.tscn diff --git a/project.godot b/project.godot index 3e880d1..ebe9cec 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://dackb8ekt4sk6" config/features=PackedStringArray("4.6", "C#", "GL Compatibility") config/icon="res://icon.svg" +[autoload] + +GameRoot="*uid://boip0mbmeqmhk" + [dotnet] project/assembly_name="ocker" @@ -54,10 +58,21 @@ ui_down={ ] } debug_cycle_time={ -"deadzone": 0.5, +"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":84,"key_label":0,"unicode":116,"location":0,"echo":false,"script":null) ] } +interact={ +"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) +] +} +capture_mash={ +"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":32,"key_label":0,"unicode":32,"location":0,"echo":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) +] +} [physics] diff --git a/scenes/Main.tscn b/scenes/Main.tscn index a5c3edb..23cfb12 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -4,9 +4,12 @@ [ext_resource type="Script" uid="uid://cqdq8fslu7cyp" path="res://scripts/world/ChunkManager.cs" id="2_0bbpv"] [ext_resource type="Script" uid="uid://db2vbbh5737ke" path="res://scripts/core/PackManager.cs" id="3_rarhs"] [ext_resource type="PackedScene" uid="uid://bs7qu34sfgvjx" path="res://scenes/world/PickupMarker.tscn" id="3_vcsgt"] -[ext_resource type="PackedScene" uid="uid://bjil24xdbm76x" path="res://scenes/world/CreatureMarker.tscn" id="4_nxtc6"] +[ext_resource type="PackedScene" uid="uid://djkstm7pmu7gq" path="res://scenes/world/Creature.tscn" id="4_nxtc6"] [ext_resource type="Script" uid="uid://osk74jjhtcjy" path="res://scripts/core/SaveManager.cs" id="4_rarhs"] [ext_resource type="Script" uid="uid://b6gxknud5unt" path="res://scripts/core/WorldClock.cs" id="6_c01mt"] +[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="Script" uid="uid://bl7xagtutg20w" path="res://scripts/core/CaptureController.cs" id="10_wp0k4"] [node name="Main" type="Node2D" unique_id=1194367579] @@ -31,3 +34,12 @@ script = ExtResource("4_rarhs") [node name="WorldClock" type="Node" parent="." unique_id=437350596] script = ExtResource("6_c01mt") + +[node name="GameRoot" type="Node" parent="." unique_id=1464632231] +script = ExtResource("8_jlsqs") + +[node name="CaptureUi" parent="." unique_id=1650401906 instance=ExtResource("9_lhr70")] + +[node name="CaptureController" type="Node" parent="." unique_id=68644702] +script = ExtResource("10_wp0k4") +CaptureUIPath = NodePath("../CaptureUi") diff --git a/scenes/Player.tscn b/scenes/Player.tscn index a140624..69ba95f 100644 --- a/scenes/Player.tscn +++ b/scenes/Player.tscn @@ -1,9 +1,12 @@ [gd_scene format=3 uid="uid://bjt15rm720w5g"] [ext_resource type="Script" uid="uid://duf0vlr2yin8l" path="res://scripts/gameplay/Player.cs" id="1_p0vlq"] +[ext_resource type="Script" uid="uid://dtaa141c1wb8e" path="res://scripts/world/PlayerInteractor.cs" id="2_v6fml"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_p0vlq"] +[sub_resource type="CircleShape2D" id="CircleShape2D_3li8b"] + [node name="Player" type="CharacterBody2D" unique_id=1675096620] script = ExtResource("1_p0vlq") @@ -27,3 +30,10 @@ offset_right = 8.0 offset_bottom = 8.0 grow_horizontal = 2 grow_vertical = 2 + +[node name="InteractArea" type="Area2D" parent="." unique_id=973889967] +script = ExtResource("2_v6fml") +GameRootPath = NodePath("") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="InteractArea" unique_id=524618181] +shape = SubResource("CircleShape2D_3li8b") diff --git a/scenes/world/Creature.tscn b/scenes/world/Creature.tscn new file mode 100644 index 0000000..eb43059 --- /dev/null +++ b/scenes/world/Creature.tscn @@ -0,0 +1,15 @@ +[gd_scene format=3 uid="uid://djkstm7pmu7gq"] + +[ext_resource type="Script" uid="uid://it4jgvdqmkvr" path="res://scripts/world/Creature.cs" id="1_65v7p"] +[ext_resource type="Script" uid="uid://c3276p03ic158" path="res://scripts/world/CreatureVisual.cs" id="1_u1pt2"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_65v7p"] + +[node name="Creature" type="Area2D" unique_id=60731392] +script = ExtResource("1_65v7p") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=470973293] +shape = SubResource("CircleShape2D_65v7p") + +[node name="Visual" type="Node2D" parent="." unique_id=688427995] +script = ExtResource("1_u1pt2") diff --git a/scenes/world/CreatureMarker.tscn b/scenes/world/CreatureMarker.tscn index 784f40a..600f84c 100644 --- a/scenes/world/CreatureMarker.tscn +++ b/scenes/world/CreatureMarker.tscn @@ -1,5 +1,8 @@ [gd_scene format=3 uid="uid://bjil24xdbm76x"] +[ext_resource type="Script" uid="uid://c3276p03ic158" path="res://scripts/world/CreatureVisual.cs" id="1_vucws"] + [node name="CreatureMarker" type="Node2D" unique_id=1874810005] [node name="Visual" type="Node2D" parent="." unique_id=309456162] +script = ExtResource("1_vucws") diff --git a/scripts/core/CaptureController.cs b/scripts/core/CaptureController.cs new file mode 100644 index 0000000..28c4c12 --- /dev/null +++ b/scripts/core/CaptureController.cs @@ -0,0 +1,28 @@ +using Godot; + +public partial class CaptureController : Node +{ + [Export] public NodePath CaptureUIPath { get; set; } + + private GameRoot _root = null!; + private CaptureUI? _ui; + + public override void _Ready() + { + _ui = GetNodeOrNull(CaptureUIPath); + if (_ui == null) + { + GD.PrintErr("CaptureController: CaptureUIPath not set."); + return; + } + + GameRoot.Instance.CaptureRequested += OnRequestCapture; + } + + private void OnRequestCapture(Creature creature) + { + if (_ui == null) return; + if (!IsInstanceValid(creature)) return; + _ui.StartCapture(creature); + } +} diff --git a/scripts/core/CaptureController.cs.uid b/scripts/core/CaptureController.cs.uid new file mode 100644 index 0000000..9836b8b --- /dev/null +++ b/scripts/core/CaptureController.cs.uid @@ -0,0 +1 @@ +uid://bl7xagtutg20w diff --git a/scripts/core/GameRoot.cs b/scripts/core/GameRoot.cs new file mode 100644 index 0000000..d8576d8 --- /dev/null +++ b/scripts/core/GameRoot.cs @@ -0,0 +1,14 @@ +using Godot; + +public partial class GameRoot : Node +{ + public static GameRoot Instance { get; private set; } = null!; + public event System.Action? CaptureRequested; + + public override void _EnterTree() + { + Instance = this; + } + + public void RequestCapture(Creature creature) => CaptureRequested?.Invoke(creature); +} diff --git a/scripts/core/GameRoot.cs.uid b/scripts/core/GameRoot.cs.uid new file mode 100644 index 0000000..a83fa1f --- /dev/null +++ b/scripts/core/GameRoot.cs.uid @@ -0,0 +1 @@ +uid://boip0mbmeqmhk diff --git a/scripts/core/SaveState.cs b/scripts/core/SaveState.cs index 8c754c6..9874a50 100644 --- a/scripts/core/SaveState.cs +++ b/scripts/core/SaveState.cs @@ -9,6 +9,8 @@ public class SaveState // Respawnables: pickupId -> unixTimeSeconds when it becomes available again public Dictionary PickupRespawnAt { get; set; } = new(); + public HashSet CapturedCreatures { get; set; } = new(); + //public Vector2I? LastPlayerChunk { get; set; } // optional debug, requires "using Godot;" //public int[]? LastPlayerChunk { get; set; } // [x,y] same debug as above, does not require Godot } diff --git a/scripts/ui/CaptureUI.cs b/scripts/ui/CaptureUI.cs new file mode 100644 index 0000000..cb111a1 --- /dev/null +++ b/scripts/ui/CaptureUI.cs @@ -0,0 +1,121 @@ +using Godot; + +public partial class CaptureUI : CanvasLayer +{ + [Export] public float BaseTimeLimit = 3.0f; + [Export] public float BaseRequired = 14.0f; // “energy” required + [Export] public float EnergyPerPress = 1.0f; + + private Creature? _target; + private SaveManager? _save; + + private float _timeLeft; + private float _required; + private float _energy; + + private OptionButton _ballOption = null!; + private ProgressBar _bar = null!; + private Label _timer = null!; + private Label _title = null!; + + public override void _Ready() + { + _ballOption = GetNode("Panel/VBoxContainer/SoulballOption"); + _bar = GetNode("Panel/VBoxContainer/MashBar"); + _timer = GetNode