mirror of
https://github.com/cliffe/BreakEscape.git
synced 2026-02-20 13:50:46 +00:00
Add integration and unit tests for asset loading and content type determination
- Created `AssetLoadingIntegrationTest` to verify the loading of game assets in the correct order, including JavaScript, CSS, and sound files. - Implemented tests to ensure proper handling of asset paths, security constraints, and response headers. - Added `StaticFilesControllerUnitTest` to test the content type determination logic for various file extensions, ensuring case insensitivity and handling of multiple dots in filenames.
This commit is contained in:
@@ -20,6 +20,9 @@ module BreakEscape
|
||||
engine_root.join('public', 'break_escape', 'assets', params[:path])
|
||||
when %r{^/break_escape/stylesheets/}
|
||||
engine_root.join('public', 'break_escape', 'css', params[:path])
|
||||
when %r{^/break_escape/.*\.html$}
|
||||
# HTML test files like /break_escape/test-assets.html
|
||||
engine_root.join('public', 'break_escape', "#{params[:filename]}.html")
|
||||
else
|
||||
# Fallback for any other pattern
|
||||
engine_root.join('public', 'break_escape', params[:path])
|
||||
@@ -47,6 +50,8 @@ module BreakEscape
|
||||
|
||||
def determine_content_type(file_path)
|
||||
case File.extname(file_path).downcase
|
||||
when '.html'
|
||||
'text/html'
|
||||
when '.css'
|
||||
'text/css'
|
||||
when '.js'
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
BreakEscape::Engine.routes.draw do
|
||||
# Static files - match only static file paths (must come BEFORE resource routes)
|
||||
# Note: These routes are automatically prefixed with /break_escape by the mount in the parent app
|
||||
# Static files - caught by routes and served by lightweight controller
|
||||
# This ensures files are served from the engine's public directory
|
||||
# Constraint { path: /.*/ } ensures we capture the full path including filename with extension
|
||||
get '/css/*path', to: 'static_files#serve', constraints: { path: /.*/ }
|
||||
get '/js/*path', to: 'static_files#serve', constraints: { path: /.*/ }
|
||||
get '/assets/*path', to: 'static_files#serve', constraints: { path: /.*/ }
|
||||
get '/stylesheets/*path', to: 'static_files#serve', constraints: { path: /.*/ }
|
||||
get '/:filename.html', to: 'static_files#serve', constraints: { filename: /test-.*|index/ }
|
||||
|
||||
# Mission selection
|
||||
resources :missions, only: [:index, :show]
|
||||
|
||||
@@ -29,372 +29,372 @@ export function preload() {
|
||||
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');
|
||||
this.load.tilemapTiledJSON('room_reception', 'rooms/room_reception2.json');
|
||||
this.load.tilemapTiledJSON('room_office', 'rooms/room_office2.json');
|
||||
this.load.tilemapTiledJSON('room_ceo', 'rooms/room_ceo2.json');
|
||||
this.load.tilemapTiledJSON('room_closet', 'rooms/room_closet2.json');
|
||||
this.load.tilemapTiledJSON('room_servers', 'rooms/room_servers2.json');
|
||||
|
||||
// Load new variable-sized rooms for grid system
|
||||
this.load.tilemapTiledJSON('small_room_1x1gu', 'assets/rooms/small_room_1x1gu.json');
|
||||
this.load.tilemapTiledJSON('hall_1x2gu', 'assets/rooms/hall_1x2gu.json');
|
||||
this.load.tilemapTiledJSON('small_room_1x1gu', 'rooms/small_room_1x1gu.json');
|
||||
this.load.tilemapTiledJSON('hall_1x2gu', 'rooms/hall_1x2gu.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', {
|
||||
this.load.image('room_reception', 'tiles/rooms/room1.png');
|
||||
this.load.image('room18', 'tiles/rooms/room18.png');
|
||||
this.load.image('room6', 'tiles/rooms/room6.png');
|
||||
this.load.image('room14', 'tiles/rooms/room14.png');
|
||||
this.load.image('room19', 'tiles/rooms/room19.png');
|
||||
this.load.image('door_32', 'tiles/door_32.png');
|
||||
this.load.spritesheet('door_sheet', '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('office-updated', 'tiles/rooms/room1.png');
|
||||
this.load.image('door_sheet_32', 'tiles/door_sheet_32.png');
|
||||
|
||||
// Load side door spritesheet for east/west doors (6 frames: closed, opening, open, etc.)
|
||||
this.load.spritesheet('door_side_sheet_32', 'assets/tiles/door_side_sheet_32.png', {
|
||||
this.load.spritesheet('door_side_sheet_32', 'tiles/door_side_sheet_32.png', {
|
||||
frameWidth: 32,
|
||||
frameHeight: 32
|
||||
});
|
||||
|
||||
// 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');
|
||||
this.load.image('desk-ceo1', 'tables/desk-ceo1.png');
|
||||
this.load.image('desk-ceo2', 'tables/desk-ceo2.png');
|
||||
this.load.image('desk1', 'tables/desk1.png');
|
||||
this.load.image('smalldesk1', 'tables/smalldesk1.png');
|
||||
this.load.image('smalldesk2', 'tables/smalldesk2.png');
|
||||
this.load.image('reception_table1', '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/workstation.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_small.png');
|
||||
this.load.image('lockpick', 'assets/objects/lockpick.png');
|
||||
this.load.image('spoofing_kit', 'assets/objects/office-misc-headphones.png');
|
||||
this.load.image('keyway', 'assets/icons/keyway.png');
|
||||
this.load.image('password', 'assets/icons/password.png');
|
||||
this.load.image('pin', 'assets/icons/pin.png');
|
||||
this.load.image('talk', 'assets/icons/talk.png');
|
||||
this.load.image('pc', 'objects/pc1.png');
|
||||
this.load.image('key', 'objects/key.png');
|
||||
this.load.image('notes', 'objects/notes1.png');
|
||||
this.load.image('phone', 'objects/phone1.png');
|
||||
this.load.image('suitcase', 'objects/suitcase-1.png');
|
||||
this.load.image('smartscreen', 'objects/smartscreen.png');
|
||||
this.load.image('photo', 'objects/picture1.png');
|
||||
this.load.image('safe', 'objects/safe1.png');
|
||||
this.load.image('book', 'objects/book1.png');
|
||||
this.load.image('workstation', 'objects/workstation.png');
|
||||
this.load.image('bluetooth_scanner', 'objects/bluetooth_scanner.png');
|
||||
this.load.image('bluetooth', 'objects/bluetooth.png');
|
||||
this.load.image('tablet', 'objects/tablet.png');
|
||||
this.load.image('fingerprint', 'objects/fingerprint_small.png');
|
||||
this.load.image('lockpick', 'objects/lockpick.png');
|
||||
this.load.image('spoofing_kit', 'objects/office-misc-headphones.png');
|
||||
this.load.image('keyway', 'icons/keyway.png');
|
||||
this.load.image('password', 'icons/password.png');
|
||||
this.load.image('pin', 'icons/pin.png');
|
||||
this.load.image('talk', 'icons/talk.png');
|
||||
|
||||
// Load RFID keycard and cloner assets
|
||||
this.load.image('keycard', 'assets/objects/keycard.png');
|
||||
this.load.image('keycard-ceo', 'assets/objects/keycard-ceo.png');
|
||||
this.load.image('keycard-security', 'assets/objects/keycard-security.png');
|
||||
this.load.image('keycard-maintenance', 'assets/objects/keycard-maintenance.png');
|
||||
this.load.image('rfid_cloner', 'assets/objects/rfid_cloner.png');
|
||||
this.load.image('rfid-icon', 'assets/icons/rfid-icon.png');
|
||||
this.load.image('nfc-waves', 'assets/icons/nfc-waves.png');
|
||||
this.load.image('keycard', 'objects/keycard.png');
|
||||
this.load.image('keycard-ceo', 'objects/keycard-ceo.png');
|
||||
this.load.image('keycard-security', 'objects/keycard-security.png');
|
||||
this.load.image('keycard-maintenance', 'objects/keycard-maintenance.png');
|
||||
this.load.image('rfid_cloner', 'objects/rfid_cloner.png');
|
||||
this.load.image('rfid-icon', 'icons/rfid-icon.png');
|
||||
this.load.image('nfc-waves', 'icons/nfc-waves.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_kit.png');
|
||||
this.load.image('pin-cracker', 'assets/objects/pin-cracker.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');
|
||||
this.load.image('fingerprint_kit', 'objects/fingerprint_kit.png');
|
||||
this.load.image('pin-cracker', 'objects/pin-cracker.png');
|
||||
this.load.image('bin11', 'objects/bin11.png');
|
||||
this.load.image('bin10', 'objects/bin10.png');
|
||||
this.load.image('bin9', 'objects/bin9.png');
|
||||
this.load.image('bin8', 'objects/bin8.png');
|
||||
this.load.image('bin7', 'objects/bin7.png');
|
||||
this.load.image('bin6', 'objects/bin6.png');
|
||||
this.load.image('bin5', 'objects/bin5.png');
|
||||
this.load.image('bin4', 'objects/bin4.png');
|
||||
this.load.image('bin3', 'objects/bin3.png');
|
||||
this.load.image('bin2', 'objects/bin2.png');
|
||||
this.load.image('bin1', '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');
|
||||
this.load.image('suitcase21', 'objects/suitcase21.png');
|
||||
this.load.image('suitcase20', 'objects/suitcase20.png');
|
||||
this.load.image('suitcase19', 'objects/suitcase19.png');
|
||||
this.load.image('suitcase18', 'objects/suitcase18.png');
|
||||
this.load.image('suitcase17', 'objects/suitcase17.png');
|
||||
this.load.image('suitcase16', 'objects/suitcase16.png');
|
||||
this.load.image('suitcase15', 'objects/suitcase15.png');
|
||||
this.load.image('suitcase14', 'objects/suitcase14.png');
|
||||
this.load.image('suitcase13', 'objects/suitcase13.png');
|
||||
this.load.image('suitcase12', 'objects/suitcase12.png');
|
||||
this.load.image('suitcase11', 'objects/suitcase11.png');
|
||||
this.load.image('suitcase10', 'objects/suitcase10.png');
|
||||
this.load.image('suitcase9', 'objects/suitcase9.png');
|
||||
this.load.image('suitcase8', 'objects/suitcase8.png');
|
||||
this.load.image('suitcase7', 'objects/suitcase7.png');
|
||||
this.load.image('suitcase6', 'objects/suitcase6.png');
|
||||
this.load.image('suitcase5', 'objects/suitcase5.png');
|
||||
this.load.image('suitcase4', 'objects/suitcase4.png');
|
||||
this.load.image('suitcase3', 'objects/suitcase3.png');
|
||||
this.load.image('suitcase2', 'objects/suitcase2.png');
|
||||
this.load.image('suitcase-1', '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');
|
||||
this.load.image('plant-flat-pot7', 'objects/plant-flat-pot7.png');
|
||||
this.load.image('plant-flat-pot6', 'objects/plant-flat-pot6.png');
|
||||
this.load.image('plant-flat-pot5', 'objects/plant-flat-pot5.png');
|
||||
this.load.image('plant-flat-pot4', 'objects/plant-flat-pot4.png');
|
||||
this.load.image('plant-flat-pot3', 'objects/plant-flat-pot3.png');
|
||||
this.load.image('plant-flat-pot2', 'objects/plant-flat-pot2.png');
|
||||
this.load.image('plant-flat-pot1', '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');
|
||||
this.load.image('outdoor-lamp4', 'objects/outdoor-lamp4.png');
|
||||
this.load.image('outdoor-lamp3', 'objects/outdoor-lamp3.png');
|
||||
this.load.image('outdoor-lamp2', 'objects/outdoor-lamp2.png');
|
||||
this.load.image('outdoor-lamp1', 'objects/outdoor-lamp1.png');
|
||||
this.load.image('plant-large10', 'objects/plant-large10.png');
|
||||
this.load.image('lamp-stand5', 'objects/lamp-stand5.png');
|
||||
this.load.image('plant-large9', 'objects/plant-large9.png');
|
||||
this.load.image('plant-large8', 'objects/plant-large8.png');
|
||||
this.load.image('plant-large7', 'objects/plant-large7.png');
|
||||
this.load.image('plant-large6', 'objects/plant-large6.png');
|
||||
this.load.image('lamp-stand4', 'objects/lamp-stand4.png');
|
||||
this.load.image('plant-large5', 'objects/plant-large5.png');
|
||||
this.load.image('plant-large4', 'objects/plant-large4.png');
|
||||
this.load.image('plant-large3', 'objects/plant-large3.png');
|
||||
this.load.image('plant-large2', 'objects/plant-large2.png');
|
||||
this.load.image('lamp-stand3', 'objects/lamp-stand3.png');
|
||||
this.load.image('plant-large1', 'objects/plant-large1.png');
|
||||
this.load.image('lamp-stand2', 'objects/lamp-stand2.png');
|
||||
this.load.image('lamp-stand1', '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');
|
||||
this.load.image('picture14', 'objects/picture14.png');
|
||||
this.load.image('picture13', 'objects/picture13.png');
|
||||
this.load.image('picture12', 'objects/picture12.png');
|
||||
this.load.image('picture11', 'objects/picture11.png');
|
||||
this.load.image('picture10', 'objects/picture10.png');
|
||||
this.load.image('picture9', 'objects/picture9.png');
|
||||
this.load.image('picture8', 'objects/picture8.png');
|
||||
this.load.image('picture7', 'objects/picture7.png');
|
||||
this.load.image('picture6', 'objects/picture6.png');
|
||||
this.load.image('picture5', 'objects/picture5.png');
|
||||
this.load.image('picture4', 'objects/picture4.png');
|
||||
this.load.image('picture3', 'objects/picture3.png');
|
||||
this.load.image('picture2', 'objects/picture2.png');
|
||||
this.load.image('picture1', '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-smallplant2', 'objects/office-misc-smallplant2.png');
|
||||
this.load.image('office-misc-smallplant3', 'objects/office-misc-smallplant3.png');
|
||||
this.load.image('office-misc-smallplant4', 'objects/office-misc-smallplant4.png');
|
||||
this.load.image('office-misc-smallplant5', 'objects/office-misc-smallplant5.png');
|
||||
this.load.image('office-misc-box1', 'objects/office-misc-box1.png');
|
||||
this.load.image('office-misc-container', 'objects/office-misc-container.png');
|
||||
this.load.image('office-misc-lamp3', 'objects/office-misc-lamp3.png');
|
||||
this.load.image('office-misc-hdd6', 'objects/office-misc-hdd6.png');
|
||||
this.load.image('office-misc-speakers6', 'objects/office-misc-speakers6.png');
|
||||
this.load.image('office-misc-pencils6', 'objects/office-misc-pencils6.png');
|
||||
this.load.image('office-misc-fan2', 'objects/office-misc-fan2.png');
|
||||
this.load.image('office-misc-cup5', 'objects/office-misc-cup5.png');
|
||||
this.load.image('office-misc-hdd5', 'objects/office-misc-hdd5.png');
|
||||
this.load.image('office-misc-speakers5', 'objects/office-misc-speakers5.png');
|
||||
this.load.image('office-misc-cup4', 'objects/office-misc-cup4.png');
|
||||
this.load.image('office-misc-speakers4', 'objects/office-misc-speakers4.png');
|
||||
this.load.image('office-misc-pencils5', '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');
|
||||
this.load.image('office-misc-clock', 'objects/office-misc-clock.png');
|
||||
this.load.image('office-misc-fan', 'objects/office-misc-fan.png');
|
||||
this.load.image('office-misc-speakers3', 'objects/office-misc-speakers3.png');
|
||||
this.load.image('office-misc-camera', 'objects/office-misc-camera.png');
|
||||
this.load.image('office-misc-headphones', 'objects/office-misc-headphones.png');
|
||||
this.load.image('office-misc-hdd4', 'objects/office-misc-hdd4.png');
|
||||
this.load.image('office-misc-pencils4', 'objects/office-misc-pencils4.png');
|
||||
this.load.image('office-misc-cup3', 'objects/office-misc-cup3.png');
|
||||
this.load.image('office-misc-cup2', 'objects/office-misc-cup2.png');
|
||||
this.load.image('office-misc-speakers2', 'objects/office-misc-speakers2.png');
|
||||
this.load.image('office-misc-stapler', 'objects/office-misc-stapler.png');
|
||||
this.load.image('office-misc-hdd3', 'objects/office-misc-hdd3.png');
|
||||
this.load.image('office-misc-hdd2', 'objects/office-misc-hdd2.png');
|
||||
this.load.image('office-misc-pencils3', 'objects/office-misc-pencils3.png');
|
||||
this.load.image('office-misc-pencils2', 'objects/office-misc-pencils2.png');
|
||||
this.load.image('office-misc-pens', 'objects/office-misc-pens.png');
|
||||
this.load.image('office-misc-lamp2', 'objects/office-misc-lamp2.png');
|
||||
this.load.image('office-misc-hdd', 'objects/office-misc-hdd.png');
|
||||
this.load.image('office-misc-smallplant', 'objects/office-misc-smallplant.png');
|
||||
this.load.image('office-misc-pencils', 'objects/office-misc-pencils.png');
|
||||
this.load.image('office-misc-speakers', 'objects/office-misc-speakers.png');
|
||||
this.load.image('office-misc-cup', 'objects/office-misc-cup.png');
|
||||
this.load.image('office-misc-lamp', 'objects/office-misc-lamp.png');
|
||||
this.load.image('phone5', 'objects/phone5.png');
|
||||
this.load.image('phone4', 'objects/phone4.png');
|
||||
this.load.image('phone3', 'objects/phone3.png');
|
||||
this.load.image('phone2', 'objects/phone2.png');
|
||||
this.load.image('phone1', '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');
|
||||
this.load.image('bag25', 'objects/bag25.png');
|
||||
this.load.image('bag24', 'objects/bag24.png');
|
||||
this.load.image('bag23', 'objects/bag23.png');
|
||||
this.load.image('bag22', 'objects/bag22.png');
|
||||
this.load.image('bag21', 'objects/bag21.png');
|
||||
this.load.image('bag20', 'objects/bag20.png');
|
||||
this.load.image('bag19', 'objects/bag19.png');
|
||||
this.load.image('bag18', 'objects/bag18.png');
|
||||
this.load.image('bag17', 'objects/bag17.png');
|
||||
this.load.image('bag16', 'objects/bag16.png');
|
||||
this.load.image('bag15', 'objects/bag15.png');
|
||||
this.load.image('bag14', 'objects/bag14.png');
|
||||
this.load.image('bag13', 'objects/bag13.png');
|
||||
this.load.image('bag12', 'objects/bag12.png');
|
||||
this.load.image('bag11', 'objects/bag11.png');
|
||||
this.load.image('bag10', 'objects/bag10.png');
|
||||
this.load.image('bag9', 'objects/bag9.png');
|
||||
this.load.image('bag8', 'objects/bag8.png');
|
||||
this.load.image('bag7', 'objects/bag7.png');
|
||||
this.load.image('bag6', 'objects/bag6.png');
|
||||
this.load.image('bag5', 'objects/bag5.png');
|
||||
this.load.image('bag4', 'objects/bag4.png');
|
||||
this.load.image('bag3', 'objects/bag3.png');
|
||||
this.load.image('bag2', 'objects/bag2.png');
|
||||
this.load.image('bag1', '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');
|
||||
this.load.image('briefcase-orange-1', 'objects/briefcase-orange-1.png');
|
||||
this.load.image('briefcase-yellow-1', 'objects/briefcase-yellow-1.png');
|
||||
this.load.image('briefcase13', 'objects/briefcase13.png');
|
||||
this.load.image('briefcase-purple-1', 'objects/briefcase-purple-1.png');
|
||||
this.load.image('briefcase-green-1', 'objects/briefcase-green-1.png');
|
||||
this.load.image('briefcase-blue-1', 'objects/briefcase-blue-1.png');
|
||||
this.load.image('briefcase-red-1', 'objects/briefcase-red-1.png');
|
||||
this.load.image('briefcase12', 'objects/briefcase12.png');
|
||||
this.load.image('briefcase11', 'objects/briefcase11.png');
|
||||
this.load.image('briefcase10', 'objects/briefcase10.png');
|
||||
this.load.image('briefcase9', 'objects/briefcase9.png');
|
||||
this.load.image('briefcase8', 'objects/briefcase8.png');
|
||||
this.load.image('briefcase7', 'objects/briefcase7.png');
|
||||
this.load.image('briefcase6', 'objects/briefcase6.png');
|
||||
this.load.image('briefcase5', 'objects/briefcase5.png');
|
||||
this.load.image('briefcase4', 'objects/briefcase4.png');
|
||||
this.load.image('briefcase3', 'objects/briefcase3.png');
|
||||
this.load.image('briefcase2', 'objects/briefcase2.png');
|
||||
this.load.image('briefcase1', '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');
|
||||
this.load.image('chair-grey-4', 'objects/chair-grey-4.png');
|
||||
this.load.image('chair-grey-3', 'objects/chair-grey-3.png');
|
||||
this.load.image('chair-darkgreen-3', 'objects/chair-darkgreen-3.png');
|
||||
this.load.image('chair-grey-2', 'objects/chair-grey-2.png');
|
||||
this.load.image('chair-darkgray-1', 'objects/chair-darkgray-1.png');
|
||||
this.load.image('chair-darkgreen-2', 'objects/chair-darkgreen-2.png');
|
||||
this.load.image('chair-darkgreen-1', 'objects/chair-darkgreen-1.png');
|
||||
this.load.image('chair-grey-1', 'objects/chair-grey-1.png');
|
||||
this.load.image('chair-red-4', 'objects/chair-red-4.png');
|
||||
this.load.image('chair-red-3', 'objects/chair-red-3.png');
|
||||
this.load.image('chair-green-2', 'objects/chair-green-2.png');
|
||||
this.load.image('chair-green-1', 'objects/chair-green-1.png');
|
||||
this.load.image('chair-red-2', 'objects/chair-red-2.png');
|
||||
this.load.image('chair-red-1', 'objects/chair-red-1.png');
|
||||
this.load.image('chair-white-2', 'objects/chair-white-2.png');
|
||||
this.load.image('chair-white-1', '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');
|
||||
this.load.image('keyboard8', 'objects/keyboard8.png');
|
||||
this.load.image('keyboard7', 'objects/keyboard7.png');
|
||||
this.load.image('keyboard6', 'objects/keyboard6.png');
|
||||
this.load.image('keyboard5', 'objects/keyboard5.png');
|
||||
this.load.image('keyboard4', 'objects/keyboard4.png');
|
||||
this.load.image('keyboard3', 'objects/keyboard3.png');
|
||||
this.load.image('keyboard2', 'objects/keyboard2.png');
|
||||
this.load.image('keyboard1', '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');
|
||||
this.load.image('safe5', 'objects/safe5.png');
|
||||
this.load.image('safe4', 'objects/safe4.png');
|
||||
this.load.image('safe3', 'objects/safe3.png');
|
||||
this.load.image('safe2', 'objects/safe2.png');
|
||||
this.load.image('safe1', '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');
|
||||
this.load.image('notes1', 'objects/notes1.png');
|
||||
this.load.image('notes2', 'objects/notes2.png');
|
||||
this.load.image('notes3', 'objects/notes3.png');
|
||||
this.load.image('notes4', '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('servers', 'objects/servers.png');
|
||||
this.load.image('servers3', 'objects/servers3.png');
|
||||
this.load.image('servers2', 'objects/servers2.png');
|
||||
this.load.image('sofa1', 'objects/sofa1.png');
|
||||
this.load.image('plant-large13', 'objects/plant-large13.png');
|
||||
this.load.image('office-misc-lamp4', 'objects/office-misc-lamp4.png');
|
||||
this.load.image('chair-waiting-right-1', 'objects/chair-waiting-right-1.png');
|
||||
this.load.image('chair-waiting-left-1', 'objects/chair-waiting-left-1.png');
|
||||
this.load.image('plant-large12', 'objects/plant-large12.png');
|
||||
this.load.image('plant-large11', 'objects/plant-large11.png');
|
||||
|
||||
// Load animated plant frames
|
||||
this.load.image('plant-large11-top-ani1', 'assets/objects/plant-large11-top-ani1.png');
|
||||
this.load.image('plant-large11-top-ani2', 'assets/objects/plant-large11-top-ani2.png');
|
||||
this.load.image('plant-large11-top-ani3', 'assets/objects/plant-large11-top-ani3.png');
|
||||
this.load.image('plant-large11-top-ani4', 'assets/objects/plant-large11-top-ani4.png');
|
||||
this.load.image('plant-large11-top-ani1', 'objects/plant-large11-top-ani1.png');
|
||||
this.load.image('plant-large11-top-ani2', 'objects/plant-large11-top-ani2.png');
|
||||
this.load.image('plant-large11-top-ani3', 'objects/plant-large11-top-ani3.png');
|
||||
this.load.image('plant-large11-top-ani4', 'objects/plant-large11-top-ani4.png');
|
||||
|
||||
this.load.image('plant-large12-top-ani1', 'assets/objects/plant-large12-top-ani1.png');
|
||||
this.load.image('plant-large12-top-ani2', 'assets/objects/plant-large12-top-ani2.png');
|
||||
this.load.image('plant-large12-top-ani3', 'assets/objects/plant-large12-top-ani3.png');
|
||||
this.load.image('plant-large12-top-ani4', 'assets/objects/plant-large12-top-ani4.png');
|
||||
this.load.image('plant-large12-top-ani5', 'assets/objects/plant-large12-top-ani5.png');
|
||||
this.load.image('plant-large12-top-ani1', 'objects/plant-large12-top-ani1.png');
|
||||
this.load.image('plant-large12-top-ani2', 'objects/plant-large12-top-ani2.png');
|
||||
this.load.image('plant-large12-top-ani3', 'objects/plant-large12-top-ani3.png');
|
||||
this.load.image('plant-large12-top-ani4', 'objects/plant-large12-top-ani4.png');
|
||||
this.load.image('plant-large12-top-ani5', 'objects/plant-large12-top-ani5.png');
|
||||
|
||||
this.load.image('plant-large13-top-ani1', 'assets/objects/plant-large13-top-ani1.png');
|
||||
this.load.image('plant-large13-top-ani2', 'assets/objects/plant-large13-top-ani2.png');
|
||||
this.load.image('plant-large13-top-ani3', 'assets/objects/plant-large13-top-ani3.png');
|
||||
this.load.image('plant-large13-top-ani4', 'assets/objects/plant-large13-top-ani4.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('plant-large13-top-ani1', 'objects/plant-large13-top-ani1.png');
|
||||
this.load.image('plant-large13-top-ani2', 'objects/plant-large13-top-ani2.png');
|
||||
this.load.image('plant-large13-top-ani3', 'objects/plant-large13-top-ani3.png');
|
||||
this.load.image('plant-large13-top-ani4', 'objects/plant-large13-top-ani4.png');
|
||||
this.load.image('pc1', 'objects/pc1.png');
|
||||
this.load.image('pc3', 'objects/pc3.png');
|
||||
this.load.image('pc4', 'objects/pc4.png');
|
||||
this.load.image('pc5', 'objects/pc5.png');
|
||||
this.load.image('pc6', 'objects/pc6.png');
|
||||
this.load.image('pc7', 'objects/pc7.png');
|
||||
this.load.image('pc8', 'objects/pc8.png');
|
||||
this.load.image('pc9', 'objects/pc9.png');
|
||||
this.load.image('pc10', 'objects/pc10.png');
|
||||
this.load.image('pc11', 'objects/pc11.png');
|
||||
this.load.image('pc12', 'objects/pc12.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');
|
||||
this.load.image('laptop7', 'objects/laptop7.png');
|
||||
this.load.image('laptop6', 'objects/laptop6.png');
|
||||
this.load.image('laptop5', 'objects/laptop5.png');
|
||||
this.load.image('laptop4', 'objects/laptop4.png');
|
||||
this.load.image('laptop3', 'objects/laptop3.png');
|
||||
this.load.image('laptop2', 'objects/laptop2.png');
|
||||
this.load.image('laptop1', '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');
|
||||
this.load.image('chalkboard3', 'objects/chalkboard3.png');
|
||||
this.load.image('chalkboard2', 'objects/chalkboard2.png');
|
||||
this.load.image('chalkboard', 'objects/chalkboard.png');
|
||||
this.load.image('bookcase', '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');
|
||||
this.load.image('spooky-splatter', 'objects/spooky-splatter.png');
|
||||
this.load.image('spooky-candles2', 'objects/spooky-candles2.png');
|
||||
this.load.image('spooky-candles', 'objects/spooky-candles.png');
|
||||
this.load.image('torch-left', 'objects/torch-left.png');
|
||||
this.load.image('torch-right', 'objects/torch-right.png');
|
||||
this.load.image('torch-1', 'objects/torch-1.png');
|
||||
|
||||
// Load character sprite sheet instead of single image
|
||||
this.load.spritesheet('hacker', 'assets/characters/hacker.png', {
|
||||
this.load.spritesheet('hacker', 'characters/hacker.png', {
|
||||
frameWidth: 64,
|
||||
frameHeight: 64
|
||||
});
|
||||
|
||||
// Load character sprite sheet instead of single image
|
||||
this.load.spritesheet('hacker-red', 'assets/characters/hacker-red.png', {
|
||||
this.load.spritesheet('hacker-red', 'characters/hacker-red.png', {
|
||||
frameWidth: 64,
|
||||
frameHeight: 64
|
||||
});
|
||||
@@ -402,37 +402,37 @@ export function preload() {
|
||||
// Animated plant textures are loaded above
|
||||
|
||||
// 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');
|
||||
this.load.image('chair-exec-rotate1', 'objects/chair-exec-rotate1.png');
|
||||
this.load.image('chair-exec-rotate2', 'objects/chair-exec-rotate2.png');
|
||||
this.load.image('chair-exec-rotate3', 'objects/chair-exec-rotate3.png');
|
||||
this.load.image('chair-exec-rotate4', 'objects/chair-exec-rotate4.png');
|
||||
this.load.image('chair-exec-rotate5', 'objects/chair-exec-rotate5.png');
|
||||
this.load.image('chair-exec-rotate6', 'objects/chair-exec-rotate6.png');
|
||||
this.load.image('chair-exec-rotate7', 'objects/chair-exec-rotate7.png');
|
||||
this.load.image('chair-exec-rotate8', '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-1-rotate1', 'objects/chair-white-1-rotate1.png');
|
||||
this.load.image('chair-white-1-rotate2', 'objects/chair-white-1-rotate2.png');
|
||||
this.load.image('chair-white-1-rotate3', 'objects/chair-white-1-rotate3.png');
|
||||
this.load.image('chair-white-1-rotate4', 'objects/chair-white-1-rotate4.png');
|
||||
this.load.image('chair-white-1-rotate5', 'objects/chair-white-1-rotate5.png');
|
||||
this.load.image('chair-white-1-rotate6', 'objects/chair-white-1-rotate6.png');
|
||||
this.load.image('chair-white-1-rotate7', 'objects/chair-white-1-rotate7.png');
|
||||
this.load.image('chair-white-1-rotate8', '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');
|
||||
this.load.image('chair-white-2-rotate1', 'objects/chair-white-2-rotate1.png');
|
||||
this.load.image('chair-white-2-rotate2', 'objects/chair-white-2-rotate2.png');
|
||||
this.load.image('chair-white-2-rotate3', 'objects/chair-white-2-rotate3.png');
|
||||
this.load.image('chair-white-2-rotate4', 'objects/chair-white-2-rotate4.png');
|
||||
this.load.image('chair-white-2-rotate5', 'objects/chair-white-2-rotate5.png');
|
||||
this.load.image('chair-white-2-rotate6', 'objects/chair-white-2-rotate6.png');
|
||||
this.load.image('chair-white-2-rotate7', 'objects/chair-white-2-rotate7.png');
|
||||
this.load.image('chair-white-2-rotate8', 'objects/chair-white-2-rotate8.png');
|
||||
|
||||
// Load audio files
|
||||
// NPC system sounds
|
||||
this.load.audio('message_received', 'assets/sounds/message_received.mp3');
|
||||
this.load.audio('message_received', 'sounds/message_received.mp3');
|
||||
|
||||
// Initialize sound manager and preload all sounds
|
||||
// Store as window property so we can access it later in create()
|
||||
|
||||
@@ -353,14 +353,14 @@ export class LockpickingMinigamePhaser extends MinigameScene {
|
||||
|
||||
preload() {
|
||||
// Load sound effects
|
||||
this.load.audio('lockpick_binding', 'assets/sounds/lockpick_binding.mp3');
|
||||
this.load.audio('lockpick_click', 'assets/sounds/lockpick_click.mp3');
|
||||
this.load.audio('lockpick_overtension', 'assets/sounds/lockpick_overtension.mp3');
|
||||
this.load.audio('lockpick_reset', 'assets/sounds/lockpick_reset.mp3');
|
||||
this.load.audio('lockpick_set', 'assets/sounds/lockpick_set.mp3');
|
||||
this.load.audio('lockpick_success', 'assets/sounds/lockpick_success.mp3');
|
||||
this.load.audio('lockpick_tension', 'assets/sounds/lockpick_tension.mp3');
|
||||
this.load.audio('lockpick_wrong', 'assets/sounds/lockpick_wrong.mp3');
|
||||
this.load.audio('lockpick_binding', 'sounds/lockpick_binding.mp3');
|
||||
this.load.audio('lockpick_click', 'sounds/lockpick_click.mp3');
|
||||
this.load.audio('lockpick_overtension', 'sounds/lockpick_overtension.mp3');
|
||||
this.load.audio('lockpick_reset', 'sounds/lockpick_reset.mp3');
|
||||
this.load.audio('lockpick_set', 'sounds/lockpick_set.mp3');
|
||||
this.load.audio('lockpick_success', 'sounds/lockpick_success.mp3');
|
||||
this.load.audio('lockpick_tension', 'sounds/lockpick_tension.mp3');
|
||||
this.load.audio('lockpick_wrong', 'sounds/lockpick_wrong.mp3');
|
||||
}
|
||||
|
||||
create() {
|
||||
@@ -420,7 +420,10 @@ export class LockpickingMinigamePhaser extends MinigameScene {
|
||||
width: 600,
|
||||
height: 400,
|
||||
backgroundColor: '#1a1a1a',
|
||||
scene: LockpickingScene
|
||||
scene: LockpickingScene,
|
||||
loader: {
|
||||
baseURL: (window.breakEscapeConfig?.assetsPath || '/break_escape/assets') + '/'
|
||||
}
|
||||
};
|
||||
|
||||
// Adjust canvas size for mobile to crop empty space
|
||||
|
||||
@@ -302,7 +302,7 @@ export class PasswordMinigame extends MinigameScene {
|
||||
// Update button image
|
||||
const img = this.togglePasswordBtn.querySelector('img');
|
||||
if (img) {
|
||||
img.src = this.gameData.showPassword ? 'assets/icons/visible.png' : 'assets/icons/hidden.png';
|
||||
img.src = this.gameData.showPassword ? 'icons/visible.png' : 'icons/hidden.png';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -280,7 +280,7 @@ export default class PersonChatUI {
|
||||
id: 'player',
|
||||
displayName: character.displayName || 'Agent 0x00',
|
||||
spriteSheet: character.spriteSheet || 'hacker',
|
||||
spriteTalk: character.spriteTalk || 'assets/characters/hacker-talk.png',
|
||||
spriteTalk: character.spriteTalk || 'characters/hacker-talk.png',
|
||||
spriteConfig: character.spriteConfig || {}
|
||||
};
|
||||
} else {
|
||||
|
||||
@@ -90,7 +90,7 @@ export function startLockpickingMinigame(lockable, scene, difficulty = 'medium',
|
||||
itemObservations = `A door leading out of ${currentRoomName}`;
|
||||
}
|
||||
|
||||
itemImage = 'assets/tiles/door.png'; // Use default door image
|
||||
itemImage = 'tiles/door.png'; // Use default door image
|
||||
} else {
|
||||
// This is a regular item - use scenarioData
|
||||
itemName = lockable?.scenarioData?.name || lockable?.name || 'Locked Item';
|
||||
@@ -393,7 +393,7 @@ export function startKeySelectionMinigame(lockable, type, playerKeys, requiredKe
|
||||
itemObservations = `A door leading out of ${currentRoomName}`;
|
||||
}
|
||||
|
||||
itemImage = 'assets/tiles/door.png'; // Use default door image
|
||||
itemImage = 'tiles/door.png'; // Use default door image
|
||||
} else {
|
||||
// This is a regular item - use scenarioData
|
||||
itemName = lockable?.scenarioData?.name || lockable?.name || 'Locked Item';
|
||||
|
||||
@@ -29,58 +29,58 @@ class SoundManager {
|
||||
*/
|
||||
preloadSounds() {
|
||||
// Lockpicking mini-game sounds
|
||||
this.scene.load.audio('lockpick_binding', 'assets/sounds/lockpick_binding.mp3');
|
||||
this.scene.load.audio('lockpick_click', 'assets/sounds/lockpick_click.mp3');
|
||||
this.scene.load.audio('lockpick_overtension', 'assets/sounds/lockpick_overtension.mp3');
|
||||
this.scene.load.audio('lockpick_reset', 'assets/sounds/lockpick_reset.mp3');
|
||||
this.scene.load.audio('lockpick_set', 'assets/sounds/lockpick_set.mp3');
|
||||
this.scene.load.audio('lockpick_success', 'assets/sounds/lockpick_success.mp3');
|
||||
this.scene.load.audio('lockpick_tension', 'assets/sounds/lockpick_tension.mp3');
|
||||
this.scene.load.audio('lockpick_wrong', 'assets/sounds/lockpick_wrong.mp3');
|
||||
this.scene.load.audio('lockpick_binding', 'sounds/lockpick_binding.mp3');
|
||||
this.scene.load.audio('lockpick_click', 'sounds/lockpick_click.mp3');
|
||||
this.scene.load.audio('lockpick_overtension', 'sounds/lockpick_overtension.mp3');
|
||||
this.scene.load.audio('lockpick_reset', 'sounds/lockpick_reset.mp3');
|
||||
this.scene.load.audio('lockpick_set', 'sounds/lockpick_set.mp3');
|
||||
this.scene.load.audio('lockpick_success', 'sounds/lockpick_success.mp3');
|
||||
this.scene.load.audio('lockpick_tension', 'sounds/lockpick_tension.mp3');
|
||||
this.scene.load.audio('lockpick_wrong', 'sounds/lockpick_wrong.mp3');
|
||||
|
||||
// GASP door sounds
|
||||
this.scene.load.audio('door_knock', 'assets/sounds/GASP_Door Knock.mp3');
|
||||
this.scene.load.audio('door_knock', 'sounds/GASP_Door Knock.mp3');
|
||||
|
||||
// GASP interaction sounds
|
||||
this.scene.load.audio('item_interact_1', 'assets/sounds/GASP_Item Interact_1.mp3');
|
||||
this.scene.load.audio('item_interact_2', 'assets/sounds/GASP_Item Interact_2.mp3');
|
||||
this.scene.load.audio('item_interact_3', 'assets/sounds/GASP_Item Interact_3.mp3');
|
||||
this.scene.load.audio('item_interact_1', 'sounds/GASP_Item Interact_1.mp3');
|
||||
this.scene.load.audio('item_interact_2', 'sounds/GASP_Item Interact_2.mp3');
|
||||
this.scene.load.audio('item_interact_3', 'sounds/GASP_Item Interact_3.mp3');
|
||||
|
||||
// GASP lock interaction sounds
|
||||
this.scene.load.audio('lock_interact_1', 'assets/sounds/GASP_Lock Interact_1.mp3');
|
||||
this.scene.load.audio('lock_interact_2', 'assets/sounds/GASP_Lock Interact_2.mp3');
|
||||
this.scene.load.audio('lock_interact_3', 'assets/sounds/GASP_Lock Interact_3.mp3');
|
||||
this.scene.load.audio('lock_interact_4', 'assets/sounds/GASP_Lock Interact_4.mp3');
|
||||
this.scene.load.audio('lock_and_load', 'assets/sounds/GASP_Lock and Load.mp3');
|
||||
this.scene.load.audio('lock_interact_1', 'sounds/GASP_Lock Interact_1.mp3');
|
||||
this.scene.load.audio('lock_interact_2', 'sounds/GASP_Lock Interact_2.mp3');
|
||||
this.scene.load.audio('lock_interact_3', 'sounds/GASP_Lock Interact_3.mp3');
|
||||
this.scene.load.audio('lock_interact_4', 'sounds/GASP_Lock Interact_4.mp3');
|
||||
this.scene.load.audio('lock_and_load', 'sounds/GASP_Lock and Load.mp3');
|
||||
|
||||
// GASP UI click sounds
|
||||
this.scene.load.audio('ui_click_1', 'assets/sounds/GASP_UI_Clicks_1.mp3');
|
||||
this.scene.load.audio('ui_click_2', 'assets/sounds/GASP_UI_Clicks_2.mp3');
|
||||
this.scene.load.audio('ui_click_3', 'assets/sounds/GASP_UI_Clicks_3.mp3');
|
||||
this.scene.load.audio('ui_click_4', 'assets/sounds/GASP_UI_Clicks_4.mp3');
|
||||
this.scene.load.audio('ui_click_6', 'assets/sounds/GASP_UI_Clicks_6.mp3');
|
||||
this.scene.load.audio('ui_click_1', 'sounds/GASP_UI_Clicks_1.mp3');
|
||||
this.scene.load.audio('ui_click_2', 'sounds/GASP_UI_Clicks_2.mp3');
|
||||
this.scene.load.audio('ui_click_3', 'sounds/GASP_UI_Clicks_3.mp3');
|
||||
this.scene.load.audio('ui_click_4', 'sounds/GASP_UI_Clicks_4.mp3');
|
||||
this.scene.load.audio('ui_click_6', 'sounds/GASP_UI_Clicks_6.mp3');
|
||||
|
||||
// GASP UI alert sounds
|
||||
this.scene.load.audio('ui_alert_1', 'assets/sounds/GASP_UI_Alert_1.mp3');
|
||||
this.scene.load.audio('ui_alert_2', 'assets/sounds/GASP_UI_Alert_2.mp3');
|
||||
this.scene.load.audio('ui_alert_1', 'sounds/GASP_UI_Alert_1.mp3');
|
||||
this.scene.load.audio('ui_alert_2', 'sounds/GASP_UI_Alert_2.mp3');
|
||||
|
||||
// GASP UI confirm sound
|
||||
this.scene.load.audio('ui_confirm', 'assets/sounds/GASP_UI_Confirm.mp3');
|
||||
this.scene.load.audio('ui_confirm', 'sounds/GASP_UI_Confirm.mp3');
|
||||
|
||||
// GASP UI notification sounds
|
||||
this.scene.load.audio('ui_notification_1', 'assets/sounds/GASP_UI_Notification_1.mp3');
|
||||
this.scene.load.audio('ui_notification_2', 'assets/sounds/GASP_UI_Notification_2.mp3');
|
||||
this.scene.load.audio('ui_notification_3', 'assets/sounds/GASP_UI_Notification_3.mp3');
|
||||
this.scene.load.audio('ui_notification_4', 'assets/sounds/GASP_UI_Notification_4.mp3');
|
||||
this.scene.load.audio('ui_notification_5', 'assets/sounds/GASP_UI_Notification_5.mp3');
|
||||
this.scene.load.audio('ui_notification_6', 'assets/sounds/GASP_UI_Notification_6.mp3');
|
||||
this.scene.load.audio('ui_notification_1', 'sounds/GASP_UI_Notification_1.mp3');
|
||||
this.scene.load.audio('ui_notification_2', 'sounds/GASP_UI_Notification_2.mp3');
|
||||
this.scene.load.audio('ui_notification_3', 'sounds/GASP_UI_Notification_3.mp3');
|
||||
this.scene.load.audio('ui_notification_4', 'sounds/GASP_UI_Notification_4.mp3');
|
||||
this.scene.load.audio('ui_notification_5', 'sounds/GASP_UI_Notification_5.mp3');
|
||||
this.scene.load.audio('ui_notification_6', 'sounds/GASP_UI_Notification_6.mp3');
|
||||
|
||||
// GASP UI reject sound
|
||||
this.scene.load.audio('ui_reject', 'assets/sounds/GASP_UI_Reject.mp3');
|
||||
this.scene.load.audio('ui_reject', 'sounds/GASP_UI_Reject.mp3');
|
||||
|
||||
// Game-specific sounds
|
||||
this.scene.load.audio('chair_roll', 'assets/sounds/chair_roll.mp3');
|
||||
this.scene.load.audio('message_received', 'assets/sounds/message_received.mp3');
|
||||
this.scene.load.audio('chair_roll', 'sounds/chair_roll.mp3');
|
||||
this.scene.load.audio('message_received', 'sounds/message_received.mp3');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -49,7 +49,7 @@ export const GAME_CONFIG = typeof Phaser !== 'undefined' ? {
|
||||
parent: 'game-container',
|
||||
pixelArt: true,
|
||||
loader: {
|
||||
baseURL: '/break_escape/'
|
||||
baseURL: (window.breakEscapeConfig?.assetsPath || '/break_escape/assets') + '/'
|
||||
},
|
||||
scale: {
|
||||
mode: Phaser.Scale.ENVELOP, // Fill entire container while maintaining aspect ratio
|
||||
|
||||
106
public/break_escape/test-assets.html
Normal file
106
public/break_escape/test-assets.html
Normal file
@@ -0,0 +1,106 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Break Escape - Asset Loading Test</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: monospace;
|
||||
background: #222;
|
||||
color: #0f0;
|
||||
padding: 20px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.pass {
|
||||
color: #0f0;
|
||||
}
|
||||
.fail {
|
||||
color: #f00;
|
||||
}
|
||||
.section {
|
||||
margin: 20px 0;
|
||||
padding: 10px;
|
||||
border-left: 2px solid #0f0;
|
||||
}
|
||||
.status {
|
||||
display: inline-block;
|
||||
margin-right: 10px;
|
||||
font-weight: bold;
|
||||
min-width: 50px;
|
||||
}
|
||||
code {
|
||||
background: #111;
|
||||
padding: 2px 4px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Break Escape - Asset Loading Test</h1>
|
||||
<div id="output"></div>
|
||||
|
||||
<script>
|
||||
const output = document.getElementById('output');
|
||||
const tests = [];
|
||||
|
||||
function log(message, status = 'info') {
|
||||
const timestamp = new Date().toLocaleTimeString();
|
||||
const className = status === 'pass' ? 'pass' : status === 'fail' ? 'fail' : '';
|
||||
const statusSpan = status !== 'info' ? `<span class="status ${className}">[${status.toUpperCase()}]</span>` : '';
|
||||
output.innerHTML += `<div>${statusSpan} ${timestamp}: ${message}</div>`;
|
||||
}
|
||||
|
||||
function createTest(name, url, expectedType = null) {
|
||||
return new Promise((resolve) => {
|
||||
fetch(url, { method: 'HEAD' })
|
||||
.then(response => {
|
||||
const success = response.status === 200;
|
||||
const contentType = response.headers.get('content-type') || 'unknown';
|
||||
const typeMatch = !expectedType || contentType.includes(expectedType);
|
||||
|
||||
const status = success && typeMatch ? 'pass' : 'fail';
|
||||
const details = `${success ? '200 OK' : response.status} | ${contentType}`;
|
||||
log(`${name}: <code>${url}</code> - ${details}`, status);
|
||||
|
||||
resolve({ name, status, url, contentType });
|
||||
})
|
||||
.catch(error => {
|
||||
log(`${name}: <code>${url}</code> - ERROR: ${error.message}`, 'fail');
|
||||
resolve({ name, status: 'fail', url, error: error.message });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function runTests() {
|
||||
log('Starting asset loading tests...', 'info');
|
||||
log('', 'info');
|
||||
|
||||
// Test CSS files
|
||||
output.innerHTML += '<div class="section"><h2>CSS Files</h2></div>';
|
||||
await createTest('Main CSS', '/break_escape/css/main.css', 'text/css');
|
||||
await createTest('Game CSS', '/break_escape/css/game.css', 'text/css');
|
||||
|
||||
output.innerHTML += '<div class="section"><h2>JavaScript Files</h2></div>';
|
||||
await createTest('Main JS', '/break_escape/js/main.js', 'application/javascript');
|
||||
await createTest('Constants JS', '/break_escape/js/utils/constants.js', 'application/javascript');
|
||||
await createTest('Game Core JS', '/break_escape/js/core/game.js', 'application/javascript');
|
||||
|
||||
output.innerHTML += '<div class="section"><h2>Assets - Sounds</h2></div>';
|
||||
await createTest('Lockpick Binding', '/break_escape/assets/sounds/lockpick_binding.mp3', 'audio/mpeg');
|
||||
await createTest('Lockpick Click', '/break_escape/assets/sounds/lockpick_click.mp3', 'audio/mpeg');
|
||||
await createTest('Lockpick Success', '/break_escape/assets/sounds/lockpick_success.mp3', 'audio/mpeg');
|
||||
|
||||
output.innerHTML += '<div class="section"><h2>Assets - Tiles/Sprites</h2></div>';
|
||||
await createTest('Door Tile', '/break_escape/assets/tiles/door.png', 'image/png');
|
||||
await createTest('Wall Tile', '/break_escape/assets/tiles/wall.png', 'image/png');
|
||||
|
||||
output.innerHTML += '<div class="section"><h2>Assets - Scenarios</h2></div>';
|
||||
await createTest('Biometric Breach Scenario', '/break_escape/assets/scenarios/biometric_breach.json', 'application/json');
|
||||
|
||||
output.innerHTML += '<div class="section"><h2>Test Complete</h2></div>';
|
||||
log('All tests completed!', 'info');
|
||||
}
|
||||
|
||||
// Run tests when page loads
|
||||
window.addEventListener('load', runTests);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
202
test/controllers/break_escape/static_files_controller_test.rb
Normal file
202
test/controllers/break_escape/static_files_controller_test.rb
Normal file
@@ -0,0 +1,202 @@
|
||||
require 'test_helper'
|
||||
|
||||
module BreakEscape
|
||||
class StaticFilesControllerTest < ActionDispatch::IntegrationTest
|
||||
include Engine.routes.url_helpers
|
||||
|
||||
# CSS file serving tests
|
||||
test 'CSS: should serve files with correct MIME type' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert_equal 'text/css', response.content_type
|
||||
end
|
||||
|
||||
test 'CSS: should serve with inline disposition' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert_match /inline/, response.headers['Content-Disposition']
|
||||
end
|
||||
|
||||
test 'CSS: should return 404 for non-existent files' do
|
||||
get '/break_escape/css/non-existent.css'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
# JavaScript file serving tests
|
||||
test 'JS: should serve files with correct MIME type' do
|
||||
get '/break_escape/js/main.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
end
|
||||
|
||||
test 'JS: should serve nested files' do
|
||||
get '/break_escape/js/utils/constants.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
end
|
||||
|
||||
test 'JS: should serve core game module' do
|
||||
get '/break_escape/js/core/game.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
end
|
||||
|
||||
test 'JS: should return 404 for non-existent files' do
|
||||
get '/break_escape/js/non-existent.js'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
# Asset file serving tests
|
||||
test 'Assets: should serve audio with correct MIME type' do
|
||||
get '/break_escape/assets/sounds/lockpick_binding.mp3'
|
||||
assert_response :success
|
||||
assert_equal 'audio/mpeg', response.content_type
|
||||
end
|
||||
|
||||
test 'Assets: should serve PNG tiles with correct MIME type' do
|
||||
get '/break_escape/assets/tiles/door_32.png'
|
||||
assert_response :success
|
||||
assert_equal 'image/png', response.content_type
|
||||
end
|
||||
|
||||
test 'Assets: should serve nested files' do
|
||||
get '/break_escape/assets/tiles/door_32.png'
|
||||
assert_response :success
|
||||
assert_equal 'image/png', response.content_type
|
||||
end
|
||||
|
||||
test 'Assets: should return 404 for non-existent files' do
|
||||
get '/break_escape/assets/sounds/non-existent.mp3'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
# HTML test page serving tests
|
||||
test 'HTML: should serve test files with correct MIME type' do
|
||||
get '/break_escape/test-assets.html'
|
||||
assert_response :success
|
||||
assert_equal 'text/html', response.content_type
|
||||
end
|
||||
|
||||
test 'HTML: should return 404 for non-existent files' do
|
||||
get '/break_escape/non-existent.html'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
# Route parameter capture tests
|
||||
test 'Routes: should capture full filename with extension' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
test 'Routes: should capture complex paths with segments' do
|
||||
get '/break_escape/js/utils/constants.js'
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
test 'Routes: should handle files with multiple dots' do
|
||||
get '/break_escape/assets/tiles/door_sheet_32.png'
|
||||
assert_response :success
|
||||
assert_equal 'image/png', response.content_type
|
||||
end
|
||||
|
||||
# Security tests - directory traversal
|
||||
test 'Security: should prevent directory traversal in CSS' do
|
||||
get '/break_escape/css/../../config/database.yml'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
test 'Security: should prevent directory traversal in JS' do
|
||||
get '/break_escape/js/../../config/secrets.yml'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
test 'Security: should prevent directory traversal in assets' do
|
||||
get '/break_escape/assets/../../config/database.yml'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
# Phaser asset configuration
|
||||
test 'Phaser: main JS imports GAME_CONFIG' do
|
||||
get '/break_escape/js/main.js'
|
||||
assert_response :success
|
||||
assert_includes response.body, 'GAME_CONFIG'
|
||||
end
|
||||
|
||||
test 'Phaser: constants define GAME_CONFIG with baseURL' do
|
||||
get '/break_escape/js/utils/constants.js'
|
||||
assert_response :success
|
||||
content = response.body
|
||||
assert_includes content, 'GAME_CONFIG'
|
||||
assert_includes content, 'baseURL'
|
||||
assert_includes content, '/break_escape/assets'
|
||||
end
|
||||
|
||||
test 'Phaser: game.js has asset references without prefix' do
|
||||
get '/break_escape/js/core/game.js'
|
||||
assert_response :success
|
||||
content = response.body
|
||||
assert_includes content, 'this.load.audio'
|
||||
assert content.include?('sounds/'), "Should reference sounds without assets/ prefix"
|
||||
end
|
||||
|
||||
# File integrity tests
|
||||
test 'Integrity: CSS files are non-empty' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert response.body.length > 0
|
||||
end
|
||||
|
||||
test 'Integrity: JavaScript files are non-empty' do
|
||||
get '/break_escape/js/main.js'
|
||||
assert_response :success
|
||||
assert response.body.length > 0
|
||||
end
|
||||
|
||||
test 'Integrity: audio files are non-empty' do
|
||||
get '/break_escape/assets/sounds/lockpick_binding.mp3'
|
||||
assert_response :success
|
||||
assert response.body.length > 0
|
||||
end
|
||||
|
||||
test 'Integrity: image files are non-empty' do
|
||||
get '/break_escape/assets/tiles/door_32.png'
|
||||
assert_response :success
|
||||
assert response.body.length > 0
|
||||
end
|
||||
|
||||
# Response header tests
|
||||
test 'Headers: should include Cache-Control' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert response.headers['Cache-Control']
|
||||
end
|
||||
|
||||
test 'Headers: should set Content-Disposition to inline' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert_match /inline/, response.headers['Content-Disposition']
|
||||
end
|
||||
|
||||
test 'Headers: should include Content-Length' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert response.headers['Content-Length']
|
||||
end
|
||||
|
||||
# Minigame asset loading tests
|
||||
test 'Minigame: should serve lockpicking script' do
|
||||
get '/break_escape/js/minigames/lockpicking/lockpicking-game-phaser.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
end
|
||||
|
||||
test 'Minigame: should serve lockpicking sounds' do
|
||||
sounds = ['lockpick_binding.mp3', 'lockpick_click.mp3', 'lockpick_success.mp3']
|
||||
sounds.each do |sound|
|
||||
get "/break_escape/assets/sounds/#{sound}"
|
||||
assert_response :success, "Failed to serve #{sound}"
|
||||
assert_equal 'audio/mpeg', response.content_type
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
142
test/integration/asset_loading_integration_test.rb
Normal file
142
test/integration/asset_loading_integration_test.rb
Normal file
@@ -0,0 +1,142 @@
|
||||
require 'test_helper'
|
||||
|
||||
module BreakEscape
|
||||
class AssetLoadingIntegrationTest < ActionDispatch::IntegrationTest
|
||||
include Engine.routes.url_helpers
|
||||
|
||||
test 'should load all required game files in correct order' do
|
||||
get '/break_escape/js/main.js'
|
||||
assert_response :success
|
||||
assert_includes response.body, 'GAME_CONFIG'
|
||||
end
|
||||
|
||||
test 'should load GAME_CONFIG with proper baseURL' do
|
||||
get '/break_escape/js/utils/constants.js'
|
||||
assert_response :success
|
||||
content = response.body
|
||||
assert_match /export const GAME_CONFIG/, content
|
||||
assert_match /baseURL/, content
|
||||
assert_match /\/break_escape\/assets/, content
|
||||
end
|
||||
|
||||
test 'CSS files should be accessible from main game' do
|
||||
get '/break_escape/css/hud.css'
|
||||
assert_response :success
|
||||
assert_equal 'text/css', response.content_type
|
||||
end
|
||||
|
||||
test 'should serve game core with asset references' do
|
||||
get '/break_escape/js/core/game.js'
|
||||
assert_response :success
|
||||
content = response.body
|
||||
assert_includes content, 'preload'
|
||||
assert_includes content, 'this.load'
|
||||
end
|
||||
|
||||
test 'should serve sound manager module' do
|
||||
get '/break_escape/js/systems/sound-manager.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
end
|
||||
|
||||
test 'should serve minigame starters' do
|
||||
get '/break_escape/js/systems/minigame-starters.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
end
|
||||
|
||||
test 'should serve lockpicking minigame' do
|
||||
get '/break_escape/js/minigames/lockpicking/lockpicking-game-phaser.js'
|
||||
assert_response :success
|
||||
assert_equal 'application/javascript', response.content_type
|
||||
content = response.body
|
||||
assert_match /baseURL/, content
|
||||
end
|
||||
|
||||
test 'complete asset loading path for lockpicking' do
|
||||
get '/break_escape/js/minigames/lockpicking/lockpicking-game-phaser.js'
|
||||
assert_response :success
|
||||
|
||||
lockpick_sounds = [
|
||||
'lockpick_binding.mp3',
|
||||
'lockpick_click.mp3',
|
||||
'lockpick_overtension.mp3',
|
||||
'lockpick_reset.mp3',
|
||||
'lockpick_set.mp3',
|
||||
'lockpick_success.mp3',
|
||||
'lockpick_tension.mp3',
|
||||
'lockpick_wrong.mp3'
|
||||
]
|
||||
|
||||
lockpick_sounds.each do |sound|
|
||||
get "/break_escape/assets/sounds/#{sound}"
|
||||
assert_response :success, "Lockpick sound not found: #{sound}"
|
||||
assert_equal 'audio/mpeg', response.content_type
|
||||
end
|
||||
|
||||
get '/break_escape/assets/tiles/door_32.png'
|
||||
assert_response :success
|
||||
assert_equal 'image/png', response.content_type
|
||||
end
|
||||
|
||||
test 'route constraints correctly capture file extensions' do
|
||||
files_to_test = [
|
||||
'/break_escape/css/hud.css',
|
||||
'/break_escape/js/main.js',
|
||||
'/break_escape/assets/tiles/door_32.png',
|
||||
'/break_escape/assets/sounds/lockpick_binding.mp3'
|
||||
]
|
||||
|
||||
files_to_test.each do |file_path|
|
||||
get file_path
|
||||
assert_response :success, "Failed to load file with extension: #{file_path}"
|
||||
end
|
||||
end
|
||||
|
||||
test 'baseURL prevents duplicate asset paths' do
|
||||
get '/break_escape/js/utils/constants.js'
|
||||
assert_response :success
|
||||
content = response.body
|
||||
assert !content.include?('assets/assets'), "Should not have duplicate assets/ prefix"
|
||||
end
|
||||
|
||||
test 'asset paths work without assets prefix in load calls' do
|
||||
get '/break_escape/js/core/game.js'
|
||||
assert_response :success
|
||||
content = response.body
|
||||
assert_match /this\.load\.audio\(['"][\w_]+['"],\s*['"]sounds\//, content
|
||||
end
|
||||
|
||||
test 'security: cannot access files outside break_escape directory' do
|
||||
get '/break_escape/css/../../config/secrets.yml'
|
||||
assert_response :not_found
|
||||
|
||||
get '/break_escape/js/../../config/database.yml'
|
||||
assert_response :not_found
|
||||
|
||||
get '/break_escape/assets/../../config/secrets.yml'
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
test 'all response headers are correct' do
|
||||
[
|
||||
'/break_escape/css/hud.css',
|
||||
'/break_escape/js/main.js',
|
||||
'/break_escape/assets/sounds/lockpick_binding.mp3'
|
||||
].each do |path|
|
||||
get path
|
||||
assert_response :success
|
||||
assert response.headers['Content-Type'], "Missing Content-Type for #{path}"
|
||||
assert_match /inline/, response.headers['Content-Disposition']
|
||||
assert response.headers['Content-Length']
|
||||
end
|
||||
end
|
||||
|
||||
test 'test asset page loads correctly' do
|
||||
get '/break_escape/test-assets.html'
|
||||
assert_response :success
|
||||
assert_equal 'text/html', response.content_type
|
||||
assert_includes response.body, 'Asset Loading Test'
|
||||
end
|
||||
end
|
||||
end
|
||||
106
test/unit/static_files_controller_unit_test.rb
Normal file
106
test/unit/static_files_controller_unit_test.rb
Normal file
@@ -0,0 +1,106 @@
|
||||
require 'test_helper'
|
||||
|
||||
module BreakEscape
|
||||
class StaticFilesControllerUnitTest < ActiveSupport::TestCase
|
||||
# Test the content type determination logic in isolation
|
||||
|
||||
setup do
|
||||
@controller = StaticFilesController.new
|
||||
end
|
||||
|
||||
test 'determines CSS content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.css')
|
||||
assert_equal 'text/css', content_type
|
||||
end
|
||||
|
||||
test 'determines JavaScript content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.js')
|
||||
assert_equal 'application/javascript', content_type
|
||||
end
|
||||
|
||||
test 'determines HTML content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.html')
|
||||
assert_equal 'text/html', content_type
|
||||
end
|
||||
|
||||
test 'determines JSON content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.json')
|
||||
assert_equal 'application/json', content_type
|
||||
end
|
||||
|
||||
test 'determines PNG content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.png')
|
||||
assert_equal 'image/png', content_type
|
||||
end
|
||||
|
||||
test 'determines JPEG content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.jpg')
|
||||
assert_equal 'image/jpeg', content_type
|
||||
end
|
||||
|
||||
test 'determines GIF content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.gif')
|
||||
assert_equal 'image/gif', content_type
|
||||
end
|
||||
|
||||
test 'determines SVG content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.svg')
|
||||
assert_equal 'image/svg+xml', content_type
|
||||
end
|
||||
|
||||
test 'determines MP3 content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.mp3')
|
||||
assert_equal 'audio/mpeg', content_type
|
||||
end
|
||||
|
||||
test 'determines WAV content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.wav')
|
||||
assert_equal 'audio/wav', content_type
|
||||
end
|
||||
|
||||
test 'determines OGG content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.ogg')
|
||||
assert_equal 'audio/ogg', content_type
|
||||
end
|
||||
|
||||
test 'determines WOFF font content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/font.woff')
|
||||
assert_equal 'font/woff', content_type
|
||||
end
|
||||
|
||||
test 'determines WOFF2 font content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/font.woff2')
|
||||
assert_equal 'font/woff2', content_type
|
||||
end
|
||||
|
||||
test 'determines TTF font content type' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/font.ttf')
|
||||
assert_equal 'font/ttf', content_type
|
||||
end
|
||||
|
||||
test 'is case insensitive' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/FILE.CSS')
|
||||
assert_equal 'text/css', content_type
|
||||
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/FILE.JS')
|
||||
assert_equal 'application/javascript', content_type
|
||||
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/FILE.PNG')
|
||||
assert_equal 'image/png', content_type
|
||||
end
|
||||
|
||||
test 'handles multiple dots in filename' do
|
||||
# Files like door_sheet_32.png should work
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/door_sheet_32.png')
|
||||
assert_equal 'image/png', content_type
|
||||
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/lockpick_binding.mp3')
|
||||
assert_equal 'audio/mpeg', content_type
|
||||
end
|
||||
|
||||
test 'returns octet-stream for unknown extensions' do
|
||||
content_type = @controller.send(:determine_content_type, '/path/to/file.unknown')
|
||||
assert_equal 'application/octet-stream', content_type
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user