zwitschi 0b5cd772a5
Full build / Import + headless tests (push) Successful in 33s
Full build / Full desktop build + optional release (push) Skipped
Mitigate CI cache timeouts and wire venue door-staff dialogue
- Drop actions/cache@v4 from the checks job: the Gitea runner cannot reach
  GitHub's cache service (/twirp/...CacheService timeouts, ~2min retries);
  Godot import is fast enough without it. Add GODOT_SILENCE_ROOT_WARNING=1.
- Document the cache situation and re-enable path in docs/RELEASING.md
- VenueScenario.door_staff_line(context, rng): seeded-random venue lines
- GameManager logs id/ticket/wand-check, refusal, and prohibited-item lines
  from the venue scenario (Joke Shop flavor) during inspection/screening
- Test coverage: all Joke Shop contexts, unknown contexts, empty venues,
  deterministic seeded picks (54 tests pass)
2026-10-31 13:13:25 +01:00

Step Line

Step Line is a workplace security simulation about observation, communication, access verification, and proportionate escalation. The player works security at public-facing venues around Hollywood Boulevard, managing stairs, entrances, crowds, guests, staff, and occasional serious threats.

The central design goal is simple:

The player wins by choosing the lowest level of escalation that keeps everyone safe.

Screenshots

Venue overview: the Hollywood Boulevard entrance with steps, sidewalk, and restricted door Targeting an approaching NPC with the interaction HUD
Access inspection: wristband/credential check with allow/deny prompt Radio report form: emergency dispatch panel

Screenshots are generated by src/test/capture_screenshots.gd from the current build.

⬇️ Downloads

Platform Package
Windows step-line-windows.exe · 64-bit, no install needed
Linux step-line-linux.x86_64 · 64-bit, chmod +x and run
macOS step-line-macos.zip · unsigned build, quarantine note below

All releases: https://git.allucanget.biz/zwitschi/security-game/releases

Releases are built automatically by Gitea Actions when a vX.Y.Z tag is pushed (see docs/RELEASING.md). Manual builds are produced with ./tools/build_releases.sh.

macOS builds are unsigned: right-click → Open, or clear the quarantine with xattr -dr com.apple.quarantine step-line-macos.zip. Build instructions and the release pipeline live in docs/RELEASING.md.

If you are here to develop or test locally instead of downloading, jump to Run and Test below.

The project is under active development. The design and architecture are documented, and a playable prototype vertical slice exists (Godot 4.3 + GDScript): a procedural Hollywood Boulevard entrance, a first-person guard, simulated NPCs with intents and reactions, the six-level escalation model, access inspection and admission decisions, radio calls with credibility checks, reputation, crowd mood, and an end-of-shift review.

Game Overview

A typical shift lasts 10–15 minutes. The player:

  1. Watches the entrance, steps, queue, and surrounding sidewalk.
  2. Determines why each person is approaching.
  3. Uses simple gestures or polite directions first.
  4. Verifies authorized access using recognition, wristbands, credentials, tickets, or guest lists.
  5. Escalates only when a person refuses directions, attempts unauthorized entry, or presents a genuine threat.
  6. Records the incident through body-camera and radio systems.
  7. Finishes the shift with a performance review based on safety, judgment, and professionalism.

The game rewards calm resolutions rather than aggressive behavior. Emergency assistance and armed responders are rare last-resort systems with meaningful consequences.

Planned Venues

Hollywood Boulevard Building

The original scenario places the guard at the top of the steps outside a fictional building. Tourists, street performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people experiencing a mental-health crisis, and rare violent threats may approach the entrance.

Authorized people must either be recognized by the guard or present a valid wristband. Wristbands can have different colors, patterns, dates, or event markings. They may be valid, expired, counterfeit, or missing.

The Joke Shop

The Joke Shop is a comedy-club scenario. The door person checks IDs, tickets, reservations, and guest-list status, then uses a handheld security wand according to venue policy. The player must interpret wand alerts rather than treating every alert as proof of a weapon; keys, belts, phones, and other harmless objects can trigger false alarms.

Hollywood Boulevard Late Night TV Studio

This scenario combines the previously defined NPC types with a busy television-studio entrance. The player manages audience members, production staff, performers, guests, deliveries, celebrity arrivals, tourists, street performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people experiencing a mental-health crisis, and rare violent threats.

The studio uses wristbands, credentials, tickets, guest-list confirmation, and personal recognition to authorize entry. Crowd control, filming boundaries, following authorized guests through the door, and counterfeit credentials are key events.

Escalation Model

The common escalation model has six levels:

  1. Observation — Decide whether intervention is necessary.
  2. Simple deterrence and polite direction — Raise an open hand, make eye contact, point toward the sidewalk or check-in area, shake the head, or give a short instruction.
  3. Formal warning — Clearly explain the rule and request compliance.
  4. Blocking and physical positioning — Secure the entrance, maintain distance, preserve an escape route, and deny access without starting a fight.
  5. Radio for security assistance — Request a supervisor, second guard, building management, or other appropriate support.
  6. Emergency response — Hold the emergency-radio button and confirm only when there is an immediate threat, such as a weapon, assault, forced entry, or serious threat to occupants.

An off-duty law-enforcement officer or armed emergency responder may arrive during a valid emergency. This character is not intended to be a routine stronger attack. Their role is crisis control, evacuation, restraint, arrest, or other appropriate intervention, with force governed by the situation and meaningful consequences for unjustified calls.

Core Systems

  • NPC behavior: NPCs have different motivations, temperaments, compliance levels, and reactions to the player’s approach.
  • Access verification: Recognition, wristbands, IDs, tickets, credentials, and guest lists determine who may enter.
  • Nonverbal deterrence: Small actions such as raising a hand can resolve low-risk situations without dialogue or force.
  • Dialogue: Polite directions and warnings affect outcomes; simple gestures can resolve low-risk situations without dialogue.
  • Escalation: The player chooses the lowest effective response.
  • Radio assistance: Calls require useful information and may take time to arrive.
  • Evidence: Body-camera records support shift review and accountability.
  • Crowd reaction: Aggressive behavior, visible weapons, and emergency response can create panic or attract a crowd.
  • Reputation: Peaceful resolutions, accurate reports, low property damage, and justified calls improve performance; unnecessary confrontations and false reports reduce it.
  • Shift review: The player receives feedback on access decisions, escalation choices, public complaints, injuries, and security outcomes.

Architecture Overview

The planned solution uses a venue-driven simulation architecture. Venue configuration supplies rules, access types, NPC pools, equipment, events, and escalation policies. Shared simulation systems provide movement, perception, interactions, dialogue, access verification, escalation, radio calls, crowds, reputation, evidence, and shift review.

Venue Scenario / Rules
          |
          v
   Shift Coordinator -----> Event Scheduler
          |                         |
          v                         v
   NPC Simulation <---------- Interaction System
          |                         |
          v                         v
   Access Verification ----> Escalation / Response
          |                         |
          +-------------> Reputation / Evidence
                                      |
                                      v
                                Shift Review

The architecture maps onto Godot 4 nodes, scenes, and custom resources as described in Tech Stack. See the full arc42-style outline in docs/architecture.md and the decisions in docs/adr/.

Tech Stack

  • Engine: Godot Engine 4.x
  • Language: GDScript
  • Architecture: Venue-driven simulation using nodes, scenes, and custom Resource-based scenario data
  • Navigation: NavigationRegion3D and NavigationAgent3D
  • NPC behavior: Custom lightweight finite state machines driven by NpcProfile resources
  • UI and audio: Godot Control nodes, themes, audio buses, and AudioStreamPlayer nodes
  • Testing: GUT (Godot Unit Test) in headless mode
  • Source control: git with GitHub Actions for headless tests and later desktop exports
  • Targets: Windows, Linux, and macOS desktop first; web later

Setup

  1. Download the Godot 4.3 editor (official build) and put godot on your PATH.
  2. Open or run the project from this directory.

Run and Test

# Open in the editor
godot --editor --path .

# Run the game
godot --path .

# Headless smoke boot (120 frames then exit)
godot --headless --path . --quit-after 120

# Run all unit tests headlessly (exit code 0 = pass)
godot --headless --path . --script res://src/test/test_runner.gd

# Save a screenshot to user:// (windowed)
godot --path . --script res://src/test/take_screenshot.gd

The unit test runner is the project's own lightweight harness (no editor plugin required) so CI can run it without the editor.

Controls

Input Action
W/A/S/D + mouse Move and look
Esc Release / capture mouse
Q Polite direction (Level 1)
1 / 2 / 3 Simple gestures: raise hand, point, head shake (Level 1)
4 Formal warning (Level 2)
5 Blocking and positioning (Level 3)
6 Security assistance radio (Level 4)
R Emergency radio, hold on-screen button ~1.6s (Level 5)
E Inspect access artifacts / close inspection
W Handheld wand screening (wand venues only)
A / D Allow / deny entry during inspection or wand check
V Cycle venue: Hollywood Blvd → The Joke Shop → TV Studio (restarts shift)
Tab Cycle target among nearby NPCs (aim-free alternative)
G Toggle flashlight (widens NPC perception at night)
L Lock / unlock the restricted door (thwarts forced entry)
F Toggle debug overlay

Architecture

The full arc42-style architecture documentation lives in docs/architecture.md. It covers goals, constraints, context, solution strategy, building blocks, runtime views, deployment, cross-cutting concepts, quality requirements, risks, a glossary, the CI/CD build pipeline, semantic versioning, and release management.

Project Documentation

Development Status

Implemented so far:

  • Godot 4.3 project scaffold, input map, procedural world builder
  • Venue-driven simulation core: ShiftCoordinator, VenueScenario, EventScheduler, NPCController + FSM, AccessVerifier, EscalationManager, RadioSystem, IncidentRecorder, ReputationEvaluator, CrowdSystem
  • Three authored scenarios (Hollywood Boulevard building, The Joke Shop, Late Night TV Studio) with access policies, NPC archetypes, and event pools
  • Headless unit tests: 52 passing (access rules, escalation, radio cooldown/battery, NPC reaction determinism, door lock, flashlight perception, persistence round-trip, navmesh, scenario data, full-shift simulation, wand screening, responder dispatch, localization strings)
  • Simulation extras: protester archetype, CALL_SOMEONE reaction, door lock/secure mechanic (visual indicator), flashlight with night perception bonus, LATE shift phase reaching the violent-threat event
  • First-person prototype with interaction HUD, access inspection, wand screening, radio report form (incl. emergency hold-to-confirm), dispatched responder avatars, aim-free targeting, venue cycling between all three scenarios, color-coded escalation feedback, procedural audio cues, navigation-mesh NPC paths, JSON-backed localized strings, persisted shift history, debug overlay, and shift review

Not yet implemented: body-camera replay timeline, long (10-15 minute) shift lengths with phase-based lighting, venue selection screen, editor-based GUT integration, and RefCounted cycle cleanup (see TODO.md).

Smoke Test Checklist

  1. godot --path . starts the game without script errors.
  2. The guard moves and looks around; the building, steps, and sidewalk are visible.
  3. NPCs spawn and approach the entrance during the first minutes.
  4. Aiming at an NPC shows its archetype and intent in the HUD.
  5. Pressing Q produces a reaction log entry and reputation feedback.
  6. E opens access inspection showing artifacts and policy result; A/D record a decision.
  7. 6 opens the assistance form; submitting shows dispatch feedback.
  8. R opens the emergency form; the button must be held ~1.6s or the call cancels.
  9. G toggles the flashlight (indicator appears in the HUD); L toggles the door lock (indicator turns red when locked).
  10. F toggles the debug overlay with NPC states and shift stats.
  11. NPCs route around the building using the navigation mesh (no stuck-at-wall behavior during a smoke run).
  12. When the shift timer reaches 0, the shift review screen shows grade, incident summary, and persisted shift history.

Development Workflow

Follow AGENTS.md: inspect the repository first, record work as checkbox tasks in TODO.md, move completed sections to DONE.md, update MEMORY.md with durable context, and keep this README synchronized with setup and architecture changes.

S
Description
No description provided
Readme
755 MiB
0 Stars 1 Watchers 0 Forks
v0.9.9
Latest
2026-11-06 14:05:22 +01:00
Languages
GDScript 57.4%
Python 41.4%
Shell 1%
NSIS 0.2%