0
0
mirror of https://github.com/marcrobledo/savegame-editors.git synced 2025-04-24 16:35:10 +00:00

fixes in botw editor+new features

This commit is contained in:
Marc Robledo 2017-05-14 12:40:27 +02:00
parent 91d2b7f5b2
commit 0ef8baa98c
7 changed files with 43011 additions and 42719 deletions

BIN
zelda-botw/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -4,14 +4,15 @@
<title>Savegame Editor &ndash; The legend of Zelda: Breath of the wild</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for The legend of Zelda: Breath of the wild. It can edit: items, weapon durability, modifiers and more!"/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, wii u, zelda, breath of the wild, botw, weapon, durability, modifier, horse, dlc, amiibo"/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, wii u, zelda, breath of the wild, botw, weapon, durability, modifier, horse, epona, korok, unlocker, dlc, amiibo"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<link rel="shortcut icon" href="../savegame-editor.png"/>
<link rel="shortcut icon" href="./favicon.png"/>
<link type="text/css" rel="stylesheet" href="../savegame-editor.css" media="all"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./zelda-botw.js"></script>
<script type="text/javascript" src="./zelda-botw.data.js"></script>
<script type="text/javascript" src="./zelda-botw.koroks.js"></script>
<script type="text/javascript" src="./zelda-botw.completionism.js"></script>
<!-- <script type="text/javascript" src="./zelda-botw.hashes.js"></script> -->
</head>
<body>
@ -19,7 +20,7 @@
<div id="header">
<div id="header-top">
<div class="row wrapper padding-vertical">
<h1 class="six columns text-left"><img src="../favicon.png" /> Savegame Editor <small>for The legend of Zelda: BOTW</small></h1>
<h1 class="six columns text-left"><img src="./favicon.png" /> Savegame Editor <small>for The legend of Zelda: BOTW</small></h1>
<div class="six columns text-right header-buttons">
by <a href="/" class="author">Marc Robledo</a>
<a href="https://github.com/marcrobledo/savegame-editors/tree/master/zelda-botw" target="_blank" class="button"><span class="sprite github"></span> See on GitHub</a>
@ -48,19 +49,12 @@
<h3 class="border-red">Rupees</h3>
<div id="card-rupees">
<div class="row">
<div class="nine columns"><label for="number-rupees">Rupees</label></div>
<div class="three columns"><input id="number-rupees" type="text" /></div>
<div class="ten columns"><label for="number-rupees">Rupees</label></div>
<div class="two columns"><input id="number-rupees" class="full-width" type="text" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="number-mons">Mons</label></div>
<div class="three columns"><input id="number-mons" type="text" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="number-koroks">Korok counter</label></div>
<div class="three columns">
<input type="text" id="number-koroks" disabled />
<button onclick="unlockKoroks()">Unlock all</button>
</div>
<div class="ten columns"><label for="number-mons">Mons</label></div>
<div class="two columns"><input id="number-mons" class="full-width" type="text" /></div>
</div>
</div>
@ -74,7 +68,22 @@
<div class="text-center"><button class="with-icon icon10" onclick="SavegameEditor.editHorse(2)">Edit horse 2</button></div>
<div class="text-center"><button class="with-icon icon10" onclick="SavegameEditor.editHorse(3)">Edit horse 3</button></div>
<div class="text-center"><button class="with-icon icon10" onclick="SavegameEditor.editHorse(4)">Edit horse 4</button></div>
<div class="text-center"><button class="with-icon icon6" onclick="SavegameEditor.cheatEpona()">Set untammed horse to Epona</button></div>
<div class="text-center"><button class="with-icon icon10" onclick="SavegameEditor.editHorse(5)">Edit untamed horse</button></div>
<!-- COMPLETIONISM -->
<h3 class="border-green">Completionism</h3>
<div class="row">
<div class="nine columns"><label for="number-koroks">Korok counter</label></div>
<div class="three columns">
<input type="text" id="number-koroks" disabled />
<button onclick="unlockKoroks()">Unlock all</button>
</div>
</div>
<div class="row">
<div class="nine columns">Missing locations</div>
<div class="three columns"><button onclick="searchMissingLocations()">See</button></div>
</div>
<ul id="ul-locations"></ul>
</div>
@ -84,37 +93,36 @@
<div class="text-center">
<select id="select-item"></select>
</div>
<div class="buttons">
<button onclick="SavegameEditor.editItem2(currentEditingItem, getValue('item'));MarcDialogs.close();">Change item</button>
</div>
</div>
<div id="dialog-modifier" class="dialog">
<div class="row">
<div class="four columns"><label for="select-modifier">Modifier flag</label></div>
<div class="eight columns"><select id="select-modifier"></select></div>
</div>
<div class="row">
<div class="four columns"><label for="number-modifier-value">Value</label></div>
<div class="eight columns"><input type="text" id="number-modifier-value" /></div>
<div id="row-modifier">
<hr/>
<div class="row">
<div class="four columns"><label for="select-modifier">Modifier flag</label></div>
<div class="eight columns"><select id="select-modifier"></select></div>
</div>
<div class="row">
<div class="four columns"><label for="number-modifier-value">Value</label></div>
<div class="eight columns"><input type="text" id="number-modifier-value" /></div>
</div>
</div>
<div class="buttons">
<button onclick="SavegameEditor.editModifier2(currentEditingItem.type, currentEditingItem.order, getValue('modifier'), getValue('modifier-value'));MarcDialogs.close();">Save changes</button>
<button onclick="SavegameEditor.editItem2(currentEditingItem, getValue('item'));if(currentEditingItem2)SavegameEditor.editModifier2(currentEditingItem2.type, currentEditingItem2.order, getValue('modifier'), getValue('modifier-value'));MarcDialogs.close();">Save chages</button>
</div>
</div>
<div id="dialog-horse" class="dialog">
<div class="row">
<div class="four columns"><label for="input-horse-name">Name</label></div>
<div class="eight columns"><input type="text" id="input-horse-name" /></div>
</div>
<div class="row">
<div class="four columns"><label for="select-horse-saddles">Saddles</label></div>
<div class="eight columns"><select id="select-horse-saddles"></select></div>
</div>
<div class="row">
<div class="four columns"><label for="select-horse-reins">Reins</label></div>
<div class="eight columns"><select id="select-horse-reins"></select></div>
<div id="row-tamed-horse">
<div class="row">
<div class="four columns"><label for="input-horse-name">Name</label></div>
<div class="eight columns"><input type="text" id="input-horse-name" /></div>
</div>
<div class="row">
<div class="four columns"><label for="select-horse-saddles">Saddles</label></div>
<div class="eight columns"><select id="select-horse-saddles"></select></div>
</div>
<div class="row">
<div class="four columns"><label for="select-horse-reins">Reins</label></div>
<div class="eight columns"><select id="select-horse-reins"></select></div>
</div>
</div>
<div class="row">
<div class="four columns"><label for="select-horse-type">Type</label></div>
@ -125,7 +133,5 @@
</div>
</div>
</body>
</html>

View File

@ -1,13 +1,13 @@
CACHE MANIFEST
# last update 2017-05-11
# last update 2017-05-14
#CACHE:
index.html
zelda-botw.js
zelda-botw.data.js
zelda-botw.koroks.js
zelda-botw.completionism.js
favicon.png
../savegame-editor.css
../savegame-editor.js
../favicon.png
# force these files to be loaded in network
NETWORK:

View File

@ -1,9 +1,10 @@
/*
The legend of Zelda: Breath of the wild Savegame Editor - Korok Module - v20170511
The legend of Zelda: Breath of the wild Savegame Editor - Completionism Module - v20170514
by Marc Robledo 2017
korok hashes were datamined by MrCheeze:
data datamined by MrCheeze:
https://raw.githubusercontent.com/MrCheeze/botw-tools/master/gamedata.json
https://github.com/MrCheeze/botw-waypoint-map/blob/gh-pages/map_locations.js
*/
@ -124,16 +125,251 @@ var HASHES_KOROKS=[ /* TYPE: boolean - IDS: Npc_HiddenKorokGround, Npc_HiddenKor
];
var LOCATIONS=[
0xbd432e2b,"Deya Village Ruins",
0x4c2a4c64,"Akkala Span",
0xc982b698,"Akkala Parade Ground Ruins",
0xceec3555,"Akkala Citadel Ruins",
0x5ccee1d1,"Akkala Bridge Ruins",
0xe03f8aa7,"Akkala Ancient Tech Lab",
0xba8fa3ec,"Yiga Clan Hideout",
0xab69ff8d,"Big Twin Bridge",
0x852308c6,"Ancient Tree Stump",
0x1855d45c,"Spring of Courage",
0x7b7427f3,"Warbler's Nest",
0x73fcf871,"Sacred Ground Ruins",
0xf4b71776,"Exchange Ruins",
0xd9393ccd,"Goponga Village Ruins",
0x95db306c,"Eventide Island",
0x629dcd44,"Korok Forest",
0xf70a4075,"Coliseum Ruins",
0x237a4d8a,"Foothill Stable",
0xba52d9e9,"Maw of Death Mountain",
0x2a87cd61,"Luto's Crossing",
0x1e4224f7,"Dragon Bone Mire",
0xd3d4fe4d,"East Reservoir Lake",
0x4edc4932,"East Gerudo Ruins",
0x90efa510,"East Post Ruins",
0x93c23bdf,"Castle Town Prison",
0x3dee43cc,"Eagus Bridge",
0xda0163d5,"Dueling Peaks Stable",
0xad065343,"Lakeside Stable",
0x340f02f9,"Highland Stable",
0x382af36e,"Faron Woods",
0x8d8982b9,"Goflam's Secret Hot Spring",
0xdbe04653,"Floria Bridge",
0x5b3d301c,"Floret Sandbar",
0x42d8f1bb,"Woodland Stable",
0x3046920f,"Gatepost Town Ruins",
0xc17f8588,"Pondo's Lodge",
0xdcbf49ee,"Tanagar Canyon Course",
0x37d054d1,"Gut Check Rock",
0xede11b4b,"Footrace Check-In",
0x13df032f,"Selmie's Spot",
0xb444af7f,"Mounted Archery Camp",
0xb07ff371,"Sand-Seal Rally",
0x86377b7e,"Shadow Hamlet Ruins",
0xc7d9e847,"Kolomo Garrison Ruins",
0x7e6ac510,"Gerudo Town",
0x11ca12b8,"Gerudo Canyon Pass",
0x3cb06c8d,"Gerudo Desert Gateway",
0x8470bba5,"Gerudo Great Skeleton",
0x84b55727,"Gerudo Canyon Stable",
0xeb962ee5,"Goron City",
0x6b3090c4,"Stolock Bridge",
0xf105fc93,"Guchini Plain Barrows",
0x61ecf5d8,"Owlan Bridge",
0xb91ec523,"Hateno Village",
0x5b065726,"Fort Hateno",
0x704a8cee,"Hateno Ancient Tech Lab",
0x3ba1e6cd,"Hebra Great Skeleton",
0xb46d4340,"Hebra Trailhead Lodge",
0xa4e25e17,"Great Plateau",
0x506d96b6,"Bridge of Hylia",
0xcb844395,"Hyrule Castle",
0x47cf0ce2,"Hyrule Castle Town Ruins",
0xf579c518,"Sanctum",
0x827ef58e,"Second Gatehouse",
0x1b77a434,"First Gatehouse",
0xfb739f5d,"Observation Room",
0x8c74afcb,"Dining Hall",
0xf8e1b0b6,"East Passage",
0x8fe68020,"West Passage",
0x157dfe71,"Guards' Chamber",
0x627acee7,"Library",
0x8b196bd2,"Lockup",
0x12103a68,"Princess Zelda's Room",
0x65170afe,"Docks",
0xf5a8176f,"Princess Zelda's Study",
0x82af27f9,"King's Study",
0xefc46622,"Central Square",
0x30dce738,"Outskirt Stable",
0x05768b36,"Hyrule Garrison Ruins",
0x29693cd5,"Hyrule Kingdom",
0xc19b4064,"Royal Ancient Lab Ruins",
0x96fb7e0b,"Hyrule Forest Park",
0x5c4d1750,"Military Training Camp",
0x97185f06,"Hyrule Cathedral",
0x765ae3fd,"Castle Town Watchtower",
0xd3635047,"Water Reservoir",
0xcab23d6f,"Serenne Stable",
0x2e573fa2,"Northern Icehouse",
0x0ea2f805,"Rebonae Bridge",
0x9aa32eca,"Proxim Bridge",
0xd8b7a1e2,"Kakariko Village",
0x384fc3a6,"Sage Temple Ruins",
0x1e278d65,"Forgotten Temple",
0xc1d8c92c,"Sherfin's Secret Hot Spring",
0xb58d951c,"Kakariko Bridge",
0x94e41520,"Sturnida Secret Hot Spring",
0xcb7f8efb,"Aquame Bridge",
0x64556cdf,"Lanayru Road - East Gate",
0x34af6c3e,"Lanayru Road - West Gate",
0xd3acb37d,"Jeddo Bridge",
0x658ed94c,"Thundra Plateau",
0x791c7d90,"Little Twin Bridge",
0x9f1ff60d,"Lomei Labyrinth Island",
0x5fb1238c,"Lost Woods",
0x40f556e8,"Hebra Tower",
0xd9fc0752,"Tabantha Tower",
0xaefb37c4,"Gerudo Tower",
0x309fa267,"Wasteland Tower",
0x479892f1,"Woodland Tower",
0xde91c34b,"Central Tower",
0xa996f3dd,"Great Plateau Tower",
0x3929ee4c,"Dueling Peaks Tower",
0x4e2ededa,"Lake Tower",
0x2ee9573f,"Eldin Tower",
0x59ee67a9,"Akkala Tower",
0xc0e73613,"Lanayru Tower",
0xb7e00685,"Hateno Tower",
0x29849326,"Faron Tower",
0x5e83a3b0,"Ridgeland Tower",
0x9510e305,"Malanya Spring",
0x7cf7d4ad,"Maritta Exchange Ruins",
0xa89c3e9d,"Moat Bridge",
0x33dedaf1,"Sokkala Bridge",
0x894e01b7,"East Sokkala Bridge",
0x7457367f,"West Sokkala Bridge",
0xfae08218,"Abandoned North Mine",
0x8367f7f5,"South Lomei Labyrinth",
0x7939d480,"Gleeok Bridge",
0x5c907154,"Wetland Stable",
0x0fa7b37f,"Kara Kara Bazaar",
0x1a1649a5,"Bridge of Eldin",
0xd865cfa4,"Eldin Great Skeleton",
0xf1cab1a7,"Helmhead Bridge",
0x6360e32f,"Outpost Ruins",
0x1cc23004,"Spring of Power",
0x18f92f82,"Divine Beast Vah Naboris",
0x8ad5ef4a,"Divine Beast Vah Rudania",
0x66336893,"Divine Beast Vah Ruta",
0xf300b27b,"Divine Beast Vah Medoh",
0xd451777c,"Oren Bridge",
0xa262d614,"Rito Village",
0x79431cd8,"Rito Stable",
0xa313005e,"Riverside Stable",
0x8f067283,"Mabe Village Ruins",
0x80f9fd06,"North Lomei Labyrinth",
0x71a002e7,"Sarjon Bridge",
0xe12f0afe,"Horwell Bridge",
0x4e798832,"Lanayru Promenade",
0x57c1e588,"Orsedd Bridge",
0x40060961,"Rauru Settlement Ruins",
0xa31a50aa,"Statue of the Eighth Heroine",
0x8ae6edd7,"Sanidin Park Ruins",
0x46f6e384,"Manhala Bridge",
0xd8e21026,"Arbiter's Grounds",
0xd8f19a2a,"Southern Mine",
0xc409b5e2,"Shrine of Resurrection",
0x0fe7e6ab,"Ancient Columns",
0x94ddf95c,"Inogo Bridge",
0x2fa52b7e,"Tabantha Great Bridge",
0x62fffa64,"Tabantha Bridge Stable",
0x8c8e9401,"Gisa Crater",
0xed1341fd,"Snowfield Stable",
0x99277060,"Tabantha Village Ruins",
0x16b9c598,"East Akkala Stable",
0xe4171cbe,"South Akkala Stable",
0x1a2cadf2,"Thims Bridge",
0x4695d38c,"Lurelin Village",
0x095288b6,"Temple of Time",
0x6c034b60,"Boneyard Bridge",
0x8b62694a,"Carok Bridge",
0xd78f2eac,"Horse God Bridge",
0x26daeef2,"Tarrey Town",
0x3187bba5,"UMiiVillageShopBougu",
0x3b930e2c,"UMiiVillageShopJewel",
0xd2180ce8,"UMiiVillageShopYadoya",
0x29ad3d74,"UMiiVillageShopYorozu",
0x1f4bc09c,"Flight Range",
0xbfdd2802,"Great Fairy Fountain",
0x298b03fe,"Great Fairy Fountain",
0x5e8c3368,"Great Fairy Fountain",
0xc0e8a6cb,"Great Fairy Fountain",
0x3f3d559e,"Moor Garrison Ruins",
0xff6f7ae4,"Zora's Domain",
0xea6e852b,"Spring of Wisdom",
0x2cd6f581,"Digdogg Suspension Bridge",
0x5c7246c7,"Palmorae Ruins",
0x4a46741a,"Zonai Ruins",
/* unused? */
/*0x01459d59,"*unused?* AnoleTunnel",
0x763a58d2,"*unused?* BlindForest",
0xa8c3e430,"*unused?* DragonAltar",
0x25c12f63,"*unused?* DungeonMush",
0xe27ea0e4,"*unused?* FirstColony",
0x8a36f4dd,"*unused?* FrozenCave",
0xb5bacc44,"*unused?* Hatago001",
0xfaab284d,"*unused?* HebraBottomRemains",
0xe66f047b,"*unused?* HebraRemains",
0xfc1e5b44,"*unused?* HyruleCastle_Room_4",
0x493163ed,"*unused?* IceLake",
0xd8ce1bad,"*unused?* LakeFloria",
0xb106e3d2,"*unused?* LakeHylia",*/
];
function searchMissingLocations(){
empty('ul-locations');
var missingLocations=0;
for(var i=0;i<LOCATIONS.length; i+=2){
var offset=SavegameEditor._searchHash(LOCATIONS[i]);
if(offset && !tempFile.readInt(offset+4)){
var li=document.createElement('li');
li.innerHTML+=(LOCATIONS[i+1]);
get('ul-locations').appendChild(li);
missingLocations++;
}
}
var li=document.createElement('li');
li.innerHTML+='<hr/>missing locations: '+missingLocations;
if(missingLocations){
li.innerHTML+='<br/><a href=\"http://www.zeldadungeon.net/breath-of-the-wild-interactive-map/\" target=\"_blank\">search locations</a>';
get('ul-locations').appendChild(li);
}else{
MarcDialogs.alert('You have discovered all locations.');
}
}
function unlockKoroks(){
var unlockedKoroks=0;
for(var i=0;i<HASHES_KOROKS.length; i++){
var offset=SavegameEditor._searchHeader(HASHES_KOROKS[i]);
if(offset && !tempFile.readInt(offset)){
tempFile.writeInt(offset, 1);
setValue('koroks', getValue('koroks')+1);
var offset=SavegameEditor._searchHash(HASHES_KOROKS[i]);
if(offset && !tempFile.readInt(offset+4)){
tempFile.writeInt(offset+4, 1);
unlockedKoroks++;
}
}
setValue('koroks', 900);
var offset=SavegameEditor._searchHash(0x64622a86); //HiddenKorok_Complete
tempFile.writeInt(offset+4, 1);
//search korok seeds in inventory
for(var i=0; i<SavegameEditor.Constants.MAX_ITEMS; i++){

View File

@ -1041,13 +1041,13 @@ GameRomHorseSaddle_05:"Extravagant Saddle",
GameRomHorse00S:"Donkey",
GameRomHorseNushi:"Lord of the Mountain",
WolfLink:"Wolf Link",
GameRomHorseEpona:"Epona",
GameRomHorseBone:"Stalhorse",
Animal_Bear_B:"Grizzlemaw Bear",
Animal_Bear_A:"Honeyvore Bear",
GameRomHorse00L:"Giant Horse",
GameRomHorseZelda:"Royal White Stallion",
Animal_Bear_B:"Grizzlemaw Bear",
Animal_Bear_A:"Honeyvore Bear",
WolfLink:"Wolf Link",
Obj_HeartUtuwa_A_01:"Heart Container",
Obj_StaminaUtuwa_A_01:"Stamina Vessel",
Obj_Mineral_A_01:"Mineral Deposit",

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,15 @@
/*
The legend of Zelda: Breath of the wild v20170508
The legend of Zelda: Breath of the wild v20170514
by Marc Robledo 2017
*/
var currentEditingItem=0;
var currentEditingItem2=0;
SavegameEditor={
Name:'The legend of Zelda: Breath of the wild',
Filename:'game_data.sav',
Version:20170514,
/* Constants */
Constants:{
@ -17,7 +20,7 @@ SavegameEditor={
/* Offsets */
OffsetsAll:{
FILESIZE: [896976, 897160, 897112],
/* header v1.0 v1.1 v1.2 */
/* hash v1.0 v1.1 v1.2 */
RUPEES: [0x23149bf8, 0x00e0a0, 0x00e110, 0x00e110],
MONS: [0xce7afed3, 0x0bc480, 0x0bc558, 0x0bc538],
ITEMS: [0x5f283289, 0x052828, 0x0528d8, 0x0528c0],
@ -43,11 +46,16 @@ SavegameEditor={
/* private functions */
_searchHeader:function(hdr){
for(var i=0x14; i<tempFile.fileSize; i+=8){
if(hdr===tempFile.readInt(i))
return i+4;
}
_searchHash:function(hash){
for(var i=0x0c; i<tempFile.fileSize; i+=8)
if(hash===tempFile.readInt(i))
return i;
return false;
},
_readFromHash:function(hash){
var offset=this._searchHash(hash);
if(typeof offset === 'number')
return tempFile.readInt(offset+4);
return false;
},
_getOffsets(v){
@ -59,7 +67,7 @@ SavegameEditor={
}else{ /* unknown version */
var textarea=document.createElement('textarea');
for(prop in this.OffsetsAll){
var offset=this._searchHeader(this.OffsetsAll[prop][0]);
var offset=this._searchHash(this.OffsetsAll[prop][0]);
if(offset){
textarea.value+=prop+':0x'+(offset+4).toString(16)+',\n';
this.Offsets[prop]=offset+4;
@ -149,7 +157,62 @@ SavegameEditor={
editItem:function(i){
currentEditingItem=i;
document.getElementById('select-item').value=this._loadItemName(i);
currentEditingItem2=false;
/* check if has modifier (weapons/bows/shields) */
if(i<60){
var itemName=this._loadItemName(i);
var itemCat=this._getItemCategory(itemName);
if(
(itemCat==='weapons') ||
(itemCat==='bows' && !(itemName.endsWith('Arrow') || itemName.endsWith('Arrow_A'))) ||
(itemCat==='shields')
){
var catStartsAt=0;
if(itemCat==='bows' || itemCat==='shields'){
for(var j=0; j<40; j++){ /* 20 weapons + 14 bows + 6 arrows */
if(this._getItemCategory(this._loadItemName(j))===itemCat){
catStartsAt=j;
break;
}
}
}
var pos=i-catStartsAt;
if(
(itemCat==='weapons' && pos<20) ||
(itemCat==='bows' && pos<16) ||
(itemCat==='shields' && pos<20)
){
currentEditingItem2={type:itemCat,order:pos};
var offset1=this._getModifierOffset1(itemCat);
var offset2=this._getModifierOffset2(itemCat);
getField('modifier').children[0].value=0xffffffff;
getField('modifier').children[0].innerHTML='unknown';
var modifier=tempFile.readInt(offset1+pos*0x08);
setValue('modifier', modifier);
setValue('modifier-value', tempFile.readInt(offset2+pos*0x08));
getField('modifier').children[0].value=modifier;
getField('modifier').children[0].innerHTML='unknown 0x'+modifier.toString(16);
if(getValue('modifier')==='')
setValue('modifier', modifier);
}
}
}
if(currentEditingItem2){
show('row-modifier');
}else{
hide('row-modifier');
}
MarcDialogs.open('item');
},
editItem2:function(i,nameId){
var oldCat=this._getItemCategory(this._loadItemName(i));
@ -181,27 +244,7 @@ SavegameEditor={
else
return this.Offsets.MOD_WEAPON_VALUES;
},
editModifier:function(type,i){
currentEditingItem={type:type,order:i};
var offset1=this._getModifierOffset1(type);
var offset2=this._getModifierOffset2(type);
getField('modifier').children[0].value=0xffffffff;
getField('modifier').children[0].innerHTML='unknown';
var modifier=tempFile.readInt(offset1+i*0x08);
setValue('modifier', modifier);
setValue('modifier-value', tempFile.readInt(offset2+i*0x08));
getField('modifier').children[0].value=modifier;
getField('modifier').children[0].innerHTML='unknown 0x'+modifier.toString(16);
if(getValue('modifier')==='')
setValue('modifier', modifier);
MarcDialogs.open('modifier');
},
editModifier2:function(type,i,modifier,val){
tempFile.writeInt(this._getModifierOffset1(type)+i*0x08, modifier);
tempFile.writeInt(this._getModifierOffset2(type)+i*0x08, val);
@ -209,35 +252,39 @@ SavegameEditor={
editHorse:function(i){
currentEditingItem=i;
setValue('horse-name',this._readString(this.Offsets.HORSE_NAMES+this.Constants.STRING_SIZE*i));
setValue('horse-saddles',this._readString(this.Offsets.HORSE_SADDLES+this.Constants.STRING_SIZE*i));
setValue('horse-reins',this._readString(this.Offsets.HORSE_REINS+this.Constants.STRING_SIZE*i));
if(currentEditingItem==5){ /* untamed horse */
hide('row-tamed-horse');
if(!this._readString(this.Offsets.HORSE_TYPES+this.Constants.STRING_SIZE*5).startsWith('GameRomHorse')){
MarcDialogs.alert('Error: this will only work if your savegame has Link on an untamed horse.');
return false;
}
}else{
show('row-tamed-horse');
setValue('horse-name',this._readString(this.Offsets.HORSE_NAMES+this.Constants.STRING_SIZE*i));
setValue('horse-saddles',this._readString(this.Offsets.HORSE_SADDLES+this.Constants.STRING_SIZE*i));
setValue('horse-reins',this._readString(this.Offsets.HORSE_REINS+this.Constants.STRING_SIZE*i));
}
setValue('horse-type',this._readString(this.Offsets.HORSE_TYPES+this.Constants.STRING_SIZE*i));
MarcDialogs.open('horse');
},
editHorse2:function(i,name,saddles,reins,type){
this._writeString(this.Offsets.HORSE_NAMES+this.Constants.STRING_SIZE*i, getValue('horse-name'));
this._writeString(this.Offsets.HORSE_SADDLES+this.Constants.STRING_SIZE*i, getValue('horse-saddles'));
this._writeString(this.Offsets.HORSE_REINS+this.Constants.STRING_SIZE*i, getValue('horse-reins'));
if(currentEditingItem<5){
this._writeString(this.Offsets.HORSE_NAMES+this.Constants.STRING_SIZE*i, getValue('horse-name'));
this._writeString(this.Offsets.HORSE_SADDLES+this.Constants.STRING_SIZE*i, getValue('horse-saddles'));
this._writeString(this.Offsets.HORSE_REINS+this.Constants.STRING_SIZE*i, getValue('horse-reins'));
}
this._writeString(this.Offsets.HORSE_TYPES+this.Constants.STRING_SIZE*i, getValue('horse-type'));
if(getValue('horse-type')==='GameRomHorse00L'){
this._writeString(this.Offsets.HORSE_MANES+this.Constants.STRING_SIZE*i, 'Horse_Link_Mane_00L');
}
},
cheatEpona:function(i){
if(this._readString(this.Offsets.HORSE_TYPES+this.Constants.STRING_SIZE*5).startsWith('GameRomHorse')){
this._writeString(this.Offsets.HORSE_TYPES+this.Constants.STRING_SIZE*5, 'GameRomHorseEpona');
MarcDialogs.alert('Untammed horse has been changed to Epona. Go to any stable to get it legitly.');
}else{
MarcDialogs.alert('Error: this will only work if your savegame has Link on an untammed horse.');
}
},
_arrayToSelectOpts:function(arr){
var arr2=[];
for(var i=0; i<arr.length; i++){
arr2.push({name:arr[i], value:arr[i]});
var name=BOTW_Data.Translations[6].items[arr[i]] || arr[i];
arr2.push({name:name, value:arr[i]});
}
return arr2;
},
@ -316,10 +363,12 @@ SavegameEditor={
}
/* prepare editor */
setValue('rupees', tempFile.readInt(this.Offsets.RUPEES));
setValue('mons', tempFile.readInt(this.Offsets.MONS));
setValue('koroks', tempFile.readInt(this.Offsets.KOROK_SEED_COUNTER));
empty('ul-locations');
/* items */
@ -341,48 +390,6 @@ SavegameEditor={
this._createItemRow(i)
);
}
/* modifier buttons */
var editModifierFunc=function(){SavegameEditor.editModifier(this.weaponType,this.weaponOrder);}
var sortedWeapons=0;
var sortedBows=0;
var sortedShields=0;
for(var i=0; i<60; i++){
var itemName=this._loadItemName(i);
var cat=this._getItemCategory(itemName);
if(cat==='weapons'){
sortedWeapons++;
}else if(cat==='bows' && !(itemName.endsWith('Arrow') || itemName.endsWith('Arrow_A'))){
sortedBows++;
}else if(cat==='shields'){
sortedShields++;
}
}
for(var i=0; i<sortedWeapons; i++){
var b=button('', 'colored transparent with-icon icon1', editModifierFunc);
b.weaponType='weapons';
b.weaponOrder=i;
document.getElementById('card-weapons').children[i+1].children[0].appendChild(b);
}
for(var i=0; i<sortedBows; i++){
var b=button('', 'colored transparent with-icon icon1', editModifierFunc);
b.weaponType='bows';
b.weaponOrder=i;
document.getElementById('card-bows').children[i+1].children[0].appendChild(b);
}
for(var i=0; i<sortedShields; i++){
var b=button('', 'colored transparent with-icon icon1', editModifierFunc);
b.weaponType='shields';
b.weaponOrder=i;
document.getElementById('card-shields').children[i+1].children[0].appendChild(b);
}
/* koroks */
if(typeof korokDebug !== 'undefined'){
korokDebug();
}
},
/* save function */
@ -391,6 +398,8 @@ SavegameEditor={
tempFile.writeInt(this.Offsets.RUPEES, getValue('rupees'));
tempFile.writeInt(this.Offsets.MONS, getValue('mons'));
tempFile.writeInt(this.Offsets.KOROK_SEED_COUNTER, getValue('koroks'));
/* ITEMS */
for(var i=0; i<this.Constants.MAX_ITEMS; i++){
if(document.getElementById('number-item'+i))