# Game Design Document

**Working title:** Naked Desire
**Genre:** NSFW exhibitionist sandbox / life-sim
**Engine:** Unreal Engine 5 (C++ primary, Blueprint for content)
**Platform:** PC
**Perspective:** Third-person
**Audience:** 18+
**Reference titles:** Naked Order, Roshutsu, Roxanne's ENF Exhibitionist Game, Secret Flasher Sereka

> This document is the canonical design reference. It is written to be consumed by Claude Code (or any contributor) during implementation review and planning. When the design changes, this document should be updated first, then code.

---

## 1. Vision & Pillars

### 1.1 One-line pitch
A sandbox exhibitionist life-sim where the player accepts fetish commissions from an underground forum, balances rent and recognition against the thrill of public exposure, and progresses down one of three character paths over a 90-day time limit.

### 1.2 Design pillars
1. **Risk vs. reward, every second.** Walking outside is never neutral — coverage, time of day, NPC density, recognition, and lust all push the embarrassment meter constantly. Every decision (what to wear, which street to take, when to strip) is a calibration against a session-loss state.
2. **Persistent physical world.** Items are real objects in the world. A discarded skirt is *there* until something happens to it. The player's anxiety about losing clothing is mechanical, not flavor.
3. **Three distinct fantasies, one system.** Slut / Exhibitionist / Slave aren't cosmetic tags — they unlock different clothing, missions, attribute trees, and play styles. A Slave-path session looks fundamentally different from a Slut-path session.
4. **The forum is the spine.** Commissions drive minute-to-minute play, weekly missions drive medium-term goals, followers/reputation drive long-term progression. The forum is also the diegetic UI for most player-facing systems.
5. **Time pressure.** 90 in-game days. Rent every week. The clock never stops; the player must choose what to ignore.

### 1.3 Non-goals
- This is not a dating sim. NPCs are reactive systems, not relationships.
- This is not a combat game. Threats are evasion-based (police, stalker, harasser).
- This is not a story-driven linear game. The story is a framing device; the loop is the product.

---

## 2. Story & Setting

### 2.1 Premise
Yumi, while browsing the internet after a rent increase, discovers a hidden fetish forum that pays for exposure-themed commissions. After completing her first task she realizes she enjoys it. She begins taking commissions to cover rent and explore the new feelings.

### 2.2 Setting
A modern Japanese-style city. Currency is Yen. The city is the entire playable map: residential, commercial, parks, alleys, a beach (TBD), a gym, a beauty salon, multiple shop types, the player's apartment.

### 2.3 Tone
Sexual, playful, transgressive. The player character is a willing participant, not a victim. The "stalker" NPC is the only non-consensual antagonist and exists as a session-loss threat, not a narrative one.

### 2.4 Time structure
- **Total run length:** 90 days (3 months).
- **Day:** 08:00 → 20:00 in-game. Real-time duration ~45 min (half of the 1h 30m day/night cycle).
- **Night:** 20:00 → 08:00 in-game. Real-time duration ~45 min.
- **Week:** 7 days. Rent due at end of each week.
- **Sleep:** fast-forwards 8 hours, restores energy. Available at the player's apartment bed.

---

## 3. Core Gameplay Loop

### 3.1 Macro loop (per day)
1. Wake up at home. New daily commissions appear on the forum. Weekly commissions remain visible.
2. Plan: check commissions, check bank, check pending deliveries, check news/recognition.
3. Equip outfit from wardrobe. Pack bag (optional).
4. Leave the house → **session begins**.
5. Travel to commission locations, complete tasks, manage attributes.
6. Return home → **session ends**, rewards finalized, optional sleep.
7. Spend earnings (shops, gym, beauty salon), level up attributes, post photos.
8. Repeat. Pay rent at end of week.

### 3.2 Micro loop (during a session)
Move → observe NPC density and types → make a coverage/exposure decision → embarrassment/lust rises → action (complete commission step, take photo, flee, masturbate, redress) → reward or threat resolution → repeat.

### 3.3 Win / lose conditions
- **Win (campaign):** Survive 90 days. Endings are gated by progression path level and total followers (TBD specific thresholds).
- **Endless mode:** Unlocked after first campaign completion. Disables rent-based eviction. All other systems (session loss, embarrassment, lust, recognition, etc.) remain active. Lets players keep playing their character indefinitely. Implementation cost is minimal — a single flag on the run.
- **Lose (run):** Cannot pay rent → evicted → game over. Disabled in endless mode.
- **Lose (session):** Energy → 0, OR embarrassment → max, OR caught by police. Session loss has consequences (see §6.5) but does not end the run.

---

## 4. Session System

A session is the unit of "going outside." It is where 90% of gameplay happens.

### 4.1 Session start
Triggered by leaving the apartment. Snapshots current equipment, attributes, and time. All world items remain where they are.

### 4.2 During session
- Player moves freely. The world simulates NPCs, time, day/night.
- Attributes (embarrassment, lust, stamina, energy) update in real time per §7.
- Commissions can be progressed or completed.
- The player can freely re-enter the apartment to safely end the session at any time.

### 4.3 Session end (safe)
Player returns home. All carried items persist. Rewards from completed commissions are finalized. Embarrassment resets toward baseline. Energy partially restored (full restore requires sleep).

### 4.4 Session end (loss)
Triggered by any of the four loss conditions. On loss:
- The player is teleported home (or to a fail-state location — TBD).
- **All currently equipped clothing is forcibly dropped** at the loss location.
- **A bag currently placed in the world** (not carried) is lost along with its contents.
- **Unequipped clothing already lying on the ground anywhere** is lost.
- Reputation penalty (TBD magnitude).
- If lost to police: `wanted` flag set, requires action to clear (see §10.3).

> **Implementation note:** session loss must be a clearly defined transactional state. All "what gets lost" logic should live in a single SessionLossResolver to keep this deterministic and debuggable.

---

## 5. The Three Progression Paths

The player chooses how they level up but is not locked into one path. XP earned from commissions is path-tagged.

### 5.1 Slut
- **Unlocks:** revealing clothing (mini skirts, high heels, lingerie variants), masturbation action, masturbation-related missions.
- **Attribute access:** lust-related attributes (max lust, lust gain rate modifiers, masturbation energy efficiency).
- **Playstyle:** pushes lust as a resource. Risks blackout effects (§7.2).

### 5.2 Exhibitionist
- **Unlocks:** "expose-capable" clothing (coats, pleated skirts), public-display missions.
- **Attribute access:** embarrassment-related attributes (max embarrassment, embarrassment decrease rate, pulse).
- **Playstyle:** longer sessions, denser crowds, tolerance-building.

### 5.3 Slave
- **Unlocks:** BDSM clothing (latex suits, gags, cuffs, bars), restraint-themed missions.
- **Attribute access:** stamina-related attributes (max stamina, stamina recovery, energy efficiency).
- **Playstyle:** physically demanding, restriction-based puzzles (cuffs require NPC help to remove).

### 5.4 Path level
Each path has a level (e.g., 1–10). Level gates clothing, missions, and attribute upgrades. XP per path is independent.

---

## 6. Items

### 6.1 Item identity rule
**Every item is a unique physical instance.** Two blue tops can have different states (torn vs. pristine). Items do not teleport, do not duplicate, and persist with their internal data wherever they are placed or dropped.

**Implementation contract:**
- Each item has a unique runtime ID.
- Each item has a definition (immutable, shared) and an instance state (mutable, per-object).
- Items in the world are AActors. Items in containers are owned by the container's inventory component but retain identity.
- Saving and loading must preserve item identity, position, and per-instance state.

### 6.2 Item categories
- **Clothing** (§6.3)
- **Bags** (§6.4)
- **Phone** (one — special, §9)
- **Consumables** (food, §6.6)
- **Gadgets** (TBD beyond phone)

### 6.3 Clothing
Attributes per clothing instance:
- `type` — equipment slot (top, bottom, underwear-top, underwear-bottom, outerwear, footwear, accessory, restraint, etc. — final slot list TBD).
- `covers` — set of body parts: `{ boobs, ass, genitals, ... }`.
- `progressionPath` — Slut / Exhibitionist / Slave / None.
- `color` — primary color enum.
- `coverage` — float [0,1].
- `isUnderwear` — bool. If true, effective coverage = `coverage / 2`.
- `condition` — float [0,1]. Starts at 1.0 (new). Decreases via §6.3.4.
- `canExpose` — list of body parts this garment can momentarily reveal without unequipping (e.g., coat → boobs, ass).
- `isRestrictive` — bool. If true, restricts hand use; requires NPC to remove.
- `containerSlots` — optional inventory (e.g., pants pocket for phone).

#### 6.3.1 Coverage resolution
For each body part `b`:
- Find the set of equipped garments covering `b`.
- Effective coverage of `b` = `max(effectiveCoverage of garments covering b)` where `effectiveCoverage = isUnderwear ? coverage/2 : coverage`.
- If a non-underwear garment covers `b`, underwear coverage of `b` is ignored.
- Body part is "exposed" if effective coverage = 0.
- Lower total coverage → faster embarrassment gain when observed (§7.1).

#### 6.3.2 Equipping & unequipping
- Equip/unequip anywhere in the world via the quick action menu.
- Unequipped clothing becomes a world AActor at the player's location.
- Clothing on the ground can be picked up when the player is in range.

#### 6.3.3 Theft
- Clothing left unattended (no player nearby, not in a bag) for X minutes (TBD) is at risk of being stolen by an NPC.
- Clothing inside a bag (even if the bag is on the ground) is safer but the **bag itself** can be lost if the player loses the session while the bag is placed in the world.

#### 6.3.4 Rip & tear
- Moving through bushes, against walls, or other rough collisions decrements `condition`.
- Damaged clothing renders visually torn and exposes additional body parts (coverage drops).
- Damage is irreversible. Damaged clothing cannot be repaired.
- When `condition` reaches 0, the item disappears.
- New clothing always starts at `condition = 1.0`.

#### 6.3.5 Exposing
- Some clothing (e.g., coat, pleated skirt) supports a per-garment expose action.
- Triggering expose temporarily reveals listed body parts without removing the garment.
- Blocked if another garment covers the same part (e.g., pants block coat's ass-expose).
- While exposed, the body part counts as fully uncovered for embarrassment math.

#### 6.3.6 Restrictive clothing
- Cuffs and similar items lock hand-dependent actions (using phone, picking up items, masturbating).
- Removal options (see §10.4.1):
    - **Adult shop** — paid, reliable, fixed location.
    - **Helper NPC** — free, rare random spawn, not reliable.

### 6.4 Bags
- Bag is an equippable item with its own inventory.
- Player can equip **one** bag at a time.
- Bag can be placed in the world (set down) — persists as an AActor.
- Default carry capacity without a bag: equipped clothing + one phone-in-hand.
- Bag lost if session ends in loss while the bag is placed in the world (not equipped).

### 6.5 Item loss summary table
| Situation | Outcome |
|---|---|
| Session ends safely | All carried/equipped/placed items persist. |
| Session lost, item equipped | Item forcibly dropped at loss location. |
| Session lost, item in equipped bag | Item persists (bag is on you). |
| Session lost, bag placed in world | Bag and contents lost. |
| Session lost, clothing on ground (unattended) | Lost. |
| Clothing unattended too long, no loss | At risk of NPC theft. |

### 6.6 Consumables — Food
- Restores energy.
- May grant timed buffs (e.g., ramen: +stamina regen for 3h in-game).
- Buffs are typed and stackable per design (specifics TBD).
- Some foods require cooking (ingredients from convenience store), some are pre-made (from cafe).

---

## 7. Attributes & Simulation

All attributes update in real time. Indoor and outdoor behavior is identical — being inside the apartment does not pause or slow attribute simulation. The apartment is a "safe zone" only in the sense that no NPCs are there to observe the player, which means embarrassment naturally decays toward baseline. Lust and energy continue to behave normally.

### 7.1 Embarrassment
- Increases when NPCs **observe** the player while:
    - Wearing revealing clothing (coverage-weighted).
    - Body parts exposed (full weight per uncovered part).
    - Performing "perverted actions" (masturbation, exposing, completing commission objectives).
- Increase rate is modulated by:
    - **Base embarrassment increase rate** (attribute).
    - **Coverage** of each visible-to-observer body part.
    - **Pulse** (higher → faster gain).
    - **Day/night** (day rate > night rate, see §10.1).
    - **Recognition** (higher → faster gain).
- Decreases over time when not being observed (`embarrassment decrease rate`).
- Reaches `maxEmbarrassment` → session lost.

### 7.2 Lust
- Increases passively in the background (rate TBD, possibly tied to coverage).
- At maximum:
    - Blurred peripheral vision.
    - Player cannot tell whether NPCs are calling police or taking photos.
    - No indicator of which NPCs noticed them.
- Reset by **masturbating** (consumes more energy than usual, modified by `energyDrainMasturbateModifier`).

### 7.3 Energy
- Drained by all activity. Base rate plus modifiers:
    - `energyDrainRate` (base, passive)
    - `energyDrainRunModifier` (running)
    - `energyDrainWorkoutModifier` (gym)
    - `energyDrainCookingModifier` (cooking)
    - `energyDrainMasturbateModifier` (masturbation)
- Recovered during sleep at `energyRecoveryRate`.
- Hard floor at 0 → session lost.
- Max raised by gym training.

### 7.4 Stamina
- Used for sprinting and other burst physical actions.
- Recovers at `staminaRecoveryRate` when not sprinting.
- Max raised by Slave-path leveling.
- Distinct from energy: stamina is short-term, energy is daily budget.

### 7.5 Recognition
- Each photo taken by a Paparazzi NPC and published increases recognition.
- Higher recognition → faster embarrassment gain (NPCs recognize the player).
- Reducible by reporting articles on the city news site (PC, §11.1).
- Can be **bypassed** by hiding the face (mask, hat-and-glasses combo — TBD specifics).

### 7.6 Wanted
- Boolean. Set when caught by police or when triggered by specific commission failures.
- Affects police patrol density and aggression.
- Cleared by tearing down wanted posters in the city (§10.3).

### 7.7 Reputation
- Earned by completing commissions; lost by failing or skipping them.
- Degrades passively over time, faster at higher values.
- Affects follower gain: positive/neutral → followers grow; negative → followers shrink.

### 7.8 Followers & Money
- **Followers** — running total of forum followers. Used in subscriber-style follower-gain math when posting photos.
- **Money (Yen)** — earned from commissions, livestream donations, selling worn underwear. Spent on rent, clothing, food, gym, beauty salon.

### 7.9 Attribute leveling
Path XP unlocks the *ability* to upgrade attributes within that path's pool. Money or a separate currency may be required per level-up (TBD — recommend keeping it tied to XP only for clarity, but flag for playtest).

---

## 8. Movement

States: `stand`, `walk`, `run`, `crouch`, `crouchWalk`, `crouchRun`.

Design implications:
- Crouching reduces NPC detection radius (TBD multipliers).
- Running drains stamina and energy faster but is required for escape.
- Crouch-run is a compromise state for traversing risky exposed areas.

Movement should be implemented as a state machine on the character with clear transitions. UE5's enhanced input + ALS-style or GASP-style animation graph is appropriate (Oleh has prior GASP/Motion Matching context).

---

## 9. Phone

The phone is the player's diegetic UI hub. It can be used if it is in: hand, pocket (pants with phone slot), or equipped bag.

### 9.1 Camera
- **Front camera** — held in hand, framed selfie shot.
- **Back camera** — phone is placed in the world via `place camera` action. A floating window shows the camera's view. Photos are triggered via hotkey while the camera is placed.
- All photos saved to **Gallery**.

### 9.1.1 Livestream
- Available at any time via the phone, regardless of whether the player is holding it or it is placed in the world.
- Same dual-mode setup as the camera: front-facing while held, back-facing when placed.
- Generates donation income in real time. Income rate scales with exposure visible in the stream (similar logic to photo follower-gain math, but continuous).
- Recommended implementation: livestream is a `StreamSession` object owned by the phone, tickable, with `viewerCount`, `tipRate`, and `streamQualityScore` (a function of what the camera sees and player attributes).
- Ending the stream returns earnings to the bank.

### 9.2 Gallery
- Lists all captured photos with metadata (time, location, equipped state, exposed parts).
- Photos can be posted to the forum profile from here.

### 9.3 Forum (phone)
The phone is the primary access point for the forum. See §13.

### 9.4 Bank app
- Track balance, income, spending. Pay rent (or auto-pay).

### 9.5 Feetex (deliveries)
- Track pending online orders (clothing, food). Items arrive at the apartment door one in-game day after purchase.

### 9.6 Maps
- City map with marked shop locations, commission objectives, player position.

### 9.7 Health Tracker
- Displays the player's attribute readouts (energy, stamina, lust, embarrassment, recognition).

---

## 10. The City

### 10.1 Day / Night
| Phase | In-game time | Real time | Effects |
|---|---|---|---|
| Day | 08:00 → 20:00 | ~45 min | High NPC density. Faster embarrassment gain. Most shops open. |
| Night | 20:00 → 08:00 | ~45 min | Low NPC density. Slower embarrassment gain. Police patrols spawn. Most shops closed. |

Sleeping at home fast-forwards 8 hours.

### 10.2 NPC types
| NPC | Behavior |
|---|---|
| **Walker** | Doesn't stop; reacts (animation/audio) but keeps walking. Low embarrassment contribution. |
| **Stalker** | Stops, stares. Sustained observation → faster embarrassment gain. |
| **Paparazzi** | Stops, takes photo. Photo → recognition increase. |
| **Snitch** | Stops, calls police. Triggers police spawn / wanted state if observed long enough. |
| **Harasser** | Walks toward player, attempts to grope. Player must evade. |
| **Helper** (rare) | Friendly NPC. Can remove restrictive clothing (cuffs) for free. Random spawn, not guaranteed to appear when needed. See §10.4. |
| **Police** | See §10.3. |

### 10.3 Police
- Spawn each night, patrol routes.
- Detect player if face not hidden, or if revealing/no clothing.
- On detection: chase begins.
- If player breaks line of sight: police patrol last known position for a timer, then disengage.
- `wanted` persists across sessions until cleared.
- **Wanted poster mechanic:** wanted posters spawn in the city. Tearing them all down stops police spawning until further story triggers.

### 10.4 Locations
- **Apartment** — safe zone. Wardrobe, bed, PC, kitchen, home gym (optional unlock).
- **Convenience store** — cooking ingredients.
- **Cafe** — pre-made food.
- **Clothing shops** — various types, each with a different inventory mix.
- **Gym** — increase max energy. Costs energy in the process. Possibly costs money.
- **Beauty salon** — boobs size, ass size, makeup, hair style, hair color.
- **Adult shop** — paid service to remove restrictive clothing (cuffs, etc.). Reliable but costs money and requires the player to travel there while restricted. Unlocked at a TBD Slave-path level (since cuffs are Slave-path content, the shop being a Slave-path service makes thematic and gating sense).
- **Streets / parks / alleys** — commission space.
- **(TBD)** beach, train station, school exterior, hot springs, etc. — design pass needed for variety.

#### 10.4.1 Cuff / restraint removal
Two paths for removing restrictive clothing:
1. **Adult shop** — reliable, costs money, fixed location. Player must travel there while restricted (which is the cost — both monetary and risk-of-exposure since hands are limited en route).
2. **Helper NPC** — rare random spawn, free. Cannot be relied upon. Creates emergent "lucky encounter" moments and a sandbox-style alternative.

This gives restrictive clothing a real tactical weight: equip cuffs near the adult shop with money in pocket = low risk; equip them far from home with no money = a real situation.

---

## 11. PC (at home)

### 11.1 City News
- Random news plus articles about the player (posted by Paparazzi-driven events).
- Player can **report** articles with their photo → reduces recognition.

### 11.2 Clothing shop (online)
- Order clothing. 1-day delivery.

### 11.3 Food shop (online)
- Order food. 1-day delivery.

---

## 12. Shops & Services Summary

| Service | In-person | Online | Notes |
|---|---|---|---|
| Clothing | Yes (multiple shop types) | Yes (PC) | Online has 1-day delay. |
| Food (ingredients) | Convenience store | Yes (PC) | Cooking required. |
| Food (pre-made) | Cafe | Yes (PC) | Eat immediately. |
| Gym | Yes (city) | Home gym (optional) | Increases max energy. |
| Beauty salon | Yes (city) | No | Body, hair, makeup customization. |

---

## 13. The Forum

The forum is accessed via phone or PC. It is both diegetic and the primary mission UI.

### 13.1 Weekly missions
- Generated at week start, semi-random, weighted by player path progression.
- Rewards: money, XP.
- If the player doesn't meet entry requirements (level, path level), missions are visible but not marked failed — they serve as goals.
- Must be completed by end of week or marked failed.

### 13.2 Daily commissions
- Generated at day start, semi-random, weighted by path progression.
- Rewards: money, XP, followers.
- Failing or not completing within the day → followers/reputation loss.
- A commission is "started" when the player accepts it; remaining un-started commissions are simply offered.

### 13.3 Profile
- View stats, progression, path levels, posted photos.
- Post photos → follower gain (calculated from exposed body parts + visible coverage in photo).
- Livestream is initiated from the phone at any time (see §9.1.1), not from the forum profile. The profile displays livestream history and lifetime earnings.
- Level up attributes (gated by path XP).

### 13.4 Commission generation
Commissions should be procedural with template-driven content. Recommended template structure:
```
CommissionTemplate {
  id,
  pathRequirement: { path, minLevel },
  steps: [ list of typed objective steps ],
  rewardMoneyRange,
  rewardXPRange,
  rewardFollowersRange,
  failurePenalty,
  validLocations: [ ... ],
}
```
Typed objective steps (initial set):
- `ExposeBodyPart(part, durationSeconds)`
- `BeFullyNakedNearNPCs(count, durationSeconds)`
- `WalkNakedDistance(meters)`
- `MoveDistanceFromClothing(meters)`
- `PerformAction(actionId)` (e.g., masturbate)
- `BeObservedByNPCType(type, durationOrCount)`
- `TakePhotoAtLocation(locationTag)`
- `DeliverItemTo(npcOrLocation)`

Example commissions from the brief that should be representable:
- "Get naked in front of 1 person" → `BeFullyNakedNearNPCs(1, ~3s)`.
- "Walk with breasts exposed for 10 seconds" → `ExposeBodyPart(boobs, 10)`.
- "Walk naked for 30 seconds" → `BeFullyNaked(30)` (composite step).
- "Move 50m away from your clothing while naked" → `BeFullyNaked` + `MoveDistanceFromClothing(50)`.

### 13.5 Subscriber math (rough)
```
followerGain = base(photoExposureScore) * reputationFactor * (1 / log(followerCount + e))
```
Concrete formula to be calibrated in playtest. Keep this isolated in a single `FollowerGainCalculator` for tunability.

---

## 14. UI / UX

### 14.1 Quick action menu
Radial or hotbar accessible mid-session. Actions:
- Unequip / equip clothing (per slot).
- Expose body part (per garment with `canExpose`).
- Open phone.
- Drop bag / pick up bag.
- Masturbate.
- Crouch / stand.

### 14.2 HUD (in-session)
- Attribute bars (energy, stamina, embarrassment, lust) — minimal/peripheral when low, more prominent when nearing thresholds.
- Equipped clothing summary (small icons).
- Day/night and clock readout.
- NPC awareness indicator (who has noticed you) — **disabled at max lust** per §7.2.
- Active commission objective text.

### 14.3 Out-of-session UI
Forum, bank, gallery, shops are all in-fiction screens (phone/PC). Avoid out-of-fiction menus where possible.

### 14.4 Accessibility & comfort
- Subtitle support for any voiced dialogue.
- Camera "place" via voice command must have a non-voice fallback (hotkey).
- Photo-sensitive warning if any flash/strobe effects are used.

---

## 15. Economy

### 15.1 Income sources
- Daily commissions (largest reliable source).
- Weekly missions (larger lump-sum payouts).
- Livestream donations (variable, riskier, always available via phone).
- **Selling worn underwear** — two delivery methods:
    - **Feetex shipping** — drop the item in a Feetex shipping box at the post office or convenience store. Payment arrives 1 in-game day later (mirrors Feetex's existing 1-day delivery delay).
    - **Drop-off** — travel to a specified location (varies per order) and leave the underwear there. Immediate payment, but the location may be in a high-risk area depending on the order. Tactical trade-off: convenience vs. drop-off-style commission tension.
- Photo posts (indirect — followers → ongoing income? TBD).

### 15.2 Costs
- Weekly rent — **flat across the campaign**. No escalation, no event-driven spikes. The pressure comes from the 90-day timer and other expenses, not from a moving rent target.
- Clothing.
- Food / ingredients.
- Gym membership / beauty salon.
- Adult shop (cuff removal service).
- Phone repairs (if introduced).

### 15.3 Tuning targets (placeholder)
| Tier | Daily income | Weekly rent | Notes |
|---|---|---|---|
| Early | ¥3–8k/day | ¥20k/week | Pressure forces commissions. |
| Mid | ¥10–20k/day | ¥30k/week | Player can save / invest. |
| Late | ¥25k+/day | ¥50k/week | Livestream meta unlocked. |

Numbers are placeholders for playtest calibration.

---

## 16. Save / Persistence

### 16.1 What must be saved
- Player attributes and progression.
- All world items (position, orientation, condition, container relationships).
- All NPC state? (probably just template + scheduling seed; full NPC state is too heavy)
- Forum state: active commissions, weekly missions, followers, reputation, photos posted.
- Calendar: current day, current time, week number.
- Wanted state, recognition, pending deliveries.
- Apartment state.

### 16.2 Save points
- Automatic on sleep.
- Automatic on safe session end.
- Manual save in apartment (recommended).
- No mid-session save (preserves tension) — design call, open for revision.

### 16.3 Item identity in save
The unique-instance rule (§6.1) means save must serialize each item by instance ID, not by template. Container parent references must be stable across save/load.

---

## 17. Technical Architecture (UE5)

### 17.1 High-level systems
- `PlayerCharacter` (Pawn + ASC) — movement, equipment slots, attribute set.
- `AttributeSet` — embarrassment, lust, energy, stamina, recognition, money, reputation. GAS-based.
- `EquipmentComponent` — slot management, equip/unequip, expose actions.
- `InventoryComponent` — generic, reused by player, bags, containers.
- `ItemActor` — base for all world items. Wraps `ItemInstance`.
- `ItemInstance` (UObject) — runtime data, serialized with save.
- `ItemDefinition` (DataAsset) — static data per item template.
- `SessionManager` (GameMode or subsystem) — session start/end, loss resolution.
- `TimeOfDaySubsystem` — clock, day/night, week, calendar.
- `ForumSubsystem` — commissions, missions, profile, followers, reputation.
- `NPCManager` — spawning, density, type weighting by location and time.
- `RecognitionSubsystem` — photo-to-news pipeline, article state, reporting.
- `PoliceManager` — patrols, wanted state, line of sight, chase.
- `SaveSubsystem` — orchestrates serialization across all of the above.

### 17.2 GAS usage
GAS is well-suited here: attributes, modifiers (clothing-based, recognition-based, day/night), and gameplay effects (food buffs, wanted status, lust max) all map cleanly. Use:
- `UAttributeSet` for all numeric attributes in §7.
- `GameplayEffects` for buffs, debuffs, passive drains.
- `GameplayTags` for NPC observation state, body part exposure, clothing flags.
- `GameplayCues` for visual/audio reactions.

### 17.3 Replication
Single-player. Multiplayer is **out of scope**. Code should still use server-authoritative-style patterns where it costs little (helps separation of concerns, mirrors HRPG codebase habits, makes future co-op less painful) but avoid premature networking complexity.

### 17.4 Data-driven content
Clothing, commissions, food, NPC templates all live as `DataAssets` (or DataTables for tabular content). Designers (eventually) should be able to add items without touching C++.

### 17.5 Class boundaries
- C++ for: attribute math, simulation tick, equipment/inventory mechanics, session loss resolution, save/load, AI controllers, time-of-day, commission validation.
- Blueprint for: animation event hookups, cosmetic feedback, individual mission template wiring, UI widgets, world placement.

### 17.6 Open technical questions
- Animation system: borrow GASP/Motion Matching approach? Custom?
- Crowd density: instanced NPCs vs. full pawns? Hybrid (full pawns within awareness radius, instanced beyond)?
- Cloth/clothing rendering: skeletal mesh swap vs. modular character system? Modular is strongly recommended given the dressing system depth.
- Photo system: in-engine render-to-texture (preferred) vs. screenshot-with-overlay.

---

## 18. Content Inventory (initial scope target)

### 18.1 Minimum viable content for vertical slice
- 15–20 clothing items spread across paths (5 Slut, 5 Exhibitionist, 5 Slave, 5 neutral).
- 3 bag variants.
- 8 food items (4 cooking ingredients, 4 pre-made).
- 5 NPC types (Walker, Stalker, Paparazzi, Snitch, Harasser) + Police + Helper.
- 1 functional city district with all shop types.
- 20 commission templates yielding ~5x procedural variation.
- Apartment + PC + phone fully functional.
- 1 full week of gameplay playable end-to-end.

### 18.2 Full launch target (TBD)
- 60+ clothing items.
- All NPC types polished, multiple visual variants each.
- Full city, 4+ districts.
- 100+ commission templates.
- All 3 paths leveled to cap with distinct content.

---

## 19. Risks & Mitigations

| Risk | Likelihood | Mitigation |
|---|---|---|
| Item-identity persistence is complex and error-prone. | High | Build save/load and item ID system first, before any content. Heavy testing. |
| GAS attribute interactions create unintended feedback loops (e.g., embarrassment ↔ recognition). | Med | Centralize modifier sources in a debug overlay. Lock down formula tests. |
| Procedural commissions feel repetitive. | High | Strong template variation, location/time-of-day modifiers, themed weekly arcs. |
| NPC density vs. performance. | Med | LOD'd AI: full pawns near player, instanced "extras" at distance. |
| Adult-content distribution constraints. | High (business) | Plan for Steam-incompatible content split / Patreon / itch / direct distribution from day one. Out of scope for this GDD but flag now. |
| Scope (90-day timer × 3 paths × commission variety). | High | Vertical slice first. Cut path content before cutting systems. |

---

## 20. Resolved Design Decisions

Decisions previously open, now fixed:

1. **Camera perspective:** Third-person.
2. **Dangerous-stalker NPC:** Removed. Was a documentation typo, not an intended NPC. The Stalker (watching, low-threat) is the only stalker-type NPC.
3. **Indoor attribute behavior:** Identical to outdoor. No pause or slowdown. The apartment is safe only because no NPCs are present to observe.
4. **Player customization:** Beauty salon only. No separate character creator at run start.
5. **Livestreaming:** Available any time via the phone, held or placed. Mirrors photo capture (front-facing held, back-facing placed). See §9.1.1.
6. **Selling worn underwear:** Feetex shipping (1-day, convenient) or specified drop-off location (immediate, risk-based). See §15.1.
7. **Rent:** Flat. No escalation.
8. **Run length:** 90-day campaign. Endless mode unlocked after first completion (rent-eviction disabled, all other systems intact). See §3.3.
9. **Cuff/restraint removal:** Adult shop (paid, reliable) + Helper NPC (rare random spawn, free). See §10.4.1.
10. **Voice commands:** Not used. Hotkey-driven only.

## 21. Open Design Questions

These remain genuinely unresolved and should be addressed during implementation:

1. Final slot list for clothing equipment (top, bottom, underwear-top, underwear-bottom, outerwear, footwear, accessory, restraint — confirm and lock).
2. NPC theft timer for unattended clothing (X minutes, see §6.3.3).
3. Concrete tuning numbers for embarrassment / lust / energy / stamina rates.
4. Specific ending conditions for the 90-day campaign (path level + follower thresholds).
5. Manual save in apartment: enabled or auto-save only?
6. Photo system implementation: render-to-texture vs. screenshot-with-overlay (§17.6).
7. Crowd density: full pawns vs. instanced extras with awareness-radius promotion (§17.6).
8. Modular character system specifics — base mesh, layering scheme, attachment sockets.
9. Helper NPC spawn rate and conditions (city-wide chance per session? specific zones?).
10. Photo-post follower decay curve and per-photo cap.

---

## 22. Glossary

- **Coverage** — clothing's 0–1 score for how much it conceals a body part.
- **Commission** — short, accept-now mission, daily-generated, from the forum.
- **Mission** — weekly task, generated at week start.
- **Session** — the active outdoor play state between leaving and returning to the apartment.
- **Path** — Slut / Exhibitionist / Slave progression track.
- **Recognition** — how known the player is in the city. Multiplies embarrassment gain.
- **Wanted** — binary police-target flag.
- **Helper** — rare friendly NPC who can remove restrictive clothing for free.
- **Feetex** — in-fiction package tracking and shipping service.
- **Endless mode** — post-campaign unlock; rent eviction disabled, all other systems active.

---

## 23. Document Conventions

- "TBD" = explicit pending decision, must be resolved before relevant code is finalized.
- Code names in `monospace`. Final names should match these unless decided otherwise.
- All numeric values without units are placeholders for tuning.
- When this doc and the code disagree, this doc wins until updated.