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

Merge pull request #465 from magiczocker10/NintendogsCats

Nintendogs cats
This commit is contained in:
Marc Robledo 2024-11-02 12:49:30 +01:00 committed by GitHub
commit a2b9584fcc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 1119 additions and 236 deletions

125
nintendogs+cats/dialog.css Normal file
View File

@ -0,0 +1,125 @@
#menu[open] {
border: 0px solid gray;
border-radius: 5px;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
display: grid;
grid-template-areas:
'a b';
grid-template-columns: auto 1fr;
height: 100%;
padding: unset;
user-select: none;
width: max-content;
}
#menu .menu-sidebar {
display: none;
}
#menu[data-type="dog"] #menu-sidebar-dog {
display: unset;
}
#menu[data-type="cat"] #menu-sidebar-cat {
display: unset;
}
#menu-close {
position: absolute;
bottom: 0;
right: 0;
}
#menu-content {
grid-area: b;
height: 100%;
min-width: 454px;
position: relative;
width: 100%;
}
#menu-content > div {
margin: 5px;
}
.menu-sidebar {
background: #e6e6e7;
font-family: 'Open Sans',sans-serif;
grid-area: a;
overflow-y: scroll;
padding-left: 5px;
padding-right: 5px;
scrollbar-width: none;
text-align: left;
white-space: nowrap;
}
.menu-sidebar div {
padding: 5px;
}
.menu-sidebar .header {
color: gray;
font-size:small;
font-weight: bold;
}
.menu-sidebar .header:not(:first-of-type) {
padding-top: 10px;
}
.menu-sidebar > div[class^="page-"] {
text-indent: 1em;
}
.menu-sidebar > div[class^="page-"]:hover {
background: #cececf;
border-radius: 5px;
cursor: pointer;
}
.menu-sidebar > div[class$="-22"] {
text-indent: 2em;
}
.menu-sidebar > div[open] {
background: #cececf;
border-radius: 5px;
}
.sprite {
background-repeat: no-repeat;
display: inline-block;
height: 64px;
image-rendering: pixelated;
margin: 5px;
vertical-align: text-top;
width: 64px;
}
#eyecolor {
width: 100%;
display: none;
}
#menu[data-type="cat"] #eyecolor {
display: flex;
}
#eyecolor input {
display: none;
}
#eyecolor label {
background: #cececf;
width: 30%;
text-align: center;
}
#eyecolor input:checked + label {
background: gray;
color: white;
}
input#eye_gray + label {
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
}
input#eye_blue + label {
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}

179
nintendogs+cats/dialog.js Normal file
View File

@ -0,0 +1,179 @@
var spriteBaseURL = 'https://www.spriters-resource.com/resources/sheets/112/%0.png';
var spriteBaseURLLocal = 'sprites/%0.png';
var useLocal = false;
var spriteData = {
// Dogs
basset_hound: {sprite_id: '114733', row: 6},
beagle: {sprite_id: '114732', row: 6},
boxer: {sprite_id: '114888', row: 6},
bull_terrier: {sprite_id: '114889', row: 6},
chihuahua: {sprite_id: '114890', row: 6},
chihuahua1: {sprite_id: '114890', row: 2},
cocker_spaniel: {sprite_id: '114893', row: 5},
dalmatian: {sprite_id: '114891', row: 6},
french_bulldog: {sprite_id: '114892', row: 5},
german_shepherd_dog: {sprite_id: '114896', row: 6},
golden_retriever: {sprite_id: '114737', row: 6},
great_dane: {sprite_id: '114895', row: 6},
jack_russell_terrier: {sprite_id: '114898', row: 6},
labrador_retriever: {sprite_id: '114900', row: 5},
labrador_retriever1: {sprite_id: '114900', row: 1},
maltese: {sprite_id: '114734', row: 6},
miniature_dachshund: {sprite_id: '114902', row: 5},
miniature_dachshund1: {sprite_id: '114902', row: 1},
miniature_pinscher: {sprite_id: '114903', row: 5},
miniature_schnauzer: {sprite_id: '114904', row: 5},
miniature_schnauzer1: {sprite_id: '114904', row: 1},
pembroke_welsh_corgi: {sprite_id: '114899', row: 6},
pomeranian: {sprite_id: '114907', row: 6},
pomeranian1: {sprite_id: '114907', row: 1},
pug: {sprite_id: '114906', row: 5},
robo_pup: {sprite_id: '114735', row: 5},
shetland_sheepdog: {sprite_id: '114912', row: 6},
shiba: {sprite_id: '114908', row: 5},
shih_tzu: {sprite_id: '114909', row: 5},
siberian_husky: {sprite_id: '114897', row: 6},
spaniel: {sprite_id: '114901', row: 5},
toy_poodle: {sprite_id: '114905', row: 5},
toy_poodle1: {sprite_id: '114905', row: 1},
yorkshire_terrier: {sprite_id: '114736', row: 6},
// Cats
standard: {sprite_id: '114911', row: 6},
oriental: {sprite_id: '114910', row: 6},
longhair: {sprite_id: '114894', row: 18}
};
window.spriteData = spriteData;
var _writeU8 = function(variable, value) {
tempFile.writeU8(
SavegameEditor.Constants.PET_OFFSET[get('menu').dataset.pet]+SavegameEditor.Constants[variable],
Number(value)
);
};
window.addEventListener('load', function() {
'use strict';
const btnClose = document.getElementById('menu-close'),
menu = document.getElementById('menu'),
sidebar_dog = document.getElementById('menu-sidebar-dog'),
sidebar_cat = document.getElementById('menu-sidebar-cat'),
content = document.getElementById('menu-content'),
eyecolor = document.getElementById('eyecolor');
var sidebar_event = function(e) {
if (!e.target || !e.target.className || !e.target.className.startsWith('page-')) {return;}
var old = sidebar_dog.querySelector('div[open]');
if (old) {
old.removeAttribute('open');
content.querySelector('.' + old.className).style.display = 'none';
}
old = sidebar_cat.querySelector('div[open]');
if (old) {
old.removeAttribute('open');
content.querySelector('.' + old.className).style.display = 'none';
}
var tmp = e.target.className.match(/\d+/g);
if (tmp[0] >= 29 && tmp[0] <= 31) {
menu.dataset.type = 'cat';
} else {
menu.dataset.type = 'dog';
}
e.target.setAttribute('open', true);
var eye_color_offset = 255;
if (menu.dataset.type === 'cat')
eye_color_offset = Number(document.getElementById('eyecolor').querySelector(':checked').dataset.offset);
var newContent = content.querySelector('.' + e.target.className);
if (newContent && menu.dataset.type === 'cat') {
newContent.parentElement.removeChild(newContent);
newContent = undefined;
}
if (!newContent) {
newContent = document.createElement('div');
newContent.className = e.target.className;
var offset = Number(e.target.getAttribute('image-offset'));
var sD = spriteData[e.target.getAttribute('breed')];
var offX = -4;
var offY = -4 - 68 * Math.ceil(offset / sD.row);
var color = 0;
var style = 0;
var i_max = offset+Number(e.target.getAttribute('image-items'));
var correctionXOffset = 0;
var correctionYOffset = 0;
for (var i = offset; i<i_max; i++) {
if (newContent.className === 'page-9-1' && color === 2) { // Fix for Labrador Retriever - Black
correctionYOffset = 68;
} else if (newContent.className === 'page-17-22') { // Fix for German Shepherd Dog - White
correctionXOffset = 340;
} else if (newContent.className === 'page-14-2') { // Fix for Miniature Schnauzer - Surprise Me #1
if (i === 12) { // Correct image 1
correctionYOffset = 68 * 3;
} else if (i === 13) { // Correct image 2
correctionYOffset = 68 * 7;
} else if (i === 14 || i === 15 || i === 16) { // Correct images 3, 4 and 5
correctionYOffset = -(68 * 2);
}
} else if (newContent.className === 'page-14-12') { // Fix for Miniature Schnauzer - Surprise Me #2
if (i === 21) { // Correct image 5
correctionYOffset = 0;
} else {
correctionYOffset = -68;
}
}
if (menu.dataset.type === 'dog' || (i-offset) % 3 === eye_color_offset) {
var ele = document.createElement('div');
var baseURL = useLocal && spriteBaseURLLocal || spriteBaseURL;
ele.style.backgroundImage = 'url(' + baseURL.replaceAll('%0', sD.sprite_id) + ')';
ele.className = 'sprite';
ele.dataset.color = color;
ele.dataset.eye_color = eye_color_offset;
ele.dataset.style = style;
ele.style.backgroundPosition = (offX - correctionXOffset) + 'px ' + (offY - correctionYOffset) + 'px';
newContent.appendChild(ele);
style++;
}
offX -= 68;
if (((i-offset) > 0 || sD.row === 1) && (i-offset) % sD.row == sD.row-1) {
offX = -4;
offY -= 68;
}
if (style >= (e.target.dataset.percolor || 6)) {
color++;
style=0;
}
}
newContent.style.width = 74 * (e.target.dataset.percolor || 6) + 'px';
content.appendChild(newContent);
} else {
newContent.style.removeProperty('display');
}
e.target.scrollIntoViewIfNeeded();
};
window._sidebar_event = sidebar_event;
sidebar_dog.addEventListener('click', sidebar_event, false);
sidebar_cat.addEventListener('click', sidebar_event, false);
eyecolor.addEventListener('change', function(e) {
sidebar_cat.querySelector('[open]').click();
}, false);
content.addEventListener('click', function(e) {
if (!e.target.className.includes('sprite')) {return;}
var tmp = e.target.parentElement.className.match(/\d+/g);
_writeU8('PET_BREED_OFFSET', tmp[0]);
_writeU8('PET_BREED_VARIANT_OFFSET', tmp[1]);
_writeU8('PET_BREED_COLOR_OFFSET', e.target.dataset.color);
_writeU8('PET_BREED_EYE_COLOR_OFFSET', e.target.dataset.eye_color);
_writeU8('PET_BREED_STYLE_OFFSET',e.target.dataset.style);
var newImage = e.target.cloneNode();
var newImage2 = e.target.cloneNode();
newImage.id = 'petimage' + (Number(get('menu').dataset.pet)+1);
document.getElementById(newImage.id).replaceWith(newImage);
document.querySelector('label[for="pet_tab' + (Number(get('menu').dataset.pet)+1) + '"] .sprite').replaceWith(newImage2);
btnClose.click();
}, false);
btnClose.addEventListener('click', function(e) {
e.preventDefault();
menu.close();
}, false);
sidebar_event({target: document.getElementsByClassName('page-0-0')[0]});
}, false);

View File

@ -8,10 +8,14 @@
<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"/>
<link type="text/css" rel="stylesheet" href="./dialog.css">
<link type="text/css" rel="stylesheet" href="./nintendogs+cats.css" media="all"/>
<script type="text/javascript" src="../savegame-editor.js"></script>
<script type="text/javascript" src="./dialog.js"></script>
<script type="text/javascript" src="./personalities.js"></script>
<script type="text/javascript" src="./nintendogs+cats.js"></script>
<script type="text/javascript"><!--
/* service worker */
/* service worker */
var FORCE_HTTPS=true;
window.addEventListener('load',function(){
if(location.protocol==='http:' && FORCE_HTTPS)
@ -22,7 +26,218 @@
--></script>
</head>
<body>
<template id="template-row-pet">
<div class="pet_tab_content container">
<div class="row" id="row-petX">
<div class="columns c8"><label class="update-name" for="input-petX-name">Name</label></div>
<div class="columns c4"><input class="update-name" id="input-petX-name" type="text" class="fw" maxlength="10" /></div>
<div class="columns c8">Gender</div><div class="update-name columns c4" id="container-petX-gender" data-var="PET_GENDER_OFFSET" data-size="8"></div>
<div class="columns c8">Breed</div><div class="update-name columns c4" id="container-petX-breed"></div>
<div class="columns c6"><label class="update-name" for="input-petX-personality">Personality</label></div>
<div class="columns c6"><input class="update-name" id="input-petX-personality" type="text" class="fw" style="width:90%;" readonly/></div>
<div class="columns c8"><label class="update-name" for="number-petX-level">Level</label></div>
<div class="columns c4"><input class="update-name fw text-right" id="number-petX-level" type="text" /></div>
<div class="row container update-name" id="petX_comp_outer" style="width:100%;padding-left:0;padding-right:0">
<h3 class="orange" style="width:100%;">Times played (max 2 per day)</h3>
<div class="columns c8"><label class="update-name" for="number-petX-disc-played">Disc Competition</label></div>
<div class="update-name columns c4" data-global="1" data-var="PETX_COMP_DISC_PLAYED", data-size="8"><input class="update-name fw text-right" id="number-petX-disc-played" type="text" /></div>
<div class="columns c8"><label class="update-name" for="number-petX-lure-played">Lure Coursing</label></div>
<div class="update-name columns c4" data-global="1" data-var="PETX_COMP_LURE_PLAYED", data-size="8"><input class="update-name fw text-right" id="number-petX-lure-played" type="text" /></div>
<div class="columns c8"><label class="update-name" for="number-petX-obedience-played">Obedience Trial</label></div>
<div class="update-name columns c4" data-global="1" data-var="PETX_COMP_OBED_PLAYED", data-size="8"><input class="update-name fw text-right" id="number-petX-obed-played" type="text" /></div>
</div>
</div>
</div>
</template>
<dialog id="menu" data-type="dog">
<div class="menu-sidebar" id="menu-sidebar-dog">
<div class="header">Beagle</div>
<div breed='beagle' image-offset="0" image-items="30" class="page-0-0">Tricolour</div>
<div breed='beagle' image-offset="30" image-items="30" class="page-0-1">Lemon & White</div>
<div breed='beagle' image-offset="60" image-items="30" class="page-0-12">Surprise me!</div>
<div breed='beagle' image-offset="90" image-items="1" class="page-0-22">White</div>
<div class="header">Golden Retriever</div>
<div breed="golden_retriever" image-offset="0" image-items="10" class="page-1-0" data-percolor="2">Golden</div>
<div breed="golden_retriever" image-offset="12" image-items="30" class="page-1-12">Surprise me!</div>
<div breed='golden_retriever' image-offset="40" image-items="1" class="page-1-22">White</div>
<div class="header">Yorkshire Terrier</div>
<div breed="yorkshire_terrier" image-offset="0" image-items="30" class="page-2-0">Black & Tan</div>
<div breed="yorkshire_terrier" image-offset="30" image-items="30" class="page-2-12">Surprise me!</div>
<div breed='yorkshire_terrier' image-offset="60" image-items="1" class="page-2-22">White</div>
<div class="header">Miniature Dachshund</div>
<div breed="miniature_dachshund1" image-offset="0" image-items="5" class="page-3-0" data-percolor="1">Red</div>
<div breed="miniature_dachshund" image-offset="25" image-items="30" class="page-3-1">Black & Tan</div>
<div breed="miniature_dachshund" image-offset="55" image-items="30" class="page-3-12">Surprise me!</div>
<div breed='miniature_dachshund' image-offset="85" image-items="1" class="page-3-22">White</div>
<div class="header">Chihuahua #1</div>
<div breed="chihuahua1" image-offset="21" image-items="10" class="page-4-0" data-percolor="2">Cream</div>
<div breed="chihuahua" image-offset="96" image-items="30" class="page-4-12">Surprise me!</div>
<div breed="chihuahua" image-offset="126" image-items="1" class="page-4-22">White</div>
<div class="header">Chihuahua #2</div>
<div breed="chihuahua" image-offset="0" image-items="30" class="page-5-0">Red & White</div>
<div breed="chihuahua" image-offset="30" image-items="30" class="page-5-1">Tricolour</div>
<div breed='chihuahua' image-offset="60" image-items="1" class="page-5-22">White</div>
<div class="header">Toy Poodle #1</div>
<div breed='toy_poodle1' image-offset="0" image-items="5" class="page-6-0" data-percolor="1">Fluffy Muzzle</div>
<div breed='toy_poodle1' image-offset="5" image-items="1" class="page-6-22">White</div>
<div class="header">Toy Poodle #2</div>
<div breed='toy_poodle1' image-offset="6" image-items="5" class="page-7-0" data-percolor="1">Clipped Muzzle</div>
<div breed='toy_poodle' image-offset="55" image-items="30" class="page-7-12">Surprise me!</div>
<div breed='toy_poodle' image-offset="85" image-items="1" class="page-7-22">White</div>
<div class="header">Shiba</div>
<div breed='shiba' image-offset="0" image-items="30" class="page-8-0">Red & White</div>
<div breed='shiba' image-offset="30" image-items="30" class="page-8-1">Black & Tan #1</div>
<div breed='shiba' image-offset="60" image-items="30" class="page-8-2">Black & Tan #2</div>
<div breed='shiba' image-offset="90" image-items="30" class="page-8-12">Surprise me!</div>
<div breed='shiba' image-offset="120" image-items="1" class="page-8-22">White</div>
<div class="header">Labrador Retriever</div>
<div breed='labrador_retriever1' image-offset="0" image-items="5" class="page-9-0" data-percolor="1">Yellow</div>
<div breed='labrador_retriever1' image-offset="5" image-items="5" class="page-9-1" data-percolor="1">Black</div>
<div breed='labrador_retriever1' image-offset="11" image-items="5" class="page-9-2" data-percolor="1">Chocolate</div>
<div breed='labrador_retriever' image-offset="80" image-items="30" class="page-9-12">Surprise me!</div>
<div breed='labrador_retriever' image-offset="110" image-items="1" class="page-9-22">White</div>
<div class="header">Spaniel</div>
<div breed='spaniel' image-offset="0" image-items="30" class="page-10-0">Blentheim</div>
<div breed='spaniel' image-offset="30" image-items="30" class="page-10-1">Tricolour</div>
<div breed='spaniel' image-offset="60" image-items="5" class="page-10-2" data-percolor="1">Ruby</div>
<div breed='spaniel' image-offset="65" image-items="30" class="page-10-12">Surprise me!</div>
<div breed='spaniel' image-offset="95" image-items="1" class="page-10-22">White</div>
<div class="header">Pug</div>
<div breed='pug' image-offset="0" image-items="30" class="page-11-0">Silver</div>
<div breed='pug' image-offset="30" image-items="5" class="page-11-1" data-percolor="1">Black</div>
<div breed='pug' image-offset="35" image-items="30" class="page-11-2">Apricot</div>
<div breed='pug' image-offset="65" image-items="30" class="page-11-12">Surprise me!</div>
<div breed='pug' image-offset="95" image-items="1" class="page-11-22">White</div>
<div class="header">Shih Tzu</div>
<div breed='shih_tzu' image-offset="0" image-items="30" class="page-12-0">Brown & White</div>
<div breed='shih_tzu' image-offset="30" image-items="30" class="page-12-1">Brindle & White</div>
<div breed='shih_tzu' image-offset="60" image-items="30" class="page-12-12">Surprise me!</div>
<div breed='shih_tzu' image-offset="90" image-items="1" class="page-12-22">White</div>
<div class="header">Shetland Sheepdog</div>
<div breed='shetland_sheepdog' image-offset="0" image-items="30" class="page-13-0">Sable & White</div>
<div breed='shetland_sheepdog' image-offset="30" image-items="30" class="page-13-1">Bicolour</div>
<div breed='shetland_sheepdog' image-offset="60" image-items="30" class="page-13-2">Tricolour</div>
<div breed='shetland_sheepdog' image-offset="90" image-items="30" class="page-13-12">Surprise me!</div>
<div breed='shetland_sheepdog' image-offset="120" image-items="1" class="page-13-22">White</div>
<div class="header">Miniature Schnauzer</div>
<div breed='miniature_schnauzer' image-offset="0" image-items="30" class="page-14-0" >Pepper & Salt #1</div>
<div breed='miniature_schnauzer' image-offset="30" image-items="30" class="page-14-1">Pepper & Salt #2</div>
<div breed='miniature_schnauzer1' image-offset="12" image-items="5" class="page-14-2" data-percolor="1">Surprise me! #1</div>
<div breed='miniature_schnauzer1' image-offset="17" image-items="5" class="page-14-12" data-percolor="1">Surprise me! #2</div>
<div breed='miniature_schnauzer1' image-offset="22" image-items="1" class="page-14-22" data-percolor="1">White</div>
<div class="header">Pembroke Welsh Corgi</div>
<div breed='pembroke_welsh_corgi' image-offset="0" image-items="30" class="page-15-0">Sable & White</div>
<div breed='pembroke_welsh_corgi' image-offset="30" image-items="30" class="page-15-1">Tricolour</div>
<div breed='pembroke_welsh_corgi' image-offset="60" image-items="30" class="page-15-12">Surprise me!</div>
<div breed='pembroke_welsh_corgi' image-offset="90" image-items="1" class="page-15-22">White</div>
<div class="header">Miniature Pinscher</div>
<div breed='miniature_pinscher' image-offset="0" image-items="30" class="page-16-0">Black & Tan</div>
<div breed='miniature_pinscher' image-offset="30" image-items="30" class="page-16-1">Red #1</div>
<div breed='miniature_pinscher' image-offset="60" image-items="5" class="page-16-2" data-percolor="1">Red #2</div>
<div breed='miniature_pinscher' image-offset="65" image-items="30" class="page-16-12">Surprise me!</div>
<div breed='miniature_pinscher' image-offset="95" image-items="1" class="page-16-22">White</div>
<div class="header">German Shepherd Dog</div>
<div breed='german_shepherd_dog' image-offset="0" image-items="30" class="page-17-0">Black & Tan</div>
<div breed='german_shepherd_dog' image-offset="30" image-items="30" class="page-17-1">Sable #1</div>
<div breed='german_shepherd_dog' image-offset="60" image-items="30" class="page-17-2">Sable #2</div>
<div breed='german_shepherd_dog' image-offset="90" image-items="5" class="page-17-12" data-percolor="1">Surprise me!</div>
<div breed='german_shepherd_dog' image-offset="90" image-items="1" class="page-17-22" data-percolor="1">White</div>
<div class="header">Jack Russell Terrier</div>
<div breed='jack_russell_terrier' image-offset="0" image-items="30" class="page-18-0">Lemon & White</div>
<div breed='jack_russell_terrier' image-offset="30" image-items="30" class="page-18-1">Black & White</div>
<div breed='jack_russell_terrier' image-offset="60" image-items="30" class="page-18-12">Surprise me!</div>
<div breed='jack_russell_terrier' image-offset="90" image-items="1" class="page-18-22">White</div>
<div class="header">Siberian Husky</div>
<div breed='siberian_husky' image-offset="0" image-items="30" class="page-19-0">Black & White</div>
<div breed='siberian_husky' image-offset="30" image-items="30" class="page-19-1">Brown / White</div>
<div breed='siberian_husky' image-offset="60" image-items="30" class="page-19-2">Agouti & White</div>
<div breed='siberian_husky' image-offset="90" image-items="30" class="page-19-12">Surprise me!</div>
<div breed='siberian_husky' image-offset="120" image-items="1" class="page-19-22">White</div>
<div class="header">Boxer</div>
<div breed='boxer' image-offset="0" image-items="30" class="page-20-0">Fawn & White</div>
<div breed='boxer' image-offset="30" image-items="30" class="page-20-1">Brindle & White #1</div>
<div breed='boxer' image-offset="60" image-items="30" class="page-20-2">Brindle & White #2</div>
<div breed='boxer' image-offset="90" image-items="30" class="page-20-12">Surprise me!</div>
<div breed='boxer' image-offset="120" image-items="1" class="page-20-22">White</div>
<div class="header">Dalmatian</div>
<div breed='dalmatian' image-offset="0" image-items="30" class="page-21-0">With Spots #1</div>
<div breed='dalmatian' image-offset="30" image-items="30" class="page-21-1">With Spots #2</div>
<div breed='dalmatian' image-offset="60" image-items="30" class="page-21-12">Surprise me!</div>
<div breed='dalmatian' image-offset="90" image-items="1" class="page-21-22">White</div>
<div class="header">Pomeranian</div>
<div breed='pomeranian1' image-offset="0" image-items="5" class="page-22-0" data-percolor="1">Orange</div>
<div breed='pomeranian' image-offset="30" image-items="30" class="page-22-1">Black & Tan</div>
<div breed='pomeranian' image-offset="60" image-items="30" class="page-22-2">Parti-Coloured</div>
<div breed='pomeranian' image-offset="90" image-items="30" class="page-22-12">Surprise me!</div>
<div breed='pomeranian' image-offset="120" image-items="1" class="page-22-22">White</div>
<div class="header">French Bulldog</div>
<div breed='french_bulldog' image-offset="0" image-items="30" class="page-23-0">Black & White</div>
<div breed='french_bulldog' image-offset="30" image-items="30" class="page-23-1">Brindle</div>
<div breed='french_bulldog' image-offset="60" image-items="30" class="page-23-2">Fawn</div>
<div breed='french_bulldog' image-offset="90" image-items="30" class="page-23-12">Surprise me!</div>
<div breed='french_bulldog' image-offset="120" image-items="1" class="page-23-22">White</div>
<div class="header">Maltese</div>
<div breed='maltese' image-offset="0" image-items="30" class="page-24-12">White</div>
<div breed='maltese' image-offset="30" image-items="1" class="page-24-22">White</div>
<div class="header">Cocker Spaniel</div>
<div breed='cocker_spaniel' image-offset="0" image-items="30" class="page-25-0">Parti-Coloured #1</div>
<div breed='cocker_spaniel' image-offset="30" image-items="30" class="page-25-1">Parti-Coloured #2</div>
<div breed='cocker_spaniel' image-offset="60" image-items="5" class="page-25-2" data-percolor="1">Red</div>
<div breed='cocker_spaniel' image-offset="65" image-items="30" class="page-25-12">Surprise me!</div>
<div breed='cocker_spaniel' image-offset="95" image-items="1" class="page-25-22">White</div>
<div class="header">Great Dane</div>
<div breed='great_dane' image-offset="0" image-items="30" class="page-26-0">Mantle</div>
<div breed='great_dane' image-offset="30" image-items="30" class="page-26-1">Harlequin</div>
<div breed='great_dane' image-offset="60" image-items="30" class="page-26-2">Fawn</div>
<div breed='great_dane' image-offset="90" image-items="30" class="page-26-12">Surprise me!</div>
<div breed='great_dane' image-offset="120" image-items="1" class="page-26-22">White</div>
<div class="header">Bull Terrier</div>
<div breed='bull_terrier' image-offset="0" image-items="30" class="page-27-0">Black & White</div>
<div breed='bull_terrier' image-offset="30" image-items="30" class="page-27-1">Brindle & White</div>
<div breed='bull_terrier' image-offset="60" image-items="30" class="page-27-2">Red & White</div>
<div breed='bull_terrier' image-offset="90" image-items="30" class="page-27-12">Surprise me!</div>
<div breed='bull_terrier' image-offset="120" image-items="1" class="page-27-22">White</div>
<div class="header">Basset Hound</div>
<div breed='basset_hound' image-offset="0" image-items="30" class="page-28-0">Tricolour</div>
<div breed='basset_hound' image-offset="30" image-items="30" class="page-28-1">Lemon & White</div>
<div breed='basset_hound' image-offset="60" image-items="30" class="page-28-12">Surprise me!</div>
<div breed='basset_hound' image-offset="90" image-items="1" class="page-28-22">White</div>
<div class="header">Robo Pup</div>
<div breed='robo_pup' image-offset="0" image-items="10" class="page-32-0" data-percolor="1">Untitled #1</div>
<div breed='robo_pup' image-offset="10" image-items="10" class="page-32-1" data-percolor="1">Untitled #2</div>
<div breed='robo_pup' image-offset="20" image-items="1" class="page-32-22">White</div>
</div>
<div class="menu-sidebar" id="menu-sidebar-cat">
<div class="header">Standard Cat</div>
<div breed='standard' image-offset="390" image-items="180" class="page-29-2" data-percolor="6">Solid Richtig</div>
<div breed='standard' image-offset="0" image-items="180" class="page-29-0" data-percolor="6">Tabby Richtig</div>
<div breed='standard' image-offset="570" image-items="180" class="page-29-3" data-percolor="6">Spotted Tabby #1</div>
<div breed='standard' image-offset="750" image-items="18" class="page-29-4" data-percolor="6">Spotted Tabby #2</div>
<div breed='standard' image-offset="180" image-items="210" class="page-29-1" data-percolor="7">Calico</div>
<div breed='standard' image-offset="767" image-items="3" class="page-29-22" data-percolor="1">White</div>
<div class="header">Oriental Cat</div>
<div breed='oriental' image-offset="0" image-items="180" class="page-30-0" data-percolor="6">Pointed</div>
<div breed='oriental' image-offset="180" image-items="180" class="page-30-1" data-percolor="6">Smoke</div>
<div breed='oriental' image-offset="360" image-items="33" class="page-30-12" data-percolor="1">Surprise me!</div>
<div class="header">Longhaired Cat</div>
<div breed='longhair' image-offset="0" image-items="180" class="page-31-0" data-percolor="6">Pointed</div>
<div breed='longhair' image-offset="180" image-items="180" class="page-31-1" data-percolor="6">Bicolour #1</div>
<div breed='longhair' image-offset="360" image-items="180" class="page-31-2" data-percolor="6">Bicolour #2</div>
<div breed='longhair' image-offset="540" image-items="3" class="page-31-22" data-percolor="1">White</div>
</div>
<div id="menu-content">
<div id="eyecolor">
<input type="radio" name="eyecolor" id="eye_gray" data-offset="0" checked>
<label for="eye_gray">Gray</label>
<input type="radio" name="eyecolor" id="eye_yellow" data-offset="1">
<label for="eye_yellow">Yellow</label>
<input type="radio" name="eyecolor" id="eye_blue" data-offset="2">
<label for="eye_blue">Blue</label>
</div>
</div>
<button id="menu-close">OK</button>
</dialog>
<!-- HEADER -->
<div id="header">
<div id="header-top">
@ -49,149 +264,34 @@
<!-- Money -->
<h3 class="orange">Account</h3>
<div class="container">
<div class="row" id="row-lastsaved">
<div class="columns c7"><label for="input-lastsaved">Last Saved</label></div>
<div class="columns c3"><input id="input-lastsaved" type="text" class="fw text-right" readonly /></div>
<button class="columns c2" style="margin-left:0;margin-right:0" id="update-lastsaved">Now</button>
</div>
<div class="row" id="row-money">
<div class="columns c8"><label for="number-money">Money</label></div>
<div class="columns c4"><input id="number-money" type="text" class="fw text-right" /></div>
</div>
</div>
<h3 class="orange">Pet 1</h3>
<div class="container">
<div class="row" id="row-pet1">
<div class="columns c8"><label for="checkbox-pet1-active">Pet Present</label></div>
<div class="columns c4"><input id="checkbox-pet1-active" type="checkbox" class="fw" /></div>
<div class="columns c8"><label for="input-pet1-name">Name</label></div>
<div class="columns c4"><input id="input-pet1-name" type="text" class="fw" /></div>
<div class="columns c8">Gender</div><div class="columns c4" id="container-pet1-gender"></div>
<div class="columns c8">Breed</div><div class="columns c4" id="container-pet1-breed"></div>
<!-- Broken
<div class="columns c8"><label for="number-pet1-breed-color">Breed Color</label></div>
<div class="columns c4"><input id="number-pet1-breed-color" type="text" class="fw text-right" /></div>
-->
<!-- Experimental
<div class="columns c8"><label for="number-pet1-hunger">Hunger Status</label></div>
<div class="columns c4"><input id="number-pet1-hunger" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet1-thirst">Thirst Status</label></div>
<div class="columns c4"><input id="number-pet1-thirst" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet1-coat">Coat Status</label></div>
<div class="columns c4"><input id="number-pet1-coat" type="text" class="fw text-right" /></div>
-->
</div>
</div>
<h3 class="orange">Pet 2</h3>
<div class="container">
<div class="row" id="row-pet2">
<div class="columns c8"><label for="checkbox-pet2-active">Pet Present</label></div>
<div class="columns c4"><input id="checkbox-pet2-active" type="checkbox" class="fw" /></div>
<div class="columns c8"><label for="checkbox-pet2-name">Name</label></div>
<div class="columns c4"><input id="input-pet2-name" type="text" class="fw" /></div>
<div class="columns c8">Gender</div><div class="columns c4" id="container-pet2-gender"></div>
<div class="columns c8">Breed</div><div class="columns c4" id="container-pet2-breed"></div>
<!-- Broken
<div class="columns c8"><label for="number-pet2-breed-color">Breed Color</label></div>
<div class="columns c4"><input id="number-pet2-breed-color" type="text" class="fw text-right" /></div>
-->
<!-- Experimental
<div class="columns c8"><label for="number-pet2-hunger">Hunger Status</label></div>
<div class="columns c4"><input id="number-pet2-hunger" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet2-thirst">Thirst Status</label></div>
<div class="columns c4"><input id="number-pet2-thirst" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet2-coat">Coat Status</label></div>
<div class="columns c4"><input id="number-pet2-coat" type="text" class="fw text-right" /></div>
-->
</div>
</div>
<h3 class="orange">Pet 3</h3>
<div class="container">
<div class="row" id="row-pet3">
<div class="columns c8"><label for="checkbox-pet3-active">Pet Present</label></div>
<div class="columns c4"><input id="checkbox-pet3-active" type="checkbox" class="fw" /></div>
<div class="columns c8"><label for="input-pet3-name">Name</label></div>
<div class="columns c4"><input id="input-pet3-name" type="text" class="fw" /></div>
<div class="columns c8">Gender</div><div class="columns c4" id="container-pet3-gender"></div>
<div class="columns c8">Breed</div><div class="columns c4" id="container-pet3-breed"></div>
<!-- Broken
<div class="columns c8"><label for="number-pet3-breed-color">Breed Color</label></div>
<div class="columns c4"><input id="number-pet3-breed-color" type="text" class="fw text-right" /></div>
-->
<!-- Experimental
<div class="columns c8"><label for="number-pet3-hunger">Hunger Status</label></div>
<div class="columns c4"><input id="number-pet3-hunger" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet3-thirst">Thirst Status</label></div>
<div class="columns c4"><input id="number-pet3-thirst" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet3-coat">Coat Status</label></div>
<div class="columns c4"><input id="number-pet3-coat" type="text" class="fw text-right" /></div>
-->
</div>
</div>
<h3 class="orange">Pet 4</h3>
<div class="container">
<div class="row" id="row-pet4">
<div class="columns c8"><label for="checkbox-pet4-active">Pet Present</label></div>
<div class="columns c4"><input id="checkbox-pet4-active" type="checkbox" class="fw" /></div>
<div class="columns c8"><label for="input-pet4-name">Name</label></div>
<div class="columns c4"><input id="input-pet4-name" type="text" class="fw" /></div>
<div class="columns c8">Gender</div><div class="columns c4" id="container-pet4-gender"></div>
<div class="columns c8">Breed</div><div class="columns c4" id="container-pet4-breed"></div>
<!-- Broken
<div class="columns c8"><label for="number-pet4-breed-color">Breed Color</label></div>
<div class="columns c4"><input id="number-pet4-breed-color" type="text" class="fw text-right" /></div>
-->
<!-- Experimental
<div class="columns c8"><label for="number-pet4-hunger">Hunger Status</label></div>
<div class="columns c4"><input id="number-pet4-hunger" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet4-thirst">Thirst Status</label></div>
<div class="columns c4"><input id="number-pet4-thirst" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet4-coat">Coat Status</label></div>
<div class="columns c4"><input id="number-pet4-coat" type="text" class="fw text-right" /></div>
-->
</div>
</div>
<h3 class="orange">Pet 5</h3>
<div class="container">
<div class="row" id="row-pet5">
<div class="columns c8"><label for="checkbox-pet5-active">Pet Present</label></div>
<div class="columns c4"><input id="checkbox-pet5-active" type="checkbox" class="fw" /></div>
<div class="columns c8"><label for="input-pet5-name">Name</label></div>
<div class="columns c4"><input id="input-pet5-name" type="text" class="fw" /></div>
<div class="columns c8">Gender</div><div class="columns c4" id="container-pet5-gender"></div>
<div class="columns c8">Breed</div><div class="columns c4" id="container-pet5-breed"></div>
<!-- Broken
<div class="columns c8"><label for="number-pet5-breed-color">Breed Color</label></div>
<div class="columns c4"><input id="number-pet5-breed-color" type="text" class="fw text-right" /></div>
-->
<!-- Experimental
<div class="columns c8"><label for="number-pet5-hunger">Hunger Status</label></div>
<div class="columns c4"><input id="number-pet5-hunger" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet5-thirst">Thirst Status</label></div>
<div class="columns c4"><input id="number-pet5-thirst" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet5-coat">Coat Status</label></div>
<div class="columns c4"><input id="number-pet5-coat" type="text" class="fw text-right" /></div>
-->
</div>
</div>
<h3 class="orange">Pet 6</h3>
<div class="container">
<div class="row" id="row-pet6">
<div class="columns c8"><label for="checkbox-pet6-active">Pet Present</label></div>
<div class="columns c4"><input id="checkbox-pet6-active" type="checkbox" class="fw" /></div>
<div class="columns c8"><label for="input-pet6-name">Name</label></div>
<div class="columns c4"><input id="input-pet6-name" type="text" class="fw" /></div>
<div class="columns c8">Gender</div><div class="columns c4" id="container-pet6-gender"></div>
<div class="columns c8">Breed</div><div class="columns c4" id="container-pet6-breed"></div>
<!-- Broken
<div class="columns c8"><label for="number-pet6-breed-color">Breed Color</label></div>
<div class="columns c4"><input id="number-pet6-breed-color" type="text" class="fw text-right" /></div>
-->
<!-- Experimental
<div class="columns c8"><label for="number-pet6-hunger">Hunger Status</label></div>
<div class="columns c4"><input id="number-pet6-hunger" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet6-thirst">Thirst Status</label></div>
<div class="columns c4"><input id="number-pet6-thirst" type="text" class="fw text-right" /></div>
<div class="columns c8"><label for="number-pet6-coat">Coat Status</label></div>
<div class="columns c4"><input id="number-pet6-coat" type="text" class="fw text-right" /></div>
-->
<div class="row" id="row-owner-points">
<div class="columns c8"><label for="number-owner-points">Owner Points</label></div>
<div class="columns c4"><input class="fw text-right" id="number-owner-points" type="text" /></div>
</div>
<div class="row" id="row-pedometer">
<div class="columns c8"><label for="number-pedometer">Pedometer</label></div>
<div class="columns c4"><input id="number-pedometer" type="text" class="fw text-right" /></div>
</div>
<div class="row" id="row-streetpass-met">
<div class="columns c8"><label for="number-streetpass-met">People Met</label></div>
<div class="columns c4"><input id="number-streetpass-met" type="text" class="fw text-right" /></div>
</div>
<div class="row" id="row-walking-counter">
<div class="columns c7"><label for="input-walking-counter">Walking Counter</label></div>
<div class="columns c4"><input id="number-walking-counter" type="text" class="fw text-right" /></div>
</div>
</div>
<h3 class="orange">Pets</h3>
<div id="pet_tabs"></div>
<!-- Supplies -->
<h3 class="orange">Food & Drink</h3>
<div class="container">

View File

@ -0,0 +1,52 @@
#pet_tabs input:checked + label {
background: #2c2f34;
}
#pet_tabs input[type=radio] {
display: none;
}
#pet_tabs label.pet_label {
background: #4c4f53;
height: 50px;
display: inline-table;
text-align: center;
transition: background-color .15s;
}
#pet_tabs input:not(:checked) + label:hover {
background: #6e7177;
cursor: pointer;
}
.pet_label .sprite {
display: block;
}
.pet_tab_content {
display: none;
border-top-left-radius: 0;
}
#pet_tabs .pet_label {
padding: 5px;
}
#pet_tabs .pet_label .sprite {
margin:auto;
}
#pet_tabs .pet_label:nth-of-type(1) {
border-top-left-radius: 5px;
}
#pet_tabs .pet_label:last-of-type {
border-top-right-radius: 5px;
}
.pet_tab:checked:nth-of-type(1) ~ .pet_tab_content:nth-of-type(1),
.pet_tab:checked:nth-of-type(2) ~ .pet_tab_content:nth-of-type(2),
.pet_tab:checked:nth-of-type(3) ~ .pet_tab_content:nth-of-type(3),
.pet_tab:checked:nth-of-type(4) ~ .pet_tab_content:nth-of-type(4),
.pet_tab:checked:nth-of-type(5) ~ .pet_tab_content:nth-of-type(5),
.pet_tab:checked:nth-of-type(6) ~ .pet_tab_content:nth-of-type(6) {
display: block;
}

View File

@ -3,6 +3,31 @@
by Marc Robledo 2016
*/
var reg = /\d+/;
var diffs = [1056964607, 12582913, 6291456, 4194304];
for (var i = 0; i < 30; i++) {
diffs.push(diffs[diffs.length-2]*0.5);
}
var value = 0;
var level_borders = [];
for (var j = 0; j < 34; j++) {
var amount = 1;
if (j > 3 && j%2==1) {
amount = Math.pow(2, (j-1)*0.5)-1;
}
for (var k = 0; k < amount; k++) {
level_borders.push([value, value + diffs[j] - 1]);
value += diffs[j];
}
if (level_borders.length > 99999) {
level_borders.length = 100000;
break;
}
}
level_borders[99999][1] = 1203982336;
SavegameEditor={
Name:'Nintendogs + Cats',
Filename:'sysdata.dat',
@ -10,41 +35,14 @@ SavegameEditor={
/* Constants */
Constants:{
MONEY_OFFSET:0xA0,
LASTSAVED_OFFSET:0x10,
GENDERS:[
{value:0, name:'Male'},
{value:1, name:'Female'}
],
PET_BREEDS:[
{value:0, name:'Beagle'},
{value:1, name:'Golden Retriever'},
{value:2, name:'Yorkshire Terrier'},
{value:3, name:'Miniature Dachshund'},
{value:4, name:'Chihuahua'},
{value:5, name:'Chihuahua'},
{value:6, name:'Toy Poodle #1'},
{value:7, name:'Toy Poodle #2'},
{value:8, name:'Shiba'},
{value:9, name:'Labrador Retriever'},
{value:10, name:'Spaniel'},
{value:11, name:'Pug'},
{value:12, name:'Shih Tzu'},
{value:13, name:'Shetland Sheepdog'},
{value:14, name:'Miniature Schnauzer'},
{value:15, name:'Pembroke Welsh Corgi'},
{value:16, name:'Miniature Pinscher'},
{value:17, name:'German Shepherd Dog'},
{value:18, name:'Jack Russell Terrier'},
{value:19, name:'Siberian Husky'},
{value:20, name:'Boxer'},
{value:21, name:'Dalmatiner'},
{value:22, name:'Pomeranian'},
{value:23, name:'French Bulldog'},
{value:25, name:'Cocker Spaniel'},
{value:26, name:'Great Dane'},
{value:27, name:'Bull Terrier'},
{value:28, name:'Basset Hound'},
{value:32, name:'RoboPup'}
],
STREETPASS_MET_OFFSET: 0x98,
OWNER_POINTS_OFFSET: 0x9C,
PEDOMETER_OFFSET: 0x218,
PET_OFFSET:[
0x026A, // 618
0x1E6A, // 7,786
@ -53,14 +51,38 @@ SavegameEditor={
0x726A, // 29,290
0x8E6A // 36,458
],
PET_NAME_OFFSET: 0x42, // 66
PET_POINTS_OFFSET: 0x3E, // 62
PET_GENDER_OFFSET: 0x56, // 86
PET_HUNGER_OFFSET: 0x84, // 132
PET_THIRST_OFFSET: 0x88, // 136
PET_COAT_OFFSET: 0x8C, // 140
PET_BREED_OFFSET: 0x32, // 50
PET_BREED_COLOR_OFFSET: 0x33 // 51
PET_NAME_OFFSET: 0x42, // 66
PET_GENDER_OFFSET: 0x56, // 86
PET_POINTS_OFFSET_CAT: 0x5A, // 90
PET_POINTS_OFFSET_DOG: 0x62, // 98
PET_BREED_OFFSET: 0x32, // 50
PET_BREED_VARIANT_OFFSET: 0x33, // 51 = Variant (e.g. Spaniel = 0:Blentheim, 1:Tricolour, 2:Ruby)
PET_BREED_STYLE_OFFSET: 0x34, // 52 = Hairstyle
PET_BREED_EYE_COLOR_OFFSET: 0x35, // 53 = Eye Color (Cats: 0=gray, 1=yellow, 2=blue; Dogs: 255)
PET_BREED_COLOR_OFFSET: 0x36, // 54 = Fur Color
PET1_COMP_DISC_PLAYED: 0x24E,
PET1_COMP_OBED_PLAYED: 0x24F,
PET1_COMP_LURE_PLAYED: 0x250,
PET2_COMP_DISC_PLAYED: 0x251,
PET2_COMP_OBED_PLAYED: 0x252,
PET2_COMP_LURE_PLAYED: 0x253,
PET3_COMP_DISC_PLAYED: 0x254,
PET3_COMP_OBED_PLAYED: 0x255,
PET3_COMP_LURE_PLAYED: 0x256,
PET4_COMP_DISC_PLAYED: 0x257,
PET4_COMP_OBED_PLAYED: 0x258,
PET4_COMP_LURE_PLAYED: 0x259,
PET5_COMP_DISC_PLAYED: 0x25A,
PET5_COMP_OBED_PLAYED: 0x25B,
PET5_COMP_LURE_PLAYED: 0x25C,
PET6_COMP_DISC_PLAYED: 0x25D,
PET6_COMP_OBED_PLAYED: 0x25E,
PET6_COMP_LURE_PLAYED: 0x25F,
PET_PERSONALITIES_OFFSET_DOG1: 0x1F6,
PET_PERSONALITIES_OFFSET_DOG2: 0x1FA,
PET_PERSONALITIES_OFFSET_CAT1: 0x1EE,
PET_PERSONALITIES_OFFSET_CAT2: 0x1F2,
WALKING_COUNTER_OFFSET: 0x215
},
_write_money:function(){
@ -69,6 +91,24 @@ SavegameEditor={
getValue('money')
);
},
_write_streetpass_met:function(){
tempFile.writeU32(
SavegameEditor.Constants.STREETPASS_MET_OFFSET,
getValue('streetpass-met')
);
},
_write_pedometer:function(){
tempFile.writeU32(
SavegameEditor.Constants.PEDOMETER_OFFSET,
getValue('pedometer')
);
},
_write_walking_counter:function(){
tempFile.writeU8(
SavegameEditor.Constants.WALKING_COUNTER_OFFSET,
getValue('walking-counter')
);
},
_write_supply_amount:function(e){
tempFile.writeU8(
Number(e.target.dataset.offset),
@ -83,45 +123,57 @@ SavegameEditor={
10,
getValue(e.target.id)
);
document.getElementsByClassName('pet' + index + '_name')[0].innerText = getValue(e.target.id);
},
_write_u_number:function(e, n, o){
_write_u_number:function(e, n, o, g){
var index = Number((e.target.id).match(reg)[0]);
var offset = SavegameEditor.Constants.PET_OFFSET[index-1]+SavegameEditor.Constants[o];
var pet_offset = SavegameEditor.Constants.PET_OFFSET[index-1];
if (g) {
pet_offset = 0;
}
var offset = pet_offset+SavegameEditor.Constants[o];
tempFile['writeU' + n](
offset,
getValue(e.target.id)
Number(getValue(e.target.id))
);
},
_write_pet_gender:function(e){
SavegameEditor._write_u_number(e, 8, 'PET_GENDER_OFFSET');
_write_pet_value:function(e){
SavegameEditor._write_u_number(e, Number(e.target.parentElement.dataset.size), e.target.parentElement.dataset.var, e.target.parentElement.dataset.global);
},
_write_pet_points:function(e){
SavegameEditor._write_u_number(e, 24, 'PET_POINTS_OFFSET');
_getPetData(petOffset, value, size) {
return tempFile['readU' + (size || 8)](SavegameEditor.Constants.PET_OFFSET[petOffset]+SavegameEditor.Constants[value]);
},
_write_pet_hunger:function(e){
SavegameEditor._write_u_number(e, 16, 'PET_HUNGER_OFFSET');
_mark_as_changed(e) {
e.target.dataset.data_changed=true;
},
_write_pet_thirst:function(e){
SavegameEditor._write_u_number(e, 16, 'PET_THIRST_OFFSET');
},
_write_pet_coat:function(e){
SavegameEditor._write_u_number(e, 16, 'PET_COAT_OFFSET');
},
_write_pet_breed:function(e){
SavegameEditor._write_u_number(e, 8, 'PET_BREED_OFFSET');
},
_write_pet_breed_color:function(e){
SavegameEditor._write_u_number(e, 8, 'PET_BREED_COLOR_OFFSET');
},
/* check if savegame is valid */
checkValidSavegame:function(){
return (tempFile.fileSize==60936);
},
preload:function() {
var btn_last_saved = document.getElementById('update-lastsaved');
btn_last_saved.addEventListener('click', function(e) {
tempFile.writeU32(
SavegameEditor.Constants.LASTSAVED_OFFSET,
Math.floor(Date.now() * 0.001)
);
var a = new Date (Number(tempFile.readU32(SavegameEditor.Constants.LASTSAVED_OFFSET)) * 1000);
a.setHours(a.getHours() - a.getTimezoneOffset()/60);
setValue('lastsaved', a.toLocaleString("en-GB", {
day: "numeric",
month: "short",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit"
}));
}, false);
get('number-money').addEventListener('change', SavegameEditor._write_money);
get('number-streetpass-met').addEventListener('change', SavegameEditor._write_streetpass_met);
get('number-pedometer').addEventListener('change', SavegameEditor._write_pedometer);
get('number-walking-counter').addEventListener('change', SavegameEditor._write_walking_counter);
fetch('/savegame-editors/nintendogs+cats/supplies.json')
.then(function(response) {
return response.json();
@ -163,47 +215,191 @@ SavegameEditor={
setValue('money', tempFile.readU32(SavegameEditor.Constants.MONEY_OFFSET));
setNumericRange('money', 0, 9999999);
for (var i=0; i<6; i++){
var pet_present = tempFile.readU8(SavegameEditor.Constants.PET_OFFSET[i]) > 0;
getField('checkbox-pet' + (i+1) + '-active').checked = pet_present;
get('container-pet' + (i+1) + '-breed').appendChild(select('pet'+(i+1)+'-breed', SavegameEditor.Constants.PET_BREEDS, SavegameEditor._write_pet_breed));
get('container-pet' + (i+1) + '-gender').appendChild(select('pet' + (i+1) + '-gender', SavegameEditor.Constants.GENDERS, SavegameEditor._write_pet_gender));
getField('checkbox-pet' + (i+1) + '-active').setAttribute('disabled', '');
getField('input-pet' + (i+1) + '-name').readOnly = !pet_present;
if (pet_present) {
getField('select-pet' + (i+1) + '-gender').removeAttribute('disabled');
getField('select-pet' + (i+1) + '-breed').removeAttribute('disabled');
} else {
getField('select-pet' + (i+1) + '-gender').setAttribute('disabled', '');
getField('select-pet' + (i+1) + '-breed').setAttribute('disabled', '');
setValue('streetpass-met', tempFile.readU32(SavegameEditor.Constants.STREETPASS_MET_OFFSET));
setNumericRange('streetpass-met', 0, 9999999);
setValue('pedometer', tempFile.readU32(SavegameEditor.Constants.PEDOMETER_OFFSET));
setNumericRange('pedometer', 0, 9999999);
setValue('walking-counter', tempFile.readU8(SavegameEditor.Constants.WALKING_COUNTER_OFFSET));
setNumericRange('walking-counter', 0, 255);
setNumericRange('owner-points', 0, 99999);
var owner_points = tempFile.readU32(SavegameEditor.Constants.OWNER_POINTS_OFFSET);
for (var k = 0; k < level_borders.length; k++) {
if (owner_points >= level_borders[k][0] && owner_points <= level_borders[k][1]) {
setValue('owner-points', k);
break;
}
setValue('pet' + (i+1) + '-name', tempFile.readU16String(SavegameEditor.Constants.PET_OFFSET[i]+SavegameEditor.Constants.PET_NAME_OFFSET, 10));
setValue('pet' + (i+1) + '-gender', tempFile.readU8(SavegameEditor.Constants.PET_OFFSET[i]+SavegameEditor.Constants.PET_GENDER_OFFSET));
setValue('pet' + (i+1) + '-breed', tempFile.readU8(SavegameEditor.Constants.PET_OFFSET[i]+SavegameEditor.Constants.PET_BREED_OFFSET));
get('input-pet' + (i+1) + '-name').addEventListener('change', SavegameEditor._write_pet_name);
// Experimental
/*
getField('number-pet' + (i+1) + '-hunger').readOnly = !pet_present;
getField('number-pet' + (i+1) + '-thirst').readOnly = !pet_present;
getField('number-pet' + (i+1) + '-coat').readOnly = !pet_present;
setNumericRange('pet' + (i+1) + '-hunger', 0, 17529);
setNumericRange('pet' + (i+1) + '-thirst', 0, 17529);
setNumericRange('pet' + (i+1) + '-coat', 0, 17529);
setValue('pet' + (i+1) + '-hunger', tempFile.readU16(SavegameEditor.Constants.PET_OFFSET[i]+SavegameEditor.Constants.PET_HUNGER_OFFSET));
setValue('pet' + (i+1) + '-thirst', tempFile.readU16(SavegameEditor.Constants.PET_OFFSET[i]+SavegameEditor.Constants.PET_THIRST_OFFSET));
setValue('pet' + (i+1) + '-coat', tempFile.readU16(SavegameEditor.Constants.PET_OFFSET[i]+SavegameEditor.Constants.PET_COAT_OFFSET));
get('number-pet' + (i+1) + '-hunger').addEventListener('change', SavegameEditor._write_pet_hunger);
get('number-pet' + (i+1) + '-thirst').addEventListener('change', SavegameEditor._write_pet_thirst);
get('number-pet' + (i+1) + '-coat').addEventListener('change', SavegameEditor._write_pet_coat);
*/
}
var level_ele_ = get('number-owner-points');
level_ele_.addEventListener('change', SavegameEditor._mark_as_changed);
var a = new Date (Number(tempFile.readU32(SavegameEditor.Constants.LASTSAVED_OFFSET)) * 1000);
setValue('lastsaved', a.toLocaleString("en-GB", {
day: "numeric",
month: "short",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
timezone: "Europe/London"
}));
var template = document.getElementById("template-row-pet");
var pet_tabs = document.getElementById('pet_tabs');
pet_tabs.innerText = '';
var pet_tabs_content_seperator = document.createElement('div');
pet_tabs.appendChild(pet_tabs_content_seperator);
var first_pet = true;
for (var i=1; i<7; i++){
var pet_present = tempFile.readU8(SavegameEditor.Constants.PET_OFFSET[i-1]) > 0;
if (!pet_present) {continue;}
var pet_tab_input = document.createElement('input');
pet_tab_input.name = 'pet_tabgroup';
pet_tab_input.type = 'radio';
pet_tab_input.id = 'pet_tab' + i;
if (first_pet) {
pet_tab_input.checked = true;
first_pet = false;
}
pet_tab_input.className = 'pet_tab';
pet_tabs.insertBefore(pet_tab_input, pet_tabs_content_seperator);
var pet_tab_label = document.createElement('label');
pet_tab_label.className = 'pet_label';
pet_tab_label.setAttribute('for', 'pet_tab' + i);
pet_tabs.insertBefore(pet_tab_label, pet_tabs_content_seperator);
var templateClone = template.content.cloneNode(true);
templateClone.querySelector('.row').id="row-pet"+i;
for (var ele of templateClone.querySelectorAll('.update-name')) {
if ((ele.id || '').includes('petX')) {
ele.id = ele.id.replaceAll('petX', 'pet' + i);
}
if (ele.getAttribute('for')) {
ele.setAttribute('for', ele.getAttribute('for').replaceAll('petX', 'pet' + i));
}
if ((ele.dataset && ele.dataset.var || '').includes('PETX')) {
ele.dataset.var = ele.dataset.var.replaceAll('PETX', 'PET' + i);
}
}
var breed = SavegameEditor._getPetData(i-1, 'PET_BREED_OFFSET');
var isDog = true;
if (breed > 28 && breed < 32)
isDog = false;
pet_tabs.appendChild(templateClone);
var dialogClassName = 'page-' +
breed +
'-' +
SavegameEditor._getPetData(i-1, 'PET_BREED_VARIANT_OFFSET');
const dialogEle = document.getElementsByClassName(
dialogClassName
)[0];
if (!isDog) {
document.getElementById('eyecolor').querySelector('[data-offset="' + SavegameEditor._getPetData(i-1, 'PET_BREED_EYE_COLOR_OFFSET') + '"]').checked=true;
}
window._sidebar_event({
target: dialogEle
});
var breedImg = document.createElement('img');
var breedImgTmp = document
.getElementById('menu-content')
.getElementsByClassName(dialogClassName)[0]
.querySelector('div[data-color="' + SavegameEditor._getPetData(i-1, 'PET_BREED_COLOR_OFFSET') + '"][data-style="' + SavegameEditor._getPetData(i-1, 'PET_BREED_STYLE_OFFSET') + '"]'
);
if (breedImgTmp) {
breedImg = breedImgTmp.cloneNode();
breedImg.id='petimage'+i;
}
get('container-pet' + i + '-breed').appendChild(breedImg);
var breedImg2 = breedImg.cloneNode();
breedImg2.id = '';
pet_tab_label.appendChild(breedImg2);
var dialogbtn = document.createElement('button');
dialogbtn.dataset.pet = i - 1;
dialogbtn.onclick = function(e) {
e.preventDefault();
get('menu').dataset.pet = e.target.dataset.pet;
get('menu').showModal();
var breed = SavegameEditor._getPetData(e.target.dataset.pet, 'PET_BREED_OFFSET');
var dialogClassName_ = 'page-' +
breed +
'-' +
SavegameEditor._getPetData(e.target.dataset.pet, 'PET_BREED_VARIANT_OFFSET');
var dialogEle_ = document.getElementsByClassName(
dialogClassName_
)[0];
if (breed > 28 && breed < 32) {
document.getElementById('eyecolor').querySelector('[data-offset="' + SavegameEditor._getPetData(e.target.dataset.pet, 'PET_BREED_EYE_COLOR_OFFSET') + '"]').checked=true;
}
window._sidebar_event({
target: dialogEle_
});
};
dialogbtn.innerText = 'Change';
get('container-pet' + i + '-breed').appendChild(dialogbtn);
get('container-pet' + i + '-gender').appendChild(select('pet' + i + '-gender', SavegameEditor.Constants.GENDERS, SavegameEditor._write_pet_value));
setValue('pet' + i + '-name', tempFile.readU16String(SavegameEditor.Constants.PET_OFFSET[i-1]+SavegameEditor.Constants.PET_NAME_OFFSET, 10));
var pet_tab_label_name = document.createElement('span');
pet_tab_label_name.innerText = getValue('pet' + i + '-name');
pet_tab_label_name.className = 'pet' + i + '_name';
pet_tab_label.appendChild(pet_tab_label_name);
setValue('pet' + i + '-gender', SavegameEditor._getPetData(i-1, 'PET_GENDER_OFFSET'));
get('input-pet' + i + '-name').addEventListener('change', SavegameEditor._write_pet_name);
setNumericRange('pet' + i + '-disc-played', 0, 2);
setValue('pet' + i + '-disc-played', tempFile.readU8(SavegameEditor.Constants['PET' + i + '_COMP_DISC_PLAYED']));
get('number-pet' + i + '-disc-played').addEventListener('change', SavegameEditor._write_pet_value);
setNumericRange('pet' + i + '-lure-played', 0, 2);
setValue('pet' + i + '-lure-played', tempFile.readU8(SavegameEditor.Constants['PET' + i + '_COMP_LURE_PLAYED']));
get('number-pet' + i + '-lure-played').addEventListener('change', SavegameEditor._write_pet_value);
setNumericRange('pet' + i + '-obed-played', 0, 2);
setValue('pet' + i + '-obed-played', tempFile.readU8(SavegameEditor.Constants['PET' + i + '_COMP_OBED_PLAYED']));
get('number-pet' + i + '-obed-played').addEventListener('change', SavegameEditor._write_pet_value);
var personality = window.personalities[SavegameEditor._getPetData(i-1, 'PET_PERSONALITIES_OFFSET_' + (isDog ? 'DOG' : 'CAT') + '1', 8)][SavegameEditor._getPetData(i-1, 'PET_PERSONALITIES_OFFSET_' + (isDog ? 'DOG' : 'CAT') + '2', 8)];
setValue('pet' + i + '-personality', personality[Number(SavegameEditor._getPetData(i-1, 'PET_GENDER_OFFSET'))]);
setNumericRange('pet' + i + '-level', 0, 99999);
var points = SavegameEditor._getPetData(i-1, (isDog ? 'PET_POINTS_OFFSET_DOG' : 'PET_POINTS_OFFSET_CAT'), 32);
for (var j = 0; j < level_borders.length; j++) {
if (points >= level_borders[j][0] && points <= level_borders[j][1]) {
setValue('pet' + i + '-level', j);
break;
}
}
var level_ele = get('number-pet' + i + '-level');
level_ele.dataset.is_dog = isDog;
level_ele.addEventListener('change', SavegameEditor._mark_as_changed);
}
pet_tabs.removeChild(pet_tabs_content_seperator);
},
/* save function */
save:function(){
var changed_levels = document.querySelectorAll('[data-data_changed]');
for (var i = 0; i < changed_levels.length; i++) {
var value_old = changed_levels[i].value;
setNumericRange(changed_levels[i].id.substring(7));
changed_levels[i].value = level_borders[changed_levels[i].value][0];
if (changed_levels[i].id === 'number-owner-points') {
tempFile.writeU32(
SavegameEditor.Constants.OWNER_POINTS_OFFSET,
getValue('owner-points')
);
} else {
SavegameEditor._write_u_number(
{target: {id: changed_levels[i].id}},
32,
changed_levels[i].dataset.is_dog ? 'PET_POINTS_OFFSET_DOG' : 'PET_POINTS_OFFSET_CAT'
);
}
changed_levels[i].value = value_old;
delete changed_levels[i].dataset.data_changed;
setNumericRange(changed_levels[i].id.substring(0, 99999));
}
}
};

View File

@ -0,0 +1,231 @@
var personalities = [
[ // 0
null,
null,
[
'This mischievous male is curious about everything.',
'This inquisitive little female is curious about everything.'
],
[
'This lively male is full of energy for running around.',
'This lively female is full of energy for running around.'
],
[
'This boisterous little male loves playing with everyone.',
'This boisterous young female loves playing with everyone.'
],
[
'This male is quite calm, but enjoys plenty of exercise',
'This female is quite calm, but enjoys plenty of exercise'
],
[
'This cheeky little tyke has a sharp mind about him.',
'This cheeky little lass has a sharp mind about her.'
],
[
'This bumbling male just loves running and jumping around.',
'This dizzy female just loves running and jumping around.'
],
[
'This fiery male can be a bit possessive with his owner.',
'This spirited little female loves having her owner all to herself.'
]
],
[ // 1
null,
null,
[
'This lad is curious, but likes to take things at his own pace.',
'This girl is curious but likes to take things at her own pace.'
],
[
'This laid-back male is happiest when playing with his toys.',
'This gentle female is happies when playing with her toys.'
],
[
'This little rascal does just what he likes and in his own time.',
'This little tomboy does what she likes and in her own time.'
],
[
'This young male is easy-going and adored by everyone.',
'This young female is easy-going and adored by all.'
],
[
'This proud little male leads a mellow, relaxed life.',
'This proud little female leads a mellow, relaxed life.'
],
[
'This carefree male is friendly with anyone, even strangers.',
'This carefree female is friendly with anyone, even strangers.'
],
[
'This relaxed male gets on better with people than dogs.',
'This quiet female gets on better with people than dogs.'
]
],
[ // 2
null,
null,
null,
[
'This happy male is fascinated by the world around him.',
'This happy female is fascinated by the world around her.'
],
[
'This male is very curious and loves to play with everyone.',
'This female is very curious and loves to play with everyone.'
],
[
'This mild-mannered male is interested in all sorts of things.',
'This mild-mannered female is interested in all sorts of things.'
],
[
'This inquisitive little male is as bright as a button.',
'This inquisitive little female is as bright as a button.'
],
[
'This giddy little lad simply adores everything around him.',
'This giddy little lass simply adores everything around her.'
],
[
'This inquisitive little boy loves attention from his owner.',
'This inquisitive little girl loves attention from her owner.'
]
],
[ // 3
null,
null,
null,
null,
[
'This spoilt little prince loves to play around with his toys.',
'What this little tomboy likes best is playing with her toys.'
],
[
'This bright and cheerful lad is beloved by all who meet him.',
'This bright and cheerful girl is beloved by all who meet her.'
],
[
'This proud little male loves to play with his toys.',
'What this proud little lady likes best is playing with her toys.'
],
[
'This cheerful male is friendly with anyone, even new people.',
'This cheerful female is friendly with anyone, even new people.'
],
[
'This male is shy with other pets but he loves people and toys.',
'This female is shy with other pets but loves people and toys.'
]
],
[ // 4
null,
null,
null,
null,
null,
null,
[
'This mischievous male is as clever as he is naughty.',
'This mischievous female is as clever as she is naughty.'
],
[
'This dopey male loves nothing better than to play with friends.',
'This dopey female loves nothing better than to play with friends.'
],
[
'This naughty little lad can be a bit jealous around his owner.',
'This naughty little lass can be a bit jealous around her owner.'
]
],
[ // 5
null,
null,
null,
null,
null,
null,
[
'This fiery male has a hard time getting on with his peers.',
'This fiery female has a hard time getting on with her peers.'
],
[
'This docile male is open with friends and strangers alike.',
'This gentle female is open with friends and strangers alike.'
],
[
'This lad loves the company of people - his owner most of all!',
'This girl loves the company of people - her owner most of all!'
]
],
[ // 6
null,
null,
null,
null,
null,
null,
null,
[
'This male is a bit stubborn, so he\'ll need a kind but firm hand.',
'This female is a bit stubborn and needs a kind but firm hand.'
],
[
'This proud male loves it when he has his owner all to himself.',
'This proud young female loves having her owner all to herself.'
]
],
[ // 7
null,
null,
null,
null,
null,
null,
null,
null,
[
'This male is very fond of people and will approach anyone.',
'This female is fond of people and will approach anyone.'
]
],
[] // 8
];
personalities[1][0] = personalities[0][1];
personalities[2][0] = personalities[0][2];
personalities[2][1] = personalities[1][2];
personalities[3][0] = personalities[0][3];
personalities[3][1] = personalities[1][3];
personalities[3][2] = personalities[2][3];
personalities[4][0] = personalities[0][4];
personalities[4][1] = personalities[1][4];
personalities[4][2] = personalities[2][4];
personalities[4][3] = personalities[3][4];
personalities[5][0] = personalities[0][5];
personalities[5][1] = personalities[1][5];
personalities[5][2] = personalities[2][5];
personalities[5][3] = personalities[3][5];
personalities[5][4] = personalities[4][5];
personalities[6][0] = personalities[0][6];
personalities[6][1] = personalities[1][6];
personalities[6][2] = personalities[2][6];
personalities[6][3] = personalities[3][6];
personalities[6][4] = personalities[4][6];
personalities[6][5] = personalities[5][6];
personalities[7][0] = personalities[0][7];
personalities[7][1] = personalities[1][7];
personalities[7][2] = personalities[2][7];
personalities[7][3] = personalities[3][7];
personalities[7][4] = personalities[4][7];
personalities[7][5] = personalities[5][7];
personalities[7][6] = personalities[6][7];
personalities[8][0] = personalities[0][8];
personalities[8][1] = personalities[1][8];
personalities[8][2] = personalities[2][8];
personalities[8][3] = personalities[3][8];
personalities[8][4] = personalities[4][8];
personalities[8][5] = personalities[5][8];
personalities[8][6] = personalities[6][8];
personalities[8][7] = personalities[7][8];
window.personalities = personalities;