Skip to content

Add a forged iron frame around the minimap - #232

Open
Rokk001 wants to merge 133 commits into
tomluchowski:shaders-improvementfrom
Rokk001:feature/forged-minimap-frame
Open

Rokk001 wants to merge 133 commits into
tomluchowski:shaders-improvementfrom
Rokk001:feature/forged-minimap-frame

Conversation

@Rokk001

@Rokk001 Rokk001 commented Sep 30, 2026 •

Copy link
Copy Markdown

Adds a forged iron frame around the minimap: a metal ring, a compass boss and corner plates with hover and pressed states, plus matching navigation symbols.

Testing: built in Release under Windows (links without errors).

Depends on #199 and #173.

Rokk001 and others added 30 commits September 7, 2026 00:29
Embed per-monitor DPI awareness and maintain the verified OGRE 13.6.5 renderer patch required for context-safe window replacement, runtime GL options and correct fullscreen client geometry.

Validation: clean Release build, DPI and 3440x1440 fullscreen probes, three GL3Plus variants and the patch reverse check passed; version 0.7.1 remains unchanged because this is unreleased work and the project has no changelog.
Apply display, input, audio, gameplay, minimap, shadow and negotiated nickname changes to the running session while preserving rollback for failed window or input transitions and keeping the 3440x1440 navigation visible.

Validation: clean Release and Debug builds, packet tests, DPI, layout and GL3Plus probes passed; the user confirmed the reported resolution, fullscreen, cursor, flicker and navigation failures are fixed. Version 0.7.1 remains unchanged because this is unreleased work and the project has no changelog.
The spells tab put its ten buttons in a single row of 60 pixel squares running
out to x=700. The pane they live in is the window width minus the 200 pixels of
minimap, so at the 800 wide minimum window it is 600 pixels across, and the last
two spells, Weakness and the Eye of Evil, hung past its right edge where they
could be neither seen nor clicked. Only a window at least 900 wide showed the
whole row, and nothing said so.

The rooms tab solved the same problem long ago: two rows of 40 pixel buttons.
The spells tab now uses the same shape, five spells to a row, ending at x=300
with room to spare at any size the game accepts. The cooldown bar inside each
button now covers exactly its button too, instead of overhanging 20 pixels on
both sides, which with narrower buttons would have bled half way across the
neighbours.

The rooms tab had the tail of the same bug: the temple and portal buttons the
editor uses sat at x=570 to 690, past the same edge. They join the end of the
second row instead.

(cherry picked from commit 10db1cb)
Fit integrated shadows to the visible ground, synchronize caster culling, and enable depth-based reception on custom and generated materials. Preserve ambient light and apply the existing light attenuation to direct illumination.

Validation: isolated Windows Release build; 73 receiver cases, 146 settings checks, 60 lighting checks, and instanced-fog and vertical-wall renders. Linux runtime and the original full-map reproduction remain unverified.
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 the project coding guidelines. No behavioural change.
Replace the auto declarations introduced by this branch with explicit types,
as requested in issue tomluchowski#42 and required by the project coding guidelines. 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.
…econd

The heart maximum no longer depends on the number of covered tiles. A living
damaged heart regains 2.5 / turnsPerSecond per turn up to the maximum, a
destroyed heart never heals. Saves write HeartHealth10000; the older HeartHealth
(per tile scale) and HeartHP records are converted by share, so a full heart
stays full and a ruin stays a ruin. Messages that only carry a new whole HP are
sent at most once per second; percentage point changes and destruction are
still sent at once.
…ght-click to the heart

The ring of the heart badge is drawn as six segments separated by spokes. One
segment stands for one sixth of the health and a partly covered segment is
filled in part. The badge tooltip reads "Dungeon heart health bar" and the
info line "Dungeon heart at 17 %. Right-click moves the view to the heart."
A right-click on the badge moves the camera to the own heart.
…rivets, emerald health gems, ruby heart and embossed gold coin
…ges, lit from height maps with soft 3x3 sampling
Combining the creature indicator work into this branch replaced
source/entities/Creature.cpp with a version from before the worker
creation effect (tomluchowski#109). That dropped Creature::addParticleEffect(), which
Creature.h still declares and SpellSummonWorker calls, so the game no
longer linked. It also dropped the handling of timed non-creature
particle effects: exportToStream() saves and counts only creature
effects again, and doUpkeep() lets timed effects expire.

The restored code matches shaders-improvement.
…era input

Merging the creature indicator work into this branch brought back the old
key release handling in GameMode::keyReleasedNormal(): the arrow, WASD,
Q/E, Home/End and Page Up/Down cases that stop the camera and reset
directionKeyPressed. The continuous camera controls this branch builds on
replaced that handling and removed directionKeyPressed, so the branch no
longer compiled. Remove the stale cases again.
…adges (tomluchowski#199)

The forged minimap frame needs both: the badge drawing helpers from tomluchowski#199
and the navigation icon shading from tomluchowski#173. Both features are kept in full.

Resolved conflicts:
- README.md: kept all paragraphs added on the tomluchowski#199 side. The line
  "Press Alt to toggle creature health and needs indicators on or off." is
  unchanged merge-base text on the tomluchowski#199 side; tomluchowski#173 later replaced it with
  the description of the default-visible indicators, level, experience and
  attack-recovery display and transparent depleted segments, so that newer
  wording is used.
- gui/OD.looknfeel: the menu widget looks (OD/MenuSymbolButton to
  OD/SettingsSlider) exist only on the tomluchowski#199 side; the conflict comes from
  the virtual merge base of this criss-cross merge, not from a removal on
  the tomluchowski#173 side. Kept them. The NavigationColour sections of
  OD/GameTabButton from tomluchowski#173 merged cleanly.
- source/modes/GameMode.cpp: keyReleased and onFrameStarted. The tomluchowski#199 side
  already contains every tomluchowski#173 line (Alt release, M key release, map detail
  refresh) in a different order, plus the idle hand, defeat sequence and
  production queue refresh. Kept the tomluchowski#199 side.
- source/render/CreaturePanel.cpp: tomluchowski#173 still had the combined portrait
  tooltip from the merge base; tomluchowski#199 split it into tooltip and context help.
  Kept the tomluchowski#199 side.
- source/render/Gui.cpp: both sides added helper functions after
  createMiniMapCornerImages(). Kept shadeNavigationIcon() and
  colourNavigationAtlas() from tomluchowski#173 (still called by
  createNavigationImages()) followed by the badge helpers and
  drawBadgePixels() from tomluchowski#199. For the badge loop, tomluchowski#173 only spelled out
  the type of the old inline inSymbol drawing, which tomluchowski#199 replaced with
  drawBadgePixels(); kept the tomluchowski#199 call.
- source/render/RenderManager.cpp: kept both include sets
  (GroundShadowCameraSetup.h from tomluchowski#173, RoomObjectBounds.h and
  RoomObjectStep.h from tomluchowski#199).
The minimap now matches the forged look of the dungeon heart and gold
badges: an iron ring with bronze rivets and a stone haze, a bronze
compass boss instead of the font glyph, iron corner plates with ember
hover and pressed states, and embossed gold symbols for Query, Sell,
Options and the minimap zoom. All images are drawn at run time in
Gui.cpp with the badge drawing helpers; no image asset is added.
Behaviour is unchanged: clicks, tooltips, hit tests and map navigation
keep their code.

- source/render/Gui.cpp: new frame, compass, plate and symbol drawing;
  createMiniMapCornerImages() moves behind the new drawing helpers.
- source/gamemap/MiniMap.cpp: draws the frame and compass images instead
  of the grey bands and the glyph.
- gui/OD.looknfeel, gui/ModeGame.layout: hover and pressed plates for
  OD/MiniMapCornerButton and the new corner symbols.
- source/tests/check_navigation_style_textures.py: geometry checks and
  optional previews of the new textures.
- docs/development/NAVIGATION-FORGED-STYLE.md: describes the look.

Depends on the HUD badge drawing helpers (tomluchowski#199) and the navigation icon
shading (tomluchowski#173).
Two Doxygen "\brief" tags in the minimap frame code carried a backspace
control character instead of "\b". Written correctly. No code change.
shadeNavigationIcon() uses std::function since the explicit type cleanup, so the generated test program must include <functional> to compile.
…d minimap frame

tomluchowski#173 now includes <functional> in
source/tests/check_navigation_icon_shading.py. shadeNavigationIcon()
takes a std::function, so without the include the check did not
compile. This takes over that corrected state of tomluchowski#173, so the check
listed as still passing in docs/development/NAVIGATION-FORGED-STYLE.md
builds and passes again. No other change; merged without conflicts.

This branch has not been deployed

No deployments
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.

2 participants