2026 10 23 project towers design - xopherdeep/do-it-for-the-xp GitHub Wiki
Date: 2026-10-23. Status: written for the owner's review (board #1535 follow-up). Brainstormed with the owner in chat the same day; every decision below is theirs unless marked as an assumption.
The owner's words: "Ganon's Tower should be the ultimate dungeon, which could be spring cleaning, moving out, etc. ... maybe this tower is something that does take a week/month."
Two separate things come out of that:
- The Moon Temple stays Ganon's Tower, the endgame of everyday chores (8 floors, 21 must-clear rooms, woken floor by floor). Its seven repeating moon beasts are painted under #1528. Misery Mire is dropped as the fallback. This closes the size question on #1535.
- Project Towers are new: a Game Master starts a big real-life project (Spring Cleaning, Moving Out, and later others), and the game builds a tower for it out of one-off chores. The family climbs it together over a week or a month; it is finished when the project is.
Success: a parent starts "Spring Cleaning" on a Saturday, the kids see a tower rise in Hometown, every closet and garage shelf they finish moves the family up a floor, an early floor pays double, and when the last boss falls a family reward unlocks and the credits roll.
This spec covers Project Towers only. Moon Temple tuning is content work on the existing temple.
| Question | Decision |
|---|---|
| What a tower is | A tower per project, separate from the Moon Temple. |
| The Old House | Folded in: Moving Out becomes the first project type; one builder for every type. |
| Pacing | The Game Master sets an end date; phase due dates are spread up to it; the family may climb ahead. |
| Chore source | A suggested list per project type, sized by age; the Game Master edits it before the build. |
| What a floor is | One phase of the project (e.g. Declutter, Deep Clean, Organize, Final Inspection). |
| Who climbs | The family together: one shared tower; each chore assigned to a hero; a floor opens upward when all its chores are done, whoever did them. |
| The finish | Usual payouts plus: a family reward, a trophy that stays, re-run from last time's list, and a credits roll. |
| Early-finish multiplier | Per floor, as a team; slides with how early; split evenly among the heroes who worked the floor. |
| Running late | Dates hold; the floor earns no bonus and its overdue chores ambush as usual; the Game Master can extend the end date. |
| Credits | Both, in order: the tower's heroes, then the game's makers (the owner's family), with ages. |
| Active projects | One at a time. |
A project type is one file under src/lib/services/core/packs/projects/ (movingOut.ts, springCleaning.ts), typed by projectTypes.ts:
-
id,name("Spring Cleaning"),towerName("The Spring Spire"), the music slot and the theme. -
phases: an ordered list, each withid,nameandshare(its fraction of the project's time; shares sum to 1). Spring Cleaning: Declutter 0.3, Deep Clean 0.4, Organize 0.2, Final Inspection 0.1. Moving Out: the Moving House pack's own phases, Declutter and Donate 0.3, Pack the Quiet Rooms 0.3, Bedrooms and Living Rooms 0.3, Kitchen and Bathrooms Last 0.1 (its Unpack and camp dailies stay out of the tower). -
chores: suggested chores per phase and per room kind (the room kinds the Old House already knows: kitchen, bedroom, bathroom, garage, ...), each with a name, a default difficulty on the Fibonacci slider and an optional library beast. -
finale: the final boss chore (Moving Out: "Hand Over the Keys"; Spring Cleaning: "The Final Inspection"). -
defaultDays: the suggested length (Spring Cleaning 14, Moving Out 28).
Adding a project type later (Holiday Prep, Back to School) is a content file plus its spec cases; no engine work.
The Game Master starts a project in the Admin console, where the Moving House dialog lives today, in five steps:
- Pick a type.
-
Your house: the rooms, floors and basement questions the Moving House dialog asks today (
movingTemple/houseRooms.ts), reused as they are. -
The chore list, grouped by phase. Each suggested chore is pre-sized and pre-assigned to a hero by age (the existing
heroAge.tsrules: small chores to the youngest, bosses to a parent). The Game Master ticks or unticks, renames, resizes, reassigns, and adds their own chores. -
The end date (the type's
defaultDaysfrom today, editable) and the family reward, free text in the Game Master's words ("Pizza night at the new house"). - Build. The tower appears in Hometown.
A second project cannot start while one is active. Abandoning a project keeps every chore already paid, deletes the project's open quests and removes the tower (no trophy).
- One floor per phase, plus a roof. 1F is the first phase; the roof is a small floor holding only the final boss.
-
Each floor is the family's house again. The Old House floor planner (
movingTemple/housePlanner.ts) lays out the rooms that have chores in that phase; each room holds that phase's chores for it (multi-quest rooms,content.questIds). A room with nothing to do in a phase is left off that floor. - Floor boss and the way up. The phase's biggest chore holds the floor's boss room; the stairs up sit beside it.
-
New lock: floor cleared. The stairs up carry
content.locked: 'floorCleared': they open when every chore on the floor is done, by anyone. The solver, the audit and the temple screen learn the new lock beside'small'and'master'. - Floor-by-floor wake, shared. A floor's chores become real one-off quests (assigned as the list set them, due on the phase's date) when the floor below is cleared, or the first time any hero of the family reaches the floor, whichever comes first (plan refinement: waiting for someone to walk upstairs could leave a phase's chores off the board until its date had passed). 1F wakes at the build. Floors nobody has reached put nothing on the quest board and ambush nobody. For a project tower the wake is the family's, not one hero's.
-
Shared state. One tower state for the family: a room clears for everyone when its chores are done. The tower is a generated temple (
gen-project-<typeId>) in Hometown, as the Old House is.
- Schedule. The days from the start to the end date are split by the phases' shares, rounded to whole days, with at least one day per phase; the last phase ends on the end date and the roof's final boss is due on the end date. The temple header shows the floor's clock ("Deep Clean: due Sat, 3 days left").
- Usual payouts. Each chore pays its XP, GP and AP when it is done, as every quest does today.
-
Early-finish bonus. When a floor's last chore is done ("Floor cleared!"), the floor pays a bonus:
- multiplier
m = 1 + clamp((dueAt - clearedAt) / (phaseLength / 2), 0, 1): ×1 at the due date, rising to ×2 for a floor cleared within the first half of its phase; - the bonus pool is
(m - 1)× the XP and the GP of every chore on the floor (AP is not multiplied); - the pool is split evenly among the heroes who completed at least one chore on that floor (assumption: a remainder goes to the hero who finished the floor's last chore);
- the floor shows the live offer to everyone: "Clear this floor by Thu for ×1.6";
- the roof works the same way against the end date.
- multiplier
- Running late. A floor cleared after its due date pays ×1 (no penalty beyond the bonus it missed). Its overdue chores ambush as any overdue quest does (questAmbush.ts). Later phases keep their dates.
- Extending. The Game Master can move the end date in the project's settings; the floors not yet cleared are spread again from today to the new end date by their shares. Cleared floors keep their bonus.
- The game's rule that it never grows harder over time holds: the multiplier changes rewards only, never fights.
After the final boss's victory:
- The family reward unlocks for every hero, in the Game Master's words, as a reveal on each hero's device the next time the app opens. It shows in the Game Master's Approvals as "Family reward earned", which they mark as given when it happens.
-
The credits roll, full screen, SNES style, with the tower's music:
- The Heroes of : each family member with their class, the chores and bosses they cleared, the floors they worked, the start and finish dates, and how many days early the family finished.
-
Do It For The XP, the game's makers (fixed,
src/lib/services/copy/credits.ts), with each maker's age shown:- Producer: Xopher Pollard aka XP
- Character Design / Original Chore List: Krislynn Night
- World Map Design: Khronus Infinidee
- Bestiary / Chore / Enemy Design: Gaia Rhae-Satori
- Dungeon Mechanics: Ronan Tesla
- Play Tester: Kairos Sol
- "Thank you for playing!"
- The trophy. The cleared tower stays in Hometown as a monument. Tapping it shows the dates, each floor's bonus and a "Watch the credits" button. Its rooms hold no fights.
- Re-run. The trophy offers "Start again", and picking the same project type later suggests the last run's final chore list (with the Game Master's renames and own chores) as step 3's starting list.
Ages in the credits. credits.ts keeps each maker's birth year; the age shown is the age they turn in the current year (the owner gave ages as of 2027: 43, 20, 17, 13, 13, 7), so it stays right without yearly edits. Owner check: the repository is public and the credits show to every family that plays, so the makers' names and ages will be public; confirm before the credits file ships.
-
Project record (one per family, persisted through StorageService like the other databases):
typeId,templeId,startedAt,endAt,phases[](id,dueAt,clearedAt?,multiplier?,bonusPaid?),reward(text,earnedAt?,givenAt?),choreList(the final edited list, kept for re-runs),status(active|cleared|abandoned). Who did what for the credits is read from the quests' completions, not stored twice. One record, so Family Sync can carry it later. -
Pure modules (jest specs beside each):
projectTypes.ts+ the type files,projectTower.ts(type + house answers + edited list + dates → temple record, per-floor quest drafts, phase schedule),projectSchedule.ts(shares → due dates; extend),floorBonus.ts(multiplier, even split),credits.ts. -
Reused:
houseRooms.ts,housePlanner.tsper floor;houseRecord.tsgeneralised to stack phase floors and add the roof; the multi-quest rooms; the floor wake (wakeOnEntry.ts), made family-wide forgen-project-temples;QuestCompletionServicefor payouts and a bonus grant at floor clear. -
Screens: the start wizard (the shared wizard shell, steps 1-5), the floor clock and bonus offer in the temple header, the "Floor cleared!" fanfare,
CreditsRoll.vue, the trophy sheet, the reward reveal and its Approvals row.
Moving Out is the Old House's content reshaped into the pack's four phases (section 3), with the roof's Hand Over the Keys built from the van-loading boss chore. The Old House (gen-move-house) keeps working until the family starts a Moving Out project; that project's step 3 is pre-filled from the family's Moving House answers and their open moving chores, and building it retires the Old House (its paid chores stay paid). After that, the Moving House pack's temple builder (movingTemple.ts) is removed in favour of projectTower.ts.
- Every project type across many house shapes (as
movingTemple.spec.tschecks the Old House today) builds, is solvable with the new floor-cleared lock, and passes the audit. - Schedule: shares to whole days, a minimum of one day per phase, the last phase ending on the end date, extending re-spreads only the uncleared floors.
- Bonus: ×1 at the due date, ×2 at half the phase or earlier, ×1 when late, the even split with its remainder rule, AP untouched.
- Re-run: the last list comes back with the Game Master's edits.
- Credits: the age a maker turns in a given year; the heroes' part read from completions.
- One Cypress walk on the seeded world: start Spring Cleaning, clear 1F early, see the bonus, beat the roof, watch the credits.
- Several active projects at once.
- Moon Temple tuning beyond #1528's art.
- Sharing project types between families (packShare already exists and can carry them later).
- Multiplayer beyond one family's shared tower.