Compare commits

..

68 Commits

Author SHA1 Message Date
koritsa f2fcd42edf Updated phone UI 2026-06-03 21:42:24 +03:00
koritsa 07c323752a disabled unneeded plugins 2026-06-03 19:26:15 +03:00
koritsa 93d544706d project cleanup 2026-06-03 18:24:58 +03:00
koritsa ca1b81ac0e removed gitea issue templates 2026-06-03 15:23:35 +03:00
koritsa 00fe452168 setup npc visuals 2026-06-03 15:17:10 +03:00
koritsa f6608c5f9a added npc assets 2026-06-03 15:17:10 +03:00
koritsa 00eaaff97a Added phone app icon materials 2026-06-03 15:17:03 +03:00
koritsa ff62b06802 Setup phone UI 2026-06-03 15:17:03 +03:00
koritsa c529544bc7 Added starting wardrobe items hydration 2026-06-03 15:17:03 +03:00
koritsa a87964e119 Added NPC logic 2026-06-03 15:17:03 +03:00
koritsa 06fb3353b2 Updated NPC plan 2026-06-03 15:17:03 +03:00
koritsa 192bd94bb7 Setup NPC director 2026-06-03 15:17:02 +03:00
koritsa f63c98d5d7 Added commision objectives 2026-06-03 15:17:02 +03:00
koritsa 003d9992e2 Added commissions system 2026-06-03 15:17:02 +03:00
koritsa a3e23393dc Updated documentation 2026-06-03 15:17:02 +03:00
koritsa 65bd932473 Added phone item 2026-06-03 15:17:02 +03:00
koritsa f94dce1bfb Added wardrobe 2026-06-03 15:17:02 +03:00
koritsa 49310a992b Adjusted sky update interval, added clothing assets 2026-06-03 15:17:01 +03:00
koritsa 7dd75915ed Added variable boobs physics depending on boobs support from clothing 2026-06-03 15:17:01 +03:00
koritsa 56cc2fce98 Setup player preview for equipment panel 2026-06-03 15:17:01 +03:00
koritsa 4218b36ac9 Updated observation logic 2026-06-03 15:16:58 +03:00
koritsa a7a61bd60e Added new plan 2026-06-03 15:16:58 +03:00
koritsa d53ca8e56b Added session system 2026-06-03 15:16:58 +03:00
koritsa 8f132c463d Test 2026-06-03 15:16:56 +03:00
koritsa ef1fc9a830 Added censorship to player impostor and player cinematic 2026-06-03 15:16:52 +03:00
koritsa cf40321d3a Refactor clothing visuals 2026-06-03 15:16:46 +03:00
koritsa 4405324095 Refactor censorship 2026-06-03 15:16:44 +03:00
koritsa cfecd1f4c6 Clothing system refactor 2026-06-03 15:16:41 +03:00
koritsa c6eff4d076 Finished phase 1 2026-06-03 15:16:38 +03:00
koritsa 8c49583a69 Added world items to save game 2026-06-03 15:16:36 +03:00
koritsa 78840dcfb1 Cleanup 2026-06-03 15:16:36 +03:00
koritsa 6f0aa5274c Rework interaction system 2026-06-03 15:16:36 +03:00
koritsa 891a0744a0 Fixed savegame 2026-06-03 15:16:34 +03:00
koritsa bc498d98a8 Fix common ui input settings, equipment menu initialization order 2026-06-03 15:16:32 +03:00
koritsa 7776083897 Added starting save data 2026-06-03 15:16:30 +03:00
koritsa 5c1ca57a04 setup equipment ui 2026-06-03 15:16:30 +03:00
koritsa 9792ede1e8 Clothings lots config rework 2026-06-03 15:16:27 +03:00
koritsa 878060d7ac Started rework of clothing slots and UI 2026-06-03 15:16:25 +03:00
koritsa 38161ee4a2 Fixed radial menu input 2026-06-03 15:16:23 +03:00
koritsa 48951fa305 Started radial menu setup 2026-06-03 15:16:21 +03:00
koritsa 37d19b0817 Started UI rework 2026-06-03 15:16:21 +03:00
koritsa 43ddad9217 Completed phase 1 2026-06-03 15:16:21 +03:00
koritsa 799fc8a4ae Updates 2026-06-03 15:16:21 +03:00
koritsa 321683941e updated README.md 2026-06-03 15:16:21 +03:00
koritsa c0cd79a0c8 Added README.uk.md 2026-06-03 15:16:20 +03:00
koritsa 45187450ef Updated plan 2026-06-03 15:16:20 +03:00
koritsa d286b9bdb4 Update README.md 2026-06-03 15:16:20 +03:00
koritsa a6eb1d4083 Updated readme and plan 2026-06-03 15:16:20 +03:00
koritsa 4c9a2df9f0 Updated readme 2026-06-03 15:16:19 +03:00
koritsa 3c612daa17 updated plan 2026-06-03 15:16:16 +03:00
koritsa 4a0d7adf69 updated readme 2026-06-03 15:16:16 +03:00
koritsa f05ac1506b updated readme 2026-06-03 15:16:16 +03:00
koritsa a378cfd3db Updated readme 2026-06-03 15:16:14 +03:00
koritsa dfc4cf28cf Added save subsystem 2026-06-03 15:16:07 +03:00
koritsa eb99038785 Added container slots 2026-06-03 15:16:07 +03:00
koritsa c569adfd69 Added ClothingItemInstance and cleanup the project 2026-06-03 15:16:07 +03:00
koritsa c29454fe38 Add EProgressionPath enum 2026-06-03 15:16:07 +03:00
koritsa fb72716b96 Introduce EBodyPart enum 2026-06-03 15:16:07 +03:00
koritsa edcd95b7f5 Define UItemInstance base UObject with stable GUID 2026-06-03 15:16:07 +03:00
koritsa 0a99ecbeb0 fixed build errors 2026-06-03 15:15:57 +03:00
koritsa 2c78e1660e Fix embarrassment gain/decay not tied to NPC observation state 2026-05-18 22:47:33 +03:00
koritsa a04b892fe9 Setup basic test level 2026-05-18 22:41:19 +03:00
koritsa 1c50237958 Resolve Money duplication between ANakedDesireCharacter and UGlobalSaveGameData 2026-05-18 20:57:34 +03:00
koritsa a5bd139f62 Fix remove-while-iterating delegate bug in MissionsManager::RefreshDailyMissions 2026-05-18 20:49:33 +03:00
koritsa d94fdafdac Fix out-of-bounds crash in NakedDesireGameMode::RefreshDailyMissions 2026-05-18 20:46:20 +03:00
koritsa 82cc539aa6 updated issue templates labels 2026-05-18 14:06:41 +03:00
koritsa 350acdeede added issue templates 2026-05-17 23:25:15 +03:00
koritsa 26fedadcd8 init 2026-05-17 22:44:49 +03:00
3218 changed files with 14328 additions and 6034 deletions
-16
View File
@@ -1,16 +0,0 @@
---
name: Bug
about: Something is broken
labels: type/bug
---
**What happens**
**What should happen**
**Repro steps**
1.
2.
**GDD reference (if relevant):** §
-24
View File
@@ -1,24 +0,0 @@
---
name: System work
about: A piece of code/system implementation
labels: type/system
---
**GDD reference:**
**Goal**
<!-- One sentence: what this issue accomplishes -->
**Acceptance criteria**
- [ ]
- [ ]
**Dependencies**
<!-- Issues that must be done first -->
**Notes**
<!-- Open questions, design caveats, links -->
+180
View File
@@ -0,0 +1,180 @@
# Commission board / accept UI — plan
Implementation plan for the forum **commission board** UI (GDD §13.1 / §13.2). **Not implemented yet**
this is the design to review before coding. Pairs with `COMMISSIONS.md` (objective backlog) and the
runtime system in `Source/NakedDesire/Commissions/` (`UMissionSubsystem`, `UCommission`,
`UCommissionObjective`).
## Goal & scope
The forum is the player-facing surface for commissions (§13). For the vertical slice this is the
**minimal board** PLAN VS4 calls for: list offered commissions, accept/abandon, and track active ones
with live objective progress. No threads, no other-user feed, no profile tab yet (§13 forum scope note).
The runtime already does the work; this is **pure presentation + input**:
- `UMissionSubsystem::GetOfferedCommissions()` / `GetAcceptedCommissions()`
- `AcceptCommission(UCommission*)` / `AbandonCommission(UCommission*)`
- `OnBoardChanged` (rebuild signal) / `OnCommissionCompleted(UCommission*)` (feedback)
- per-commission: `GetTitle / GetPosterUsername / GetTier / GetReward / GetObjectives / GetState`, plus
`OnStateChanged` / `OnCompleted`
- per-objective: `GetDescription()`, `GetProgress()` (0..1), `IsSatisfied()`, `OnStateChanged`
## Reuse the established pattern
Follow `WardrobeScreenWidget` / `WardrobeInventoryWidget` exactly (CommonUI):
- Screen = `UCommonActivatableWidget` pushed onto `UGameLayoutWidget`'s `WidgetStack`.
- Lists rebuilt from the subsystem on a change delegate; rows are child widgets with click delegates.
- Subscribe in `NativeOnActivated`, unsubscribe in `NativeDestruct`.
- C++ owns logic + `BindWidget` references; Blueprint owns layout/visuals (GDD §17.5).
## Widget breakdown (new C++ classes, BP subclasses for visuals)
### 1. `UCommissionBoardScreenWidget : UCommonActivatableWidget`
The screen. Two sections: **Board** (offered) and **Active** (accepted).
- BindWidgets: `UVerticalBox* OfferedList`, `UVerticalBox* ActiveList` (or `UScrollBox`), optional
`UCommonTextBlock* EmptyBoardLabel`.
- EditDefaultsOnly: `TSubclassOf<UCommissionEntryWidget> EntryWidgetClass`.
- `NativeOnActivated`: grab `UMissionSubsystem`, bind `OnBoardChanged → Rebuild`,
`OnCommissionCompleted → HandleCompleted` (toast/flash), call `Rebuild()`.
- `NativeDestruct`: unbind both.
- `Rebuild()`: `OfferedList/ActiveList->ClearChildren()`; for each commission create an entry widget,
`Init(Commission, Subsystem)`, add to the right list. (Membership only changes on accept / complete /
abandon / dayroll, all of which fire `OnBoardChanged`, so a full rebuild is cheap and correct.)
### 2. `UCommissionEntryWidget : UCommonUserWidget`
One commission row.
- BindWidgets: `UCommonTextBlock* TitleText, PosterText, TierText, RewardText`,
`UVerticalBox* ObjectiveList`, `UCommonButtonBase* ActionButton`, `UCommonTextBlock* ActionLabel`.
- EditDefaultsOnly: `TSubclassOf<UCommissionObjectiveRowWidget> ObjectiveRowClass`.
- `Init(UCommission*, UMissionSubsystem*)`: cache both, subscribe `Commission->OnStateChanged →
RefreshActionState`, render header (title/poster/tier), reward summary from `FCommissionReward`
(money / XP / followers — hide zero fields), build an objective row per `GetObjectives()`.
- Action button is state-driven (`Commission->GetState()`):
- `Offered` → label **Accept** → `Subsystem->AcceptCommission(Commission)`.
- `Accepted` → label **Abandon** → `Subsystem->AbandonCommission(Commission)`.
- `Completed` / `Expired` → button hidden/disabled (the rebuild usually removes it from the board).
- **Compact mode** for the HUD tracker: a `bCompact` flag (or a BP variant) hides poster / reward /
action button and shows just title + objective rows, so the tracker (#4) reuses this same widget.
- `NativeDestruct`: unsubscribe from the commission.
### 3. `UCommissionObjectiveRowWidget : UCommonUserWidget`
One objective line.
- BindWidgets: `UCommonTextBlock* DescriptionText`, `UProgressBar* ProgressBar` (BindWidgetOptional),
`UImage* DoneCheck` (BindWidgetOptional).
- `Init(UCommissionObjective*)`: set `GetDescription()`, subscribe `OnStateChanged → RefreshDone`.
- Progress: objectives have **no per-frame progress delegate** — only `OnStateChanged` (fires on
satisfied). For the continuous ones (`RequiredHoldSeconds` holds, `RunNakedDistance`) drive the bar
from `NativeTick` polling `GetProgress()` **while the screen is open** (cheap, self-contained). Binary
objectives just toggle `DoneCheck` on `OnStateChanged`. (If polling ever feels wasteful, add an
`OnProgressChanged` delegate to `UCommissionObjective` later — not needed for the slice.)
### 4. `UCommissionTrackerWidget : UCommonUserWidget`
Always-on HUD element showing accepted commissions' current objectives + live progress while the player
is in the world. **Passive HUD — not activatable, never captures input.**
- Hosted as a `BindWidget` child of the existing `UHUDWidget` (the always-on HUD), so it shows during
normal play and not just at the PC.
- BindWidgets: `UVerticalBox* TrackerList`; EditDefaultsOnly `TSubclassOf<UCommissionEntryWidget>
TrackerEntryWidgetClass`.
- `NativeConstruct`: grab `UMissionSubsystem`, bind `OnBoardChanged → Rebuild`, call `Rebuild()`.
`NativeDestruct`: unbind.
- `Rebuild()`: clear; for each `GetAcceptedCommissions()` add a `UCommissionEntryWidget` in **compact
mode** (title + objective rows, no reward/poster/button). Collapse the whole widget when the active
list is empty.
- Live progress comes from the reused objective rows' own `NativeTick` poll — no extra wiring here.
## Entry point (how the board opens)
§13 says phone or PC; the phone stack is Phase 8, so for the slice use the **apartment PC** as an
interactable, mirroring `AWardrobe`:
- New `AForumTerminal` (or `AApartmentPC`) `IInteractable` → `Interact` calls
`HUD->GetGameLayoutWidget()->OpenCommissionBoard()`.
- `UGameLayoutWidget`: add `OpenCommissionBoard()` + `TSubclassOf<UCommissionBoardScreenWidget>
CommissionBoardScreenWidgetClass` + the instance ptr (same shape as `OpenWardrobe`).
- Add a debug input action (or console exec) to open it directly for testing before the PC art exists.
- Phone "Forum app" entry point is added in Phase 8 and calls the same `OpenCommissionBoard()`.
## Data flow & live updates
- **Membership** (which list a commission is in): `OnBoardChanged` → full `Rebuild()`.
- **Action state** of a visible entry (e.g. accepted→completed while open): `Commission->OnStateChanged`
→ `RefreshActionState`; the subsequent `OnBoardChanged` (fired by the subsystem on completion) rebuilds
and moves it out of Active.
- **Objective progress**: `OnStateChanged` for done state + `NativeTick` poll for the progress bar.
- **Completion feedback**: `OnCommissionCompleted` → brief toast / reward popup (reuse existing
`UI/` + `Audio/UI` tone). Optional for the slice.
## Layout sketch
```
┌─ Commission Board ───────────────────────────────────────────┐
│ BOARD (offered) ACTIVE (accepted) │
│ ┌────────────────────────────┐ ┌──────────────────────┐ │
│ │ Flash a Stranger [Daily]│ │ Beach Streak [Daily] │ │
│ │ posted by sk8r_gurl │ │ ▸ Run 50 m naked 62% │ │
│ │ ▸ Expose boobs to 1 person │ │ ▸ while at the beach │ │
│ │ $150 · 20 XP · +5 followers│ │ [ Abandon ]│ │
│ │ [ Accept ]│ └──────────────────────┘ │
│ └────────────────────────────┘ │
│ … more offered … (empty → "No active │
│ commissions") │
└──────────────────────────────────────────────────────────────┘
```
(Two columns is the simplest; a Board/Active tab pair is an equivalent alternative — see decisions.)
## C++ vs Blueprint split
- **C++ (this plan):** the four widget classes above (screen, entry, objective row, HUD tracker) +
`OpenCommissionBoard` on `GameLayoutWidget` + the PC interactable. All subsystem calls, subscriptions,
list rebuilds, and button handlers live here.
- **Blueprint:** `WBP_CommissionBoardScreen`, `WBP_CommissionEntry`, `WBP_CommissionObjectiveRow`,
`WBP_CommissionTracker` — visual layout only, satisfying the `BindWidget` names above and setting the
`…WidgetClass` defaults. `WBP_CommissionEntry` carries the full and compact looks (compact = tracker).
## Subsystem changes needed
None required — the existing API covers it. Nice-to-haves to consider during build:
- A `GetCompletedCommissions()` getter if a "completed today" section is wanted (data already tracked).
- Confirm `OnBoardChanged` fires on **every** membership change (it does: accept / abandon / complete /
dayroll all call it).
## Edge cases to handle
- Empty board / empty active list → show a label, not a blank panel.
- A commission completing while the screen is open → entry shows done, then rebuild removes it from
Active (and the completion toast fires once).
- Day roll while the screen is open → `OnBoardChanged` rebuilds; accepted-but-unfinished entries vanish
(expired) and a fresh offered set appears. Make sure entry widgets unsubscribe on rebuild (`NativeDestruct`).
- Abandon returns the commission to the board (Offered) in the same session.
- Re-entrancy: accepting an already-satisfiable commission completes instantly; the entry should tolerate
`Accepted → Completed` within one frame (drive purely off `GetState()` + the rebuild).
## Locked decisions (slice)
1. **Layout — two columns** (Board | Active), not tabs. Everything visible at once; simplest.
2. **Entry point — apartment PC interactable** (`AForumTerminal`) calls `OpenCommissionBoard()`, plus a
debug console exec to open it before the PC art exists. Phone "Forum app" reuses the same call (Phase 8).
3. **Progress display — both:** a progress bar (driven by `NativeTick` polling `GetProgress()`) for the
continuous objectives and a checkmark for binary ones, via `BindWidgetOptional` on the row widget.
4. **Completion feedback — minimal toast** on commission completion (reuse existing `UI/` + `Audio/UI`).
5. **In-world HUD objective tracker — yes, in scope.** A separate always-on HUD widget
(`UCommissionTrackerWidget`, see breakdown #4) shows accepted commissions' current objectives + live
progress while the player is out in the world (GDD §0.5 'objective-tracker widget'). The board is for
browse/accept at the PC; the tracker is for following objectives in the field. It reuses the shared
entry/row widgets in a compact form, so it adds one widget — not a parallel hierarchy.
6. **Modal behavior — mirror the inventory/wardrobe screens.** The board uses the same input-config /
pause setup the existing `UCommonActivatableWidget` screens use; read `UInventoryScreenWidget` /
`UWardrobeScreenWidget` (+ their BP activation / `GetDesiredInputConfig` settings) and match them for a
consistent menu UX. The HUD tracker is **not** an activatable widget — it's passive HUD and never
captures input or pauses anything.
## Build order (when greenlit)
1. Read `UInventoryScreenWidget` / `UWardrobeScreenWidget` input-config + activation settings and reuse
the same convention for the board (decision #6).
2. `UCommissionObjectiveRowWidget` → `UCommissionEntryWidget` (incl. `bCompact`) → `UCommissionBoardScreenWidget`.
3. `UGameLayoutWidget::OpenCommissionBoard()` + class ref; debug console exec to open.
4. `UCommissionTrackerWidget` on `UHUDWidget` (reuses the entry/row widgets in compact mode).
5. Author the `WBP_*` assets (board screen, entry, objective row, tracker) against the BindWidget contracts.
6. `AForumTerminal` interactable (apartment PC) → `OpenCommissionBoard`.
7. Author a `UCommissionBoardConfig` with a few test commissions and play-test the full accept → satisfy →
reward → expire loop, plus the HUD tracker updating in the field (ties into the VS4 / VS7 exit checks).
+122
View File
@@ -0,0 +1,122 @@
# 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 (VS5), lust & pulse (VS2), 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 VS3) — 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()` 🔶 (VS5).
## Attributes: embarrassment / arousal (✅ embarrassment; 🔶 lust/pulse)
- `ReachEmbarrassment(threshold)` / `SustainEmbarrassment(threshold, duration)` ✅ — **`UReachEmbarrassmentObjective`** *(implemented; a hold duration turns Reach into Sustain)*.
- `ReachLust(threshold)` / `EdgeWithoutResolving(duration)` 🔶 (VS2).
- `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, VS5) · `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 VS5 (NPC types), VS2 (lust/pulse), toys, restraints, and Phase 8
(photo/livestream/followers) land.
+5 -1
View File
@@ -1,7 +1,7 @@
[/Script/EngineSettings.GameMapsSettings]
EditorStartupMap=/Game/Test/Maps/TestLevel.TestLevel
EditorStartupMap=/Game/Test/Maps/L_Test.L_Test
LocalMapOptions=
TransitionMap=None
bUseSplitscreen=True
@@ -135,3 +135,7 @@ DefaultMediaSoundClassName=/Game/Audio/SC_Music.SC_Music
AgentRadius=35.000000
AgentMaxSlope=50.000000
[/Script/GameplayDebugger.GameplayDebuggerConfig]
CategorySlot4=Backslash
CategorySlot5=RightBracket
+9 -6
View File
@@ -2,6 +2,9 @@
CommonButtonAcceptKeyHandling=TriggerClick
bAutoLoadData=True
[/Script/AIModule.AISense_Sight]
bAutoRegisterAllPawnsAsSources=False
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=305A61484AE3739092FF13931B45C2C6
ProjectName=Naked Desire
@@ -13,8 +16,8 @@ ProjectDisplayedTitle=NSLOCTEXT("[/Script/EngineSettings]", "67F2166BC54742EF9F5
ProjectDebugTitleInfo=NSLOCTEXT("[/Script/EngineSettings]", "6D0073BB1F41C8C4E21284B87D77ED5C", "Naked Desire")
[/Script/CommonInput.CommonInputSettings]
InputData=/Game/Input/NakedDesireInputData.NakedDesireInputData_C
ActionDomainTable=/Game/Input/InputActionDomainTable.InputActionDomainTable
InputData=/Game/Input/CommonUI/NakedDesireInputData.NakedDesireInputData_C
ActionDomainTable=/Game/Input/CommonUI/InputActionDomainTable.InputActionDomainTable
[CommonInputPlatformSettings_Windows CommonInputPlatformSettings]
DefaultInputType=MouseAndKeyboard
@@ -23,8 +26,8 @@ bSupportsTouch=False
bSupportsGamepad=True
DefaultGamepadName=Generic
bCanChangeGamepadType=True
+ControllerData=/Game/Input/KeyboardControllerData.KeyboardControllerData_C
+ControllerData=/Game/Input/GamepadControllerData.GamepadControllerData_C
+ControllerData=/Game/Input/CommonUI/GamepadControllerData.GamepadControllerData_C
+ControllerData=/Game/Input/CommonUI/KeyboardControllerData.KeyboardControllerData_C
[/Script/UnrealEd.ProjectPackagingSettings]
Build=IfProjectHasCode
@@ -141,6 +144,6 @@ bSupportsTouch=False
bSupportsGamepad=True
DefaultGamepadName=Generic
bCanChangeGamepadType=True
+ControllerData=/Game/Input/GamepadControllerData.GamepadControllerData_C
+ControllerData=/Game/Input/KeyboardControllerData.KeyboardControllerData_C
+ControllerData=/Game/Input/CommonUI/KeyboardControllerData.KeyboardControllerData_C
+ControllerData=/Game/Input/CommonUI/GamepadControllerData.GamepadControllerData_C
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More