Compact the plan and synchronize project documentation
- reduce PLAN.md from a 674-line implementation log to a 187-line product/design plan; keep escalation, venues, NPC/systems, controls, presentation and constraints - refresh README for implemented venues, Blender/v2 assets, the custom test runner, Web target, current release state and the screenshot smoke - update architecture for 0.6.0, the runtime art loader, Gitea CI/build/publish, Web deployment, six release artifacts and visual regression - remove stale uncommitted/active-pass claims from MEMORY and point it at the current NPC follow-ups; move the completed documentation task to DONE
This commit is contained in:
1 parent
85d67ff8b1
commit
2624b54b23
6 files changed
+201
-674
No files matched your search
@@ -2,673 +2,186 @@
|
||||
|
||||
## Premise
|
||||
|
||||
You play a private security guard stationed at the top of the steps outside a fictional building on Hollywood Boulevard. Your job is to keep the entrance and steps clear while dealing with tourists, trespassers, performers, protesters, intoxicated pedestrians, and occasional determined intruders.
|
||||
You are a private security guard working the entrance of a fictional Hollywood Boulevard building. You keep the steps and doors clear, check who is allowed in, and deal with tourists, performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people in mental-health crisis, and rare determined threats.
|
||||
|
||||
The game is about **judgment, communication, and escalation management**, not simply attacking anyone who approaches.
|
||||
The game is about **judgment, communication, access verification, and proportionate escalation**, not about attacking everyone who approaches.
|
||||
|
||||
---
|
||||
## Design Pillars
|
||||
|
||||
- **Lowest effective response wins.** Observation, a gesture, or a clear direction should solve most situations.
|
||||
- **People are not labels.** Clothes, props, credentials, and behavior tell the player what they need; internal NPC types stay in the debug overlay.
|
||||
- **Every decision has a record.** Incidents, evidence, radio reports, and outcomes feed the shift review.
|
||||
- **Emergency help is a last resort.** Responders handle crises the guard cannot safely manage; calling them has costs.
|
||||
- **Readability beats raw fidelity.** The GL Compatibility renderer, clear silhouettes, the focus ring, and the HUD stay legible.
|
||||
|
||||
## Core Gameplay Loop
|
||||
|
||||
1. Watch the stairs, entrance, and sidewalk.
|
||||
2. Identify why each person is approaching.
|
||||
3. Give verbal warnings and directions.
|
||||
4. Escalate only when necessary.
|
||||
5. Call for assistance in rare dangerous situations.
|
||||
6. Maintain public safety, building security, and your employer’s reputation.
|
||||
1. Watch the entrance, steps, queue, and sidewalk.
|
||||
2. Work out why each person is approaching.
|
||||
3. Use a gesture or short direction before escalating.
|
||||
4. Verify authorized access when the venue requires it.
|
||||
5. Escalate only when the person refuses, forces entry, or presents a genuine threat.
|
||||
6. Record the incident and call for help when it is justified.
|
||||
7. Review the shift: safety, judgment, accuracy, crowd reaction, and reputation.
|
||||
|
||||
People should not all behave the same way. Some are confused, some are rude, some are filming, and a very small number are deliberately attempting to enter.
|
||||
A shift lasts roughly 10–15 minutes. Most people comply when approached calmly.
|
||||
|
||||
## Authorized Access
|
||||
## Access and Verification
|
||||
|
||||
Some people are authorized to enter the building. The security guard must verify them before granting access.
|
||||
Some people are authorized to enter. The guard may admit them by:
|
||||
|
||||
An authorized person can be admitted if either:
|
||||
- recognizing a person the guard already knows; or
|
||||
- verifying a venue-appropriate artifact: wristband, ID, ticket, credential, or guest list.
|
||||
|
||||
- The guard already knows and recognizes them.
|
||||
- The person presents a valid event or staff wristband, which the guard checks before opening the entrance.
|
||||
Artifacts can be valid, expired, counterfeit, mismatched, missing, or ambiguous. The player inspects the details the venue asks for instead of judging by appearance.
|
||||
|
||||
The wristband check should require the player to inspect details such as its color, pattern, date, or event marking. NPCs may have valid wristbands, expired wristbands, counterfeit wristbands, or no wristband at all.
|
||||
Decisions are admit, redirect, hold, or refuse. Incorrectly denying an authorized person hurts reputation; admitting an unauthorized person is a security failure. Recognition is a player decision and is recorded as evidence.
|
||||
|
||||
The player should avoid relying on appearance or assumptions. A familiar person may still need verification if the building’s current policy requires it, while an unfamiliar person with a valid wristband may be admitted after a successful check. Incorrectly denying an authorized person harms the building’s reputation; admitting someone without authorization creates a security failure.
|
||||
## Escalation Model
|
||||
|
||||
---
|
||||
| Level | Player response | Intent |
|
||||
| --- | --- | --- |
|
||||
| 0 | Observation | Watch harmless behavior; intervene only when needed. |
|
||||
| 1 | Simple deterrence / polite direction | Raise a hand, make eye contact, point to the sidewalk or check-in area, shake the head, give a short instruction. |
|
||||
| 2 | Formal warning | State the rule and ask for compliance; optionally arm the body camera. |
|
||||
| 3 | Blocking and positioning | Stand between the person and the door, secure the entrance, keep distance and an escape route, ask for their reason. |
|
||||
| 4 | Radio for security assistance | Request a second guard, supervisor, building management, or other support. |
|
||||
| 5 | Emergency response | Hold and confirm the emergency call only for an immediate threat such as a weapon, assault, forced entry, or serious threat to occupants. |
|
||||
|
||||
## Escalation System
|
||||
At Level 2 an NPC may leave, argue, pretend not to understand, record the guard, call someone, or move closer. At Level 3 the goal is to deny access **without starting a fight**. Physical contact creates legal, employment, and public-relations consequences.
|
||||
|
||||
### Level 0: Observation
|
||||
|
||||
The guard watches NPC behavior and decides whether intervention is needed.
|
||||
|
||||
Examples:
|
||||
|
||||
- Someone taking a photograph from the sidewalk
|
||||
- A tourist reading a map
|
||||
- A person sitting briefly on the edge of the steps
|
||||
- Someone approaching the entrance with a delivery package
|
||||
|
||||
The player should avoid interrupting harmless behavior. Unnecessary confrontations reduce the guard’s performance rating.
|
||||
|
||||
---
|
||||
|
||||
### Level 1: Simple Deterrence and Polite Direction
|
||||
|
||||
The player can begin with a simple, nonverbal deterrent before speaking. These actions are quick and low-pressure, making them useful when someone is only approaching the steps casually or appears unsure.
|
||||
|
||||
Possible actions include:
|
||||
|
||||
- Raise an open hand to signal “stop” or “please wait”
|
||||
- Make eye contact
|
||||
- Point toward the public sidewalk
|
||||
- Gesture toward the wristband-check area
|
||||
- Shake the head gently when someone approaches a restricted entrance
|
||||
|
||||
If the person continues, the player uses a short verbal prompt.
|
||||
|
||||
Example commands:
|
||||
|
||||
- “Please keep the stairs clear.”
|
||||
- “The entrance is for authorized guests only.”
|
||||
- “You can’t remain here.”
|
||||
- “Please move back to the sidewalk.”
|
||||
|
||||
At this stage, most NPCs comply immediately.
|
||||
|
||||
---
|
||||
|
||||
### Level 2: Formal Warning
|
||||
|
||||
If the person remains on the steps or continues toward the entrance, the player issues a formal warning.
|
||||
|
||||
Possible dialogue:
|
||||
|
||||
> “This is private property. You have been asked to leave. Please move away from the entrance now.”
|
||||
|
||||
The player may activate a visible security light or body camera. This creates a record of the interaction and can discourage repeat offenders.
|
||||
|
||||
At this level, the NPC may:
|
||||
|
||||
- Leave
|
||||
- Argue
|
||||
- Pretend not to understand
|
||||
- Start recording the guard
|
||||
- Call someone else
|
||||
- Move closer to the door
|
||||
|
||||
---
|
||||
|
||||
### Level 3: Blocking and Physical Positioning
|
||||
|
||||
The guard moves into a defensive position between the NPC and the building.
|
||||
|
||||
Gameplay actions:
|
||||
|
||||
- Stand in front of the entrance
|
||||
- Point toward the public sidewalk
|
||||
- Lock or secure the door
|
||||
- Request the person’s reason for entry
|
||||
- Keep distance while maintaining a clear escape route
|
||||
- Use a flashlight or radio warning tone at night
|
||||
|
||||
The player should not automatically shove or strike people. Physical contact creates legal, employment, and public-relations consequences.
|
||||
|
||||
This level is about **denying access without creating a fight**.
|
||||
|
||||
---
|
||||
|
||||
### Level 4: Radio for Security Assistance
|
||||
|
||||
If the person refuses to leave, attempts to force the door, threatens staff, or repeatedly returns, the player uses the radio.
|
||||
|
||||
Possible assistance:
|
||||
|
||||
- A second security guard
|
||||
- Building management
|
||||
- Police dispatch
|
||||
- Nearby security personnel
|
||||
|
||||
The radio call takes time, so the player must continue monitoring the person while waiting. The player can choose what information to report:
|
||||
|
||||
- Location
|
||||
- Description
|
||||
- Behavior
|
||||
- Whether weapons have been seen
|
||||
- Whether anyone is in immediate danger
|
||||
|
||||
Incorrect or exaggerated reports damage the guard’s credibility.
|
||||
|
||||
---
|
||||
|
||||
### Level 5: Emergency Response
|
||||
|
||||
This is reserved for immediate threats, such as:
|
||||
|
||||
- A person displaying a weapon
|
||||
- An attempted forced entry while people are inside
|
||||
- An assault on the guard or another person
|
||||
- A serious threat against occupants
|
||||
- A violent struggle that cannot be safely disengaged
|
||||
|
||||
The player presses and holds a clearly marked **Emergency Radio** button. A confirmation prompt prevents accidental activation.
|
||||
|
||||
The call brings an off-duty law-enforcement officer or armed emergency responder to the location. This character has greater authority and can control a dangerous situation, but the call has serious consequences:
|
||||
|
||||
- The building may be evacuated
|
||||
- The street may be closed
|
||||
- The guard’s actions are reviewed
|
||||
- The building loses reputation
|
||||
- The player may face an investigation if the call was unjustified
|
||||
- The officer may use force only when the game’s threat assessment supports it
|
||||
|
||||
The officer should not function as a convenient “stronger attack.” Their role is to handle a crisis the player cannot safely manage. In most scenarios, their arrival results in commands, restraint, evacuation, or arrest rather than automatic gunfire.
|
||||
|
||||
---
|
||||
At Level 4 the report matters: location, description, behavior, weapons seen, and immediate danger. Exaggerated reports damage credibility. At Level 5 the call may evacuate the building, close the street, trigger a review, cost reputation, or open an investigation if unjustified. Responders may command, restrain, evacuate, or arrest; they are not a routine stronger attack.
|
||||
|
||||
## NPC Behavior Types
|
||||
|
||||
### Tourists
|
||||
|
||||
- Take photos
|
||||
- Sit on steps
|
||||
- Wander toward restricted doors
|
||||
- Usually respond well to polite directions
|
||||
|
||||
### Street Performers
|
||||
|
||||
- May block stairs
|
||||
- May become argumentative if moved
|
||||
- Can be redirected to a permitted area
|
||||
|
||||
### Influencers and Filmmakers
|
||||
|
||||
- Film the guard
|
||||
- Test boundaries for content
|
||||
- May accuse the guard of overreacting
|
||||
- Create public-relations risk
|
||||
|
||||
### Confused Visitors
|
||||
|
||||
- Have appointments or directions
|
||||
- May genuinely believe the building is public
|
||||
- Reward patient explanations
|
||||
|
||||
### Intoxicated Pedestrians
|
||||
|
||||
- Move unpredictably
|
||||
- May ignore instructions
|
||||
- Require additional distance and assistance
|
||||
|
||||
### Trespassers
|
||||
|
||||
- Repeatedly test entrances
|
||||
- Use distractions
|
||||
- May return after being told to leave
|
||||
|
||||
### Violent Threats
|
||||
|
||||
- Rare
|
||||
- Escalate quickly
|
||||
- Trigger the emergency response system only when their behavior indicates immediate danger
|
||||
|
||||
### 51/50s
|
||||
|
||||
Crazy Homeless Individuals may be referred to as "51/50s" in the context of the game, indicating a person who may be experiencing a mental health crisis and could pose a potential threat to themselves or others.
|
||||
|
||||
- May loiter near entrances
|
||||
- Can be unpredictable in behavior
|
||||
- Often respond poorly to aggressive confrontation
|
||||
- Require careful de-escalation and patience
|
||||
|
||||
---
|
||||
- **Tourists:** take photos, sit on steps, drift toward restricted doors; usually respond well to polite directions.
|
||||
- **Street performers:** may block stairs or argue when moved; can be redirected to a permitted area.
|
||||
- **Influencers and filmmakers:** film the guard, test boundaries, and create public-relations risk.
|
||||
- **Confused visitors:** may have appointments or genuinely believe the building is public; reward patient explanation.
|
||||
- **Intoxicated pedestrians:** move unpredictably, ignore instructions, and need extra distance or assistance.
|
||||
- **Trespassers:** test entrances, use distractions, and may return after being told to leave.
|
||||
- **Violent threats:** rare, escalate quickly, and justify emergency response only when behavior shows immediate danger.
|
||||
- **People in mental-health crisis:** may loiter, behave unpredictably, and respond poorly to aggression; require patience and careful de-escalation. The setting may refer to a 51/50 hold, but the game should present the person respectfully, not as an automatic threat.
|
||||
|
||||
## Special Systems
|
||||
|
||||
### Reputation Meter
|
||||
### Reputation
|
||||
|
||||
The player is evaluated on:
|
||||
|
||||
- Number of incidents resolved peacefully
|
||||
- Response time
|
||||
- Accuracy of radio reports
|
||||
- Number of unnecessary confrontations
|
||||
- Public complaints
|
||||
- Property damage
|
||||
- Whether the entrance remained secure
|
||||
|
||||
A player who calls armed assistance too often should score poorly, even if no one was injured.
|
||||
The shift evaluates peaceful resolutions, response time, radio accuracy, unnecessary confrontations, public complaints, property damage, entrance security, and whether assistance was justified. Calling armed help too often scores poorly even when no one is hurt.
|
||||
|
||||
### Evidence and Body Camera
|
||||
|
||||
Interactions are automatically recorded. After each shift, the player reviews incidents and sees whether their escalation was justified.
|
||||
Interactions are recorded automatically. The body camera is a real state the player can toggle; a formal warning also arms it. The shift review uses the recorded events and evidence to show whether the response was justified.
|
||||
|
||||
This encourages players to think before acting.
|
||||
### Crowd Reaction
|
||||
|
||||
### Public Crowd Reaction
|
||||
Nearby pedestrians react to the guard. Calm professionalism attracts little attention; aggression draws a crowd; visible weapons or responders can cause panic. Good de-escalation keeps the boulevard moving.
|
||||
|
||||
Nearby pedestrians react to the guard’s behavior:
|
||||
### Radio Limits
|
||||
|
||||
- Calm professionalism attracts little attention
|
||||
- Aggressive behavior creates a crowd
|
||||
- Visible weapons or emergency responders cause panic
|
||||
- Good de-escalation keeps the boulevard moving normally
|
||||
|
||||
### Limited Radio Battery or Cooldown
|
||||
|
||||
The emergency radio should not be infinitely available. A call has a cooldown and may require the player to give a short report first.
|
||||
|
||||
---
|
||||
The emergency radio has a cooldown, and the call requires a short report. Assistance takes time to arrive, so the guard must keep monitoring the situation.
|
||||
|
||||
## Shift Structure
|
||||
|
||||
Each shift lasts 10–15 minutes.
|
||||
- **Early:** harmless tourists, delivery workers, people resting on the steps.
|
||||
- **Midday:** heavier crowds, more entry attempts, more filming.
|
||||
- **Evening:** lower light, more intoxicated pedestrians and aggressive groups.
|
||||
- **Late:** a rare serious incident may test whether the player recognizes a real threat without overreacting to ordinary behavior.
|
||||
|
||||
### Early Shift
|
||||
## Outcomes
|
||||
|
||||
Mostly harmless tourists, delivery workers, and people sitting on the stairs.
|
||||
A successful shift keeps the building secure, resolves most incidents without force, keeps public access clear, makes justified emergency calls, avoids bystander injuries, and follows policy.
|
||||
|
||||
### Midday
|
||||
A poor shift involves excessive force, confronting innocent people, ignoring a real threat, false reports, allowing unauthorized entry, causing a crowd or panic, or behaving recklessly even if the door stayed locked.
|
||||
|
||||
Crowds become heavier. More people attempt to enter the building or film interactions.
|
||||
## Venues
|
||||
|
||||
### Evening
|
||||
### Hollywood Boulevard Building
|
||||
|
||||
Lighting decreases. Intoxicated pedestrians and aggressive groups become more common.
|
||||
The original scenario: a building entrance with steps, sidewalk, street lamps, and a restricted door. Tourists, performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people in crisis, and rare violent threats approach from the boulevard.
|
||||
|
||||
### Late Shift
|
||||
|
||||
A rare serious incident may occur, testing whether the player recognizes a genuine threat instead of overreacting to ordinary behavior.
|
||||
|
||||
---
|
||||
|
||||
## Win and Loss Conditions
|
||||
|
||||
## Successful Shift
|
||||
|
||||
- Building remains secure
|
||||
- Most incidents are resolved without physical force
|
||||
- Public access remains clear
|
||||
- Emergency calls are justified
|
||||
- No bystanders are injured
|
||||
- The player follows company policy
|
||||
|
||||
## Poor Performance
|
||||
|
||||
- Excessive use of force
|
||||
- Repeatedly confronting innocent people
|
||||
- Ignoring a real threat
|
||||
- Making false radio reports
|
||||
- Allowing repeated unauthorized entry
|
||||
- Causing a crowd or panic
|
||||
|
||||
A shift can be technically “secure” but still receive a poor rating if the guard behaves recklessly.
|
||||
|
||||
---
|
||||
|
||||
## Venues and Scenarios
|
||||
|
||||
The game should support multiple venues, each with its own access rules, crowd patterns, equipment, and escalation procedures. The core gameplay remains the same: observe, verify access, communicate clearly, and use the lowest effective level of escalation.
|
||||
Authorized people are recognized or present a valid wristband. Wristbands vary by color, pattern, date, and event marking, and may be valid, expired, counterfeit, or missing.
|
||||
|
||||
### The Joke Shop
|
||||
|
||||
**The Joke Shop** is a comedy club scenario where the player works as a door person at the entrance. The player is responsible for checking identification, confirming that guests are attending the correct show, and screening guests for weapons with a handheld security wand.
|
||||
A comedy-club entrance. The door person checks IDs, tickets, reservations, guest-list status, and screens guests with a handheld wand under venue policy.
|
||||
|
||||
#### Primary Responsibilities
|
||||
The wand does **not** identify a weapon automatically. Keys, belts, and phones can trigger false alarms; the player must ask the guest to identify the item and apply procedure. A guest with valid credentials can still require assistance if they threaten staff or patrons.
|
||||
|
||||
- Check each guest’s government-issued ID where required.
|
||||
- Confirm that the guest meets the venue’s age requirement.
|
||||
- Verify that the ID appears valid and belongs to the person presenting it.
|
||||
- Check tickets, reservations, or guest-list status.
|
||||
- Use the handheld wand according to venue policy.
|
||||
- Direct guests through the entrance without blocking the sidewalk.
|
||||
- Refuse entry when a guest has an invalid ID, no valid admission, or a prohibited item.
|
||||
Typical events:
|
||||
|
||||
#### Guest Outcomes
|
||||
- a busy weekend show creates a long line;
|
||||
- a performer arrives through the guest entrance;
|
||||
- a guest has a reservation but no ID;
|
||||
- a fake or borrowed ID appears;
|
||||
- a wand alert comes from keys or a belt;
|
||||
- a guest refuses screening but insists on entering;
|
||||
- someone tries to follow an authorized person through the door;
|
||||
- a late audience member arrives during the performance.
|
||||
|
||||
A guest may have:
|
||||
|
||||
- A valid ID and ticket
|
||||
- A valid ID but no ticket or reservation
|
||||
- An expired, damaged, or questionable ID
|
||||
- An ID that does not match the guest
|
||||
- A prohibited item detected by the wand
|
||||
- A harmless item that causes a false alarm
|
||||
- No ID when identification is required
|
||||
|
||||
The player must make decisions based on the venue’s rules and observable evidence, not on a guest’s appearance or attitude. A calm guest with a valid ID should be admitted efficiently, while an aggressive guest with valid credentials may still require assistance if they threaten staff or other patrons.
|
||||
|
||||
#### Joke Shop Escalation
|
||||
|
||||
1. **Nonverbal direction:** Raise a hand, point to the ID-check area, or gesture for the guest to wait.
|
||||
2. **Routine explanation:** Explain the ID, ticket, or wand-check requirement.
|
||||
3. **Repeat request:** Clearly state what is missing or what must happen before entry.
|
||||
4. **Refusal of entry:** Keep the guest outside and direct them away from the entrance.
|
||||
5. **Manager or security assistance:** Call for a supervisor or another staff member when a guest argues, refuses screening, or blocks the line.
|
||||
6. **Emergency response:** Call emergency services only for an immediate threat, such as a weapon, assault, or serious attempt to force entry.
|
||||
|
||||
The handheld wand should not automatically identify an item as a weapon. The player must interpret the alert, ask the guest to identify the item, and follow venue procedure. The goal is to create a believable screening challenge while keeping the emphasis on communication and proportionate responses.
|
||||
|
||||
#### Scenario Events
|
||||
|
||||
- A busy weekend comedy show creates a long line.
|
||||
- A performer arrives through the guest entrance and must be recognized or verified.
|
||||
- A guest forgets their ID but appears on the reservation list.
|
||||
- A fake or borrowed ID is presented.
|
||||
- A wand alert comes from keys, a belt buckle, or a phone.
|
||||
- A guest refuses the screening but insists on entering.
|
||||
- A disruptive guest attempts to follow another person through the door.
|
||||
- A late-arriving audience member tries to enter during a performance.
|
||||
Joke Shop escalation follows the common ladder: direction, explanation, repeat request, refusal, manager/security assistance, emergency only for immediate danger.
|
||||
|
||||
### Hollywood Boulevard Late Night TV Studio
|
||||
|
||||
This scenario takes place outside a late-night television studio on Hollywood Boulevard. The guard manages the front steps, studio entrance, guest arrivals, deliveries, audience members, and the public crowd gathered around the building.
|
||||
A busy studio entrance with audience members, production staff, performers, guests, deliveries, celebrity arrivals, tourists, influencers, and the same range of street behavior as the building scenario.
|
||||
|
||||
The studio encounters all of the NPC types described in the game plan:
|
||||
Staff and guests are recognized or present a wristband, credential, ticket, guest-list confirmation, or other approved marker. The player keeps the steps clear, protects arrivals and equipment, manages filming boundaries, watches for tailgating, and calls for help only when there is immediate danger.
|
||||
|
||||
- **Tourists** stopping to take photos or watch arrivals
|
||||
- **Street performers** occupying the steps or performing near the entrance
|
||||
- **Influencers and filmmakers** recording the guard, guests, or celebrity arrivals
|
||||
- **Confused visitors** looking for the wrong entrance or trying to attend a show without understanding the access rules
|
||||
- **Intoxicated pedestrians** approaching the entrance or disrupting the crowd
|
||||
- **Trespassers** testing the doors, trying to follow authorized guests, or returning after being directed away
|
||||
- **Violent threats**, which are rare but require careful recognition and emergency escalation
|
||||
Typical events:
|
||||
|
||||
The studio also has authorized guests and staff. They must either be recognized by the guard or present a valid wristband, credential, guest-list confirmation, or other approved access marker. The player must check these credentials without holding up the audience line or allowing unauthorized people to enter.
|
||||
- a crowd gathers for a celebrity arrival;
|
||||
- tourists block the entrance for photographs;
|
||||
- a performer sets up in the audience queue;
|
||||
- an influencer ignores the filming boundary;
|
||||
- a confused visitor believes the studio is open;
|
||||
- an intoxicated pedestrian approaches the stage door;
|
||||
- a trespasser blends into an audience group;
|
||||
- an authorized guest arrives without a wristband;
|
||||
- someone presents a counterfeit credential;
|
||||
- a violent threat appears during a crowded arrival.
|
||||
|
||||
#### Studio Responsibilities
|
||||
## Presentation and Controls
|
||||
|
||||
- Keep the front steps and entrance clear.
|
||||
- Direct tourists and performers away from restricted areas.
|
||||
- Check wristbands, credentials, tickets, or guest-list status.
|
||||
- Admit authorized staff, performers, guests, and audience members.
|
||||
- Manage influencers and filmmakers without unnecessarily obstructing lawful filming.
|
||||
- Protect celebrity arrivals and production equipment from crowding.
|
||||
- Coordinate with studio staff, production assistants, and additional security guards.
|
||||
- Watch for attempts to follow authorized people through the entrance.
|
||||
- Call for emergency assistance only when there is an immediate threat.
|
||||
The game is first-person: WASD and mouse look, a focus cone on nearby people, a billboarded focus circle, `Tab`/mouse-wheel cycling for aim-free selection, and a radial action menu opened with left click or `Space`. `Shift` is precision walk. Gamepad input is supported, and keys/buttons can be remapped in Settings.
|
||||
|
||||
#### Studio Scenario Events
|
||||
The action wheel prioritizes de-escalation: Stop, Look, Point, No, Ask, Inspect, Wand, Warn, Block, Reason, Recognize, Radio. Emergency stays on `R` and is not a wheel slice. `W` is walk, never the wand; `C` is the optional wand shortcut.
|
||||
|
||||
- A crowd gathers to watch a celebrity arrive.
|
||||
- Tourists stop on the steps and block the entrance for photographs.
|
||||
- A street performer sets up in front of the audience queue.
|
||||
- An influencer repeatedly ignores the restricted filming boundary.
|
||||
- A confused visitor believes the studio is open to the public.
|
||||
- An intoxicated pedestrian wanders toward the stage door.
|
||||
- A trespasser tries to blend into an audience group.
|
||||
- An authorized guest arrives without their wristband and must be verified another way.
|
||||
- Someone presents a counterfeit wristband or credential.
|
||||
- A violent threat appears during a crowded arrival, requiring the player to protect the entrance while calling for assistance.
|
||||
The visual direction is readable stylized realism:
|
||||
|
||||
---
|
||||
- **Blender library:** 8 skinned NPC variants, 18 gear pieces, and 20 street/venue props, with baked albedo/normal/AO/ORM maps, a manifest, and procedural fallbacks. `Rig/Head` stays the focus anchor.
|
||||
- **Realism pass:** AI-assisted per-phase skyline panoramas, v2 surface tiles with normal maps, wet asphalt at night, a warm day haze, phase-specific sun/exposure/fog, a visible flashlight beam, and denser foliage.
|
||||
- **References and QA:** runtime UI art lives in `assets/images/ui/`; reference/art-direction sets live in `docs/screens/designs/` and `docs/screens/concepts/`; captures live in `docs/screenshots/`; realism runs live in `docs/screens/realism/`. `screen_designs.py compare/judge` and `tools/check_screenshots.sh` guard drift.
|
||||
- **Storage convention:** see [ADR-0014](docs/adr/0014-runtime-image-root.md). Never overwrite an existing image; new outputs get a new path or `-vN` suffix.
|
||||
|
||||
## Visual Quality Direction
|
||||
Remaining visual work is tracked in `TODO.md` (NPC fidelity and the two venue stages), not in this plan.
|
||||
|
||||
The game prioritizes readable, well-lit, low-poly presentation over realism (GL Compatibility
|
||||
renderer). The v0.6.0 visual pass moves presentation to a **Blender-authored asset library**:
|
||||
skinned NPC character variants, head/back/chest/hand gear, and street/venue props, all carrying
|
||||
baked albedo/normal/AO/ORM maps. A generator (`tools/blender_assets.py`) and manifest
|
||||
(`assets/models/blender/manifest.json`) keep the assets reproducible; the game selects variants
|
||||
by NPC role/outfit and keeps the procedural rig and primitive props as offline fallbacks. The
|
||||
existing AI tools remain the source of art direction for fabric textures, palettes, and the
|
||||
screen-design compare/judge gate.
|
||||
|
||||
The library targets 8 character variants (casual, jacket, coat, vest, dress, hoodie, firefighter,
|
||||
guard), 18 gear pieces, and 20 props — including replacements for the current generated street
|
||||
furniture, lamps, trees, doors, marquee, and a venue car. Integration must preserve the
|
||||
`Rig/Head` focus anchor, seed-driven outfit determinism, collider/navigation footprints, and the
|
||||
frame budget measured by `smoke_npc_budget.gd`. See
|
||||
[`docs/plan-graphics-v0.6.md`](docs/plan-graphics-v0.6.md) and
|
||||
[ADR-0013](docs/adr/0013-blender-authored-npc-characters.md).
|
||||
|
||||
### Realism pass
|
||||
|
||||
The target look is the realistic 3D-game frames in `docs/screens/designs/` and the larger
|
||||
example set in `docs/screens/concepts/`: hazy, layered city depth, believable materials, and
|
||||
warm practical lights at night. Readability still comes first. Silhouettes, the focus ring and
|
||||
the HUD must stay clear, and the GL Compatibility renderer stays.
|
||||
|
||||
- **Backgrounds.** The flat, black-box skyline strip is retired in favour of AI-generated
|
||||
panoramic skylines (Hollywood mid-rises, palms, hills) for day, dusk and night. Each one is a
|
||||
transparent-sky 4:1 strip that tiles horizontally on the existing backdrop ring, and the night
|
||||
variant has lit windows.
|
||||
- **Textures.** Higher-detail seamless 1024² tiles with derived normal maps for brick, granite,
|
||||
sidewalk pavers, asphalt (dry and wet), steps, awning canvas and stucco, at the current UV
|
||||
scales.
|
||||
- **Process.** `tools/scene_concepts.py` generates (never overwriting existing images),
|
||||
processes, audits and judges. `src/test/capture_realism.gd` captures the same camera shots
|
||||
with the current and the candidate assets, swapped at runtime, so a candidate is compared
|
||||
before any game code changes. Candidates are adopted only when the realism report (Pillow
|
||||
detail metrics + vision-model realism scores) improves and `screen_designs.py judge` shows no
|
||||
new `diff`.
|
||||
- **Storage.** Raw AI output: `assets/textures/ai/v2/raw/` (local, gitignored). Game-ready
|
||||
candidates: `assets/textures/ai/game_ready/v2/`. Scene references: `docs/screens/concepts/`.
|
||||
Trial captures and reports: `docs/screens/realism/<run>/`.
|
||||
- **First result (2026-11-01).** Swapping in the v2 skyline and tiles raised the judge's mean
|
||||
backdrop score from 2.6 to 4.0 and texture detail from 1.2 to ~1.7. Overall realism stayed at
|
||||
~2/10; the limits were lighting and exposure, flat facades and blob foliage, not textures.
|
||||
- **Adopted (2026-11-01).** The v2 picks are now the runtime skyline and surface set, the phase
|
||||
lighting was retuned (exposure, darker dusk/late, practical lights, wet asphalt at night), the
|
||||
backdrop is a fog-free 90 m panorama ring per phase, the facade gained plinth/string
|
||||
courses/cornice/pilasters/glazing bars, and the library trees and shrubs are denser. Judge
|
||||
scores on the like-for-like shots rose on every sub-score (overall 0.8 → 1.0, backdrop
|
||||
0.6 → 1.6) with the metric gap down 0.444 → 0.348
|
||||
(`docs/screens/realism/2026-11-01-adopt/`). The remaining gap to the concepts is the low-poly
|
||||
character and prop fidelity, a visible flashlight beam at night, and the entrance still being
|
||||
~20 % brighter than the concept (`TODO.md` → Realism follow-ups).
|
||||
|
||||
The scenario should test the player’s ability to distinguish ordinary Hollywood Boulevard activity from a genuine security problem. The best solution is usually a simple gesture, clear direction, or credential check rather than immediate escalation.
|
||||
|
||||
Future venues can reuse this structure while changing the rules, equipment, staff roles, and types of access decisions.
|
||||
Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [ADR-0008](docs/adr/0008-cone-focus-and-head-ring.md), [ADR-0009](docs/adr/0009-radial-action-menu.md), [ADR-0010](docs/adr/0010-procedural-npc-presentation.md), [ADR-0011](docs/adr/0011-aim-free-selection-and-precision-walk.md), [ADR-0012](docs/adr/0012-surface-materials-and-generated-props.md), [ADR-0013](docs/adr/0013-blender-authored-npc-characters.md).
|
||||
|
||||
## Tech Stack
|
||||
|
||||
### Engine: Godot 4
|
||||
- **Engine:** Godot 4.3, GL Compatibility renderer (Web parity).
|
||||
- **Language:** GDScript.
|
||||
- **Architecture:** venue-driven simulation; shared systems plus `Resource`-based scenario data.
|
||||
- **Navigation:** `NavigationRegion3D` / `NavigationAgent3D`.
|
||||
- **NPC behavior:** lightweight custom finite state machines driven by `NpcProfile` resources.
|
||||
- **UI/audio:** Godot `Control` nodes, themes, procedural audio, and JSON-backed localized strings.
|
||||
- **Persistence:** JSON in `user://` for settings and shift history.
|
||||
- **Testing:** custom headless runner (`src/test/test_runner.gd`); GUT was evaluated and not adopted. Python tooling tests cover the asset/screenshot pipelines.
|
||||
- **Source control/CI:** git on Gitea; `.gitea/workflows/build.yml` runs headless checks and builds/publishes releases on tags.
|
||||
- **Targets:** Windows, Linux, macOS, and Web. Release artifacts include portables, an NSIS installer, an AppImage, and a Web zip.
|
||||
|
||||
The game is built with the Godot Engine 4.x editor. Godot was chosen for its free and open-source license, built-in 3D rendering, navigation, animation, audio, and UI systems, and its low weight for fast prototyping and iteration.
|
||||
## Versioning and Delivery
|
||||
|
||||
### Language: GDScript
|
||||
|
||||
Gameplay logic is written in GDScript. It is tightly integrated with the engine, fast to iterate on, and avoids an external build toolchain for the prototype phase.
|
||||
|
||||
### Architecture Mapping
|
||||
|
||||
The venue-driven architecture maps onto Godot as follows:
|
||||
|
||||
- **Nodes and scenes:** Each major system (`ShiftCoordinator`, `NPCController`, `InteractionSystem`, `AccessVerifier`, `EscalationManager`, `RadioSystem`, `IncidentRecorder`, `ReputationEvaluator`, `CrowdSystem`, `ShiftReview`) is a Godot node or scene.
|
||||
- **Scenarios as resources:** `VenueScenario` and content such as `NpcProfile`, `Dialogue`, `EventPool`, and `AccessPolicy` are defined as custom Godot `Resource` types so venue content is data-driven and inspectable in the editor.
|
||||
- **Navigation:** `NavigationRegion3D` and `NavigationAgent3D` drive NPC and player movement.
|
||||
- **NPC behavior:** Lightweight custom finite state machines built on the `NPCController` node, with behavior traits coming from `NpcProfile` resources.
|
||||
- **UI:** Godot `Control` nodes and themes for prompts, access inspection, radio reports, dialogue, timers, and the shift review screen.
|
||||
- **Audio:** Godot audio buses and `AudioStreamPlayer` nodes for voices, crowd noise, radio, and environment sound.
|
||||
|
||||
### Content and Data
|
||||
|
||||
- Scenario and entity configuration uses typed Godot `Resource` files (`.tres`), created either in the editor or via scripts.
|
||||
- Localized dialogue and text are stored in JSON files when they need to be editable outside the editor.
|
||||
- Save data and shift results use JSON in Godot's `user://` directory.
|
||||
|
||||
### Testing
|
||||
|
||||
- Unit and scenario tests use a lightweight custom headless runner
|
||||
(`src/test/test_runner.gd`). GUT was evaluated but requires the editor plugin.
|
||||
- Tests run in headless mode so rules, access verification, escalation, and scoring can be verified without rendering or user input.
|
||||
|
||||
## Version Control and CI
|
||||
|
||||
- Source is tracked with git.
|
||||
- Gitea Actions (`.gitea/workflows/build.yml`) runs headless Godot tests on push/PR and exports
|
||||
Linux/Windows/macOS desktop builds plus the NSIS installer and AppImage on tags.
|
||||
|
||||
## Planned Commands
|
||||
|
||||
The following commands apply once the Godot project is scaffolded:
|
||||
|
||||
- Open the editor: `godot --editor --path .`
|
||||
- Run the game: `godot --path .`
|
||||
- Run tests headlessly: `godot --headless --path . res://src/test/test_runner.tscn`
|
||||
|
||||
## Export Targets
|
||||
|
||||
Desktop is the first target: Windows, Linux, and macOS. A Web export now ships as well
|
||||
(non-threaded, static hosting); it is published with each release as a zip.
|
||||
|
||||
## Player Control, Focus, and Action Menu (next pass)
|
||||
|
||||
The prototype already walks and looks in first person, but the control scheme fights itself and targeting is a hairline. This pass replaces that with three things that belong together: solid locomotion, a visible focus on a person, and a round action menu for what to do with them.
|
||||
|
||||
Decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md) locomotion and input layers, [ADR-0008](docs/adr/0008-cone-focus-and-head-ring.md) cone focus and focus circle, [ADR-0009](docs/adr/0009-radial-action-menu.md) radial action menu, [ADR-0010](docs/adr/0010-procedural-npc-presentation.md) procedural NPC presentation.
|
||||
|
||||
### What is wrong today
|
||||
|
||||
- `W` is walk-forward in the input map and wand-screening in `GameManager._handle_key`. Walking at someone with a wand venue fires the wand.
|
||||
- `A` / `D` are strafe and also allow/deny during inspection.
|
||||
- `Q` is polite direction and is also bound as `cancel`.
|
||||
- Focus is an 8 m physics ray from the camera. Missing a capsule by a few pixels clears the target. There is no mark in the world that you have someone.
|
||||
- NPC bodies are colored capsules with props. They read as markers, not people.
|
||||
- Actions live on number keys `1`–`6` plus `Q` / `E` / `W` / `R`. That is a cheat-sheet, not a verb you pick while looking at a person.
|
||||
- `Esc` only toggles mouse capture. There is no "I changed my mind" for an action in progress.
|
||||
|
||||
### Movement and look
|
||||
|
||||
Keep first-person WASD + mouse look. Fix the feel and stop stealing those keys.
|
||||
|
||||
- Body yaw from mouse X, head pitch from mouse Y, pitch clamped (already `-80` to `80`).
|
||||
- Move relative to body yaw only (already). Add short acceleration / deceleration so starts and stops are not instant.
|
||||
- Gravity only when `not is_on_floor()`; `floor_snap_length` so the steps work.
|
||||
- Mouse look runs only while `MOUSE_MODE_CAPTURED` and no modal UI is open (radial, inspection, wand, radio, shift review).
|
||||
- Walk speed stays around 3.2 m/s. No sprint, no crouch in this pass.
|
||||
- While the radial is open: freeze look and WASD so `A` / `D` can cycle the menu. Recapture the mouse when the menu closes.
|
||||
- `Esc` with a modal open closes that modal and does nothing else. `Esc` with nothing open keeps the current capture/release toggle.
|
||||
|
||||
Equipment stays on its own keys because it is not about a person: `G` flashlight, `L` door lock, `Tab` cycle nearby people, `V` venue (debug), `F` debug overlay. `R` stays the dedicated emergency radio (hold-to-confirm on the existing panel). Those do not go on the wheel.
|
||||
|
||||
Wand leaves `W`. It is a slice on the wheel (greyed when the venue has no wand) and an optional extra key that is not WASD, suggested `C`.
|
||||
|
||||
### Focus area
|
||||
|
||||
Replace the hairline ray as the primary picker.
|
||||
|
||||
- A **focus cone** in front of the camera: people within about 10 m whose head projects inside a screen-space circle around the crosshair (about 90 px / 10 degrees).
|
||||
- If several heads sit in the circle, pick the one closest to the center, then the nearer one if tied.
|
||||
- The person must be in front (dot with camera forward > 0) and not fully occluded by the building. A short ray to the head is enough for occlusion.
|
||||
- `Tab` still cycles people inside 12 m as the aim-free path. Cycling sets the same focused person the cone would.
|
||||
- Clearing: look away until the head leaves the circle for a few frames (small grace so a bob does not drop them), or they walk out of range.
|
||||
|
||||
### Focus circle
|
||||
|
||||
When a person is in focus, draw a blue, semi-transparent circle in front of their face.
|
||||
|
||||
- Attach to the avatar `Head` node, just in front of the face, billboarded to the camera so it stays a circle on screen.
|
||||
- Slow spin is fine; no ping-pong scale spam.
|
||||
- Idle focus: blue, semi-transparent, modest size. Radial open on that person: brighter, slightly larger.
|
||||
- Optional small name under the circle (`display_name` only, not the archetype cheat `Violent Threat` in the world). The existing HUD target line can keep the archetype for the prototype.
|
||||
- One circle at a time. Everyone else has none.
|
||||
|
||||
Implementation sketch: a thin unshaded `MeshInstance3D` circle (flat disc) in front of the face on the avatar, toggled from `GuardController` / `GameManager` when focus changes. Screen-space fallback (unproject head, draw a `Control` circle) is acceptable if the 3D circle z-fights on hats.
|
||||
|
||||
### Round action HUD
|
||||
|
||||
A doughnut / pie menu centered on the screen, opened on the focused person.
|
||||
|
||||
**Open**
|
||||
|
||||
- Left mouse button, or `Space`, while someone is in focus and no other modal is open.
|
||||
- If nobody is in focus, log the existing "aim first" line and do not open.
|
||||
- The click that opens the menu must not also pick a slice.
|
||||
|
||||
**While open**
|
||||
|
||||
- Mouse becomes visible. Look and walk freeze.
|
||||
- Center of the doughnut shows the focused person's `display_name`.
|
||||
- Slices, clockwise from the top, de-escalation first:
|
||||
1. Raise hand (stop / wait)
|
||||
2. Point away
|
||||
3. Head shake
|
||||
4. Polite direction (old `Q`)
|
||||
5. Inspect access (old `E`)
|
||||
6. Wand (grey if the venue has no wand)
|
||||
7. Formal warning
|
||||
8. Block
|
||||
9. Radio assist
|
||||
- Emergency is **not** on the wheel (`R` only).
|
||||
- Highlight follows the mouse angle when the cursor is over the ring. `Left` / `Right` or `A` / `D` step the highlight. Wrap around.
|
||||
|
||||
**Confirm**
|
||||
|
||||
- Click a slice: that action runs, menu closes, mouse recaptured.
|
||||
- `Space` while a slice is highlighted: same.
|
||||
- Inspect or wand: close the wheel, then open the existing inspect / wand panel. Allow / deny on that panel stay `A` / `D` (walk is frozen only while the wheel is up; once the inspect panel is open, WASD can move again, so allow/deny on `A` / `D` remains a press handler and must ignore repeats / echo, which it already does). Safer: keep walk frozen for inspect/wand too, until the panel closes. Prefer freeze until the whole interaction ends.
|
||||
- Radio assist: close the wheel, open the existing radio panel.
|
||||
|
||||
**Cancel**
|
||||
|
||||
- `Esc` or right mouse button: hide the menu, no action, no recorder event, recapture mouse.
|
||||
- Focus and the focus circle stay as they were.
|
||||
|
||||
Number keys `1`–`6` may remain as shortcuts that skip the wheel so a smoke-test script still works. They must not fire while the wheel is open (the wheel owns `A` / `D` / `Space`). Document both in the README.
|
||||
|
||||
### NPC display
|
||||
|
||||
Stay on the procedural capsule rig (no Mixamo / GLB dependency this pass). Make them read as people at conversation distance.
|
||||
|
||||
- Neck between torso and head; shoes; simple hair cap (color from seed); two dark eye spheres on the face so a head has a front.
|
||||
- Keep archetype props (camera, box, hat, sign, bag). Keep height / brightness variation from the visual seed.
|
||||
- Collision capsule matches the scaled height so the focus ray / cone hits the body you see.
|
||||
- `Head` stays a named node other systems can find (`get_node("Rig/Head")`) for the ring and the cone.
|
||||
- Walk bob and the "look at the guard when noticed" cue stay.
|
||||
- Do not put the internal type name (`Trespasser`, `Violent Threat`) on the body. The player should judge from clothes, props, and behavior. The debug overlay (`F`) can still print the type.
|
||||
|
||||
AI textures in `assets/textures/ai/` stay out of this pass unless a specific map (shirt, hair) is already the right size.
|
||||
|
||||
### Input map (target)
|
||||
|
||||
| Action | Bind |
|
||||
| --- | --- |
|
||||
| Walk | WASD / arrows (arrows **do not** walk while the wheel is open; they step the highlight) |
|
||||
| Look | Mouse, captured |
|
||||
| Open / confirm action menu | LMB, `Space` |
|
||||
| Cancel menu | RMB, `Esc` |
|
||||
| Step highlight | `A` / `D`, left / right arrows |
|
||||
| Emergency radio | `R` |
|
||||
| Flashlight | `G` |
|
||||
| Door lock | `L` |
|
||||
| Cycle nearby people | `Tab` |
|
||||
| Wand shortcut | `C` (not `W`) |
|
||||
| Inspect shortcut | `E` still allowed when the wheel is closed |
|
||||
|
||||
### Files this pass is expected to touch
|
||||
|
||||
- `src/game/guard_controller.gd` — cone focus, no look while modal, accel, floor snap.
|
||||
- `src/game/npc_avatar.gd` — face / hair / neck, head marker, ring toggle.
|
||||
- `src/game/ui/action_radial.gd` — new Control, `_draw` doughnut, slice pick.
|
||||
- `src/game/ui/hud.gd` — host the radial; stop teaching number-key verbs as the only path.
|
||||
- `src/game/game_manager.gd` — input routing, freeze flags, open/confirm/cancel.
|
||||
- `project.godot` — input map.
|
||||
- `src/core/strings.gd` — controls line, aim-first, no new tone-of-voice.
|
||||
- `src/test/tests/test_focus_and_radial.gd` — cone pick, wrap, cancel emits nothing, `W` is not wand.
|
||||
- README controls table and smoke checklist.
|
||||
|
||||
## Rendering, Models, and Selection (v0.3.0 pass)
|
||||
|
||||
Decisions: [ADR-0011](docs/adr/0011-aim-free-selection-and-precision-walk.md) aim-free selection and precision walk, [ADR-0012](docs/adr/0012-surface-materials-and-generated-props.md) surface materials and generated props.
|
||||
|
||||
The blockout look and the aim-first selection model were the two biggest gaps left by the control pass. This pass closes them without changing the game's rules.
|
||||
|
||||
**Look.** Surfaces get real profiles instead of stock materials: brick is rough and finely tiled, concrete is rougher still, asphalt is smoother and damp-looking, glass is smooth and slightly metallic. The environment gains ACES tonemapping, soft glow, aerial fog and a mild grade, all driven by the same per-phase configuration that already moves the sun and sky. The facade gains framed windows that light up after dark, a stone base course, door trim and handles. Street furniture becomes real geometry: bollards, benches, bins, planters, newspaper boxes and a hydrant, built as `.glb` props by `tools/model_pipeline.py` with a procedural fallback. NPCs get per-role clothing palettes, small role accessories (cap, hood, backpack, sunglasses, lanyard), hands, shoes, and an arm/leg walk swing. The rule stays: the player judges people from clothes, props and behaviour, never from an archetype label.
|
||||
|
||||
**Models.** Prop meshes are deterministic primitives, so the build works offline. An image model can supply the per-prop colour palette from a concept sheet; that is the only AI influence on geometry, and it is optional. Colours are converted from sRGB to linear before they reach glTF, because glTF factors are linear.
|
||||
|
||||
**Selection.** The focus cone ranks heads by angle from the crosshair then distance. `Tab` and the mouse wheel cycle nearby people nearest-first and pin the choice, so aim-free play works. Right click clears focus and briefly suppresses re-acquisition. Holding `Shift` walks at half speed for close work at the door. Escape keeps its single meaning (close the top panel, otherwise pause).
|
||||
`config/version` in `project.godot` is the single version source (currently `0.6.0`). Releases are tagged `v<version>`; the CI pipeline builds and publishes the six artifacts. Version bumps follow [Semantic Versioning](https://semver.org/). See [`docs/RELEASING.md`](docs/RELEASING.md) and [`README.md`](README.md) for commands.
|
||||
|
||||
## Design Direction
|
||||
|
||||
The game should feel like a tense workplace simulation with occasional crisis moments. The most satisfying outcome is not overpowering an NPC; it is recognizing the situation early and resolving it calmly.
|
||||
|
||||
A useful guiding rule:
|
||||
|
||||
> **The player wins by choosing the lowest level of escalation that keeps everyone safe.**
|
||||
|
||||
## Future Ideas
|
||||
|
||||
- Bob Dobbs cameo (very rare, Easter egg-style appearance), place a hidden note in `MEMORY.md`.
|
||||
- specific crazy behaviour patterns for NPCs, such as slapping their own face, using their hands as scissors, taking their shirt off, or interacting with props in unexpected ways
|
||||
- A rare Bob Dobbs cameo (Easter-egg appearance; placement note in `MEMORY.md`).
|
||||
- Specific unusual NPC behaviors, such as slapping their own face, using hands as scissors, or interacting with props unexpectedly.
|
||||
- Live 3D body-camera replay; additional venues or seasonal events; real voice/dialogue audio; an image-to-mesh prop pipeline.
|
||||
Reference in new issue
Block a user