From 56c993e85624887c70b14f9f8be55a5c9cc99572 Mon Sep 17 00:00:00 2001 From: hheik <4469778+hheik@users.noreply.github.com> Date: Fri, 12 Sep 2025 00:16:34 +0300 Subject: [PATCH] Added advancing time --- godot/nodes/mover_sprite_flipper.gd | 10 ++++++ godot/nodes/mover_sprite_flipper.gd.uid | 1 + godot/prefabs/player/player.tscn | 7 ++-- godot/prefabs/ui/ui.gd | 15 +++++++++ godot/prefabs/ui/ui.tscn | 42 +++++++++++++++++++++--- godot/sprites/clock_base.png | Bin 0 -> 797 bytes godot/sprites/clock_base.png.import | 34 +++++++++++++++++++ godot/sprites/clock_hand.png | Bin 0 -> 165 bytes godot/sprites/clock_hand.png.import | 34 +++++++++++++++++++ godot/sprites/sheet.aseprite | Bin 2438 -> 3764 bytes godot/sprites/sheet.png | Bin 3350 -> 4141 bytes rust/src/game_manager.rs | 35 ++++++++++++++++++-- rust/src/grid.rs | 2 +- rust/src/turn.rs | 6 ++-- rust/src/utils.rs | 7 ++++ 15 files changed, 182 insertions(+), 11 deletions(-) create mode 100644 godot/nodes/mover_sprite_flipper.gd create mode 100644 godot/nodes/mover_sprite_flipper.gd.uid create mode 100644 godot/sprites/clock_base.png create mode 100644 godot/sprites/clock_base.png.import create mode 100644 godot/sprites/clock_hand.png create mode 100644 godot/sprites/clock_hand.png.import diff --git a/godot/nodes/mover_sprite_flipper.gd b/godot/nodes/mover_sprite_flipper.gd new file mode 100644 index 0000000..d6637a8 --- /dev/null +++ b/godot/nodes/mover_sprite_flipper.gd @@ -0,0 +1,10 @@ +extends Sprite2D + +@export var mover: Mover + +func _ready(): + mover.started_moving.connect(_on_mover_started_moving) + +func _on_mover_started_moving(_from: Vector2i, dir: Vector2i): + if dir.x != 0: + flip_h = dir.x < 0 diff --git a/godot/nodes/mover_sprite_flipper.gd.uid b/godot/nodes/mover_sprite_flipper.gd.uid new file mode 100644 index 0000000..01e84eb --- /dev/null +++ b/godot/nodes/mover_sprite_flipper.gd.uid @@ -0,0 +1 @@ +uid://swwas6oe75sc diff --git a/godot/prefabs/player/player.tscn b/godot/prefabs/player/player.tscn index 628fd3c..d96c810 100644 --- a/godot/prefabs/player/player.tscn +++ b/godot/prefabs/player/player.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://drs6h7ks4r2ta"] +[gd_scene load_steps=6 format=3 uid="uid://drs6h7ks4r2ta"] [ext_resource type="Texture2D" uid="uid://doscvutq8uqmd" path="res://sprites/sheet.png" id="1_72ieh"] [ext_resource type="Script" uid="uid://cvviym6gdlod8" path="res://prefabs/player/player.gd" id="1_wv1mm"] [ext_resource type="Script" uid="uid://sxo578w2yds2" path="res://prefabs/player/player_input.gd" id="2_rdx4y"] +[ext_resource type="Script" uid="uid://swwas6oe75sc" path="res://nodes/mover_sprite_flipper.gd" id="3_klv5p"] [ext_resource type="Inventory" uid="uid://dm71wjetr4e52" path="res://prefabs/player/player_inventory.tres" id="4_binfn"] [node name="Player" type="GridPosition" node_paths=PackedStringArray("gatherer", "entity_inventory")] @@ -10,11 +11,13 @@ script = ExtResource("1_wv1mm") gatherer = NodePath("Gatherer") entity_inventory = NodePath("EntityInventory") -[node name="Sprite2D" type="Sprite2D" parent="."] +[node name="Sprite2D" type="Sprite2D" parent="." node_paths=PackedStringArray("mover")] texture = ExtResource("1_72ieh") hframes = 8 vframes = 8 frame = 1 +script = ExtResource("3_klv5p") +mover = NodePath("../Mover") [node name="Camera2D" type="Camera2D" parent="."] zoom = Vector2(2, 2) diff --git a/godot/prefabs/ui/ui.gd b/godot/prefabs/ui/ui.gd index 6bf9c52..d2fba2c 100644 --- a/godot/prefabs/ui/ui.gd +++ b/godot/prefabs/ui/ui.gd @@ -4,13 +4,28 @@ extends Node @export var player: Player @onready var inventory_ui: InventoryUI = %Inventory +@onready var clock_hand: TextureRect = %Hand + +var manager: GameManager func _ready(): + manager = GameManager.from_node(self) + manager.time().time_advanced.connect(_on_time_advance) player.entity_inventory.inventory.changed.connect(_on_player_inventory_changed) update_inventory_ui() + update_clock_hand(manager.time().day_progress()) func _on_player_inventory_changed(): update_inventory_ui() func update_inventory_ui(): inventory_ui.update(player.get_inventory()) + +func _on_time_advance(_now: int, _advanced_by: int): + update_clock_hand(manager.time().day_progress()) + +func update_clock_hand(progress: float): + clock_hand.rotation = progress * PI * 2.0 + +func on_day_end(): + print("Day over!") diff --git a/godot/prefabs/ui/ui.tscn b/godot/prefabs/ui/ui.tscn index ffd7c5e..2327db5 100644 --- a/godot/prefabs/ui/ui.tscn +++ b/godot/prefabs/ui/ui.tscn @@ -1,9 +1,14 @@ -[gd_scene load_steps=5 format=3 uid="uid://blutrglw7mycx"] +[gd_scene load_steps=8 format=3 uid="uid://blutrglw7mycx"] [ext_resource type="Script" uid="uid://djccw7ahn8b47" path="res://prefabs/ui/inventory_ui.gd" id="1_4ieor"] [ext_resource type="Script" uid="uid://ckalp7icn1f28" path="res://prefabs/ui/ui.gd" id="1_htiv7"] [ext_resource type="Texture2D" uid="uid://4rxwcyoye2sa" path="res://sprites/blueberry_item.png" id="2_htiv7"] [ext_resource type="Texture2D" uid="uid://d11rkcho3c38n" path="res://sprites/cowberry_item.png" id="3_gxjsb"] +[ext_resource type="Texture2D" uid="uid://1wsheq2hjkip" path="res://sprites/clock_base.png" id="5_mbf2n"] +[ext_resource type="Texture2D" uid="uid://ct5u214yridak" path="res://sprites/clock_hand.png" id="6_lntee"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mbf2n"] +bg_color = Color(0.192157, 0.121569, 0.0313726, 0.231373) [node name="UI" type="Control"] layout_mode = 3 @@ -15,9 +20,11 @@ grow_vertical = 2 script = ExtResource("1_htiv7") [node name="PanelContainer" type="PanelContainer" parent="."] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 +layout_mode = 1 +offset_right = 46.0 +offset_bottom = 68.0 +scale = Vector2(2, 2) +theme_override_styles/panel = SubResource("StyleBoxFlat_mbf2n") [node name="Inventory" type="VBoxContainer" parent="PanelContainer"] unique_name_in_owner = true @@ -45,3 +52,30 @@ texture = ExtResource("3_gxjsb") [node name="Count" type="Label" parent="PanelContainer/Inventory/Cowberry"] layout_mode = 2 text = "0" + +[node name="Time" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -80.0 +offset_top = 16.0 +offset_right = -16.0 +offset_bottom = 80.0 +grow_horizontal = 0 +scale = Vector2(2, 2) +pivot_offset = Vector2(64, 0) + +[node name="Base" type="TextureRect" parent="Time"] +layout_mode = 2 +offset_right = 64.0 +offset_bottom = 64.0 +texture = ExtResource("5_mbf2n") + +[node name="Hand" type="TextureRect" parent="Time"] +unique_name_in_owner = true +layout_mode = 2 +offset_right = 64.0 +offset_bottom = 64.0 +pivot_offset = Vector2(32, 32) +texture = ExtResource("6_lntee") diff --git a/godot/sprites/clock_base.png b/godot/sprites/clock_base.png new file mode 100644 index 0000000000000000000000000000000000000000..06964d78881a736ec7d01aaf1d26a78b2890ccb7 GIT binary patch literal 797 zcmV+&1LFLNP)Px%*GWV{RCt{2TfIsHK@c9r!bb_DNg-k_*a_kz2zEAhf)60r+1Lp_LJ-mksYNW( z2tJBktWGwYnc11y+56jkAR%(uoA0~%*`3=3*r9IhwRy9XtGl)2y4Cj&{C>W*Vq4Lh zNC~GnOcfVIXGR34B^9)OQ~3t}6zo*)*$gM2CEh#(R`L!NuG zq3efUKz(Y)wu+F96)XAN7`KicSBO+~U_WwFiU~ znZ6*$rVS4mOY)1sB}38!#zG!|=VD5NV?y-;{O5pF_8$YVYQT1c;_^cE@hrH%z1jHw z@bqjNC$xnEXCoT|ae0Z?@LuGp|7n2P8h%n}JqK_^b49SgG!ZJf=5HHn0lb@`Ks^sAi8csJK&}SIHXEdR0=p#GwE+{a0f)TZp7ptQcWi5#1fFGi@&aNpJflucYm7{HhW`$itXZc|c# zAtytL?PSs$dW&58ik$QSX+;N-Bt0Mw1y0>mBQk!1Vf}9Y ztYc%gNp_ElLck(|2GS0$H+cX>4$z1|!Kaa)V{-(l2p;bhI^Ql2K#O4U2I*>!8o!eR6CtWSG83ZeLsK!TJT`}++Jlo6`gnA9 bhuZN6iyl1~xyA}|00000NkvXXu0mjfsFPnS literal 0 HcmV?d00001 diff --git a/godot/sprites/clock_base.png.import b/godot/sprites/clock_base.png.import new file mode 100644 index 0000000..add00dc --- /dev/null +++ b/godot/sprites/clock_base.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1wsheq2hjkip" +path="res://.godot/imported/clock_base.png-a0dc432930e17741ad47c2b60b16358b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/clock_base.png" +dest_files=["res://.godot/imported/clock_base.png-a0dc432930e17741ad47c2b60b16358b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/godot/sprites/clock_hand.png b/godot/sprites/clock_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..b898c3407954563a2d6a210404e61d03f1f7df28 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|;yqm)Ln`LH zy}-!JpeVrX*wpd){gm>9b%%Ny&3211FvOS}r>FV-Oq~9>UcsSuff^C`TMf`$FsL}d X?i0YYUg+mMVG!Tb)z4*}Q$iB}bLBI4 literal 0 HcmV?d00001 diff --git a/godot/sprites/clock_hand.png.import b/godot/sprites/clock_hand.png.import new file mode 100644 index 0000000..78acb86 --- /dev/null +++ b/godot/sprites/clock_hand.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct5u214yridak" +path="res://.godot/imported/clock_hand.png-467d156ceb932e32aade89754e696be7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/clock_hand.png" +dest_files=["res://.godot/imported/clock_hand.png-467d156ceb932e32aade89754e696be7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/godot/sprites/sheet.aseprite b/godot/sprites/sheet.aseprite index 0846edee51289500d860c5cccf041d13f8a118cd..5ebacb0c9ad8d87de4dd141ed29f03567046af45 100644 GIT binary patch delta 1369 zcmZn@-XhDig>NEL9j^%=1H-S6f($7P3=D!3d$-ri0vRj{%nXb`8Ua`toOAM%v!#F{ zAV~(e^nW0miNVQT2CEDULsDXKsvK51HineU^vsfC6|gK5kOW!j55x>0LwOidD@uwI z6(EXWu0pk#m7%yGzoZzK-5H5_DVtpwojB^h0u5wUU}887bnAbRRbXJlV8c)`=k1Nt zyiA4yEEjEs1T!bpn-sY3KGCo|+s-!V{_DFs^6r1`zUzN}ibYd#`>WOO?ms>Arq3vC z%j&gLW)=zM-CALC*=*@dGtIMGTr-#PdKuqcXL9*0kXmJSd9IiKU7&Psmhs*C)ciTq z^MYo-lv_GIFL3rtzUsGkpDvZQIsX}mcI94@&VKa!=DmHhzZ^IG`G3{!pJ%f2=f_rB z&$5r)Ju`fb@Lt(7_aj!%uHP7D`agMX+P%cJN%u0(=JjnzGj)&JJX7=kZ>v%H55I9MO_TrIV7oqlrXbiSE!i%-}m zH1qOLxOerT@Wj;L7GGX}{TDMuC&P8=3cL4pn#)tom)`&UTlwg&*h3ac+aJv_Eqc3q zO_X1k^wnLr_T0W%tQ>86Hf*g_+UqdS&El(DZq6>f_U2-gQN8l{vXo=@*2Wk&ZB6mh zpEfnA?}_WpQ!~Qd&-HpFUDbCJ{OnhPuf{_ z-+gZ3zW9f;s;|9>JOAvOU2EF22*H2Z>#lz8aZh`F)h79C+O!Q-hTc(YXPd4GJ3H&z ztjhM?SDM?dHdSujntH9|di}obhr9~CZ$xLWFAF*wW1YHo?zQy5U$Q6j!q+dd$WA@^ zo&DAZ9_9VORKcpi!f>2{9VwLa@7tS2BBfx^%QHtBN=KoqU*Tn|CJh>iRWCJ-?=kmaYe- z*ae24=NJ2@X1hJ#5N%YW^X^cY!tu&0!{rU{r z^&k(-xX9I@z~lPY@Be@ME;%N_<+Jm4X?q6D5dq=bC_wg$KJ(qW{3tfNA_2iX|TFz_OIP=i4YoQ*efGAQu41U^6WuUbPaGf3ishWa1&GATa6iy2$CrKQ=< z-1K(Kx0v^fwSr4?pZ;Zz3$R%}@8vVuP10GB~7IsgCw delta 32 ocmdlY+a}D^#yOFxj+c#-f#KIj7KRiC1_qXiz1uenF*$Jn0F7Y?W&i*H diff --git a/godot/sprites/sheet.png b/godot/sprites/sheet.png index 6373967f81370f7853eadee8300c204b1c5ff76d..3b2504d3f1a6c7620512e3494f2de598fdaf426a 100644 GIT binary patch literal 4141 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 Vdvf5$zTbZF!C5<6)mZw({|9!`@R9%k diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index 7f78d0b..35a9a4f 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -1,4 +1,8 @@ -use godot::{classes::*, prelude::*}; +use godot::{ + classes::*, + obj::{WithBaseField, WithUserSignals}, + prelude::*, +}; use crate::prelude::*; @@ -45,6 +49,11 @@ impl GameManager { #[derive(Debug, GodotClass)] #[class(init, base=Node)] pub struct TimeManager { + #[export] + #[init(val = 40)] + day_length: i32, + + #[var(get)] time_of_day: i32, base: Base, @@ -58,10 +67,32 @@ impl TimeManager { #[func] pub fn reset_time(&mut self) { self.time_of_day = 0; + self.signals().time_resetted().emit(); } #[func] pub fn advance_time(&mut self, amount: i32) { - self.time_of_day += amount; + let new_time = self.time_of_day + amount; + self.time_of_day = new_time; + self.signals().time_advanced().emit(new_time, amount); + if self.time_of_day >= self.day_length { + GameManager::get(self.to_gd()).propagate_call(calls::ON_DAY_END); + } } + + #[func] + pub fn day_progress(&self) -> f32 { + self.time_of_day as f32 / self.day_length as f32 + } + + #[func] + fn on_round_end(&mut self) { + self.advance_time(1); + } + + #[signal] + fn time_resetted(); + + #[signal] + fn time_advanced(now: i32, advanced_by: i32); } diff --git a/rust/src/grid.rs b/rust/src/grid.rs index 2f72f96..6b76ef3 100644 --- a/rust/src/grid.rs +++ b/rust/src/grid.rs @@ -118,7 +118,7 @@ impl GridPosition { #[class(init, base=Node)] pub struct Mover { #[export] - #[init(val = 30.0)] + #[init(val = 15.0)] movement_speed: f32, #[export_group(name = "Flags")] diff --git a/rust/src/turn.rs b/rust/src/turn.rs index 9eb876b..02765bd 100644 --- a/rust/src/turn.rs +++ b/rust/src/turn.rs @@ -57,7 +57,7 @@ impl TurnManager { self.current_actor = None; self.round_queue = self.new_round(); if !self.round_queue.is_empty() { - GameManager::get(self.to_gd()).propagate_call("on_round_start"); + GameManager::get(self.to_gd()).propagate_call(calls::ON_ROUND_START); self.start_next_turn(); } } @@ -77,12 +77,14 @@ impl TurnManager { self.unregister(&actor); self.start_next_turn(); } + } else { + GameManager::get(self.to_gd()).propagate_call(calls::ON_ROUND_END); } } fn on_actor_turn_end(&mut self, action: GString) { GameManager::get(self.to_gd()) - .propagate_call_ex("on_turn_end") + .propagate_call_ex(calls::ON_TURN_END) .args(&varray![self.current_actor, action]) .done(); self.start_next_turn(); diff --git a/rust/src/utils.rs b/rust/src/utils.rs index 8181570..eff4093 100644 --- a/rust/src/utils.rs +++ b/rust/src/utils.rs @@ -1,5 +1,12 @@ use godot::prelude::*; +pub mod calls { + pub const ON_ROUND_START: &str = "on_round_start"; + pub const ON_ROUND_END: &str = "on_round_end"; + pub const ON_TURN_END: &str = "on_turn_end"; + pub const ON_DAY_END: &str = "on_day_end"; +} + pub fn find_in_parents(from: Gd) -> Option> where T: Inherits,