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

added standalone editors

This commit is contained in:
Marc Robledo 2017-07-07 00:04:20 +02:00
parent c65c6db98f
commit f9a9b86c40
49 changed files with 3005 additions and 0 deletions

BIN
hyrule-warriors/APP.BIN Normal file

Binary file not shown.

View File

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Hyrule Warriors</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Hyrule Warriors. It can edit values for your apple and materials."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, wii u, hyrule warriors, materials, experience, weapons"/>
<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 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="./hyrule-warriors.js"></script>
</head>
<body>
<!-- HEADER -->
<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 Hyrule Warriors</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/hyrule-warriors" target="_blank" class="button"><span class="sprite github"></span> See on GitHub</a>
<a href="https://www.paypal.me/marcrobledo/5" target="_blank" rel="nofollow" class="donate button"><span class="sprite heart"></span> Donate</a>
</div>
</div>
</div>
<div id="toolbar" class="hidden padding-vertical">
<div class="row wrapper">
<div class="twelve columns text-center">
<button class="button with-icon icon3" onclick="closeFileConfirm()">Close file</button>
<button class="button colored blue with-icon icon9" onclick="saveChanges()">Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- MATERIALS -->
<h3 class="border-red">Materials</h3>
<div class="row" id="row-materials">
<div class="three columns"><label for="number-rupees">Rupees</label></div>
<div class="one columns"><input id="number-rupees" type="text" /></div>
</div>
<div class="text-center">
<button class="button" id="button-discover-materials" onclick="SavegameEditor.discoverMaterials()">Discover all materials</button>
</div>
<!-- CHARACTERS -->
<h3 class="border-green">Characters</h3>
<div class="row" id="row-characters">
<div class="three columns">&nbsp;</div>
<div class="three columns">Damage</div>
<div class="three columns">Level</div>
<div class="three columns">Experience</div>
</div>
<!-- MAPS -->
<h3 class="border-orange">Maps</h3>
<label for="select-map">Map</label> <span id="container-select-map"></span>
<hr/>
<div id="maps"></div>
<!-- WEAPONS -->
<h3 class="border-red">Weapons</h3>
<label for="select-weapon">Weapon slot</label>
<span id="container-select-weapon"></span>
<span class="bg-light-gray round" style="padding: 3px 12px">Approximate power: <span id="span-weapon-power"></span></span>
<hr/>
<div class="row">
<div class="three columns">Weapon type</div><div class="three columns" id="container-weapon-type"></div>
<div class="three columns">Weapon ID</div><div class="three columns" id="container-weapon-id"></div>
<div class="three columns">Base Power</div><div class="three columns" id="container-weapon-base-power"></div>
<div class="three columns">Stars</div><div class="three columns" id="container-weapon-stars"></div>
</div>
<hr/>
<div id="weapons-skills-container"></div>
</div>
</body>
</html>

BIN
hyrule-warriors/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -0,0 +1,694 @@
/*
Hyrule Warriors v20161101
by Marc Robledo 2016
*/
/* reference: http://gbatemp.net/threads/hyrule-warriors-save-editing.425943/ */
var currentWeapon=0;
var weaponFilters=[
null
];
SavegameEditor={
Name:'Hyrule Warriors',
Filename:'APP.BIN',
/* Constants */
Constants:{
CHARACTER_SIZE: 0x38,
CHARACTER_LEVEL_OFFSET:0x07,
CHARACTER_EXP_OFFSET:0x08,
CHARACTER_PACKS:[
{
Offset:0x8c184,
Names:[
'Link',
'Zelda',
'Sheik',
'Impa',
'Ganondorf',
'Darunia',
'Ruto',
'Agitha',
'Midna',
'Fi',
'Girahim',
'Zant',
null,
'Lana'
]
},{
Offset:0x8cb24,
Names:[
'Cia',
'Volga',
'Wizzro',
'Twili Midna',
'Young Link',
'Tingle',
'Ganon',
'Cucco',
'Linkle',
'Skull Kid',
'Toon Link',
'Tetra',
'King Daphnes',
'Medli',
'Marin',
'Toon Zelda',
'Ravio',
'Yuga'
]
}
],
MAPS:[
{
Title:'Adventure Map',
Offset:0x141e8,
Items:[
'Compass',
'Bombs',
'Candle',
'Ladder',
'Power Bracelet',
'Water Bombs',
'Digging Mitts',
'Ice Arrows',
'Raft',
'Hookshot',
'Recorder',
'Goddess\'s Harp'
]
},{
Title:'Master Quest Map',
Offset: 0x19240,
Items:[
'Compass',
'Bombs',
'Candle',
'Ladder',
'Power Bracelet',
'Water Bombs',
'Digging Mitts',
'Ice Arrows',
'Raft',
'Hookshot',
'Recorder',
'Goddess\'s Harp'
]
},{
Title:'Twilight Map',
Offset: 0x1Ba6c,
Items:[
'Compass',
'Bombs',
null,
null,
null,
'Water Bombs',
'Digging Mitts',
null,
null,
null,
null,
null,
'Lantern',
'Jar',
'Fishing Rod',
'Clawshot',
'Spinner',
'Ooccoo',
'Tears of Light',
'Tears of Twilight'
]
},{
Title:'Termina Map',
Offset:0x1e298,
Items:[
'Compass',
'Bombs',
null,
null,
null,
null,
null,
'Ice Arrows',
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
'Song of Time',
'Inverted Song of Time',
'Deku Stick',
'Deku Mask',
'Goron Mask',
'Zora Mask',
'Mask of Truth',
'Majora\'s Mask',
'Giant Summon'
]
}
],
RUPEES_OFFSET: 0x14c,
MATERIALS_OFFSET: 0x13d2c,
MATERIALS_DISCOVERED: 0x13e2c,
MATERIALS_DISCOVERED_ALL:[
0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff,
0xff, 0x1f, 0x00, 0x00
],
MATERIALS:[
'Metal Plate',
'Monster Tooth',
'Old Rag',
'Soldier\'s Uniform',
'Rock',
'Aeralfos Leather',
'Fiery Aeralfos Leather',
'Gibdo Bandage',
'ReDead Bandage',
'Lizalfos Scale',
'Dinolfos Fang',
'Moblin Flank',
'Shield-Moblin Helmet',
'Piece of Darknut Armor',
'Stalmaster Wrist Bone',
'Big Poe Necklace',
'Essence of Icy Big Poe',
'Hylian Captain Gauntlet',
'Goron Armor Breastplate',
'Ganon\'s Mane',
'King Dodongo\'s Claws',
'Gohma\'s Acid',
'Manhandla\'s Toxic Dust',
'Argorok\'s Embers',
'The Imprisoned\'s Scales',
'Cia\'s Bracelet',
'Volga\'s Helmet',
'Wizzro\'s Robe',
'Link\'s Boots',
'Lana\'s Hair Clip',
'Zelda\'s Brooch',
'Impa\'s Hair Band',
'Ganondorf\'s Gauntlet',
'Sheik\'s Kunai',
'Darunia\'s Spikes',
'Ruto\'s Earrings',
'Agitha\'s Basket',
'Midna\'s Hair',
'Fi\'s Heels',
'Ghirahim\'s Sash',
'Zant\'s Magic Gem',
'Round Aeralfos Shield',
'Fiery Aeralfos Wing',
'Heavy Gibdo Sword',
'ReDead Knight Ashes',
'Lizalfos Gauntlet',
'Dinolfos Arm Guard',
'Moblin Spear',
'Metal Moblin Shield',
'Large Darknut Sword',
'Stalmaster\'s Skull',
'Big Poe\'s Lantern',
'Icy Big Poe\'s Talisman',
'Holy Hylian Shield',
'Thick Goron Helmet',
'Ganon\'s Fang',
'King Dodongo\'s Crystal',
'Gohma\'s Lens',
'Manhandla\'s Sapling',
'Argorok\'s Stone',
'The Imprisoned\'s Pillar',
'Cia\'s Staff',
'Volga\'s Dragon Spear',
'Wizzro\'s Ring',
'Link\'s Scarf',
'Lana\'s Cloak',
'Zelda\'s Tiara',
'Impa\'s Breastplate',
'Ganondorf\'s Jewel',
'Sheik\'s Turban',
'Darunia\'s Bracelet',
'Ruto\'s Scale',
'Agitha\'s Pendant',
'Midna\'s Fused Shadow',
'Fi\'s Crystal',
'Ghirahim\'s Cape',
'Zant\'s Helmet'
],
MAX_WEAPONS:1030,
WEAPONS_OFFSET:0x8d74c,
WEAPON_SIZE:0x4c,
WEAPON_TYPES:[
{value:0, name:'(no weapon)'},
{value:1, name:'Normal weapon (blank?)'},
{value:2, name:'Normal weapon (NEW)'},
{value:3, name:'Normal weapon'},
{value:9, name:'Master Sword (blank?)'},
{value:10, name:'Master sword (NEW)'},
{value:11, name:'Master sword'},
{value:17, name:'Legendary skill (blank?)'},
{value:18, name:'Legendary skill (NEW)'},
{value:19, name:'Legendary skill'},
{value:25, name:'MS+LS (hack, blank?)'},
{value:26, name:'MS+LS (hack, NEW)'},
{value:27, name:'MS+LS (hack)'}
],
WEAPON_IDS:[
'Knight\'s Sword (Link - Hylian Sword Level 1)',
'White Sword (Link - Hylian Sword Level 2)',
'Magical Sword (Link - Hylian Sword Level 3)',
'Fire Rod (Link - Magic Rod Level 1)',
'Prism Rod (Link - Magic Rod Level 2)',
'Magical Rod (Link - Magic Rod Level 3)',
'Great Fountain Fairy (Link - Great Fairy Level 1)',
'Great Forest Fairy (Link - Great Fairy Level 2)',
'Great Sky Fairy (Link - Great Fairy Level 3)',
'Silver Gauntlets (Link - Gauntlets Level 1)',
'Golden Gauntlets (Link - Gauntlets Level 2)',
'Power Gloves (Link - Gauntlets Level 3)',
'Spirit\'s Tome (Lana - Book of Sorcery Level 1)',
'Sealing Tome (Lana - Book of Sorcery Level 2)',
'Sorceress Tome (Lana - Book of Sorcery Level 3)',
'Deku Spear (Lana - Spear Level 1)',
'Kokiri Spear (Lana - Spear Level 2)',
'Faron Spear (Lana - Spear Level 3)',
'Gate of Time (Lana - Summoning Gate Level 1)',
'Guardian\'s Gate (Lana - Summoning Gate Level 2)',
'Gate of Souls (Lana - Summoning Gate Level 3)',
'Polished Rapier (Zelda - Rapier Level 1)',
'Glittering Rapier (Zelda - Rapier Level 2)',
'Gleaming Rapier (Zelda - Rapier Level 3)',
'Wind Waker (Zelda - Baton Level 1)',
'Sacred Baton (Zelda - Baton Level 2)',
'Glorious Baton (Zelda - Baton Level 3)',
'Giant\'s Knife (Impa - Giant Blade Level 1)',
'Biggoron\'s Knife (Impa - Giant Blade Level 2)',
'Biggoron\'s Sword (Impa - Giant Blade Level 3)',
'Guardian Naginata (Impa - Naginata Level 1)',
'Scorching Naginata (Impa - Naginata Level 2)',
'Sheikah Naginata (Impa - Naginata Level 3)',
'Swords of Despair (Ganondorf - Great Swords Level 1)',
'Swords of Darkness (Ganondorf - Great Swords Level 2)',
'Swords of Demise (Ganondorf - Great Swords Level 3)',
'Goddess\'s Harp (Sheik - Harp Level 1)',
'Typhoon Harp (Sheik - Harp Level 2)',
'Triforce Harp (Sheik - Harp Level 3)',
'Magic Hammer (Darunia - Hammer Level 1)',
'Igneous Hammer (Darunia - Hammer Level 2)',
'Megaton Hammer (Darunia - Hammer Level 3)',
'Silver Scale (Ruto - Zora Scale Level 1)',
'Golden Scale (Ruto - Zora Scale Level 2)',
'Water Dragon Scale (Ruto - Zora Scale Level 3)',
'Butterfly Parasol (Agitha - Parasol Level 1)',
'Luna Parasol (Agitha - Parasol Level 2)',
'Princess Parasol (Agitha - Parasol Level 3)',
'Cursed Shackle (Midna - Shackle Level 1)',
'Twilight Shackle (Midna - Shackle Level 2)',
'Sol Shackle (Midna - Shackle Level 3)',
'Goddess Sword (Fi - Goddess Blade Level 1)',
'Goddess Longsword (Fi - Goddess Blade Level 2)',
'True Goddess Blade (Fi - Goddess Blade Level 3)',
'Demon Tribe Sword (Ghirahim - Demon Blade Level 1)',
'Demon Longsword (Ghirahim - Demon Blade Level 2)',
'True Demon Blade (Ghirahim - Demon Blade Level 3)',
'Usurper\'s Scimitars (Zant - Scimitars Level 1)',
'Shadow Scimitars (Zant - Scimitars Level 2)',
'Scimitars of Twilight (Zant - Scimitars Level 3)',
'[unknown weapon]',
'Master Sword (Link - Master Sword)',
'8-Bit Wooden Sword (Link - Hylian Sword Level 3)',
'8-Bit Candle (Link - Magic Rod Level 3)',
'8-Bit Fairy (Link - Great Fairy Level 3)',
'8-Bit Power Bracelets (Link - Gauntlets Level 3)',
'8-Bit Book of Magic (Lana - Book of Sorcery Level 3)',
'8-Bit Magical Rod? (Lana - Spear Level 3)',
'8-Bit Compass (Lana - Summoning Gate Level 3)',
'8-Bit White Sword? (Zelda - Rapier Level 3)',
'8-Bit Recorder (Zelda - Baton Level 3)',
'8-Bit Boomerang? (Impa - Giant Blade Level 3)',
'8-Bit Magical Sword? (Impa - Naginata Level 3)',
'8-Bit Magical Keys (Ganondorf - Great Swords Level 3)',
'8-Bit Stepladder (Sheik - Harp Level 3)',
'8-Bit Food (Darunia - Hammer Level 3)',
'8-Bit Clock (Ruto - Zora Scale Level 3)',
'8-Bit Rupee (Agitha - Parasol Level 3)',
'8-Bit Red Ring (Midna - Shackle Level 3)',
'8-Bit Silver Arrow (Fi - Goddess Blade Level 3)',
'8-Bit Arrow (Ghirahim - Demon Blade Level 3)',
'8-Bit Magic Boomerangs (Zant - Scimitars Level 3)',
'Scepter of Time (Cia - Scepter Level 1)',
'Guardian\'s Scepter (Cia - Scepter Level 2)',
'Scepter of Souls (Cia - Scepter Level 3)',
'Dragonbone Pike (Volga - Dragon Spear Level 1)',
'Stonecleaver Claw (Volga - Dragon Spear Level 2)',
'Flesh-Render Fang (Volga - Dragon Spear Level 3)',
'Blue Ring (Wizzro - Ring Level 1)',
'Red Ring (Wizzro - Ring Level 2)',
'Magical Ring (Wizzro - Ring Level 3)',
'Epona (Link - Horse Level 1)',
'Twilight Epona (Link - Horse Level 2)',
'Epona of Time (Link - Horse Level 3)',
'Mirror of Shadows (Twili Midna - Mirror Level 1)',
'Mirror of Silence (Twili Midna - Mirror Level 2)',
'Mirror of Twilight (Twili Midna - Mirror Level 3)',
'Ancient Spinner (Link - Spinner Level 1)',
'Enhanced Spinner (Link - Spinner Level 2)',
'Triforce Spinner (Link - Spinner Level 3)',
'Old Dominion Rod (Zelda - Dominion Rod Level 1)',
'High Dominion Rod (Zelda - Dominion Rod Level 2)',
'Royal Dominion Rod (Zelda - Dominion Rod Level 3)',
'Fierce Deity Mask (Young Link - Mask Level 1)',
'Furious Deity Mask (Young Link - Mask Level 2)',
'Vengeful Deity Mask (Young Link - Mask Level 3)',
'Rosy Balloon (Tingle - Balloon Level 1)',
'Love-Filled Balloon (Tingle - Balloon Level 2)',
'Mr. Fairy Balloon (Tingle - Balloon Level 3)',
'*** Ganon\'s Rage (Ganon) RESERVED, DO NOT USE ***',
'*** Cucco\'s Spirit (Cucco) RESERVED, DO NOT USE ***',
'Thief\'s Trident (Ganondorf - Trident Level 1)',
'King of Evil Trident (Ganondorf - Trident Level 2)',
'Trident of Demise (Ganondorf - Trident Level 3)',
'Simple Crossbows (Linkle - Crossbows Level 1)',
'Hylian Crossbows (Linkle - Crossbows Level 2)',
'Legend\'s Crossbows (Linkle - Crossbows Level 3)',
'Fairy Ocarina (Skull Kid - Ocarina Level 1)',
'Lunar Ocarina (Skull Kid - Ocarina Level 2)',
'Majora\'s Ocarina (Skull Kid - Ocarina Level 3)',
'Hero\'s Sword (Toon Link - Light Sword Level 1)',
'Phantom Sword (Toon Link - Light Sword Level 2)',
'Lokomo Sword (Toon Link - Light Sword Level 3)',
'Pirate Cutlass (Tetra - Cutlass Level 1)',
'Jeweled Cutlass (Tetra - Cutlass Level 2)',
'Regal Cutlass (Tetra - Cutlass Level 3)',
'Windfall Sail (King Daphnes - Sail Level 1)',
'Swift Sail (King Daphnes - Sail Level 2)',
'Sail of Red Lions (King Daphnes - Sail Level 3)',
'Sacred Harp (Medli - Rito Harp Level 1)',
'Earth God\'s Harp (Medli - Rito Harp Level 2)',
'Din\'s Harp (Medli - Rito Harp Level 3)',
'Sea Lily\'s Bell (Marin - Bell Level 1)',
'Wavelet Bell (Marin - Bell Level 2)',
'Awakening Bell (Marin - Bell Level 3)',
'Winged Boots (Linkle - Boots Level 1)',
'Roc Boots (Linkle - Boots Level 2)',
'Pegasus Boots (Linkle - Boots Level 3)',
'Protector Sword (Toon Zelda - Sword Level 1)',
'Warp Sword (Toon Zelda - Sword Level 2)',
'Wrecker Sword (Toon Zelda - Sword Level 3)',
'Sand Wand (Toon Link - Wand Level 1)',
'Jeweled Sand Wand (Toon Link - Wand Level 2)',
'Nice Sand Wand (Toon Link - Wand Level 3)',
'Wooden Hammer (Ravio - Rental Hammer Level 1)',
'White Bunny Hammer (Ravio - Rental Hammer Level 2)',
'Nice Hammer (Ravio - Rental Hammer Level 3)',
'Wooden Frame (Yuga - Picture Frame Level 1)',
'Frame of Sealing (Yuga - Picture Frame Level 2)',
'Demon King\'s Frame (Yuga - Picture Frame Level 3)',
'Unknown (Unk - Unk Level 1)',
'Unknown (Unk - Unk Level 2)',
'Unknown (Unk - Unk Level 3)',
{value:4294967295,name:'-'}
],
WEAPON_SKILLS:[
'(blank)',
'Strong Att.+',
'Strength II',
'Strength III',
'Strength IV',
'Strength V',
'Strength VI',
'Fire+',
'Water+',
'Lightning+',
'Light+',
'Darkness+',
'VS Legend',
'VS Time',
'VS Twilight',
'VS Skyward',
'VS Sorceress',
'VS Beast',
'VS Dragon',
'VS Undead',
'VS Soldier',
'VS Ganon',
'EXP+',
'Rupees+',
'Materials+',
'Slots+',
'Stars+',
'Hearts+',
'Health+',
'Special+',
'Bombs+',
'Arrows+',
'Boomerang+',
'Hookshot+',
'One-Hit Kill',
'Sturdy Feet',
'Regen',
'Defenseless',
'No Healing',
'Adversity',
'Compatriot',
'Evil\'s Bane',
'Legendary',
'Special Attack+',
'Finishing Blow+',
'Regular Attack+',
'Heart-strong',
'Focus Spirit+',
'Hasty Attacks',
{value:4294967295,name:'-'}
]
},
/* private functions */
discoverMaterials:function(){
hide('button-discover-materials');
for(var i=0; i<this.Constants.MATERIALS_DISCOVERED_ALL.length; i++){
tempFile.writeByte(this.Constants.MATERIALS_DISCOVERED+i, this.Constants.MATERIALS_DISCOVERED_ALL[i]);
}
MarcDialogs.alert('All materials are now discovered (won\'t appear as ??? in-game)');
},
_getWeaponOffset:function(){
return this.Constants.WEAPONS_OFFSET+this.Constants.WEAPON_SIZE*currentWeapon
},
_selectWeapon:function(i){
currentWeapon=i;
var offset=this._getWeaponOffset();
setValue('weapon-type', tempFile.readByte(offset+0x00));
setValue('weapon-id', tempFile.readInt(offset+0x04));
setValue('weapon-base-power', tempFile.readShort(offset+0x08));
setValue('weapon-stars', tempFile.readShort(offset+0x0a));
for(var i=0; i<8; i++){
setValue('weapon-skill'+i, tempFile.readInt(offset+0x0c+0x04*i));
setValue('weapon-koskill'+i, tempFile.readInt(offset+0x2c+0x04*i));
}
SavegameEditor._calculateWeaponPower();
},
_writeWeapon:function(){
var offset=SavegameEditor._getWeaponOffset();
tempFile.writeByte(offset+0x00, getValue('weapon-type'));
tempFile.writeInt(offset+0x04, getValue('weapon-id'));
tempFile.writeShort(offset+0x08, getValue('weapon-base-power'));
tempFile.writeShort(offset+0x0a, getValue('weapon-stars'));
for(var i=0; i<8; i++){
tempFile.writeInt(offset+0x0c+0x04*i, getValue('weapon-skill'+i));
tempFile.writeInt(offset+0x2c+0x04*i, getValue('weapon-koskill'+i));
}
SavegameEditor._calculateWeaponPower();
},
_calculateWeaponPower:function(){
var legendaryType=getValue('weapon-type') & 0x10;
var legendarySkill=false;
var evilsBane=getValue('weapon-type') & 0x20;
var evilsBaneSkill=false;
for(var i=0;i<8;i++){
if(getValue('weapon-skill'+i)==0x2a && getValue('weapon-koskill'+i)==0){
legendarySkill=true;
}else if(getValue('weapon-skill'+i)==0x29 && getValue('weapon-koskill'+i)==0){
evilsBaneSkill=true;
}
}
var actualBasePower=0;
var basePower=parseInt(getValue('weapon-base-power'));
if(legendaryType && legendarySkill){
actualBasePower=300
}else{
actualBasePower=basePower
}
var stars=parseInt(getValue('weapon-stars'));
var starBonus=actualBasePower/10;
if(evilsBane && evilsBaneSkill){
actualBasePower+=200
}
var finalPower = Math.ceil(actualBasePower+(starBonus*stars))
setValue('weapon-power', finalPower);
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==3145728)
},
/* load function */
load:function(){
tempFile.littleEndian=false;
tempFile.fileName='APP.BIN';
/* MATERIALS */
setValue('rupees', tempFile.readInt(this.Constants.RUPEES_OFFSET), 0, 9999999);
for(var i=0; i<this.Constants.MATERIALS.length; i++){
get('row-materials').appendChild(col(3, label('number-material'+i, this.Constants.MATERIALS[i])));
get('row-materials').appendChild(col(1, inputNumber('material'+i, 0, 999, tempFile.readShort(this.Constants.MATERIALS_OFFSET+i*2))));
}
/* CHARACTERS */
for(var i=0; i<this.Constants.CHARACTER_PACKS.length; i++){
var names=this.Constants.CHARACTER_PACKS[i].Names;
for(var j=0; j<names.length; j++){
var offset=this.Constants.CHARACTER_PACKS[i].Offset+j*this.Constants.CHARACTER_SIZE;
var level=tempFile.readByte(offset+this.Constants.CHARACTER_LEVEL_OFFSET);
if(level==0xf00){
this.Constants.CHARACTER_PACKS[i].Names[j]=null; //set this character to null, so it won't be updated on saving
}else if(names[j]){
get('row-characters').appendChild(
col(3, span(names[j]))
);
get('row-characters').appendChild(
col(3, inputNumber('characters'+i+'_damage'+j, 0, 99999999, tempFile.readShort(offset)))
);
get('row-characters').appendChild(
col(3, inputNumber('characters'+i+'_level'+j, 1, 255, level+1))
);
get('row-characters').appendChild(
col(3, inputNumber('characters'+i+'_exp'+j, 0, 12842457, tempFile.readInt(offset+this.Constants.CHARACTER_EXP_OFFSET)))
);
var regexName=new RegExp(' \\('+names[j]+' - ');
var weaponsByName=[];
for(var k=0; k<this.Constants.WEAPON_IDS.length;k++){
if(regexName.test(this.Constants.WEAPON_IDS[k])){
weaponsByName.push(k);
}
}
weaponFilters.push(weaponsByName);
}
}
}
/* MAPS */
var maps=[];
for(var i=0; i<this.Constants.MAPS.length; i++){
var map=this.Constants.MAPS[i];
maps.push(map.Title);
var mapDiv=row([]);
mapDiv.style.display=(i==0)?'flex':'none';
get('maps').appendChild(mapDiv);
for(var j=0; j<map.Items.length; j++){
if(map.Items[j]){
mapDiv.appendChild(col(4, label('number-map'+i+'-item'+j, map.Items[j])));
mapDiv.appendChild(col(2, inputNumber('map'+i+'-item'+j, 0, 5, tempFile.readByte(map.Offset+j))));
}
}
}
var selectMap=select('map', maps, function(){
for(var i=0; i<SavegameEditor.Constants.MAPS.length; i++){
get('maps').children[i].style.display=(this.value==i)?'flex':'none';
}
});
selectMap.className='';
get('container-select-map').appendChild(selectMap);
/* WEAPONS */
for(var i=0; i<8; i++){
var KOsToUnlockInput=inputNumber('weapon-koskill'+i, 0, 9999999);
KOsToUnlockInput.addEventListener('change', this._writeWeapon, false);
document.getElementById('weapons-skills-container').appendChild(
row(
[3,3,3,3],
label('weapon-skill'+i, 'Skill '+(i+1)),
select('weapon-skill'+i, this.Constants.WEAPON_SKILLS, this._writeWeapon),
label('weapon-koskill'+i, 'KOs to unlock'),
KOsToUnlockInput
)
);
}
get('container-select-weapon').appendChild(select('weapon', genRange(0,this.Constants.MAX_WEAPONS-1), function(){SavegameEditor._selectWeapon(this.value)}));
get('container-weapon-type').appendChild(select('weapon-type', this.Constants.WEAPON_TYPES, this._writeWeapon));
get('container-weapon-id').appendChild(select('weapon-id', this.Constants.WEAPON_IDS, this._writeWeapon));
get('container-weapon-base-power').appendChild(select('weapon-base-power', ['-', {value:80,name:'Level 1 (80)'}, {value:150,name:'Level 2 (150)'}, {value:280,name:'Level 3 (280)'}, {value:300,name:'Master Sword (300)'}], this._writeWeapon));
get('container-weapon-stars').appendChild(select('weapon-stars', genRange(0,5), this._writeWeapon));
this._selectWeapon(0);
},
/* save function */
save:function(){
/* MATERIALS */
tempFile.writeInt(this.Constants.RUPEES_OFFSET, getValue('rupees'));
for(var i=0; i<this.Constants.MATERIALS.length; i++){
tempFile.writeShort(this.Constants.MATERIALS_OFFSET+i*2, getValue('material'+i));
}
/* CHARACTERS */
for(var i=0; i<this.Constants.CHARACTER_PACKS.length; i++){
var names=this.Constants.CHARACTER_PACKS[i].Names;
for(var j=0; j<names.length; j++){
if(names[j]){
var offset=this.Constants.CHARACTER_PACKS[i].Offset+j*this.Constants.CHARACTER_SIZE;
tempFile.writeShort(offset, getValue('characters'+i+'_damage'+j));
tempFile.writeByte(offset+this.Constants.CHARACTER_LEVEL_OFFSET, getValue('characters'+i+'_level'+j)-1);
tempFile.writeInt(offset+this.Constants.CHARACTER_EXP_OFFSET, getValue('characters'+i+'_exp'+j));
}
}
}
/* MAPS */
var maps=[];
for(var i=0; i<this.Constants.MAPS.length; i++){
var map=this.Constants.MAPS[i];
for(var j=0; j<map.Items.length; j++){
if(map.Items[j]){
tempFile.writeByte(map.Offset+j, getValue('map'+i+'-item'+j));
}
}
}
}
}

View File

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Hyrule Warriors</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Hyrule Warriors. It can edit values for your apple and materials."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, wii u, hyrule warriors, materials, experience, weapons"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./hyrule-warriors.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Hyrule Warriors</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/hyrule-warriors" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- MATERIALS -->
<h3 class="orange">Materials</h3>
<div class="container">
<div class="row" id="row-materials">
<div class="three columns"><label for="number-rupees">Rupees</label></div>
<div class="one columns"><input id="number-rupees" type="text" /></div>
</div>
<div class="text-center">
<button class="button" id="button-discover-materials" onclick="SavegameEditor.discoverMaterials()">Discover all materials</button>
</div>
</div>
<!-- CHARACTERS -->
<h3 class="red">Characters</h3>
<div class="container">
<div class="row" id="row-characters">
<div class="three columns">&nbsp;</div>
<div class="three columns">Damage</div>
<div class="three columns">Level</div>
<div class="three columns">Experience</div>
</div>
</div>
<!-- MAPS -->
<h3 class="green">Maps</h3>
<div class="container">
<label for="select-map">Map</label> <span id="container-select-map"></span>
<hr/>
<div id="maps"></div>
</div>
<!-- WEAPONS -->
<h3 class="blue">Weapons</h3>
<div class="container">
<label for="select-weapon">Weapon slot</label>
<span id="container-select-weapon"></span>
<span class="bg-light-gray round" style="padding: 3px 12px">Approximate power: <span id="span-weapon-power"></span></span>
<hr/>
<div class="row">
<div class="three columns">Weapon type</div><div class="three columns" id="container-weapon-type"></div>
<div class="three columns">Weapon ID</div><div class="three columns" id="container-weapon-id"></div>
<div class="three columns">Base Power</div><div class="three columns" id="container-weapon-base-power"></div>
<div class="three columns">Stars</div><div class="three columns" id="container-weapon-stars"></div>
</div>
<hr/>
<div id="weapons-skills-container"></div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
hyrule-warriors.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

BIN
hyrule-warriors/thumb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
kid-icarus-uprising/01.sav Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

View File

@ -0,0 +1,99 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Kid Icarus: Uprising</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Kid Icarus: Uprising. It can edit values for your apple and materials."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, Kid Icarus: Uprising, free, apples"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./kid-icarus-uprising.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Kid Icarus: Uprising</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/kid-icarus-uprising" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- HEARTS -->
<h3 class="orange">Hearts</h3>
<div class="container">
<div class="row">
<div class="five columns"><label for="number-hearts">Current hearts</label></div>
<div class="three columns"><input id="number-hearts" type="text" /></div>
</div>
<div class="row">
<div class="five columns"><label for="number-hearts-for-palutena">Hearts offered to Palutena</label></div>
<div class="three columns"><input id="number-hearts-for-palutena" type="text" /></div>
</div>
<div class="row">
<div class="five columns"><label for="number-hearts-for-viridi">Hearts offered to Viridi</label></div>
<div class="three columns"><input id="number-hearts-for-viridi" type="text" /></div>
</div>
<div class="row">
<div class="five columns">Unlock unreleased trophies</div>
<div class="three columns"><button id="button-unlock-trophies" onclick="KidIcarusUprising.unlockTrophies()">Unlock</button></div>
</div>
</div>
<!-- STATS -->
<h3 class="red">Stats</h3>
<div class="container" id="stats"></div>
<!-- WEAPONS -->
<h3 class="green">Weapons</h3>
<div class="container">
<label for="select-weapon">Weapon slot</label> <span id="container-select-weapon"></span>
<hr/>
<div class="row">
<div class="three columns"><label for="weapon-type">Weapon type</label></div>
<div class="three columns end">
<select id="select-weapon-type" disabled="disabled" onchange="SavegameEditor._writeWeapon()"></select>
</div>
</div>
<div class="row">
<div class="three columns"><label for="weapon-stars-ranged">Ranged stars</label></div><div class="three columns mono" id="container-weapon-stars-ranged"></div>
<div class="three columns"><label for="weapon-stars-melee">Melee stars</label></div><div class="three columns mono" id="container-weapon-stars-melee"></div>
</div>
<hr/>
<div class="row">
<div class="six columns"><label for="select-weapon-modifier0">Modifier 1</label></div>
<div class="six columns" id="container-weapon-modifier0"></div>
<div class="six columns"><label for="select-weapon-modifier1">Modifier 2</label></div>
<div class="six columns" id="container-weapon-modifier1"></div>
<div class="six columns"><label for="select-weapon-modifier2">Modifier 3</label></div>
<div class="six columns" id="container-weapon-modifier2"></div>
<div class="six columns"><label for="select-weapon-modifier3">Modifier 4</label></div>
<div class="six columns" id="container-weapon-modifier3"></div>
<div class="six columns"><label for="select-weapon-modifier4">Modifier 5</label></div>
<div class="six columns" id="container-weapon-modifier4"></div>
<div class="six columns"><label for="select-weapon-modifier5">Modifier 6</label></div>
<div class="six columns" id="container-weapon-modifier5"></div>
</div>
Approximate value: <span id="weapon-value"></span>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,768 @@
/*
Kid Icarus: Uprising for HTML5 Save Editor v20170706
by Marc Robledo 2016-2017
*/
var currentWeapon=0
SavegameEditor={
Name:'Kid Icarus: Uprising',
Filename:'0x.sav',
/* Constants */
Constants:{
NUM_TREASURE: 120*3,
NUM_TROPHIES: 412,
NUM_WEAPONS: 1000,
NUM_LEVELS: 25,
WEAPON_SIZE: 0x20,
MODIFIERS:[
'-',
'Standing ch. shot +1',
'Standing ch. shot +2',
'Standing ch. shot +3',
'Standing ch. shot +4',
'Standing ch. shot -1',
'Standing ch. shot -2',
'Dash ch. shot +1',
'Dash ch. shot +2',
'Dash ch. shot +3',
'Dash ch. shot +4',
'Dash ch. shot -1',
'Dash ch. shot -2',
'Forward-dash ch. shot +1',
'Forward-dash ch. shot +2',
'Forward-dash ch. shot +3',
'Forward-dash ch. shot +4',
'Side-dash ch. shot +1',
'Side-dash ch. shot +2',
'Side-dash ch. shot +3',
'Side-dash ch. shot +4',
'Backward-dash ch. shot +1',
'Backward-dash ch. shot +2',
'Backward-dash ch. shot +3',
'Backward-dash ch. shot +4',
'Standing cont. fire +1',
'Standing cont. fire +2',
'Standing cont. fire +3',
'Standing cont. fire +4',
'Standing cont. fire -1',
'Standing cont. fire -2',
'Dash cont. fire +1',
'Dash cont. fire +2',
'Dash cont. fire +3',
'Dash cont. fire +4',
'Dash cont. fire -1',
'Dash cont. fire -2',
'Forward-dash cont. fire +1',
'Forward-dash cont. fire +2',
'Forward-dash cont. fire +3',
'Forward-dash cont. fire +4',
'Side-dash cont. fire +1',
'Side-dash cont. fire +2',
'Side-dash cont. fire +3',
'Side-dash cont. fire +4',
'Backward-dash cont. fire +1',
'Backward-dash cont. fire +2',
'Backward-dash cont. fire +3',
'Backward-dash cont. fire +4',
'Melee Combo +1',
'Melee Combo +2',
'Melee Combo +3',
'Melee Combo +4',
'Melee Combo -1',
'Melee Combo -2',
'Melee Dash Attack +1',
'Melee Dash Attack +2',
'Melee Dash Attack +3',
'Melee Dash Attack +4',
'Melee Dash Attack -1',
'Melee Dash Attack -2',
'Item Attack +1',
'Item Attack +2',
'Item Attack +3',
'Item Attack +4',
'Power Attack +1',
'Power Attack +2',
'Power Attack +3',
'Power Attack +4',
'Health +1',
'Health +2',
'Health +3',
'Health +4',
'Health +5',
'Health +6',
'Health -1',
'Health -2',
'Health -3',
'Health -4',
'Stamina +1',
'Stamina +2',
'Stamina +3',
'Stamina +4',
'Speed +1',
'Speed +2',
'Speed +3',
'Speed +4',
'Speed -1',
'Speed -2',
'Speed -3',
'Speed -4',
'Walking Speed +1',
'Walking Speed +2',
'Walking Speed +3',
'Walking Speed +4',
'Running speed +1',
'Running speed +2',
'Running speed +3',
'Running speed +4',
'Evasion +1',
'Evasion +2',
'Evasion +3',
'Evasion +4',
'Shot Defense +1',
'Shot Defense +2',
'Shot Defense +3',
'Shot Defense +4',
'Shot Defense -1',
'Shot Defense -2',
'Melee defense +1',
'Melee defense +2',
'Melee defense +3',
'Melee defense +4',
'Melee defense -1',
'Melee defense -2',
'Knockback Defense +1',
'Knockback Defense +2',
'Knockback Defense +3',
'Knockback Defense +4',
'Status resistance +1',
'Status resistance +2',
'Status resistance +3',
'Status resistance +4',
'Status resistance -1',
'Status resistance -2',
'Status resistance -3',
'Status resistance -4',
'Overall Defense +1',
'Overall Defense +2',
'Overall Defense +3',
'Overall Defense +4',
'Overall Defense +5',
'Overall Defense +6',
'Overall Defense +7',
'Overall Defense +8',
'Overall Defense -1',
'Overall Defense -2',
'Overall Defense -3',
'Overall Defense -4',
'Recovery Effect +1',
'Recovery Effect +2',
'Recovery Effect +3',
'Recovery Effect +4',
'Effect Duration +1',
'Effect Duration +2',
'Effect Duration +3',
'Effect Duration +4',
'Poison +1',
'Poison +2',
'Poison +3',
'Poison +4',
'Paralyse +1',
'Paralyse +2',
'Paralyse +3',
'Paralyse +4',
'Weakening +1',
'Weakening +2',
'Weakening +3',
'Weakening +4',
'Petrify +1',
'Petrify +2',
'Petrify +3',
'Petrify +4',
'Shaking +1',
'Shaking +2',
'Shaking +3',
'Shaking +4',
'Confusion +1',
'Confusion +2',
'Confusion +3',
'Confusion +4',
'Burning +1',
'Burning +2',
'Burning +3',
'Burning +4',
'Freezing +1',
'Freezing +2',
'Freezing +3',
'Freezing +4',
'Shot Range +1',
'Shot Range +2',
'Shot Range +3',
'Shot Range -1',
'Shot Range -2',
'Shot Range -3',
'Shot Homing +1',
'Shot Homing +2',
'Shot Homing +3',
'Shot Homing -1',
'Shot Homing -2',
'Shot Homing -3',
'Shot Cancellation +1',
'Knockback Recovery +1',
'Self Injury -1',
'Self Injury -2',
'Self Injury -3',
'Full-health boost +1',
'Full-health boost +2',
'Full-health boost +3',
'Full-health boost +4',
'Full-health boost +5',
'Full-health boost +6',
'In Peril Auto-Dodge +1',
'In Peril Auto-Dodge +2',
'In Peril Auto-Dodge +3',
'In Peril Attack Boost +1',
'In Peril Attack Boost +2',
'In Peril Attack Boost +3',
'In Peril Attack Boost +4',
'In Peril Attack Boost +5',
'In Peril Attack Boost +6',
'In Peril Attack Boost -1',
'In Peril Attack Boost -2',
'In Peril Attack Boost -3',
'In Peril Attack Boost -4',
'Heart Bonus +1',
'Heart Bonus +2',
'Heart Bonus +3',
'Heart Bonus -1',
'Heart Bonus -2',
'Heart Bonus -3'
],
MODIFIERS_VALUES:[
0.0,
9.2, 15.8, 22.4, 29, /* Standing Ch. Shot+ */
-6.4, -12.8, /* Standing Ch. Shot- */
13.2, 23.3, 33.4, 43.6, /* Dash Ch. Shot+ */
-11.1, -22.1, /* Dash Ch. Shot- */
11.2, 19.1, 26.9, 34.8, /* Fwd-Dash Ch. Shot+ */
9.9, 16.7, 23.5, 30.4, /* Side-Dash Ch. Shot+ */
10.6, 17.9, 25.2, 32.6, /* Bkwd-Dash Ch. Shot+ */
7.9, 13, 18, 23.1, /* Standing Cont. Fire+ */
-5.1, -10.1, /* Standing Cont. Fire- */
10.6, 17.2, 23.8, 30.4, /* Dash Cont. Fire+ */
-9.2, -18.5, /* Dash Cont. Fire- */
8.6, 14.2, 19.7, 25.3, /* Fwd-Dash Cont. Fire+ */
8.6, 14.2, 19.7, 25.3, /* Side-Dash Cont. Fire+ */
8.6, 14.2, 19.7, 25.3, /* Bkwd-Dash Cont. Fire+ */
9.2, 15.3, 21.4, 27.5, /* Melee Combo+ */
-6.4, -12.8, /* Melee Combo- */
7.9, 12.6, 17.3, 22, /* Melee Dash Attack+ */
-5.5, -11, /* Melee Dash Attack- */
14.5, 27.7, 40.9, 54.1, /* Item Attack+ */
23.8, 40.3, 56.8, 73.3, /* Power Attack+ */
9, 18.4, 27.9, 37.3, 46.7, 56.1, /* Health+ */
-8.1, -15.8, -23.5, -31.1, /* Health- */
11.9, 17.9, 23.9, 29.9, /* Stamina+ */
9.2, 17.2, 25.1, 33, /* Speed+ */
-11, -17.6, -24.2, -30.8, /* Speed- */
6.6, 9.9, 13.2, 16.5, /* Walking Speed+ */
7.9, 13.4, 18.9, 24.4, /* Running Speed+ */
10.8, 17.2, 23.5, 29.9, /* Evasion+ */
15, 29.8, 44.7, 59.6, /* Shot Defense+ */
-14.9, -31.2, /* Shot Defense- */
9.9, 18.5, 27.1, 35.6, /* Melee Defense+ */
-8.9, -20.8, /* Melee Defense- */
6.6, 13.2, 19.8, 26.4, /* Knockback Defense+ */
12.8, 21.3, 29.8, 38.3, /* Status Resistance+ */
-7.7, -10.7, -13.6, -16.6, /* Status Resistance- */
15, 25.8, 36.6, 47.5, 58.3, 69.2, 80, 90.9, /* Overall Defense+ */
-16.5, -25.7, -34.8, -44, /* Overall Defense- */
15.8, 21.1, 26.4, 31.7, /* Recovery Effect+ */
10.6, 20.2, 29.9, 39.6, /* Effect Duration+ */
6.2, 10, 13.9, 17.8, /* Poison+ */
7.9, 14.5, 21.1, 27.7, /* Paralysis+ */
9.2, 16.4, 23.5, 30.6, /* Weakening+ */
16.9, 20.9, 24.9, 28.8, /* Petrification+ */
7.3, 14.1, 20.9, 27.7, /* Shaking+ */
7.3, 14.1, 20.9, 27.7, /* Confusion+ */
7.9, 13.9, 19.8, 25.7, /* Burning+ */
20.2, 25.5, 30.8, 36.1, /* Freezing+ */
13.9, 24.3, 34.8, /* Shot Range+ */
-5.9, -9.2, -12.5, /* Shot Range- */
11.9, 18.7, 25.5, /* Shot Homing+ */
-4.6, -8.1, -11.7, /* Shot Homing- */
42.5, /* Shot Cancellation+ */
10.6, /* Knockback Recovery+ */
-8.8, -13.2, -17.6, /* Self Injury- */
8.6, 12.3, 16.1, 19.8, 23.5, 27.3, /* Full Health Boost+ */
7.7, 11.6, 15.4, /* In-peril Auto-dodge+ */
9.9, 16, 22, 28.1, 34.2, 40.3, /* In-peril Attack Boost+ */
-10.7, -14.2, -17.8, -21.3, /* In-peril Attack Boost- */
8.8, 17.6, 26.4, /* Heart Bonus+ */
-3.3, -5, -6.6 /* Heart Bonus- */
],
STAR_RANGED_VALUES:[
0.0, 14.9, 23.2, 31.5, 39.8, 48.1, 56.4, 64.7, 73.0, 81.3, 89.6, 98.2, 106.2, -11.75, -23.5, -35.25, -47.0
],
STAR_MELEE_VALUES:[
0.0, 9.4, 15.2, 21.0, 26.8, 32.6, 38.4, 44.2, 50.0, 55.8, 61.6, 67.4, 73.2, -8.5, -17, -25.5, -34
],
DEFAULT_MODIFIERS:[
0x4a, 0x86, 0x8e, 0x1c, 0xbe, 0xdc
],
STARS:[
'-',
'☆',
'★',
'★☆',
'★★',
'★★☆',
'★★★',
'★★★☆',
'★★★★',
'★★★★☆',
'★★★★★',
'★★★★★☆',
'★★★★★★',
'-☆',
'-★',
'-★☆',
'-★★'
],
STATS:[
/* BASIC */
'Times played',
'Total play time (in seconds)',
'Total Solo play time (in seconds)',
'Hearts acquired',
'Weapons acquired',
'Powers acquired',
'UNKNOWN_1',
'Enemies defeated',
'Bosses defeated',
'Ranged attacks',
'Melee attacks',
'Attacks evaded',
'Knockback recoveries',
'Shots narrowly avoided',
'Special Attacks used',
'Times finished',
'Powers used',
'Items used',
'Times eggplanted',
'Times tempuraed',
'Centurions summoned',
/* SOLO */
'Chapters cleared',
'Total score',
'Chapters cleared at max Intensity',
'Avg. Intensity *FLOAT*',
'Avg. Intensity for cleared chapters *FLOAT*',
'Hearts bet in the Fiend\'s cauldron',
'Hearts lost',
'Most hearts acquired',
'Most weapons acquired',
'Most powers acquired',
'Weapons purchased',
'Weapons converted to hearts',
'Hearts offered in the Vault',
'UNKNOWN_2',
'UNKNOWN_3',
'UNKNOWN_4',
'UNKNOWN_5',
'Weapons fusions',
'Treasure boxes opened',
'Times pickpocketed',
'Souflees defeated',
'Rare Treasurefish defeated',
'Exo Tank uses',
'Aether Ring uses',
'Cherubot uses',
'Three Sacred Treasures uses',
'Lightning Chariot uses',
'Great Sacred Treasure uses',
'Time playes as Magnus (in seconds)',
'Time playes as Dark Pit (in seconds)',
'Practice Range uses',
/* TOGETHER */
'Nearby matches played',
'Nearby time played (in seconds)',
'Total Nearby participants',
'Far Away matches played',
'Total Far Away participants',
'Time played With Friends',
'Time played With Anyone',
'Light vs. Dark matches played',
'Light vs. Dark matches won',
'Free-for-All matches played',
'Free-for-All matches won',
'Opponents defeated',
'Matches suspended',
'Times you became an angel',
'Times you won as an angel',
'Angels defeated',
'Weapons rewarded',
'Powers rewarded',
'Hearts rewarded',
/* STREETPASS */
'Weapon gems created',
'Weapon-gem-exchange partners',
'UNKNOWN_6',
'Weapons fused from gems',
'Hearts acquired by gems'
],
WEAPON_TYPES:[
{name:'Blades', weapons:[
{id:0xfa2000,name:'First Blade'},
{id:0xf9a880,name:'Burst Blade'},
{id:0x5b2100,name:'Viper Blade'},
{id:0x7a6180,name:'Crusader Blade'},
{id:0x79e200,name:'Royal Blade'},
{id:0x84e280,name:'Optical Blade'},
{id:0x66e300,name:'Samurai Blade'},
{id:0x926380,name:'Bullet Blade'},
{id:0x9cec00,name:'Aquarius Blade'},
{id:0x88ec80,name:'Aurum Blade'},
{id:0x876500,name:'Palutena Blade'},
{id:0x94ed80,name:'Gaol Blade'}
]},
{name:'Staves', weapons:[
{id:0x49c804,name:'Insight Staff'},
{id:0x7c4084,name:'Orb Staff'},
{id:0x4d4904,name:'Rose Staff'},
{id:0x684184,name:'Knuckle Staff'},
{id:0x944204,name:'Ancient Staff'},
{id:0x934284,name:'Lancer Staff'},
{id:0x93c304,name:'Flintlock Staff'},
{id:0x9bcb84,name:'Somewhat Staff'},
{id:0xf98c04,name:'Scorpio Staff'},
{id:0xbd8c84,name:'Laser Staff'},
{id:0x5a0504,name:'Dark Pit Staff'},
{id:0xfa0d84,name:'Thanatos Staff'}
]},
{name:'Claws', weapons:[
{id:0x9f0888,name:'Tiger Claws'},
{id:0x9f0888,name:'Wolf Claws'},
{id:0xa30908,name:'Bear Claws'},
{id:0xa2c988,name:'Brawler Claws'},
{id:0x9e8a08,name:'Stealth Claws'},
{id:0x9e0a88,name:'Hedgehog Claws'},
{id:0x8d4b08,name:'Raptor Claws'},
{id:0x7f0388,name:'Artillery Claws'},
{id:0xf9cc08,name:'Cancer Claws'},
{id:0xd50c88,name:'Beam Claws'},
{id:0xa3cd08,name:'Viridi Claws'},
{id:0xa38c88,name:'Pandora Claws'}
]},
{name:'Bows', weapons:[
{id:0xaf080c,name:'Fortune Bow'},
{id:0x81c08c,name:'Silver Bow'},
{id:0xf9c90c,name:'Meteor Bow'},
{id:0x96498c,name:'Divine Bow'},
{id:0x89ca0c,name:'Darkness Bow'},
{id:0xacca8c,name:'Crystal Bow'},
{id:0x95cb0c,name:'Angel Bow'},
{id:0xabcb8c,name:'Hawkeye Bow'},
{id:0xaf4c0c,name:'Sagittarius Bow'},
{id:0x4ccc8c,name:'Aurum Bow'},
{id:0x67c50c,name:'Palutena Bow'},
{id:0x50cd8c,name:'Phrosphora Bow'}
]},
{name:'Palms', weapons:[
{id:0xfa0810,name:'Violet Palm'},
{id:0xf98890,name:'Burning Palm'},
{id:0x87c910,name:'Needle Palm'},
{id:0x914190,name:'Midnight Palm'},
{id:0xa9ca10,name:'Cursed Palm'},
{id:0xaf4a90,name:'Cutter Palm'},
{id:0x514310,name:'Pudgy Palm'},
{id:0xaa4b90,name:'Ninja Palm (Weeaboo Palm)'},
{id:0x674410,name:'Virgo Palm'},
{id:0x924490,name:'Aurum Palm'},
{id:0x99c510,name:'Viridi Palm'},
{id:0xaecd90,name:'Great Reaper Palm'}
]},
{name:'Clubs', weapons:[
{id:0xa60814,name:'Ore Club'},
{id:0x9d8894,name:'Babel Club'},
{id:0x9e0914,name:'Skyscraper Club'},
{id:0x65c994,name:'Atlas Club'},
{id:0xf9c214,name:'Earthmaul Club'},
{id:0xa48A94,name:'Ogre Club'},
{id:0x884b14,name:'Halo Club'},
{id:0xa58b94,name:'Black Club'},
{id:0xa68c14,name:'Capricorn Club'},
{id:0x834494,name:'Aurum Club'},
{id:0x874514,name:'Hewdraw Club'},
{id:0xa50d94,name:'Magnus Club'}
]},
{name:'Cannons', weapons:[
{id:0xaa4818,name:'EZ Cannon'},
{id:0xa1c098,name:'Ball Cannon'},
{id:0xf9c918,name:'Predator Cannon'},
{id:0x51c198,name:'Poseidon Cannon'},
{id:0xae8a18,name:'Fireworks Cannon'},
{id:0x4aca98,name:'Rail Cannon'},
{id:0xaecb18,name:'Dynamo Cannon'},
{id:0x634b98,name:'Doom Cannon'},
{id:0x9bc418,name:'Leo Cannon'},
{id:0x5b0498,name:'Sonic Cannon'},
{id:0x864518,name:'Twinbellows Cannon'},
{id:0x84c598,name:'Cragalanche Cannon'}
]},
{name:'Orbitars', weapons:[
{id:0xfa081c,name:'Standard Orbitars'},
{id:0x85809c,name:'Guardian Orbitars'},
{id:0x53a91c,name:'Shock Orbitars'},
{id:0x4d899c,name:'Eyetrack Orbitars'},
{id:0x534a1c,name:'Fairy Orbitars'},
{id:0x68829c,name:'Paw Pad Orbitars'},
{id:0x7f831c,name:'Jetstream Orbitars'},
{id:0x69039c,name:'Boom Orbitars'},
{id:0x898c1c,name:'Gemini Orbitars'},
{id:0x7e049c,name:'Aurum Orbitars'},
{id:0x7e851c,name:'Centurion Orbitars'},
{id:0xf98d9c,name:'Arlon Orbitars'}
]},
{name:'Arms', weapons:[
{id:0x9a4020,name:'Crusher Arm'},
{id:0x8b48a0,name:'Compact Arm'},
{id:0xf9c920,name:'Electroshock Arm'},
{id:0xa949a0,name:'Volcano Arm'},
{id:0x484a20,name:'Drill Arm'},
{id:0x914aa0,name:'Bomber Arm'},
{id:0x478b20,name:'Bowl Arm'},
{id:0xa98ba0,name:'End-All Arm'},
{id:0x79c420,name:'Taurus Arm'},
{id:0x8044a0,name:'Upperdash Arm'},
{id:0x844520,name:'Kraken Arm'},
{id:0x83c5a0,name:'Phoenix Arm'}
]}
]
},
Offsets:{
TREASURE_HUNT: 0x0c,
CURRENT_HEARTS: 0x01e8,
HEARTS_OFFERED_TO_PALUTENA: 0x01ec,
HEARTS_OFFERED_TO_VIRIDI: 0x01f0,
TROPHIES: 0x046c,
WEAPONS: 0x0670,
WEAPONS_TYPE: 0x05,
WEAPONS_STARS1: 0x08,
WEAPONS_STARS2: 0x0a,
WEAPONS_MODIFIERS: 0x14,
LEVEL_ENEMIES_DEFEATED: 0x8370,
LEVEL_SCORE: 0x010068,
LEVEL_INTENSITY: 0x0100ec,
STATS: 0x0101b8,
},
/* private functions */
_checkIfMissingAnyUnreleasedTrophy:function(){
var missing=false;
for(var i=404; i<412 && !missing; i++){
if(tempFile.readByte(this.Offsets.TROPHIES+i)==0){
missing=true;
}
}
return missing
},
_disableUnlockUnreleasedTrophiesButton:function(){
get('button-unlock-trophies').disabled=true;
get('button-unlock-trophies').value='OK!';
},
_getWeaponOffset:function(){
return this.Offsets.WEAPONS+currentWeapon*this.Constants.WEAPON_SIZE
},
_readWeapon:function(i){
currentWeapon=i;
var offset=this._getWeaponOffset();
var weaponType=(tempFile.readByte(offset+0x05)<<16)+(tempFile.readByte(offset+0x06)<<8)+tempFile.readByte(offset+0x07);
get('weapon-unknown').innerHTML='0x'+weaponType.toString(16);
get('weapon-unknown').value=weaponType;
get('select-weapon-type').value=weaponType;
var starsRanged=tempFile.readShort(offset+0x08);
var starsMelee=tempFile.readShort(offset+0x0a);
if((starsRanged>=0x11 && starsRanged<=0x16) && starsMelee==0x00){ /* unknown fix for some weapons? */
starsMelee=starsRanged;
starsRanged=0;
}else if((starsRanged>=0x17 && starsRanged<=0x17) && starsMelee==0x00){ /* unknown fix for some weapons? */
starsMelee=starsRanged-0x06;
starsRanged=starsRanged-0x16;
}
get('select-weapon-stars-ranged').value=starsRanged;
get('select-weapon-stars-melee').value=starsMelee;
for(var i=0; i<6; i++){
get('select-weapon-modifier'+i).value=tempFile.readShort(offset+0x14+i*2);
}
this._calculateWeaponValue();
},
_writeWeapon:function(){
var offset=SavegameEditor._getWeaponOffset();
var weaponType=parseInt(getValue('weapon-type'));
tempFile.writeInt(offset+0x05, (weaponType & 0xff0000) >> 16);
tempFile.writeInt(offset+0x06, (weaponType & 0x00ff00) >> 8);
tempFile.writeInt(offset+0x07, (weaponType & 0x0000ff) >> 0);
tempFile.writeShort(offset+0x08, getValue('weapon-stars-ranged'));
tempFile.writeShort(offset+0x0a, getValue('weapon-stars-melee'));
for(var i=0; i<6; i++)
tempFile.writeShort(offset+0x14+i*2, getValue('weapon-modifier'+i));
SavegameEditor._calculateWeaponValue();
},
_calculateWeaponValue:function(){
var val=100;
for(var i=0; i<6; i++){
val+=this.Constants.MODIFIERS_VALUES[get('select-weapon-modifier'+i).value];
}
val+=this.Constants.STAR_RANGED_VALUES[get('select-weapon-stars-ranged').selectedIndex];
val+=this.Constants.STAR_MELEE_VALUES[get('select-weapon-stars-melee').selectedIndex];
//val=parseInt(val);
val=Math.ceil(val);
if(val<351){
get('weapon-value').style.color='initial';
get('weapon-value').innerHTML=val;
}else{
get('weapon-value').style.color='red';
get('weapon-value').innerHTML=val+' (invalid weapon!)';
}
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==66296)
},
/* preload function */
preload:function(){
setNumericRange('hearts', 0, 9999999);
setNumericRange('hearts-for-palutena', 0, 9999999);
setNumericRange('hearts-for-viridi', 0, 9999999);
},
/* load function */
load:function(){
tempFile.littleEndian=true;
setValue('hearts', tempFile.readInt(this.Offsets.CURRENT_HEARTS));
setValue('hearts-for-palutena', tempFile.readInt(this.Offsets.HEARTS_OFFERED_TO_PALUTENA));
setValue('hearts-for-viridi', tempFile.readInt(this.Offsets.HEARTS_OFFERED_TO_VIRIDI));
if(!this._checkIfMissingAnyUnreleasedTrophy())
this._disableUnlockUnreleasedTrophiesButton();
/* STATS */
for(var i=0; i<this.Constants.STATS.length; i++){
var val,input;
if(i==24 || i==25){
val=tempFile.readFloat32(this.Offsets.STATS+i*4);
//console.log((this.Offsets.STATS+i*4).toString(16));
input=inputFloat('stat'+i, 0.0, 9.0, val);
}else{
val=tempFile.readInt(this.Offsets.STATS+i*4);
input=inputNumber('stat'+i, 0, 0xffffffff, val);
}
document.getElementById('stats').appendChild(
row(
[8,4],
label('stat'+i, this.Constants.STATS[i]),
input
)
);
}
/* WEAPONS */
var selectWeaponType=get('select-weapon-type');
for(var i=0; i<this.Constants.WEAPON_TYPES.length; i++){
var GROUP=this.Constants.WEAPON_TYPES[i];
var optGroup=document.createElement('optgroup');
optGroup.label=GROUP.name;
selectWeaponType.appendChild(optGroup);
for(var j=0; j<GROUP.weapons.length; j++){
var WEAPON=GROUP.weapons[j];
var option=document.createElement('option');
option.value=WEAPON.id;
option.innerHTML=(j+1)+'. '+WEAPON.name;
optGroup.appendChild(option);
}
}
var optionUnknown=document.createElement('option');
optionUnknown.value=0x000000;
optionUnknown.innerHTML='???';
optionUnknown.id='weapon-unknown';
selectWeaponType.appendChild(optionUnknown);
var validWeapons=[];
for(var i=0; i<this.Constants.NUM_WEAPONS; i++){
currentWeapon=i;
var offset=this._getWeaponOffset();
if((tempFile.readByte(offset+0x05)<<16)+(tempFile.readByte(offset+0x06)<<8)+tempFile.readByte(offset+0x07)!==0x000000)
validWeapons.push(i);
}
var selectWeapon=select('weapon', validWeapons);
selectWeapon.className+=' medium';
selectWeapon.addEventListener('change', function(){SavegameEditor._readWeapon(this.value)}, false);
get('container-select-weapon').appendChild(selectWeapon);
//currentWeapon=m('#select-weapon').children().first().get().value;
currentWeapon=get('select-weapon').children[0].value;
var selectStarsRanged=select('weapon-stars-ranged', this.Constants.STARS);
selectStarsRanged.addEventListener('change', this._writeWeapon, false);
get('container-weapon-stars-ranged').appendChild(selectStarsRanged);
var MELEE_STARS=[];
for(var i=0; i<this.Constants.STARS.length; i++){
if(i==0){
MELEE_STARS.push({value:0x00, name:'-'});
}else{
MELEE_STARS.push({value:0x10+i, name:this.Constants.STARS[i]});
}
}
var selectStarsMelee=select('weapon-stars-melee', MELEE_STARS);
selectStarsMelee.addEventListener('change', this._writeWeapon, false);
get('container-weapon-stars-melee').appendChild(selectStarsMelee);
for(var i=0; i<6; i++){
var selectWeaponModifier=select('weapon-modifier'+i, this.Constants.MODIFIERS);
selectWeaponModifier.addEventListener('change', this._writeWeapon, false);
get('container-weapon-modifier'+i).appendChild(selectWeaponModifier);
}
this._readWeapon(0);
},
/* save function */
save:function(){
tempFile.writeInt(this.Offsets.CURRENT_HEARTS, getValue('hearts'));
tempFile.writeInt(this.Offsets.HEARTS_OFFERED_TO_PALUTENA, getValue('hearts-for-palutena'));
tempFile.writeInt(this.Offsets.HEARTS_OFFERED_TO_VIRIDI, getValue('hearts-for-viridi'));
/* STATS */
for(var i=0; i<this.Constants.STATS.length; i++){
if(i==24 || i==25){
tempFile.writeFloat32(this.Offsets.STATS+i*4, getValue('stat'+i));
}else{
tempFile.writeInt(this.Offsets.STATS+i*4, getValue('stat'+i));
}
}
}
}

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
kid-icarus-uprising.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
picross-3d-round-2/SAVEDATA Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Picross 3D: Round 2</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Picross 3D: Round 2. It can unlock all amiibo puzzles."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, picross 3d round 2, unlock, amiibo, puzzles"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./picross-3d-round-2.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Picross 3D: Round 2</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/picross-3d-round-2" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- AMIIBO -->
<h3 class="orange">Amiibo puzzles</h3>
<div class="container">
You have unlocked <span id="span-amiibocount"></span><small>/9</small> amiibo puzzles.
<button onclick="SavegameEditor.unlockAmiiboPuzzles()">Unlock missing amiibo puzzles</button>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,45 @@
/*
Picross 3D round 2 for HTML5 Save Editor v20160704
by Marc Robledo 2016
*/
SavegameEditor={
Name:'Picross 3D: round 2',
Filename:'SAVEDATA',
AmiiboOffset:0x1a4c,
unlockAmiiboPuzzles:function(){
for(var i=0; i<9; i++){
var offset=this.AmiiboOffset+i*16;
var b=tempFile.readByte(offset);
if(!(b & 0x09)){
tempFile.writeByte(offset, b+0x09);
}
}
setValue('amiibocount', 9);
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==45688)
},
/* load function */
load:function(){
tempFile.fileName='SAVEDATA';
var unlockedAmiibos=0;
for(var i=0; i<9; i++){
if(tempFile.readByte(this.AmiiboOffset+i*16) & 0x09){
unlockedAmiibos++;
}
}
setValue('amiibocount', unlockedAmiibos);
},
/* save function */
save:function(){
}
}

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
picross-3d-round-2.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
pokemon-picross/all.dat Normal file

Binary file not shown.

BIN
pokemon-picross/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

View File

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Pokémon Picross</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Pokémon Picross. It can let you get free picrites."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, pokemon, picross, free, picrites"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./pokemon-picross.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Pokémon Picross</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/pokemon-picross" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- PICRITES -->
<h3 class="orange">Picrites</h3>
<div class="container">
<div class="row">
<div class="six columns center"><label for="number-picrites">Picrites</label></div>
<div class="four columns center"><input id="number-picrites" type="text" /></div>
</div>
<div class="row">
<div class="six columns center"><label for="number-boughtpicrites">Bought picrites</label><br/><small>(Note: if you buy 5000 picrites, you have access to unlimited picrites in-game)</small></div>
<div class="four columns center"><input id="number-boughtpicrites" type="text" /></div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,44 @@
/*
Pokémon Picross for HTML5 Save Editor v20170706
by Marc Robledo 2016-2017
*/
SavegameEditor={
Name:'Pokémon Picross',
Filename:'all.dat',
Offsets:{
PICRITES:0x0b40,
BOUGHTPICRITES:0x0b44,
PENDINGPICRITES:0x0b48, /* if there is an error after buying, they are queued here */
UNLOCKEDSHOPFLAG:0x0b4c,
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==14920)
},
/* preload function */
preload:function(){
setNumericRange('picrites', 0, 9999);
setNumericRange('boughtpicrites', 0, 5000);
},
/* load function */
load:function(){
tempFile.fileName='all.dat';
setValue('picrites', tempFile.readShort(this.Offsets.PICRITES));
setValue('boughtpicrites', tempFile.readShort(this.Offsets.BOUGHTPICRITES));
},
/* save function */
save:function(){
tempFile.writeShort(this.Offsets.PICRITES, getValue('picrites'));
var boughtPicrites=getValue('boughtpicrites');
tempFile.writeShort(this.Offsets.BOUGHTPICRITES, boughtPicrites);
var unlockedShopByte=tempFile.readByte(this.Offsets.UNLOCKEDSHOPFLAG) & ~0x01;
tempFile.writeByte(this.Offsets.UNLOCKEDSHOPFLAG, unlockedShopByte+(boughtPicrites>=5000)?0x01:0x00);
}
}

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
pokemon-picross.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

BIN
pokemon-picross/thumb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
pokemon-shuffle/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

131
pokemon-shuffle/index.html Normal file
View File

@ -0,0 +1,131 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Pokémon Shuffle</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Pokémon Shuffle. It can edit values for your hearts, jewels, coins, items and more!"/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, pokemon, shuffle, free, jewels, hearts, coins, items, enhancements"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./pokemon-shuffle.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Pokémon Shuffle</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/pokemon-shuffle" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- CONSUMABLES -->
<h3 class="orange">Consumables</h3>
<div class="container">
<div class="row">
<div class="four columns center"><label for="number-hearts">Hearts</label></div>
<div class="four columns center"><label for="number-coins">Coins</label></div>
<div class="four columns center"><label for="number-jewels">Jewels</label></div>
</div>
<div class="row">
<div class="four columns center"><input id="number-hearts" type="text" /></div>
<div class="four columns center"><input id="number-coins" type="text"/></div>
<div class="four columns center"><input id="number-jewels" type="text"/></div>
</div>
</div>
<!-- CONSUMABLES -->
<h3 class="red">Items</h3>
<div class="container">
<div class="row">
<div class="three columns"><label for="number-item0">Moves +5</label></div>
<div class="three columns"><input id="number-item0" class="small" type="text"/></div>
<div class="three columns"><label for="number-item4">Complexity -1</label></div>
<div class="three columns"><input id="number-item4" class="small" type="text"/></div>
<div class="three columns"><label for="number-item1">Time +10</label></div>
<div class="three columns"><input id="number-item1" class="small" type="text"/></div>
<div class="three columns"><label for="number-item5">Disruption Delay</label></div>
<div class="three columns"><input id="number-item5" class="small" type="text"/></div>
<div class="three columns"><label for="number-item2">Exp. *1.5</label></div>
<div class="three columns"><input id="number-item2" class="small" type="text"/></div>
<div class="three columns"><label for="number-item6">Attack up</label></div>
<div class="three columns"><input id="number-item6" class="small" type="text"/></div>
<div class="three columns"><label for="number-item3">Mega start</label></div>
<div class="three columns"><input id="number-item3" class="small" type="text"/></div>
<div class="three columns"></div>
<div class="three columns"></div>
</div>
</div>
<!-- Enhancements -->
<h3 class="green">Enhancements</h3>
<div class="container">
<div class="row">
<div class="three columns"><label for="number-enhancement0">Mega speedup</label></div>
<div class="three columns"><input id="number-enhancement0" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement5">Exp. Booster L</label></div>
<div class="three columns"><input id="number-enhancement5" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement1">Raise Max Level</label></div>
<div class="three columns"><input id="number-enhancement1" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement6">Skill Booster S</label></div>
<div class="three columns"><input id="number-enhancement6" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement2">Level Up</label></div>
<div class="three columns"><input id="number-enhancement2" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement7">Skill Booster M</label></div>
<div class="three columns"><input id="number-enhancement7" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement3">Exp. Booster S</label></div>
<div class="three columns"><input id="number-enhancement3" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement8">Skill Booster L</label></div>
<div class="three columns"><input id="number-enhancement8" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement4">Exp. Booster M</label></div>
<div class="three columns"><input id="number-enhancement4" class="small" type="text"/></div>
<div class="three columns"><label for="number-enhancement9">Skill Swapper</label></div>
<div class="three columns"><input id="number-enhancement9" class="small" type="text"/></div>
</div>
</div>
<!-- Other -->
<h3 class="blue">Other</h3>
<div class="container">
<div class="row">
<div class="nine columns"><label for="number-scalationlvl">Current scalation battle level</label></div>
<div class="three columns"><input id="number-scalationlvl" class="small" type="text"/></div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,155 @@
/*
Pokemon Shuffle for HTML5 Save Editor v20170706
by Marc Robledo 2016
*/
SavegameEditor={
Name:'Pokémon Shuffle',
Filename:'savedata.bin',
Offsets:{
Coins:{
ADDRESS: 0x68,
NBYTES: 4,
BITOFFSET: 3,
NBITS: 17,
},
Jewels:{
ADDRESS: 0x6a,
NBYTES: 2,
BITOFFSET: 4,
NBITS: 8,
},
Hearts:{
ADDRESS: 0x2d4a,
NBYTES: 2,
BITOFFSET: 7,
NBITS: 7,
},
Items:{
ADDRESS: 0xd0,
NBYTES: 2,
BITOFFSET: 7,
NBITS: 7,
},
Enhancements:{
ADDRESS: 0x2d4c,
NBYTES: 1,
BITOFFSET: 1,
NBITS: 7,
},
CurrentScalationLevel:{
ADDRESS: 0x2d59,
NBYTES: 2,
BITOFFSET: 2,
NBITS: 10,
}
},
/* private functions */
_readBytes(address, numBytes){
var num;
if(numBytes==4){
num=tempFile.readInt(address);
}else if(numBytes==2){
num=tempFile.readShort(address);
}else{
num=tempFile.readByte(address);
}
return num;
},
_readVariable(v,addOffset){
var num=this._readBytes(v.ADDRESS+addOffset, v.NBYTES);
num=num >> v.BITOFFSET;
return num & (Math.pow(2,v.NBITS)-1);
},
_storeVariable(v,addOffset,newValInput){
/* << to shift mask, ~ to bitwise, >>> 0 forces unsigned values */
var inverseMask=~((Math.pow(2,v.NBITS)-1) << v.BITOFFSET) >>> 0;
var originalBytes=this._readBytes(v.ADDRESS+addOffset, v.NBYTES);
var newValue=(originalBytes & inverseMask) + (parseInt(newValInput) << v.BITOFFSET) >>> 0;
if(v.NBYTES==4){
tempFile.writeInt(v.ADDRESS+addOffset, newValue);
}else if(v.NBYTES==2){
tempFile.writeShort(v.ADDRESS+addOffset, newValue);
}else{
tempFile.writeByte(v.ADDRESS+addOffset, newValue);
}
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==42039 || tempFile.fileSize==74807)
},
/* preload function */
preload:function(){
setNumericRange('coins', 0, 99999);
setNumericRange('jewels', 0, 150);
setNumericRange('hearts', 0, 99);
setNumericRange('scalationlvl', 1, 999);
for(var i=0; i<7; i++)
setNumericRange('item'+i, 0, 99);
var maxEnhancements;
if(tempFile.fileSize==42039)
maxEnhancements=1;
else if(tempFile.fileSize==74807)
maxEnhancements=10;
for(var i=0; i<maxEnhancements; i++)
setNumericRange('enhancement'+i, 0, 99);
},
/* load function */
load:function(){
tempFile.littleEndian=true;
tempFile.fileName='savedata.bin';
setValue('coins', this._readVariable(this.Offsets.Coins, 0));
setValue('jewels', this._readVariable(this.Offsets.Jewels, 0));
setValue('hearts', this._readVariable(this.Offsets.Hearts, 0));
for(var i=0; i<7; i++)
setValue('item'+i, this._readVariable(this.Offsets.Items, i));
var maxEnhancements;
if(tempFile.fileSize==42039)
maxEnhancements=1;
else if(tempFile.fileSize==74807)
maxEnhancements=10;
for(var i=0; i<maxEnhancements; i++)
setValue('enhancement'+i, this._readVariable(this.Offsets.Enhancements, i));
setValue('scalationlvl', this._readVariable(this.Offsets.CurrentScalationLevel, 0));
},
/* save function */
save:function(){
this._storeVariable(this.Offsets.Coins, 0, getValue('coins'));
this._storeVariable(this.Offsets.Jewels, 0, getValue('jewels'));
this._storeVariable(this.Offsets.Hearts, 0, getValue('hearts'));
for(var i=0; i<7; i++)
this._storeVariable(this.Offsets.Items, i, getValue('item'+i));
var maxEnhancements;
if(tempFile.fileSize==42039)
maxEnhancements=1;
else if(tempFile.fileSize==74807)
maxEnhancements=10;
for(var i=0; i<maxEnhancements; i++)
this._storeVariable(this.Offsets.Enhancements, i, getValue('enhancement'+i));
this._storeVariable(this.Offsets.CurrentScalationLevel, 0, getValue('scalationlvl'));
}
}

Binary file not shown.

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
pokemon-shuffle.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

BIN
pokemon-shuffle/thumb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Rhythm Paradise/Heaven Megamix</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Rhythm Paradise/Heaven Megamix. It can edit values for your coins, flow balls and onions."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, rhythm, paradise, heaven, megamix, flow, balls, onions, coins"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./rhythm-paradise-megamix.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Rhythm Paradise/Heaven Megamix</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/rhythm-paradise-megamix" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- BASIC -->
<h3 class="orange">Basic</h3>
<div class="container">
<div class="row">
<div class="three columns"><label for="number-coins">Coins</label></div>
<div class="three columns"><input id="number-coins" type="text" class="fw" /></div>
<div class="three columns"><label for="number-onions1">Onions</label></div>
<div class="three columns"><input id="number-onions1" type="text" class="fw" /></div>
<div class="three columns"><label for="number-flowballs">Flow balls</label></div>
<div class="three columns"><input id="number-flowballs" type="text" class="fw" /></div>
<div class="three columns"><label for="number-onions2">Silver onions</label></div>
<div class="three columns"><input id="number-onions2" type="text" class="fw" /></div>
<div class="three columns">&nbsp;</div>
<div class="three columns">&nbsp;</div>
<div class="three columns"><label for="number-onions3">Gold onions</label></div>
<div class="three columns"><input id="number-onions3" type="text" class="fw" /></div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,54 @@
/*
Rhythm Paradise Megamix for HTML5 Save Editor v20170104
by Marc Robledo 2017
*/
SavegameEditor={
Name:'Rhythm Heaven/Paradise Megamix',
Filename:'savedataArc.txt',
Offsets:{
COINS:0x2dbc,
FLOWBALLS:0x2dbe,
ONIONS1:0x3006,
ONIONS2:0x3007,
ONIONS3:0x3008
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==30040)
},
/* preload function */
preload:function(){
setNumericRange('coins', 0, 9999);
setNumericRange('flowballs', 0, 255);
setNumericRange('onions1', 0, 255);
setNumericRange('onions2', 0, 255);
setNumericRange('onions3', 0, 255);
},
/* load function */
load:function(){
tempFile.littleEndian=true;
tempFile.fileName='savedataArc.txt';
setValue('coins', tempFile.readShort(this.Offsets.COINS), 0, 9999);
setValue('flowballs', tempFile.readShort(this.Offsets.FLOWBALLS), 0, 255);
setValue('onions1', tempFile.readByte(this.Offsets.ONIONS1), 0, 255);
setValue('onions2', tempFile.readByte(this.Offsets.ONIONS2), 0, 255);
setValue('onions3', tempFile.readByte(this.Offsets.ONIONS3), 0, 255);
},
/* save function */
save:function(){
tempFile.writeShort(this.Offsets.COINS, getValue('coins'));
tempFile.writeShort(this.Offsets.FLOWBALLS, getValue('flowballs'));
tempFile.writeByte(this.Offsets.ONIONS1, getValue('onions1'));
tempFile.writeByte(this.Offsets.ONIONS2, getValue('onions2'));
tempFile.writeByte(this.Offsets.ONIONS3, getValue('onions3'));
}
}

Binary file not shown.

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
rhythm-paradise-megamix.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; StreetPass Mii Plaza</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for StreetPass Mii Plaza. It can edit your Puzzle Swap pieces, unlock DLC hats and more!"/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, streetpass, mii, plaza, puzzle, swap, panel, pieces, free, tickets, dlc, unlock, hats, speech, bubbles"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./streetpass-mii-plaza.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for StreetPass Mii Plaza</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/streetpass-mii-plaza" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- BASIC -->
<h3 class="orange">Basic</h3>
<div class="container">
<div class="row">
<div class="eight columns"><label for="number-sptags">Streetpass Tags</label></div>
<div class="four columns"><input id="number-sptags" type="text" class="fw" /></div>
<div class="eight columns"><label for="number-tickets">Tickets</label></div>
<div class="four columns"><input id="number-tickets" type="text" class="fw" /></div>
<div class="eight columns"><label for="number-fantastic">Fantastic ratings</label></div>
<div class="four columns"><input id="number-fantastic" type="text" class="fw" /></div>
</div>
</div>
<!-- DLC UNLOCK -->
<h3 class="red">Unlock DLC</h3>
<div class="container">
<div class="row">
<div class="eight columns"><label for="button-unlockticketshop">Unlock ticket shop</label></div>
<div class="four columns"><button id="button-unlockticketshop" onclick="SavegameEditor._unlockTicketShop()">Unlock</button></div>
<div class="eight columns"><label for="button-unlockspeechbubbles">Unlock speech bubbles (first 16)</label></div>
<div class="four columns"><button id="button-unlockspeechbubbles" onclick="SavegameEditor._unlockSpeechBubbles()">Unlock</button></div>
<div class="eight columns"><label for="button-unlockspeechbubbles2">Unlock speech bubbles (last 6)</label></div>
<div class="four columns"><button id="button-unlockspeechbubbles2" onclick="SavegameEditor._unlockSpeechBubbles2()">Unlock</button></div>
<div class="eight columns"><label for="button-unlockhats2">Unlock hats (pack 2)</label></div>
<div class="four columns"><button id="button-unlockhats2"onclick="SavegameEditor._unlockHats2()">Unlock</button></div>
<div class="eight columns"><label for="button-unlockhats3">Unlock hats (pack 3)</label></div>
<div class="four columns"><button id="button-unlockhats3" onclick="SavegameEditor._unlockHats3()">Unlock</button></div>
</div>
</div>
<!-- PUZZLE SWAP -->
<h3 class="green">Puzzle Swap</h3>
<div class="container">
<label for="select-panel">Panel:</label> <span id="container-select-panel"></span>
Pieces: <span id="span-pieces"></span><br/>
<button onclick="SavegameEditor._setPiecesFromCurrentPanel(true)"><i class="icon accept"></i> All</button>
<button onclick="SavegameEditor._setPiecesFromCurrentPanel(-1)">All but one</button>
<button onclick="SavegameEditor._setPiecesFromCurrentPanel(false)"><i class="icon reset"></i> None</button>
</div>
</div>
</body>
</html>

Binary file not shown.

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
streetpass-mii-plaza.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

View File

@ -0,0 +1,306 @@
/*
Streetpass Mii Plaza for HTML5 Save Editor v20170706
by Marc Robledo 2016-2017
*/
SavegameEditor={
Name:'Streetpass Mii Plaza',
Filename:'meet.dat',
/* Constants */
Constants:{
ALL_SPEECH_BUBBLES:[0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff],
ALL_SPEECH_BUBBLES2:[0xf8],
ALL_HATS2:[0xef,0xfb,0xff,0xff,0xff,0xff,0xff,0xff],
ALL_HATS3:[0xff,0xff,0xff,0x7f,0x00,0xfe,0x3f,0xfc,0x01],
HATS_GAMES:[
//Battleground Z?
//Mii Force?
//Flower Town?
//Warrior's Way?
//Market Crashers?
//Ninja Launcher?
[0x05b348, 0xc0],
[0x05b348, 0x30],
[0x05b348, 0x0c],
[0x05b348, 0x03],
[0x05b34a, 0xc0], //Monster Manor
[0x05b34b, 0x03], //Ultimate Angler
[0x05b34c, 0x06], //Slot Car Rivals
[0x05b34c, 0x18],
[0x05b34c, 0x60], //Feed Mii
[0x05b34c, 0x80, 0x05b34d,0x01], //Mii Trek
[0x05b34d, 0x06]
],
NO_PIECES_15:[0x00,0x00],
NO_PIECES_SPOTPASS_15:[0x00,0x00],
NO_PIECES_SPOTPASS_24:[0x00,0x00,0x00],
NO_PIECES_SPOTPASS_40:[0x00,0x00,0x00,0x00,0x00],
MOST_PIECES_15:[0xff,0x3f],
MOST_PIECES_SPOTPASS_15:[0xff,0xfc],
MOST_PIECES_SPOTPASS_24:[0xff,0xff,0xfe],
MOST_PIECES_SPOTPASS_40:[0xff,0xff,0xff,0xff,0xfe],
ALL_PIECES_15:[0xff,0x7f],
ALL_PIECES_SPOTPASS_15:[0xff,0xfe],
ALL_PIECES_SPOTPASS_24:[0xff,0xff,0xff],
ALL_PIECES_SPOTPASS_40:[0xff,0xff,0xff,0xff,0xff],
PANELS:[
{Size:15,Name:'Metroid: Other M'},
{Size:15,Name:'Mario and Bowser'},
{Size:15,Name:'Super Mario Galaxy 2'},
{Size:15,Name:'The Legend of Zelda'},
{Size:15,Name:'Kirby\'s Dream Land'},
{Size:15,Name:'Pikmin'},
{Size:15,Name:'New Super Mario Bros. Wii'},
{Size:24,Name:'The Legend of Zelda: Ocarina of Time 3D'},
{Size:24,Name:'Star Fox 64 3D'},
{Size:40,Name:'Super Mario 3D Land'},
{Size:40,Name:'Mario Kart 7'},
{Size:24,Name:'Rhythm Heaven Fever'},
{Size:24,Name:'Donkey Kong Country Returns'},
{Size:24,Name:'Pilotwings Resort'},
{Size:40,Name:'Kid Icarus: Uprising'},
{Size:40,Name:'Fire Emblem Awakening'},
{Size:40,Name:'Mario Tennis Open'},
{Size:40,Name:'Kirby\'s 20th Anniversary'},
{Size:24,Name:'Brain Age: Concentration Training'},
{Size:15,Name:'All Nippon Airways*'},
{Size:15,Name:'Mac de DS Big Mac*'},
{Size:40,Name:'New Super Mario Bros. 2'},
{Size:40,Name:'Kirby\'s Return to Dream Land'},
{Size:40,Name:'Animal Crossing: New Leaf'},
{Size:40,Name:'Luigi\'s Mansion: Dark Moon'},
{Size:40,Name:'Dillon\'s Rolling Western: The Last Ranger'},
{Size:40,Name:'Nintendo Starlets'},
{Size:40,Name:'Xenoblade Chronicles'},
{Size:40,Name:'New SUPER MARIO BROS. U + New SUPER LUIGI U'},
{Size:40,Name:'The Legend of Zelda: Skyward Sword'},
{Size:40,Name:'Mario & Luigi: Dream Team'},
{Size:40,Name:'Chibi-Robo! Photo Finder'},
{Size:24,Name:'Darumeshi Sports Store*'},
{Size:40,Name:'Pokémon X and Pokémon Y'},
{Size:40,Name:'MONSTER HUNTER'},
{Size:40,Name:'Kirby: Triple Deluxe'},
{Size:40,Name:'SUPER MARIO 3D WORLD'},
{Size:40,Name:'YOSHI\'S New ISLAND'},
{Size:24,Name:'Rusty\'s Real Deal Baseball'},
{Size:24,Name:'Dalgu ne seupocheu yagu pyeon*'},
{Size:15,Name:'Nintendo Pocket Football Club'},
{Size:40,Name:'Mega Man'},
{Size:24,Name:'Kirby Fighters Deluxe/DeDeDe\'s Drum Dash Deluxe'},
{Size:40,Name:'Daigasso! Band Brothers P*'},
{Size:40,Name:'FANTASY LIFE'},
{Size:15,Name:'PIKMIN Short Movies 3D: The Night Juicer'},
{Size:15,Name:'PIKMIN Short Movies 3D: Treasure in a Bottle'},
{Size:15,Name:'PIKMIN Short Movies 3D: Occupational Hazards'},
{Size:40,Name:'Sonic Boom'},
{Size:40,Name:'Captain Toad: Treasure Tracker'},
{Size:40,Name:'ULTIMATE NES REMIX'},
{Size:40,Name:'Super Smash Bros. for 3DS / Wii U'},
{Size:40,Name:'MONSTER HUNTER'},
{Size:24,Name:'Tomodachi Life Friendship Fiesta'},
{Size:15,Name:'Picross 3D Round 2'},
{Size:24,Name:'Mario & Happy*'},
{Size:40,Name:'YO-KAI WATCH'},
{Size:15,Name:'Mario & Luigi: Paper Jam'},
{Size:40,Name:'Animal Crossing: Happy Home Designer'},
{Size:40,Name:'FINAL FANTASY EXPLORERS'},
{Size:15,Name:'Kirby: Planet Robobot'},
{Size:15,Name:'Culdcept Revolt'},
{Size:15,Name:'METROID PRIME FEDERATION FORCE'}
]
},
Offsets:{
STREETPASS_TAGS: 0x043e70,
PANELS: 0x044bdc,
PANEL_SIZE: 0x02,
SPOTPASS_PANELS: 0x045578,
SPOTPASS_PANEL_SIZE: 0x44,
ACCOMPLISHMENTS: 0x04555a,
SHOP_UNLOCKED: 0x05b358,
TICKETS: 0x05b366,
FANTASTIC_RATINGS: 0x05b4d6,
SPEECH_BUBBLES: 0x05bfe9,
SPEECH_BUBBLES2: 0x05cec6,
HATS2: 0x05b314,
HATS3: 0x05b344
},
/* private functions */
_getPanelOffset:function(){
var panelOffset,panelSize,panelId;
if(get('select-panel').selectedIndex<=6){
panelOffset=SavegameEditor.Offsets.PANELS;
panelSize=SavegameEditor.Offsets.PANEL_SIZE;
panelId=getValue('panel');
}else{
panelOffset=SavegameEditor.Offsets.SPOTPASS_PANELS;
panelSize=SavegameEditor.Offsets.SPOTPASS_PANEL_SIZE;
panelId=getValue('panel')-7;
}
return panelOffset+parseInt(panelId)*panelSize;
},
_countCurrentPanelPieces:function(){
var panelSize=SavegameEditor.Constants.PANELS[getValue('panel')].Size;
var offset=SavegameEditor._getPanelOffset();
var usedBytes;
if(panelSize==15){
usedBytes=SavegameEditor.Constants.ALL_PIECES_SPOTPASS_15.length
}else if(panelSize==24){
usedBytes=SavegameEditor.Constants.ALL_PIECES_SPOTPASS_24.length
}else{
usedBytes=SavegameEditor.Constants.ALL_PIECES_SPOTPASS_40.length
}
var count=0;
for(var i=0; i<usedBytes; i++){
var myByte=tempFile.readByte(offset+i);
for(var j=0; j<8; j++){
var mask=Math.pow(2, (7-(j%8)));
if(myByte & mask){
count++;
}
}
}
var color;
if(count==panelSize){
color='green'
}else if(count>=panelSize){
color='red';
}else{
color='initial';
}
setValue('pieces',count);
getField('pieces').style.color=color;
},
_setPiecesFromCurrentPanel:function(status){
var arrayStr;
if(status===false){
arrayStr='NO_PIECES_';
}else if(status===-1){
arrayStr='MOST_PIECES_';
}else{
arrayStr='ALL_PIECES_';
}
if(get('select-panel').selectedIndex>=7){
arrayStr+='SPOTPASS_';
}
arrayStr+=SavegameEditor.Constants.PANELS[parseInt(getValue('panel'))].Size;
tempFile.writeBytes(SavegameEditor._getPanelOffset(), SavegameEditor.Constants[arrayStr]);
SavegameEditor._countCurrentPanelPieces();
},
_unlockTicketShop:function(){
var originalByte=tempFile.readByte(this.Offsets.SHOP_UNLOCKED);
if(!(originalByte & 0x01)){
tempFile.writeByte(this.Offsets.SHOP_UNLOCKED, originalByte+0x01);
getField('button-unlockticketshop').disabled=true;
MarcDialogs.alert('Ticket shop is open now.');
}
},
_unlockSpeechBubbles:function(){
tempFile.writeBytes(this.Offsets.SPEECH_BUBBLES, this.Constants.ALL_SPEECH_BUBBLES);
getField('button-unlockspeechbubbles').disabled=true;
MarcDialogs.alert('Speech bubbles 1-16 were unlocked.');
},
_unlockSpeechBubbles2:function(){
tempFile.writeBytes(this.Offsets.SPEECH_BUBBLES2, this.Constants.ALL_SPEECH_BUBBLES2);
getField('button-unlockspeechbubbles2').disabled=true;
MarcDialogs.alert('Speech bubbles 17-22 were unlocked.');
},
_unlockHats2:function(){
tempFile.writeBytes(this.Offsets.HATS2, this.Constants.ALL_HATS2);
getField('button-unlockhats2').disabled=true;
MarcDialogs.alert('All hats (pack 2) were unlocked.');
},
_unlockHats3:function(){
tempFile.writeBytes(this.Offsets.HATS3, this.Constants.ALL_HATS3);
getField('button-unlockhats3').disabled=true;
MarcDialogs.alert('All hats (pack 3) were unlocked.');
},
_unlockHatsGame:function(i){
for(var j=0; j<this.Constants.HATS_GAMES[i].length; j+=2){
var offset=this.Constants.HATS_GAMES[i][j];
var mask=this.Constants.HATS_GAMES[i][j+1];
var byteRead=tempFile.readByte(offset);
tempFile.writeByte(offset, (byteRead & ~mask)+mask);
}
getField('button-unlockhatsgame'+i).disabled=true;
MarcDialogs.alert('Game '+i+' hats were unlocked.');
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==393216)
},
/* preload function */
preload:function(){
setNumericRange('sptags', 0, 65535);
setNumericRange('tickets', 0, 156);
setNumericRange('fantastic', 0, 65535);
},
/* load function */
load:function(){
tempFile.littleEndian=true;
setValue('sptags', tempFile.readInt(this.Offsets.STREETPASS_TAGS));
setValue('tickets', tempFile.readShort(this.Offsets.TICKETS));
setValue('fantastic', tempFile.readShort(this.Offsets.FANTASTIC_RATINGS));
var panels=[];
for(var i=0; i<this.Constants.PANELS.length; i++)
panels.push((i+1)+'. '+this.Constants.PANELS[i].Name);
var containerSelectPanel=get('container-select-panel');
var selectPanel=select('panel',panels,this._countCurrentPanelPieces);
selectPanel.style.width='auto';
containerSelectPanel.appendChild(selectPanel);
getField('button-unlockticketshop').disabled=(tempFile.readByte(this.Offsets.SHOP_UNLOCKED) & 0x01);
getField('button-unlockspeechbubbles').disabled=(compareBytes(this.Offsets.SPEECH_BUBBLES, this.Constants.ALL_SPEECH_BUBBLES));
getField('button-unlockspeechbubbles2').disabled=(compareBytes(this.Offsets.SPEECH_BUBBLES2, this.Constants.ALL_SPEECH_BUBBLES2));
getField('button-unlockhats2').disabled=(compareBytes(this.Offsets.HATS2, this.Constants.ALL_HATS2));
getField('button-unlockhats3').disabled=(compareBytes(this.Offsets.HATS3, this.Constants.ALL_HATS3));
/*for(var i=0; i<11; i++){
var enabled=this.Constants.HATS_GAMES[i].length/2;
for(var j=0; j<this.Constants.HATS_GAMES[i].length; j+=2){
var offset=this.Constants.HATS_GAMES[i][j];
var mask=this.Constants.HATS_GAMES[i][j+1];
var byteRead=tempFile.readByte(offset);
if((byteRead & mask) === mask)
enabled--;
}
m('#button-unlockhatsgame'+i).get().disabled=!enabled;
}*/
this._countCurrentPanelPieces();
},
/* save function */
save:function(){
tempFile.writeInt(this.Offsets.STREETPASS_TAGS, getValue('sptags'));
tempFile.writeShort(this.Offsets.TICKETS, getValue('tickets'));
tempFile.writeShort(this.Offsets.FANTASTIC_RATINGS, getValue('fantastic'));
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html manifest="savegame-editor.appcache">
<head>
<title>Savegame Editor &ndash; Team Kirby Clash Deluxe</title>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
<meta name="description" content="A savegame editor for Team Kirby Clash Deluxe. It can edit values for your apple and materials."/>
<meta name="keywords" content="html5, savegame, save, editor, hack, exploit, 3ds, team kirby clash deluxe, free, apples"/>
<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"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./team-kirby-clash-dx.js"></script>
</head>
<body>
<!-- HEADER -->
<div id="header">
<div id="header-top">
<div class="row wrapper">
<h1 class="six columns text-left"><img src="favicon.png" /> Savegame Editor <small>for Team Kirby Clash Deluxe</small></h1>
<div class="six columns header-buttons text-right">
by <a href="/">Marc Robledo</a>
<i class="icon github"></i> <a href="https://github.com/marcrobledo/savegame-editors/tree/master/team-kirby-clash-dx" 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>
</div>
<div class="hidden row wrapper" id="toolbar">
<div class="twelve columns text-center">
<button class="close" onclick="closeFile()"><i class="icon close"></i> Close file</button>
<button class="colored" onclick="saveChanges()"><i class="icon accept"></i> Save changes</button>
</div>
</div>
</div>
</div>
<!-- THE EDITOR -->
<div id="the-editor" class="wrapper hidden">
<!-- PROFILE -->
<h3 class="orange">Profile</h3>
<div class="container">
<div class="row">
<div class="nine columns"><label for="input-name">Message</label></div>
<div class="three columns"><input id="input-name" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="input-time">Played time <small>(in seconds)</small></label></div>
<div class="three columns"><input id="input-time" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="input-missions">Completed missions</label></div>
<div class="three columns"><input id="input-missions" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="input-encounters">Encounters</label></div>
<div class="three columns"><input id="input-encounters" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="input-multiplayerbattles">Multiplayer battles</label></div>
<div class="three columns"><input id="input-multiplayerbattles" type="text" class="fw" /></div>
</div>
</div>
<!-- APPLE GEMS -->
<h3 class="red">Apple gems</h3>
<div class="container">
<div class="row">
<div class="nine columns"><label for="number-applegems">Apple gems</label></div>
<div class="three columns"><input id="number-applegems" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="number-boughtapplegems">Bought apple gems <small>(affects tree)</small></label></div>
<div class="three columns"><input id="number-boughtapplegems" type="text" class="fw" /></div>
</div>
</div>
<!-- CRYSTAL SHARDS -->
<h3 class="green">Crystal shards</h3>
<div class="container">
<div class="row">
<div class="nine columns"><label for="number-shards-red">Fire shards</label></div>
<div class="three columns"><input id="number-shards-red" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="number-shards-blue">Water shards</label></div>
<div class="three columns"><input id="number-shards-blue" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="number-shards-yellow">Light shards</label></div>
<div class="three columns"><input id="number-shards-yellow" type="text" class="fw" /></div>
</div>
<div class="row">
<div class="nine columns"><label for="number-shards-rare">Rare shards</label></div>
<div class="three columns"><input id="number-shards-rare" type="text" class="fw" /></div>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

View File

@ -0,0 +1,12 @@
CACHE MANIFEST
# last update 2017-07-06
#CACHE:
index.html
favicon.png
team-kirby-clash-dx.js
../savegame-editor.css
../savegame-editor.js
# force these files to be loaded in network
NETWORK:
*

View File

@ -0,0 +1,82 @@
/*
Team Kirby Clash Deluxe savegame editor v20170706
by Marc Robledo 2017
*/
SavegameEditor={
Name:'Team Kirby Clash Deluxe',
Filename:'savedata.dat',
/* Constants */
Offsets:{
APPLE_GEMS:0x199c,
BOUGHT_APPLE_GEMS:0x19b8,
SHARDS_RED:0x19bc,
SHARDS_BLUE:0x19c0,
SHARDS_YELLOW:0x19c4,
SHARDS_RARE:0x19c8,
PROFILE_NAME:0x1bb4,
PROFILE_PLAYED_TIME:0x1b74,
PROFILE_COMPLETED_MISSIONS:0x1b90,
PROFILE_MULTIPLAYER_BATTLES:0x1b94,
PROFILE_MULTIPLAYER_ENCOUNTERS:0x1b64
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize===8464)
},
/* preload function */
preload:function(){
setNumericRange('applegems', 0, 65535);
setNumericRange('boughtapplegems', 0, 3000);
setNumericRange('shards-red', 0, 999);
setNumericRange('shards-blue', 0, 999);
setNumericRange('shards-yellow', 0, 999);
setNumericRange('shards-rare', 0, 999);
setNumericRange('encounters', 0, 65535);
setNumericRange('multiplayerbattles', 0, 65535);
setNumericRange('time', 0, 0xffffffff);
setNumericRange('missions', 0, 0xffffffff);
},
/* load function */
load:function(){
tempFile.littleEndian=true;
tempFile.fileName='savedata.dat';
/* load data */
setValue('name', tempFile.readU16String(this.Offsets.PROFILE_NAME, 16));
setValue('time', tempFile.readInt(this.Offsets.PROFILE_PLAYED_TIME));
setValue('missions', tempFile.readInt(this.Offsets.PROFILE_COMPLETED_MISSIONS));
setValue('encounters', tempFile.readInt(this.Offsets.PROFILE_MULTIPLAYER_ENCOUNTERS));
setValue('multiplayerbattles', tempFile.readInt(this.Offsets.PROFILE_MULTIPLAYER_BATTLES));
setValue('applegems', tempFile.readShort(this.Offsets.APPLE_GEMS));
setValue('boughtapplegems', tempFile.readShort(this.Offsets.BOUGHT_APPLE_GEMS));
setValue('shards-red', tempFile.readShort(this.Offsets.SHARDS_RED));
setValue('shards-blue', tempFile.readShort(this.Offsets.SHARDS_BLUE));
setValue('shards-yellow', tempFile.readShort(this.Offsets.SHARDS_YELLOW));
setValue('shards-rare', tempFile.readShort(this.Offsets.SHARDS_RARE));
},
/* save function */
save:function(){
tempFile.writeU16String(this.Offsets.PROFILE_NAME, 16, getValue('name'));
tempFile.writeInt(this.Offsets.PROFILE_PLAYED_TIME, getValue('time'));
tempFile.writeInt(this.Offsets.PROFILE_COMPLETED_MISSIONS, getValue('missions'));
tempFile.writeInt(this.Offsets.PROFILE_MULTIPLAYER_ENCOUNTERS, getValue('encounters'));
tempFile.writeInt(this.Offsets.PROFILE_MULTIPLAYER_BATTLES, getValue('multiplayerbattles'));
tempFile.writeShort(this.Offsets.APPLE_GEMS, getValue('applegems'));
tempFile.writeShort(this.Offsets.BOUGHT_APPLE_GEMS, getValue('boughtapplegems'));
tempFile.writeShort(this.Offsets.SHARDS_RED, getValue('shards-red'));
tempFile.writeShort(this.Offsets.SHARDS_BLUE, getValue('shards-blue'));
tempFile.writeShort(this.Offsets.SHARDS_YELLOW, getValue('shards-yellow'));
tempFile.writeShort(this.Offsets.SHARDS_RARE, getValue('shards-rare'));
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB