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
+
+ 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 |
+
+
+ | ボタン | 機能 |
+ | ---------- | -------------------------- |
+ | 十字キー左 | 赤コインの状態をセーブ |
+ | 十字キー右 | 赤コインの状態をロード |
+
+
+
+
+
+
+
+ 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タイムをロード |
+
+
+
+
+
+
+
+ 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 |
+
+
+ | ボタン | 機能 |
+ | ---------- | -------------------------------- |
+ | 十字キー左 | 現在のゲーム内タイムをセーブ |
+ | 十字キー右 | セーブしたゲーム内タイムをロード |
+
+
+
+
+
+
+
+ misc
+ Deathless Blooper Surfing
+ 死なないイカサーフィン
+ sup39(サポミク)
+ 1.0
+ Feb 11, 2023
+
+ Prevent Mario from dying when he crashes into a wall
+ while Blooper Surfing.
+
+
+ イカサーフィン中に壁にぶつかっても死なないようにします。
+
+
+
+
+
+
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にしてください。",