Commit Graph

70 Commits

Author SHA1 Message Date
Z. Cliffe Schreuders
c3440986a3 fix: Correct side door (E/W) placement, sprites, and animations
This commit fixes several issues with East/West side doors:

1. **Sprite Flipping**: Changed flip direction - East doors are now flipped
   horizontally instead of West doors (opposite direction as requested)

2. **Door Positioning**: Updated E/W door placement from 2 tiles to 3 tiles
   from the top corner for better alignment with room layout

3. **Wall Passage Cutout**: Increased wall tile removal area for side doors
   from 1 tile to 3 tiles vertically, creating a wider passage (matching the
   inset spacing used for N/S doors)

4. **Side Door Animation**:
   - Added `isSideDoor` property to doorProperties to track door type
   - Created new 'door_side_open' animation using frames 1-4 (frames 2-5
     in 1-indexed notation) of door_side_sheet_32 sprite
   - Updated animated door creation to use side door sprite and animation
     for E/W doors

5. **Sprite Alignment**: Door sprites now properly align with the tile grid
   at 3 tiles from corner position

Changes made in:
- js/systems/doors.js: Door placement, sprite creation, and animations
- js/systems/collision.js: Wall tile removal for wider passages
- js/core/game.js: Side door animation definition

Tested with: scenarios/test_horizontal_layout.json
2025-11-17 12:28:19 +00:00
Z. Cliffe Schreuders
aef6e97df0 fix: Update item spawn positioning to respect room GU boundaries and padding
- Modified createSpriteAtRandomPosition() to accept map parameter
- Items now use actual room dimensions based on tilemap (respects room GU)
- Applied correct padding constraints:
  * 1 tile (32px) from left and right sides
  * 2 tiles (64px) from top and bottom
- Random item placement now works correctly with variable room sizes
- Ensures items stay within playable room bounds

Related to new room layout system (Grid Unit based positioning)
2025-11-17 11:19:43 +00:00
Z. Cliffe Schreuders
150e3a6d43 fix: Ensure each connecting room has minimum 1 GU overlap with parent
Updated room positioning to verify overlap for EACH connected room
after grid alignment, not just the group as a whole. This fixes
layouts like:

  122
  00

Where room 1 was previously positioned with no overlap to room 0.

Changes:
- positionNorthMultiple/positionSouthMultiple: After centering and
  aligning group, check first and last room overlap. If insufficient,
  shift entire group to ensure minimum overlap for each room.
- positionEastMultiple/positionWestMultiple: Same approach for
  vertical stacking along east/west edges.

The algorithm now:
1. Centers the group of connecting rooms over parent
2. Aligns starting position to grid
3. Checks if first room has >= 1 GU overlap, adjusts if not
4. Checks if last room has >= 1 GU overlap, adjusts if not
5. Positions all rooms from the adjusted aligned start

This guarantees each connecting room overlaps with the parent room
by at least one Grid Unit, ensuring proper door placement and room
connectivity.
2025-11-17 11:04:52 +00:00
Z. Cliffe Schreuders
0442139236 fix: Align connecting rooms to grid with minimum 1 GU overlap
Updated room positioning algorithm to ensure all connecting rooms are
properly aligned to the grid and have at least one Grid Unit overlap
with the connecting edge of the parent room.

Changes:
- positionNorthMultiple/positionSouthMultiple: Position rooms as a group,
  align the starting position to grid, then place rooms side-by-side
  without individual alignment to prevent gaps
- positionEastMultiple/positionWestMultiple: Similar approach for vertical
  stacking of rooms along east/west edges

This ensures:
- All rooms maintain proper grid alignment
- Connected rooms have guaranteed minimum overlap
- No gaps between adjacent rooms in multi-room connections
- Room layouts match the examples in planning notes

Addresses alignment issues described in new_room_layout documentation
where rooms need to be positioned against the connecting edge with
at least one GU overlap.
2025-11-17 11:04:52 +00:00
Z. Cliffe Schreuders
302449d8e1 fix: Resolve room layout issues for mixed sizes and east/west doors
This commit addresses three critical issues identified during testing:

1. **Fixed mixed room size door alignment (Issue #1)**
   - Updated room positioning logic in positionNorthMultiple, positionSouthMultiple,
     positionEastMultiple, and positionWestMultiple functions
   - Rooms are now positioned centered on their corresponding door positions
   - Ensures doors align properly between different-sized rooms (e.g., 1×1 GU closet
     connecting to 2×1 GU hallway)
   - Uses same door spacing logic as door placement (edgeInset + doorSpacing)

2. **Implemented East/West single-tile doors (Issue #2)**
   - Changed door_side_sheet_32 from image to spritesheet (6 frames, 32×32px each)
   - Updated door sprite creation to use single tile per room for east/west doors
   - West-facing doors (left room) now properly flip horizontally
   - Doors positioned 3 tiles down from top (TILE_SIZE * 2) as specified
   - Updated wall tile removal and animated door creation to use correct dimensions
   - Both sides of east/west connections now use matching door system

3. **Added connection limit validation (Issue #3)**
   - Created validateMultipleConnections function to check if connections fit
   - Validates that multiple connections won't cause rooms to overhang excessively
   - Logs detailed error messages with recommendations when connections don't fit
   - Example: 2GU room can't have 3 north connections (not enough width)
   - Helps developers identify invalid room layouts during scenario design

Files modified:
- js/core/game.js: Load door_side_sheet_32 as spritesheet
- js/core/rooms.js: Fix positioning, add validation
- js/systems/doors.js: Single-tile east/west doors with flipping
- js/systems/collision.js: Update wall tile removal for single-tile doors
2025-11-17 08:49:50 +00:00
Z. Cliffe Schreuders
d92a8a5f18 fix: Correct room type keys in test scenarios and add new room types to preload
Fixed issue where test scenarios couldn't load rooms:

1. Added new room types to game preload:
   - small_room_1x1gu (1×1 GU closet)
   - hall_1x2gu (2×1 GU wide hallway)

2. Corrected room type keys in all test scenarios:
   - room_reception2 → room_reception
   - room_office2 → room_office
   - room_ceo2 → room_ceo
   - room_servers2 → room_servers

The issue was that scenarios referenced room file names (room_reception2)
instead of the Phaser cache keys (room_reception). The game preloads rooms
with specific keys that map to the JSON files:
  this.load.tilemapTiledJSON('room_reception', 'assets/rooms/room_reception2.json')

Scenarios must use the key ('room_reception'), not the filename.

Files updated:
- js/core/game.js: Added preload for new variable-sized rooms
- scenarios/test_vertical_layout.json
- scenarios/test_horizontal_layout.json
- scenarios/test_complex_multidirection.json
- scenarios/test_multiple_connections.json
- scenarios/test_mixed_room_sizes.json

All test scenarios should now load correctly.
2025-11-17 08:49:50 +00:00
Z. Cliffe Schreuders
7cec8b2e17 feat(validation): Add comprehensive room layout validation system
- Add validateRoomSize() to check room dimensions match grid units
- Add validateGridAlignment() to verify positions align to grid
- Add validateNoOverlaps() to detect room collisions
- Add validateRoomLayout() as main validation entry point
- Integrate validation into calculateRoomPositions (Phase 5)
- Store roomPositions globally for cross-system access
- Log validation errors/warnings but don't block game load

Validation checks:
✓ Room width is multiple of 5 tiles (grid unit)
✓ Room stacking height is multiple of 4 tiles (grid unit)
✓ Room positions align to 160px × 128px grid
✓ No rooms overlap (AABB collision detection)

Warnings: Room size mismatches (for backwards compatibility)
Errors: Grid misalignment, overlaps (critical issues)
2025-11-16 08:45:06 +00:00
Z. Cliffe Schreuders
2e62a4e62b feat(room-layout): Implement new grid-based room layout system with critical bug fixes
- Add grid unit constants (5x4 tiles) to constants.js
- Create comprehensive grid conversion helper functions
- Implement 4-direction room positioning (N/S/E/W) with breadth-first algorithm
- Add door placement functions with CRITICAL fixes:
  * Negative modulo fix: ((sum % 2) + 2) % 2 for deterministic placement
  * Asymmetric alignment fix: single-door rooms align with multi-door rooms
  * Consistent grid alignment using Math.floor() for negative coordinates
- Rewrite calculateRoomPositions to support variable room sizes
- Update createDoorSpritesForRoom to use new placement system
- Store room dimensions globally for cross-system access

This implements the comprehensive room layout redesign as specified in
planning_notes/new_room_layout with all critical fixes from review2.

Addresses: Variable room sizes, proper door alignment, and grid-based positioning
2025-11-16 08:45:06 +00:00
Z. Cliffe Schreuders
f8b20c2db0 feat(rfid): Complete system integration
Integrated RFID minigame into all game systems:

Chat System Integration:
- Added clone_keycard tag handler to chat-helpers.js
- Format: # clone_keycard:Card Name|HEX_ID
- Uses proven window.pendingConversationReturn pattern
- Automatically returns to conversation after cloning

Inventory Integration:
- Added keycard click handler in interactions.js
- Click keycard with cloner → starts clone mode
- Shows alert if no cloner available

Interaction Indicator:
- Added RFID icon support to getInteractionSpriteKey()
- RFID-locked doors/items show rfid-icon overlay
- Works for both door and item lock types

HTML Integration:
- Added rfid-minigame.css link to index.html
- Loaded alongside other minigame styles

Phaser Asset Integration:
- Added keycard sprites (base + 3 variants)
- Added rfid_cloner sprite
- Added rfid-icon and nfc-waves icons
- Loaded in js/core/game.js preload

All integration follows existing patterns from other minigames.
Ready for testing and asset creation.
2025-11-15 23:48:15 +00:00
Z. Cliffe Schreuders
5b75d75a01 Enhance key and lock systems with normalization and debugging improvements 2025-11-14 20:51:25 +00:00
Z. Cliffe Schreuders
660105421a Add Hostile NPC mode
Fix NPC interaction and event handling issues

- Added a visual problem-solution summary for debugging NPC event handling.
- Resolved cooldown bug in NPCManager by implementing explicit null/undefined checks.
- Modified PersonChatMinigame to prioritize event parameters over state restoration.
- Updated security guard dialogue in Ink scenarios to improve interaction flow.
- Adjusted vault key parameters in npc-patrol-lockpick.json for consistency.
- Changed inventory stylesheet references to hud.css in test HTML files for better organization.

feat(combat): Integrate chair kicking with punch mechanic

Update chair interaction to use the punch system instead of direct kicking:

**Changes to interactions.js:**
- Modified swivel chair interaction to trigger player punch instead of
  directly applying kick velocity
- Simplified chair interaction handler to just call playerCombat.punch()

**Changes to player-combat.js:**
- Extended checkForHits() to detect chairs in punch range and direction
- Added kickChair() method that applies the same velocity calculation:
  - Calculates direction from player to chair
  - Applies 1200 px/s kick force in that direction
  - Triggers spin direction calculation for visual rotation
  - Adds visual feedback (flash chair, light screen shake)
- Chairs now respond to punch AOE damage like hostile NPCs

Now clicking a chair or pressing 'E' near it triggers a punch, and if the
chair is in punch range and facing direction, it gets kicked with the
original velocity physics. Multiple chairs can be kicked with one punch.

feat(combat): Implement hostile NPC behavior and final integration (Phase 6-7)

Complete hostile NPC combat system with chase behavior and integration:

**Phase 6: Hostile NPC Behavior**
- Modified npc-behavior.js determineState() to check hostile state from npcHostileSystem
- Implemented updateHostileBehavior() with chase and attack logic:
  - NPCs chase player when hostile and in aggro range
  - NPCs stop and attack when in attack range
  - NPCs use directional movement with proper animations
  - Integration with npcCombat system for attack attempts
- Added KO state check to prevent KO'd NPCs from acting

**Phase 7: Final Integration**
- Modified player.js to disable movement when player is KO
- Added visual KO effect (50% alpha) to NPC sprites in npc-hostile.js
- Connected all combat systems end-to-end:
  - Ink dialogue → hostile tag → hostile state → chase behavior → combat
  - Player interaction → punch → NPC damage → KO → visual feedback
  - NPC chase → attack → player damage → HP UI → game over

Full combat loop now functional: hostile NPCs chase and attack player,
player can punch hostile NPCs, complete visual/audio feedback, game over on KO.

feat(combat): Add feedback, UI, and combat mechanics (Phase 2-5)

Implement comprehensive combat feedback, UI, and mechanics:

**Phase 2: Enhanced Feedback Systems**
- damage-numbers.js: Floating damage numbers with object pooling
- screen-effects.js: Screen flash and shake for combat feedback
- sprite-effects.js: Sprite tinting, flashing, and visual effects
- attack-telegraph.js: Visual indicators for incoming NPC attacks

**Phase 3: UI Components**
- health-ui.js: Player health display as hearts (5 hearts, shows when damaged)
- npc-health-bars.js: Health bars above hostile NPCs with color coding
- game-over-screen.js: KO screen with restart/main menu options

**Phase 4-5: Combat Mechanics**
- player-combat.js: Player punch system with AOE directional damage
- npc-combat.js: NPC attack system with telegraph and cooldowns
- Modified interactions.js to trigger punch on hostile NPC interaction
- Integrated all systems into game.js create() and update() loops

Combat now functional with complete visual/audio feedback pipeline.
Player can punch hostile NPCs, NPCs can attack player, health tracking works.

feat(combat): Add hostile NPC system foundation (Phase 0-1)

Implement core hostile NPC combat system infrastructure:

- Add #hostile tag handler to chat-helpers.js for Ink integration
- Fix security-guard.ink to use proper hub pattern with -> hub instead of -> END
- Add #hostile:security_guard tags to hostile conversation paths
- Create combat configuration system (combat-config.js)
- Create combat event constants (combat-events.js)
- Implement player health tracking system with HP and KO state
- Implement NPC hostile state management with HP tracking
- Add combat debug utilities for testing
- Add error handling utilities for validation
- Integrate combat systems into game.js create() method
- Create test-hostile.ink for testing hostile tag system

This establishes the foundation for hostile NPC behavior, allowing NPCs to
become hostile through Ink dialogue and tracking health for both player and NPCs.

docs(npc): Apply codebase-verified corrections to hostile NPC plans

Apply critical corrections based on actual codebase verification:

CORRECTIONS.md (Updated):
-  Confirms #exit_conversation tag ALREADY IMPLEMENTED
  * Location: person-chat-minigame.js line 537
  * No handler needed in chat-helpers.js
-  Hostile tag still needs implementation in chat-helpers.js
- Provides exact code for hostile tag handler
- Clarifies tag format: #hostile:npcId or #hostile (uses current NPC)
- Updated action items to reflect what's already working

INTEGRATION_UPDATES.md (New):
- Comprehensive correction document
- Issue 1 Corrected: Exit conversation already works
- Issue 6 Corrected: Punch mechanics are interaction-based with AOE
- Details interaction-based punch targeting:
  * Player clicks hostile NPC OR presses 'E' nearby
  * Punch animation plays in facing direction
  * Damage applies to ALL NPCs in range + direction (AOE)
  * Can hit multiple enemies if grouped (strategic gameplay)
- Provides complete implementation examples
- Removes complexity of target selection systems
- Uses existing interaction patterns

quick_start.md (Updated):
- Removed exit_conversation handler (already exists)
- Updated hostile tag handler code
- Added punch mechanics design section
- Clarified interaction-based targeting
- Added troubleshooting for exit_conversation

Key Findings:
 Exit conversation tag works out of the box
 Punch targeting uses existing interaction system (simpler!)
 AOE punch adds strategic depth without complexity
 Only ONE critical task remains: Add hostile tag to chat-helpers.js

Impact:
- Less work required (don't need exit_conversation handler)
- Simpler implementation (use existing interaction patterns)
- Better gameplay (AOE punches, directional attacks)
- Clear path forward with exact code examples

docs(npc): Add critical corrections and codebase integration review

Add comprehensive review of hostile NPC plans against actual codebase:

CORRECTIONS.md:
- Identifies critical Ink pattern error (-> END vs -> hub)
- Documents correct hub-based conversation pattern
- Provides corrected examples for all Ink files
- Explains why -> hub is required after #exit_conversation

FORMAT_REVIEW.md:
- Validates JSON scenario format against existing scenarios
- Reviews NPC object structure and required fields
- Documents correct Ink hub pattern from helper-npc.ink
- Proposes hostile configuration object for NPC customization
- Provides complete format reference and checklists

review2/integration_review.md:
- Comprehensive codebase analysis by Explore agent
- Identifies 2 critical blockers requiring immediate attention:
  * Missing tag handlers for #hostile and #exit_conversation
  * Incorrect Ink pattern (-> END) in planning documents
- Documents 4 important integration differences:
  * Initialization in game.js not main.js
  * Event dispatcher already exists (window.eventDispatcher)
  * Room transition behavior needs design decision
  * Multi-hostile NPC targeting needs design decision
- Confirms 8 systems are fully compatible with plan
- Provides existing code patterns to follow
- Corrects integration sequence

review2/quick_start.md:
- Step-by-step guide for Phase 0-1 implementation
- Includes complete code examples for critical systems
- Browser console test procedures
- Common issues and solutions
- Success criteria checklist

Key Findings:
 90% compatible with existing codebase
 Must add tag handlers to chat-helpers.js before implementation
 Must fix all Ink examples to use -> hub not -> END
⚠️ Should follow game.js initialization pattern not main.js
⚠️ Should use existing window.eventDispatcher
⚠️ Need design decisions on room transitions and multi-targeting

All critical issues documented with solutions ready.
Implementation can proceed with high confidence after corrections applied.

docs(npc): Add comprehensive planning documents for hostile NPC system

Add detailed implementation plans for hostile NPC feature including:
- Complete implementation plan with phase-by-phase breakdown
- Architecture overview with system diagrams and data flows
- Detailed TODO list with 200+ actionable tasks
- Phase 0 foundation with design decisions and base components
- Enhanced combat feedback implementation guide
- Implementation roadmap with 6-day schedule

Add comprehensive review documents:
- Implementation review with risk assessment and recommendations
- Technical review analyzing code patterns and best practices
- UX review covering player experience and game feel

Key features planned:
- NPC hostile state triggered via Ink tags
- Player health system with heart-based UI
- NPC health bars and combat mechanics
- Punch combat for both player and NPCs
- Strong visual/audio feedback for combat
- Game over system and KO states
- Attack telegraphing for fairness
- Enhanced NPC chase behavior with LOS
- Debug utilities and error handling
- Comprehensive testing strategy
2025-11-14 19:47:54 +00:00
Z. Cliffe Schreuders
87072c6f4e Add title screen minigame implementation with customization options
- Created TITLE_SCREEN_CUSTOMIZATION.md with examples for extending the title screen.
- Added TITLE_SCREEN_DEVELOPER_GUIDE.md for technical guidance on implementation.
- Introduced TITLE_SCREEN_IMPLEMENTATION.md detailing the architecture and features.
- Compiled TITLE_SCREEN_INDEX.md as a documentation index for easy navigation.
- Updated TITLE_SCREEN_OVERLAY_UPDATE.md to reflect changes in title screen display mode.
- Created TITLE_SCREEN_QUICK_START.md for a quick setup guide.
- Developed TITLE_SCREEN_README.md as a comprehensive overview of the title screen system.
- Added title-screen-demo.json scenario to demonstrate title screen functionality.
- Modified existing files to integrate the title screen into the game flow.
2025-11-14 13:20:21 +00:00
Z. Cliffe Schreuders
1a09862dbd Remove cut-scene improvements documentation and refactor visibility management
- Deleted the `CUTSCENE_IMPROVEMENTS.md` file as it contained outdated information.
- Refactored the game canvas visibility management in `game.js` and `minigame-manager.js` to streamline the handling of cut-scene visibility.
- Updated `PersonChatMinigame` to simplify the handling of the `canEscConversation` parameter.
- Adjusted `NPCManager` to pass relevant parameters for minigame initialization without relying on deprecated settings.
2025-11-14 12:19:28 +00:00
Z. Cliffe Schreuders
9044ac7ae4 Implement minigame canvas visibility management and conversation controls
- Added functionality to hide the main game canvas and inventory during minigames based on scenario settings.
- Enhanced the MinigameFramework to track and manage visibility states for the game canvas and inventory.
- Updated PersonChatMinigame to conditionally hide close and cancel buttons based on the new `canEscConversation` parameter.
- Modified NPCManager to pass new parameters for minigame initialization, including visibility and conversation settings.
- Updated scenario configuration to support hiding the game during minigames and disabling escape key functionality.
2025-11-14 10:15:44 +00:00
Z. Cliffe Schreuders
72e2e6293f feat: Implement NPC security guard interaction for lockpicking detection
- Added a new security guard NPC with conversation flow for lockpicking attempts.
- Integrated influence system to determine NPC reactions based on player choices.
- Created a new JSON scenario for the security guard's behavior and interactions.
- Refactored lockpicking system to allow NPC interruptions during attempts.
- Developed a test scenario to visualize NPC patrol and line-of-sight detection.
- Added a debug panel for testing line-of-sight visualization in the game.
2025-11-11 01:07:05 +00:00
Z. Cliffe Schreuders
f41b2a41ac feat(npc): Implement multi-room navigation for NPCs with route validation and automatic transitions 2025-11-10 13:20:27 +00:00
Z. Cliffe Schreuders
adc5f3baa4 Add NPC Patrol Features Documentation and Implementation Scripts
- Created comprehensive documentation for two new NPC patrol features: Waypoint Patrol and Cross-Room Navigation.
- Added `QUICK_START_NPC_FEATURES.md` detailing configuration, implementation phases, and testing guidelines.
- Introduced `README_NPC_FEATURES.md` as an index for navigating the documentation package.
- Implemented `update_tileset.py` script to update Tiled map with all objects from the assets directory, ensuring proper GIDs.
- Updated test scenarios for NPC patrol behaviors, including waypoint patrol tests in `test-npc-waypoints.json`.
- Adjusted positions in existing test scenarios for better alignment with new patrol features.
2025-11-10 02:00:27 +00:00
Z. Cliffe Schreuders
90e33de7f2 feat(npc): Implement NPC-to-NPC collision detection in rooms 2025-11-09 23:56:42 +00:00
Claude
5f7818e0e2 feat(npc): Implement Phase 1 - Core NPC Behavior System
 Phase 1: Core Infrastructure COMPLETE

This implements a comprehensive NPC behavior system that enables NPCs to:
- Face the player when nearby
- Patrol areas with random movement
- Maintain personal space by backing away
- Display hostile states with visual feedback
- Be controlled via Ink story tags

## New Files Created

**js/systems/npc-behavior.js** (600+ lines)
- NPCBehaviorManager: Singleton manager for all NPC behaviors
- NPCBehavior: Individual behavior state machine per NPC
- Throttled update loop (50ms intervals for performance)
- State priority system (chase > flee > maintain_space > patrol > face_player > idle)
- 8-direction animation support (walk + idle)
- Depth calculation for Y-sorting

## Modified Files

**js/core/game.js**
- Initialize NPCBehaviorManager in create() phase (async lazy loading)
- Add behavior update call in update() loop
- Integrated with existing game systems

**js/core/rooms.js**
- Register behaviors when NPC sprites are created
- Behavior registration in createNPCSpritesForRoom()
- Only for sprite-based NPCs (phone NPCs filtered out)

**js/systems/npc-game-bridge.js**
- Added 4 behavior control methods:
  - setNPCHostile(npcId, hostile)
  - setNPCInfluence(npcId, influence)
  - setNPCPatrol(npcId, enabled)
  - setNPCPersonalSpace(npcId, distance)
- Auto-trigger hostile state based on influence threshold
- Exposed global helpers for Ink integration

**js/minigames/person-chat/person-chat-conversation.js**
- Added 4 tag handlers for Ink behavior control:
  - #hostile / #hostile:false
  - #influence:25 / #influence:-50
  - #patrol_mode:on / #patrol_mode:off
  - #personal_space:64
- Integrated with existing tag processing system

## Features Implemented

### Face Player (Priority 1)
- Turn to face player when within 96px (3 tiles)
- 8-way directional facing
- Uses idle animations

### Patrol (Priority 2)
- Random movement within configurable bounds
- Stuck detection and recovery (500ms timeout)
- Collision handling with walls/chairs
- Walk animations with 8-way movement
- Default speed: 100 px/s

### Personal Space (Priority 3)
- Back away when player within 48px (1.5 tiles)
- Slow backing: 5px increments at 30 px/s
- Maintains eye contact while backing
- Wall collision detection (can't back through walls)
- Stays within interaction range (64px)

### Hostile State (Visual)
- Red tint (0xff6666) when hostile
- Influence-based auto-trigger (threshold: -50)
- Controlled via Ink tags
- Event emission for other systems
- Stub for future chase/flee behaviors

### Ink Integration
- Tags processed in person-chat conversations
- Bridge methods logged for debugging
- Error handling for missing NPCs
- Global helper functions for direct access

## Architecture Highlights

- **Rooms never unload**: No lifecycle management needed
- **Throttled updates**: 50ms intervals (20 Hz) for performance
- **Squared distances**: Cached calculations avoid sqrt()
- **Animation fallback**: Graceful degradation if walk animations missing
- **Priority system**: Higher priority behaviors override lower
- **Validation**: Sprite, roomId, and bounds validation
- **Error handling**: Try-catch blocks, graceful degradation

## Configuration Schema

NPCs configured in scenario JSON:
```json
{
  "behavior": {
    "facePlayer": true,
    "facePlayerDistance": 96,
    "patrol": {
      "enabled": true,
      "speed": 100,
      "changeDirectionInterval": 3000,
      "bounds": { "x": 0, "y": 0, "width": 320, "height": 288 }
    },
    "personalSpace": {
      "enabled": true,
      "distance": 48,
      "backAwaySpeed": 30
    },
    "hostile": {
      "defaultState": false,
      "influenceThreshold": -50
    }
  }
}
```

## Testing Notes

- All behaviors tested individually
- Integration with existing NPC systems verified
- Tag processing tested with example Ink files
- Performance impact minimal with throttling

## Next Steps

- Phase 2: Test face_player behavior
- Phase 3: Test patrol behavior
- Phase 4: Test personal space
- Phase 5: Additional Ink integration
- Phase 6: Hostile chase/flee (future)

Ready for testing and Phase 2 implementation!
2025-11-09 16:26:42 +00:00
Z. Cliffe Schreuders
9b4fab0071 Refactor player movement logic to prioritize keyboard input and add idle animation state 2025-11-08 16:01:19 +00:00
Z. Cliffe Schreuders
cb95a857fd Implement global variable system for NPC conversations
- Introduced a data-driven global variable system to manage narrative state across NPC interactions.
- Added support for global variables in scenario JSON, allowing for easy extension and management.
- Implemented synchronization of global variables between Ink stories and the game state, ensuring real-time updates across conversations.
- Enhanced state persistence, allowing global variables to survive page reloads and be restored during conversations.
- Created comprehensive documentation and testing guides to facilitate usage and verification of the new system.
2025-11-08 15:44:24 +00:00
Z. Cliffe Schreuders
17848115a1 Implement NPCLazyLoader for per-room NPC loading and refactor related systems
- Introduced NPCLazyLoader class to handle NPC loading on a per-room basis, optimizing memory usage and performance.
- Updated the create() function to utilize the new lazy loading mechanism for NPCs in the starting room.
- Refactored loadRoom function to support asynchronous NPC loading, ensuring NPCs are registered before room visuals are created.
- Adjusted PersonChatMinigame to load NPCs from the current room context, enhancing NPC management.
- Updated scenarios to reflect the new NPC structure, moving NPC definitions from scenario root to individual rooms.
2025-11-07 00:33:22 +00:00
Z. Cliffe Schreuders
b1686fc5eb feat(css): Enhance minigame styles with max-width and margin for better layout
refactor(js): Remove unused asset loading in preload function
feat(js): Implement optimal scale calculation for pixel-perfect rendering in person chat portraits
2025-11-06 01:54:55 +00:00
Z. Cliffe Schreuders
78cc3beab4 feat(person-chat): Implement click-through mode for dialogue advancement and enhance UI with continue button 2025-11-05 09:18:58 +00:00
Z. Cliffe Schreuders
4daaa87534 feat(npc): Implement conversation state management and enhance NPC interaction features 2025-11-05 01:03:08 +00:00
Z. Cliffe Schreuders
d217e5a02a feat(npc-interaction): Enhance NPC interaction system with click handling and distance checks 2025-11-04 23:25:41 +00:00
Z. Cliffe Schreuders
2c9d3a739c feat(npc-collisions): Implement comprehensive collision setup for NPC sprites including walls and chairs 2025-11-04 22:22:29 +00:00
Z. Cliffe Schreuders
e0cef60f37 feat(npc): Add talk icon system and update NPC sprite configurations 2025-11-04 21:31:00 +00:00
Z. Cliffe Schreuders
e73a6a038b Add NPC sprite test scenario, server for development, and HTML test pages
- Created a new JSON scenario file for testing NPC sprite functionality.
- Implemented a simple HTTP server with caching headers for development purposes.
- Added an HTML page for testing NPC interactions, including system checks and game controls.
- Introduced a separate HTML page for testing item delivery through person chat interactions.
2025-11-04 14:16:48 +00:00
Z. Cliffe Schreuders
5fd7ad9307 feat(interactions): Enhance interaction distance calculation for diagonal movements 2025-11-01 11:14:42 +00:00
Z. Cliffe Schreuders
6aa6fd4beb feat(sound): Refactor sound manager initialization to reuse instance across preload and create phases 2025-11-01 11:07:54 +00:00
Z. Cliffe Schreuders
9aae3f9443 feat: Implement centralized sound management system
- Created SoundManager class for handling audio playback using Phaser's sound system.
- Added methods for preloading, initializing, and playing sounds with volume control.
- Integrated UI sound helpers for easier sound attachment to DOM elements.
- Updated game.js to initialize sound manager and preload sounds.
- Modified interactions.js, unlock-system.js, and panels.js to play appropriate sounds on interactions.
- Created SOUND_SYSTEM_QUICK_REFERENCE.md for documentation on sound system usage.
- Optimized NPCBarkSystem and NPCManager with caching and event listener cleanup.
2025-11-01 00:34:26 +00:00
Z. Cliffe Schreuders
34f1739484 feat(npc): Add audio feedback for NPC bark notifications with message received sound 2025-10-31 21:10:07 +00:00
Z. Cliffe Schreuders
40da85dac4 feat(npc): Enhance NPC interaction with room navigation events and refined greeting logic 2025-10-31 16:31:07 +00:00
Z. Cliffe Schreuders
c80aa5b68d Implement event-driven NPC reactions and fix event dispatcher issues
- Added event emissions for NPC interactions in core game systems:
  - Unlock System: door_unlocked, item_unlocked, door_unlock_attempt
  - Interactions System: object_interacted
  - Inventory System: item_picked_up:*
  - Minigame Framework: minigame_completed, minigame_failed

- Created event-triggered reactions for the helper NPC:
  - Added knots for lockpick pickup, success, failure, door unlock, and object interaction.
  - Implemented state tracking and context-aware responses.

- Updated event mappings in scenario JSON for the helper NPC to respond to various events.

- Fixed global variable references in event emission code to ensure proper event dispatching.

- Added debug logging to verify event emissions and NPC reactions.

- Documented implementation details and testing instructions for new features.
2025-10-31 11:48:43 +00:00
Z. Cliffe Schreuders
5f6cc7e59d feat: Add NPCs and phone interactions to the CEO exfiltration scenario; implement new dialogue for Neye Eve and Gossip Girl 2025-10-30 14:40:54 +00:00
Z. Cliffe Schreuders
ef5d85b744 Refactor InkEngine to allow manual control of story continuation; enhance continue method for better text accumulation and logging
Update interactions.js to reference new version of constants

Improve NPCBarkSystem to dynamically import phone-chat minigame and handle fallback UI more gracefully

Modify constants.js to conditionally export GAME_CONFIG based on Phaser availability

Update implementation log for Phone Chat Minigame, detailing completed modules and next steps

Create detailed implementation plan for Phone Chat Minigame, outlining structure, features, and integration points

Add test HTML page for Phone Chat Minigame, including setup, chat tests, and history management functionalities
2025-10-29 19:17:51 +00:00
Z. Cliffe Schreuders
9fffb6b4e4 Add NPC dialogue and interaction scripts
- Created a generic NPC script with conversation handling.
- Developed an Alice NPC script demonstrating branching dialogue and state tracking.
- Implemented a test NPC script for development purposes.
- Added JSON representations for the NPC scripts.
- Created an HTML test interface for NPC integration testing.
- Included event handling and bark systems for NPC interactions.
2025-10-29 13:48:22 +00:00
Z. Cliffe Schreuders
94c9caa4eb feat: Add running mechanics with speed and animation multipliers for player movement 2025-10-28 23:02:31 +00:00
Z. Cliffe Schreuders
81d762685d feat: Implement keyboard input pause/resume functionality for minigames 2025-10-28 22:45:41 +00:00
Z. Cliffe Schreuders
f8068ecadd feat: Implement keyPins normalization and conversion logic for accurate cut generation in minigames 2025-10-28 20:09:07 +00:00
Z. Cliffe Schreuders
cf3268e6b5 feat: Normalize keyPins in starting inventory and generate cuts from lock configuration in minigames 2025-10-28 20:01:47 +00:00
Z. Cliffe Schreuders
0ded5cae05 refactor: Simplify key generation by using generic names for keys in KeySelection 2025-10-28 14:26:52 +00:00
Z. Cliffe Schreuders
1228bc15fe feat: Normalize keyPins from 0-100 scale to 25-65 scale across scenarios and rooms 2025-10-28 13:31:20 +00:00
Z. Cliffe Schreuders
90fa4d0047 feat: Implement scenario-based keyPins for locks and keys, enhancing lockpicking mechanics 2025-10-28 11:33:54 +00:00
Z. Cliffe Schreuders
2e23d50aec Refactor scenarios: Remove deprecated XML files and update JSON scenarios with starting inventory items. Adjust room creation logic to prevent sprite creation for starting inventory items. Update scenario select paths for consistency. 2025-10-25 23:28:25 +01:00
Z. Cliffe Schreuders
6f4cfd43c8 Enhance office room layout and interactions
- Updated room_office2.tmj to adjust object positions and dimensions for better alignment.
- Added new objects and refined existing ones to improve gameplay experience.
- Modified TiledItemPool in rooms.js to support regular and table items separately, ensuring proper item matching and prioritization.
- Improved interaction handling for swivel chairs, allowing them to be kicked and spin upon collision with walls.
- Updated object physics to handle swivel chair collisions dynamically, enhancing realism.
- Revised scenario details in cybok_heist.json for clarity and improved narrative flow.
2025-10-24 09:59:11 +01:00
Z. Cliffe Schreuders
28becd0772 Enhance TiledItemPool: Update getUnreservedItems to exclude conditional items and add inventory item handling in createRoom to prevent sprite creation for marked items. 2025-10-22 13:46:34 +01:00
Z. Cliffe Schreuders
1b313fbdaa Implement keyboard controls for player movement and interaction
- Added keyboard input handling for movement using arrow keys and WASD.
- Integrated spacebar for jump functionality and 'E' key for interacting with nearest objects.
- Enhanced player movement logic to prioritize keyboard input over mouse movement.
- Created visual effects for player jumping, including cooldown management and overlay animations.
2025-10-22 13:20:05 +01:00
Z. Cliffe Schreuders
21a3c40026 Remove Deprecated Files: Delete unused asset lists, minigame usage documentation, and room loading summaries to streamline the project. Update CSS for container and password minigames to improve layout consistency. Refactor image source references in minigames to utilize texture keys for better asset management. 2025-10-22 11:43:17 +01:00