mirror of
https://github.com/marcrobledo/savegame-editors.git
synced 2025-04-24 16:35:10 +00:00
* 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
110 lines
3.0 KiB
JavaScript
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);
|
|
}*/ |