Skip to content
Open

. #36

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1043 commits
Select commit Hold shift + click to select a range
9f584eb
fix: enhance door corridor handling with direction support and unlock…
cliffe Mar 6, 2026
42ac66b
fix: update collision handling for side doors to use thin bars and pr…
cliffe Mar 6, 2026
859d010
fix: enhance note removal process by destroying proximity ghosts and …
cliffe Mar 6, 2026
4243af2
fix: implement session persistence for notes and global variables, en…
cliffe Mar 6, 2026
5d4d2c1
fix: adjust volume for keypad beep sound in UI sound manager
cliffe Mar 6, 2026
3145939
fix: enhance room state synchronization by using correct room IDs for…
cliffe Mar 6, 2026
49f1c2b
fix: adjust timing for talk frame animation in portrait rendering
cliffe Mar 6, 2026
c4181b2
fix: update female scientist talk animation image
cliffe Mar 6, 2026
2321678
fix: update room versioning across modules to ensure consistency and …
cliffe Mar 7, 2026
5d1764f
fix: update room versioning across modules to ensure consistency and …
cliffe Mar 7, 2026
3af2a88
fix: update room versioning across modules to ensure consistency and …
cliffe Mar 7, 2026
c528743
fix: remove male nerd talk animation and add server room ventilation …
cliffe Mar 7, 2026
ad80df2
Add music widget and controller for enhanced audio management
cliffe Mar 7, 2026
87cada9
feat: implement music widget to replace Spotify button for enhanced a…
cliffe Mar 7, 2026
66ec28c
feat: add scenario music event handling for dynamic audio management
cliffe Mar 8, 2026
e1d277b
feat: enhance music event conditions to utilize global variables for …
cliffe Mar 9, 2026
fb5aac4
feat(music): add victory playlist and visualiser toggle
cliffe Mar 9, 2026
28f868a
feat: update RFID icon references to use NFC waves icon and add new m…
cliffe Mar 9, 2026
6807e8d
Update audio files
cliffe Mar 9, 2026
86ce2ef
style(minigames): adjust positioning and remove border from minigame …
cliffe Mar 9, 2026
b230503
feat: enhance button styles and add CRT effect for session overlay bu…
cliffe Mar 9, 2026
39aa9b7
feat(music): add multiple new music tracks to enhance game atmosphere
cliffe Mar 9, 2026
ddd95cc
Enhance first contact scenario with new tasks, aims, and NPC interact…
cliffe Mar 11, 2026
bc357ad
Enhance scenario tasks with optional attributes and unlock conditions
cliffe Mar 12, 2026
747af01
Refactor scenario.json.erb: Update takeable status for security repor…
cliffe Mar 12, 2026
03fdd61
Add event handling for framing evidence seen in first contact scenario
cliffe Mar 12, 2026
1b1a8e2
Refactor message for event_framing_evidence_seen: Simplified language…
cliffe Mar 12, 2026
1deeced
Refactor event mappings in scenario.json.erb to remove unnecessary co…
cliffe Mar 12, 2026
4498406
Refactor event mapping validation in validate_scenario.rb: Remove tar…
cliffe Mar 12, 2026
6f82b51
Refactor container minigame styles: Add flexbox layout for desktop ic…
cliffe Mar 12, 2026
965b5ad
Refactor container image URL handling: Introduce getContainerImageUrl…
cliffe Mar 12, 2026
58b1efa
Enhance TTS functionality: Add scenario name support in TtsService fo…
cliffe Mar 12, 2026
6454c65
Add quota exhaustion handling in TtsService and TtsBatchProcessor
cliffe Mar 12, 2026
b4273b6
Implement pagination for "OTHER SESSIONS" in game view
cliffe Mar 12, 2026
a976102
Refactor interaction system: Simplify interaction scoring by removing…
cliffe Mar 12, 2026
51f4a11
Enhance interaction system: Modify consider function to accept a cust…
cliffe Mar 12, 2026
14d8d19
Add door signs to various rooms in scenario.json.erb for improved nav…
cliffe Mar 12, 2026
112341a
Adjust door rendering depth for E/W doors to align with wall-layer, e…
cliffe Mar 12, 2026
0d2cd41
Remove unnecessary whitespace for cleaner code and improved readabili…
cliffe Mar 12, 2026
13ba8b1
Refactor scenario.json.erb: Remove trailing whitespace from text fiel…
cliffe Mar 13, 2026
8d74b3c
Add door interaction handling: Implement logic to check for door spri…
cliffe Mar 13, 2026
6522e03
Enhance objectives management: Unlock parent aims upon task completio…
cliffe Mar 13, 2026
008bf7d
Add HUD info label: Implement dynamic label for displaying door signs…
cliffe Mar 13, 2026
0d15d06
Add N/S door corner block handling: Implement logic to track and appl…
cliffe Mar 13, 2026
96257a4
Refactor HUD tooltip handling: Remove tooltip elements from inventory…
cliffe Mar 13, 2026
b83cec9
Enhance HUD info label styling: Add max-width, overflow handling, and…
cliffe Mar 13, 2026
e03bcd7
Remove music button label from MusicWidget for cleaner UI presentation.
cliffe Mar 13, 2026
0e0a4b0
Enhance lockpicking minigame responsiveness: Adjust canvas size and c…
cliffe Mar 13, 2026
e46f750
Remove music button label styles for cleaner UI presentation
cliffe Mar 13, 2026
7ac5962
Adjust player door interaction positioning: refine target Y calculati…
cliffe Mar 13, 2026
03e5e5e
Refactor door interaction range: centralize DOOR_INTERACTION_RANGE co…
cliffe Mar 13, 2026
ad3d5b8
Update NPC sprite and email text: change spriteSheet for security gua…
cliffe Mar 13, 2026
bad74a3
Update NPC sprite and clear email text: change spriteSheet from offic…
cliffe Mar 13, 2026
1a35ba7
Update TTS controller tests: Modify mock service expectations to incl…
cliffe Mar 13, 2026
1fe0fdd
Refactor CyberChef task and messaging flow
cliffe Mar 16, 2026
f76df28
Enhance ObjectivesPanel: Implement collapsible aim sections with togg…
cliffe Mar 16, 2026
dd3b692
Adjust keypad beep volume in playUISound function for improved audio …
cliffe Mar 16, 2026
6857b34
Implement direct interaction for previously unlocked objects, bypassi…
cliffe Mar 16, 2026
0d69f1e
Filter out phone NPCs from processing in TtsBatchProcessor
cliffe Mar 16, 2026
3857517
Revise Maya's dialogue for clarity and detail in the informant reveal…
cliffe Mar 16, 2026
e98bbd2
Add comprehensive Minigame System Design Reference documentation
cliffe Mar 18, 2026
b296e01
Refactor notes structure in scenario.json.erb to group related items …
cliffe Mar 18, 2026
796ba84
Increase bottom padding for file content and observations sections to…
cliffe Mar 19, 2026
fd40733
Increase maximum text length limit for NPC interactions from 500 to 1…
cliffe Mar 19, 2026
cb156ff
Add ambientVolume to room data and enhance cipher message handling in…
cliffe Mar 19, 2026
b66c918
Clear stale container return state on cleanup to prevent incorrect na…
cliffe Mar 19, 2026
22c680d
Enhance NPC dialogue options and update scenario text for clarity and…
cliffe Mar 19, 2026
52df668
Refactor scenario objects: Rename Patricia's Safe to Briefcase, updat…
cliffe Mar 19, 2026
256f74a
Add multiple audio files for first contact TTS cache
cliffe Mar 20, 2026
debfd58
Refactor conversation options in Agent 0x99's dialogue for clarity an…
cliffe Mar 20, 2026
a2b8d71
Add new audio files for first contact in TTS cache
cliffe Mar 21, 2026
f105ee6
Refactor small office room JSON and TMJ files: update object position…
cliffe Mar 21, 2026
056144d
Enhance first contact scenario with new tasks and narrative elements
cliffe Mar 21, 2026
b9f8119
Add multiple new audio files for first contact TTS cache
cliffe Mar 21, 2026
795c98d
Adjust object positions in small office room JSON and TMJ files for i…
cliffe Mar 21, 2026
819786a
Enhance flag submission and validation system
cliffe Mar 21, 2026
642d0e1
Refactor player preferences CSS: remove body styles for improved cust…
cliffe Mar 21, 2026
a77543c
Enhance minigame framework: prevent player movement when a minigame o…
cliffe Mar 21, 2026
3cdeb17
Enhance NPC interaction logic: prevent interaction with hostile NPCs …
cliffe Mar 21, 2026
8683946
Add first contact scenario and enhance debriefing mechanics
cliffe Mar 23, 2026
c4ee050
Add new audio files for first contact TTS cache
cliffe Mar 23, 2026
ef85add
Enhance flag reward processing and update launch code references in s…
cliffe Mar 23, 2026
acbb131
Enhance sprite handling in room creation: allow scenario-specific tex…
cliffe Mar 23, 2026
6d73346
Implement NPC removal functionality: add server-side and client-side …
cliffe Mar 23, 2026
e6c6b1c
Refactor opening briefing dialogue for clarity and consistency
cliffe Mar 24, 2026
d49903c
Update NPC dialogue and scenario details: correct Sarah's name, clari…
cliffe Mar 24, 2026
743a6d0
Enhance scenario details and task mechanics in m01_first_contact
cliffe Mar 24, 2026
a23d720
Refactor scenario tasks and unlock conditions in m01_first_contact
cliffe Mar 24, 2026
b9b0cf3
Add new audio files for m01_first_contact scenario
cliffe Mar 24, 2026
b26ee19
Refactor scenario tasks and update character assets in m01_first_contact
cliffe Mar 25, 2026
e4f8738
Add new audio files for m01_first_contact scenario
cliffe Mar 25, 2026
3b6989d
added planning notes for implementation of SIEM dashboard
alixthegreat Mar 26, 2026
6a3a564
Add SIEM Dashboard minigame and alignment audit documentation
alixthegreat Mar 26, 2026
9e39df6
Enhance SIEM Dashboard minigame with passive alerts and severity brea…
alixthegreat Mar 26, 2026
1a3a0d0
Refactor agent name from "Agent 0x99" to "Agent HaX" in briefing dial…
cliffe Mar 26, 2026
34250e6
Refactor character names and dialogue for consistency
cliffe Mar 27, 2026
636e324
Add new audio files for m01_first_contact scenario
cliffe Mar 27, 2026
2ff82c9
Refactor task completion logic in first contact scenario
cliffe Mar 27, 2026
1c7b44b
Update target flags and enhance event conditions for task completion …
cliffe Mar 27, 2026
acfff56
Enhance scenario schema and validation script
cliffe Mar 27, 2026
ca983e4
Update card names and safe combination details in m01_first_contact s…
cliffe Mar 27, 2026
c38e8a7
Enhance SIEM Dashboard minigame with new time parsing functions and f…
alixthegreat Mar 27, 2026
5c5d4c2
Refactor text formatting in scenario.json.erb for improved readabilit…
cliffe Mar 27, 2026
fcbb200
Add narrator support with voice configuration and text validation adj…
cliffe Mar 27, 2026
fd15d3d
Remove redundant notes on Network Backdoor Analysis from m01_first_co…
cliffe Mar 27, 2026
4771f12
Improve choice selection handling by ensuring only visible options ar…
cliffe Mar 28, 2026
f1326f6
Add implementation plan for Ransomware Impact Display minigame
alixthegreat Mar 28, 2026
090be98
Add ransomware display minigame implementation
alixthegreat Mar 28, 2026
e6fe375
Add Ransomware Impact Test scenario
alixthegreat Mar 28, 2026
b952e0b
Add UX review documents for BreakEscape and Hacktivity integration
cliffe Mar 30, 2026
ebde481
Implement Phase 1: BreakEscape engine changes for Hacktivity GameSlot…
cliffe Mar 30, 2026
8504c8a
Add planned features for conditional locks and adjust opacity in rans…
alixthegreat Mar 31, 2026
bd4b396
Refactor SIEM dashboard interaction handling to not use lockType
alixthegreat Apr 1, 2026
eacd7f4
Enhance content security policies and improve game state management
cliffe Apr 1, 2026
f414430
Update scenario design readme
cliffe Apr 1, 2026
ea020f0
Add flag submission callback and enhance mission policy for host app …
cliffe Apr 1, 2026
f160eb4
Merge pull request #49 from alixthegreat/siem
cliffe Apr 2, 2026
177cc64
Merge branch 'main' into ransomware-impact-display
cliffe Apr 2, 2026
bbdd3d1
Merge pull request #50 from alixthegreat/ransomware-impact-display
cliffe Apr 2, 2026
15f962d
Add implementation plan and UI plan for Network Segmentation Map
alixthegreat Mar 31, 2026
a235506
Add Network Segmentation Map minigame and related assets
alixthegreat Apr 2, 2026
18925c9
Enhance scenario validation with puzzle graph metadata tracking and s…
cliffe Apr 3, 2026
e820d8d
Add new draft scenarios for SIS
cliffe Apr 3, 2026
93bbfd5
Validate and fix healthcare scenario for BreakEscape
cliffe Apr 3, 2026
462d2e0
Add placeholder character sprites for energy scenario
cliffe Apr 3, 2026
f3511f7
Validate and fix energy scenario for BreakEscape
cliffe Apr 3, 2026
5b4cc46
Validate and fix cyber insurance scenario for BreakEscape
cliffe Apr 3, 2026
140982d
Improve validator with early structure validation
cliffe Apr 3, 2026
6c7c206
Add documentation for validator structure validation improvements
cliffe Apr 3, 2026
7feb50f
Add comprehensive docs for SIS scenarios
cliffe Apr 3, 2026
0f67503
Merge branch 'cliffe:main' into network-segmentation-clean
alixthegreat Apr 3, 2026
294ea9a
added revised implementation plan to align with new documentation
alixthegreat Apr 3, 2026
5109a30
amended minigame implementation to align with documentation and plans
alixthegreat Apr 3, 2026
f2f83a7
Added more functionality to network segmentation map
alixthegreat Apr 3, 2026
9db7884
Rename sis scenarios and remove moved scenarios during seeding
cliffe Apr 3, 2026
c59c6fb
Add ink file validation to scenario validator
cliffe Apr 3, 2026
e6d1fde
Add --skip-ink option to scenario validator
cliffe Apr 3, 2026
7d0dfa0
Update Gemfile.lock to downgrade Rails components to version 7.1.4.2 …
cliffe Apr 3, 2026
027f927
Fix sis01_healthcare scenario and ink files
cliffe Apr 3, 2026
630e656
Fix ink file variable declarations - use VAR not EXTERNAL
cliffe Apr 3, 2026
9cef710
Fix generate_dungeon_graph.rb for Ruby 2.7 compatibility
cliffe Apr 3, 2026
707fa31
Update dungeon_graph.html and add new NPC ink files for sis01_healthc…
cliffe Apr 3, 2026
4366367
Complete INK narrative layer for healthcare scenario (sis01_healthcare)
cliffe Apr 3, 2026
e455dd3
Fix sis02_energy ink files - add global variable declarations
cliffe Apr 3, 2026
7932cb2
Develop INK dialogue trees for SIS03 Cyber Insurance scenario
cliffe Apr 3, 2026
4e2550c
Update dungeon_graph.html title and enhance NPC dialogue trees for si…
cliffe Apr 3, 2026
2e0f710
Add new MP3 files to tts_cache for sis01_healthcare scenario
cliffe Apr 3, 2026
e7ea122
Remove unused claim assessment flags from sis01_healthcare scenario.j…
cliffe Apr 4, 2026
50fd3aa
Add new MP3 files to tts_cache for m01_first_contact scenario
cliffe Apr 4, 2026
68fe1e2
Enable progress display for item collection in sis01_healthcare scena…
cliffe Apr 4, 2026
06a32db
Add new MP3 files to tts_cache for m01_first_contact scenario
cliffe Apr 4, 2026
937aec2
Merge branch 'cliffe:main' into network-segmentation-clean
alixthegreat Apr 4, 2026
e30c96d
minor tweaks to network segmentation minigame and final review
alixthegreat Apr 4, 2026
5190b3c
Enhance TTS batch processing and error handling in BreakEscape module
cliffe Apr 4, 2026
f18d3ed
Refactor TTS batch processor and enhance error handling in BreakEscap…
cliffe Apr 4, 2026
f9e003a
Add new MP3 files to tts_cache for m01_first_contact and sis01_health…
cliffe Apr 4, 2026
17980af
Refactor Ctrl-C interruption handling in TTS batch processor for dire…
cliffe Apr 4, 2026
fa66202
Merge pull request #51 from alixthegreat/network-segmentation-clean
cliffe Apr 4, 2026
ce164da
Add implementation plan for major incident command board
alixthegreat Apr 4, 2026
de96ae9
Added Major Incident Command Board minigame
alixthegreat Apr 5, 2026
deef83d
added backups to status in command board + review against sis documents
alixthegreat Apr 4, 2026
2fe56ca
align command board with SIS events and ICO aliasing
alixthegreat Apr 5, 2026
3c440ae
added implementation plan for backup recovery console
alixthegreat Apr 5, 2026
4e9ed4f
amended implementation plan for backup-console
alixthegreat Apr 6, 2026
9ccfc6d
added backup console minigame
alixthegreat Apr 6, 2026
b91f2b7
reviewed backup console against sis documents and amended slightly
alixthegreat Apr 6, 2026
9653a71
feat(mg-11): dual-authorisation panel minigame for sis01_healthcare
alihussain6692 Apr 7, 2026
fa0b8ed
added implementation plans for ehr prescribing terminal
alixthegreat Apr 7, 2026
39a3baf
added ehr prescription terminal minigame
alixthegreat Apr 7, 2026
9e3ad0a
reviewed ehr terminal against documentation and added online function…
alixthegreat Apr 7, 2026
0600bb1
Merge pull request #54 from alihussain6692/mg-11-clean
cliffe Apr 7, 2026
521c763
Merge pull request #52 from alixthegreat/command-board-2
cliffe Apr 7, 2026
9905f60
Merge branch 'main' into backup-recovery-console
cliffe Apr 7, 2026
4028ce9
Merge pull request #53 from alixthegreat/backup-recovery-console
cliffe Apr 7, 2026
02286c8
Merge branch 'main' into ehr-terminal
cliffe Apr 7, 2026
0583e4d
Merge pull request #55 from alixthegreat/ehr-terminal
cliffe Apr 7, 2026
b879edf
Various NPC behaviour improvements, and Implement scenario timer UI a…
cliffe Apr 7, 2026
d0a77d9
fix(mg-11): add missing ink source files with PIN variable declarations
alihussain6692 Apr 8, 2026
cd50900
Enhance lockpicking minigame initialization and NPC behavior handling
cliffe Apr 9, 2026
de9fc6d
Add immovable NPC behavior and update scenario schema
cliffe Apr 9, 2026
bcc478d
Enhance NPC dialogue and interaction for event cascade scenarios
cliffe Apr 9, 2026
e87ee0b
Implement ScenarioBarkValidator for NPC text validation and enhance T…
cliffe Apr 9, 2026
571599e
Enhance NPC pathfinding behavior and retry logic
cliffe Apr 9, 2026
2fa2015
Enhance NPC interaction and behavior: add bark icon tracking, improve…
cliffe Apr 9, 2026
aa90207
Enhance scenario validation and schema: add support for NPC behavior …
cliffe Apr 9, 2026
cb9b18b
Add reinfection handling and small dialogue update for post backup
alixthegreat Apr 9, 2026
fa39f63
feat(mg-08): Bedside Infusion Pump Terminal minigame for sis01_health…
alihussain6692 Apr 9, 2026
272af4c
added implementation plan for esd pushbutton
alixthegreat Apr 9, 2026
94a7048
Add ESD pushbutton minigame
alixthegreat Apr 9, 2026
38921ce
Merge pull request #56 from alihussain6692/mg-11-ink-files
cliffe Apr 9, 2026
338acb7
Merge pull request #57 from alixthegreat/helen-backup-reinfected-dial…
cliffe Apr 9, 2026
8d8f7f2
Merge pull request #58 from alihussain6692/mg-08-infusion-pump
cliffe Apr 9, 2026
45d00d7
Many functionality and scenario updates to support the sis healthcare…
cliffe Apr 9, 2026
cd586e2
Add early ESD press handling and reviewed implementation
alixthegreat Apr 10, 2026
6d6d301
Merge remote-tracking branch 'upstream/main' into esd-pushbutton
alixthegreat Apr 10, 2026
65ec0d7
Refactor scenario.json.erb to update global variable wiring and imple…
cliffe Apr 10, 2026
49e5fe6
Refactor scenario.json.erb for improved task handling and event mappi…
cliffe Apr 10, 2026
528f5a0
removed redundant line from interactions
alixthegreat Apr 11, 2026
5f2c3e9
Add implementation plan for sis configuration threshold
alixthegreat Apr 11, 2026
980bc2c
Add sis configuration threshold minigame
alixthegreat Apr 11, 2026
885519e
feat(mg-06): Network Architecture Diagram minigame for sis02_energy
alihussain6692 Apr 11, 2026
94f9220
feat: Enhance SIS scenario with new tasks and interactions
cliffe Apr 12, 2026
3371984
fix: Standardize NPC dialogue for Priya Chandra in arrival briefing a…
cliffe Apr 12, 2026
0d8d450
Merge branch 'main' into esd-pushbutton
cliffe Apr 12, 2026
8ac9ce2
Merge pull request #59 from alixthegreat/esd-pushbutton
cliffe Apr 12, 2026
5bd3116
Merge branch 'main' into mg-06-clean
cliffe Apr 12, 2026
9b5a907
Merge pull request #60 from alihussain6692/mg-06-clean
cliffe Apr 12, 2026
59ee6fd
feat: Add TODO documentation for Case 2: Energy scenario and update d…
cliffe Apr 12, 2026
0fd9fc8
feat: add scenario documentation and update CI workflow for sis01_hea…
cliffe Apr 12, 2026
e1b1079
fix: update CI workflow to use ubuntu-22.04 for lint and test jobs
cliffe Apr 12, 2026
9be2b93
fix: update CI workflow to install libsqlite3-dev for lint and test jobs
cliffe Apr 12, 2026
91c0757
Merge remote-tracking branch 'upstream/main' into sis-configuration-t…
alixthegreat Apr 12, 2026
50f7866
fix merge conflict in interactions.js
alixthegreat Apr 12, 2026
f3e2f9e
style: clean up whitespace in various scripts for consistency
cliffe Apr 12, 2026
9ba5466
Refactor NPC dialogue for Tom Hadley in the Albion incident scenario
cliffe Apr 12, 2026
4bafb0b
Review of sis configuration threshold and minor changes
alixthegreat Apr 12, 2026
8caa819
feat(mg-03): Facility Alarm Panel State Machine minigame for sis02_en…
alihussain6692 Apr 12, 2026
a84fe66
Refactor TODO.md and scenario.json.erb for clarity and consistency
cliffe Apr 12, 2026
a6a7d27
Merge pull request #61 from alixthegreat/sis-configuration-threshold
cliffe Apr 12, 2026
8a5348a
Merge pull request #62 from alihussain6692/mg-03-alarm-panel
cliffe Apr 12, 2026
12e5d2a
feat(mg-03): Implement alarm panel interaction and update testing wal…
cliffe Apr 12, 2026
b082f2c
feat(mg-04): Hydrogen Gas Alarm Progression for sis02_energy
alihussain6692 Apr 12, 2026
4e9a7f3
feat(rooms): Enhance edge alignment for room positioning based on doo…
cliffe Apr 12, 2026
f2cedf7
feat(tts_cache): Add new MP3 files for healthcare scenarios
cliffe Apr 12, 2026
53ece49
feat(interactions): Add infusion pump interaction handling and update…
cliffe Apr 13, 2026
a462d45
feat(siem-dashboard): Add alertConfig support with northgate_2025_11 …
cliffe Apr 13, 2026
a1cfdcf
feat(scenario): Update puzzle graph links for VPN and drug library in…
cliffe Apr 13, 2026
4d0536c
feat(dungeon-graph): Update incident description and adjust AND-gate …
cliffe Apr 13, 2026
45bd888
Enhance NPC interactions and isolation governance in sis02_energy sce…
cliffe Apr 13, 2026
76f68a0
Add new MP3 files to healthcare TTS cache
cliffe Apr 13, 2026
2a51992
Merge pull request #63 from alihussain6692/mg-04-h2-alarm
cliffe Apr 14, 2026
f106b81
feat(interactions): add network architecture interaction handling
cliffe Apr 14, 2026
a9cf481
Add patient bed 2 deceased condition and double-jeopardy timer for cr…
cliffe Apr 14, 2026
13b9391
feat(assets): add new hospital ward assets and update scenario positi…
cliffe Apr 15, 2026
f28a9e8
feat(assets): update hospital ward furniture to use spritesheets for …
cliffe Apr 15, 2026
2d72206
Refactor hospital ward assets and scenarios
cliffe Apr 15, 2026
59dc6c9
feat(assets): add new audio files for healthcare scenarios
cliffe Apr 15, 2026
c6a6aed
feat(minigame): add claims management system for sis03-cyber-insurance
alixthegreat Apr 15, 2026
5bf3d3c
feat(mg-02): Forensic Data Platform minigame for sis03_cyber_insurance
alihussain6692 Apr 15, 2026
4b904e8
Add startPosition to scenario schema and update validation script
cliffe Apr 16, 2026
4a541d4
Enhance ransomware display functionality and NPC interactions
cliffe Apr 16, 2026
c8a4be3
feat(assets): add new audio files for healthcare scenarios
cliffe Apr 16, 2026
99ab30a
Refactor NPC Dr. Bashir dialogue and scenario validation
cliffe Apr 16, 2026
af641e4
feat(assets): add new audio files for healthcare scenarios
cliffe Apr 16, 2026
9333941
Refactor Claims Management System
alixthegreat Apr 16, 2026
0d661e4
Merge pull request #64 from alihussain6692/mg-02-forensic-platform
cliffe Apr 16, 2026
e468214
feat(mg-03): NCSC Attribution Brief minigame for sis03_cyber_insurance
alihussain6692 Apr 16, 2026
10a9e39
Merge branch 'main' into claims-management-system
cliffe Apr 16, 2026
f61e750
Merge pull request #66 from alihussain6692/mg-03-ncsc-brief
cliffe Apr 16, 2026
7483e8e
Merge pull request #65 from alixthegreat/claims-management-system
cliffe Apr 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
196 changes: 196 additions & 0 deletions .claude/skills/break-escape-dungeon-graph/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
---
name: break-escape-dungeon-graph
description: Produces a Boss Keys-style dungeon dependency graph from a Break Escape scenario file (.json or .json.erb). Use this skill whenever the user pastes or uploads a Break Escape scenario file and asks for a diagram, graph, map, dependency chart, or visual overview of the level structure. Also trigger when the user asks to "visualise the mission", "show the lock and key structure", "draw the dungeon graph", or "update the diagram" after editing a scenario. The skill analyses rooms, objects, locks, keys, NPCs, items, objectives, and VM challenges, then renders an interactive scrollable SVG using the GMTK Boss Keys notation adapted for Break Escape.
---

# Break Escape dungeon graph skill

Produces a scrollable, interactive Boss Keys-style dependency graph from a Break Escape scenario file. Every lock shows what it requires; every key/item shows what it unlocks; VM challenges appear as obstacles with flag keys.

## Step 0 — parse the scenario

The user will paste or upload a scenario file. It may be JSON or JSON with ERB template tags (`<%= ... %>`). Strip ERB tags before parsing — replace `<%= ... %>` expressions with a readable placeholder (e.g. `"[ERB: base64_encode(...)]"`). Then extract:

**Rooms** (`scenario.rooms`) — each room has:
- `id`, `locked`, `lockType`, `requires`, `door_sign`, `connections`
- `objects` array — safes, PCs, filing cabinets, terminals, notes, items
- `npcs` array — characters who hold items or act as locks/keys

**Objects to classify:**
- `type: "safe"` or `type: "pc"` with `locked: true` → **lock nodes**
- `type: "key"` → **key node**
- `type: "lockpick"` / `type: "keycard"` → **key nodes**
- `type: "notes"` / `type: "text_file"` with meaningful content → **item nodes** (amber)
- `type: "workstation"` (CyberChef etc.) → **tool node** (amber diamond)
- `type: "vm-launcher"` → **VM obstacle node** (blue rect)
- `type: "flag-station"` → used to identify flag keys (purple diamonds)

**NPCs to classify:**
- NPCs with `itemsHeld` → each held item is a key node reachable by talking to or KO-ing the NPC
- NPCs with `storyPath` → conversation gate (treat as a soft lock if tied to an objective task)

**Objectives** (`scenario.objectives`) — extract:
- `unlockCondition: { aimCompleted }` → hard **objective gate** bars (amber)
- `tasks` with `type: "enter_room"` → room entry depends on prior aim
- `tasks` with `type: "submit_flags"` → VM flag submissions
- `tasks` with `status: "locked"` and `unlockCondition` → sequenced VM challenges

**VM flag dependencies** (`scenario.objectives → capture_technical_evidence → tasks`):
- Each `submit_flags` task maps to a VM challenge obstacle + flag key pair
- If a task has `unlockCondition: { flagSubmitted }`, it is sequentially gated on a prior flag

## Step 1 — build the dependency graph (mental model)

Before drawing, construct a logical dependency list:

```
For each room R:
If R.locked:
create LOCK node for R's door
requires: R.requires (key_id or PIN or rfid)
find the object/NPC that provides that key → create KEY node pointing to LOCK

For each object O in each room:
If O.locked:
create LOCK node for O
requires: O.requires
find source of that requirement → feed arrow from KEY to LOCK
If O is a key/lockpick/keycard/workstation/notes (takeable):
create ITEM/KEY node
draw arrow from ROOM (or NPC) to ITEM

For each NPC N with itemsHeld:
create KEY diamond for N
label with NPC name + items held
connect to: room that NPC is in (player must reach room first)

For objective gates:
place GATE bar above the node it gates
label with the aim name that must complete
```

## Step 2 — assign visual roles

Use GMTK Boss Keys notation adapted for Break Escape:

| Element | Shape | Colour class |
|---|---|---|
| Room / location | Ellipse | `c-teal` |
| Key / item / NPC unlock | Diamond (`<polygon>`) | `c-coral` |
| Physical lock (door, safe, PC) | Rectangle | `c-coral` |
| Physical item (notes, wordlist, tool) | Diamond | `c-amber` |
| CyberChef / decode tool | Diamond | `c-amber` |
| VM challenge (obstacle) | Rectangle | dark blue (`fill:#0c2040 stroke:#4a90d9`) |
| VM flag (key from VM) | Diamond | `c-purple` |
| Objective gate bar | Thin rect | dark amber (`fill:#2a1800 stroke:#e89030`) |
| Optional node | Any shape with `stroke-dasharray="4 2"` | same ramp, dashed |

**Subtitle rule:** every lock rect must show `requires: [what unlocks it]` as a 12px subtitle. Every key diamond must show the item name + brief note. Keep subtitles ≤ 5 words.

## Step 3 — layout rules

This diagram is always wide. Use a **scrollable HTML wrapper** around a wide SVG:

```html
<style>.sw{overflow-x:auto;width:100%}</style>
<div class="sw">
<svg width="[W]" viewBox="0 0 [W] [H]" style="min-width:[W]px">
...
</svg>
</div>
```

**Width guidelines:**
- Simple linear mission (1 main path): 800px
- Hub-and-spoke with 3 branches: 1100px
- Full mission with VM section + optional branches: 1300px

**Column placement:**
- Main flow runs down the centre column (cx ≈ W/2)
- Left branch (e.g. IT room): cx ≈ 150–200
- Right branch (e.g. manager's offices): cx ≈ W − 200 to W − 150
- Far-right optionals: cx ≈ W − 120
- VM section: spans full width, enclosed in a dashed blue container rect

**Row spacing:** 80px between row centres. Each node is either:
- Ellipse: ry=20, so top=cy−20, bottom=cy+20
- Rect (two-line): height=36, so top=y, bottom=y+36
- Diamond: polygon with half-height 22, so top=cy−22, bottom=cy+22

**Arrow routing rules:**
- Direct vertical connection: `<line>`
- Cross-column feed (dashed, no gate): `<path d="M x1 y1 L x1 ymid L x2 ymid L x2 y2" fill="none">`
- Shortcut (e.g. keycard bypasses main flow): blue dashed `stroke="#4a90d9" stroke-dasharray="5 3"`
- Never route an arrow through a node's interior — use L-bends to route around

**Dashed lines mean:** item feeds a lock elsewhere without gating the main flow. Solid lines mean required dependency.

## Step 4 — VM section layout

Place the VM section below the server room ellipse. Draw a dashed blue container rect around all VM nodes:

```svg
<rect x="[left]" y="[top]" width="[w]" height="[h]" rx="8"
fill="none" stroke="#4a90d9" stroke-width="0.8" stroke-dasharray="6 3"/>
<text class="ts" x="[left+16]" y="[top+14]" dominant-baseline="central" fill="#4a90d9">
SecGen VM environment
</text>
```

For each VM challenge, place:
1. A dark-blue **VM obstacle rect** (`fill:#0c2040 stroke:#4a90d9`) labelled with the challenge name and `requires:` subtitle
2. A vertical arrow down to a **purple flag diamond** labelled with flag number + what it reveals
3. If flag N gates challenge N+1, draw a dashed purple cross-arrow from flag N diamond to challenge N+1 rect

All VM flags converge at the bottom with arrows into the objective gate bar, then into the ENTROPY archive lock.

## Step 5 — legend

Always include a legend bar at the top (y=10–40):

```svg
<g class="c-gray"><rect x="16" y="10" width="[W-32]" height="30" rx="4" stroke-width="0.5"/></g>
```

Legend items (left to right): location oval, key diamond, lock rect, item diamond, VM obstacle rect, VM flag diamond, obj. gate rect, dashed line label, shortcut line label.

## Step 6 — interactivity

Wrap every node group in `<g class="node" onclick="sendPrompt('Tell me about [node name] in this scenario')">`. This lets the user click any node to ask follow-up questions.

## Step 7 — render

Use the `show_widget` visualiser tool with:
- `loading_messages`: 3 messages describing parsing → layout → rendering
- `title`: `[mission_id]_dungeon_graph`
- `widget_code`: the full HTML+SVG string

## Common patterns to recognise

**Kevin Park pattern** — NPC holds lockpick + keycard. The keycard enables a shortcut to the server room (blue dashed line). The lockpick enables picking a lock elsewhere (grey dashed line). Both are separate paths from the same diamond.

**Patricia's briefcase pattern** — locked container inside a room. The container itself is a lock (requires lockpick). Contents are multiple keys (office key + tool). Both content items need separate diamond nodes with arrows going to their respective locks.

**CyberChef pattern** — workstation item that is required to decode encoded notes. Draw an amber diamond for CyberChef. Draw dashed arrows from the encoded item to the CyberChef diamond, and from CyberChef to the decoded result (another item or a PIN).

**Encoded credential pattern** — a note/file whose content is encoded (Base64/ROT13). The raw note is an amber diamond. CyberChef is required to decode it. The decoded output is another amber diamond (e.g. "SSH username (decoded)") which feeds the VM challenge.

**Dual-PIN pattern** — if two locks share the same PIN source, note this in the subtitle of both lock rects. If they have distinct PINs, make sure each lock's subtitle cites its own source.

**Objective gate placement** — place the gate bar immediately above the node it blocks, not above the whole section. Label it: `obj. gate: [aim name] must complete`.

## Output checklist

Before rendering, verify:
- [ ] Every room is an ellipse
- [ ] Every lock rect has a `requires:` subtitle
- [ ] Every key diamond has a name + brief source note
- [ ] No two nodes overlap (check rightmost x + width < next node's x in same row)
- [ ] All arrows route around nodes, not through them
- [ ] VM section has a dashed container rect
- [ ] Flag diamonds show what they reveal/unlock
- [ ] Optional nodes have `stroke-dasharray="4 2"`
- [ ] Objective gate bars appear above the correct node
- [ ] Legend is present and complete
- [ ] Canvas is wide enough — if more than 4 nodes in any row, increase width
- [ ] `fill="none"` on all connector paths
9 changes: 9 additions & 0 deletions .cursor/rules/hacktivity-rules.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
description:
globs:
---

# Your rule content

- You can @ files here
- You can use markdown but dont have to
186 changes: 186 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
# Break Escape: AI Coding Agent Instructions

## Project Overview
Break Escape is a Rails Engine implementing a web-based educational game framework combining escape room mechanics with cyber-physical security learning. Players navigate 2D top-down environments (powered by Phaser.js), collect items, and solve security-themed mini-games aligned to the Cyber Security Body of Knowledge (CyBOK).

### Deployment Modes
Break Escape always runs as a Rails Engine, but operates in two distinct modes:
1. **Standalone Mode**: Local Rails instance with demo user support (development/testing)
2. **Mounted Mode**: Integrated into parent Rails applications like Hacktivity for course management and secure assessment delivery

**Server-Side Validation**: Solution validation is enforced server-side. Client-side validation is for UX and gameplay only; solutions (such as passwords and pins) are verified against solutions on the backend before further game content such as rooms can be accessed.

## Architecture

### Rails Engine Integration
Break Escape is always a Rails Engine, operating in one of two modes:

**Standalone Mode** (Local Development):
- Runs as a self-contained Rails app with demo user support
- Uses `break_escape_demo_users` table for test players
- Scenarios rendered on-demand with ERB template substitution (randomized passwords/PINs)
- State persisted in `break_escape_games` JSONB column

**Mounted Mode** (Production/Hacktivity):
- Mounts into host Rails application (e.g., Hacktivity) via `config/routes.rb`
- Uses host app's `current_user` via Devise for player authentication
- Game frontend served from `app/views/` and `public/` assets
- Scenario data and player progress persisted via Rails models (`app/models/`)
- Solution validation endpoints exposed as Rails controllers (`app/controllers/`)
- Admin/instructor UI for scenario management runs in the host application
- **Server-side validation of all solutions** prevents client-side tampering and ensures assessment integrity

### Core Systems (Sequential Initialization)
1. **Game Engine** (`js/core/game.js`): Phaser.js initialization, scene management (preload → create → update)
2. **Rooms** (`js/core/rooms.js`): Dynamic room loading from JSON scenarios, depth layering by Y-position + layer offset
3. **Player** (`js/core/player.js`): Character sprite with pathfinding, keyboard/mouse controls, animation system
4. **Systems** (`js/systems/`): Modular subsystems (interactions, inventory, doors, collisions, biometrics)
5. **Mini-games** (`js/minigames/`): Framework-based educational challenges (lockpicking, password, biometrics, etc.)

### Data Flow
- **Scenarios** (JSON) → loaded into `window.gameScenario` → populate rooms/objects → create interactive environment
- **Player Actions** → interaction system checks proximity → triggers object interactions or mini-games
- **Game State** stored in `window.gameState`: `{ biometricSamples, bluetoothDevices, notes, startTime }`

### Global Window Object
Break Escape attaches critical runtime objects to `window` for cross-module access (no complex bundling):
```javascript
window.game // Phaser game instance
window.gameScenario // Current scenario JSON
window.player // Player sprite
window.rooms // Object of room data
window.gameState // Persistent game state
window.inventory // Player's collected items
```

## Key Patterns & Conventions

### Room System & Depth Calculation
**Every object's depth = worldY + layerOffset** (not Z-index). This ensures correct perspective in top-down view:
- Walls: `roomY + 0.2`
- Interactive Objects: `objectBottomY + 0.5`
- Player: `playerBottomY + 0.5`
- Doors: `doorY + 0.45`

See `js/core/rooms.js` (lines 1-40) for detailed depth hierarchy documentation.

### Object Interactions
1. Objects must have `interactable: true` and `active: true` in scenario JSON
2. Interaction distance: `INTERACTION_RANGE = 64px` (checked every 100ms)
3. Interaction handlers in `js/systems/interactions.js` dispatch to specialized systems:
- Locks: `unlock-system.js` (key-based, password, PIN, biometric)
- Doors: `doors.js` (movement triggers)
- Inventory: `inventory.js` (item collection)
- Biometrics: `biometrics.js` (fingerprint collection/scanning)

### Mini-game Framework
All mini-games extend `MinigameScene` (`js/minigames/framework/base-minigame.js`):
```javascript
// Registration in js/minigames/index.js
MinigameFramework.registerScene('game-name', GameClass);

// Usage
window.MinigameFramework.startMinigame('game-name', { data });
```
Mini-games handle modal display, pause/resume, and return callbacks automatically.

### Inventory System
- Items stored as objects with `id`, `name`, `texture` properties
- Item identifiers created via `createItemIdentifier()` for UI display
- Starting items defined in `startItemsInInventory` array at scenario root level
- Starting items automatically added to inventory on game initialization

### Scenario JSON Structure
```json
{
"scenario_brief": "Mission description",
"endGoal": "What player must accomplish",
"startRoom": "room_id",
"startItemsInInventory": [
{
"type": "object_type",
"name": "Display name",
"takeable": true,
"observations": "Item description"
}
],
"rooms": {
"room_id": {
"type": "room_type",
"connections": { "north": "next_room" },
"objects": [
{
"type": "object_type",
"name": "Display name",
"takeable": false,
"interactable": true,
"scenarioData": { /* unlock conditions */ }
}
]
}
}
}
```

## Essential Development Workflows

### Adding a New Security Challenge
1. Create mini-game class in `js/minigames/{challenge-name}/`
2. Extend `MinigameScene` base class (see `js/minigames/framework/base-minigame.js`)
3. Register in `js/minigames/index.js` and export
4. Trigger from interactions via `window.MinigameFramework.startMinigame()`

### Adding Scenario Content
1. Create `scenarios/{name}.json` with room/object definitions
2. Use existing room types from `assets/rooms/*.json` Tiled files
3. Objects must match registered texture names (loaded in `game.js` preload)
4. Reference scenarios from `scenario_select.html`

### Debugging Game Issues
- **Player stuck/pathfinding**: Check `STUCK_THRESHOLD` (1px) and `PATH_UPDATE_INTERVAL` (500ms) in `constants.js`
- **Object not interactive**: Verify `interactable: true`, `active: true`, and `INTERACTION_RANGE` distance in scenario JSON
- **Depth/layering wrong**: Recalculate depth = `worldY + layerOffset` in `rooms.js` hierarchy
- **Mini-game not loading**: Verify registered in `minigames/index.js` and exported from minigame class

## Project-Specific Patterns

### Tiled Map Integration
Rooms use Tiled editor JSON format (`assets/rooms/*.tmj`). Key workflow:
- Objects stored in `map.getObjectLayer()` collections
- Tiled object GID → texture lookup via tileset registry
- `TiledItemPool` class manages available objects to prevent duplicates

### External Dependencies
- **Phaser.js v3.60**: Game engine (graphics, physics, input)
- **EasyStar.js v0.4.4**: Pathfinding (A* algorithm for player movement)
- **CyberChef v10.19.4**: Embedded crypto tools (iframe-based in laptop minigame)

### URL Versioning Convention
Assets use query string versioning: `import { x } from 'file.js?v=7'` to bust browser cache during development.

### CSS Styling Conventions
Maintain pixel-art aesthetic consistency:
- **Avoid `border-radius`** - All UI elements use sharp, 90-degree corners
- **Borders must be exactly 2px** - This matches the pixel-art tile size (32px tiles = 2px scale factor)
- Examples: buttons, panels, modals, and input fields in `css/*.css`

## Quick Command Reference

### Local Development
```bash
python3 -m http.server # Start local web server (root dir)
# Access: http://localhost:8000/scenario_select.html
```

### Scenario Testing
- Edit scenario JSON directly
- Reload browser (hard refresh if using version queries)
- Test from `scenario_select.html` dropdown

## Files to Read First When Onboarding
1. `README.md` - Project overview and feature list
2. `js/main.js` - Game initialization and global state setup
3. `js/core/game.js` - Phaser scene lifecycle and asset loading
4. `js/core/rooms.js` - Room management and depth layering documentation
5. `scenarios/biometric_breach.json` - Full example scenario structure
6. `js/minigames/framework/minigame-manager.js` - Mini-game architecture
Loading
Loading