159 lines
10 KiB
Markdown
159 lines
10 KiB
Markdown
# Commission objective backlog
|
||
|
||
Idea catalog + build status for the commission system (`Source/NakedDesire/Commissions/`). Pairs with
|
||
GDD §13 (the design source of truth) and `PLAN.md` (live status). When an idea is implemented, mark it
|
||
and record the class name.
|
||
|
||
**Feasibility legend**
|
||
- ✅ buildable now — the signals it needs already exist.
|
||
- 🔶 needs a planned-but-partial system — NPC types (VS‑5), lust & pulse (VS‑2), photo/livestream &
|
||
followers (Phase 8), toys, restraints.
|
||
- 🔭 needs an unbuilt system — theft (§6.3.4), rip & tear (§6.3.5), recognition/wanted (§7.6).
|
||
|
||
**Path flavor:** Exhibitionist = be *seen* · Slut = be *lewd* · Slave = be *used / controlled*.
|
||
|
||
---
|
||
|
||
## Structural features (content multipliers — build these first)
|
||
|
||
These aren't objectives; they make every objective compose, so a handful of conditions yields a large
|
||
content space.
|
||
|
||
- **Constraints / modifiers** — a constraint decorates an objective; the step only counts while all its
|
||
constraints also hold (the base ANDs them into the satisfaction check). "Do X **while** Y" with no new
|
||
objective code.
|
||
- `WhileObservedBy(count)` ✅ — **`UObservedConstraint`** *(implemented)*
|
||
- `DuringPhase(Day/Night)` ✅ — **`UDayPhaseConstraint`** *(implemented)*
|
||
- `WhileWearing(slot)` / `WhileNotWearing(slot)` ✅ — **`UWearingSlotConstraint`** *(implemented)*
|
||
- `WhileAtLocation(tag)` ✅ — **`ULocationConstraint`** *(implemented)* — backed by `ULocationSubsystem`.
|
||
- `WhileMoving` / `WhileRunning` ✅* — needs a gait-changed signal or a cheap poll.
|
||
- **Sequential steps** — `bSequentialObjectives` on a commission: objectives activate one at a time in
|
||
order ("strip at A → walk naked to B → masturbate at C"). *(implemented)*
|
||
- **Optional bonus objective** — a non-required step that bumps the reward (risk/reward texture). *(idea)*
|
||
- **Time limit** — a per-commission deadline is a *failure* condition, not a "while" gate; it belongs with
|
||
`failurePenalty` / day-end expiry, not the constraint set.
|
||
|
||
---
|
||
|
||
## Exposure / coverage (mostly ✅ — same signals the dial already uses)
|
||
|
||
- **`BeFullyNaked(duration)`** ✅ — **`UBeFullyNakedObjective`** *(implemented)*
|
||
- **`ExposeBodyPart(part, duration)`** ✅ — **`UExposeBodyPartObjective`** *(implemented)*
|
||
- **`BeFullyNakedNearNPCs(count, duration)`** ✅ — **`UBeFullyNakedNearNPCsObjective`** *(implemented)*
|
||
- `WearOnlyUnderwear(duration)` ✅ — **`UWearOnlyUnderwearObjective`** *(implemented)*. Exhibitionist.
|
||
- `BeToplessOnly` / `BeBottomlessOnly(duration)` ✅ — **`UBareRegionObjective`** *(implemented; `EBareRegion` data value picks the bare half)*. One region bare, the other covered.
|
||
- `StayBelowCoverage(threshold, duration)` ✅ — **`UStayBelowCoverageObjective`** *(implemented; names its own threshold)*. Every region under X (revealing, not nude).
|
||
- `ExposeWhileWalking(part, meters)` ✅ — **`UExposeWhileWalkingObjective`** *(implemented)*. Keep a part revealing across N meters (per-part walk).
|
||
- `UseExposeAction(part, count)` ✅ (after VS‑3) — trigger the §6.3.6 flash action N times.
|
||
|
||
## Observation / NPC reactions (✅ count-based; 🔶 type-based)
|
||
|
||
- `GatherCrowd(count)` ✅ — **`UGatherCrowdObjective`** *(implemented)*. N NPCs observing simultaneously.
|
||
- `BeObservedWhileExposed(count, duration)` ✅ — **`UBeObservedWhileExposedObjective`** *(implemented)*. N observers while any region is revealing (partial exposure counts).
|
||
- `StayUnseenWhileNaked(duration)` ✅ — **`UStayUnseenWhileNakedObjective`** *(implemented)*. Fully naked with **zero** observers (stealth exhibitionism / risk).
|
||
- `BeObservedByNPCType(type, count|duration)` 🔶 (in §13.4) — Walker / Stalker / Blogger / etc.
|
||
- `BePhotographedByBlogger(count)` 🔶 · `EndureStalker(duration)` 🔶 · `EscapeAfterSnitch()` 🔶 (VS‑5).
|
||
|
||
## Attributes: embarrassment / arousal (✅ embarrassment; 🔶 lust/pulse)
|
||
|
||
- `ReachEmbarrassment(threshold)` / `SustainEmbarrassment(threshold, duration)` ✅ — **`UReachEmbarrassmentObjective`** *(implemented; a hold duration turns Reach into Sustain)*.
|
||
- `ReachLust(threshold)` / `EdgeWithoutResolving(duration)` 🔶 (VS‑2).
|
||
- `MasturbateNearNPCs(count)` / `MasturbateAtLocation(tag)` 🔶 — `PerformAction`, Slut-gated (§23 #26).
|
||
- `KeepPulseElevated(threshold, duration)` 🔶.
|
||
|
||
## Location / travel (✅ — `ULocationSubsystem` now provides enter/leave + tag queries)
|
||
|
||
- `EnterLocationNaked(tag)` ✅ · `TourLocationsNaked(tagset)` ✅ · `LingerExposed(tag, duration)` ✅
|
||
(the last two = `BeFullyNaked` + a `ULocationConstraint`).
|
||
- `ReachLocationAwayFromClothing(tag, meters)` ✅ *(no new class)* — `MoveDistanceFromClothing` + a `ULocationConstraint`: arrive at the location having left clothes ≥N m behind.
|
||
- `ReturnHomeNaked()` ✅-ish — end the session at the apartment with no clothing (loop-closer).
|
||
|
||
## Movement / endurance (✅)
|
||
|
||
- `WalkNakedDistance(meters)` ✅ (in §13.4) — **`UWalkNakedDistanceObjective`** *(implemented)*. Naked travel at any gait. · `MoveDistanceFromClothing(meters)` ✅ (in §13.4) — **`UMoveDistanceFromClothingObjective`** *(implemented; polls `UDroppedClothingSubsystem` for the nearest dropped garment)*.
|
||
- `RunNakedDistance(meters)` ✅ — **`URunNakedDistanceObjective`** *(implemented)*. Distance accrues only while running + naked.
|
||
- `WalkNakedWhileObserved(meters, minObservers)` ✅ — **`UWalkNakedWhileObservedObjective`** *(implemented)*.
|
||
|
||
> All four distance objectives share **`UTravelObjectiveBase`** (`UCoverageObjectiveBase` subclass) — it owns the
|
||
> clamped distance-sampling timer; subclasses only override `DoesSampleCount()` (e.g. naked+run, part revealing,
|
||
> naked+observed). New "travel while X" objectives are a one-method subclass.
|
||
|
||
## Clothing / outfits / restraints
|
||
|
||
- `WearOutfit(tag, duration)` ✅ — go out in a specific authored set (needs an outfit id/tag on items).
|
||
- `GoOutInBodysuitOnly(duration)` ✅.
|
||
- `WearRestraintInPublic(slot, duration)` 🔶 (restraints §6.3.7) — Slave flavor.
|
||
- `WearVibratingToy(duration)` / `ActivateToyNearNPCs(count)` 🔶 (toy vibration audible to NPCs).
|
||
- `DegradeConditionTo(x)` / `RipClothing` 🔭 (rip & tear) · `LetItemBeStolen()` 🔭 (theft).
|
||
|
||
## Photo / livestream / followers (🔶 Phase 8)
|
||
|
||
- `TakePhotoAtLocation(tag)` 🔶 (in §13.4) · `PostPhotoExposing(part)` 🔶 · `PhotoExposureScoreAbove(x)` 🔶.
|
||
- `SelfieAtLandmark(tag)` 🔶 · `LivestreamForMinutes(n)` 🔶 · `LivestreamWhileWalkingNaked(meters)` 🔶.
|
||
- `GainFollowers(count)` 🔶 · `CompleteTipRequests(count)` 🔶.
|
||
|
||
## Items / economy (✅ / 🔶)
|
||
|
||
- `DeliverItemTo(target)` ✅ (in §13.4) · `DeliverWhileNaked(target)` ✅ — deliver fully naked (§15.1).
|
||
- `DropClothingAtLocation(tag)` ✅ — a "dead drop" leaving a garment behind.
|
||
- `SellWornUnderwearAtDropoff()` 🔶 — risk-based drop-off (§15.1).
|
||
|
||
## Risk / loss (🔶 / 🔭)
|
||
|
||
- `SurviveSessionNaked()` ✅-ish — complete a session never wearing clothing.
|
||
- `GetCaughtAndEscape()` 🔶 (police, VS‑5) · `WantedWhileExposed()` 🔶 (recognition, §7.6).
|
||
|
||
---
|
||
|
||
## Suggested build order
|
||
|
||
1. **Structural** — constraints framework + sequential steps. *(done)*
|
||
2. **All-✅ objectives** — done: `StayUnseenWhileNaked`, `GatherCrowd`, `BeObservedWhileExposed`,
|
||
`WearOnlyUnderwear`, `ReachEmbarrassment`/`SustainEmbarrassment`, the `UTravelObjectiveBase` distance
|
||
family (`RunNakedDistance`, `WalkNakedDistance`, `ExposeWhileWalking`, `WalkNakedWhileObserved`), and the
|
||
coverage pair `BareRegion` (topless/bottomless) + `StayBelowCoverage`. Location objectives
|
||
(`EnterLocationNaked`, `LingerExposed`, …) need no new class — author them as `BeFullyNaked` /
|
||
`ExposeBodyPart` + a `ULocationConstraint`. `MoveDistanceFromClothing` (+ its
|
||
`ReachLocationAwayFromClothing` compose) now landed on `UDroppedClothingSubsystem`. Remaining all-✅
|
||
gap: `WearOutfit` needs an outfit tag/id on items.
|
||
3. **Location system** — done: `ULocationSubsystem` + `ULocationConstraint`; the whole Location/travel
|
||
group and `WhileAtLocation` are unblocked. (Build the location *objectives* with the ✅ batch.)
|
||
4. **Per-system batches** as VS‑5 (NPC types), VS‑2 (lust/pulse), toys, restraints, and Phase 8
|
||
(photo/livestream/followers) land.
|
||
|
||
---
|
||
|
||
## Concrete commissions (all ✅ — pure data, no new C++)
|
||
|
||
Authorable today in a `UCommissionBoardConfig`: each is a recipe of shipped objectives + the four
|
||
constraints (`UObservedConstraint`, `UDayPhaseConstraint`, `UWearingSlotConstraint`, `ULocationConstraint`),
|
||
`RequiredHoldSeconds`, and `bSequentialObjectives`. Numbers are starting values, not balance.
|
||
|
||
**Authoring ceiling:** live location tags are only `Location.Apartment`, `Location.City`, `Location.City.Beach` —
|
||
more `Location.City.*` sub-areas would multiply every location-gated row below.
|
||
|
||
### Exhibitionist (be *seen*)
|
||
|
||
- **Morning Walk of Shame** — *Daily.* `WalkNakedDistance(300m)` + `DayPhase(Day)`.
|
||
- **Beach Body, No Suit** — *Daily.* `BeFullyNaked(60s)` + `Location(City.Beach)` + `DayPhase(Day)`.
|
||
- **Topless Stroll** — *Daily.* `ExposeWhileWalking(Boobs, 150m)` + `WearingSlot(Bottom, worn)`.
|
||
- **Draw a Crowd** — *Weekly, sequential.* `GatherCrowd(5)` → `BeObservedWhileExposed(5, 30s)`.
|
||
- **Night Flasher** — *Daily.* `ExposeBodyPart(Genitals, 5s)` + `DayPhase(Night)` + `Observed(1)`.
|
||
|
||
### Slut (be *lewd*)
|
||
|
||
- **Underdressed Errand** — *Daily.* `WearOnlyUnderwear(120s)` + `Location(City)`.
|
||
- **Barely Decent** — *Weekly.* `StayBelowCoverage(0.4, 180s)` + `Observed(2)`.
|
||
- **Red-Faced in Public** — *Daily.* `SustainEmbarrassment(0.8, 20s)` + `Observed(3)`.
|
||
- **Bottomless Beach Run** — *Weekly.* `ExposeWhileWalking(Genitals, 200m)` + `BareRegion(Bottom)` + `Location(City.Beach)`.
|
||
|
||
### Slave / risk (controlled, stealth, loss)
|
||
|
||
- **Leave It Behind** — *Daily.* `MoveDistanceFromClothing(80m)`.
|
||
- **Dead Drop Dash** — *Weekly, sequential.* `MoveDistanceFromClothing(100m)` → `ReachEmbarrassment(0.7)` → `WalkNakedDistance(150m)`.
|
||
- **Unseen and Bare** — *Weekly.* `StayUnseenWhileNaked(90s)` + `Location(City)`.
|
||
- **Run, Don't Hide** — *Daily.* `RunNakedDistance(200m)` + `DayPhase(Night)`.
|
||
|
||
### Multi-step showcase
|
||
|
||
- **From Closet to Crowd** — *Weekly, sequential.* `WearOnlyUnderwear` @ `Location(Apartment)` → `WalkNakedWhileObserved(150m, 1)` → `GatherCrowd(4)` @ `Location(City)`. |