Skip to content

Adventure: location challenge ratings with map/HUD indicators and display setting - #11432

Open
liminalwarmth wants to merge 4 commits into
Card-Forge:masterfrom
liminalwarmth:upstream-challenge-ratings
Open

Adventure: location challenge ratings with map/HUD indicators and display setting#11432
liminalwarmth wants to merge 4 commits into
Card-Forge:masterfrom
liminalwarmth:upstream-challenge-ratings

Conversation

@liminalwarmth

@liminalwarmth liminalwarmth commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Adventure: location challenge ratings with map/HUD indicators and display setting

Adds an opt-out difficulty/exploration indicator system to Adventure mode's world map, plus curated challenge-rating data for the three planes that define ratings today. Enable or Disable with a new menu checkbox. Confirmed to work on both mobile and desktop orientations correctly.

Why is this needed? In Adventure mode, there's currently no way to take notes on locations or easily tell which ones you've already visited or cleared from the world map. It's also hard to remember which locations seemed too hard and are only partially cleared. This system fixes all of those problems with visual indicators on the locations and world map by assigning a difficulty to dungeons once you visit them at least one time and tracks both boss clears and full clears.

Note: The PR isn't quite as big as it seems because about 500 of those line additions are just tagging on the challenge ratings to locations across the three default planes.

Screenshot_2026-07-22_at_9 43 42_AM

What it does

  • Challenge ratings: points of interest may declare a challengeRating (low / medium / hard / veryHard) in points_of_interest.json. Planes without any ratings are completely unaffected visually by the rating indicators.
  • Overworld sprites: unexplored rated locations show a "?" badge; once visited, it becomes a color-coded difficulty dot (cyan/green/gold/red). Fully cleared locations show a red X instead. Locations whose known living crowned (boss) enemy remains alive show a small crown above the badge.
  • M-key map: previously visited rated locations show the same dot/X markers, scaling with zoom.
  • Location entry banner: entering a rated location appends its difficulty to the entry notification.
  • Visited/cleared tracking: per-location visited state and live cleared-state tracking (enemies and rewards, dialog-only NPCs excluded, respawning non-boss enemies ignored), including discovered sub-map chains; quest retargeting resets the whole chain so a new objective always gets a fresh clear.
  • Unexplored magnifier: the existing magnifier marker now appears on every enterable non-settlement location (previously caves/dungeons only), so castles and sideboss locations are marked until first entry. Towns/capitals intentionally never show it.
  • Setting: "Display dungeon difficulty ratings" (Adventure settings, default on, refreshes live) hides the ?/dot/crown/banner indicators. The cleared X and the magnifier are exploration markers rather than difficulty hints and intentionally remain visible.

Data

  • Shandalar Old Border (235 rated POIs): mapped from the community Old Border guide's location ratings, normalized to the four levels; multi-boss locations take their highest rating.
  • Standard Shandalar / common (224 of 264 POIs; also serves Amonkhet via resource fallback): boss-life audit with design-intent floors; towns, capitals, and treasure caves left unrated.
  • Realm of Legends (125 combat POIs): rated per the plane's own tier ladder.

Innistrad and Crystal Kingdoms define no ratings, so they show no rating indicators; they do gain the (rating-independent) cleared-X and magnifier exploration markers.

Compatibility

  • World saves: all new persisted keys are additive and guarded — pre-feature saves load fine (exploration state recovers on revisit from existing looted-object data), and saves written with this feature load on unpatched builds.
  • settings.json: the new key is absent-tolerant when loading old files (field default applies). Note that a downgrade after the key is written triggers libGDX Json's unknown-field failure path, which resets Adventure settings to defaults — pre-existing behavior for any new settings field, called out for transparency.
  • Three small glyphs (9×9 dot, 8×8 question mark, 9×9 X) are added to the three planes' items.atlas/items.png, placed in verified-free space with the pngs kept byte-identical to their current content outside the glyph rects. The glyphs are original pixel art created for this contribution, released under the project's license.
  • forge-gui-mobile gains its first unit test; its pom gets test-scope TestNG (matching forge-game's version), a testSourceDirectory, and a main-compile exclude for test/** (needed because the module uses a non-standard sourceDirectory).

Notes for reviewers

  • Tested extensively in my own gameplay on MacOS desktop and confirmed to work as expected on iOS on an iPhone 17.
  • The magnifier scope widening (cave/dungeon → all non-settlement) is the one intentional change to existing upstream-visible behavior (added because I noticed that Realm of Legends had some locations that didn't have the standard magnifying glass for unexplored locations and I wanted that to be applied consistently to non-towns); happy to gate it differently if preferred.
  • Default-on for the setting felt right because it's useful to know which dungeons have been visited and since planes without data see nothing; maintainer preference welcome.
  • Two follow-up PRs are planned on top of this baseline: a quest tracker overlay and a quest-offer contract pane, both consuming these ratings.
  • This contribution was substantially AI-assisted (planning, extraction, and review), per the contributing guidelines' disclosure request but directed by my design and feedback. Multiple rounds of code reviews were put in by Codex 5.6 Sol and Opus 5, with a final review by Fable.

…ation tracking, and crown badges

Add a four-level challenge-rating framework (low/medium/hard/veryHard)
for Adventure points of interest, an opt-out display setting
("Display dungeon difficulty ratings", default on), and the indicator
rendering that consumes it:

- Overworld location sprites show a colored dot for rated locations
  once visited, a gray question mark before that, a red X once fully
  cleared, and a half-size crown while a known living crowned
  (effect-carrying) enemy remains on any discovered floor.
- The town/dungeon/cave/castle entry banner appends the location's
  rating bullet to its name when the setting is on, and the banner's
  queued fade/slide actions are cleared before a new one starts so
  rapid re-entries never show a stale rating.
- Visited and cleared state is tracked live per point of interest
  (including a discovered sub-map chain so a dungeon's interior floors
  count toward its parent's cleared status), persisted in
  PointOfInterestChanges/WorldSave, and mirrored onto the M-key world
  map as the same colored dot / X badges. A magnifier icon marks any
  unexplored non-settlement location. Quest re-targeting resets the
  whole discovered chain so stale cleared state cannot leak onto a new
  objective.
- Dialog-only NPCs are excluded from cleared/visited tracking, and
  pre-patch saves recover exploration state via the existing
  hasDeletedObjects fallback.

Adds the ChallengeDot, ChallengeUnknown, and ClearedX sprites to the
common, Shandalar Old Border, and Realm of Legends item atlases
(original pixel art for this contribution).

Build plumbing: forge-gui-mobile had no unit tests before this change,
so its pom gains a test-scope testng dependency, an explicit
testSourceDirectory, and a main-compile exclude for test/** (the
module's sourceDirectory is the non-standard "src", which otherwise
sweeps src/test/java into the main compile and hides test-scope
dependencies from it). SettingsScene's boolean addSettingField()
helper also gains a CheckBox return so the new setting can disable
itself when no plane has rating data.

Note: two changes apply uniformly across every plane, not just rated
ones -- the cleared-X marker and the unexplored magnifier are
exploration features independent of whether a location has a rating,
so previously-unrated planes (e.g. Innistrad, Crystal Kingdoms) will
show them too, and the magnifier now appears on any non-settlement
location rather than only caves/dungeons.
Rate 235 of Shandalar Old Border's points of interest with reachable
enemy objects (161 low, 34 medium, 32 hard, 8 veryHard). Guide-covered
locations map every rated entry in the Old Border Shandalar official
guide (oldborder-shandalar.net) to its stable POI definition and root
map, normalizing guide aliases to low/medium/hard/veryHard and taking
the highest normalized rating where a location has multiple bosses.
Locations the guide does not cover are rated from encounter data: for
each unrated POI, every .tmx interior reachable from its root map is
walked, explicit enemy objects are collected, and the highest enemy
difficulty value converts to a rating (<=0.1 low, >0.1-0.4 medium,
>0.4-0.8 hard, >0.8 veryHard). Unrated towns/capitals require the
supplemental audit to have actually seen enemies there; rated ones
(Bazaar of Wonders, etc.) qualify like dungeons.

Excluded: guide-rated overworld enemies that are not POI locations
(Maelstrom Angel, Kid's Pet Ladybug); boss names that are shared
between a guide-rated location and an unrelated POI (Ancient Silver
Dragon also appearing at River Crossing/Homarid Island; Pirate Captain
also appearing in the Cidryl Shard Mines quest map) are rated
independently from their own encounter data rather than copying the
guide entry. Treasure caves with rewards but no enemy stay unrated.
Rate 224 of 264 common point-of-interest definitions -- the fallback
plane data serving standard Shandalar and Amonkhet -- using a
family-scoped boss-life audit: each POI's map is traversed to find its
strongest reachable enemy, stopping at the shared cave_multilevel
network unless the POI is itself rooted there, with nameOverride-aware
enemy resolution so renamed bosses still resolve to their real
definition. Design-intent floors are applied on top of the raw audit:
the castle type always floors to veryHard, sideboss tier labels act as
floors, network-rooted caves floor to at least hard, Camel Cave floors
to its guide label, and the Lavaforge Kobold is rated per its intended
(if typo'd) boss rather than the literal encounter data.

Unrated: towns, capitals, treasure caves, DEBUGZONE entries, and POIs
missing a map definition. Planes with their own POI files (Shandalar
Old Border, Realm of Legends) are unaffected by this fallback data.
Rate all 125 combat points of interest in Realm of Legends per the
plane's own tier ladder: cave = low, dungeon = medium, castle = hard,
with the endgame prisons and Arzakon's Fortress at veryHard and Yule
Town at medium. Towns and capitals stay unrated. Verified by a full
reachable-enemy life audit against the plane's own walkthrough guide,
cross-checking every rated location's boss set and normalized tier.
@liminalwarmth
liminalwarmth marked this pull request as ready for review July 28, 2026 01:43
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.

1 participant