aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2025-10-16 21:02:44 +0200
committertpart <tpart120@proton.me>2025-10-16 21:02:50 +0200
commit1532e80cf37c9ee77cd921a158499188a1e172b2 (patch)
treed5ea0f47d4b5a0fed9b764d6a31f628bfe606c1d
parent8fa812c2f55be090c950cff19b17e83ff5518879 (diff)
downloadhurrycurry-1532e80cf37c9ee77cd921a158499188a1e172b2.tar
hurrycurry-1532e80cf37c9ee77cd921a158499188a1e172b2.tar.bz2
hurrycurry-1532e80cf37c9ee77cd921a158499188a1e172b2.tar.zst
Fix cutting animation not stopping when multiple people cut at once (Closes #472)
-rw-r--r--client/game.gd8
-rw-r--r--client/global.gd6
-rw-r--r--client/map/tiles/cutting_board.gd30
-rw-r--r--client/map/tiles/rolling_board.gd30
-rw-r--r--client/map/tiles/tile.gd2
-rw-r--r--client/multiplayer.gd2
6 files changed, 44 insertions, 34 deletions
diff --git a/client/game.gd b/client/game.gd
index 8edd4f8c..18b23e08 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -61,7 +61,7 @@ var tutorial_running := false
var tutorial_queue := []
var last_position = null # : Vector2?
-var players := {}
+var players: Dictionary[float, Player] = {}
var spectating_mode: SpectatingMode = SpectatingMode.CENTER
@@ -178,7 +178,11 @@ func handle_packet(p):
"set_progress":
if "tile" in p.item:
var t: Tile = map.get_tile_instance(p.item.tile)
- t.progress(p.position, p.speed, p.warn, players.get(p.player))
+ var acting_players: Array[Player] = []
+ for id: float in p.players:
+ if !players.has(id): continue
+ acting_players.append(players[id])
+ t.progress(p.position, p.speed, p.warn, acting_players)
else:
players[p.item.player[0]].progress(p.position, p.speed, p.warn, int(p.item.player[1]))
"clear_progress":
diff --git a/client/global.gd b/client/global.gd
index 4f68f99f..7d44754f 100644
--- a/client/global.gd
+++ b/client/global.gd
@@ -133,6 +133,12 @@ static func unordered_array_eq(a: Array, b: Array) -> bool:
static func unordered_array_subset(a: Array, b: Array) -> bool:
return a.all(func(e): return b.has(e))
+static func unordered_array_difference(a: Array, b: Array) -> Array:
+ var c := []
+ for i in a:
+ if not b.has(i): c.append(i)
+ return c
+
static func add_missing_keys(dict: Dictionary, reference: Dictionary):
for k in reference.keys():
if !dict.has(k) or typeof(dict[k]) != typeof(reference[k]):
diff --git a/client/map/tiles/cutting_board.gd b/client/map/tiles/cutting_board.gd
index 300b5700..9ee93522 100644
--- a/client/map/tiles/cutting_board.gd
+++ b/client/map/tiles/cutting_board.gd
@@ -18,7 +18,7 @@ extends CounterBase
var board = load("res://map/tiles/cutting_board.tscn").instantiate()
var chopping: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
-var acting_player
+var acting_players: Array[Player] = []
func _init(ctx: TileFactory.TileCC):
super(ctx)
@@ -26,29 +26,29 @@ func _init(ctx: TileFactory.TileCC):
add_child(chopping)
base.add_child(board)
-func progress(position_: float, speed: float, warn: bool, acting_player_):
- super(position_, speed, warn, acting_player)
+func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]):
+ super(position_, speed, warn, acting_players)
var knife: Node3D = board.get_node("Knife")
- acting_player = acting_player_
- if not chopping.playing and speed != 0.:
- chopping.play()
- if acting_player != null:
+ if speed != 0.:
+ if not chopping.playing: chopping.play()
+ 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
- var acting_character: Character = acting_player.character
- acting_character.cutting = true
+ p.character.cutting = true
elif speed == 0:
chopping.stop()
knife.visible = true
- if acting_player != null:
- var acting_character: Character = acting_player.character
- acting_character.cutting = false
+ for p: Player in acting_players:
+ p.character.cutting = false
+ acting_players = acting_players_
func finish():
super()
- if is_instance_valid(acting_player):
- var acting_character: Character = acting_player.character
- acting_character.cutting = false
+ for p: Player in acting_players:
+ p.character.cutting = false
board.get_node("Knife").visible = true
chopping.stop()
diff --git a/client/map/tiles/rolling_board.gd b/client/map/tiles/rolling_board.gd
index 078897b1..fd118b72 100644
--- a/client/map/tiles/rolling_board.gd
+++ b/client/map/tiles/rolling_board.gd
@@ -18,7 +18,7 @@ extends CounterBase
var board = load("res://map/tiles/rolling_board.tscn").instantiate()
var rolling: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
-var acting_player
+var acting_players: Array[Player]
func _init(ctx: TileFactory.TileCC):
super(ctx)
@@ -27,29 +27,29 @@ func _init(ctx: TileFactory.TileCC):
add_child(rolling)
base.add_child(board)
-func progress(position_: float, speed: float, warn: bool, acting_player_):
- super(position_, speed, warn, acting_player)
+func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]):
+ super(position_, speed, warn, acting_players_)
var pin: Node3D = board.get_node("RollingPin")
- acting_player = acting_player_
- if not rolling.playing and speed != 0.:
- rolling.play()
- if acting_player != null:
+ if speed != 0.:
+ if not rolling.playing: rolling.play()
+ 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
- var acting_character: Character = acting_player.character
- acting_character.rolling = true
+ p.character.rolling = true
elif speed == 0:
rolling.stop()
pin.visible = true
- if acting_player != null:
- var acting_character: Character = acting_player.character
- acting_character.rolling = false
+ for p: Player in acting_players:
+ p.character.rolling = false
+ acting_players = acting_players_
func finish():
super()
- if is_instance_valid(acting_player):
- var acting_character: Character = acting_player.character
- acting_character.rolling = false
+ for p: Player in acting_players:
+ p.character.rolling = false
board.get_node("RollingPin").visible = true
rolling.stop()
diff --git a/client/map/tiles/tile.gd b/client/map/tiles/tile.gd
index 9d4d732e..27d791c3 100644
--- a/client/map/tiles/tile.gd
+++ b/client/map/tiles/tile.gd
@@ -57,7 +57,7 @@ static func interact_target() -> Vector3:
func interact():
pass
-func progress(position_: float, speed: float, warn: bool, _acting_player):
+func progress(position_: float, speed: float, warn: bool, _acting_players: Array[Player]):
if item != null:
item.progress(position_, speed, warn)
diff --git a/client/multiplayer.gd b/client/multiplayer.gd
index e8747995..d635db41 100644
--- a/client/multiplayer.gd
+++ b/client/multiplayer.gd
@@ -19,7 +19,7 @@ extends Node
signal packet(packet: Dictionary)
signal connection_closed()
-static var VERSION_MAJOR: int = 11
+static var VERSION_MAJOR: int = 12
static var VERSION_MINOR: int = 0
var connected := false