Eigener Schlag zeigt beim Brechen keine zweiten Splitter
Der Kern meldet einen Schlag, der Fels bricht, nur als geänderte Kachel ohne Spieler. Die Hauptszene merkt sich deshalb die Kacheln ihrer eigenen Schläge, bis der Kern sie meldet, und zeigt dann keinen zweiten Splitterwurf. Als Gast kam der zweite eine Rundreise später und sah wieder verzögert aus. Splitter gibt es nur noch auf Fels, nicht mehr außerhalb der Karte. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
+13
-2
@@ -62,6 +62,9 @@ var _joining := ""
|
|||||||
## The host's accepted guests when _process last looked. A new one ends a
|
## The host's accepted guests when _process last looked. A new one ends a
|
||||||
## pause.
|
## pause.
|
||||||
var _known_guests := 0
|
var _known_guests := 0
|
||||||
|
## Tiles whose burst of chips the own figure showed when it hit them, until
|
||||||
|
## the core reports that hit. Their burst is not shown a second time.
|
||||||
|
var _own_hits: Dictionary[Vector2i, bool] = {}
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
@@ -217,6 +220,7 @@ func _show_world() -> void:
|
|||||||
hud.show_stone(session.item_count(GwSession.ITEM_STONE))
|
hud.show_stone(session.item_count(GwSession.ITEM_STONE))
|
||||||
_update_status()
|
_update_status()
|
||||||
_next_dig_tick = 0
|
_next_dig_tick = 0
|
||||||
|
_own_hits.clear()
|
||||||
|
|
||||||
|
|
||||||
## Says in the status line how the game is shared, and with how many.
|
## Says in the status line how the game is shared, and with how many.
|
||||||
@@ -242,6 +246,7 @@ func _leave(message: String) -> void:
|
|||||||
map_view.reload()
|
map_view.reload()
|
||||||
avatar.is_walkable = Callable()
|
avatar.is_walkable = Callable()
|
||||||
figures.clear()
|
figures.clear()
|
||||||
|
_own_hits.clear()
|
||||||
_show_menu(message)
|
_show_menu(message)
|
||||||
|
|
||||||
|
|
||||||
@@ -403,11 +408,16 @@ func _apply(events: Array[Dictionary]) -> void:
|
|||||||
var tile := Vector2i(event["x"], event["y"])
|
var tile := Vector2i(event["x"], event["y"])
|
||||||
map_view.refresh_tile(tile)
|
map_view.refresh_tile(tile)
|
||||||
# The own hits showed their burst when they were made.
|
# The own hits showed their burst when they were made.
|
||||||
if event["player"] != local:
|
if event["player"] == local:
|
||||||
|
_own_hits.erase(tile)
|
||||||
|
else:
|
||||||
map_view.hit(tile)
|
map_view.hit(tile)
|
||||||
"tile_changed":
|
"tile_changed":
|
||||||
var tile := Vector2i(event["x"], event["y"])
|
var tile := Vector2i(event["x"], event["y"])
|
||||||
map_view.refresh_tile(tile)
|
map_view.refresh_tile(tile)
|
||||||
|
# The core does not say whose hit broke the tile; an own hit
|
||||||
|
# showed its burst already.
|
||||||
|
if not _own_hits.erase(tile):
|
||||||
map_view.hit(tile)
|
map_view.hit(tile)
|
||||||
"item_gained":
|
"item_gained":
|
||||||
if event["player"] == local:
|
if event["player"] == local:
|
||||||
@@ -453,8 +463,9 @@ func dig_at(tile: Vector2i) -> void:
|
|||||||
return
|
return
|
||||||
session.dig(tile.x, tile.y)
|
session.dig(tile.x, tile.y)
|
||||||
_next_dig_tick = session.tick() + GwSession.DIG_COOLDOWN_TICKS
|
_next_dig_tick = session.tick() + GwSession.DIG_COOLDOWN_TICKS
|
||||||
if session.terrain_at(tile.x, tile.y) != GwSession.TERRAIN_GROUND:
|
if MapView.SOLID.has(session.terrain_at(tile.x, tile.y)):
|
||||||
map_view.hit(tile)
|
map_view.hit(tile)
|
||||||
|
_own_hits[tile] = true
|
||||||
|
|
||||||
|
|
||||||
## Writes the running world as the save. Returns false if nothing was
|
## Writes the running world as the save. Returns false if nothing was
|
||||||
|
|||||||
@@ -392,3 +392,17 @@ func test_an_own_hit_shows_its_burst_at_once() -> void:
|
|||||||
main.dig_at(rock)
|
main.dig_at(rock)
|
||||||
check_eq(main.map_view.burst_count(), 1, "the burst shows before the hit lands in a tick")
|
check_eq(main.map_view.burst_count(), 1, "the burst shows before the hit lands in a tick")
|
||||||
_clean_up([directory])
|
_clean_up([directory])
|
||||||
|
|
||||||
|
|
||||||
|
func test_an_own_hit_that_breaks_the_rock_shows_its_burst_only_once() -> void:
|
||||||
|
var directory := TestFiles.temporary_dir("break")
|
||||||
|
var main := _start_main(directory)
|
||||||
|
main.play(false)
|
||||||
|
var rock: Vector2i = main.session.spawn_point() + Vector2i(7, -2)
|
||||||
|
for blow in 3:
|
||||||
|
main.dig_at(rock)
|
||||||
|
for tick in GwSession.DIG_COOLDOWN_TICKS + 1:
|
||||||
|
main._run_tick()
|
||||||
|
check_eq(main.session.terrain_at(rock.x, rock.y), GwSession.TERRAIN_GROUND, "three own hits break the rock")
|
||||||
|
check_eq(main.map_view.burst_count(), 3, "one burst per own hit, none more when the rock breaks")
|
||||||
|
_clean_up([directory])
|
||||||
|
|||||||
Reference in New Issue
Block a user