Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions src/lib/addressconverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,28 @@ export const bsvirt_to_fsvirt = new AddressSectionMapper([
{ off_beg: 0x8044ec00, off_end: 0x804ac804, delta: 0x1a0 },
{ off_beg: 0x804ac880, off_end: 0x8081f013, delta: 0x200 },
]);

// Boom Street Virtual to Itadaki Street Wii Virtual
export const bsvirt_to_isvirt = new AddressSectionMapper([
{ off_beg: 0x80000100, off_end: 0x8007a283, delta: 0x0 },
{ off_beg: 0x8007a2f4, off_end: 0x80268717, delta: 0x94 },
{ off_beg: 0x8026871f, off_end: 0x8040d97b, delta: 0x90 },
{ off_beg: 0x8040d97f, off_end: 0x80410278, delta: 0x80 },
{ off_beg: 0x80410578, off_end: 0x8044ebe3, delta: 0x2a8 },
{ off_beg: 0x8044ebff, off_end: 0x804ac804, delta: 0x2c0 },
{ off_beg: 0x804ac880, off_end: 0x8081f013, delta: 0x300 },
]);

// Itadaki Street Wii Virtual to Itadaki Street Wii File
export const isvirt_to_isfile = new AddressSectionMapper([
{ off_beg: 0x80004000, off_end: 0x80006720, delta: 0x80003f00 },
{ off_beg: 0x80006720, off_end: 0x80006c80, delta: 0x7fbfda80 },
{ off_beg: 0x80006c80, off_end: 0x80007480, delta: 0x7fbfda80 },
{ off_beg: 0x80007480, off_end: 0x8040d900, delta: 0x80004c60 },
{ off_beg: 0x8040d900, off_end: 0x8040de40, delta: 0x80003f00 },
{ off_beg: 0x8040de40, off_end: 0x8040de60, delta: 0x80003f00 },
{ off_beg: 0x8040de80, off_end: 0x8044e940, delta: 0x80003f20 },
{ off_beg: 0x8044e940, off_end: 0x804ac560, delta: 0x80003f20 },
{ off_beg: 0x80814980, off_end: 0x808170c0, delta: 0x8036c340 },
{ off_beg: 0x80818ca0, off_end: 0x8081ece0, delta: 0x8036df20 },
]);
64 changes: 58 additions & 6 deletions src/pages/calculator.astro
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
import Layout from '~/layouts/layout.astro';
---
<script>
import { bsvirt_to_bsfile, bsvirt_to_fsvirt, fsvirt_to_fsfile } from '~/lib/addressconverter';
import { bsvirt_to_bsfile, bsvirt_to_fsvirt, bsvirt_to_isvirt, fsvirt_to_fsfile, isvirt_to_isfile } from '~/lib/addressconverter';

let fsvirt: number | null;
let bsvirt: number | null;
let isvirt: number | null;
let fsfile: number | null;
let bsfile: number | null;
let isfile: number | null;

const setAddress = (input: HTMLInputElement, address: number | null): number | null => {
if (address !== null) {
Expand All @@ -18,48 +20,71 @@ import Layout from '~/layouts/layout.astro';

const fsvirt_input = document.getElementById('fsvirt_input') as HTMLInputElement;
const bsvirt_input = document.getElementById('bsvirt_input') as HTMLInputElement;
const isvirt_input = document.getElementById('isvirt_input') as HTMLInputElement;
const fsfile_input = document.getElementById('fsfile_input') as HTMLInputElement;
const bsfile_input = document.getElementById('bsfile_input') as HTMLInputElement;
const isfile_input = document.getElementById('isfile_input') as HTMLInputElement;

const inputHandler = (e: Event) => {
const target = e.target as HTMLInputElement;
fsvirt_input.classList.remove('is-valid', 'is-invalid');
bsvirt_input.classList.remove('is-valid', 'is-invalid');
isvirt_input.classList.remove('is-valid', 'is-invalid');
fsfile_input.classList.remove('is-valid', 'is-invalid');
bsfile_input.classList.remove('is-valid', 'is-invalid');
isfile_input.classList.remove('is-valid', 'is-invalid');
let address = parseInt(target.value, 16);

switch (target) {
case fsvirt_input:
fsvirt = address;
bsvirt = setAddress(bsvirt_input, bsvirt_to_fsvirt.inverseMap(fsvirt));
if (bsvirt !== null) {
isvirt = setAddress(isvirt_input, bsvirt_to_isvirt.map(bsvirt));
if (bsvirt !== null || isvirt !== null) {
target.classList.add('is-valid');
setAddress(fsfile_input, fsvirt_to_fsfile.map(fsvirt));
setAddress(bsfile_input, bsvirt_to_bsfile.map(bsvirt));
setAddress(isfile_input, isvirt_to_isfile.map(isvirt));
} else {
target.classList.add('is-invalid');
}
break;
case bsvirt_input:
bsvirt = address;
fsvirt = setAddress(fsvirt_input, bsvirt_to_fsvirt.map(bsvirt));
if (fsvirt !== null) {
isvirt = setAddress(isvirt_input, bsvirt_to_isvirt.map(bsvirt));
if (fsvirt !== null || isvirt !== null) {
target.classList.add('is-valid');
setAddress(fsfile_input, fsvirt_to_fsfile.map(fsvirt));
setAddress(bsfile_input, bsvirt_to_bsfile.map(bsvirt));
setAddress(isfile_input, isvirt_to_isfile.map(isvirt));
} else {
target.classList.add('is-invalid');
}
break;
case isvirt_input:
isvirt = address;
bsvirt = setAddress(bsvirt_input, bsvirt_to_isvirt.inverseMap(isvirt));
fsvirt = setAddress(fsvirt_input, bsvirt_to_fsvirt.map(bsvirt));
if (bsvirt !== null || fsvirt !== null) {
target.classList.add('is-valid');
setAddress(fsfile_input, fsvirt_to_fsfile.map(fsvirt));
setAddress(bsfile_input, bsvirt_to_bsfile.map(bsvirt));
setAddress(isfile_input, isvirt_to_isfile.map(isvirt));
} else {
target.classList.add('is-invalid');
}
break;
case fsfile_input:
fsfile = address;
fsvirt = setAddress(fsvirt_input, fsvirt_to_fsfile.inverseMap(fsfile));
if (fsvirt !== null) {
target.classList.add('is-valid');
bsvirt = setAddress(bsvirt_input, bsvirt_to_fsvirt.inverseMap(fsvirt));
if (bsvirt !== null) {
isvirt = setAddress(isvirt_input, bsvirt_to_isvirt.map(bsvirt))
if (bsvirt !== null || isvirt !== null) {
setAddress(bsfile_input, bsvirt_to_bsfile.map(bsvirt));
setAddress(isfile_input, isvirt_to_isfile.map(isvirt));
}
} else {
target.classList.add('is-invalid');
Expand All @@ -71,7 +96,24 @@ import Layout from '~/layouts/layout.astro';
if (bsvirt !== null) {
target.classList.add('is-valid');
fsvirt = setAddress(fsvirt_input, bsvirt_to_fsvirt.map(bsvirt));
if (fsvirt !== null) {
isvirt = setAddress(isvirt_input, bsvirt_to_isvirt.map(bsvirt));
if (fsvirt !== null || isvirt !== null) {
setAddress(fsfile_input, fsvirt_to_fsfile.map(fsvirt));
setAddress(isfile_input, isvirt_to_isfile.map(isvirt));
}
} else {
target.classList.add('is-invalid');
}
break;
case isfile_input:
isfile = address;
isvirt = setAddress(isvirt_input, isvirt_to_isfile.inverseMap(isfile));
if (isvirt !== null) {
target.classList.add('is-valid');
bsvirt = setAddress(bsvirt_input, bsvirt_to_isvirt.inverseMap(isvirt));
fsvirt = setAddress(fsvirt_input, bsvirt_to_fsvirt.map(bsvirt));
if (bsvirt !== null || fsvirt !== null) {
setAddress(bsfile_input, bsvirt_to_bsfile.map(bsvirt));
setAddress(fsfile_input, fsvirt_to_fsfile.map(fsvirt));
}
} else {
Expand All @@ -84,15 +126,17 @@ import Layout from '~/layouts/layout.astro';
// Add event listeners to input elements
fsvirt_input.addEventListener('input', inputHandler);
bsvirt_input.addEventListener('input', inputHandler);
isvirt_input.addEventListener("input", inputHandler);
fsfile_input.addEventListener('input', inputHandler);
bsfile_input.addEventListener('input', inputHandler);
isfile_input.addEventListener('input', inputHandler);
</script>
<Layout title="Address Calculator">
<section class="jumbotron text-center">
<div class="w3-card-4 w3-center w3-display-topmiddle w3-margin-bottom-16">
<h1 class="w3-container w3-blue w3-padding-16">Fortune Street Address Calculator</h1>
<div class="container text-center">
<div class="row row-cols-2 g-3">
<div class="row row-cols-3 g-3">
<div class="col">
<label class="form-label">Fortune Street Virtual</label>
<input type="text" id="fsvirt_input" placeholder="80004000" class="form-control" />
Expand All @@ -101,6 +145,10 @@ import Layout from '~/layouts/layout.astro';
<label class="form-label">Boom Street Virtual</label>
<input type="text" id="bsvirt_input" placeholder="80004000" class="form-control" />
</div>
<div class="col">
<label class="form-label">Itadaki Street Wii Virtual</label>
<input type="text" id="isvirt_input" placeholder="80004000" class="form-control" />
</div>
<div class="col">
<label class="form-label">Fortune Street File</label>
<input type="text" id="fsfile_input" placeholder="100" class="form-control" />
Expand All @@ -109,6 +157,10 @@ import Layout from '~/layouts/layout.astro';
<label class="form-label">Boom Street File</label>
<input type="text" id="bsfile_input" placeholder="100" class="form-control" />
</div>
<div class="col">
<label class="form-label">Itadaki Street Wii File</label>
<input type="text" id="isfile_input" placeholder="100" class="form-control" />
</div>
</div>
</div>
</div>
Expand Down