Drop the pearls currency
Pearls were earned every run and spent on nothing: the aquarium fills up by finishing worlds, not by paying for it. A counter that only ever goes up is one more stat competing for attention on the result sheet and the home screen, and one more field to carry through the run payload, the progress file and both test suites. Stars and the animal ladder already say how a run went, so nothing is lost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -56,7 +56,6 @@ def _run_body(lesson_id: str, *, stars: int = 3, passed: bool = True) -> dict:
|
||||
"animal": "fish",
|
||||
"points": 42.0,
|
||||
"passed": passed,
|
||||
"pearls": 5,
|
||||
"strokes": [{"key": "a", "expected": "a", "correct": True, "at": 0.0}],
|
||||
}
|
||||
|
||||
@@ -171,7 +170,6 @@ async def test_get_progress_is_fresh_with_only_the_first_lesson_unlocked(
|
||||
body = (await client.get("/api/tippen/progress")).json()
|
||||
assert body["lessons"]["l01"]["unlocked"] is True
|
||||
assert body["lessons"]["l02"]["unlocked"] is False
|
||||
assert body["pearls"] == 0
|
||||
|
||||
|
||||
async def test_put_settings_round_trips(client: httpx2.AsyncClient) -> None:
|
||||
|
||||
@@ -53,13 +53,12 @@ def _curriculum() -> Curriculum:
|
||||
return Curriculum(worlds=worlds, lessons=lessons)
|
||||
|
||||
|
||||
def _result(*, stars: int, passed: bool, points: float = 10.0, pearls: int = 3) -> RunResult:
|
||||
def _result(*, stars: int, passed: bool, points: float = 10.0) -> RunResult:
|
||||
return RunResult(
|
||||
stars=stars, # type: ignore[arg-type]
|
||||
animal="fish",
|
||||
points=points,
|
||||
passed=passed,
|
||||
pearls=pearls,
|
||||
strokes=(Stroke(key="a", expected="a", correct=True, at=0.0),),
|
||||
)
|
||||
|
||||
@@ -99,7 +98,6 @@ def test_save_then_load_round_trips(tmp_path: Path) -> None:
|
||||
|
||||
assert reloaded.lessons["l01"].best_stars == 3
|
||||
assert reloaded.lessons["l02"].unlocked is True
|
||||
assert reloaded.pearls == 3
|
||||
# Atomic write leaves no temp file behind.
|
||||
assert list(tmp_path.glob("*.tmp*")) == []
|
||||
|
||||
@@ -209,16 +207,15 @@ def test_finishing_a_world_awards_its_creature_exactly_once() -> None:
|
||||
assert step3.progress.aquarium == ["clownfish"]
|
||||
|
||||
|
||||
def test_pearls_and_streak_accumulate() -> None:
|
||||
def test_streak_accumulates() -> None:
|
||||
curriculum = _curriculum()
|
||||
progress = fresh_progress(curriculum)
|
||||
day1 = record_run(
|
||||
progress, "l01", _result(stars=1, passed=False, pearls=3), curriculum, day="2026-01-01"
|
||||
progress, "l01", _result(stars=1, passed=False), curriculum, day="2026-01-01"
|
||||
)
|
||||
day2 = record_run(
|
||||
day1.progress, "l01", _result(stars=1, passed=False, pearls=4), curriculum, day="2026-01-02"
|
||||
day1.progress, "l01", _result(stars=1, passed=False), curriculum, day="2026-01-02"
|
||||
)
|
||||
assert day2.progress.pearls == 7
|
||||
assert day2.progress.streak.days == 2
|
||||
assert day2.progress.streak.last_played == "2026-01-02"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user