[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:
magiczocker10
2025-08-02 16:59:34 +02:00
committed by GitHub
parent e90a6688c1
commit fa69a27181
9 changed files with 1254 additions and 321 deletions

View File

@@ -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 );
}
})
} )
);
}
});
} );

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 KiB

View File

@@ -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 ]
]
];

View File

@@ -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>

View 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")]];

View 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%;
}

View File

@@ -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 )
);
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB