Converts introducing_attacks/1_intro_linux.md into interactive dialogue:
- Tech Instructor NPC guides through Linux basics
- Hub structure for major topics: command-line, vi, piping, redirection, networking, SSH, Hydra
- Each topic has short explanations with deep-dive options
- Commands reference section
- Challenge tips for practical exercises
- Progress tracking and instructor rapport system
Game-based learning replacement for traditional lab sheets.
- Remove inconsistent 5-cell (ALPHA/BETA/GAMMA/DELTA/EPSILON) structure
- Update all organizational LORE to reference 11 established cells:
* Digital Vanguard, Critical Mass, Quantum Cabal
* Zero Day Syndicate, Social Fabric, Ghost Protocol
* Ransomware Incorporated, Supply Chain Saboteurs
* Insider Threat Initiative, AI Singularity, Crypto Anarchists
Changes:
- STRAT_001: Add postscript explaining evolution from 5 to 11 cells
- TECH_TOOL_001: Update to reference Critical Mass (not DELTA)
- ENTROPY_PERSONNEL_001: Update Cascade to match Critical Mass member Dr. Sarah Winters
- ENTROPY_OPS_001: Update to reference Digital Vanguard and Insider Threat Initiative
- ENTROPY_HISTORY_001: Note early cell evolution to specialized structure
- PROTO_CELL_001: Remove specific cell designation examples
- TRAIN_RECRUIT_001/TRAIN_OPSEC_001: Remove cell-specific references
- README_ORGANIZATIONAL_LORE: Remove OPCOM_001, update all references
Deletions:
- OPCOM_001: Removed Phase 3 coordination doc (inconsistent with universe bible)
This brings all organizational LORE into consistency with established universe bible.
Created interconnected LORE fragment collection revealing ENTROPY's
world through discoverable artifacts. Organized by content type and
artifact format for progressive player discovery.
**Structure:**
- 4 content categories: ENTROPY Intelligence, The Architect,
Character Backgrounds, Location History
- 7 artifact types: encrypted comms, intelligence reports, text notes,
emails, voice messages, corporate docs, personal items
- Progressive revelation: early game intro → mid game connections →
late game master plan
**10 Seed Fragments Created:**
ENTROPY Intelligence (5):
- Operation Glass House completion report (cell communication)
- Dead drop server list (compromised infrastructure)
- Thermite.py tool analysis (The Architect's signature)
- Operative "Cascade" profile (true believer)
- Complete organizational history (2015-2025, Phase 3 timeline)
The Architect (2):
- Philosophical manifesto on inevitability (ideology revealed)
- Phase 3 activation directive (July 15, complete master plan)
Character Backgrounds (3):
- Sarah Martinez confession email (insider threat desperation)
- Marcus Chen final voice message (civilian courage, survived!)
- Agent 0x99 axolotl philosophy (regeneration vs entropy)
Location History (1):
- Vanguard Financial complete history (25 years, breach, recovery)
**Key Features:**
- Interconnected narrative web (fragments reference each other)
- Educational value (CyBOK-aligned security lessons)
- Moral complexity (sympathetic characters on both sides)
- Emotional impact (personal stories, real consequences)
- Progressive mystery (builds understanding over time)
- Master catalog tracking all connections and discovery timing
**Thematic Elements:**
- ENTROPY: "For entropy and inevitability" - thermodynamic philosophy
- SAFETYNET: "For regeneration and resilience" - axolotl metaphor
- Phase 3: July 15, 2025 - infrastructure-wide coordinated attack
- Moral gray areas: desperate people, true believers, ethical constraints
Fragments demonstrate sophisticated threat actor (ENTROPY) with
decade-long planning, ideological commitment, and custom tooling,
opposed by dedicated defenders (SAFETYNET) who regenerate after
every setback.
See story_design/lore_fragments/MASTER_CATALOG.md for complete
interconnection map and expansion guidelines.
Create design document explaining how CTF flags integrate into
Break Escape's narrative through ENTROPY's dead drop system.
Key concepts:
- Flags as ENTROPY coordination messages
- Drop-site terminals hidden in plain sight
- Why physical presence is required for infiltration
- Flag reward categories (equipment, intel, access, story)
- Complete gameplay loop from briefing to debrief
- Sample Ink dialogue for character interactions
This system allows SecGen CTF scenarios to be embedded
narratively while providing tangible gameplay progression.
Updated both INK_BEST_PRACTICES.md and NPC_HUB_ARCHITECTURE.md to
accurately document the conversation flow pattern we're using.
Key Corrections:
1. Personal Conversations:
- Return to mission_hub WITHOUT #end_conversation tag
- This allows seamless return to hub menu
- Player can choose more topics without closing UI
2. Exit Options:
- Located in mission_hub knot
- Use pattern: #end_conversation -> mission_hub
- Tag closes UI while preserving state at mission_hub
- NOT -> DONE (which doesn't preserve hub state)
3. Flow Documentation:
- Added clear step-by-step flow examples
- Updated "How It Works" sections
- Fixed all code examples to show correct pattern
- Updated checklists and quick reference sections
4. Common Mistakes:
- Added examples of WRONG patterns (tag in personal endings)
- Added examples of CORRECT patterns (tag only in exit options)
- Clarified why each approach matters
5. Tag Name Updates:
- Changed references from old #exit_conversation to #end_conversation
- Updated all game engine integration notes
This ensures documentation matches the actual implementation in
chen_hub.ink, netherton_hub.ink, and haxolottle_hub.ink.
Applied the same conversation flow fix from chen_hub.ink to the other
two NPCs. Exit options now properly preserve state at mission_hub while
closing the conversation.
Pattern Applied:
#end_conversation
-> mission_hub
Instead of:
#end_conversation
-> DONE
This ensures:
1. Exit options close the conversation minigame (#end_conversation tag)
2. Story state is preserved AT mission_hub (not DONE)
3. Next conversation resumes from mission_hub with all options available
4. Player can have multiple conversation topics before choosing to exit
Files Updated:
- netherton_hub.ink (2 exit options)
- haxolottle_hub.ink (2 exit options)
Recompiled all hub JSON files.
All three NPCs now have consistent conversation flow behavior.
Fixed issue where personal conversations were closing the entire interaction
instead of returning to mission_hub menu.
The Problem:
- Personal conversation endings had #end_conversation tag before -> mission_hub
- This caused the entire conversation to close when personal chat ended
- Player couldn't access mission_hub menu options after personal conversations
The Fix:
- Removed #end_conversation tags from conversation_end knots in ongoing_conversations
- Personal conversations now return to mission_hub WITHOUT closing
- Player sees mission_hub menu again with all available options
- #end_conversation tag remains ONLY in mission_hub exit options
Correct Flow Now:
1. Player chooses personal conversation topic at mission_hub
2. Has personal conversation
3. Personal conversation ends -> mission_hub (no tag)
4. Player sees mission_hub menu again
5. Player can continue with other options OR choose exit
6. Exit option has #end_conversation -> DONE (closes conversation)
Files modified:
- dr_chen_ongoing_conversations.ink
- netherton_ongoing_conversations.ink
- haxolottle_ongoing_conversations.ink
Recompiled all hub JSON files.
Consolidated all ink source files into scenarios/ink directory for better
organization. All ink source files and documentation are now in the same
location as their compiled JSON output.
Changes:
1. Moved all .ink source files from story_design/ink/ to scenarios/ink/
- chen_hub.ink and supporting files
- netherton_hub.ink and supporting files
- haxolottle_hub.ink and supporting files
- All other ink source files
2. Moved documentation files to scenarios/ink/
- INK_BEST_PRACTICES.md
- NPC_HUB_ARCHITECTURE.md
- ONGOING_CONVERSATIONS_README.md
- README.md
3. Added scripts/compile-ink.sh
- Automatically compiles all .ink files in scenarios/ink/
- Outputs JSON to the same directory
- Shows colored output with success/failure status
- Provides compilation summary
Usage:
./scripts/compile-ink.sh
This consolidates the ink development workflow into a single directory
and provides an easy way to recompile all ink files after making changes.
Implemented proper handling for the #end_conversation tag to automatically
close the conversation UI without requiring manual ESC key press.
Changes:
1. Added event listener for 'npc-conversation-ended' event in setupEventListeners()
- Saves NPC state when event is received
- Automatically ends minigame and returns to game
- Verifies event is for current NPC
2. Updated showCurrentDialogue() to detect graceful conversation endings
- Checks for #end_conversation tag when story reaches hasEnded
- If tag present, waits for event handler instead of showing manual exit message
- Preserves manual exit message for unexpected/error END states
Flow:
- Ink script: #end_conversation -> DONE
- PhoneChatConversation processes tag and dispatches npc-conversation-ended event
- PersonChatMinigame receives event and automatically closes
- Player sees smooth transition back to game
This eliminates the "(End of conversation - press ESC to exit)" message
for normal conversation endings while preserving it as a safety fallback.
Fixes issue where choosing conversation exit options would show
"reached end of story" console message. All mission_hub exit points
now use:
#end_conversation
-> DONE
Instead of:
#end_conversation
-> END
This preserves conversation state at mission_hub while cleanly
ending the interaction without triggering ink's end-of-story behavior.
Updated hub files:
- chen_hub.ink
- netherton_hub.ink
- haxolottle_hub.ink
Recompiled all hub JSON files to reflect changes.
BREAKING CHANGE: Unified relationship variable naming
Old System (Per-NPC Variables):
- Dr. Chen: npc_chen_rapport with #rapport_gained/lost tags
- Director Netherton: npc_netherton_respect with #respect_gained/lost tags
- Haxolottle: npc_haxolottle_friendship_level with #friendship_gained/lost tags
New System (Unified Influence):
- Dr. Chen: npc_chen_influence with #influence_gained/lost tags
- Director Netherton: npc_netherton_influence with #influence_gained/lost tags
- Haxolottle: npc_haxolottle_influence with #influence_gained/lost tags
Benefits:
- Consistent scoring system across all NPCs
- Simpler to understand and balance
- Unified tag system (#influence_gained/lost)
- Messages still customized per NPC based on their personality
Files Changed:
- dr_chen_ongoing_conversations.ink: rapport → influence
- chen_hub.ink: rapport → influence
- netherton_ongoing_conversations.ink: respect → influence
- netherton_hub.ink: respect → influence
- haxolottle_ongoing_conversations.ink: friendship_level → influence
- haxolottle_hub.ink: friendship_level → influence
- PersonChatConversation.js: Updated getInfluenceMessage() for unified system
- Now detects NPC ID and provides appropriate messages
- Supports legacy tag names for backward compatibility
- INK_BEST_PRACTICES.md: Updated all examples and documentation
- Variable naming conventions
- Tag system documentation
- All code examples
- NPC-specific sections
- NPC_HUB_ARCHITECTURE.md: Updated influence system documentation
- Recompiled all hub JSON files
Messages by NPC:
- Dr. Chen: "Dr. Chen appreciates that" / "Dr. Chen is disappointed"
- Netherton: "Director Netherton approves" / "Director Netherton is displeased"
- Haxolottle: "Haxolottle likes that" / "Haxolottle seems disappointed"
All files compile successfully with unified influence system.
BREAKING CHANGE: Updated conversation ending behavior
Old Pattern (WRONG):
- Conversations ended with #exit_conversation
- Diverted to -> END (lost state)
- Game code navigated back to mission_hub
- State not preserved between interactions
New Pattern (CORRECT):
- Conversations end with #end_conversation
- Divert to -> mission_hub (preserves state)
- Game code closes UI window
- Next interaction resumes from mission_hub with full context
Why This Matters:
- State preservation: NPC remembers where conversation left off
- Flexible re-entry: Player can talk to NPC multiple times
- Context awareness: Hub can show different options based on prior discussions
Files Changed:
- All *_ongoing_conversations.ink files: Updated conversation_end knots
- Changed #exit_conversation -> #end_conversation
- Changed -> END -> -> mission_hub
- PersonChatConversation.js: Renamed handleExitConversation -> handleEndConversation
- Now dispatches 'npc-conversation-ended' event to close UI
- Ink handles state preservation via -> mission_hub
- PhoneChatConversation.js: Same changes as PersonChatConversation
- INK_BEST_PRACTICES.md: Updated documentation with correct pattern
- Fixed conversation ending examples
- Updated checklists
- Added state preservation explanation
- NPC_HUB_ARCHITECTURE.md: Updated mission hub flow documentation
- Recompiled all hub JSON files
This ensures conversation state is properly maintained across
multiple interactions with the same NPC within a play session.
Influence Tags System:
- Add #rapport_gained/lost:X tags for Dr. Chen throughout all conversations
- Add #respect_gained/lost:X tags for Director Netherton
- Add #friendship_gained/lost:X tags for Haxolottle
- Tags automatically added after every relationship variable change
- Small changes (±2-5) for minor interactions
- Medium changes (±5-10) for meaningful moments
- Large changes (±10-15) for major trust/betrayal moments
Conversation Handler Updates:
- PersonChatConversation: Add handleInfluenceGained/Lost methods
- PhoneChatConversation: Add tag processing support
- Dispatch 'npc-influence-change' events for UI layer
- Context-appropriate messages based on NPC type and amount
Documentation:
- Create INK_BEST_PRACTICES.md with comprehensive patterns
- Hub architecture and mission_hub pattern
- Influence tags system with examples
- External functions reference
- Variable persistence patterns
- Common ink patterns and anti-patterns
- Complete checklists for new NPC content
- Update NPC_HUB_ARCHITECTURE.md
- Document mission_hub pattern implementation
- Document influence tags system
- Add navigation support requirements
- Cross-reference best practices
Files Modified:
- All ongoing_conversations.ink files (chen, netherton, haxolottle)
- All hub.ink files (chen, netherton, haxolottle)
- PersonChatConversation.js - influence tag handlers
- PhoneChatConversation.js - influence tag handlers (stub)
- Compiled JSON files regenerated
This provides players with immediate visual feedback for relationship
changes and gives writers a clear pattern to follow for all NPC content.
- Standardize all NPC hub files with a consistent 'mission_hub' knot
- Rename chen_main_hub → mission_hub in chen_hub.ink
- Rename netherton_main_hub → mission_hub in netherton_hub.ink
- Rename haxolottle_main_hub → mission_hub in haxolottle_hub.ink
- Add #exit_conversation tag handling in both conversation classes
- PersonChatConversation: Add handleExitConversation() method
- PhoneChatConversation: Add processTags() and handleExitConversation()
- When personal conversations end, automatically navigate back to mission_hub
- Allows seamless flow between personal/mission topics within same conversation
This creates a hub-and-spoke pattern where:
- mission_hub = central routing point (not visible to player)
- Personal conversations branch off and return to hub
- Mission-specific topics branch off and return to hub
- Player sees continuous conversation, game manages routing
Fixed all player_name references to use function call syntax player_name().
Also removed invalid === END knot definitions from hub files.
Changes:
- Fixed player_name -> player_name() in all ongoing_conversations.ink files
- Removed === END knot definitions (END is a built-in directive)
- chen_hub.ink now compiles successfully with only warnings
- netherton_hub.ink and haxolottle_hub.ink still have some structural issues to resolve
Status:
✓ chen_hub.ink - compiles successfully
⚠ netherton_hub.ink - has choice nesting errors
⚠ haxolottle_hub.ink - has missing knot targets and variable errors
When using INCLUDE in ink, all knots are brought into the same namespace.
Divert statements should reference knots directly without the file prefix.
Changed:
- chen_hub.ink: -> dr_chen_ongoing_conversations.phase_X_hub
to -> phase_X_hub
- netherton_hub.ink: -> netherton_ongoing_conversations.phase_X_hub
to -> phase_X_hub
- haxolottle_hub.ink: -> haxolottle_ongoing_conversations.phase_X_hub
to -> phase_X_hub
This fixes the "Divert target not found" compilation errors.
Fixed multiple Ink compilation errors:
1. Removed duplicate EXTERNAL and VAR declarations from hub files:
- chen_hub.ink: Removed player_name(), current_mission_id(),
total_missions_completed, and professional_reputation declarations
(already declared in dr_chen_ongoing_conversations.ink)
- netherton_hub.ink: Same removals for netherton context
- haxolottle_hub.ink: Same removals for haxolottle context
2. Fixed EXTERNAL function call syntax in dr_chen_ongoing_conversations.ink:
- Changed {player_name} to {player_name()} in phase hubs and conversation ends
- Fixed 6 instances across phase_2_hub, phase_3_hub, phase_4_hub,
conversation_end_phase2, and conversation_end_phase3
3. Fixed conditional syntax in chen_hub.ink:
- Changed `current_mission_id == "ghost_in_machine"` to
`current_mission_id() == "ghost_in_machine"` with proper brace structure
4. Fixed jump_to_personal_conversations in all hub files:
- Removed non-existent `_with_return` tunnel calls
- Changed to direct diverts to phase_hub knots
- Removed unreachable "return" dialogue
All hub files now properly include the ongoing conversations file and only
declare EXTERNAL variables unique to the hub context.
Fixed two compilation errors:
1. dr_chen_ongoing_conversations.ink line 478: Fixed conditional structure
in phase_2_hub to use proper opening brace and hyphenated first condition
2. chen_hub.ink line 522: Removed invalid '=== END' knot definition
(END is a built-in directive, not a knot to define)
These syntax errors were preventing ink compilation.
All three NPCs (Netherton, Dr. Chen, Haxolottle) are now positioned in the
hq_briefing_room starting room so they are immediately visible when the
scenario loads. Previously they were in separate rooms which caused them
not to appear since the game only loads NPCs for the starting room initially.
Changes:
- Moved all NPC definitions from individual rooms to hq_briefing_room
- Updated npc_location context to "briefing_room" for all NPCs
- Positioned NPCs at (3,3), (6,5), and (7,3) respectively
CRITICAL FIXES:
- Add empty parentheses to all EXTERNAL declarations
* EXTERNAL player_name() instead of EXTERNAL player_name
* EXTERNAL current_mission_id() instead of EXTERNAL current_mission_id
* Fixed in all hub files and personal conversation files
- Fix conditional syntax to require explicit else clauses
* Changed from implicit multi-condition to explicit {- condition: ... - else: ...}
* Fixed in all entry points and hub menus
- Fix player_name references throughout to use function call syntax
* {player_name()} instead of {player_name}
- Fix remaining double-prefix bug in dr_chen file
* npc_npc_chen_rapport -> npc_chen_rapport
FILES UPDATED:
- netherton_hub.ink
- netherton_ongoing_conversations.ink
- chen_hub.ink
- dr_chen_ongoing_conversations.ink
- haxolottle_hub.ink
- haxolottle_ongoing_conversations.ink
These changes fix Ink compiler errors:
- 'Expected declaration of arguments for EXTERNAL, even if empty'
- 'Expected an '- else:' clause here rather than an extra condition'
All files should now compile successfully with inklecate.
NEW SCENARIO: npc-hub-demo-ghost-protocol.json
Comprehensive demonstration scenario featuring:
SAFETYNET HQ LAYOUT:
- Briefing Room (hub with connections to all NPCs)
- Director Netherton's Office (north)
- Dr. Chen's Technical Lab (east)
- Haxolottle's Handler Station (west)
THREE NPCs WITH HUB INTEGRATION:
1. Director Netherton
- Uses netherton_hub.json entry point
- Location: office, Phase: planning
- Respect: 65 (growing trust)
- Has discussed: handbook, leadership
- Holds: Ghost Protocol mission packet
2. Dr. Chen
- Uses chen_hub.json entry point
- Location: lab, Phase: planning
- Rapport: 58, Equipment status: needs_upgrade
- Has discussed: tech philosophy, ENTROPY tech
- Holds: Experimental equipment for Ghost Protocol
* Active Network Camouflage Device
* Quantum-Encrypted Comm Unit
* Enhanced Data Exfiltration Tools
* Technical specifications document
3. Haxolottle (Agent 0x99)
- Uses haxolottle_hub.json entry point
- Location: handler_station, Phase: planning
- Friendship: 35, Operational stress: moderate
- Has discussed: hobbies, axolotl obsession, music
- Holds: Handler support plan + personal note
CONTEXT VARIABLES DEMONSTRATED:
- current_mission_id: "ghost_in_machine"
- mission_phase: "planning" (can change to active/debriefing)
- npc_location: Different for each NPC
- total_missions_completed: 3
- professional_reputation: 15
- equipment_status: needs_upgrade (triggers Chen priorities)
- operational_stress_level: moderate
SCENARIO FEATURES:
- Player starts in briefing room with mission notes
- Can visit each NPC to experience context-aware conversations
- Each NPC shows different topics based on mission phase
- Personal conversations available during planning phase
- Mission-specific briefings ready for Ghost Protocol
- Persistent variables track relationship progression
TESTING THE HUB PATTERN:
This scenario allows testing:
✓ Context-aware topic menus
✓ Personal vs. mission content mixing
✓ Equipment priority system (Chen)
✓ Handler coordination (Haxolottle)
✓ Mission briefing system (Netherton)
✓ Relationship persistence across conversations
✓ Navigation between different NPCs and conversation types
Change mission_phase to "active" to see tactical support options
Change to "debriefing" to see post-mission conversations
Change to "downtime" to focus on personal relationship building
CRITICAL BUG FIXES:
- Fixed double-prefix variable naming bugs in all three NPC files
* npc_npc_netherton_* → npc_netherton_*
* npc_npc_chen_* → npc_chen_*
* npc_chen_npc_chen_* → npc_chen_*
* npc_haxolottle_npc_haxolottle_* → npc_haxolottle_*
NEW ARCHITECTURE:
- Created central hub files for each NPC that mix personal + mission content
* netherton_hub.ink - Director hub with mission briefings & tactical support
* chen_hub.ink - Tech support hub with equipment & experimental tech
* haxolottle_hub.ink - Handler hub with crisis support & coordination
FEATURES:
- Context-aware conversation menus based on:
* current_mission_id - What mission is active
* mission_phase - Planning, active, debriefing, downtime
* npc_location - Where conversation happens
* operational_stress_level - Crisis prioritization (Haxolottle)
* equipment_status - Repair/upgrade priority (Dr. Chen)
- Hybrid approach combines:
* Separate files for modularity (personal vs mission content)
* Context-aware presentation (right topics at right time)
* Helper functions to check topic availability
* Priority-ordered option menus
EXAMPLES:
- Created netherton_mission_ghost_example.ink showing:
* Mission briefing system
* Tactical support during active operations
* Emergency extraction coordination
* Post-mission debriefing with performance evaluation
DOCUMENTATION:
- NPC_HUB_ARCHITECTURE.md - Comprehensive documentation including:
* File structure and organization
* How hub pattern works
* Variable scoping (PERSISTENT, GLOBAL, EXTERNAL)
* Context-aware conversation flow examples
* Pros/cons of different architectural approaches
* Best practices and naming conventions
* Integration requirements for game engine
* Instructions for adding new missions
BENEFITS:
✓ Clean separation of personal vs mission content
✓ Reusable personal conversations across all missions
✓ Easy to add new missions without touching personal files
✓ Version control friendly (different writers, different files)
✓ Context-aware topic presentation
✓ Scalable to dozens of missions
✓ Natural conversation flow mixing personal & professional
Related to previous work:
- Builds on three-tier variable persistence system
- Uses npc_<npcname>_<variable> scoping convention
- Leverages total_missions_completed for progression
Updated all three ongoing conversation files (Netherton, Chen, Haxolottle) with
clear PERSISTENT/GLOBAL/LOCAL variable annotations and proper scoping:
PERSISTENT variables:
- Save/load between game sessions
- Use scoped naming (npc_netherton_*, npc_chen_*, npc_haxolottle_*)
- Include all relationship stats, discussed topics, and special moments
GLOBAL variables:
- Session-only, span across NPCs
- total_missions_completed (replaces sequential mission tracking)
- professional_reputation
LOCAL variables:
- Conversation-specific EXTERNAL variables
- player_name, current_mission_id
This enables order-independent mission completion while maintaining
persistent conversation state across game sessions.