aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2025-12-20 21:48:10 +0100
committertpart <tpart120@proton.me>2025-12-20 21:48:10 +0100
commit46edf5581824207c01e3f1923fcec9929bd59e4d (patch)
tree45dd7cc600906f2f024920758e34608db16a9a5d
parentbf84f7161b9d6dc44df15f74cb1b0c0e4762e05d (diff)
downloadhurrycurry-46edf5581824207c01e3f1923fcec9929bd59e4d.tar
hurrycurry-46edf5581824207c01e3f1923fcec9929bd59e4d.tar.bz2
hurrycurry-46edf5581824207c01e3f1923fcec9929bd59e4d.tar.zst
Refactor: Deduplicate cutting board and rolling board scripts with inheritance (Closes #495)
-rw-r--r--client/map/tiles/active_interact_counter.gd60
-rw-r--r--client/map/tiles/active_interact_counter.gd.uid1
-rw-r--r--client/map/tiles/cutting_board.gd37
-rw-r--r--client/map/tiles/rolling_board.gd39
4 files changed, 65 insertions, 72 deletions
diff --git a/client/map/tiles/active_interact_counter.gd b/client/map/tiles/active_interact_counter.gd
new file mode 100644
index 00000000..742f147f
--- /dev/null
+++ b/client/map/tiles/active_interact_counter.gd
@@ -0,0 +1,60 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+@abstract
+class_name ActiveInteractCounter
+extends CounterBase
+
+var interact_sound: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
+var interact_tool: Node3D
+var acting_players: Array[Player] = []
+var play_character_animation: Callable
+
+func _init(ctx: TileFactory.TileCC, station_model_: PackedScene, interact_tool_path: NodePath, play_character_animation_: Callable, audio_stream_: AudioStream):
+ super(ctx, station_model_)
+ interact_sound.stream = audio_stream_
+ add_child(interact_sound)
+ interact_tool = base.get_node(interact_tool_path)
+ play_character_animation = play_character_animation_
+
+func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]):
+ super(position_, speed, warn, acting_players)
+
+ if speed != 0.:
+ if not interact_sound.playing: interact_sound.play()
+ acting_players = acting_players.filter(is_instance_valid) # Some players might have disconnected
+ var players_who_stopped := G.unordered_array_difference(acting_players, acting_players_)
+ for p: Player in players_who_stopped:
+ if p != null: play_character_animation.call(p, false)
+ for p: Player in acting_players_:
+ interact_tool.visible = false
+ play_character_animation.call(p, true)
+ elif speed == 0:
+ interact_sound.stop()
+ interact_tool.visible = true
+ for p: Player in acting_players:
+ play_character_animation.call(p, false)
+ acting_players = acting_players_
+
+func finish():
+ super()
+ acting_players = acting_players.filter(is_instance_valid) # Some players might have disconnected
+ for p: Player in acting_players:
+ play_character_animation.call(p, false)
+ interact_tool.visible = true
+ interact_sound.stop()
+
+static func interact_target() -> Vector3:
+ return Vector3(0., 0.575, 0.)
diff --git a/client/map/tiles/active_interact_counter.gd.uid b/client/map/tiles/active_interact_counter.gd.uid
new file mode 100644
index 00000000..c83526ff
--- /dev/null
+++ b/client/map/tiles/active_interact_counter.gd.uid
@@ -0,0 +1 @@
+uid://bc4l8km0pnuq5
diff --git a/client/map/tiles/cutting_board.gd b/client/map/tiles/cutting_board.gd
index 4bc6608f..a7975a44 100644
--- a/client/map/tiles/cutting_board.gd
+++ b/client/map/tiles/cutting_board.gd
@@ -14,43 +14,10 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name CuttingBoard
-extends CounterBase
-
-var chopping: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
-var acting_players: Array[Player] = []
+extends ActiveInteractCounter
func _init(ctx: TileFactory.TileCC):
- super(ctx, preload("res://map/tiles/cutting_board.tscn"))
- chopping.stream = preload("res://map/tiles/sounds/chop.ogg")
- add_child(chopping)
-
-func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]):
- super(position_, speed, warn, acting_players)
- var knife: Node3D = base.get_node("CuttingBoard").get_node("Knife")
-
- if speed != 0.:
- if not chopping.playing: chopping.play()
- acting_players = acting_players.filter(is_instance_valid) # Some players might have disconnected
- var players_who_stopped := G.unordered_array_difference(acting_players, acting_players_)
- for p: Player in players_who_stopped:
- if p != null: p.character.cutting = false
- for p: Player in acting_players_:
- knife.visible = false
- p.character.cutting = true
- elif speed == 0:
- chopping.stop()
- knife.visible = true
- for p: Player in acting_players:
- p.character.cutting = false
- acting_players = acting_players_
-
-func finish():
- super()
- acting_players = acting_players.filter(is_instance_valid) # Some players might have disconnected
- for p: Player in acting_players:
- p.character.cutting = false
- base.get_node("CuttingBoard").get_node("Knife").visible = true
- chopping.stop()
+ super(ctx, preload("res://map/tiles/cutting_board.tscn"), "CuttingBoard/Knife", func (p: Player, x: bool): p.character.cutting = x, preload("res://map/tiles/sounds/chop.ogg"))
static func interact_target() -> Vector3:
return Vector3(0., 0.575, 0.)
diff --git a/client/map/tiles/rolling_board.gd b/client/map/tiles/rolling_board.gd
index f9477de8..81934dbc 100644
--- a/client/map/tiles/rolling_board.gd
+++ b/client/map/tiles/rolling_board.gd
@@ -14,45 +14,10 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name RollingBoard
-extends CounterBase
-
-var board = load("res://map/tiles/rolling_board.tscn")
-var rolling: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
-var acting_players: Array[Player]
+extends ActiveInteractCounter
func _init(ctx: TileFactory.TileCC):
- super(ctx, board)
- rolling.stream = preload("res://map/tiles/sounds/roll.ogg")
- rolling.volume_db = -10
- add_child(rolling)
-
-func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]):
- super(position_, speed, warn, acting_players_)
- var pin: Node3D = base.get_node("RollingBoard").get_node("RollingPin")
-
- if speed != 0.:
- if not rolling.playing: rolling.play()
- acting_players = acting_players.filter(is_instance_valid) # Some players might have disconnected
- var players_who_stopped := G.unordered_array_difference(acting_players, acting_players_)
- for p: Player in players_who_stopped:
- if p != null: p.character.rolling = false
- for p: Player in acting_players_:
- pin.visible = false
- p.character.rolling = true
- elif speed == 0:
- rolling.stop()
- pin.visible = true
- for p: Player in acting_players:
- p.character.rolling = false
- acting_players = acting_players_
-
-func finish():
- super()
- acting_players = acting_players.filter(is_instance_valid) # Some players might have disconnected
- for p: Player in acting_players:
- p.character.rolling = false
- base.get_node("RollingBoard").get_node("RollingPin").visible = true
- rolling.stop()
+ super(ctx, preload("res://map/tiles/rolling_board.tscn"), "RollingBoard/RollingPin", func (p: Player, x: bool): p.character.rolling = x, preload("res://map/tiles/sounds/roll.ogg"))
static func interact_target() -> Vector3:
return Vector3(0., 0.575, 0.)