diff options
| author | tpart <tpart120@proton.me> | 2025-12-20 21:48:10 +0100 |
|---|---|---|
| committer | tpart <tpart120@proton.me> | 2025-12-20 21:48:10 +0100 |
| commit | 46edf5581824207c01e3f1923fcec9929bd59e4d (patch) | |
| tree | 45dd7cc600906f2f024920758e34608db16a9a5d | |
| parent | bf84f7161b9d6dc44df15f74cb1b0c0e4762e05d (diff) | |
| download | hurrycurry-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.gd | 60 | ||||
| -rw-r--r-- | client/map/tiles/active_interact_counter.gd.uid | 1 | ||||
| -rw-r--r-- | client/map/tiles/cutting_board.gd | 37 | ||||
| -rw-r--r-- | client/map/tiles/rolling_board.gd | 39 |
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.) |