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:
parent
91d2b7f5b2
commit
0ef8baa98c
BIN
zelda-botw/favicon.png
Normal file
BIN
zelda-botw/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
@ -4,14 +4,15 @@
|
||||
<title>Savegame Editor – 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>
|
||||
|
@ -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:
|
||||
|
@ -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++){
|
@ -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
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user