mirror of
https://github.com/marcrobledo/savegame-editors.git
synced 2025-10-06 00:12:46 +02:00
[The Lego Movie Videogame] Various additions and changes
* Add icons to challenges, characters and upgrades * Add challenge names * Cleanup formatting * Add savegame.dat hexpat documentation for use in [ImHex](https://github.com/WerWolv/ImHex)
This commit is contained in:
@@ -3,8 +3,8 @@
|
||||
mostly based in:
|
||||
https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/basic/service-worker.js
|
||||
https://github.com/chriscoyier/Simple-Offline-Site/blob/master/js/service-worker.js
|
||||
https://gist.github.com/kosamari/7c5d1e8449b2fbc97d372675f16b566e
|
||||
|
||||
https://gist.github.com/kosamari/7c5d1e8449b2fbc97d372675f16b566e
|
||||
|
||||
Note for GitHub Pages:
|
||||
there can be an unexpected behaviour (cache not updating) when site is accessed from
|
||||
https://user.github.io/repo/ (without index.html) in some browsers (Firefox)
|
||||
@@ -13,70 +13,71 @@
|
||||
navigator.serviceWorker.register('/repo/_cache_service_worker.js', {scope: '/repo/'})
|
||||
*/
|
||||
|
||||
|
||||
/* MOD: fix old caches for mrc */
|
||||
caches.keys().then(function(cacheNames){
|
||||
for(var i=0; i<cacheNames.length; i++){
|
||||
if(
|
||||
cacheNames[i]==='runtime' ||
|
||||
/^precache-\w+$/.test(cacheNames[i]) ||
|
||||
/^precache-editor-([\w\+]+)-\w+$/.test(cacheNames[i]) ||
|
||||
/^v?\d+\w?$/.test(cacheNames[i])
|
||||
){
|
||||
console.log('deleting old cache: '+cacheNames[i]);
|
||||
caches.delete(cacheNames[i]);
|
||||
caches.keys().then( ( cacheNames ) => {
|
||||
for ( let i = 0; i < cacheNames.length; i++ ) {
|
||||
if (
|
||||
cacheNames[ i ] === 'runtime' ||
|
||||
/^precache-\w+$/.test( cacheNames[ i ] ) ||
|
||||
/^precache-editor-([\w\+]+)-\w+$/.test( cacheNames[ i ] ) ||
|
||||
/^v?\d+\w?$/.test( cacheNames[ i ] )
|
||||
) {
|
||||
console.log( 'deleting old cache: ' + cacheNames[ i ] );
|
||||
caches.delete( cacheNames[ i ] );
|
||||
}
|
||||
}
|
||||
});
|
||||
} );
|
||||
|
||||
var PRECACHE_ID='the-lego-movie-videogame-editor';
|
||||
var PRECACHE_VERSION='v1';
|
||||
var PRECACHE_URLS=[
|
||||
'/savegame-editors/the-lego-movie-videogame/','/savegame-editors/the-lego-movie-videogame/index.html',
|
||||
const PRECACHE_ID = 'the-lego-movie-videogame-editor';
|
||||
const PRECACHE_VERSION = 'v1';
|
||||
const PRECACHE_URLS = [
|
||||
'/savegame-editors/the-lego-movie-videogame/',
|
||||
'/savegame-editors/the-lego-movie-videogame/index.html',
|
||||
'/savegame-editors/the-lego-movie-videogame/favicon.png',
|
||||
'/savegame-editors/the-lego-movie-videogame/the-lego-movie-videogame.css',
|
||||
'/savegame-editors/the-lego-movie-videogame/the-lego-movie-videogame.js',
|
||||
'/savegame-editors/the-lego-movie-videogame/challenges.webp',
|
||||
'/savegame-editors/the-lego-movie-videogame/characters.webp',
|
||||
'/savegame-editors/the-lego-movie-videogame/data.js',
|
||||
'/savegame-editors/the-lego-movie-videogame/upgrades.webp',
|
||||
'/savegame-editors/savegame-editor.js',
|
||||
'/savegame-editors/savegame-editor.css'
|
||||
];
|
||||
|
||||
|
||||
|
||||
// install event (fired when sw is first installed): opens a new cache
|
||||
self.addEventListener('install', evt => {
|
||||
self.addEventListener( 'install', ( evt ) => {
|
||||
evt.waitUntil(
|
||||
caches.open('precache-'+PRECACHE_ID+'-'+PRECACHE_VERSION)
|
||||
.then(cache => cache.addAll(PRECACHE_URLS))
|
||||
.then(self.skipWaiting())
|
||||
caches.open( 'precache-' + PRECACHE_ID + '-' + PRECACHE_VERSION )
|
||||
.then( ( cache ) => cache.addAll( PRECACHE_URLS ) )
|
||||
.then( self.skipWaiting() )
|
||||
);
|
||||
});
|
||||
|
||||
} );
|
||||
|
||||
// activate event (fired when sw is has been successfully installed): cleans up old outdated caches
|
||||
self.addEventListener('activate', evt => {
|
||||
self.addEventListener( 'activate', ( evt ) => {
|
||||
evt.waitUntil(
|
||||
caches.keys().then(cacheNames => {
|
||||
return cacheNames.filter(cacheName => (cacheName.startsWith('precache-'+PRECACHE_ID+'-') && !cacheName.endsWith('-'+PRECACHE_VERSION)));
|
||||
}).then(cachesToDelete => {
|
||||
return Promise.all(cachesToDelete.map(cacheToDelete => {
|
||||
console.log('delete '+cacheToDelete);
|
||||
return caches.delete(cacheToDelete);
|
||||
}));
|
||||
}).then(() => self.clients.claim())
|
||||
caches.keys().then(
|
||||
( cacheNames ) => cacheNames.filter( ( cacheName ) => ( cacheName.startsWith( 'precache-' + PRECACHE_ID + '-' ) && !cacheName.endsWith( '-' + PRECACHE_VERSION ) ) )
|
||||
).then(
|
||||
( cachesToDelete ) => Promise.all( cachesToDelete.map( ( cacheToDelete ) => {
|
||||
console.log( 'delete ' + cacheToDelete );
|
||||
return caches.delete( cacheToDelete );
|
||||
} ) )
|
||||
).then( () => self.clients.claim() )
|
||||
);
|
||||
});
|
||||
|
||||
} );
|
||||
|
||||
// fetch event (fired when requesting a resource): returns cached resource when possible
|
||||
self.addEventListener('fetch', evt => {
|
||||
if(evt.request.url.startsWith(self.location.origin)){ //skip cross-origin requests
|
||||
self.addEventListener( 'fetch', ( evt ) => {
|
||||
if ( evt.request.url.startsWith( self.location.origin ) ) { // skip cross-origin requests
|
||||
evt.respondWith(
|
||||
caches.match(evt.request).then(cachedResource => {
|
||||
if (cachedResource) {
|
||||
caches.match( evt.request ).then( ( cachedResource ) => {
|
||||
if ( cachedResource ) {
|
||||
return cachedResource;
|
||||
}else{
|
||||
return fetch(evt.request);
|
||||
} else {
|
||||
return fetch( evt.request );
|
||||
}
|
||||
})
|
||||
} )
|
||||
);
|
||||
}
|
||||
});
|
||||
} );
|
||||
|
BIN
the-lego-movie-videogame/challenges.webp
Normal file
BIN
the-lego-movie-videogame/challenges.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
BIN
the-lego-movie-videogame/characters.webp
Normal file
BIN
the-lego-movie-videogame/characters.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 808 KiB |
@@ -1,4 +1,4 @@
|
||||
window.SavegameEditor.Constants.CHARACTERS=[
|
||||
window.SavegameEditor.Constants.CHARACTERS = [
|
||||
'Abraham Lincoln',
|
||||
'Bad Cop',
|
||||
'Bandit',
|
||||
@@ -62,7 +62,7 @@ window.SavegameEditor.Constants.CHARACTERS=[
|
||||
'Mrs Scratchen-Post',
|
||||
'Mummy',
|
||||
'Native Chief',
|
||||
'Natitve Warrior',
|
||||
'Native Warrior',
|
||||
|
||||
'Outlaw',
|
||||
'Pa Cop',
|
||||
@@ -114,67 +114,654 @@ window.SavegameEditor.Constants.CHARACTERS=[
|
||||
'Wyldstyle (Space)',
|
||||
'Wyldstyle (Old West)'
|
||||
];
|
||||
window.SavegameEditor.Constants.LEVELS=[
|
||||
{value:0, name:'Prologue - The Prophecy'},
|
||||
{value:1, name:'Prologue - Building Site'},
|
||||
{value:2, name:'Prologue - The Piece'},
|
||||
{value:3, name:'Police Station - Melting Chamber'},
|
||||
{value:4, name:'Police Station - Alley Escape'},
|
||||
{value:5, name:'Police Station - Bike Chase'},
|
||||
{value:6, name:'Flatbush Gulch - The Portal'},
|
||||
{value:7, name:'Flatbush Gulch - Hillside Slide'},
|
||||
{value:8, name:'Flatbush Gulch - Desert Path'},
|
||||
{value:9, name:'Flatbush Town - Town Outskirts'},
|
||||
{value:10, name:'Flatbush Town - Town Entrance'},
|
||||
{value:11, name:'Flatbush Town - Saloon Showdown'},
|
||||
{value:12, name:'Flatbush Rooftops - Rooftop Ambush'},
|
||||
{value:13, name:'Flatbush Rooftops - Rooftop Escape'},
|
||||
{value:14, name:'Flatbush Rooftops - Rooftop Brawl'},
|
||||
{value:15, name:'Flatbush Chase - Flatbush Canyon'},
|
||||
{value:16, name:'Flatbush Chase - Train Escape'},
|
||||
{value:17, name:'Flatbush Chase - Train Engine'},
|
||||
{value:18, name:'Cloud Cuckoo Land - Middle Zealand'},
|
||||
{value:19, name:'Cloud Cuckoo Land - Cloud Entrance'},
|
||||
{value:20, name:'Cloud Cuckoo Land - Dance Street'},
|
||||
{value:21, name:'Cloud Under Attack - Cloud Escape'},
|
||||
{value:22, name:'Cloud Under Attack - Cuckoo Castle'},
|
||||
{value:23, name:'Cloud Under Attack - Dropship Chase'},
|
||||
{value:24, name:'Submarine - Submarine Attack'},
|
||||
{value:25, name:'Submarine - Submarine Interior'},
|
||||
{value:26, name:'Submarine - MetalBeard\'s Ship'},
|
||||
{value:27, name:'Business HQ - Octan Airlock'},
|
||||
{value:28, name:'Business HQ - Octan Hangar'},
|
||||
{value:29, name:'Business HQ - The Relic Room'},
|
||||
{value:30, name:'The Kragle - Assembly Room'},
|
||||
{value:31, name:'The Kragle - Kragle Shutdown'},
|
||||
{value:32, name:'The Kragle - Think Tank'},
|
||||
{value:33, name:'TV Station - Office Corridors'},
|
||||
{value:34, name:'TV Station - Server Room'},
|
||||
{value:35, name:'TV Station - TV Broadcast'},
|
||||
{value:36, name:'Spaceship Escape - TV Prop Room'},
|
||||
{value:37, name:'Spaceship Escape - Middle Zealand Canyons'},
|
||||
{value:38, name:'Spaceship Escape - Bricksburg Skies'},
|
||||
{value:39, name:'Attack on Bricksburg - Return to Bricksburg'},
|
||||
{value:40, name:'Attack on Bricksburg - Bricksburg Streets'},
|
||||
{value:41, name:'Attack on Bricksburg - Bricksburg Assault'},
|
||||
{value:42, name:'The Cube Ship - Battle for Bricksburg'},
|
||||
{value:43, name:'The Cube Ship - Cube Ship Approach'},
|
||||
{value:44, name:'The Cube Ship - Business Time'}
|
||||
];
|
||||
window.SavegameEditor.Constants.UPGRADES=[
|
||||
window.SavegameEditor.Constants.UPGRADES = [
|
||||
'Always Charged',
|
||||
'Fast Use',
|
||||
'Collectable Detector',
|
||||
'Fast Builder',
|
||||
'Mini Game Master',
|
||||
'Invicibility',
|
||||
'Health Regeneration',
|
||||
'Stud Magnet',
|
||||
'Confetti Effects',
|
||||
'Bubble Effects',
|
||||
'Collectable Detector',
|
||||
'Confetti Effects',
|
||||
'Extra Heart',
|
||||
'X8 Stud Multiplier',
|
||||
'X6 Stud Multiplier',
|
||||
'Fast Build',
|
||||
'Fast Use',
|
||||
'Health Regeneration',
|
||||
'Invincibility',
|
||||
'Mini Game Master',
|
||||
'Stud Magnet',
|
||||
'X2 Stud Multiplier',
|
||||
'X4 Stud Multiplier',
|
||||
'X2 Stud Multiplier'
|
||||
];
|
||||
'X6 Stud Multiplier',
|
||||
'X8 Stud Multiplier'
|
||||
];
|
||||
window.SavegameEditor.Constants.CHAPTERS = [
|
||||
'Prologue',
|
||||
'Police Station',
|
||||
'Flatbush Gulch',
|
||||
'Flatbush Town',
|
||||
'Flatbush Rooftops',
|
||||
'Flatbush Chase',
|
||||
'Cloud Cuckoo Land',
|
||||
'Cloud Under Attack',
|
||||
'Submarine',
|
||||
'Business HQ',
|
||||
'The Kragle',
|
||||
'TV Station',
|
||||
'Spaceship Escape',
|
||||
'Attack on Bricksburg',
|
||||
'The Cube Ship'
|
||||
];
|
||||
window.SavegameEditor.Constants.MISSIONS = [
|
||||
'The Prophecy',
|
||||
'Building Site',
|
||||
'The Piece',
|
||||
|
||||
'Melting Chamber',
|
||||
'Alley Escape',
|
||||
'Bike Chase',
|
||||
|
||||
'The Portal',
|
||||
'Hillside Slide',
|
||||
'Desert Path',
|
||||
|
||||
'Town Outskirts',
|
||||
'Town Entrance',
|
||||
'Saloon Showdown',
|
||||
|
||||
'Rooftop Ambush',
|
||||
'Rooftop Escape',
|
||||
'Rooftop Brawl',
|
||||
|
||||
'Flatbush Canyon',
|
||||
'Train Escape',
|
||||
'Train Engine',
|
||||
|
||||
'Middle Zealand',
|
||||
'Cloud Entrance',
|
||||
'Dance Street',
|
||||
|
||||
'Cloud Escape',
|
||||
'Cuckoo Castle',
|
||||
'Dropship Chase',
|
||||
|
||||
'Submarine Attack',
|
||||
'Submarine Interior',
|
||||
"MetalBeard's Ship",
|
||||
|
||||
'Octan Airlock',
|
||||
'Octan Hangar',
|
||||
'The Relic Room',
|
||||
|
||||
'Assembly Room',
|
||||
'Kragle Shutdown',
|
||||
'Think Tank',
|
||||
|
||||
'Office Corridors',
|
||||
'Server Room',
|
||||
'TV Broadcast',
|
||||
|
||||
'TV Prop Room',
|
||||
'Middle Zealand Canyons',
|
||||
'Bricksburg Skies',
|
||||
|
||||
'Return to Bricksburg',
|
||||
'Bricksburg Streets',
|
||||
'Bricksburg Assault',
|
||||
|
||||
'Battle for Bricksburg',
|
||||
'Cube Ship Approach',
|
||||
'Business Time'
|
||||
];
|
||||
window.SavegameEditor.Constants.CHALLENGES = [ // name, icon id
|
||||
[ // The Prophecy
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Enemies', 6 ],
|
||||
[ 'Lava Leap', 7 ],
|
||||
[ 'Rescue Guards', 8 ],
|
||||
[ 'Ravens', 9 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Building Site
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Wakey Wakey', 12 ],
|
||||
[ 'Security Cameras', 13 ],
|
||||
[ 'Party Time', 14 ],
|
||||
[ 'Tool Time', 15 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // The Piece
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Route 1', 16 ],
|
||||
[ 'Route 2', 17 ],
|
||||
[ 'Route 3', 18 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Avoidance', 20 ],
|
||||
[ 'Tooled Up', 21 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Melting Chamber
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Robo-Feds', 6 ],
|
||||
[ 'Laser Revenge', 22 ],
|
||||
[ 'Reloaded', 23 ],
|
||||
[ 'Combo Master', 24 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Alley Escape
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Always Watching', 13 ],
|
||||
[ 'Rat Catcher', 25 ],
|
||||
[ 'Great Escape', 26 ],
|
||||
[ 'Green Machine', 27 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Bike Chase
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Mono-Rider', 28 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Chopper Copper', 29 ],
|
||||
[ 'Car Crash', 30 ],
|
||||
[ 'Close Call', 31 ],
|
||||
[ 'Damage Resistant', 32 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // The Portal
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Route 1', 16 ],
|
||||
[ 'Route 2', 17 ],
|
||||
[ 'Route 3', 18 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'The Hard Way', 33 ],
|
||||
[ 'The Easy Way', 34 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Hillside Slide
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Totems Totalled', 35 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Pin Cushion', 36 ],
|
||||
[ 'Gold Fever', 37 ],
|
||||
[ 'Mind The Gap', 38 ],
|
||||
[ 'Tumbleweeds', 39 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Desert Path
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Canyon Crosser', 40 ],
|
||||
[ 'Totem Builder', 41 ],
|
||||
[ 'Tread Carefully', 42 ],
|
||||
[ 'Enemies', 43 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Town Outskirts
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Fowl Play', 44 ],
|
||||
[ 'Protector', 45 ],
|
||||
[ 'Cactus Smasher', 36 ],
|
||||
[ 'Desert Winds', 46 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Town Entrance
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Explosives Expert', 47 ],
|
||||
[ 'Cluck Out', 44 ],
|
||||
[ 'Light The Way', 48 ],
|
||||
[ 'Lift Me Up', 49 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Saloon Showdown
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Clean Sweep', 50 ],
|
||||
[ 'Head Hunter', 51 ],
|
||||
[ 'On The Floor', 52 ],
|
||||
[ 'Spittoon Smasher', 53 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Rooftop Ambush
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Shooting Gallery', 54 ],
|
||||
[ 'Lights Out', 55 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Cactus Smasher', 36 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Rooftop Escape
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Combo Master', 57 ],
|
||||
[ 'Knocked Down', 58 ],
|
||||
[ 'Bridge Building', 59 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Rooftop Brawl
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Combo Master', 57 ],
|
||||
[ 'Cactus Smasher', 36 ],
|
||||
[ 'Master Brawler', 60 ],
|
||||
[ 'No Damage', 61 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Flatbush Canyon
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Enemies', 50 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Explosives Expert', 47 ],
|
||||
[ 'Outhouse Away', 62 ],
|
||||
[ 'Boulder Dodger', 63 ],
|
||||
[ 'Removal Van', 64 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Train Escape
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Cluck Out', 44 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Catapult Creator', 65 ],
|
||||
[ 'Combo Master', 57 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Train Engine
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Rescue Civilians', 66 ],
|
||||
[ 'Bandits Banished', 67 ],
|
||||
[ 'Gold Fever', 68 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Middle Zealand
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Under Siege', 69 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Bowled Over', 70 ],
|
||||
[ 'Banner Bash', 71 ],
|
||||
[ 'Fireproof', 72 ],
|
||||
[ 'No Shopping', 73 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Cloud Entrance
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Beach Trip', 74 ],
|
||||
[ 'Snow Business', 75 ],
|
||||
[ 'Cloud Break', 76 ],
|
||||
[ 'Spinning Around', 77 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Dance Street
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Cloud Crusher', 78 ],
|
||||
[ 'Dance Party', 79 ],
|
||||
[ 'Quick Grow', 80 ],
|
||||
[ 'Bard Is The Word', 81 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Cloud Escape
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'No Damage', 61 ],
|
||||
[ 'Dropships Dropped', 82 ],
|
||||
[ 'Fang-tastic', 83 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Cuckoo Castle
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Fire Fighter', 84 ],
|
||||
[ 'Rescue Master Builders', 85 ],
|
||||
[ 'Dropships Dropped', 82 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Dropship Chase
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Game, Set, Match', 86 ],
|
||||
[ 'Rescue Master Builders', 85 ],
|
||||
[ 'Combo Master', 57 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Submarine Attack
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Full Steam Ahead', 87 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'No Damage', 61 ],
|
||||
[ 'Incoming', 88 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Submarine Interior
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Lifted Out', 89 ],
|
||||
[ 'Warning System', 90 ],
|
||||
[ 'Plumber Needed', 91 ],
|
||||
[ 'Pipe Breaker', 92 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // MetalBeard's Ship
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Rat Release', 93 ],
|
||||
[ 'Wake Up Call', 94 ],
|
||||
[ 'Floor Fixer', 95 ],
|
||||
[ 'Lighter Load', 96 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Octan Airlock
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Stand Back', 97 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Combo Master', 98 ],
|
||||
[ 'Turrets Trashed', 99 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Octan Hangar
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Octan Crusher', 100 ],
|
||||
[ 'Who\'s Next?', 101 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Special Moves', 102 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // The Relic Room
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Busted', 103 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'No Reset', 104 ],
|
||||
[ 'True Ninja', 105 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Assembly Room
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Always Watching', 13 ],
|
||||
[ 'Surround Sound', 106 ],
|
||||
[ 'Robo-Feds', 6 ],
|
||||
[ 'Workplace Accident', 107 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Kragle Shutdown
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Micro Managed', 108 ],
|
||||
[ 'Light Speed', 109 ],
|
||||
[ 'Enemies', 110 ],
|
||||
[ 'Warning System', 111 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Think Tank
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Swift Shock', 112 ],
|
||||
[ 'Friendly Fire', 113 ],
|
||||
[ 'Combo Master', 24 ],
|
||||
[ 'No Damage', 61 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Office Corridors
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'No Time Wasted', 114 ],
|
||||
[ 'Kaboom', 115 ],
|
||||
[ 'Special Moves', 102 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Server Room
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Security Cameras', 13 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Server Escape', 116 ],
|
||||
[ 'Mega Byte', 117 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // TV Broadcast
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Enemies', 110 ],
|
||||
[ 'Combo Master', 98 ],
|
||||
[ 'Cable Out', 118 ],
|
||||
[ 'No Picture', 119 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // TV Prop Room
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'No Picture', 119 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Thank Everyone', 120 ],
|
||||
[ 'Cable Out', 118 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Middle Zealand Canyons
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Tentacle Terror', 121 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Dragon Slayer', 122 ],
|
||||
[ 'Catapult Crusher', 123 ],
|
||||
[ 'Accuracy Award', 124 ],
|
||||
[ 'Castle Invaders', 125 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Bricksburg Skies
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Kragle Crusher', 126 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Imagination Saved', 127 ],
|
||||
[ 'Fire Fighter', 128 ],
|
||||
[ 'Micro Managed', 129 ],
|
||||
[ 'Damage Resistant', 32 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Return to Bricksburg
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Route 1', 16 ],
|
||||
[ 'Route 2', 17 ],
|
||||
[ 'Route 3', 18 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Cloud Dodger', 130 ],
|
||||
[ 'Tentacle Avoidance', 126 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Bricksburg Streets
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Graffiti', 11 ],
|
||||
[ 'Rescue Civilians', 131 ],
|
||||
[ 'Call a Plumber', 132 ],
|
||||
[ 'Enemies', 133 ],
|
||||
[ 'Ring Ring', 134 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Bricksburg Assault
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Kragle Crusher', 126 ],
|
||||
[ 'Micro Managed', 135 ],
|
||||
[ 'Rescue Civilians', 131 ],
|
||||
[ 'Traffic Solution', 136 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
|
||||
[ // Battle for Bricksburg
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Where Are My Pants?', 19 ],
|
||||
[ 'Road Rage', 64 ],
|
||||
[ 'Enemies', 56 ],
|
||||
[ 'Rescue Civilians', 131 ],
|
||||
[ 'Lights On', 137 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Cube Ship Approach
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Route 1', 16 ],
|
||||
[ 'Route 2', 17 ],
|
||||
[ 'Route 3', 18 ],
|
||||
[ 'Red Brick', 5 ],
|
||||
[ 'Micro Managed', 135 ],
|
||||
[ 'Pipe Down', 138 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
],
|
||||
[ // Business Time
|
||||
[ 'Finish Line', 1 ],
|
||||
[ 'Stud Collector', 2 ],
|
||||
[ 'Minikit', 3 ],
|
||||
[ 'Time Attack', 4 ],
|
||||
[ 'Sticky Situation', 139 ],
|
||||
[ 'Combo Master', 24 ],
|
||||
[ 'No Support', 140 ],
|
||||
[ 'Enemies', 110 ],
|
||||
[ 'No Damage', 61 ],
|
||||
[ 'Multi-Challenge', 10 ]
|
||||
]
|
||||
];
|
||||
|
@@ -8,6 +8,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
|
||||
<link rel="shortcut icon" href="favicon.png"/>
|
||||
<link type="text/css" rel="stylesheet" href="../savegame-editor.css" media="all"/>
|
||||
<link type="text/css" rel="stylesheet" href="./the-lego-movie-videogame.css" media="all"/>
|
||||
<script type="text/javascript" src="../savegame-editor.js"></script>
|
||||
<script type="text/javascript" src="./the-lego-movie-videogame.js"></script>
|
||||
<script type="text/javascript" src="./data.js"></script>
|
||||
@@ -30,7 +31,7 @@
|
||||
<div class="row wrapper">
|
||||
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for The Lego Movie Videogame</small></h1>
|
||||
<div class="six columns header-buttons text-right">
|
||||
by <a href="/">Marc Robledo</a>
|
||||
by <a href="/">Magiczocker</a>
|
||||
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/the-lego-movie-videogame" target="_blank">See on GitHub</a>
|
||||
<i class="icon heart"></i> <a href="https://www.paypal.me/marcrobledo/5" target="_blank" rel="nofollow">Donate</a>
|
||||
</div>
|
||||
@@ -94,34 +95,34 @@
|
||||
</div>
|
||||
<h3 class="orange">Challenges</h3>
|
||||
<div class="row">
|
||||
<div class="columns c4"><label for="checkbox-challenge-1-unlocked">Challenge 1</label></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="1"></span><label for="checkbox-challenge-1-unlocked">Challenge 1</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-1-unlocked" type="checkbox" class="fw" data-challenge="0" /></div>
|
||||
<div class="columns c4"><label for="checkbox-challenge-6-unlocked">Challenge 6</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-6-unlocked" type="checkbox" class="fw" data-challenge="5" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="6"></span><label for="checkbox-challenge-6-unlocked">Challenge 6</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-6-unlocked" type="checkbox" class="fw" data-challenge="5" /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="columns c4"><label for="checkbox-challenge-2-unlocked">Challenge 2</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-2-unlocked" type="checkbox" class="fw" data-challenge="1" /></div>
|
||||
<div class="columns c4"><label for="checkbox-challenge-7-unlocked">Challenge 7</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-7-unlocked" type="checkbox" class="fw" data-challenge="6" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="2"></span><label for="checkbox-challenge-2-unlocked">Challenge 2</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-2-unlocked" type="checkbox" class="fw" data-challenge="1" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="7"></span><label for="checkbox-challenge-7-unlocked">Challenge 7</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-7-unlocked" type="checkbox" class="fw" data-challenge="6" /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="columns c4"><label for="checkbox-challenge-3-unlocked">Challenge 3</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-3-unlocked" type="checkbox" class="fw" data-challenge="2" /></div>
|
||||
<div class="columns c4"><label for="checkbox-challenge-8-unlocked">Challenge 8</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-8-unlocked" type="checkbox" class="fw" data-challenge="7" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="3"></span><label for="checkbox-challenge-3-unlocked">Challenge 3</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-3-unlocked" type="checkbox" class="fw" data-challenge="2" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="8"></span><label for="checkbox-challenge-8-unlocked">Challenge 8</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-8-unlocked" type="checkbox" class="fw" data-challenge="7" /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="columns c4"><label for="checkbox-challenge-4-unlocked">Challenge 4</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-4-unlocked" type="checkbox" class="fw" data-challenge="3" /></div>
|
||||
<div class="columns c4"><label for="checkbox-challenge-9-unlocked">Challenge 9</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-9-unlocked" type="checkbox" class="fw" data-challenge="8" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="4"></span><label for="checkbox-challenge-4-unlocked">Challenge 4</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-4-unlocked" type="checkbox" class="fw" data-challenge="3" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="9"></span><label for="checkbox-challenge-9-unlocked">Challenge 9</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-9-unlocked" type="checkbox" class="fw" data-challenge="8" /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="columns c4"><label for="checkbox-challenge-5-unlocked">Challenge 5</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-5-unlocked" type="checkbox" class="fw" data-challenge="4" /></div>
|
||||
<div class="columns c4"><label for="checkbox-challenge-10-unlocked">Challenge 10</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-10-unlocked" type="checkbox" class="fw" data-challenge="9" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="5"></span><label for="checkbox-challenge-5-unlocked">Challenge 5</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-5-unlocked" type="checkbox" class="fw" data-challenge="4" /></div>
|
||||
<div class="columns c4"><span class="challenge-icon" data-id="10"></span><label for="checkbox-challenge-10-unlocked">Challenge 10</label></div>
|
||||
<div class="columns c2 text-right"><input id="checkbox-challenge-10-unlocked" type="checkbox" class="fw" data-challenge="9" /></div>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="orange">Sections</h3>
|
||||
|
200
the-lego-movie-videogame/legomovie.hexpat
Normal file
200
the-lego-movie-videogame/legomovie.hexpat
Normal file
@@ -0,0 +1,200 @@
|
||||
u8 ChallengeCounter = 0;
|
||||
u8 LvlCounter = 0;
|
||||
|
||||
import std.mem;
|
||||
import std.string;
|
||||
|
||||
// https://www.geeksforgeeks.org/javascript/check-if-a-given-bit-is-set-or-not-using-javascript/
|
||||
fn isBitSet(u8 num, u8 offset) {
|
||||
return ((num & 1 << offset)) != 0;
|
||||
};
|
||||
|
||||
struct header_t {
|
||||
u32 crc32 @ 0x00;
|
||||
u8 lastPlayedOffset1 @ 0x06;
|
||||
u8 lastPlayedOffset2 @ 0x454;
|
||||
char signature[16] @ 0x08;
|
||||
u8 musicMicrophoneOffset @ 0x18;
|
||||
u8 languageOffset @ 0x19;
|
||||
u8 profileSelectionOffset @ 0x1A;
|
||||
};
|
||||
|
||||
struct YellowStoneOffset {
|
||||
u24 yellowStoneOffset;
|
||||
padding[5];
|
||||
LvlCounter += 1;
|
||||
}[[
|
||||
comment("Level #" + std::string::to_string(LvlCounter)),
|
||||
name("Level #" + std::string::to_string(LvlCounter))
|
||||
]];
|
||||
|
||||
struct ChallengeOffset {
|
||||
u8 challenges;
|
||||
ChallengeCounter += 1;
|
||||
}[[
|
||||
comment("Challenge #" + std::string::to_string(ChallengeCounter)),
|
||||
name("Challenge #" + std::string::to_string(ChallengeCounter))
|
||||
]];
|
||||
|
||||
|
||||
fn upgrades( u8 a, u8 b ) {
|
||||
return b;
|
||||
};
|
||||
|
||||
struct ChallengeLvls {
|
||||
ChallengeOffset challengeoffset[10];
|
||||
ChallengeCounter = 0;
|
||||
LvlCounter += 1;
|
||||
}[[
|
||||
comment("Level #" + std::string::to_string(LvlCounter)),
|
||||
name("Level #" + std::string::to_string(LvlCounter))
|
||||
]];
|
||||
|
||||
bitfield Upgrades {
|
||||
padding: 1;
|
||||
x2: 1 [[name("X2 Stud Multiplier")]];
|
||||
x4: 1 [[name("X4 Stud Multiplier")]];
|
||||
x6: 1 [[name("X6 Stud Multiplier")]];
|
||||
x8: 1 [[name("X8 Stud Multiplier")]];
|
||||
extraHeart: 1 [[name("Extra Heart")]];
|
||||
bubbleEffects: 1 [[name("Bubble Effects")]];
|
||||
confettiEffects: 1 [[name("Confetti Effects")]];
|
||||
studMagnet: 1 [[name("Stud Magnet")]];
|
||||
healthRegeneration: 1 [[name("Health Regeneration")]];
|
||||
invicibility: 1 [[name("Invincibility")]];
|
||||
miniGameMaster: 1 [[name("Mini Game Master")]];
|
||||
fastBuild: 1 [[name("Fast Build")]];
|
||||
collectableDetector: 1 [[name("Collectable Detector")]];
|
||||
fastUse: 1 [[name("Fast Use")]];
|
||||
alwaysCharged: 1 [[name("Always Charged")]];
|
||||
};
|
||||
|
||||
fn characterStatus( u8 a ) {
|
||||
match(a) {
|
||||
(0x00): return "Locked";
|
||||
(0x01): return "Unlocked";
|
||||
(0x03): return "Unlocked + Bought";
|
||||
}
|
||||
return "Unknown";
|
||||
};
|
||||
|
||||
bitfield Characters {
|
||||
character91: 2 [[name("Abraham Lincoln"), format("characterStatus")]];
|
||||
character90: 2 [[name("Bad Cop"), format("characterStatus")]];
|
||||
character89: 2 [[name("Bandit"), format("characterStatus")]];
|
||||
character88: 2 [[name("Batman"), format("characterStatus")]];
|
||||
character87: 2 [[name("Benny"), format("characterStatus")]];
|
||||
character86: 2 [[name("Blaze Firefighter"), format("characterStatus")]];
|
||||
character85: 2 [[name("Bruce Wayne"), format("characterStatus")]];
|
||||
character84: 2 [[name("Calamity Drone"), format("characterStatus")]];
|
||||
character83: 2 [[name("Cardio Carrie"), format("characterStatus")]];
|
||||
character82: 2 [[name("Cavalry"), format("characterStatus")]];
|
||||
character81: 2 [[name("Caveman"), format("characterStatus")]];
|
||||
character80: 2 [[name("Cleopatra"), format("characterStatus")]];
|
||||
character79: 2 [[name("Deputron"), format("characterStatus")]];
|
||||
character78: 2 [[name("Dr McScrubs"), format("characterStatus")]];
|
||||
character77: 2 [[name("El Macho Wrestler"), format("characterStatus")]];
|
||||
character76: 2 [[name("Emmet (Piece of Resistance)"), format("characterStatus")]];
|
||||
character75: 2 [[name("Emmet (Clown)"), format("characterStatus")]];
|
||||
character74: 2 [[name("Emmet (Construction)"), format("characterStatus")]];
|
||||
character73: 2 [[name("Emmet (Lizard)"), format("characterStatus")]];
|
||||
character72: 2 [[name("Emmet (Magician)"), format("characterStatus")]];
|
||||
character71: 2 [[name("Emmet (Master Builder)"), format("characterStatus")]];
|
||||
character70: 2 [[name("Emmet (PJs)"), format("characterStatus")]];
|
||||
character69: 2 [[name("Emmet (Robin Hood)"), format("characterStatus")]];
|
||||
character68: 2 [[name("Emmet (Robot)"), format("characterStatus")]];
|
||||
character67: 2 [[name("Emmet (Shower)"), format("characterStatus")]];
|
||||
character66: 2 [[name("Emmet (Surgeon)"), format("characterStatus")]];
|
||||
character65: 2 [[name("Emmet (Old West)"), format("characterStatus")]];
|
||||
character64: 2 [[name("Foreman Frank"), format("characterStatus")]];
|
||||
character63: 2 [[name("Gail"), format("characterStatus")]];
|
||||
character62: 2 [[name("Gallant Guard"), format("characterStatus")]];
|
||||
character61: 2 [[name("Gandalf"), format("characterStatus")]];
|
||||
character60: 2 [[name("Garbage Man Dan"), format("characterStatus")]];
|
||||
character59: 2 [[name("Good Cop"), format("characterStatus")]];
|
||||
character58: 2 [[name("Good Cop (Scribble Face)"), format("characterStatus")]];
|
||||
character57: 2 [[name("Gordon Zola"), format("characterStatus")]];
|
||||
character56: 2 [[name("Green Lantern"), format("characterStatus")]];
|
||||
character55: 2 [[name("Green Ninja"), format("characterStatus")]];
|
||||
character54: 2 [[name("Hank Haystack"), format("characterStatus")]];
|
||||
character53: 2 [[name("Ice Cream Jo"), format("characterStatus")]];
|
||||
character52: 2 [[name("Johnny Thunder"), format("characterStatus")]];
|
||||
character51: 2 [[name("Kabob Bob"), format("characterStatus")]];
|
||||
character50: 2 [[name("Lady Liberty"), format("characterStatus")]];
|
||||
character49: 2 [[name("Larry the Barrista"), format("characterStatus")]];
|
||||
character48: 2 [[name("Swamp Creature"), format("characterStatus")]];
|
||||
character47: 2 [[name("Lord Business"), format("characterStatus")]];
|
||||
character46: 2 [[name("Lord Vampyre"), format("characterStatus")]];
|
||||
character45: 2 [[name("Ma Cop"), format("characterStatus")]];
|
||||
character44: 2 [[name("Michelangelo"), format("characterStatus")]];
|
||||
character43: 2 [[name("Mrs Scratchen-Post"), format("characterStatus")]];
|
||||
character42: 2 [[name("Mummy"), format("characterStatus")]];
|
||||
character41: 2 [[name("Native Chief"), format("characterStatus")]];
|
||||
character40: 2 [[name("Native Warrior"), format("characterStatus")]];
|
||||
character39: 2 [[name("Outlaw"), format("characterStatus")]];
|
||||
character38: 2 [[name("Pa Cop"), format("characterStatus")]];
|
||||
character37: 2 [[name("Panda Guy"), format("characterStatus")]];
|
||||
character36: 2 [[name("Plumber Joe"), format("characterStatus")]];
|
||||
character35: 2 [[name("President Business"), format("characterStatus")]];
|
||||
character34: 2 [[name("Prospector"), format("characterStatus")]];
|
||||
character33: 2 [[name("Robo Construction"), format("characterStatus")]];
|
||||
character32: 2 [[name("Robo Cowboy"), format("characterStatus")]];
|
||||
character31: 2 [[name("Robo Demolition"), format("characterStatus")]];
|
||||
character30: 2 [[name("Robo Agent"), format("characterStatus")]];
|
||||
character29: 2 [[name("Robo Pilot"), format("characterStatus")]];
|
||||
character28: 2 [[name("Robo Receptionist"), format("characterStatus")]];
|
||||
character27: 2 [[name("Rootbeer Belle"), format("characterStatus")]];
|
||||
character26: 2 [[name("S.S.P Officer"), format("characterStatus")]];
|
||||
character25: 2 [[name("S.S.P Officer (Beanie)"), format("characterStatus")]];
|
||||
character24: 2 [[name("S.S.P Officer (Heavy)"), format("characterStatus")]];
|
||||
character23: 2 [[name("S.S.P Officer (SWAT)"), format("characterStatus")]];
|
||||
character22: 2 [[name("Sharon Shoehorn"), format("characterStatus")]];
|
||||
character21: 2 [[name("Sheriff Not-A-Robot"), format("characterStatus")]];
|
||||
character20: 2 [[name("Sir Stackabrick"), format("characterStatus")]];
|
||||
character19: 2 [[name("Sudds Backwash"), format("characterStatus")]];
|
||||
character18: 2 [[name("Superman"), format("characterStatus")]];
|
||||
character17: 2 [[name("Taco Tuesday Guy"), format("characterStatus")]];
|
||||
character16: 2 [[name("Test Dummy"), format("characterStatus")]];
|
||||
character15: 2 [[name("Unikitty"), format("characterStatus")]];
|
||||
character14: 2 [[name("Unikitty (Business)"), format("characterStatus")]];
|
||||
character13: 2 [[name("Unikitty (Queasy)"), format("characterStatus")]];
|
||||
character12: 2 [[name("Unikitty (Space)"), format("characterStatus")]];
|
||||
character11: 2 [[name("Velma Staplebot"), format("characterStatus")]];
|
||||
character10: 2 [[name("Vitruvius"), format("characterStatus")]];
|
||||
character9: 2 [[name("Vitruvius (Young)"), format("characterStatus")]];
|
||||
character8: 2 [[name("\"Where Are My Pants?\" Guy"), format("characterStatus")]];
|
||||
character7: 2 [[name("Wiley Fusebot"), format("characterStatus")]];
|
||||
character6: 2 [[name("William Shakespeare"), format("characterStatus")]];
|
||||
character5: 2 [[name("Wonder Woman"), format("characterStatus")]];
|
||||
character4: 2 [[name("Wyldstyle"), format("characterStatus")]];
|
||||
character3: 2 [[name("Wyldstyle (Hooded)"), format("characterStatus")]];
|
||||
character2: 2 [[name("Wyldstyle (Robot)"), format("characterStatus")]];
|
||||
character1: 2 [[name("Wyldstyle (Space)"), format("characterStatus")]];
|
||||
character0: 2 [[name("Wyldstyle (Old West)"), format("characterStatus")]];
|
||||
};
|
||||
|
||||
struct profile1_t { // profile starts at 28
|
||||
padding[8];
|
||||
ChallengeLvls challengelvls[45];
|
||||
padding[94];
|
||||
u24 blueStoneOffset;
|
||||
padding[13];
|
||||
LvlCounter = 0;
|
||||
YellowStoneOffset yellowstoneoffset[45];
|
||||
padding[213];
|
||||
Upgrades upgradesUnlocked1 [[name("Upgrades - Unlocked")]];
|
||||
Upgrades upgradesBought1 [[name("Upgrades - Bought")]];
|
||||
padding[3];
|
||||
Characters Characters1 [[name("Characters")]];
|
||||
padding[17];
|
||||
u8 sectionUnlockOffset[23];
|
||||
padding[37];
|
||||
};
|
||||
|
||||
struct Chunks {
|
||||
profile1_t profile1_chunk [[comment("Profile 1")]];
|
||||
profile1_t profile2_chunk [[comment("Profile 2")]];
|
||||
};
|
||||
|
||||
header_t header @ 0x00 [[comment("Contains the data outside the profiles."), name("Main game")]];
|
||||
Chunks chunks @ 0x1C [[comment("Contains the data of each profile."), name("Profiles")]];
|
95
the-lego-movie-videogame/the-lego-movie-videogame.css
Normal file
95
the-lego-movie-videogame/the-lego-movie-videogame.css
Normal file
@@ -0,0 +1,95 @@
|
||||
.character-name,
|
||||
.upgrade-name {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.challenge-icon {
|
||||
background-image: url( ./challenges.webp );
|
||||
background-size: 384px;
|
||||
}
|
||||
|
||||
.character-icon {
|
||||
background-image: url( ./characters.webp );
|
||||
background-size: 320px;
|
||||
}
|
||||
|
||||
.upgrade-icon {
|
||||
background-image: url( ./upgrades.webp );
|
||||
background-size: 128px;
|
||||
}
|
||||
|
||||
.challenge-icon,
|
||||
.character-icon,
|
||||
.upgrade-icon {
|
||||
background-repeat: no-repeat;
|
||||
display: inline-block;
|
||||
height: 32px;
|
||||
margin-right: 6px;
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
vertical-align: middle;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
/* Fix */
|
||||
.columns.c1,
|
||||
.columns.one {
|
||||
width: calc( 100% / 12 * 1 );
|
||||
}
|
||||
|
||||
.columns.c2,
|
||||
.columns.two {
|
||||
width: calc( 100% / 12 * 2 );
|
||||
}
|
||||
|
||||
.columns.c3,
|
||||
.columns.three {
|
||||
width: calc( 100% / 12 * 3 );
|
||||
}
|
||||
|
||||
.columns.c4,
|
||||
.columns.four {
|
||||
width: calc( 100% / 12 * 4 );
|
||||
}
|
||||
|
||||
.columns.c5,
|
||||
.columns.five {
|
||||
width: calc( 100% / 12 * 5 );
|
||||
}
|
||||
|
||||
.columns.c6,
|
||||
.columns.six {
|
||||
width: calc( 100% / 12 * 6 );
|
||||
}
|
||||
|
||||
.columns.c7,
|
||||
.columns.seven {
|
||||
width: calc( 100% / 12 * 7 );
|
||||
}
|
||||
|
||||
.columns.c8,
|
||||
.columns.eight {
|
||||
width: calc( 100% / 12 * 8 );
|
||||
}
|
||||
|
||||
.columns.c9,
|
||||
.columns.nine {
|
||||
width: calc( 100% / 12 * 9 );
|
||||
}
|
||||
|
||||
.columns.c10,
|
||||
.columns.ten {
|
||||
width: calc( 100% / 12 * 10 );
|
||||
}
|
||||
|
||||
.columns.c11,
|
||||
.columns.eleven {
|
||||
width: calc( 100% / 12 * 11 );
|
||||
}
|
||||
|
||||
.columns.c12,
|
||||
.columns.twelve {
|
||||
width: 100%;
|
||||
}
|
@@ -1,288 +1,337 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-disable max-len */
|
||||
/*
|
||||
The Lego Movie Videogame for HTML5 Save Editor v20160704
|
||||
by Marc Robledo 2016
|
||||
*/
|
||||
function convert_to_bit(d, l){
|
||||
return ('0000000000000000' + (d >>> 0).toString(2)).slice(0-l).split('');
|
||||
'use_strict';
|
||||
function convert_to_bit( d, l ) {
|
||||
return ( '0000000000000000' + ( d >>> 0 ).toString( 2 ) ).slice( 0 - l ).split( '' );
|
||||
}
|
||||
SavegameEditor={
|
||||
Name:'The Lego Movie Videogame',
|
||||
Filename:'savegame.dat',
|
||||
SavegameEditor = {
|
||||
Name: 'The Lego Movie Videogame',
|
||||
Filename: 'savegame.dat',
|
||||
|
||||
/* Constants */
|
||||
Constants:{
|
||||
BLUE_STONES_OFFSET:0x228, // 552
|
||||
CHALLENGE_OFFSET:0x8,
|
||||
CHARACTER_OFFSET:0x47C, // 1148
|
||||
CHARACTER_OPTIONS:[
|
||||
{value:0, name:'Locked'},
|
||||
{value:1, name:'Unlocked'},
|
||||
{value:2, name:'Unlocked+Bought'}
|
||||
Constants: {
|
||||
BLUE_STONES_OFFSET: 0x228, // 552
|
||||
CHALLENGE_OFFSET: 0x8,
|
||||
CHARACTER_OFFSET: 0x47C, // 1148
|
||||
CHARACTER_OPTIONS: [
|
||||
{ value: 0, name: 'Locked' },
|
||||
{ value: 1, name: 'Unlocked' },
|
||||
{ value: 2, name: 'Unlocked+Bought' }
|
||||
],
|
||||
SETTINGS_MUSIC_MICROPHONE_OFFSET:0x18, // 00=All OFF, A0=Music ON, 0A=Microphone ON, AA=All ON
|
||||
LANGUAGE_OFFSET:0x19,
|
||||
LANGUAGES:[
|
||||
{value:1, name:'English'},
|
||||
{value:2, name:'French'},
|
||||
{value:3, name:'Italian'},
|
||||
{value:4, name:'German'},
|
||||
{value:5, name:'Spanish'},
|
||||
{value:6, name:'Dutch'},
|
||||
{value:7, name:'Danish'}
|
||||
SETTINGS_MUSIC_MICROPHONE_OFFSET: 0x18, // 00=All OFF, A0=Music ON, 0A=Microphone ON, AA=All ON
|
||||
LANGUAGE_OFFSET: 0x19,
|
||||
LANGUAGES: [
|
||||
{ value: 1, name: 'English' },
|
||||
{ value: 2, name: 'French' },
|
||||
{ value: 3, name: 'Italian' },
|
||||
{ value: 4, name: 'German' },
|
||||
{ value: 5, name: 'Spanish' },
|
||||
{ value: 6, name: 'Dutch' },
|
||||
{ value: 7, name: 'Danish' }
|
||||
],
|
||||
LEVEL_LAST_PLAYED_OFFSET: 0x6, // 6
|
||||
LEVEL_LAST_PLAYED_OFFSET2: 0x454, // 1108
|
||||
PROFILES:[
|
||||
{value:1, name:'Save slot 1', offset:0x1c}, // 28
|
||||
{value:2, name:'Save slot 2', offset:0x4fc} // 1276
|
||||
PROFILES: [
|
||||
{ value: 1, name: 'Save slot 1', offset: 0x1c }, // 28
|
||||
{ value: 2, name: 'Save slot 2', offset: 0x4fc } // 1276
|
||||
],
|
||||
PROFILE_SELECTION_OFFSET:0x1A,
|
||||
SECTION_UNLOCK_OFFSET:0x4A4, // 1188
|
||||
SECTION_UNLOCK_STATUS:[
|
||||
{value:0, name:'Locked, Locked, Locked'},
|
||||
{value:1, name:'Unlocked - Locked - Locked'},
|
||||
{value:21, name:'Played - Unlocked - Locked'},
|
||||
{value:341, name:'Played - Played - Unlocked'},
|
||||
{value:1911, name:'Played - Played - Played'}
|
||||
PROFILE_SELECTION_OFFSET: 0x1A,
|
||||
SECTION_UNLOCK_OFFSET: 0x4A4, // 1188
|
||||
SECTION_UNLOCK_STATUS: [
|
||||
{ value: 0, name: 'Locked, Locked, Locked' },
|
||||
{ value: 1, name: 'Unlocked - Locked - Locked' },
|
||||
{ value: 21, name: 'Played - Unlocked - Locked' },
|
||||
{ value: 341, name: 'Played - Played - Unlocked' },
|
||||
{ value: 1911, name: 'Played - Played - Played' }
|
||||
],
|
||||
UPGRADES_OFFSET:0x475, // 1141
|
||||
YELLOW_STONE_OFFSET:0x238, // 568
|
||||
UPGRADES_OFFSET: 0x475, // 1141
|
||||
YELLOW_STONE_OFFSET: 0x238 // 568
|
||||
},
|
||||
/* CRC32 - from Alex - https://stackoverflow.com/a/18639999 */
|
||||
/* Combined with CRC32-Version by Slattz (https://github.com/Slattz/POTC3D_Rehash) */
|
||||
CRC32_TABLE:(function(){
|
||||
var c,crcTable=[];
|
||||
for(var n=0;n<256;n++){
|
||||
c=n;
|
||||
for(var k=0;k<8;k++)
|
||||
c=((c&1)?(0xedb88320^(c>>>1)):(c>>>1));
|
||||
crcTable[n]=(c>>>0);
|
||||
CRC32_TABLE: ( function () {
|
||||
let c;
|
||||
const crcTable = [];
|
||||
for ( let n = 0; n < 256; n++ ) {
|
||||
c = n;
|
||||
for ( let k = 0; k < 8; k++ ) {
|
||||
c = ( ( c & 1 ) ? ( 0xedb88320 ^ ( c >>> 1 ) ) : ( c >>> 1 ) );
|
||||
}
|
||||
crcTable[ n ] = ( c >>> 0 );
|
||||
}
|
||||
return crcTable;
|
||||
}()),
|
||||
crc32:function(file, len, offset){
|
||||
var data=file.readBytes(offset, len-offset);
|
||||
var checksum=0xFF;
|
||||
var byte= 0b0;
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
[byte]=new Int8Array([data[i]]);
|
||||
var [cs_] = new Int8Array([checksum]);
|
||||
byte^=cs_;
|
||||
byte&=0xff;
|
||||
var cs___ = (i===0 ? cs_ : checksum);
|
||||
var a = SavegameEditor.CRC32_TABLE[byte];
|
||||
checksum = a ^ (cs___>>>8);
|
||||
}
|
||||
return ((checksum>>>0)<<0);
|
||||
}() ),
|
||||
setPos: function ( node, tiles, pos ) {
|
||||
const size = 128, // Sprite height
|
||||
scale = 0.25, // height scaled down to 32px
|
||||
left = pos % tiles * size * scale,
|
||||
top = Math.floor( pos / tiles ) * size * scale;
|
||||
node.style.backgroundPosition = `-${ left }px -${ top }px`;
|
||||
},
|
||||
_getProfileOffset:function(){
|
||||
return this.Constants.PROFILES[Number(getValue('profile-selector')) - 1].offset;
|
||||
crc32: function ( file, len, offset ) {
|
||||
const self = this,
|
||||
data = file.readBytes( offset, len - offset );
|
||||
let byte = 0b0,
|
||||
checksum = 0xFF;
|
||||
for ( let i = 0; i < data.length; i++ ) {
|
||||
[ byte ] = new Int8Array( [ data[ i ] ] );
|
||||
const [ cs_ ] = new Int8Array( [ checksum ] );
|
||||
byte ^= cs_;
|
||||
byte &= 0xff;
|
||||
const cs___ = ( i === 0 ? cs_ : checksum );
|
||||
const a = self.CRC32_TABLE[ byte ];
|
||||
checksum = a ^ ( cs___ >>> 8 );
|
||||
}
|
||||
return ( ( checksum >>> 0 ) << 0 ) >>> 0;
|
||||
},
|
||||
_get_section_status:function(s) {
|
||||
var offset = SavegameEditor._getProfileOffset() + SavegameEditor.Constants.SECTION_UNLOCK_OFFSET;
|
||||
var amount = Math.ceil(1.5*s);
|
||||
var result = '';
|
||||
for (var i = 0; i < amount; i++) {
|
||||
result = convert_to_bit(tempFile.readU8(offset + i), 8).join('') + result;
|
||||
}
|
||||
result = result.substring(0, result.length-12*(s-1)).slice(-12);
|
||||
return parseInt(result, 2);
|
||||
_getProfileOffset: function () {
|
||||
return SavegameEditor.Constants.PROFILES[ Number( getValue( 'profile-selector' ) ) - 1 ].offset;
|
||||
},
|
||||
_write_section_status:function(e) {
|
||||
var s = e.target.dataset.section;
|
||||
var status = getValue('section-status-'+s);
|
||||
var offset = SavegameEditor._getProfileOffset() + SavegameEditor.Constants.SECTION_UNLOCK_OFFSET;
|
||||
var to_write = [];
|
||||
var amount = Math.ceil(1.5*s);
|
||||
var result = '';
|
||||
for (var i = 0; i < amount; i++) {
|
||||
result = convert_to_bit(tempFile.readU8(offset + i), 8).join('') + result;
|
||||
_get_section_status: function ( s ) {
|
||||
const offset = SavegameEditor._getProfileOffset() + SavegameEditor.Constants.SECTION_UNLOCK_OFFSET,
|
||||
amount = Math.ceil( 1.5 * s );
|
||||
let result = '';
|
||||
for ( let i = 0; i < amount; i++ ) {
|
||||
result = convert_to_bit( tempFile.readU8( offset + i ), 8 ).join( '' ) + result;
|
||||
}
|
||||
result = result.substring(0, result.length-12*(s)) + convert_to_bit(status, 12).join('') + result.substring(result.length-12*(s-1), result.length);
|
||||
for (var j = 0; j < result.length; j+=8){
|
||||
to_write.unshift(result.substring(j, j+8));
|
||||
result = result.slice( 0, Math.max( 0, result.length - 12 * ( s - 1 ) ) ).slice( -12 );
|
||||
return parseInt( result, 2 );
|
||||
},
|
||||
_write_section_status: function ( e ) {
|
||||
const s = e.target.dataset.section,
|
||||
status = getValue( 'section-status-' + s ),
|
||||
offset = SavegameEditor._getProfileOffset() + SavegameEditor.Constants.SECTION_UNLOCK_OFFSET,
|
||||
to_write = [],
|
||||
amount = Math.ceil( 1.5 * s );
|
||||
let result = '';
|
||||
for ( let i = 0; i < amount; i++ ) {
|
||||
result = convert_to_bit( tempFile.readU8( offset + i ), 8 ).join( '' ) + result;
|
||||
}
|
||||
for (var k = 0; k < to_write.length; k++) {
|
||||
result = result.slice( 0, Math.max( 0, result.length - 12 * ( s ) ) ) + convert_to_bit( status, 12 ).join( '' ) + result.slice( result.length - 12 * ( s - 1 ), result.length );
|
||||
for ( let j = 0; j < result.length; j += 8 ) {
|
||||
to_write.unshift( result.slice( j, j + 8 ) );
|
||||
}
|
||||
for ( let k = 0; k < to_write.length; k++ ) {
|
||||
tempFile.writeU8(
|
||||
offset + k,
|
||||
parseInt(to_write[k], 2)
|
||||
parseInt( to_write[ k ], 2 )
|
||||
);
|
||||
}
|
||||
},
|
||||
_write_language:function(){
|
||||
_write_language: function () {
|
||||
tempFile.writeU8(
|
||||
SavegameEditor.Constants.LANGUAGE_OFFSET,
|
||||
getValue('language')
|
||||
getValue( 'language' )
|
||||
);
|
||||
},
|
||||
_get_level_stone_offset:function(){
|
||||
var profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
return profileStartOffset + SavegameEditor.Constants.YELLOW_STONE_OFFSET + Number(getValue('levels')) * 8;
|
||||
_get_level_stone_offset: function () {
|
||||
const profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
return profileStartOffset + SavegameEditor.Constants.YELLOW_STONE_OFFSET + Number( getValue( 'levels' ) ) * 8;
|
||||
},
|
||||
_write_level_stones:function(){
|
||||
_write_level_stones: function () {
|
||||
tempFile.writeU24(
|
||||
SavegameEditor._get_level_stone_offset(),
|
||||
getValue('level-stones')
|
||||
getValue( 'level-stones' )
|
||||
);
|
||||
},
|
||||
_write_blue_stones:function(){
|
||||
var profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
_write_blue_stones: function () {
|
||||
const profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
tempFile.writeU24(
|
||||
profileStartOffset + SavegameEditor.Constants.BLUE_STONES_OFFSET,
|
||||
getValue('blue-stones')
|
||||
getValue( 'blue-stones' )
|
||||
);
|
||||
},
|
||||
_write_sound_settings:function(){
|
||||
_write_sound_settings: function () {
|
||||
tempFile.writeU8(
|
||||
SavegameEditor.Constants.SETTINGS_MUSIC_MICROPHONE_OFFSET,
|
||||
(getField('checkbox-microphone').checked ? 10 : 0) + (getField('checkbox-music').checked ? 160 : 0)
|
||||
( getField( 'checkbox-microphone' ).checked ? 10 : 0 ) + ( getField( 'checkbox-music' ).checked ? 160 : 0 )
|
||||
);
|
||||
},
|
||||
_write_last_played:function(){
|
||||
_write_last_played: function () {
|
||||
tempFile.writeU8(
|
||||
SavegameEditor.Constants.LEVEL_LAST_PLAYED_OFFSET,
|
||||
getValue('last-played')
|
||||
getValue( 'last-played' )
|
||||
);
|
||||
tempFile.writeU8(
|
||||
SavegameEditor.Constants.LEVEL_LAST_PLAYED_OFFSET2,
|
||||
getValue('last-played')
|
||||
getValue( 'last-played' )
|
||||
);
|
||||
},
|
||||
_write_character:function(e){
|
||||
var profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
var offset = profileStartOffset + SavegameEditor.Constants.CHARACTER_OFFSET + Number(e.target.dataset.offset);
|
||||
var bits = convert_to_bit(tempFile.readU8(offset), 8);
|
||||
var val = getValue(e.target.id);
|
||||
bits[e.target.dataset.offset_*2]=(val==='2' ? '1' : '0');
|
||||
bits[e.target.dataset.offset_*2+1]=(val!=='0' ? '1' : '0');
|
||||
_write_character: function ( e ) {
|
||||
const profileStartOffset = SavegameEditor._getProfileOffset(),
|
||||
offset = profileStartOffset + SavegameEditor.Constants.CHARACTER_OFFSET + Number( e.target.dataset.offset ),
|
||||
bits = convert_to_bit( tempFile.readU8( offset ), 8 ),
|
||||
val = getValue( e.target.id );
|
||||
bits[ e.target.dataset.offset_ * 2 ] = ( val === '2' ? '1' : '0' );
|
||||
bits[ e.target.dataset.offset_ * 2 + 1 ] = ( val !== '0' ? '1' : '0' );
|
||||
tempFile.writeU8(
|
||||
offset,
|
||||
parseInt(bits.join(''), 2)
|
||||
parseInt( bits.join( '' ), 2 )
|
||||
);
|
||||
},
|
||||
_write_challenge:function(e){
|
||||
var lvl = Number(getValue('levels'));
|
||||
_write_challenge: function ( e ) {
|
||||
const lvl = Number( getValue( 'levels' ) );
|
||||
tempFile.writeU8(
|
||||
SavegameEditor._getProfileOffset()+SavegameEditor.Constants.CHALLENGE_OFFSET+(lvl)*10+Number(e.target.dataset.challenge),
|
||||
SavegameEditor._getProfileOffset() + SavegameEditor.Constants.CHALLENGE_OFFSET + ( lvl ) * 10 + Number( e.target.dataset.challenge ),
|
||||
e.target.checked === true ? '1' : '0'
|
||||
);
|
||||
},
|
||||
_write_upgrade:function(e){
|
||||
var profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
var offset = profileStartOffset + SavegameEditor.Constants.UPGRADES_OFFSET;
|
||||
var bitsUnlocked = convert_to_bit(tempFile.readU16(offset), 16);
|
||||
var bitsBought = convert_to_bit(tempFile.readU16(offset+2), 16);
|
||||
var val = getValue(e.target.id);
|
||||
bitsBought[e.target.dataset.offset]=(val==='2' ? '1' : '0');
|
||||
bitsUnlocked[e.target.dataset.offset]=(val!=='0' ? '1' : '0');
|
||||
_write_upgrade: function ( e ) {
|
||||
const profileStartOffset = SavegameEditor._getProfileOffset(),
|
||||
offset = profileStartOffset + SavegameEditor.Constants.UPGRADES_OFFSET,
|
||||
bitsUnlocked = convert_to_bit( tempFile.readU16( offset ), 16 ),
|
||||
bitsBought = convert_to_bit( tempFile.readU16( offset + 2 ), 16 ),
|
||||
val = getValue( e.target.id );
|
||||
bitsBought[ e.target.dataset.offset ] = ( val === '2' ? '1' : '0' );
|
||||
bitsUnlocked[ e.target.dataset.offset ] = ( val !== '0' ? '1' : '0' );
|
||||
tempFile.writeU16(
|
||||
offset,
|
||||
parseInt(bitsUnlocked.join(''), 2)
|
||||
parseInt( bitsUnlocked.join( '' ), 2 )
|
||||
);
|
||||
tempFile.writeU16(
|
||||
offset+2,
|
||||
parseInt(bitsBought.join(''), 2)
|
||||
offset + 2,
|
||||
parseInt( bitsBought.join( '' ), 2 )
|
||||
);
|
||||
},
|
||||
_load_level:function(){
|
||||
var profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
var lvl = Number(getValue('levels'));
|
||||
setValue('level-stones', tempFile.readU24(SavegameEditor._get_level_stone_offset()));
|
||||
for (var i = 0; i < 10; i++) {
|
||||
getField('challenge-' + (i + 1) + '-unlocked').checked = tempFile.readU8(profileStartOffset + SavegameEditor.Constants.CHALLENGE_OFFSET + (lvl - 1) * 10 + i) === 1;
|
||||
_load_level: function () {
|
||||
const profileStartOffset = SavegameEditor._getProfileOffset(),
|
||||
lvl = Number( getValue( 'levels' ) );
|
||||
setValue( 'level-stones', tempFile.readU24( SavegameEditor._get_level_stone_offset() ) );
|
||||
for ( let i = 0; i < 10; i++ ) {
|
||||
const data = SavegameEditor.Constants.CHALLENGES[ lvl ][ i ];
|
||||
SavegameEditor.setPos( document.querySelector( `.challenge-icon[data-id="${ i + 1 }"]` ), 12, data[ 1 ] - 1 );
|
||||
document.querySelector( 'label[for="checkbox-challenge-' + ( i + 1 ) + '-unlocked"]' ).innerText = data[ 0 ];
|
||||
getField( 'challenge-' + ( i + 1 ) + '-unlocked' ).checked = tempFile.readU8( profileStartOffset + SavegameEditor.Constants.CHALLENGE_OFFSET + ( lvl ) * 10 + i ) === 1;
|
||||
}
|
||||
},
|
||||
_load_profile:function(){
|
||||
var profileStartOffset = SavegameEditor._getProfileOffset();
|
||||
|
||||
setValue('blue-stones', tempFile.readU24(profileStartOffset + SavegameEditor.Constants.BLUE_STONES_OFFSET));
|
||||
setValue('levels', '1');
|
||||
var field, a, b, c;
|
||||
for (c = 0; c < SavegameEditor.Constants.CHARACTERS.length; c++) {
|
||||
field = getField('select-character-'+c);
|
||||
a = convert_to_bit(tempFile.readU8(profileStartOffset + SavegameEditor.Constants.CHARACTER_OFFSET + Number(field.dataset.offset)), 8);
|
||||
b = (a[field.dataset.offset_*2]==='1') ? '2' : ((a[field.dataset.offset_*2+1]==='1') ? '1' : '0');
|
||||
setValue('character-'+c, Number(b));
|
||||
_create_mission_select: function ( id, func ) {
|
||||
const missionSelect = document.createElement( 'select' );
|
||||
missionSelect.id = `select-${ id }`;
|
||||
missionSelect.className = 'full-width';
|
||||
missionSelect.addEventListener( 'change', func, false );
|
||||
SavegameEditor.Constants.CHAPTERS.forEach( ( chapter, index ) => {
|
||||
const optgroup = missionSelect.appendChild( document.createElement( 'optgroup' ) );
|
||||
optgroup.label = chapter;
|
||||
for ( let i = 0; i < 3; i++ ) {
|
||||
const selectEle = optgroup.appendChild( document.createElement( 'option' ) );
|
||||
selectEle.value = String( index * 3 + i );
|
||||
selectEle.textContent = SavegameEditor.Constants.MISSIONS[ index * 3 + i ];
|
||||
}
|
||||
} );
|
||||
return missionSelect;
|
||||
},
|
||||
_load_profile: function () {
|
||||
const self = SavegameEditor,
|
||||
profileStartOffset = self._getProfileOffset();
|
||||
|
||||
setValue( 'blue-stones', tempFile.readU24( profileStartOffset + self.Constants.BLUE_STONES_OFFSET ) );
|
||||
setValue( 'levels', '1' );
|
||||
let field, a, b, c;
|
||||
for ( c = 0; c < self.Constants.CHARACTERS.length; c++ ) {
|
||||
field = getField( 'select-character-' + c );
|
||||
a = convert_to_bit( tempFile.readU8( profileStartOffset + self.Constants.CHARACTER_OFFSET + Number( field.dataset.offset ) ), 8 );
|
||||
b = ( a[ field.dataset.offset_ * 2 ] === '1' ) ? '2' : ( ( a[ field.dataset.offset_ * 2 + 1 ] === '1' ) ? '1' : '0' );
|
||||
setValue( 'character-' + c, Number( b ) );
|
||||
}
|
||||
var unlocked = convert_to_bit(tempFile.readU16(profileStartOffset + SavegameEditor.Constants.UPGRADES_OFFSET), 16);
|
||||
var bought = convert_to_bit(tempFile.readU16(profileStartOffset + SavegameEditor.Constants.UPGRADES_OFFSET+2), 16);
|
||||
for (c = 0; c < SavegameEditor.Constants.UPGRADES.length; c++) {
|
||||
field = getField('select-upgrade-'+c);
|
||||
b = (bought[field.dataset.offset]==='1') ? '2' : ((unlocked[field.dataset.offset]==='1') ? '1' : '0');
|
||||
setValue('upgrade-'+c, Number(b));
|
||||
const bought = convert_to_bit( tempFile.readU16( profileStartOffset + self.Constants.UPGRADES_OFFSET + 2 ), 16 ),
|
||||
unlocked = convert_to_bit( tempFile.readU16( profileStartOffset + self.Constants.UPGRADES_OFFSET ), 16 );
|
||||
for ( c = 0; c < self.Constants.UPGRADES.length; c++ ) {
|
||||
field = getField( 'select-upgrade-' + c );
|
||||
b = ( bought[ field.dataset.offset ] === '1' ) ? '2' : ( ( unlocked[ field.dataset.offset ] === '1' ) ? '1' : '0' );
|
||||
setValue( 'upgrade-' + c, Number( b ) );
|
||||
}
|
||||
setValue('last-played', tempFile.readU8(profileStartOffset + SavegameEditor.Constants.LEVEL_LAST_PLAYED_OFFSET));
|
||||
SavegameEditor._load_level();
|
||||
for (var l = 1; l < 16; l++) {
|
||||
setValue('section-status-'+l, SavegameEditor._get_section_status(l));
|
||||
setValue( 'last-played', tempFile.readU8( profileStartOffset + self.Constants.LEVEL_LAST_PLAYED_OFFSET ) );
|
||||
self._load_level();
|
||||
for ( let l = 1; l < 16; l++ ) {
|
||||
setValue( 'section-status-' + l, self._get_section_status( l ) );
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/* check if savegame is valid */
|
||||
checkValidSavegame:function(){
|
||||
return (tempFile.fileSize==2524);
|
||||
checkValidSavegame: function () {
|
||||
return ( tempFile.fileSize === 2524 );
|
||||
},
|
||||
|
||||
preload:function() {
|
||||
get('toolbar').children[0].appendChild(select('profile-selector', this.Constants.PROFILES, this._load_profile));
|
||||
get('container-language').appendChild(select('language', SavegameEditor.Constants.LANGUAGES, SavegameEditor._write_language));
|
||||
get('container-levelselection').appendChild(select('levels', SavegameEditor.Constants.LEVELS, SavegameEditor._load_level));
|
||||
for (var i = 0; i < 10; i++) {
|
||||
getField('challenge-' + (i + 1) + '-unlocked').addEventListener('change', SavegameEditor._write_challenge);
|
||||
|
||||
preload: function () {
|
||||
const self = this;
|
||||
get( 'toolbar' ).children[ 0 ].appendChild( select( 'profile-selector', this.Constants.PROFILES, this._load_profile ) );
|
||||
get( 'container-language' ).appendChild( select( 'language', self.Constants.LANGUAGES, self._write_language ) );
|
||||
get( 'container-levelselection' ).appendChild( this._create_mission_select( 'levels', self._load_level ) );
|
||||
for ( let i = 0; i < 10; i++ ) {
|
||||
getField( 'challenge-' + ( i + 1 ) + '-unlocked' ).addEventListener( 'change', self._write_challenge );
|
||||
}
|
||||
get('container-last-played').appendChild(select('last-played', SavegameEditor.Constants.LEVELS, SavegameEditor._write_last_played));
|
||||
get('input-level-stones').addEventListener('change', SavegameEditor._write_level_stones);
|
||||
get('input-blue-stones').addEventListener('change', SavegameEditor._write_blue_stones);
|
||||
getField('checkbox-microphone').addEventListener('change', SavegameEditor._write_sound_settings);
|
||||
getField('checkbox-music').addEventListener('change', SavegameEditor._write_sound_settings);
|
||||
setNumericRange('blue-stones', 0, 16777215);
|
||||
var tmp1 = get('character-list');
|
||||
for (var j = 0; j < SavegameEditor.Constants.CHARACTERS.length; j++) {
|
||||
tmp1.appendChild(col(2,span(SavegameEditor.Constants.CHARACTERS[j])));
|
||||
var sel=select('character-'+j,SavegameEditor.Constants.CHARACTER_OPTIONS, SavegameEditor._write_character);
|
||||
sel.dataset.offset=Math.floor(j*0.25);
|
||||
sel.dataset.offset_=3-(j-sel.dataset.offset*4);
|
||||
tmp1.appendChild(col(4,sel));
|
||||
get( 'container-last-played' ).appendChild( this._create_mission_select( 'last-played', self._write_last_played ) );
|
||||
get( 'input-level-stones' ).addEventListener( 'change', self._write_level_stones );
|
||||
get( 'input-blue-stones' ).addEventListener( 'change', self._write_blue_stones );
|
||||
getField( 'checkbox-microphone' ).addEventListener( 'change', self._write_sound_settings );
|
||||
getField( 'checkbox-music' ).addEventListener( 'change', self._write_sound_settings );
|
||||
setNumericRange( 'blue-stones', 0, 16777215 );
|
||||
const tmp1 = get( 'character-list' );
|
||||
for ( let j = 0; j < self.Constants.CHARACTERS.length; j++ ) {
|
||||
const name = self.Constants.CHARACTERS[ j ],
|
||||
characterIcon = document.createElement( 'span' ),
|
||||
characterCol = tmp1.appendChild( col( 3, characterIcon ) ),
|
||||
characterName = characterCol.appendChild( span( name ) );
|
||||
SavegameEditor.setPos( characterIcon, 10, j );
|
||||
characterName.className = 'character-name';
|
||||
characterIcon.className = 'character-icon';
|
||||
const sel = select( 'character-' + j, self.Constants.CHARACTER_OPTIONS, self._write_character );
|
||||
sel.dataset.offset = Math.floor( j * 0.25 );
|
||||
sel.dataset.offset_ = 3 - ( j - sel.dataset.offset * 4 );
|
||||
tmp1.appendChild( col( 3, sel ) );
|
||||
}
|
||||
var tmp2 = get('upgrades-list');
|
||||
for (var k = 0; k < SavegameEditor.Constants.UPGRADES.length; k++) {
|
||||
tmp2.appendChild(col(2,span(SavegameEditor.Constants.UPGRADES[k])));
|
||||
var sel_=select('upgrade-'+k,SavegameEditor.Constants.CHARACTER_OPTIONS, SavegameEditor._write_upgrade);
|
||||
sel_.dataset.offset=k;
|
||||
tmp2.appendChild(col(4,sel_));
|
||||
const tmp2 = get( 'upgrades-list' );
|
||||
for ( let k = 0; k < self.Constants.UPGRADES.length; k++ ) {
|
||||
const name = self.Constants.UPGRADES[ k ],
|
||||
upgradeIcon = document.createElement( 'span' ),
|
||||
upgradeCol = tmp2.appendChild( col( 3, upgradeIcon ) ),
|
||||
upgradeName = upgradeCol.appendChild( span( name ) );
|
||||
SavegameEditor.setPos( upgradeIcon, 4, k );
|
||||
upgradeName.className = 'upgrade-name';
|
||||
upgradeIcon.className = 'upgrade-icon';
|
||||
const sel_ = select( 'upgrade-' + k, self.Constants.CHARACTER_OPTIONS, self._write_upgrade );
|
||||
sel_.dataset.offset = k;
|
||||
tmp2.appendChild( col( 3, sel_ ) );
|
||||
}
|
||||
var tmp3 = get('sections-list');
|
||||
for (var l = 1; l < 16; l++) {
|
||||
var sel__ = select('section-status-' + l, SavegameEditor.Constants.SECTION_UNLOCK_STATUS, SavegameEditor._write_section_status);
|
||||
tmp2.appendChild( col( 6, span( '' ) ) );
|
||||
const tmp3 = get( 'sections-list' );
|
||||
for ( let l = 1; l < 16; l++ ) {
|
||||
const sel__ = select( 'section-status-' + l, self.Constants.SECTION_UNLOCK_STATUS, self._write_section_status );
|
||||
sel__.dataset.section = l;
|
||||
tmp3.append(
|
||||
col(2, span('S' + l + ' (Level ' + ((l-1)*3+1) + '-' + (l*3) + ')')),
|
||||
col(4, sel__)
|
||||
col( 2, span( 'S' + l + ' (Level ' + ( ( l - 1 ) * 3 + 1 ) + '-' + ( l * 3 ) + ')' ) ),
|
||||
col( 4, sel__ )
|
||||
);
|
||||
}
|
||||
tmp3.appendChild( col( 6, span( '' ) ) );
|
||||
},
|
||||
|
||||
/* load function */
|
||||
load:function(){
|
||||
tempFile.fileName='savegame.dat';
|
||||
tempFile.littleEndian=true;
|
||||
console.log("Old CRC32 ", tempFile.readU32(0));
|
||||
console.log("Calced CRC32 ", SavegameEditor.crc32(tempFile, tempFile.fileSize, 24));
|
||||
load: function () {
|
||||
const self = this;
|
||||
tempFile.fileName = 'savegame.dat';
|
||||
tempFile.littleEndian = true;
|
||||
console.log( 'Old CRC32 ', tempFile.readU32( 0 ) );
|
||||
console.log( 'Calced CRC32 ', self.crc32( tempFile, tempFile.fileSize, 24 ) );
|
||||
|
||||
setValue('language', tempFile.readU8(SavegameEditor.Constants.LANGUAGE_OFFSET));
|
||||
setValue('savegame', 'Save game #' + (tempFile.readU8(SavegameEditor.Constants.PROFILE_SELECTION_OFFSET) + 1));
|
||||
getField('checkbox-microphone').checked = tempFile.readU8(SavegameEditor.Constants.SETTINGS_MUSIC_MICROPHONE_OFFSET)>0;
|
||||
getField('checkbox-music').checked = tempFile.readU8(SavegameEditor.Constants.SETTINGS_MUSIC_MICROPHONE_OFFSET)>100;
|
||||
setValue( 'language', tempFile.readU8( self.Constants.LANGUAGE_OFFSET ) );
|
||||
setValue( 'savegame', 'Save game #' + ( tempFile.readU8( self.Constants.PROFILE_SELECTION_OFFSET ) + 1 ) );
|
||||
getField( 'checkbox-microphone' ).checked = tempFile.readU8( self.Constants.SETTINGS_MUSIC_MICROPHONE_OFFSET ) > 0;
|
||||
getField( 'checkbox-music' ).checked = tempFile.readU8( self.Constants.SETTINGS_MUSIC_MICROPHONE_OFFSET ) > 100;
|
||||
this._load_profile();
|
||||
},
|
||||
|
||||
|
||||
/* save function */
|
||||
save:function(){
|
||||
console.log("New CRC32 ", SavegameEditor.crc32(tempFile, tempFile.fileSize, 24));
|
||||
save: function () {
|
||||
const self = this;
|
||||
console.log( 'New CRC32 ', self.crc32( tempFile, tempFile.fileSize, 24 ) );
|
||||
tempFile.writeU32(
|
||||
0,
|
||||
SavegameEditor.crc32(tempFile, tempFile.fileSize, 24)
|
||||
self.crc32( tempFile, tempFile.fileSize, 24 )
|
||||
);
|
||||
}
|
||||
};
|
||||
|
BIN
the-lego-movie-videogame/upgrades.webp
Normal file
BIN
the-lego-movie-videogame/upgrades.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
Reference in New Issue
Block a user