Skip to content

Play a defeat sequence when a dungeon heart is destroyed - #147

Closed
Rokk001 wants to merge 4005 commits into
tomluchowski:shaders-improvementfrom
Rokk001:pr/defeat-sequence-2026-09-25
Closed

Rokk001 wants to merge 4005 commits into
tomluchowski:shaders-improvementfrom
Rokk001:pr/defeat-sequence-2026-09-25

Conversation

@Rokk001

@Rokk001 Rokk001 commented Sep 25, 2026 •

Copy link
Copy Markdown

What

When a player's dungeon heart is destroyed, the defeated player now gets a defeat sequence instead of only a chat message. The interface disappears, the camera cuts to the heart, the heart shakes and bursts into rubble, a swirl in the conqueror's colour crosses the platform and the screen fades to black. A debriefing follows with per-seat statistics and one button back to the main menu. The platform of the heart stays as a ruin. While the heart is damaged, the ring of the top-left badge shows its remaining health, and a one-time warning appears when it is in critical condition.

Addresses #5.

Changes

  • Heart health: the heart gets its own health pool of 10,000 per room tile (90,000 for the 3x3 heart). Workers no longer damage an enemy heart. A saved heart with the old health record is converted to the same share of the new maximum.
  • Health ring: the ring of the top-left badge shrinks with the remaining health of the player's heart and the badge glows while the heart is hit. The server sends the ring fraction and the exact HP at game start and after loading, when the fraction changes by at least one percentage point, whenever the exact HP changes (the hover tooltip), and immediately when the heart is destroyed.
  • Warning: one text message when a heart is hit at 11 % health or less; not sent on the killing hit, in the editor or to non-human players.
  • Messages: new playerDefeated (conqueror seat, heart tile) and levelStatistics server messages, sent to the defeated human player only.
  • Statistics: six per-seat counters (keepers defeated, creatures killed, heroes destroyed, rooms captured, items made, creatures converted) and a table in the debriefing.
  • Sequence: runs on a monotonic clock, blocks game input, and ends in the debriefing. The confirm button opens the main menu with the skirmish sub-menu after a short zoom.
  • Ruin: only the heart object is released; the floor stays and the seat still counts as having no dungeon core, so the existing defeat handling is unchanged.
  • Tests: ten new check scripts and adapted existing ones.

Depends on

#143. Until it is merged the diff also shows its commits; the new work is the last six commits.

Validation

  • The Release build succeeds for the full branch and for each of the commits.
  • 36 of 39 check scripts pass. The three that fail (construction hammer, construction preview, heart construction) fail the same way on the head of Protect dungeon hearts and target the core in combat #143.
  • The sequence, the ring and the new health pool were played through in game on a local build with further changes. This branch itself was compiled and checked but not yet run in game, so the look and timing of the sequence, the ring and the debriefing still need an in-game test here.
  • Not included: restart, replay and spectate options.

tomluchowski and others added 30 commits May 12, 2023 11:35
Now when adding an info of a command, please add to the map in the static getDocString function and then use the function getDocString().at(someCommandName)
…esktop, so the xdg-open should work with default web browser
  patched to compile on MS Visual Studio Code
  some functions got return statements
  the reloading new level file in edtior should work fine -- proper cleanup procedure between levels
Library room has a new carpet pattern
split of Tile to Tile and TileLava class
improved cleanup after game and editor mode
one can reload new levels without a crash
…r every creature owned by player, now the tangents are correctly re-generated for every model in the game, split of SelectionEntityWanted.h into separate file
This packages the accepted implementation without private development notes. No release version or changelog change is required for this unreleased contribution.
This packages the accepted implementation without private development notes. No release version or changelog change is required for this unreleased contribution.
This packages the accepted implementation without private development notes. No release version or changelog change is required for this unreleased contribution.
…62408a1c296287d00f9e647306654deb35ca' into HEAD
This packages the accepted implementation without private development notes. No release version or changelog change is required for this unreleased contribution.
Replace the auto declarations introduced by this branch with explicit types,
as requested in issue tomluchowski#42 and required by CLAUDE.md. No behavioural change.
When an enemy hits a heart that is at or below 11 % of its durability,
the human owner receives one event message. No warning on the killing
hit, for AI or defeated owners, or in the editor.
When a human player loses the last dungeon heart, the server sends two
owner-only messages appended to ServerNotificationType: playerDefeated
with the conqueror seat and the heart tile, and levelStatistics with the
elapsed time and six per-seat counters (keepers defeated, creatures
killed, heroes destroyed, rooms captured, items made, creatures
converted). The counters are kept per seat on the server and are not
saved. The client stores the statistics and hands playerDefeated to a
new GameMode::startDefeatSequence entry point.
On playerDefeated the client hides the interface and pointer, blocks
input and cuts the camera to the destroyed heart. A client-only copy of
the heart shakes and bursts into particles and a rubble pile, a swirl
in the conqueror's colour leaves the heart, and a red tint, two
subtitles and a fade to black follow. The timeline runs on a monotonic
clock, so repeated frame callbacks do not speed it up.

On the black screen a debriefing window shows the player, the outcome,
the elapsed time and a per-seat statistics table from levelStatistics.
Its confirm button returns to the main menu, which zooms in briefly and
opens the skirmish sub-menu.
When a heart's health reaches 0, only the heart object is removed. The
room keeps its floor tiles as an inert ruin with no health, so the seat
has no temple any more and the existing defeat path runs as before. The
ruin cannot be attacked, its floor is never released in game mode, and
a saved ruin gets no new heart object on load.
The heart took its health from the durability of its floor tiles, so a
3 by 3 heart fell to a few blows. It now has 10000 health per room tile
(90000 for a 3 by 3 heart); the critical warning stays at 11 % of this
maximum. Only fighters damage an enemy heart: workers deal no damage to
it, and a worker given a non-creature target drops its fight action.

Saves write the heart health as "HeartHealth" on the new scale. An older
"HeartHP" record is converted to the same share of the new maximum, a
value above the maximum is limited to it, an unknown record is rejected
and a destroyed heart stays a ruin.
The green ring of the heart badge now shows the remaining heart health
of the local player as an arc, and the badge glows magenta for three
seconds after the heart was hit. The server sends the new owner-only
heartHealth notification (appended last to ServerNotificationType) when
the health fraction changed by at least one percentage point, when the
heart is destroyed and once when a game starts or is loaded. The client
redraws the badge into its existing texture with blitFromMemory, since
loadFromMemory would create a new texture that the badge never shows.

The badge drawing moves into drawBadgePixels, with the symbol test as a
named function instead of a lambda.
The badge icon still said "Your Mana". The heartHealth message now also
carries the current and maximum heart HP, the server sends it on every whole
HP change, and the client sets the icon tooltip and context line to
"Dungeon Heart: current/max" every frame. The badge tooltip in the layout
reads "Dungeon Heart Health" until the first message arrives.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants