Files
TheLadder/Planning/02-corporate-ladder-mvp-spec.md

152 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Corporate Ladder Game — Minimum Viable Prototype (MVP) Spec
This is the scope for the **first playable version**. It intentionally leaves
out AI, promotion, multiple themes, and generated media — but it must be built
on data structures that support all of that later without a rewrite.
## Goal of This Version
Prove out the core turn loop: scripted choices → stat/relationship/money
changes → open-ended replayable play → an ending retrospective whenever the
player chooses to stop. Validate that the loop is fun in its simplest possible
form before adding complexity.
## Scope: What's IN
- **Single setting/theme**: modern corporate office, mailroom level only.
- **Single tier**: no promotion mechanic yet. The player stays in the mailroom
and can keep playing indefinitely.
- **Turns**: each turn represents a day or a week (pick one for the
prototype — day is likely simpler to reason about first).
- **Two characters**:
- One boss (authority figure — approves/denies requests, can make life
easier or harder).
- One coworker rival (peer-level, competing for the same eventual
promotion, can help or hinder).
- Both have: name, flavor description (personality/appearance color text),
and the three relationship stats (likes-you, fears-you, wants-to-help-you)
toward the player.
- Both have tags for role type (e.g. `boss`, `rival`) so later additions of
more characters (mentor, peer, etc.) slot into the same schema.
- **Player stats**:
- Money (with basic income and basic recurring costs).
- At least one skill (e.g. negotiation) that can grow organically from
relevant choices and can gate at least one choice option.
- The three relationship-facing stats as tracked per-character (not global).
- **Choices per turn**: a small, fixed set (2–3 scripted options), each with
a clear immediate effect on stats/relationships/money. No free-text input
yet — that's a later phase.
- **Random events**: a very small number (a handful) of simple scripted
events that can occasionally fire instead of, or alongside, a normal turn's
choice set. Kept minimal, but implemented through the same generic
event-data structure the full game will use later (not a special-cased
hack).
- **Soft failure state**: at least one basic version of the "soft failure"
loop — e.g. if money goes negative, the player is offered a demeaning
option (take a loan, do a favor for the rival) rather than the game ending.
- **Open-ended play**: no turn cap. The player can keep taking mailroom turns
for as long as they want.
- **Ending / retrospective**: a simple end-of-session summary screen the
player can trigger (e.g. a "wrap up my career" action, or reaching it when
they close out), showing: final money, final relationship stats per
character, and a short list of notable moments/events that occurred. This
screen should look the same in structure whether the player did "well" or
"poorly" — it's a summary, not a win/lose screen.
- **Save system**:
- Browser local storage as the live/default save.
- Explicit export-to-file and import-from-file so progress survives a
cleared cache or browser crash.
- **Feedback & logging system** (present from turn one, even without AI):
- A persistent, always-visible-by-default feedback widget on the turn
screen: thumbs up / thumbs down / neutral, plus an optional free-text
comment box. No action required — ignoring it does nothing.
- Every player action and its resulting effects are logged.
- Feedback and logs are captured in their own **separate export**, distinct
from the game save file.
- **Data-driven structure for everything above**: characters, events, and
choices should all be represented as data (e.g. JSON-like structures) that
a generic engine reads and processes — not hardcoded if/else logic per
character or event. This is the seed of the "themes are just data" and
"events are just data" architecture from the big-picture vision.
## Scope: What's explicitly OUT (for now)
- No promotion or second tier.
- No free-text/AI-driven input or dialogue.
- No AI-generated images or video.
- No multiple themes/settings (mailroom/corporate only).
- No multiplayer (never planned — out of scope permanently, not just for
MVP).
- No complex leverage/blackmail system yet — at most a placeholder field on
characters that isn't deeply used yet.
- No account system — local storage + file export/import only.
- No dedicated "training" or skill-grinding menu — skill growth stays
incidental to choices.
## Tech Stack for MVP
- Fully client-side: HTML, CSS, and JavaScript, runnable directly in a
browser with no required backend.
- If any server component exists at all, it should be limited to serving
static files — no game logic server-side.
- No external dependencies beyond what's needed to keep the app simple and
self-contained (avoid heavy frameworks unless there's a clear reason).
- Game state, character data, and event data should be structured as plain
data objects/files so they can later be swapped or extended (new themes,
more events, more characters) without touching engine code.
## Suggested Data Shape (Starting Point)
This isn't final, but gives a concrete starting schema for the MVP:
**Character**
- `id`
- `name`
- `role_type` (tag, e.g. `boss`, `rival`)
- `description` (flavor text)
- `likes_you` (number)
- `fears_you` (number)
- `wants_to_help_you` (number)
**Event / Turn Choice**
- `id`
- `stage_tag` (e.g. `mailroom`) — for future filtering by level
- `description` (flavor text shown to player)
- `options[]`, each with:
- `label`
- `effects` (changes to money, skill, relationship stats)
- `requires` (optional skill/stat gate)
**Player State**
- `money`
- `skills` (map of skill name → value)
- `relationships` (map of character id → stat object)
- `history` (log of turns taken, for the retrospective screen)
**Feedback Log Entry** (separate export, not part of save)
- `turn_id`
- `action_taken`
- `rating` (up / down / neutral / none)
- `comment` (optional text)
- `desired_but_unavailable_action` (optional text, if the player wanted
something not offered)
## Definition of Done for MVP
The prototype is "done" when a player can:
1. Start a new game in the mailroom.
2. Take repeated turns, choosing from a small set of scripted options each
time, watching money, skill, and relationship stats change.
3. Occasionally encounter one of the small set of random events.
4. Hit a soft-failure scenario (e.g. run out of money) and be offered a
demeaning-but-survivable option instead of a game over.
5. Leave optional feedback (thumbs up/down/neutral + comment) on any turn.
6. Save and reload their game via local storage, and export/import via file.
7. Trigger an end-of-session retrospective screen summarizing their run.
8. Keep playing indefinitely if they choose to, with no forced ending.
All of this should be built on data structures (for characters, events, and
choices) that will support adding new events, new characters, a promotion
tier, and eventually new themes — without needing to rewrite the core engine.