Merge branch 'master' into drawText
This commit is contained in:
commit
1b90d6d6d5
10 changed files with 1105 additions and 145 deletions
14
Readme.md
14
Readme.md
|
@ -54,7 +54,19 @@ Some codes store some states in the games memory starting from address 0x817F000
|
||||||
| ![](./docs/reserved.svg) | `0x28` | `0x29` | Instant Level Select: Last Selected Area ID |
|
| ![](./docs/reserved.svg) | `0x28` | `0x29` | Instant Level Select: Last Selected Area ID |
|
||||||
| ![](./docs/reserved.svg) | `0x2A` | `0x2A` | Instant Level Select: Last Selected Episode Number |
|
| ![](./docs/reserved.svg) | `0x2A` | `0x2A` | Instant Level Select: Last Selected Episode Number |
|
||||||
| ![](./docs/reserved.svg) | `0x2B` | `0x2B` | Instant Level Select: Area Lock Flag |
|
| ![](./docs/reserved.svg) | `0x2B` | `0x2B` | Instant Level Select: Area Lock Flag |
|
||||||
| ![](./docs/unallocated.svg) | `0x2C` | `0x93` | Not Allocated |
|
| ![](./docs/reserved.svg) | `0x2C` | `0x2C` | Red Coin Savestate: Red Coin state |
|
||||||
|
| ![](./docs/reserved.svg) | `0x2D` | `0x2D` | Red Coin Savestate: Red Coin Count |
|
||||||
|
| ![](./docs/unallocated.svg) | `0x2E` | `0x2F` | Not Allocated |
|
||||||
|
| ![](./docs/reserved.svg) | `0x30` | `0x33` | QF Time Savestate: Stored QF Time |
|
||||||
|
| ![](./docs/reserved.svg) | `0x34` | `0x3B` | In-Game Time Savestate: Stored Elapsed Time |
|
||||||
|
| ![](./docs/reserved.svg) | `0x3C` | `0x3F` | Open World Shine Get: Last Touched Shine Game QF |
|
||||||
|
| ![](./docs/reserved.svg) | `0x40` | `0x4F` | Mario Savestate: Stored State (0x7C-0x8B) |
|
||||||
|
| ![](./docs/reserved.svg) | `0x50` | `0x57` | Mario Savestate: Stored Flag (0x118-0x123) |
|
||||||
|
| ![](./docs/reserved.svg) | `0x58` | `0x5B` | Mario Savestate: Stored Horizontal Speed |
|
||||||
|
| ![](./docs/reserved.svg) | `0x5C` | `0x5F` | Mario Savestate: Stored Vertical Speed |
|
||||||
|
| ![](./docs/reserved.svg) | `0x60` | `0x63` | Mario Savestate: Stored Last Grab Target |
|
||||||
|
| ![](./docs/reserved.svg) | `0x64` | `0x67` | Mario Savestate: Stored Water Amount |
|
||||||
|
| ![](./docs/unallocated.svg) | `0x68` | `0x93` | Not Allocated |
|
||||||
| ![](./docs/reserved.svg) | `0x94` | `0xA3` | QF Timer: Coordinates of the Text box (LTRB) |
|
| ![](./docs/reserved.svg) | `0x94` | `0xA3` | QF Timer: Coordinates of the Text box (LTRB) |
|
||||||
| ![](./docs/reserved.svg) | `0xA4` | `0xB0` | QF Timer: Timer Format String |
|
| ![](./docs/reserved.svg) | `0xA4` | `0xB0` | QF Timer: Timer Format String |
|
||||||
| ![](./docs/reserved.svg) | `0xB0` | `0xB1` | QF Timer: (Unused) |
|
| ![](./docs/reserved.svg) | `0xB0` | `0xB1` | QF Timer: (Unused) |
|
||||||
|
|
26
changelog.md
26
changelog.md
|
@ -1,4 +1,30 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
## Jul 15, 2023
|
||||||
|
### Ported 'FastForward', 'InstantRestart', 'SpawnYoshi', 'StageIntroSkip' to all versions
|
||||||
|
|
||||||
|
## Jul 9, 2023
|
||||||
|
### Updated 'Level Select'
|
||||||
|
The peaceful plaza (after unlocking Ricco and Gelato) is now available as C↘ + Y, later plazas have their shortcuts moved clockwise, and the post-Corona plaza no longer has a dedicated shortcut. To access it, simply load Corona (X with neutral C stick) or Bowser (C↖ + Y + L) then exit to the plaza.
|
||||||
|
|
||||||
|
## Feb 23, 2023
|
||||||
|
### Updated 'Force Plaza Events'
|
||||||
|
Set the correct BH/RH/GB unlock flag
|
||||||
|
|
||||||
|
## Feb 21, 2023
|
||||||
|
Disable Z menu for Instant Level Select to prevent broken texture
|
||||||
|
|
||||||
|
## Feb 13, 2023
|
||||||
|
- Added 'Mario State Savestate'
|
||||||
|
- Added 'No Shine Get Animation'
|
||||||
|
- Added 'Fruit Never Time Out'
|
||||||
|
|
||||||
|
## Feb 11, 2023
|
||||||
|
- Added 'Deathless Blooper Surfing'
|
||||||
|
- Added 'In-Game Time Savestate'
|
||||||
|
- Added 'QF Time Savestate'
|
||||||
|
- Added 'Red Coin Savestate'
|
||||||
|
- Added 'Previous Downloaded Codes' as a preset
|
||||||
|
|
||||||
## Feb 08, 2023
|
## Feb 08, 2023
|
||||||
### Updated 'Instant Level Select'
|
### Updated 'Instant Level Select'
|
||||||
Overwrite button input value to prevent Level Select being activated when AreaLock is enabled
|
Overwrite button input value to prevent Level Select being activated when AreaLock is enabled
|
||||||
|
|
|
@ -66,6 +66,7 @@
|
||||||
import { translateCode, translate } from '../i18n/localeHelper';
|
import { translateCode, translate } from '../i18n/localeHelper';
|
||||||
import codeCategories from '../data/codeCategories.json';
|
import codeCategories from '../data/codeCategories.json';
|
||||||
import presetCategories from '../data/presetCategories.json';
|
import presetCategories from '../data/presetCategories.json';
|
||||||
|
import {lskeyLDC} from './DownloadButton.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
|
@ -98,10 +99,16 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getPresetOptions() {
|
getPresetOptions() {
|
||||||
return presetCategories.map((c) => ({
|
return [
|
||||||
label: c.i18nKey,
|
...presetCategories.map((c) => ({
|
||||||
value: c.identifier,
|
label: c.i18nKey,
|
||||||
}));
|
value: c.identifier,
|
||||||
|
})),
|
||||||
|
{
|
||||||
|
label: 'generatorconfig.presets.@lastDLCodes',
|
||||||
|
value: lskeyLDC,
|
||||||
|
},
|
||||||
|
];
|
||||||
},
|
},
|
||||||
emitChangeEvent() {
|
emitChangeEvent() {
|
||||||
const selectedCodes = this.availableCodes.filter((c) => c.selected);
|
const selectedCodes = this.availableCodes.filter((c) => c.selected);
|
||||||
|
@ -120,8 +127,23 @@ export default {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const code of this.availableCodes) {
|
if (identifier === lskeyLDC) {
|
||||||
code.selected = code.presets.includes(identifier);
|
// previous downloaded code
|
||||||
|
let titles = new Set();
|
||||||
|
try {
|
||||||
|
const o = JSON.parse(localStorage.getItem(lskeyLDC));
|
||||||
|
if (o instanceof Array) {
|
||||||
|
titles = new Set(o);
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
for (const code of this.availableCodes) {
|
||||||
|
code.selected = titles.has(code.title.find(o => o.lang === 'en-US').content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// regular preset
|
||||||
|
for (const code of this.availableCodes) {
|
||||||
|
code.selected = code.presets.includes(identifier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.unselectStageLoader();
|
this.unselectStageLoader();
|
||||||
|
|
|
@ -18,6 +18,8 @@ import { translate, translateCode } from '../i18n/localeHelper';
|
||||||
// customizable code
|
// customizable code
|
||||||
import codegens from './codes/codegen.js';
|
import codegens from './codes/codegen.js';
|
||||||
|
|
||||||
|
export const lskeyLDC = '@/lastDLCodes';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
codes: { type: Array },
|
codes: { type: Array },
|
||||||
|
@ -60,6 +62,12 @@ export default {
|
||||||
]);
|
]);
|
||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
|
// save download code list
|
||||||
|
try {
|
||||||
|
const codeTitles = codeList.map(c => c.title.find(o => o.lang === 'en-US').content);
|
||||||
|
localStorage.setItem(lskeyLDC, JSON.stringify(codeTitles));
|
||||||
|
} catch {}
|
||||||
|
|
||||||
const fileName = gameVersions.find((v) => v.identifier === this.versionIdentifier).version;
|
const fileName = gameVersions.find((v) => v.identifier === this.versionIdentifier).version;
|
||||||
|
|
||||||
// apply customizable codes
|
// apply customizable codes
|
||||||
|
|
|
@ -14,56 +14,15 @@ export const buttonValues = {
|
||||||
DR: 0x0002,
|
DR: 0x0002,
|
||||||
DL: 0x0001,
|
DL: 0x0001,
|
||||||
};
|
};
|
||||||
|
|
||||||
const baseCodes = {
|
|
||||||
GMSJ01: (b) => `
|
|
||||||
C20EAFA0 0000000A
|
|
||||||
3C608040 A0A30D50
|
|
||||||
2805${b} 40A20038
|
|
||||||
3C60817F 38A00001
|
|
||||||
98A300B3 98A30100
|
|
||||||
3C60803E 84A3600E
|
|
||||||
90A30004 38A00040
|
|
||||||
90A30000 3C60800E
|
|
||||||
6063B3F8 7C6803A6
|
|
||||||
4E800020 2C000002
|
|
||||||
60000000 00000000
|
|
||||||
`,
|
|
||||||
GMSJ0A: (b) => `
|
|
||||||
C227768C 0000000A
|
|
||||||
3C60803F A0A35428
|
|
||||||
2805${b} 40A20038
|
|
||||||
3C60817F 38A00001
|
|
||||||
98A300B3 98A30100
|
|
||||||
3C60803E 84A3A8EE
|
|
||||||
90A30004 38A00040
|
|
||||||
90A30000 3C608027
|
|
||||||
60637AE4 7C6803A6
|
|
||||||
4E800020 2C000002
|
|
||||||
60000000 00000000
|
|
||||||
`,
|
|
||||||
GMSE01: (b) => `
|
|
||||||
C22979E4 0000000A
|
|
||||||
3C608040 A0A34454
|
|
||||||
2805${b} 40A20038
|
|
||||||
3C60817F 38A00001
|
|
||||||
98A300B3 98A30100
|
|
||||||
3C60803F 84A3970E
|
|
||||||
90A30004 38A00040
|
|
||||||
90A30000 3C608029
|
|
||||||
60637E3C 7C6803A6
|
|
||||||
4E800020 2C000002
|
|
||||||
60000000 00000000
|
|
||||||
`,
|
|
||||||
};
|
|
||||||
const zCodes = {
|
const zCodes = {
|
||||||
GMSJ01: '040eb024 60000000',
|
GMSJ01: '040EB02460000000',
|
||||||
GMSJ0A: '04277710 60000000',
|
GMSE01: '04297A6860000000',
|
||||||
GMSE01: '04297A68 60000000',
|
GMSP01: '0428F90060000000',
|
||||||
|
GMSJ0A: '0427771060000000',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const defaultConfig = {
|
export const defaultConfig = {
|
||||||
button: buttonValues.Y | buttonValues.DU,
|
button: buttonValues.B | buttonValues.DU,
|
||||||
};
|
};
|
||||||
export function getConfig() {
|
export function getConfig() {
|
||||||
return {
|
return {
|
||||||
|
@ -71,13 +30,11 @@ export function getConfig() {
|
||||||
...(parseJSON(localStorage.getItem(lskey)) ?? {}),
|
...(parseJSON(localStorage.getItem(lskey)) ?? {}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export default function codegen(version) {
|
export default function codegen(version, src) {
|
||||||
const { button } = getConfig();
|
const { button } = getConfig();
|
||||||
const g = baseCodes[version];
|
let code = src.slice(0, 36) + button.toString(16).padStart(4, '0') + src.slice(40);
|
||||||
if (g == null) return '';
|
|
||||||
let code = g(button.toString(16).padStart(4, '0'));
|
|
||||||
if (button & buttonValues.Z) {
|
if (button & buttonValues.Z) {
|
||||||
code += zCodes[version];
|
code += zCodes[version];
|
||||||
}
|
}
|
||||||
return code.replace(/\s/g, '');
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,11 @@
|
||||||
"i18nKey": "generatorconfig.categories.metadata",
|
"i18nKey": "generatorconfig.categories.metadata",
|
||||||
"exclusive": true
|
"exclusive": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identifier": "savestate",
|
||||||
|
"i18nKey": "generatorconfig.categories.savestate",
|
||||||
|
"exclusive": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identifier": "misc",
|
"identifier": "misc",
|
||||||
"i18nKey": "generatorconfig.categories.misc",
|
"i18nKey": "generatorconfig.categories.misc",
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
"qol": "Quality of Life",
|
"qol": "Quality of Life",
|
||||||
"loader": "Loaders",
|
"loader": "Loaders",
|
||||||
"timer": "Timers",
|
"timer": "Timers",
|
||||||
|
"savestate": "Savestate",
|
||||||
"misc": "Misc",
|
"misc": "Misc",
|
||||||
"memcardpatch": "Memory Card Patches",
|
"memcardpatch": "Memory Card Patches",
|
||||||
"cosmetic": "Cosmetic",
|
"cosmetic": "Cosmetic",
|
||||||
|
@ -66,7 +67,8 @@
|
||||||
"recommended": "Recommended",
|
"recommended": "Recommended",
|
||||||
"il": "IL Runs",
|
"il": "IL Runs",
|
||||||
"fap": "Fast Any%",
|
"fap": "Fast Any%",
|
||||||
"hfsetup": "Hacked File Setup"
|
"hfsetup": "Hacked File Setup",
|
||||||
|
"@lastDLCodes": "(Previous Downloaded Codes)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"landingpage": {
|
"landingpage": {
|
||||||
|
|
|
@ -32,6 +32,14 @@
|
||||||
"gcm": "CheatManager TXT"
|
"gcm": "CheatManager TXT"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"presets": {
|
||||||
|
"standard": "標準",
|
||||||
|
"recommended": "おすすめ",
|
||||||
|
"il": "IL Runs",
|
||||||
|
"fap": "Fast Any%",
|
||||||
|
"hfsetup": "Hacked Fileセットアップ",
|
||||||
|
"@lastDLCodes": "(前回ダウンロードしたコード)"
|
||||||
|
},
|
||||||
"alert": {
|
"alert": {
|
||||||
"gct": "生成されたGCTファイルのサイズが5000バイトを超えました({size}バイト)。NintendontでこのGCTファイルを使う時、全ての機能が動作しなくなることがあるため、5000バイトを超えないようにいくつかの機能を減らすことをおすすめします。",
|
"gct": "生成されたGCTファイルのサイズが5000バイトを超えました({size}バイト)。NintendontでこのGCTファイルを使う時、全ての機能が動作しなくなることがあるため、5000バイトを超えないようにいくつかの機能を減らすことをおすすめします。",
|
||||||
"dolphin": "コードの合計サイズが3256バイトを超えました({size}バイト)。Dolphinで全てのコードをONにすると、全ての機能が動作しなくなることがあります。その場合はいくつかのコードをOFFにしてください。"
|
"dolphin": "コードの合計サイズが3256バイトを超えました({size}バイト)。Dolphinで全てのコードをONにすると、全ての機能が動作しなくなることがあります。その場合はいくつかのコードをOFFにしてください。"
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 80 KiB |
Loading…
Reference in a new issue