Skip to content

feat(quests): resume attempts, neutral gem tiles, difficulty tuning - #19

Merged
uhmin99 merged 2 commits into
devfrom
feat/quest-resume-and-tuning
Jul 15, 2026
Merged

uhmin99 merged 2 commits into
devfrom
feat/quest-resume-and-tuning

Conversation

@uhmin99

@uhmin99 uhmin99 commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Three playtest fixes from on-device feedback.

Resume quest attempts

Quest attempts are now persisted and resumable, matching classic. SaveData
carries questRun (a GameState snapshot) plus the pack/stage/level ids.
The controller persists on start and after each move, and clears the
snapshot on win/loss; quit keeps it. The map's _play resumes the saved
run when the tapped node matches (otherwise starts fresh). Leaving a stage
or killing the app no longer restarts progress.

Gem tiles neutral everywhere

Gem-bearing blocks always draw on the neutral light tile — in the tray and
once placed on the board — instead of the piece color, so a gem reads the
same before and after placement.

Difficulty tuning ("too easy")

  • New solvability.maxOpeningScore: the most the opening tray can score on
    its own, including the +300 all-clear bonus when the opening can empty
    the board.
  • The validator now rejects a score target ≤ that opening ceiling — four
    stages (s01/s02/t01/d01) were literally winnable from the opening cascade.
  • Score targets re-ramped ~500 → 1200, each floored above its ceiling.
  • Every gem stage now asks for 3–5 gem colors (many were single-color),
    with counts growing more aggressively.
  • The opening cascade is kept as-is (per direction) — the higher goals carry
    the difficulty.

Docs & tests

ARCHITECTURE / SAVE_MODEL / CONTRIBUTING_QUESTS / PROGRESS updated. New
tests cover the opening-ceiling rule, quest-run save round-trip, and
controller persistence/resume/clear. 94 tests pass, analyze clean.

🤖 Generated with Claude Code

uhmin99 and others added 2 commits July 16, 2026 08:41
Three playtest fixes:

Resume quest attempts (parity with classic). SaveData carries questRun
(GameState) + pack/stage/level ids; the controller persists on start and
each move and clears on win/loss; quit keeps the snapshot; the map resumes
it when the tapped node matches. Leaving a stage or an app kill no longer
restarts progress.

Gem-bearing blocks always render on the neutral light tile — in the tray
and once placed — instead of the piece color, so a gem reads the same
everywhere.

Difficulty (user: "too easy"). Score targets floored ABOVE each stage's
opening ceiling: new solvability.maxOpeningScore is the most the opening
tray can score alone (all-clear +300 included), and the validator now
rejects targets ≤ that ceiling — four stages were winnable from the
opening. Score ramps ~500→1200; every gem stage now asks for 3–5 colors
with counts growing more aggressively. Opening cascade kept per user.

Docs (ARCHITECTURE/SAVE_MODEL/CONTRIBUTING_QUESTS/PROGRESS) and tests
updated; 94 tests pass, analyze clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CI format check + lint fix for the previous commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@uhmin99
uhmin99 merged commit 274a210 into dev Jul 15, 2026
5 checks passed
@uhmin99
uhmin99 deleted the feat/quest-resume-and-tuning branch July 15, 2026 23:47
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