diff --git a/Codes.xml b/Codes.xml index d1d45df..5297d61 100644 --- a/Codes.xml +++ b/Codes.xml @@ -340,9 +340,10 @@ - misc + savestate Coin Count Savestate Münzenzahl Speicherstand + コイン数状態保存 Psychonauter 1.0 @@ -363,6 +364,12 @@ | D-Pad Links | Speichere aktuellen Münzenstand | | D-Pad Rechts | Lade gespeicherten Müneznstand | + + | ボタン | 機能 | + | ---------- | -------------------------- | + | 十字キー左 | コイン数をセーブ | + | 十字キー右 | コイン数をロード | + Jul 24, 2021 80000001 80578A60 @@ -5083,4 +5090,379 @@ 4E800020 4E800020 + + savestate + Red Coin Savestate + 赤コイン状態保存 + sup39(サポミク) + 1.0 + Feb 11, 2023 + + | Combination | Result | + | ------------| ---------------------------- | + | D-Pad Left | Save current red coin state | + | D-Pad Right | Load saved red coin state | + + + | ボタン | 機能 | + | ---------- | -------------------------- | + | 十字キー左 | 赤コインの状態をセーブ | + | 十字キー右 | 赤コインの状態をロード | + + + C0000000 00000017 + 3D808040 A18C0D50 + 2B8C0001 419E000C + 280C0002 4CA20020 + 818D9A18 7D8C6379 + 4D820020 812C0018 + 814C0014 554A103A + 7D495214 3C60817F + 816D97D0 A003002C + 5405800E 419E0020 + 5400063F 900B00F4 + 40820014 880B00E5 + 70000002 41820008 + 38A00000 7C0A4840 + 40810038 858AFFFC + 800C0000 6C00803C + 280015AC 40A20020 + 800C00F0 54A5083E + 419E0010 50A007FE + 50A01F38 900C00F0 + 500507FE 4BFFFFC8 + 4C9E0020 98A3002C + 800B00F4 9803002D + 4E800020 4E800020 + + + C0000000 00000017 + 3D80803F A18C5428 + 2B8C0001 419E000C + 280C0002 4CA20020 + 818D9C10 7D8C6379 + 4D820020 812C0018 + 814C0014 554A103A + 7D495214 3C60817F + 816D9E60 A003002C + 5405800E 419E0020 + 5400063F 900B00F4 + 40820014 880B00E5 + 70000002 41820008 + 38A00000 7C0A4840 + 40810038 858AFFFC + 800C0000 6C00803B + 2800A0C4 40A20020 + 800C00F0 54A5083E + 419E0010 50A007FE + 50A01F38 900C00F0 + 500507FE 4BFFFFC8 + 4C9E0020 98A3002C + 800B00F4 9803002D + 4E800020 4E800020 + + + C0000000 00000017 + 3D808040 A18CBBF4 + 2B8C0001 419E000C + 280C0002 4CA20020 + 818D9C78 7D8C6379 + 4D820020 812C0018 + 814C0014 554A103A + 7D495214 3C60817F + 816D9EC8 A003002C + 5405800E 419E0020 + 5400063F 900B00F4 + 40820014 880B00E5 + 70000002 41820008 + 38A00000 7C0A4840 + 40810038 858AFFFC + 800C0000 6C00803C + 280013A4 40A20020 + 800C00F0 54A5083E + 419E0010 50A007FE + 50A01F38 900C00F0 + 500507FE 4BFFFFC8 + 4C9E0020 98A3002C + 800B00F4 9803002D + 4E800020 4E800020 + + + C0000000 00000017 + 3D808040 A18C4454 + 2B8C0001 419E000C + 280C0002 4CA20020 + 818D9D50 7D8C6379 + 4D820020 812C0018 + 814C0014 554A103A + 7D495214 3C60817F + 816D9FA0 A003002C + 5405800E 419E0020 + 5400063F 900B00F4 + 40820014 880B00E5 + 70000002 41820008 + 38A00000 7C0A4840 + 40810038 858AFFFC + 800C0000 6C00803C + 28009BB4 40A20020 + 800C00F0 54A5083E + 419E0010 50A007FE + 50A01F38 900C00F0 + 500507FE 4BFFFFC8 + 4C9E0020 98A3002C + 800B00F4 9803002D + 4E800020 4E800020 + + + + savestate + QF Time Savestate + QFタイム状態保存 + sup39(サポミク) + 1.0 + Feb 11, 2023 + + | Combination | Result | + | ------------| ---------------------------- | + | D-Pad Left | Save current QF Time | + | D-Pad Right | Load saved QF Time | + + + | ボタン | 機能 | + | ---------- | -------------------------- | + | 十字キー左 | 現在のQFタイムをセーブ | + | 十字キー右 | セーブしたQFタイムをロード | + + + C0000000 00000009 + 80AD97E8 7CA52B79 + 4D820020 3C60817F + 3D808040 A18C0D50 + 2B8C0001 419E0020 + 280C0002 4CA20020 + 80030030 9005005C + 900303CC 38000000 + 900300BC 8005005C + 90030030 4E800020 + + + C0000000 00000009 + 80AD9E78 7CA52B79 + 4D820020 3C60817F + 3D80803F A18C5428 + 2B8C0001 419E0020 + 280C0002 4CA20020 + 80030030 9005005C + 900303CC 38000000 + 900300BC 8005005C + 90030030 4E800020 + + + C0000000 00000009 + 80AD9EE0 7CA52B79 + 4D820020 3C60817F + 3D808040 A18CBBF4 + 2B8C0001 419E0020 + 280C0002 4CA20020 + 80030030 9005005C + 900303CC 38000000 + 900300BC 8005005C + 90030030 4E800020 + + + C0000000 00000009 + 80AD9FB8 7CA52B79 + 4D820020 3C60817F + 3D808040 A18C4454 + 2B8C0001 419E0020 + 280C0002 4CA20020 + 80030030 9005005C + 900303CC 38000000 + 900300BC 8005005C + 90030030 4E800020 + + + + savestate + In-Game Time Savestate + ゲーム内タイム状態保存 + sup39(サポミク) + 1.0 + Feb 11, 2023 + + | Combination | Result | + | ------------| ---------------------------- | + | D-Pad Left | Save current In-Game Time | + | D-Pad Right | Load saved In-Game Time | + + + | ボタン | 機能 | + | ---------- | -------------------------------- | + | 十字キー左 | 現在のゲーム内タイムをセーブ | + | 十字キー右 | セーブしたゲーム内タイムをロード | + + + C220C428 00000003 + 3D80817F 39600000 + 916C0034 916C0038 + 7C0802A6 00000000 + C0000000 00000013 + 3D808040 A18C0D50 + 2B8C0001 419E000C + 280C0002 4CA20020 + 816D97E8 7D6B5B79 + 4D820020 3D80817F + 7D2D42E6 7D4C42E6 + 7C0D42E6 7C090000 + 4082FFF0 806B0110 + 80AB0114 7D455010 + 7D234910 806B00F0 + 80AB00F4 7D455014 + 7D234914 409E0020 + 806B00C8 80AB00CC + 7CA55010 7C634910 + 906C0034 90AC0038 + 4E800020 806C0034 + 80AC0038 7CA55010 + 7C634910 906B00C8 + 90AB00CC 4E800020 + + + C212C3C0 00000003 + 3D80817F 39600000 + 916C0034 916C0038 + 7C0802A6 00000000 + C0000000 00000013 + 3D80803F A18C5428 + 2B8C0001 419E000C + 280C0002 4CA20020 + 816D9E78 7D6B5B79 + 4D820020 3D80817F + 7D2D42E6 7D4C42E6 + 7C0D42E6 7C090000 + 4082FFF0 806B0110 + 80AB0114 7D455010 + 7D234910 806B00F0 + 80AB00F4 7D455014 + 7D234914 409E0020 + 806B00C8 80AB00CC + 7CA55010 7C634910 + 906C0034 90AC0038 + 4E800020 806C0034 + 80AC0038 7CA55010 + 7C634910 906B00C8 + 90AB00CC 4E800020 + + + C213FC5C 00000003 + 3D80817F 39600000 + 916C0034 916C0038 + 7C0802A6 00000000 + C0000000 00000013 + 3D808040 A18CBBF4 + 2B8C0001 419E000C + 280C0002 4CA20020 + 816D9EE0 7D6B5B79 + 4D820020 3D80817F + 7D2D42E6 7D4C42E6 + 7C0D42E6 7C090000 + 4082FFF0 806B0110 + 80AB0114 7D455010 + 7D234910 806B00F0 + 80AB00F4 7D455014 + 7D234914 409E0020 + 806B00C8 80AB00CC + 7CA55010 7C634910 + 906C0034 90AC0038 + 4E800020 806C0034 + 80AC0038 7CA55010 + 7C634910 906B00C8 + 90AB00CC 4E800020 + + + C214AFCC 00000003 + 3D80817F 39600000 + 916C0034 916C0038 + 7C0802A6 00000000 + C0000000 00000013 + 3D808040 A18C4454 + 2B8C0001 419E000C + 280C0002 4CA20020 + 816D9FB8 7D6B5B79 + 4D820020 3D80817F + 7D2D42E6 7D4C42E6 + 7C0D42E6 7C090000 + 4082FFF0 806B0110 + 80AB0114 7D455010 + 7D234910 806B00F0 + 80AB00F4 7D455014 + 7D234914 409E0020 + 806B00C8 80AB00CC + 7CA55010 7C634910 + 906C0034 90AC0038 + 4E800020 806C0034 + 80AC0038 7CA55010 + 7C634910 906B00C8 + 90AB00CC 4E800020 + + + + misc + Deathless Blooper Surfing + 死なないイカサーフィン + sup39(サポミク) + 1.0 + Feb 11, 2023 + + Prevent Mario from dying when he crashes into a wall + while Blooper Surfing. + + + イカサーフィン中に壁にぶつかっても死なないようにします。 + + + C21397D0 00000008 + 818D9A10 812C0018 + 814C0014 554A103A + 7D495214 858AFFFC + 800C0000 6C00803C + 280060C0 40A20010 + A00C00F2 7000FFF6 + B00C00F2 7C0A4840 + 4181FFDC 00000000 + + + C223A090 00000008 + 818D9C08 812C0018 + 814C0014 554A103A + 7D495214 858AFFFC + 800C0000 6C00803B + 2800EBD8 40A20010 + A00C00F2 7000FFF6 + B00C00F2 7C0A4840 + 4181FFDC 00000000 + + + C22520CC 00000008 + 818D9C70 812C0018 + 814C0014 554A103A + 7D495214 858AFFFC + 800C0000 6C00803C + 28005EB8 40A20010 + A00C00F2 7000FFF6 + B00C00F2 7C0A4840 + 4181FFDC 00000000 + + + C225A340 00000008 + 818D9D48 812C0018 + 814C0014 554A103A + 7D495214 858AFFFC + 800C0000 6C00803C + 2800E6C8 40A20010 + A00C00F2 7000FFF6 + B00C00F2 7C0A4840 + 4181FFDC 00000000 + + diff --git a/Readme.md b/Readme.md index 1dae04d..31da56d 100644 --- a/Readme.md +++ b/Readme.md @@ -54,7 +54,12 @@ 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) | `0x2A` | `0x2A` | Instant Level Select: Last Selected Episode Number | | ![](./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/unallocated.svg) | `0x3C` | `0x93` | Not Allocated | | ![](./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) | `0xB0` | `0xB1` | QF Timer: (Unused) | diff --git a/changelog.md b/changelog.md index 3c1480a..3f37572 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,11 @@ # Changelog +## 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 10, 2023 Ported GCI Loader to all versions diff --git a/site/.vuepress/components/CodeList.vue b/site/.vuepress/components/CodeList.vue index 4749823..4aed5b2 100644 --- a/site/.vuepress/components/CodeList.vue +++ b/site/.vuepress/components/CodeList.vue @@ -66,6 +66,7 @@ import { translateCode, translate } from '../i18n/localeHelper'; import codeCategories from '../data/codeCategories.json'; import presetCategories from '../data/presetCategories.json'; +import {lskeyLDC} from './DownloadButton.vue'; export default { props: { @@ -98,10 +99,16 @@ export default { }, methods: { getPresetOptions() { - return presetCategories.map((c) => ({ - label: c.i18nKey, - value: c.identifier, - })); + return [ + ...presetCategories.map((c) => ({ + label: c.i18nKey, + value: c.identifier, + })), + { + label: 'generatorconfig.presets.@lastDLCodes', + value: lskeyLDC, + }, + ]; }, emitChangeEvent() { const selectedCodes = this.availableCodes.filter((c) => c.selected); @@ -120,8 +127,23 @@ export default { return; } - for (const code of this.availableCodes) { - code.selected = code.presets.includes(identifier); + if (identifier === lskeyLDC) { + // 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(); diff --git a/site/.vuepress/components/DownloadButton.vue b/site/.vuepress/components/DownloadButton.vue index bd597db..42ca6c7 100644 --- a/site/.vuepress/components/DownloadButton.vue +++ b/site/.vuepress/components/DownloadButton.vue @@ -18,6 +18,8 @@ import { translate, translateCode } from '../i18n/localeHelper'; // customizable code import codegens from './codes/codegen.js'; +export const lskeyLDC = '@/lastDLCodes'; + export default { props: { codes: { type: Array }, @@ -61,6 +63,11 @@ export default { } catch {} const version = gameVersions.find((v) => v.identifier === this.versionIdentifier).version; + // 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 {} // apply customizable codes for (const code of codeList) { diff --git a/site/.vuepress/data/codeCategories.json b/site/.vuepress/data/codeCategories.json index c6492c3..4606a1e 100644 --- a/site/.vuepress/data/codeCategories.json +++ b/site/.vuepress/data/codeCategories.json @@ -19,6 +19,11 @@ "i18nKey": "generatorconfig.categories.metadata", "exclusive": true }, + { + "identifier": "savestate", + "i18nKey": "generatorconfig.categories.savestate", + "exclusive": false + }, { "identifier": "misc", "i18nKey": "generatorconfig.categories.misc", diff --git a/site/.vuepress/i18n/en-US.json b/site/.vuepress/i18n/en-US.json index 253d4e5..7192000 100644 --- a/site/.vuepress/i18n/en-US.json +++ b/site/.vuepress/i18n/en-US.json @@ -60,6 +60,7 @@ "qol": "Quality of Life", "loader": "Loaders", "timer": "Timers", + "savestate": "Savestate", "misc": "Misc", "memcardpatch": "Memory Card Patches", "cosmetic": "Cosmetic", @@ -71,7 +72,8 @@ "recommended": "Recommended", "il": "IL Runs", "fap": "Fast Any%", - "hfsetup": "Hacked File Setup" + "hfsetup": "Hacked File Setup", + "@lastDLCodes": "(Previous Downloaded Codes)" } }, "landingpage": { diff --git a/site/.vuepress/i18n/ja-JP.json b/site/.vuepress/i18n/ja-JP.json index 6024079..5a8b9d4 100644 --- a/site/.vuepress/i18n/ja-JP.json +++ b/site/.vuepress/i18n/ja-JP.json @@ -36,6 +36,14 @@ "gci": "GCI" } }, + "presets": { + "standard": "標準", + "recommended": "おすすめ", + "il": "IL Runs", + "fap": "Fast Any%", + "hfsetup": "Hacked Fileセットアップ", + "@lastDLCodes": "(前回ダウンロードしたコード)" + }, "alert": { "gct": "生成されたGCTファイルのサイズが5000バイトを超えました({size}バイト)。NintendontでこのGCTファイルを使う時、全ての機能が動作しなくなることがあるため、5000バイトを超えないようにいくつかの機能を減らすことをおすすめします。", "dolphin": "コードの合計サイズが3256バイトを超えました({size}バイト)。Dolphinで全てのコードをONにすると、全ての機能が動作しなくなることがあります。その場合はいくつかのコードをOFFにしてください。",