mirror of
https://github.com/cliffe/BreakEscape.git
synced 2026-02-23 04:08:03 +00:00
Introduce a new Notes Minigame that allows players to view and interact with notes in a notepad-style interface. The minigame supports adding notes to the inventory, displaying observations, and includes navigation features such as previous/next buttons and search functionality. Update relevant files for integration with the existing game systems, including interaction and inventory management. Add test HTML for verifying minigame features and include necessary assets for the notepad background.
566 lines
28 KiB
JavaScript
566 lines
28 KiB
JavaScript
import { initializeRooms, calculateWorldBounds, calculateRoomPositions, createRoom, revealRoom, updatePlayerRoom, rooms } from './rooms.js?v=16';
|
|
import { createPlayer, updatePlayerMovement, movePlayerToPoint, player } from './player.js?v=7';
|
|
import { initializePathfinder } from './pathfinding.js?v=7';
|
|
import { initializeInventory, processInitialInventoryItems } from '../systems/inventory.js?v=8';
|
|
import { checkObjectInteractions, setGameInstance } from '../systems/interactions.js?v=23';
|
|
import { introduceScenario } from '../utils/helpers.js?v=19';
|
|
import '../minigames/index.js?v=2';
|
|
|
|
// Global variables that will be set by main.js
|
|
let gameScenario;
|
|
|
|
// Preload function - loads all game assets
|
|
export function preload() {
|
|
// Show loading text
|
|
document.getElementById('loading').style.display = 'block';
|
|
|
|
// Load tilemap files and regular tilesets first
|
|
this.load.tilemapTiledJSON('room_reception', 'assets/rooms/room_reception2.json');
|
|
this.load.tilemapTiledJSON('room_office', 'assets/rooms/room_office2.json');
|
|
this.load.tilemapTiledJSON('room_ceo', 'assets/rooms/room_ceo2.json');
|
|
this.load.tilemapTiledJSON('room_closet', 'assets/rooms/room_closet2.json');
|
|
this.load.tilemapTiledJSON('room_servers', 'assets/rooms/room_servers2.json');
|
|
|
|
// Load room images (now using smaller 32px scale images)
|
|
this.load.image('room_reception', 'assets/tiles/rooms/room1.png');
|
|
this.load.image('room18', 'assets/tiles/rooms/room18.png');
|
|
this.load.image('room6', 'assets/tiles/rooms/room6.png');
|
|
this.load.image('room14', 'assets/tiles/rooms/room14.png');
|
|
this.load.image('room19', 'assets/tiles/rooms/room19.png');
|
|
this.load.image('door_32', 'assets/tiles/door_32.png');
|
|
this.load.spritesheet('door_sheet', 'assets/tiles/door_sheet_32.png', {
|
|
frameWidth: 32,
|
|
frameHeight: 64
|
|
});
|
|
|
|
// Load tileset images referenced by the new Tiled map
|
|
this.load.image('office-updated', 'assets/tiles/rooms/room1.png');
|
|
this.load.image('door_sheet_32', 'assets/tiles/door_sheet_32.png');
|
|
this.load.image('door_side_sheet_32', 'assets/tiles/door_side_sheet_32.png');
|
|
|
|
// Load table tileset images
|
|
this.load.image('desk-ceo1', 'assets/tables/desk-ceo1.png');
|
|
this.load.image('desk-ceo2', 'assets/tables/desk-ceo2.png');
|
|
this.load.image('desk1', 'assets/tables/desk1.png');
|
|
this.load.image('smalldesk1', 'assets/tables/smalldesk1.png');
|
|
this.load.image('smalldesk2', 'assets/tables/smalldesk2.png');
|
|
this.load.image('reception_table1', 'assets/tables/reception_table1.png');
|
|
|
|
// Load object sprites - keeping existing ones for backward compatibility
|
|
this.load.image('pc', 'assets/objects/pc1.png');
|
|
this.load.image('key', 'assets/objects/key.png');
|
|
this.load.image('notes', 'assets/objects/notes1.png');
|
|
this.load.image('phone', 'assets/objects/phone1.png');
|
|
this.load.image('suitcase', 'assets/objects/suitcase-1.png');
|
|
this.load.image('smartscreen', 'assets/objects/smartscreen.png');
|
|
this.load.image('photo', 'assets/objects/picture1.png');
|
|
this.load.image('safe', 'assets/objects/safe1.png');
|
|
this.load.image('book', 'assets/objects/book1.png');
|
|
this.load.image('workstation', 'assets/objects/laptop1.png');
|
|
this.load.image('bluetooth_scanner', 'assets/objects/bluetooth_scanner.png');
|
|
this.load.image('bluetooth', 'assets/objects/bluetooth.png');
|
|
this.load.image('tablet', 'assets/objects/tablet.png');
|
|
this.load.image('fingerprint', 'assets/objects/fingerprint.png');
|
|
this.load.image('lockpick', 'assets/objects/lockpick.png');
|
|
this.load.image('spoofing_kit', 'assets/objects/office-misc-headphones.png');
|
|
|
|
// Load new object sprites from Tiled map tileset
|
|
// These are the key objects that appear in the new room_reception2.json
|
|
this.load.image('fingerprint_kit', 'assets/objects/fingerprint-brush-red.png');
|
|
this.load.image('bin11', 'assets/objects/bin11.png');
|
|
this.load.image('bin10', 'assets/objects/bin10.png');
|
|
this.load.image('bin9', 'assets/objects/bin9.png');
|
|
this.load.image('bin8', 'assets/objects/bin8.png');
|
|
this.load.image('bin7', 'assets/objects/bin7.png');
|
|
this.load.image('bin6', 'assets/objects/bin6.png');
|
|
this.load.image('bin5', 'assets/objects/bin5.png');
|
|
this.load.image('bin4', 'assets/objects/bin4.png');
|
|
this.load.image('bin3', 'assets/objects/bin3.png');
|
|
this.load.image('bin2', 'assets/objects/bin2.png');
|
|
this.load.image('bin1', 'assets/objects/bin1.png');
|
|
|
|
// Suitcases
|
|
this.load.image('suitcase21', 'assets/objects/suitcase21.png');
|
|
this.load.image('suitcase20', 'assets/objects/suitcase20.png');
|
|
this.load.image('suitcase19', 'assets/objects/suitcase19.png');
|
|
this.load.image('suitcase18', 'assets/objects/suitcase18.png');
|
|
this.load.image('suitcase17', 'assets/objects/suitcase17.png');
|
|
this.load.image('suitcase16', 'assets/objects/suitcase16.png');
|
|
this.load.image('suitcase15', 'assets/objects/suitcase15.png');
|
|
this.load.image('suitcase14', 'assets/objects/suitcase14.png');
|
|
this.load.image('suitcase13', 'assets/objects/suitcase13.png');
|
|
this.load.image('suitcase12', 'assets/objects/suitcase12.png');
|
|
this.load.image('suitcase11', 'assets/objects/suitcase11.png');
|
|
this.load.image('suitcase10', 'assets/objects/suitcase10.png');
|
|
this.load.image('suitcase9', 'assets/objects/suitcase9.png');
|
|
this.load.image('suitcase8', 'assets/objects/suitcase8.png');
|
|
this.load.image('suitcase7', 'assets/objects/suitcase7.png');
|
|
this.load.image('suitcase6', 'assets/objects/suitcase6.png');
|
|
this.load.image('suitcase5', 'assets/objects/suitcase5.png');
|
|
this.load.image('suitcase4', 'assets/objects/suitcase4.png');
|
|
this.load.image('suitcase3', 'assets/objects/suitcase3.png');
|
|
this.load.image('suitcase2', 'assets/objects/suitcase2.png');
|
|
this.load.image('suitcase-1', 'assets/objects/suitcase-1.png');
|
|
|
|
// Plants
|
|
this.load.image('plant-flat-pot7', 'assets/objects/plant-flat-pot7.png');
|
|
this.load.image('plant-flat-pot6', 'assets/objects/plant-flat-pot6.png');
|
|
this.load.image('plant-flat-pot5', 'assets/objects/plant-flat-pot5.png');
|
|
this.load.image('plant-flat-pot4', 'assets/objects/plant-flat-pot4.png');
|
|
this.load.image('plant-flat-pot3', 'assets/objects/plant-flat-pot3.png');
|
|
this.load.image('plant-flat-pot2', 'assets/objects/plant-flat-pot2.png');
|
|
this.load.image('plant-flat-pot1', 'assets/objects/plant-flat-pot1.png');
|
|
|
|
// Office furniture
|
|
this.load.image('outdoor-lamp4', 'assets/objects/outdoor-lamp4.png');
|
|
this.load.image('outdoor-lamp3', 'assets/objects/outdoor-lamp3.png');
|
|
this.load.image('outdoor-lamp2', 'assets/objects/outdoor-lamp2.png');
|
|
this.load.image('outdoor-lamp1', 'assets/objects/outdoor-lamp1.png');
|
|
this.load.image('plant-large10', 'assets/objects/plant-large10.png');
|
|
this.load.image('lamp-stand5', 'assets/objects/lamp-stand5.png');
|
|
this.load.image('plant-large9', 'assets/objects/plant-large9.png');
|
|
this.load.image('plant-large8', 'assets/objects/plant-large8.png');
|
|
this.load.image('plant-large7', 'assets/objects/plant-large7.png');
|
|
this.load.image('plant-large6', 'assets/objects/plant-large6.png');
|
|
this.load.image('lamp-stand4', 'assets/objects/lamp-stand4.png');
|
|
this.load.image('plant-large5', 'assets/objects/plant-large5.png');
|
|
this.load.image('plant-large4', 'assets/objects/plant-large4.png');
|
|
this.load.image('plant-large3', 'assets/objects/plant-large3.png');
|
|
this.load.image('plant-large2', 'assets/objects/plant-large2.png');
|
|
this.load.image('lamp-stand3', 'assets/objects/lamp-stand3.png');
|
|
this.load.image('plant-large1', 'assets/objects/plant-large1.png');
|
|
this.load.image('lamp-stand2', 'assets/objects/lamp-stand2.png');
|
|
this.load.image('lamp-stand1', 'assets/objects/lamp-stand1.png');
|
|
|
|
// Pictures
|
|
this.load.image('picture14', 'assets/objects/picture14.png');
|
|
this.load.image('picture13', 'assets/objects/picture13.png');
|
|
this.load.image('picture12', 'assets/objects/picture12.png');
|
|
this.load.image('picture11', 'assets/objects/picture11.png');
|
|
this.load.image('picture10', 'assets/objects/picture10.png');
|
|
this.load.image('picture9', 'assets/objects/picture9.png');
|
|
this.load.image('picture8', 'assets/objects/picture8.png');
|
|
this.load.image('picture7', 'assets/objects/picture7.png');
|
|
this.load.image('picture6', 'assets/objects/picture6.png');
|
|
this.load.image('picture5', 'assets/objects/picture5.png');
|
|
this.load.image('picture4', 'assets/objects/picture4.png');
|
|
this.load.image('picture3', 'assets/objects/picture3.png');
|
|
this.load.image('picture2', 'assets/objects/picture2.png');
|
|
this.load.image('picture1', 'assets/objects/picture1.png');
|
|
|
|
// Office misc items
|
|
this.load.image('office-misc-smallplant2', 'assets/objects/office-misc-smallplant2.png');
|
|
this.load.image('office-misc-smallplant3', 'assets/objects/office-misc-smallplant3.png');
|
|
this.load.image('office-misc-smallplant4', 'assets/objects/office-misc-smallplant4.png');
|
|
this.load.image('office-misc-smallplant5', 'assets/objects/office-misc-smallplant5.png');
|
|
this.load.image('office-misc-box1', 'assets/objects/office-misc-box1.png');
|
|
this.load.image('office-misc-container', 'assets/objects/office-misc-container.png');
|
|
this.load.image('office-misc-lamp3', 'assets/objects/office-misc-lamp3.png');
|
|
this.load.image('office-misc-hdd6', 'assets/objects/office-misc-hdd6.png');
|
|
this.load.image('office-misc-speakers6', 'assets/objects/office-misc-speakers6.png');
|
|
this.load.image('office-misc-pencils6', 'assets/objects/office-misc-pencils6.png');
|
|
this.load.image('office-misc-fan2', 'assets/objects/office-misc-fan2.png');
|
|
this.load.image('office-misc-cup5', 'assets/objects/office-misc-cup5.png');
|
|
this.load.image('office-misc-hdd5', 'assets/objects/office-misc-hdd5.png');
|
|
this.load.image('office-misc-speakers5', 'assets/objects/office-misc-speakers5.png');
|
|
this.load.image('office-misc-cup4', 'assets/objects/office-misc-cup4.png');
|
|
this.load.image('office-misc-speakers4', 'assets/objects/office-misc-speakers4.png');
|
|
this.load.image('office-misc-pencils5', 'assets/objects/office-misc-pencils5.png');
|
|
|
|
this.load.image('office-misc-clock', 'assets/objects/office-misc-clock.png');
|
|
this.load.image('office-misc-fan', 'assets/objects/office-misc-fan.png');
|
|
this.load.image('office-misc-speakers3', 'assets/objects/office-misc-speakers3.png');
|
|
this.load.image('office-misc-camera', 'assets/objects/office-misc-camera.png');
|
|
this.load.image('office-misc-headphones', 'assets/objects/office-misc-headphones.png');
|
|
this.load.image('office-misc-hdd4', 'assets/objects/office-misc-hdd4.png');
|
|
this.load.image('office-misc-pencils4', 'assets/objects/office-misc-pencils4.png');
|
|
this.load.image('office-misc-cup3', 'assets/objects/office-misc-cup3.png');
|
|
this.load.image('office-misc-cup2', 'assets/objects/office-misc-cup2.png');
|
|
this.load.image('office-misc-speakers2', 'assets/objects/office-misc-speakers2.png');
|
|
this.load.image('office-misc-stapler', 'assets/objects/office-misc-stapler.png');
|
|
this.load.image('office-misc-hdd3', 'assets/objects/office-misc-hdd3.png');
|
|
this.load.image('office-misc-hdd2', 'assets/objects/office-misc-hdd2.png');
|
|
this.load.image('office-misc-pencils3', 'assets/objects/office-misc-pencils3.png');
|
|
this.load.image('office-misc-pencils2', 'assets/objects/office-misc-pencils2.png');
|
|
this.load.image('office-misc-pens', 'assets/objects/office-misc-pens.png');
|
|
this.load.image('office-misc-lamp2', 'assets/objects/office-misc-lamp2.png');
|
|
this.load.image('office-misc-hdd', 'assets/objects/office-misc-hdd.png');
|
|
this.load.image('office-misc-smallplant', 'assets/objects/office-misc-smallplant.png');
|
|
this.load.image('office-misc-pencils', 'assets/objects/office-misc-pencils.png');
|
|
this.load.image('office-misc-speakers', 'assets/objects/office-misc-speakers.png');
|
|
this.load.image('office-misc-cup', 'assets/objects/office-misc-cup.png');
|
|
this.load.image('office-misc-lamp', 'assets/objects/office-misc-lamp.png');
|
|
this.load.image('phone5', 'assets/objects/phone5.png');
|
|
this.load.image('phone4', 'assets/objects/phone4.png');
|
|
this.load.image('phone3', 'assets/objects/phone3.png');
|
|
this.load.image('phone2', 'assets/objects/phone2.png');
|
|
this.load.image('phone1', 'assets/objects/phone1.png');
|
|
|
|
// Bags and briefcases
|
|
this.load.image('bag25', 'assets/objects/bag25.png');
|
|
this.load.image('bag24', 'assets/objects/bag24.png');
|
|
this.load.image('bag23', 'assets/objects/bag23.png');
|
|
this.load.image('bag22', 'assets/objects/bag22.png');
|
|
this.load.image('bag21', 'assets/objects/bag21.png');
|
|
this.load.image('bag20', 'assets/objects/bag20.png');
|
|
this.load.image('bag19', 'assets/objects/bag19.png');
|
|
this.load.image('bag18', 'assets/objects/bag18.png');
|
|
this.load.image('bag17', 'assets/objects/bag17.png');
|
|
this.load.image('bag16', 'assets/objects/bag16.png');
|
|
this.load.image('bag15', 'assets/objects/bag15.png');
|
|
this.load.image('bag14', 'assets/objects/bag14.png');
|
|
this.load.image('bag13', 'assets/objects/bag13.png');
|
|
this.load.image('bag12', 'assets/objects/bag12.png');
|
|
this.load.image('bag11', 'assets/objects/bag11.png');
|
|
this.load.image('bag10', 'assets/objects/bag10.png');
|
|
this.load.image('bag9', 'assets/objects/bag9.png');
|
|
this.load.image('bag8', 'assets/objects/bag8.png');
|
|
this.load.image('bag7', 'assets/objects/bag7.png');
|
|
this.load.image('bag6', 'assets/objects/bag6.png');
|
|
this.load.image('bag5', 'assets/objects/bag5.png');
|
|
this.load.image('bag4', 'assets/objects/bag4.png');
|
|
this.load.image('bag3', 'assets/objects/bag3.png');
|
|
this.load.image('bag2', 'assets/objects/bag2.png');
|
|
this.load.image('bag1', 'assets/objects/bag1.png');
|
|
|
|
// Briefcases
|
|
this.load.image('briefcase-orange-1', 'assets/objects/briefcase-orange-1.png');
|
|
this.load.image('briefcase-yellow-1', 'assets/objects/briefcase-yellow-1.png');
|
|
this.load.image('briefcase13', 'assets/objects/briefcase13.png');
|
|
this.load.image('briefcase-purple-1', 'assets/objects/briefcase-purple-1.png');
|
|
this.load.image('briefcase-green-1', 'assets/objects/briefcase-green-1.png');
|
|
this.load.image('briefcase-blue-1', 'assets/objects/briefcase-blue-1.png');
|
|
this.load.image('briefcase-red-1', 'assets/objects/briefcase-red-1.png');
|
|
this.load.image('briefcase12', 'assets/objects/briefcase12.png');
|
|
this.load.image('briefcase11', 'assets/objects/briefcase11.png');
|
|
this.load.image('briefcase10', 'assets/objects/briefcase10.png');
|
|
this.load.image('briefcase9', 'assets/objects/briefcase9.png');
|
|
this.load.image('briefcase8', 'assets/objects/briefcase8.png');
|
|
this.load.image('briefcase7', 'assets/objects/briefcase7.png');
|
|
this.load.image('briefcase6', 'assets/objects/briefcase6.png');
|
|
this.load.image('briefcase5', 'assets/objects/briefcase5.png');
|
|
this.load.image('briefcase4', 'assets/objects/briefcase4.png');
|
|
this.load.image('briefcase3', 'assets/objects/briefcase3.png');
|
|
this.load.image('briefcase2', 'assets/objects/briefcase2.png');
|
|
this.load.image('briefcase1', 'assets/objects/briefcase1.png');
|
|
|
|
// Chairs
|
|
this.load.image('chair-grey-4', 'assets/objects/chair-grey-4.png');
|
|
this.load.image('chair-grey-3', 'assets/objects/chair-grey-3.png');
|
|
this.load.image('chair-darkgreen-3', 'assets/objects/chair-darkgreen-3.png');
|
|
this.load.image('chair-grey-2', 'assets/objects/chair-grey-2.png');
|
|
this.load.image('chair-darkgray-1', 'assets/objects/chair-darkgray-1.png');
|
|
this.load.image('chair-darkgreen-2', 'assets/objects/chair-darkgreen-2.png');
|
|
this.load.image('chair-darkgreen-1', 'assets/objects/chair-darkgreen-1.png');
|
|
this.load.image('chair-grey-1', 'assets/objects/chair-grey-1.png');
|
|
this.load.image('chair-red-4', 'assets/objects/chair-red-4.png');
|
|
this.load.image('chair-red-3', 'assets/objects/chair-red-3.png');
|
|
this.load.image('chair-green-2', 'assets/objects/chair-green-2.png');
|
|
this.load.image('chair-green-1', 'assets/objects/chair-green-1.png');
|
|
this.load.image('chair-red-2', 'assets/objects/chair-red-2.png');
|
|
this.load.image('chair-red-1', 'assets/objects/chair-red-1.png');
|
|
this.load.image('chair-white-2', 'assets/objects/chair-white-2.png');
|
|
this.load.image('chair-white-1', 'assets/objects/chair-white-1.png');
|
|
|
|
// Keyboards
|
|
this.load.image('keyboard8', 'assets/objects/keyboard8.png');
|
|
this.load.image('keyboard7', 'assets/objects/keyboard7.png');
|
|
this.load.image('keyboard6', 'assets/objects/keyboard6.png');
|
|
this.load.image('keyboard5', 'assets/objects/keyboard5.png');
|
|
this.load.image('keyboard4', 'assets/objects/keyboard4.png');
|
|
this.load.image('keyboard3', 'assets/objects/keyboard3.png');
|
|
this.load.image('keyboard2', 'assets/objects/keyboard2.png');
|
|
this.load.image('keyboard1', 'assets/objects/keyboard1.png');
|
|
|
|
// Safes
|
|
this.load.image('safe5', 'assets/objects/safe5.png');
|
|
this.load.image('safe4', 'assets/objects/safe4.png');
|
|
this.load.image('safe3', 'assets/objects/safe3.png');
|
|
this.load.image('safe2', 'assets/objects/safe2.png');
|
|
this.load.image('safe1', 'assets/objects/safe1.png');
|
|
|
|
// Notes
|
|
this.load.image('notes1', 'assets/objects/notes1.png');
|
|
this.load.image('notes2', 'assets/objects/notes2.png');
|
|
this.load.image('notes3', 'assets/objects/notes3.png');
|
|
this.load.image('notes4', 'assets/objects/notes4.png');
|
|
|
|
|
|
// Servers and tech
|
|
this.load.image('servers', 'assets/objects/servers.png');
|
|
this.load.image('servers3', 'assets/objects/servers3.png');
|
|
this.load.image('servers2', 'assets/objects/servers2.png');
|
|
this.load.image('sofa1', 'assets/objects/sofa1.png');
|
|
this.load.image('plant-large13', 'assets/objects/plant-large13.png');
|
|
this.load.image('office-misc-lamp4', 'assets/objects/office-misc-lamp4.png');
|
|
this.load.image('chair-waiting-right-1', 'assets/objects/chair-waiting-right-1.png');
|
|
this.load.image('chair-waiting-left-1', 'assets/objects/chair-waiting-left-1.png');
|
|
this.load.image('plant-large12', 'assets/objects/plant-large12.png');
|
|
this.load.image('plant-large11', 'assets/objects/plant-large11.png');
|
|
this.load.image('pc1', 'assets/objects/pc1.png');
|
|
this.load.image('pc3', 'assets/objects/pc3.png');
|
|
this.load.image('pc4', 'assets/objects/pc4.png');
|
|
this.load.image('pc5', 'assets/objects/pc5.png');
|
|
this.load.image('pc6', 'assets/objects/pc6.png');
|
|
this.load.image('pc7', 'assets/objects/pc7.png');
|
|
this.load.image('pc8', 'assets/objects/pc8.png');
|
|
this.load.image('pc9', 'assets/objects/pc9.png');
|
|
this.load.image('pc10', 'assets/objects/pc10.png');
|
|
this.load.image('pc11', 'assets/objects/pc11.png');
|
|
this.load.image('pc12', 'assets/objects/pc12.png');
|
|
this.load.image('pc13', 'assets/objects/pc13.png');
|
|
|
|
|
|
// Laptops
|
|
this.load.image('laptop7', 'assets/objects/laptop7.png');
|
|
this.load.image('laptop6', 'assets/objects/laptop6.png');
|
|
this.load.image('laptop5', 'assets/objects/laptop5.png');
|
|
this.load.image('laptop4', 'assets/objects/laptop4.png');
|
|
this.load.image('laptop3', 'assets/objects/laptop3.png');
|
|
this.load.image('laptop2', 'assets/objects/laptop2.png');
|
|
this.load.image('laptop1', 'assets/objects/laptop1.png');
|
|
|
|
// Chalkboards and bookcases
|
|
this.load.image('chalkboard3', 'assets/objects/chalkboard3.png');
|
|
this.load.image('chalkboard2', 'assets/objects/chalkboard2.png');
|
|
this.load.image('chalkboard', 'assets/objects/chalkboard.png');
|
|
this.load.image('bookcase', 'assets/objects/bookcase.png');
|
|
|
|
// Spooky basement items
|
|
this.load.image('spooky-splatter', 'assets/objects/spooky-splatter.png');
|
|
this.load.image('spooky-candles2', 'assets/objects/spooky-candles2.png');
|
|
this.load.image('spooky-candles', 'assets/objects/spooky-candles.png');
|
|
this.load.image('torch-left', 'assets/objects/torch-left.png');
|
|
this.load.image('torch-right', 'assets/objects/torch-right.png');
|
|
this.load.image('torch-1', 'assets/objects/torch-1.png');
|
|
|
|
// Load character sprite sheet instead of single image
|
|
this.load.spritesheet('hacker', 'assets/characters/hacker.png', {
|
|
frameWidth: 64,
|
|
frameHeight: 64
|
|
});
|
|
|
|
// Load displacement texture for plant sway effect
|
|
// Using an existing asset as displacement map for more interesting movement
|
|
this.load.image('wind_displacement', 'assets/objects/plant-large-displacement.png');
|
|
|
|
// Load swivel chair rotation images
|
|
this.load.image('chair-exec-rotate1', 'assets/objects/chair-exec-rotate1.png');
|
|
this.load.image('chair-exec-rotate2', 'assets/objects/chair-exec-rotate2.png');
|
|
this.load.image('chair-exec-rotate3', 'assets/objects/chair-exec-rotate3.png');
|
|
this.load.image('chair-exec-rotate4', 'assets/objects/chair-exec-rotate4.png');
|
|
this.load.image('chair-exec-rotate5', 'assets/objects/chair-exec-rotate5.png');
|
|
this.load.image('chair-exec-rotate6', 'assets/objects/chair-exec-rotate6.png');
|
|
this.load.image('chair-exec-rotate7', 'assets/objects/chair-exec-rotate7.png');
|
|
this.load.image('chair-exec-rotate8', 'assets/objects/chair-exec-rotate8.png');
|
|
|
|
// Load white chair rotation images
|
|
this.load.image('chair-white-1-rotate1', 'assets/objects/chair-white-1-rotate1.png');
|
|
this.load.image('chair-white-1-rotate2', 'assets/objects/chair-white-1-rotate2.png');
|
|
this.load.image('chair-white-1-rotate3', 'assets/objects/chair-white-1-rotate3.png');
|
|
this.load.image('chair-white-1-rotate4', 'assets/objects/chair-white-1-rotate4.png');
|
|
this.load.image('chair-white-1-rotate5', 'assets/objects/chair-white-1-rotate5.png');
|
|
this.load.image('chair-white-1-rotate6', 'assets/objects/chair-white-1-rotate6.png');
|
|
this.load.image('chair-white-1-rotate7', 'assets/objects/chair-white-1-rotate7.png');
|
|
this.load.image('chair-white-1-rotate8', 'assets/objects/chair-white-1-rotate8.png');
|
|
|
|
this.load.image('chair-white-2-rotate1', 'assets/objects/chair-white-2-rotate1.png');
|
|
this.load.image('chair-white-2-rotate2', 'assets/objects/chair-white-2-rotate2.png');
|
|
this.load.image('chair-white-2-rotate3', 'assets/objects/chair-white-2-rotate3.png');
|
|
this.load.image('chair-white-2-rotate4', 'assets/objects/chair-white-2-rotate4.png');
|
|
this.load.image('chair-white-2-rotate5', 'assets/objects/chair-white-2-rotate5.png');
|
|
this.load.image('chair-white-2-rotate6', 'assets/objects/chair-white-2-rotate6.png');
|
|
this.load.image('chair-white-2-rotate7', 'assets/objects/chair-white-2-rotate7.png');
|
|
this.load.image('chair-white-2-rotate8', 'assets/objects/chair-white-2-rotate8.png');
|
|
|
|
// Get scenario from URL parameter or use default
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
const scenarioFile = urlParams.get('scenario') || 'scenarios/ceo_exfil.json';
|
|
|
|
// Load the specified scenario
|
|
this.load.json('gameScenarioJSON', scenarioFile);
|
|
}
|
|
|
|
|
|
// Create function - sets up the game world and initializes all systems
|
|
export function create() {
|
|
// Hide loading text
|
|
document.getElementById('loading').style.display = 'none';
|
|
|
|
// Set game instance for interactions module early
|
|
setGameInstance(this);
|
|
|
|
// Ensure gameScenario is loaded before proceeding
|
|
if (!window.gameScenario) {
|
|
window.gameScenario = this.cache.json.get('gameScenarioJSON');
|
|
}
|
|
gameScenario = window.gameScenario;
|
|
|
|
// Calculate world bounds after scenario is loaded
|
|
const worldBounds = calculateWorldBounds(this);
|
|
|
|
// Set the physics world bounds
|
|
this.physics.world.setBounds(
|
|
worldBounds.x,
|
|
worldBounds.y,
|
|
worldBounds.width,
|
|
worldBounds.height
|
|
);
|
|
|
|
// Create player first like in original
|
|
createPlayer(this);
|
|
|
|
// Store player globally for access from other modules
|
|
window.player = player;
|
|
|
|
// Create door opening animation
|
|
this.anims.create({
|
|
key: 'door_open',
|
|
frames: this.anims.generateFrameNumbers('door_sheet', { start: 0, end: 4 }),
|
|
frameRate: 8,
|
|
repeat: 0
|
|
});
|
|
|
|
// Create door top animation (6th frame)
|
|
this.anims.create({
|
|
key: 'door_top',
|
|
frames: [{ key: 'door_sheet', frame: 5 }],
|
|
frameRate: 1,
|
|
repeat: 0
|
|
});
|
|
|
|
// Initialize rooms system after player exists
|
|
initializeRooms(this);
|
|
|
|
// Create only the starting room initially
|
|
const roomPositions = calculateRoomPositions(this);
|
|
const startingRoomData = gameScenario.rooms[gameScenario.startRoom];
|
|
const startingRoomPosition = roomPositions[gameScenario.startRoom];
|
|
|
|
if (startingRoomData && startingRoomPosition) {
|
|
createRoom(gameScenario.startRoom, startingRoomData, startingRoomPosition);
|
|
revealRoom(gameScenario.startRoom);
|
|
} else {
|
|
console.error('Failed to create starting room');
|
|
}
|
|
|
|
// Position player in the starting room
|
|
const startingRoom = rooms[gameScenario.startRoom];
|
|
if (startingRoom) {
|
|
const roomCenterX = startingRoom.position.x + 160; // Room width / 2 (320/2)
|
|
const roomCenterY = startingRoom.position.y + 144; // Room height / 2 (288/2)
|
|
player.setPosition(roomCenterX, roomCenterY);
|
|
console.log(`Player positioned at (${roomCenterX}, ${roomCenterY}) in starting room ${gameScenario.startRoom}`);
|
|
}
|
|
|
|
// Set up camera to follow player
|
|
this.cameras.main.startFollow(player);
|
|
|
|
// Door interactions are now handled by the door sprites themselves
|
|
|
|
// Initialize pathfinder
|
|
initializePathfinder(this);
|
|
|
|
// Set up input handling
|
|
this.input.on('pointerdown', (pointer) => {
|
|
// Check if player movement should be prevented (e.g., clicking on interactable items)
|
|
if (window.preventPlayerMovement) {
|
|
return;
|
|
}
|
|
|
|
// Convert screen coordinates to world coordinates
|
|
const worldX = this.cameras.main.scrollX + pointer.x;
|
|
const worldY = this.cameras.main.scrollY + pointer.y;
|
|
|
|
movePlayerToPoint(worldX, worldY);
|
|
});
|
|
|
|
// Initialize inventory
|
|
initializeInventory();
|
|
|
|
// Process initial inventory items
|
|
processInitialInventoryItems();
|
|
|
|
// Show introduction
|
|
introduceScenario();
|
|
|
|
// Initialize physics debug display (visual debug off by default)
|
|
if (window.initializePhysicsDebugDisplay) {
|
|
window.initializePhysicsDebugDisplay();
|
|
}
|
|
|
|
// Store game reference globally
|
|
window.game = this;
|
|
}
|
|
|
|
// Update function - main game loop
|
|
export function update() {
|
|
// Safety check: ensure player exists before running updates
|
|
if (!window.player) {
|
|
return;
|
|
}
|
|
|
|
// Update player movement
|
|
updatePlayerMovement();
|
|
|
|
// Update player room (check for room transitions)
|
|
updatePlayerRoom();
|
|
|
|
// Check for object interactions
|
|
checkObjectInteractions.call(this);
|
|
|
|
// Check for player bump effect when walking over floor items
|
|
if (window.createPlayerBumpEffect) {
|
|
window.createPlayerBumpEffect();
|
|
}
|
|
|
|
// Check for plant sway effect when player walks near plants
|
|
if (window.createPlantSwayEffect) {
|
|
window.createPlantSwayEffect();
|
|
}
|
|
|
|
// Update swivel chair rotation based on movement
|
|
if (window.updateSwivelChairRotation) {
|
|
window.updateSwivelChairRotation();
|
|
}
|
|
|
|
// Check for Bluetooth devices
|
|
const currentTime = Date.now();
|
|
if (currentTime - lastBluetoothScan >= 200) { // 200ms interval for more responsive updates
|
|
if (window.checkBluetoothDevices) {
|
|
window.checkBluetoothDevices();
|
|
}
|
|
lastBluetoothScan = currentTime;
|
|
}
|
|
}
|
|
|
|
// Add timing variables at module level
|
|
let lastBluetoothScan = 0;
|
|
|
|
// Helper functions
|
|
|
|
// Hide a room
|
|
function hideRoom(roomId) {
|
|
if (window.rooms[roomId]) {
|
|
const room = window.rooms[roomId];
|
|
|
|
// Hide all layers
|
|
Object.values(room.layers).forEach(layer => {
|
|
if (layer && layer.setVisible) {
|
|
layer.setVisible(false);
|
|
layer.setAlpha(0);
|
|
}
|
|
});
|
|
|
|
// Hide all objects (both active and inactive)
|
|
if (room.objects) {
|
|
Object.values(room.objects).forEach(obj => {
|
|
if (obj && obj.setVisible) {
|
|
obj.setVisible(false);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
|