From e5b39e4bf5490f0b184f61a8b66595c6b500c016 Mon Sep 17 00:00:00 2001 From: hheik <4469778+hheik@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:35:30 +0300 Subject: [PATCH] Added simple goblonoid creature --- godot/nodes/creature/ai_wanderer.gd | 10 +++++++ godot/nodes/creature/ai_wanderer.gd.uid | 1 + godot/prefabs/creatures/goblonoid.tscn | 28 +++++++++++++++++ godot/prefabs/player/player.tscn | 3 +- godot/prefabs/player/player_input.gd | 1 - godot/prefabs/ui/ui.gd | 7 ++--- godot/scenes/overworld.tscn | 2 +- godot/sprites/sheet.aseprite | Bin 3764 -> 3273 bytes godot/sprites/sheet.png | Bin 4141 -> 4235 bytes godot/tilesets/foreground_tileset.tres | 4 ++- rust/src/game_manager.rs | 38 ++++++++++++++++++------ rust/src/gathering.rs | 22 ++++++++++---- rust/src/turn.rs | 18 +++++++---- rust/src/utils.rs | 9 +++++- 14 files changed, 112 insertions(+), 31 deletions(-) create mode 100644 godot/nodes/creature/ai_wanderer.gd create mode 100644 godot/nodes/creature/ai_wanderer.gd.uid create mode 100644 godot/prefabs/creatures/goblonoid.tscn diff --git a/godot/nodes/creature/ai_wanderer.gd b/godot/nodes/creature/ai_wanderer.gd new file mode 100644 index 0000000..5aae48b --- /dev/null +++ b/godot/nodes/creature/ai_wanderer.gd @@ -0,0 +1,10 @@ +@icon("res://icons/turn_action.svg") +extends ActionDecider + +@export var mover: Mover + +func handle_decide_action(): + var directions = [Vector2i.UP, Vector2i.DOWN, Vector2i.LEFT, Vector2i.RIGHT] + if try_perform(MoveAction.new(mover, directions.pick_random())): + return + try_perform(SkipAction.new()) diff --git a/godot/nodes/creature/ai_wanderer.gd.uid b/godot/nodes/creature/ai_wanderer.gd.uid new file mode 100644 index 0000000..6491b2b --- /dev/null +++ b/godot/nodes/creature/ai_wanderer.gd.uid @@ -0,0 +1 @@ +uid://hbrne8wt101n diff --git a/godot/prefabs/creatures/goblonoid.tscn b/godot/prefabs/creatures/goblonoid.tscn new file mode 100644 index 0000000..caf6767 --- /dev/null +++ b/godot/prefabs/creatures/goblonoid.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=4 format=3 uid="uid://dgiy7a67o1c6i"] + +[ext_resource type="Texture2D" uid="uid://doscvutq8uqmd" path="res://sprites/sheet.png" id="1_4ufx4"] +[ext_resource type="Script" uid="uid://swwas6oe75sc" path="res://nodes/mover_sprite_flipper.gd" id="2_d3j4p"] +[ext_resource type="Script" uid="uid://hbrne8wt101n" path="res://nodes/creature/ai_wanderer.gd" id="3_4ufx4"] + +[node name="Goblonoid" type="GridPosition"] + +[node name="Sprite2D" type="Sprite2D" parent="." node_paths=PackedStringArray("mover")] +texture = ExtResource("1_4ufx4") +hframes = 8 +vframes = 8 +frame = 8 +script = ExtResource("2_d3j4p") +mover = NodePath("../Mover") + +[node name="TurnActor" type="TurnActor" parent="."] + +[node name="ActionDecider" type="Node" parent="." node_paths=PackedStringArray("mover", "actor")] +script = ExtResource("3_4ufx4") +mover = NodePath("../Mover") +actor = NodePath("../TurnActor") +metadata/_custom_type_script = "uid://okxdlbfuvb1b" + +[node name="Mover" type="Mover" parent="."] +movement_speed = 100.0 + +[node name="Gatherer" type="Gatherer" parent="."] diff --git a/godot/prefabs/player/player.tscn b/godot/prefabs/player/player.tscn index d96c810..47a777b 100644 --- a/godot/prefabs/player/player.tscn +++ b/godot/prefabs/player/player.tscn @@ -28,9 +28,8 @@ zoom = Vector2(2, 2) [node name="TurnActor" type="TurnActor" parent="."] -[node name="ActionDecider" type="Node2D" parent="." node_paths=PackedStringArray("grid", "mover", "actor")] +[node name="ActionDecider" type="Node2D" parent="." node_paths=PackedStringArray("mover", "actor")] script = ExtResource("2_rdx4y") -grid = NodePath("..") mover = NodePath("../Mover") actor = NodePath("../TurnActor") metadata/_custom_type_script = "uid://okxdlbfuvb1b" diff --git a/godot/prefabs/player/player_input.gd b/godot/prefabs/player/player_input.gd index 26ffb16..ad8527c 100644 --- a/godot/prefabs/player/player_input.gd +++ b/godot/prefabs/player/player_input.gd @@ -1,7 +1,6 @@ @icon("res://icons/turn_action.svg") extends ActionDecider -@export var grid: GridPosition @export var mover: Mover func poll_movement_dir(): diff --git a/godot/prefabs/ui/ui.gd b/godot/prefabs/ui/ui.gd index d2fba2c..4fcea5c 100644 --- a/godot/prefabs/ui/ui.gd +++ b/godot/prefabs/ui/ui.gd @@ -10,7 +10,7 @@ var manager: GameManager func _ready(): manager = GameManager.from_node(self) - manager.time().time_advanced.connect(_on_time_advance) + manager.time().time_of_day_changed.connect(_on_time_of_day_changed) player.entity_inventory.inventory.changed.connect(_on_player_inventory_changed) update_inventory_ui() update_clock_hand(manager.time().day_progress()) @@ -21,11 +21,8 @@ func _on_player_inventory_changed(): func update_inventory_ui(): inventory_ui.update(player.get_inventory()) -func _on_time_advance(_now: int, _advanced_by: int): +func _on_time_of_day_changed(_time_of_day: 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/scenes/overworld.tscn b/godot/scenes/overworld.tscn index b43808e..aa834cf 100644 --- a/godot/scenes/overworld.tscn +++ b/godot/scenes/overworld.tscn @@ -22,7 +22,7 @@ tile_map_data = PackedByteArray("AAD8//z/AQAAAAQAAAD8//3/AQAAAAQAAAD8//7/AQAAAAQ tile_set = ExtResource("1_m1b5j") [node name="Foreground" type="TileMapLayer" parent="World"] -tile_map_data = PackedByteArray("AAD/////AQAAAAMAAAD8//3/AQABAAMAAAD9//3/AQABAAMAAAD9//7/AQABAAMAAAD9/wAAAQABAAMAAAD9/wEAAQABAAMAAAD8/wEAAQABAAMAAAAEAPv/AQACAAMAAAAGAP3/AQACAAMAAAAHAP7/AQACAAMAAAAIAP7/AQACAAMAAAAJAP7/AQACAAMAAAAGAPn/AQACAAMAAAAGAPr/AQACAAMAAAAGAPv/AQACAAMAAAAHAPv/AQACAAMAAAAIAPv/AQACAAMAAAAIAPz/AQACAAMAAAAJAPz/AQACAAMAAAAKAPz/AQACAAMAAAAKAPv/AQACAAMAAAAJAPv/AQACAAMAAAAIAPr/AQACAAMAAAAHAPr/AQACAAMAAAAHAPn/AQACAAMAAAD3//v/AQABAAMAAAD3//z/AQABAAMAAAD3//3/AQABAAMAAAD3//7/AQABAAMAAAD3////AQABAAMAAAD3/wAAAQABAAMAAAD3/wEAAQABAAMAAAD3/wIAAQABAAMAAAD4//v/AQABAAMAAAD4//z/AQABAAMAAAD4//3/AQABAAMAAAD4//7/AQABAAMAAAD4////AQABAAMAAAD4/wAAAQABAAMAAAD4/wEAAQABAAMAAAD4/wIAAQABAAMAAAD3/wMAAQABAAMAAAD3/wQAAQABAAMAAAD3/wUAAQABAAMAAAD4/wMAAQABAAMAAAD4/wQAAQABAAMAAAD4/wUAAQABAAMAAAD5/wUAAQABAAMAAAD6/wUAAQABAAMAAAD7/wUAAQABAAMAAAD8/wUAAQABAAMAAAD9/wUAAQABAAMAAAD+/wUAAQABAAMAAAD//wUAAQABAAMAAAAAAAUAAQABAAMAAAABAAUAAQABAAMAAAACAAUAAQABAAMAAAADAAUAAQABAAMAAAAEAAUAAQABAAMAAAAFAAUAAQABAAMAAAAGAAUAAQABAAMAAAAHAAUAAQABAAMAAAAIAAUAAQABAAMAAAAJAAUAAQABAAMAAAD5//v/AQABAAMAAAD6//v/AQABAAMAAAD7//v/AQABAAMAAAD8//v/AQABAAMAAAD9//v/AQABAAMAAAD+//v/AQABAAMAAAD///v/AQABAAMAAAAAAPv/AQABAAMAAAABAPv/AQABAAMAAAACAPv/AQABAAMAAAADAPv/AQABAAMAAAAJAP//AQABAAMAAAAJAAAAAQABAAMAAAAJAAEAAQABAAMAAAAJAAIAAQABAAMAAAAJAAMAAQABAAMAAAAJAAQAAQABAAMAAAD7/wEAAQABAAMAAAD7//3/AQABAAMAAAD6//3/AQABAAMAAAD6/wEAAQABAAMAAAD6//7/AQABAAMAAAD6/wAAAQABAAMAAAD6/wQAAAAAAAAAAgD5/wQAAAAAAAAAAgD5/wMAAAAAAAAAAgAEAAEAAAAAAAAAAQADAAEAAAAAAAAAAQADAAIAAAAAAAAAAQADAAMAAAAAAAAAAQACAAMAAAAAAAAAAQA=") +tile_map_data = PackedByteArray("AAD/////AQAAAAMAAAD8//3/AQABAAMAAAD9//3/AQABAAMAAAD9//7/AQABAAMAAAD9/wAAAQABAAMAAAD9/wEAAQABAAMAAAD8/wEAAQABAAMAAAAEAPv/AQACAAMAAAAGAP3/AQACAAMAAAAHAP7/AQACAAMAAAAIAP7/AQACAAMAAAAJAP7/AQACAAMAAAAGAPn/AQACAAMAAAAGAPr/AQACAAMAAAAGAPv/AQACAAMAAAAHAPv/AQACAAMAAAAIAPv/AQACAAMAAAAIAPz/AQACAAMAAAAJAPz/AQACAAMAAAAKAPz/AQACAAMAAAAKAPv/AQACAAMAAAAJAPv/AQACAAMAAAAIAPr/AQACAAMAAAAHAPr/AQACAAMAAAAHAPn/AQACAAMAAAD3//v/AQABAAMAAAD3//z/AQABAAMAAAD3//3/AQABAAMAAAD3//7/AQABAAMAAAD3////AQABAAMAAAD3/wAAAQABAAMAAAD3/wEAAQABAAMAAAD3/wIAAQABAAMAAAD4//v/AQABAAMAAAD4//z/AQABAAMAAAD4//3/AQABAAMAAAD4//7/AQABAAMAAAD4////AQABAAMAAAD4/wAAAQABAAMAAAD4/wEAAQABAAMAAAD4/wIAAQABAAMAAAD3/wMAAQABAAMAAAD3/wQAAQABAAMAAAD3/wUAAQABAAMAAAD4/wMAAQABAAMAAAD4/wQAAQABAAMAAAD4/wUAAQABAAMAAAD5/wUAAQABAAMAAAD6/wUAAQABAAMAAAD7/wUAAQABAAMAAAD8/wUAAQABAAMAAAD9/wUAAQABAAMAAAD+/wUAAQABAAMAAAD//wUAAQABAAMAAAAAAAUAAQABAAMAAAABAAUAAQABAAMAAAACAAUAAQABAAMAAAADAAUAAQABAAMAAAAEAAUAAQABAAMAAAAFAAUAAQABAAMAAAAGAAUAAQABAAMAAAAHAAUAAQABAAMAAAAIAAUAAQABAAMAAAAJAAUAAQABAAMAAAD5//v/AQABAAMAAAD6//v/AQABAAMAAAD7//v/AQABAAMAAAD8//v/AQABAAMAAAD9//v/AQABAAMAAAD+//v/AQABAAMAAAD///v/AQABAAMAAAAAAPv/AQABAAMAAAABAPv/AQABAAMAAAACAPv/AQABAAMAAAADAPv/AQABAAMAAAAJAP//AQABAAMAAAAJAAAAAQABAAMAAAAJAAEAAQABAAMAAAAJAAIAAQABAAMAAAAJAAMAAQABAAMAAAAJAAQAAQABAAMAAAD7/wEAAQABAAMAAAD7//3/AQABAAMAAAD6//3/AQABAAMAAAD6/wEAAQABAAMAAAD6//7/AQABAAMAAAD6/wAAAQABAAMAAAD6/wQAAAAAAAAAAgD5/wQAAAAAAAAAAgD5/wMAAAAAAAAAAgAEAAEAAAAAAAAAAQADAAEAAAAAAAAAAQADAAIAAAAAAAAAAQADAAMAAAAAAAAAAQACAAMAAAAAAAAAAQAEAAMAAAAAAAAAAQAFAAMAAAAAAAAAAQAFAAIAAAAAAAAAAQAFAAEAAAAAAAAAAQAEAAIAAAAAAAAAAwD7//7/AAAAAAAAAwA=") tile_set = ExtResource("2_u2ss0") [node name="Player" parent="World" instance=ExtResource("3_u2ss0")] diff --git a/godot/sprites/sheet.aseprite b/godot/sprites/sheet.aseprite index 5ebacb0c9ad8d87de4dd141ed29f03567046af45..9ec94e79a4647b4a856e664717507de2badbfab8 100644 GIT binary patch delta 2980 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 literal 3764 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 CQq_0> diff --git a/godot/sprites/sheet.png b/godot/sprites/sheet.png index 3b2504d3f1a6c7620512e3494f2de598fdaf426a..baae2e4d19beb1edc9ae2cde5cf8de5b1a427576 100644 GIT binary patch delta 3992 zcmV;J4`=YLAd4Z8Fn>LdZ&oA|e~6Hp?@Md&{gRRMYJP zxnc#ru8KqulmIqNZI(YB`MvD8;bGbJ`t~yG3ej}?K!!`uZ@%d|r*-Xp<*mYHVkHCL z6^xI*t5#k%et&Wlgmna9)9nKpdBN`*^fr0PAVw1KP5^rF&AxWO3__Xyuif*<1EKA; zt$jd5%)#$+v`+@TEg6`CKgpB`LX*HZJeD2*!n3d4pMQOEm`#Q%@RGq;LeuR7A`%|_ zv6$Mr=E}?EobTP{J^1LF08)ML9XC8YenACe;EKl(P^K41!dUwQrh5M`6V zS*{B{vwyf(27|q_fB*jRa~n5ql>Phnr@ktdK6o(I{%y@mX&C~sxIhhLS7Z%+Xc{ry!P@x zDOm+j{v(z)kNCTC?Fu-b1{6sJ`#`eSSFLK`sqOv zp9)}*c(^PZ)41=Sv})yL<448q17oo!@qfe=x=r3)067zkdMQ!$(SIELrVD`-j{Ybs zS^k@j{wmPglmzm&Dfv5?x&a{xz<4HL#I-{3ktzL6)D++f+6Ts}Jk=Mf%r<$A0VE{{ z|7;V3A~2TzKowj^{@WD%it9G%(}aU6fP^ZKwyEIHJNg5$b$Relm-oB4RsgolxPK>S zxzfoY@W?-m(KgTrE(u_dNO75;e0|hC*droa1Gh_0EOPYtk<`zoieUTtUFyz2W!eUM zqv%Mf0`V@(>rWQECgLB6MQyqWZ5uUe)5SnVqyLj2IVV6}Bve!ZY?U(s`DD&Ad9Q^8 zpi7&s>j8r4SK!$$=MC||w)DsI*ME;^ie4{yrzP{Y(Pa>DYvSR;clns>h|xA6BH7bx z$!qsx2EXk&AEs?hezoyE4cJ6r5zLqvd4c}GwymWr0bgZL0|LDg>!zM`3g#J;I# z(}HIL0%f&f^uO<@000a9BAaCCA6f-L$$(3xuifV$~bKv7^-d5X|=-L9p-;#}tV26WY3f@Ghc{y(bZ zGait4iqLjfVg2sIA?p_L4}Ot=sle)c)5EkZ&~-kQK*;Gh*E{&e4t|lqsla8I0lLPw zJ75y)w&J?b;1>xP1b@s6aDpF`EJhNDtxWKXboi#A$;*T3|D!GkpPC&c#{^UW);&+a zlze=HUxd?ufH%_|0oQ6E#{U(F75pOpGXY(1WX6BnoeH4o_5o)u$sk0mpik=37yuOjIwe*js3P!{E}lMP3;>fCcmMzZ007WW z3^cTtX~2m6g{b&IwbSs5bvrUo9zHND;=a%H1j4>X1|N#{F$TZlm;^HG@Jt@)iO{2o z&wJs{82l?Qy?<6jM2^4rwulr4b7~#Q_m)Tk?EeYnvJ+#Jqg_`=0OSV0Qji3U!Jm9@ zza|3hF)fW7$LO~EfBGIP-?+5O?s zKKu9Lmv28hi@vkB5%F=MMhqT)F@r@5^k9E%=lEwe+!wq`Cu{_t8~ox0tsC z%k)22UV3e9N6N?w6QHFE8eXw(ha?|T@9#bs1-Mbg$v74Ks#36231|tg1dvx!+6JFG zoCJK8O@Dy7!JAYN$j0@=2!3_M*S{ATcLziyT`7EZj)}eMuk5_FGpr9)Iuc zOcy}OOMoKI1Ezz+2WDf;0~n0jOFdWc9ubHAuLnN5Em;8!*KC=RHCv`iuQYJ*Y25y3 z8(KMtbo{-yt4@N}O2G3dKF}UTqV4~@N&)SnDt~}sa>uXPG9~kKv*I!+W&5yt2FXzW z;HjVI=N45G$P9QH*3*irA+J(!WIBS2RM>yl_y6v>MX{X%Od1XHWf1t?U>yTkvt`N} z+{)ntv*W?8ss^776~R!nqm{Ny48HyGj0ly2egv;IxvkkUWesj+_lHMi=Au<geBI}L`RR?BWwijw`w$r0FET&3m?~T6=N9u8_x%tS z_Q%!h$?r|e1+-l^>;AXR1XRzfLBBiZ-^eVhC5E>D4SFY2R@*)VIz9N6m!IC4`Z*^! zO&npdnCZFeDIz3zkeS5${q7>q<;3?|EQUB5ZWq%yvad%!8!Uc zlu81=3Ba*^lT6pbH353G(H35nK;Gn_!2ORJnZ^JH1!Z(f=ycPZK6`Ha^K*;ihx$2$ z=a|7jMDz(hM%wFL{D6Dy|IiWt$YVALWW5+DGzqvWIs(|**GtMXXDk*oua#}zReyvL z|5gf30-o#dVuG9~rUc;J4-8eX^PRc?$?`vO$}shFVEf)CDe$HF{f`=DW&+xR$9HZ( z!H1|+@Y^I4L16oRm%IOc<_7Th?*^x{07bFMI`yX+I%mg$}-Vrg*`tqK7+i?4R$KStatUJ?TIg=RI^Ecgo-|_bc0Dk}g002Nr zEAQI}z)hL|3ov|eW}WQ*JAK7Z@NUz`PSK) zM@@H`8IOD1dGF55b3m7P{ePc$75pOR1fWz{35UiPM5+Wb!Q^_= zkO*z3+P4M2j%om1QFxP%(BM}}CV|vZUzPrOcLa)j@A=G8U&%`VB7dnQ5Mw)lO62~h z9zFO){1bpka1s~?zp2l!CxKI6oR&lTj!ANipkx(b4StcY6Tpivy(+ide4}+GR0C); z+Zcec4;vEvMeDRJn-}~dlDhAlDfrbgp6#aS!GCDspCVFx^iN8R4FIiUye+u;=2yE9 zq+S>e?iCsx@lA%}aepK%8toUc2fs2(6khF?QB)BCZDL9QF@j9 zZ+9lw+ezx^ue;^u8wq-Jme)N2ZT(@Bi!VIicUxL-_4L(F%aIV!70xpO|NggE<>Cv^ zcYcV7JhT7lQX6;bi_?Y6jHds}p?$}U%g3G+RMh`hf&b!5uYbmB5~z$*0w_9~mko4- zfeLI>P@nqZw9L;f%BI^_rXG3{XzIq49R1N1-nRv>(csX&W5d;(F3BVTl^jg8*E&7! z094I60c_a#WABxRyhk%QwC|YhvfrVI$g=a!mQVkCT7Ru9uTzH{@zGUfZU{0KA<*;a z|6VE+;LFY{K7U>4OCRub9RO4eNrCGF&^l2PKpRw%1Y%(_5ZbD%31GPC_LWU<1JHS0 zOaSBH*N^&lZ(b!5xzyGt0KNOcr!iL#G%ENkfPU();&A}Q8vIpCCIR2E0HDo+Dge`Y z{|e>;=$wK-b``LC`s(pRel*n2ek1wbkZ6wL-C z_|X+k3E+c|K51%h|4>9EWWXov8$1EBEzrfQRn= zscT!t_HBW$s(>f<9vwe7D*cT{%X!@ZRV4r7C)axdaAzR2nbSQ1YiJ|1&E&dW-s7DF zl%hKWX+D8ord^;md@$XFBqRU;0HB2iTmHPYk&9G5e*Yu+^3AVg?bPZfnwJwxpUAtP zegFnd~NE1n<>GpwAt^r@B&V&%M)1ipS=IL2^W_eGQ{e)_| zeV|aRz}MB02!ay8=IL4a(~;lHjvF49U9WAgvab+Lw-4mF1pVwy*E#KL&&zL?ZWAjR z`0gO-eb=tJEPr`&6olglz^2;=a*BfAHRx@Ml0l3l;GF>U;G2K-0T~RE-KZ~2{~<8~ zwCVPNge~xGLI2wR=Va3@x97fpZU1w*ZPVK+wq#Hx5mZh9idKpbAN#?^KucC2(h^k58 zEY}U6S%2OmgTWrzw{Kta+?Fj{WZ%AhnST|_7(AG2|Jg_HNuK-uPal_OAH65@Z(Z%9 z-(m!RU1o2(E;BE1&6StS+ag1kIf0Ut*73ecFGs#04$C!I+ zYRdXNV}8WqTlTBKj2-+w`}Um^@IDQ=w6v5A0o2#&??q}Ib0=p5e)8R4ST|zKkJwzt z{C{->zwf?%<|n)=fb`fu-Rqkw0ja6{-aI|)x@l|6O0-{H7xXlts0#2M0_Z_L_VPb1 zT?J77BbGML_`7l)3OJtz6v+hpK=Rk*4@K%P|3xHO3VihVk=#&#@*gpEG58hz^q`4P z1u#fGT(*rV8T+TLU2|FTsJVS05o-}oOn;&8$$JPOXM#~LCF<_|li)X92&B;aqpEcI zZ|eP3ptUIp6uqbP?_e4Rgd_mtnSc@33c*LN^fysUfNN+UNYr_%FI1KH|M)Y;o+g1@Nu2V(2;-x&x%3D=&|Rsrbi0Ydie+olUD zfDUNW#Xx1V|C1oSCO};zH<@}b zHbw8T>LegAvGmhx>1+362EXk&AAhFzn*P^@1OSXtQJ_~%0wG8MfQMK&^=u0g0N^3^ zO+A|yyb=(ostvRMeMbcVSm+noq)Y$MDxhe#zsi{a(|b+-YeNPGWc=#@VxIbB?QH#>WW zAeV{Epg`3FeVl<`G{$HAk660?_W||bHq3KHBw!M-D8R>g9e{o@5aWN;Ek+WEtxE8Va25dYVoCx{Bmz^rzQHd-0sy?3)(E&J zff#>Rz|>Yq@QaWDfPWyiBoI;!_?+U48T=w0zbmks2Vne0$<^- zz(7R@pPC=ol0Z6uU6X-J6%ix&MLJ#q0BuxM5mXT?=+j65KuuyLf;s|UAprnm;+hcZ z40r$l0002cPfRqlmubR?7T8T1UUW^%H<%&C`Y?)905=m z{7Oj@Fb046X9JGgaPFeDxhHpjaMX7{XrZ!;fvn}|6&rWR;REwSnfwodEdlo8cQ*yU zh{)VUYi0KbM}Pb9e=yOC?gwD)kyOtzdR^}whuWjd3KO7=;rCNLzW#OHKP#5tziR3N zxoYYH5jm3tWU`O{#B&-)Dh}o7Buzerj>ki1-wP-IbS^^xkDtrE7hCYB{cGhT5y=b( zazDpVq1|HM5hyqQTyyEQW9um+D@}lwDrk7c#vPJ=$bWc$_rWN@jcQKDnc!EIf~878 zOL!%KqLR`!`PAVg;Hzo^EDYYXl0Y`@Cr0qA9$)`jBpD8fNVZZS3ACF&30QiN0>+X) z((SjdY&`z%Te%^CQj`EioF_~NhY!rhSO+i|wU>FWJ<3Eo{za7n+C^0W!}Nh)zinC;7v{xf zQp)yW^$e1s{=rkn+dirbAb^&dVoAvnHRsyQ$)ui7Yi?8Rl)e=M7{||a6S616T1UfzV zm4BC>-jeygAUI7Q2CpQb2fxeqCGDG7mqL3az^;7oosYjB{K_4RuV=pZJpLFn=ODCI z0!531ih^_WVW^Y@d=r3U`zE=eg=+%zXrnE>DuJTKL4n5~V`Q2G7?hOJ8KKKf3&!k) z?Jq7YClB>~2+ui#fr#h}e2lc$yZ8b3I)DD5Gyak1Y!JwLF;Hj{a8=d=*xJ`i$}?vy zmUFLFZQoUd8UI!aO#+_#?_z?SD5eD9JPr(1a`2so0O|5Sb;>aFePH|ECMocx`Qwi< z%B=*n1&{CAfRYbUrQo+oCxXEC`>yc#`>YM%|GyiY&H|*_CIb}}{FWZ0^eQyp-haPn zn}GJqI9;*Vv6=rgr{iCg1XS?X^#6~@a!Y~B6fF=k^!z>xSt|AZ7O@x7lr9jO_WO?i|DLfPOo#1EVqDMPbo+hB z|33f#00000GFo}xJ^*g2{9S~gL4~Y)wjNxJTdpsU#jdc z=sg&oOol6&&d-ecoxUxahsm;k;*0Do)ni^#Z! z1H*M&FOhS;adz%8rn}4}^B#BJw=?$~&?R1fCtd}=h&cf$HC6&i@E57`A|R1W;LEo! zUL_(TKfCuX^%T_rI>WUBa1MTv+A0BK*>6%)C14GH5s}|K_GEfHssVI@)1Qn=2fs*p z0#G7V0=Zyvy=h2Kfg;~~KG*9jMF~J8 zlLTVC51f2l_gei8o!AQGGelHfOu`Sm1l>hsfbXzwve&kK%Z|Kclh z%gr}hcS1FQHnYtE7{{<7!C$sd+qOl)FCv-y&Y6N=ZR6Q)h93NfmVf>!BIUh*T54_p zXdUBi!POVP+I=AN!f0}@)TqZd8Hz_wST@@)Vh?_0lqkH~t)i?V0NTWq0Fv81={?}w zLp$|tjr5=U-EViM_uEOT_t)KW^Nj>OI?L;xfVT0l$;B6*@B3a_Z{5t*PTP?X&=t-r z0ssEDSLEUg&v$-^h<`k@@99c!?$qa}OSc&<|CK{~j~Ta*y(p+`{I3Fk|BJ80Y7(f8 zQvxXK&8r5w!9WGJDX33kxOlT0nj_|e-d-|K%;`s0_dmyYMuvBtifNWbQ18L z3jo?Ir~)vZ_kXWpEr8A`_+wWA>t?P_9wKLwfy*Kv76PFQ+Pn@R&8z3Xdv>invFB*? z3xHG-C|eCk@S`i762SW(e%#dB{-KCS$b?@i35e9ZAjlN(tPMaH6y6X-eR1b~J2MHu zR_^Qb01w^wW7oEf?b`xhRRK@zIhs5-D*cT{+j-ppRbHg{;wRU80&r&_w3*XA0mslr zXq)MMyZnrI5>U$S45S5mm3D!#;e+WWBq0F+001pC*!JhU8o5a2qxU|PFW&f4HcYQ; zqIo&7^0B=0*{AaIAD*XdM{jj;DKLOYlYtLDlb#PDlb#O{Ce}y-_~^Y4n`jn*=B%cJ z@x;o= self.day_length { + self.set_time_of_day(self.time_of_day + amount); + if self.is_day_over() { GameManager::get(self.to_gd()).propagate_call(calls::ON_DAY_END); } } + #[func] + pub fn is_day_over(&self) -> bool { + self.time_of_day >= self.day_length + } + #[func] pub fn day_progress(&self) -> f32 { self.time_of_day as f32 / self.day_length as f32 @@ -91,8 +111,8 @@ impl TimeManager { } #[signal] - fn time_resetted(); + fn day_changed(day: i32); #[signal] - fn time_advanced(now: i32, advanced_by: i32); + fn time_of_day_changed(time_of_day: i32); } diff --git a/rust/src/gathering.rs b/rust/src/gathering.rs index aed23d5..8d096c0 100644 --- a/rust/src/gathering.rs +++ b/rust/src/gathering.rs @@ -1,4 +1,4 @@ -use godot::{classes::*, prelude::*}; +use godot::{classes::*, obj::WithBaseField, prelude::*}; use crate::prelude::*; @@ -46,6 +46,20 @@ pub struct Gatherable { base: Base, } +#[godot_api] +impl INode for Gatherable { + fn ready(&mut self) { + GameManager::get(self.to_gd()) + .bind() + .turn() + .signals() + .action_taken() + .connect_other(self, |this, actor, action| { + this.on_action_taken(actor, action) + }); + } +} + #[godot_api] impl Gatherable { #[func] @@ -63,14 +77,10 @@ impl Gatherable { } #[func] - fn on_turn_end(&mut self, actor: Option>, _action: GString) { + fn on_action_taken(&mut self, actor: Gd, _action: GString) { if self.get_is_picked() { return; } - let actor = match actor { - Some(actor) => actor, - None => return, - }; let actor_grid = match find_in_parents::(actor.clone()) { Some(grid) => grid, None => return, diff --git a/rust/src/turn.rs b/rust/src/turn.rs index 02765bd..a1eb0c7 100644 --- a/rust/src/turn.rs +++ b/rust/src/turn.rs @@ -70,9 +70,15 @@ impl TurnManager { .signals() .turn_ended() .builder() - .flags(ConnectFlags::ONE_SHOT) + // `ConnectFlags::Deferred` prevents double-borrow errors. + // The double-borrow occurs when there are 2 actors, and the first one + // immediately skips their turn. + // + // This should be investigated further. + .flags(ConnectFlags::ONE_SHOT | ConnectFlags::DEFERRED) .connect_other_mut(self, Self::on_actor_turn_end); actor.bind_mut().start_turn(); + GameManager::get(self.to_gd()).propagate_call(calls::ON_TURN_START); } else { self.unregister(&actor); self.start_next_turn(); @@ -83,12 +89,14 @@ impl TurnManager { } fn on_actor_turn_end(&mut self, action: GString) { - GameManager::get(self.to_gd()) - .propagate_call_ex(calls::ON_TURN_END) - .args(&varray![self.current_actor, action]) - .done(); + GameManager::get(self.to_gd()).propagate_call(calls::ON_TURN_END); + let actor = self.current_actor.clone().unwrap(); + self.signals().action_taken().emit(&actor, &action); self.start_next_turn(); } + + #[signal] + pub fn action_taken(actor: Gd, action: GString); } #[derive(GodotConvert, Var, Export, Clone, Copy, Default, Debug, PartialEq, Eq)] diff --git a/rust/src/utils.rs b/rust/src/utils.rs index eff4093..c7e21f0 100644 --- a/rust/src/utils.rs +++ b/rust/src/utils.rs @@ -1,10 +1,17 @@ use godot::prelude::*; +/// Contains hard-coded method names for `propagate_call`. +/// +/// This project uses the convention, that `propagate_call` should never pass arguments, and if +/// arguments are needed, signals should be used instead. `propagate_call` should be called from +/// the `GameManager` node. pub mod calls { + pub const ON_DAY_START: &str = "on_day_start"; + pub const ON_DAY_END: &str = "on_day_end"; pub const ON_ROUND_START: &str = "on_round_start"; pub const ON_ROUND_END: &str = "on_round_end"; + pub const ON_TURN_START: &str = "on_turn_start"; 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>