Skip to main content

Daily Goals (the daily ritual)

Daily Goals (the daily ritual)

Status: BUILT (E4) — themes the shared Daily framework (../../engine/daily-framework.md) for Zoo Simulator.

Last updated: August 30, 2026

Zoo Simulator — Daily Goals (the daily ritual)

Status: BUILT (E4) — themes the shared Daily framework (../../engine/daily-framework.md) for Zoo Simulator.

Parent: index.md. The shared rhythm (selection, streak, reward delivery, the daily NLU surface, the regression shape) lives in the framework; this doc records only the Zoo theme.

Thesis

Zoo Simulator's daily ritual is Daily Goals — one small, fresh management goal that resets at the UTC date boundary and gives a director a reason to open the skill today. It is built entirely on counters the zoo already maintains on ZooAccount; no new gameplay telemetry was added.

Selection

PERSONAL (date plus a stable per-player seed) so different directors get different goals on the same day. DailySelector.pickForDateAndPlayer over a stable three-objective pool; selection stores nothing and resets at the UTC date boundary.

Objectives (each reads an EXISTING tracker)

Objective key Spoken goal Tracker (existing) baselineMode Target
ZOO_EARN_BUCKS earn zoo bucks from your visitors today ZooAccount.lastDayTotalRevenue (+ lastDayRevenueAt day-stamp) ABSOLUTE_TODAY 1000
ZOO_BREED_ANIMAL breed a new animal in your zoo ZooAccount.totalAnimalsBorn (lifetime) DELTA_SINCE_DAY_START 1
ZOO_SATISFACTION raise your visitor satisfaction ZooAccount.visitorSatisfactionScore ABSOLUTE_TODAY 80
  • ZOO_EARN_BUCKS reads the per-day revenue snapshot the daily sim already writes (simulation.md § Phase 5, economy.md § Daily Revenue). The provider returns the snapshot only when lastDayRevenueAt is the current UTC day, so the goal resets daily.
  • ZOO_BREED_ANIMAL binds to the lifetime totalAnimalsBorn counter via DELTA_SINCE_DAY_START: the framework snapshots the raw value on first view and reports current minus snapshot, turning the lifetime counter into "bred today" with no new per-day birth counter. (The advance-day breeding output — simulation.md § Phase 3 — increments totalAnimalsBorn.)
  • ZOO_SATISFACTION reads the visitorSatisfactionScore recomputed by each advance-day, read directly (ABSOLUTE_TODAY).

Reward (economy-safe)

  • Base — soft Zoo Bucks. DailyReward.soft("ZOO_BUCKS", 500, 100): 500 Zoo Bucks on completion, scaling +100 per consecutive-day streak, capped by the shared MAX_STREAK_BONUS_DAYS = 7. Delivered through (the per-game financial service) and intentionally NOT in the premium audit ledger — soft currency is high-volume (economy.md § soft carve-out).
  • Streak milestone — premium Golden Tickets. getStreakMilestoneReward() = DailyReward.premium("GOLDEN_TICKET", 5, 0) with getStreakMilestoneInterval() = 7: every seventh consecutive completed day additionally grants 5 Golden Tickets through with source PremiumCurrencySource.DAILY_CHALLENGE, which writes the mandatory game_log.purchase_transactions audit row in the same call (economy.md § Premium Currency Mutation Discipline). The boot-time wiring assertion validates both the soft and premium paths, so a half-wired reward cannot ship.

NLU surface

The shared baseline daily / claim daily / start daily / daily streak commands (Tier 6 BASELINE_DAILY*) resolve in any Zoo session. No Zoo-specific synonyms are added; the baseline surface is the always-reachable entry.

Regression shape

  • Provider + reward → JUnit: (deterministic selection, the three baseline-mode reads, session-invariant reward declarations) and (soft Zoo Bucks ride ; the Golden Ticket milestone rides source DAILY_CHALLENGE).
  • Player flow → hermetic game_test.scenario_tests: asserts only the date-independent surface — the stable title "Daily Goals" and the "N of M" progress shape — never the rotating objective text.

Refs