0
0
mirror of https://github.com/marcrobledo/savegame-editors.git synced 2025-04-24 16:35:10 +00:00
Marc Robledo 1e66904112 * switch to service worker in all editors
* added MK7 editor
* fixed KI:Uprising weapon saving
* BOTW:
    * added Wii U/Switch mode transfer
    * fixed scrolling topbar
    * added compatibility with Kiosk version
    * master editor: revamp and faster
savegame-editor.js has been updated with fixes and performance improvements, also using now fetch to retrieve example files
2019-04-16 11:21:05 +02:00

110 lines
3.0 KiB
JavaScript

/*
Final Fantasy Explorers for HTML5 Save Editor v20180708
by Marc Robledo 2018
*/
SavegameEditor={
Name:'Final Fantasy Explorers',
Filename:'game0',
Offsets:{
GIL:0x031424,
CP:0x03142c,
ITEMS:0x023140,
MATERIALS:0x02ff98,
ATMALITHS:0x030128
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize===201816)
},
/* preload function */
preload:function(){
setNumericRange('gil', 0, 9999999);
setNumericRange('cp', 0, 9999999);
createInventoryTable('material', MATERIALS);
createInventoryTable('atmalith', ATMALITHS);
createInventoryTable('item', ITEMS);
},
/* load function */
load:function(){
tempFile.littleEndian=true;
tempFile.fileName='game0';
setValue('gil', tempFile.readU24(this.Offsets.GIL), 0, 9999999);
setValue('cp', tempFile.readU24(this.Offsets.CP), 0, 9999999);
readInventoryFromTable('material', MATERIALS, this.Offsets.MATERIALS);
readInventoryFromTable('atmalith', ATMALITHS, this.Offsets.ATMALITHS);
readInventoryFromTable('item', ITEMS, this.Offsets.ITEMS);
},
/* save function */
save:function(){
tempFile.writeU24(this.Offsets.GIL, getValue('gil'));
tempFile.writeU24(this.Offsets.CP, getValue('cp'));
writeToInventory('material', MATERIALS, this.Offsets.MATERIALS);
writeToInventory('atmalith', ATMALITHS, this.Offsets.ATMALITHS);
writeToInventory('item', ITEMS, this.Offsets.ITEMS);
}
}
function readInventoryFromTable(container, table, offset){
for(var i=0; i<table.length; i++){
setValue(container+table[i][0], tempFile.readU8(offset+table[i][0]));
checkQuantity(getField(container+table[i][0]));
}
}
function writeToInventory(container, table, offset){
for(var i=0; i<table.length; i++){
tempFile.writeU8(offset+table[i][0], getValue(container+table[i][0]))
}
}
function createInventoryTable(container, table){
for(var i=0; i<table.length; i++){
var input=inputNumber(container+table[i][0], 0, 99);
input.addEventListener('change', checkQuantityEvent, false);
get('container-'+container+'s').appendChild(row(
[11,1],
label('number-'+container+table[i][0], '<span class="fficon fficon'+table[i][1]+'"></span> '+table[i][2]),
input
));
}
}
function checkQuantity(el){
el.parentElement.parentElement.children[0].children[0].style.opacity=parseInt(el.value)?1:.2;
}
function checkQuantityEvent(){
return checkQuantity(this);
}
/*
function getWeaponName(i){return WEAPONS[i][2]}
function getWeaponType(i){return WEAPONS[i][0]}
function getWeaponPassiveTrait(i){return WEAPONS[i][1]}
function getArmorName(i){return ARMOR[i][1]}
function getArmorType(i){return ARMOR[i][0]}
function Weapon(offset){
this.offset=offset;
this.hash=tempFile.readInt(offset);
this.pAttack=tempFile.readShort(offset+4);
this.mAttack=tempFile.readShort(offset+6);
this.pAccuracy=tempFile.readShort(offset+8);
this.mAccuracy=tempFile.readShort(offset+10);
this.mRecovery=tempFile.readShort(offset+12);
this.trait=tempFile.readInt(offset+14);
this.traitValue=tempFile.readInt(offset+18);
}*/