Merge branch 'master' into drawText

This commit is contained in:
sup39 2023-07-15 12:42:43 +09:00
commit 1b90d6d6d5
No known key found for this signature in database
GPG key ID: 14D2E0D21140D260
10 changed files with 1105 additions and 145 deletions

1092
Codes.xml

File diff suppressed because it is too large Load diff

View file

@ -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) |

View file

@ -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

View file

@ -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();

View file

@ -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

View file

@ -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;
} }

View file

@ -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",

View file

@ -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": {

View file

@ -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