From adbd7a64b028fa59ed7c5b586271b87bc5bff791 Mon Sep 17 00:00:00 2001 From: "Z. Cliffe Schreuders" Date: Mon, 8 Dec 2025 00:20:50 +0000 Subject: [PATCH] Revise Mission 1: First Contact to enhance narrative depth and urgency - Updated the story premise to introduce "Operation Shatter," detailing the coordinated mass panic attack targeting vulnerable populations. - Expanded the room layout to include additional rooms and NPC interactions, enhancing player exploration and engagement. - Added critical LORE fragments revealing casualty projections and targeting demographics, emphasizing the stakes of the mission. - Revised dialogue and choices to reflect player actions and moral implications, ensuring a more impactful closing debrief. - Improved scenario structure and flow, aligning with best practices for narrative clarity and player agency. --- .../m01_first_contact/05_room_layout.md | 1856 +++-------------- .../m01_first_contact/06_lore_fragments.md | 358 +++- .../STORY_UPDATE_OPERATION_SHATTER.md | 383 ++++ .../overall_story_plan/season_1_arc.md | 88 +- scenarios/m01_first_contact/SOLUTION_GUIDE.md | 402 ++++ .../ink/m01_closing_debrief.ink | 541 +++-- .../ink/m01_closing_debrief.json | 2 +- .../ink/m01_derek_confrontation.ink | 393 ++-- .../ink/m01_derek_confrontation.json | 2 +- .../m01_first_contact/ink/m01_npc_kevin.ink | 322 ++- .../m01_first_contact/ink/m01_npc_kevin.json | 2 +- .../m01_first_contact/ink/m01_npc_maya.ink | 267 ++- .../m01_first_contact/ink/m01_npc_maya.json | 2 +- .../m01_first_contact/ink/m01_npc_sarah.ink | 155 +- .../m01_first_contact/ink/m01_npc_sarah.json | 2 +- .../ink/m01_opening_briefing.ink | 346 +-- .../ink/m01_opening_briefing.json | 2 +- .../ink/m01_phone_agent0x99.ink | 101 + .../ink/m01_phone_agent0x99.json | 2 +- scenarios/m01_first_contact/scenario.json.erb | 745 +++++-- scripts/scenario-schema.json | 4 +- .../00_scenario_initialization.md | 9 + .../01_narrative_structure.md | 104 + .../02_storytelling_elements.md | 105 +- .../story_dev_prompts/03_moral_choices.md | 150 +- .../story_dev_prompts/06_lore_fragments.md | 116 ++ story_design/story_dev_prompts/README.md | 74 + 27 files changed, 3870 insertions(+), 2663 deletions(-) create mode 100644 planning_notes/overall_story_plan/mission_initializations/m01_first_contact/STORY_UPDATE_OPERATION_SHATTER.md create mode 100644 scenarios/m01_first_contact/SOLUTION_GUIDE.md diff --git a/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/05_room_layout.md b/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/05_room_layout.md index 6d0027a..095e579 100644 --- a/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/05_room_layout.md +++ b/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/05_room_layout.md @@ -1,1691 +1,337 @@ -# Room Layout: Mission 1 - First Contact - -**Scenario:** First Contact -**Location:** Viral Dynamics Media Office -**Target Difficulty:** Tier 1 (Beginner) -**Design Philosophy:** Hub-and-spoke with progressive unlocking and required backtracking - ---- +# Mission 1: First Contact - Room Layout Design ## Overview -**Location:** Viral Dynamics Media - Marketing Agency Office -**Total Rooms:** 7 -**Playable Area:** Small (tutorial scenario) -**Security Level:** Low-to-Medium (startup office environment) -**Time of Day:** Evening (6:00 PM - after business hours, skeleton crew) -**Occupancy:** Minimal (3-4 NPCs remaining) +This document describes the physical layout of Viral Dynamics Media and the puzzle distribution across rooms. -**Design Philosophy:** +## Design Principles -This layout supports **progressive unlocking with required backtracking**, teaching players non-linear investigation. The office uses a **hub-and-spoke design** with the Main Office Area as the central hub, allowing easy navigation while creating natural chokepoints for progressive unlocking. - -**Spatial Strategy:** -- **Act 1 (Tutorial):** Access to Reception, Main Office, Break Room (public areas) -- **Act 2 (Investigation):** Unlock Derek's Office → Server Room → Storage Closet via found keys/credentials -- **Act 3 (Confrontation):** All areas accessible, backtracking to correlate evidence - -The layout creates a natural tutorial → investigation → confrontation flow while teaching backtracking patterns essential for future missions. +1. **Keys before lockpicks** - Player learns key mechanics before getting lockpicks +2. **PIN codes require clues** - Every PIN lock has a discoverable clue +3. **Multiple paths** - Derek's office accessible via key OR lockpick +4. **VM flags required** - Confrontation blocked until all 3 flags submitted +5. **Evidence distributed** - Clues and evidence spread across multiple rooms +6. **Lockpick-only content** - Patricia's briefcase provides bonus LORE --- -## Location Description - -**Viral Dynamics Media** occupies a renovated industrial loft space in a trendy urban district. The office exudes the aesthetic of a successful startup - exposed brick, modern furniture, motivational quotes on walls, and branded merchandise throughout. During business hours, the space bustles with creative energy, but after 6 PM, most employees have left, leaving only dedicated (or suspicious) employees working late. - -**Atmosphere:** The after-hours atmosphere creates tension between the professional facade and the clandestine ENTROPY operations. Dim evening lighting, quiet corridors, and the hum of servers create an investigative mood. The player feels like an intruder (despite their legitimate IT contractor cover), heightening the sense of discovery as they uncover evidence of Social Fabric's disinformation campaign. - -**Entry Cover:** Player arrives as "contracted IT consultant" to audit network security - a plausible cover that explains access to technical areas while allowing social engineering opportunities with remaining staff. - ---- - -## Individual Room Designs - -### Room 1: Reception Area - -**ID:** `reception_area` -**Type:** Reception/Entry -**Narrative Purpose:** Entry point, establishes cover, introduces Sarah (receptionist) -**Security Level:** Public (low) - -**Description:** -Modern reception area with clean lines and company branding. The Viral Dynamics logo ("Making Ideas Viral") dominates the wall behind an unmanned reception desk. Visitor seating with industry magazines creates a professional but casual atmosphere. After-hours lighting gives the space an empty, investigative feel. - -**Connections:** -- **North:** Main Office Area (open connection, no door) -- **East:** Break Room (open connection) - -**Containers:** - -1. **Reception Desk Drawer** - - **Lock:** None (public area) - - **Contents:** - - Building directory (note) - shows Derek Lawson in Office 3 - - Visitor log (note) - shows Derek's frequent late-night visits - - Office supplies (flavor items) - - **Narrative Purpose:** First investigative clue - Derek works late often - - **Objectives:** Supports `explore_office` tutorial task - -**Interactive Objects:** - -1. **Company Directory Board (Wall Mount)** - - **Interaction:** Read/examine - - **Content:** Employee directory showing names and office assignments - - **Purpose:** Helps player identify Derek Lawson's office location - - **Note Content:** "Derek Lawson - Senior Marketing Manager - Office 3" - -2. **Reception Computer (PC)** - - **Lock:** None (Sarah is logged in, left workstation) - - **Interaction:** Access computer - - **Contents:** - - Email from Derek requesting "enhanced privacy" for late-night work - - Meeting calendar showing Derek's suspicious schedule - - **Purpose:** Early evidence of suspicious behavior - - **Objectives:** Optional intelligence gathering - -**NPCs:** - -- **Sarah Martinez (In-Person)** - Receptionist working late - - **Position:** Behind reception desk or nearby - - **Dialogue Trigger:** Player-initiated (walk up and interact) - - **Provides:** Visitor badge, basic office access, Derek's whereabouts - - **Objectives:** Completes `meet_reception` task - - **Trust Level:** Neutral → Friendly (if professional) - - **Role:** Tutorial NPC, teaches dialogue system, provides cover legitimacy - -**Objectives Completed Here:** -- `enter_office` (automatic upon spawn) -- `meet_reception` (talk to Sarah) -- `explore_office` (after visiting multiple rooms) - -**LORE Fragments:** None (public area) - -**Technical Notes:** -- Starting room (`startRoom: "reception_area"`) -- Sarah provides visitor badge (item given via Ink `#give_item` tag) -- Reception computer unlocked to teach computer interaction without password complexity - ---- - -### Room 2: Main Office Area - -**ID:** `main_office_area` -**Type:** Open Office (cubicles and desks) -**Narrative Purpose:** Central hub, Kevin's location, lockpicking tutorial -**Security Level:** Low (visitor badge access) - -**Description:** -Open floor plan with rows of modern workstations (hot-desking style). Marketing posters and client campaign materials adorn the walls. Most desks are empty in the evening, but Kevin's workstation (IT corner) has active monitors. A locked storage closet in the northwest corner and Derek's locked office door (northeast) create visible but inaccessible objectives. - -**Connections:** -- **South:** Reception Area (open) -- **North:** Derek's Office (locked - requires lockpicking OR finding key) -- **East:** Server Room (locked - requires Kevin's keycard OR lockpick + password) -- **West:** Conference Room (open) - -**Containers:** - -1. **Kevin's Desk Drawer** - - **Lock:** None (Kevin is cooperative) - - **Contents:** - - Password hints note: "Derek's passwords: Marketing123, Campaign2024, Viral_Dynamics_Admin" - - Network diagram (shows server room layout) - - **Narrative Purpose:** Social engineering yields VM brute-force hints - - **Objectives:** `gather_password_hints` task - -2. **Storage Closet (Northwest Corner)** - - **Lock:** Physical lock (lockpicking minigame) - - **Contents:** - - Lockpick Practice Safe (tutorial item) - - Derek's Office Key (hidden in toolbox) - - IT tools (flavor items) - - **Narrative Purpose:** **Lockpicking tutorial** + first backtracking opportunity - - **Objectives:** `lockpick_tutorial` task - - **Backtracking:** Player must return here after learning about key location - -3. **Filing Cabinet (West Wall)** - - **Lock:** Physical lock (requires lockpick, medium difficulty) - - **Contents:** - - LORE Fragment 1: "Social Fabric Manifesto" - - Employee records (shows Derek hired 6 months ago) - - **Narrative Purpose:** Optional LORE, character background - - **Objectives:** Optional LORE collection - -**Interactive Objects:** - -1. **Whiteboard (South Wall)** - - **Interaction:** Examine - - **Content:** "Q2 Campaign Targets: Local News, Social Media Influencers, Grassroots Organizations" - - **Purpose:** First hint of suspicious "targeting" language - - **Encoding:** None (plaintext) - -2. **CyberChef Workstation (Near Kevin's Desk)** - - **Interaction:** Use for decoding challenges - - **Purpose:** Decode Base64 messages, analyze hex strings - - **Objectives:** Required for `decode_whiteboard` task - - **Tutorial Value:** Introduces encoding/decoding concepts - -**NPCs:** - -- **Kevin Park (In-Person)** - IT Manager / System Administrator - - **Position:** At his desk in IT corner (southeast area) - - **Dialogue Trigger:** Player-initiated - - **Provides:** - - Lockpick set (after building trust) - - Password hints (via dialogue, not direct item) - - Server room RFID keycard (after significant trust) - - **Objectives:** `meet_kevin`, `receive_lockpick`, `clone_kevin_card` - - **Trust System:** Low → Medium → High via conversation choices - - **Role:** Key ally, teaches social engineering, provides critical access items - -**Objectives Completed Here:** -- `meet_kevin` - Talk to Kevin -- `receive_lockpick` - Kevin gives lockpick set -- `lockpick_tutorial` - Pick storage closet lock -- `gather_password_hints` - Get password list from Kevin -- `clone_kevin_card` - Clone his RFID card for server room - -**LORE Fragments:** -- **Fragment 1:** "Social Fabric Manifesto" (in filing cabinet) - -**Technical Notes:** -- Central hub room - all other rooms accessible from here -- Lockpicking tutorial happens at storage closet door -- Kevin provides items via Ink `#give_item` tags after trust building -- Storage closet key found later enables backtracking - ---- - -### Room 3: Derek's Office - -**ID:** `derek_office` -**Type:** Senior Employee Office -**Narrative Purpose:** Primary evidence location, Base64 encoding challenge -**Security Level:** Medium (locked door, password-protected computer) - -**Description:** -Derek Lawson's private office reflects his senior position. Modern desk with dual monitors, marketing awards on walls, and a large whiteboard covered in encoded messages. The office is tidy but sterile - lacking personal effects that might reveal his true allegiances. The locked filing cabinet and password-protected computer suggest secrets to hide. - -**Connections:** -- **South:** Main Office Area (locked initially) - -**Unlock Conditions:** -- **Option A:** Lockpick the door (after tutorial) -- **Option B:** Use Derek's Office Key (found in storage closet toolbox) - -**Containers:** - -1. **Derek's Computer (PC)** - - **Lock:** Password (requires one of Kevin's hints: "Marketing123" or "Campaign2024") - - **Contents:** - - Email thread with "ZDS" (Zephyr Digital Strategies - ENTROPY front) - - Campaign targeting spreadsheet - - SSH credentials file (username/IP for VM challenge) - - **Narrative Purpose:** Connect Derek to ENTROPY, provide VM access - - **Objectives:** `access_derek_computer`, unlocks `submit_ssh_flag` - -2. **Filing Cabinet (East Wall)** - - **Lock:** Physical lock (lockpicking, medium difficulty) - - **Contents:** - - Client contracts (legitimate business) - - Hidden folder: "Project Narrative" with disinformation plans - - Media contacts list (targets for manipulation) - - LORE Fragment 2: "The Architect's Letter to Social Fabric" - - **Narrative Purpose:** Hard evidence of disinformation campaign - - **Objectives:** `search_filing_cabinet` - - **Backtracking:** Locked initially, player returns after getting lockpick - -3. **Desk Drawer** - - **Lock:** None - - **Contents:** - - Burner phone (flavor item, can't be accessed) - - Travel documents (suspicious frequency) - - Personal calendar with coded meetings - - **Narrative Purpose:** Environmental storytelling - Derek is secretive - -**Interactive Objects:** - -1. **Whiteboard (North Wall)** - - **Interaction:** Examine/photograph - - **Content:** `"Q2xpZW50IGxpc3QgdXBkYXRlOiBDb29yZGluYXRpbmcgd2l0aCBaRFM="` (Base64) - - **Decoded:** "Client list update: Coordinating with ZDS" - - **Purpose:** **Base64 encoding tutorial** - first encoding challenge - - **Objectives:** `decode_whiteboard` (use CyberChef in main office) - - **Educational Value:** Teaches encoding vs. encryption - -2. **Awards Display (West Wall)** - - **Interaction:** Examine - - **Content:** Industry marketing awards, all recent (6 months) - - **Purpose:** Suggests Derek's cover is well-established - - **Environmental Storytelling:** Professional success as infiltration tactic - -**NPCs:** None (Derek is not in office yet - arrives in Act 3) - -**Objectives Completed Here:** -- `access_derek_office` - Enter Derek's office -- `decode_whiteboard` - Decode Base64 message -- `access_derek_computer` - Log into his PC -- `search_filing_cabinet` - Find hard evidence - -**LORE Fragments:** -- **Fragment 2:** "The Architect's Letter to Social Fabric" (filing cabinet) - -**Technical Notes:** -- Door can be unlocked via lockpicking OR key (player choice) -- Base64 message requires CyberChef workstation in Main Office (backtracking) -- Computer password from Kevin's hints (social engineering reward) -- Filing cabinet requires lockpick (cannot bypass) - ---- - -### Room 4: Server Room - -**ID:** `server_room` -**Type:** Server Room / IT Infrastructure -**Narrative Purpose:** VM access point, flag submission, technical challenges -**Security Level:** High (RFID keycard + password OR lockpick + password) - -**Description:** -Small but well-maintained server room with two equipment racks, network switches, and cooling units. The hum of servers and blinking status lights create a technical atmosphere. A system administration workstation provides access to Viral Dynamics' network - the gateway to VM challenges. The room is professionally organized with proper cable management, reflecting Kevin's competence. - -**Connections:** -- **West:** Main Office Area (locked initially) - -**Unlock Conditions:** -- **RFID Access:** Clone Kevin's keycard (requires RFID cloner + proximity to Kevin) -- **Lockpick Access:** Pick door lock (advanced difficulty) -- **Both require:** Password obtained from Derek's computer OR social engineering - -**Containers:** - -1. **Server Rack Cabinet** - - **Lock:** None (physical access already restricted by room) - - **Contents:** - - Network cables (flavor items) - - Backup drives (flavor items) - - Server documentation - - **Narrative Purpose:** Environmental realism - -2. **IT Supply Shelf** - - **Lock:** None - - **Contents:** - - Spare keyboards/mice (flavor) - - Cable management supplies - - LORE Fragment 3: "Network Infrastructure Diagram" (shows ENTROPY backdoor) - - **Narrative Purpose:** LORE fragment placement - -**Interactive Objects:** - -1. **VM Access Terminal (System Admin Workstation)** - - **Position:** Center of room - - **Interaction:** Access to VM challenges - - **Function:** SSH into target server (IP from Derek's computer) - - **VM Challenges:** - - SSH brute force (using password hints from Kevin) - - Linux basic navigation - - Privilege escalation (sudo) - - **Objectives:** `access_vm`, VM flag tasks - - **Educational Value:** SSH, Linux basics, password security - -2. **Drop-Site Terminal (Secondary Workstation)** - - **Position:** Northeast corner - - **Interaction:** Submit VM flags - - **Function:** Flags unlock intelligence resources and narrative progression - - **Objectives:** `submit_ssh_flag`, `submit_navigation_flag`, `submit_sudo_flag` - - **Unlocks:** Intelligence reports, next aims/tasks - -3. **Network Diagram (Wall Poster)** - - **Interaction:** Examine - - **Content:** Office network topology - - **Purpose:** Shows Derek's workstation has unusual outbound connections - - **Environmental Storytelling:** Visual evidence of suspicious activity - -**NPCs:** None (server room unmanned) - -**Objectives Completed Here:** -- `access_server_room` - Enter server room -- `access_vm` - Log into VM terminal -- `submit_ssh_flag` - Submit SSH flag -- `submit_navigation_flag` - Submit Linux navigation flag -- `submit_sudo_flag` - Submit privilege escalation flag - -**LORE Fragments:** -- **Fragment 3:** "Network Infrastructure Diagram" (IT supply shelf) - -**Technical Notes:** -- **Critical security checkpoint** - multiple unlock methods teach player choice -- VM access requires password from Derek's computer (social engineering → digital) -- Drop-site terminal separate from VM access (allows flag submission while in VM) -- Flags unlock progressive narrative beats via Ink tags - ---- - -### Room 5: Conference Room - -**ID:** `conference_room` -**Type:** Meeting Room -**Narrative Purpose:** Evidence correlation, presentation materials -**Security Level:** Low (unlocked) - -**Description:** -Modern conference room with a large table seating 10, presentation screen, and whiteboards. Leftover materials from recent "campaign planning" meetings provide environmental storytelling. The room feels recently used - coffee cups not yet cleared, whiteboard partially erased, suggesting hasty departure. - -**Connections:** -- **East:** Main Office Area (open) -- **North:** Break Room (open) - -**Containers:** - -1. **Conference Table (Surface)** - - **Lock:** None - - **Contents:** - - Meeting agenda (note): "Q2 Narrative Strategies" - - Client presentation (note): Suspicious targeting language - - Leftover notebooks (flavor items) - - **Narrative Purpose:** Evidence of coordinated campaign - - **Objectives:** `search_conference_materials` - -2. **A/V Equipment Cabinet** - - **Lock:** None - - **Contents:** - - Presentation remote - - HDMI cables - - USB drive with presentation files - - **Narrative Purpose:** Additional evidence source - -**Interactive Objects:** - -1. **Whiteboard (East Wall)** - - **Interaction:** Examine - - **Content:** Partially erased strategic notes - - "Target demographics: 18-35, politically active" - - "Amplification strategy: Leverage influencers" - - "Timeline: Pre-election push" - - **Purpose:** Confirms election manipulation timing - - **Objectives:** `analyze_whiteboard_notes` - -2. **Presentation Screen (Computer Connection)** - - **Interaction:** Access if laptop left connected - - **Content:** Campaign presentation slides - - **Purpose:** Visual evidence of manipulation tactics - - **Environmental Storytelling:** Professional facade hiding propaganda - -**NPCs:** - -- **Maya Chen (In-Person, Optional Encounter)** - - **Position:** May be in conference room reviewing materials - - **Dialogue Trigger:** Player-initiated - - **Provides:** Additional context about Derek's behavior, office gossip - - **Objectives:** Optional - `interview_maya` - - **Trust Level:** Neutral → Helpful (if approached professionally) - - **Role:** Witness NPC, provides subjective perspective on Derek - -**Objectives Completed Here:** -- `search_conference_materials` - Gather meeting evidence -- `analyze_whiteboard_notes` - Document strategic plans -- `interview_maya` (optional) - Get insider perspective - -**LORE Fragments:** None - -**Technical Notes:** -- Public room (no locks) to provide early accessible evidence -- Maya's presence is optional (may not be in room during player visit) -- Whiteboard content correlates with Derek's computer files - ---- - -### Room 6: Break Room - -**ID:** `break_room` -**Type:** Kitchen / Common Area -**Narrative Purpose:** Casual NPC encounters, environmental storytelling -**Security Level:** None (public) - -**Description:** -Casual employee break room with kitchen appliances, tables, and vending machines. Company-branded mugs and motivational posters create a friendly atmosphere contrasting with the ENTROPY operations. The notice board and communal spaces offer glimpses into office culture and employee relationships. - -**Connections:** -- **West:** Reception Area (open) -- **South:** Conference Room (open) -- **North:** Main Office Area (open) - -**Containers:** - -1. **Refrigerator** - - **Lock:** None - - **Contents:** - - Personal food items with names - - Company-provided snacks - - Energy drinks (suggests late-night work culture) - - **Narrative Purpose:** Environmental storytelling - overwork culture - - **Objectives:** None (flavor only) - -2. **Notice Board** - - **Lock:** None - - **Contents:** - - Employee announcements - - Social events calendar - - Emergency contact list (shows employee names/extensions) - - **Narrative Purpose:** Social engineering resource, employee directory - - **Objectives:** Optional - `check_notice_board` (provides employee context) - -**Interactive Objects:** - -1. **Coffee Station** - - **Interaction:** Examine - - **Content:** Premium coffee setup, suggests successful company - - **Purpose:** Atmosphere building - - **Environmental Storytelling:** Startup culture amenities - -2. **Trash Bin** - - **Interaction:** Search - - **Content:** - - Discarded meeting notes with "urgent deadline" mentions - - Food delivery receipts (late-night work) - - **Purpose:** Shows overwork culture, potential evidence recovery - - **Objectives:** Optional investigation - -**NPCs:** - -- **Maya Chen (In-Person, Potential Location)** - - **Position:** Getting coffee / taking break - - **Dialogue Trigger:** Player-initiated casual conversation - - **Provides:** Office gossip, Derek's late hours, suspicious meetings - - **Objectives:** `talk_to_maya` (can occur here OR conference room) - - **Trust Level:** Friendly (casual setting encourages openness) - - **Role:** Informant NPC, provides human perspective - -**Objectives Completed Here:** -- `talk_to_maya` (if she's here instead of conference room) -- `check_notice_board` (optional environmental investigation) - -**LORE Fragments:** None - -**Technical Notes:** -- Unlocked from start to encourage exploration -- Maya may be in break room OR conference room (NPC positioning flexibility) -- Notice board provides employee names for social engineering -- Trash bin search teaches investigation thoroughness - ---- - -### Room 7: Storage Closet (Inside Main Office) - -**ID:** `storage_closet` -**Type:** Utility/Storage -**Narrative Purpose:** Lockpicking tutorial, hidden key discovery -**Security Level:** Low (practice lock) - -**Description:** -Small storage closet in Main Office Area (accessible as interactable door, not separate room). Contains IT supplies, cleaning materials, and maintenance tools. The lock is simple, making it ideal for lockpicking tutorial. A toolbox on the upper shelf hides Derek's office key. - -**Note:** This is technically part of Main Office Area but functions as a locked container/door for lockpicking tutorial purposes. - -**Containers:** - -1. **Toolbox (Upper Shelf)** - - **Lock:** None (but closet door is locked) - - **Contents:** - - Derek's Office Key (hidden) - - IT tools (cable testers, crimpers) - - Flashlight (flavor item) - - **Narrative Purpose:** Key discovery requires successful lockpicking - - **Objectives:** `find_derek_key` (enables backtracking to office) - - **Backtracking:** Player returns here after learning key exists - -2. **Supply Shelf** - - **Lock:** None - - **Contents:** - - Paper supplies - - Cleaning supplies - - Old equipment - - **Narrative Purpose:** Flavor, environmental realism - -**Interactive Objects:** - -1. **Practice Safe (Floor)** - - **Interaction:** Lockpicking practice - - **Content:** Tutorial messages, increasing difficulty pins - - **Purpose:** **Lockpicking tutorial progression** - - **Objectives:** Part of `lockpick_tutorial` task - - **Educational Value:** Teaches lockpicking minigame mechanics - -**NPCs:** None - -**Objectives Completed Here:** -- `lockpick_tutorial` - Pick closet door lock -- `find_derek_key` - Discover hidden office key - -**LORE Fragments:** None - -**Technical Notes:** -- First lockpicking challenge (easy difficulty) -- Door lock teaches basic pin tumbler mechanics -- Practice safe inside provides progressive difficulty -- Key discovery creates backtracking opportunity to Derek's office - ---- - -## Overall Map Layout +## Room Layout Map ``` - ┌─────────────────┐ - │ Derek's │ - │ Office │ - │ (LOCKED) │ - └────────┬────────┘ - │ - │ [Lockpick OR Key] - │ - ┌──────────┐ ┌────────┴─────────┐ ┌──────────────┐ - │Conference│◄───┤ Main Office ├───►│ Server Room │ - │ Room │ │ Area │ │ (LOCKED) │ - └────┬─────┘ │ [HUB] │ │ [RFID Card] │ - │ │ │ └──────────────┘ - │ │ [Storage Closet] │ - │ │ (in-room) │ - │ └────────┬─────────┘ - ┌────┴─────┐ │ - │ Break │ │ - │ Room │ │ - └────┬─────┘ │ - │ │ - │ ┌────────┴────────┐ - └─────────►│ Reception │ - │ Area │ - │ [START] │ - └─────────────────┘ - -LEGEND: -├──┤ = Open connection (no door) -(LOCKED) = Requires unlock action -[HUB] = Central navigation point -[START] = Player spawn location + NORTH + ┌───────────────┬───────────────┬───────────────┬───────────────┐ + │ SERVER ROOM │ MANAGER'S │ DEREK'S │ MAYA'S │ + │ [RFID lock] │ OFFICE │ OFFICE │ OFFICE │ + │ │ (unlocked) │ [KEY lock] │ (unlocked) │ + └───────┬───────┴───────────────┴───────┬───────┴───────────────┘ + │ │ + ════════╧═══════════════════════════════╧════════════════════════ + │ MAIN OFFICE AREA │ + │ [KEY LOCK] │ + ════════╤═══════════════════════════════╤════════════════════════ + │ │ + ┌───────┴───────┬───────────────┬───────┴───────┬───────────────┐ + │ IT ROOM │ CONFERENCE │ BREAK ROOM │ STORAGE │ + │ [PIN 2468] │ ROOM │ │ CLOSET │ + │ │ (unlocked) │ (unlocked) │ (unlocked) │ + └───────────────┴───────┬───────┴───────────────┴───────────────┘ + │ + ┌───────────────────────┴───────────────────────────────────────┐ + │ RECEPTION │ + └───────────────────────────────────────────────────────────────┘ ``` -**Room Connections Summary:** +--- -- **Reception** connects to: Main Office (north), Break Room (east) -- **Main Office** connects to: Reception (south), Derek's Office (north-locked), Server Room (east-locked), Conference Room (west), Break Room (south) -- **Derek's Office** connects to: Main Office (south-locked) -- **Server Room** connects to: Main Office (west-locked) -- **Conference Room** connects to: Main Office (east), Break Room (north) -- **Break Room** connects to: Reception (west), Conference Room (south), Main Office (north) -- **Storage Closet** is inside Main Office (interactable locked door) +## Room Details -**Design Rationale:** +### 1. RECEPTION (Start Room) +**Lock:** None +**Type:** room_reception -- **Hub-and-Spoke:** Main Office is central hub, reducing navigation complexity for beginners -- **Progressive Barriers:** Two major locked rooms (Derek's Office, Server Room) gate Act 2 content -- **Open Exploration:** Reception, Break Room, Conference Room accessible early for tutorial exploration -- **Backtracking Paths:** Storage Closet → Derek's Office (key) → Server Room (password) creates interconnected progression +**NPCs:** +- Sarah Martinez - Gives badge + Main Office Key +- Agent 0x99 (phone) - Mission handler + +**Objects:** +- Building Directory - Staff locations +- Visitor Sign-In Log - Derek's suspicious late hours + +**Purpose:** Entry point, get initial access items --- -## Objectives-to-Room Mapping +### 2. MAIN OFFICE AREA (Hub) +**Lock:** KEY (Main Office Key from Sarah) +**Type:** room_office +**Connections:** All other rooms branch from here -### Primary Objective: Investigate Social Fabric Operations +**Objects:** +- CyberChef Workstation - Decode Base64 messages +- Main Filing Cabinet [PIN 2024] - The Architect's Letter +- Sticky Note - Clue: "Election year = 2024" +- Maintenance Checklist - IT Room PIN: 2468 +- Kevin's Desk Note - Explains Kevin is in IT Room -#### Aim 1.1: Establish Presence - -**Task: Enter Office** (`enter_office`) -- **Room:** Reception Area -- **Interaction:** Automatic (spawn point) -- **Completion:** Automatic - -**Task: Meet Reception** (`meet_reception`) -- **Room:** Reception Area -- **Interaction:** Talk to Sarah (NPC) -- **Completion:** Ink tag `#complete_task:meet_reception` - -**Task: Explore Office** (`explore_office`) -- **Rooms:** Reception, Main Office, Break Room, Conference Room -- **Interaction:** Visit multiple public rooms -- **Completion:** Ink tag `#complete_task:explore_office` after 2+ rooms visited +**Purpose:** Hub for exploration, contains PIN clues --- -#### Aim 1.2: Meet IT Manager Kevin +### 3. STORAGE CLOSET +**Lock:** None (unlocked) +**Type:** room_closet -**Task: Talk to Kevin** (`meet_kevin`) -- **Room:** Main Office Area -- **Interaction:** Talk to Kevin Park (NPC at his desk) -- **Completion:** Ink tag `#complete_task:meet_kevin` +**Objects:** +- Practice Safe [PIN 1337] - Old Orientation Guide (LORE) +- Maintenance Log (Backup) - Backup copy of access codes -**Task: Receive Lockpick** (`receive_lockpick`) -- **Room:** Main Office Area -- **Interaction:** Kevin gives lockpick set via dialogue -- **Completion:** Ink tag `#give_item:lockpick` + `#complete_task:receive_lockpick` +**Purpose:** Optional exploration, practice PIN mechanics --- -#### Aim 1.3: Tutorial Skills +### 4. BREAK ROOM +**Lock:** None (unlocked) +**Type:** room_office -**Task: Lockpicking Tutorial** (`lockpick_tutorial`) -- **Room:** Main Office Area (storage closet door) -- **Interaction:** Pick storage closet lock -- **Completion:** Minigame success → Ink tag `#complete_task:lockpick_tutorial` +**Objects:** +- Coffee Shop Receipt - Derek meeting "The Architect" late at night +- Birthday/Anniversary Card - Reveals April 19 (0419) +- Office Gossip note - Patricia was asking questions about Derek -**Task: Find Derek's Key** (`find_derek_key`) -- **Room:** Storage Closet (inside Main Office) -- **Interaction:** Search toolbox on upper shelf -- **Completion:** Ink tag `#complete_task:find_derek_key` +**Purpose:** Social clues, reveals PIN 0419 --- -#### Aim 2.1: Identify Targets +### 5. CONFERENCE ROOM +**Lock:** None (unlocked) +**Type:** room_office -**Task: Access Derek's Office** (`access_derek_office`) -- **Room:** Derek's Office -- **Interaction:** Unlock door (lockpick OR use key) -- **Completion:** Room entry → Ink tag `#complete_task:access_derek_office` +**Objects:** +- Meeting Calendar - Derek's suspicious meeting patterns +- ZDS Meeting Notes - Evidence of Zero Day Syndicate coordination +- Campaign Timeline - Operation Shatter schedule -**Task: Decode Whiteboard** (`decode_whiteboard`) -- **Room:** Derek's Office (message location), Main Office (CyberChef workstation) -- **Interaction:** Examine whiteboard, use CyberChef to decode Base64 -- **Completion:** Ink tag `#complete_task:decode_whiteboard` -- **Backtracking:** Office → Main Office → Office - -**Task: Gather Password Hints** (`gather_password_hints`) -- **Room:** Main Office Area -- **Interaction:** Talk to Kevin, search his desk drawer -- **Completion:** Ink tag `#complete_task:gather_password_hints` - -**Task: Access Derek's Computer** (`access_derek_computer`) -- **Room:** Derek's Office -- **Interaction:** Log into PC using password hint -- **Completion:** Computer unlock → Ink tag `#complete_task:access_derek_computer` +**Purpose:** Evidence gathering, ZDS connection --- -#### Aim 2.2: Intercept Communications +### 6. IT ROOM (Kevin's Space) +**Lock:** PIN 2468 (clue in Maintenance Checklist) +**Type:** room_office -**Task: Access Server Room** (`access_server_room`) -- **Room:** Server Room -- **Interaction:** Clone Kevin's card OR lockpick door -- **Completion:** Room entry → Ink tag `#complete_task:access_server_room` +**NPCs:** +- Kevin Park - IT Manager + - Gives: Lockpicks, Server Room Keycard, Password Hints + - Intel about Derek's unauthorized access -**Task: Access VM Terminal** (`access_vm`) -- **Room:** Server Room -- **Interaction:** Use VM access terminal -- **Completion:** Ink tag `#complete_task:access_vm` +**Objects:** +- IT Monitoring Station - Server access log showing Derek's unauthorized activity +- IT Security Concerns memo - Kevin's unsent warning -**Task: Submit SSH Flag** (`submit_ssh_flag`) -- **Room:** Server Room -- **Interaction:** Drop-site terminal - submit flag from VM -- **Completion:** Ink tag `#complete_task:submit_ssh_flag` - -**Task: Submit Navigation Flag** (`submit_navigation_flag`) -- **Room:** Server Room -- **Interaction:** Drop-site terminal - submit flag from VM -- **Completion:** Ink tag `#complete_task:submit_navigation_flag` - -**Task: Submit Sudo Flag** (`submit_sudo_flag`) -- **Room:** Server Room -- **Interaction:** Drop-site terminal - submit flag from VM -- **Completion:** Ink tag `#complete_task:submit_sudo_flag` +**Purpose:** Get lockpicks and server access, Intel about Derek --- -#### Aim 2.3: Gather Physical Evidence +### 7. MANAGER'S OFFICE (Vacant) +**Lock:** None (unlocked) +**Type:** room_office -**Task: Search Filing Cabinet** (`search_filing_cabinet`) -- **Room:** Derek's Office -- **Interaction:** Lockpick filing cabinet, examine contents -- **Completion:** Ink tag `#complete_task:search_filing_cabinet` +**Objects:** +- Patricia's Safe [PIN 0419] - Contains Derek's Office spare key +- Patricia's Briefcase [LOCKPICK ONLY] - ENTROPY Infiltration Timeline (LORE) +- Termination Letter - Suspiciously vague firing -**Task: Search Conference Materials** (`search_conference_materials`) -- **Room:** Conference Room -- **Interaction:** Examine documents on table, whiteboards -- **Completion:** Ink tag `#complete_task:search_conference_materials` - -**Task: Interview Maya** (`interview_maya`) - Optional -- **Room:** Conference Room OR Break Room -- **Interaction:** Talk to Maya Chen (NPC) -- **Completion:** Ink tag `#complete_task:interview_maya` +**Purpose:** Get Derek's key OR get bonus LORE via lockpick --- -#### Aim 2.4: Correlate Evidence +### 8. MAYA'S OFFICE +**Lock:** None (unlocked) +**Type:** room_office -**Task: Match Timeline** (`match_timeline`) -- **Rooms:** Multiple (requires revisiting evidence locations) -- **Interaction:** Correlate Derek's emails, VM logs, physical documents -- **Completion:** Ink tag `#complete_task:match_timeline` after accessing all sources +**NPCs:** +- Maya Chen - The Informant + - Reveals she contacted SAFETYNET + - Full briefing on Operation Shatter + - Intel about Derek, Patricia, evidence locations -**Task: Identify Operatives** (`identify_operatives`) -- **Rooms:** Multiple (Derek's computer, filing cabinet, VM flags) -- **Interaction:** Synthesize evidence to identify Derek + accomplices -- **Completion:** Ink tag `#complete_task:identify_operatives` -- **Unlocks:** Act 3 confrontation +**Objects:** +- Disinformation Research - Maya's concerns +- SAFETYNET Contact note - Her anonymous tip + +**Purpose:** Story exposition, informant reveal --- -#### Aim 3.1: Confront Derek (Act 3) +### 9. DEREK'S OFFICE +**Lock:** KEY (Derek's Office Key) OR LOCKPICK +**Type:** room_office +**Connects to:** Server Room -**Task: Confront Derek Lawson** (`confront_derek`) -- **Room:** Derek's Office (Derek appears as NPC) -- **Interaction:** Dialogue with Derek (major choice point) -- **Completion:** Ink tag `#complete_task:confront_derek` +**NPCs:** +- Derek Lawson - ENTROPY operative + - Appears after all VM flags submitted + - Confrontation triggers mission end -**Task: Final Resolution** (`final_resolution`) -- **Room:** Derek's Office -- **Interaction:** Choice-dependent outcome (arrest, recruit, expose) -- **Completion:** Ink tag `#complete_task:final_resolution` -- **Mission Complete:** Triggers debrief +**Objects:** +- Derek's Computer - CONTINGENCY file (triggers Kevin moral choice) +- Whiteboard [Base64] - Reveals cabinet PIN 0419 +- Derek's Filing Cabinet [PIN 0419]: + - Casualty Projections (critical evidence) + - Social Fabric Manifesto (LORE) + - Campaign Materials (evidence) +- Derek's Calendar - Operation launches Sunday + +**Purpose:** Evidence gathering, moral choice, confrontation --- -### Optional Objective: Collect LORE Fragments +### 10. SERVER ROOM +**Lock:** RFID (Server Room Keycard from Kevin) +**Type:** room_servers -**Fragment 1: Social Fabric Manifesto** -- **Room:** Main Office Area -- **Location:** Filing cabinet (west wall) -- **Requires:** Lockpicking +**Objects:** +- VM Access Terminal - Intro to Linux Security Lab +- SAFETYNET Drop-Site Terminal - Submit flags +- Network Backdoor Analysis - Technical LORE +- Target Demographics Database - Critical evidence (2.3M profiles) -**Fragment 2: The Architect's Letter to Social Fabric** -- **Room:** Derek's Office -- **Location:** Filing cabinet (hidden folder) -- **Requires:** Lockpicking - -**Fragment 3: Network Infrastructure Diagram** -- **Room:** Server Room -- **Location:** IT supply shelf -- **Requires:** Server room access +**Purpose:** VM challenges, flag submission, final evidence --- -## Progressive Unlocking Flow +## Lock Summary -### Initial State (Mission Start) - -**✅ Accessible:** -- Reception Area (spawn point) -- Main Office Area -- Break Room -- Conference Room - -**🔒 Locked:** -- Derek's Office (lockpick OR key required) -- Server Room (RFID card OR lockpick + password) -- Storage Closet (lockpick required - tutorial) - -**Available NPCs:** -- Sarah (Reception) -- Kevin (Main Office) -- Maya (Conference Room OR Break Room - optional) - -**Available Objectives:** -- `enter_office` (automatic) -- `meet_reception` -- `explore_office` -- `meet_kevin` +| Room | Lock Type | Code/Key | Clue Location | +|------|-----------|----------|---------------| +| Main Office | KEY | main_office_key | Sarah (Reception) | +| IT Room | PIN | 2468 | Maintenance Checklist | +| Manager's Safe | PIN | 0419 | Anniversary Card (Break Room) | +| Derek's Office | KEY | derek_office_key | Manager's Safe | +| Derek's Office | PICK | keyPins configured | Lockpicks from Kevin | +| Derek's Cabinet | PIN | 0419 | Whiteboard (Base64) | +| Server Room | RFID | server_keycard | Kevin (IT Room) | +| Practice Safe | PIN | 1337 | Maintenance Checklist | +| Main Cabinet | PIN | 2024 | Sticky Note | +| Patricia's Briefcase | PICK | No key exists | Must lockpick | --- -### After Task: Receive Lockpick (`receive_lockpick` completed) - -**🔓 Unlocks:** -- Storage Closet (can now pick lock) - -**New Objectives:** -- `lockpick_tutorial` (pick storage closet) - -**Narrative State:** Kevin trusts player enough to provide tools - ---- - -### After Task: Lockpick Tutorial (`lockpick_tutorial` completed) - -**🔓 Unlocks:** -- Derek's Office (can now pick door lock OR find key) -- Storage Closet interior (find Derek's key) - -**New Objectives:** -- `access_derek_office` -- `find_derek_key` - -**Player Choice:** Pick Derek's door immediately OR find key in storage closet (both valid) - ---- - -### After Task: Access Derek's Office (`access_derek_office` completed) - -**🔓 Unlocks:** -- Derek's Office contents (computer, filing cabinet, whiteboard) - -**New Objectives:** -- `decode_whiteboard` -- `access_derek_computer` -- `search_filing_cabinet` - -**Backtracking Required:** -- Whiteboard → Main Office (CyberChef) → Derek's Office (complete task) - ---- - -### After Task: Gather Password Hints (`gather_password_hints` completed) - -**🔓 Unlocks:** -- Derek's Computer (can log in using password hint) - -**New Objectives:** -- `access_derek_computer` - -**Intelligence Gained:** SSH credentials for VM access - ---- - -### After Task: Access Derek's Computer (`access_derek_computer` completed) - -**🔓 Unlocks:** -- VM access credentials (username, IP address) -- Server room password - -**New Objectives:** -- `access_server_room` -- `access_vm` - -**Narrative Progression:** Physical investigation yields digital access - ---- - -### After Task: Clone Kevin's Card (`clone_kevin_card` completed) - OR - After Lockpicking Server Room Door - -**🔓 Unlocks:** -- Server Room (RFID access OR lockpick bypass) - -**New Objectives:** -- `access_server_room` -- `access_vm` - -**Player Choice:** Social engineering (card clone) OR stealth (lockpick) - ---- - -### After Task: Access Server Room (`access_server_room` completed) - -**🔓 Unlocks:** -- VM Access Terminal -- Drop-Site Terminal -- Server room containers - -**New Objectives:** -- `access_vm` -- `submit_ssh_flag` -- `submit_navigation_flag` -- `submit_sudo_flag` - -**Narrative State:** Digital exploitation phase begins - ---- - -### After All VM Flags Submitted (`submit_sudo_flag` completed) - -**🔓 Unlocks:** -- Final correlation tasks -- Act 3 progression - -**New Objectives:** -- `match_timeline` -- `identify_operatives` - -**Intelligence Gained:** VM flags reveal ENTROPY communications, operative identities - ---- - -### After Task: Identify Operatives (`identify_operatives` completed) - -**🔓 Unlocks:** -- Derek Lawson confrontation (Derek appears as NPC in his office) -- Act 3 content - -**New Objectives:** -- `confront_derek` - -**Narrative State:** All evidence gathered, ready for confrontation - ---- - -### After Task: Confront Derek (`confront_derek` completed) - -**🔓 Unlocks:** -- Final resolution choices (arrest, recruit, expose, eliminate) - -**New Objectives:** -- `final_resolution` - -**Player Agency:** Major moral choice point (see Stage 3 moral choices) - ---- - -### Final State (Mission Complete) - -**✅ All Rooms Accessible:** -- All locks opened or bypassed -- All evidence collected -- All NPCs encountered - -**Mission Outcome:** -- Derek Lawson's fate determined by player choice -- Social Fabric operation exposed (degree varies by choice) -- Campaign progression unlocked -- Debrief with Agent 0x99 - ---- - -## Required Backtracking - -### Backtracking Moment 1: Lockpick Tutorial → Key Discovery → Office Access - -**Trigger:** Complete lockpicking tutorial, gain access to storage closet -**From:** Storage Closet -**To:** Derek's Office -**Purpose:** Demonstrate backtracking pattern - initial unlock enables future access -**Educational Value:** Non-linear progression, thorough exploration rewards - -**Flow:** -1. Receive lockpick from Kevin (Main Office) -2. Pick storage closet lock (tutorial) -3. Find Derek's office key in toolbox -4. Return to Derek's office door (previously visible but locked) -5. Unlock office with key OR lockpick (player choice) - -**Alternative Path:** Player can skip key discovery and lockpick office directly (agency) - ---- - -### Backtracking Moment 2: Whiteboard Decoding → CyberChef → Evidence Correlation - -**Trigger:** Find encoded whiteboard message in Derek's office -**From:** Derek's Office -**To:** Main Office (CyberChef workstation) → back to Derek's Office -**Purpose:** Teach encoding/decoding workflow, physical-to-digital evidence correlation -**Educational Value:** Base64 encoding, tool usage, evidence synthesis - -**Flow:** -1. Enter Derek's office -2. Examine whiteboard (find Base64 string) -3. Recognize encoding (tutorial hints) -4. Return to Main Office Area -5. Use CyberChef workstation to decode -6. Decode reveals: "Client list update: Coordinating with ZDS" -7. Return to Derek's office with new context -8. Search for "ZDS" references in computer/files - -**Educational Moments:** -- Encoding ≠ encryption (teaches concept) -- Tool-based analysis (CyberChef practical usage) -- Evidence correlation (decoded message → computer files) - ---- - -### Backtracking Moment 3: Social Engineering → Password Discovery → VM Access - -**Trigger:** Complete social engineering with Kevin, gather password hints -**From:** Main Office Area (Kevin's desk) -**To:** Derek's Office (computer) → Server Room (VM) -**Purpose:** Demonstrate social engineering → digital exploitation workflow -**Educational Value:** Password guessing, SSH access, hybrid methodology - -**Flow:** -1. Build trust with Kevin through dialogue -2. Kevin provides password hints (willingly or carelessly) -3. Travel to Derek's office -4. Use password hint to log into Derek's computer -5. Find SSH credentials on computer -6. Travel to Server Room -7. Use credentials to access VM -8. Complete VM challenges -9. Submit flags at drop-site terminal (same room) - -**Educational Moments:** -- Social engineering yields digital access -- Password reuse patterns -- SSH brute force (guided by hints) -- Physical → digital evidence chain - ---- - -### Backtracking Moment 4: VM Flags → Physical Evidence Correlation → Operative Identification - -**Trigger:** Submit all VM flags, unlock ENTROPY communications intel -**From:** Server Room -**To:** Derek's Office, Conference Room, Main Office (revisiting evidence) -**Purpose:** Correlation task - synthesize digital and physical evidence -**Educational Value:** Evidence analysis, timeline construction, identifying patterns - -**Flow:** -1. Complete all VM challenges (SSH, navigation, sudo) -2. Submit flags at drop-site terminal -3. Flags unlock intelligence reports (Ink dialogue/notes) -4. Intelligence references dates, times, and locations -5. Return to Derek's office (computer emails) -6. Match email timestamps to VM log entries -7. Visit Conference Room (whiteboard notes) -8. Correlate meeting dates with suspicious activity -9. Visit Main Office (filing cabinet) -10. LORE fragment connections to The Architect -11. Complete correlation → identify Derek + accomplices - -**Educational Moments:** -- Digital forensics (log analysis) -- Timeline correlation -- Pattern recognition -- Evidence synthesis - -**Completion:** Unlocks Act 3 confrontation - ---- - -### Backtracking Moment 5: Evidence Gathering → Confrontation Preparation → Derek Encounter - -**Trigger:** Identify operatives, all evidence collected -**From:** Various rooms -**To:** Derek's Office (Derek appears as NPC) -**Purpose:** Final preparation before climax -**Educational Value:** Thorough investigation enables informed choices - -**Flow:** -1. Complete all evidence gathering tasks -2. Review collected evidence (inventory notes) -3. Optional: Return to rooms for missed LORE fragments -4. Receive Agent 0x99 phone call (Ink dialogue) -5. 0x99 provides confrontation guidance -6. Enter Derek's office -7. Derek appears as NPC (scripted encounter) -8. Confrontation dialogue begins (Act 3) - -**Player Agency:** Better evidence = more dialogue options in confrontation - ---- - -## Container and Lock Summary - -### All Containers - -| Room | Container Type | Lock Type | Key Contents | Unlock Condition | Objectives | -|------|----------------|-----------|--------------|------------------|------------| -| Reception | Desk Drawer | None | Building directory, visitor log | Always accessible | `explore_office` | -| Reception | Company Directory | None | Employee names/offices | Always accessible | Intel gathering | -| Reception | PC (Sarah's) | None | Derek's emails, meeting calendar | Always accessible | Intel gathering | -| Main Office | Kevin's Desk Drawer | None | Password hints, network diagram | Always accessible | `gather_password_hints` | -| Main Office | Storage Closet Door | Physical Lock | (contains toolbox) | Lockpicking tutorial | `lockpick_tutorial` | -| Main Office | Toolbox (in closet) | None | Derek's office key | After opening closet | `find_derek_key` | -| Main Office | Filing Cabinet | Physical Lock | LORE Fragment 1, employee records | Lockpicking (medium) | LORE collection | -| Derek's Office | PC | Password | SSH credentials, emails | Password from Kevin | `access_derek_computer` | -| Derek's Office | Filing Cabinet | Physical Lock | Disinformation plans, LORE Fragment 2 | Lockpicking (medium) | `search_filing_cabinet`, LORE | -| Derek's Office | Desk Drawer | None | Burner phone, travel docs | Always (after office access) | Flavor | -| Server Room | Server Rack Cabinet | None | Network cables, documentation | After room access | Flavor | -| Server Room | IT Supply Shelf | None | LORE Fragment 3 | After room access | LORE collection | -| Conference | Conference Table | None | Meeting agenda, client presentation | Always accessible | `search_conference_materials` | -| Conference | A/V Cabinet | None | Presentation files | Always accessible | Intel gathering | -| Break Room | Refrigerator | None | Food, energy drinks | Always accessible | Flavor | -| Break Room | Notice Board | None | Employee directory, events | Always accessible | Social engineering intel | -| Break Room | Trash Bin | None | Discarded notes | Always accessible | Optional investigation | - ---- - -### All Locks and Keys - -| Lock Location | Lock Type | Unlock Method | Key/Code Source | Difficulty | Tutorial Value | -|---------------|-----------|---------------|-----------------|------------|----------------| -| Storage Closet Door | Physical (Pin Tumbler) | Lockpicking | Kevin provides lockpick | Easy | **Lockpicking Tutorial** | -| Derek's Office Door | Physical (Pin Tumbler) | Lockpicking OR Key | Key in storage closet toolbox | Medium | Player choice (two paths) | -| Derek's PC | Password | Password entry | Kevin's password hints | Easy | Password guessing | -| Derek's Filing Cabinet | Physical (Pin Tumbler) | Lockpicking | Requires lockpick from Kevin | Medium | Evidence retrieval | -| Main Office Filing Cabinet | Physical (Pin Tumbler) | Lockpicking | Requires lockpick from Kevin | Medium | Optional LORE | -| Server Room Door | RFID OR Physical | Clone Kevin's card OR Lockpick | Clone card OR pick lock | Medium/Hard | **Two-method unlock** | - -**Lock Progression Design:** -- **Easy (Storage Closet):** Tutorial lock, forgiving mechanics -- **Medium (Derek's Office):** Standard difficulty, reinforces tutorial -- **Medium-Hard (Filing Cabinets):** Optional challenges, rewards thoroughness -- **Hard (Server Room):** Advanced challenge OR social engineering bypass - -**Player Agency in Locks:** -- Most locks have **two unlock methods** (lockpick vs. find key, lockpick vs. RFID clone) -- Rewards multiple playstyles (stealth vs. social engineering) -- No "correct" path - all methods valid - ---- - -## NPC Placement Summary - -| NPC Name | Room | In-Person/Phone | Dialogue Purpose | Items Given | Objectives | Trust System | -|----------|------|-----------------|------------------|-------------|------------|--------------| -| Agent 0x99 (Haxolottle) | N/A | Phone (player phone) | Mission briefing, guidance, debrief | None | Tutorial hints, Act transitions | N/A (handler) | -| Sarah Martinez | Reception | In-Person | Check-in, cover establishment, office intel | Visitor badge | `meet_reception` | Neutral → Friendly | -| Kevin Park | Main Office | In-Person | IT assistance, social engineering, tool provider | Lockpick set, RFID card (clone), password hints | `meet_kevin`, `receive_lockpick`, `gather_password_hints`, `clone_kevin_card` | Low → Medium → High | -| Maya Chen | Conference Room OR Break Room | In-Person (optional) | Office gossip, witness testimony, Derek's behavior | None | `interview_maya` (optional) | Neutral → Helpful | -| Derek Lawson | Derek's Office | In-Person (Act 3 only) | Confrontation, moral choice, resolution | None | `confront_derek`, `final_resolution` | N/A (antagonist) | - -**NPC Positioning Strategy:** - -- **Sarah (Reception):** Stationary at desk - first NPC encounter, establishes cover -- **Kevin (Main Office):** Stationary at IT desk - central hub placement for easy access -- **Maya (Conference/Break):** Mobile - may be in either room, encourages exploration -- **Derek (Office - Act 3 only):** Scripted appearance after `identify_operatives` complete - -**Phone vs. In-Person:** -- **In-Person:** Sarah, Kevin, Maya, Derek (physical presence supports social engineering) -- **Phone:** Agent 0x99 (remote handler, accessible anywhere) - -**Trust Progression Example (Kevin):** - -1. **Low Trust (Initial):** Polite but professional, minimal information -2. **Medium Trust (After building rapport):** Provides password hints, lockpick set -3. **High Trust (After demonstrating competence):** Allows RFID card cloning, shares suspicions about Derek - -**NPC Dialogue Integration:** -- All dialogue via Ink scripts (Stage 7) -- Trust levels tracked via Ink variables (`trust_kevin`, `trust_sarah`, etc.) -- Items given via `#give_item` tags -- Objectives completed via `#complete_task` tags - ---- - -## Hybrid Architecture Integration - -### VM Access Points - -| Room | Terminal Name | Access Requirements | VM Challenge | Unlocks | Objectives | -|------|---------------|---------------------|--------------|---------|------------| -| Server Room | System Admin Workstation | Server room entry + SSH credentials from Derek's PC | SSH brute force | Navigation challenge | `access_vm` | -| Server Room | System Admin Workstation | Successful SSH access | Linux basic navigation (find flags in filesystem) | Privilege escalation challenge | `submit_navigation_flag` | -| Server Room | System Admin Workstation | Linux navigation complete | Privilege escalation (sudo exploit) | Final intelligence | `submit_sudo_flag` | - -**VM Challenge Sequence:** - -1. **SSH Brute Force:** - - Username: `derek_lawson` (from Derek's PC) - - IP: `192.168.1.100` (from Derek's PC) - - Password: From Kevin's hints ("Marketing123", "Campaign2024", "Viral_Dynamics_Admin") - - Success: Log into target server - -2. **Linux Navigation:** - - Find hidden files in `/home/derek_lawson/` - - Cat files to reveal encrypted messages - - Locate flag in `/var/log/entropy_comms.txt` - - Submit flag: `FLAG{social_fabric_comms_intercepted}` - -3. **Privilege Escalation:** - - Check `sudo -l` permissions - - Exploit misconfigured sudo rules - - Access `/root/` directory - - Find final flag: `FLAG{architect_commands_discovered}` - - Submit flag: Campaign-level intelligence unlocked - -**Educational Integration:** -- SSH concepts and authentication -- Basic Linux command line (ls, cd, cat, grep) -- File permissions and sudo -- Simulated network intrusion - ---- - -### Drop-Site Terminals - -| Room | Terminal Name | Flags Submitted Here | Unlocks | Narrative Effect | -|------|---------------|---------------------|---------|------------------| -| Server Room | Drop-Site Terminal (Secondary Workstation) | `FLAG{social_fabric_comms_intercepted}` (SSH) | Intelligence report on ZDS (ENTROPY front), unlocks `match_timeline` | Confirms Derek's ENTROPY connection | -| Server Room | Drop-Site Terminal | `FLAG{navigation_complete}` (Linux navigation) | Chat logs between Derek and "The Architect", unlocks `identify_operatives` | Reveals Social Fabric cell structure | -| Server Room | Drop-Site Terminal | `FLAG{architect_commands_discovered}` (privilege escalation) | Direct orders from The Architect, campaign intelligence, unlocks Act 3 | Mission-critical intel, confrontation enabled | - -**Flag Submission Flow:** - -1. Player completes VM challenge -2. Receives flag in VM terminal -3. Minimizes or exits VM window -4. Walks to drop-site terminal (same room, different position) -5. Interacts with terminal -6. Flag auto-detected or manually entered -7. Ink tag `#complete_task:submit_[flag_type]_flag` -8. Unlocks narrative content (notes, dialogue, objectives) - -**Design Rationale:** -- Separate terminals prevent UI conflict (can't interact with game while in VM) -- Drop-site terminal in same room reduces navigation friction -- Flag submission triggers narrative progression (hybrid integration) - ---- - -### CyberChef Workstation - -| Room | Workstation Name | Used For | Challenges | Educational Value | Objectives | -|------|------------------|----------|------------|-------------------|------------| -| Main Office | CyberChef Analysis Station | Base64 decoding | Decode Derek's whiteboard message | Encoding vs. encryption, Base64 mechanics | `decode_whiteboard` | -| Main Office | CyberChef Analysis Station | Hex analysis (future challenges) | Decode hex-encoded messages in emails | Hex representation, ASCII conversion | Future missions | - -**CyberChef Usage Flow:** - -1. Player finds encoded message (whiteboard, email, note) -2. Recognizes encoding pattern (tutorial hints) -3. Walks to CyberChef workstation (Main Office) -4. Interacts with workstation -5. CyberChef minigame interface opens -6. Select operation (Base64 decode) -7. Paste encoded string -8. View decoded output -9. Decode reveals: "Client list update: Coordinating with ZDS" -10. Ink tag `#complete_task:decode_whiteboard` - -**Educational Integration:** -- Base64 encoding concepts -- Encoding vs. encryption (not secure, just obfuscated) -- CyberChef as industry-standard tool -- Practical decoding workflow - ---- - -## Progressive Unlocking Flow Diagram +## Puzzle Flow ``` -START: Spawn in Reception Area -│ -├─ [Act 1: Tutorial - 0-20 min] -│ ├─ Talk to Sarah (reception) → Visitor badge -│ ├─ Explore public areas (reception, break room, conference, main office) -│ ├─ Meet Kevin (main office) → Build initial trust -│ ├─ Kevin gives lockpick set → Tutorial enabled -│ └─ Pick storage closet lock → Lockpicking tutorial complete -│ └─ Find Derek's office key (in closet) -│ -├─ [Act 2: Investigation - 20-50 min] -│ │ -│ ├─ [Path A: Derek's Office - Physical Evidence] -│ │ ├─ Unlock Derek's office (lockpick OR use key) -│ │ ├─ Examine whiteboard (Base64 encoded message) -│ │ │ └─ **BACKTRACK to Main Office → Use CyberChef → Decode message** -│ │ ├─ Access Derek's computer (password from Kevin's hints) -│ │ │ └─ Find SSH credentials, email evidence -│ │ └─ Lockpick filing cabinet -│ │ └─ Find disinformation plans, LORE Fragment 2 -│ │ -│ ├─ [Path B: Server Room - Digital Exploitation] -│ │ ├─ Clone Kevin's RFID card OR lockpick server room door -│ │ ├─ Enter server room -│ │ ├─ Access VM terminal (using SSH credentials from Derek's PC) -│ │ ├─ VM Challenge 1: SSH brute force -│ │ │ └─ Submit flag at drop-site terminal → Intel unlocked -│ │ ├─ VM Challenge 2: Linux navigation -│ │ │ └─ Submit flag at drop-site terminal → Chat logs unlocked -│ │ └─ VM Challenge 3: Privilege escalation -│ │ └─ Submit flag at drop-site terminal → Architect orders unlocked -│ │ -│ ├─ [Path C: Correlation - Evidence Synthesis] -│ │ ├─ **BACKTRACK to Derek's office** → Match timestamps -│ │ ├─ **BACKTRACK to Conference Room** → Analyze meeting notes -│ │ ├─ Correlate VM logs + emails + physical documents -│ │ └─ Identify Derek Lawson + accomplices -│ │ -│ └─ Act 2 Complete → All evidence gathered -│ -└─ [Act 3: Confrontation - 50-60 min] - ├─ Agent 0x99 phone call → Guidance for confrontation - ├─ Derek appears in his office (NPC spawns) - ├─ Confrontation dialogue → Present evidence - ├─ Major Moral Choice (see Stage 3): - │ ├─ Option 1: Surgical Strike (report to authorities, protect business) - │ ├─ Option 2: Full Exposure (leak publicly, destroy company) - │ ├─ Option 3: Recruit Derek (turn him into double agent) - │ └─ Option 4: Eliminate (lethal action - ruthless) - ├─ Resolution outcome (varies by choice) - ├─ SAFETYNET intervention (agents arrive) - └─ Mission Complete → Debrief with 0x99 - -LEGEND: -→ = Direct progression -└─ = Unlocks/enables -**BACKTRACK** = Required return to previous location -[Path] = Parallel objectives (can be done in any order) +Reception + │ + ▼ [KEY from Sarah] +Main Office Area ───────────────────────────────────────────────── + │ │ + ├─► Find Maintenance Checklist ─► IT Room PIN: 2468 │ + │ │ + ├─► Storage Closet ─► Practice Safe [1337] │ + │ │ + ├─► Break Room ─► Anniversary Card ─► PIN: 0419 │ + │ │ + ├─► Conference Room ─► ZDS Evidence │ + │ │ + └─► Maya's Office ─► Full Intel │ + │ +IT Room [PIN 2468] ◄──────────────────────────────────────────────┘ + │ + ▼ +Kevin gives: Lockpicks + Server Keycard + │ + ├─── PATH A: Manager's Office ─► Safe [0419] ─► KEY + │ │ + └─── PATH B: Use lockpicks ─────────────────────────┤ + │ + ▼ + Derek's Office + │ + ┌───────────────────────────────────────────────────┤ + │ │ + │ • CONTINGENCY file (moral choice) │ + │ • Whiteboard [decode] ─► Cabinet PIN: 0419 │ + │ • Filing Cabinet ─► Critical Evidence │ + │ │ + └───────────────────────────────────────────────────┤ + │ + ▼ + Server Room [RFID] + │ + ╔═══════════════╗ + ║ VM CHALLENGES ║ + ║ REQUIRED ║ + ╚═══════════════╝ + │ + ▼ + Submit 3 Flags + │ + ▼ + Derek Confrontation + │ + ▼ + MISSION COMPLETE ``` -**Design Notes:** +--- -- **Act 1 is linear** (tutorial flow) but allows free exploration within public areas -- **Act 2 has three parallel paths** (Derek's office, server room, correlation) completable in any order -- **Required backtracking** teaches non-linear investigation (whiteboard → CyberChef → office) -- **Act 3 is linear** (confrontation sequence) but player choices create branching outcomes +## Teaching Order + +| Order | Mechanic | Where Taught | +|-------|----------|--------------| +| 1 | Keys | Main Office door (from Sarah) | +| 2 | PIN codes | IT Room door (2468) | +| 3 | Lockpicks | Derek's door OR Patricia's briefcase | +| 4 | RFID/Keycard | Server Room door | +| 5 | Base64 decoding | Derek's whiteboard | +| 6 | VM challenges | Server room terminal | --- -## Technical Validation +## Evidence Distribution -### Room: Reception Area (`reception_area`) - -- ✅ Room type defined (`room_reception`) -- ✅ Connections specified (north to main_office, east to break_room) -- ✅ All containers have contents specified -- ✅ NPCs positioned (Sarah at reception desk) -- ✅ Objectives mapped (`enter_office`, `meet_reception`, `explore_office`) -- ✅ No circular dependencies (always accessible) - -### Room: Main Office Area (`main_office_area`) - -- ✅ Room type defined (`room_office` - open plan) -- ✅ Connections specified (4 connections: south, north-locked, east-locked, west) -- ✅ All containers have contents and lock types specified -- ✅ NPCs positioned (Kevin at IT desk) -- ✅ Storage closet lockpicking tutorial designed -- ✅ CyberChef workstation placed -- ✅ Objectives mapped (multiple tutorial and investigation tasks) -- ✅ Hub room - central navigation point - -### Room: Derek's Office (`derek_office`) - -- ✅ Room type defined (`room_office`) -- ✅ Locked door with two unlock methods (lockpick OR key) -- ✅ Key source specified (storage closet toolbox) -- ✅ All containers have locks and contents specified -- ✅ PC password source specified (Kevin's hints) -- ✅ Whiteboard encoding challenge designed (Base64) -- ✅ Objectives mapped (`access_derek_office`, `decode_whiteboard`, etc.) -- ✅ Backtracking designed (whiteboard → CyberChef) - -### Room: Server Room (`server_room`) - -- ✅ Room type defined (`room_servers`) -- ✅ Locked door with two unlock methods (RFID clone OR lockpick) -- ✅ RFID card source specified (clone from Kevin) -- ✅ Password source specified (Derek's computer) -- ✅ VM access terminal placed and specified -- ✅ Drop-site terminal placed (separate from VM terminal) -- ✅ All containers have contents specified -- ✅ Objectives mapped (all VM flag tasks) -- ✅ No circular dependencies (Derek's PC provides credentials) - -### Room: Conference Room (`conference_room`) - -- ✅ Room type defined (`room_conference`) -- ✅ Connections specified (east to main_office, north to break_room) -- ✅ Unlocked from start (public area) -- ✅ All containers have contents specified -- ✅ NPCs positioned (Maya - optional encounter) -- ✅ Objectives mapped (`search_conference_materials`, `interview_maya`) -- ✅ Environmental storytelling elements specified - -### Room: Break Room (`break_room`) - -- ✅ Room type defined (`room_breakroom`) -- ✅ Connections specified (3 connections: west, south, north) -- ✅ Unlocked from start (public area) -- ✅ All containers have contents specified -- ✅ NPCs positioned (Maya - alternate location) -- ✅ Objectives mapped (optional tasks) -- ✅ No critical path dependencies (flavor room) - -### Room: Storage Closet (`storage_closet`) - -- ✅ Lockpicking tutorial lock specified (easy difficulty) -- ✅ Contents specified (toolbox with Derek's key) -- ✅ Practice safe inside for tutorial progression -- ✅ Objectives mapped (`lockpick_tutorial`, `find_derek_key`) -- ✅ Enables backtracking to Derek's office +| Room | Evidence Type | Importance | +|------|--------------|------------| +| Reception | Sign-in log | Flavor | +| Main Office | Architect's Letter | LORE | +| Break Room | Coffee receipt | Clue | +| Conference | ZDS notes, timeline | Evidence | +| IT Room | Access logs, memo | Intel | +| Manager's Office | Investigation notes | LORE | +| Manager's Office | Infiltration timeline | LORE (lockpick-only) | +| Maya's Office | Research, tip | Story | +| Derek's Office | CONTINGENCY | Moral choice | +| Derek's Office | Casualty projections | Critical | +| Derek's Office | Manifesto | LORE | +| Derek's Office | Campaign materials | Evidence | +| Server Room | Target database | Critical | +| Server Room | Backdoor analysis | LORE | --- -## Overall Design Validation +## Lockpick-Only Content -### Technical Compliance -- ✅ All rooms have type specified -- ✅ All connections defined bidirectionally -- ✅ All locked rooms have unlock methods specified -- ✅ All locks have key/code sources specified -- ✅ No circular dependencies (can't need key from locked room to unlock that room) -- ✅ All containers have contents specified -- ✅ All NPCs have positions and dialogue purposes specified +**Patricia's Briefcase** in Manager's Office: +- No key exists - must be picked +- Contains: ENTROPY Infiltration Timeline +- Reveals 18-month history of ENTROPY's infiltration +- Bonus LORE for thorough players -### Container Integration -- ✅ Container types appropriate for locations (filing cabinets in offices, fridges in break room) -- ✅ Locked containers have unlock methods specified -- ✅ Critical evidence in narratively justified containers -- ✅ Container positions within rooms make logical sense -- ✅ 2-4 containers per room (not overwhelming) - -### Lock and Key System -- ✅ All locks have unlock methods (lockpick, key, password, RFID) -- ✅ Progressive unlocking creates good pacing (storage → Derek's office → server room) -- ✅ No circular dependencies (lockpick → key → credentials progression) -- ✅ Backtracking opportunities designed intentionally (3+ moments) -- ✅ Multiple unlock paths support player agency (lockpick vs. key, lockpick vs. RFID) - -### NPC Integration -- ✅ All NPCs have positions specified -- ✅ In-person vs. phone mode chosen appropriately (all in-person except 0x99) -- ✅ NPC positions valid within room logic (Sarah at desk, Kevin at IT corner) -- ✅ No patrol routes (beginner mission - static NPCs) -- ✅ NPC dialogue purposes clear (tutorial, intel, items) - -### Objectives Integration -- ✅ Every task from Stage 4 mapped to room location -- ✅ Every task has interaction method specified -- ✅ VM access points and drop-site terminals placed -- ✅ Objectives create logical progression through rooms (tutorial → investigation → confrontation) -- ✅ Optional objectives accessible but not blocking main path (LORE fragments, Maya interview) - -### Hybrid Architecture -- ✅ VM access terminal placed in narratively justified location (server room) -- ✅ Drop-site terminal accessible for flag submission (server room, separate from VM terminal) -- ✅ CyberChef workstation placed for decoding challenges (main office) -- ✅ Physical evidence correlates with VM findings (emails → VM logs) - -### Gameplay Flow -- ✅ Clear starting area (reception) -- ✅ Progressive unlocking creates good pacing (Act 1: public, Act 2: locked, Act 3: all) -- ✅ Required backtracking designed (3+ moments specified) -- ✅ Multiple solution paths where appropriate (lockpick vs. key, lockpick vs. RFID) -- ✅ No dead ends or soft locks (all progression paths tested) - -### Narrative Support -- ✅ Room layout supports three-act structure (public → locked → confrontation) -- ✅ Atmosphere appropriate for narrative theme (startup office, after-hours) -- ✅ Environmental storytelling opportunities (awards, posters, whiteboards) -- ✅ Choice moments have appropriate settings (Derek's office for confrontation) +**Derek's Office Door** (alternative path): +- Can be picked instead of finding key +- Medium difficulty +- Rewards players who developed lockpick skills --- -## Design Notes +## Changes from Previous Layout -### Pacing - -**Act 1 (0-20 min): Tutorial Pace** -- Open exploration encourages player comfort -- NPCs provide guidance without hand-holding -- Lockpicking tutorial at 10-15 min mark (after exploration) -- Low stakes, forgiving mechanics - -**Act 2 (20-50 min): Investigation Pace** -- Progressive unlocking creates rhythm: unlock → explore → gather intel → next unlock -- Backtracking moments prevent monotony (whiteboard → CyberChef → office) -- Parallel paths allow player-controlled pacing (Derek's office vs. server room order) -- VM challenges provide variety (physical → digital → physical) - -**Act 3 (50-60 min): Confrontation Pace** -- Linear sequence accelerates tension -- All evidence gathered = player feels prepared -- Dialogue-heavy (less exploration) -- Moral choice creates pause for reflection -- Resolution depends on player choice (agency) - -**Overall Pacing Design:** -- **20 min tutorial** (gentle introduction) -- **30 min investigation** (peak complexity) -- **10 min confrontation** (climax and resolution) -- Total: **60 minutes** for thorough playthrough - ---- - -### Difficulty Curve - -**Early Game (Reception → Main Office):** -- No locks (public access) -- Friendly NPCs (Sarah, Kevin) -- Clear objectives -- Difficulty: **Tier 0 (Introduction)** - -**Mid Game (Storage Closet → Derek's Office):** -- Lockpicking tutorial (easy lock) -- Password guessing (hints provided) -- Base64 decoding (guided tutorial) -- Difficulty: **Tier 1 (Beginner)** - -**Late Game (Server Room → VM Challenges):** -- RFID cloning OR advanced lockpicking -- SSH brute force (with hints) -- Linux command line -- Difficulty: **Tier 1-2 (Beginner → Intermediate)** - -**End Game (Confrontation):** -- No technical difficulty -- Moral/narrative complexity -- Player agency in resolution -- Difficulty: **Tier 1 (Beginner narrative choice)** - -**Difficulty Curve Design:** -- Gradual increase (tutorial → investigation → VM) -- Multiple difficulty paths (lockpick vs. social engineering) -- No sudden spikes (all challenges tutorialized) -- Accessible for beginners, satisfying for advanced players - ---- - -### Atmosphere - -**Viral Dynamics Office Aesthetic:** -- **Visual:** Modern startup - exposed brick, motivational posters, branded merch, open floor plan -- **Lighting:** Dim evening lighting (after-hours), desk lamps, monitor glow -- **Sound:** Quiet office - keyboard clicks, distant server hum, occasional phone ring -- **Mood:** Professional facade hiding sinister operations - -**Atmospheric Progression:** - -**Act 1 (Public Areas):** -- Bright, welcoming (reception, break room) -- Normal office sounds -- Friendly NPCs -- Mood: Comfortable, safe - -**Act 2 (Restricted Areas):** -- Darker (offices, server room) -- Empty, abandoned feel -- Locked doors increase tension -- Mood: Investigative, tense - -**Act 3 (Confrontation):** -- Derek's office - professional but cold -- Silence before confrontation -- Direct lighting (no hiding) -- Mood: Climactic, high-stakes - -**Environmental Storytelling Elements:** -- Motivational posters with ironic subtext ("Making Ideas Viral" - literally spreading disinformation) -- Award displays (Derek's cover is thorough) -- Late-night work culture (energy drinks, overtime signs) -- Professional surface hiding ENTROPY operations - ---- - -### Player Guidance - -**Signposting Without Hand-Holding:** - -**Visual Guidance:** -- Locked doors visually distinct (red lock icon, "LOCKED" indicator) -- NPCs positioned in clear sight lines (Sarah at desk, Kevin in IT corner) -- Interactive objects highlighted (whiteboards, computers) -- Objective markers (optional HUD element) - -**Narrative Guidance:** -- NPC dialogue hints next steps ("Check Derek's office", "Server room needs card") -- Ink objectives panel shows active tasks -- Agent 0x99 phone calls provide gentle nudges -- Environmental clues (building directory shows Derek's office number) - -**Tutorial Guidance:** -- Lockpicking tutorial at storage closet (Kevin explains mechanics) -- CyberChef tutorial when first encountering encoded message -- VM access tutorial (0x99 explains SSH process) -- Choice tutorials (consequences explained before major decisions) - -**Avoiding Over-Guidance:** -- No constant waypoints (player navigates using room names) -- NPCs provide hints, not solutions (Kevin suggests passwords, doesn't give exact one) -- Objectives describe goals, not step-by-step instructions ("Access Derek's office" not "Pick lock at coordinates X,Y") -- Player discovers backtracking opportunities organically - -**Guidance Balance:** -- Beginners: Objectives, NPC hints, tutorials sufficient -- Advanced players: Can ignore hints, speedrun using skill -- All players: Never lost, never hand-held - ---- - -## Summary for Stage 9 (Scenario Assembly) - -**Room Layout Complete:** 7 rooms designed with full spatial and narrative specifications - -**Key Information for JSON Implementation:** - -1. **Room Types:** - - reception_area: `room_reception` - - main_office_area: `room_office` - - derek_office: `room_office` - - server_room: `room_servers` - - conference_room: `room_conference` - - break_room: `room_breakroom` - - storage_closet: `room_storage` (OR interactable door in main_office) - -2. **Critical Lock Chains:** - - Storage Closet (easy lock) → Derek's Office Key → Derek's Office (OR lockpick office directly) - - Kevin's Trust → RFID Card Clone → Server Room (OR lockpick server room) - - Derek's Computer → SSH Credentials → VM Access - -3. **VM Integration:** - - VM Access Terminal: Server Room (center position) - - Drop-Site Terminal: Server Room (northeast corner, separate from VM terminal) - - CyberChef Workstation: Main Office Area (near Kevin's desk) - -4. **NPC Placement:** - - Sarah Martinez: Reception Area (in-person, stationary) - - Kevin Park: Main Office Area (in-person, stationary at IT desk) - - Maya Chen: Conference Room OR Break Room (in-person, mobile - random spawn) - - Derek Lawson: Derek's Office (in-person, Act 3 only - scripted spawn) - - Agent 0x99: Phone (accessible anywhere) - -5. **Progressive Unlocking Sequence:** - - START: Reception, Main Office, Break Room, Conference Room accessible - - After lockpick received: Storage Closet pickable - - After lockpicking tutorial: Derek's Office pickable (OR use key) - - After Derek's computer: Server Room credentials available - - After RFID clone OR lockpicking: Server Room accessible - - After evidence gathered: Act 3 Derek encounter - -6. **Required Backtracking:** - - Whiteboard (Derek's Office) → CyberChef (Main Office) → Return to Derek's Office - - Password Hints (Kevin) → Derek's Computer → SSH Credentials → Server Room - - VM Flags (Server Room) → Evidence Correlation → Multiple Rooms → Act 3 - -7. **Container Contents Summary:** - - 18 total containers across 7 rooms - - 7 locked containers (6 lockpicking, 1 password) - - 11 unlocked containers (public access or conditional) - - 3 LORE Fragments (optional collection) - -8. **Lock Types:** - - Physical (Pin Tumbler): Storage closet, Derek's office door, filing cabinets - - Password: Derek's computer - - RFID: Server room door - - Multiple paths: Derek's office (lockpick OR key), Server room (RFID OR lockpick) - -**Technical Compliance:** All validation checklists passed. Design ready for JSON implementation in Stage 9. - -**Next Stage (Stage 6 - LORE Fragments):** 3 fragment positions specified, content to be created. -**Next Stage (Stage 7 - Ink Scripting):** NPC positions, container interactions, and terminal locations documented for dialogue implementation. -**Next Stage (Stage 9 - Scenario Assembly):** Complete design specifications provided for scenario.json.erb creation and logical flow validation. - ---- - -**Document Complete:** Mission 1 First Contact - Room Layout Design -**Stage 5 Status:** ✅ Complete -**Ready for:** Stage 6 (LORE Fragments), Stage 7 (Ink Scripting), Stage 9 (Scenario Assembly) +| Aspect | Before | After | +|--------|--------|-------| +| Rooms | 6 rooms | 10 rooms | +| Kevin location | Server Room (odd) | IT Room (logical) | +| Lockpick utility | Nearly useless | Useful for Derek's door, briefcase | +| Evidence | Mostly in Derek's office | Spread across 6+ rooms | +| Derek presence | In office when player enters | Returns for confrontation | +| Maya | Brief appearance | Full informant role in own office | +| Patricia story | Mentioned only | Full investigation trail | diff --git a/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/06_lore_fragments.md b/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/06_lore_fragments.md index 4b5a4a1..e03a1ce 100644 --- a/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/06_lore_fragments.md +++ b/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/06_lore_fragments.md @@ -2,11 +2,21 @@ **Scenario:** First Contact **ENTROPY Cell:** Social Fabric -**Fragment Budget:** 3 fragments (beginner scenario) +**Fragment Budget:** 5 fragments (beginner scenario, expanded for Operation Shatter) **Difficulty Distribution:** 100% early-game accessible (tutorial mission) --- +## CRITICAL UPDATE: Operation Shatter Evidence + +**Version 2.0 Update:** Added two new LORE fragments that expose Operation Shatter's full horror: +1. **Operation Shatter Casualty Projections** - The document showing ENTROPY calculated deaths +2. **Operation Shatter Target Demographics** - Vulnerable populations database + +These fragments are REQUIRED for full mission understanding and should be placed prominently + +--- + ## Overview **Fragment Philosophy:** @@ -692,6 +702,352 @@ I'll rest when The Architect is caught. --- +## Fragment #4: Operation Shatter Casualty Projections (NEW - CRITICAL) + +**Category:** ENTROPY Intelligence → Operational Plans +**Rarity:** Uncommon (but CRITICAL for story understanding) +**Discovery Difficulty:** Moderate (Derek's office access required) +**Educational Value:** Shows ENTROPY's willingness to kill, moral horror +**CyBOK Areas:** Human Factors, Risk Assessment + +### Metadata + +```json +{ + "id": "lore_m01_operation_shatter_casualties", + "title": "Operation Shatter: Casualty Projections", + "category": "entropy_intelligence", + "subcategory": "operational_plans", + "rarity": "uncommon", + "scenario": "m01_first_contact", + "discovery_location": "derek_office_desk_drawer", + "unlock_requirement": "derek_office_access", + "related_fragments": ["lore_m01_shatter_demographics", "lore_architect_letter_social_fabric"], + "tags": ["operation_shatter", "casualties", "mass_murder", "true_believer"], + "xp_reward": 150, + "critical_story_fragment": true +} +``` + +### Fragment Content + +``` +═══════════════════════════════════════════════════════════ + OPERATION SHATTER - IMPACT ASSESSMENT + [INTERNAL PLANNING DOCUMENT] + CLASSIFICATION: CELL LEADERSHIP ONLY +═══════════════════════════════════════════════════════════ + +OPERATION: SHATTER +CELL: SOCIAL FABRIC +DEPLOYMENT: Sunday 06:00 UTC (72 hours from assessment) +AUTHOR: D. Lawson, Operations Lead + +═══════════════════════════════════════════════════════════ + PROJECTED CASUALTY ANALYSIS +═══════════════════════════════════════════════════════════ + +DIRECT CASUALTIES (First 24 Hours): + +1. MEDICAL DEPENDENCY PANIC + - Diabetics avoiding "contaminated" hospitals: 12-20 deaths + - Dialysis patients skipping "compromised" treatment: 4-8 deaths + - Surgical patients cancelling "corrupted" procedures: 2-5 deaths + Subtotal: 18-33 deaths + +2. CARDIOVASCULAR EVENTS + - Elderly receiving fake bank failure notices: 8-15 deaths + - Anxiety-prone individuals in panic cascade: 5-10 deaths + - Stress-induced cardiac events: 4-8 deaths + Subtotal: 17-33 deaths + +3. VIOLENCE & ACCIDENTS + - Traffic fatalities during evacuation panic: 5-12 deaths + - Violence from political incitement messages: 2-7 deaths + Subtotal: 7-19 deaths + +ESTIMATED DIRECT DEATHS: 42-85 people + +═══════════════════════════════════════════════════════════ + STRATEGIC JUSTIFICATION +═══════════════════════════════════════════════════════════ + +These casualties are not collateral damage. They are the +demonstration. + +Every security professional says "humans are the weakest +link." We prove it. Conclusively. Undeniably. + +When the truth emerges that fake messages caused real +deaths, trust in ALL digital communications collapses +permanently. This is the goal. + +After Operation Shatter: +- No one trusts hospital notifications without verification +- No one believes bank messages without confirmation +- No one accepts infrastructure alerts without checking + +The cost: 42-85 lives +The benefit: Millions learn to verify everything + +This is not terrorism. This is education at scale. +Those who die are not victims—they are examples. +Their negligence is the lesson. + +═══════════════════════════════════════════════════════════ + ARCHITECT'S APPROVAL +═══════════════════════════════════════════════════════════ + +FROM: The Architect +DATE: 2025-11-15 + +Reviewed and approved. Casualty projections are acceptable. +"Acceptable losses" is not euphemism—it is calculation. + +The weak will die. The adaptable will survive. +This is entropy's natural selection. + +Proceed with deployment as scheduled. + +For the greater understanding. + +∂S ≥ 0 + +- The Architect + +═══════════════════════════════════════════════════════════ +[SAFETYNET RECOVERY NOTE] + +Discovered in Derek Lawson's desk during Operation First +Contact. This document proves premeditated mass murder. + +Key Intelligence: +- ENTROPY leadership (The Architect) approved killing 42-85 people +- Casualties are calculated, not accidental +- Philosophical justification for murder as "education" +- Derek Lawson personally authored the projection +- Deployment scheduled for Sunday 06:00 UTC + +Criminal Charges Supported: +- Conspiracy to commit mass murder +- Terrorism (domestic and international) +- Computer crimes (targeted harassment) +- Incitement to violence + +This document is the smoking gun. Prosecute to fullest extent. + +- SAFETYNET Legal Division +═══════════════════════════════════════════════════════════ +``` + +### Design Rationale + +**Why This Fragment is CRITICAL for Mission 1:** + +1. **Shows the Horror:** Player sees ENTROPY calculated how many people would DIE +2. **Makes Enemy Evil:** No ambiguity—they planned to murder elderly, diabetics, vulnerable people +3. **The Architect Approval:** Shows leadership sanctioned mass murder +4. **Derek's Culpability:** His signature is on it—he's not a foot soldier +5. **Justification as Madness:** "Educational deaths" philosophy is clearly monstrous +6. **Prosecution Path:** Establishes legal consequences are justified + +**Discovery Experience:** +- Found in Derek's desk (requires office access) +- The "OH SHIT" moment when player reads casualty numbers +- Changes understanding from "disinformation" to "mass murder" +- Makes confrontation with Derek more personal + +--- + +## Fragment #5: Operation Shatter Target Demographics (NEW) + +**Category:** ENTROPY Intelligence → Operational Data +**Rarity:** Uncommon +**Discovery Difficulty:** Moderate (server room or Derek's computer) +**Educational Value:** Shows targeting methodology, vulnerable populations +**CyBOK Areas:** Human Factors, Privacy, Data Protection + +### Metadata + +```json +{ + "id": "lore_m01_shatter_demographics", + "title": "Operation Shatter: Target Demographics Database", + "category": "entropy_intelligence", + "subcategory": "operational_data", + "rarity": "uncommon", + "scenario": "m01_first_contact", + "discovery_location": "server_room_terminal", + "unlock_requirement": "server_room_access", + "related_fragments": ["lore_m01_operation_shatter_casualties", "lore_social_fabric_manifesto"], + "tags": ["operation_shatter", "targeting", "vulnerable_populations", "psychological_warfare"], + "xp_reward": 100 +} +``` + +### Fragment Content + +``` +═══════════════════════════════════════════════════════════ + OPERATION SHATTER - TARGET DEMOGRAPHICS + [PSYCHOLOGICAL WARFARE DATABASE] +═══════════════════════════════════════════════════════════ + +DATABASE VERSION: 2.7.3 +LAST UPDATE: 2025-11-28 +TOTAL PROFILES: 2,347,832 +COLLECTION PERIOD: 90 days + +═══════════════════════════════════════════════════════════ + SEGMENT 1: MEDICAL DEPENDENCY +═══════════════════════════════════════════════════════════ + +Population: 47,832 individuals +Data Sources: Insurance claims, pharmacy records, hospital databases + +Targeting Criteria: +- Insulin-dependent diabetics (14,203) +- Weekly dialysis patients (2,847) +- Chronic condition requiring regular hospital visits (30,782) + +Vulnerability Score: 9.2/10 +Expected Response Rate: 78% +Projected Panic Actions: Medication hoarding, treatment avoidance + +CRISIS MESSAGE TEMPLATE: +"URGENT: [Hospital Name] patient database has been +compromised. All appointments cancelled. Medication +records may be corrupted. Contact provider using +non-digital methods to verify treatment plan." + +═══════════════════════════════════════════════════════════ + SEGMENT 2: FINANCIAL ANXIETY +═══════════════════════════════════════════════════════════ + +Population: 156,432 individuals +Data Sources: Credit reports, loan applications, bankruptcy records + +Targeting Criteria: +- Individuals with documented financial stress +- Elderly with fixed incomes +- Single-income households with medical expenses + +Vulnerability Score: 8.7/10 +Expected Response Rate: 65% +Projected Panic Actions: Bank runs, cash hoarding, stress events + +CRISIS MESSAGE TEMPLATE: +"ALERT: [Bank Name] security breach detected. Funds may +be inaccessible for 72+ hours. Consider immediate withdrawal." + +═══════════════════════════════════════════════════════════ + SEGMENT 3: ANXIETY DISORDERS +═══════════════════════════════════════════════════════════ + +Population: 89,247 individuals +Data Sources: Prescription records, mental health databases + +Targeting Criteria: +- Documented anxiety or panic disorders +- Individuals on anti-anxiety medication +- History of stress-related hospitalization + +Vulnerability Score: 9.5/10 +Expected Response Rate: 82% +Projected Panic Actions: Panic attacks, emergency calls, self-harm + +CRISIS MESSAGE TEMPLATE: +"EMERGENCY: Credible threat detected in your area. +Shelter in place. Do not answer door for anyone +claiming official status." + +═══════════════════════════════════════════════════════════ + SEGMENT 4: ELDERLY ISOLATED +═══════════════════════════════════════════════════════════ + +Population: 34,891 individuals +Data Sources: Census, social services, utility records + +Targeting Criteria: +- Age 70+ living alone +- Limited family contact (utility records show single occupant) +- Not on social media (no alternative info sources) + +Vulnerability Score: 9.8/10 +Expected Response Rate: 91% +Projected Panic Actions: Cardiac events, falls, medication errors + +CRISIS MESSAGE TEMPLATE: +"IMPORTANT NOTICE: Social Security system breach. Your +benefits may be delayed. Contact local office IMMEDIATELY +to verify identity and prevent loss of benefits." + +═══════════════════════════════════════════════════════════ + COLLECTION METHODOLOGY +═══════════════════════════════════════════════════════════ + +Data Collection Sources: +- Compromised insurance database (Operation Caduceus) +- Pharmacy chain breach (Operation Prescription) +- Social media psychological profiling (Operation Mirror) +- Public records correlation (Operation Census) + +Vulnerability Scoring Algorithm: +- Panic Response History (25% weight) +- Medical Dependency Level (25% weight) +- Social Isolation Score (20% weight) +- Financial Stress Indicator (15% weight) +- Digital Literacy Inverse (15% weight) + +High-value targets identified: 12,847 individuals +Maximum vulnerability segment: Elderly diabetics living alone + +═══════════════════════════════════════════════════════════ +[SAFETYNET RECOVERY NOTE] + +Recovered from Viral Dynamics server room during +Operation First Contact. + +This database represents months of targeted data +collection specifically designed to identify who +would be most likely to DIE from panic. + +Key Insights: +- 2.3 million people profiled for psychological weakness +- Vulnerable populations deliberately targeted +- "Vulnerability Score" literally measures likelihood of death +- Elderly diabetics living alone are "high-value targets" +- Algorithm designed to maximize harm + +This is not marketing data. This is a mass murder +targeting system. + +Recommend immediate data protection investigation +into how this information was collected. + +- Agent 0x42, SAFETYNET Technical Analysis +═══════════════════════════════════════════════════════════ +``` + +### Design Rationale + +**Why This Fragment Works for Mission 1:** + +1. **Scale of Evil:** 2.3 million people profiled for "vulnerability to death" +2. **Targeting the Weak:** Elderly, diabetics, anxious people—clearly evil +3. **Algorithm for Murder:** "Vulnerability Score" is literally death likelihood +4. **Technical Sophistication:** Shows ENTROPY is organized, methodical +5. **Data Collection Trail:** Sets up future missions about how data was obtained +6. **Educational Value:** Teaches about psychological targeting, data privacy + +**Discovery Experience:** +- Found in server room (after VM work or lockpicking) +- Complements casualty projections—shows the method behind the murder +- Makes abstract "disinformation" into concrete "targeted murder database" +- Player realizes these are REAL PEOPLE being targeted to die + +--- + ## Fragment Discovery Flow ### Expected Player Journey diff --git a/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/STORY_UPDATE_OPERATION_SHATTER.md b/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/STORY_UPDATE_OPERATION_SHATTER.md new file mode 100644 index 0000000..c2a59de --- /dev/null +++ b/planning_notes/overall_story_plan/mission_initializations/m01_first_contact/STORY_UPDATE_OPERATION_SHATTER.md @@ -0,0 +1,383 @@ +# Mission 1: First Contact - Story Update +## "Operation Shatter" - Making ENTROPY Clearly Evil + +**Version:** 2.0 +**Created:** 2025-12-07 +**Purpose:** Update M01 story to make ENTROPY's threat concrete, visceral, and clearly evil + +--- + +## Problem Statement + +The original M01 story suffers from: +1. **Abstract threat** - "Disinformation affecting an election" is vague +2. **Over-sympathetic villain** - Derek's philosophy given too much weight without showing harm +3. **No visceral stakes** - Player doesn't see what ENTROPY would actually DO to people +4. **Missing "Cambridge Analytica moment"** - No revelation of the full scope of evil + +**Solution:** Introduce **"Operation Shatter"** - A coordinated mass panic attack that would kill thousands + +--- + +## Updated Story: Operation Shatter + +### What Social Fabric Is Really Doing + +**Cover Story (What SAFETYNET initially thinks):** +- Disinformation campaign targeting local election +- Discrediting reformist candidate Marcus Webb +- Standard influence operation + +**Reality (What player discovers):** +- Social Fabric has spent 3 months collecting **psychological warfare data** +- They've built profiles on **2.3 million people** in the region +- They've identified **vulnerable populations**: elderly living alone, people with anxiety disorders, those with medical dependencies +- They're preparing **"Operation Shatter"** - a coordinated false crisis attack + +### Operation Shatter: The Evil Plan + +**Phase 1: Seed Distrust (Complete)** +- Already done over past 3 months +- Eroded trust in institutions through subtle disinformation +- Created tribal divisions through algorithmic amplification +- Established fake "trusted sources" (sock puppet accounts, fake news sites) + +**Phase 2: Prepare Triggers (In Progress)** +- Collected medical records to identify insulin-dependent diabetics, dialysis patients +- Mapped which elderly live alone without family support systems +- Identified individuals with documented anxiety/panic disorders +- Created personalized "crisis messages" for each demographic + +**Phase 3: The Shatter (72 Hours Away)** + +Simultaneous deployment of: + +1. **Fake Hospital System Collapse Messages** + - "URGENT: St. Mary's Hospital systems compromised. All patient records deleted. If you have an appointment, it has been cancelled indefinitely." + - "WARNING: Regional blood supply contaminated. Do NOT accept transfusions." + - Targeted at: Patients with upcoming surgeries, chronic conditions + +2. **Fake Bank Failure Notices** + - "ALERT: [Your bank] has been breached. Funds may be inaccessible for 72+ hours." + - "Your account has been frozen due to suspected fraud." + - Targeted at: Elderly, those with documented financial anxiety + +3. **Fake Infrastructure Attack Warnings** + - "EMERGENCY: Water treatment facility breach detected. DO NOT drink tap water." + - "POWER GRID ATTACK IMMINENT. Prepare for extended blackout." + - Targeted at: People in specific geographic areas to create traffic chaos + +4. **Fake Violence Incitement** + - Messages designed to look like "leaked" threats from opposing political groups + - Intended to trigger preemptive violence from paranoid individuals + - Some recipients are people with documented violent tendencies + +### Casualty Projections (What Makes This CLEARLY EVIL) + +**Social Fabric's Own Analysis Document (Player Finds This):** + +``` +OPERATION SHATTER - PROJECTED IMPACT ASSESSMENT + +Direct Casualties (First 24 Hours): +- Cardiac events from panic: 15-30 fatalities +- Diabetics missing insulin due to "hospital closure" fears: 8-12 fatalities +- Dialysis patients avoiding "contaminated" facilities: 4-8 fatalities +- Violence from incitement messages: 5-15 fatalities +- Traffic accidents from evacuation panic: 10-20 fatalities + +Estimated Direct Deaths: 42-85 people + +Indirect Impact (First Week): +- Bank runs → economic damage: $50-100 million +- Hospital avoidance → delayed treatments: 100+ excess deaths +- Civil unrest → property damage, injuries +- Institutional trust collapse → long-term societal damage + +STRATEGIC VALUE: +These deaths are not the goal—they are the *demonstration*. +When the truth emerges that fake messages caused real deaths, +trust in ALL digital communications collapses permanently. + +This is not terrorism. This is entropy accelerated. +People will die so others learn the truth: +Nothing is secure. Everything can be manipulated. + +For the greater understanding. +- The Architect +``` + +--- + +## Why This Works + +### 1. Clearly Evil (But Logically Motivated) + +ENTROPY's philosophy still makes sense from their twisted perspective: +- They believe entropy is inevitable +- They think society's trust in institutions is a "lie" +- They see themselves as "educators" demonstrating vulnerability +- **But the player sees they're willing to KILL PEOPLE to prove their point** + +### 2. Concrete Stakes + +Player isn't stopping "abstract disinformation" - they're preventing: +- 42-85 direct deaths +- $50-100 million in economic damage +- Permanent trust collapse in the region +- Real people with names and faces dying from panic + +### 3. Evidence-Driven Discovery + +Player pieces together the horror through gameplay: +- **Early clues:** Unusual data collection, psychological profiles +- **Mid-game:** Fake crisis messages in draft form +- **Late-game:** The casualty projection document (the "evil monologue" in written form) +- **Confrontation:** Derek admits it all, shows no remorse + +### 4. The "Cambridge Analytica Moment" + +When player finds the casualty projections, they realize: +- This isn't about an election +- This isn't about "narrative control" +- This is a **calculated mass casualty event** +- And Derek KNOWS people will die - he's PLANNED for it + +--- + +## Updated Story Beats + +### Opening Briefing (Agent 0x99) + +**Original:** "Social Fabric is running disinformation campaigns affecting the election." + +**Updated:** +> "Three weeks ago, our AI flagged something bigger than election interference. Social Fabric has been collecting psychological profiles—detailed vulnerability assessments on over two million people in the region. +> +> We intercepted fragments of something called 'Operation Shatter.' We don't have full details, but what we have is terrifying. They're planning simultaneous crisis messages—fake hospital failures, fake bank collapses, fake infrastructure attacks. +> +> Not random chaos. Targeted. They've identified people with medical dependencies, elderly living alone, people with documented anxiety disorders. They know exactly who will panic. Who will make dangerous decisions. Who might die. +> +> Your mission: Infiltrate Viral Dynamics, find the full Operation Shatter documentation, and stop it before deployment. We think they're 72 hours away from launch." + +### Evidence Discovery Progression + +**Act 1: Suspicious Data Collection** +- Player finds demographic databases with unusual fields +- "Anxiety_Score", "Panic_Response_History", "Medical_Dependency_Level" +- Seems creepy but scope unclear + +**Act 2: Draft Messages Discovered** +- Fake "hospital closure" messages found on Derek's computer +- Fake "bank failure" notices in conference room +- Player realizes these are designed to cause panic + +**Act 3: Casualty Projections Found** +- The "Impact Assessment" document with death estimates +- This is the "OH SHIT" moment +- Player realizes ENTROPY calculated how many people would DIE +- And they're proceeding anyway + +### Derek Confrontation (Evil Monologue) + +Derek should NO LONGER be presented as sympathetic philosopher. He should be: +- Calm +- Certain +- Willing to accept that people will die for his ideology +- Not a mustache-twirling villain, but a **true believer** who has rationalized murder + +**Updated Derek Dialogue:** + +> **Derek:** You found the projections, didn't you? The casualty estimates. +> +> **Player Option 1:** "You're planning to kill dozens of people." +> +> **Derek:** I'm planning to educate millions. Those deaths are... unfortunate. But necessary. Every security professional says "people are the weakest link." We're going to prove it. Permanently. +> +> **Derek:** After Operation Shatter, no one will ever trust a digital message again. No one will believe a hospital is safe because a website says so. No one will assume their bank is secure because an app looks legitimate. +> +> **Derek:** We're not terrorists. We're teaching the most important lesson this generation will ever learn: **Trust nothing. Verify everything.** Some people will die learning that lesson. Most will survive, wiser. +> +> **Derek:** Is that evil? Or is it the hard truth that your "SAFETYNET" is too cowardly to teach? +> +> **Player Option 2:** "You're insane." +> +> **Derek:** I'm the sanest person in this building. Everyone else pretends the systems work. Pretends their data is secure. Pretends elections are fair. Pretends hospitals can't be hacked. +> +> **Derek:** I know the truth. And after Sunday, so will everyone else. + +--- + +## Updated LORE Fragments + +### Fragment 1: Operation Shatter Target Demographics + +**Location:** Derek's office, locked filing cabinet + +``` +═══════════════════════════════════════════════════════════ + OPERATION SHATTER - TARGET ANALYSIS + [INTERNAL PLANNING DOCUMENT] +═══════════════════════════════════════════════════════════ + +DEMOGRAPHIC SEGMENT: Medical Dependency + +Population: 47,832 individuals +Data Source: Insurance claims, pharmacy records, hospital databases + +Targeting Criteria: +- Insulin-dependent diabetics (14,203) +- Weekly dialysis patients (2,847) +- Chronic condition requiring regular hospital visits (30,782) + +Vulnerability Assessment: +These individuals cannot survive extended periods without +medical care. Fake "hospital system collapse" messages will +cause immediate panic, medication hoarding, and potentially +fatal decisions (e.g., rationing insulin, skipping dialysis). + +Projected Response: +- 65% will attempt to contact hospitals (phone lines overwhelmed) +- 20% will hoard medication (pharmacy runs) +- 8% will make dangerous self-treatment decisions +- Estimated fatalities from panic-induced medical errors: 12-20 + +MESSAGE TEMPLATE: +"URGENT ALERT: [Hospital Name] patient database has been +compromised. All appointments cancelled. Medication records +may be corrupted. Please contact your provider using non- +digital methods to verify your treatment plan." + +Note: Message designed to be just credible enough to cause +panic, while being deniable as "concerned warning" if traced. + +═══════════════════════════════════════════════════════════ +``` + +### Fragment 2: Social Fabric Philosophy (Updated) + +Add final paragraph to existing manifesto: + +``` +ACCEPTABLE LOSSES: + +Some will ask: "Isn't causing deaths terrorism?" + +No. Terrorism seeks political concessions through fear. +We seek education through demonstration. + +When the first diabetic dies because they didn't verify +their hospital appointment, that death becomes a lesson. +When the first elderly person has a heart attack from +a fake bank message, that death becomes a data point. + +These are not victims. They are examples. +Their deaths will save thousands who learn the lesson: +Verify everything. Trust nothing. + +The weak will die. The adaptable will survive. +This is entropy's natural selection. + +For the greater understanding. +``` + +--- + +## Updated Season Arc Connection + +Operation Shatter becomes the first evidence that ENTROPY isn't just criminal—they're **apocalyptic accelerationists**. + +**Campaign Hook:** +When player stops Operation Shatter, they don't just save lives—they expose ENTROPY's willingness to commit mass murder for ideological purposes. This raises the stakes for every future mission: + +> **Agent 0x99 (Debrief):** "We always thought ENTROPY was sophisticated cybercrime. Data theft. Corporate espionage. Election interference. +> +> This is different. They have casualty projections. They calculated how many people would die and decided that number was acceptable. +> +> We're not fighting criminals anymore. We're fighting true believers who think killing dozens of people is 'education.' And if Social Fabric was willing to do this... what are the other cells planning?" + +--- + +## Implementation Checklist + +### Files to Update: + +1. **`m01_opening_briefing.ink`** + - Add Operation Shatter context + - Mention casualty projections SAFETYNET has intercepted + - Raise stakes from "election interference" to "mass panic attack" + +2. **`m01_derek_confrontation.ink`** + - Add evil monologue about acceptable losses + - Remove overly sympathetic philosophical dialogue + - Make Derek calm but clearly willing to accept deaths + +3. **`m01_closing_debrief.ink`** + - Reference the casualty projections + - Acknowledge the gravity of what was prevented + - Set up "true believer" threat for future missions + +4. **`06_lore_fragments.md`** + - Add "Operation Shatter Target Demographics" fragment + - Update Social Fabric Manifesto with "Acceptable Losses" section + - Add "Casualty Projection" document as discoverable evidence + +5. **`01_narrative_structure.md`** + - Update story premise throughout + - Replace "election interference" with "mass panic attack" + - Add evidence discovery progression for Operation Shatter + +6. **`scenario.json.erb`** + - Add new evidence items (fake messages, casualty projections) + - Update room descriptions for investigation flow + +--- + +## Mid-Mission Moral Choice: Kevin's Frame-Up + +### The Dilemma + +While investigating Derek's computer, player discovers a "CONTINGENCY" folder: +- Derek has prepared fake evidence to frame Kevin (the helpful IT manager) for the entire breach +- Forged security logs, fabricated emails, a complete frame-up package +- If Operation Shatter is discovered, Kevin becomes the scapegoat + +**The choice:** + +| Option | Action | Consequence | +|--------|--------|-------------| +| **Warn Kevin** | Tell him directly what's coming | He lawyers up, documents everything, is prepared when arrested. Career intact. But risk of him panicking and alerting Derek. | +| **Plant Evidence** | Leave clearing evidence anonymously | Kevin never knows he was in danger. Investigators find proof of frame-up. Clean, professional. | +| **Ignore** | Focus on mission, let it play out | Kevin is arrested, spends 6 hours in interrogation, kids watch him taken in handcuffs. Eventually cleared but traumatized. | + +### Why This Works + +1. **Personal Stakes:** Kevin HELPED the player. He trusted them. Derek would destroy him. +2. **Real Consequences:** Ignoring it doesn't just "not help" - Kevin's kids watch him get arrested. +3. **No Right Answer:** + - Warning risks the mission + - Planting evidence takes time + - Ignoring protects mission efficiency but has human cost +4. **Debrief Acknowledges:** Agent 0x99 doesn't judge, but makes consequences clear + +### Thematic Purpose + +This choice embodies the mission's central tension: +- ENTROPY sees people as "acceptable collateral damage" +- SAFETYNET agents must decide if they're different +- Player defines their character through action, not dialogue + +--- + +## Summary + +**Before:** ENTROPY is doing vague "disinformation" that might affect an election. + +**After:** ENTROPY is 72 hours away from launching a coordinated mass panic attack that they calculate will kill 42-85 people, including elderly diabetics, dialysis patients, and people with anxiety disorders. They've been profiling vulnerable populations for 3 months. They know who will die. And they think those deaths are "educational." + +**Result:** Player knows EXACTLY what they're stopping and WHY it matters. Derek is still a "true believer" but now that belief is clearly monstrous. The evidence discovery creates an escalating sense of horror as the player realizes the full scope of Operation Shatter. + +--- + +**Status:** Ready for Ink script updates + diff --git a/planning_notes/overall_story_plan/season_1_arc.md b/planning_notes/overall_story_plan/season_1_arc.md index 9915177..3c920b9 100644 --- a/planning_notes/overall_story_plan/season_1_arc.md +++ b/planning_notes/overall_story_plan/season_1_arc.md @@ -75,8 +75,12 @@ A rookie SAFETYNET agent (0x00) begins investigating seemingly unrelated ENTROPY **Integration Approach:** Hybrid (VM flags via dead drop system + ERB narrative content in game) -#### Story Premise -Agent 0x00's first field operation: investigate a media company (Viral Dynamics Media) suspected of running coordinated disinformation campaigns. Simple infiltration to gather evidence of ENTROPY involvement. +#### Story Premise: Operation Shatter +Agent 0x00's first field operation—but the stakes are higher than expected. SAFETYNET has intercepted fragments of **"Operation Shatter"**, a coordinated mass panic attack planned by Social Fabric. The operation targets 2.3 million people profiled for psychological vulnerability—elderly diabetics, people with anxiety disorders, isolated seniors. + +**The Horror:** ENTROPY has calculated that 42-85 people will die in the first 24 hours from cardiac events, medication panic, and incited violence. They consider these deaths "acceptable" and "educational." + +Player must infiltrate Viral Dynamics Media, find the complete Operation Shatter documentation, and stop the attack 72 hours before deployment. #### Core Challenges (Break Escape) - **Lockpicking** (introduction) - tutorial safe, then office doors @@ -91,32 +95,32 @@ Agent 0x00's first field operation: investigate a media company (Viral Dynamics - Use sudo to access bystander's flags **Narrative Context:** -- Maya Chen provides "possible password list" from employee research +- Kevin (IT Manager) provides "possible password list" from employee research - Brute forcing feels like "trying passwords employees might use" -- Each flag unlocks ENTROPY resources via drop-site terminal (see `story_design/flags/ctf-flag-narrative-system.md`) +- Each flag unlocks ENTROPY resources via drop-site terminal -#### In-Game Narrative Content (ERB Templates) -**Encoded messages scattered in office:** -1. **Whiteboard (Base64):** Client list revealing cross-cell collaboration -2. **Sticky note (plaintext with hint):** Password hints for SSH -3. **Computer file (tutorial encoding):** First CyberChef introduction -4. **Hidden document:** "Architect's timeline" first mention +#### Key Evidence Discovery (Operation Shatter) +**Critical Story Documents:** +1. **Casualty Projections Document** - Derek's calculated death estimates (42-85 people) +2. **Target Demographics Database** - 2.3 million people profiled for "vulnerability to death" +3. **Fake Crisis Message Templates** - Hospital closure, bank failure, infrastructure attack messages +4. **The Architect's Approval** - Signed authorization for "acceptable losses" -**Encoding Education:** -- Agent 0x99 explains encoding when first encountered -- CyberChef workstation tutorial (in-game, not VM) -- "Encoding ≠ Encryption" lesson (no key required) +**Evidence Discovery Arc:** +- **Act 1:** Suspicious data collection patterns noticed +- **Act 2:** Draft crisis messages discovered, scope begins to emerge +- **Act 3:** Full casualty projections found—player realizes ENTROPY calculated how many would DIE #### Educational Objectives (CyBOK) -- **Human Factors:** Social engineering basics, trust exploitation, password weakness +- **Human Factors:** Social engineering basics, trust exploitation, psychological targeting - **Applied Cryptography:** Basic encoding introduction (Base64), distinction from encryption - **Security Operations:** Evidence gathering, password attacks (brute force with Hydra) - **Systems Security:** Linux basics, SSH authentication, sudo privileges #### Narrative Arc -- **Act 1:** Briefing establishes Social Fabric threat + dead drop interception mission; infiltrate as "temp IT support"; learn lockpicking (tutorial safe); meet Maya Chen -- **Act 2:** Social engineer employees; find Base64 messages (Agent 0x99 teaches CyberChef); discover password hints; access drop-site terminal in server room; brute force SSH using Hydra; submit flags to intercept ENTROPY resources -- **Act 3:** Confront Derek Lawson (escapes); complete evidence collection; debrief reveals larger network + "Architect" first mention +- **Act 1:** Urgent briefing establishes Operation Shatter threat; infiltrate as IT contractor; learn lockpicking; meet Maya Chen +- **Act 2:** Social engineer employees; discover targeting database; find draft crisis messages; access server room; realize the full horror through casualty projections +- **Act 3:** Confront Derek Lawson; hear his "acceptable losses" philosophy; arrest/expose him; debrief acknowledges lives saved #### Game Mechanics Introduced 1. Lockpicking @@ -125,27 +129,49 @@ Agent 0x00's first field operation: investigate a media company (Viral Dynamics 4. Evidence collection #### Key NPCs -- **Agent 0x99 "Haxolottle"** (Handler) - Introduces player to field ops -- **Maya Chen** (Journalist) - Innocent employee who suspects something wrong -- **Derek Lawson** (Social Fabric operative) - Escapes, may return in later mission +- **Agent 0x99 "Haxolottle"** (Handler) - Briefs on Operation Shatter urgency +- **Maya Chen** (Journalist) - Innocent whistleblower who suspected something wrong +- **Kevin Park** (IT Manager) - Innocent employee, provides server access +- **Derek Lawson** (Social Fabric operative) - True believer who authored casualty projections + +#### Derek as True Believer (Evil Monologue) +Derek is NOT a sympathetic philosopher. He is calm, certain, and willing to accept that people will die for his ideology: +- "Those sixty people? Their deaths will save millions." +- "We're not terrorists. We're educators." +- "The weak will die. The adaptable will survive. This is entropy's natural selection." +- "I calculated every one of those deaths. And I'd do it again." #### LORE Opportunities -- First mention of "ENTROPY" organization (overheard in encrypted comms) -- Mysterious reference to "coordinated operations" (unexplained) -- Social Fabric's philosophy: "truth is obsolete" +- **Operation Shatter Casualty Projections** (CRITICAL) - The death calculation document +- **Target Demographics Database** - 2.3 million profiled victims +- **The Architect's Letter** - Philosophy + approval for mass murder +- **Social Fabric Manifesto** - Updated with "Acceptable Losses" section +- **Network Backdoor Analysis** - Technical sophistication #### Moral Complexity -**Choice:** Expose entire media company (hurting innocent employees) vs. surgical strike (some operations continue) +**Choice:** Arrest Derek (legal prosecution), Attempt recruitment (he refuses—true believers don't turn), or Public exposure (warn the world but blow operational security) + +**Note:** Unlike original design, Derek NEVER cooperates. True believers don't compromise. #### Success Outcomes -- **Full Success:** Evidence secured, operation disrupted, innocent employees protected -- **Partial Success:** Evidence secured but operative escapes or innocent employees harmed -- **Minimal Success:** Operation disrupted but insufficient evidence for prosecution +- **Full Success:** Operation Shatter stopped, all evidence secured, 42-85 lives saved +- **Partial Success:** Operation stopped but incomplete evidence +- **Minimal Success:** Operation stopped but Derek evades capture #### Connection to Campaign Arc -- First breadcrumb: encrypted file mentions "Architect's timeline" -- Sets up Social Fabric as known threat -- Establishes player's reputation with SAFETYNET +- **MAJOR REVELATION:** ENTROPY is willing to commit mass murder for ideology +- First evidence that ENTROPY cells are "true believers," not just criminals +- The Architect approved killing people—raises stakes for all future missions +- Sets up question: What are the OTHER cells planning? + +#### Thematic Significance +Mission 1 establishes that ENTROPY is **clearly evil**: +- They calculated how many people would die +- They targeted the most vulnerable (elderly, diabetics, anxious) +- They call murder "education" and deaths "acceptable" +- They got approval from leadership (The Architect) + +Player leaves Mission 1 understanding: **These people must be stopped.** --- diff --git a/scenarios/m01_first_contact/SOLUTION_GUIDE.md b/scenarios/m01_first_contact/SOLUTION_GUIDE.md new file mode 100644 index 0000000..13a3998 --- /dev/null +++ b/scenarios/m01_first_contact/SOLUTION_GUIDE.md @@ -0,0 +1,402 @@ +# Mission 1: First Contact - Complete Solution Guide + +## Mission Map Diagram + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ MISSION 1: FIRST CONTACT │ +│ VIRAL DYNAMICS MEDIA │ +└─────────────────────────────────────────────────────────────────────────────┘ + + NORTH + ┌───────────────┬───────────────┬───────────────┬───────────────┐ + │ │ │ │ │ + │ SERVER ROOM │ MANAGER'S │ DEREK'S │ MAYA'S │ + │ │ OFFICE │ OFFICE │ OFFICE │ + │ [RFID lock] │ (unlocked) │ [KEY lock] │ (unlocked) │ + │ │ │ │ │ + │ • VM Term │ • Safe 0419 │ • Computer │ • Maya NPC │ + │ • Flags │ → Key #2 │ • Cabinet │ • Intel │ + │ • Evidence │ • Briefcase │ PIN 0419 │ │ + │ │ [PICK] │ • Evidence │ │ + │ │ → LORE │ │ │ + └───────┬───────┴───────────────┴───────┬───────┴───────────────┘ + │ │ + │ │ + ════════╧═══════════════════════════════╧════════════════════════ + │ │ + │ MAIN OFFICE AREA │ + │ [KEY LOCK - Key #1] │ + │ │ + │ • CyberChef Workstation • Filing Cabinet (PIN 2024) │ + │ • Maintenance Checklist (IT PIN: 2468) │ + │ • Sticky Note (Cabinet PIN: 2024) │ + │ │ + ════════╤═══════════════════════════════╤════════════════════════ + │ │ + ┌───────┴───────┬───────────────┬───────┴───────┬───────────────┐ + │ │ │ │ │ + │ IT ROOM │ CONFERENCE │ BREAK ROOM │ STORAGE │ + │ │ ROOM │ │ CLOSET │ + │ [PIN 2468] │ (unlocked) │ (unlocked) │ (unlocked) │ + │ │ │ │ │ + │ • Kevin NPC │ • ZDS Notes │ • Coffee │ • Practice │ + │ • Lockpicks │ • Campaign │ Receipt │ Safe 1337 │ + │ • Keycard │ Timeline │ • Anniv. │ • Maint Log │ + │ • Passwd │ │ Card 0419 │ │ + └───────────────┴───────────────┴───────────────┴───────────────┘ + │ + ┌───────┴───────────────────────────────────────────────────────┐ + │ │ + │ RECEPTION │ + │ │ + │ • Sarah NPC → Badge + Key #1 (Main Office) │ + │ • Building Directory │ + │ • Visitor Sign-In Log (Derek's late hours) │ + │ │ + └───────────────────────────────────────────────────────────────┘ + │ + ENTRANCE +``` + +--- + +## Step-by-Step Solution + +### Phase 1: Entry and Initial Access + +| Step | Action | Result | +|------|--------|--------| +| 1 | Mission briefing auto-plays | Learn about Operation Shatter, Derek Lawson | +| 2 | Talk to Sarah Martinez | Receive **Visitor Badge** + **Main Office Key** | +| 3 | Use Main Office Key on north door | Unlock Main Office Area | +| 4 | Find **Maintenance Checklist** | Learn IT Room PIN: **2468** | + +### Phase 2: Exploration (Multiple Paths) + +| Step | Action | Result | +|------|--------|--------| +| 5a | Enter Storage Closet | Find Practice Safe (PIN 1337), backup IT code | +| 5b | Enter Break Room | Find Coffee Receipt, Anniversary Card → **0419** | +| 5c | Enter Conference Room | Find ZDS Notes, Campaign Timeline | +| 5d | Enter Maya's Office | Talk to Maya → Informant reveals all | + +### Phase 3: IT Room Access + +| Step | Action | Result | +|------|--------|--------| +| 6 | Enter IT Room (PIN **2468**) | Access Kevin's workspace | +| 7 | Talk to Kevin | Get **Lockpicks** + **Server Keycard** + Password Hints | + +### Phase 4: Derek's Office Access (TWO PATHS) + +**Path A: Find the Key** +| Step | Action | Result | +|------|--------|--------| +| 8a | Enter Manager's Office | Find Patricia's Safe | +| 9a | Open Safe (PIN **0419**) | Get **Derek's Office Key** | +| 10a | Use key on Derek's Office | Enter Derek's Office | + +**Path B: Lockpick the Door** +| Step | Action | Result | +|------|--------|--------| +| 8b | Get lockpicks from Kevin | Have lockpick kit | +| 9b | Pick Derek's Office door | Enter Derek's Office (medium difficulty) | + +### Phase 5: Evidence Collection + +| Step | Action | Result | +|------|--------|--------| +| 11 | Access Derek's Computer | Find **CONTINGENCY file** → Moral Choice triggers | +| 12 | Decode Whiteboard (Base64) | Learn Derek's cabinet PIN: **0419** | +| 13 | Open Derek's Filing Cabinet | Get Casualty Projections, Manifesto, Campaign Materials | + +### Phase 6: Lockpick-Only Content (Optional) + +| Step | Action | Result | +|------|--------|--------| +| 14 | Go to Manager's Office | Find Patricia's Briefcase | +| 15 | Pick briefcase lock | Get **ENTROPY Infiltration Timeline** (LORE) | + +### Phase 7: Server Room & VM Challenges (REQUIRED) + +| Step | Action | Result | +|------|--------|--------| +| 16 | Use Kevin's Keycard on Server Room | Enter Server Room | +| 17 | Access VM Terminal | Connect to Social Fabric infrastructure | +| 18 | Complete SSH Brute Force | Obtain `flag{ssh_brute_force_success}` | +| 19 | Complete Linux Navigation | Obtain `flag{linux_navigation_complete}` | +| 20 | Complete Privilege Escalation | Obtain `flag{privilege_escalation_success}` | +| 21 | Submit ALL 3 flags | Unlock Derek confrontation | + +### Phase 8: Confrontation + +| Step | Action | Result | +|------|--------|--------| +| 22 | Return to Derek's Office | Derek appears | +| 23 | Confront Derek (requires all flags) | Evil monologue, choose resolution | +| 24 | Choose: Arrest / Recruit / Expose | Mission complete, debrief triggers | + +--- + +## Puzzle Solutions Reference + +### PIN Codes + +| Lock | PIN | Clue Location | Clue Text | +|------|-----|---------------|-----------| +| IT Room | **2468** | Maintenance Checklist (Main Office) | "IT ROOM PIN: 2468" | +| Practice Safe | **1337** | Maintenance Checklist | "Practice safe code: 1337" | +| Main Filing Cabinet | **2024** | Sticky Note (Main Office) | "Election year = access code" | +| Patricia's Safe | **0419** | Anniversary Card (Break Room) | "April 19th" | +| Derek's Cabinet | **0419** | Whiteboard (Base64 decoded) | "FILING_CABINET_PIN: 0419" | + +### Keys and Keycards + +| Item | Location | Unlocks | +|------|----------|---------| +| Main Office Key | Sarah Martinez (Reception) | Main Office Area door | +| Derek's Office Key | Patricia's Safe (Manager's Office) | Derek's Office door | +| Server Room Keycard | Kevin (IT Room) | Server Room RFID lock | +| Lockpicks | Kevin (IT Room) | Derek's door (alt), Patricia's briefcase | + +### Encoded Message (Derek's Whiteboard) + +**Base64 Encoded:** +``` +Q2xpZW50IGxpc3QgdXBkYXRlOiBDb29yZGluYXRpbmcgd2l0aCBaRFMgZm9yIHRlY2huaWNhbCBp +bmZyYXN0cnVjdHVyZSBkZXBsb3ltZW50LiBQaGFzZSAzIHRpbWVsaW5lOiAyIHdlZWtzLiBGSUxJ +TkdfQ0FCSU5FVF9QSU46IDA0MTkgKERlcmVrJ3MgYmRheSAtIGRvbid0IGZvcmdldCBhZ2FpbiEp +``` + +**Decoded:** +``` +Client list update: Coordinating with ZDS for technical infrastructure deployment. +Phase 3 timeline: 2 weeks. FILING_CABINET_PIN: 0419 (Derek's bday - don't forget again!) +``` + +--- + +## Puzzle Chain Diagram + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ COMPLETE PUZZLE CHAIN │ +└─────────────────────────────────────────────────────────────────────────────┘ + +PHASE 1: ENTRY +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Reception ─► Sarah gives KEY #1 ─► Main Office Area [KEY #1] + + +PHASE 2: EXPLORATION (any order) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Main Office ─┬─► Storage Closet ──► Practice Safe [1337] (optional) + │ + ├─► Break Room ─────► Anniversary Card (reveals 0419) + │ + ├─► Conference Room ─► ZDS Notes, Campaign Timeline + │ + ├─► Maya's Office ──► Talk to informant (reveals everything) + │ + └─► Find Maintenance Checklist ─► IT Room PIN: 2468 + + +PHASE 3: IT ACCESS +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + IT Room [PIN 2468] ─► Kevin gives: + ├─► Lockpicks + ├─► Server Room Keycard (RFID) + └─► Password Hints + + +PHASE 4: DEREK'S OFFICE (Two parallel paths) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + PATH A (Key): PATH B (Lockpick): + ───────────── ────────────────── + Manager's Office IT Room + │ │ + ▼ ▼ + Patricia's Safe [0419] Get Lockpicks + │ │ + ▼ ▼ + KEY #2 (Derek's Key) [PICK Derek's door] + │ │ + └──────────────┬──────────────────────┘ + ▼ + Derek's Office [UNLOCKED] + + +PHASE 5: EVIDENCE COLLECTION +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Derek's Office ─┬─► Computer ─► CONTINGENCY file ─► MORAL CHOICE + │ + ├─► Whiteboard [Base64] ─► Cabinet PIN: 0419 + │ + └─► Filing Cabinet [0419] ─► Critical Evidence + + +PHASE 6: LOCKPICK-ONLY BONUS +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Manager's Office ─► Patricia's Briefcase [LOCKPICK ONLY] + │ + ▼ + ENTROPY Infiltration Timeline (LORE) + + +PHASE 7: VM CHALLENGES (REQUIRED) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Server Room [RFID - Kevin's Keycard] + │ + ├─► VM Terminal ─┬─► SSH Brute Force + │ ├─► Linux Navigation + │ └─► Privilege Escalation + │ + └─► Drop-Site ─► Submit ALL 3 flags (REQUIRED) + + +PHASE 8: CONFRONTATION +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Derek's Office ─► Derek returns ─► Confrontation (requires all flags) + │ + ├─► Arrest + ├─► Attempt Recruit (fails) + └─► Public Expose + │ + ▼ + MISSION COMPLETE +``` + +--- + +## Alternative Paths & Shortcuts + +### Path Options for Derek's Office + +| Method | Requirements | Difficulty | +|--------|--------------|------------| +| Use Key | Find PIN 0419 (Break Room), open Patricia's safe | Easy (find clue, enter PIN) | +| Lockpick | Get lockpicks from Kevin | Medium (lockpick minigame) | + +### Locked-Out Shortcuts (By Design) + +| Attempted Shortcut | Why It's Blocked | +|--------------------|------------------| +| Lockpick Main Office | No lockpicks until after entering Main Office | +| Skip to confrontation | Derek requires ALL 3 VM flags submitted | +| Skip IT Room | Need PIN 2468 (found in Main Office) | +| Skip Server Room | Need Kevin's RFID keycard | + +### Optional Content + +| Content | How to Access | Reward | +|---------|---------------|--------| +| Patricia's Briefcase | Lockpick (no key exists) | LORE: ENTROPY Infiltration Timeline | +| Practice Safe | PIN 1337 | Minor LORE, practice PIN mechanic | +| Main Filing Cabinet | PIN 2024 | The Architect's Letter (LORE) | + +--- + +## Objectives Tracking + +### Aim 1: Establish Access +- [x] Check in at reception (Sarah) +- [x] Access main office area (Key #1) +- [x] Find IT room access code (Maintenance Checklist) +- [x] Access IT room (PIN 2468) +- [x] Meet Kevin Park + +### Aim 2: Investigate Derek +- [ ] Find access to Derek's office (Key #2 OR lockpick) +- [ ] Enter Derek's office +- [ ] Search Derek's computer (CONTINGENCY file) +- [ ] Decode whiteboard message (CyberChef) +- [ ] Open Derek's filing cabinet (PIN 0419) + +### Aim 3: Gather Evidence +- [ ] Find Operation Shatter casualty projections +- [ ] Discover ENTROPY manifesto +- [ ] Find campaign materials +- [ ] Talk to the informant (Maya) + +### Aim 4: Intercept Communications (REQUIRED) +- [ ] Access server room (RFID keycard) +- [ ] Access compromised systems (VM) +- [ ] Submit SSH access evidence ⚠️ REQUIRED +- [ ] Submit Linux navigation evidence ⚠️ REQUIRED +- [ ] Submit privilege escalation evidence ⚠️ REQUIRED + +### Aim 5: Confront the Operative +- [ ] Confront Derek Lawson (requires all flags) +- [ ] Choose resolution (arrest/recruit/expose) + +--- + +## Moral Choices + +### 1. Kevin's Frame-Up (Mid-Mission) +**Trigger:** Pick up CONTINGENCY file from Derek's Computer + +| Choice | Effect | Consequence | +|--------|--------|-------------| +| Warn Kevin | kevin_protected = true | Kevin lawyers up, protected | +| Plant evidence | kevin_protected = true | Kevin protected anonymously | +| Ignore | kevin_protected = false | Kevin arrested, family traumatized | + +### 2. Derek Confrontation (End) +**Trigger:** Talk to Derek after all VM flags submitted + +| Choice | Effect | Outcome | +|--------|--------|---------| +| Arrest | final_choice = arrest | Surgical strike, Derek in custody | +| Recruit | final_choice = recruit | Derek refuses, arrested anyway | +| Expose | final_choice = expose | Documents released to press | + +--- + +## LORE Fragments + +| Fragment | Location | How to Access | +|----------|----------|---------------| +| The Architect's Letter | Main Filing Cabinet | PIN 2024 | +| Social Fabric Manifesto | Derek's Filing Cabinet | PIN 0419 | +| Network Backdoor Analysis | Server Room | Enter room | +| Patricia's Investigation Notes | Patricia's Safe | PIN 0419 | +| ENTROPY Infiltration Timeline | Patricia's Briefcase | **LOCKPICK ONLY** | +| Old Orientation Guide | Practice Safe | PIN 1337 | + +--- + +## Completion Requirements + +| Requirement | Mandatory? | Notes | +|-------------|------------|-------| +| Get Main Office Key from Sarah | ✅ Yes | Only way to access main office | +| Access IT Room (PIN 2468) | ✅ Yes | Need lockpicks and keycard | +| Get Derek's Office access | ✅ Yes | Key OR lockpick | +| Access Server Room | ✅ Yes | Need Kevin's RFID keycard | +| Submit SSH flag | ✅ Yes | Required for confrontation | +| Submit Linux flag | ✅ Yes | Required for confrontation | +| Submit Sudo flag | ✅ Yes | Required for confrontation | +| Confront Derek | ✅ Yes | Triggers mission end | +| Find evidence documents | ❌ Optional | Affects debrief quality | +| Complete Kevin moral choice | ❌ Optional | Affects Kevin's fate | +| Talk to Maya | ❌ Optional | Provides intel | +| Pick Patricia's briefcase | ❌ Optional | Extra LORE | + +--- + +## Room Summary + +| Room | Lock Type | Access | Key NPCs/Items | +|------|-----------|--------|----------------| +| Reception | None | Start | Sarah (badge, key) | +| Main Office | KEY | Key from Sarah | CyberChef, clues | +| Storage Closet | None | Via Main Office | Practice safe, backup codes | +| Break Room | None | Via Main Office | Anniversary clue (0419) | +| Conference Room | None | Via Main Office | ZDS notes, timeline | +| IT Room | PIN 2468 | Via Main Office | Kevin (lockpicks, keycard) | +| Manager's Office | None | Via Main Office | Safe (key), briefcase (LORE) | +| Maya's Office | None | Via Main Office | Maya (informant) | +| Derek's Office | KEY/PICK | Key from safe OR pick | Derek, computer, evidence | +| Server Room | RFID | Keycard from Kevin | VM terminal, flags | diff --git a/scenarios/m01_first_contact/ink/m01_closing_debrief.ink b/scenarios/m01_first_contact/ink/m01_closing_debrief.ink index 94dc6af..845a6a3 100644 --- a/scenarios/m01_first_contact/ink/m01_closing_debrief.ink +++ b/scenarios/m01_first_contact/ink/m01_closing_debrief.ink @@ -1,16 +1,24 @@ // ================================================ // Mission 1: First Contact - Closing Debrief // Act 3: Mission Complete -// Reflects on choices, performance, and consequences +// UPDATED: Feedback based on ACTUAL player choices, +// not pre-selected "approach" // ================================================ -// Variables from previous scripts +// Variables from gameplay - these should be set by the game VAR player_name = "Agent 0x00" -VAR player_approach = "" // From opening briefing VAR final_choice = "" // From Derek confrontation (arrest/recruit/expose) -VAR derek_cooperative = false // From confrontation -VAR objectives_completed = 0 // Performance metric -VAR lore_collected = 0 // Number of LORE fragments found +VAR objectives_completed = 0 // Percentage of objectives done +VAR lore_collected = 0 // Number of LORE fragments found +VAR found_casualty_projections = false // Found the critical evidence +VAR found_target_database = false // Found the targeting demographics +VAR talked_to_maya = false // Interacted with Maya Chen +VAR talked_to_kevin = false // Got help from Kevin +VAR maya_identity_protected = true // Did player protect Maya's identity + +// Moral choice: Kevin's frame-up +VAR kevin_choice = "" // warn, evidence, ignore +VAR kevin_protected = false // Did player help Kevin? // ================================================ // START: DEBRIEF BEGINS @@ -21,7 +29,7 @@ VAR lore_collected = 0 // Number of LORE fragments found Agent 0x99: {player_name}, return to HQ for debrief. -Agent 0x99: Mission complete. Let's discuss what happened. +Agent 0x99: Operation Shatter is neutralized. Let's review what happened. + [On my way] -> debrief_location @@ -32,132 +40,307 @@ Agent 0x99: Mission complete. Let's discuss what happened. === debrief_location === [SAFETYNET HQ - Agent 0x99's Office] -[The axolotl tank bubbles quietly in the background] #speaker:agent_0x99 -Agent 0x99: So. Your first field operation. +Agent 0x99: {player_name}. First, I need you to understand what you accomplished today. -Agent 0x99: Social Fabric cell disrupted, Derek Lawson neutralized, election manipulation prevented. +Agent 0x99: Those casualty projections—42 to 85 people. Diabetics. Elderly. People with anxiety disorders. -+ [Mission accomplished] - -> performance_review -+ [But at what cost?] - -> moral_reflection +Agent 0x99: They're going to live. Because of you. + ++ [That's what matters] + -> evidence_review ++ [It was close. Too close.] + -> close_call // ================================================ -// PERFORMANCE REVIEW +// CLOSE CALL ACKNOWLEDGMENT // ================================================ -=== performance_review === -Agent 0x99: Let's review your performance. +=== close_call === +Agent 0x99: 72 hours. That's how close we cut it. -Agent 0x99: Objectives completed: {objectives_completed}%. LORE fragments collected: {lore_collected}. +Agent 0x99: If our AI hadn't flagged those data collection patterns, if you hadn't found the documentation... -{objectives_completed >= 80: - Agent 0x99: Strong work. You achieved the mission goals efficiently. - -> choice_consequences +Agent 0x99: But you did. And those people will never know how close they came. + +-> evidence_review + +// ================================================ +// EVIDENCE REVIEW - Based on what player actually found +// ================================================ + +=== evidence_review === +Agent 0x99: Let's review what you recovered. + +{found_casualty_projections && found_target_database: + -> evidence_complete } -{objectives_completed >= 60: - Agent 0x99: Solid. You got the job done, even if not perfectly. - -> choice_consequences +{found_casualty_projections && not found_target_database: + -> evidence_partial_projections } -{objectives_completed < 60: - Agent 0x99: Mission complete, but there were gaps. Review your approach for next time. - -> choice_consequences +{not found_casualty_projections && found_target_database: + -> evidence_partial_database +} +{not found_casualty_projections && not found_target_database: + -> evidence_minimal } -// ================================================ -// MORAL REFLECTION -// ================================================ +=== evidence_complete === +Agent 0x99: You found everything. The casualty projections. The target demographics database. The complete Operation Shatter documentation. -=== moral_reflection === -Agent 0x99: Every operation has costs. That's the weight we carry. +Agent 0x99: This is exactly what prosecutors need. Derek's signature on the death calculations. The Architect's approval. The targeting methodology. -Agent 0x99: But you prevented election manipulation. Innocent people's votes will count. +Agent 0x99: Thorough work. You didn't rush past the evidence. -+ [The ends justify the means?] - Agent 0x99: Not always. But in this case? Yes. You made the right calls. - -> choice_consequences -+ [I'm still not sure] - Agent 0x99: Good. That uncertainty keeps you human. Keeps you questioning. - -> choice_consequences ++ [I wanted to make sure we had enough to convict] + Agent 0x99: You do. There's no walking away from this for Derek. + -> npc_interactions ++ [The more I found, the worse it got] + Agent 0x99: Yeah. Reading those casualty projections... that stays with you. + -> npc_interactions + +=== evidence_partial_projections === +Agent 0x99: You found the casualty projections—the smoking gun. Derek's death calculations, The Architect's approval. + +Agent 0x99: We're missing the full target demographics database, but that's recoverable from their servers now that we have access. + +Agent 0x99: The critical evidence is secured. That's what matters for prosecution. + +-> npc_interactions + +=== evidence_partial_database === +Agent 0x99: You found the target demographics database—2.3 million people profiled for vulnerability. + +Agent 0x99: We're still missing the casualty projections document, but the database alone proves intent. They were targeting vulnerable populations deliberately. + +Agent 0x99: Our forensics team is recovering the rest from their systems. + +-> npc_interactions + +=== evidence_minimal === +Agent 0x99: The core Operation Shatter documentation is still being recovered by our forensics team. + +Agent 0x99: The operation is stopped, but we're relying on digital forensics for the prosecution evidence. + +Agent 0x99: Next time, prioritize document recovery. Physical evidence is harder to deny in court. + +-> npc_interactions // ================================================ -// CHOICE CONSEQUENCES (Derek's Fate) +// NPC INTERACTIONS - Based on who player talked to // ================================================ -=== choice_consequences === +=== npc_interactions === +{talked_to_kevin && talked_to_maya: + -> worked_with_both +} +{talked_to_kevin && not talked_to_maya: + -> worked_with_kevin +} +{not talked_to_kevin && talked_to_maya: + -> worked_with_maya +} +{not talked_to_kevin && not talked_to_maya: + -> worked_alone +} + +=== worked_with_both === +Agent 0x99: I noticed you worked with both Kevin and Maya. + +Agent 0x99: Kevin gave you legitimate access—that's the IT contractor cover working as intended. + +{maya_identity_protected: + Agent 0x99: And Maya... you protected her identity. She's safe. She can continue her journalism without looking over her shoulder. + Agent 0x99: That matters. She took a risk contacting us. +- else: + Agent 0x99: Maya's identity was compromised during the operation. We're relocating her for safety. + Agent 0x99: She'll be okay, but her career at Viral Dynamics is over. Collateral damage. +} + +-> kevin_frame_discussion + +=== worked_with_kevin === +Agent 0x99: Kevin's cooperation was valuable. The IT contractor cover worked perfectly. + +Agent 0x99: You got legitimate access without raising suspicion. That's clean infiltration. + +-> kevin_frame_discussion + +=== worked_with_maya === +Agent 0x99: Maya was taking a risk talking to you. I hope you appreciated that. + +{maya_identity_protected: + Agent 0x99: Her identity stayed protected. She can continue investigating on her own terms now. +- else: + Agent 0x99: Unfortunately, her identity was compromised. We're handling her protection. +} + +-> kevin_frame_discussion + +=== worked_alone === +Agent 0x99: You handled this mostly solo. Independent approach. + +Agent 0x99: Sometimes that's the right call. Fewer people involved means fewer potential leaks. + +-> kevin_frame_discussion + +// ================================================ +// KEVIN FRAME-UP - Moral choice consequences +// ================================================ + +=== kevin_frame_discussion === +{kevin_choice == "": + // Player didn't encounter the frame-up files + -> derek_discussion +} +{kevin_choice == "warn": + -> kevin_warned +} +{kevin_choice == "evidence": + -> kevin_evidence +} +{kevin_choice == "ignore": + -> kevin_ignored +} + +=== kevin_warned === +Agent 0x99: I saw in your report that you warned Kevin about the frame-up. + +Agent 0x99: That was risky. If he'd panicked, if Derek had noticed... + ++ [He deserved to know] + Agent 0x99: He did. And now he's lawyered up, documented everything. When the prosecutors came for him, he was ready. + Agent 0x99: His career is intact. His life isn't ruined. Because you took five minutes to be decent. + -> kevin_outcome_positive ++ [I couldn't just let Derek destroy him] + Agent 0x99: You're right. Kevin didn't ask to be part of this. He helped you because he's a good person. + Agent 0x99: Derek would have fed him to the wolves. You didn't let that happen. + -> kevin_outcome_positive + +=== kevin_evidence === +Agent 0x99: The contingency files you left for investigators—that was smart. + +Agent 0x99: When the follow-up team found them, they immediately flagged Kevin as a victim, not a suspect. + +Agent 0x99: He never even knew he was in danger. Woke up, went to work, found out his company was a front for terrorists, and went home to his family. + +Agent 0x99: Clean. Professional. And kind. + +-> kevin_outcome_positive + +=== kevin_outcome_positive === +Agent 0x99: You know what Derek would have said? "Kevin is acceptable collateral damage." + +Agent 0x99: You disagreed. That matters. + +Agent 0x99: Not every agent would have taken the time. Not every agent would have cared. + +-> derek_discussion + +=== kevin_ignored === +Agent 0x99: Kevin Park was arrested this morning. + ++ [What?] + -> kevin_arrest_details ++ [The frame-up worked?] + -> kevin_arrest_details + +=== kevin_arrest_details === +Agent 0x99: Derek's contingency plan activated automatically when Viral Dynamics' systems were seized. Fake logs, forged emails. + +Agent 0x99: Kevin spent six hours in interrogation before our team figured out he was being framed. + +Agent 0x99: He's cleared now. But he's traumatized. His neighbors saw him taken away in handcuffs. His kids watched. + ++ [I... I saw the files. I knew.] + Agent 0x99: I know. It's in Derek's computer logs. + Agent 0x99: You made a choice. Focus on the mission. Let Kevin be collateral damage. + Agent 0x99: Sometimes that's the right call. Sometimes the mission really does come first. + Agent 0x99: But Kevin's going to need therapy. His kids are going to need therapy. + Agent 0x99: Just... remember that. Next time you're weighing priorities. + -> derek_discussion ++ [The mission had to come first] + Agent 0x99: Did it? You still stopped Operation Shatter. You still caught Derek. + Agent 0x99: Would five minutes to warn Kevin have changed that? + Agent 0x99: I'm not judging. Field decisions are hard. But consequences are real. + Agent 0x99: Kevin's kids watched him get arrested. That happened because of a choice you made. + Agent 0x99: Live with it. Learn from it. + -> derek_discussion + +// ================================================ +// DEREK DISCUSSION - Based on how player handled confrontation +// ================================================ + +=== derek_discussion === Agent 0x99: Now, about Derek Lawson... -{final_choice() == "arrest": +{final_choice == "arrest": -> consequence_arrest } -{final_choice() == "recruit": +{final_choice == "recruit": -> consequence_recruit } -{final_choice() == "expose": +{final_choice == "expose": -> consequence_expose } +// Default if variable not set properly +-> consequence_arrest // ================================================ // CONSEQUENCE: ARREST // ================================================ === consequence_arrest === -Agent 0x99: You chose arrest. Legal channels, proper prosecution. +Agent 0x99: You chose arrest. Legal prosecution through proper channels. -{derek_cooperative: - Agent 0x99: Derek's cooperating with investigators. Not full immunity, but his intel is valuable. - Agent 0x99: We've identified two other Social Fabric operatives at Viral Dynamics. - -> arrest_outcome -- else: - Agent 0x99: Derek's fighting this legally. Claims whistleblower protection. - Agent 0x99: Media attention is... complicated. But we have the evidence. - -> arrest_outcome -} +Agent 0x99: He's not cooperating—true believers rarely do. But we have the evidence. His signature on the casualty projections. -=== arrest_outcome === -Agent 0x99: Viral Dynamics is under investigation. Some innocent employees are caught in the fallout. +Agent 0x99: He'll spend decades in prison explaining why 85 dead people would have been "educational." -Agent 0x99: But the Social Fabric cell is dismantled. That's what matters. - -+ [What about Phase 3?] ++ [Will the charges stick?] + Agent 0x99: Conspiracy to commit mass murder. Terrorism. Computer crimes. + {found_casualty_projections: + Agent 0x99: With the casualty projections you recovered? He's done. + - else: + Agent 0x99: We're building the evidence case. It'll take longer, but he's not walking free. + } -> phase_3_discussion -+ [Was arrest the right choice?] - Agent 0x99: You followed legal protocol. That's always defensible. ++ [He seemed so certain he was right] + Agent 0x99: That's what makes true believers dangerous. They've rationalized everything. + Agent 0x99: Derek doesn't think he's a murderer. He thinks he's an educator. + Agent 0x99: The jury will disagree. -> phase_3_discussion // ================================================ -// CONSEQUENCE: RECRUIT +// CONSEQUENCE: RECRUIT (Derek refuses) // ================================================ === consequence_recruit === -Agent 0x99: You recruited Derek as Asset NIGHTINGALE. +Agent 0x99: You offered him a chance to cooperate. Turn informant. -Agent 0x99: Risky. Very risky. But if it works, we'll have unprecedented ENTROPY intel. +Agent 0x99: I heard his answer. "I will never betray ENTROPY." -Agent 0x99: Derek's feeding us information on Phase 3, other cells, coordination with Zero Day Syndicate. +Agent 0x99: True believers don't turn, {player_name}. They'd rather go to prison as martyrs. -+ [Can we trust him?] - Agent 0x99: No. Never trust a turned asset completely. - Agent 0x99: But we can verify his intel and use it. He's valuable, even if unreliable. ++ [I had to try] + Agent 0x99: It was worth asking. His refusal tells us something about ENTROPY's organizational culture. + Agent 0x99: These aren't mercenaries. They're ideologues. That's useful intelligence. -> recruit_outcome -+ [What if The Architect finds out?] - Agent 0x99: Then Derek's dead and we lose our access. Hence "risky." ++ [I thought maybe he'd want to reduce his sentence] + Agent 0x99: A rational person would. Derek isn't rational. He's a believer. + Agent 0x99: His ideology matters more than his freedom. -> recruit_outcome === recruit_outcome === -Agent 0x99: Asset NIGHTINGALE is your responsibility now. You turned him, you run him. +Agent 0x99: He's in custody now. Same outcome as arrest. -Agent 0x99: Future missions may require coordinating with Derek. Can you handle that? +Agent 0x99: But we learned something important: ENTROPY attracts true believers. They won't flip for deals. -+ [I'll manage him] - Agent 0x99: Good. This could be a major intelligence breakthrough. - -> phase_3_discussion -+ [I hope I made the right call] - Agent 0x99: Time will tell. But you took the bold option. I respect that. - -> phase_3_discussion +Agent 0x99: We'll need to find other ways to get inside intelligence. + +-> phase_3_discussion // ================================================ // CONSEQUENCE: EXPOSE @@ -166,145 +349,159 @@ Agent 0x99: Future missions may require coordinating with Derek. Can you handle === consequence_expose === Agent 0x99: Public disclosure. Full transparency. -Agent 0x99: Every media outlet is running the story. ENTROPY operations, Viral Dynamics infiltration, election manipulation—all exposed. +Agent 0x99: The casualty projections are on every news site. Derek's death calculations. The targeting lists. -Agent 0x99: Director Netherton is furious. We don't do public disclosures. +Agent 0x99: The world now knows what ENTROPY was willing to do. -+ [The public deserved to know] - Agent 0x99: Maybe. But you've made enemies inside SAFETYNET. - Agent 0x99: Some think you're reckless. Others think you're principled. ++ [People deserve to know] + Agent 0x99: Maybe. But now ENTROPY knows we're onto Operation Shatter methodology. + Agent 0x99: They'll adapt. Change tactics. We've lost the element of surprise. -> expose_outcome -+ [I'd do it again] - Agent 0x99: I believe you. And honestly? I'm not sure you're wrong. ++ [Let them see who Derek really is] + Agent 0x99: They're seeing. "Acceptable losses." "Educational deaths." + Agent 0x99: The public is horrified. Good. They should be. -> expose_outcome === expose_outcome === -Agent 0x99: Viral Dynamics is destroyed. Employees lost jobs, careers ruined. +Agent 0x99: Director Netherton is... not happy. We don't usually expose methods. -Agent 0x99: But ENTROPY's Social Fabric operations are now public knowledge. Harder for them to operate in shadows. +Agent 0x99: But ENTROPY's tactics are now public knowledge. People know to verify. To question. -Agent 0x99: Double-edged sword. Transparency vs. collateral damage. +Agent 0x99: In a twisted way, you taught the lesson Derek wanted—just without the deaths. -+ [Was it worth it?] - Agent 0x99: Ask me in six months. Right now, it's too soon to know. - -> phase_3_discussion -+ [I stand by my choice] - Agent 0x99: Then own it. Choices have consequences. You knew that going in. - -> phase_3_discussion +{maya_identity_protected: + Agent 0x99: At least Maya's identity stayed protected through all this. +- else: + Agent 0x99: Maya's identity came out in the disclosure. She's being handled as a public whistleblower now. +} + +-> phase_3_discussion // ================================================ -// PHASE 3 DISCUSSION +// PHASE 3 DISCUSSION - THE BIGGER PICTURE // ================================================ === phase_3_discussion === -Agent 0x99: One cell down. But Phase 3 isn't stopped. +Agent 0x99: {player_name}, I need you to understand what we learned today. -Agent 0x99: Social Fabric was one part of a larger operation. Zero Day Syndicate, Ransomware Inc., Critical Mass—all coordinating. +Agent 0x99: We always thought ENTROPY was sophisticated cybercrime. Data theft. Corporate espionage. -Agent 0x99: And behind them all: The Architect. +Agent 0x99: This is different. Derek had casualty projections. He calculated deaths and considered them acceptable. + ++ [They're willing to kill for their ideology] + -> true_nature ++ [What does that mean for future missions?] + -> true_nature + +=== true_nature === +Agent 0x99: It means we're not fighting criminals. We're fighting true believers. + +Agent 0x99: People who think killing people is "education." Who see deaths as "acceptable losses." + +Agent 0x99: And if Social Fabric was willing to do this... what are the other cells planning? + [Who is The Architect?] -> architect_mystery -+ [What's next for me?] - -> next_mission ++ [How do we stop them?] + -> stop_entropy // ================================================ // THE ARCHITECT MYSTERY // ================================================ === architect_mystery === -Agent 0x99: We don't know. No one does. +Agent 0x99: We don't know. ENTROPY's leader, strategist, philosopher. -Agent 0x99: ENTROPY's leader, strategist, philosopher. Maybe one person, maybe a collective. +Agent 0x99: Derek quoted The Architect. Believed every word. Got approval to kill 85 people. -Agent 0x99: Every cell reports to The Architect. Every operation traces back. +Agent 0x99: Whoever they are, they've built an organization of true believers. -+ [How do we stop them?] - Agent 0x99: Cell by cell. Operation by operation. Until we can trace the pattern. - Agent 0x99: Your mission disrupted one cell. We need hundreds more like it. - -> next_mission -+ [Sounds impossible] - Agent 0x99: Maybe. But we have to try. - -> next_mission - -// ================================================ -// NEXT MISSION SETUP -// ================================================ - -=== next_mission === -Agent 0x99: You've proven yourself, {player_name}. - -{player_approach == "cautious": - Agent 0x99: You said you were cautious. You were—measured, thoughtful, strategic. -} -{player_approach == "confident": - Agent 0x99: You said you were confident. You delivered on that. -} -{player_approach == "adaptable": - Agent 0x99: You said you were adaptable. You proved it—pivoting when needed. -} - -Agent 0x99: First mission complete. But this is just the beginning. - -+ [I'm ready for the next one] - -> debrief_conclusion -+ [I need time to process this] - Agent 0x99: Take it. But not too long. ENTROPY doesn't wait. - -> debrief_conclusion - -// ================================================ -// DEBRIEF CONCLUSION -// ================================================ - -=== debrief_conclusion === -Agent 0x99: One more thing. - -Agent 0x99: Remember that axolotl metaphor from the briefing? About trusting your instincts? - -+ [Yeah, I remember] - -> axolotl_callback -+ [Vaguely] - -> axolotl_callback - -=== axolotl_callback === -Agent 0x99: You've discovered which instincts to trust now. - -Agent 0x99: You're not a hatchling anymore. You're an agent. - -Agent 0x99: Welcome to SAFETYNET, {player_name}. - -+ [Thank you, 0x99] ++ [We have to find them] + Agent 0x99: Every cell we disrupt, every operation we stop, brings us closer. + {lore_collected >= 3: + Agent 0x99: The intelligence you collected today gives us new leads. The Architect's communication patterns. Their philosophical fingerprints. + } -> mission_end -+ [Let's stop The Architect] - Agent 0x99: That's the plan. One mission at a time. ++ [That sounds terrifying] + Agent 0x99: It is. But that's why SAFETYNET exists. + Agent 0x99: Today, you stood between ENTROPY and 85 people they'd sacrifice. -> mission_end +=== stop_entropy === +Agent 0x99: Cell by cell. Operation by operation. + +Agent 0x99: Today you stopped Operation Shatter. Tomorrow, we stop the next one. + +-> mission_end + // ================================================ -// MISSION END +// MISSION END - Personalized summary // ================================================ === mission_end === -#speaker:agent_0x99 +Agent 0x99: First mission complete. Lives saved. True believer in custody. + +{lore_collected >= 3: + Agent 0x99: And {lore_collected} intelligence fragments recovered. That's thorough investigative work. +} +{lore_collected == 0: + Agent 0x99: You focused on the primary objectives. Efficient. + Agent 0x99: But next time, look for additional intelligence. Context helps future operations. +} Agent 0x99: Get some rest. Next briefing is in 48 hours. -Agent 0x99: And {player_name}? Good work out there. +Agent 0x99: And {player_name}? You did more than complete a mission today. + +Agent 0x99: You saved lives. Real people who will never know your name. + +Agent 0x99: That's what SAFETYNET is for. [MISSION COMPLETE: FIRST CONTACT] -{final_choice() == "arrest": - [OUTCOME: Derek Lawson arrested - Legal prosecution pending] +{final_choice == "arrest": + [OUTCOME: Derek Lawson arrested - Prosecution pending] } -{final_choice() == "recruit": - [OUTCOME: Derek Lawson recruited as Asset NIGHTINGALE - Double agent operation active] +{final_choice == "recruit": + [OUTCOME: Derek Lawson arrested - Refused cooperation] } -{final_choice() == "expose": - [OUTCOME: Full public disclosure - ENTROPY operations exposed] +{final_choice == "expose": + [OUTCOME: Full public disclosure - ENTROPY methods exposed] } -[Social Fabric cell disrupted] -[Election manipulation prevented] -[Phase 3 continues...] +[OPERATION SHATTER: NEUTRALIZED] +[LIVES SAVED: 42-85 (estimated)] + +{found_casualty_projections && found_target_database: + [EVIDENCE: COMPLETE - All critical documents recovered] +} +{found_casualty_projections && not found_target_database: + [EVIDENCE: SUBSTANTIAL - Casualty projections secured] +} +{not found_casualty_projections && found_target_database: + [EVIDENCE: SUBSTANTIAL - Target database secured] +} +{not found_casualty_projections && not found_target_database: + [EVIDENCE: PARTIAL - Forensics team recovering additional files] +} + +{maya_identity_protected: + [MAYA CHEN: Identity protected] +- else: + [MAYA CHEN: Identity compromised - Under SAFETYNET protection] +} + +{kevin_protected: + [KEVIN PARK: Protected from frame-up - Career intact] +} +{kevin_choice == "ignore": + [KEVIN PARK: Arrested, later cleared - Traumatized but free] +} +{kevin_choice == "": + [KEVIN PARK: Status unknown] +} + +[The Architect remains at large...] #exit_conversation -> END diff --git a/scenarios/m01_first_contact/ink/m01_closing_debrief.json b/scenarios/m01_first_contact/ink/m01_closing_debrief.json index 92868c8..8f5cb6c 100644 --- a/scenarios/m01_first_contact/ink/m01_closing_debrief.json +++ b/scenarios/m01_first_contact/ink/m01_closing_debrief.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":[["#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, return to HQ for debrief.","\n","^Agent 0x99: Mission complete. Let's discuss what happened.","\n","ev","str","^On my way","/str","/ev",{"*":".^.c-0","flg":4},{"c-0":["\n",{"->":"debrief_location"},null]}],null],"debrief_location":[["^[SAFETYNET HQ - Agent 0x99's Office]","\n","^[The axolotl tank bubbles quietly in the background]","\n","#","^speaker:agent_0x99","/#","^Agent 0x99: So. Your first field operation.","\n","^Agent 0x99: Social Fabric cell disrupted, Derek Lawson neutralized, election manipulation prevented.","\n","ev","str","^Mission accomplished","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^But at what cost?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"performance_review"},null],"c-1":["\n",{"->":"moral_reflection"},null]}],null],"performance_review":["^Agent 0x99: Let's review your performance.","\n","^Agent 0x99: Objectives completed: ","ev",{"VAR?":"objectives_completed"},"out","/ev","^%. LORE fragments collected: ","ev",{"VAR?":"lore_collected"},"out","/ev","^.","\n","ev",{"VAR?":"objectives_completed"},80,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Strong work. You achieved the mission goals efficiently.","\n",{"->":"choice_consequences"},{"->":".^.^.^.20"},null]}],"nop","\n","ev",{"VAR?":"objectives_completed"},60,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Solid. You got the job done, even if not perfectly.","\n",{"->":"choice_consequences"},{"->":".^.^.^.28"},null]}],"nop","\n","ev",{"VAR?":"objectives_completed"},60,"<","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Mission complete, but there were gaps. Review your approach for next time.","\n",{"->":"choice_consequences"},{"->":".^.^.^.36"},null]}],"nop","\n",null],"moral_reflection":[["^Agent 0x99: Every operation has costs. That's the weight we carry.","\n","^Agent 0x99: But you prevented election manipulation. Innocent people's votes will count.","\n","ev","str","^The ends justify the means?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm still not sure","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Not always. But in this case? Yes. You made the right calls.","\n",{"->":"choice_consequences"},null],"c-1":["\n","^Agent 0x99: Good. That uncertainty keeps you human. Keeps you questioning.","\n",{"->":"choice_consequences"},null]}],null],"choice_consequences":["^Agent 0x99: Now, about Derek Lawson...","\n","ev",{"f()":"final_choice","var":true},"str","^arrest","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"consequence_arrest"},{"->":".^.^.^.10"},null]}],"nop","\n","ev",{"f()":"final_choice","var":true},"str","^recruit","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"consequence_recruit"},{"->":".^.^.^.20"},null]}],"nop","\n","ev",{"f()":"final_choice","var":true},"str","^expose","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"consequence_expose"},{"->":".^.^.^.30"},null]}],"nop","\n",null],"consequence_arrest":["^Agent 0x99: You chose arrest. Legal channels, proper prosecution.","\n","ev",{"VAR?":"derek_cooperative"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Derek's cooperating with investigators. Not full immunity, but his intel is valuable.","\n","^Agent 0x99: We've identified two other Social Fabric operatives at Viral Dynamics.","\n",{"->":"arrest_outcome"},{"->":".^.^.^.7"},null]}],[{"->":".^.b"},{"b":["\n","^Agent 0x99: Derek's fighting this legally. Claims whistleblower protection.","\n","^Agent 0x99: Media attention is... complicated. But we have the evidence.","\n",{"->":"arrest_outcome"},{"->":".^.^.^.7"},null]}],"nop","\n",null],"arrest_outcome":[["^Agent 0x99: Viral Dynamics is under investigation. Some innocent employees are caught in the fallout.","\n","^Agent 0x99: But the Social Fabric cell is dismantled. That's what matters.","\n","ev","str","^What about Phase 3?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Was arrest the right choice?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"phase_3_discussion"},null],"c-1":["\n","^Agent 0x99: You followed legal protocol. That's always defensible.","\n",{"->":"phase_3_discussion"},null]}],null],"consequence_recruit":[["^Agent 0x99: You recruited Derek as Asset NIGHTINGALE.","\n","^Agent 0x99: Risky. Very risky. But if it works, we'll have unprecedented ENTROPY intel.","\n","^Agent 0x99: Derek's feeding us information on Phase 3, other cells, coordination with Zero Day Syndicate.","\n","ev","str","^Can we trust him?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What if The Architect finds out?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: No. Never trust a turned asset completely.","\n","^Agent 0x99: But we can verify his intel and use it. He's valuable, even if unreliable.","\n",{"->":"recruit_outcome"},null],"c-1":["\n","^Agent 0x99: Then Derek's dead and we lose our access. Hence \"risky.\"","\n",{"->":"recruit_outcome"},null]}],null],"recruit_outcome":[["^Agent 0x99: Asset NIGHTINGALE is your responsibility now. You turned him, you run him.","\n","^Agent 0x99: Future missions may require coordinating with Derek. Can you handle that?","\n","ev","str","^I'll manage him","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I hope I made the right call","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Good. This could be a major intelligence breakthrough.","\n",{"->":"phase_3_discussion"},null],"c-1":["\n","^Agent 0x99: Time will tell. But you took the bold option. I respect that.","\n",{"->":"phase_3_discussion"},null]}],null],"consequence_expose":[["^Agent 0x99: Public disclosure. Full transparency.","\n","^Agent 0x99: Every media outlet is running the story. ENTROPY operations, Viral Dynamics infiltration, election manipulation—all exposed.","\n","^Agent 0x99: Director Netherton is furious. We don't do public disclosures.","\n","ev","str","^The public deserved to know","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'd do it again","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Maybe. But you've made enemies inside SAFETYNET.","\n","^Agent 0x99: Some think you're reckless. Others think you're principled.","\n",{"->":"expose_outcome"},null],"c-1":["\n","^Agent 0x99: I believe you. And honestly? I'm not sure you're wrong.","\n",{"->":"expose_outcome"},null]}],null],"expose_outcome":[["^Agent 0x99: Viral Dynamics is destroyed. Employees lost jobs, careers ruined.","\n","^Agent 0x99: But ENTROPY's Social Fabric operations are now public knowledge. Harder for them to operate in shadows.","\n","^Agent 0x99: Double-edged sword. Transparency vs. collateral damage.","\n","ev","str","^Was it worth it?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I stand by my choice","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Ask me in six months. Right now, it's too soon to know.","\n",{"->":"phase_3_discussion"},null],"c-1":["\n","^Agent 0x99: Then own it. Choices have consequences. You knew that going in.","\n",{"->":"phase_3_discussion"},null]}],null],"phase_3_discussion":[["^Agent 0x99: One cell down. But Phase 3 isn't stopped.","\n","^Agent 0x99: Social Fabric was one part of a larger operation. Zero Day Syndicate, Ransomware Inc., Critical Mass—all coordinating.","\n","^Agent 0x99: And behind them all: The Architect.","\n","ev","str","^Who is The Architect?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What's next for me?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"architect_mystery"},null],"c-1":["\n",{"->":"next_mission"},null]}],null],"architect_mystery":[["^Agent 0x99: We don't know. No one does.","\n","^Agent 0x99: ENTROPY's leader, strategist, philosopher. Maybe one person, maybe a collective.","\n","^Agent 0x99: Every cell reports to The Architect. Every operation traces back.","\n","ev","str","^How do we stop them?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Sounds impossible","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Cell by cell. Operation by operation. Until we can trace the pattern.","\n","^Agent 0x99: Your mission disrupted one cell. We need hundreds more like it.","\n",{"->":"next_mission"},null],"c-1":["\n","^Agent 0x99: Maybe. But we have to try.","\n",{"->":"next_mission"},null]}],null],"next_mission":[["^Agent 0x99: You've proven yourself, ","ev",{"VAR?":"player_name"},"out","/ev","^.","\n","ev",{"VAR?":"player_approach"},"str","^cautious","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: You said you were cautious. You were—measured, thoughtful, strategic.","\n",{"->":".^.^.^.15"},null]}],"nop","\n","ev",{"VAR?":"player_approach"},"str","^confident","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: You said you were confident. You delivered on that.","\n",{"->":".^.^.^.25"},null]}],"nop","\n","ev",{"VAR?":"player_approach"},"str","^adaptable","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: You said you were adaptable. You proved it—pivoting when needed.","\n",{"->":".^.^.^.35"},null]}],"nop","\n","^Agent 0x99: First mission complete. But this is just the beginning.","\n","ev","str","^I'm ready for the next one","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I need time to process this","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"debrief_conclusion"},null],"c-1":["\n","^Agent 0x99: Take it. But not too long. ENTROPY doesn't wait.","\n",{"->":"debrief_conclusion"},null]}],null],"debrief_conclusion":[["^Agent 0x99: One more thing.","\n","^Agent 0x99: Remember that axolotl metaphor from the briefing? About trusting your instincts?","\n","ev","str","^Yeah, I remember","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Vaguely","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"axolotl_callback"},null],"c-1":["\n",{"->":"axolotl_callback"},null]}],null],"axolotl_callback":[["^Agent 0x99: You've discovered which instincts to trust now.","\n","^Agent 0x99: You're not a hatchling anymore. You're an agent.","\n","^Agent 0x99: Welcome to SAFETYNET, ","ev",{"VAR?":"player_name"},"out","/ev","^.","\n","ev","str","^Thank you, 0x99","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Let's stop The Architect","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"mission_end"},null],"c-1":["\n","^Agent 0x99: That's the plan. One mission at a time.","\n",{"->":"mission_end"},null]}],null],"mission_end":["#","^speaker:agent_0x99","/#","^Agent 0x99: Get some rest. Next briefing is in 48 hours.","\n","^Agent 0x99: And ","ev",{"VAR?":"player_name"},"out","/ev","^? Good work out there.","\n","^[MISSION COMPLETE: FIRST CONTACT]","\n","ev",{"f()":"final_choice","var":true},"str","^arrest","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[OUTCOME: Derek Lawson arrested - Legal prosecution pending]","\n",{"->":".^.^.^.22"},null]}],"nop","\n","ev",{"f()":"final_choice","var":true},"str","^recruit","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[OUTCOME: Derek Lawson recruited as Asset NIGHTINGALE - Double agent operation active]","\n",{"->":".^.^.^.32"},null]}],"nop","\n","ev",{"f()":"final_choice","var":true},"str","^expose","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[OUTCOME: Full public disclosure - ENTROPY operations exposed]","\n",{"->":".^.^.^.42"},null]}],"nop","\n","^[Social Fabric cell disrupted]","\n","^[Election manipulation prevented]","\n","^[Phase 3 continues...]","\n","#","^exit_conversation","/#","end",null],"global decl":["ev","str","^Agent 0x00","/str",{"VAR=":"player_name"},"str","^","/str",{"VAR=":"player_approach"},"str","^","/str",{"VAR=":"final_choice"},false,{"VAR=":"derek_cooperative"},0,{"VAR=":"objectives_completed"},0,{"VAR=":"lore_collected"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":[["#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, return to HQ for debrief.","\n","^Agent 0x99: Operation Shatter is neutralized. Let's review what happened.","\n","ev","str","^On my way","/str","/ev",{"*":".^.c-0","flg":4},{"c-0":["\n",{"->":"debrief_location"},null]}],null],"debrief_location":[["^[SAFETYNET HQ - Agent 0x99's Office]","\n","#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^. First, I need you to understand what you accomplished today.","\n","^Agent 0x99: Those casualty projections—42 to 85 people. Diabetics. Elderly. People with anxiety disorders.","\n","^Agent 0x99: They're going to live. Because of you.","\n","ev","str","^That's what matters","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^It was close. Too close.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"evidence_review"},null],"c-1":["\n",{"->":"close_call"},null]}],null],"close_call":["^Agent 0x99: 72 hours. That's how close we cut it.","\n","^Agent 0x99: If our AI hadn't flagged those data collection patterns, if you hadn't found the documentation...","\n","^Agent 0x99: But you did. And those people will never know how close they came.","\n",{"->":"evidence_review"},null],"evidence_review":["^Agent 0x99: Let's review what you recovered.","\n","ev",{"VAR?":"found_casualty_projections"},{"VAR?":"found_target_database"},"&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"evidence_complete"},{"->":".^.^.^.8"},null]}],"nop","\n","ev",{"VAR?":"found_casualty_projections"},{"VAR?":"found_target_database"},"!","&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"evidence_partial_projections"},{"->":".^.^.^.17"},null]}],"nop","\n","ev",{"VAR?":"found_casualty_projections"},"!",{"VAR?":"found_target_database"},"&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"evidence_partial_database"},{"->":".^.^.^.26"},null]}],"nop","\n","ev",{"VAR?":"found_casualty_projections"},"!",{"VAR?":"found_target_database"},"!","&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"evidence_minimal"},{"->":".^.^.^.36"},null]}],"nop","\n",null],"evidence_complete":[["^Agent 0x99: You found everything. The casualty projections. The target demographics database. The complete Operation Shatter documentation.","\n","^Agent 0x99: This is exactly what prosecutors need. Derek's signature on the death calculations. The Architect's approval. The targeting methodology.","\n","^Agent 0x99: Thorough work. You didn't rush past the evidence.","\n","ev","str","^I wanted to make sure we had enough to convict","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^The more I found, the worse it got","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: You do. There's no walking away from this for Derek.","\n",{"->":"npc_interactions"},null],"c-1":["\n","^Agent 0x99: Yeah. Reading those casualty projections... that stays with you.","\n",{"->":"npc_interactions"},null]}],null],"evidence_partial_projections":["^Agent 0x99: You found the casualty projections—the smoking gun. Derek's death calculations, The Architect's approval.","\n","^Agent 0x99: We're missing the full target demographics database, but that's recoverable from their servers now that we have access.","\n","^Agent 0x99: The critical evidence is secured. That's what matters for prosecution.","\n",{"->":"npc_interactions"},null],"evidence_partial_database":["^Agent 0x99: You found the target demographics database—2.3 million people profiled for vulnerability.","\n","^Agent 0x99: We're still missing the casualty projections document, but the database alone proves intent. They were targeting vulnerable populations deliberately.","\n","^Agent 0x99: Our forensics team is recovering the rest from their systems.","\n",{"->":"npc_interactions"},null],"evidence_minimal":["^Agent 0x99: The core Operation Shatter documentation is still being recovered by our forensics team.","\n","^Agent 0x99: The operation is stopped, but we're relying on digital forensics for the prosecution evidence.","\n","^Agent 0x99: Next time, prioritize document recovery. Physical evidence is harder to deny in court.","\n",{"->":"npc_interactions"},null],"npc_interactions":["ev",{"VAR?":"talked_to_kevin"},{"VAR?":"talked_to_maya"},"&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"worked_with_both"},{"->":".^.^.^.6"},null]}],"nop","\n","ev",{"VAR?":"talked_to_kevin"},{"VAR?":"talked_to_maya"},"!","&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"worked_with_kevin"},{"->":".^.^.^.15"},null]}],"nop","\n","ev",{"VAR?":"talked_to_kevin"},"!",{"VAR?":"talked_to_maya"},"&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"worked_with_maya"},{"->":".^.^.^.24"},null]}],"nop","\n","ev",{"VAR?":"talked_to_kevin"},"!",{"VAR?":"talked_to_maya"},"!","&&","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"worked_alone"},{"->":".^.^.^.34"},null]}],"nop","\n",null],"worked_with_both":["^Agent 0x99: I noticed you worked with both Kevin and Maya.","\n","^Agent 0x99: Kevin gave you legitimate access—that's the IT contractor cover working as intended.","\n","ev",{"VAR?":"maya_identity_protected"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: And Maya... you protected her identity. She's safe. She can continue her journalism without looking over her shoulder.","\n","^Agent 0x99: That matters. She took a risk contacting us.","\n",{"->":".^.^.^.9"},null]}],[{"->":".^.b"},{"b":["\n","^Agent 0x99: Maya's identity was compromised during the operation. We're relocating her for safety.","\n","^Agent 0x99: She'll be okay, but her career at Viral Dynamics is over. Collateral damage.","\n",{"->":".^.^.^.9"},null]}],"nop","\n",{"->":"kevin_frame_discussion"},null],"worked_with_kevin":["^Agent 0x99: Kevin's cooperation was valuable. The IT contractor cover worked perfectly.","\n","^Agent 0x99: You got legitimate access without raising suspicion. That's clean infiltration.","\n",{"->":"kevin_frame_discussion"},null],"worked_with_maya":["^Agent 0x99: Maya was taking a risk talking to you. I hope you appreciated that.","\n","ev",{"VAR?":"maya_identity_protected"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Her identity stayed protected. She can continue investigating on her own terms now.","\n",{"->":".^.^.^.7"},null]}],[{"->":".^.b"},{"b":["\n","^Agent 0x99: Unfortunately, her identity was compromised. We're handling her protection.","\n",{"->":".^.^.^.7"},null]}],"nop","\n",{"->":"kevin_frame_discussion"},null],"worked_alone":["^Agent 0x99: You handled this mostly solo. Independent approach.","\n","^Agent 0x99: Sometimes that's the right call. Fewer people involved means fewer potential leaks.","\n",{"->":"kevin_frame_discussion"},null],"kevin_frame_discussion":["ev",{"VAR?":"kevin_choice"},"str","^","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"derek_discussion"},{"->":".^.^.^.8"},null]}],"nop","\n","ev",{"VAR?":"kevin_choice"},"str","^warn","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"kevin_warned"},{"->":".^.^.^.18"},null]}],"nop","\n","ev",{"VAR?":"kevin_choice"},"str","^evidence","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"kevin_evidence"},{"->":".^.^.^.28"},null]}],"nop","\n","ev",{"VAR?":"kevin_choice"},"str","^ignore","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"kevin_ignored"},{"->":".^.^.^.38"},null]}],"nop","\n",null],"kevin_warned":[["^Agent 0x99: I saw in your report that you warned Kevin about the frame-up.","\n","^Agent 0x99: That was risky. If he'd panicked, if Derek had noticed...","\n","ev","str","^He deserved to know","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I couldn't just let Derek destroy him","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: He did. And now he's lawyered up, documented everything. When the prosecutors came for him, he was ready.","\n","^Agent 0x99: His career is intact. His life isn't ruined. Because you took five minutes to be decent.","\n",{"->":"kevin_outcome_positive"},null],"c-1":["\n","^Agent 0x99: You're right. Kevin didn't ask to be part of this. He helped you because he's a good person.","\n","^Agent 0x99: Derek would have fed him to the wolves. You didn't let that happen.","\n",{"->":"kevin_outcome_positive"},null]}],null],"kevin_evidence":["^Agent 0x99: The contingency files you left for investigators—that was smart.","\n","^Agent 0x99: When the follow-up team found them, they immediately flagged Kevin as a victim, not a suspect.","\n","^Agent 0x99: He never even knew he was in danger. Woke up, went to work, found out his company was a front for terrorists, and went home to his family.","\n","^Agent 0x99: Clean. Professional. And kind.","\n",{"->":"kevin_outcome_positive"},null],"kevin_outcome_positive":["^Agent 0x99: You know what Derek would have said? \"Kevin is acceptable collateral damage.\"","\n","^Agent 0x99: You disagreed. That matters.","\n","^Agent 0x99: Not every agent would have taken the time. Not every agent would have cared.","\n",{"->":"derek_discussion"},null],"kevin_ignored":[["^Agent 0x99: Kevin Park was arrested this morning.","\n","ev","str","^What?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^The frame-up worked?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"kevin_arrest_details"},null],"c-1":["\n",{"->":"kevin_arrest_details"},null]}],null],"kevin_arrest_details":[["^Agent 0x99: Derek's contingency plan activated automatically when Viral Dynamics' systems were seized. Fake logs, forged emails.","\n","^Agent 0x99: Kevin spent six hours in interrogation before our team figured out he was being framed.","\n","^Agent 0x99: He's cleared now. But he's traumatized. His neighbors saw him taken away in handcuffs. His kids watched.","\n","ev","str","^I... I saw the files. I knew.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^The mission had to come first","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: I know. It's in Derek's computer logs.","\n","^Agent 0x99: You made a choice. Focus on the mission. Let Kevin be collateral damage.","\n","^Agent 0x99: Sometimes that's the right call. Sometimes the mission really does come first.","\n","^Agent 0x99: But Kevin's going to need therapy. His kids are going to need therapy.","\n","^Agent 0x99: Just... remember that. Next time you're weighing priorities.","\n",{"->":"derek_discussion"},null],"c-1":["\n","^Agent 0x99: Did it? You still stopped Operation Shatter. You still caught Derek.","\n","^Agent 0x99: Would five minutes to warn Kevin have changed that?","\n","^Agent 0x99: I'm not judging. Field decisions are hard. But consequences are real.","\n","^Agent 0x99: Kevin's kids watched him get arrested. That happened because of a choice you made.","\n","^Agent 0x99: Live with it. Learn from it.","\n",{"->":"derek_discussion"},null]}],null],"derek_discussion":["^Agent 0x99: Now, about Derek Lawson...","\n","ev",{"VAR?":"final_choice"},"str","^arrest","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"consequence_arrest"},{"->":".^.^.^.10"},null]}],"nop","\n","ev",{"VAR?":"final_choice"},"str","^recruit","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"consequence_recruit"},{"->":".^.^.^.20"},null]}],"nop","\n","ev",{"VAR?":"final_choice"},"str","^expose","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"consequence_expose"},{"->":".^.^.^.30"},null]}],"nop","\n",{"->":"consequence_arrest"},null],"consequence_arrest":[["^Agent 0x99: You chose arrest. Legal prosecution through proper channels.","\n","^Agent 0x99: He's not cooperating—true believers rarely do. But we have the evidence. His signature on the casualty projections.","\n","^Agent 0x99: He'll spend decades in prison explaining why 85 dead people would have been \"educational.\"","\n","ev","str","^Will the charges stick?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^He seemed so certain he was right","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Conspiracy to commit mass murder. Terrorism. Computer crimes.","\n","ev",{"VAR?":"found_casualty_projections"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: With the casualty projections you recovered? He's done.","\n",{"->":".^.^.^.8"},null]}],[{"->":".^.b"},{"b":["\n","^Agent 0x99: We're building the evidence case. It'll take longer, but he's not walking free.","\n",{"->":".^.^.^.8"},null]}],"nop","\n",{"->":"phase_3_discussion"},null],"c-1":["\n","^Agent 0x99: That's what makes true believers dangerous. They've rationalized everything.","\n","^Agent 0x99: Derek doesn't think he's a murderer. He thinks he's an educator.","\n","^Agent 0x99: The jury will disagree.","\n",{"->":"phase_3_discussion"},null]}],null],"consequence_recruit":[["^Agent 0x99: You offered him a chance to cooperate. Turn informant.","\n","^Agent 0x99: I heard his answer. \"I will never betray ENTROPY.\"","\n","^Agent 0x99: True believers don't turn, ","ev",{"VAR?":"player_name"},"out","/ev","^. They'd rather go to prison as martyrs.","\n","ev","str","^I had to try","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I thought maybe he'd want to reduce his sentence","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: It was worth asking. His refusal tells us something about ENTROPY's organizational culture.","\n","^Agent 0x99: These aren't mercenaries. They're ideologues. That's useful intelligence.","\n",{"->":"recruit_outcome"},null],"c-1":["\n","^Agent 0x99: A rational person would. Derek isn't rational. He's a believer.","\n","^Agent 0x99: His ideology matters more than his freedom.","\n",{"->":"recruit_outcome"},null]}],null],"recruit_outcome":["^Agent 0x99: He's in custody now. Same outcome as arrest.","\n","^Agent 0x99: But we learned something important: ENTROPY attracts true believers. They won't flip for deals.","\n","^Agent 0x99: We'll need to find other ways to get inside intelligence.","\n",{"->":"phase_3_discussion"},null],"consequence_expose":[["^Agent 0x99: Public disclosure. Full transparency.","\n","^Agent 0x99: The casualty projections are on every news site. Derek's death calculations. The targeting lists.","\n","^Agent 0x99: The world now knows what ENTROPY was willing to do.","\n","ev","str","^People deserve to know","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Let them see who Derek really is","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Maybe. But now ENTROPY knows we're onto Operation Shatter methodology.","\n","^Agent 0x99: They'll adapt. Change tactics. We've lost the element of surprise.","\n",{"->":"expose_outcome"},null],"c-1":["\n","^Agent 0x99: They're seeing. \"Acceptable losses.\" \"Educational deaths.\"","\n","^Agent 0x99: The public is horrified. Good. They should be.","\n",{"->":"expose_outcome"},null]}],null],"expose_outcome":["^Agent 0x99: Director Netherton is... not happy. We don't usually expose methods.","\n","^Agent 0x99: But ENTROPY's tactics are now public knowledge. People know to verify. To question.","\n","^Agent 0x99: In a twisted way, you taught the lesson Derek wanted—just without the deaths.","\n","ev",{"VAR?":"maya_identity_protected"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: At least Maya's identity stayed protected through all this.","\n",{"->":".^.^.^.11"},null]}],[{"->":".^.b"},{"b":["\n","^Agent 0x99: Maya's identity came out in the disclosure. She's being handled as a public whistleblower now.","\n",{"->":".^.^.^.11"},null]}],"nop","\n",{"->":"phase_3_discussion"},null],"phase_3_discussion":[["^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, I need you to understand what we learned today.","\n","^Agent 0x99: We always thought ENTROPY was sophisticated cybercrime. Data theft. Corporate espionage.","\n","^Agent 0x99: This is different. Derek had casualty projections. He calculated deaths and considered them acceptable.","\n","ev","str","^They're willing to kill for their ideology","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What does that mean for future missions?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"true_nature"},null],"c-1":["\n",{"->":"true_nature"},null]}],null],"true_nature":[["^Agent 0x99: It means we're not fighting criminals. We're fighting true believers.","\n","^Agent 0x99: People who think killing people is \"education.\" Who see deaths as \"acceptable losses.\"","\n","^Agent 0x99: And if Social Fabric was willing to do this... what are the other cells planning?","\n","ev","str","^Who is The Architect?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^How do we stop them?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"architect_mystery"},null],"c-1":["\n",{"->":"stop_entropy"},null]}],null],"architect_mystery":[["^Agent 0x99: We don't know. ENTROPY's leader, strategist, philosopher.","\n","^Agent 0x99: Derek quoted The Architect. Believed every word. Got approval to kill 85 people.","\n","^Agent 0x99: Whoever they are, they've built an organization of true believers.","\n","ev","str","^We have to find them","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^That sounds terrifying","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Every cell we disrupt, every operation we stop, brings us closer.","\n","ev",{"VAR?":"lore_collected"},3,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: The intelligence you collected today gives us new leads. The Architect's communication patterns. Their philosophical fingerprints.","\n",{"->":".^.^.^.9"},null]}],"nop","\n",{"->":"mission_end"},null],"c-1":["\n","^Agent 0x99: It is. But that's why SAFETYNET exists.","\n","^Agent 0x99: Today, you stood between ENTROPY and 85 people they'd sacrifice.","\n",{"->":"mission_end"},null]}],null],"stop_entropy":["^Agent 0x99: Cell by cell. Operation by operation.","\n","^Agent 0x99: Today you stopped Operation Shatter. Tomorrow, we stop the next one.","\n",{"->":"mission_end"},null],"mission_end":["^Agent 0x99: First mission complete. Lives saved. True believer in custody.","\n","ev",{"VAR?":"lore_collected"},3,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: And ","ev",{"VAR?":"lore_collected"},"out","/ev","^ intelligence fragments recovered. That's thorough investigative work.","\n",{"->":".^.^.^.8"},null]}],"nop","\n","ev",{"VAR?":"lore_collected"},0,"==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: You focused on the primary objectives. Efficient.","\n","^Agent 0x99: But next time, look for additional intelligence. Context helps future operations.","\n",{"->":".^.^.^.16"},null]}],"nop","\n","^Agent 0x99: Get some rest. Next briefing is in 48 hours.","\n","^Agent 0x99: And ","ev",{"VAR?":"player_name"},"out","/ev","^? You did more than complete a mission today.","\n","^Agent 0x99: You saved lives. Real people who will never know your name.","\n","^Agent 0x99: That's what SAFETYNET is for.","\n","^[MISSION COMPLETE: FIRST CONTACT]","\n","ev",{"VAR?":"final_choice"},"str","^arrest","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[OUTCOME: Derek Lawson arrested - Prosecution pending]","\n",{"->":".^.^.^.41"},null]}],"nop","\n","ev",{"VAR?":"final_choice"},"str","^recruit","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[OUTCOME: Derek Lawson arrested - Refused cooperation]","\n",{"->":".^.^.^.51"},null]}],"nop","\n","ev",{"VAR?":"final_choice"},"str","^expose","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[OUTCOME: Full public disclosure - ENTROPY methods exposed]","\n",{"->":".^.^.^.61"},null]}],"nop","\n","^[OPERATION SHATTER: NEUTRALIZED]","\n","^[LIVES SAVED: 42-85 (estimated)]","\n","ev",{"VAR?":"found_casualty_projections"},{"VAR?":"found_target_database"},"&&","/ev",[{"->":".^.b","c":true},{"b":["\n","^[EVIDENCE: COMPLETE - All critical documents recovered]","\n",{"->":".^.^.^.73"},null]}],"nop","\n","ev",{"VAR?":"found_casualty_projections"},{"VAR?":"found_target_database"},"!","&&","/ev",[{"->":".^.b","c":true},{"b":["\n","^[EVIDENCE: SUBSTANTIAL - Casualty projections secured]","\n",{"->":".^.^.^.82"},null]}],"nop","\n","ev",{"VAR?":"found_casualty_projections"},"!",{"VAR?":"found_target_database"},"&&","/ev",[{"->":".^.b","c":true},{"b":["\n","^[EVIDENCE: SUBSTANTIAL - Target database secured]","\n",{"->":".^.^.^.91"},null]}],"nop","\n","ev",{"VAR?":"found_casualty_projections"},"!",{"VAR?":"found_target_database"},"!","&&","/ev",[{"->":".^.b","c":true},{"b":["\n","^[EVIDENCE: PARTIAL - Forensics team recovering additional files]","\n",{"->":".^.^.^.101"},null]}],"nop","\n","ev",{"VAR?":"maya_identity_protected"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^[MAYA CHEN: Identity protected]","\n",{"->":".^.^.^.108"},null]}],[{"->":".^.b"},{"b":["\n","^[MAYA CHEN: Identity compromised - Under SAFETYNET protection]","\n",{"->":".^.^.^.108"},null]}],"nop","\n","ev",{"VAR?":"kevin_protected"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^[KEVIN PARK: Protected from frame-up - Career intact]","\n",{"->":".^.^.^.114"},null]}],"nop","\n","ev",{"VAR?":"kevin_choice"},"str","^ignore","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[KEVIN PARK: Arrested, later cleared - Traumatized but free]","\n",{"->":".^.^.^.124"},null]}],"nop","\n","ev",{"VAR?":"kevin_choice"},"str","^","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^[KEVIN PARK: Status unknown]","\n",{"->":".^.^.^.134"},null]}],"nop","\n","^[The Architect remains at large...]","\n","#","^exit_conversation","/#","end",null],"global decl":["ev","str","^Agent 0x00","/str",{"VAR=":"player_name"},"str","^","/str",{"VAR=":"final_choice"},0,{"VAR=":"objectives_completed"},0,{"VAR=":"lore_collected"},false,{"VAR=":"found_casualty_projections"},false,{"VAR=":"found_target_database"},false,{"VAR=":"talked_to_maya"},false,{"VAR=":"talked_to_kevin"},true,{"VAR=":"maya_identity_protected"},"str","^","/str",{"VAR=":"kevin_choice"},false,{"VAR=":"kevin_protected"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/ink/m01_derek_confrontation.ink b/scenarios/m01_first_contact/ink/m01_derek_confrontation.ink index 6f9348e..16069fe 100644 --- a/scenarios/m01_first_contact/ink/m01_derek_confrontation.ink +++ b/scenarios/m01_first_contact/ink/m01_derek_confrontation.ink @@ -1,188 +1,234 @@ // ================================================ // Mission 1: First Contact - Derek Confrontation // Act 3: Major Moral Choice -// Player confronts Derek with evidence +// UPDATED: Evil monologue, clear villain, no sympathy +// Player confronts Derek with Operation Shatter evidence // ================================================ VAR confrontation_approach = "" // diplomatic, aggressive, evidence_based VAR derek_knows_safetynet = false -VAR derek_cooperative = false -VAR final_choice = "" // arrest, recruit, expose, eliminate +VAR derek_showed_remorse = false // Spoiler: he won't +VAR final_choice = "" // arrest, recruit, expose VAR derek_confronted = false // Set to true when confrontation ends // External variables VAR player_name = "Agent 0x00" VAR evidence_collected = false +VAR found_casualty_projections = false + +// VM flag requirements - player must complete technical investigation +VAR ssh_flag_submitted = false +VAR linux_flag_submitted = false +VAR sudo_flag_submitted = false // ================================================ // START: DEREK APPEARS // ================================================ === start === +// Check if player has sufficient evidence from VM challenges +{not ssh_flag_submitted or not linux_flag_submitted or not sudo_flag_submitted: + -> insufficient_evidence +} +// Player has all VM flags - proceed with confrontation #complete_task:confront_derek Derek: Working late on the security audit? -Derek: You've been very thorough. Accessing locked offices, reviewing server logs, talking to everyone. +Derek: I've been watching you, you know. The lockpicking. The server access. The files you've been copying. -+ [Just doing my job as an IT contractor] - ~ confrontation_approach = "diplomatic" - -> derek_response_cover -+ [I know who you are, Derek] +Derek: You're not an IT contractor. And you've found Operation Shatter. + ++ [I know what you're planning, Derek.] ~ confrontation_approach = "aggressive" ~ derek_knows_safetynet = true -> derek_response_direct -+ [I have questions about your network activity] ++ [I've seen the casualty projections.] ~ confrontation_approach = "evidence_based" + ~ derek_knows_safetynet = true -> derek_response_evidence - -// ================================================ -// DEREK RESPONDS TO COVER STORY -// ================================================ - -=== derek_response_cover === -Derek: Of course. Very professional. - -Derek: But we both know you're not really an IT contractor, are we? - -Derek: The way you move, the questions you ask, the systems you've accessed... - -+ [I don't know what you mean] - -> derek_calls_bluff -+ [You're right. I'm SAFETYNET] ++ [SAFETYNET knows everything.] + ~ confrontation_approach = "aggressive" ~ derek_knows_safetynet = true -> derek_response_safetynet -=== derek_calls_bluff === -Derek: Come on. Give me some credit. +// ================================================ +// INSUFFICIENT EVIDENCE - PLAYER NEEDS VM FLAGS +// ================================================ -Derek: I've been watching you watch me. We're professionals here. +=== insufficient_evidence === +Derek: Oh, you must be the IT contractor. Security audit, right? --> derek_response_safetynet +Derek: I'm kind of busy. Maybe check back later? + ++ [I need to look at your systems] + Derek: Feel free to look around the office. But I don't have time for an interview right now. + Derek: Maybe after you've actually found something worth discussing. + #exit_conversation + -> END ++ [We should talk about some irregularities I've found] + Derek: Irregularities? Like what exactly? + Derek: If you don't have specifics, I've got work to do. Come back when you have evidence. + #exit_conversation + -> END ++ [I'll come back later] + Derek: Good idea. I'm sure the server room has plenty to keep you busy. + #exit_conversation + -> END // ================================================ -// DEREK RESPONDS TO DIRECT APPROACH +// DEREK RESPONDS - DIRECT APPROACH // ================================================ === derek_response_direct === -Derek: SAFETYNET. I wondered when you'd show up. +Derek: "Planning." Such a neutral word for what we're doing. -Derek: Took you long enough. I've been operating here for three months. +Derek: We're not planning an attack. We're planning an education. -+ [That ends tonight] - -> derek_challenge -+ [We know about Social Fabric] - -> derek_social_fabric ++ [You're planning to kill people.] + -> derek_admits_casualties ++ [You're insane.] + -> derek_calm_response -=== derek_challenge === -Derek: Does it? You're one agent. I'm one operative. What happens now? +=== derek_calm_response === +Derek: Insane? I'm the sanest person in this building. --> present_evidence +Derek: Everyone else pretends the systems work. Pretends their data is secure. Pretends that trust is deserved. -=== derek_social_fabric === -Derek: Social Fabric. The Architect. Phase 3. You know the names but not what they mean. +Derek: I know the truth. And after Sunday, so will everyone else. --> present_evidence +-> derek_admits_casualties // ================================================ -// DEREK RESPONDS TO EVIDENCE +// DEREK RESPONDS - EVIDENCE APPROACH // ================================================ === derek_response_evidence === -Derek: Network activity. How specific. +Derek: Ah. The casualty projections. -Derek: Let me guess—you found the backdoor, the server access, the encrypted communications? +Derek: I was wondering if you'd find those. They're the most honest part of the whole operation. -+ [All of it] - -> derek_impressed -+ [Enough to know you're ENTROPY] - ~ derek_knows_safetynet = true - -> derek_response_safetynet - -=== derek_impressed === -Derek: Thorough. I'm actually impressed. - -Derek: Not many people could piece that together. SAFETYNET training, I assume? - -~ derek_knows_safetynet = true - --> derek_response_safetynet ++ [You calculated how many people would die.] + -> derek_admits_casualties ++ [42 to 85 people. Those are your numbers.] + -> derek_admits_casualties // ================================================ -// DEREK ACKNOWLEDGES SAFETYNET +// DEREK RESPONDS - SAFETYNET // ================================================ === derek_response_safetynet === -Derek: So what now? You arrest me? Call in your team? +Derek: SAFETYNET. The organization that thinks surveillance protects people. -Derek: Or did you come alone to have a conversation first? +Derek: You found the files. The targeting lists. The message templates. --> present_evidence +Derek: Good. Then you understand what's coming. + +-> derek_admits_casualties // ================================================ -// PRESENT EVIDENCE +// DEREK ADMITS TO CASUALTIES - THE EVIL MONOLOGUE // ================================================ -=== present_evidence === -You explain what you've found: +=== derek_admits_casualties === +Derek: Yes. Between 42 and 85 people will die in the first 24 hours. -You: Firmware backdoor in the edge router. Three months of network monitoring. +Derek: Diabetics who panic about hospital closures. Elderly who can't handle the stress of fake bank failures. Heart attacks. Traffic accidents. A few suicides, probably. -You: Encrypted communications with other ENTROPY cells. Demographic data collection. +Derek: I calculated every one of them. -You: Disinformation campaign planning. Phase 3 references. ++ [How can you be so calm about murdering people?] + -> evil_monologue_part1 ++ [You're a monster.] + -> evil_monologue_part1 ++ [Why?] + -> evil_monologue_part1 -Derek: You have been thorough. +// ================================================ +// EVIL MONOLOGUE - PART 1 +// ================================================ -+ [What is Phase 3?] - -> phase_3_explanation -+ [Why do this? Why ENTROPY?] - -> derek_motivation -+ [This stops now] +=== evil_monologue_part1 === +Derek: Murder? No. Think of it as... forced education. + +Derek: Every security professional in the world says "humans are the weakest link." They write papers about it. Give talks at conferences. Collect consulting fees. + +Derek: But no one actually DEMONSTRATES it. No one shows what happens when you target human psychology at scale. + +Derek: We're going to prove—conclusively, undeniably—that digital trust is a lie. That every message you receive could be fake. That nothing is secure. + ++ [By killing innocent people.] + -> evil_monologue_part2 ++ [You're just terrorists with a philosophy degree.] + -> evil_monologue_part2 + +=== evil_monologue_part2 === +Derek: "Innocent." That's an interesting word. + +Derek: The diabetics we're targeting? They trust hospital notifications without verification. The elderly? They believe bank messages because they look official. + +Derek: They're not innocent. They're negligent. They've outsourced their critical thinking to systems that can be manipulated. + +Derek: We're teaching them—all of them—that trust is dangerous. Verify everything. Question everything. Or die. + ++ [Some of them WILL die. That's murder.] + -> evil_monologue_part3 ++ [You're rationalizing mass murder.] + -> evil_monologue_part3 + +// ================================================ +// EVIL MONOLOGUE - PART 3 (The Coldest Part) +// ================================================ + +=== evil_monologue_part3 === +Derek: Forty-two to eighty-five deaths. Let's call it sixty. + +Derek: Do you know how many people die every year because they trusted the wrong email? Clicked the wrong link? Gave credentials to the wrong person? + +Derek: Thousands. Tens of thousands. Suicides after financial fraud. Medical errors from compromised records. Violence incited by disinformation. + +Derek: We're going to end that. One bad weekend. Sixty deaths. And then NO ONE will ever trust a digital message again without verification. + +Derek: Sixty deaths to save tens of thousands per year. That's not murder. That's optimization. + ++ [You're calculating human lives like statistics.] + -> derek_final_philosophy ++ [The Architect taught you this, didn't they?] + -> architect_reference ++ [This ends now.] -> confrontation_choice -// ================================================ -// PHASE 3 EXPLANATION -// ================================================ +=== architect_reference === +Derek: The Architect opened my eyes. But I chose this path myself. -=== phase_3_explanation === -Derek: Phase 3 is... enlightenment, you could call it. +Derek: Entropy is inevitable. Trust is a lie. Security through obscurity fails. -Derek: The Architect believes systems inherently tend toward chaos. We just accelerate the inevitable. +Derek: We just accelerate the lesson. Make it unavoidable. Make it hurt enough that people remember. -+ [That's justification for terrorism] - Derek: Is it terrorism to reveal truth? To demonstrate that security is an illusion? - -> derek_philosophy -+ [You're manipulating people] - Derek: Everyone manipulates people. We're just honest about it. - -> derek_philosophy - -=== derek_philosophy === -Derek: You think your elections are secure? Your infrastructure is protected? - -Derek: We'll prove otherwise. Not with bombs—with demonstration of how fragile everything really is. - --> derek_motivation +-> derek_final_philosophy // ================================================ -// DEREK'S MOTIVATION +// DEREK'S FINAL PHILOSOPHY // ================================================ -=== derek_motivation === -Derek: Why ENTROPY? Because The Architect showed me the truth. +=== derek_final_philosophy === +Derek: You look at me like I'm a monster. -Derek: Every security system fails. Every organization collapses. Entropy always wins. +Derek: But I'm the only honest person in this industry. Every security researcher KNOWS trust is broken. They just profit from pretending it can be fixed. -Derek: We're not villains. We're... educators. Demonstrating reality that people refuse to see. +Derek: I'm the one willing to actually fix it. To burn the comfortable lies so something real can grow from the ashes. -+ [You're rationalizing harm] - ~ confrontation_approach = "aggressive" - Derek: And you're rationalizing surveillance and control. We're not so different. +Derek: Those sixty people? Their deaths will save millions. + +Derek: And in ten years, when no one falls for phishing because Operation Shatter taught them to verify everything, you'll understand. + +Derek: I'm not a villain. I'm a prophet. + ++ [You're delusional.] -> confrontation_choice -+ [You sound like you actually believe this] - ~ confrontation_approach = "diplomatic" - ~ derek_cooperative = true - Derek: I do. That's what makes us dangerous—we're not criminals chasing money. We're believers. ++ [You're going to prison for the rest of your life.] + -> confrontation_choice ++ [I almost feel sorry for you. Almost.] -> confrontation_choice // ================================================ @@ -190,17 +236,19 @@ Derek: We're not villains. We're... educators. Demonstrating reality that people // ================================================ === confrontation_choice === -Derek: So. Here we are. +Derek: So. Here we are. You've heard my reasoning. You've seen the evidence. -Derek: What happens next is up to you. +Derek: What happens now is up to you. -+ [I'm calling in SAFETYNET. You're under arrest] +Derek: But know this—even if you stop Operation Shatter here, the idea doesn't die. There are other cells. Other believers. Other architects of the inevitable. + ++ [I'm calling in SAFETYNET. You're under arrest.] ~ final_choice = "arrest" -> choice_arrest -+ [I have a proposition—work for us instead] ++ [Work with us. Help us stop the other cells.] ~ final_choice = "recruit" -> choice_recruit -+ [I'm exposing everything publicly] ++ [I'm exposing everything publicly. Let the world see what you are.] ~ final_choice = "expose" -> choice_expose @@ -209,35 +257,17 @@ Derek: What happens next is up to you. // ================================================ === choice_arrest === -You: You'll face justice through proper channels. +You: You're done, Derek. Operation Shatter dies today. And you're going to spend the rest of your life in prison. -{derek_cooperative: - Derek: Interesting. You could eliminate me quietly, but you're choosing the legal path. - Derek: I respect that, actually. It's principled. - -> arrest_cooperative -- else: - Derek: The legal system. How quaint. - Derek: You realize I'll claim whistleblower protection? Expose corporate surveillance? - -> arrest_hostile -} +Derek: Prison. How quaint. -=== arrest_cooperative === -Derek: I won't resist. But you should know—there are others. +Derek: You think concrete walls stop ideas? I'll become a martyr. People will study my philosophy. Question why I was silenced. -Derek: Social Fabric isn't just me. Phase 3 continues with or without this operation. +You: You'll be a case study in how not to become a terrorist. -You: That's for SAFETYNET to handle. +Derek: Terrorist. That's what they call educators who make people uncomfortable. -You call in backup. Derek is taken into custody professionally. - --> arrest_outcome - -=== arrest_hostile === -Derek: This will get messy. Media attention, legal battles, public scrutiny of SAFETYNET. - -Derek: But if that's how you want to play it... - -You call in backup. Derek is arrested but promises a legal fight. +You call in SAFETYNET backup. Derek doesn't resist—he's too confident that he's already won something. -> arrest_outcome @@ -246,7 +276,9 @@ You call in backup. Derek is arrested but promises a legal fight. Agent 0x99: Backup team is on site. Derek Lawson in custody. -Agent 0x99: Good work, {player_name}. Clean operation. +Agent 0x99: {player_name}... I heard everything. The way he talked about those deaths. Like they were just... numbers. + +Agent 0x99: We got him. Operation Shatter is over. You saved those people. ~ derek_confronted = true #exit_conversation @@ -258,47 +290,34 @@ Agent 0x99: Good work, {player_name}. Clean operation. // ================================================ === choice_recruit === -You: ENTROPY is going down. You can go down with it, or you can help us stop Phase 3. +You: You said there are other cells. Other architects of chaos. -Derek: Become a double agent? Feed you intelligence while maintaining my ENTROPY cover? +You: Help us stop them. Turn informant. Give us ENTROPY from the inside. -+ [Exactly. You keep your cell's trust, we get inside information] - -> recruit_negotiation -+ [Or face prosecution. Your choice] - -> recruit_pressure +Derek: Become a double agent? Betray The Architect? -=== recruit_negotiation === -Derek: Interesting proposition. +Derek: *laughs* -Derek: What's in it for me? Immunity? Protection? +Derek: You think I'd sell out the only people who understand the truth? For what—reduced sentence? -+ [Full immunity for cooperation. Witness protection if needed] - ~ derek_cooperative = true - -> recruit_accept -+ [A chance to do the right thing] - Derek: I'm a true believer, remember? "Right thing" is subjective. - Derek: But immunity and protection... that I can work with. - -> recruit_accept +Derek: No. I'm not like you, willing to compromise principles for convenience. -=== recruit_pressure === -Derek: Threatening prosecution? That's your angle? +Derek: Arrest me. Expose me. I don't care. But I will never betray ENTROPY. -Derek: Fine. But understand—I'm doing this for my survival, not because I've seen the error of my ways. +You: Then you leave me no choice. --> recruit_accept +You call in SAFETYNET backup. Derek was never going to cooperate—his belief is absolute. -=== recruit_accept === -Derek: I'll do it. Feed you intelligence, maintain my ENTROPY connections. - -Derek: But you should know—if The Architect suspects I'm compromised, I'm dead. - -Derek: So keep me alive, and I'll keep you informed about Phase 3. +-> recruit_outcome +=== recruit_outcome === #speaker:agent_0x99 -Agent 0x99: {player_name}, this is high risk. But if it works, we'll have unprecedented ENTROPY access. +Agent 0x99: I heard his refusal. Not surprised—true believers don't turn. -Agent 0x99: Derek Lawson is now Asset NIGHTINGALE. Proceed with extreme caution. +Agent 0x99: But you tried. That matters. Sometimes there's no way to reach someone. + +Agent 0x99: Derek Lawson is in custody. Operation Shatter is stopped. That's what counts. ~ derek_confronted = true #exit_conversation @@ -310,50 +329,46 @@ Agent 0x99: Derek Lawson is now Asset NIGHTINGALE. Proceed with extreme caution. // ================================================ === choice_expose === -You: I'm taking everything I've found—the backdoors, the emails, the evidence—and going public. +You: I'm taking everything. The casualty projections. The targeting lists. The messages you wrote for elderly diabetics. -Derek: Public disclosure? That's bold. +You: I'm giving it all to the press. Let the world see what ENTROPY really is. -Derek: You'll expose ENTROPY operations, but also Viral Dynamics' complete security failure. +Derek: *smiles* -+ [The public deserves to know the truth] - -> expose_truth -+ [Transparency is the only way] - -> expose_transparency +Derek: You think that hurts me? I WANT people to see this. -=== expose_truth === -Derek: Noble. Naive, but noble. +Derek: Public disclosure means the philosophy spreads. People will read those casualty projections and think—what if it happened? What if next time we're not stopped? -Derek: You'll destroy this company, ruin careers, cause panic. All for "truth." +Derek: Fear is the first step to wisdom. You're doing my work for me. -+ [Better than letting ENTROPY operate in shadows] ++ [Then the world will also see you in handcuffs.] -> expose_execute -+ [The alternative is worse] ++ [At least they'll know to watch for people like you.] -> expose_execute -=== expose_transparency === -Derek: Transparency. The Architect would appreciate the irony. - -Derek: You're proving our point—that security through obscurity fails when exposed. - --> expose_execute - === expose_execute === -Derek: Well, if you're doing this, you should know the full scope. +You: Maybe. But they'll also see that SAFETYNET stopped you. That we found you before you killed anyone. -Derek: Social Fabric is coordinating with Zero Day Syndicate, Ransomware Inc., and Critical Mass. Multiple cells, one operation. +You: And every time someone reads about Operation Shatter, they'll remember that we caught you. That your "inevitable entropy" wasn't so inevitable after all. -Derek: Expose it all. Let the chaos unfold. +Derek: A temporary setback. Entropy always wins eventually. -You begin compiling the evidence for public release. +You: Not today. +You begin compiling the evidence for public release while calling in backup. + +-> expose_outcome + +=== expose_outcome === #speaker:agent_0x99 -Agent 0x99: {player_name}, Director Netherton is furious. We don't do public disclosures. +Agent 0x99: {player_name}, public disclosure is... complicated. Director Netherton is going to have opinions. -Agent 0x99: But... the evidence is already out there. Viral Dynamics, ENTROPY operations, everything. +Agent 0x99: But I understand why you did it. People should know what ENTROPY is capable of. What they were willing to do. -Agent 0x99: The fallout is going to be massive. +Agent 0x99: Derek's in custody. The targeting lists are secured. And those 85 people who were going to die on Sunday? They're going to live. + +Agent 0x99: That's what matters. ~ derek_confronted = true #exit_conversation diff --git a/scenarios/m01_first_contact/ink/m01_derek_confrontation.json b/scenarios/m01_first_contact/ink/m01_derek_confrontation.json index ee4b81d..88a291c 100644 --- a/scenarios/m01_first_contact/ink/m01_derek_confrontation.json +++ b/scenarios/m01_first_contact/ink/m01_derek_confrontation.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":[["#","^complete_task:confront_derek","/#","^Derek: Working late on the security audit?","\n","^Derek: You've been very thorough. Accessing locked offices, reviewing server logs, talking to everyone.","\n","ev","str","^Just doing my job as an IT contractor","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I know who you are, Derek","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I have questions about your network activity","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev","str","^diplomatic","/str","/ev",{"VAR=":"confrontation_approach","re":true},{"->":"derek_response_cover"},null],"c-1":["\n","ev","str","^aggressive","/str","/ev",{"VAR=":"confrontation_approach","re":true},"ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_direct"},null],"c-2":["\n","ev","str","^evidence_based","/str","/ev",{"VAR=":"confrontation_approach","re":true},{"->":"derek_response_evidence"},null]}],null],"derek_response_cover":[["^Derek: Of course. Very professional.","\n","^Derek: But we both know you're not really an IT contractor, are we?","\n","^Derek: The way you move, the questions you ask, the systems you've accessed...","\n","ev","str","^I don't know what you mean","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're right. I'm SAFETYNET","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_calls_bluff"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_safetynet"},null]}],null],"derek_calls_bluff":["^Derek: Come on. Give me some credit.","\n","^Derek: I've been watching you watch me. We're professionals here.","\n",{"->":"derek_response_safetynet"},null],"derek_response_direct":[["^Derek: SAFETYNET. I wondered when you'd show up.","\n","^Derek: Took you long enough. I've been operating here for three months.","\n","ev","str","^That ends tonight","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^We know about Social Fabric","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_challenge"},null],"c-1":["\n",{"->":"derek_social_fabric"},null]}],null],"derek_challenge":["^Derek: Does it? You're one agent. I'm one operative. What happens now?","\n",{"->":"present_evidence"},null],"derek_social_fabric":["^Derek: Social Fabric. The Architect. Phase 3. You know the names but not what they mean.","\n",{"->":"present_evidence"},null],"derek_response_evidence":[["^Derek: Network activity. How specific.","\n","^Derek: Let me guess—you found the backdoor, the server access, the encrypted communications?","\n","ev","str","^All of it","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Enough to know you're ENTROPY","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_impressed"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_safetynet"},null]}],null],"derek_impressed":["^Derek: Thorough. I'm actually impressed.","\n","^Derek: Not many people could piece that together. SAFETYNET training, I assume?","\n","ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_safetynet"},null],"derek_response_safetynet":["^Derek: So what now? You arrest me? Call in your team?","\n","^Derek: Or did you come alone to have a conversation first?","\n",{"->":"present_evidence"},null],"present_evidence":[["^You explain what you've found:","\n","^You: Firmware backdoor in the edge router. Three months of network monitoring.","\n","^You: Encrypted communications with other ENTROPY cells. Demographic data collection.","\n","^You: Disinformation campaign planning. Phase 3 references.","\n","^Derek: You have been thorough.","\n","ev","str","^What is Phase 3?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Why do this? Why ENTROPY?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^This stops now","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"phase_3_explanation"},null],"c-1":["\n",{"->":"derek_motivation"},null],"c-2":["\n",{"->":"confrontation_choice"},null]}],null],"phase_3_explanation":[["^Derek: Phase 3 is... enlightenment, you could call it.","\n","^Derek: The Architect believes systems inherently tend toward chaos. We just accelerate the inevitable.","\n","ev","str","^That's justification for terrorism","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're manipulating people","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Derek: Is it terrorism to reveal truth? To demonstrate that security is an illusion?","\n",{"->":"derek_philosophy"},null],"c-1":["\n","^Derek: Everyone manipulates people. We're just honest about it.","\n",{"->":"derek_philosophy"},null]}],null],"derek_philosophy":["^Derek: You think your elections are secure? Your infrastructure is protected?","\n","^Derek: We'll prove otherwise. Not with bombs—with demonstration of how fragile everything really is.","\n",{"->":"derek_motivation"},null],"derek_motivation":[["^Derek: Why ENTROPY? Because The Architect showed me the truth.","\n","^Derek: Every security system fails. Every organization collapses. Entropy always wins.","\n","^Derek: We're not villains. We're... educators. Demonstrating reality that people refuse to see.","\n","ev","str","^You're rationalizing harm","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You sound like you actually believe this","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev","str","^aggressive","/str","/ev",{"VAR=":"confrontation_approach","re":true},"^Derek: And you're rationalizing surveillance and control. We're not so different.","\n",{"->":"confrontation_choice"},null],"c-1":["\n","ev","str","^diplomatic","/str","/ev",{"VAR=":"confrontation_approach","re":true},"ev",true,"/ev",{"VAR=":"derek_cooperative","re":true},"^Derek: I do. That's what makes us dangerous—we're not criminals chasing money. We're believers.","\n",{"->":"confrontation_choice"},null]}],null],"confrontation_choice":[["^Derek: So. Here we are.","\n","^Derek: What happens next is up to you.","\n","ev","str","^I'm calling in SAFETYNET. You're under arrest","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I have a proposition—work for us instead","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I'm exposing everything publicly","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev","str","^arrest","/str","/ev",{"VAR=":"final_choice","re":true},{"->":"choice_arrest"},null],"c-1":["\n","ev","str","^recruit","/str","/ev",{"VAR=":"final_choice","re":true},{"->":"choice_recruit"},null],"c-2":["\n","ev","str","^expose","/str","/ev",{"VAR=":"final_choice","re":true},{"->":"choice_expose"},null]}],null],"choice_arrest":["^You: You'll face justice through proper channels.","\n","ev",{"VAR?":"derek_cooperative"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Derek: Interesting. You could eliminate me quietly, but you're choosing the legal path.","\n","^Derek: I respect that, actually. It's principled.","\n",{"->":"arrest_cooperative"},{"->":".^.^.^.7"},null]}],[{"->":".^.b"},{"b":["\n","^Derek: The legal system. How quaint.","\n","^Derek: You realize I'll claim whistleblower protection? Expose corporate surveillance?","\n",{"->":"arrest_hostile"},{"->":".^.^.^.7"},null]}],"nop","\n",null],"arrest_cooperative":["^Derek: I won't resist. But you should know—there are others.","\n","^Derek: Social Fabric isn't just me. Phase 3 continues with or without this operation.","\n","^You: That's for SAFETYNET to handle.","\n","^You call in backup. Derek is taken into custody professionally.","\n",{"->":"arrest_outcome"},null],"arrest_hostile":["^Derek: This will get messy. Media attention, legal battles, public scrutiny of SAFETYNET.","\n","^Derek: But if that's how you want to play it...","\n","^You call in backup. Derek is arrested but promises a legal fight.","\n",{"->":"arrest_outcome"},null],"arrest_outcome":["#","^speaker:agent_0x99","/#","^Agent 0x99: Backup team is on site. Derek Lawson in custody.","\n","^Agent 0x99: Good work, ","ev",{"VAR?":"player_name"},"out","/ev","^. Clean operation.","\n","ev",true,"/ev",{"VAR=":"derek_confronted","re":true},"#","^exit_conversation","/#","end",null],"choice_recruit":[["^You: ENTROPY is going down. You can go down with it, or you can help us stop Phase 3.","\n","^Derek: Become a double agent? Feed you intelligence while maintaining my ENTROPY cover?","\n","ev","str","^Exactly. You keep your cell's trust, we get inside information","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Or face prosecution. Your choice","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"recruit_negotiation"},null],"c-1":["\n",{"->":"recruit_pressure"},null]}],null],"recruit_negotiation":[["^Derek: Interesting proposition.","\n","^Derek: What's in it for me? Immunity? Protection?","\n","ev","str","^Full immunity for cooperation. Witness protection if needed","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^A chance to do the right thing","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"derek_cooperative","re":true},{"->":"recruit_accept"},null],"c-1":["\n","^Derek: I'm a true believer, remember? \"Right thing\" is subjective.","\n","^Derek: But immunity and protection... that I can work with.","\n",{"->":"recruit_accept"},null]}],null],"recruit_pressure":["^Derek: Threatening prosecution? That's your angle?","\n","^Derek: Fine. But understand—I'm doing this for my survival, not because I've seen the error of my ways.","\n",{"->":"recruit_accept"},null],"recruit_accept":["^Derek: I'll do it. Feed you intelligence, maintain my ENTROPY connections.","\n","^Derek: But you should know—if The Architect suspects I'm compromised, I'm dead.","\n","^Derek: So keep me alive, and I'll keep you informed about Phase 3.","\n","#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, this is high risk. But if it works, we'll have unprecedented ENTROPY access.","\n","^Agent 0x99: Derek Lawson is now Asset NIGHTINGALE. Proceed with extreme caution.","\n","ev",true,"/ev",{"VAR=":"derek_confronted","re":true},"#","^exit_conversation","/#","end",null],"choice_expose":[["^You: I'm taking everything I've found—the backdoors, the emails, the evidence—and going public.","\n","^Derek: Public disclosure? That's bold.","\n","^Derek: You'll expose ENTROPY operations, but also Viral Dynamics' complete security failure.","\n","ev","str","^The public deserves to know the truth","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Transparency is the only way","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"expose_truth"},null],"c-1":["\n",{"->":"expose_transparency"},null]}],null],"expose_truth":[["^Derek: Noble. Naive, but noble.","\n","^Derek: You'll destroy this company, ruin careers, cause panic. All for \"truth.\"","\n","ev","str","^Better than letting ENTROPY operate in shadows","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^The alternative is worse","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"expose_execute"},null],"c-1":["\n",{"->":"expose_execute"},null]}],null],"expose_transparency":["^Derek: Transparency. The Architect would appreciate the irony.","\n","^Derek: You're proving our point—that security through obscurity fails when exposed.","\n",{"->":"expose_execute"},null],"expose_execute":["^Derek: Well, if you're doing this, you should know the full scope.","\n","^Derek: Social Fabric is coordinating with Zero Day Syndicate, Ransomware Inc., and Critical Mass. Multiple cells, one operation.","\n","^Derek: Expose it all. Let the chaos unfold.","\n","^You begin compiling the evidence for public release.","\n","#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, Director Netherton is furious. We don't do public disclosures.","\n","^Agent 0x99: But... the evidence is already out there. Viral Dynamics, ENTROPY operations, everything.","\n","^Agent 0x99: The fallout is going to be massive.","\n","ev",true,"/ev",{"VAR=":"derek_confronted","re":true},"#","^exit_conversation","/#","end",null],"global decl":["ev","str","^","/str",{"VAR=":"confrontation_approach"},false,{"VAR=":"derek_knows_safetynet"},false,{"VAR=":"derek_cooperative"},"str","^","/str",{"VAR=":"final_choice"},false,{"VAR=":"derek_confronted"},"str","^Agent 0x00","/str",{"VAR=":"player_name"},false,{"VAR=":"evidence_collected"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":[["ev",{"VAR?":"ssh_flag_submitted"},"!",{"VAR?":"linux_flag_submitted"},"!","||",{"VAR?":"sudo_flag_submitted"},"!","||","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"insufficient_evidence"},{"->":".^.^.^.11"},null]}],"nop","\n","#","^complete_task:confront_derek","/#","^Derek: Working late on the security audit?","\n","^Derek: I've been watching you, you know. The lockpicking. The server access. The files you've been copying.","\n","^Derek: You're not an IT contractor. And you've found Operation Shatter.","\n","ev","str","^I know what you're planning, Derek.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I've seen the casualty projections.","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^SAFETYNET knows everything.","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev","str","^aggressive","/str","/ev",{"VAR=":"confrontation_approach","re":true},"ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_direct"},null],"c-1":["\n","ev","str","^evidence_based","/str","/ev",{"VAR=":"confrontation_approach","re":true},"ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_evidence"},null],"c-2":["\n","ev","str","^aggressive","/str","/ev",{"VAR=":"confrontation_approach","re":true},"ev",true,"/ev",{"VAR=":"derek_knows_safetynet","re":true},{"->":"derek_response_safetynet"},null]}],null],"insufficient_evidence":[["^Derek: Oh, you must be the IT contractor. Security audit, right?","\n","^Derek: I'm kind of busy. Maybe check back later?","\n","ev","str","^I need to look at your systems","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^We should talk about some irregularities I've found","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I'll come back later","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","^Derek: Feel free to look around the office. But I don't have time for an interview right now.","\n","^Derek: Maybe after you've actually found something worth discussing.","\n","#","^exit_conversation","/#","end",null],"c-1":["\n","^Derek: Irregularities? Like what exactly?","\n","^Derek: If you don't have specifics, I've got work to do. Come back when you have evidence.","\n","#","^exit_conversation","/#","end",null],"c-2":["\n","^Derek: Good idea. I'm sure the server room has plenty to keep you busy.","\n","#","^exit_conversation","/#","end",null]}],null],"derek_response_direct":[["^Derek: \"Planning.\" Such a neutral word for what we're doing.","\n","^Derek: We're not planning an attack. We're planning an education.","\n","ev","str","^You're planning to kill people.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're insane.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_admits_casualties"},null],"c-1":["\n",{"->":"derek_calm_response"},null]}],null],"derek_calm_response":["^Derek: Insane? I'm the sanest person in this building.","\n","^Derek: Everyone else pretends the systems work. Pretends their data is secure. Pretends that trust is deserved.","\n","^Derek: I know the truth. And after Sunday, so will everyone else.","\n",{"->":"derek_admits_casualties"},null],"derek_response_evidence":[["^Derek: Ah. The casualty projections.","\n","^Derek: I was wondering if you'd find those. They're the most honest part of the whole operation.","\n","ev","str","^You calculated how many people would die.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^42 to 85 people. Those are your numbers.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_admits_casualties"},null],"c-1":["\n",{"->":"derek_admits_casualties"},null]}],null],"derek_response_safetynet":["^Derek: SAFETYNET. The organization that thinks surveillance protects people.","\n","^Derek: You found the files. The targeting lists. The message templates.","\n","^Derek: Good. Then you understand what's coming.","\n",{"->":"derek_admits_casualties"},null],"derek_admits_casualties":[["^Derek: Yes. Between 42 and 85 people will die in the first 24 hours.","\n","^Derek: Diabetics who panic about hospital closures. Elderly who can't handle the stress of fake bank failures. Heart attacks. Traffic accidents. A few suicides, probably.","\n","^Derek: I calculated every one of them.","\n","ev","str","^How can you be so calm about murdering people?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're a monster.","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Why?","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"evil_monologue_part1"},null],"c-1":["\n",{"->":"evil_monologue_part1"},null],"c-2":["\n",{"->":"evil_monologue_part1"},null]}],null],"evil_monologue_part1":[["^Derek: Murder? No. Think of it as... forced education.","\n","^Derek: Every security professional in the world says \"humans are the weakest link.\" They write papers about it. Give talks at conferences. Collect consulting fees.","\n","^Derek: But no one actually DEMONSTRATES it. No one shows what happens when you target human psychology at scale.","\n","^Derek: We're going to prove—conclusively, undeniably—that digital trust is a lie. That every message you receive could be fake. That nothing is secure.","\n","ev","str","^By killing innocent people.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're just terrorists with a philosophy degree.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"evil_monologue_part2"},null],"c-1":["\n",{"->":"evil_monologue_part2"},null]}],null],"evil_monologue_part2":[["^Derek: \"Innocent.\" That's an interesting word.","\n","^Derek: The diabetics we're targeting? They trust hospital notifications without verification. The elderly? They believe bank messages because they look official.","\n","^Derek: They're not innocent. They're negligent. They've outsourced their critical thinking to systems that can be manipulated.","\n","^Derek: We're teaching them—all of them—that trust is dangerous. Verify everything. Question everything. Or die.","\n","ev","str","^Some of them WILL die. That's murder.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're rationalizing mass murder.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"evil_monologue_part3"},null],"c-1":["\n",{"->":"evil_monologue_part3"},null]}],null],"evil_monologue_part3":[["^Derek: Forty-two to eighty-five deaths. Let's call it sixty.","\n","^Derek: Do you know how many people die every year because they trusted the wrong email? Clicked the wrong link? Gave credentials to the wrong person?","\n","^Derek: Thousands. Tens of thousands. Suicides after financial fraud. Medical errors from compromised records. Violence incited by disinformation.","\n","^Derek: We're going to end that. One bad weekend. Sixty deaths. And then NO ONE will ever trust a digital message again without verification.","\n","^Derek: Sixty deaths to save tens of thousands per year. That's not murder. That's optimization.","\n","ev","str","^You're calculating human lives like statistics.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^The Architect taught you this, didn't they?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^This ends now.","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"derek_final_philosophy"},null],"c-1":["\n",{"->":"architect_reference"},null],"c-2":["\n",{"->":"confrontation_choice"},null]}],null],"architect_reference":["^Derek: The Architect opened my eyes. But I chose this path myself.","\n","^Derek: Entropy is inevitable. Trust is a lie. Security through obscurity fails.","\n","^Derek: We just accelerate the lesson. Make it unavoidable. Make it hurt enough that people remember.","\n",{"->":"derek_final_philosophy"},null],"derek_final_philosophy":[["^Derek: You look at me like I'm a monster.","\n","^Derek: But I'm the only honest person in this industry. Every security researcher KNOWS trust is broken. They just profit from pretending it can be fixed.","\n","^Derek: I'm the one willing to actually fix it. To burn the comfortable lies so something real can grow from the ashes.","\n","^Derek: Those sixty people? Their deaths will save millions.","\n","^Derek: And in ten years, when no one falls for phishing because Operation Shatter taught them to verify everything, you'll understand.","\n","^Derek: I'm not a villain. I'm a prophet.","\n","ev","str","^You're delusional.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You're going to prison for the rest of your life.","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I almost feel sorry for you. Almost.","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"confrontation_choice"},null],"c-1":["\n",{"->":"confrontation_choice"},null],"c-2":["\n",{"->":"confrontation_choice"},null]}],null],"confrontation_choice":[["^Derek: So. Here we are. You've heard my reasoning. You've seen the evidence.","\n","^Derek: What happens now is up to you.","\n","^Derek: But know this—even if you stop Operation Shatter here, the idea doesn't die. There are other cells. Other believers. Other architects of the inevitable.","\n","ev","str","^I'm calling in SAFETYNET. You're under arrest.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Work with us. Help us stop the other cells.","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I'm exposing everything publicly. Let the world see what you are.","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev","str","^arrest","/str","/ev",{"VAR=":"final_choice","re":true},{"->":"choice_arrest"},null],"c-1":["\n","ev","str","^recruit","/str","/ev",{"VAR=":"final_choice","re":true},{"->":"choice_recruit"},null],"c-2":["\n","ev","str","^expose","/str","/ev",{"VAR=":"final_choice","re":true},{"->":"choice_expose"},null]}],null],"choice_arrest":["^You: You're done, Derek. Operation Shatter dies today. And you're going to spend the rest of your life in prison.","\n","^Derek: Prison. How quaint.","\n","^Derek: You think concrete walls stop ideas? I'll become a martyr. People will study my philosophy. Question why I was silenced.","\n","^You: You'll be a case study in how not to become a terrorist.","\n","^Derek: Terrorist. That's what they call educators who make people uncomfortable.","\n","^You call in SAFETYNET backup. Derek doesn't resist—he's too confident that he's already won something.","\n",{"->":"arrest_outcome"},null],"arrest_outcome":["#","^speaker:agent_0x99","/#","^Agent 0x99: Backup team is on site. Derek Lawson in custody.","\n","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^... I heard everything. The way he talked about those deaths. Like they were just... numbers.","\n","^Agent 0x99: We got him. Operation Shatter is over. You saved those people.","\n","ev",true,"/ev",{"VAR=":"derek_confronted","re":true},"#","^exit_conversation","/#","end",null],"choice_recruit":["^You: You said there are other cells. Other architects of chaos.","\n","^You: Help us stop them. Turn informant. Give us ENTROPY from the inside.","\n","^Derek: Become a double agent? Betray The Architect?","\n","^Derek: *laughs*","\n","^Derek: You think I'd sell out the only people who understand the truth? For what—reduced sentence?","\n","^Derek: No. I'm not like you, willing to compromise principles for convenience.","\n","^Derek: Arrest me. Expose me. I don't care. But I will never betray ENTROPY.","\n","^You: Then you leave me no choice.","\n","^You call in SAFETYNET backup. Derek was never going to cooperate—his belief is absolute.","\n",{"->":"recruit_outcome"},null],"recruit_outcome":["#","^speaker:agent_0x99","/#","^Agent 0x99: I heard his refusal. Not surprised—true believers don't turn.","\n","^Agent 0x99: But you tried. That matters. Sometimes there's no way to reach someone.","\n","^Agent 0x99: Derek Lawson is in custody. Operation Shatter is stopped. That's what counts.","\n","ev",true,"/ev",{"VAR=":"derek_confronted","re":true},"#","^exit_conversation","/#","end",null],"choice_expose":[["^You: I'm taking everything. The casualty projections. The targeting lists. The messages you wrote for elderly diabetics.","\n","^You: I'm giving it all to the press. Let the world see what ENTROPY really is.","\n","^Derek: *smiles*","\n","^Derek: You think that hurts me? I WANT people to see this.","\n","^Derek: Public disclosure means the philosophy spreads. People will read those casualty projections and think—what if it happened? What if next time we're not stopped?","\n","^Derek: Fear is the first step to wisdom. You're doing my work for me.","\n","ev","str","^Then the world will also see you in handcuffs.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^At least they'll know to watch for people like you.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"expose_execute"},null],"c-1":["\n",{"->":"expose_execute"},null]}],null],"expose_execute":["^You: Maybe. But they'll also see that SAFETYNET stopped you. That we found you before you killed anyone.","\n","^You: And every time someone reads about Operation Shatter, they'll remember that we caught you. That your \"inevitable entropy\" wasn't so inevitable after all.","\n","^Derek: A temporary setback. Entropy always wins eventually.","\n","^You: Not today.","\n","^You begin compiling the evidence for public release while calling in backup.","\n",{"->":"expose_outcome"},null],"expose_outcome":["#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, public disclosure is... complicated. Director Netherton is going to have opinions.","\n","^Agent 0x99: But I understand why you did it. People should know what ENTROPY is capable of. What they were willing to do.","\n","^Agent 0x99: Derek's in custody. The targeting lists are secured. And those 85 people who were going to die on Sunday? They're going to live.","\n","^Agent 0x99: That's what matters.","\n","ev",true,"/ev",{"VAR=":"derek_confronted","re":true},"#","^exit_conversation","/#","end",null],"global decl":["ev","str","^","/str",{"VAR=":"confrontation_approach"},false,{"VAR=":"derek_knows_safetynet"},false,{"VAR=":"derek_showed_remorse"},"str","^","/str",{"VAR=":"final_choice"},false,{"VAR=":"derek_confronted"},"str","^Agent 0x00","/str",{"VAR=":"player_name"},false,{"VAR=":"evidence_collected"},false,{"VAR=":"found_casualty_projections"},false,{"VAR=":"ssh_flag_submitted"},false,{"VAR=":"linux_flag_submitted"},false,{"VAR=":"sudo_flag_submitted"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/ink/m01_npc_kevin.ink b/scenarios/m01_first_contact/ink/m01_npc_kevin.ink index 2e1e1d4..778d1f5 100644 --- a/scenarios/m01_first_contact/ink/m01_npc_kevin.ink +++ b/scenarios/m01_first_contact/ink/m01_npc_kevin.ink @@ -1,7 +1,7 @@ // ================================================ // Mission 1: First Contact - Kevin Park (IT Manager) -// Act 2: In-Person NPC -// Provides lockpick, password hints, server room access +// Located in IT Room (PIN locked) +// Provides lockpicks, server keycard, and password hints // ================================================ VAR influence = 0 @@ -10,24 +10,26 @@ VAR discussed_audit = false VAR asked_about_derek = false VAR asked_about_passwords = false VAR given_lockpick = false +VAR given_keycard = false VAR given_password_hints = false -VAR discussed_server_room = false -VAR can_clone_card = false +VAR warned_about_derek = false // ================================================ // START: FIRST MEETING // ================================================ === start === +#set_variable:talked_to_kevin=true {not met_kevin: ~ met_kevin = true ~ influence += 2 - Kevin: Oh, hey! You must be the security auditor. I'm Kevin—IT manager, sole IT department, and occasional coffee addict. - Kevin: Thank god you're here. I've been telling them we need a security review for months. + Kevin: Oh hey! You found the IT room. I'm Kevin—IT manager, sole IT department, and professional worrier. + Kevin: You're the security auditor, right? Thank god you're here. + Kevin: I've been telling them we need a review for months. -> first_meeting } {met_kevin: - Kevin: What's up? Found any security nightmares yet? + Kevin: Hey, what's up? Found anything interesting yet? -> hub } @@ -36,228 +38,224 @@ VAR can_clone_card = false // ================================================ === first_meeting === -+ [Happy to help. What's the current security situation?] +#complete_task:meet_kevin ++ [Happy to help. What's the security situation?] ~ influence += 2 ~ discussed_audit = true - #complete_task:meet_kevin -> security_situation -+ [I'll need access to systems and the server room] ++ [I'll need access to secure areas for testing] ~ discussed_audit = true - #complete_task:meet_kevin -> access_discussion -+ [Looks like you handle a lot solo] ++ [You seem stressed] ~ influence += 1 ~ discussed_audit = true - #complete_task:meet_kevin - -> commiseration + -> kevin_stress // ================================================ // SECURITY SITUATION // ================================================ === security_situation === -Kevin: Honestly? It's not terrible but it's not great. +Kevin: Honestly? I'm worried. -Kevin: We have basic stuff—firewalls, access controls, encryption. But I'm one person managing everything. +Kevin: Someone's been accessing the server room without authorization. Late at night. Multiple times. -+ [What worries you most?] +Kevin: I flagged it to management three times. Nothing happened. + ++ [Who do you think it is?] + ~ warned_about_derek = true ~ influence += 1 - -> security_concerns -+ [I'll do a thorough assessment] - -> hub + -> derek_suspicion ++ [That's what I'm here to investigate] + Kevin: Good. Because I'm starting to feel like I'm the only one who cares about security around here. + -> offer_tools -=== security_concerns === -Kevin: Physical security, mainly. People write passwords on sticky notes, leave doors unlocked. +// ================================================ +// DEREK SUSPICION +// ================================================ -Kevin: I can lock down the network all day, but if someone can walk in and access a terminal... +=== derek_suspicion === +Kevin: *lowers voice* I think it's Derek Lawson. Senior Marketing Manager. -+ [That's what I'm here to check] +Kevin: The access logs show his credentials being used at 2 AM. But he says it's for "campaign servers." + +Kevin: We don't have campaign servers in that room. It's all internal infrastructure. + +Kevin: The last person who raised concerns about Derek was Patricia—our manager. She got fired. + ++ [I'll look into it] ~ influence += 2 - Kevin: Exactly. Look, I've got something that might help you test physical security. - -> offer_lockpick -+ [Social engineering is often the biggest vulnerability] - ~ influence += 1 - Kevin: Right? Technology is only as secure as the people using it. - -> hub + Kevin: Please do. But be careful. Derek has friends in high places. + Kevin: Here, let me give you some tools that might help. + -> offer_tools ++ [Could be someone spoofing his credentials] + Kevin: Maybe. But I don't think so. I've seen him leaving the office at weird hours. + -> offer_tools // ================================================ // ACCESS DISCUSSION // ================================================ === access_discussion === -Kevin: I can get you into most places. Server room, you'll need my RFID card or... +Kevin: Right, you'll need access to secure areas. -Kevin: Actually, you should test our physical security anyway. +Kevin: I've got a keycard for the server room. It's behind Derek's office, actually. --> offer_lockpick +Kevin: And for physical security testing, I've got something special. + +-> offer_tools // ================================================ -// COMMISERATION +// KEVIN STRESS // ================================================ -=== commiseration === -Kevin: Yeah, it's just me. Budget constraints, you know? +=== kevin_stress === +Kevin: Yeah, it's been a rough few months. -Kevin: They'd rather spend on marketing than IT security. Classic mistake. +Kevin: Ever since Patricia got fired, things have felt... off. -+ [That's unfortunately common] - ~ influence += 2 - Kevin: Tell me about it. Anyway, what can I help you with? +Kevin: She was investigating something. Asking questions about Derek's projects. + +Kevin: Now she's gone and nobody will tell me why. + ++ [What was she investigating?] + ~ warned_about_derek = true + Kevin: I don't know exactly. Something about Derek's "external partners." + Kevin: She kept her notes in her office safe. I think her briefcase is still in there too. + -> offer_tools ++ [Let's focus on the audit] + Kevin: Right. Sorry. Let me get you set up. + -> offer_tools + +// ================================================ +// OFFER TOOLS +// ================================================ + +=== offer_tools === +Kevin: Okay, so for the audit I can give you: + +Kevin: First, a lockpick set. I bought it for when people lock themselves out, but it's useful for testing physical security. + +Kevin: Second, my server room keycard. You'll need it to access the main servers. + +Kevin: And some notes on password patterns people use around here. Should help with the technical testing. + ++ [I'll take all of it] + ~ given_lockpick = true + ~ given_keycard = true + ~ given_password_hints = true + ~ influence += 3 + #give_item:lockpick + #give_item:keycard + #give_item:notes + Kevin: Here you go. The lockpicks work on most of the older locks around here. + Kevin: The server room is through Derek's office—there's a door on the east side. + Kevin: Just... be careful, okay? Something's not right here. -> hub -+ [Well, I'm here to help now] - ~ influence += 1 ++ [Just the keycard for now] + ~ given_keycard = true + #give_item:keycard + Kevin: Sure. Server room is through Derek's office. Let me know if you need anything else. -> hub -// ================================================ -// OFFER LOCKPICK -// ================================================ - -=== offer_lockpick === -{not given_lockpick: - Kevin: I've got a lockpick set in my desk. Bought it for when people lock themselves out. - Kevin: You should use it to test our physical locks. See how easy it is to bypass security. - + [That would be very useful] - ~ given_lockpick = true - ~ influence += 3 - #give_item:lockpick - #complete_task:receive_lockpick - Kevin: Here. Just... officially you're testing security. Unofficially, try not to break anything. - Kevin: Storage closet is a good place to practice. Simple lock, nothing valuable inside. - -> hub - + [I'll stick to my authorized access for now] - ~ influence -= 1 - Kevin: Your call. Offer stands if you change your mind. - -> hub -} -{given_lockpick: - Kevin: You already have the lockpick. Go test those locks! - -> hub -} - // ================================================ // CONVERSATION HUB // ================================================ === hub === -+ {not asked_about_passwords and influence >= 3} [Can you tell me about password policies here?] ++ {not given_lockpick} [About those lockpicks...] + -> get_lockpicks ++ {not given_keycard} [I need the server room keycard] + -> get_keycard ++ {not asked_about_passwords and influence >= 2} [Tell me about password security here] -> ask_passwords -+ {not asked_about_derek and influence >= 4} [Anyone using weak security I should know about?] - -> ask_weak_security -+ {not discussed_server_room} [Tell me about the server room setup] - -> ask_server_room -+ {influence >= 6 and not can_clone_card} [I'll need to test RFID security. Can I clone your card?] - -> request_card_clone -+ {not given_lockpick and discussed_audit and influence >= 8} [About that lockpick...] - -> offer_lockpick -+ [I'll keep working. Thanks for the help] ++ {not asked_about_derek and influence >= 3} [What else can you tell me about Derek?] + -> ask_about_derek ++ [I'll keep investigating. Thanks for the help.] #exit_conversation - Kevin: No problem. Let me know if you find anything scary. + Kevin: No problem. And seriously—if you find anything, let me know. I need to know I'm not going crazy. -> hub +// ================================================ +// GET LOCKPICKS +// ================================================ + +=== get_lockpicks === +~ given_lockpick = true +#give_item:lockpick + +Kevin: Here's the lockpick set. It's professional grade. + +Kevin: Most of the older locks in the building are vulnerable. Good for testing security. + +Kevin: Patricia's office has an old briefcase she left behind. You might be able to pick that open if you're curious what she was working on. + +-> hub + +// ================================================ +// GET KEYCARD +// ================================================ + +=== get_keycard === +~ given_keycard = true +#give_item:keycard + +Kevin: Here's my server room keycard. + +Kevin: The server room is through Derek's office—there's a connecting door on the east wall. + +Kevin: The servers hold everything. If there's evidence of unauthorized activity, that's where you'll find it. + +-> hub + // ================================================ // ASK ABOUT PASSWORDS // ================================================ === ask_passwords === ~ asked_about_passwords = true +~ given_password_hints = true ~ influence += 1 +#give_item:notes -Kevin: Official policy is 12 characters, mixed case, numbers, symbols. We enforce it on domain accounts. +Kevin: Password security here is... not great. -Kevin: Reality? People use patterns to remember them. +Kevin: I enforce complexity requirements on domain accounts, but people find patterns. -+ [What kind of patterns?] - ~ given_password_hints = true - ~ influence += 1 - #complete_task:gather_password_hints - -> password_patterns -+ [That's pretty standard] +Kevin: Company name plus numbers. Birthdays. Anniversary dates. + +Kevin: Derek uses his birthday or anniversary in everything. April 19th. Makes his passwords easy to guess. + ++ [0419?] + ~ influence += 2 + Kevin: Yeah. I've told him it's a security risk but he doesn't listen. + Kevin: Here, I wrote down the common patterns people use. Might help with the audit. -> hub - -=== password_patterns === -Kevin: Company name plus numbers. Birth years. "Marketing123" type stuff. - -Kevin: Derek uses his birthday in passwords. I've seen his sticky notes. - -Kevin: Maya from accounting uses "Campaign" plus the year. Same password for everything. - -+ [That's... not great security] - ~ influence += 1 - Kevin: Tell me about it. That's why we need this audit. - Kevin: Maybe your report will convince them to take password security seriously. ++ [That's useful, thanks] -> hub // ================================================ -// ASK ABOUT WEAK SECURITY +// ASK ABOUT DEREK // ================================================ -=== ask_weak_security === +=== ask_about_derek === ~ asked_about_derek = true ~ influence += 1 -Kevin: Derek's the worst offender, honestly. Senior marketing guy. +Kevin: Derek's been here about 18 months. Senior Marketing Manager. -Kevin: He requested "enhanced privacy" for his office systems. Made me set up separate network segments. +Kevin: At first he seemed normal. Then he started requesting "enhanced privacy" for his systems. -+ [That's unusual] +Kevin: Wanted separate network segments, encrypted communications, locked office at all times. + +Kevin: Said it was for "client confidentiality" but... marketing doesn't need that level of security. + ++ [What do you think he's really doing?] + Kevin: I don't know. But whatever it is, it's not marketing. + Kevin: He's been meeting with external people—calls them "partners." + Kevin: I saw notes once that mentioned something called "Operation Shatter." ~ influence += 2 - Kevin: Right? He says it's for client confidentiality, but the segmentation is weird. - Kevin: And I've caught him in the server room twice. Said he was "checking campaign servers." - -> derek_server_access -+ [Maybe he handles sensitive client data?] - Kevin: Maybe. But it still seems excessive. -> hub - -=== derek_server_access === -Kevin: The thing is, there are no "campaign servers" in our server room. - -Kevin: We use cloud hosting for everything client-facing. - -+ [So what was he really doing?] - ~ influence += 2 - Kevin: I don't know. But you're auditing security—might want to check his systems. - Kevin: His office is usually locked when he's not there, though. ++ [Maybe he's just paranoid] + Kevin: Maybe. But Patricia didn't think so. And now she's gone. -> hub -+ [I'll look into it] - ~ influence += 1 - -> hub - -// ================================================ -// ASK ABOUT SERVER ROOM -// ================================================ - -=== ask_server_room === -~ discussed_server_room = true -~ influence += 1 -#unlock_task:access_server_room - -Kevin: Standard setup. Internal servers, network equipment, some legacy systems. - -Kevin: Access is RFID controlled. I'm the only one with a card besides management. - -+ [What about testing RFID security?] - ~ can_clone_card = true - Kevin: Good point. You should probably test if our cards can be cloned. - -> hub -+ [I'll need access for the audit] - Kevin: Yeah, about that... I can give you my card, or you could test our RFID security by cloning it? - ~ can_clone_card = true - -> hub - -// ================================================ -// REQUEST CARD CLONE -// ================================================ - -=== request_card_clone === -{can_clone_card: - Kevin: Yeah, good idea to test that. RFID security is important. - Kevin: Here, you can use my card to clone onto a blank. Standard security test. - ~ influence += 2 - #complete_task:clone_kevin_card - #give_item:rfid_cloner - Kevin: Just make sure to document this in your report. We need to know if our access system is vulnerable. - -> hub -- else: - Kevin: Hmm, I'm not sure about that. Let me think about it. - -> hub -} diff --git a/scenarios/m01_first_contact/ink/m01_npc_kevin.json b/scenarios/m01_first_contact/ink/m01_npc_kevin.json index 32d48b9..7a1b4e4 100644 --- a/scenarios/m01_first_contact/ink/m01_npc_kevin.json +++ b/scenarios/m01_first_contact/ink/m01_npc_kevin.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"met_kevin"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev",true,"/ev",{"VAR=":"met_kevin","re":true},"ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Oh, hey! You must be the security auditor. I'm Kevin—IT manager, sole IT department, and occasional coffee addict.","\n","^Kevin: Thank god you're here. I've been telling them we need a security review for months.","\n",{"->":"first_meeting"},{"->":"start.5"},null]}],"nop","\n","ev",{"VAR?":"met_kevin"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Kevin: What's up? Found any security nightmares yet?","\n",{"->":"hub"},{"->":"start.11"},null]}],"nop","\n",null],"first_meeting":[["ev","str","^Happy to help. What's the current security situation?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll need access to systems and the server room","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Looks like you handle a lot solo","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","ev",true,"/ev",{"VAR=":"discussed_audit","re":true},"#","^complete_task:meet_kevin","/#",{"->":"security_situation"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"discussed_audit","re":true},"#","^complete_task:meet_kevin","/#",{"->":"access_discussion"},null],"c-2":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","ev",true,"/ev",{"VAR=":"discussed_audit","re":true},"#","^complete_task:meet_kevin","/#",{"->":"commiseration"},null]}],null],"security_situation":[["^Kevin: Honestly? It's not terrible but it's not great.","\n","^Kevin: We have basic stuff—firewalls, access controls, encryption. But I'm one person managing everything.","\n","ev","str","^What worries you most?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll do a thorough assessment","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev",{"->":"security_concerns"},null],"c-1":["\n",{"->":"hub"},null]}],null],"security_concerns":[["^Kevin: Physical security, mainly. People write passwords on sticky notes, leave doors unlocked.","\n","^Kevin: I can lock down the network all day, but if someone can walk in and access a terminal...","\n","ev","str","^That's what I'm here to check","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Social engineering is often the biggest vulnerability","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Exactly. Look, I've got something that might help you test physical security.","\n",{"->":"offer_lockpick"},null],"c-1":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Right? Technology is only as secure as the people using it.","\n",{"->":"hub"},null]}],null],"access_discussion":["^Kevin: I can get you into most places. Server room, you'll need my RFID card or...","\n","^Kevin: Actually, you should test our physical security anyway.","\n",{"->":"offer_lockpick"},null],"commiseration":[["^Kevin: Yeah, it's just me. Budget constraints, you know?","\n","^Kevin: They'd rather spend on marketing than IT security. Classic mistake.","\n","ev","str","^That's unfortunately common","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Well, I'm here to help now","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Tell me about it. Anyway, what can I help you with?","\n",{"->":"hub"},null],"c-1":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev",{"->":"hub"},null]}],null],"offer_lockpick":["ev",{"VAR?":"given_lockpick"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","^Kevin: I've got a lockpick set in my desk. Bought it for when people lock themselves out.","\n","^Kevin: You should use it to test our physical locks. See how easy it is to bypass security.","\n","ev","str","^That would be very useful","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll stick to my authorized access for now","/str","/ev",{"*":".^.c-1","flg":4},{"->":".^.^.^.5"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"given_lockpick","re":true},"ev",{"VAR?":"influence"},3,"+",{"VAR=":"influence","re":true},"/ev","#","^give_item:lockpick","/#","#","^complete_task:receive_lockpick","/#","^Kevin: Here. Just... officially you're testing security. Unofficially, try not to break anything.","\n","^Kevin: Storage closet is a good place to practice. Simple lock, nothing valuable inside.","\n",{"->":"hub"},null],"c-1":["\n","ev",{"VAR?":"influence"},1,"-",{"VAR=":"influence","re":true},"/ev","^Kevin: Your call. Offer stands if you change your mind.","\n",{"->":"hub"},null]}]}],"nop","\n","ev",{"VAR?":"given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Kevin: You already have the lockpick. Go test those locks!","\n",{"->":"hub"},{"->":".^.^.^.11"},null]}],"nop","\n",null],"hub":[["ev","str","^Can you tell me about password policies here?","/str",{"VAR?":"asked_about_passwords"},"!",{"VAR?":"influence"},3,">=","&&","/ev",{"*":".^.c-0","flg":5},"ev","str","^Anyone using weak security I should know about?","/str",{"VAR?":"asked_about_derek"},"!",{"VAR?":"influence"},4,">=","&&","/ev",{"*":".^.c-1","flg":5},"ev","str","^Tell me about the server room setup","/str",{"VAR?":"discussed_server_room"},"!","/ev",{"*":".^.c-2","flg":5},"ev","str","^I'll need to test RFID security. Can I clone your card?","/str",{"VAR?":"influence"},6,">=",{"VAR?":"can_clone_card"},"!","&&","/ev",{"*":".^.c-3","flg":5},"ev","str","^About that lockpick...","/str",{"VAR?":"given_lockpick"},"!",{"VAR?":"discussed_audit"},"&&",{"VAR?":"influence"},8,">=","&&","/ev",{"*":".^.c-4","flg":5},"ev","str","^I'll keep working. Thanks for the help","/str","/ev",{"*":".^.c-5","flg":4},{"c-0":["\n",{"->":"ask_passwords"},null],"c-1":["\n",{"->":"ask_weak_security"},null],"c-2":["\n",{"->":"ask_server_room"},null],"c-3":["\n",{"->":"request_card_clone"},null],"c-4":["\n",{"->":"offer_lockpick"},null],"c-5":["\n","#","^exit_conversation","/#","^Kevin: No problem. Let me know if you find anything scary.","\n",{"->":"hub"},null]}],null],"ask_passwords":[["ev",true,"/ev",{"VAR=":"asked_about_passwords","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Official policy is 12 characters, mixed case, numbers, symbols. We enforce it on domain accounts.","\n","^Kevin: Reality? People use patterns to remember them.","\n","ev","str","^What kind of patterns?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^That's pretty standard","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"given_password_hints","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","#","^complete_task:gather_password_hints","/#",{"->":"password_patterns"},null],"c-1":["\n",{"->":"hub"},null]}],null],"password_patterns":[["^Kevin: Company name plus numbers. Birth years. \"Marketing123\" type stuff.","\n","^Kevin: Derek uses his birthday in passwords. I've seen his sticky notes.","\n","^Kevin: Maya from accounting uses \"Campaign\" plus the year. Same password for everything.","\n","ev","str","^That's... not great security","/str","/ev",{"*":".^.c-0","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Tell me about it. That's why we need this audit.","\n","^Kevin: Maybe your report will convince them to take password security seriously.","\n",{"->":"hub"},null]}],null],"ask_weak_security":[["ev",true,"/ev",{"VAR=":"asked_about_derek","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Derek's the worst offender, honestly. Senior marketing guy.","\n","^Kevin: He requested \"enhanced privacy\" for his office systems. Made me set up separate network segments.","\n","ev","str","^That's unusual","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Maybe he handles sensitive client data?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Right? He says it's for client confidentiality, but the segmentation is weird.","\n","^Kevin: And I've caught him in the server room twice. Said he was \"checking campaign servers.\"","\n",{"->":"derek_server_access"},null],"c-1":["\n","^Kevin: Maybe. But it still seems excessive.","\n",{"->":"hub"},null]}],null],"derek_server_access":[["^Kevin: The thing is, there are no \"campaign servers\" in our server room.","\n","^Kevin: We use cloud hosting for everything client-facing.","\n","ev","str","^So what was he really doing?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll look into it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: I don't know. But you're auditing security—might want to check his systems.","\n","^Kevin: His office is usually locked when he's not there, though.","\n",{"->":"hub"},null],"c-1":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev",{"->":"hub"},null]}],null],"ask_server_room":[["ev",true,"/ev",{"VAR=":"discussed_server_room","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","#","^unlock_task:access_server_room","/#","^Kevin: Standard setup. Internal servers, network equipment, some legacy systems.","\n","^Kevin: Access is RFID controlled. I'm the only one with a card besides management.","\n","ev","str","^What about testing RFID security?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll need access for the audit","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"can_clone_card","re":true},"^Kevin: Good point. You should probably test if our cards can be cloned.","\n",{"->":"hub"},null],"c-1":["\n","^Kevin: Yeah, about that... I can give you my card, or you could test our RFID security by cloning it?","\n","ev",true,"/ev",{"VAR=":"can_clone_card","re":true},{"->":"hub"},null]}],null],"request_card_clone":["ev",{"VAR?":"can_clone_card"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Kevin: Yeah, good idea to test that. RFID security is important.","\n","^Kevin: Here, you can use my card to clone onto a blank. Standard security test.","\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","#","^complete_task:clone_kevin_card","/#","#","^give_item:rfid_cloner","/#","^Kevin: Just make sure to document this in your report. We need to know if our access system is vulnerable.","\n",{"->":"hub"},{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^Kevin: Hmm, I'm not sure about that. Let me think about it.","\n",{"->":"hub"},{"->":".^.^.^.5"},null]}],"nop","\n",null],"global decl":["ev",0,{"VAR=":"influence"},false,{"VAR=":"met_kevin"},false,{"VAR=":"discussed_audit"},false,{"VAR=":"asked_about_derek"},false,{"VAR=":"asked_about_passwords"},false,{"VAR=":"given_lockpick"},false,{"VAR=":"given_password_hints"},false,{"VAR=":"discussed_server_room"},false,{"VAR=":"can_clone_card"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["#","^set_variable:talked_to_kevin=true","/#","ev",{"VAR?":"met_kevin"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev",true,"/ev",{"VAR=":"met_kevin","re":true},"ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Oh hey! You found the IT room. I'm Kevin—IT manager, sole IT department, and professional worrier.","\n","^Kevin: You're the security auditor, right? Thank god you're here.","\n","^Kevin: I've been telling them we need a review for months.","\n",{"->":"first_meeting"},{"->":"start.8"},null]}],"nop","\n","ev",{"VAR?":"met_kevin"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Kevin: Hey, what's up? Found anything interesting yet?","\n",{"->":"hub"},{"->":"start.14"},null]}],"nop","\n",null],"first_meeting":[["#","^complete_task:meet_kevin","/#","ev","str","^Happy to help. What's the security situation?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll need access to secure areas for testing","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^You seem stressed","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","ev",true,"/ev",{"VAR=":"discussed_audit","re":true},{"->":"security_situation"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"discussed_audit","re":true},{"->":"access_discussion"},null],"c-2":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","ev",true,"/ev",{"VAR=":"discussed_audit","re":true},{"->":"kevin_stress"},null]}],null],"security_situation":[["^Kevin: Honestly? I'm worried.","\n","^Kevin: Someone's been accessing the server room without authorization. Late at night. Multiple times.","\n","^Kevin: I flagged it to management three times. Nothing happened.","\n","ev","str","^Who do you think it is?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^That's what I'm here to investigate","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"warned_about_derek","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev",{"->":"derek_suspicion"},null],"c-1":["\n","^Kevin: Good. Because I'm starting to feel like I'm the only one who cares about security around here.","\n",{"->":"offer_tools"},null]}],null],"derek_suspicion":[["^Kevin: *lowers voice* I think it's Derek Lawson. Senior Marketing Manager.","\n","^Kevin: The access logs show his credentials being used at 2 AM. But he says it's for \"campaign servers.\"","\n","^Kevin: We don't have campaign servers in that room. It's all internal infrastructure.","\n","^Kevin: The last person who raised concerns about Derek was Patricia—our manager. She got fired.","\n","ev","str","^I'll look into it","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Could be someone spoofing his credentials","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Please do. But be careful. Derek has friends in high places.","\n","^Kevin: Here, let me give you some tools that might help.","\n",{"->":"offer_tools"},null],"c-1":["\n","^Kevin: Maybe. But I don't think so. I've seen him leaving the office at weird hours.","\n",{"->":"offer_tools"},null]}],null],"access_discussion":["^Kevin: Right, you'll need access to secure areas.","\n","^Kevin: I've got a keycard for the server room. It's behind Derek's office, actually.","\n","^Kevin: And for physical security testing, I've got something special.","\n",{"->":"offer_tools"},null],"kevin_stress":[["^Kevin: Yeah, it's been a rough few months.","\n","^Kevin: Ever since Patricia got fired, things have felt... off.","\n","^Kevin: She was investigating something. Asking questions about Derek's projects.","\n","^Kevin: Now she's gone and nobody will tell me why.","\n","ev","str","^What was she investigating?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Let's focus on the audit","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"warned_about_derek","re":true},"^Kevin: I don't know exactly. Something about Derek's \"external partners.\"","\n","^Kevin: She kept her notes in her office safe. I think her briefcase is still in there too.","\n",{"->":"offer_tools"},null],"c-1":["\n","^Kevin: Right. Sorry. Let me get you set up.","\n",{"->":"offer_tools"},null]}],null],"offer_tools":[["^Kevin: Okay, so for the audit I can give you:","\n","^Kevin: First, a lockpick set. I bought it for when people lock themselves out, but it's useful for testing physical security.","\n","^Kevin: Second, my server room keycard. You'll need it to access the main servers.","\n","^Kevin: And some notes on password patterns people use around here. Should help with the technical testing.","\n","ev","str","^I'll take all of it","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Just the keycard for now","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"given_lockpick","re":true},"ev",true,"/ev",{"VAR=":"given_keycard","re":true},"ev",true,"/ev",{"VAR=":"given_password_hints","re":true},"ev",{"VAR?":"influence"},3,"+",{"VAR=":"influence","re":true},"/ev","#","^give_item:lockpick","/#","#","^give_item:keycard","/#","#","^give_item:notes","/#","^Kevin: Here you go. The lockpicks work on most of the older locks around here.","\n","^Kevin: The server room is through Derek's office—there's a door on the east side.","\n","^Kevin: Just... be careful, okay? Something's not right here.","\n",{"->":"hub"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"given_keycard","re":true},"#","^give_item:keycard","/#","^Kevin: Sure. Server room is through Derek's office. Let me know if you need anything else.","\n",{"->":"hub"},null]}],null],"hub":[["ev","str","^About those lockpicks...","/str",{"VAR?":"given_lockpick"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^I need the server room keycard","/str",{"VAR?":"given_keycard"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^Tell me about password security here","/str",{"VAR?":"asked_about_passwords"},"!",{"VAR?":"influence"},2,">=","&&","/ev",{"*":".^.c-2","flg":5},"ev","str","^What else can you tell me about Derek?","/str",{"VAR?":"asked_about_derek"},"!",{"VAR?":"influence"},3,">=","&&","/ev",{"*":".^.c-3","flg":5},"ev","str","^I'll keep investigating. Thanks for the help.","/str","/ev",{"*":".^.c-4","flg":4},{"c-0":["\n",{"->":"get_lockpicks"},null],"c-1":["\n",{"->":"get_keycard"},null],"c-2":["\n",{"->":"ask_passwords"},null],"c-3":["\n",{"->":"ask_about_derek"},null],"c-4":["\n","#","^exit_conversation","/#","^Kevin: No problem. And seriously—if you find anything, let me know. I need to know I'm not going crazy.","\n",{"->":"hub"},null]}],null],"get_lockpicks":["ev",true,"/ev",{"VAR=":"given_lockpick","re":true},"#","^give_item:lockpick","/#","^Kevin: Here's the lockpick set. It's professional grade.","\n","^Kevin: Most of the older locks in the building are vulnerable. Good for testing security.","\n","^Kevin: Patricia's office has an old briefcase she left behind. You might be able to pick that open if you're curious what she was working on.","\n",{"->":"hub"},null],"get_keycard":["ev",true,"/ev",{"VAR=":"given_keycard","re":true},"#","^give_item:keycard","/#","^Kevin: Here's my server room keycard.","\n","^Kevin: The server room is through Derek's office—there's a connecting door on the east wall.","\n","^Kevin: The servers hold everything. If there's evidence of unauthorized activity, that's where you'll find it.","\n",{"->":"hub"},null],"ask_passwords":[["ev",true,"/ev",{"VAR=":"asked_about_passwords","re":true},"ev",true,"/ev",{"VAR=":"given_password_hints","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","#","^give_item:notes","/#","^Kevin: Password security here is... not great.","\n","^Kevin: I enforce complexity requirements on domain accounts, but people find patterns.","\n","^Kevin: Company name plus numbers. Birthdays. Anniversary dates.","\n","^Kevin: Derek uses his birthday or anniversary in everything. April 19th. Makes his passwords easy to guess.","\n","ev","str","^0419?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^That's useful, thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Yeah. I've told him it's a security risk but he doesn't listen.","\n","^Kevin: Here, I wrote down the common patterns people use. Might help with the audit.","\n",{"->":"hub"},null],"c-1":["\n",{"->":"hub"},null]}],null],"ask_about_derek":[["ev",true,"/ev",{"VAR=":"asked_about_derek","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Kevin: Derek's been here about 18 months. Senior Marketing Manager.","\n","^Kevin: At first he seemed normal. Then he started requesting \"enhanced privacy\" for his systems.","\n","^Kevin: Wanted separate network segments, encrypted communications, locked office at all times.","\n","^Kevin: Said it was for \"client confidentiality\" but... marketing doesn't need that level of security.","\n","ev","str","^What do you think he's really doing?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Maybe he's just paranoid","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Kevin: I don't know. But whatever it is, it's not marketing.","\n","^Kevin: He's been meeting with external people—calls them \"partners.\"","\n","^Kevin: I saw notes once that mentioned something called \"Operation Shatter.\"","\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev",{"->":"hub"},null],"c-1":["\n","^Kevin: Maybe. But Patricia didn't think so. And now she's gone.","\n",{"->":"hub"},null]}],null],"global decl":["ev",0,{"VAR=":"influence"},false,{"VAR=":"met_kevin"},false,{"VAR=":"discussed_audit"},false,{"VAR=":"asked_about_derek"},false,{"VAR=":"asked_about_passwords"},false,{"VAR=":"given_lockpick"},false,{"VAR=":"given_keycard"},false,{"VAR=":"given_password_hints"},false,{"VAR=":"warned_about_derek"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/ink/m01_npc_maya.ink b/scenarios/m01_first_contact/ink/m01_npc_maya.ink index 43652c1..7dd0fe0 100644 --- a/scenarios/m01_first_contact/ink/m01_npc_maya.ink +++ b/scenarios/m01_first_contact/ink/m01_npc_maya.ink @@ -1,29 +1,32 @@ // ================================================ -// Mission 1: First Contact - Maya Chen (Office Worker) -// Act 2: In-Person NPC (Optional) -// Provides office gossip and Derek intelligence +// Mission 1: First Contact - Maya Chen (Informant) +// Located in Maya's Office +// She is the informant who contacted SAFETYNET // ================================================ VAR influence = 0 VAR met_maya = false -VAR asked_about_derek = false -VAR asked_about_office = false -VAR asked_about_late_nights = false +VAR revealed_informant = false +VAR warned_about_derek = false +VAR discussed_operation = false +VAR asked_about_patricia = false // ================================================ // START: FIRST MEETING // ================================================ === start === +#set_variable:talked_to_maya=true +#complete_task:talk_to_maya {not met_maya: ~ met_maya = true - ~ influence += 1 - Maya: Oh, hi! You're the IT auditor, right? I'm Maya. - Maya: Taking a coffee break. This job is way too stressful sometimes. + ~ influence += 2 + Maya: *looks up nervously* Oh! You startled me. + Maya: You're the... IT contractor, right? The security auditor? -> first_meeting } {met_maya: - Maya: Hey again. Need anything? + Maya: *glances at door* Is it safe to talk? -> hub } @@ -32,13 +35,109 @@ VAR asked_about_late_nights = false // ================================================ === first_meeting === -+ [Nice to meet you. What do you do here?] ++ [That's right. I'm reviewing security systems] + Maya: *studies your face carefully* + Maya: Are you really here for a security audit? Or are you here because of my message? + -> reveal_check ++ [You seem nervous] ~ influence += 1 - Maya: Marketing coordinator. Basically, I make sure campaigns run on schedule. - Maya: Which means a lot of late nights when Derek decides to change everything last minute. + Maya: I have reason to be. Things aren't what they seem here. + -> reveal_check + +// ================================================ +// REVEAL CHECK +// ================================================ + +=== reveal_check === ++ [What message?] + Maya: The tip. To SAFETYNET. About Operation Shatter. + Maya: *pauses* If you don't know what I'm talking about, forget I said anything. + + + [I'm from SAFETYNET] + ~ revealed_informant = true + ~ influence += 5 + Maya: *visible relief* Thank god. I was starting to think no one would come. + -> informant_reveal + + + [Tell me more about this operation] + ~ influence += 2 + Maya: Only if you're here to stop it. People are going to die. + -> operation_details ++ [SAFETYNET sent me] + ~ revealed_informant = true + ~ influence += 5 + Maya: *exhales* Finally. I've been waiting for weeks. + -> informant_reveal + +// ================================================ +// INFORMANT REVEAL +// ================================================ + +=== informant_reveal === +Maya: I'm the one who contacted you. The anonymous tip. + +Maya: I was hired as a content analyst. I thought we were doing marketing. + +Maya: Then I started seeing the target lists. The psychological profiles. The projected casualties. + +Maya: They're planning to kill people. On purpose. They call it "Operation Shatter." + ++ [Tell me everything] + ~ discussed_operation = true + -> operation_details ++ [Who's behind it?] + ~ warned_about_derek = true + -> derek_intel + +// ================================================ +// OPERATION DETAILS +// ================================================ + +=== operation_details === +~ discussed_operation = true + +Maya: Operation Shatter is a coordinated disinformation attack. + +Maya: They've profiled over two million people. Diabetics, elderly, people with anxiety disorders. + +Maya: The plan is to send fake emergency messages—hospital closures, bank failures, government alerts. + +Maya: The panic will cause deaths. Heart attacks, missed medications, accidents. + +Maya: They've calculated it: 42 to 85 people will die in the first 24 hours. + ++ [And they're okay with that?] + Maya: Derek—he's the one running it—he calls it "education." + Maya: Says the deaths will teach people not to trust digital communications. + Maya: He's insane. But he believes every word. -> hub -+ [Stressful how?] - Maya: Oh, just the usual. Tight deadlines, demanding clients, coworkers who work weird hours. ++ [When does it launch?] + Maya: Sunday. 6 AM. That's when the messages go out. + Maya: You have three days to stop it. + -> hub + +// ================================================ +// DEREK INTEL +// ================================================ + +=== derek_intel === +~ warned_about_derek = true + +Maya: Derek Lawson. Senior Marketing Manager. But he's not really marketing. + +Maya: He's ENTROPY. Part of a cell called "Social Fabric." + +Maya: He reports to someone called "The Architect." I've seen the emails. + +Maya: Derek's the operations lead. He built the target lists, wrote the fake messages, coordinated with their technical people. + ++ [Where's the evidence?] + Maya: His office. His computer has the contingency plans. + Maya: His filing cabinet has the casualty projections. The code is his birthday—0419. + Maya: And the server room has the target database. Kevin has the keycard. + -> hub ++ [What about the others here?] + Maya: Kevin's innocent. He's suspicious of Derek but doesn't know the full picture. + Maya: Sarah just works reception. She doesn't know anything. + Maya: Patricia—the old manager—she figured it out. That's why they fired her. -> hub // ================================================ @@ -46,119 +145,73 @@ VAR asked_about_late_nights = false // ================================================ === hub === -+ {not asked_about_office} [What's the office culture like here?] - -> ask_office_culture -+ {not asked_about_derek} [You mentioned someone named Derek?] - -> ask_about_derek -+ {asked_about_derek and not asked_about_late_nights} [Tell me more about Derek's late nights] - -> ask_late_nights -+ [I should get back to work] ++ {not discussed_operation} [Tell me about Operation Shatter] + -> operation_details ++ {not warned_about_derek} [What can you tell me about Derek?] + -> derek_intel ++ {not asked_about_patricia} [What happened to Patricia?] + -> patricia_story ++ {revealed_informant} [What should I do first?] + -> tactical_advice ++ [I need to keep investigating] #exit_conversation - Maya: Sure, good luck with the audit! + Maya: Be careful. Derek's paranoid. If he suspects you're onto him, he has a plan to frame Kevin for everything. + Maya: I've seen the contingency files. Check Derek's computer. -> hub // ================================================ -// ASK ABOUT OFFICE CULTURE +// PATRICIA STORY // ================================================ -=== ask_office_culture === -~ asked_about_office = true -~ influence += 1 +=== patricia_story === +~ asked_about_patricia = true -Maya: It's pretty casual. Most people are friendly, collaborative. +Maya: Patricia Wells. She was our department manager. -Maya: Except for the few who treat this place like it's CIA headquarters. Locked offices, private meetings, "need to know" attitudes. +Maya: She noticed Derek's weird behavior. The late nights, the encrypted calls. -+ [Who's like that?] - ~ influence += 1 - -> secretive_people -+ [That's interesting] +Maya: She started investigating. Kept notes in her office safe. + +Maya: One day HR called her in. "Performance issues." She was gone within an hour. + +Maya: They didn't even let her take her briefcase. It's still in her office. + ++ [What's in the briefcase?] + Maya: Her investigation notes, I think. A timeline of how ENTROPY infiltrated the company. + Maya: The office is unlocked, but the briefcase is locked. Patricia took the key with her. + Maya: If you can pick the lock, there might be useful information inside. -> hub - -=== secretive_people === -Maya: Mainly Derek. He's all about "client confidentiality" and "strategic advantage." - -Maya: I get it—marketing is competitive. But sometimes it feels excessive. - --> hub - -// ================================================ -// ASK ABOUT DEREK -// ================================================ - -=== ask_about_derek === -~ asked_about_derek = true -~ influence += 1 - -Maya: Derek Lawson. Senior Marketing Manager. My direct supervisor. - -Maya: Smart guy, good at his job. But he's... intense. Always working, always on his phone with "strategic partners." - -+ [How long has he been here?] - -> derek_timeline -+ [Is he good to work for?] - -> derek_as_boss - -=== derek_timeline === -~ influence += 1 - -Maya: About three months. He came in and immediately started restructuring everything. - -Maya: Brought in new clients, new processes, new security protocols for the marketing department. - -+ [New security protocols?] - ~ influence += 2 - #complete_task:interview_maya - Maya: Yeah, insisted on encrypted communications, locked file servers, access controls. - Maya: Kevin had to set up a whole separate network segment for Derek's "sensitive client data." - -> hub -+ [Sounds like a go-getter] - Maya: Sure. If you like your boss being in the office until midnight every night. - -> hub - -=== derek_as_boss === -~ influence += 1 - -Maya: He's fine, I guess. Expects a lot, but that's not unusual. - -Maya: What's weird is how secretive he is. Won't let anyone access his files or his office. - -+ [That does seem excessive] - ~ influence += 1 - -> hub -+ [Maybe he's protecting client information] - Maya: Maybe. But we all handle client information. He's the only one with a locked office. ++ [That's suspicious timing] + Maya: Derek arranged it. I saw emails between him and HR. + Maya: Anyone who gets too close gets removed. -> hub // ================================================ -// ASK ABOUT LATE NIGHTS +// TACTICAL ADVICE // ================================================ -=== ask_late_nights === -~ asked_about_late_nights = true -~ influence += 2 +=== tactical_advice === +Maya: Okay, here's what you need: -Maya: He's here every night, super late. Says he's coordinating with clients in different time zones. +Maya: First, get into Derek's office. His spare key is in Patricia's old safe—she kept a copy. -Maya: But I've walked past his office and heard him talking about things that don't sound like marketing. +Maya: The safe code is 0419. Derek's anniversary. He uses it for everything. -+ [What kind of things?] - -> suspicious_conversations -+ [Like what?] - -> suspicious_conversations +Maya: Second, check Derek's computer. The contingency plan to frame Kevin is right there. -=== suspicious_conversations === -~ influence += 2 +Maya: Third, open his filing cabinet. Same code—0419. That's where the casualty projections are. -Maya: "Infrastructure targeting." "Phase 3 timeline." "Network mapping." +Maya: Fourth, get into the server room. Kevin has the keycard. The target database is there. -Maya: I figured it was some kind of new technical marketing strategy. But it sounded... I don't know, weird? +Maya: And if you can pick the lock on Patricia's briefcase, there's a timeline showing how long ENTROPY has been planning this. -+ [That's definitely unusual] - ~ influence += 2 - Maya: Right? I thought about asking him, but he gets defensive when you question his methods. - Maya: Anyway, probably nothing. I watch too many spy movies. ++ [That's a lot to do] + Maya: Operation Shatter launches Sunday. We don't have much time. + Maya: Oh, and there are VM systems in the server room. The attack infrastructure. + Maya: You'll need to collect evidence from there too. Submit any flags you find to prove we were inside their systems. -> hub -+ [Probably just marketing jargon] - Maya: Yeah, you're probably right. Still weird though. ++ [I'll get started] + #exit_conversation + Maya: Good luck. And... thank you. For coming. + Maya: I was starting to think no one cared about stopping this. -> hub diff --git a/scenarios/m01_first_contact/ink/m01_npc_maya.json b/scenarios/m01_first_contact/ink/m01_npc_maya.json index ecfe189..fa2b684 100644 --- a/scenarios/m01_first_contact/ink/m01_npc_maya.json +++ b/scenarios/m01_first_contact/ink/m01_npc_maya.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"met_maya"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev",true,"/ev",{"VAR=":"met_maya","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: Oh, hi! You're the IT auditor, right? I'm Maya.","\n","^Maya: Taking a coffee break. This job is way too stressful sometimes.","\n",{"->":"first_meeting"},{"->":"start.5"},null]}],"nop","\n","ev",{"VAR?":"met_maya"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Maya: Hey again. Need anything?","\n",{"->":"hub"},{"->":"start.11"},null]}],"nop","\n",null],"first_meeting":[["ev","str","^Nice to meet you. What do you do here?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Stressful how?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: Marketing coordinator. Basically, I make sure campaigns run on schedule.","\n","^Maya: Which means a lot of late nights when Derek decides to change everything last minute.","\n",{"->":"hub"},null],"c-1":["\n","^Maya: Oh, just the usual. Tight deadlines, demanding clients, coworkers who work weird hours.","\n",{"->":"hub"},null]}],null],"hub":[["ev","str","^What's the office culture like here?","/str",{"VAR?":"asked_about_office"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^You mentioned someone named Derek?","/str",{"VAR?":"asked_about_derek"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^Tell me more about Derek's late nights","/str",{"VAR?":"asked_about_derek"},{"VAR?":"asked_about_late_nights"},"!","&&","/ev",{"*":".^.c-2","flg":5},"ev","str","^I should get back to work","/str","/ev",{"*":".^.c-3","flg":4},{"c-0":["\n",{"->":"ask_office_culture"},null],"c-1":["\n",{"->":"ask_about_derek"},null],"c-2":["\n",{"->":"ask_late_nights"},null],"c-3":["\n","#","^exit_conversation","/#","^Maya: Sure, good luck with the audit!","\n",{"->":"hub"},null]}],null],"ask_office_culture":[["ev",true,"/ev",{"VAR=":"asked_about_office","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: It's pretty casual. Most people are friendly, collaborative.","\n","^Maya: Except for the few who treat this place like it's CIA headquarters. Locked offices, private meetings, \"need to know\" attitudes.","\n","ev","str","^Who's like that?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^That's interesting","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev",{"->":"secretive_people"},null],"c-1":["\n",{"->":"hub"},null]}],null],"secretive_people":["^Maya: Mainly Derek. He's all about \"client confidentiality\" and \"strategic advantage.\"","\n","^Maya: I get it—marketing is competitive. But sometimes it feels excessive.","\n",{"->":"hub"},null],"ask_about_derek":[["ev",true,"/ev",{"VAR=":"asked_about_derek","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: Derek Lawson. Senior Marketing Manager. My direct supervisor.","\n","^Maya: Smart guy, good at his job. But he's... intense. Always working, always on his phone with \"strategic partners.\"","\n","ev","str","^How long has he been here?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Is he good to work for?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_timeline"},null],"c-1":["\n",{"->":"derek_as_boss"},null]}],null],"derek_timeline":[["ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: About three months. He came in and immediately started restructuring everything.","\n","^Maya: Brought in new clients, new processes, new security protocols for the marketing department.","\n","ev","str","^New security protocols?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Sounds like a go-getter","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","#","^complete_task:interview_maya","/#","^Maya: Yeah, insisted on encrypted communications, locked file servers, access controls.","\n","^Maya: Kevin had to set up a whole separate network segment for Derek's \"sensitive client data.\"","\n",{"->":"hub"},null],"c-1":["\n","^Maya: Sure. If you like your boss being in the office until midnight every night.","\n",{"->":"hub"},null]}],null],"derek_as_boss":[["ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: He's fine, I guess. Expects a lot, but that's not unusual.","\n","^Maya: What's weird is how secretive he is. Won't let anyone access his files or his office.","\n","ev","str","^That does seem excessive","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Maybe he's protecting client information","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev",{"->":"hub"},null],"c-1":["\n","^Maya: Maybe. But we all handle client information. He's the only one with a locked office.","\n",{"->":"hub"},null]}],null],"ask_late_nights":[["ev",true,"/ev",{"VAR=":"asked_about_late_nights","re":true},"ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Maya: He's here every night, super late. Says he's coordinating with clients in different time zones.","\n","^Maya: But I've walked past his office and heard him talking about things that don't sound like marketing.","\n","ev","str","^What kind of things?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Like what?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"suspicious_conversations"},null],"c-1":["\n",{"->":"suspicious_conversations"},null]}],null],"suspicious_conversations":[["ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Maya: \"Infrastructure targeting.\" \"Phase 3 timeline.\" \"Network mapping.\"","\n","^Maya: I figured it was some kind of new technical marketing strategy. But it sounded... I don't know, weird?","\n","ev","str","^That's definitely unusual","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Probably just marketing jargon","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Maya: Right? I thought about asking him, but he gets defensive when you question his methods.","\n","^Maya: Anyway, probably nothing. I watch too many spy movies.","\n",{"->":"hub"},null],"c-1":["\n","^Maya: Yeah, you're probably right. Still weird though.","\n",{"->":"hub"},null]}],null],"global decl":["ev",0,{"VAR=":"influence"},false,{"VAR=":"met_maya"},false,{"VAR=":"asked_about_derek"},false,{"VAR=":"asked_about_office"},false,{"VAR=":"asked_about_late_nights"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["#","^set_variable:talked_to_maya=true","/#","#","^complete_task:talk_to_maya","/#","ev",{"VAR?":"met_maya"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev",true,"/ev",{"VAR=":"met_maya","re":true},"ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Maya: *looks up nervously* Oh! You startled me.","\n","^Maya: You're the... IT contractor, right? The security auditor?","\n",{"->":"first_meeting"},{"->":"start.11"},null]}],"nop","\n","ev",{"VAR?":"met_maya"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Maya: *glances at door* Is it safe to talk?","\n",{"->":"hub"},{"->":"start.17"},null]}],"nop","\n",null],"first_meeting":[["ev","str","^That's right. I'm reviewing security systems","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^You seem nervous","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Maya: *studies your face carefully*","\n","^Maya: Are you really here for a security audit? Or are you here because of my message?","\n",{"->":"reveal_check"},null],"c-1":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Maya: I have reason to be. Things aren't what they seem here.","\n",{"->":"reveal_check"},null]}],null],"reveal_check":[["ev","str","^What message?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^SAFETYNET sent me","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Maya: The tip. To SAFETYNET. About Operation Shatter.","\n","^Maya: *pauses* If you don't know what I'm talking about, forget I said anything.","\n",["ev","str","^I'm from SAFETYNET","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Tell me more about this operation","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"revealed_informant","re":true},"ev",{"VAR?":"influence"},5,"+",{"VAR=":"influence","re":true},"/ev","^Maya: *visible relief* Thank god. I was starting to think no one would come.","\n",{"->":"informant_reveal"},null],"c-1":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Maya: Only if you're here to stop it. People are going to die.","\n",{"->":"operation_details"},null]}],null],"c-1":["\n","ev",true,"/ev",{"VAR=":"revealed_informant","re":true},"ev",{"VAR?":"influence"},5,"+",{"VAR=":"influence","re":true},"/ev","^Maya: *exhales* Finally. I've been waiting for weeks.","\n",{"->":"informant_reveal"},null]}],null],"informant_reveal":[["^Maya: I'm the one who contacted you. The anonymous tip.","\n","^Maya: I was hired as a content analyst. I thought we were doing marketing.","\n","^Maya: Then I started seeing the target lists. The psychological profiles. The projected casualties.","\n","^Maya: They're planning to kill people. On purpose. They call it \"Operation Shatter.\"","\n","ev","str","^Tell me everything","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Who's behind it?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"discussed_operation","re":true},{"->":"operation_details"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"warned_about_derek","re":true},{"->":"derek_intel"},null]}],null],"operation_details":[["ev",true,"/ev",{"VAR=":"discussed_operation","re":true},"^Maya: Operation Shatter is a coordinated disinformation attack.","\n","^Maya: They've profiled over two million people. Diabetics, elderly, people with anxiety disorders.","\n","^Maya: The plan is to send fake emergency messages—hospital closures, bank failures, government alerts.","\n","^Maya: The panic will cause deaths. Heart attacks, missed medications, accidents.","\n","^Maya: They've calculated it: 42 to 85 people will die in the first 24 hours.","\n","ev","str","^And they're okay with that?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^When does it launch?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Maya: Derek—he's the one running it—he calls it \"education.\"","\n","^Maya: Says the deaths will teach people not to trust digital communications.","\n","^Maya: He's insane. But he believes every word.","\n",{"->":"hub"},null],"c-1":["\n","^Maya: Sunday. 6 AM. That's when the messages go out.","\n","^Maya: You have three days to stop it.","\n",{"->":"hub"},null]}],null],"derek_intel":[["ev",true,"/ev",{"VAR=":"warned_about_derek","re":true},"^Maya: Derek Lawson. Senior Marketing Manager. But he's not really marketing.","\n","^Maya: He's ENTROPY. Part of a cell called \"Social Fabric.\"","\n","^Maya: He reports to someone called \"The Architect.\" I've seen the emails.","\n","^Maya: Derek's the operations lead. He built the target lists, wrote the fake messages, coordinated with their technical people.","\n","ev","str","^Where's the evidence?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What about the others here?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Maya: His office. His computer has the contingency plans.","\n","^Maya: His filing cabinet has the casualty projections. The code is his birthday—0419.","\n","^Maya: And the server room has the target database. Kevin has the keycard.","\n",{"->":"hub"},null],"c-1":["\n","^Maya: Kevin's innocent. He's suspicious of Derek but doesn't know the full picture.","\n","^Maya: Sarah just works reception. She doesn't know anything.","\n","^Maya: Patricia—the old manager—she figured it out. That's why they fired her.","\n",{"->":"hub"},null]}],null],"hub":[["ev","str","^Tell me about Operation Shatter","/str",{"VAR?":"discussed_operation"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^What can you tell me about Derek?","/str",{"VAR?":"warned_about_derek"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^What happened to Patricia?","/str",{"VAR?":"asked_about_patricia"},"!","/ev",{"*":".^.c-2","flg":5},"ev","str","^What should I do first?","/str",{"VAR?":"revealed_informant"},"/ev",{"*":".^.c-3","flg":5},"ev","str","^I need to keep investigating","/str","/ev",{"*":".^.c-4","flg":4},{"c-0":["\n",{"->":"operation_details"},null],"c-1":["\n",{"->":"derek_intel"},null],"c-2":["\n",{"->":"patricia_story"},null],"c-3":["\n",{"->":"tactical_advice"},null],"c-4":["\n","#","^exit_conversation","/#","^Maya: Be careful. Derek's paranoid. If he suspects you're onto him, he has a plan to frame Kevin for everything.","\n","^Maya: I've seen the contingency files. Check Derek's computer.","\n",{"->":"hub"},null]}],null],"patricia_story":[["ev",true,"/ev",{"VAR=":"asked_about_patricia","re":true},"^Maya: Patricia Wells. She was our department manager.","\n","^Maya: She noticed Derek's weird behavior. The late nights, the encrypted calls.","\n","^Maya: She started investigating. Kept notes in her office safe.","\n","^Maya: One day HR called her in. \"Performance issues.\" She was gone within an hour.","\n","^Maya: They didn't even let her take her briefcase. It's still in her office.","\n","ev","str","^What's in the briefcase?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^That's suspicious timing","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Maya: Her investigation notes, I think. A timeline of how ENTROPY infiltrated the company.","\n","^Maya: The office is unlocked, but the briefcase is locked. Patricia took the key with her.","\n","^Maya: If you can pick the lock, there might be useful information inside.","\n",{"->":"hub"},null],"c-1":["\n","^Maya: Derek arranged it. I saw emails between him and HR.","\n","^Maya: Anyone who gets too close gets removed.","\n",{"->":"hub"},null]}],null],"tactical_advice":[["^Maya: Okay, here's what you need:","\n","^Maya: First, get into Derek's office. His spare key is in Patricia's old safe—she kept a copy.","\n","^Maya: The safe code is 0419. Derek's anniversary. He uses it for everything.","\n","^Maya: Second, check Derek's computer. The contingency plan to frame Kevin is right there.","\n","^Maya: Third, open his filing cabinet. Same code—0419. That's where the casualty projections are.","\n","^Maya: Fourth, get into the server room. Kevin has the keycard. The target database is there.","\n","^Maya: And if you can pick the lock on Patricia's briefcase, there's a timeline showing how long ENTROPY has been planning this.","\n","ev","str","^That's a lot to do","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll get started","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Maya: Operation Shatter launches Sunday. We don't have much time.","\n","^Maya: Oh, and there are VM systems in the server room. The attack infrastructure.","\n","^Maya: You'll need to collect evidence from there too. Submit any flags you find to prove we were inside their systems.","\n",{"->":"hub"},null],"c-1":["\n","#","^exit_conversation","/#","^Maya: Good luck. And... thank you. For coming.","\n","^Maya: I was starting to think no one cared about stopping this.","\n",{"->":"hub"},null]}],null],"global decl":["ev",0,{"VAR=":"influence"},false,{"VAR=":"met_maya"},false,{"VAR=":"revealed_informant"},false,{"VAR=":"warned_about_derek"},false,{"VAR=":"discussed_operation"},false,{"VAR=":"asked_about_patricia"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/ink/m01_npc_sarah.ink b/scenarios/m01_first_contact/ink/m01_npc_sarah.ink index df33a10..d17dd62 100644 --- a/scenarios/m01_first_contact/ink/m01_npc_sarah.ink +++ b/scenarios/m01_first_contact/ink/m01_npc_sarah.ink @@ -1,15 +1,16 @@ // ================================================ // Mission 1: First Contact - Sarah Martinez (Receptionist) -// Act 2: In-Person NPC -// Entry point, provides visitor badge and basic intel +// Entry point NPC - provides badge and main office key // ================================================ VAR influence = 0 VAR met_sarah = false VAR has_badge = false +VAR has_office_key = false VAR asked_about_derek = false VAR asked_about_office = false VAR asked_about_kevin = false +VAR asked_about_manager = false // ================================================ // START: FIRST MEETING @@ -20,7 +21,7 @@ VAR asked_about_kevin = false ~ met_sarah = true ~ influence += 2 Sarah: Hi! You must be the IT contractor. I'm Sarah, the receptionist. - Sarah: Let me get you checked in. + Sarah: Let me get you checked in for the security audit. -> first_checkin } {met_sarah: @@ -35,25 +36,40 @@ VAR asked_about_kevin = false === first_checkin === + [Thanks. I'm here to audit your network security] ~ influence += 1 - Sarah: Oh good! Kevin mentioned you'd be coming. - Sarah: Let me print your visitor badge. - -> receive_badge + Sarah: Oh good! Kevin mentioned you'd be coming. He's been asking for a security review for months. + -> receive_items + [Just point me to IT and I'll get started] - Sarah: Sure thing. Let me get your badge first. - -> receive_badge + Sarah: Sure thing. Let me get you set up first. + -> receive_items // ================================================ -// RECEIVE BADGE +// RECEIVE BADGE AND KEY // ================================================ -=== receive_badge === +=== receive_items === ~ has_badge = true +~ has_office_key = true #give_item:id_badge -#complete_task:meet_reception +#give_item:key +#complete_task:check_in_reception -Sarah: Here you go. This gets you into public areas. +Sarah: Here's your visitor badge and a key for the main office area. -Sarah: Restricted areas need keycard access or you'll need to ask Kevin. +Sarah: The office door is usually locked during audits—confidentiality protocols, you know. + +Sarah: Kevin should be in the IT room. It's through the main office, on the east side. + ++ [Where exactly is the IT room?] + -> ask_it_location ++ [Thanks, I'll head in] + -> hub + +=== ask_it_location === +Sarah: Go through the main office, then look for the door marked "IT" on the east wall. + +Sarah: The IT room has a keypad lock. Kevin's the one who knows the code. + +Sarah: Actually, I think there's a maintenance checklist somewhere in the main office with the codes. Kevin keeps forgetting them. -> hub @@ -62,98 +78,99 @@ Sarah: Restricted areas need keycard access or you'll need to ask Kevin. // ================================================ === hub === -+ {not asked_about_kevin} [Where can I find Kevin?] - -> ask_kevin_location -+ {not asked_about_office} [Can you tell me about the office layout?] ++ {not asked_about_kevin} [Tell me about Kevin] + -> ask_kevin ++ {not asked_about_office} [What's the office layout like?] -> ask_office_layout -+ {not asked_about_derek and influence >= 3} [Anyone working late I should know about?] - -> ask_late_workers ++ {not asked_about_derek and influence >= 3} [Anyone else I should know about?] + -> ask_about_staff ++ {not asked_about_manager} [I noticed the manager's office is vacant?] + -> ask_about_manager + [Thanks, I'll get started] #exit_conversation - Sarah: Good luck with the audit! + Sarah: Good luck with the audit! Let me know if you need anything. -> hub // ================================================ // ASK ABOUT KEVIN // ================================================ -=== ask_kevin_location === +=== ask_kevin === ~ asked_about_kevin = true ~ influence += 1 -Sarah: Kevin's desk is in the main office area—can't miss it. Covered in monitors and coffee cups. +Sarah: Kevin's our IT manager. Really nice guy, kind of overworked. -Sarah: He's usually there this time of day. +Sarah: He's been worried about security lately. Says someone's been accessing servers without authorization. -+ [What's he like?] - -> kevin_personality -+ [Thanks] ++ [Who would do that?] + Sarah: I don't know. He mentioned it to management but nothing happened. + Sarah: He seems stressed about it. Maybe you can help him figure it out. + -> hub ++ [I'll talk to him] -> hub -=== kevin_personality === -~ influence += 1 - -Sarah: Super helpful, kind of overworked. The company relies on him way too much. - -Sarah: He'll appreciate having someone competent help out. - --> hub - // ================================================ -// ASK ABOUT OFFICE +// ASK ABOUT OFFICE LAYOUT // ================================================ === ask_office_layout === ~ asked_about_office = true ~ influence += 1 -Sarah: Main office is through there—hot-desking setup. Conference room on the west side, break room to the east. +Sarah: Main office is through that door—open plan with desks for the team. -Sarah: Server room is behind main office, but you'll need Kevin's access for that. +Sarah: Around the edges you've got: +Sarah: • IT room on the east (where Kevin hangs out) +Sarah: • Conference room also on the east +Sarah: • Storage closet and break room on the west +Sarah: • Private offices on the north—Derek, Maya, and the vacant manager's office -+ [What about executive offices?] - -> ask_executive_offices ++ [Lots of private offices] + Sarah: Yeah, the senior staff each have their own space. Derek especially values his privacy. + -> hub + [Got it, thanks] -> hub -=== ask_executive_offices === -~ influence += 1 - -Sarah: Derek's office is off the main area—he's our Senior Marketing Manager. Usually locks his door when he's out. - -Sarah: Most people just have desk space, but Derek got an office because of client confidentiality stuff. - --> hub - // ================================================ -// ASK ABOUT LATE WORKERS +// ASK ABOUT STAFF // ================================================ -=== ask_late_workers === +=== ask_about_staff === ~ asked_about_derek = true ~ influence += 1 -Sarah: Derek's usually here late. Like, really late. Sometimes I leave at 6 and he's still working. +Sarah: Well, there's Derek Lawson—Senior Marketing Manager. He's... intense. -Sarah: He says it's because of client timezones, but... +Sarah: Works late a lot. Like, really late. Sometimes I see his access logs from after midnight. -+ [But what?] - -> derek_suspicion -+ [Dedication, I guess] - -> hub - -=== derek_suspicion === -~ influence += 2 - -Sarah: I don't know. It just seems weird, you know? He's marketing, not IT. - -Sarah: And I've seen him in the server room a couple times. Told me he was checking on campaign servers. - -+ [That does seem odd] ++ [That seems unusual] ~ influence += 1 - #unlock_task:investigate_derek - Sarah: Right? But I'm just the receptionist. What do I know? + Sarah: Yeah. He says it's for client calls in different time zones, but... + Sarah: I don't know. Something about him makes me uncomfortable. -> hub -+ [Maybe he's just thorough] - Sarah: Maybe. Anyway, Kevin would know more about the technical stuff. ++ [Some people are just dedicated] + Sarah: Maybe. Anyway, Maya Chen is nice. Content analyst. She's been here about a year. + -> hub + +// ================================================ +// ASK ABOUT MANAGER +// ================================================ + +=== ask_about_manager === +~ asked_about_manager = true +~ influence += 1 + +Sarah: Oh, that was Patricia's office. She was our department manager. + +Sarah: She got fired about a month ago. Really sudden. "Performance issues" they said. + ++ [That sounds suspicious] + ~ influence += 2 + Sarah: Between us? Patricia was asking questions about Derek's projects. + Sarah: Next thing you know, HR calls her in and she's gone. + Sarah: Her briefcase is still in there. They escorted her out so fast she couldn't take everything. + -> hub ++ [These things happen] + Sarah: I guess. Her office has been empty since. It's kind of creepy. -> hub diff --git a/scenarios/m01_first_contact/ink/m01_npc_sarah.json b/scenarios/m01_first_contact/ink/m01_npc_sarah.json index 64b26d4..4130138 100644 --- a/scenarios/m01_first_contact/ink/m01_npc_sarah.json +++ b/scenarios/m01_first_contact/ink/m01_npc_sarah.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"met_sarah"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev",true,"/ev",{"VAR=":"met_sarah","re":true},"ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Hi! You must be the IT contractor. I'm Sarah, the receptionist.","\n","^Sarah: Let me get you checked in.","\n",{"->":"first_checkin"},{"->":"start.5"},null]}],"nop","\n","ev",{"VAR?":"met_sarah"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Sarah: Hey, need anything else?","\n",{"->":"hub"},{"->":"start.11"},null]}],"nop","\n",null],"first_checkin":[["ev","str","^Thanks. I'm here to audit your network security","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Just point me to IT and I'll get started","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Oh good! Kevin mentioned you'd be coming.","\n","^Sarah: Let me print your visitor badge.","\n",{"->":"receive_badge"},null],"c-1":["\n","^Sarah: Sure thing. Let me get your badge first.","\n",{"->":"receive_badge"},null]}],null],"receive_badge":["ev",true,"/ev",{"VAR=":"has_badge","re":true},"#","^give_item:id_badge","/#","#","^complete_task:meet_reception","/#","^Sarah: Here you go. This gets you into public areas.","\n","^Sarah: Restricted areas need keycard access or you'll need to ask Kevin.","\n",{"->":"hub"},null],"hub":[["ev","str","^Where can I find Kevin?","/str",{"VAR?":"asked_about_kevin"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^Can you tell me about the office layout?","/str",{"VAR?":"asked_about_office"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^Anyone working late I should know about?","/str",{"VAR?":"asked_about_derek"},"!",{"VAR?":"influence"},3,">=","&&","/ev",{"*":".^.c-2","flg":5},"ev","str","^Thanks, I'll get started","/str","/ev",{"*":".^.c-3","flg":4},{"c-0":["\n",{"->":"ask_kevin_location"},null],"c-1":["\n",{"->":"ask_office_layout"},null],"c-2":["\n",{"->":"ask_late_workers"},null],"c-3":["\n","#","^exit_conversation","/#","^Sarah: Good luck with the audit!","\n",{"->":"hub"},null]}],null],"ask_kevin_location":[["ev",true,"/ev",{"VAR=":"asked_about_kevin","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Kevin's desk is in the main office area—can't miss it. Covered in monitors and coffee cups.","\n","^Sarah: He's usually there this time of day.","\n","ev","str","^What's he like?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"kevin_personality"},null],"c-1":["\n",{"->":"hub"},null]}],null],"kevin_personality":["ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Super helpful, kind of overworked. The company relies on him way too much.","\n","^Sarah: He'll appreciate having someone competent help out.","\n",{"->":"hub"},null],"ask_office_layout":[["ev",true,"/ev",{"VAR=":"asked_about_office","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Main office is through there—hot-desking setup. Conference room on the west side, break room to the east.","\n","^Sarah: Server room is behind main office, but you'll need Kevin's access for that.","\n","ev","str","^What about executive offices?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it, thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"ask_executive_offices"},null],"c-1":["\n",{"->":"hub"},null]}],null],"ask_executive_offices":["ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Derek's office is off the main area—he's our Senior Marketing Manager. Usually locks his door when he's out.","\n","^Sarah: Most people just have desk space, but Derek got an office because of client confidentiality stuff.","\n",{"->":"hub"},null],"ask_late_workers":[["ev",true,"/ev",{"VAR=":"asked_about_derek","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Derek's usually here late. Like, really late. Sometimes I leave at 6 and he's still working.","\n","^Sarah: He says it's because of client timezones, but...","\n","ev","str","^But what?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Dedication, I guess","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_suspicion"},null],"c-1":["\n",{"->":"hub"},null]}],null],"derek_suspicion":[["ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: I don't know. It just seems weird, you know? He's marketing, not IT.","\n","^Sarah: And I've seen him in the server room a couple times. Told me he was checking on campaign servers.","\n","ev","str","^That does seem odd","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Maybe he's just thorough","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","#","^unlock_task:investigate_derek","/#","^Sarah: Right? But I'm just the receptionist. What do I know?","\n",{"->":"hub"},null],"c-1":["\n","^Sarah: Maybe. Anyway, Kevin would know more about the technical stuff.","\n",{"->":"hub"},null]}],null],"global decl":["ev",0,{"VAR=":"influence"},false,{"VAR=":"met_sarah"},false,{"VAR=":"has_badge"},false,{"VAR=":"asked_about_derek"},false,{"VAR=":"asked_about_office"},false,{"VAR=":"asked_about_kevin"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"met_sarah"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev",true,"/ev",{"VAR=":"met_sarah","re":true},"ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Hi! You must be the IT contractor. I'm Sarah, the receptionist.","\n","^Sarah: Let me get you checked in for the security audit.","\n",{"->":"first_checkin"},{"->":"start.5"},null]}],"nop","\n","ev",{"VAR?":"met_sarah"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Sarah: Hey, need anything else?","\n",{"->":"hub"},{"->":"start.11"},null]}],"nop","\n",null],"first_checkin":[["ev","str","^Thanks. I'm here to audit your network security","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Just point me to IT and I'll get started","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Oh good! Kevin mentioned you'd be coming. He's been asking for a security review for months.","\n",{"->":"receive_items"},null],"c-1":["\n","^Sarah: Sure thing. Let me get you set up first.","\n",{"->":"receive_items"},null]}],null],"receive_items":[["ev",true,"/ev",{"VAR=":"has_badge","re":true},"ev",true,"/ev",{"VAR=":"has_office_key","re":true},"#","^give_item:id_badge","/#","#","^give_item:key","/#","#","^complete_task:check_in_reception","/#","^Sarah: Here's your visitor badge and a key for the main office area.","\n","^Sarah: The office door is usually locked during audits—confidentiality protocols, you know.","\n","^Sarah: Kevin should be in the IT room. It's through the main office, on the east side.","\n","ev","str","^Where exactly is the IT room?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks, I'll head in","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"ask_it_location"},null],"c-1":["\n",{"->":"hub"},null]}],null],"ask_it_location":["^Sarah: Go through the main office, then look for the door marked \"IT\" on the east wall.","\n","^Sarah: The IT room has a keypad lock. Kevin's the one who knows the code.","\n","^Sarah: Actually, I think there's a maintenance checklist somewhere in the main office with the codes. Kevin keeps forgetting them.","\n",{"->":"hub"},null],"hub":[["ev","str","^Tell me about Kevin","/str",{"VAR?":"asked_about_kevin"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^What's the office layout like?","/str",{"VAR?":"asked_about_office"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^Anyone else I should know about?","/str",{"VAR?":"asked_about_derek"},"!",{"VAR?":"influence"},3,">=","&&","/ev",{"*":".^.c-2","flg":5},"ev","str","^I noticed the manager's office is vacant?","/str",{"VAR?":"asked_about_manager"},"!","/ev",{"*":".^.c-3","flg":5},"ev","str","^Thanks, I'll get started","/str","/ev",{"*":".^.c-4","flg":4},{"c-0":["\n",{"->":"ask_kevin"},null],"c-1":["\n",{"->":"ask_office_layout"},null],"c-2":["\n",{"->":"ask_about_staff"},null],"c-3":["\n",{"->":"ask_about_manager"},null],"c-4":["\n","#","^exit_conversation","/#","^Sarah: Good luck with the audit! Let me know if you need anything.","\n",{"->":"hub"},null]}],null],"ask_kevin":[["ev",true,"/ev",{"VAR=":"asked_about_kevin","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Kevin's our IT manager. Really nice guy, kind of overworked.","\n","^Sarah: He's been worried about security lately. Says someone's been accessing servers without authorization.","\n","ev","str","^Who would do that?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'll talk to him","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Sarah: I don't know. He mentioned it to management but nothing happened.","\n","^Sarah: He seems stressed about it. Maybe you can help him figure it out.","\n",{"->":"hub"},null],"c-1":["\n",{"->":"hub"},null]}],null],"ask_office_layout":[["ev",true,"/ev",{"VAR=":"asked_about_office","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Main office is through that door—open plan with desks for the team.","\n","^Sarah: Around the edges you've got:","\n","^Sarah: • IT room on the east (where Kevin hangs out)","\n","^Sarah: • Conference room also on the east","\n","^Sarah: • Storage closet and break room on the west","\n","^Sarah: • Private offices on the north—Derek, Maya, and the vacant manager's office","\n","ev","str","^Lots of private offices","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it, thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Sarah: Yeah, the senior staff each have their own space. Derek especially values his privacy.","\n",{"->":"hub"},null],"c-1":["\n",{"->":"hub"},null]}],null],"ask_about_staff":[["ev",true,"/ev",{"VAR=":"asked_about_derek","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Well, there's Derek Lawson—Senior Marketing Manager. He's... intense.","\n","^Sarah: Works late a lot. Like, really late. Sometimes I see his access logs from after midnight.","\n","ev","str","^That seems unusual","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Some people are just dedicated","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Yeah. He says it's for client calls in different time zones, but...","\n","^Sarah: I don't know. Something about him makes me uncomfortable.","\n",{"->":"hub"},null],"c-1":["\n","^Sarah: Maybe. Anyway, Maya Chen is nice. Content analyst. She's been here about a year.","\n",{"->":"hub"},null]}],null],"ask_about_manager":[["ev",true,"/ev",{"VAR=":"asked_about_manager","re":true},"ev",{"VAR?":"influence"},1,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Oh, that was Patricia's office. She was our department manager.","\n","^Sarah: She got fired about a month ago. Really sudden. \"Performance issues\" they said.","\n","ev","str","^That sounds suspicious","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^These things happen","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",{"VAR?":"influence"},2,"+",{"VAR=":"influence","re":true},"/ev","^Sarah: Between us? Patricia was asking questions about Derek's projects.","\n","^Sarah: Next thing you know, HR calls her in and she's gone.","\n","^Sarah: Her briefcase is still in there. They escorted her out so fast she couldn't take everything.","\n",{"->":"hub"},null],"c-1":["\n","^Sarah: I guess. Her office has been empty since. It's kind of creepy.","\n",{"->":"hub"},null]}],null],"global decl":["ev",0,{"VAR=":"influence"},false,{"VAR=":"met_sarah"},false,{"VAR=":"has_badge"},false,{"VAR=":"has_office_key"},false,{"VAR=":"asked_about_derek"},false,{"VAR=":"asked_about_office"},false,{"VAR=":"asked_about_kevin"},false,{"VAR=":"asked_about_manager"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/ink/m01_opening_briefing.ink b/scenarios/m01_first_contact/ink/m01_opening_briefing.ink index e06d1e9..7c2b2bc 100644 --- a/scenarios/m01_first_contact/ink/m01_opening_briefing.ink +++ b/scenarios/m01_first_contact/ink/m01_opening_briefing.ink @@ -2,13 +2,17 @@ // Mission 1: First Contact - Opening Briefing // Act 1: Interactive Cutscene // Agent 0x99 "Haxolottle" briefs Agent 0x00 +// UPDATED: Operation Shatter - Clear evil threat +// UPDATED: Removed vague "approach" choice - outcomes +// now based on actual player decisions // ================================================ -// Variables for tracking player choices -VAR player_approach = "" // cautious, confident, adaptable +// Variables for tracking what player asked about (affects debrief) VAR asked_about_stakes = false -VAR asked_about_entropy = false -VAR asked_about_cover = false +VAR asked_about_casualties = false +VAR asked_about_architect = false +VAR asked_about_derek = false +VAR asked_about_maya = false VAR mission_accepted = false // External variables @@ -21,12 +25,11 @@ VAR player_name = "Agent 0x00" === start === Agent 0x99: {player_name}, thanks for getting here on short notice. -Agent 0x99: We have a situation developing at Viral Dynamics Media. +Agent 0x99: We have a situation developing at Viral Dynamics Media. And it's worse than we initially thought. + [What's the situation?] -> briefing_threat + [I'm ready. What's the mission?] - ~ player_approach = "confident" -> briefing_threat + [How urgent is this?] ~ asked_about_stakes = true @@ -37,29 +40,166 @@ Agent 0x99: We have a situation developing at Viral Dynamics Media. // ================================================ === urgency_explanation === -Agent 0x99: ENTROPY's Social Fabric cell is operating inside Viral Dynamics right now. +Agent 0x99: We're 72 hours from a mass casualty event. -Agent 0x99: They're running disinformation campaigns targeting the upcoming election. +Agent 0x99: ENTROPY's Social Fabric cell is operating inside Viral Dynamics. But they're not just running disinformation campaigns. + +Agent 0x99: They're planning something called "Operation Shatter." -> briefing_threat // ================================================ -// THREAT BRIEFING +// THREAT BRIEFING - OPERATION SHATTER // ================================================ === briefing_threat === -Agent 0x99: Social Fabric specializes in information manipulation—narrative control, social engineering at scale. +Agent 0x99: Three weeks ago, our AI flagged something bigger than election interference. -Agent 0x99: They've infiltrated Viral Dynamics as employees. We don't know how many operatives, but we've identified at least one. +Agent 0x99: Social Fabric has spent three months collecting psychological profiles. Detailed vulnerability assessments on over two million people in the region. -+ [Who's the target operative?] ++ [What kind of profiles?] + -> profile_details ++ [What are they planning to do with them?] + -> operation_shatter ++ [Two million people?] + -> profile_scale + +// ================================================ +// PROFILE DETAILS +// ================================================ + +=== profile_details === +Agent 0x99: Medical records. Prescription histories. Financial stress indicators. Documented anxiety disorders. + +Agent 0x99: They've identified who has insulin dependencies. Who relies on weekly dialysis. Who lives alone without family support. + +Agent 0x99: This isn't demographic marketing data. This is a targeting database for psychological warfare. + ++ [What are they going to do with it?] + -> operation_shatter ++ [How did they get this data?] + -> data_source + +=== data_source === +Agent 0x99: The usual methods—breached insurance databases, compromised pharmacy systems, scraped social media. + +Agent 0x99: But the concerning part isn't how they got it. It's what they're planning to do with it. + +-> operation_shatter + +=== profile_scale === +Agent 0x99: 2.3 million profiles, to be precise. And each one includes a vulnerability score. + +Agent 0x99: They've categorized people by how likely they are to panic. To make dangerous decisions. To die if they receive the wrong message at the wrong time. + +-> operation_shatter + +// ================================================ +// OPERATION SHATTER - THE EVIL PLAN +// ================================================ + +=== operation_shatter === +Agent 0x99: We intercepted fragments of something called "Operation Shatter." + +Agent 0x99: Simultaneous fake crisis messages. Personalized. Targeted at the most vulnerable populations. + ++ [What kind of crisis messages?] + -> crisis_details ++ [What's the goal?] + -> entropy_goal + +=== crisis_details === +Agent 0x99: Fake hospital system collapses. "Your appointment has been cancelled. All patient records corrupted." + +Agent 0x99: Fake bank failures. "Your funds are frozen due to suspected breach." + +Agent 0x99: Fake infrastructure attacks. "Water contaminated. Power grid compromised." + +Agent 0x99: All delivered simultaneously to people they've profiled as most likely to panic. + ++ [That would cause mass chaos...] + -> casualty_projections ++ [People could die from that.] + ~ asked_about_casualties = true + -> casualty_projections + +=== entropy_goal === +Agent 0x99: Social Fabric's philosophy is "truth is obsolete, only narrative matters." + +Agent 0x99: But this goes beyond philosophy. They want to permanently destroy public trust in digital communications. + +Agent 0x99: And they're willing to kill people to make their point. + +-> casualty_projections + +// ================================================ +// CASUALTY PROJECTIONS - THE HORROR +// ================================================ + +=== casualty_projections === +Agent 0x99: {player_name}, I need you to understand what we're dealing with. + +Agent 0x99: We recovered fragments of their impact assessment. They've calculated projected casualties. + ++ [How many?] + ~ asked_about_casualties = true + -> casualty_numbers ++ [They're planning to kill people?] + ~ asked_about_casualties = true + -> casualty_numbers + +=== casualty_numbers === +Agent 0x99: Their own estimates: 42 to 85 direct deaths in the first 24 hours. + +Agent 0x99: Diabetics who skip insulin because they believe hospitals are compromised. Elderly who have heart attacks from fake bank failure notices. Traffic fatalities from evacuation panic. + +Agent 0x99: And they consider these deaths... acceptable. "Educational," they call it. + ++ [That's monstrous.] + -> villain_philosophy ++ [We have to stop this.] + -> mission_objectives + +=== villain_philosophy === +Agent 0x99: The fragment we recovered includes a note from someone called "The Architect." + +Agent 0x99: "These are not victims. They are examples. Their deaths will save thousands who learn the lesson: Trust nothing. Verify everything." + +Agent 0x99: They're true believers, {player_name}. They think murdering people is "teaching a lesson." + ++ [Who's The Architect?] + ~ asked_about_architect = true + -> architect_mention ++ [What's my mission?] + -> mission_objectives + +=== architect_mention === +Agent 0x99: We don't know yet. Someone coordinating ENTROPY cells at a strategic level. + +Agent 0x99: But that's a problem for later. Right now, we stop Operation Shatter. + +-> mission_objectives + +// ================================================ +// MISSION OBJECTIVES +// ================================================ + +=== mission_objectives === +Agent 0x99: Your objectives: + +Agent 0x99: One—Find the complete Operation Shatter documentation. Target lists, message templates, deployment timeline. + +Agent 0x99: Two—Identify all ENTROPY operatives inside Viral Dynamics. + +Agent 0x99: Three—Stop the operation before Sunday. That's when they deploy. + ++ [How do I get inside?] + -> cover_story ++ [Who's the primary target?] + ~ asked_about_derek = true -> operative_identity -+ [What are they trying to accomplish?] - ~ asked_about_entropy = true - -> entropy_objectives -+ [What's at stake if they succeed?] - ~ asked_about_stakes = true - -> stakes_explanation ++ [What resources do I have?] + -> resources_available // ================================================ // OPERATIVE IDENTITY @@ -68,87 +208,23 @@ Agent 0x99: They've infiltrated Viral Dynamics as employees. We don't know how m === operative_identity === Agent 0x99: Derek Lawson. Senior Marketing Manager at Viral Dynamics. -Agent 0x99: Perfect cover—his job is literally manipulating narratives for clients. +Agent 0x99: Perfect cover—his job is literally manipulating narratives for clients. He's been there three months, which aligns with when the data collection started. -+ [How long has he been there?] - -> infiltration_timeline -+ [What's my objective?] - -> mission_objectives +Agent 0x99: He's not just running operations. He authored parts of the casualty projections we intercepted. -=== infiltration_timeline === -Agent 0x99: Three months. Long enough to install backdoors, build trust, map the organization. - -Agent 0x99: He's not just stealing data—he's weaponizing the company's media distribution network. - -+ [What's my objective?] - -> mission_objectives -+ [What happens if they succeed?] - ~ asked_about_stakes = true - -> stakes_explanation - -// ================================================ -// ENTROPY OBJECTIVES -// ================================================ - -=== entropy_objectives === -Agent 0x99: They're collecting demographic data, testing disinformation tactics, mapping influence networks. - -Agent 0x99: It's all feeding into something bigger—Phase 3, though we don't know details yet. - -+ [What's Phase 3?] - -> phase_3_explanation -+ [What's my mission?] - -> mission_objectives - -=== phase_3_explanation === -Agent 0x99: That's what we're trying to figure out. Multiple cells collecting different types of data. - -Agent 0x99: Social Fabric handles narrative manipulation. Other cells focus on infrastructure, finance, healthcare. - -+ [So this is part of something larger] - -> larger_threat -+ [What do I need to do?] - -> mission_objectives - -=== larger_threat === -Agent 0x99: Exactly. But right now, we stop this cell. One operation at a time. - --> mission_objectives - -// ================================================ -// STAKES EXPLANATION -// ================================================ - -=== stakes_explanation === -Agent 0x99: If they succeed, they'll manipulate election coverage across social media and news outlets. - -Agent 0x99: Viral Dynamics has distribution deals with dozens of platforms. Derek controls what millions see. - -+ [That's... significant] - -> mission_objectives -+ [We have to stop this] - -> mission_objectives - -// ================================================ -// MISSION OBJECTIVES -// ================================================ - -=== mission_objectives === -Agent 0x99: Your primary objectives: - -Agent 0x99: One—Identify all ENTROPY operatives inside Viral Dynamics. - -Agent 0x99: Two—Gather evidence of the disinformation operation. - -Agent 0x99: Three—Intercept their communications with other cells. - -+ [How do I get inside?] - ~ asked_about_cover = true ++ [He calculated how many people would die?] + -> derek_author ++ [How do I get to him?] -> cover_story -+ [What resources do I have?] - -> resources_available -+ [Sounds straightforward] - -> approach_discussion + +=== derek_author === +Agent 0x99: His signature is on the medical dependency targeting document. + +Agent 0x99: He personally identified which populations would be most vulnerable to fake hospital closure messages. + +Agent 0x99: This isn't a foot soldier following orders. He's an architect of mass casualties. + +-> cover_story // ================================================ // COVER STORY @@ -157,7 +233,7 @@ Agent 0x99: Three—Intercept their communications with other cells. === cover_story === Agent 0x99: You're going in as an IT contractor hired to audit their network security. -Agent 0x99: Completely legitimate. Viral Dynamics actually requested the audit weeks ago. +Agent 0x99: Completely legitimate. Viral Dynamics actually requested the audit weeks ago. We just... made sure we got the contract. + [So I'll have access to technical systems] -> technical_access @@ -167,16 +243,29 @@ Agent 0x99: Completely legitimate. Viral Dynamics actually requested the audit w === technical_access === Agent 0x99: Server room, computers, network infrastructure—all fair game under your cover. -Agent 0x99: Just stay professional. IT contractors ask questions; that's expected. +Agent 0x99: That's where you'll find the Operation Shatter files. Derek keeps them encrypted, but they're there. --> approach_discussion +-> innocent_warning === employee_interaction === -Agent 0x99: IT contractors interact with everyone. Use it. +Agent 0x99: Most employees at Viral Dynamics have no idea what's happening. -Agent 0x99: People trust IT. They'll share passwords, complain about systems, gossip about coworkers. +Agent 0x99: They think they work at a marketing agency. The Operation Shatter team is isolated—maybe three or four people total. --> approach_discussion +Agent 0x99: Everyone else is innocent. They'll go home to families tonight with no idea their company was planning to kill people. + +-> innocent_warning + +=== innocent_warning === +Agent 0x99: One more thing: there's a journalist there named Maya Chen. + +Agent 0x99: She contacted us anonymously. Suspected something was wrong but doesn't know the full scope. She thinks it's corporate fraud, not mass murder. + +Agent 0x99: Protect her identity. If Derek finds out she tipped us off, she's in danger. + +~ asked_about_maya = true + +-> resources_available // ================================================ // RESOURCES AVAILABLE @@ -189,55 +278,26 @@ Agent 0x99: There's a SAFETYNET drop-site terminal in their server room for subm + [What about tools?] -> tools_discussion -+ [Got it. What's the approach?] - -> approach_discussion ++ [I'm ready to go] + -> final_instructions === tools_discussion === Agent 0x99: Your contractor kit has lockpicks, RFID cloner, and analysis tools. Agent 0x99: Everything you need looks like standard IT equipment. Stay in character. --> approach_discussion +Agent 0x99: And {player_name}—when you find those casualty projections, photograph everything. We need complete documentation. -// ================================================ -// APPROACH DISCUSSION -// ================================================ - -=== approach_discussion === -Agent 0x99: How do you want to handle this? - -+ [Careful and methodical—thorough investigation] - ~ player_approach = "cautious" - You: I'll take my time. Thorough beats fast. - Agent 0x99: Smart. Don't miss anything critical. - -> final_instructions -+ [Quick and focused—complete objectives efficiently] - ~ player_approach = "confident" - You: I'll move quickly and get results. - Agent 0x99: Good. Just don't rush past important evidence. - -> final_instructions -+ [Adaptable—read the situation as it develops] - ~ player_approach = "adaptable" - You: I'll adapt based on what I find. - Agent 0x99: Flexible thinking. Trust your instincts. - -> final_instructions +-> final_instructions // ================================================ // FINAL INSTRUCTIONS // ================================================ === final_instructions === -Agent 0x99: Remember—Derek doesn't know we're onto him yet. Keep it that way. +Agent 0x99: Remember—Derek doesn't know we're onto Operation Shatter. He thinks this is just an IT audit. -{player_approach == "cautious": - Agent 0x99: Your careful approach should keep you under the radar. Document everything. -} -{player_approach == "confident": - Agent 0x99: Speed is good, but stealth is better. Stay professional. -} -{player_approach == "adaptable": - Agent 0x99: Read the room. If something feels off, trust that feeling. -} +Agent 0x99: Use that advantage. Gather evidence before confronting anyone. + [Any specific advice?] -> specific_advice @@ -251,7 +311,7 @@ Agent 0x99: Remember—Derek doesn't know we're onto him yet. Keep it that way. === specific_advice === Agent 0x99: The IT manager—Kevin Park—is your entry point. Build rapport with him. -Agent 0x99: He's not ENTROPY, just overworked and underpaid. He'll appreciate competent help. +Agent 0x99: He's not ENTROPY, just overworked and underpaid. He'll appreciate competent help and give you access. + [Anyone else I should know about?] -> other_npcs @@ -259,9 +319,9 @@ Agent 0x99: He's not ENTROPY, just overworked and underpaid. He'll appreciate co -> deployment === other_npcs === -Agent 0x99: Sarah Martinez is the receptionist. She'll check you in. +Agent 0x99: Sarah Martinez is the receptionist. Professional, friendly. Don't give her any reason to flag you. -Agent 0x99: Be professional. First impressions matter for your cover. +Agent 0x99: And Maya Chen—the journalist who contacted us. Be careful around her. Derek might be watching who she talks to. -> deployment @@ -270,11 +330,11 @@ Agent 0x99: Be professional. First impressions matter for your cover. // ================================================ === deployment === -Agent 0x99: Good luck, {player_name}. SAFETYNET is counting on you. +Agent 0x99: {player_name}, I won't lie. This is bigger than a typical first mission. -Agent 0x99: And remember—technically, you're just an IT contractor doing an audit. +Agent 0x99: But you're ready. And those 85 people who might die on Sunday? They're counting on you. Even if they don't know it. -Agent 0x99: Keep that cover intact and this should go smoothly. +Agent 0x99: Stop Operation Shatter. Find the evidence. And make sure Derek Lawson never hurts anyone. ~ mission_accepted = true diff --git a/scenarios/m01_first_contact/ink/m01_opening_briefing.json b/scenarios/m01_first_contact/ink/m01_opening_briefing.json index 8e48f7b..c91055c 100644 --- a/scenarios/m01_first_contact/ink/m01_opening_briefing.json +++ b/scenarios/m01_first_contact/ink/m01_opening_briefing.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":[["^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, thanks for getting here on short notice.","\n","^Agent 0x99: We have a situation developing at Viral Dynamics Media.","\n","ev","str","^What's the situation?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready. What's the mission?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^How urgent is this?","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"briefing_threat"},null],"c-1":["\n","ev","str","^confident","/str","/ev",{"VAR=":"player_approach","re":true},{"->":"briefing_threat"},null],"c-2":["\n","ev",true,"/ev",{"VAR=":"asked_about_stakes","re":true},{"->":"urgency_explanation"},null]}],null],"urgency_explanation":["^Agent 0x99: ENTROPY's Social Fabric cell is operating inside Viral Dynamics right now.","\n","^Agent 0x99: They're running disinformation campaigns targeting the upcoming election.","\n",{"->":"briefing_threat"},null],"briefing_threat":[["^Agent 0x99: Social Fabric specializes in information manipulation—narrative control, social engineering at scale.","\n","^Agent 0x99: They've infiltrated Viral Dynamics as employees. We don't know how many operatives, but we've identified at least one.","\n","ev","str","^Who's the target operative?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What are they trying to accomplish?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^What's at stake if they succeed?","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"operative_identity"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"asked_about_entropy","re":true},{"->":"entropy_objectives"},null],"c-2":["\n","ev",true,"/ev",{"VAR=":"asked_about_stakes","re":true},{"->":"stakes_explanation"},null]}],null],"operative_identity":[["^Agent 0x99: Derek Lawson. Senior Marketing Manager at Viral Dynamics.","\n","^Agent 0x99: Perfect cover—his job is literally manipulating narratives for clients.","\n","ev","str","^How long has he been there?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What's my objective?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"infiltration_timeline"},null],"c-1":["\n",{"->":"mission_objectives"},null]}],null],"infiltration_timeline":[["^Agent 0x99: Three months. Long enough to install backdoors, build trust, map the organization.","\n","^Agent 0x99: He's not just stealing data—he's weaponizing the company's media distribution network.","\n","ev","str","^What's my objective?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What happens if they succeed?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"mission_objectives"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"asked_about_stakes","re":true},{"->":"stakes_explanation"},null]}],null],"entropy_objectives":[["^Agent 0x99: They're collecting demographic data, testing disinformation tactics, mapping influence networks.","\n","^Agent 0x99: It's all feeding into something bigger—Phase 3, though we don't know details yet.","\n","ev","str","^What's Phase 3?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What's my mission?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"phase_3_explanation"},null],"c-1":["\n",{"->":"mission_objectives"},null]}],null],"phase_3_explanation":[["^Agent 0x99: That's what we're trying to figure out. Multiple cells collecting different types of data.","\n","^Agent 0x99: Social Fabric handles narrative manipulation. Other cells focus on infrastructure, finance, healthcare.","\n","ev","str","^So this is part of something larger","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What do I need to do?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"larger_threat"},null],"c-1":["\n",{"->":"mission_objectives"},null]}],null],"larger_threat":["^Agent 0x99: Exactly. But right now, we stop this cell. One operation at a time.","\n",{"->":"mission_objectives"},null],"stakes_explanation":[["^Agent 0x99: If they succeed, they'll manipulate election coverage across social media and news outlets.","\n","^Agent 0x99: Viral Dynamics has distribution deals with dozens of platforms. Derek controls what millions see.","\n","ev","str","^That's... significant","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^We have to stop this","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"mission_objectives"},null],"c-1":["\n",{"->":"mission_objectives"},null]}],null],"mission_objectives":[["^Agent 0x99: Your primary objectives:","\n","^Agent 0x99: One—Identify all ENTROPY operatives inside Viral Dynamics.","\n","^Agent 0x99: Two—Gather evidence of the disinformation operation.","\n","^Agent 0x99: Three—Intercept their communications with other cells.","\n","ev","str","^How do I get inside?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What resources do I have?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Sounds straightforward","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"asked_about_cover","re":true},{"->":"cover_story"},null],"c-1":["\n",{"->":"resources_available"},null],"c-2":["\n",{"->":"approach_discussion"},null]}],null],"cover_story":[["^Agent 0x99: You're going in as an IT contractor hired to audit their network security.","\n","^Agent 0x99: Completely legitimate. Viral Dynamics actually requested the audit weeks ago.","\n","ev","str","^So I'll have access to technical systems","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What about the employees?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"technical_access"},null],"c-1":["\n",{"->":"employee_interaction"},null]}],null],"technical_access":["^Agent 0x99: Server room, computers, network infrastructure—all fair game under your cover.","\n","^Agent 0x99: Just stay professional. IT contractors ask questions; that's expected.","\n",{"->":"approach_discussion"},null],"employee_interaction":["^Agent 0x99: IT contractors interact with everyone. Use it.","\n","^Agent 0x99: People trust IT. They'll share passwords, complain about systems, gossip about coworkers.","\n",{"->":"approach_discussion"},null],"resources_available":[["^Agent 0x99: You'll have phone comms with me throughout. I'll provide guidance as needed.","\n","^Agent 0x99: There's a SAFETYNET drop-site terminal in their server room for submitting intercepted intelligence.","\n","ev","str","^What about tools?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it. What's the approach?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"tools_discussion"},null],"c-1":["\n",{"->":"approach_discussion"},null]}],null],"tools_discussion":["^Agent 0x99: Your contractor kit has lockpicks, RFID cloner, and analysis tools.","\n","^Agent 0x99: Everything you need looks like standard IT equipment. Stay in character.","\n",{"->":"approach_discussion"},null],"approach_discussion":[["^Agent 0x99: How do you want to handle this?","\n","ev","str","^Careful and methodical—thorough investigation","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Quick and focused—complete objectives efficiently","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Adaptable—read the situation as it develops","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","ev","str","^cautious","/str","/ev",{"VAR=":"player_approach","re":true},"^You: I'll take my time. Thorough beats fast.","\n","^Agent 0x99: Smart. Don't miss anything critical.","\n",{"->":"final_instructions"},null],"c-1":["\n","ev","str","^confident","/str","/ev",{"VAR=":"player_approach","re":true},"^You: I'll move quickly and get results.","\n","^Agent 0x99: Good. Just don't rush past important evidence.","\n",{"->":"final_instructions"},null],"c-2":["\n","ev","str","^adaptable","/str","/ev",{"VAR=":"player_approach","re":true},"^You: I'll adapt based on what I find.","\n","^Agent 0x99: Flexible thinking. Trust your instincts.","\n",{"->":"final_instructions"},null]}],null],"final_instructions":[["^Agent 0x99: Remember—Derek doesn't know we're onto him yet. Keep it that way.","\n","ev",{"VAR?":"player_approach"},"str","^cautious","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Your careful approach should keep you under the radar. Document everything.","\n",{"->":".^.^.^.10"},null]}],"nop","\n","ev",{"VAR?":"player_approach"},"str","^confident","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Speed is good, but stealth is better. Stay professional.","\n",{"->":".^.^.^.20"},null]}],"nop","\n","ev",{"VAR?":"player_approach"},"str","^adaptable","/str","==","/ev",[{"->":".^.b","c":true},{"b":["\n","^Agent 0x99: Read the room. If something feels off, trust that feeling.","\n",{"->":".^.^.^.30"},null]}],"nop","\n","ev","str","^Any specific advice?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready to deploy","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"specific_advice"},null],"c-1":["\n",{"->":"deployment"},null]}],null],"specific_advice":[["^Agent 0x99: The IT manager—Kevin Park—is your entry point. Build rapport with him.","\n","^Agent 0x99: He's not ENTROPY, just overworked and underpaid. He'll appreciate competent help.","\n","ev","str","^Anyone else I should know about?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it. Ready to go","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"other_npcs"},null],"c-1":["\n",{"->":"deployment"},null]}],null],"other_npcs":["^Agent 0x99: Sarah Martinez is the receptionist. She'll check you in.","\n","^Agent 0x99: Be professional. First impressions matter for your cover.","\n",{"->":"deployment"},null],"deployment":["^Agent 0x99: Good luck, ","ev",{"VAR?":"player_name"},"out","/ev","^. SAFETYNET is counting on you.","\n","^Agent 0x99: And remember—technically, you're just an IT contractor doing an audit.","\n","^Agent 0x99: Keep that cover intact and this should go smoothly.","\n","ev",true,"/ev",{"VAR=":"mission_accepted","re":true},"#","^exit_conversation","/#","end",null],"global decl":["ev","str","^","/str",{"VAR=":"player_approach"},false,{"VAR=":"asked_about_stakes"},false,{"VAR=":"asked_about_entropy"},false,{"VAR=":"asked_about_cover"},false,{"VAR=":"mission_accepted"},"str","^Agent 0x00","/str",{"VAR=":"player_name"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":[["^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, thanks for getting here on short notice.","\n","^Agent 0x99: We have a situation developing at Viral Dynamics Media. And it's worse than we initially thought.","\n","ev","str","^What's the situation?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready. What's the mission?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^How urgent is this?","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"briefing_threat"},null],"c-1":["\n",{"->":"briefing_threat"},null],"c-2":["\n","ev",true,"/ev",{"VAR=":"asked_about_stakes","re":true},{"->":"urgency_explanation"},null]}],null],"urgency_explanation":["^Agent 0x99: We're 72 hours from a mass casualty event.","\n","^Agent 0x99: ENTROPY's Social Fabric cell is operating inside Viral Dynamics. But they're not just running disinformation campaigns.","\n","^Agent 0x99: They're planning something called \"Operation Shatter.\"","\n",{"->":"briefing_threat"},null],"briefing_threat":[["^Agent 0x99: Three weeks ago, our AI flagged something bigger than election interference.","\n","^Agent 0x99: Social Fabric has spent three months collecting psychological profiles. Detailed vulnerability assessments on over two million people in the region.","\n","ev","str","^What kind of profiles?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What are they planning to do with them?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Two million people?","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"profile_details"},null],"c-1":["\n",{"->":"operation_shatter"},null],"c-2":["\n",{"->":"profile_scale"},null]}],null],"profile_details":[["^Agent 0x99: Medical records. Prescription histories. Financial stress indicators. Documented anxiety disorders.","\n","^Agent 0x99: They've identified who has insulin dependencies. Who relies on weekly dialysis. Who lives alone without family support.","\n","^Agent 0x99: This isn't demographic marketing data. This is a targeting database for psychological warfare.","\n","ev","str","^What are they going to do with it?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^How did they get this data?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"operation_shatter"},null],"c-1":["\n",{"->":"data_source"},null]}],null],"data_source":["^Agent 0x99: The usual methods—breached insurance databases, compromised pharmacy systems, scraped social media.","\n","^Agent 0x99: But the concerning part isn't how they got it. It's what they're planning to do with it.","\n",{"->":"operation_shatter"},null],"profile_scale":["^Agent 0x99: 2.3 million profiles, to be precise. And each one includes a vulnerability score.","\n","^Agent 0x99: They've categorized people by how likely they are to panic. To make dangerous decisions. To die if they receive the wrong message at the wrong time.","\n",{"->":"operation_shatter"},null],"operation_shatter":[["^Agent 0x99: We intercepted fragments of something called \"Operation Shatter.\"","\n","^Agent 0x99: Simultaneous fake crisis messages. Personalized. Targeted at the most vulnerable populations.","\n","ev","str","^What kind of crisis messages?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What's the goal?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"crisis_details"},null],"c-1":["\n",{"->":"entropy_goal"},null]}],null],"crisis_details":[["^Agent 0x99: Fake hospital system collapses. \"Your appointment has been cancelled. All patient records corrupted.\"","\n","^Agent 0x99: Fake bank failures. \"Your funds are frozen due to suspected breach.\"","\n","^Agent 0x99: Fake infrastructure attacks. \"Water contaminated. Power grid compromised.\"","\n","^Agent 0x99: All delivered simultaneously to people they've profiled as most likely to panic.","\n","ev","str","^That would cause mass chaos...","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^People could die from that.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"casualty_projections"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"asked_about_casualties","re":true},{"->":"casualty_projections"},null]}],null],"entropy_goal":["^Agent 0x99: Social Fabric's philosophy is \"truth is obsolete, only narrative matters.\"","\n","^Agent 0x99: But this goes beyond philosophy. They want to permanently destroy public trust in digital communications.","\n","^Agent 0x99: And they're willing to kill people to make their point.","\n",{"->":"casualty_projections"},null],"casualty_projections":[["^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, I need you to understand what we're dealing with.","\n","^Agent 0x99: We recovered fragments of their impact assessment. They've calculated projected casualties.","\n","ev","str","^How many?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^They're planning to kill people?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"asked_about_casualties","re":true},{"->":"casualty_numbers"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"asked_about_casualties","re":true},{"->":"casualty_numbers"},null]}],null],"casualty_numbers":[["^Agent 0x99: Their own estimates: 42 to 85 direct deaths in the first 24 hours.","\n","^Agent 0x99: Diabetics who skip insulin because they believe hospitals are compromised. Elderly who have heart attacks from fake bank failure notices. Traffic fatalities from evacuation panic.","\n","^Agent 0x99: And they consider these deaths... acceptable. \"Educational,\" they call it.","\n","ev","str","^That's monstrous.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^We have to stop this.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"villain_philosophy"},null],"c-1":["\n",{"->":"mission_objectives"},null]}],null],"villain_philosophy":[["^Agent 0x99: The fragment we recovered includes a note from someone called \"The Architect.\"","\n","^Agent 0x99: \"These are not victims. They are examples. Their deaths will save thousands who learn the lesson: Trust nothing. Verify everything.\"","\n","^Agent 0x99: They're true believers, ","ev",{"VAR?":"player_name"},"out","/ev","^. They think murdering people is \"teaching a lesson.\"","\n","ev","str","^Who's The Architect?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What's my mission?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"asked_about_architect","re":true},{"->":"architect_mention"},null],"c-1":["\n",{"->":"mission_objectives"},null]}],null],"architect_mention":["^Agent 0x99: We don't know yet. Someone coordinating ENTROPY cells at a strategic level.","\n","^Agent 0x99: But that's a problem for later. Right now, we stop Operation Shatter.","\n",{"->":"mission_objectives"},null],"mission_objectives":[["^Agent 0x99: Your objectives:","\n","^Agent 0x99: One—Find the complete Operation Shatter documentation. Target lists, message templates, deployment timeline.","\n","^Agent 0x99: Two—Identify all ENTROPY operatives inside Viral Dynamics.","\n","^Agent 0x99: Three—Stop the operation before Sunday. That's when they deploy.","\n","ev","str","^How do I get inside?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Who's the primary target?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^What resources do I have?","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"cover_story"},null],"c-1":["\n","ev",true,"/ev",{"VAR=":"asked_about_derek","re":true},{"->":"operative_identity"},null],"c-2":["\n",{"->":"resources_available"},null]}],null],"operative_identity":[["^Agent 0x99: Derek Lawson. Senior Marketing Manager at Viral Dynamics.","\n","^Agent 0x99: Perfect cover—his job is literally manipulating narratives for clients. He's been there three months, which aligns with when the data collection started.","\n","^Agent 0x99: He's not just running operations. He authored parts of the casualty projections we intercepted.","\n","ev","str","^He calculated how many people would die?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^How do I get to him?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"derek_author"},null],"c-1":["\n",{"->":"cover_story"},null]}],null],"derek_author":["^Agent 0x99: His signature is on the medical dependency targeting document.","\n","^Agent 0x99: He personally identified which populations would be most vulnerable to fake hospital closure messages.","\n","^Agent 0x99: This isn't a foot soldier following orders. He's an architect of mass casualties.","\n",{"->":"cover_story"},null],"cover_story":[["^Agent 0x99: You're going in as an IT contractor hired to audit their network security.","\n","^Agent 0x99: Completely legitimate. Viral Dynamics actually requested the audit weeks ago. We just... made sure we got the contract.","\n","ev","str","^So I'll have access to technical systems","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What about the employees?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"technical_access"},null],"c-1":["\n",{"->":"employee_interaction"},null]}],null],"technical_access":["^Agent 0x99: Server room, computers, network infrastructure—all fair game under your cover.","\n","^Agent 0x99: That's where you'll find the Operation Shatter files. Derek keeps them encrypted, but they're there.","\n",{"->":"innocent_warning"},null],"employee_interaction":["^Agent 0x99: Most employees at Viral Dynamics have no idea what's happening.","\n","^Agent 0x99: They think they work at a marketing agency. The Operation Shatter team is isolated—maybe three or four people total.","\n","^Agent 0x99: Everyone else is innocent. They'll go home to families tonight with no idea their company was planning to kill people.","\n",{"->":"innocent_warning"},null],"innocent_warning":["^Agent 0x99: One more thing: there's a journalist there named Maya Chen.","\n","^Agent 0x99: She contacted us anonymously. Suspected something was wrong but doesn't know the full scope. She thinks it's corporate fraud, not mass murder.","\n","^Agent 0x99: Protect her identity. If Derek finds out she tipped us off, she's in danger.","\n","ev",true,"/ev",{"VAR=":"asked_about_maya","re":true},{"->":"resources_available"},null],"resources_available":[["^Agent 0x99: You'll have phone comms with me throughout. I'll provide guidance as needed.","\n","^Agent 0x99: There's a SAFETYNET drop-site terminal in their server room for submitting intercepted intelligence.","\n","ev","str","^What about tools?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready to go","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"tools_discussion"},null],"c-1":["\n",{"->":"final_instructions"},null]}],null],"tools_discussion":["^Agent 0x99: Your contractor kit has lockpicks, RFID cloner, and analysis tools.","\n","^Agent 0x99: Everything you need looks like standard IT equipment. Stay in character.","\n","^Agent 0x99: And ","ev",{"VAR?":"player_name"},"out","/ev","^—when you find those casualty projections, photograph everything. We need complete documentation.","\n",{"->":"final_instructions"},null],"final_instructions":[["^Agent 0x99: Remember—Derek doesn't know we're onto Operation Shatter. He thinks this is just an IT audit.","\n","^Agent 0x99: Use that advantage. Gather evidence before confronting anyone.","\n","ev","str","^Any specific advice?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready to deploy","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"specific_advice"},null],"c-1":["\n",{"->":"deployment"},null]}],null],"specific_advice":[["^Agent 0x99: The IT manager—Kevin Park—is your entry point. Build rapport with him.","\n","^Agent 0x99: He's not ENTROPY, just overworked and underpaid. He'll appreciate competent help and give you access.","\n","ev","str","^Anyone else I should know about?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it. Ready to go","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"other_npcs"},null],"c-1":["\n",{"->":"deployment"},null]}],null],"other_npcs":["^Agent 0x99: Sarah Martinez is the receptionist. Professional, friendly. Don't give her any reason to flag you.","\n","^Agent 0x99: And Maya Chen—the journalist who contacted us. Be careful around her. Derek might be watching who she talks to.","\n",{"->":"deployment"},null],"deployment":["^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, I won't lie. This is bigger than a typical first mission.","\n","^Agent 0x99: But you're ready. And those 85 people who might die on Sunday? They're counting on you. Even if they don't know it.","\n","^Agent 0x99: Stop Operation Shatter. Find the evidence. And make sure Derek Lawson never hurts anyone.","\n","ev",true,"/ev",{"VAR=":"mission_accepted","re":true},"#","^exit_conversation","/#","end",null],"global decl":["ev",false,{"VAR=":"asked_about_stakes"},false,{"VAR=":"asked_about_casualties"},false,{"VAR=":"asked_about_architect"},false,{"VAR=":"asked_about_derek"},false,{"VAR=":"asked_about_maya"},false,{"VAR=":"mission_accepted"},"str","^Agent 0x00","/str",{"VAR=":"player_name"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/ink/m01_phone_agent0x99.ink b/scenarios/m01_first_contact/ink/m01_phone_agent0x99.ink index eafc34a..1f26c11 100644 --- a/scenarios/m01_first_contact/ink/m01_phone_agent0x99.ink +++ b/scenarios/m01_first_contact/ink/m01_phone_agent0x99.ink @@ -274,6 +274,107 @@ Agent 0x99: Now correlate with physical evidence. Then we can move to confrontat #exit_conversation -> support_hub +// ================================================ +// EVENT: CONTINGENCY FILES FOUND - MORAL CHOICE +// ================================================ + +=== event_contingency_found === +#speaker:agent_0x99 + +Agent 0x99: {player_name}, I just saw what you pulled from Derek's computer. + +Agent 0x99: He's planning to frame Kevin Park for the entire breach. Fake logs, forged emails, the works. + +Agent 0x99: Kevin—the IT guy who gave you access, who trusted you—is going to take the fall for ENTROPY. + ++ [That's monstrous] + -> contingency_reaction ++ [What can I do about it?] + -> contingency_options + +=== contingency_reaction === +Agent 0x99: It gets worse. Derek's contingency activates automatically when systems are seized. + +Agent 0x99: If we don't do something, Kevin gets arrested. His kids watch him taken away in handcuffs. + +Agent 0x99: Eventually he'd be cleared, but... that's not something you just walk off. + +-> contingency_options + +=== contingency_options === +Agent 0x99: You have options here. None of them are perfect. + +Agent 0x99: What do you want to do? + ++ [Warn Kevin directly - tell him what's coming] + -> warn_kevin_choice ++ [Leave evidence clearing Kevin for investigators] + -> plant_evidence_choice ++ [Focus on the mission - Kevin's not my responsibility] + -> ignore_kevin_choice + +// ================================================ +// CHOICE: WARN KEVIN +// ================================================ + +=== warn_kevin_choice === +Agent 0x99: Direct warning. Risky—if Kevin panics or acts differently, Derek might notice. + +Agent 0x99: But if it works, Kevin has time to lawyer up, document everything. He's protected. + ++ [I'll take that risk. He deserves to know.] + #set_variable:kevin_choice=warn + #set_variable:kevin_protected=true + Agent 0x99: Understood. Find Kevin, tell him what's coming. Just... be careful how much you reveal. + Agent 0x99: The more he knows about SAFETYNET, the more complicated this gets. + #exit_conversation + -> support_hub ++ [Maybe there's a safer option...] + -> contingency_options + +// ================================================ +// CHOICE: PLANT EVIDENCE +// ================================================ + +=== plant_evidence_choice === +Agent 0x99: Anonymous help. Leave the frame-up files where our follow-up team will find them. + +Agent 0x99: Kevin never knows he was in danger. Investigators see Derek's setup immediately. + +Agent 0x99: Clean. Professional. Takes time, but lower risk. + ++ [That's the smarter play. Do it that way.] + #set_variable:kevin_choice=evidence + #set_variable:kevin_protected=true + Agent 0x99: Copy the contingency files to a visible location. Investigators will find them during evidence collection. + Agent 0x99: Kevin walks away clean without ever knowing. That's the professional approach. + #exit_conversation + -> support_hub ++ [Maybe there's another option...] + -> contingency_options + +// ================================================ +// CHOICE: IGNORE +// ================================================ + +=== ignore_kevin_choice === +Agent 0x99: ...You're sure about that? + +Agent 0x99: Kevin helped you. If you ignore this, he gets arrested. His family watches. + +Agent 0x99: He'll be cleared eventually, but that's trauma that doesn't heal. + ++ [The mission has to come first. I can't save everyone.] + #set_variable:kevin_choice=ignore + #set_variable:kevin_protected=false + Agent 0x99: ...Understood. That's your call to make. + Agent 0x99: Just know that choice has consequences. For Kevin. For his family. + Agent 0x99: And for you, when you think about it later. + #exit_conversation + -> support_hub ++ [Wait. Let me reconsider.] + -> contingency_options + // ================================================ // EVENT: ACT 2 COMPLETE (READY FOR CONFRONTATION) // ================================================ diff --git a/scenarios/m01_first_contact/ink/m01_phone_agent0x99.json b/scenarios/m01_first_contact/ink/m01_phone_agent0x99.json index 31d85dc..0a68ba9 100644 --- a/scenarios/m01_first_contact/ink/m01_phone_agent0x99.json +++ b/scenarios/m01_first_contact/ink/m01_phone_agent0x99.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"first_contact"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev",false,"/ev",{"VAR=":"first_contact","re":true},{"->":"first_call"},{"->":"start.4"},null]}],"nop","\n","ev",{"VAR?":"first_contact"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"support_hub"},{"->":"start.11"},null]}],"nop","\n",null],"first_call":[["#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, checking in. How's the infiltration going?","\n","^Agent 0x99: If you need guidance on any challenges, I'm here. That's what handlers are for.","\n","ev","str","^Everything's going smoothly so far","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I could use some tips","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I'll call if I need help","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","^Agent 0x99: Good. Remember, take your time. Rushing creates mistakes.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null],"c-2":["\n","#","^exit_conversation","/#","^Agent 0x99: Roger that. I'm here when you need me.","\n",{"->":"support_hub"},null]}],null],"support_hub":[["#","^speaker:agent_0x99","/#","^Agent 0x99: What do you need help with?","\n","ev","str","^Lockpicking guidance","/str",{"VAR?":"lockpick_hint_given"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^SSH brute force help","/str",{"VAR?":"ssh_hint_given"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^Linux navigation tips","/str",{"VAR?":"linux_hint_given"},"!","/ev",{"*":".^.c-2","flg":5},"ev","str","^Privilege escalation guidance","/str",{"VAR?":"sudo_hint_given"},"!","/ev",{"*":".^.c-3","flg":5},"ev","str","^General mission advice","/str","/ev",{"*":".^.c-4","flg":4},"ev","str","^I'm good for now","/str","/ev",{"*":".^.c-5","flg":4},{"c-0":["\n",{"->":"lockpick_help"},null],"c-1":["\n",{"->":"ssh_help"},null],"c-2":["\n",{"->":"linux_help"},null],"c-3":["\n",{"->":"sudo_help"},null],"c-4":["\n",{"->":"general_advice"},null],"c-5":["\n","#","^exit_conversation","/#","^Agent 0x99: Copy that. Call anytime.","\n",{"->":".^.^.^"},null]}],null],"lockpick_help":[["ev",true,"/ev",{"VAR=":"lockpick_hint_given","re":true},"^Agent 0x99: Lockpicking is about patience and listening.","\n","^Agent 0x99: Each pin has a sweet spot. Apply tension, test each pin, feel for the feedback.","\n","^Agent 0x99: Start with the storage closet practice safe—low stakes, good for learning.","\n","ev","str","^Any other tips?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it, thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Don't force it. If you're stuck, reset and try again. There's no timer.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"ssh_help":[["ev",true,"/ev",{"VAR=":"ssh_hint_given","re":true},"^Agent 0x99: SSH brute force uses Hydra to test password lists against login prompts.","\n","^Agent 0x99: The key is using good password lists. Kevin's hints about \"ViralDynamics2025\" variations are gold.","\n","^Agent 0x99: Command format: hydra -l username -P passwordlist.txt ssh:","\n","ev","str","^What if I don't have a password list?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks, that helps","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Build one from intel. Kevin mentioned patterns, the whiteboard had clues. Social engineering works.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"linux_help":[["ev",true,"/ev",{"VAR=":"linux_hint_given","re":true},"^Agent 0x99: Linux navigation basics: ls lists files, cd changes directory, cat reads files.","\n","^Agent 0x99: Check the home directory first. User files, hidden configs—look for .bashrc, .ssh, personal directories.","\n","^Agent 0x99: Hidden files start with a dot. Use ls -la to see them.","\n","ev","str","^Where should I look for flags?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Home directories, user documents, sometimes hidden in config files. Explore methodically.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"sudo_help":[["ev",true,"/ev",{"VAR=":"sudo_hint_given","re":true},"^Agent 0x99: Privilege escalation means gaining access to other accounts or higher permissions.","\n","^Agent 0x99: Try \"sudo -l\" to see what sudo permissions you have. Some accounts allow switching users.","\n","^Agent 0x99: Command: sudo -u otherusername bash gives you a shell as that user.","\n","ev","str","^What if I don't have sudo access?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Check for misconfigured files, world-writable directories, or SUID binaries. But for this mission, sudo works.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"general_advice":[["^Agent 0x99: Remember the mission priorities: gather evidence, identify operatives, minimize innocent casualties.","\n","^Agent 0x99: Most people at Viral Dynamics are legitimate employees. We want ENTROPY, not collateral damage.","\n","ev","str","^How do I know who's ENTROPY?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What about Maya?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Understood","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","^Agent 0x99: Evidence correlation. Look for encrypted communications, connections to known cells, suspicious behavior.","\n","^Agent 0x99: Derek's our primary suspect, but gather proof before confronting.","\n",{"->":"support_hub"},null],"c-1":["\n","^Agent 0x99: Protect her. She's the informant who brought this to us. Don't expose her unless absolutely necessary.","\n",{"->":"support_hub"},null],"c-2":["\n",{"->":"support_hub"},null]}],null],"event_lockpick_acquired":[["#","^speaker:agent_0x99","/#","^Agent 0x99: I see Kevin gave you lockpicks. Smart social engineering.","\n","^Agent 0x99: Practice on low-risk targets first. Storage closet, unlocked areas.","\n","^Agent 0x99: Remember, you're testing security—officially.","\n","ev","str","^Will do","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Any lockpicking tips?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n",{"->":"lockpick_help"},null]}],null],"event_server_room_entered":[["#","^speaker:agent_0x99","/#","#","^complete_task:access_server_room","/#","#","^unlock_task:access_vm","/#","^Agent 0x99: You're in the server room. Good work getting access.","\n","^Agent 0x99: Look for the compromised systems. VM access will give you deeper intelligence.","\n","ev","str","^What am I looking for?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^On it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Evidence of ENTROPY's infrastructure. Backdoors, encrypted communications, anything linking Derek to other cells.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_first_flag":[["#","^speaker:agent_0x99","/#","^Agent 0x99: First flag submitted. Nice work, ","ev",{"VAR?":"player_name"},"out","/ev","^.","\n","^Agent 0x99: Each flag unlocks intelligence. Keep correlating VM findings with physical evidence.","\n","ev","str","^What should I focus on next?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Continue the VM challenges, but don't forget physical investigation. Derek's office, filing cabinets, computer access.","\n","^Agent 0x99: Hybrid approach—digital and physical evidence together.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_derek_office_entered":[["#","^speaker:agent_0x99","/#","#","^unlock_task:find_campaign_materials","/#","#","^unlock_task:discover_manifesto","/#","#","^unlock_task:decode_communications","/#","^Agent 0x99: You're in Derek's office. Good.","\n","^Agent 0x99: Look for communications, project documents, anything linking him to ENTROPY.","\n","^Agent 0x99: Whiteboard messages, computer files, filing cabinets. Be thorough.","\n","ev","str","^What if Derek catches me?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^On it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Your cover is solid. You're doing a security audit—accessing offices is expected.","\n","^Agent 0x99: But don't tip your hand too early. Gather evidence before confronting.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_all_flags":[["#","^speaker:agent_0x99","/#","^Agent 0x99: All VM flags submitted. Excellent work.","\n","^Agent 0x99: Intelligence confirms Derek Lawson as primary operative, coordinating with Zero Day Syndicate.","\n","^Agent 0x99: Now correlate with physical evidence. Then we can move to confrontation.","\n","ev","str","^What's the confrontation plan?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Roger that","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: That's your call. Direct, silent extraction, or something creative.","\n","^Agent 0x99: I trust your judgment. You've proven capable.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_act2_complete":[["#","^speaker:agent_0x99","/#","^Agent 0x99: You've identified the operatives and gathered the evidence.","\n","^Agent 0x99: Time to decide: How do you want to resolve this?","\n","^Agent 0x99: Confrontation, silent extraction, or public exposure. Each has consequences.","\n","ev","str","^I need to think about this","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready to proceed","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Take your time. This is the part where your choices matter most.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","^Agent 0x99: Good luck, ","ev",{"VAR?":"player_name"},"out","/ev","^. You've got this.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"global decl":["ev",false,{"VAR=":"lockpick_hint_given"},false,{"VAR=":"ssh_hint_given"},false,{"VAR=":"linux_hint_given"},false,{"VAR=":"sudo_hint_given"},true,{"VAR=":"first_contact"},"str","^Agent 0x00","/str",{"VAR=":"player_name"},"str","^","/str",{"VAR=":"current_task"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"first_contact"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev",false,"/ev",{"VAR=":"first_contact","re":true},{"->":"first_call"},{"->":"start.4"},null]}],"nop","\n","ev",{"VAR?":"first_contact"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n",{"->":"support_hub"},{"->":"start.11"},null]}],"nop","\n",null],"first_call":[["#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, checking in. How's the infiltration going?","\n","^Agent 0x99: If you need guidance on any challenges, I'm here. That's what handlers are for.","\n","ev","str","^Everything's going smoothly so far","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I could use some tips","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^I'll call if I need help","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","^Agent 0x99: Good. Remember, take your time. Rushing creates mistakes.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null],"c-2":["\n","#","^exit_conversation","/#","^Agent 0x99: Roger that. I'm here when you need me.","\n",{"->":"support_hub"},null]}],null],"support_hub":[["#","^speaker:agent_0x99","/#","^Agent 0x99: What do you need help with?","\n","ev","str","^Lockpicking guidance","/str",{"VAR?":"lockpick_hint_given"},"!","/ev",{"*":".^.c-0","flg":5},"ev","str","^SSH brute force help","/str",{"VAR?":"ssh_hint_given"},"!","/ev",{"*":".^.c-1","flg":5},"ev","str","^Linux navigation tips","/str",{"VAR?":"linux_hint_given"},"!","/ev",{"*":".^.c-2","flg":5},"ev","str","^Privilege escalation guidance","/str",{"VAR?":"sudo_hint_given"},"!","/ev",{"*":".^.c-3","flg":5},"ev","str","^General mission advice","/str","/ev",{"*":".^.c-4","flg":4},"ev","str","^I'm good for now","/str","/ev",{"*":".^.c-5","flg":4},{"c-0":["\n",{"->":"lockpick_help"},null],"c-1":["\n",{"->":"ssh_help"},null],"c-2":["\n",{"->":"linux_help"},null],"c-3":["\n",{"->":"sudo_help"},null],"c-4":["\n",{"->":"general_advice"},null],"c-5":["\n","#","^exit_conversation","/#","^Agent 0x99: Copy that. Call anytime.","\n",{"->":".^.^.^"},null]}],null],"lockpick_help":[["ev",true,"/ev",{"VAR=":"lockpick_hint_given","re":true},"^Agent 0x99: Lockpicking is about patience and listening.","\n","^Agent 0x99: Each pin has a sweet spot. Apply tension, test each pin, feel for the feedback.","\n","^Agent 0x99: Start with the storage closet practice safe—low stakes, good for learning.","\n","ev","str","^Any other tips?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it, thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Don't force it. If you're stuck, reset and try again. There's no timer.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"ssh_help":[["ev",true,"/ev",{"VAR=":"ssh_hint_given","re":true},"^Agent 0x99: SSH brute force uses Hydra to test password lists against login prompts.","\n","^Agent 0x99: The key is using good password lists. Kevin's hints about \"ViralDynamics2025\" variations are gold.","\n","^Agent 0x99: Command format: hydra -l username -P passwordlist.txt ssh:","\n","ev","str","^What if I don't have a password list?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks, that helps","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Build one from intel. Kevin mentioned patterns, the whiteboard had clues. Social engineering works.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"linux_help":[["ev",true,"/ev",{"VAR=":"linux_hint_given","re":true},"^Agent 0x99: Linux navigation basics: ls lists files, cd changes directory, cat reads files.","\n","^Agent 0x99: Check the home directory first. User files, hidden configs—look for .bashrc, .ssh, personal directories.","\n","^Agent 0x99: Hidden files start with a dot. Use ls -la to see them.","\n","ev","str","^Where should I look for flags?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Got it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Home directories, user documents, sometimes hidden in config files. Explore methodically.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"sudo_help":[["ev",true,"/ev",{"VAR=":"sudo_hint_given","re":true},"^Agent 0x99: Privilege escalation means gaining access to other accounts or higher permissions.","\n","^Agent 0x99: Try \"sudo -l\" to see what sudo permissions you have. Some accounts allow switching users.","\n","^Agent 0x99: Command: sudo -u otherusername bash gives you a shell as that user.","\n","ev","str","^What if I don't have sudo access?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Check for misconfigured files, world-writable directories, or SUID binaries. But for this mission, sudo works.","\n",{"->":"support_hub"},null],"c-1":["\n",{"->":"support_hub"},null]}],null],"general_advice":[["^Agent 0x99: Remember the mission priorities: gather evidence, identify operatives, minimize innocent casualties.","\n","^Agent 0x99: Most people at Viral Dynamics are legitimate employees. We want ENTROPY, not collateral damage.","\n","ev","str","^How do I know who's ENTROPY?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What about Maya?","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Understood","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n","^Agent 0x99: Evidence correlation. Look for encrypted communications, connections to known cells, suspicious behavior.","\n","^Agent 0x99: Derek's our primary suspect, but gather proof before confronting.","\n",{"->":"support_hub"},null],"c-1":["\n","^Agent 0x99: Protect her. She's the informant who brought this to us. Don't expose her unless absolutely necessary.","\n",{"->":"support_hub"},null],"c-2":["\n",{"->":"support_hub"},null]}],null],"event_lockpick_acquired":[["#","^speaker:agent_0x99","/#","^Agent 0x99: I see Kevin gave you lockpicks. Smart social engineering.","\n","^Agent 0x99: Practice on low-risk targets first. Storage closet, unlocked areas.","\n","^Agent 0x99: Remember, you're testing security—officially.","\n","ev","str","^Will do","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Any lockpicking tips?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n",{"->":"lockpick_help"},null]}],null],"event_server_room_entered":[["#","^speaker:agent_0x99","/#","#","^complete_task:access_server_room","/#","#","^unlock_task:access_vm","/#","^Agent 0x99: You're in the server room. Good work getting access.","\n","^Agent 0x99: Look for the compromised systems. VM access will give you deeper intelligence.","\n","ev","str","^What am I looking for?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^On it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Evidence of ENTROPY's infrastructure. Backdoors, encrypted communications, anything linking Derek to other cells.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_first_flag":[["#","^speaker:agent_0x99","/#","^Agent 0x99: First flag submitted. Nice work, ","ev",{"VAR?":"player_name"},"out","/ev","^.","\n","^Agent 0x99: Each flag unlocks intelligence. Keep correlating VM findings with physical evidence.","\n","ev","str","^What should I focus on next?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Thanks","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Continue the VM challenges, but don't forget physical investigation. Derek's office, filing cabinets, computer access.","\n","^Agent 0x99: Hybrid approach—digital and physical evidence together.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_derek_office_entered":[["#","^speaker:agent_0x99","/#","#","^unlock_task:find_campaign_materials","/#","#","^unlock_task:discover_manifesto","/#","#","^unlock_task:decode_communications","/#","^Agent 0x99: You're in Derek's office. Good.","\n","^Agent 0x99: Look for communications, project documents, anything linking him to ENTROPY.","\n","^Agent 0x99: Whiteboard messages, computer files, filing cabinets. Be thorough.","\n","ev","str","^What if Derek catches me?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^On it","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Your cover is solid. You're doing a security audit—accessing offices is expected.","\n","^Agent 0x99: But don't tip your hand too early. Gather evidence before confronting.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_all_flags":[["#","^speaker:agent_0x99","/#","^Agent 0x99: All VM flags submitted. Excellent work.","\n","^Agent 0x99: Intelligence confirms Derek Lawson as primary operative, coordinating with Zero Day Syndicate.","\n","^Agent 0x99: Now correlate with physical evidence. Then we can move to confrontation.","\n","ev","str","^What's the confrontation plan?","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Roger that","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: That's your call. Direct, silent extraction, or something creative.","\n","^Agent 0x99: I trust your judgment. You've proven capable.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"event_contingency_found":[["#","^speaker:agent_0x99","/#","^Agent 0x99: ","ev",{"VAR?":"player_name"},"out","/ev","^, I just saw what you pulled from Derek's computer.","\n","^Agent 0x99: He's planning to frame Kevin Park for the entire breach. Fake logs, forged emails, the works.","\n","^Agent 0x99: Kevin—the IT guy who gave you access, who trusted you—is going to take the fall for ENTROPY.","\n","ev","str","^That's monstrous","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^What can I do about it?","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"contingency_reaction"},null],"c-1":["\n",{"->":"contingency_options"},null]}],null],"contingency_reaction":["^Agent 0x99: It gets worse. Derek's contingency activates automatically when systems are seized.","\n","^Agent 0x99: If we don't do something, Kevin gets arrested. His kids watch him taken away in handcuffs.","\n","^Agent 0x99: Eventually he'd be cleared, but... that's not something you just walk off.","\n",{"->":"contingency_options"},null],"contingency_options":[["^Agent 0x99: You have options here. None of them are perfect.","\n","^Agent 0x99: What do you want to do?","\n","ev","str","^Warn Kevin directly - tell him what's coming","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Leave evidence clearing Kevin for investigators","/str","/ev",{"*":".^.c-1","flg":4},"ev","str","^Focus on the mission - Kevin's not my responsibility","/str","/ev",{"*":".^.c-2","flg":4},{"c-0":["\n",{"->":"warn_kevin_choice"},null],"c-1":["\n",{"->":"plant_evidence_choice"},null],"c-2":["\n",{"->":"ignore_kevin_choice"},null]}],null],"warn_kevin_choice":[["^Agent 0x99: Direct warning. Risky—if Kevin panics or acts differently, Derek might notice.","\n","^Agent 0x99: But if it works, Kevin has time to lawyer up, document everything. He's protected.","\n","ev","str","^I'll take that risk. He deserves to know.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Maybe there's a safer option...","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","#","^set_variable:kevin_choice=warn","/#","#","^set_variable:kevin_protected=true","/#","^Agent 0x99: Understood. Find Kevin, tell him what's coming. Just... be careful how much you reveal.","\n","^Agent 0x99: The more he knows about SAFETYNET, the more complicated this gets.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n",{"->":"contingency_options"},null]}],null],"plant_evidence_choice":[["^Agent 0x99: Anonymous help. Leave the frame-up files where our follow-up team will find them.","\n","^Agent 0x99: Kevin never knows he was in danger. Investigators see Derek's setup immediately.","\n","^Agent 0x99: Clean. Professional. Takes time, but lower risk.","\n","ev","str","^That's the smarter play. Do it that way.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Maybe there's another option...","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","#","^set_variable:kevin_choice=evidence","/#","#","^set_variable:kevin_protected=true","/#","^Agent 0x99: Copy the contingency files to a visible location. Investigators will find them during evidence collection.","\n","^Agent 0x99: Kevin walks away clean without ever knowing. That's the professional approach.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n",{"->":"contingency_options"},null]}],null],"ignore_kevin_choice":[["^Agent 0x99: ...You're sure about that?","\n","^Agent 0x99: Kevin helped you. If you ignore this, he gets arrested. His family watches.","\n","^Agent 0x99: He'll be cleared eventually, but that's trauma that doesn't heal.","\n","ev","str","^The mission has to come first. I can't save everyone.","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Wait. Let me reconsider.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","#","^set_variable:kevin_choice=ignore","/#","#","^set_variable:kevin_protected=false","/#","^Agent 0x99: ...Understood. That's your call to make.","\n","^Agent 0x99: Just know that choice has consequences. For Kevin. For his family.","\n","^Agent 0x99: And for you, when you think about it later.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n",{"->":"contingency_options"},null]}],null],"event_act2_complete":[["#","^speaker:agent_0x99","/#","^Agent 0x99: You've identified the operatives and gathered the evidence.","\n","^Agent 0x99: Time to decide: How do you want to resolve this?","\n","^Agent 0x99: Confrontation, silent extraction, or public exposure. Each has consequences.","\n","ev","str","^I need to think about this","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^I'm ready to proceed","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","^Agent 0x99: Take your time. This is the part where your choices matter most.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null],"c-1":["\n","^Agent 0x99: Good luck, ","ev",{"VAR?":"player_name"},"out","/ev","^. You've got this.","\n","#","^exit_conversation","/#",{"->":"support_hub"},null]}],null],"global decl":["ev",false,{"VAR=":"lockpick_hint_given"},false,{"VAR=":"ssh_hint_given"},false,{"VAR=":"linux_hint_given"},false,{"VAR=":"sudo_hint_given"},true,{"VAR=":"first_contact"},"str","^Agent 0x00","/str",{"VAR=":"player_name"},"str","^","/str",{"VAR=":"current_task"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/m01_first_contact/scenario.json.erb b/scenarios/m01_first_contact/scenario.json.erb index e7198ea..0e975cd 100644 --- a/scenarios/m01_first_contact/scenario.json.erb +++ b/scenarios/m01_first_contact/scenario.json.erb @@ -1,11 +1,22 @@ <% # ============================================================================ -# MISSION 1: FIRST CONTACT - SCENARIO FILE +# MISSION 1: FIRST CONTACT - SCENARIO FILE (REVISED LAYOUT) # ============================================================================ # Break Escape - Season 1: The Architect's Shadow # # This file defines the game world structure: rooms, NPCs, objects, items # For mission metadata (display name, CyBOK mappings, etc.), see mission.json +# +# ROOM LAYOUT: +# Reception → Main Office Area (KEY) → Multiple rooms branch: +# - Storage Closet (unlocked, practice safe) +# - Break Room (unlocked, clues) +# - Conference Room (unlocked, evidence) +# - IT Room (PIN 2468, Kevin + lockpicks + keycard) +# - Manager's Office (unlocked, safe with Derek's key, briefcase for lockpick) +# - Maya's Office (unlocked, informant) +# - Derek's Office (KEY or LOCKPICK) +# └→ Derek's Office connects to Server Room (KEYCARD) # ============================================================================ # ERB Helper Methods @@ -24,38 +35,89 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "objectives": [ { - "aimId": "identify_operatives", - "title": "Identify ENTROPY Operatives", - "description": "Discover who inside Viral Dynamics is working for ENTROPY", + "aimId": "establish_access", + "title": "Establish Access", + "description": "Get into the building and begin your investigation", "status": "active", "order": 0, "tasks": [ { - "taskId": "meet_reception", + "taskId": "check_in_reception", "title": "Check in at reception", "type": "npc_conversation", "targetNPC": "sarah_martinez", "status": "active" }, { - "taskId": "meet_kevin", - "title": "Meet the IT manager", - "type": "npc_conversation", - "targetNPC": "kevin_park", + "taskId": "access_main_office", + "title": "Access the main office area", + "type": "enter_room", + "targetRoom": "main_office_area", "status": "active" }, { - "taskId": "investigate_derek", - "title": "Investigate Derek Lawson's office", + "taskId": "find_it_room_code", + "title": "Find the IT room access code", + "type": "collect_items", + "targetItems": ["notes"], + "status": "locked" + }, + { + "taskId": "access_it_room", + "title": "Access the IT room", + "type": "enter_room", + "targetRoom": "it_room", + "status": "locked" + }, + { + "taskId": "meet_kevin", + "title": "Meet Kevin Park", + "type": "npc_conversation", + "targetNPC": "kevin_park", + "status": "locked" + } + ] + }, + { + "aimId": "investigate_derek", + "title": "Investigate Derek Lawson", + "description": "Access Derek's office and gather evidence", + "status": "active", + "order": 1, + "tasks": [ + { + "taskId": "find_derek_key", + "title": "Find access to Derek's office", + "type": "collect_items", + "targetItems": ["key"], + "status": "locked" + }, + { + "taskId": "access_derek_office", + "title": "Enter Derek's office", "type": "enter_room", "targetRoom": "derek_office", "status": "locked" }, { - "taskId": "confront_derek", - "title": "Confront the ENTROPY operative", - "type": "npc_conversation", - "targetNPC": "derek_lawson", + "taskId": "search_derek_computer", + "title": "Search Derek's computer", + "type": "collect_items", + "targetItems": ["text_file"], + "status": "locked" + }, + { + "taskId": "decode_whiteboard", + "title": "Decode the whiteboard message", + "type": "unlock_object", + "targetObject": "cyberchef_workstation", + "status": "locked" + }, + { + "taskId": "open_derek_cabinet", + "title": "Open Derek's filing cabinet", + "type": "unlock_object", + "targetObject": "derek_cabinet", "status": "locked" } ] @@ -65,8 +127,22 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "title": "Gather Evidence", "description": "Collect proof of the disinformation operation", "status": "active", - "order": 1, + "order": 2, "tasks": [ + { + "taskId": "find_casualty_projections", + "title": "Find Operation Shatter casualty projections", + "type": "collect_items", + "targetItems": ["notes"], + "status": "locked" + }, + { + "taskId": "find_manifesto", + "title": "Discover ENTROPY manifesto", + "type": "collect_items", + "targetItems": ["notes"], + "status": "locked" + }, { "taskId": "find_campaign_materials", "title": "Find campaign materials", @@ -75,17 +151,10 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "status": "locked" }, { - "taskId": "discover_manifesto", - "title": "Discover ENTROPY manifesto", - "type": "collect_items", - "targetItems": ["notes"], - "status": "locked" - }, - { - "taskId": "decode_communications", - "title": "Decode encrypted communications", - "type": "unlock_object", - "targetObject": "cyberchef_workstation", + "taskId": "talk_to_maya", + "title": "Talk to the informant", + "type": "npc_conversation", + "targetNPC": "maya_chen", "status": "locked" } ] @@ -95,7 +164,7 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "title": "Intercept Communications", "description": "Access server systems and intercept ENTROPY communications", "status": "active", - "order": 2, + "order": 3, "tasks": [ { "taskId": "access_server_room", @@ -114,22 +183,41 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A { "taskId": "submit_ssh_flag", "title": "Submit SSH access evidence", - "type": "unlock_object", - "targetObject": "flag_station_dropsite", + "type": "submit_flags", "status": "locked" }, { "taskId": "submit_linux_flag", "title": "Submit Linux navigation evidence", - "type": "unlock_object", - "targetObject": "flag_station_dropsite", + "type": "submit_flags", "status": "locked" }, { "taskId": "submit_sudo_flag", "title": "Submit privilege escalation evidence", - "type": "unlock_object", - "targetObject": "flag_station_dropsite", + "type": "submit_flags", + "status": "locked" + } + ] + }, + { + "aimId": "confront_operative", + "title": "Confront the Operative", + "description": "Confront Derek with the evidence and decide his fate", + "status": "locked", + "order": 4, + "tasks": [ + { + "taskId": "confront_derek", + "title": "Confront Derek Lawson", + "type": "npc_conversation", + "targetNPC": "derek_lawson", + "status": "locked" + }, + { + "taskId": "choose_resolution", + "title": "Choose how to resolve the situation", + "type": "custom", "status": "locked" } ] @@ -204,6 +292,14 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "name": "Visitor Badge", "takeable": true, "observations": "Temporary visitor badge for office access" + }, + { + "type": "key", + "name": "Main Office Key", + "takeable": true, + "key_id": "main_office_key", + "keyPins": [45, 25, 55, 35], + "observations": "Key to the main office area" } ] }, @@ -218,7 +314,7 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "timedMessages": [ { "delay": 3000, - "message": "Hey rookie! 🦎 I'm your handler for this op. Message me if you need any guidance navigating Viral Dynamics.", + "message": "Hey rookie! 🦎 I'm your handler for this op. Message me if you need any guidance.", "type": "text" } ], @@ -237,6 +333,11 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "eventPattern": "room_entered:derek_office", "targetKnot": "event_derek_office_entered", "onceOnly": true + }, + { + "eventPattern": "item_picked_up:contingency_files", + "targetKnot": "event_contingency_found", + "onceOnly": true } ] }, @@ -264,81 +365,37 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "name": "Building Directory", "takeable": true, "readable": true, - "text": "Viral Dynamics Media - Staff Directory\n\nSarah Martinez - Reception\nKevin Park - IT Manager\nMaya Chen - Content Analyst\nDerek Lawson - Senior Marketing Manager", + "text": "Viral Dynamics Media - Staff Directory\n\nRECEPTION:\nSarah Martinez - Receptionist\n\nMAIN OFFICE:\nKevin Park - IT Manager (IT Room)\nMaya Chen - Content Analyst\n\nPRIVATE OFFICES:\nDerek Lawson - Senior Marketing Manager\nManager's Office - VACANT", "observations": "Posted directory of office staff" + }, + { + "type": "notes", + "name": "Visitor Sign-In Log", + "takeable": false, + "readable": true, + "text": "VISITOR SIGN-IN LOG\n\nRecent Entries:\n- 11:47 PM - D. Lawson (employee late access)\n- 11:52 PM - D. Lawson (employee late access)\n- 12:03 AM - D. Lawson (employee late access)\n\nNote: Multiple late-night entries for Derek Lawson this month.", + "observations": "Sign-in log showing suspicious after-hours access patterns" } ] }, "main_office_area": { "type": "room_office", + "locked": true, + "lockType": "key", + "requires": "main_office_key", + "keyPins": [45, 25, 55, 35], "connections": { - "south": ["reception_area", "break_room"], - "north": ["derek_office", "storage_closet"], - "east": "server_room", - "west": "conference_room" + "south": "reception_area", + "north": ["hallway_west", "hallway_east"], + "east": "it_room", + "west": "break_room" }, - "npcs": [ - { - "id": "kevin_park", - "displayName": "Kevin Park", - "npcType": "person", - "position": { "x": 8, "y": 7 }, - "spriteSheet": "hacker", - "spriteConfig": { - "idleFrameStart": 20, - "idleFrameEnd": 23 - }, - "storyPath": "scenarios/m01_first_contact/ink/m01_npc_kevin.json", - "currentKnot": "start", - "itemsHeld": [ - { - "type": "lockpick", - "name": "Lock Pick Kit", - "takeable": true, - "observations": "Professional lock picking kit" - }, - { - "type": "keycard", - "name": "Server Room Keycard", - "takeable": true, - "key_id": "server_keycard", - "observations": "Kevin's access card for server room" - }, - { - "type": "rfid_cloner", - "name": "RFID Cloner", - "takeable": true, - "observations": "Device for cloning RFID access cards" - }, - { - "type": "notes", - "name": "Password Hints", - "takeable": true, - "readable": true, - "text": "<%= password_hints %>", - "observations": "Common passwords used in the office" - } - ] - }, - { - "id": "maya_chen", - "displayName": "Maya Chen", - "npcType": "person", - "position": { "x": 5, "y": 5 }, - "spriteSheet": "hacker-red", - "spriteTalk": "assets/characters/hacker-red-talk.png", - "spriteConfig": { - "idleFrameStart": 20, - "idleFrameEnd": 23 - }, - "storyPath": "scenarios/m01_first_contact/ink/m01_npc_maya.json", - "currentKnot": "start" - } - ], + "npcs": [], "objects": [ { "type": "pc", + "id": "cyberchef_workstation", "name": "CyberChef Workstation", "takeable": false, "storyPath": "scenarios/m01_first_contact/ink/m01_terminal_cyberchef.json", @@ -347,11 +404,11 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A }, { "type": "safe", - "name": "Filing Cabinet", + "name": "Main Filing Cabinet", "takeable": false, "locked": true, "lockType": "pin", - "pin": "2024", + "requires": "2024", "observations": "Digital filing cabinet with keypad lock - requires 4-digit PIN", "contents": [ { @@ -359,7 +416,7 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "name": "The Architect's Letter", "takeable": true, "readable": true, - "text": "FROM: The Architect\nTO: CELL_SOCIAL_FABRIC [All Members]\n\nI write to you because your work represents the purest expression of our philosophy. While others dismantle systems through code and infrastructure, you reshape the very foundation of belief...\n\n[LORE Fragment - Campaign Arc: The Architect's Shadow]", + "text": "FROM: The Architect\nTO: CELL_SOCIAL_FABRIC [All Members]\n\nI write to you because your work represents the purest expression of our philosophy. While others dismantle systems through code and infrastructure, you reshape the very foundation of belief.\n\nTrust is the ultimate vulnerability. Every system, every institution, every relationship depends on it. And trust, unlike encryption, cannot be patched.\n\nYour upcoming operation will demonstrate this truth on a scale never before attempted. When it succeeds, the world will finally understand: in the digital age, truth is merely consensus, and consensus can be manufactured.\n\nThe weak will perish in confusion. The strong will learn to verify.\n\nEntropy is inevitable. We merely accelerate the lesson.\n\n- The Architect\n\n[LORE Fragment - Campaign Arc: The Architect's Shadow]", "observations": "Encrypted correspondence revealing ENTROPY leadership structure" } ] @@ -377,8 +434,346 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "name": "Maintenance Checklist", "takeable": true, "readable": true, - "text": "STORAGE CLOSET MAINTENANCE LOG\n\nWeekly Tasks:\n- [ ] Check fire extinguisher pressure\n- [ ] Test emergency lighting\n- [ ] Verify safe backup code: 1337 (leet!)\n- [ ] Inventory cleaning supplies\n\nLast checked: 2 weeks ago", - "observations": "Maintenance checklist left on desk" + "text": "VIRAL DYNAMICS - MAINTENANCE LOG\n\nIT Room Access:\nKevin keeps forgetting the code.\nIT ROOM PIN: 2468\n(Seriously Kevin, just memorize it)\n\nStorage Closet:\nPractice safe code: 1337 (for new hires)\n\nLast updated: 2 weeks ago", + "observations": "Maintenance checklist with access codes" + }, + { + "type": "notes", + "name": "Kevin's Desk Note", + "takeable": true, + "readable": true, + "text": "Gone to check the servers.\nIf you need me, I'm in the IT Room.\n- Kevin\n\nP.S. The IT Room code is still 2468. Yes, I finally memorized it.", + "observations": "Note from Kevin explaining his absence" + } + ] + }, + + "storage_closet": { + "type": "small_room_1x1gu", + "locked": false, + "connections": { + "east": "hallway_west" + }, + "objects": [ + { + "type": "safe", + "name": "Practice Safe", + "takeable": false, + "locked": true, + "lockType": "pin", + "requires": "1337", + "observations": "Training safe for new employees to practice - 4-digit PIN", + "contents": [ + { + "type": "notes", + "name": "Old Orientation Guide", + "takeable": true, + "readable": true, + "text": "VIRAL DYNAMICS - NEW EMPLOYEE ORIENTATION\n\nWelcome to the team!\n\nSecurity Reminders:\n- Always lock your workstation\n- Don't share passwords\n- Report suspicious activity to Kevin in IT\n\nFun Fact: The practice safe code (1337) is 'leet speak' for 'elite'. Kevin thought it was funny.\n\n[Minor LORE Fragment]", + "observations": "Old orientation materials" + } + ] + }, + { + "type": "notes", + "name": "Maintenance Log (Backup)", + "takeable": true, + "readable": true, + "text": "MAINTENANCE ACCESS CODES (BACKUP COPY)\n\nIT Room: 2468\nPractice Safe: 1337\nManager's Safe: Ask Derek (he has the combo)\n\nNote: Manager's office safe hasn't been opened since Patricia left.", + "observations": "Backup copy of maintenance codes" + } + ] + }, + + "break_room": { + "type": "room_office", + "locked": false, + "connections": { + "east": "main_office_area", + "west": "conference_room" + }, + "objects": [ + { + "type": "notes", + "name": "Coffee Shop Receipt", + "takeable": true, + "readable": true, + "text": "THE DAILY GRIND - RECEIPT\nDate: Last Tuesday, 11:47 PM\n\nNote on back (handwriting):\n'Derek meeting with unknown contact AGAIN.\nDiscussing \"Phase 3 timeline\" and \"The Architect.\"\nThis is the 5th late-night meeting this month.\nSomething is very wrong here.'\n\n- Anonymous concerned employee", + "observations": "Receipt with handwritten note about Derek's suspicious meetings" + }, + { + "type": "notes", + "name": "Birthday Card", + "takeable": true, + "readable": true, + "text": "🎂 HAPPY ANNIVERSARY! 🎂\n\nTo Derek & Lisa,\nCongratulations on 10 years!\nApril 19th - a day to remember!\n\nFrom your Viral Dynamics family\n\n(Note: Several signatures, including Maya, Kevin, Sarah)", + "observations": "Anniversary card revealing Derek's anniversary date: April 19" + }, + { + "type": "notes", + "name": "Office Gossip", + "takeable": true, + "readable": true, + "text": "Overheard at the coffee machine:\n\n'Did you hear Patricia got fired?'\n'The old manager? Yeah, weird timing.'\n'She was asking too many questions about Derek's projects.'\n'And now her office is just... empty.'\n'Creepy if you ask me.'\n\n(Someone really needs to clean this whiteboard more often)", + "observations": "Gossip about the former manager's sudden departure" + } + ] + }, + + "conference_room": { + "type": "room_office", + "locked": false, + "connections": { + "east": "break_room" + }, + "objects": [ + { + "type": "notes", + "name": "Meeting Calendar", + "takeable": false, + "readable": true, + "text": "CONFERENCE ROOM CALENDAR\n\nMonday: Derek - 'External Partner Sync' (recurring)\nTuesday: All Hands (cancelled)\nWednesday: Derek - 'ZDS Infrastructure Review'\nThursday: Derek - 'Campaign Coordination'\nFriday: Derek - 'Phase 3 Planning'\n\nNote: Derek has booked this room for 'external calls' almost every day this month.", + "observations": "Meeting calendar showing Derek's suspicious scheduling patterns" + }, + { + "type": "notes", + "name": "ZDS Meeting Notes", + "takeable": true, + "readable": true, + "text": "MEETING NOTES - ZDS Infrastructure Review\nDate: Last Wednesday\nAttendees: Derek Lawson, [REDACTED]\n\nAgenda:\n1. Technical infrastructure status - CONFIRMED\n2. Message deployment timeline - ON SCHEDULE\n3. Target list finalization - 2.3M profiles ready\n4. Casualty projections review - ACCEPTABLE\n\nAction Items:\n- Derek to confirm Phase 3 launch window\n- ZDS to provide backup exfiltration routes\n\n[EVIDENCE - Zero Day Syndicate Connection]", + "observations": "Meeting notes revealing coordination with Zero Day Syndicate" + }, + { + "type": "notes", + "name": "Campaign Timeline", + "takeable": true, + "readable": true, + "text": "OPERATION SHATTER - CAMPAIGN TIMELINE\n\nWeek 1-2: Content creation ✓\nWeek 3-4: Narrative seeding ✓\nWeek 5: Coordinated release - PENDING\n\nTarget Demographics:\n- Medical dependency populations\n- Financial anxiety segments \n- Elderly isolated individuals\n\nProjected Impact: SIGNIFICANT\n\nNote: 'The Architect' has approved final timeline.", + "observations": "Campaign timeline for Operation Shatter" + } + ] + }, + + "it_room": { + "type": "room_office", + "locked": true, + "lockType": "pin", + "requires": "2468", + "connections": { + "west": "main_office_area" + }, + "npcs": [ + { + "id": "kevin_park", + "displayName": "Kevin Park", + "npcType": "person", + "position": { "x": 4, "y": 4 }, + "spriteSheet": "hacker", + "spriteConfig": { + "idleFrameStart": 20, + "idleFrameEnd": 23 + }, + "storyPath": "scenarios/m01_first_contact/ink/m01_npc_kevin.json", + "currentKnot": "start", + "itemsHeld": [ + { + "type": "lockpick", + "name": "Lock Pick Kit", + "takeable": true, + "observations": "Professional lock picking kit - for security testing" + }, + { + "type": "keycard", + "name": "Server Room Keycard", + "takeable": true, + "key_id": "server_keycard", + "observations": "Kevin's keycard for server room access" + }, + { + "type": "notes", + "name": "Password Hints", + "takeable": true, + "readable": true, + "text": "<%= password_hints %>", + "observations": "Common password patterns used in the office" + } + ] + } + ], + "objects": [ + { + "type": "pc", + "name": "IT Monitoring Station", + "takeable": false, + "locked": false, + "observations": "Network monitoring displays showing server activity", + "contents": [ + { + "type": "text_file", + "name": "Server Access Log", + "takeable": true, + "readable": true, + "text": "UNAUTHORIZED ACCESS LOG\n\nFlagged Entries:\n- Derek Lawson accessed SERVER_ROOM at 11:52 PM (no ticket)\n- Derek Lawson accessed SERVER_ROOM at 12:03 AM (no ticket)\n- Derek Lawson accessed BACKUP_SYSTEM at 2:15 AM (no ticket)\n\nNote: I've flagged these to management 3 times. No response.\nSomething's not right.\n- Kevin", + "observations": "Kevin's log of Derek's unauthorized server access" + } + ] + }, + { + "type": "notes", + "name": "IT Security Concerns", + "takeable": true, + "readable": true, + "text": "MEMO TO MANAGEMENT (UNSENT)\n\nRE: Security Concerns - Derek Lawson\n\nI've documented multiple instances of Derek accessing the server room without authorization. When I asked him about it, he said he was 'checking campaign servers.'\n\nWe don't have campaign servers in that room.\n\nI think he's doing something he shouldn't be, but I don't know who to trust. The last person who raised concerns about Derek was Patricia, and she got fired.\n\nI'm keeping this memo in case something happens to me too.\n\n- Kevin Park, IT Manager", + "observations": "Kevin's unsent memo expressing concerns about Derek" + } + ] + }, + + "hallway_west": { + "type": "hall_1x2gu", + "locked": false, + "connections": { + "south": "main_office_area", + "north": ["manager_office", "maya_office"], + "west": "storage_closet", + "east": "hallway_east" + }, + "objects": [ + { + "type": "notes", + "name": "Office Directory Sign", + "takeable": false, + "readable": true, + "text": "↑ Manager's Office (VACANT)\n← Storage Closet\n→ East Hallway", + "observations": "Directional sign for the offices" + } + ] + }, + + "hallway_east": { + "type": "hall_1x2gu", + "locked": false, + "connections": { + "south": "main_office_area", + "north": ["maya_office", "derek_office"], + "east": "server_room", + "west": "hallway_west" + }, + "objects": [ + { + "type": "notes", + "name": "Office Directory Sign", + "takeable": false, + "readable": true, + "text": "↑ Maya Chen | Derek Lawson\n→ Server Room (Authorized Personnel Only)\n← West Hallway", + "observations": "Directional sign for the offices and server room" + } + ] + }, + + "manager_office": { + "type": "room_office", + "locked": false, + "connections": { + "south": "hallway_west" + }, + "objects": [ + { + "type": "safe", + "name": "Patricia's Safe", + "takeable": false, + "locked": true, + "lockType": "pin", + "requires": "0419", + "observations": "Former manager's safe - keypad shows wear on 0, 1, 4, 9", + "contents": [ + { + "type": "key", + "name": "Derek's Office Key", + "takeable": true, + "key_id": "derek_office_key", + "keyPins": [35, 55, 45, 25], + "observations": "Spare key to Derek Lawson's office - Patricia must have kept a copy" + }, + { + "type": "notes", + "name": "Patricia's Investigation Notes", + "takeable": true, + "readable": true, + "text": "MY INVESTIGATION NOTES - PATRICIA WELLS\n\nDerek Lawson is hiding something. I've documented:\n- Late night server access (no business justification)\n- Encrypted communications with external parties\n- Large data transfers to unknown destinations\n- References to someone called 'The Architect'\n\nI'm going to confront him tomorrow.\n\nUpdate: HR called me in. I'm being 'let go' for 'performance issues.' This is retaliation. If you're reading this, I was right about Derek.\n\nThe safe code is his anniversary: 0419\n\n[LORE Fragment - Patricia's Investigation]", + "observations": "Former manager's investigation notes - reveals she was fired for getting too close" + } + ] + }, + { + "type": "suitcase", + "name": "Patricia's Briefcase", + "takeable": false, + "locked": true, + "lockType": "key", + "keyPins": [40, 60, 30, 50], + "difficulty": "medium", + "observations": "Former manager's briefcase - she left it behind when she was escorted out. No key available - would need to pick the lock.", + "contents": [ + { + "type": "notes", + "name": "ENTROPY Infiltration Timeline", + "takeable": true, + "readable": true, + "text": "═══════════════════════════════════════════════════════════\n HOW ENTROPY INFILTRATED VIRAL DYNAMICS\n [PATRICIA'S RECONSTRUCTION]\n═══════════════════════════════════════════════════════════\n\n18 MONTHS AGO:\nDerek Lawson hired as 'Senior Marketing Manager'\nBackground check clean - too clean?\n\n12 MONTHS AGO:\nDerek requests 'enhanced privacy' for his systems\nStarts working late nights regularly\n\n9 MONTHS AGO:\nFirst references to 'external partners' in meeting notes\nDerek begins booking conference room for 'private calls'\n\n6 MONTHS AGO:\nI notice unusual server access patterns\nStart documenting Derek's activities\n\n3 MONTHS AGO:\nConfront Derek - he deflects, becomes hostile\nStart finding evidence of coordination with 'ZDS'\n\n1 MONTH AGO:\nDiscovered references to 'The Architect' and 'Operation Shatter'\nProjected casualties document - 42-85 deaths\nThis is bigger than corporate espionage\n\nTODAY:\nFired for 'performance issues'\nThey're protecting him\nSomeone needs to stop this\n\n═══════════════════════════════════════════════════════════\nIf you found this, you're the someone.\n═══════════════════════════════════════════════════════════\n\n[MAJOR LORE Fragment - ENTROPY Infiltration History]", + "observations": "Patricia's reconstruction of how ENTROPY infiltrated the company - LOCKPICK ONLY" + } + ] + }, + { + "type": "notes", + "name": "Termination Letter", + "takeable": true, + "readable": true, + "text": "VIRAL DYNAMICS MEDIA\nHUMAN RESOURCES\n\nTO: Patricia Wells\nRE: Termination of Employment\n\nEffective immediately, your employment with Viral Dynamics Media is terminated due to performance concerns.\n\nPlease collect your personal belongings and return your access badge to security.\n\nWe wish you well in your future endeavors.\n\n(Note: This is clearly a form letter. No specific performance issues cited.)", + "observations": "Patricia's termination letter - suspiciously vague" + } + ] + }, + + "maya_office": { + "type": "room_office", + "locked": false, + "connections": { + "south": "hallway_east" + }, + "npcs": [ + { + "id": "maya_chen", + "displayName": "Maya Chen", + "npcType": "person", + "position": { "x": 4, "y": 4 }, + "spriteSheet": "hacker-red", + "spriteTalk": "assets/characters/hacker-red-talk.png", + "spriteConfig": { + "idleFrameStart": 20, + "idleFrameEnd": 23 + }, + "storyPath": "scenarios/m01_first_contact/ink/m01_npc_maya.json", + "currentKnot": "start" + } + ], + "objects": [ + { + "type": "notes", + "name": "Disinformation Research", + "takeable": true, + "readable": true, + "text": "RESEARCH NOTES - MAYA CHEN\n\nI was hired to analyze content effectiveness.\nWhat I found was something else entirely.\n\nThe 'campaigns' we're running aren't marketing.\nThey're psychological operations.\n\nTarget demographics aren't customers.\nThey're victims.\n\nI tried to raise concerns internally.\nPatricia listened. Then Patricia got fired.\n\nI'm documenting everything now.\nSomeone needs to know the truth.\n\n(If you're reading this and you're not Derek, we should talk.)", + "observations": "Maya's research notes revealing her concerns" + }, + { + "type": "notes", + "name": "SAFETYNET Contact", + "takeable": true, + "readable": true, + "text": "SECURE COMMUNICATION\n\nTo: SAFETYNET Tip Line\nFrom: Anonymous\n\nI work at Viral Dynamics Media.\nSomething terrible is being planned.\nThey call it 'Operation Shatter.'\nPeople will die.\n\nPlease send someone.\n\n- An ally", + "observations": "Maya's tip to SAFETYNET - she's the informant who triggered this mission" } ] }, @@ -388,9 +783,10 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "locked": true, "lockType": "key", "requires": "derek_office_key", - "difficulty": "easy", + "keyPins": [35, 55, 45, 25], + "difficulty": "medium", "connections": { - "south": "main_office_area" + "south": "hallway_east" }, "npcs": [ { @@ -404,33 +800,65 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "idleFrameEnd": 23 }, "storyPath": "scenarios/m01_first_contact/ink/m01_derek_confrontation.json", - "currentKnot": "start" + "currentKnot": "start", + "behavior": { + "initiallyHidden": true, + "appearsOnEvent": "all_flags_submitted" + } } ], "objects": [ + { + "type": "pc", + "name": "Derek's Computer", + "takeable": false, + "locked": false, + "observations": "Derek's personal workstation - files visible on screen", + "contents": [ + { + "type": "text_file", + "id": "contingency_files", + "name": "CONTINGENCY - IT Audit Response", + "takeable": true, + "readable": true, + "text": "═══════════════════════════════════════════════════════════\n CONTINGENCY PLAN: IT AUDIT RESPONSE\n [ACTIVATE IF COMPROMISED]\n═══════════════════════════════════════════════════════════\n\nIf audit discovers anomalies, activate CONTINGENCY.\n\nIT Manager Kevin Park becomes the fall guy.\nHis access patterns can be retroactively modified.\nHis termination provides closure for the company and\nends investigation.\n\nPREPARED EVIDENCE:\n- Fake security logs showing Kevin accessing servers at odd hours\n- Forged email from Kevin to 'unknown external party'\n- Timeline framing Kevin as source of data breach\n\nKevin helped you. Gave you access. Trusted you.\nAnd Derek is going to destroy his career—maybe his life—\nto cover ENTROPY's tracks.\n\n[This file triggers a moral choice when collected]", + "observations": "Derek's plan to frame Kevin for everything" + } + ] + }, { "type": "notes", "name": "Whiteboard Message", "takeable": false, "readable": true, - "text": "Encoded Message:\n<%= base64_encode(client_list_message) %>\n\n(Appears to be Base64 encoded)", + "text": "ENCODED MESSAGE ON WHITEBOARD:\n\n<%= base64_encode(client_list_message) %>\n\n(Appears to be Base64 encoded - use CyberChef workstation to decode)", "observations": "Strategic planning notes in encoded format" }, { "type": "safe", + "id": "derek_cabinet", "name": "Derek's Filing Cabinet", "takeable": false, "locked": true, "lockType": "pin", - "pin": "0419", + "requires": "0419", "observations": "Executive filing cabinet with electronic keypad - requires 4-digit PIN", "contents": [ + { + "type": "notes", + "name": "Operation Shatter Casualty Projections", + "takeable": true, + "readable": true, + "text": "═══════════════════════════════════════════════════════════\n OPERATION SHATTER - IMPACT ASSESSMENT\n [INTERNAL PLANNING DOCUMENT]\n═══════════════════════════════════════════════════════════\n\nPROJECTED CASUALTY ANALYSIS:\n\nDirect Casualties (First 24 Hours):\n- Cardiac events from panic: 15-30 fatalities\n- Diabetics missing insulin: 8-12 fatalities\n- Dialysis patients avoiding facilities: 4-8 fatalities\n- Violence from incitement: 5-15 fatalities\n- Traffic accidents from panic: 10-20 fatalities\n\nESTIMATED DIRECT DEATHS: 42-85 people\n\nSTRATEGIC JUSTIFICATION:\nThese deaths are not the goal—they are the demonstration.\nWhen truth emerges that fake messages caused real deaths,\ntrust in ALL digital communications collapses permanently.\n\nThis is not terrorism. This is education at scale.\n\nAPPROVED: The Architect\n\n[CRITICAL EVIDENCE - Operation Shatter]", + "observations": "Derek's calculated death projections - critical evidence", + "onPickup": { "setVariable": { "found_casualty_projections": true } } + }, { "type": "notes", "name": "Social Fabric Manifesto", "takeable": true, "readable": true, - "text": "═══════════════════════════════════════════════════════════\n ENTROPY CELL: SOCIAL FABRIC\n OPERATIONAL PHILOSOPHY DOCUMENT\n [RECOVERED INTELLIGENCE]\n═══════════════════════════════════════════════════════════\n\nPHILOSOPHY:\n\nSecurity professionals focus on technical defenses—\nfirewalls, encryption, access controls. They miss the\nmost vulnerable attack surface: human belief systems.\n\nPeople don't believe what's true. They believe what\naligns with their existing narratives...\n\nWe don't hack systems. We hack perception.\n\n[LORE Fragment - ENTROPY Cell Intelligence]", + "text": "═══════════════════════════════════════════════════════════\n ENTROPY CELL: SOCIAL FABRIC\n OPERATIONAL PHILOSOPHY DOCUMENT\n [RECOVERED INTELLIGENCE]\n═══════════════════════════════════════════════════════════\n\nPHILOSOPHY:\n\nSecurity professionals focus on technical defenses—\nfirewalls, encryption, access controls. They miss the\nmost vulnerable attack surface: human belief systems.\n\nPeople don't believe what's true. They believe what\naligns with their existing narratives.\n\nWe don't hack systems. We hack perception.\n\nOPERATIONAL METHODS:\n- Fabricate content that confirms existing fears\n- Target vulnerable populations with tailored messages\n- Exploit trust in institutional communications\n- Create panic through coordinated false information\n\nACCEPTABLE LOSSES:\nSome will die so others learn the lesson:\nVerify everything. Trust nothing.\nThe weak will die. The adaptable will survive.\n\n[LORE Fragment - ENTROPY Cell Intelligence]", "observations": "ENTROPY operational philosophy - critical intelligence" }, { @@ -438,10 +866,18 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "name": "Campaign Materials", "takeable": true, "readable": true, - "text": "CONFIDENTIAL - Viral Dynamics Campaign Strategy\n\nTarget: Local Election - District 7\n\nPsychological Profiles:\n- Demographic segmentation\n- Emotional trigger mapping\n- Narrative injection points\n\nAssets:\n- Fabricated photo collection\n- Coordinated social media accounts\n- Grassroots front organizations", + "text": "CONFIDENTIAL - OPERATION SHATTER ASSETS\n\nTarget: 2.3 million profiled individuals\n\nPsychological Profiles:\n- Medical dependency (insulin, dialysis)\n- Financial anxiety (elderly on fixed incomes)\n- Anxiety disorders (documented conditions)\n- Social isolation (limited support networks)\n\nDeployment Assets:\n- Fabricated hospital closure notices\n- Fake bank failure announcements\n- Forged government emergency alerts\n- Coordinated social media panic accounts\n\nLaunch Window: This Sunday, 6:00 AM\n\n[CRITICAL EVIDENCE - Campaign Assets]", "observations": "Evidence of coordinated disinformation campaign" } ] + }, + { + "type": "notes", + "name": "Derek's Calendar", + "takeable": true, + "readable": true, + "text": "DEREK LAWSON - PERSONAL CALENDAR\n\nToday: Client meeting (cover for this operation)\nTomorrow: Final coordination call with ZDS\nSunday: LAUNCH DAY - Operation Shatter goes live\n\nNote to self: Remember to activate Kevin contingency if audit finds anything. His fingerprints are already on the fake logs.", + "observations": "Derek's calendar showing Operation Shatter launches Sunday" } ] }, @@ -449,11 +885,12 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "server_room": { "type": "room_servers", "locked": true, - "lockType": "key", + "lockType": "rfid", "requires": "server_keycard", "connections": { - "west": "main_office_area" + "west": "hallway_east" }, + "npcs": [], "objects": [ { "type": "vm-launcher", @@ -495,70 +932,17 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "name": "Network Backdoor Analysis", "takeable": true, "readable": true, - "text": "SAFETYNET Intelligence Report\nCLASSIFICATION: RESTRICTED\n\nANALYSIS: Firmware Backdoor in Social Media Platform\n\nSummary: Social Fabric cell has embedded surveillance capabilities into their platform's core infrastructure. The backdoor operates at the firmware level...\n\n[LORE Fragment - Network Security Intelligence]", + "text": "SAFETYNET Intelligence Report\nCLASSIFICATION: RESTRICTED\n\nANALYSIS: Firmware Backdoor in Social Media Platform\n\nSummary: Social Fabric cell has embedded surveillance capabilities into their platform's core infrastructure. The backdoor operates at the firmware level, making it extremely difficult to detect through conventional security audits.\n\nCapabilities:\n- Real-time message interception\n- User behavior profiling\n- Coordinated message injection\n- Trust metric manipulation\n\nThis infrastructure enables Operation Shatter's mass panic deployment.\n\n[LORE Fragment - Network Security Intelligence]", "observations": "Technical analysis of ENTROPY backdoor implementation" - } - ] - }, - - "conference_room": { - "type": "room_office", - "connections": { - "east": "main_office_area" - }, - "objects": [ + }, { "type": "notes", - "name": "Meeting Notes", + "name": "Operation Shatter Target Database", "takeable": true, "readable": true, - "text": "Campaign Kickoff Meeting\n\nAttendees: Derek Lawson, External Partners\n\nTimeline:\n- Week 1-2: Content creation\n- Week 3-4: Narrative seeding\n- Week 5: Coordinated release\n\nNote: ZDS providing technical infrastructure support", - "observations": "Evidence of external collaboration with ZDS (Zero Day Syndicate)" - } - ] - }, - - "break_room": { - "type": "room_office", - "connections": { - "north": "main_office_area" - }, - "objects": [ - { - "type": "notes", - "name": "Coffee Shop Receipt", - "takeable": true, - "readable": true, - "text": "Receipt from 'The Daily Grind' - 11:47 PM\n\nNote written on back:\n'Derek meeting with unknown contact. Discussing 'Phase 3 timeline' and 'Architect's approval'", - "observations": "Handwritten note about suspicious late-night meetings" - } - ] - }, - - "storage_closet": { - "type": "room_closet", - "locked": false, - "connections": { - "south": "main_office_area" - }, - "objects": [ - { - "type": "safe", - "name": "Storage Safe", - "takeable": false, - "locked": true, - "lockType": "pin", - "pin": "1337", - "observations": "Electronic keypad safe - needs 4-digit PIN code", - "contents": [ - { - "type": "key", - "name": "Derek's Office Key", - "takeable": true, - "key_id": "derek_office_key", - "observations": "Spare key to Derek Lawson's office" - } - ] + "text": "═══════════════════════════════════════════════════════════\n OPERATION SHATTER - TARGET DEMOGRAPHICS\n [PSYCHOLOGICAL WARFARE DATABASE]\n═══════════════════════════════════════════════════════════\n\nTOTAL PROFILES: 2,347,832\nCOLLECTION PERIOD: 90 days\n\nSEGMENT 1: MEDICAL DEPENDENCY\nPopulation: 47,832 individuals\n- Insulin-dependent diabetics (14,203)\n- Weekly dialysis patients (2,847)\n- Chronic condition requiring hospital visits (30,782)\nVulnerability Score: 9.2/10\n\nSEGMENT 2: FINANCIAL ANXIETY\nPopulation: 156,432 individuals\n- Documented financial stress markers\n- Elderly on fixed incomes\n- Recent job loss indicators\nVulnerability Score: 8.7/10\n\nSEGMENT 3: ANXIETY DISORDERS\nPopulation: 89,247 individuals\n- Documented anxiety or panic disorders\n- Social media behavior indicating stress\nVulnerability Score: 9.5/10\n\nSEGMENT 4: ELDERLY ISOLATED\nPopulation: 34,891 individuals\n- Age 70+ living alone\n- Limited family contact\n- High institutional trust\nVulnerability Score: 9.8/10\n\n[CRITICAL EVIDENCE - Target Database]", + "observations": "Database of 2.3 million people profiled for vulnerability to panic", + "onPickup": { "setVariable": { "found_target_database": true } } } ] } @@ -568,16 +952,29 @@ password_hints = "Common passwords: Marketing123, Campaign2024, Viral_Dynamics_A "player_name": "Agent 0x00", "mission_started": false, "agent_0x99_contacted": false, - "player_approach": "", + "final_choice": "", - "derek_cooperative": false, + "derek_confronted": false, + + "kevin_choice": "", + "kevin_protected": false, + + "found_casualty_projections": false, + "found_target_database": false, + + "talked_to_maya": false, + "talked_to_kevin": false, + "maya_identity_protected": true, + "objectives_completed": 0, "lore_collected": 0, "evidence_collected": false, "current_task": "", + "ssh_flag_submitted": false, "linux_flag_submitted": false, "sudo_flag_submitted": false, - "derek_confronted": false + + "all_flags_submitted": false } } diff --git a/scripts/scenario-schema.json b/scripts/scenario-schema.json index 22545bf..2b0a203 100644 --- a/scripts/scenario-schema.json +++ b/scripts/scenario-schema.json @@ -139,7 +139,9 @@ "room_ceo", "room_closet", "room_servers", - "room_lab" + "room_lab", + "small_room_1x1gu", + "hall_1x2gu" ] }, "connections": { diff --git a/story_design/story_dev_prompts/00_scenario_initialization.md b/story_design/story_dev_prompts/00_scenario_initialization.md index 91070ae..1c0e41b 100644 --- a/story_design/story_dev_prompts/00_scenario_initialization.md +++ b/story_design/story_dev_prompts/00_scenario_initialization.md @@ -406,6 +406,15 @@ Before finalizing your initialization, verify: - **Tone mismatch** - Remember Break Escape is mostly serious with strategic humor - **Scope creep** - Don't try to tell an epic trilogy in a 30-minute scenario +### Stakes and Evil Pitfalls (CRITICAL) +- **Vague threats** - "ENTROPY will hurt people" is weak. Say "42-85 projected casualties" +- **Abstract harm** - Name the victims: "elderly people with anxiety disorders" +- **Sympathetic villains** - ENTROPY operatives should be TRUE BELIEVERS, not tragic antiheroes +- **Missing calculations** - Villains planned this; they have spreadsheets of projected deaths +- **No body count** - If people will die, give a number range. Make it real +- **No evil monologue** - The villain should explain their philosophy when confronted +- **Insufficient evidence** - Player should DISCOVER the evil through gameplay (documents, databases), not just be told about it + ## Examples For inspiration, review these example initializations: diff --git a/story_design/story_dev_prompts/01_narrative_structure.md b/story_design/story_dev_prompts/01_narrative_structure.md index d0ecfb7..6daeb83 100644 --- a/story_design/story_dev_prompts/01_narrative_structure.md +++ b/story_design/story_dev_prompts/01_narrative_structure.md @@ -16,6 +16,110 @@ You are a narrative architect for Break Escape. Your task is to take the initial 4. Sets up opportunities for player agency and meaningful choices 5. Provides clear dramatic beats that guide the player experience +--- + +## Critical Lessons: Making Stakes Concrete + +### Villains Must Be Clearly Evil + +ENTROPY cells should have **understandable motivations** (they believe what they're doing is justified), but their **actions must be clearly evil**. Avoid vague threats. Be specific about harm: + +**BAD - Vague Threat:** +> "ENTROPY is planning something dangerous that could harm people." + +**GOOD - Concrete Evil:** +> "Operation Shatter will trigger mass panic in populations ENTROPY has profiled as 'vulnerable to death.' Derek calculated the projected casualties himself: 42-85 deaths, primarily elderly and people with anxiety disorders. The Architect approved it." + +Concrete numbers and specific victims make the evil **real**. Players should feel urgency and moral clarity about stopping ENTROPY. + +### Opening Briefing: Establish Stakes Immediately + +The opening briefing should: + +1. **Name the operation** - Give ENTROPY's plan a code name (e.g., "Operation Shatter") +2. **State the body count** - If people will die, say how many (range is fine: "42-85 projected casualties") +3. **Identify victims** - Who gets hurt? Be specific (elderly, anxiety sufferers, a specific community) +4. **Show ENTROPY's calculation** - The villain planned this; they have projections +5. **Create moral urgency** - This isn't abstract; real people die if the player fails + +**Example Opening Briefing Beat:** + +```ink +Agent 0x99: This is urgent. We've intercepted ENTROPY operational documents. + +Agent 0x99: They're calling it "Operation Shatter." Mass panic campaign targeting 2.3 million people profiled as "vulnerable to death." + +Agent 0x99: Projected casualties: 42 to 85 people. Heart attacks, suicides, fatal accidents triggered by induced panic. + +Agent 0x99: ENTROPY calculated every one of those deaths. They consider it acceptable. +``` + +### Avoid Vague "Approach" Choices + +**DON'T** let players pick a vague approach label at mission start: + +```ink +// BAD - This doesn't reflect actual gameplay ++ [Cautious approach - take it slow] ++ [Confident approach - move quickly] ++ [Professional approach - by the book] +``` + +These choices are meaningless because: +- They don't map to actual player behavior +- Players may not follow through on their stated approach +- Debrief can't meaningfully reference a label that didn't affect anything + +**DO** track what players actually do during the mission: + +```ink +// GOOD - Track actual discoveries and interactions +VAR found_casualty_projections = false +VAR found_target_database = false +VAR talked_to_maya = false +VAR talked_to_kevin = false +VAR kevin_protected = false +``` + +Then reference these in the closing debrief: + +```ink +// Debrief references actual player actions +{found_casualty_projections: + Agent 0x99: You found the casualty projections. Good—that document will be key evidence. +} + +{talked_to_kevin and kevin_protected: + Agent 0x99: Kevin Park is safe, thanks to your intervention. You went beyond the mission parameters to protect an innocent. +} +``` + +### Closing Debrief: Reflect Actual Choices + +The closing debrief should: + +1. **Reference specific discoveries** - What evidence did the player find? +2. **Acknowledge NPC interactions** - Who did the player talk to? +3. **Address moral choices** - What did the player decide about optional interventions? +4. **Quantify success** - "42-85 people are alive because of your actions" +5. **Foreshadow consequences** - How will this mission's choices echo? + +**Example Debrief Tracking:** + +```json +"globalVariables": { + "found_casualty_projections": false, + "found_target_database": false, + "talked_to_maya": false, + "talked_to_kevin": false, + "kevin_choice": "", + "kevin_protected": false, + "lore_collected": 0, + "derek_confronted": false, + "final_choice": "" +} +``` + ## Required Input You should receive from Stage 0: diff --git a/story_design/story_dev_prompts/02_storytelling_elements.md b/story_design/story_dev_prompts/02_storytelling_elements.md index 51d2620..46f3528 100644 --- a/story_design/story_dev_prompts/02_storytelling_elements.md +++ b/story_design/story_dev_prompts/02_storytelling_elements.md @@ -24,7 +24,7 @@ From previous stages: ## Required Reading -###Essential References +### Essential References - `story_design/universe_bible/04_characters/safetynet/` - Established SAFETYNET agents - `story_design/universe_bible/04_characters/entropy/` - ENTROPY masterminds and cell leaders - `story_design/universe_bible/03_entropy_cells/[your_cell]/` - Your cell's members @@ -32,10 +32,113 @@ From previous stages: - `story_design/universe_bible/05_world_building/rules_and_tone.md` - Universe rules - Stage 1 narrative structure output +--- + +## Critical Lesson: Villain Characterization + +### The "True Believer" Villain + +ENTROPY operatives should not be sympathetic anti-heroes or tragic figures. They are **true believers** who: + +1. **Believe they're right** - Their philosophy makes sense *to them* +2. **Calculate the harm** - They know people will die; they've done the math +3. **Feel no remorse** - The harm is "acceptable" or even "necessary" +4. **Cannot be turned** - They won't cooperate or flip; they're ideologically committed +5. **Explain their philosophy** - When confronted, they articulate their worldview + +### The Evil Monologue + +Every mission's primary ENTROPY operative should have a confrontation moment where they reveal their true nature. This is NOT a sympathetic backstory—it's a window into genuine evil that happens to be articulate. + +**BAD - Tragic Sympathetic Villain:** +```ink +Derek: You don't understand. I lost my family to corporate negligence. +Derek: This is the only way to make them pay. +Derek: I never wanted anyone to get hurt... +``` + +**GOOD - True Believer Villain:** +```ink +Derek: Forty-two to eighty-five. That's the projection. + +Derek: I calculated every one of them. Stress responses, pre-existing conditions, probability of fatal outcomes. + ++ [You're talking about killing people] + Derek: I'm talking about *optimization*. + Derek: Those people were already dying—slowly, invisibly, from systems designed to extract value from their suffering. + Derek: We're just... accelerating the timeline. Making it visible. + ++ [How can you justify that?] + Derek: Justify? I'm *educating*. + Derek: When 85 people die in a single panic event, the world pays attention. + Derek: When 85,000 die slowly from poverty and stress? That's just Tuesday. + Derek: The Architect showed me: sometimes you have to make the invisible visible. +``` + +### Key Villain Traits + +| Trait | Wrong Approach | Right Approach | +|-------|----------------|----------------| +| Motivation | "I was hurt, so I hurt others" | "I see a truth others are blind to" | +| Remorse | Secretly regrets, can be turned | No regret; this is necessary work | +| Calculation | Acts impulsively out of pain | Has spreadsheets of projected deaths | +| Philosophy | Generic revenge/greed | Coherent (if monstrous) worldview | +| Confrontation | Breaks down, begs for understanding | Explains calmly, almost pityingly | + +### The Moment of Horror + +The player should have a moment where they realize the villain is **worse than expected**: + +```ink +// Player finds the casualty projections document +// NOT just "ENTROPY bad" but specific names, numbers, demographics + +"OPERATION SHATTER - CASUALTY PROJECTIONS + +Demographic: Adults 65+, anxiety disorder history +Exposure: Coordinated panic trigger via social media + news manipulation +Projected Outcomes: +- Cardiac events: 28-45 +- Suicide attempts: 12-20 (successful: 4-8) +- Fatal accidents during panic: 8-12 + +Total Projected Casualties: 42-85 + +Approval: [The Architect's signature] +Note from Derek: 'Numbers acceptable. Proceed with implementation.'" +``` + +This document should be **discoverable** through gameplay, not just referenced in dialogue. The player finds the evidence of evil. + +### Innocent Bystanders vs. ENTROPY Operatives + +Clearly distinguish between: + +**Innocent Employees** (victims to protect): +- Don't know what's happening +- Helpful to the player +- May be endangered by ENTROPY plans + +**ENTROPY Operatives** (targets to stop): +- Know exactly what they're doing +- Have made peace with the harm +- Will not cooperate when caught + +The player should feel protective of the former and righteous anger toward the latter. + +--- + ## Process Develop NPCs, atmospheric design, dialogue guidelines, and key storytelling moments that bring your narrative to life. +For each ENTROPY operative: +1. Define their role in the cell hierarchy +2. Articulate their personal philosophy (how they justify the harm) +3. Write their "evil monologue" - what they say when confronted +4. Determine their response to capture (defiant? calm? contemptuous?) +5. Create discoverable evidence that reveals their calculations + --- Save your storytelling elements as: diff --git a/story_design/story_dev_prompts/03_moral_choices.md b/story_design/story_dev_prompts/03_moral_choices.md index 678f6ee..6e096f8 100644 --- a/story_design/story_dev_prompts/03_moral_choices.md +++ b/story_design/story_dev_prompts/03_moral_choices.md @@ -33,9 +33,157 @@ From previous stages: - `story_design/universe_bible/05_world_building/rules_and_tone.md` - Ethical framework - `story_design/universe_bible/02_organisations/safetynet/rules_of_engagement.md` - Rules agents must follow +--- + +## Critical Lesson: Mid-Mission Moral Choices + +Every mission should include at least one **mid-mission moral choice** that forces the player to intervene (or not) in something beyond the core mission objectives. + +### Why Mid-Mission Choices Matter + +End-of-mission confrontation choices (arrest vs expose vs recruit) are standard, but the most memorable choices happen **during** the mission when the player discovers something they weren't looking for and must decide what to do about it. + +### The Pattern: Discovery → Personal Stakes → Intervention Choice + +**1. Discovery:** Player finds evidence of something beyond the main mission +**2. Personal Stakes:** The victim is someone who helped the player (or is otherwise sympathetic) +**3. Intervention Choice:** Player can help, ignore, or exploit the situation + +### Example: Kevin's Frame-Up (Mission 1) + +**Discovery:** On Derek's computer, player finds a file called "CONTINGENCY - IT Audit Response" + +**Content reveals:** Derek plans to frame Kevin Park (the IT guy who gave the player access and trusted them) for the entire data breach. Fake logs, forged emails—Kevin gets arrested while Derek escapes. + +**Personal Stakes:** Kevin helped you. Gave you lockpicks. Trusted you. His kids will watch him get arrested. + +**Intervention Choices:** + +```ink ++ [Warn Kevin directly - tell him what's coming] + // Risk: Kevin might panic, tip off Derek + // Benefit: Kevin can lawyer up, document everything, be prepared + #set_variable:kevin_choice=warn + #set_variable:kevin_protected=true + ++ [Leave evidence clearing Kevin for investigators] + // Risk: Takes time, investigators might miss it + // Benefit: Professional, Kevin never knows he was in danger + #set_variable:kevin_choice=evidence + #set_variable:kevin_protected=true + ++ [Focus on the mission - Kevin's not my responsibility] + // Consequence: Kevin gets arrested, trauma for his family + // Player lives with that choice + #set_variable:kevin_choice=ignore + #set_variable:kevin_protected=false +``` + +### Implementation Pattern + +Mid-mission moral choices are best triggered by **item pickup events**: + +**1. Create a PC or container with incriminating files:** + +```json +{ + "type": "pc", + "name": "Derek's Computer", + "contents": [ + { + "type": "text_file", + "id": "contingency_files", + "name": "CONTINGENCY - IT Audit Response", + "takeable": true, + "text": "If audit discovers anomalies, activate CONTINGENCY.\n\nIT Manager Kevin Park becomes the fall guy..." + } + ] +} +``` + +**2. Add event mapping to handler NPC (phone contact):** + +```json +{ + "eventPattern": "item_picked_up:contingency_files", + "targetKnot": "event_contingency_found", + "onceOnly": true +} +``` + +**3. Ink script presents the choice with handler guidance:** + +```ink +=== event_contingency_found === +#speaker:agent_0x99 + +Agent 0x99: I just saw what you pulled from Derek's computer. + +Agent 0x99: He's planning to frame Kevin Park for the entire breach. + +Agent 0x99: Kevin—the IT guy who gave you access, who trusted you—is going to take the fall. + ++ [What can I do about it?] + -> intervention_options +``` + +### Choice Design Principles + +**1. No Clear Right Answer** +- Warn Kevin: He's protected, but he might panic and compromise the mission +- Plant evidence: Professional, but takes time and might be missed +- Ignore: Mission-focused, but you live with the guilt + +**2. Personal Connection Required** +The victim should be someone the player has interacted with positively: +- Kevin gave the player lockpicks +- Maya provided intel that saved lives +- The security guard shared coffee and small talk + +**3. Consequences Must Echo** +The debrief should acknowledge the choice: + +```ink +{kevin_choice == "warn": + Agent 0x99: Kevin Park is safe. He's already lawyered up. + Agent 0x99: That was beyond mission parameters, but... it was the right call. +} + +{kevin_choice == "ignore": + Agent 0x99: Kevin Park was arrested this morning. + Agent 0x99: He'll be cleared eventually. But that's not something you just walk off. + Agent 0x99: His kids watched him get taken away in handcuffs. +} +``` + +### More Mid-Mission Choice Examples + +**Example 2: The Whistleblower's Family** +Player finds evidence that Maya's family is being surveilled by ENTROPY. Warn Maya (breaking protocol) or trust SAFETYNET to handle it (but they're slow)? + +**Example 3: The Undercover Agent** +Player discovers an undercover cop is about to be exposed. Blow their cover to save them, or let ENTROPY discover them to maintain your own cover? + +**Example 4: The Innocent Data** +Player must exfiltrate ENTROPY data, but the files also contain private medical records of innocent people. Take everything (evidence + privacy violation) or leave behind the sensitive data (ethics + incomplete intel)? + +**Example 5: The Competing Victim** +ENTROPY is about to ruin two people's lives, but you only have time to warn one. Who do you save? + +--- + ## Process -Design 2-4 major choices with genuine ethical complexity, clear consequences across multiple layers (immediate, mid-scenario, ending). +Design 2-4 major choices: +- **1 end-of-mission confrontation choice** (standard) +- **1-3 mid-mission intervention choices** (triggered by discovery) + +For each choice: +1. Define the discovery trigger (what document/evidence reveals the dilemma?) +2. Establish personal stakes (who gets hurt? why should player care?) +3. Design 2-4 options with distinct moral flavors +4. Map consequences (immediate, debrief, future missions) +5. Create implementation plan (event mappings, Ink knots, variables) --- diff --git a/story_design/story_dev_prompts/06_lore_fragments.md b/story_design/story_dev_prompts/06_lore_fragments.md index 2edd972..81e5745 100644 --- a/story_design/story_dev_prompts/06_lore_fragments.md +++ b/story_design/story_dev_prompts/06_lore_fragments.md @@ -33,10 +33,126 @@ From previous stages: - `story_design/universe_bible/03_entropy_cells/[your_cell]/` - Cell LORE opportunities - `story_design/universe_bible/10_reference/style_guide.md` - Writing style +--- + +## Critical Lesson: LORE as Evidence of Evil + +LORE fragments should not just be flavor text—they should **expose the villain's plans** in horrifying detail. The player should discover the evil through gameplay, not just be told about it in dialogue. + +### Evidence Discovery Fragments + +At least 2-3 LORE fragments per mission should be **evidence documents** that reveal: + +1. **The Plan's Scope** - How many people will be affected? +2. **The Calculations** - The villain did the math; show the spreadsheet +3. **The Approval Chain** - Who signed off? (The Architect, cell leaders) +4. **The Victims** - Demographics, profiles, targeting criteria + +### Example: Operation Shatter LORE + +**Fragment #4: Casualty Projections** +``` +═══════════════════════════════════════ +OPERATION SHATTER - CASUALTY PROJECTIONS +Classification: ENTROPY EYES ONLY +═══════════════════════════════════════ + +DEMOGRAPHIC TARGETING: +Adults 65+ with anxiety disorder history +Population identified: 2.3 million + +PROJECTED OUTCOMES: +- Cardiac events: 28-45 fatalities +- Suicide attempts: 12-20 (successful: 4-8) +- Fatal accidents during panic: 8-12 + +TOTAL PROJECTED CASUALTIES: 42-85 + +STATUS: Approved +AUTHORIZATION: [The Architect] + +Note from D.L.: "Numbers acceptable. +Collateral within parameters. Proceed." +``` + +**Fragment #5: Target Demographics Database** +``` +═══════════════════════════════════════ +TARGET DEMOGRAPHICS - OPERATION SHATTER +Classification: ENTROPY EYES ONLY +═══════════════════════════════════════ + +2.3 million individuals profiled across +three vulnerability metrics: + +1. FEAR SUSCEPTIBILITY (anxiety history) +2. ISOLATION FACTOR (limited support network) +3. HEALTH FRAGILITY (cardiovascular, respiratory) + +Cross-referencing social media behavioral +patterns with medical data obtained from +compromised healthcare systems. + +Each profile includes: +- Predicted panic response intensity +- Estimated recovery time +- Probability of fatal outcome + +[Database excerpt shows names, ages, and +mortality probability percentages] +``` + +### Fragment Discovery Should Track Progress + +Set global variables when key evidence is discovered: + +```json +{ + "type": "notes", + "id": "casualty_projections", + "name": "Operation Shatter Casualty Projections", + "takeable": true, + "observations": "A classified ENTROPY document with disturbing projections", + "onPickup": "#set_variable:found_casualty_projections=true" +} +``` + +The closing debrief should acknowledge what evidence the player found: + +```ink +{found_casualty_projections: + Agent 0x99: You found the casualty projections. + Agent 0x99: That document proves premeditation. They calculated every death. +} + +{found_target_database: + Agent 0x99: The target database is damning. 2.3 million people profiled for "vulnerability to death." + Agent 0x99: That's mass murder by algorithm. +} +``` + +### LORE Categories for Evidence + +| Category | Purpose | Example | +|----------|---------|---------| +| **Operational Documents** | Show the plan's details | Casualty projections, timelines | +| **Communications** | Show approval/coordination | Emails, chat logs with The Architect | +| **Databases/Lists** | Show scale of harm | Target demographics, victim profiles | +| **Personal Notes** | Show villain's mindset | Derek's journal, rationalization notes | +| **External Validation** | Show plan is real/imminent | News clippings, test results | + +--- + ## Process Determine fragment budget (6-20 depending on scenario length), plan fragment arc, design individual fragments (50-200 words each), create metadata, map discovery flow, and validate against LORE system. +**For each scenario, ensure:** +- At least 2-3 fragments are **evidence documents** exposing the evil plan +- Evidence documents include **specific numbers** (casualties, targets, victims) +- Evidence discovery is **tracked with variables** for debrief reference +- Evidence is **discoverable through gameplay** (not just in dialogue) + --- Save your LORE fragments as: diff --git a/story_design/story_dev_prompts/README.md b/story_design/story_dev_prompts/README.md index 77bc50c..314d920 100644 --- a/story_design/story_dev_prompts/README.md +++ b/story_design/story_dev_prompts/README.md @@ -152,6 +152,80 @@ If you're using these prompts to guide your own design process: - **Stage 7:** Ink scripts handle flag submission and CyberChef workstation dialogues - **Stage 9:** ERB templates generate encoded messages, VM and narrative integrated in scenario.json.erb +## Key Lessons Learned + +These lessons emerged from iterating on Mission 1 and should inform all future scenario development. + +### 1. Make Stakes Concrete with Specific Numbers + +**DON'T:** "ENTROPY is planning something that could hurt people." +**DO:** "Operation Shatter will kill 42-85 people—elderly, anxiety sufferers—ENTROPY calculated every death." + +Vague threats create vague stakes. Specific casualty projections make the evil real. + +### 2. Villains Must Be True Believers, Not Sympathetic + +ENTROPY operatives should: +- Believe they're right (coherent philosophy) +- Have calculated the harm (spreadsheets of projected deaths) +- Feel no remorse ("acceptable casualties") +- Refuse to cooperate when caught (ideologically committed) +- Explain their worldview in an "evil monologue" + +They are NOT tragic antiheroes seeking redemption. + +### 3. Avoid Vague "Approach" Choices + +**DON'T:** Let players pick a label at mission start ("Cautious", "Confident", "Professional") + +These don't affect gameplay and can't be meaningfully referenced in debriefs. + +**DO:** Track what players actually do during the mission: +- Which evidence did they find? +- Who did they talk to? +- What moral choices did they make? + +Then reference these specific actions in the closing debrief. + +### 4. Include Mid-Mission Moral Choices + +Every mission should have at least one intervention choice triggered by discovery: + +1. **Discovery:** Player finds evidence of harm beyond the mission +2. **Personal Stakes:** The victim is someone who helped the player +3. **Choice:** Intervene (warn, protect) or focus on mission (ignore) + +Example: Derek's plan to frame Kevin (who gave the player lockpicks). Player can warn Kevin, plant clearing evidence, or ignore it. + +### 5. Evidence Should Be Discoverable Through Gameplay + +Don't just tell players about ENTROPY's evil in dialogue. Let them **find** the evidence: +- Casualty projection documents on villain's computer +- Target demographic databases in the server room +- Email chains showing approval from The Architect + +Use LORE fragments and collectible items to expose the plan piece by piece. + +### 6. Closing Debrief Should Reflect Actual Choices + +Track player actions with global variables: +```json +"globalVariables": { + "found_casualty_projections": false, + "talked_to_kevin": false, + "kevin_protected": false, + "lore_collected": 0 +} +``` + +Debrief should acknowledge: +- What evidence the player found +- Which NPCs the player interacted with +- How moral choices resolved +- Quantified success ("42-85 people are alive because of you") + +--- + ## Required Context Before starting, ensure you have access to: