├── CNAME
├── .gitignore
├── GaiaTitle.xcf
├── Gaia Gensouki.xlsx
├── IllusionOfGaiaScript.xlsx
├── site
├── tsconfig.json
├── src
│ ├── vite-env.d.ts
│ ├── main.tsx
│ ├── types.ts
│ ├── hooks
│ │ └── useProjectData.ts
│ ├── index.css
│ ├── components
│ │ ├── Notepad.tsx
│ │ ├── Notepad.css
│ │ ├── ErrorBoundary.tsx
│ │ ├── ModuleSelector.css
│ │ ├── NotificationSystem.css
│ │ ├── ErrorBoundary.css
│ │ ├── NotificationSystem.tsx
│ │ ├── RomFilePicker.css
│ │ ├── FolderPicker.css
│ │ ├── ModuleSelector.tsx
│ │ ├── RomBuilder.css
│ │ └── RomFilePicker.tsx
│ └── App.css
├── tsconfig.node.json
├── index.html
├── tsconfig.app.json
├── package.json
├── vite.config.js
└── README.md
├── modules
├── title-demo
│ ├── gfx_title.bin
│ ├── pal_title.pal
│ ├── set_title.set
│ ├── map_title_main.map
│ ├── gfx_title_actors.bin
│ ├── map_title_effect.map
│ ├── pal_title_actors.pal
│ ├── spm_title_actors.spm
│ └── EnhancedTitle.patch.asm
├── base
│ ├── graphics
│ │ ├── gfx_fonts.bin
│ │ └── gfx_sky_delivery_exprite.bin
│ ├── palettes
│ │ ├── pal_sc01_actors.pal
│ │ └── pal_wa78_actors.pal
│ ├── spritemaps
│ │ ├── spm_fr32_actors.bin
│ │ ├── spm_sc01_actors.bin
│ │ └── spm_wa78_actors.bin
│ ├── patches
│ │ ├── EnhancedTitle.asm
│ │ ├── ExpriteLoader.asm
│ │ ├── chapter34.asm
│ │ ├── SouthCapeDeliveryman.asm
│ │ ├── WatermiaDeliveryman.asm
│ │ ├── chapter15.asm
│ │ ├── chapter12.asm
│ │ ├── FreejiaDeliveryman.asm
│ │ ├── chapter18.asm
│ │ ├── chapter09.asm
│ │ ├── chapter35.asm
│ │ ├── chapter25.asm
│ │ ├── chapter02.asm
│ │ ├── OverworldNameSwitch.asm
│ │ ├── Credits.asm
│ │ ├── chapter17.asm
│ │ ├── chapter14.asm
│ │ ├── StringProcessing.asm
│ │ └── ExpandedOverworldRoutes.asm
│ └── asm
│ │ └── templates_01CA95.asm
├── jp-viper
│ ├── graphics
│ │ └── gfx_viper.bin
│ └── spritemaps
│ │ └── spm_viper.bin
├── jp-mines
│ └── palettes
│ │ └── pal_dm3D_tiles.pal
├── title-alternate
│ ├── graphics
│ │ ├── gfx_title.bin
│ │ └── gfx_title_actors.bin
│ ├── palettes
│ │ ├── pal_title.pal
│ │ └── pal_title_actors.pal
│ ├── tilesets
│ │ └── set_title.set
│ ├── tilemaps
│ │ ├── map_title_main.map
│ │ └── map_title_effect.map
│ ├── spritemaps
│ │ └── spm_title_actors.bin
│ ├── asm
│ │ └── thinkers
│ │ │ └── thinker_00BC91.asm
│ └── patches
│ │ └── EnhancedTitle.asm
├── title-enhanced
│ ├── graphics
│ │ ├── gfx_title.bin
│ │ ├── gfx_title_actors.bin
│ │ └── gfx_title_exprite.bin
│ ├── palettes
│ │ ├── pal_title.pal
│ │ └── pal_title_actors.pal
│ ├── tilesets
│ │ └── set_title.set
│ ├── tilemaps
│ │ ├── map_title_effect.map
│ │ └── map_title_main.map
│ ├── spritemaps
│ │ └── spm_title_actors.bin
│ ├── asm
│ │ └── thinkers
│ │ │ └── thinker_00BC91.asm
│ └── patches
│ │ └── ExpriteLoader.asm
├── international-font
│ ├── graphics
│ │ └── gfx_fonts.bin
│ ├── db
│ │ ├── stringLayers.json
│ │ └── stringTypes.json
│ └── patches
│ │ └── AccentMap.asm
├── jp-wall-dunes
│ ├── graphics
│ │ └── gfx_gw82_tiles.bin
│ ├── palettes
│ │ └── pal_gw82_tiles.pal
│ ├── tilesets
│ │ └── set_gw82_effect.set
│ └── tilemaps
│ │ └── map_gw82_effect.map
├── jp-itory-mountains
│ ├── palettes
│ │ ├── pal_it16_int.pal
│ │ └── pal_it15_tiles.pal
│ ├── graphics
│ │ └── gfx_it15_effect.bin
│ ├── tilemaps
│ │ ├── map_it15_effect.map
│ │ ├── map_it16_effect.map
│ │ └── map_it18_effect.map
│ ├── tilesets
│ │ └── set_it15_ext_effect.set
│ └── patches
│ │ └── JpItoryMountains.asm
├── jp-church-cross
│ └── graphics
│ │ └── gfx_sc01_ext_effect.bin
├── jp-edward-mountains
│ ├── graphics
│ │ └── gfx_ec0A_tiles.bin
│ ├── palettes
│ │ └── pal_ec0A_tiles.pal
│ ├── tilesets
│ │ └── set_ec0A_effect.set
│ ├── patches
│ │ └── JpEdwardMountains.asm
│ └── tilemaps
│ │ └── map_ec0A_effect.map
├── jp-prologue-palettes
│ └── palettes
│ │ ├── palette_1E1935.pal
│ │ └── palette_1E1A35.pal
├── crystal-ring-palette
│ ├── graphics
│ │ ├── gfx_item_exprite.bin
│ │ └── gfx_inventory_sprites.bin
│ ├── palettes
│ │ └── pal_item_exprite2.pal
│ └── patches
│ │ └── CrystalRingPalette.asm
├── enhanced-prologue-text
│ ├── graphics
│ │ └── gfx_overworld_font.bin
│ └── patches
│ │ └── EnhancedPrologueText.asm
├── no-shira-spotlight
│ └── NoShiraSpotlight.asm
├── full-health-herb
│ └── patches
│ │ └── FullHealthHerb.asm
├── thankful-flower
│ └── patches
│ │ └── ThankfulFlower.asm
├── pyramid-elevator-speed
│ └── patches
│ │ └── PyramidElevatorSpeed.asm
├── pyramid-portal-exit
│ └── patches
│ │ └── PyramidPortalExit.asm
├── freejia-shortcut
│ └── patches
│ │ └── FreejiaShortcut.asm
├── red-fountain
│ └── patches
│ │ └── RedFountain.asm
├── enhanced-epilogue-text
│ └── patches
│ │ └── EnhancedEpilogueText.asm
├── blue-journal
│ └── patches
│ │ └── BlueJournal.asm
├── plain-borders
│ ├── asm
│ │ └── templates_01CA95.asm
│ └── patches
│ │ └── StringProcessing.asm
└── freejia-slave-return
│ └── patches
│ └── FreejiaSlaveReturn.asm
└── .github
└── workflows
└── deploy.yml
/CNAME:
--------------------------------------------------------------------------------
1 | gaiahack.ing
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | .env
--------------------------------------------------------------------------------
/GaiaTitle.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/GaiaTitle.xcf
--------------------------------------------------------------------------------
/Gaia Gensouki.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/Gaia Gensouki.xlsx
--------------------------------------------------------------------------------
/IllusionOfGaiaScript.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/IllusionOfGaiaScript.xlsx
--------------------------------------------------------------------------------
/site/tsconfig.json:
--------------------------------------------------------------------------------
1 | {"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}
2 |
--------------------------------------------------------------------------------
/modules/title-demo/gfx_title.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/gfx_title.bin
--------------------------------------------------------------------------------
/modules/title-demo/pal_title.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/pal_title.pal
--------------------------------------------------------------------------------
/modules/title-demo/set_title.set:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/set_title.set
--------------------------------------------------------------------------------
/modules/base/graphics/gfx_fonts.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/graphics/gfx_fonts.bin
--------------------------------------------------------------------------------
/modules/title-demo/map_title_main.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/map_title_main.map
--------------------------------------------------------------------------------
/modules/jp-viper/graphics/gfx_viper.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-viper/graphics/gfx_viper.bin
--------------------------------------------------------------------------------
/modules/title-demo/gfx_title_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/gfx_title_actors.bin
--------------------------------------------------------------------------------
/modules/title-demo/map_title_effect.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/map_title_effect.map
--------------------------------------------------------------------------------
/modules/title-demo/pal_title_actors.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/pal_title_actors.pal
--------------------------------------------------------------------------------
/modules/title-demo/spm_title_actors.spm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-demo/spm_title_actors.spm
--------------------------------------------------------------------------------
/modules/base/palettes/pal_sc01_actors.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/palettes/pal_sc01_actors.pal
--------------------------------------------------------------------------------
/modules/base/palettes/pal_wa78_actors.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/palettes/pal_wa78_actors.pal
--------------------------------------------------------------------------------
/modules/jp-viper/spritemaps/spm_viper.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-viper/spritemaps/spm_viper.bin
--------------------------------------------------------------------------------
/modules/base/spritemaps/spm_fr32_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/spritemaps/spm_fr32_actors.bin
--------------------------------------------------------------------------------
/modules/base/spritemaps/spm_sc01_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/spritemaps/spm_sc01_actors.bin
--------------------------------------------------------------------------------
/modules/base/spritemaps/spm_wa78_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/spritemaps/spm_wa78_actors.bin
--------------------------------------------------------------------------------
/modules/jp-mines/palettes/pal_dm3D_tiles.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-mines/palettes/pal_dm3D_tiles.pal
--------------------------------------------------------------------------------
/modules/title-alternate/graphics/gfx_title.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/graphics/gfx_title.bin
--------------------------------------------------------------------------------
/modules/title-alternate/palettes/pal_title.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/palettes/pal_title.pal
--------------------------------------------------------------------------------
/modules/title-alternate/tilesets/set_title.set:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/tilesets/set_title.set
--------------------------------------------------------------------------------
/modules/title-enhanced/graphics/gfx_title.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/graphics/gfx_title.bin
--------------------------------------------------------------------------------
/modules/title-enhanced/palettes/pal_title.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/palettes/pal_title.pal
--------------------------------------------------------------------------------
/modules/title-enhanced/tilesets/set_title.set:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/tilesets/set_title.set
--------------------------------------------------------------------------------
/modules/international-font/graphics/gfx_fonts.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/international-font/graphics/gfx_fonts.bin
--------------------------------------------------------------------------------
/modules/jp-wall-dunes/graphics/gfx_gw82_tiles.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-wall-dunes/graphics/gfx_gw82_tiles.bin
--------------------------------------------------------------------------------
/modules/jp-wall-dunes/palettes/pal_gw82_tiles.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-wall-dunes/palettes/pal_gw82_tiles.pal
--------------------------------------------------------------------------------
/modules/base/graphics/gfx_sky_delivery_exprite.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/base/graphics/gfx_sky_delivery_exprite.bin
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/palettes/pal_it16_int.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/palettes/pal_it16_int.pal
--------------------------------------------------------------------------------
/modules/jp-wall-dunes/tilesets/set_gw82_effect.set:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-wall-dunes/tilesets/set_gw82_effect.set
--------------------------------------------------------------------------------
/modules/title-alternate/tilemaps/map_title_main.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/tilemaps/map_title_main.map
--------------------------------------------------------------------------------
/modules/title-enhanced/graphics/gfx_title_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/graphics/gfx_title_actors.bin
--------------------------------------------------------------------------------
/modules/title-enhanced/palettes/pal_title_actors.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/palettes/pal_title_actors.pal
--------------------------------------------------------------------------------
/modules/title-enhanced/tilemaps/map_title_effect.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/tilemaps/map_title_effect.map
--------------------------------------------------------------------------------
/modules/title-enhanced/tilemaps/map_title_main.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/tilemaps/map_title_main.map
--------------------------------------------------------------------------------
/modules/base/patches/EnhancedTitle.asm:
--------------------------------------------------------------------------------
1 |
2 | ?INCLUDE 'system_strings'
3 |
4 | asciistring_01DA47 |[NHM:0][CUR:1E,4]RETRANSLATED [NHM:4][CUR:D0,4]PUSH START BUTTON|
5 |
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/palettes/pal_it15_tiles.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/palettes/pal_it15_tiles.pal
--------------------------------------------------------------------------------
/modules/title-alternate/graphics/gfx_title_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/graphics/gfx_title_actors.bin
--------------------------------------------------------------------------------
/modules/title-alternate/palettes/pal_title_actors.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/palettes/pal_title_actors.pal
--------------------------------------------------------------------------------
/modules/title-alternate/tilemaps/map_title_effect.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/tilemaps/map_title_effect.map
--------------------------------------------------------------------------------
/modules/title-enhanced/graphics/gfx_title_exprite.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/graphics/gfx_title_exprite.bin
--------------------------------------------------------------------------------
/modules/title-enhanced/spritemaps/spm_title_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-enhanced/spritemaps/spm_title_actors.bin
--------------------------------------------------------------------------------
/modules/jp-church-cross/graphics/gfx_sc01_ext_effect.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-church-cross/graphics/gfx_sc01_ext_effect.bin
--------------------------------------------------------------------------------
/modules/jp-edward-mountains/graphics/gfx_ec0A_tiles.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-edward-mountains/graphics/gfx_ec0A_tiles.bin
--------------------------------------------------------------------------------
/modules/jp-edward-mountains/palettes/pal_ec0A_tiles.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-edward-mountains/palettes/pal_ec0A_tiles.pal
--------------------------------------------------------------------------------
/modules/jp-edward-mountains/tilesets/set_ec0A_effect.set:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-edward-mountains/tilesets/set_ec0A_effect.set
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/graphics/gfx_it15_effect.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/graphics/gfx_it15_effect.bin
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/tilemaps/map_it15_effect.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/tilemaps/map_it15_effect.map
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/tilemaps/map_it16_effect.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/tilemaps/map_it16_effect.map
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/tilemaps/map_it18_effect.map:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/tilemaps/map_it18_effect.map
--------------------------------------------------------------------------------
/modules/jp-prologue-palettes/palettes/palette_1E1935.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-prologue-palettes/palettes/palette_1E1935.pal
--------------------------------------------------------------------------------
/modules/jp-prologue-palettes/palettes/palette_1E1A35.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-prologue-palettes/palettes/palette_1E1A35.pal
--------------------------------------------------------------------------------
/modules/title-alternate/spritemaps/spm_title_actors.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/title-alternate/spritemaps/spm_title_actors.bin
--------------------------------------------------------------------------------
/modules/crystal-ring-palette/graphics/gfx_item_exprite.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/crystal-ring-palette/graphics/gfx_item_exprite.bin
--------------------------------------------------------------------------------
/modules/crystal-ring-palette/palettes/pal_item_exprite2.pal:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/crystal-ring-palette/palettes/pal_item_exprite2.pal
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/tilesets/set_it15_ext_effect.set:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/jp-itory-mountains/tilesets/set_it15_ext_effect.set
--------------------------------------------------------------------------------
/modules/enhanced-prologue-text/graphics/gfx_overworld_font.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/enhanced-prologue-text/graphics/gfx_overworld_font.bin
--------------------------------------------------------------------------------
/modules/crystal-ring-palette/graphics/gfx_inventory_sprites.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azarem/IOGRetranslation/HEAD/modules/crystal-ring-palette/graphics/gfx_inventory_sprites.bin
--------------------------------------------------------------------------------
/modules/jp-itory-mountains/patches/JpItoryMountains.asm:
--------------------------------------------------------------------------------
1 |
2 | ?INCLUDE 'parallax_table'
3 |
4 | binary_01CC89 #00787E0F08E1FF200700002000F0FF220700001800F8FF240700001000F8FF260700000C00E8FF280708010000F0FF2A070A010000E8FF2C070C01000038FF2E070E010000
5 |
--------------------------------------------------------------------------------
/modules/jp-edward-mountains/patches/JpEdwardMountains.asm:
--------------------------------------------------------------------------------
1 |
2 | ?INCLUDE 'parallax_table'
3 |
4 | binary_01CC4A #00787E0F08D1FF200700002000F8FF220700001400F8FF240700001000C0FF26070801000080FF280700000100B0FF2A0708010000E0FF2C071001000070FF2E0700000100B5FF30070801000000FB3207100100000000
5 |
--------------------------------------------------------------------------------
/site/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | interface ImportMetaEnv {
4 | readonly VITE_SUPABASE_URL: string
5 | readonly VITE_SUPABASE_ANON_KEY: string
6 | readonly VITE_PROJECT_NAME: string
7 | }
8 |
9 | interface ImportMeta {
10 | readonly env: ImportMetaEnv
11 | }
12 |
--------------------------------------------------------------------------------
/modules/no-shira-spotlight/NoShiraSpotlight.asm:
--------------------------------------------------------------------------------
1 |
2 | ---------------------------------------------------
3 | ?INCLUDE 'gs2A_shira'
4 | ---------------------------------------------------
5 |
6 | code_059484 {
7 | COP [BF] ( &widestring_0594B8+2 )
8 | COP [BE] ( #02, #01, &code_list_059491 )
9 | }
10 |
--------------------------------------------------------------------------------
/modules/full-health-herb/patches/FullHealthHerb.asm:
--------------------------------------------------------------------------------
1 |
2 | ----------------------------------------
3 | ?INCLUDE 'chunk_038000'
4 | ----------------------------------------
5 |
6 | code_03889A {
7 | COP [BF] ( &widestring_0388E9 )
8 | LDA #$0028
9 | STA $0B22
10 | JSR $&sub_039FB2
11 | RTS
12 | }
13 |
--------------------------------------------------------------------------------
/modules/international-font/db/stringLayers.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "type": "WideString",
4 | "base": 220,
5 | "map": [
6 | "à", "á", "â", "ã",
7 | "ä", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ò", "ó", "ô", "õ", "ö", "ù", "ú",
8 | "û", "ü", "À", "Á", "Â", "Ã", "Ä", "É", "Ê", "Ë", "Í", "Ò", "Ó", "Ô", "Õ", "Ö"
9 | ]
10 | }
11 | ]
--------------------------------------------------------------------------------
/modules/crystal-ring-palette/patches/CrystalRingPalette.asm:
--------------------------------------------------------------------------------
1 |
2 | ---------------------------------------
3 | ?INCLUDE 'inventory_spritemap'
4 | ---------------------------------------
5 |
6 | sprite_group_10898C [
7 | sprite_group < #08, #08, #10, #00, #F8, #F0, #01, #01, #F8, #10, #F0, #10, #01, [
8 | sprite_part < #01, #00, #00, #00, #00, #$0B60 > ;00
9 | ] > ;00
10 | ]
11 |
--------------------------------------------------------------------------------
/site/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react'
2 | import { createRoot } from 'react-dom/client'
3 | import { ErrorBoundary } from './components/ErrorBoundary'
4 | import App from './App.tsx'
5 | import './index.css'
6 |
7 | createRoot(document.getElementById('root')!).render(
8 |
9 |
10 |
11 |
12 | ,
13 | )
14 |
--------------------------------------------------------------------------------
/modules/thankful-flower/patches/ThankfulFlower.asm:
--------------------------------------------------------------------------------
1 |
2 | -------------------------------------
3 | ?INCLUDE 'ec11_flower'
4 | -------------------------------------
5 |
6 |
7 | code_09BC4C {
8 | COP [D1] ( #$0113, #01, &thankful_flower_interact )
9 | COP [D0] ( #02, #01, &thankful_flower_interact )
10 | COP [BF] ( &widestring_09BC51 )
11 | RTL
12 | }
13 |
14 | thankful_flower_interact {
15 | COP [BF] ( &thankful_flower_str )
16 | RTL
17 | }
18 |
19 | thankful_flower_str `[TPL:18][TPL:D]Thank you, that was[N]lovely![END]`
20 |
--------------------------------------------------------------------------------
/site/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2022",
4 | "lib": ["ES2023"],
5 | "module": "ESNext",
6 | "skipLibCheck": true,
7 |
8 | /* Bundler mode */
9 | "moduleResolution": "bundler",
10 | "allowImportingTsExtensions": true,
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "noEmit": true,
14 |
15 | /* Linting */
16 | "strict": true,
17 | "noUnusedLocals": true,
18 | "noUnusedParameters": true,
19 | "noFallthroughCasesInSwitch": true
20 | },
21 | "include": ["vite.config.js"]
22 | }
23 |
--------------------------------------------------------------------------------
/site/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Illusion of Gaia: Retranslated - ROM Patcher
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/modules/title-alternate/asm/thinkers/thinker_00BC91.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | ---------------------------------------------
4 |
5 | h_thinker_00BC91 [
6 | h_thinker < #04, #08 > ;00
7 | ]
8 |
9 | ---------------------------------------------
10 |
11 | e_thinker_00BC91 {
12 | COP [02] ( @dma_data_00BC9A, #12 )
13 | RTL
14 | }
15 |
16 |
17 | dma_data_00BC9A [
18 | dma_data < #70, #00, #00 > ;00
19 | dma_data < #40, #00, #00 > ;01
20 | dma_data < #0C, #04, #00 > ;02
21 | dma_data < #0C, #08, #00 > ;03
22 | dma_data < #20, #0C, #00 > ;04
23 | dma_data < #20, #00, #00 > ;05
24 | ]
25 |
26 |
--------------------------------------------------------------------------------
/modules/title-enhanced/asm/thinkers/thinker_00BC91.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | ---------------------------------------------
4 |
5 | h_thinker_00BC91 [
6 | h_thinker < #04, #08 > ;00
7 | ]
8 |
9 | ---------------------------------------------
10 |
11 | e_thinker_00BC91 {
12 | COP [02] ( @dma_data_00BC9A, #12 )
13 | RTL
14 | }
15 |
16 |
17 | dma_data_00BC9A [
18 | dma_data < #70, #00, #00 > ;00
19 | dma_data < #40, #00, #00 > ;01
20 | dma_data < #0C, #04, #00 > ;02
21 | dma_data < #0C, #08, #00 > ;03
22 | dma_data < #20, #0C, #00 > ;04
23 | dma_data < #20, #00, #00 > ;05
24 | ]
25 |
26 |
--------------------------------------------------------------------------------
/site/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true
22 | },
23 | "include": ["src"]
24 | }
25 |
--------------------------------------------------------------------------------
/modules/pyramid-elevator-speed/patches/PyramidElevatorSpeed.asm:
--------------------------------------------------------------------------------
1 |
2 | ?INCLUDE 'pyD7_actor_08C4EA'
3 |
4 | code_08C549 {
5 | LDA $7F0010, X
6 | STA $26
7 | LDA $24
8 | BPL code_08C564
9 | COP [C1]
10 | LDY #$1060
11 | LDA $0026, Y
12 | DEC
13 | STA $0026, Y
14 | DEC $26
15 | BEQ code_08C575
16 | DEC
17 | STA $0026, Y
18 | DEC $26
19 | BEQ code_08C575
20 | RTL
21 | }
22 |
23 |
24 | code_08C564 {
25 | COP [C1]
26 | LDY #$1060
27 | LDA $0026, Y
28 | INC
29 | STA $0026, Y
30 | DEC $26
31 | BEQ code_08C575
32 | INC
33 | STA $0026, Y
34 | DEC $26
35 | BEQ code_08C575
36 | RTL
37 | }
--------------------------------------------------------------------------------
/modules/pyramid-portal-exit/patches/PyramidPortalExit.asm:
--------------------------------------------------------------------------------
1 |
2 | !scene_current 0644
3 | !player_actor 09AA
4 |
5 | -------------------------------------------------
6 | ?INCLUDE 'pyCC_entrance_portal'
7 | -------------------------------------------------
8 |
9 | code_08B6C6 {
10 | COP [BF] ( &widestring_08B74B )
11 | LDY $player_actor
12 | LDA $0010, Y
13 | ORA #$2000
14 | STA $0010, Y
15 | COP [9C] ( @e_py_actor_08B6F4, #$1800 )
16 | LDA #$0303
17 | STA $0648
18 | LDA #$0303
19 | STA $064A
20 | LDA $scene_current
21 | CMP #$00CC
22 | BEQ entrance_portal_top
23 | COP [26] ( #CC, #$01F8, #$0380, #03, #$4400 )
24 | RTL
25 |
26 | entrance_portal_top:
27 | COP [26] ( #CC, #$01F8, #$0130, #03, #$4400 )
28 | RTL
29 | }
--------------------------------------------------------------------------------
/modules/jp-wall-dunes/tilemaps/map_gw82_effect.map:
--------------------------------------------------------------------------------
1 | !"#$%&' !"#$%&'()*+,-./()*+,-./0123456701234567 AAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIQQQQQQQQQQQQQQQQ @@@@@@@@@@@@@@@@HHHHHHHHHHHHHHHHPPPPPPPPPPPPPPPPXXXXXXXXXXXXXXXX !"#$%&' !"#$%&' @@@@@@@@@@@@@@@@HHHHHHHHHHHHHHHHPPPPPPPPPPPPPPPPXXXXXXXXXXXXXXXX ()*+,-./()*+,-./0123456701234567hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
--------------------------------------------------------------------------------
/modules/jp-edward-mountains/tilemaps/map_ec0A_effect.map:
--------------------------------------------------------------------------------
1 |
2 | !"#$%&' !"#$%&'()*+,-./()*+,-./0123456701234567 !"#$%&' !"#$%&'@@@@@@@@@@@@@@@@HHHHHHHHHHHHHHHH !"#$%&' !"#$%&'()*+,-./()*+,-./@@@@@@@@@@@@@@@@HHHHHHHHHHHHHHHH XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
--------------------------------------------------------------------------------
/site/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "iogretranslation",
3 | "version": "1.0.0",
4 | "description": "Copyright 2024-2025 by GaiaLabs \r https://github.com/Azarem/IOGRetranslation \r https://github.com/Azarem/GaiaLabs",
5 | "homepage": "https://azarem.github.io/IOGRetranslation/",
6 | "bugs": {
7 | "url": "https://github.com/Azarem/IOGRetranslation/issues"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/Azarem/IOGRetranslation.git"
12 | },
13 | "license": "MIT",
14 | "author": "GaiaLabs",
15 | "type": "module",
16 | "scripts": {
17 | "dev": "vite",
18 | "type-check": "tsc --noEmit",
19 | "build": "tsc && vite build",
20 | "preview": "vite preview"
21 | },
22 | "dependencies": {
23 | "@gaialabs/core": "^0.1.19",
24 | "@gaialabs/shared": "^0.1.16",
25 | "react": "^19.1.1",
26 | "react-dom": "^19.1.1"
27 | },
28 | "devDependencies": {
29 | "@types/react": "^19.1.1",
30 | "@types/react-dom": "^19.1.1",
31 | "@vitejs/plugin-react": "^5.0.2",
32 | "typescript": "^5.9.2",
33 | "vite": "^7.1.4"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/modules/freejia-shortcut/patches/FreejiaShortcut.asm:
--------------------------------------------------------------------------------
1 |
2 | ------------------------------------
3 | ?INCLUDE 'dm47_sam'
4 | ------------------------------------
5 |
6 | code_05D2BB {
7 | COP [BF] ( &widestring_05D48E )
8 | COP [BE] ( #02, #01, &shortcut_options )
9 | RTL
10 | }
11 |
12 | shortcut_options [
13 | &shortcut_cancel
14 | &shortcut_cancel
15 | &shortcut_accept
16 | ]
17 |
18 | shortcut_cancel {
19 | COP [BF] ( &shortcut_cancel_str )
20 | RTL
21 | }
22 |
23 | shortcut_accept {
24 | COP [BF] ( &shortcut_accept_str )
25 | LDA #$0000
26 | STA $0D60
27 | LDA #$0404
28 | STA $064A
29 | COP [65] ( #$0334, #$0334, #00, #0B )
30 | COP [26] ( #39, #$0048, #$01C0, #00, #$2210 )
31 | RTL
32 | }
33 |
34 | widestring_05D48E `[TPL:5][TPL:E][NAM:A]: Hey, I know of a[N]secret passage that will[N]take you to [NAM:12][FIN]Take the shortcut?[N][PAL:0] Stay[N] Go to [NAM:12][PAL:4]`
35 |
36 | shortcut_cancel_str `[CLR]I won't forget you for my[N]entire life. Be careful[N]out there.[END]`
37 | shortcut_accept_str `[CLR]Alright, stay close to me[N]and we'll be there in no[N]time.[END]`
--------------------------------------------------------------------------------
/site/src/types.ts:
--------------------------------------------------------------------------------
1 | // Types based on the shared package ProjectPayload
2 | export interface ProjectPayload {
3 | branch: {
4 | id: string;
5 | name: string | null;
6 | version: number | null;
7 | isPublic: boolean;
8 | projectId: string;
9 | baseRomBranchId: string;
10 | fileCrcs: number[];
11 | modules: ModuleGroup[];
12 | createdAt: string;
13 | updatedAt: string;
14 | project: {
15 | id: string;
16 | name: string;
17 | meta: any;
18 | gameId: string;
19 | baseRomId: string;
20 | createdAt: string;
21 | updatedAt: string;
22 | };
23 | };
24 | files: any[];
25 | }
26 |
27 | export interface ModuleGroup {
28 | name?: string;
29 | options: ModuleOption[];
30 | }
31 |
32 | export interface ModuleOption {
33 | id: string;
34 | name: string;
35 | description?: string;
36 | default?: boolean;
37 | }
38 |
39 | export interface RomValidationResult {
40 | isValid: boolean;
41 | expectedCrc: number;
42 | actualCrc?: number;
43 | error?: string;
44 | }
45 |
46 | export interface RomGenerationProgress {
47 | stage: string;
48 | progress: number;
49 | message: string;
50 | }
51 |
--------------------------------------------------------------------------------
/modules/red-fountain/patches/RedFountain.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | ?INCLUDE 'palette_bundles'
4 |
5 |
6 | bundle_1693F9 [
7 | bundle < #01, &word_D69FA6, #21, #17, #04 >
8 | bundle < #01, &word_D69FA8, #21, #17, #03 >
9 | bundle < #01, &word_D69FAA, #21, #17, #02 >
10 | bundle < #01, &word_D69FAC, #21, #17, #02 >
11 | bundle < #01, &word_D69FAE, #21, #17, #03 >
12 | bundle < #01, &word_D69FB0, #21, #17, #04 >
13 | bundle < #01, &word_D69FB2, #21, #17, #04 >
14 | bundle < #01, &word_D69FB4, #21, #17, #03 >
15 | bundle < #01, &word_D69FB6, #21, #17, #02 >
16 | bundle < #01, &word_D69FB8, #21, #17, #03 >
17 | bundle < #01, &word_D69FBA, #21, #17, #04 >
18 | bundle < #01, &word_D69FBC, #21, #17, #05 >
19 | ]
20 |
21 | word_D69FA6 #$08A9
22 | word_D69FA8 #$08A9
23 | word_D69FAA #$08A9
24 | word_D69FAC #$0CCA
25 | word_D69FAE #$10ED
26 | word_D69FB0 #$112F
27 | word_D69FB2 #$1970
28 | word_D69FB4 #$152F
29 | word_D69FB6 #$10ED
30 | word_D69FB8 #$0CCA
31 | word_D69FBA #$08A9
32 |
33 | word_D69FBC [
34 | #$08A9
35 | #$08A9
36 | #$08A9
37 | #$08A9
38 | #$0CCA
39 | #$10ED
40 | #$152F
41 | #$1970
42 | #$152F
43 | #$10ED
44 | #$0CCA
45 | #$08A9
46 | ]
47 |
--------------------------------------------------------------------------------
/site/src/hooks/useProjectData.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import { ProjectBranchData, summaryFromSupabaseByProject } from '@gaialabs/shared'
3 |
4 | interface UseProjectDataResult {
5 | projectData: ProjectBranchData | null;
6 | loading: boolean;
7 | error: string | null;
8 | refetch: () => Promise;
9 | }
10 |
11 | export function useProjectData(): UseProjectDataResult {
12 | const [projectData, setProjectData] = useState(null);
13 | const [loading, setLoading] = useState(true);
14 | const [error, setError] = useState(null);
15 |
16 | const projectName = process?.env?.PROJECT_NAME || 'Illusion of Gaia: Retranslated';
17 |
18 | const fetchData = async () => {
19 | try {
20 | setLoading(true);
21 | setError(null);
22 | const data = await summaryFromSupabaseByProject(projectName);
23 | setProjectData(data);
24 | } catch (err) {
25 | setError(err instanceof Error ? err.message : 'Failed to fetch project data');
26 | setProjectData(null);
27 | } finally {
28 | setLoading(false);
29 | }
30 | };
31 |
32 | useEffect(() => {
33 | fetchData();
34 | }, []);
35 |
36 | return {
37 | projectData,
38 | loading,
39 | error,
40 | refetch: fetchData,
41 | };
42 | }
43 |
--------------------------------------------------------------------------------
/site/src/index.css:
--------------------------------------------------------------------------------
1 | :root {
2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3 | line-height: 1.5;
4 | font-weight: 400;
5 |
6 | color-scheme: light dark;
7 | color: rgba(255, 255, 255, 0.87);
8 | background-color: #242424;
9 |
10 | font-synthesis: none;
11 | text-rendering: optimizeLegibility;
12 | -webkit-font-smoothing: antialiased;
13 | -moz-osx-font-smoothing: grayscale;
14 | }
15 |
16 | a {
17 | font-weight: 500;
18 | color: #646cff;
19 | text-decoration: inherit;
20 | }
21 | a:hover {
22 | color: #535bf2;
23 | }
24 |
25 | body {
26 | margin: 0;
27 | display: flex;
28 | place-items: center;
29 | min-width: 320px;
30 | min-height: 100vh;
31 | }
32 |
33 | h1 {
34 | font-size: 3.2em;
35 | line-height: 1.1;
36 | }
37 |
38 | button {
39 | border-radius: 8px;
40 | border: 1px solid transparent;
41 | padding: 0.6em 1.2em;
42 | font-size: 1em;
43 | font-weight: 500;
44 | font-family: inherit;
45 | background-color: #1a1a1a;
46 | color: inherit;
47 | cursor: pointer;
48 | transition: border-color 0.25s;
49 | }
50 | button:hover {
51 | border-color: #646cff;
52 | }
53 | button:focus,
54 | button:focus-visible {
55 | outline: 4px auto -webkit-focus-ring-color;
56 | }
57 |
58 | @media (prefers-color-scheme: light) {
59 | :root {
60 | color: #213547;
61 | background-color: #ffffff;
62 | }
63 | a:hover {
64 | color: #747bff;
65 | }
66 | button {
67 | background-color: #f9f9f9;
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/modules/base/patches/ExpriteLoader.asm:
--------------------------------------------------------------------------------
1 |
2 | !scene_current 0644
3 | !player_flags 09AE
4 | !VMADDL 2116
5 |
6 | load_skyd_exprite:
7 | LDX #$&gfx_sky_delivery_exprite+2
8 | LDA #$^gfx_sky_delivery_exprite
9 | LDY #$4200
10 | STY $VMADDL
11 | LDY #$1C00
12 | JSL $@func_0283A2
13 | JML code_03E04E
14 |
15 | load_boot_exprite:
16 | LDX #$&gfx_boot_exprite+2
17 | LDA #$^gfx_boot_exprite
18 | LDY #$4200
19 | STY $VMADDL
20 | LDY #$1C00
21 | JSL $@func_0283A2
22 | PLP
23 | RTL
24 |
25 | ------------------------------------------------
26 | ?INCLUDE 'chunk_028000'
27 | ?INCLUDE 'chunk_03BAE1'
28 | ------------------------------------------------
29 | ;Load special sprite asset for boot scene
30 |
31 | func_03DFF8 {
32 | PHP
33 | LDA $scene_current
34 | CMP #$F7
35 | BEQ load_exit
36 | CMP #$FB
37 | BEQ load_fb_asset
38 | CMP #$FA
39 | BEQ load_exit
40 | CMP #$FE
41 | BEQ load_exit
42 | CMP #$F0
43 | BEQ load_exit
44 | CMP #$90
45 | BEQ load_exit
46 | CMP #$8C
47 | BEQ load_exit
48 | CMP #$89
49 | BEQ load_exit
50 | CMP #$78
51 | BEQ load_01_asset
52 | CMP #$32
53 | BEQ load_01_asset
54 | CMP #$01
55 | BEQ load_01_asset
56 | LDX #$4200
57 | STX $VMADDL
58 | LDX #$&bmp_000000
59 | LDA #$^bmp_000000
60 | LDY #$1C00
61 | JSL $@func_0283A2
62 | LDA $player_flags
63 | BIT #$08
64 | BEQ code_03E035
65 | LDX #$4400
66 | STX $VMADDL
67 | LDX #$&misc_fx_1CD580
68 | LDA #$^misc_fx_1CD580
69 | LDY #$0800
70 | JSL $@func_0283A2
71 | BRA code_03E04E
72 |
73 | load_01_asset:
74 | JML load_skyd_exprite
75 |
76 | load_fb_asset:
77 | JML load_boot_exprite
78 |
79 | load_exit:
80 | PLP
81 | RTL
82 | }
83 |
--------------------------------------------------------------------------------
/site/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig, loadEnv } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig(({ mode }) => {
6 | // Load env file based on `mode` in the current working directory.
7 | // Set the third parameter to '' to load all env regardless of the `VITE_` prefix.
8 | const env = loadEnv(mode, process.cwd(), '')
9 |
10 | // For production builds, GitHub Actions will set these as environment variables
11 | // For local development, they come from the .env file
12 | const supabaseUrl = env.VITE_SUPABASE_URL || process.env.VITE_SUPABASE_URL
13 | const supabaseAnonKey = env.VITE_SUPABASE_ANON_KEY || process.env.VITE_SUPABASE_ANON_KEY
14 | const projectName = env.VITE_PROJECT_NAME || process.env.VITE_PROJECT_NAME
15 |
16 | // Optional: Log environment variable status during build
17 | if (mode === 'development') {
18 | console.log('Environment variables loaded:', {
19 | VITE_SUPABASE_URL: supabaseUrl ? 'SET' : 'NOT SET',
20 | VITE_SUPABASE_ANON_KEY: supabaseAnonKey ? 'SET' : 'NOT SET',
21 | VITE_PROJECT_NAME: projectName ? 'SET' : 'NOT SET'
22 | });
23 | }
24 |
25 | return {
26 | plugins: [react()],
27 | base: '/',
28 | build: {
29 | outDir: 'dist',
30 | assetsDir: 'assets',
31 | sourcemap: true,
32 | },
33 | server: {
34 | port: 3000,
35 | open: true,
36 | },
37 | // Expose environment variables to the client
38 | envPrefix: ['VITE_'],
39 | define: {
40 | global: 'globalThis',
41 | // Expose environment variables that @gaialabs/shared expects
42 | // These will be available as process.env.* in the client code
43 | 'process.env.PROJECT_NAME': JSON.stringify(projectName),
44 | 'process.env.SUPABASE_URL': JSON.stringify(supabaseUrl),
45 | 'process.env.SUPABASE_ANON_KEY': JSON.stringify(supabaseAnonKey),
46 | },
47 | }
48 | })
49 |
--------------------------------------------------------------------------------
/modules/enhanced-epilogue-text/patches/EnhancedEpilogueText.asm:
--------------------------------------------------------------------------------
1 |
2 | !joypad_mask_std 065A
3 | !_TM 212C
4 | !_TS 212D
5 | !CGWSEL 2130
6 | !CGADSUB 2131
7 |
8 | ------------------------------------
9 | ?INCLUDE 's89_new_babel'
10 | ------------------------------------
11 | ;Do not change the blending modes for this scene (89)
12 |
13 | e_s89_new_babel {
14 | LDA #$FFF0
15 | TSB $joypad_mask_std
16 | LDA #$4001
17 | TSB $09EC
18 | ;SEP #$20
19 | ;LDA #$11
20 | ;STA $_TM
21 | ;LDA #$04
22 | ;STA $_TS
23 | ;LDA #$82
24 | ;STA $CGWSEL
25 | ;LDA #$01
26 | ;STA $CGADSUB
27 | ;REP #$20
28 | COP [DB] ( #$00EF )
29 | COP [BF] ( &widestring_0BE075 )
30 | COP [DB] ( #$01DF )
31 | COP [05] ( #14 )
32 | COP [DA] ( #B3 )
33 | LDA #$0404
34 | STA $064A
35 | COP [26] ( #F7, #$0000, #$0000, #00, #$1100 )
36 | COP [C1]
37 | RTL
38 | }
39 |
40 | ------------------------------------
41 | ?INCLUDE 'scene_meta'
42 | ------------------------------------
43 |
44 | ;Make the map scene load original fonts for BG3
45 | entry_90 [
46 | ppu < #1D > ;00
47 | bitmap < #00, #20, #00, @bmp_16D82C, #00 > ;01
48 | bitmap < #00, #20, #00, @gfx_fonts, #02 > ;02
49 | palette < #00, #80, #00, @palette_1E1C35 > ;02
50 | tileset < #00, #20, #00, #01, @set_1B640F > ;03
51 | tileset < #00, #20, #00, #02, @set_1D2389 > ;04
52 | tilemap < #01, @map_1D70AC > ;05
53 | tilemap < #02, @map_1F37FC > ;06
54 | ]
55 |
56 | ;Make the comet scene load the credits font (no borders)
57 | entry_E5 [
58 | ppu < #25 > ;00
59 | music < #0E, #00, @bgm_longing_for_the_past > ;01
60 | bitmap < #00, #20, #00, @bmp_0D16E7, #00 > ;02
61 | bitmap < #00, #20, #00, @gfx_credits_font, #02 > ;02
62 | palette < #00, #80, #00, @palette_1E1D35 > ;03
63 | tileset < #00, #20, #00, #03, @set_157ADC > ;04
64 | tilemap < #01, @map_1F3021 > ;05
65 | tilemap < #02, @map_17FF9E > ;06
66 | jump < #22 > ;07
67 | ]
--------------------------------------------------------------------------------
/modules/title-enhanced/patches/ExpriteLoader.asm:
--------------------------------------------------------------------------------
1 |
2 | !scene_current 0644
3 | !player_flags 09AE
4 | !VMADDL 2116
5 |
6 | load_skyd_exprite:
7 | LDX #$&gfx_sky_delivery_exprite+2
8 | LDA #$^gfx_sky_delivery_exprite
9 | LDY #$4200
10 | STY $VMADDL
11 | LDY #$1C00
12 | JSL $@func_0283A2
13 | JML code_03E04E
14 |
15 | load_boot_exprite:
16 | LDX #$&gfx_boot_exprite+2
17 | LDA #$^gfx_boot_exprite
18 | BRA load_continue
19 |
20 | load_title_exprite:
21 | LDX #$&gfx_title_exprite+2
22 | LDA #$^gfx_title_exprite
23 |
24 | load_continue:
25 | LDY #$4200
26 | STY $VMADDL
27 | LDY #$1C00
28 | JSL $@func_0283A2
29 | PLP
30 | RTL
31 |
32 | ------------------------------------------------
33 | ?INCLUDE 'chunk_028000'
34 | ?INCLUDE 'chunk_03BAE1'
35 | ------------------------------------------------
36 | ;Load special sprite asset for boot scene
37 |
38 | func_03DFF8 {
39 | PHP
40 | LDA $scene_current
41 | CMP #$F7
42 | BEQ load_exit
43 | CMP #$FB
44 | BEQ load_fb_asset
45 | CMP #$FC
46 | BEQ load_fc_asset
47 | CMP #$FA
48 | BEQ load_exit
49 | CMP #$FE
50 | BEQ load_exit
51 | CMP #$F0
52 | BEQ load_exit
53 | CMP #$90
54 | BEQ load_exit
55 | CMP #$8C
56 | BEQ load_exit
57 | CMP #$89
58 | BEQ load_exit
59 | CMP #$78
60 | BEQ load_01_asset
61 | CMP #$32
62 | BEQ load_01_asset
63 | CMP #$01
64 | BEQ load_01_asset
65 | LDX #$4200
66 | STX $VMADDL
67 | LDX #$&bmp_000000
68 | LDA #$^bmp_000000
69 | LDY #$1C00
70 | JSL $@func_0283A2
71 | LDA $player_flags
72 | BIT #$08
73 | BEQ code_03E035
74 | LDX #$4400
75 | STX $VMADDL
76 | LDX #$&misc_fx_1CD580
77 | LDA #$^misc_fx_1CD580
78 | LDY #$0800
79 | JSL $@func_0283A2
80 | BRA code_03E04E
81 |
82 | load_01_asset:
83 | JML load_skyd_exprite
84 |
85 | load_fb_asset:
86 | JML load_boot_exprite
87 |
88 | load_fc_asset:
89 | JML load_title_exprite
90 |
91 | load_exit:
92 | PLP
93 | RTL
94 | }
95 |
--------------------------------------------------------------------------------
/site/src/components/Notepad.tsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import './Notepad.css';
3 |
4 | interface NotepadProps {
5 | // No props needed for now, but keeping the interface for future extensibility
6 | }
7 |
8 | export function Notepad({}: NotepadProps) {
9 | const [content, setContent] = useState('');
10 |
11 | const handleContentChange = (event: React.ChangeEvent) => {
12 | setContent(event.target.value);
13 | };
14 |
15 | const clearContent = () => {
16 | setContent('');
17 | };
18 |
19 | return (
20 |
21 |
📝 Notepad
22 |
23 | Enter custom assembly (ASM) code that will be compiled and integrated with your ROM.
24 | This code will be processed along with the selected modules during ROM generation.
25 |
26 |
27 |
28 |
29 |
30 | {content.trim() ? `${content.trim().split('\n').length} lines` : 'Empty'}
31 |
32 | {/* {content.trim() && (
33 |
38 | Clear
39 |
40 | )} */}
41 |
42 |
43 |
60 |
61 |
62 |
63 | {content.trim() ? '✅' : '📝'}
64 |
65 |
66 | Notepad: {content.trim() ? 'Contains custom code' : 'Empty'}
67 |
68 |
69 |
70 |
71 | );
72 | }
73 |
--------------------------------------------------------------------------------
/modules/blue-journal/patches/BlueJournal.asm:
--------------------------------------------------------------------------------
1 |
2 | !letter_read_flag 8E
3 | !journal_collected_flag 8F
4 |
5 | ---------------------------------------------------
6 | ?INCLUDE 'wa7A_lances_father'
7 | ---------------------------------------------------
8 |
9 |
10 | code_07B3AF {
11 | COP [D0] ( #A5, #01, &code_07B3BD )
12 | COP [D0] ( #journal_collected_flag, #01, &lances_father_default )
13 | COP [D0] ( #letter_read_flag, #01, &lances_father_journal )
14 | lances_father_default:
15 | COP [BF] ( &widestring_07B3C2 )
16 | COP [CC] ( #01 )
17 | RTL
18 | }
19 |
20 | code_07B3BD {
21 | COP [D0] ( #journal_collected_flag, #00, &lances_father_return )
22 | COP [BF] ( &widestring_07B412 )
23 | RTL
24 | }
25 |
26 | lances_father_return {
27 | COP [BF] ( &lances_father_return_str )
28 | BRA lances_father_give_journal
29 | }
30 |
31 | lances_father_journal {
32 | COP [BF] ( &lances_father_collect_str )
33 | lances_father_give_journal:
34 | COP [D4] ( #15, &lances_father_inv_full )
35 | COP [CC] ( #journal_collected_flag )
36 | RTL
37 | }
38 |
39 | lances_father_inv_full {
40 | COP [BF] ( &lances_father_inv_full_str )
41 | RTL
42 | }
43 |
44 | lances_father_collect_str `[TPL:3][TPL:B][NAM:4]'s father: you say[N][NAM:4] went on an adventure[N]to some kind of "great[N]wall"? Neeeat![FIN]I found this funny book[N]about a great wall...[N]maybe it will help you[N]out![END]`
45 | lances_father_return_str `[TPL:3][TPL:B][NAM:4]'s father: Hey, I[N]found a journal among some[N]of my old belongings.[FIN]I still don't remember[N]much, but you can have it.[N]I only ask that you make[N]good use of it.[END]`
46 | lances_father_inv_full_str `[TPL:3][TPL:A]Boy, you sure are a heavy[N]adventurer. You can't[N]possibly carry this now.[END]`
47 |
48 | ---------------------------------------------------
49 | ?INCLUDE 'chunk_038000'
50 | ---------------------------------------------------
51 |
52 | widestring_03944D `[DEF]He [LU2:8B]Lance's father's[N]journal. [FIN]Read which entry? [N] Tower of Babel [N] Mystic Statues [N] [LU1:16]Wall of China `
53 |
54 | widestring_0394B5 `[DEF]He closes the journal. [END]`
55 |
56 | widestring_0394CE `[DEF]The Tower of Babel...[END]`
57 |
58 | widestring_0394E5 `[DEF]The Mystic Statues... [END]`
59 |
60 | widestring_0394FD `[DEF]The [LU1:16]Wall...[END]`
--------------------------------------------------------------------------------
/modules/base/patches/chapter34.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 34
2 |
3 | -------------------------------------
4 | ?INCLUDE 'daC3_babel_travel_spirit'
5 | -------------------------------------
6 | widestring_09811E `[TPL:17][TPL:A]Return to the Babel Tower?[N][PAL:0] Cancel[N] Return to Tower of Babel`
7 | ;Return to the Tower of Babel? / Cancel / Return to the Tower of Babel
8 |
9 | widestring_098144 `[CLD]`
10 |
11 | ;I'm now looking after 49 Red Jewels from you.
12 |
13 | ;With this, I think the number of jewels should have become 50 altogether.
14 |
15 | -------------------------------------
16 | ?INCLUDE 'jeweler_gem'
17 | -------------------------------------
18 | widestring_08D5AE `[CLR]50… Finally, I've gathered[N]the 50 Red Jewels, haven't[N]I…[FIN]It seems that, at last,[N]the time to tell you my[N]secret has come.[FIN]Well, come with me…!![END]`
19 |
20 | -------------------------------------
21 | ?INCLUDE 'sE9_mansion_intro'
22 | -------------------------------------
23 | widestring_08FCBE `[TPL:0][TPL:A]When I came to, I was[N]standing at the entrance[N]of a mysterious mansion.[END]`
24 |
25 | -------------------------------------
26 | ?INCLUDE 'sEA_solid_arm'
27 | -------------------------------------
28 | widestring_08FA31 `[TPL:C][SFX:10]Welcome to my mansion.[FIN][TPL:E]Gem the jewel merchant was[N]a temporary form. My true[N]form is called Solid Arm.[FIN][TPL:F]I was beaten by Soul[N]Blader back when he[N]descended from the[N]heavens.[FIN]After that, I slept for a[N]long, long time…[FIN]My power was sealed in Red[N]Jewels which were[N]scattered throughout the[N]world.[FIN]So, I did whatever I could[N]to have myself[N]resurrected.[FIN]I was even the one on the[N]other side of the curtain,[N]pulling the strings of the[N]slave trade.[FIN][TPL:10]I used slave labour to[N]search for the jewels, but[N]I didn't think I would[N]take back my power so[N]quickly…[FIN][CLD][TPL:D]As my thanks to you, I'll[N]let you rest in peace![END]`
29 |
30 | -------------------------------------
31 | ?INCLUDE 'death_message'
32 | -------------------------------------
33 | widestring_00D7C2 `[TPL:0][TPL:F][NAM:0]: When I came to, I[N]found that I had collapsed[N]in a familiar place. Was I[N]having a nightmare?[END]`
34 |
35 | widestring_08FBC8 `[SFX:10][TPL:C]I can hear a faint voice…[FIN][TPL:D][DLY:4]It has been done once[N]again…[FIN][TPL:E]Soul Blader was strong[N]too, but I think you are[N]even stronger…[FIN][TPL:F]Danger is approaching this[N]planet. Well, you should[N]return to the Tower of[N]Babel and hurry on…[END]`
36 |
--------------------------------------------------------------------------------
/modules/base/patches/SouthCapeDeliveryman.asm:
--------------------------------------------------------------------------------
1 | ?BANK 0A
2 |
3 |
4 | --------------------------------------------
5 | h_actor < #42, #00, #10 >
6 | --------------------------------------------
7 |
8 | skyd_main {
9 | COP [D0] ( #8D, #00, &skyd_destroy )
10 | COP [C0] ( &skyd_interact )
11 | COP [0B]
12 | COP [C1]
13 | RTL
14 |
15 | skyd_destroy:
16 | COP [E0]
17 |
18 | skyd_interact:
19 | COP [BF] ( &skyd_str_intro )
20 | COP [BE] ( #03, #01, &skyd_options )
21 |
22 | skyd_options [
23 | &skyd_cancel
24 | &skyd_cancel
25 | &skyd_watermia
26 | &skyd_freejia
27 | ]
28 |
29 | skyd_cancel:
30 | COP [BF] ( &skyd_str_cancel )
31 | RTL
32 |
33 | skyd_watermia:
34 | COP [BF] ( &skyd_str_watermia )
35 | LDA #$000D
36 | STA $0D60
37 | LDA #$0404
38 | STA $064A
39 | COP [65] ( #$00D4, #$03A4, #00, #23 )
40 | COP [26] ( #78, #$0160, #$0268, #07, #$4500 )
41 | RTL
42 |
43 | skyd_freejia:
44 | COP [BF] ( &skyd_str_freejia )
45 | LDA #$000D
46 | STA $0D60
47 | LDA #$0404
48 | STA $064A
49 | COP [65] ( #$00D4, #$03A4, #00, #2A )
50 | COP [26] ( #32, #$0160, #$01D0, #07, #$4500 )
51 | RTL
52 | }
53 |
54 | skyd_str_intro `[TPL:16][TPL:E]I'm the Sky Delivery man.[N]My tame birds can fly you[N]to distant places. [FIN][TPL:F]Where do you want to go?[N][PAL:0] Stay Here[N] Watermia[N] [NAM:12][PAL:4]`
55 | skyd_str_cancel `[CLR]Alright. Come back if you[N]change your mind.[END]`
56 | skyd_str_watermia `[CLR]Come here, birds.[N]We're taking this person[N]to Watermia![END]`
57 | skyd_str_freejia `[CLR]Come here, birds.[N]We're taking this person[N]to [NAM:12]![END]`
58 |
59 | -----------------------------------------------
60 | ?INCLUDE 'scene_meta'
61 | -----------------------------------------------
62 |
63 | entry_01 [
64 | ppu < #03 > ;00
65 | music < #1C, #00, @bgm_lively_city_by_the_sea > ;01
66 | bitmap < #00, #10, #00, @gfx_sc01_ext_main, #00 > ;02
67 | bitmap < #00, #10, #10, @gfx_sc01_ext_effect, #00 > ;03
68 | palette < #00, #70, #10, @palette_1E2C33 > ;04
69 | tileset < #00, #20, #00, #01, @set_sc01_ext > ;05
70 | tileset < #00, #20, #00, #02, @set_sc01_effect_misc > ;06
71 | tilemap < #01, @map_sc01_main > ;07
72 | tilemap < #02, @map_sc01_effect > ;08
73 | label < #3E > ;09
74 | bitmap < #00, #10, #10, @gfx_sc01_actors, #01 > ;0A
75 | palette < #20, #80, #A0, @pal_sc01_actors > ;0B
76 | spritemap < #$18B5, #00, @spm_sc01_actors > ;0C
77 | ]
78 |
79 |
--------------------------------------------------------------------------------
/modules/international-font/patches/AccentMap.asm:
--------------------------------------------------------------------------------
1 |
2 | -------------------------------------------
3 | ?INCLUDE 'chunk_03BAE1'
4 | -------------------------------------------
5 |
6 | ;Characters >= 0xDC will use the accent table
7 |
8 | sub_03E255 {
9 | PHP
10 | PHD
11 | PHX
12 | LDA #$0000
13 | TCD
14 | LDX $0998
15 |
16 | code_03E25F:
17 | SEP #$20
18 | LDA $0000, Y
19 | CMP #$DC
20 | BCS do_accent_table
21 | CMP #$C0
22 | BCC code_03E27C
23 | REP #$20
24 | INY
25 | PEA $&code_03E25F-1
26 | AND #$001F
27 | ASL
28 | PHX
29 | TAX
30 | LDA $@wide_cmd_table_03E2C3, X
31 | PLX
32 | DEC
33 | PHA
34 | RTS
35 | }
36 |
37 | code_03E27C {
38 | REP #$20
39 | AND #$00FF
40 | INY
41 | STA $00
42 | ORA $0986
43 | ORA #$2100
44 | LDX $0998
45 | STA $7F0200, X
46 | CLC
47 | ADC #$0010
48 | STA $7F0240, X
49 | character_print_stub:
50 | INX
51 | INX
52 | STX $0998
53 | LDA $0654
54 | BEQ code_03E25F
55 | LDA $00
56 | PHA
57 | LDA #$0001
58 | TSB $09EC
59 | JSR $&code_03E7BA
60 | PLA
61 | CMP #$00AC
62 | BEQ code_03E25F
63 | LDA $06F8
64 | AND #$FF00
65 | ORA $0996
66 | STA $06F8
67 | BRA code_03E25F
68 | }
69 |
70 | do_accent_table {
71 | INY
72 | SEC
73 | SBC #$DC
74 | REP #$20
75 | AND #$00FF
76 | ASL
77 | TAX
78 | LDA $@accent_table, X
79 | SEP #$20
80 | LDX $0998
81 | STA $7F0200, X
82 | LDA #$21
83 | ORA $0987
84 | STA $7F0201, X
85 | STA $7F0241, X
86 | XBA
87 | STA $7F0240, X
88 | REP #$20
89 | BRA character_print_stub
90 | }
91 |
92 | accent_table [
93 | #E090 ;a
94 | #E190
95 | #E290
96 | #E390
97 | #E490
98 |
99 | #E094 ;e
100 | #E194
101 | #E294
102 | #E494
103 |
104 | #F098 ;i
105 | #F198
106 | #F298
107 | #F398
108 |
109 | #E09E ;o
110 | #E19E
111 | #E29E
112 | #E39E
113 | #E49E
114 |
115 | #F4B5 ;u
116 | #F5B5
117 | #F6B5
118 | #F7B5
119 |
120 | #E550 ;A
121 | #E650
122 | #E750
123 | #E850
124 | #E950
125 |
126 | #EA54 ;E
127 | #EB54
128 | #FA54
129 |
130 | #FB58 ;I
131 |
132 | #E55E ;O
133 | #E65E
134 | #E75E
135 | #E85E
136 | #E95E
137 |
138 | -- #F875 ;U
139 | -- #F975
140 | ]
141 |
--------------------------------------------------------------------------------
/modules/base/patches/WatermiaDeliveryman.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | --------------------------------------------
4 | h_actor < #3A, #00, #10 >
5 | --------------------------------------------
6 |
7 | watermia_skyd_main {
8 | COP [C0] ( &watermia_skyd_interact )
9 | COP [0B]
10 | COP [C1]
11 | RTL
12 | }
13 |
14 | watermia_skyd_interact {
15 | COP [BF] ( &watermia_greeting_str )
16 | COP [BE] ( #03, #01, &watermia_skyd_options )
17 | }
18 |
19 | watermia_skyd_options [
20 | &watermia_skyd_cancel
21 | &watermia_skyd_cancel
22 | &watermia_skyd_south_cape
23 | &watermia_skyd_freejia
24 | ]
25 |
26 | watermia_skyd_cancel {
27 | COP [BF] ( &watermia_cancel_str )
28 | RTL
29 | }
30 |
31 | watermia_skyd_south_cape {
32 | COP [BF] ( &watermia_south_cape_str )
33 | LDA #$000D
34 | STA $0D60
35 | LDA #$0404
36 | STA $064A
37 | COP [65] ( #$02D4, #$01A4, #00, #22 )
38 | COP [26] ( #01, #$00F0, #$02E0, #03, #$4300 )
39 | RTL
40 | }
41 |
42 | watermia_skyd_freejia {
43 | COP [BF] ( &watermia_freejia_str )
44 | LDA #$000D
45 | STA $0D60
46 | LDA #$0404
47 | STA $064A
48 | COP [65] ( #$02D4, #$01A4, #00, #28 )
49 | COP [26] ( #32, #$0160, #$01D0, #07, #$4500 )
50 | RTL
51 | }
52 |
53 |
54 | watermia_greeting_str `[TPL:16][TPL:E]I'm the Sky Delivery man.[N]My tame birds can fly you[N]to distant places. [FIN][TPL:F]Where do you want to go?[N][PAL:0] Stay Here[N] South Cape[N] [NAM:12][PAL:4]`
55 | watermia_cancel_str `[CLR]Alright. Come back if you[N]change your mind.[END]`
56 | watermia_south_cape_str `[CLR]Come here, birds.[N]We're taking this person[N]to South Cape![END]`
57 | watermia_freejia_str `[CLR]Come here, birds.[N]We're taking this person[N]to [NAM:12]![END]`
58 |
59 | --------------------------------------
60 | ?INCLUDE 'scene_meta'
61 | --------------------------------------
62 |
63 | entry_78 [
64 | ppu < #1A > ;00
65 | music < #02, #00, @bgm_lively_city > ;01
66 | bitmap < #00, #10, #00, @bmp_1DBD9F, #00 > ;02
67 | branch < #96, #2A > ;03
68 | palette < #00, #70, #10, @palette_1E4C93 > ;04
69 | jump < #2B > ;05
70 | label < #2A > ;06
71 | palette < #00, #70, #10, @palette_1E4D73 > ;07
72 | label < #2B > ;08
73 | tileset < #00, #20, #00, #03, @set_184704 > ;09
74 | tilemap < #01, @map_15118E > ;0A
75 | bitmap < #00, #10, #10, @bmp_1DBD9F, #00 > ;0B
76 | tilemap < #02, @map_1C44E4 > ;0C
77 | label < #26 > ;0D
78 | bitmap < #00, #10, #10, @gfx_wa78_actors, #01 > ;0E
79 | palette < #00, #60, #A0, @pal_wa78_actors > ;0F
80 | spritemap < #$1886, #00, @spm_wa78_actors > ;10
81 | ]
82 |
--------------------------------------------------------------------------------
/site/src/components/Notepad.css:
--------------------------------------------------------------------------------
1 | .notepad {
2 | max-width: 600px;
3 | margin: 2rem auto;
4 | padding: 2rem;
5 | background: #f8f9fa;
6 | border: 1px solid #e9ecef;
7 | border-radius: 8px;
8 | }
9 |
10 | .notepad h3 {
11 | color: #333;
12 | margin: 0 0 0.5rem 0;
13 | font-size: 1.5rem;
14 | }
15 |
16 | .notepad-description {
17 | color: #666;
18 | margin-bottom: 1.5rem;
19 | line-height: 1.5;
20 | }
21 |
22 | .notepad-content {
23 | background: white;
24 | border: 1px solid #dee2e6;
25 | border-radius: 6px;
26 | overflow: hidden;
27 | }
28 |
29 | .notepad-header {
30 | display: flex;
31 | justify-content: space-between;
32 | align-items: center;
33 | padding: 0.75rem 1rem;
34 | background: #f8f9fa;
35 | border-bottom: 1px solid #dee2e6;
36 | font-size: 0.9rem;
37 | }
38 |
39 | .content-info {
40 | color: #666;
41 | font-weight: 500;
42 | }
43 |
44 | .clear-button {
45 | padding: 0.25rem 0.75rem;
46 | background: #dc3545;
47 | color: white;
48 | border: none;
49 | border-radius: 4px;
50 | cursor: pointer;
51 | font-size: 0.85rem;
52 | transition: background-color 0.2s ease;
53 | }
54 |
55 | .clear-button:hover {
56 | background: #c82333;
57 | }
58 |
59 | .notepad-textarea {
60 | width: 100%;
61 | min-height: 300px;
62 | padding: 1rem;
63 | border: none;
64 | outline: none;
65 | font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
66 | font-size: 0.9rem;
67 | line-height: 1.4;
68 | resize: vertical;
69 | background: white;
70 | color: #333;
71 | }
72 |
73 | .notepad-textarea::placeholder {
74 | color: #999;
75 | font-style: italic;
76 | }
77 |
78 | .notepad-textarea:focus {
79 | background: #fafbfc;
80 | }
81 |
82 | .notepad-status {
83 | display: flex;
84 | align-items: center;
85 | gap: 0.5rem;
86 | padding: 0.75rem 1rem;
87 | background: #f8f9fa;
88 | border-top: 1px solid #dee2e6;
89 | font-size: 0.9rem;
90 | }
91 |
92 | .status-indicator {
93 | font-size: 1rem;
94 | width: 20px;
95 | text-align: center;
96 | }
97 |
98 | .status-indicator.ready {
99 | color: #28a745;
100 | }
101 |
102 | .status-indicator.empty {
103 | color: #6c757d;
104 | }
105 |
106 | /* Responsive design */
107 | @media (max-width: 768px) {
108 | .notepad {
109 | margin: 1rem;
110 | padding: 1.5rem;
111 | }
112 |
113 | .notepad-textarea {
114 | min-height: 250px;
115 | font-size: 0.85rem;
116 | }
117 |
118 | .notepad-header {
119 | flex-direction: column;
120 | gap: 0.5rem;
121 | align-items: flex-start;
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/modules/plain-borders/asm/templates_01CA95.asm:
--------------------------------------------------------------------------------
1 | ?BANK 01
2 |
3 |
4 | ---------------------------------------------
5 |
6 | templates_01CA95 [
7 | &widestring_01CAC1 ;00
8 | &widestring_01CACE ;01
9 | &widestring_01CADB ;02
10 | &widestring_01CAE8 ;03
11 | &widestring_01CAF5 ;04
12 | &widestring_01CB02 ;05
13 | &widestring_01CB0F ;06
14 | &widestring_01CB1C ;07
15 | &widestring_01CB27 ;08
16 | &widestring_01CB2E ;09
17 | &widestring_01CB35 ;0A
18 | &widestring_01CB3C ;0B
19 | &widestring_01CB43 ;0C
20 | &widestring_01CB4A ;0D
21 | &widestring_01CB51 ;0E
22 | &widestring_01CB58 ;0F
23 | &widestring_01CB5F ;10
24 | &widestring_01CB66 ;11
25 | &widestring_01CB7A ;12
26 | &widestring_01CB85 ;13
27 | &widestring_01CB90 ;14
28 | &widestring_01CB9B ;15
29 | &default_theme ;16
30 | &default_theme ;17
31 | &default_theme ;18
32 | &default_theme ;19
33 | &default_theme ;1A
34 | &default_theme ;1B
35 | &default_theme ;1C
36 | &default_theme ;1D
37 | &default_theme ;1E
38 | &default_theme ;1F
39 | &default_theme ;20
40 | &widestring_01CADB ;21
41 | &widestring_01CACE ;22
42 | &widestring_01CAF5 ;23
43 | &widestring_01CAF5 ;24
44 | ]
45 |
46 | widestring_01CAC1 `[SEP:11,6FDF][SEP:12,B1E][SFX:10][PAL:4]`
47 |
48 | widestring_01CACE `[SEP:11,777F][SEP:12,561E][SFX:1B][PAL:4]`
49 |
50 | widestring_01CADB `[SEP:11,7FB7][SEP:12,79C2][SFX:19][PAL:4]`
51 |
52 | widestring_01CAE8 `[SEP:11,5F7F][SEP:12,9FF][SFX:19][PAL:4]`
53 |
54 | widestring_01CAF5 `[SEP:11,73F7][SEP:12,2322][SFX:1C][PAL:4]`
55 |
56 | widestring_01CB02 `[SEP:11,7F3D][SEP:12,7137][SFX:1A][PAL:4]`
57 |
58 | widestring_01CB0F `[SEP:11,739C][SEP:12,4631][SFX:1A][PAL:4]`
59 |
60 | widestring_01CB1C `[SEP:11,673F][SEP:12,24FF][PAL:4]`
61 |
62 | widestring_01CB27 `[DLG:3,4][SIZ:D,1]`
63 |
64 | widestring_01CB2E `[DLG:3,4][SIZ:D,2]`
65 |
66 | widestring_01CB35 `[DLG:3,4][SIZ:D,3]`
67 |
68 | widestring_01CB3C `[DLG:3,4][SIZ:D,4]`
69 |
70 | widestring_01CB43 `[DLG:3,17][SIZ:D,1]`
71 |
72 | widestring_01CB4A `[DLG:3,15][SIZ:D,2]`
73 |
74 | widestring_01CB51 `[DLG:3,13][SIZ:D,3]`
75 |
76 | widestring_01CB58 `[DLG:3,11][SIZ:D,4]`
77 |
78 | widestring_01CB5F `[DLG:3,F][SIZ:D,5]`
79 |
80 | widestring_01CB66 `[DLG:2,14][SIZ:E,3][LU1:65]do you go?[N]`
81 |
82 | widestring_01CB7A `[DLG:3,4][SIZ:D,5]`
83 |
84 | widestring_01CB85 `[SEP:11,777F][SEP:12,561E][PAL:4]`
85 |
86 | widestring_01CB90 `[SEP:11,7FB7][SEP:12,79C2][PAL:4]`
87 |
88 | widestring_01CB9B `[SEP:11,73F7][SEP:12,2322][PAL:4]`
89 |
90 | default_theme `[SEP:11,7FFF][SEP:12,7A94][SFX:10][PAL:4]`
91 |
92 |
93 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter15.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 15
2 |
3 |
4 | -------------------------------------
5 | ?INCLUDE 'fr39_erik'
6 | -------------------------------------
7 | widestring_05CB93 `[TPL:3][TPL:B][NAM:3]: Even though I was[N]able to reunite with all[N]of you, I'm not crying[N]tears of joy.[FIN]I suppose that I've run[N]out of tears…[END]`
8 |
9 | -------------------------------------
10 | ?INCLUDE 'fr39_lance'
11 | -------------------------------------
12 | widestring_05C85E `[TPL:4][TPL:8][DLY:2][NAM:4]: Where is this…?[FIN][TPL:1][TPL:9][NAM:1]: Somehow I'm feeling[N]very nostalgic…[FIN][TPL:3][TPL:9][NAM:3]: I feel as if I'm in[N]my mom's tummy…[FIN][TPL:2][TPL:B][NAM:2]: All of the people[N]that I've ever met and all[N]of the events I've ever[N]experienced from when I[N]was born are floating to[N]the surface of my mind one[N]by one…[FIN][TPL:4][TPL:B][DLY:2][NAM:4]: I was raised in tha[N]town o' South Cape[FIN]But didn't my old man go[N]out on an expedition and[N]not come back…?[FIN]Tha largest existence[N]within me had passed on,[N]and I suppose that I[N]didn't know what to do…[FIN][TPL:1][TPL:B][NAM:1]: I couldn't stand my[N]father invading other[N]countries with his troops.[FIN]It's a terrible thing when[N]people die, isn't it?[FIN]Years of life which they[N]had built up are reduced[N]to nothingness in an[N]instant.[FIN][TPL:3][TPL:B][NAM:3]: I wonder if [NAM:5][N]ultimately has died too…?[FIN][TPL:2][TPL:B][NAM:2]: They say that[N]people can forget[N]unpleasant things in order[N]to survive, don't they…?[END]`
13 |
14 | widestring_05CA69 `[TPL:4][TPL:9][NAM:4]: Huh? What have I[N]been doin' until now?[FIN]Why are ya all over there?[FIN][TPL:2][TPL:9][NAM:2]: [NAM:4]! You've got[N]your memory back…![FIN][TPL:1][TPL:9][NAM:1]: Geez! You know, we[N]were worried about you!![FIN][TPL:3][TPL:9][NAM:3]: I had no idea what[N]was going to happen…[END]`
15 |
16 | widestring_05CAEC `[TPL:4][TPL:9][NAM:4]: I guess I made[N]everyone worry.[FIN][TPL:B]But if someone else ends[N]up in tha same position[N]next time, I'll take care[N]of them.[END]`
17 |
18 | -------------------------------------
19 | ?INCLUDE 'fr39_lily_kara'
20 | -------------------------------------
21 | widestring_05C597 `[TPL:1][TPL:9][NAM:1]: I'm crying for some[N]reason.[END]`
22 |
23 | widestring_05C74D `[TPL:2][TPL:A][NAM:2]: You really have[N]varied experiences if you[N]go on a journey…[END]`
24 |
25 | widestring_05CBF7 `[TPL:3][TPL:B][NAM:3]: I hear there is an[N]eccentric inventor in a[N]nearby forest; won't you[N]try to meet him?[FIN]Apparently it's a person[N]named Neil, but…[FIN][CLD][TPL:0][TPL:8][NAM:0]: You said it's Neil?![FIN][TPL:9]My cousin went missing; he[N]had the same name…!![FIN]My cousin Neil is also an[N]inventor.[FIN][TPL:B]He invented a vehicle that[N]can fly through the big[N]blue sky like a bird; it's[N]called an aeroplane.[FIN][CLD][TPL:A]Thus, [NAM:0]'s party headed[N]to the house of the[N]inventor in the forest.[END]`
26 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter12.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 12
2 |
3 | ------------------------------------
4 | ?INCLUDE 'dc31_rescuer'
5 | ------------------------------------
6 | widestring_05ABC6 `[TPL:16][TPL:A]Man's voice: He should be[N]getting up about now; he[N]should be fine.[FIN]If he takes enough[N]vitamin C he should even[N]get over his fatigue.[FIN]This is what you call[N]"scurvy", you know.[FIN][TPL:B]If you don't take[N]vitamin C for a long time[N]you're going to contract[N]the disease.[FIN][CLD][TPL:1][TPL:8][NAM:1]: Ugh…[FIN][TPL:16][TPL:A]The famous explorer[N]Columbus's troop once[N]contracted the disease.[FIN]It's not something to[N]concern yourself about.[FIN]If the disease gets worse,[N]your blood goes bad and[N]your skin darkens.[FIN]You bleed from the gums,[N]and soon enough, your body[N]withers…[FIN][TPL:1][TPL:A][NAM:1]: Stop it! I don't[N]want to hear a scary story[N]like that![FIN][TPL:16][TPL:A]Man: Hahahaha. Well, more[N]importantly, he's safe.[FIN][TPL:1][TPL:A][NAM:1]: But, sir, you[N]really know a lot, huh?[N]I'm really grateful.[FIN][::][TPL:16][TPL:A]If you're going to thank[N]someone, thank the dog[N]outside.[FIN]After all, they found you[N]two while I was taking[N]them out.[END]`
7 |
8 | ------------------------------------
9 | ?INCLUDE 'dc31_kara'
10 | ------------------------------------
11 | widestring_05ADAE `[TPL:1][TPL:D][NAM:1]: [NAM:0]! [NAM:0]!![N]Wake up…!![FIN][TPL:E]It's land, we've reached[N]land! We've been[N]saved…!![FIN][TPL:0][TPL:E][NAM:0]: U-uugh…[END]`
12 |
13 | widestring_05AE00 `[TPL:0][TPL:D][NAM:0]: Huh… [NAM:1]…? Where in[N]the world are we? [FIN][TPL:1][TPL:D][NAM:1]: The house of a[N]gentleman that saved us.[FIN]Good grief, [NAM:0], you've[N]got bad sleeping posture…[FIN][TPL:E]You're supposed to be a[N]sick person and cling to[N]the sheets,[FIN]but you're laying on your[N]side like a baby.[END]`
14 |
15 | widestring_05AEA3 `[TPL:16][TPL:D]Man: This is the southern[N]outskirts of Oakland.[FIN][TPL:F]If you head northward for[N]about half a day, there's[N]the Capital of Flowers,[N][NAM:12].[FIN]I think if you're[N]searching for your friends[N]you were split from…[FIN]You should try doing it in[N]a big city.[END]`
16 |
17 | widestring_05AF2F `[TPL:1][TPL:A][NAM:1]: Anyhow, let's try[N]going to that city called[N][NAM:12].[FIN][TPL:B]I'm going to go give my[N]thanks to the dog. If[N]you're ready you can come[N]talk to me, alright?[END]`
18 |
19 | ------------------------------------
20 | ?INCLUDE 'dc30_dog'
21 | ------------------------------------
22 | widestring_05AA91 `[TPL:C]Woof woof!![END]`
23 |
24 | ------------------------------------
25 | ?INCLUDE 'dc30_kara'
26 | ------------------------------------
27 | widestring_05AADD `[TPL:1][TPL:E][NAM:1]: He said this dog's[N]name is Turbo. They seem[N]like a smart dog, huh.[FIN]Alright, let's go. We'll[N]definitely find [NAM:2],[N][NAM:4] and [NAM:3].[FIN][CLD][TPL:E]Like this, the two head to[N]the Capital of Flowers,[N][NAM:12].[END]`
28 |
--------------------------------------------------------------------------------
/modules/international-font/db/stringTypes.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "ASCIIString",
4 | "delimiter": "|",
5 | "shiftType": null,
6 | "terminator": 0,
7 | "characterMap": [
8 | null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
9 | null, null, null, null, null, null, null, null, null, null, null, null, null, "⸓", null, null,
10 | ".", "!", "ˎ", "Æ", "←", "˳", "‥", "˲", "[", "]", "*", "►", ",", "+", "-", "/",
11 | "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", "·", "(", "▼", ")", "?",
12 | " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
13 | "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "-", "'", "<", ">", "#",
14 | " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
15 | "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "¥", "_", "{", "}", "¦",
16 | "=", ";", "\"", null, null, null, null, null, null, null, null, null, null, null, null, null,
17 | "█", "˅", "Ḇ", "ṵ", "ṯ", "ō", "ṉ", "Ḛ", "ḛ", "ṟ", "˭", "Ĉ", "ā", "ĉ", "ḻ", null,
18 | null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
19 | null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
20 | null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
21 | "☼", "○", "◦", "Ḣ", "Ṗ", "Ṡ", "Ṫ", "Ḋ", "Ḟ", "♥", null, null, null, null, null, null,
22 | "ꝗ", "Ꝗ", null, null, "Ẋ", "Ẏ", "Ḃ", "Ạ", "⸔", null, null, null, null, null, null, null,
23 | "₀", "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉", null, null, null, null, null, null
24 | ]
25 | },
26 | {
27 | "name": "SpriteString",
28 | "delimiter": "~",
29 | "shiftType": "wh2",
30 | "terminator": 202,
31 | "characterMap": [
32 | "A", "B", "C", "D", "E", "F", "G", "H",
33 | "I", "J", "K", "L", "M", "N", "O", "!",
34 | "P", "Q", "R", "S", "T", "U", "V", "W",
35 | "X", "Y", "Z", "/", "?", "-", "(", ")",
36 | "a", "b", "c", "d", "e", "f", "g", "h",
37 | "i", "j", "k", "l", "m", "n", "o", " ",
38 | "p", "q", "r", "s", "t", "u", "v", "w",
39 | "x", "y", "z", ",", ".", "'", "\"", "ˮ"
40 | ]
41 | },
42 | {
43 | "name": "WideString",
44 | "delimiter": "`",
45 | "shiftType": "h2",
46 | "terminator": 202,
47 | "greedyTerminator": true,
48 | "characterMap": [
49 | "♥", "Æ", "Œ", "Ē", "æ", "œ", "Ĕ", "Ú", "Ü", "ñ", "Ñ", "¡","¿", "?", "'", "▼",
50 | "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", ",", "►", "\"", "ˮ", ":",
51 | "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "!",
52 | "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "/", "*", "-", "(", ")",
53 | "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", ";",
54 | "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "…", " ", "ç", "Ç", "ß",
55 | "Ā", "ā", "Ē", "ē", "Ī", "ī", "Ō", "ō", "Ū", "ū", "Ŷ", "ŷ", "ǁ", "ǁ", "ǁ", "ǁ"
56 | ]
57 | }
58 | ]
--------------------------------------------------------------------------------
/site/src/components/ErrorBoundary.tsx:
--------------------------------------------------------------------------------
1 | import { Component, ErrorInfo, ReactNode } from 'react';
2 | import './ErrorBoundary.css';
3 |
4 | interface Props {
5 | children: ReactNode;
6 | }
7 |
8 | interface State {
9 | hasError: boolean;
10 | error: Error | null;
11 | errorInfo: ErrorInfo | null;
12 | }
13 |
14 | export class ErrorBoundary extends Component {
15 | constructor(props: Props) {
16 | super(props);
17 | this.state = { hasError: false, error: null, errorInfo: null };
18 | }
19 |
20 | static getDerivedStateFromError(error: Error): State {
21 | return { hasError: true, error, errorInfo: null };
22 | }
23 |
24 | componentDidCatch(error: Error, errorInfo: ErrorInfo) {
25 | console.error('ErrorBoundary caught an error:', error, errorInfo);
26 | this.setState({
27 | error,
28 | errorInfo
29 | });
30 | }
31 |
32 | handleReload = () => {
33 | window.location.reload();
34 | };
35 |
36 | handleReset = () => {
37 | this.setState({ hasError: false, error: null, errorInfo: null });
38 | };
39 |
40 | render() {
41 | if (this.state.hasError) {
42 | return (
43 |
44 |
45 |
Something went wrong
46 |
47 | An unexpected error occurred while running the ROM patcher.
48 | This might be due to an incompatible ROM file, browser limitations,
49 | or a temporary issue.
50 |
51 |
52 |
53 |
Error Details
54 |
55 | Error: {this.state.error?.message || 'Unknown error'}
56 |
57 | {this.state.errorInfo && (
58 |
59 | Technical Details (Click to expand)
60 | {this.state.errorInfo.componentStack}
61 |
62 | )}
63 |
64 |
65 |
66 |
67 | Try Again
68 |
69 |
70 | Reload Page
71 |
72 |
73 |
74 |
75 |
Troubleshooting Tips
76 |
77 | Make sure you're using a valid Illusion of Gaia ROM file
78 | Try using a different browser (Chrome, Firefox, or Edge)
79 | Clear your browser cache and try again
80 | Ensure your ROM file is not corrupted
81 | Check that your browser supports modern JavaScript features
82 |
83 |
84 |
85 |
86 | );
87 | }
88 |
89 | return this.props.children;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | name: Deploy to GitHub Pages
2 |
3 | on:
4 | push:
5 | branches: [ main ]
6 | pull_request:
7 | branches: [ main ]
8 |
9 | jobs:
10 | build-and-deploy:
11 | runs-on: ubuntu-latest
12 |
13 | steps:
14 | - name: Checkout
15 | uses: actions/checkout@v4
16 |
17 | - name: Setup Node.js
18 | uses: actions/setup-node@v4
19 | with:
20 | node-version: '20'
21 | cache: 'npm'
22 | cache-dependency-path: site/package-lock.json
23 |
24 | - name: Clear npm cache and install dependencies
25 | run: |
26 | cd site
27 | npm cache clean --force
28 | npm ci
29 |
30 | - name: Verify package versions
31 | run: |
32 | cd site
33 | echo "Installed @gaialabs/shared version:"
34 | npm ls @gaialabs/shared
35 | echo "Available @gaialabs/shared version:"
36 | npm view @gaialabs/shared version
37 |
38 | - name: Debug secrets availability
39 | run: |
40 | echo "Checking if secrets are available..."
41 | echo "VITE_SUPABASE_URL secret exists: ${{ secrets.VITE_SUPABASE_URL != '' }}"
42 | echo "VITE_SUPABASE_ANON_KEY secret exists: ${{ secrets.VITE_SUPABASE_ANON_KEY != '' }}"
43 | echo "VITE_PROJECT_NAME secret exists: ${{ secrets.VITE_PROJECT_NAME != '' }}"
44 |
45 | - name: Build
46 | env:
47 | VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
48 | VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
49 | VITE_PROJECT_NAME: ${{ secrets.VITE_PROJECT_NAME }}
50 | run: |
51 | cd site
52 | echo "Environment variables during build:"
53 | echo "VITE_SUPABASE_URL is set: ${VITE_SUPABASE_URL:+YES}"
54 | echo "VITE_SUPABASE_ANON_KEY is set: ${VITE_SUPABASE_ANON_KEY:+YES}"
55 | echo "VITE_PROJECT_NAME is set: ${VITE_PROJECT_NAME:+YES}"
56 | npm run build
57 |
58 | - name: Debug environment variables
59 | run: |
60 | echo "Checking if environment variables were set during build..."
61 | echo "VITE_SUPABASE_URL is set: ${{ secrets.VITE_SUPABASE_URL != '' }}"
62 | echo "VITE_SUPABASE_ANON_KEY is set: ${{ secrets.VITE_SUPABASE_ANON_KEY != '' }}"
63 | echo "VITE_PROJECT_NAME is set: ${{ secrets.VITE_PROJECT_NAME != '' }}"
64 | echo "Checking built files..."
65 | ls -la site/dist/
66 | echo "Checking if environment variables are in built JS files..."
67 | grep -r "VITE_" site/dist/assets/ || echo "No VITE_ variables found in built assets"
68 |
69 | - name: Preserve CNAME file
70 | if: github.ref == 'refs/heads/main'
71 | run: |
72 | if [ -f CNAME ]; then
73 | echo "Copying CNAME file to dist directory..."
74 | cp CNAME site/dist/
75 | else
76 | echo "No CNAME file found in repository root"
77 | fi
78 |
79 | - name: Deploy to GitHub Pages
80 | if: github.ref == 'refs/heads/main'
81 | uses: peaceiris/actions-gh-pages@v4
82 | with:
83 | github_token: ${{ secrets.GITHUB_TOKEN }}
84 | publish_dir: ./site/dist
85 | keep_files: false
86 | force_orphan: true
87 |
--------------------------------------------------------------------------------
/modules/base/patches/FreejiaDeliveryman.asm:
--------------------------------------------------------------------------------
1 | ?BANK 0A
2 |
3 |
4 | --------------------------------------------
5 | h_actor < #3A, #00, #10 >
6 | --------------------------------------------
7 |
8 | frejia_deliveryman_main {
9 | COP [D0] ( #8D, #00, &frejia_deliveryman_destroy )
10 | COP [50] ( @pal_sc01_actors, #70, #F0, #10 )
11 | COP [C0] ( &frejia_deliveryman_interact )
12 | COP [0B]
13 | COP [C1]
14 | RTL
15 |
16 | frejia_deliveryman_destroy:
17 | COP [E0]
18 |
19 | frejia_deliveryman_interact:
20 | COP [BF] ( &frejia_deliveryman_str_intro )
21 | COP [BE] ( #03, #01, &frejia_deliveryman_options )
22 |
23 | frejia_deliveryman_options [
24 | &frejia_deliveryman_cancel
25 | &frejia_deliveryman_cancel
26 | &frejia_deliveryman_watermia
27 | &frejia_deliveryman_south_cape
28 | ]
29 |
30 | frejia_deliveryman_cancel:
31 | COP [BF] ( &frejia_deliveryman_str_cancel )
32 | RTL
33 |
34 | frejia_deliveryman_watermia:
35 | COP [BF] ( &frejia_deliveryman_str_watermia )
36 | LDA #$000D
37 | STA $0D60
38 | LDA #$0404
39 | STA $064A
40 | COP [65] ( #$0254, #$02D4, #00, #29 )
41 | COP [26] ( #78, #$0160, #$0268, #07, #$4500 )
42 | RTL
43 |
44 | frejia_deliveryman_south_cape:
45 | COP [BF] ( &frejia_deliveryman_str_south_cape )
46 | LDA #$000D
47 | STA $0D60
48 | LDA #$0404
49 | STA $064A
50 | COP [65] ( #$0254, #$02D4, #00, #2B )
51 | COP [26] ( #01, #$00F0, #$02E0, #03, #$4300 )
52 | RTL
53 | }
54 |
55 | frejia_deliveryman_str_intro `[TPL:16][TPL:E]I'm the Sky Delivery man.[N]My tame birds can fly you[N]to distant places. [FIN][TPL:F]Where do you want to go?[N][PAL:0] Stay Here[N] Watermia[N] South Cape[PAL:4]`
56 | frejia_deliveryman_str_cancel `[CLR]Alright. Come back if you[N]change your mind.[END]`
57 | frejia_deliveryman_str_watermia `[CLR]Come here, birds.[N]We're taking this person[N]to Watermia![END]`
58 | frejia_deliveryman_str_south_cape `[CLR]Come here, birds.[N]We're taking this person[N]to South Cape![END]`
59 |
60 | -------------------------------------------
61 | ?INCLUDE 'scene_meta'
62 | -------------------------------------------
63 |
64 | entry_32 [
65 | ppu < #0E > ;00
66 | music < #02, #00, @bgm_lively_city > ;01
67 | bitmap < #00, #10, #00, @gfx_fr32_ext_tiles, #00 > ;02
68 | bitmap < #00, #10, #10, @gfx_fr32_ext_tiles, #00 > ;03
69 | palette < #00, #70, #10, @pal_fr32_ext_tiles > ;04
70 | tileset < #00, #20, #00, #01, @set_fr32_ext_main > ;05
71 | tilemap < #01, @map_fr32_main > ;06
72 | tileset < #00, #20, #00, #02, @set_fr32_ext_effect > ;07
73 | tilemap < #02, @map_fr32_effect > ;08
74 | label < #0C > ;09
75 | bitmap < #00, #10, #10, @gfx_fr32_actors, #01 > ;0A
76 | palette < #00, #60, #A0, @pal_fr32_actors > ;0B
77 | spritemap < #$1352, #00, @spm_fr32_actors > ;0C
78 | ]
79 |
80 | entry_9D [
81 | ppu < #1F > ;00
82 | music < #04, #00, @bgm_ominous_whispers > ;01
83 | bitmap < #00, #10, #00, @gfx_fr33_int_main, #00 > ;02
84 | palette < #00, #70, #10, @palette_1E50F3 > ;03
85 | tileset < #00, #20, #00, #03, @set_1775A4 > ;04
86 | tilemap < #01, @map_1D214D > ;05
87 | tilemap < #02, @map_1E026F > ;06
88 | bitmap < #00, #10, #10, @gfx_fr32_actors, #01 > ;07
89 | palette < #00, #60, #A0, @pal_fr32_actors > ;08
90 | spritemap < #$1352, #00, @spm_fr32_actors > ;09
91 | ]
--------------------------------------------------------------------------------
/site/src/components/ModuleSelector.css:
--------------------------------------------------------------------------------
1 | .module-selector {
2 | max-width: 800px;
3 | margin: 0 auto;
4 | padding: 2rem;
5 | }
6 |
7 | .module-selector h2 {
8 | color: #333;
9 | margin-bottom: 0.5rem;
10 | font-size: 1.8rem;
11 | }
12 |
13 | .selector-description {
14 | color: #666;
15 | margin-bottom: 2rem;
16 | font-size: 1rem;
17 | line-height: 1.5;
18 | }
19 |
20 | .groups-container {
21 | display: flex;
22 | flex-direction: column;
23 | gap: 2rem;
24 | }
25 |
26 | .module-group {
27 | background: #f8f9fa;
28 | border: 1px solid #e9ecef;
29 | border-radius: 8px;
30 | padding: 1.5rem;
31 | transition: box-shadow 0.2s ease;
32 | }
33 |
34 | .module-group:hover {
35 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
36 | }
37 |
38 | .group-title {
39 | color: #495057;
40 | margin: 0 0 1rem 0;
41 | font-size: 1.3rem;
42 | font-weight: 600;
43 | border-bottom: 2px solid #dee2e6;
44 | padding-bottom: 0.5rem;
45 | }
46 |
47 | .options-container {
48 | display: flex;
49 | flex-direction: column;
50 | gap: 0.75rem;
51 | }
52 |
53 | .option-label {
54 | display: flex;
55 | align-items: flex-start;
56 | gap: 0.75rem;
57 | padding: 0.75rem;
58 | border: 1px solid #dee2e6;
59 | border-radius: 6px;
60 | background: white;
61 | cursor: pointer;
62 | transition: all 0.2s ease;
63 | }
64 |
65 | .option-label:hover {
66 | border-color: #646cff;
67 | background: #f8f9ff;
68 | }
69 |
70 | .option-label:has(.option-radio:checked) {
71 | border-color: #646cff;
72 | background: #f0f2ff;
73 | box-shadow: 0 0 0 2px rgba(100, 108, 255, 0.1);
74 | }
75 |
76 | .option-radio {
77 | margin: 0;
78 | width: 18px;
79 | height: 18px;
80 | accent-color: #646cff;
81 | flex-shrink: 0;
82 | margin-top: 2px;
83 | }
84 |
85 | .option-content {
86 | display: flex;
87 | flex-direction: column;
88 | gap: 0.25rem;
89 | flex: 1;
90 | }
91 |
92 | .option-name {
93 | font-weight: 500;
94 | color: #333;
95 | font-size: 1rem;
96 | }
97 |
98 | .option-description {
99 | font-size: 0.875rem;
100 | color: #666;
101 | line-height: 1.4;
102 | }
103 |
104 | /* Dark mode support */
105 | @media (prefers-color-scheme: dark) {
106 | .module-selector h2 {
107 | color: #f1f3f4;
108 | }
109 |
110 | .selector-description {
111 | color: #9aa0a6;
112 | }
113 |
114 | .module-group {
115 | background: #2d3748;
116 | border-color: #4a5568;
117 | }
118 |
119 | .group-title {
120 | color: #e2e8f0;
121 | border-bottom-color: #4a5568;
122 | }
123 |
124 | .option-label {
125 | background: #1a202c;
126 | border-color: #4a5568;
127 | }
128 |
129 | .option-label:hover {
130 | background: #2d3748;
131 | border-color: #646cff;
132 | }
133 |
134 | .option-label:has(.option-radio:checked) {
135 | background: #2a2f3a;
136 | border-color: #646cff;
137 | }
138 |
139 | .option-name {
140 | color: #f1f3f4;
141 | }
142 |
143 | .option-description {
144 | color: #9aa0a6;
145 | }
146 | }
147 |
148 | /* Responsive design */
149 | @media (max-width: 768px) {
150 | .module-selector {
151 | padding: 1rem;
152 | }
153 |
154 | .module-selector h2 {
155 | font-size: 1.5rem;
156 | }
157 |
158 | .group-title {
159 | font-size: 1.2rem;
160 | }
161 |
162 | .option-label {
163 | padding: 0.5rem;
164 | }
165 | }
166 |
--------------------------------------------------------------------------------
/modules/title-demo/EnhancedTitle.patch.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | !scene_current 0644
4 | !joypad_mask_std 065A
5 | !player_flags 09AE
6 | !INIDISP 2100
7 | !VMADDL 2116
8 | !_TM 212C
9 |
10 | ------------------------------------------------
11 | ?INCLUDE 'system_strings'
12 | ------------------------------------------------
13 | asciistring_01DA47 |[NHM:4][CUR:90,3]PUSH START BUTTON|
14 | asciistring_01DA5E |[NHM:0][CUR:D4,2]RETRANSLATED[NHM:0][CUR:08,6](C) 1994 QUINTET/ENIX[CUR:48,6]MARIKO OHARA/MOTO HAGIO[CUR:8E,6]YASUHIRO KAWASAKI|
15 |
16 | ------------------------------------------------
17 | ?INCLUDE 'scene_meta'
18 | ------------------------------------------------
19 |
20 | entry_FC [
21 | ppu < #25 >
22 | music < #1F, #00, @bgm_illusion_of_gaia >
23 | bitmap < #00, #20, #00, @gfx_title, #00 >
24 | palette < #00, #80, #00, @pal_title >
25 | tileset < #00, #20, #00, #03, @set_title >
26 | tilemap < #01, @map_title_main >
27 | tilemap < #02, @map_title_effect >
28 | bitmap < #00, #10, #10, @gfx_title_actors, #01 >
29 | palette < #00, #60, #A0, @pal_title_actors >
30 | spritemap < #$0254, #00, @spm_title_actors >
31 | ]
32 |
33 | ------------------------------------------------
34 | ?INCLUDE 'scene_thinkers'
35 | ------------------------------------------------
36 |
37 | thinker_0CEB2F [
38 | thinker < #74, @thinker_00B520 >
39 | thinker < #00, @thinker_00BCDF >
40 | thinker < #00, @thinker_00BCB3 >
41 | thinker < #24, @parallax_thinker >
42 | ;thinker < #00, @thinker_00BC91 >
43 | ]
44 |
45 |
46 |
47 | ------------------------------------------------
48 | ?INCLUDE 'sFC_actor_0BC924'
49 | ------------------------------------------------
50 |
51 | e_sFC_actor_0BC924 {
52 | LDA #$4001
53 | TSB $09EC
54 | LDA #$0000
55 | STA $7F0A00
56 | COP [50] ( @pal_title, #00, #00, #08 )
57 | COP [50] ( @palette_1E1D35, #00, #00, #08 )
58 | COP [A0] ( @code_0BC933, #$0060, #$00B6, #$1800 )
59 | COP [A0] ( @code_0BC945, #$0080, #$00B6, #$1800 )
60 | COP [A0] ( @code_0BC957, #$00A0, #$00B6, #$1800 )
61 | SEP #$20
62 | LDA #$17
63 | STA $_TM
64 | REP #$20
65 | COP [BD] ( @asciistring_01DA5E )
66 | COP [BD] ( @asciistring_01DA47 )
67 | COP [DB] ( #$0B7B )
68 | COP [CC] ( #F4 )
69 | LDA #$0804
70 | STA $064A
71 | COP [26] ( #8C, #$0000, #$0000, #00, #$1100 )
72 | COP [C1]
73 | RTL
74 | }
75 |
76 |
77 | code_0BC933 {
78 | COP [B6] ( #30 )
79 | COP [9C] ( @code_0BC969, #$1000 )
80 | COP [C1]
81 | COP [80] ( #00 )
82 | COP [89]
83 | RTL
84 | }
85 |
86 |
87 | code_0BC945 {
88 | COP [B6] ( #30 )
89 | COP [9C] ( @code_0BC969, #$1000 )
90 | COP [C1]
91 | COP [80] ( #01 )
92 | COP [89]
93 | RTL
94 | }
95 |
96 |
97 | code_0BC957 {
98 | COP [B6] ( #30 )
99 | COP [9C] ( @code_0BC969, #$1000 )
100 | COP [C1]
101 | COP [80] ( #02 )
102 | COP [89]
103 | RTL
104 | }
105 |
106 |
107 | code_0BC969 {
108 | COP [B7] ( #0A )
109 | COP [B6] ( #30 )
110 | COP [C1]
111 | COP [80] ( #03 )
112 | COP [89]
113 | RTL
114 | }
115 |
116 |
117 | ------------------------------------------------
118 | ?INCLUDE 'sFC_actor_0BC9AE'
119 | ------------------------------------------------
120 | ;Immediate start press
121 |
122 | e_sFC_actor_0BC9AE {
123 | BRA e_sFC_actor_0BC9BD
124 | }
125 |
126 |
127 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter18.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 18
2 |
3 | ------------------------------------
4 | ?INCLUDE 'dm3E_intro'
5 | ------------------------------------
6 | widestring_05FA59 `[TPL:0][TPL:E][NAM:0]: A mysterious garden[N]was floating in the skies[N]above Nazca…[FIN][TPL:F]Neil and the others on the[N]ground looked like grains[N]of rice as they ran about[N]every which way.[FIN]Could the Nazca lines[N]possibly have been an[N]airfield for this midair[N]garden?[END]`
7 |
8 | ------------------------------------
9 | ?INCLUDE 'sg4C_spirits'
10 | ------------------------------------
11 | widestring_05F371 `[TPL:1A][TPL:D]Race of the Moon: We meet[N]again, huh? Mweheheheh.[FIN][TPL:E]If you're hanging around a[N]place like this, you must[N]be a vigorous little boy.[END]`
12 |
13 | widestring_05F3C9 `[TPL:1A][TPL:E]Race of the Moon: This[N]mid-air garden is our[N]vehicle.[FIN]Four crystal balls are[N]enshrined in the four[N]areas.[FIN]Go around clockwise and[N]you can get them all.[N]Mweheheheh…[END]`
14 |
15 | widestring_05F46E `[TPL:1A][TPL:E]Race of the Moon: The[N]midair garden's underside[N]is also its surface.[FIN][TPL:F]If you jump down from a[N]cliff, there's still an[N]inverted world isn't[N]there…[END]`
16 |
17 | ------------------------------------
18 | ?INCLUDE 'sg52_switch'
19 | ------------------------------------
20 | widestring_05F71C `[TPL:E]When you step on this[N]tile, something makes a[N]sound…[END]`
21 |
22 | ------------------------------------
23 | ?INCLUDE 'sg55_mystic_statue'
24 | ------------------------------------
25 | widestring_0ACF0E `[TPL:E]After defeating the huge[N]bird, you found a [NAM:D][N][NAM:E] in its corpse!![END]`
26 |
27 | widestring_0ACF4A `[TPL:E]Through the sound of a[N]propeller, Neil's voice[N]echoes from a megaphone![FIN][TPL:6][TPL:E]Neil: [NAM:0]…! You're[N]getting too close to the[N]grouuund…!![FIN]I'll catch you in my[N]aeroplane, so jump[N]down…!![END]`
28 |
29 | ------------------------------------
30 | ?INCLUDE 'sp58_missed_flight'
31 | ------------------------------------
32 | widestring_06805C `[TPL:6][TPL:9]Neil: Draaat…! I…[N]I missed…!![FIN][TPL:1][TPL:A][NAM:1]: Neil you dumb[N]dumb dumb dummy…![N][NAM:0]'s going to die…!![FIN][TPL:4][TPL:B][NAM:4]: Neil! There's still[N]a little more time before[N]he hits the ground…! Do it[N]one more time…!![FIN][TPL:6][TPL:B]Neil: Alright! This time[N]for sure, you'll see…!![END]`
33 |
34 | ------------------------------------
35 | ?INCLUDE 'sp58_red_eye'
36 | ------------------------------------
37 | widestring_068230 `[TPL:6][TPL:8]Neil: That was dangerous…[FIN][TPL:1][TPL:8][NAM:1]: *Sniffle* *Sniffle*[FIN][TPL:3][TPL:8][NAM:3]: *Sob* *Sob* *Sob*[FIN][TPL:4][TPL:A][NAM:4]: [NAM:1] and [NAM:3], stop[N]cryin'. We saved [NAM:0],[N]after all.[FIN][TPL:2][TPL:B][NAM:2]: By the waaay,[N]Neil's amazing, isn't he?[N]Having made a thing like[N]this.[FIN][TPL:6][TPL:B]Neil: Haha. Please don't[N]praise me like that.[N]Anyway, I'll take you to[N]the next ruin with this.[FIN]If we go by the precedent[N]of the ruins mapping up to[N]the shape of the[N]constellation of Cygnus,[FIN]…the next ruin should be[N]the continent of Mu.[END]`
38 |
39 | widestring_06834A `[TPL:6][TPL:9]Neil: Alright, out to the[N]ocean…!![FIN][TPL:A]The continent of Mu should[N]be sleeping somewhere in[N]this deep blue sea.[END]`
40 |
41 | ------------------------------------
42 | ?INCLUDE 'sp58_monologue'
43 | ------------------------------------
44 | widestring_0683EB `[TPL:0][TPL:9][NAM:0]: We barely ejected[N]from the aeroplane…[FIN][TPL:B]Neil is an amazing[N]inventor but his products[N]are always missing[N]something…[FIN]It occurred to me that a[N]prefect person may not[N]exist anywhere.[END]`
45 |
46 |
--------------------------------------------------------------------------------
/site/src/App.css:
--------------------------------------------------------------------------------
1 | #root {
2 | max-width: 1200px;
3 | margin: 0 auto;
4 | padding: 1rem;
5 | min-height: 100vh;
6 | }
7 |
8 | .app-header {
9 | text-align: center;
10 | margin-bottom: 3rem;
11 | padding: 2rem 0;
12 | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
13 | color: white;
14 | border-radius: 12px;
15 | box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
16 | }
17 |
18 | .app-header h1 {
19 | margin: 0 0 0.5rem 0;
20 | font-size: 2.5rem;
21 | font-weight: 700;
22 | text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
23 | }
24 |
25 | .app-header h2 {
26 | margin: 0;
27 | font-size: 1.3rem;
28 | font-weight: 400;
29 | opacity: 0.9;
30 | }
31 |
32 | .card {
33 | background: #f8f9fa;
34 | border: 1px solid #e9ecef;
35 | border-radius: 8px;
36 | padding: 2rem;
37 | margin-bottom: 2rem;
38 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
39 | transition: box-shadow 0.2s ease;
40 | }
41 |
42 | .card:hover {
43 | box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
44 | }
45 |
46 | .card.error {
47 | border-color: #f5c6cb;
48 | background: #f8d7da;
49 | }
50 |
51 | .card h3 {
52 | margin: 0 0 1rem 0;
53 | color: #333;
54 | font-size: 1.4rem;
55 | }
56 |
57 | .card p {
58 | margin: 0.5rem 0;
59 | color: #666;
60 | line-height: 1.5;
61 | }
62 |
63 | .card pre {
64 | background: #2d3748;
65 | color: #e2e8f0;
66 | padding: 1rem;
67 | border-radius: 6px;
68 | overflow-x: auto;
69 | font-size: 0.85rem;
70 | line-height: 1.4;
71 | margin: 1rem 0 0 0;
72 | }
73 |
74 | .workflow-container {
75 | display: grid;
76 | gap: 2rem;
77 | margin-bottom: 2rem;
78 | }
79 |
80 | .workflow-step {
81 | position: relative;
82 | }
83 |
84 | /* .workflow-step::before {
85 | content: '';
86 | position: absolute;
87 | left: -1rem;
88 | top: 0;
89 | bottom: 0;
90 | width: 4px;
91 | background: linear-gradient(to bottom, #646cff, #535bf2);
92 | border-radius: 2px;
93 | } */
94 |
95 | .loading-spinner {
96 | display: inline-block;
97 | width: 20px;
98 | height: 20px;
99 | border: 3px solid #f3f3f3;
100 | border-top: 3px solid #646cff;
101 | border-radius: 50%;
102 | animation: spin 1s linear infinite;
103 | margin-right: 0.5rem;
104 | }
105 |
106 | @keyframes spin {
107 | 0% { transform: rotate(0deg); }
108 | 100% { transform: rotate(360deg); }
109 | }
110 |
111 | /* Dark mode support */
112 | @media (prefers-color-scheme: dark) {
113 | .app-header {
114 | background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
115 | }
116 |
117 | .card {
118 | background: #2d3748;
119 | border-color: #4a5568;
120 | color: #e2e8f0;
121 | }
122 |
123 | .card.error {
124 | background: #3d1a1a;
125 | border-color: #5a2a2a;
126 | }
127 |
128 | .card h3 {
129 | color: #f1f3f4;
130 | }
131 |
132 | .card p {
133 | color: #a0aec0;
134 | }
135 | }
136 |
137 | /* Responsive design */
138 | @media (max-width: 768px) {
139 | #root {
140 | padding: 0.5rem;
141 | }
142 |
143 | .app-header {
144 | margin-bottom: 2rem;
145 | padding: 1.5rem 1rem;
146 | }
147 |
148 | .app-header h1 {
149 | font-size: 2rem;
150 | }
151 |
152 | .app-header h2 {
153 | font-size: 1.1rem;
154 | }
155 |
156 | .card {
157 | padding: 1.5rem;
158 | margin-bottom: 1.5rem;
159 | }
160 |
161 | .workflow-step::before {
162 | left: -0.5rem;
163 | width: 3px;
164 | }
165 | }
166 |
167 | @media (max-width: 480px) {
168 | .app-header h1 {
169 | font-size: 1.7rem;
170 | }
171 |
172 | .app-header h2 {
173 | font-size: 1rem;
174 | }
175 |
176 | .card {
177 | padding: 1rem;
178 | }
179 |
180 | .card pre {
181 | font-size: 0.75rem;
182 | padding: 0.75rem;
183 | }
184 | }
185 |
--------------------------------------------------------------------------------
/modules/title-alternate/patches/EnhancedTitle.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | !scene_current 0644
4 | !joypad_mask_std 065A
5 | !player_flags 09AE
6 | !INIDISP 2100
7 | !VMADDL 2116
8 | !_TM 212C
9 |
10 | ------------------------------------------------
11 | ?INCLUDE 'system_strings'
12 | ------------------------------------------------
13 | asciistring_01DA47 |[NHM:4][CUR:50,4]PUSH START BUTTON|
14 | ;string_01DA5E |[NHM:4][CUR:55,3]RETRANSLATED|
15 | asciistring_01DA5E |[NHM:0][CUR:9C,3]RETRANSLATED[NHM:0][CUR:08,6](C) 1994 QUINTET/ENIX[CUR:48,6]MARIKO OHARA/MOTO HAGIO[CUR:8E,6]YASUHIRO KAWASAKI|
16 |
17 | ------------------------------------------------
18 | ?INCLUDE 'scene_meta'
19 | ------------------------------------------------
20 |
21 | entry_FC [
22 | ppu < #25 >
23 | music < #1F, #00, @bgm_illusion_of_gaia >
24 | bitmap < #00, #20, #00, @gfx_title, #00 >
25 | palette < #00, #80, #00, @pal_title >
26 | tileset < #00, #20, #00, #03, @set_title >
27 | tilemap < #01, @map_title_main >
28 | tilemap < #02, @map_title_effect >
29 | bitmap < #00, #10, #10, @gfx_title_actors, #01 >
30 | palette < #00, #60, #A0, @pal_title_actors >
31 | spritemap < #$04F4, #00, @spm_title_actors >
32 | ]
33 |
34 | ------------------------------------------------
35 | ?INCLUDE 'scene_thinkers'
36 | ------------------------------------------------
37 |
38 | thinker_0CEB2F [
39 | thinker < #74, @thinker_00B520 >
40 | thinker < #00, @thinker_00BCDF >
41 | thinker < #00, @thinker_00BCB3 >
42 | thinker < #24, @parallax_thinker >
43 | ;thinker < #00, @thinker_00BC91 >
44 | ]
45 |
46 | ------------------------------------------------
47 | ?INCLUDE 'sFC_actor_0BC924'
48 | ------------------------------------------------
49 |
50 | e_sFC_actor_0BC924 {
51 | LDA #$4001
52 | TSB $09EC
53 | LDA #$0000
54 | STA $7F0A00
55 | COP [50] ( @pal_title, #00, #00, #08 )
56 | COP [50] ( @palette_1E1D35, #00, #00, #08 )
57 | COP [A0] ( @code_0BC933, #$0060, #$00B6, #$1800 )
58 | COP [A0] ( @code_0BC945, #$0080, #$00B6, #$1800 )
59 | COP [A0] ( @code_0BC957, #$00A0, #$00B6, #$1800 )
60 | COP [A0] ( @code_0BC988, #$0048, #$0048, #$1800 )
61 | SEP #$20
62 | LDA #$17
63 | STA $_TM
64 | REP #$20
65 | LDA #$0804
66 | STA $064A
67 | COP [DA] ( #B3 )
68 | COP [BD] ( @asciistring_01DA5E )
69 | COP [DA] ( #77 )
70 | COP [BD] ( @asciistring_01DA47 )
71 | COP [DB] ( #$09D3 )
72 | COP [CC] ( #F4 )
73 | LDA #$0804
74 | STA $064A
75 | COP [26] ( #8C, #$0000, #$0000, #00, #$1100 )
76 | COP [C1]
77 | RTL
78 | }
79 |
80 |
81 | code_0BC933 {
82 | COP [B6] ( #30 )
83 | COP [9C] ( @code_0BC969, #$1000 )
84 | COP [C1]
85 | COP [80] ( #00 )
86 | COP [89]
87 | RTL
88 | }
89 |
90 |
91 | code_0BC945 {
92 | COP [B6] ( #30 )
93 | COP [9C] ( @code_0BC969, #$1000 )
94 | COP [C1]
95 | COP [80] ( #01 )
96 | COP [89]
97 | RTL
98 | }
99 |
100 |
101 | code_0BC957 {
102 | COP [B6] ( #30 )
103 | COP [9C] ( @code_0BC969, #$1000 )
104 | COP [C1]
105 | COP [80] ( #02 )
106 | COP [89]
107 | RTL
108 | }
109 |
110 |
111 | code_0BC969 {
112 | COP [B7] ( #0A )
113 | COP [B6] ( #30 )
114 | COP [C1]
115 | COP [80] ( #03 )
116 | COP [89]
117 | RTL
118 | }
119 |
120 | code_0BC988 {
121 | COP [B6] ( #20 )
122 | COP [C1]
123 | COP [80] ( #04 )
124 | COP [89]
125 | RTL
126 | }
127 |
128 |
129 | ------------------------------------------------
130 | ?INCLUDE 'sFC_actor_0BC9AE'
131 | ------------------------------------------------
132 | ;Immediate start press
133 |
134 | e_sFC_actor_0BC9AE {
135 | BRA e_sFC_actor_0BC9BD
136 | }
137 |
138 |
139 |
--------------------------------------------------------------------------------
/site/src/components/NotificationSystem.css:
--------------------------------------------------------------------------------
1 | .notification-system {
2 | position: fixed;
3 | top: 20px;
4 | right: 20px;
5 | z-index: 1000;
6 | display: flex;
7 | flex-direction: column;
8 | gap: 0.75rem;
9 | max-width: 400px;
10 | pointer-events: none;
11 | }
12 |
13 | .notification {
14 | background: white;
15 | border-radius: 8px;
16 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
17 | border-left: 4px solid;
18 | overflow: hidden;
19 | transform: translateX(100%);
20 | animation: slideIn 0.3s ease-out forwards;
21 | pointer-events: auto;
22 | }
23 |
24 | .notification-success {
25 | border-left-color: #28a745;
26 | }
27 |
28 | .notification-error {
29 | border-left-color: #dc3545;
30 | }
31 |
32 | .notification-warning {
33 | border-left-color: #ffc107;
34 | }
35 |
36 | .notification-info {
37 | border-left-color: #17a2b8;
38 | }
39 |
40 | .notification-content {
41 | padding: 1rem;
42 | }
43 |
44 | .notification-header {
45 | display: flex;
46 | align-items: center;
47 | gap: 0.5rem;
48 | margin-bottom: 0.5rem;
49 | }
50 |
51 | .notification-icon {
52 | font-size: 1.1rem;
53 | flex-shrink: 0;
54 | }
55 |
56 | .notification-title {
57 | font-weight: 600;
58 | color: #333;
59 | flex: 1;
60 | font-size: 0.95rem;
61 | }
62 |
63 | .notification-close {
64 | background: none;
65 | border: none;
66 | font-size: 1.5rem;
67 | color: #6c757d;
68 | cursor: pointer;
69 | padding: 0;
70 | width: 24px;
71 | height: 24px;
72 | display: flex;
73 | align-items: center;
74 | justify-content: center;
75 | border-radius: 4px;
76 | transition: all 0.2s ease;
77 | flex-shrink: 0;
78 | }
79 |
80 | .notification-close:hover {
81 | background: #f8f9fa;
82 | color: #495057;
83 | }
84 |
85 | .notification-message {
86 | color: #6c757d;
87 | font-size: 0.9rem;
88 | line-height: 1.4;
89 | margin-left: 1.6rem;
90 | }
91 |
92 | @keyframes slideIn {
93 | from {
94 | transform: translateX(100%);
95 | opacity: 0;
96 | }
97 | to {
98 | transform: translateX(0);
99 | opacity: 1;
100 | }
101 | }
102 |
103 | @keyframes slideOut {
104 | from {
105 | transform: translateX(0);
106 | opacity: 1;
107 | }
108 | to {
109 | transform: translateX(100%);
110 | opacity: 0;
111 | }
112 | }
113 |
114 | .notification.dismissing {
115 | animation: slideOut 0.3s ease-in forwards;
116 | }
117 |
118 | /* Dark mode support */
119 | @media (prefers-color-scheme: dark) {
120 | .notification {
121 | background: #2d3748;
122 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
123 | }
124 |
125 | .notification-title {
126 | color: #e2e8f0;
127 | }
128 |
129 | .notification-message {
130 | color: #a0aec0;
131 | }
132 |
133 | .notification-close {
134 | color: #a0aec0;
135 | }
136 |
137 | .notification-close:hover {
138 | background: #4a5568;
139 | color: #e2e8f0;
140 | }
141 | }
142 |
143 | /* Responsive design */
144 | @media (max-width: 768px) {
145 | .notification-system {
146 | top: 10px;
147 | right: 10px;
148 | left: 10px;
149 | max-width: none;
150 | }
151 |
152 | .notification {
153 | margin: 0;
154 | }
155 |
156 | .notification-content {
157 | padding: 0.75rem;
158 | }
159 |
160 | .notification-header {
161 | margin-bottom: 0.25rem;
162 | }
163 |
164 | .notification-message {
165 | margin-left: 1.4rem;
166 | font-size: 0.85rem;
167 | }
168 | }
169 |
170 | /* Accessibility */
171 | @media (prefers-reduced-motion: reduce) {
172 | .notification {
173 | animation: none;
174 | transform: translateX(0);
175 | }
176 |
177 | .notification.dismissing {
178 | animation: none;
179 | opacity: 0;
180 | }
181 | }
182 |
183 | /* High contrast mode */
184 | @media (prefers-contrast: high) {
185 | .notification {
186 | border: 2px solid;
187 | }
188 |
189 | .notification-success {
190 | border-color: #28a745;
191 | }
192 |
193 | .notification-error {
194 | border-color: #dc3545;
195 | }
196 |
197 | .notification-warning {
198 | border-color: #ffc107;
199 | }
200 |
201 | .notification-info {
202 | border-color: #17a2b8;
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/site/src/components/ErrorBoundary.css:
--------------------------------------------------------------------------------
1 | .error-boundary {
2 | min-height: 100vh;
3 | display: flex;
4 | align-items: center;
5 | justify-content: center;
6 | padding: 2rem;
7 | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
8 | }
9 |
10 | .error-container {
11 | max-width: 600px;
12 | background: white;
13 | border-radius: 12px;
14 | padding: 2rem;
15 | box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
16 | text-align: center;
17 | }
18 |
19 | .error-container h1 {
20 | color: #dc3545;
21 | margin: 0 0 1rem 0;
22 | font-size: 2rem;
23 | }
24 |
25 | .error-message {
26 | color: #6c757d;
27 | margin-bottom: 2rem;
28 | line-height: 1.6;
29 | font-size: 1.1rem;
30 | }
31 |
32 | .error-details {
33 | background: #f8f9fa;
34 | border: 1px solid #e9ecef;
35 | border-radius: 8px;
36 | padding: 1.5rem;
37 | margin-bottom: 2rem;
38 | text-align: left;
39 | }
40 |
41 | .error-details h3 {
42 | margin: 0 0 1rem 0;
43 | color: #495057;
44 | font-size: 1.2rem;
45 | }
46 |
47 | .error-text {
48 | margin-bottom: 1rem;
49 | font-family: monospace;
50 | font-size: 0.9rem;
51 | color: #dc3545;
52 | background: white;
53 | padding: 0.75rem;
54 | border-radius: 4px;
55 | border: 1px solid #f5c6cb;
56 | }
57 |
58 | .error-stack {
59 | margin-top: 1rem;
60 | }
61 |
62 | .error-stack summary {
63 | cursor: pointer;
64 | font-weight: 600;
65 | color: #6c757d;
66 | margin-bottom: 0.5rem;
67 | }
68 |
69 | .error-stack pre {
70 | background: #2d3748;
71 | color: #e2e8f0;
72 | padding: 1rem;
73 | border-radius: 4px;
74 | overflow-x: auto;
75 | font-size: 0.8rem;
76 | line-height: 1.4;
77 | margin: 0.5rem 0 0 0;
78 | }
79 |
80 | .error-actions {
81 | display: flex;
82 | gap: 1rem;
83 | justify-content: center;
84 | margin-bottom: 2rem;
85 | }
86 |
87 | .retry-button,
88 | .reload-button {
89 | padding: 0.75rem 1.5rem;
90 | border: none;
91 | border-radius: 6px;
92 | font-weight: 600;
93 | cursor: pointer;
94 | transition: all 0.2s ease;
95 | font-size: 1rem;
96 | }
97 |
98 | .retry-button {
99 | background: #646cff;
100 | color: white;
101 | }
102 |
103 | .retry-button:hover {
104 | background: #535bf2;
105 | transform: translateY(-1px);
106 | }
107 |
108 | .reload-button {
109 | background: #6c757d;
110 | color: white;
111 | }
112 |
113 | .reload-button:hover {
114 | background: #5a6268;
115 | transform: translateY(-1px);
116 | }
117 |
118 | .error-help {
119 | background: #e7f3ff;
120 | border: 1px solid #b8daff;
121 | border-radius: 8px;
122 | padding: 1.5rem;
123 | text-align: left;
124 | }
125 |
126 | .error-help h3 {
127 | margin: 0 0 1rem 0;
128 | color: #004085;
129 | font-size: 1.1rem;
130 | }
131 |
132 | .error-help ul {
133 | margin: 0;
134 | padding-left: 1.5rem;
135 | color: #004085;
136 | }
137 |
138 | .error-help li {
139 | margin-bottom: 0.5rem;
140 | line-height: 1.4;
141 | }
142 |
143 | /* Dark mode support */
144 | @media (prefers-color-scheme: dark) {
145 | .error-container {
146 | background: #2d3748;
147 | color: #e2e8f0;
148 | }
149 |
150 | .error-container h1 {
151 | color: #f56565;
152 | }
153 |
154 | .error-message {
155 | color: #a0aec0;
156 | }
157 |
158 | .error-details {
159 | background: #1a202c;
160 | border-color: #4a5568;
161 | }
162 |
163 | .error-details h3 {
164 | color: #e2e8f0;
165 | }
166 |
167 | .error-text {
168 | background: #2d3748;
169 | color: #f56565;
170 | border-color: #e53e3e;
171 | }
172 |
173 | .error-stack summary {
174 | color: #a0aec0;
175 | }
176 |
177 | .error-help {
178 | background: #1a365d;
179 | border-color: #2c5282;
180 | }
181 |
182 | .error-help h3,
183 | .error-help li {
184 | color: #90cdf4;
185 | }
186 | }
187 |
188 | /* Responsive design */
189 | @media (max-width: 768px) {
190 | .error-boundary {
191 | padding: 1rem;
192 | }
193 |
194 | .error-container {
195 | padding: 1.5rem;
196 | }
197 |
198 | .error-container h1 {
199 | font-size: 1.5rem;
200 | }
201 |
202 | .error-actions {
203 | flex-direction: column;
204 | }
205 |
206 | .retry-button,
207 | .reload-button {
208 | width: 100%;
209 | }
210 | }
211 |
--------------------------------------------------------------------------------
/site/src/components/NotificationSystem.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import './NotificationSystem.css';
3 |
4 | export interface Notification {
5 | id: string;
6 | type: 'success' | 'error' | 'warning' | 'info';
7 | title: string;
8 | message: string;
9 | duration?: number;
10 | }
11 |
12 | interface NotificationSystemProps {
13 | notifications: Notification[];
14 | onDismiss: (id: string) => void;
15 | }
16 |
17 | export function NotificationSystem({ notifications, onDismiss }: NotificationSystemProps) {
18 | const [visibleNotifications, setVisibleNotifications] = useState([]);
19 |
20 | useEffect(() => {
21 | setVisibleNotifications(notifications);
22 |
23 | // Auto-dismiss notifications after their duration
24 | notifications.forEach(notification => {
25 | if (notification.duration && notification.duration > 0) {
26 | setTimeout(() => {
27 | onDismiss(notification.id);
28 | }, notification.duration);
29 | }
30 | });
31 | }, [notifications, onDismiss]);
32 |
33 | const getIcon = (type: Notification['type']) => {
34 | switch (type) {
35 | case 'success': return '✅';
36 | case 'error': return '❌';
37 | case 'warning': return '⚠️';
38 | case 'info': return 'ℹ️';
39 | default: return 'ℹ️';
40 | }
41 | };
42 |
43 | if (visibleNotifications.length === 0) {
44 | return null;
45 | }
46 |
47 | return (
48 |
49 | {visibleNotifications.map(notification => (
50 |
54 |
55 |
56 |
57 | {getIcon(notification.type)}
58 |
59 |
60 | {notification.title}
61 |
62 | onDismiss(notification.id)}
65 | aria-label="Dismiss notification"
66 | >
67 | ×
68 |
69 |
70 |
71 | {notification.message}
72 |
73 |
74 |
75 | ))}
76 |
77 | );
78 | }
79 |
80 | // Hook for managing notifications
81 | export function useNotifications() {
82 | const [notifications, setNotifications] = useState([]);
83 |
84 | const addNotification = (notification: Omit) => {
85 | const id = Date.now().toString() + Math.random().toString(36).substr(2, 9);
86 | const newNotification: Notification = {
87 | ...notification,
88 | id,
89 | duration: notification.duration ?? 5000, // Default 5 seconds
90 | };
91 |
92 | setNotifications(prev => [...prev, newNotification]);
93 | return id;
94 | };
95 |
96 | const dismissNotification = (id: string) => {
97 | setNotifications(prev => prev.filter(n => n.id !== id));
98 | };
99 |
100 | const clearAll = () => {
101 | setNotifications([]);
102 | };
103 |
104 | // Convenience methods
105 | const showSuccess = (title: string, message: string, duration?: number) =>
106 | addNotification({ type: 'success', title, message, duration });
107 |
108 | const showError = (title: string, message: string, duration?: number) =>
109 | addNotification({ type: 'error', title, message, duration });
110 |
111 | const showWarning = (title: string, message: string, duration?: number) =>
112 | addNotification({ type: 'warning', title, message, duration });
113 |
114 | const showInfo = (title: string, message: string, duration?: number) =>
115 | addNotification({ type: 'info', title, message, duration });
116 |
117 | return {
118 | notifications,
119 | addNotification,
120 | dismissNotification,
121 | clearAll,
122 | showSuccess,
123 | showError,
124 | showWarning,
125 | showInfo,
126 | };
127 | }
128 |
--------------------------------------------------------------------------------
/site/src/components/RomFilePicker.css:
--------------------------------------------------------------------------------
1 | .rom-file-picker {
2 | max-width: 600px;
3 | margin: 2rem auto;
4 | padding: 2rem;
5 | background: #f8f9fa;
6 | border: 1px solid #e9ecef;
7 | border-radius: 8px;
8 | }
9 |
10 | .rom-file-picker h3 {
11 | color: #333;
12 | margin: 0 0 0.5rem 0;
13 | font-size: 1.5rem;
14 | }
15 |
16 | .picker-description {
17 | color: #666;
18 | margin-bottom: 1.5rem;
19 | line-height: 1.5;
20 | }
21 |
22 | .file-input-container {
23 | display: flex;
24 | gap: 0.5rem;
25 | margin-bottom: 1rem;
26 | }
27 |
28 | .file-input {
29 | display: none;
30 | }
31 |
32 | .file-input-label {
33 | flex: 1;
34 | padding: 0.75rem 1rem;
35 | background: #646cff;
36 | color: white;
37 | border: none;
38 | border-radius: 6px;
39 | cursor: pointer;
40 | text-align: center;
41 | transition: background-color 0.2s ease;
42 | font-size: 1rem;
43 | }
44 |
45 | .file-input-label:hover {
46 | background: #535bf2;
47 | }
48 |
49 | .clear-button {
50 | padding: 0.75rem 1rem;
51 | background: #dc3545;
52 | color: white;
53 | border: none;
54 | border-radius: 6px;
55 | cursor: pointer;
56 | transition: background-color 0.2s ease;
57 | }
58 |
59 | .clear-button:hover {
60 | background: #c82333;
61 | }
62 |
63 | .validation-status {
64 | display: flex;
65 | align-items: flex-start;
66 | gap: 0.75rem;
67 | padding: 1rem;
68 | border-radius: 6px;
69 | margin-bottom: 1rem;
70 | }
71 |
72 | .validation-status.validating {
73 | background: #fff3cd;
74 | border: 1px solid #ffeaa7;
75 | color: #856404;
76 | }
77 |
78 | .validation-status.valid {
79 | background: #d4edda;
80 | border: 1px solid #c3e6cb;
81 | color: #155724;
82 | }
83 |
84 | .validation-status.invalid {
85 | background: #f8d7da;
86 | border: 1px solid #f5c6cb;
87 | color: #721c24;
88 | }
89 |
90 | .status-icon {
91 | font-size: 1.2rem;
92 | flex-shrink: 0;
93 | }
94 |
95 | .status-content {
96 | flex: 1;
97 | }
98 |
99 | .status-message {
100 | font-weight: 600;
101 | margin-bottom: 0.25rem;
102 | }
103 |
104 | .error-message {
105 | font-size: 0.9rem;
106 | margin-bottom: 0.25rem;
107 | }
108 |
109 | .crc-info {
110 | font-size: 0.85rem;
111 | font-family: monospace;
112 | opacity: 0.8;
113 | }
114 |
115 | .file-info {
116 | background: white;
117 | border: 1px solid #dee2e6;
118 | border-radius: 6px;
119 | padding: 1rem;
120 | }
121 |
122 | .file-info h4 {
123 | margin: 0 0 0.75rem 0;
124 | color: #333;
125 | font-size: 1.1rem;
126 | }
127 |
128 | .info-grid {
129 | display: grid;
130 | grid-template-columns: auto 1fr;
131 | gap: 0.5rem 1rem;
132 | font-size: 0.9rem;
133 | }
134 |
135 | .info-grid span:nth-child(odd) {
136 | font-weight: 600;
137 | color: #495057;
138 | }
139 |
140 | .info-grid span:nth-child(even) {
141 | color: #6c757d;
142 | font-family: monospace;
143 | }
144 |
145 | /* Dark mode support */
146 | @media (prefers-color-scheme: dark) {
147 | .rom-file-picker {
148 | background: #2d3748;
149 | border-color: #4a5568;
150 | }
151 |
152 | .rom-file-picker h3 {
153 | color: #f1f3f4;
154 | }
155 |
156 | .picker-description {
157 | color: #9aa0a6;
158 | }
159 |
160 | .validation-status.validating {
161 | background: #3d3d1a;
162 | border-color: #5a5a2a;
163 | color: #f4e79d;
164 | }
165 |
166 | .validation-status.valid {
167 | background: #1a3d2e;
168 | border-color: #2a5a4a;
169 | color: #9df4c4;
170 | }
171 |
172 | .validation-status.invalid {
173 | background: #3d1a1a;
174 | border-color: #5a2a2a;
175 | color: #f49d9d;
176 | }
177 |
178 | .file-info {
179 | background: #1a202c;
180 | border-color: #4a5568;
181 | }
182 |
183 | .file-info h4 {
184 | color: #f1f3f4;
185 | }
186 |
187 | .info-grid span:nth-child(odd) {
188 | color: #e2e8f0;
189 | }
190 |
191 | .info-grid span:nth-child(even) {
192 | color: #9aa0a6;
193 | }
194 | }
195 |
196 | /* Responsive design */
197 | @media (max-width: 768px) {
198 | .rom-file-picker {
199 | margin: 1rem;
200 | padding: 1rem;
201 | }
202 |
203 | .file-input-container {
204 | flex-direction: column;
205 | }
206 |
207 | .info-grid {
208 | grid-template-columns: 1fr;
209 | gap: 0.25rem;
210 | }
211 | }
212 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter09.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 9
2 |
3 |
4 | ---------------------------------------
5 | ?INCLUDE 'ir1D_monologue'
6 | ---------------------------------------
7 | widestring_09D04C `[TPL:0][TPL:E][NAM:0]: At the Incan cliffs[N]of Larai, dreadful wind[N]was raging.[FIN]Could this be the breath[N]of god that the elder[N]spoke of…[FIN]A place without wind is[N]probably sleeping quietly[N]somewhere on this cliff.[FIN]I felt it throbbing in my[N]chest.[END]`
8 |
9 | ---------------------------------------
10 | ?INCLUDE 'chunk_038000'
11 | ---------------------------------------
12 | widestring_03865D `[TPL:D]There's no hole there to[N]use the prison key in.[END]`
13 |
14 | widestring_038746 `[TPL:E]Could the secret of the[N]Inca be hidden in this[N]statue…?[END]`
15 |
16 | widestring_03893E `[TPL:F]It seems that you couldn't[N]find a hole to insert the[N]water caltrop shaped block[N]into around here.[END]`
17 |
18 | widestring_03897C `[TPL:D]Inserted the block into[N]the open tile.[END]`
19 |
20 | ---------------------------------------
21 | ?INCLUDE 'ir26_bones'
22 | ---------------------------------------
23 | widestring_09C7AE `[TPL:0][TPL:E]Could this be an explorer[N]seeking the Incan gold[N]ship…?[FIN][CLD][TPL:E]In that skeletonized hand[N]something like an amulet[N]is being grasped.[FIN][TPL:F]Inside, in a weaving with[N]a piece of paper,[N]something like this is[N]written.[FIN][BOR:1][DLG:3,F][SIZ:D,5][SFX:0]Dad, don't die, alright.[N] Nana[N]If you find the gold ship,[N]buy a [NAM:15].[N] Savvas[END]`
24 |
25 | ---------------------------------------
26 | ?INCLUDE 'ir1D_bones'
27 | ---------------------------------------
28 | widestring_09C285 `[TPL:0][TPL:E]It seems like something[N]is laying on the ground[N]near the corpse…[FIN][CLD][BOR:1][TPL:E]"If I could just move[N]those gold statues, I[N]could advance ahead…ˮ[END]`
29 |
30 | ---------------------------------------
31 | ?INCLUDE 'ir1F_gold_tile'
32 | ---------------------------------------
33 | widestring_09C410 `[TPL:0][TPL:E]It seems like if I step on[N]this golden floor,[N]something makes a sound…[FIN]There are four golden[N]floors…[FIN]Is there nothing that can[N]act as a weight…?[END]`
34 |
35 | ---------------------------------------
36 | ?INCLUDE 'ir1D_wind_melody'
37 | ---------------------------------------
38 | widestring_09C5D5 `[TPL:0][TPL:F]The wind of the valley is[N]playing some melody. It's[N]as if the Incan statues[N]are singing…[END]`
39 |
40 | widestring_09C614 `[TPL:D]Memorized the Wind's[N]Melody![END]`
41 |
42 | widestring_09C637 `[DLG:3,11][SIZ:D,3]You can [LU1:9B]the [LU1:34][N]of the Wind. But [LU1:FE][N][LU1:A0]is full. [END]`
43 |
44 | ---------------------------------------
45 | ?INCLUDE 'ir28_bones'
46 | ---------------------------------------
47 | widestring_09C8B3 `[TPL:0][TPL:E]Could this be an explorer[N]seeking the Incan gold[N]ship…?[FIN]So he lost his life to[N]the ceiling trap…[END]`
48 |
49 | ---------------------------------------
50 | ?INCLUDE 'ir26_journal_bones'
51 | ---------------------------------------
52 | widestring_09C90D `[TPL:0][TPL:E]The corpse seems to be[N]holding something like a[N]notebook…[FIN][CLD][BOR:1][DLG:3,4][SIZ:D,7] Learnings on the Inca[N]Writing does not exist in[N]the Incan region. For that[N]purpose, it seems that[N]legends are preserved for[N]future generations by[N]sound.[FIN][DLG:3,4][SIZ:D,8]I noticed that the Incan[N]valley wind plays a[N]melody; I succeeded at[N]decoding it. "Recite it in[N]the room tiled in gold…ˮ[N]If you were to play the[N]melody played by the[N]valley wind there…[END]`
53 |
54 | widestring_038A2B `[DEF]He [LU2:A1]played[N]the [LU2:3D]Melody.[END]`
55 |
56 | widestring_038A46 `[TPL:F]In the vicinity where the[N]flute's sound was echoing,[N]a golden block began to[N]shine![END]`
57 |
58 | ---------------------------------------
59 | ?INCLUDE 'sE6_gaia'
60 | ---------------------------------------
61 | widestring_08DFEE `[PRT:@widestring_08DE96]From here, thou will enter[N]into a battle with an[N]absurdly giant enemy.[FIN]If this enemy receives[N]damage, it emits some[N]light rays from its head.[FIN]If you deal damage,[N]immediately take refuge[N]behind the enemy.[FIN]`
62 |
63 | widestring_038772 `[TPL:0][TPL:E]The altar's shape and the[N]figure's shape don't seem[N]to match.[END]`
64 |
65 | widestring_0386BE `[TPL:D]Offered Incan Figure A on[N]the altar.[END]`
66 |
67 | widestring_0387D4 `[TPL:D]Offered Incan Figure B at[N]the altar.[END]`
68 |
69 | ---------------------------------------
70 | ?INCLUDE 'ir29_transform'
71 | ---------------------------------------
72 | widestring_09CFED `[TPL:B][NAM:0], having erased the[N]presence of the demons,[N]may release his[N]transformation…[END]`
73 |
--------------------------------------------------------------------------------
/site/src/components/FolderPicker.css:
--------------------------------------------------------------------------------
1 | .folder-picker {
2 | max-width: 600px;
3 | margin: 2rem auto;
4 | padding: 2rem;
5 | background: #f8f9fa;
6 | border: 1px solid #e9ecef;
7 | border-radius: 8px;
8 | }
9 |
10 | .folder-picker h3 {
11 | color: #333;
12 | margin: 0 0 0.5rem 0;
13 | font-size: 1.5rem;
14 | }
15 |
16 | .picker-description {
17 | color: #666;
18 | margin-bottom: 1.5rem;
19 | line-height: 1.5;
20 | }
21 |
22 | .folder-input-container {
23 | display: flex;
24 | gap: 0.5rem;
25 | margin-bottom: 1rem;
26 | }
27 |
28 | .folder-input {
29 | display: none;
30 | }
31 |
32 | .folder-input-label {
33 | flex: 1;
34 | padding: 0.75rem 1rem;
35 | background: #646cff;
36 | color: white;
37 | border: none;
38 | border-radius: 6px;
39 | cursor: pointer;
40 | text-align: center;
41 | transition: background-color 0.2s ease;
42 | font-size: 1rem;
43 | display: flex;
44 | align-items: center;
45 | justify-content: center;
46 | gap: 0.5rem;
47 | }
48 |
49 | .folder-input-label:hover {
50 | background: #535bf2;
51 | }
52 |
53 | .clear-button {
54 | padding: 0.75rem 1rem;
55 | background: #dc3545;
56 | color: white;
57 | border: none;
58 | border-radius: 6px;
59 | cursor: pointer;
60 | transition: background-color 0.2s ease;
61 | font-size: 1rem;
62 | }
63 |
64 | .clear-button:hover {
65 | background: #c82333;
66 | }
67 |
68 | .scanning-status {
69 | display: flex;
70 | align-items: center;
71 | gap: 0.75rem;
72 | padding: 1rem;
73 | background: #e3f2fd;
74 | border: 1px solid #bbdefb;
75 | border-radius: 6px;
76 | margin-bottom: 1rem;
77 | color: #1565c0;
78 | }
79 |
80 | .loading-spinner {
81 | width: 20px;
82 | height: 20px;
83 | border: 2px solid #bbdefb;
84 | border-top: 2px solid #1565c0;
85 | border-radius: 50%;
86 | animation: spin 1s linear infinite;
87 | }
88 |
89 | @keyframes spin {
90 | 0% { transform: rotate(0deg); }
91 | 100% { transform: rotate(360deg); }
92 | }
93 |
94 | .scan-error {
95 | display: flex;
96 | align-items: center;
97 | gap: 0.5rem;
98 | padding: 1rem;
99 | background: #fff3cd;
100 | border: 1px solid #ffeaa7;
101 | border-radius: 6px;
102 | margin-bottom: 1rem;
103 | color: #856404;
104 | }
105 |
106 | .error-icon {
107 | font-size: 1.1rem;
108 | }
109 |
110 | .folder-status {
111 | background: white;
112 | border: 1px solid #dee2e6;
113 | border-radius: 6px;
114 | overflow: hidden;
115 | }
116 |
117 | .status-info {
118 | display: flex;
119 | align-items: center;
120 | gap: 0.5rem;
121 | padding: 1rem;
122 | font-size: 0.95rem;
123 | }
124 |
125 | .status-indicator {
126 | font-size: 1.1rem;
127 | width: 20px;
128 | text-align: center;
129 | }
130 |
131 | .status-indicator.ready {
132 | color: #28a745;
133 | }
134 |
135 | .status-indicator.empty {
136 | color: #6c757d;
137 | }
138 |
139 | .file-list {
140 | border-top: 1px solid #dee2e6;
141 | }
142 |
143 | .file-list details {
144 | padding: 0;
145 | }
146 |
147 | .file-list summary {
148 | padding: 0.75rem 1rem;
149 | background: #f8f9fa;
150 | cursor: pointer;
151 | font-weight: 500;
152 | color: #495057;
153 | border: none;
154 | outline: none;
155 | transition: background-color 0.2s ease;
156 | }
157 |
158 | .file-list summary:hover {
159 | background: #e9ecef;
160 | }
161 |
162 | .file-list-items {
163 | list-style: none;
164 | padding: 0;
165 | margin: 0;
166 | max-height: 200px;
167 | overflow-y: auto;
168 | }
169 |
170 | .file-item {
171 | display: flex;
172 | justify-content: space-between;
173 | align-items: center;
174 | padding: 0.5rem 1rem;
175 | border-bottom: 1px solid #f1f3f4;
176 | font-size: 0.9rem;
177 | }
178 |
179 | .file-item:last-child {
180 | border-bottom: none;
181 | }
182 |
183 | .file-name {
184 | font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
185 | color: #333;
186 | flex: 1;
187 | margin-right: 1rem;
188 | word-break: break-all;
189 | }
190 |
191 | .file-type {
192 | font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
193 | margin-right: 1rem;
194 | }
195 |
196 | .file-size {
197 | color: #666;
198 | font-size: 0.85rem;
199 | white-space: nowrap;
200 | }
201 |
202 | /* Responsive design */
203 | @media (max-width: 768px) {
204 | .folder-picker {
205 | margin: 1rem;
206 | padding: 1.5rem;
207 | }
208 |
209 | .folder-input-container {
210 | flex-direction: column;
211 | }
212 |
213 | .file-item {
214 | flex-direction: column;
215 | align-items: flex-start;
216 | gap: 0.25rem;
217 | }
218 |
219 | .file-name {
220 | margin-right: 0;
221 | }
222 | }
223 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter35.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 35
2 |
3 |
4 | -------------------------------------
5 | ?INCLUDE 'btDE_olman'
6 | -------------------------------------
7 | widestring_098903 `[TPL:0][TPL:9][SFX:0]An aged corpse lies[N]quietly…[FIN]At that moment, a familiar[N]voice spoke in my head.[FIN][TPL:23][TPL:9][DLY:2][NAM:0]. It's me. Your father[N][NAM:9].[FIN][TPL:A]My body has totally rotted[N]away, but I still live on[N]like this…[END]`
8 |
9 | widestring_0989A2 `[TPL:0][TPL:9][DLY:1][NAM:0]: D-dad…! Why are you[N]in a form like that…!?[FIN][TPL:23][TPL:B][DLY:2]The Tower of Babel is a[N]mysterious space. The[N]interior is full of the[N]comet's light.[FIN]Time flows at hundreds of[N]times its normal speed;[N]anybody inside evolves at[N]a terrific rate…[FIN][TPL:0][TPL:B][DLY:1][NAM:0]: Then, how are [NAM:1][N]and I able to survive…?![FIN][TPL:23][TPL:B][DLY:2][NAM:9]: That is because[N]you two are evolved humans[N]as well.[FIN][TPL:1][TPL:B][DLY:1][NAM:1]: We are…?[FIN][TPL:23][TPL:B][DLY:2][NAM:9]: In the distant[N]past, having possession of[N]biotechnology which used[N]the light emitted from the[N]comet,[FIN]people used its power to[N]create plants and animals[N]as they desired.[FIN]For example, the camel can[N]survive for a long time[N]without food or water[N]because they were made as[N]animals for riding through[N]the desert.[FIN]Soon, humans realized that[N]this power could be used[N]to create weapons, and so[N]they gradually produced[N]demons.[FIN]Suddenly, the world was at[N]the risk of being[N]destroyed…[FIN]At that time, the Warrior[N]of Light and Darkness was[N]produced by the fate of[N]mankind; the possible[N]extermination or survival[N]of humanity.[FIN]That is your ancestor.[FIN]And the 6 [NAM:D] [NAM:E]s[N]will surely produce the[N]Warrior of Light and[N]Darkness.[FIN]Well, I'll entrust in you[N]the fated final [NAM:D][N][NAM:E].[END]`
10 |
11 | widestring_098CAA `[TPL:23][TPL:9][DLY:2]The comet will be very[N]near soon.[FIN][TPL:A]I must send you both to[N]the tower's rooftop until[N]then.[FIN]Well, please quietly[PAU:28][DLY:4][N]close your eyes…[END]`
12 |
13 | -------------------------------------
14 | ?INCLUDE 'btE4_olman'
15 | -------------------------------------
16 | widestring_099068 `[TPL:23][TPL:F][DLY:0][NAM:9]: Ancient people[N]once worshipped the comet[N]as a god.[FIN]A mysterious power dwells[N]in things that are[N]showered in the comet's[N]light, after all.[FIN]Certainly, you could call[N]the comet a god. You could[N]also call it a singular[N]lifeform.[FIN]But it's a god that no one[N]asked for. It advances[N]things too fast, and so[N]only gives birth to[N]destruction…[FIN]As long as there is evil[N]in people's hearts, demons[N]will be born.[FIN]Well, [NAM:0], please focus[N]your eyes and take a look.[END]`
17 |
18 | widestring_099182 `[TPL:23][TPL:D][NAM:9]: Well, go speak[N]with them.[END]`
19 |
20 | -------------------------------------
21 | ?INCLUDE 'btE4_kara'
22 | -------------------------------------
23 | widestring_098DFD `[TPL:1][TPL:C][NAM:1]: …[END]`
24 |
25 | widestring_0992EC `[TPL:17][TPL:E]Neil's father: Hey… What[N]in the world is Neil[N]doing…?[FIN]That brat should be making[N]the Reuleck Corporation[N]larger and larger.[END]`
26 |
27 | widestring_0994E6 `[TPL:17][TPL:E]I've become an unaging,[N]undying organism by losing[N]my corporeal body.[FIN]I've gotten eternal life[N]through evolution by the[N]comet's light.[FIN]But what meaning could[N]there possible by in a[N]life without end?[FIN][TPL:F]I guess I felt more[N]fulfilled when I was a[N]person living in fear of[N]an incurable illness…[END]`
28 |
29 | widestring_09923A `[TPL:5][BOR:4][TPL:D][NAM:5]: Hey [NAM:0], it's[N]been a long time.[FIN]I can't believe that a[N]world like this exists…[FIN][TPL:F]I guess I could probably[N]have become a scholar if I[N]announced this at an[N]academic conference.[END]`
30 |
31 | widestring_09943E `[TPL:17][TPL:C][NAM:7]: Squee squee…!![FIN][TPL:0][TPL:10][SFX:0][NAM:0]: So that's how it is;[N]I guess that without a[N]body, even people and[N]animals are no longer[N]distinct…[END]`
32 |
33 | widestring_09938D `[TPL:17][TPL:E]Neil's mother: Even if I[N]can observe the real[N]world, I can't touch it…[FIN]No matter how much Neil is[N]suffering, I still can't[N]lend him a hand, can I?[END]`
34 |
35 | widestring_0991A9 `[TPL:23][TPL:D][DLY:0][NAM:9]: The moment is[N]nearly upon us.[FIN]Alright, everyone,[N]lend your power to [NAM:0]![END]`
36 |
37 | widestring_098E17 `[TPL:0][TPL:F][DLY:0]When [NAM:0] and [NAM:1]'s[N]hearts laid together, when[N]light and darkness became[N]one, a burgeoning power[N]was born…[FIN]The Warrior of Darkness'[N]ultimate power Firebird[N]dwells here, when the[N]Warrior of Light and[N]Darkness has revived[N]across millennia![END]`
38 |
39 | widestring_098EB8 `[TPL:23][TPL:E][DLY:0]You two, your fight will[N]change the destiny of the[N]Earth.[FIN]Well, please go.[N]To the comet…!![END]`
40 |
--------------------------------------------------------------------------------
/site/src/components/ModuleSelector.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ModuleGroup } from '../types';
3 | import './ModuleSelector.css';
4 |
5 | interface ModuleSelectorProps {
6 | modules: ModuleGroup[];
7 | }
8 |
9 | export function ModuleSelector({ modules }: ModuleSelectorProps) {
10 | // Defensive check for modules
11 | if (!modules || !Array.isArray(modules)) {
12 | return (
13 |
14 |
Module Selection
15 |
No modules available for selection
16 |
17 | );
18 | }
19 |
20 | // Function to get all selected values
21 | const getSelectedValues = () => {
22 | const form = document.querySelector('.module-selector form') as HTMLFormElement;
23 | if (!form) return [];
24 |
25 | const formData = new FormData(form);
26 | const values: string[] = [];
27 |
28 | for (const [key, value] of formData.entries()) {
29 | // Only include non-empty values and exclude "on" values from radio buttons without proper values
30 | const stringValue = value as string;
31 | if (stringValue && stringValue !== 'on') {
32 | values.push(stringValue);
33 | }
34 | }
35 |
36 | return values;
37 | };
38 |
39 | return (
40 |
41 |
Module Selection
42 |
43 | Choose your preferred options for each module group. Each group allows exactly one selection.
44 |
45 |
104 |
105 | );
106 | }
107 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter25.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 25
2 |
3 |
4 | ;Great Wall of China
5 |
6 | ;Great Wall of China
7 |
8 | -------------------------------------
9 | ?INCLUDE 'gw82_trail_intro'
10 | -------------------------------------
11 | widestring_07B550 `[TPL:0][TPL:9][NAM:4]'s tracks led me to[N]the Great Wall of China.[FIN][TPL:A]The passageway continued[N]without end beyond the[N]horizon…[END]`
12 |
13 | -------------------------------------
14 | ?INCLUDE 'gw82_necklace_stone'
15 | -------------------------------------
16 | widestring_07B611 `[TPL:0][TPL:9]A pretty pebble has[N]fallen.[FIN][TPL:A]Aha! This is a part of the[N]necklace that [NAM:4] made[N]for [NAM:2]…[FIN][CLD][TPL:9]You picked up the[N]necklace's stone for him.[END]`
17 |
18 | ;Necklace's stones / A pendant that Rob made for Lillie.
19 |
20 | ;It's the necklace that Rob made for Lillie...
21 |
22 | -------------------------------------
23 | ?INCLUDE 'gw83_lily'
24 | -------------------------------------
25 | widestring_07B6FF `[TPL:2][TPL:C]Wait![END]`
26 |
27 | widestring_07B709 `[TPL:2][TPL:D][NAM:2]: You're going to[N]search for [NAM:4], right?[FIN]I'm going too…!![END]`
28 |
29 | widestring_07B731 `[TPL:2][TPL:F][NAM:2]: Eheheh. It's been[N]a long time since I've[N]borrowed your pocket like[N]this, huh?[FIN]Alright, let's go…[END]`
30 |
31 | -------------------------------------
32 | ?INCLUDE 'sE6_gaia'
33 | -------------------------------------
34 | widestring_08E428 `[PRT:@widestring_08DE96][NAM:0]'s power Spin Dash can[N]jump to ascend slopes that[N]are too sleep to climb.[FIN]There are many hills here[N]in the Great Wall of[N]China. Try attempting it[N]in various places.[FIN][RET]`
35 |
36 | ;It seems that the Power of Darkness Spin Dash become usable!
37 |
38 | widestring_08ECEA `Spin Dash is a power that[N]only [NAM:0], the boy, can[N]use.[FIN]Thine own high-speed[N]rotation can send enemies[N]flying. Thou can run up[N]hills that use recoil.[FIN]Thou shouldst alternate[N]between L and R while[N]holding the attack button…`
39 |
40 | ;Power of Darkness / :Spin Dash / Spin Dash / Ramming attack while spinning. Can ascend slopes with recoil.
41 |
42 | ;Eat a Medicinal Herb? / Yes / No
43 |
44 | ;The Medicinal Herb brought your lost power back when put it in your mouth.
45 |
46 | -------------------------------------
47 | ?INCLUDE 'gw8A_sand_fanger'
48 | -------------------------------------
49 | widestring_0B80B5 `[TPL:F]After you defeated Sand[N]Fanger, you found a[N][NAM:D] [NAM:E] from its[N]corpse!![END]`
50 |
51 | -------------------------------------
52 | ?INCLUDE 'gw8B_lance_lily'
53 | -------------------------------------
54 | widestring_07B824 `[TPL:2][TPL:9][NAM:2]: [NAM:4], you idiot…[N]You had me worried…!![FIN]What would you do if the[N]demons killed you…!![FIN][TPL:4][TPL:9][NAM:4]: It's my bad fer[N]worryin' everyone.[FIN]But I obtained medicine ta[N]cure my old man's illness.[END]`
55 |
56 | widestring_07BB89 `[TPL:2][TPL:9][NAM:2]: Geez…[N]He's selfish, after all…[END]`
57 |
58 | widestring_07B8AD `[TPL:4][TPL:9][NAM:4]: Ah, those stones[N]are…[FIN][TPL:0][TPL:9][NAM:0]: We arrived here when[N]we followed these pebbles.[FIN]I'll return the stones to[N]you. Here you go…[WAI][CLD][PAU:3C][::][TPL:4][TPL:8][SFX:0][DLY:2][NAM:4] whispered…[FIN][TPL:A][NAM:4]: [NAM:0]…won't ya leave[N]me with [NAM:2] fer just a[N]little bit?[END]`
59 |
60 | widestring_07B960 `[TPL:4][TPL:9][DLY:2][NAM:4]: I was saved with[N]tha help o' these stones…[FIN]Tha truth is,[N]I made this fer ya…[END]`
61 |
62 | widestring_07B9B1 `[TPL:4][TPL:B][NAM:4]: Tha stones in tha[N]necklace ended up bein'[N]awfully small, but won't[N]ya take it fer me?[FIN][CLD][TPL:A][SFX:0][DLY:2][NAM:4] gently affixed the[N]necklace onto [NAM:2]'s[N]neck.[END]`
63 |
64 | widestring_07BBB0 `[TPL:4][TPL:8][DLY:0][NAM:4]: Ah…[WAI][CLD][PAU:40][TPL:2][TPL:9][DLY:2][NAM:2]: I won't run away[N]this time…[FIN][TPL:B]Last time, I wasn't[N]expecting what you did. I[N]was surprised and didn't[N]know what I should do…[FIN]But right now, I just[N]don't want you to be able[N]to see my face.[FIN]I'm so happy that my[N]tears are flooding out…[END]`
65 |
66 | widestring_07BC42 `[TPL:2][TPL:B][DLY:2][NAM:2]: [NAM:4]…from the time[N]when we first met, I felt[N]something that was[N]different about you…[FIN][CLD][TPL:2][TPL:A][DLY:2]But now I have a feeling[N]that I understand what[N]that something is…[FIN]The reply I had for you[N]back then… The reply that[N]I wanted to give you…[END]`
67 |
68 | widestring_07BCAA `[TPL:2][TPL:9][NAM:2]:[N][DLY:3]I care about you, too…[FIN][TPL:A][DLY:2]It would be nice if we[N]could always be together,[N]wouldn't it…?[END]`
69 |
70 | widestring_07BA2E `[TPL:4][TPL:A][DLY:0][NAM:4]: Yahoo!![DLY:1] This is tha[N]first time I've ever felt[N]like this…!![FIN]I'm almost a million times[N]as happy as I am at the[N]start of summer vacation…![FIN][TPL:2][TPL:A][DLY:1][NAM:2]: Tee hee…[N]I feel the saaame way.[FIN]Alright, let's return to[N]town. Everyone must be[N]worried.[END]`
71 |
--------------------------------------------------------------------------------
/modules/enhanced-prologue-text/patches/EnhancedPrologueText.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 | !M7SEL 211A
4 |
5 | ----------------------------------------------
6 | ?INCLUDE 'pr_thinkers'
7 | ----------------------------------------------
8 | ;Set colors and sprite palette index to static palette when fade is complete
9 |
10 | e_pr_thinker_0BD031 {
11 | COP [37] ( #75 )
12 | COP [39]
13 |
14 | LDA $7F0BE0
15 | STA $7F0B20
16 | LDA $7F0BE2
17 | STA $7F0B22
18 | LDA $7F0BE4
19 | STA $7F0B24
20 | LDA $7F0BE6
21 | STA $7F0B26
22 |
23 | PHX
24 | PHY
25 |
26 | LDX #$0000
27 | LDA $00DA
28 | LSR
29 | LSR
30 | TAY
31 |
32 | SEP #$20
33 | LDA #$23
34 |
35 | palswitch_top:
36 | DEY
37 | BMI palswitch_next
38 |
39 | STA $7F0603, X
40 | INX
41 | INX
42 | INX
43 | INX
44 | BRA palswitch_top
45 |
46 | palswitch_next:
47 | REP #$20
48 | PLY
49 | PLX
50 |
51 | COP [3D]
52 | RTL
53 | }
54 |
55 |
56 | ---------------------------------------------
57 | ;Revert palette number for sprites before fade out
58 |
59 | e_pr_thinker_0BD039 {
60 |
61 | PHX
62 | PHY
63 |
64 | LDX #$0000
65 | LDA $00DA
66 | LSR
67 | LSR
68 | TAY
69 |
70 | SEP #$20
71 | LDA #$2F
72 |
73 | palrevert_top:
74 | DEY
75 | BMI palrevert_next
76 |
77 | STA $7F0603, X
78 | INX
79 | INX
80 | INX
81 | INX
82 | BRA palrevert_top
83 |
84 | palrevert_next:
85 | REP #$20
86 | PLY
87 | PLX
88 |
89 | COP [37] ( #76 )
90 | COP [39]
91 | COP [CC] ( #0F )
92 | COP [3D]
93 | RTL
94 | }
95 |
96 | ----------------------------------------------
97 | ?INCLUDE 'sFE_proc_03A940'
98 | ----------------------------------------------
99 | ;Set default colors for world map (enhances font profile)
100 |
101 | e_sFE_proc_03A940 {
102 | SEP #$20
103 | LDA #$80
104 | STA $M7SEL
105 | REP #$20
106 | LDA #$7FFF
107 | STA $7F0B22
108 | LDA #$53DE
109 | STA $7F0B24
110 | LDA #$01B1
111 | STA $7F0B26
112 | LDA $0D54
113 | STA $00CA
114 | SEC
115 | SBC #$0080
116 | ORA #$8000
117 | STA $06C6
118 | LDA $0D56
119 | STA $00CC
120 | SEC
121 | SBC #$0070
122 | ORA #$8000
123 | STA $06CA
124 | STZ $00B6
125 | STZ $00BC
126 | LDA #$0400
127 | STA $00B8
128 | }
129 |
130 | ----------------------------------------------
131 | ?INCLUDE 'palette_bundles'
132 | ----------------------------------------------
133 | ;Fade-in / out bundles
134 |
135 | bundle_16D17B [
136 | bundle < #10, &word_16D182, #F1, #05, #04 > ;00
137 | ]
138 |
139 | word_16D182 [
140 | #$0000 ;00
141 | #$0000 ;01
142 | #$0000
143 |
144 | #$0842 ;02
145 | #$0442 ;03
146 | #$0001
147 |
148 | #$1084 ;04
149 | #$0884 ;05
150 | #$0022
151 |
152 | #$18C6 ;06
153 | #$10C6 ;07
154 | #$0043
155 |
156 | #$2108 ;08
157 | #$1508 ;09
158 | #$0064
159 |
160 | #$294A ;0A
161 | #$194A ;0B
162 | #$0085
163 |
164 | #$318C ;0C
165 | #$218C ;0D
166 | #$00A7
167 |
168 | #$39CE ;0E
169 | #$25CE ;0F
170 | #$00C8
171 |
172 | #$4210 ;10
173 | #$2A10 ;11
174 | #$00E9
175 |
176 | #$4A52 ;12
177 | #$3252 ;13
178 | #$010A
179 |
180 | #$5294 ;14
181 | #$3694 ;15
182 | #$010B
183 |
184 | #$5AD6 ;16
185 | #$3AD6 ;17
186 | #$012C
187 |
188 | #$6318 ;18
189 | #$4318 ;19
190 | #$014D
191 |
192 | #$6B5A ;1A
193 | #$475A ;1B
194 | #$016F
195 |
196 | #$739C ;1C
197 | #$4B9C ;1D
198 | #$0190
199 |
200 | #$7FFF ;1E
201 | #$53DE ;1F
202 | #$01B1
203 | ]
204 |
205 |
206 | bundle_16D1C2 [
207 | bundle < #10, &word_16D1C9, #F1, #05, #04 > ;00
208 | ]
209 |
210 | word_16D1C9 [
211 | #$7FFF ;00
212 | #$53DE ;01
213 | #$01B1
214 |
215 | #$739C ;02
216 | #$4B9C ;03
217 | #$0190
218 |
219 | #$6B5A ;04
220 | #$475A ;05
221 | #$016F
222 |
223 | #$6318 ;06
224 | #$4318 ;07
225 | #$014D
226 |
227 | #$5AD6 ;08
228 | #$3AD6 ;09
229 | #$012C
230 |
231 | #$5294 ;0A
232 | #$3694 ;0B
233 | #$010B
234 |
235 | #$4A52 ;0C
236 | #$3252 ;0D
237 | #$010A
238 |
239 | #$4210 ;0E
240 | #$2A10 ;0F
241 | #$00E9
242 |
243 | #$39CE ;10
244 | #$25CE ;11
245 | #$00C8
246 |
247 | #$318C ;12
248 | #$218C ;13
249 | #$00A7
250 |
251 | #$294A ;14
252 | #$194A ;15
253 | #$0085
254 |
255 | #$2108 ;16
256 | #$1508 ;17
257 | #$0064
258 |
259 | #$18C6 ;18
260 | #$10C6 ;19
261 | #$0043
262 |
263 | #$1084 ;1A
264 | #$0884 ;1B
265 | #$0022
266 |
267 | #$0842 ;1C
268 | #$0442 ;1D
269 | #$0001
270 |
271 | #$0000 ;1E
272 | #$0000 ;1F
273 | #$0000
274 | ]
--------------------------------------------------------------------------------
/site/src/components/RomBuilder.css:
--------------------------------------------------------------------------------
1 | .rom-builder {
2 | max-width: 600px;
3 | margin: 2rem auto;
4 | padding: 2rem;
5 | background: #f8f9fa;
6 | border: 1px solid #e9ecef;
7 | border-radius: 8px;
8 | }
9 |
10 | .rom-builder h3 {
11 | color: #333;
12 | margin: 0 0 0.5rem 0;
13 | font-size: 1.5rem;
14 | }
15 |
16 | .builder-description {
17 | color: #666;
18 | margin-bottom: 1.5rem;
19 | line-height: 1.5;
20 | }
21 |
22 | .build-status {
23 | display: flex;
24 | flex-direction: column;
25 | gap: 0.75rem;
26 | margin-bottom: 1.5rem;
27 | padding: 1rem;
28 | background: white;
29 | border: 1px solid #dee2e6;
30 | border-radius: 6px;
31 | }
32 |
33 | .status-info {
34 | display: flex;
35 | align-items: center;
36 | gap: 0.5rem;
37 | font-size: 0.95rem;
38 | }
39 |
40 | .status-indicator {
41 | font-size: 1.1rem;
42 | width: 20px;
43 | text-align: center;
44 | }
45 |
46 | .status-indicator.ready {
47 | color: #28a745;
48 | }
49 |
50 | .status-indicator.pending {
51 | color: #ffc107;
52 | }
53 |
54 | .status-indicator.optional {
55 | color: #6c757d;
56 | }
57 |
58 | .progress-container {
59 | margin-bottom: 1.5rem;
60 | padding: 1rem;
61 | background: white;
62 | border: 1px solid #dee2e6;
63 | border-radius: 6px;
64 | }
65 |
66 | .progress-header {
67 | display: flex;
68 | justify-content: space-between;
69 | align-items: center;
70 | margin-bottom: 0.5rem;
71 | }
72 |
73 | .progress-stage {
74 | font-weight: 600;
75 | color: #495057;
76 | }
77 |
78 | .progress-percentage {
79 | font-size: 0.9rem;
80 | color: #6c757d;
81 | font-family: monospace;
82 | }
83 |
84 | .progress-bar {
85 | width: 100%;
86 | height: 8px;
87 | background: #e9ecef;
88 | border-radius: 4px;
89 | overflow: hidden;
90 | margin-bottom: 0.5rem;
91 | }
92 |
93 | .progress-fill {
94 | height: 100%;
95 | background: linear-gradient(90deg, #646cff, #535bf2);
96 | transition: width 0.3s ease;
97 | border-radius: 4px;
98 | }
99 |
100 | .progress-message {
101 | font-size: 0.9rem;
102 | color: #6c757d;
103 | font-style: italic;
104 | }
105 |
106 | .build-actions {
107 | display: flex;
108 | justify-content: center;
109 | margin-bottom: 1.5rem;
110 | }
111 |
112 | .build-button {
113 | padding: 0.75rem 2rem;
114 | font-size: 1.1rem;
115 | font-weight: 600;
116 | border: none;
117 | border-radius: 6px;
118 | cursor: pointer;
119 | transition: all 0.2s ease;
120 | min-width: 150px;
121 | }
122 |
123 | .build-button.ready {
124 | background: #646cff;
125 | color: white;
126 | }
127 |
128 | .build-button.ready:hover {
129 | background: #535bf2;
130 | transform: translateY(-1px);
131 | box-shadow: 0 4px 8px rgba(100, 108, 255, 0.3);
132 | }
133 |
134 | .build-button.disabled {
135 | background: #6c757d;
136 | color: #adb5bd;
137 | cursor: not-allowed;
138 | }
139 |
140 | .build-complete {
141 | text-align: center;
142 | padding: 1.5rem;
143 | background: #d4edda;
144 | border: 1px solid #c3e6cb;
145 | border-radius: 6px;
146 | color: #155724;
147 | }
148 |
149 | .build-complete h4 {
150 | margin: 0 0 0.5rem 0;
151 | color: #155724;
152 | }
153 |
154 | .build-complete p {
155 | margin: 0 0 1rem 0;
156 | }
157 |
158 | .download-button {
159 | padding: 0.75rem 1.5rem;
160 | background: #28a745;
161 | color: white;
162 | border: none;
163 | border-radius: 6px;
164 | font-weight: 600;
165 | cursor: pointer;
166 | transition: background-color 0.2s ease;
167 | }
168 |
169 | .download-button:hover {
170 | background: #218838;
171 | }
172 |
173 | /* Dark mode support */
174 | @media (prefers-color-scheme: dark) {
175 | .rom-builder {
176 | background: #2d3748;
177 | border-color: #4a5568;
178 | }
179 |
180 | .rom-builder h3 {
181 | color: #f1f3f4;
182 | }
183 |
184 | .builder-description {
185 | color: #9aa0a6;
186 | }
187 |
188 | .build-status,
189 | .progress-container {
190 | background: #1a202c;
191 | border-color: #4a5568;
192 | }
193 |
194 | .progress-stage {
195 | color: #e2e8f0;
196 | }
197 |
198 | .progress-percentage,
199 | .progress-message {
200 | color: #9aa0a6;
201 | }
202 |
203 | .progress-bar {
204 | background: #4a5568;
205 | }
206 |
207 | .build-complete {
208 | background: #1a3d2e;
209 | border-color: #2a5a4a;
210 | color: #9df4c4;
211 | }
212 |
213 | .build-complete h4 {
214 | color: #9df4c4;
215 | }
216 | }
217 |
218 | /* Responsive design */
219 | @media (max-width: 768px) {
220 | .rom-builder {
221 | margin: 1rem;
222 | padding: 1rem;
223 | }
224 |
225 | .build-status {
226 | padding: 0.75rem;
227 | }
228 |
229 | .progress-container {
230 | padding: 0.75rem;
231 | }
232 |
233 | .build-button {
234 | padding: 0.75rem 1.5rem;
235 | font-size: 1rem;
236 | }
237 | }
238 |
--------------------------------------------------------------------------------
/modules/base/asm/templates_01CA95.asm:
--------------------------------------------------------------------------------
1 | ?BANK 01
2 |
3 |
4 | ---------------------------------------------
5 |
6 | templates_01CA95 [
7 | &widestring_01CAC1 ;00
8 | &widestring_01CACE ;01
9 | &widestring_01CADB ;02
10 | &widestring_01CAE8 ;03
11 | &widestring_01CAF5 ;04
12 | &widestring_01CB02 ;05
13 | &widestring_01CB0F ;06
14 | &widestring_01CB1C ;07
15 | &widestring_01CB27 ;08
16 | &widestring_01CB2E ;09
17 | &widestring_01CB35 ;0A
18 | &widestring_01CB3C ;0B
19 | &widestring_01CB43 ;0C
20 | &widestring_01CB4A ;0D
21 | &widestring_01CB51 ;0E
22 | &widestring_01CB58 ;0F
23 | &widestring_01CB5F ;10
24 | &widestring_01CB66 ;11
25 | &widestring_01CB7A ;12
26 | &widestring_01CB85 ;13
27 | &widestring_01CB90 ;14
28 | &widestring_01CB9B ;15
29 | &default_theme ;16
30 | &spirit_theme ;17
31 | &flower_theme ;18
32 | &castle_theme ;19
33 | &moon_tribe_theme ;1A
34 | &inca_theme ;1B
35 | &watermia_theme ;1C
36 | &angel_village_theme ;1D
37 | &euro_theme ;1E
38 | &dao_theme ;1F
39 | &frejia_theme ;20
40 | &male_vampire_theme ;21
41 | &female_vampire_theme ;22
42 | &allman_theme ;23
43 | &glass_player_theme ;24
44 | ]
45 |
46 | widestring_01CAC1 `[BOR:3][SEP:1,7FDE][SEP:2,3A94][SEP:3,0C03][SEP:13,0C03][SEP:11,6FDF][SEP:12,B1E][SFX:10][PAL:4]`
47 |
48 | widestring_01CACE `[BOR:7][SEP:1,7FFF][SEP:2,5D92][SEP:3,1004][SEP:13,1004][SEP:11,777F][SEP:12,561E][SFX:1B][PAL:4]`
49 |
50 | widestring_01CADB `[BOR:6][SEP:1,7BF9][SEP:2,599F][SEP:3,0000][SEP:13,0000][SEP:11,7FDE][SEP:12,7E86][SFX:19][PAL:4]`
51 |
52 | widestring_01CAE8 `[BOR:3][SEP:1,6FBF][SEP:2,4234][SEP:3,1880][SEP:13,1880][SEP:11,5F7F][SEP:12,9FF][SFX:19][PAL:4]`
53 |
54 | widestring_01CAF5 `[BOR:3][SEP:1,7FDE][SEP:2,46D3][SEP:3,1000][SEP:13,1000][SEP:11,73F7][SEP:12,2322][SFX:1C][PAL:4]`
55 |
56 | widestring_01CB02 `[BOR:3][SEP:1,7BBF][SEP:2,726D][SEP:3,0864][SEP:13,0864][SEP:11,7F3D][SEP:12,7137][SFX:1A][PAL:4]`
57 |
58 | widestring_01CB0F `[BOR:D][SEP:1,739C][SEP:2,3967][SEP:3,1080][SEP:13,1080][SEP:11,739C][SEP:12,4631][SFX:1A][PAL:4]`
59 |
60 | widestring_01CB1C `[BOR:2][SEP:11,673F][SEP:12,24FF][PAL:4]`
61 |
62 | widestring_01CB27 `[DLG:3,4][SIZ:D,1]`
63 |
64 | widestring_01CB2E `[DLG:3,4][SIZ:D,2]`
65 |
66 | widestring_01CB35 `[DLG:3,4][SIZ:D,3]`
67 |
68 | widestring_01CB3C `[DLG:3,4][SIZ:D,4]`
69 |
70 | widestring_01CB43 `[DLG:3,17][SIZ:D,1]`
71 |
72 | widestring_01CB4A `[DLG:3,15][SIZ:D,2]`
73 |
74 | widestring_01CB51 `[DLG:3,13][SIZ:D,3]`
75 |
76 | widestring_01CB58 `[DLG:3,11][SIZ:D,4]`
77 |
78 | widestring_01CB5F `[DLG:3,F][SIZ:D,5]`
79 |
80 | widestring_01CB66 `[DLG:2,14][SIZ:E,3][LU1:65]do you go?[N]`
81 |
82 | widestring_01CB7A `[DLG:3,4][SIZ:D,5]`
83 |
84 | widestring_01CB85 `[SEP:11,777F][SEP:12,561E][PAL:4]`
85 |
86 | widestring_01CB90 `[SEP:11,7FB7][SEP:12,79C2][PAL:4]`
87 |
88 | widestring_01CB9B `[SEP:11,73F7][SEP:12,2322][PAL:4]`
89 |
90 | default_theme `[BOR:3][SEP:1,7FFF][SEP:2,7A94][SEP:3,0000][SEP:13,0000][SEP:11,7FFB][SEP:12,762F][SFX:10][PAL:4]`
91 |
92 | spirit_theme `[BOR:4][SEP:1,7FFC][SEP:2,7E10][SEP:3,1000][SEP:13,1000][SEP:11,7FFF][SEP:12,4A96][SFX:10][PAL:4]`
93 |
94 | flower_theme `[BOR:6][SEP:1,4F70][SEP:2,7FFF][SEP:3,1C85][SEP:13,1C85][SEP:11,7FFB][SEP:12,762F][SFX:10][PAL:4]`
95 |
96 | castle_theme `[BOR:7][SEP:1,77FD][SEP:2,564F][SEP:3,1000][SEP:13,1000][SEP:11,7FFF][SEP:12,4332][SFX:10][PAL:4]`
97 |
98 | moon_tribe_theme `[BOR:8][SEP:1,7FFF][SEP:2,7A94][SEP:3,2108][SEP:13,2108][SEP:11,7FFF][SEP:12,7A94][SFX:10][PAL:4]`
99 |
100 | inca_theme `[BOR:5][SEP:1,7FDE][SEP:2,3A94][SEP:3,0C03][SEP:13,0C03][SEP:11,6FDF][SEP:12,B1E][SFX:10][PAL:4]`
101 |
102 | watermia_theme `[BOR:9][SEP:1,5FDF][SEP:2,662F][SEP:3,1060][SEP:13,1060][SEP:11,7FFF][SEP:12,6F6E][SFX:10][PAL:4]`
103 |
104 | angel_village_theme `[BOR:B][SEP:1,63FF][SEP:2,51B2][SEP:3,2060][SEP:13,2060][SEP:11,73FF][SEP:12,7F75][SFX:10][PAL:4]`
105 |
106 | euro_theme `[BOR:D][SEP:1,7FFC][SEP:2,3150][SEP:3,0000][SEP:13,0000][SEP:11,7FFF][SEP:12,4B78][SFX:10][PAL:4]`
107 |
108 | dao_theme `[BOR:C][SEP:1,7FFF][SEP:2,165B][SEP:3,1400][SEP:13,1400][SEP:11,77FF][SEP:12,6F32][SFX:10][PAL:4]`
109 |
110 | frejia_theme `[BOR:A][SEP:1,4BBF][SEP:2,5E18][SEP:3,0086][SEP:13,0086][SEP:11,7FFF][SEP:12,2E7E][SFX:10][PAL:4]`
111 |
112 | male_vampire_theme `[BOR:B][SEP:1,3DFF][SEP:2,3169][SEP:3,1084][SEP:13,1084][SEP:11,7FBB][SEP:12,59EE][SFX:1C][PAL:4]`
113 |
114 | female_vampire_theme `[BOR:B][SEP:1,51FB][SEP:2,354A][SEP:3,1084][SEP:13,1084][SEP:11,7F7F][SEP:12,5676][SFX:1B][PAL:4]`
115 |
116 | allman_theme `[BOR:4][SEP:1,53DC][SEP:2,41D2][SEP:3,1804][SEP:13,1804][SEP:11,6FFD][SEP:12,2A92][SFX:1C][PAL:4]`
117 |
118 | glass_player_theme `[BOR:9][SEP:1,7FDE][SEP:2,46D3][SEP:3,1000][SEP:13,1000][SEP:11,73F7][SEP:12,2322][SFX:10][PAL:4]`
119 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter02.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 2
2 |
3 | ----------------------------
4 | ?INCLUDE 'sc02_entry'
5 | ----------------------------
6 | widestring_04BE87 `[TPL:0][TPL:A]It wouldn't be wrong to[N]call this seaside cave our[N]second home.[FIN][TPL:B]Usually, we meet here[N]after our lessons at[N]church are finished and[N]chat until the sun sets.[END]`
7 |
8 | widestring_04BF35 `[TPL:4][TPL:9][NAM:4]: What the heck,[N][NAM:0]? Going home already?[FIN][TPL:A]Dinner time's still a ways[N]off, so let's stick around[N]and have fun a bit longer.[END]`
9 |
10 | ----------------------------
11 | ?INCLUDE 'sc02_lance'
12 | ----------------------------
13 | widestring_04B1CB `[TPL:4][TPL:9][NAM:4]: What gives, [NAM:0]?[N]You're pretty late, man.[FIN][TPL:B]Right now, I'm in the[N]middle of a match of[N]Blackjack with [NAM:5].[N]Wait a sec.[END]`
14 |
15 | ----------------------------
16 | ?INCLUDE 'sc02_seth'
17 | ----------------------------
18 | widestring_04B5B6 `[TPL:5][TPL:9][NAM:5]: Ahaha! I'm sure to[N]win again.[END]`
19 |
20 | ----------------------------
21 | ?INCLUDE 'sc02_erik'
22 | ----------------------------
23 | widestring_04B9AF `[TPL:0][TPL:A][DLY:0]Suddenly, [NAM:3] came flying[N]in with an urgent look[N]on his face![WAI][CLD]`
24 |
25 | widestring_04B9F2 `[TPL:3][BOR:2][TPL:9][NAM:3]: (huff huff)[N]News! It's BIG news![FIN][TPL:A]Edward Castle's princess[N]has gone missing! They say[N]she came to this town![END]`
26 |
27 | widestring_04BA55 `[TPL:4][TPL:B][NAM:4]: Dude, so what? With[N]you barging in here like[N]that, I thought something[N]much cooler had happened.[FIN]Besides, that "princess"[N]is just that selfish girl[N][NAM:1], yeah? Who cares[N]about someone like that?[END][TPL:3][TPL:A][NAM:3]: That's true, but[N]soldiers will come around[N]here looking for her.[FIN][TPL:B]The soldiers from Edward[N]Castle just look so cool,[N]don't they? I really want[N]to see them.[END]`
28 |
29 | widestring_04B210 `[TPL:4][TPL:A][NAM:4]: Don't just stand[N]there, [NAM:0]. Go sit next[N]to [NAM:3].[END]`
30 |
31 | widestring_04B612 `[TPL:5][TPL:A][NAM:5]: I'm not really[N]interested in girls.[N]Reading books is more fun.[END]`
32 |
33 | widestring_04BB59 `[TPL:3][TPL:A][NAM:3]: Dang, I thought[N]everyone was gonna be so[N]amazed…[END]`
34 |
35 | widestring_04B652 `[TPL:5][TPL:A][NAM:5]: Alright, since[N]everyone's here, what's[N]the plan for today?[FIN][CLD][PAU:1E][TPL:3][TPL:9][NAM:3]: Hey, I wanna see[N]Tim's mysterious power.[FIN][TPL:B]Come on, didn't you show[N]us the other day? You can[N]move things without using[N]your hands.[END][TPL:4][TPL:A][NAM:4]: If I'm remembering[N]right, he moved the stone[N]statue in the cave's nook.[FIN][CLD][TPL:4][TPL:9]Show us one more time,[N][NAM:0].[END]`
36 |
37 | widestring_04BB89 `[TPL:3][TPL:A][NAM:3]: You moved the statue[N]without going near it the[N]other day, right?[END]`
38 |
39 | widestring_04B23F `[TPL:4][TPL:B][NAM:4]: If I recall, when[N]you spun your flute like a[N]baton, the statue was[N]pulled to you, yeah?[END]`
40 |
41 | widestring_04B72B `[TPL:5][TPL:A][NAM:5]: Face toward the[N]stone statue and press[N]the L or R button.[END]`
42 |
43 | widestring_04B75D `[TPL:4][TPL:8][NAM:4]: Aah! It moooooved![PAU:28][END]`
44 |
45 | widestring_04B27E `[TPL:4][TPL:9][NAM:4]: Alright. This time,[N]let's try the card trick.[FIN][TPL:B]I'll put four cards face[N]down. Pick the one you[N]think is the Ace of[N]Diamonds.[FIN][CLD]`
46 |
47 | widestring_04B2F0 `[TPL:4][TPL:A][NAM:4]: Go on. Choose the[N]one you think is the Ace[N]of Diamonds.[END]`
48 |
49 | widestring_04BBB6 `[TPL:3][TPL:9][NAM:3]: If only I could do[N]that too…[END]`
50 |
51 | widestring_04B77C `[TPL:5][TPL:A][NAM:5]: No matter how many[N]times I see it, it's still[N]amazing.[FIN]But why can you move the[N]statue when you can't move[N]anything else…?[END]`
52 |
53 | ----------------------------
54 | ?INCLUDE 'sc02_card'
55 | ----------------------------
56 | widestring_04B00F `[TPL:16][BOR:0][TPL:8][NAM:0] picks up a card.[WAI][N][TPL:A]Beyond the shadow of a[N]doubt, it was the Ace of[N]Diamonds![END]`
57 |
58 | widestring_04B328 `[PAU:1E][TPL:4][BOR:2][TPL:9][NAM:4]: Ahh. Right on the[N]money![END]`
59 |
60 | widestring_04BC16 `[TPL:3][TPL:9][NAM:3]: Phew. I'm[N]speechless…[FIN][CLD][TPL:3][TPL:8]Hey, [NAM:5].[FIN][TPL:A]This sort of thing is[N]called extrasensory[N]perception, right?[END]`
61 |
62 | widestring_04B7DE `[TPL:5][TPL:A][NAM:5]: The meaning of[N]"extrasensory perception"[N]is…[FIN]just as the word says: the[N]ability to perceive things[N]beyond normal human sense.[FIN][TPL:B]We usually identify the[N]traditional five human[N]senses as sight, hearing,[N]taste, smell, and touch.[FIN][CLD][TPL:5][TPL:A]I'm thinking that[N]extrasensory perception[N]might be the sixth sense.[END]`
63 |
64 | widestring_04B344 `[PAU:1E][TPL:4][TPL:A][NAM:4]: I don't understand[N]the stuff Professor [NAM:5][N]says all that well.[END]`
65 |
66 | widestring_04B386 `[TPL:4][TPL:A][NAM:4]: Come on, [NAM:5].[N]While the cards are out,[N]let's play another game.[END]`
67 |
68 | widestring_04B3AD `[TPL:4][TPL:9][NAM:4]: One more game with[N][NAM:5] and I'm going home.[END]`
69 |
--------------------------------------------------------------------------------
/site/README.md:
--------------------------------------------------------------------------------
1 | # Illusion of Gaia: Retranslated - ROM Patcher
2 |
3 | A React 19 web application for creating custom ROM patches of "Illusion of Gaia: Retranslated" with user-selected modules.
4 |
5 | ## Features
6 |
7 | - **Project Data Fetching**: Automatically loads project configuration from Supabase API
8 | - **Module Selection**: Dynamic form interface for selecting ROM modification modules
9 | - **ROM Validation**: CRC32 validation ensures you're using the correct base ROM
10 | - **ROM Building**: Integrates with GaiaLabs core package to rebuild ROM with selected modules
11 | - **Error Handling**: Comprehensive error handling with user-friendly notifications
12 | - **Responsive Design**: Works on desktop, tablet, and mobile devices
13 | - **GitHub Pages Deployment**: Automated deployment via GitHub Actions
14 |
15 | ## Getting Started
16 |
17 | ### Prerequisites
18 |
19 | - Node.js 18+
20 | - npm or yarn
21 | - A valid Illusion of Gaia ROM file (.smc, .sfc, or .bin)
22 |
23 | ### Development
24 |
25 | 1. **Clone the repository**
26 | ```bash
27 | git clone https://github.com/Azarem/IOGRetranslation.git
28 | cd IOGRetranslation/site
29 | ```
30 |
31 | 2. **Install dependencies**
32 | ```bash
33 | npm install
34 | ```
35 |
36 | 3. **Start development server**
37 | ```bash
38 | npm run dev
39 | ```
40 |
41 | 4. **Open in browser**
42 | Navigate to `http://localhost:3000/IOGRetranslation/`
43 |
44 | ### Building for Production
45 |
46 | ```bash
47 | npm run build
48 | ```
49 |
50 | The built files will be in the `dist/` directory.
51 |
52 | ## Usage
53 |
54 | 1. **Load Project**: The application automatically loads the "Illusion of Gaia: Retranslated" project data
55 | 2. **Select ROM File**: Choose your original Illusion of Gaia ROM file for validation
56 | 3. **Configure Modules**: Select your preferred options from each module group
57 | 4. **Build ROM**: Generate your custom ROM with the selected modifications
58 | 5. **Download**: Download the patched ROM file
59 |
60 | ## Project Structure
61 |
62 | ```
63 | site/
64 | ├── src/
65 | │ ├── components/ # React components
66 | │ │ ├── ErrorBoundary.tsx # Error boundary for crash handling
67 | │ │ ├── ModuleSelector.tsx # Module selection interface
68 | │ │ ├── NotificationSystem.tsx # Toast notifications
69 | │ │ ├── RomBuilder.tsx # ROM building interface
70 | │ │ └── RomFilePicker.tsx # ROM file validation
71 | │ ├── hooks/ # Custom React hooks
72 | │ │ └── useProjectData.ts # Project data management
73 | │ ├── services/ # API services
74 | │ │ └── supabaseService.ts # Supabase integration
75 | │ ├── utils/ # Utility functions
76 | │ │ └── crc32.ts # CRC32 validation
77 | │ ├── types.ts # TypeScript type definitions
78 | │ ├── App.tsx # Main application component
79 | │ └── main.tsx # Application entry point
80 | ├── public/ # Static assets
81 | ├── .env # Environment variables
82 | ├── package.json # Dependencies and scripts
83 | ├── tsconfig.json # TypeScript configuration
84 | ├── vite.config.js # Vite build configuration
85 | └── README.md # This file
86 | ```
87 |
88 | ## Dependencies
89 |
90 | ### Core Dependencies
91 | - **React 19**: Modern React with latest features
92 | - **@gaialabs/core**: ROM processing and generation
93 | - **@gaialabs/shared**: Shared utilities including CRC32
94 |
95 | ### Development Dependencies
96 | - **Vite**: Fast build tool and dev server
97 | - **TypeScript**: Type safety and better development experience
98 |
99 | ## Deployment
100 |
101 | The application is configured for automatic deployment to GitHub Pages via GitHub Actions.
102 |
103 | ### Manual Deployment
104 |
105 | 1. **Build the application**
106 | ```bash
107 | npm run build
108 | ```
109 |
110 | 2. **Deploy to GitHub Pages**
111 | The GitHub Action in `.github/workflows/deploy.yml` handles automatic deployment on push to main branch.
112 |
113 | ### Environment Variables
114 |
115 | The application uses the following environment variables:
116 |
117 | ```env
118 | VITE_SUPABASE_URL=https://adwobxutnpmjbmhdxrzx.supabase.co/rest/v1
119 | VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
120 | VITE_PROJECT_NAME=Illusion of Gaia: Retranslated
121 | ```
122 |
123 | Create a `.env` file in the `site/` directory with these variables. The Supabase URL and API key are used to fetch project data, while the project name filters the results to the specific translation project.
124 |
125 | ## Browser Compatibility
126 |
127 | - Chrome 90+
128 | - Firefox 88+
129 | - Safari 14+
130 | - Edge 90+
131 |
132 | ## Contributing
133 |
134 | 1. Fork the repository
135 | 2. Create a feature branch
136 | 3. Make your changes
137 | 4. Test thoroughly
138 | 5. Submit a pull request
139 |
140 | ## License
141 |
142 | This project is licensed under the ISC License - see the LICENSE file for details.
143 |
144 | ## Acknowledgments
145 |
146 | - GaiaLabs for the core ROM processing libraries
147 | - The Illusion of Gaia: Retranslated project team
148 | - React and Vite communities for excellent tooling
149 |
--------------------------------------------------------------------------------
/modules/base/patches/OverworldNameSwitch.asm:
--------------------------------------------------------------------------------
1 | ?BANK 03
2 |
3 | ------------------------------------------------
4 | ?INCLUDE 'overworld_names'
5 | ------------------------------------------------
6 |
7 | overworld_names [
8 | map_name < #01, &spritestring_03B244, &spritestring_03B244 > ;00
9 | map_name < #06, &spritestring_03B24F, &spritestring_03B24F > ;01
10 | map_name < #0A, &spritestring_03B25A, &spritestring_03B25A > ;02
11 | map_name < #15, &spritestring_03B26A, &spritestring_03B26A > ;03
12 | map_name < #17, &spritestring_03B278, &spritestring_03B278 > ;04
13 | map_name < #1A, &spritestring_03B286, &spritestring_03B286 > ;05
14 | map_name < #1C, &spritestring_03B296, &spritestring_03B296 > ;06
15 | map_name < #30, &spritestring_03B2A1, &spritestring_03B2A1 > ;07
16 | map_name < #31, &spritestring_03B2AF, &spritestring_03B2AF > ;08
17 | map_name < #32, &spritestring_03B2BD, &spritestring_03B2C5 > ;09
18 | map_name < #39, &spritestring_03B2BD, &spritestring_03B2C5 > ;0A
19 | map_name < #3E, &spritestring_03B2CD, &spritestring_03B2CD > ;0B
20 | map_name < #47, &spritestring_03B2CD, &spritestring_03B2CD > ;0B
21 | map_name < #49, &spritestring_03B2DA, &spritestring_03B2DA > ;0C
22 | map_name < #4B, &spritestring_03B2E9, &spritestring_03B2E9 > ;0D
23 | map_name < #67, &spritestring_03B2F8, &spritestring_03B2F8 > ;0E
24 | map_name < #68, &spritestring_03B2FB, &spritestring_03B2FB > ;0F
25 | map_name < #69, &spritestring_03B308, &spritestring_03B308 > ;10
26 | map_name < #6A, &spritestring_03B316, &spritestring_03B316 > ;11
27 | map_name < #78, &spritestring_03B324, &spritestring_03B324 > ;12
28 | map_name < #79, &spritestring_03B32D, &spritestring_03B32D > ;13
29 | map_name < #82, &spritestring_03B336, &spritestring_03B336 > ;14
30 | map_name < #91, &spritestring_03B341, &spritestring_03B341 > ;15
31 | map_name < #95, &spritestring_03B34E, &spritestring_03B34E > ;16
32 | map_name < #96, &spritestring_03B35B, &spritestring_03B35B > ;17
33 | map_name < #9F, &spritestring_03B368, &spritestring_03B368 > ;18
34 | map_name < #A0, &spritestring_03B372, &spritestring_03B372 > ;19
35 | map_name < #AC, &spritestring_03B37C, &spritestring_03B37C > ;1A
36 | map_name < #AD, &spritestring_03B38D, &spritestring_03B38D > ;1B
37 | map_name < #AE, &spritestring_03B39E, &spritestring_03B39E > ;1C
38 | map_name < #B0, &spritestring_03B3AF, &spritestring_03B3AF > ;1D
39 | map_name < #C3, &spritestring_03B3B9, &spritestring_03B3B9 > ;1E
40 | map_name < #C4, &spritestring_03B3CC, &spritestring_03B3CC > ;1F
41 | map_name < #C5, &spritestring_03B3CC, &spritestring_03B3CC > ;20
42 | map_name < #C8, &spritestring_03B3CC, &spritestring_03B3CC > ;21
43 | map_name < #CC, &spritestring_03B3DF, &spritestring_03B3DF > ;22
44 | map_name < #DC, &spritestring_03B3E7, &spritestring_03B3E7 > ;23
45 | map_name < #DE, &spritestring_03B3F2, &spritestring_03B3F2 > ;24
46 | ]
47 |
48 | spritestring_03B244 ~South Cape~
49 |
50 | spritestring_03B24F ~South Cape~
51 |
52 | spritestring_03B25A ~Edward's Castle~
53 |
54 | spritestring_03B26A ~Itory Village~
55 |
56 | spritestring_03B278 ~Itory Village~
57 |
58 | spritestring_03B286 ~Moon Tribe Camp~
59 |
60 | spritestring_03B296 ~Inca Ruins~
61 |
62 | spritestring_03B2A1 ~Diamond Coast~
63 |
64 | spritestring_03B2AF ~Diamond Coast~
65 |
66 | spritestring_03B2BD ~Freesia~
67 |
68 | spritestring_03B2C5 ~Freejia~
69 |
70 | spritestring_03B2CD ~Diamond Mine~
71 |
72 | spritestring_03B2DA ~Neil's Cottage~
73 |
74 | spritestring_03B2E9 ~Nazca Painting~
75 |
76 | spritestring_03B2F8 ~Mu~
77 |
78 | spritestring_03B2FB ~Seaside Cave~
79 |
80 | spritestring_03B308 ~Angel Village~
81 |
82 | spritestring_03B316 ~Angel Village~
83 |
84 | spritestring_03B324 ~Watermia~
85 |
86 | spritestring_03B32D ~Watermia~
87 |
88 | spritestring_03B336 ~Great Wall~
89 |
90 | spritestring_03B341 ~City of Euro~
91 |
92 | spritestring_03B34E ~City of Euro~
93 |
94 | spritestring_03B35B ~City of Euro~
95 |
96 | spritestring_03B368 ~Mt.Temple~
97 |
98 | spritestring_03B372 ~Mt.Temple~
99 |
100 | spritestring_03B37C ~Natives' Village~
101 |
102 | spritestring_03B38D ~Natives' Village~
103 |
104 | spritestring_03B39E ~Natives' Village~
105 |
106 | spritestring_03B3AF ~Angkor Wat~
107 |
108 | spritestring_03B3B9 ~Desert Village Dao~
109 |
110 | spritestring_03B3CC ~Desert Village Dao~
111 |
112 | spritestring_03B3DF ~Pyramid~
113 |
114 | spritestring_03B3E7 ~Over Babel~
115 |
116 | spritestring_03B3F2 ~Tower of Babel~
117 |
118 |
119 |
120 | ---------------------------------------------
121 | ?INCLUDE 'sFE_actor_03A2F1'
122 | ---------------------------------------------
123 |
124 | sub_03A692 {
125 | PHP
126 | PHX
127 | LDX #$0000
128 | SEP #$20
129 | PHB
130 | LDA #$^overworld_names
131 | PHA
132 | PLB
133 |
134 | code_03A69E:
135 | LDA $&overworld_names, X
136 | BEQ code_03A6B6
137 | CMP $0000
138 | BEQ code_03A6AD
139 | INX
140 | INX
141 | INX
142 | INX
143 | INX
144 | BRA code_03A69E
145 | }
146 |
147 |
148 | code_03A6AD {
149 | REP #$20
150 | LDA $0B24
151 | BEQ do_name_en
152 | LDY $&overworld_names+3, X
153 | BRA do_name_next
154 | do_name_en:
155 | LDY $&overworld_names+1, X
156 | do_name_next:
157 | PLB
158 | PLX
159 | PLP
160 | RTS
161 | }
162 |
--------------------------------------------------------------------------------
/modules/freejia-slave-return/patches/FreejiaSlaveReturn.asm:
--------------------------------------------------------------------------------
1 |
2 | !slave_captured_flag 5A
3 | !return_flag 8D
4 | !dao_return_flag B6
5 | !slave_reward_flag 0107
6 |
7 | -------------------------------------------
8 | ?INCLUDE 'fr32_locked_door'
9 | -------------------------------------------
10 |
11 | h_fr32_locked_door [
12 | h_actor < #01, #00, #18 > ;00
13 | ]
14 |
15 | fr32_locked_door_return {
16 | COP [D0] ( #slave_captured_flag, #01, &locked_door_normal )
17 | COP [D0] ( #dao_return_flag, #01, &locked_door_normal )
18 | COP [D1] ( #$slave_reward_flag, #01, &locked_door_normal )
19 | BRA e_fr32_locked_door
20 |
21 | locked_door_normal:
22 | LDA #&town_door+3
23 | STA $00
24 | LDA #*town_door
25 | STA $02
26 | JML @town_door+3
27 | }
28 |
29 | -------------------------------------------
30 | ?INCLUDE 'fr3A_sympathetic'
31 | -------------------------------------------
32 |
33 | e_fr3A_sympathetic {
34 | COP [D0] ( #slave_captured_flag, #01, &code_05C325 )
35 | COP [D1] ( #$slave_reward_flag, #01, &code_05C325 )
36 | LDA #$0200
37 | TSB $12
38 | COP [0B]
39 | COP [C0] ( &code_05C327 )
40 | COP [C1]
41 | RTL
42 | }
43 |
44 | code_05C327 {
45 | COP [D1] ( #$slave_reward_flag, #01, &freejia_slave_farewell_begin )
46 | COP [D0] ( #return_flag, #01, &freejia_slave_return_begin )
47 | COP [BF] ( &widestring_05C32F )
48 | COP [CC] ( #59 )
49 | RTL
50 | }
51 |
52 | freejia_slave_return_begin {
53 | COP [D0] ( #59, #01, &freejia_slave_recognize_begin )
54 | COP [BF] ( &freejia_slave_return_str )
55 | BRA freejia_slave_give_jewel
56 | }
57 |
58 | freejia_slave_recognize_begin {
59 | COP [BF] ( &freejia_slave_recognize_str )
60 | }
61 |
62 | freejia_slave_give_jewel {
63 | COP [D4] ( #01, &freejia_slave_inv_full )
64 | COP [CD] ( #$slave_reward_flag )
65 | RTL
66 | }
67 |
68 | freejia_slave_inv_full {
69 | COP [BF] ( &freejia_slave_inv_full_str )
70 | RTL
71 | }
72 |
73 | freejia_slave_farewell_begin {
74 | COP [BF] ( &freejia_slave_farewell_str )
75 | RTL
76 | }
77 |
78 | freejia_slave_return_str `[TPL:20][TPL:A]I've been hiding from the[N]slave traders, but I think[N]it's time to move on.[FIN][JMP:freejia_slave_recognize_str+M]`
79 | freejia_slave_recognize_str `[TPL:20][TPL:9]Hey, it's you! Thanks for[N]what you did back then.[FIN][TPL:A][::]I've been holding on to[N]this rare jewel. Here,[N]let me give it to you.[END]`
80 | freejia_slave_inv_full_str `[TPL:20][TPL:A]Hey now, your pockets are[N]full! Come back when you[N]have less junk.[END]`
81 | freejia_slave_farewell_str `[TPL:20][TPL:A]I suppose I should be[N]taking off now that the[N]coast is clear.[END]`
82 |
83 | -------------------------------------------
84 | ?INCLUDE 'fr3A_harborer'
85 | -------------------------------------------
86 |
87 | h_fr3A_harborer [
88 | h_actor < #02, #00, #10 > ;00
89 | ]
90 |
91 | freejia_harborer_logic {
92 | COP [D0] ( #dao_return_flag, #01, &freejia_harborer_stub )
93 | }
94 |
95 | e_fr3A_harborer {
96 | COP [D0] ( #slave_captured_flag, #01, &code_05BC68 )
97 | freejia_harborer_stub:
98 | COP [C0] ( &code_05BC6A )
99 | COP [0B]
100 | COP [C1]
101 | RTL
102 | }
103 |
104 | code_05BC6A {
105 | COP [D0] ( #slave_captured_flag, #01, &freejia_harborer_escaped )
106 | COP [D0] ( #dao_return_flag, #01, &freejia_harborer_rumor )
107 | COP [D1] ( #$slave_reward_flag, #00, &freejia_harborer_default )
108 | COP [D0] ( #return_flag, #01, &freejia_harborer_return )
109 |
110 | freejia_harborer_default:
111 | COP [BF] ( &widestring_05BC6F )
112 | RTL
113 | }
114 |
115 | freejia_harborer_return {
116 | COP [BF] ( &freejia_harborer_return_str )
117 | RTL
118 | }
119 |
120 | freejia_harborer_escaped {
121 | COP [BF] ( &freejia_harborer_escaped_str )
122 | RTL
123 | }
124 |
125 | freejia_harborer_rumor {
126 | COP [BF] ( &freejia_harborer_rumor_str )
127 | RTL
128 | }
129 |
130 | freejia_harborer_return_str `[TPL:20][TPL:A]Hey it's you! Things have[N]quieted down around here[N]after our friend left.[FIN]Let's hope we never have[N]to do something like that[N]again.[END]`
131 | freejia_harborer_escaped_str `[TPL:20][TPL:A]Now that the slave trade[N]is being abolished, I was[N]let off easy.[FIN][TPL:B]Things could have ended[N]much worse for me. Here's[N]hoping our friend is as[N]lucky.[END]`
132 | freejia_harborer_rumor_str `[TPL:20][TPL:B]Rumor has it that the new[N]president of Roleck[N]corporation is trying to[N]abolish the slave trade.[FIN]Maybe things will start[N]looking up for our friend.[END]`
133 |
134 | -------------------------------------------
135 | ?INCLUDE 'fr32_slaver1'
136 | -------------------------------------------
137 |
138 | e_fr32_slaver1 {
139 | COP [D0] ( #slave_captured_flag, #01, &code_05B839 )
140 | COP [D0] ( #dao_return_flag, #01, &code_05B839 )
141 | COP [D1] ( #$slave_reward_flag, #01, &code_05B839 )
142 | COP [0B]
143 | COP [C0] ( &code_05B83B )
144 | }
145 |
146 | -------------------------------------------
147 | ?INCLUDE 'fr32_slaver2'
148 | -------------------------------------------
149 |
150 | e_fr32_slaver2 {
151 | COP [D0] ( #slave_captured_flag, #01, &code_05B87E )
152 | COP [D0] ( #dao_return_flag, #01, &code_05B87E )
153 | COP [D1] ( #$slave_reward_flag, #01, &code_05B87E )
154 | COP [0B]
155 | COP [C0] ( &code_05B880 )
156 | COP [DA] ( #07 )
157 | }
158 |
--------------------------------------------------------------------------------
/modules/base/patches/Credits.asm:
--------------------------------------------------------------------------------
1 | ?BANK 09
2 |
3 | !joypad_mask_std 065A
4 | !BG3SC 2109
5 | !W12SEL 2123
6 | !_TM 212C
7 | !_TS 212D
8 | !CGWSEL 2130
9 | !CGADSUB 2131
10 | !COLDATA 2132
11 |
12 | ext_credits_0 `[PAL:0][DLG:4C,1] Retranslation[N][N] Credits[END]`
13 | ext_credits_1 `[PAL:0][DLG:4C,1] Tools and ASM[N][N][PAL:8] Kassiven[END]`
14 | ext_credits_2 `[PAL:0][DLG:4C,1] Base Translation[N][N][PAL:8] L. Thammy[END]`
15 | ext_credits_3 `[PAL:0][DLG:4C,1] Revisions[N][N][PAL:8] ViewtifulSlayer[END]`
16 | ext_credits_4 `[PAL:0][DLG:4C,1] Graphics[N][N][PAL:8] Azure Mage[END]`
17 | ext_credits_5 `[PAL:0][DLG:4C,1] GaiaLabs Boot Logo[N][N][PAL:8] andwhyisit[END]`
18 |
19 | ----------------------------------------------
20 | ?INCLUDE 'sF7_credits'
21 | ----------------------------------------------
22 |
23 |
24 | code_09E9D8 {
25 | COP [69] ( #$01F4 )
26 | LDA #$&credits_09ECBF
27 | STA $26
28 | COP [C8] ( &code_09EB64 )
29 | COP [DA] ( #4A )
30 | LDA #$&credits_09ECE7
31 | STA $26
32 | COP [C8] ( &code_09EB64 )
33 | COP [DA] ( #4A )
34 | LDA #$&credits_09ED10
35 | STA $26
36 | COP [C8] ( &code_09EB64 )
37 | COP [DA] ( #4A )
38 | LDA #$&credits_09ED3C
39 | STA $26
40 | COP [C8] ( &code_09EB64 )
41 | COP [DA] ( #4A )
42 | LDA #$&credits_09ED68
43 | STA $26
44 | COP [C8] ( &code_09EB64 )
45 | COP [DA] ( #4A )
46 | LDA #$&credits_09ED96
47 | STA $26
48 | COP [C8] ( &code_09EB64 )
49 | COP [DA] ( #4A )
50 | LDA #$&credits_09EDC3
51 | STA $26
52 | COP [C8] ( &code_09EB64 )
53 | COP [DA] ( #4A )
54 | LDA #$&credits_09EDF1
55 | STA $26
56 | COP [C8] ( &code_09EB64 )
57 | COP [DA] ( #4A )
58 | LDA #$&credits_09EE2D
59 | STA $26
60 | COP [C8] ( &code_09EB64 )
61 | COP [DA] ( #4A )
62 | LDA #$&credits_09EE7D
63 | STA $26
64 | COP [C8] ( &code_09EB64 )
65 | COP [DA] ( #4A )
66 | LDA #$&credits_09EEAA
67 | STA $26
68 | COP [C8] ( &code_09EB64 )
69 | COP [DA] ( #4A )
70 | LDA #$&credits_09EEF7
71 | STA $26
72 | COP [C8] ( &code_09EB64 )
73 | COP [DA] ( #4A )
74 | LDA #$&credits_09EF22
75 | STA $26
76 | COP [C8] ( &code_09EB64 )
77 | COP [DA] ( #4A )
78 | LDA #$&credits_09EF75
79 | STA $26
80 | COP [C8] ( &code_09EB64 )
81 | COP [DA] ( #4A )
82 | LDA #$&credits_09EFB1
83 | STA $26
84 | COP [C8] ( &code_09EB64 )
85 | COP [DA] ( #4A )
86 | LDA #$&credits_09EFFB
87 | STA $26
88 | COP [C8] ( &code_09EB64 )
89 | COP [DA] ( #4A )
90 | LDA #$&credits_09F038
91 | STA $26
92 | COP [C8] ( &code_09EB64 )
93 | COP [DA] ( #4A )
94 | LDA #$&credits_09F073
95 | STA $26
96 | COP [C8] ( &code_09EB64 )
97 | COP [DA] ( #4A )
98 | LDA #$&credits_09F0B2
99 | STA $26
100 | COP [C8] ( &code_09EB64 )
101 | COP [DA] ( #4A )
102 | LDA #$&credits_09F0F2
103 | STA $26
104 | COP [C8] ( &code_09EB64 )
105 | COP [DA] ( #4A )
106 | LDA #$&credits_09F12C
107 | STA $26
108 | COP [C8] ( &code_09EB64 )
109 | COP [DA] ( #4A )
110 | LDA #$&credits_09F18A
111 | STA $26
112 | COP [C8] ( &code_09EB64 )
113 | COP [DA] ( #4A )
114 | LDA #$&credits_09F1C8
115 | STA $26
116 | COP [C8] ( &code_09EB64 )
117 | COP [DA] ( #4A )
118 | LDA #$&credits_09F1F2
119 | STA $26
120 | COP [C8] ( &code_09EB64 )
121 | COP [DA] ( #4A )
122 | LDA #$&credits_09F220
123 | STA $26
124 | COP [C8] ( &code_09EB64 )
125 | COP [DA] ( #4A )
126 | LDA #$&credits_09F248
127 | STA $26
128 | COP [C8] ( &code_09EB64 )
129 | COP [DA] ( #4A )
130 | LDA #$&credits_09F273
131 | STA $26
132 | COP [C8] ( &code_09EB64 )
133 | COP [DA] ( #4A )
134 | LDA #$&credits_09F2A9
135 | STA $26
136 | COP [C8] ( &code_09EB64 )
137 | COP [DA] ( #4A )
138 | LDA #$&ext_credits_0
139 | STA $26
140 | COP [C8] ( &code_09EB64 )
141 | COP [DA] ( #4A )
142 | LDA #$&ext_credits_1
143 | STA $26
144 | COP [C8] ( &code_09EB64 )
145 | COP [DA] ( #4A )
146 | LDA #$&ext_credits_2
147 | STA $26
148 | COP [C8] ( &code_09EB64 )
149 | COP [DA] ( #4A )
150 | LDA #$&ext_credits_3
151 | STA $26
152 | COP [C8] ( &code_09EB64 )
153 | COP [DA] ( #4A )
154 | LDA #$&ext_credits_4
155 | STA $26
156 | COP [C8] ( &code_09EB64 )
157 | COP [DA] ( #4A )
158 | LDA #$&ext_credits_5
159 | STA $26
160 | COP [C8] ( &code_09EB64 )
161 | COP [DA] ( #4A )
162 | LDA #$&credits_09F2FA
163 | STA $26
164 | COP [C8] ( &code_09EB64 )
165 | COP [DA] ( #4A )
166 | SEP #$20
167 | LDA #$79
168 | STA $BG3SC
169 | REP #$20
170 | LDY #$&credits_09F315
171 | JSR $&sub_09EC23
172 | COP [4F] ( $7F0200, #$7800, #$0800 )
173 | SEP #$20
174 | LDA #$14
175 | ORA $09F6
176 | STA $_TM
177 | LDA #$00
178 | STA $_TS
179 | REP #$20
180 | COP [C1]
181 | RTL
182 | }
183 |
184 | ---------------------------------------------------------
185 | ;Override wait timer
186 |
187 | code_09EBDB {
188 | COP [CB]
189 | COP [DB] ( #$01C5 )
190 | SEP #$20
191 | LDA #$7A
192 | STA $BG3SC
193 | REP #$20
194 | COP [CA] ( #80 )
195 | LDA $0720
196 | CLC
197 | ADC #$0001
198 | STA $0720
199 | COP [CB]
200 | SEP #$20
201 | LDA #$10
202 | ORA $09F6
203 | STA $_TM
204 | REP #$20
205 | LDA #$0000
206 | STA $0720
207 | PHX
208 | LDX #$0400
209 | }
210 |
211 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter17.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 17
2 |
3 | -------------------------------------
4 | ?INCLUDE 'na4B_neil'
5 | -------------------------------------
6 | widestring_05E8F7 `[TPL:6][TPL:E]Neil: It was a long walk,[N]but I think everyone held[N]up well.[FIN][TPL:F]This is the most famous[N]image of the Nazca lines,[N]the condor. You've at[N]least heard of it, right?[FIN]We still don't know why in[N]the world the people of[N]ancient times drew things[N]like this.[FIN]Well, anyhow. Even if you[N]travel here, the scale of[N]the area can overwhelm[N]you.[FIN]Before anything else,[N]everyone may want take a[N]look by themselves first.[END]`
7 |
8 | -------------------------------------
9 | ?INCLUDE 'na4B_lily'
10 | -------------------------------------
11 | widestring_05F0C8 `[TPL:2][TPL:F][NAM:2]: Awesome, aren't[N]they? The people from[N]ancient times. How could[N]they have drawn these…?[END]`
12 |
13 | -------------------------------------
14 | ?INCLUDE 'na4B_lance'
15 | -------------------------------------
16 | widestring_05EF2D `[TPL:4][TPL:F][NAM:4]: I suppose that[N]until tha other day, I've[N]been spendin' all o' my[N]days doin' things like…[FIN]commutin' to and from[N]school, studyin', and[N]playin'.[FIN]I couldn't even dream that[N]I'd be here…[END]`
17 |
18 | -------------------------------------
19 | ?INCLUDE 'na4B_erik'
20 | -------------------------------------
21 | widestring_05F278 `[TPL:3][TPL:E][NAM:3]: I'm scared for some[N]reason… I'll be close to[N]Neil.[END]`
22 |
23 | widestring_05E9F0 `[TPL:6][TPL:E]Neil: Ha ha ha. Don't rush[N]like that. Go sightseeing[N]with everyone first.[END]`
24 |
25 | widestring_05EDA1 `[TPL:1][TPL:10][NAM:1]: If you look at it[N]like this, it looks kind[N]of like the white lines on[N]a school playground on[N]track and field day.[FIN][CLD][TPL:1][TPL:F]Surprisingly, the ancient[N]Nazca people were doing[N]the 100-meter dash here,[N]weren't they?[END]`
26 |
27 | widestring_05F0FE `[TPL:2][TPL:E][NAM:2]: Isn't it somehow[N]natural how these stones[N]are scattered around?[END]`
28 |
29 | widestring_05EE15 `[TPL:1][TPL:E][NAM:1]: This is exactly[N]where the condor's stomach[N]would be, isn't it?[FIN][TPL:F]Don't you think that if[N]you dig here, you'll find[N]eggs or something like[N]that?[FIN]I-I'm joking. (Laughs) I'm[N]not really going to search[N]for them.[END]`
30 |
31 | -------------------------------------
32 | ?INCLUDE 'na4B_spirit'
33 | -------------------------------------
34 | widestring_05F349 `[TPL:1A][TPL:C]Mweheheheheheh…[END]`
35 |
36 | widestring_05ED60 `[TPL:1][TPL:F][NAM:1]: It probably feels[N]great to draw a huge[N]picture on a natural[N]canvas like this,[FIN]…being able to feel the[N]wind, having nothing else[N]to distract you.[END]`
37 |
38 | widestring_05F29F `[TPL:3][TPL:E][NAM:3]: What's going to[N]happen…? I'm getting[N]excited.[END]`
39 |
40 | widestring_05F2C7 `[TPL:3][TPL:E][NAM:3]: What's going to[N]happen…? I'm getting[N]excited.[END]`
41 |
42 | widestring_05EA25 `[TPL:6][TPL:E]Neil: Aaallright, now that[N]everyone's back, let's get[N]to the main question.[FIN][TPL:10]The thing that [NAM:0] was[N]calling a [NAM:D] [NAM:E][N]is probably going to be[N]somewhere in this plain,[N]right?[FIN][CLD][PAU:28][TPL:3][TPL:F][NAM:3]: The thought came to[N]me when I was looking at[N]the drawing on the ground[N]just now;[FIN]don't you think that you[N]can kind of see the form[N]of a swan in this condor[N]image?[FIN][CLD][PAU:14][TPL:6][TPL:D]Neil: That's it…! You've[N]figured it out…!![FIN][TPL:F]We've been comparing the[N]arrangement of the stars[N]in that constellation to a[N]swan,[FIN]…but as far as the ancient[N]people of Nazca were[N]concerned, it might have[N]been a condor.[END]`
43 |
44 | widestring_05F148 `[TPL:2][TPL:D][NAM:2]: Aaaaaaaaaaah…!![N]I've got it…!![END]`
45 |
46 | widestring_05F160 `[PAU:28][TPL:2][TPL:E][DLY:0]Look, look…! The location[N]of the stones on the[N]surface of the ground…!![FIN][TPL:F]They're definitely in the[N]positions of the stars in[N]the constellation of[N]Cygnus…![END]`
47 |
48 | widestring_05EB2E `[TPL:6][TPL:E][LU1:36][N][LU2:3E][LU2:AC][LU1:6B]it [LU1:F6][N][LU1:89]comes back. [FIN][::][TPL:6][TPL:C][DLY:0]Neil: That's it…![FIN][TPL:F]There are nine stars in[N]the constellation of[N]Cygnus, and there are also[N]nine stones…[FIN]`
49 |
50 | widestring_05EB94 `[CLR][TPL:0][TPL:F]In that case, where would[N]the red star that we've[N]started seeing recently[N]be…?[FIN][PAL:0] The condor's head[N] The condor's right leg[N] The condor's left leg[N] The condor's tail[PAL:4]`
51 |
52 | widestring_05EBE5 `[CLR][NAM:0]: No, wait. It should[N]be underneath the[N]constellation of Cygnus…[FIN]`
53 |
54 | widestring_05EC0E `[CLR][NAM:0]: That's it…! It would[N]be right in the joint of[N]the left leg![FIN][TPL:6][TPL:F]Neil: Alright…! Let's try[N]to examine that part of[N]the left leg![END]`
55 |
56 | widestring_05F1C3 `[TPL:2][TPL:F][NAM:2]: A mystery hidden[N]in a constellation; it's[N]really romantic somehow,[N]isn't it?[END]`
57 |
58 | widestring_05EF98 `[TPL:4][TPL:10][NAM:4]: I wonder if we're[N]now revealin' a mystery[N]that hasn't been solved[N]yet by explorers and[N]archaeologists…[END]`
59 |
60 | -------------------------------------
61 | ?INCLUDE 'na4B_kara'
62 | -------------------------------------
63 | widestring_05EE7C `[TPL:1][TPL:F][NAM:1]: My heart is[N]pounding at being able to[N]experience something like[N]this…[END]`
64 |
65 | widestring_05EC5B `[TPL:6][TPL:F]Neil: I think things like[N]this are nice on occasion.[N]My heart is pounding like[N]when I'm inventing.[END]`
66 |
67 | -------------------------------------
68 | ?INCLUDE 'na4B_buried_tile'
69 | -------------------------------------
70 | widestring_05E6C0 `[TPL:D][DLY:0]Something like a tile is[N]buried in the sand…[FIN]As [NAM:0]'s flute touched it[N]something started to roar![END]`
71 |
72 | widestring_05E721 `[TPL:6][TPL:F]Neil: [NAM:0]…! Don't[N]investigate it yet! We[N]don't know whether there's[N]something there…!![END]`
73 |
74 | widestring_05E753 `[TPL:3][TPL:F][DLY:0][NAM:3]: Wah…! It looks like[N]something huge is[N]descending from above[N]us…!![END]`
75 |
76 | widestring_05E774 `[TPL:1][TPL:D][DLY:0][NAM:1]: Aah…! [NAM:0]…!![N][NAM:0]…!!![PAU:28][CLD]`
77 |
78 | widestring_05E811 `[TPL:0][TPL:F][NAM:0]: Since the Nazca[N]plain seems to be wide, I[N]guess I shouldn't go very[N]far…[END]`
79 |
80 |
--------------------------------------------------------------------------------
/modules/base/patches/chapter14.asm:
--------------------------------------------------------------------------------
1 | ;CHAPTER 14
2 |
3 | -----------------------------------------------
4 | ?INCLUDE 'dm3E_intro'
5 | -----------------------------------------------
6 | widestring_05F9DE `[TPL:0][TPL:A][NAM:0]: It had fallen to an[N]eerie silence inside of[N]the mine.[FIN][TPL:B]But the screams of the[N]slaves could sometimes be[N]heard from the direction[N]of the cave's depths.[FIN]It sent shivers down my[N]spine…[END]`
7 |
8 | -----------------------------------------------
9 | ?INCLUDE 'dm3F_elevator_sign'
10 | -----------------------------------------------
11 | widestring_05D6BE `[BOR:1][TPL:F](Lift platform entrance)[N]Head through the gate[N]there if you're going to[N]the lift.[END]`
12 |
13 | -----------------------------------------------
14 | ?INCLUDE 'dm3F_elevator_door'
15 | -----------------------------------------------
16 | widestring_05D676 `[TPL:D]There seems to be one[N]keyhole on this gate.[END]`
17 |
18 | -----------------------------------------------
19 | ?INCLUDE 'dm3F_laborer'
20 | -----------------------------------------------
21 | widestring_0AA97D `[TPL:16][TPL:E]Myself included, there are[N]eight slaves working in[N]this mine.[FIN]Please save them somehow.[END]`
22 |
23 | widestring_0AA791 `[TPL:16][TPL:D]Slave: I'm begging you![N]Please cut this chain!![END]`
24 |
25 | widestring_0AA874 `[TPL:16][TPL:E]Thank you for saving me.[N]To show my thanks, I'll[N]tell you something good.[FIN][TPL:F]This mine has hidden[N]rooms; their entrances[N]aren't distinct from the[N]walls.[FIN]But a draft blows out of[N]the cracks in the[N]entrances.[FIN]They say that you can[N]find them if you pay[N]attention.[FIN][TPL:10]Although, with flowing[N]hair like yours, you'll[N]probably know immediately[N]when it starts to flutter,[N]huh?[END]`
26 |
27 | -----------------------------------------------
28 | ?INCLUDE 'dm40_trapped_slave'
29 | -----------------------------------------------
30 | widestring_05D819 `[TPL:16][TPL:D]Thank you very much. I was[N]buried alive in a cave-in…[FIN][TPL:E]How would it have turned[N]out if you came just a bit[N]later…[FIN][TPL:F]Please take a modest[N]present from me. I'll send[N]3 Red Jewels to Mr. Jewel[N]Merchant later, okay?[END]`
31 |
32 | -----------------------------------------------
33 | ?INCLUDE 'sE6_gaia'
34 | -----------------------------------------------
35 | widestring_08EBB2 `Dark [NAM:10]`
36 |
37 | widestring_08E1EE `[PRT:@widestring_08DE96]Enemies that thy sword[N]cannot reach can be[N]defeated with [NAM:11]'s[N]power, Dark [NAM:10].[FIN]If thou defeat all[N]enemies, the road can[N]always be opened.[FIN][RET]`
38 |
39 | widestring_08ED6D `Dark [NAM:10] is a Power of[N]Darkness that is only[N]usable by [NAM:11], the[N]Warrior of Darkness.[FIN]By shooting aura power,[N]thou canst incinerate[N]enemies that are far from[N]thee.[FIN]Thou canst charge up with[N]the attack button…`
40 |
41 | widestring_0AA811 `[TPL:16][TPL:F]There are people who have[N]been put to work even in[N]the depths of the diamond[N]mine.[FIN]Please use this key and[N]save them somehow.[FIN]`
42 |
43 | widestring_0AA85C `[CLR][SFX:0][DLY:9]Got the lift key![PAU:D0][END]`
44 |
45 | widestring_05D696 `[TPL:D]Used the lift platform[N]key![END]`
46 |
47 | -----------------------------------------------
48 | ?INCLUDE 'dm44_cell_door'
49 | -----------------------------------------------
50 | widestring_05D593 `[TPL:D]There seems to be two[N]keyholes on this gate.[END]`
51 |
52 | -----------------------------------------------
53 | ?INCLUDE 'dm45_key'
54 | -----------------------------------------------
55 | widestring_05D4EB `[TPL:C][SFX:0][DLY:9]Found the key to the mine![PAU:D0][END]`
56 |
57 | widestring_0AA7B4 `[TPL:16][TPL:E]Slave: T-thank you!! I[N]will never forget this[N]favour.[FIN]Please take this key.[FIN]`
58 |
59 | widestring_0AA7EF `[CLR][SFX:0][DLY:9]You [LU1:98]the[N]key to the mine![PAU:FF][END]`
60 |
61 | widestring_05D5AC `[TPL:F]I guess the door most[N]likely can't be opened if[N]both the locks aren't both[N]unlocked…[END]`
62 |
63 | widestring_05D5D1 `[TPL:F]I have both keys…[N]Put in the keys?[N] Yes[N] No`
64 |
65 | widestring_05D5FF `[CLR]The key turns with[N]a [LU1:C7]sound.[END]`
66 |
67 | -----------------------------------------------
68 | ?INCLUDE 'dm47_remus'
69 | -----------------------------------------------
70 | widestring_05D193 `[TPL:5][TPL:D][NAM:B]: Please cut the[N]chain somehow…![END]`
71 |
72 | widestring_05D1AE `[TPL:5][TPL:F][NAM:B]: Thank you. We[N]were born in a village[N]from a distant, far away[N]place across the ocean.[FIN]If you ever visit there,[N]please help the villagers.[END]`
73 |
74 | -----------------------------------------------
75 | ?INCLUDE 'dm47_imas'
76 | -----------------------------------------------
77 | widestring_05D0C9 `[TPL:5][TPL:D][NAM:C]: Please cut the[N]chain somehow…![END]`
78 |
79 | widestring_05D0E3 `[TPL:5][TPL:C][NAM:C]: Thank you.[FIN][TPL:F]In the village where we[N]were born, something[N]strange is happening to[N]all the animals.[FIN]Afterward, we found that[N]other strange things were[N]happening;[FIN]…people turning to stone,[N]even people dying from[N]unknown diseases…[END]`
80 |
81 | -----------------------------------------------
82 | ?INCLUDE 'dm47_sam'
83 | -----------------------------------------------
84 | widestring_05D2C0 `[TPL:5][TPL:D][NAM:A]: Please cut the[N]chain somehow…![END]`
85 |
86 | widestring_05D2DA `[TPL:5][TPL:C][NAM:A]: Thank you.[FIN][TPL:F]I heard it from [NAM:3]; one[N]of your companions is[N]suffering from amnesia,[N]right?[FIN]There is a song that has[N]been passed down in our[N]tribe since long ago which[N]aids memory.[FIN]Please listen to this[N]song.[FIN][CLD][TPL:D][NAM:A] hummed a[N]mysterious melody.[END]`
87 |
88 | widestring_05D40C `[TPL:D]Learned the Melody of[N]Memories![FIN][TPL:5][TPL:D][NAM:A]: I do have one[N]request…[FIN][TPL:E]I would gladly take the[N]prison key so that I can[N]remember meeting you.[FIN]I expect that you probably[N]won't be using it from[N]now, after all.[END]`
89 |
90 | widestring_05D377 `[TPL:D]Learned the Melody of[N]Memories![FIN][TPL:5][TPL:D][NAM:A]: I do have one[N]request…[FIN][TPL:F]I would gladly take the[N]prison key and Wind's[N]Melody so that I can[N]remember meeting you.[FIN]I expect that you probably[N]won't be using them from[N]now, after all.[END]`
91 |
92 | widestring_05D48E `[TPL:5][TPL:D]I won't forget you for my[N]entire life.[END]`
93 |
--------------------------------------------------------------------------------
/modules/base/patches/StringProcessing.asm:
--------------------------------------------------------------------------------
1 | ?BANK 03
2 |
3 | ?INCLUDE 'chunk_03BAE1'
4 | ?INCLUDE 'templates_01CA95'
5 | ?INCLUDE 'SwitchNameDictionary'
6 |
7 | !scene_next 0642
8 | !scene_current 0644
9 | !advance_button_mask C080
10 | !default_background 0000
11 | !border_state 09F8
12 | !default_bg 0C03
13 | !default_fg 7FFB
14 | !default_dt 762F
15 |
16 | --------------------------------------------------------
17 |
18 | border_lookup [
19 | &dlg_borders_03E4CE
20 | &border_index_1
21 | &border_index_2
22 | &border_index_3
23 | &border_index_4
24 | &border_index_5
25 | &border_index_6
26 | &border_index_7
27 | &border_index_8
28 | &border_index_9
29 | &border_index_A
30 | &border_index_B
31 | &border_index_C
32 | &border_index_D
33 | ]
34 |
35 | border_index_1 #1320142013601520156013A014A013E0
36 | border_index_2 #1620172016601820186016A017A016E0
37 | border_index_3 #19201A2019601B201B6019A01AA019E0
38 | border_index_4 #A320A420A360A520A560A3A0A4A0A3E0
39 | border_index_5 #A620A720A6601C201C60A6A0A7A0A6E0
40 | border_index_6 #A020A120A060A220A260A0A0A1A0A0E0
41 | border_index_7 #B020B120B060B220B260B0A0B1A0B0E0
42 | border_index_8 #B320B420B360B520B560B3A0B4A0B3E0
43 | border_index_9 #B620B720B660B820B860B6A0B7A0B6E0
44 | border_index_A #B920BA20B960BB20BB60B9A0BAA0B9E0
45 | border_index_B #A920AA20A960AB20AB60A9A0AAA0A9E0
46 | border_index_C #C920CA20C960CB20CB60C9A0CAA0C9E0
47 | border_index_D #C620C720C660C820C860C6A0C7A0C6E0
48 |
49 | ----------------------------------------------------
50 | ;Command for setting current border id
51 |
52 | cmd_d9 {
53 | LDA $0000, Y
54 | AND #$00FF
55 | STA $border_state
56 | INY
57 | RTS
58 | }
59 |
60 | ----------------------------------------------------
61 | ;Command for using name dictionaries
62 |
63 | cmd_dA {
64 | JSL name_dictionary_command
65 | RTS
66 | }
67 |
68 | ----------------------------------------------------
69 |
70 | wide_cmd_table_03E2C3 [
71 | &cmd_c0_03E2F5 ;00
72 | &cmd_c1_03E30F ;01
73 | &cmd_c2_03E335 ;02
74 | &cmd_c3_03E35B ;03
75 | &cmd_c4_03E36B ;04
76 | &cmd_c5_03E36F ;05
77 | &cmd_c6_03E393 ;06
78 | &cmd_c7_03E43F ;07
79 | &cmd_c8_03E579 ;08
80 | &cmd_c9_03E5EB ;09
81 | &code_03E307 ;0A
82 | &cmd_cb_03E5F8 ;0B
83 | &cmd_cc_03E61E ;0C
84 | &cmd_cd_03E636 ;0D
85 | &cmd_ce_03E656 ;0E
86 | &cmd_cf_03E6A4 ;0F
87 | &cmd_d0_03E6D2 ;10
88 | &cmd_d1_03E6E7 ;11
89 | &cmd_d2_03E6EC ;12
90 | &cmd_d3_03E6F7 ;13
91 | &cmd_d4_03E721 ;14
92 | &cmd_d5_03E736 ;15
93 | &cmd_d6_03E743 ;16
94 | &cmd_d7_03E769 ;17
95 | &cmd_d8_03E78F ;18
96 | &cmd_d9
97 | &cmd_dA
98 | ]
99 |
100 |
101 | ----------------------------------------------------
102 | ;Entry point for command 7 (setting up dialog borders)
103 |
104 | code_03E453 {
105 | PHY
106 | PHX
107 | ;LDA $0B04 --Don't reset print delay
108 | ;STA $007E
109 | ;LDA #$0010 --Don't reset sfx
110 | ;STA $0996
111 | STZ $00DC
112 | STZ $099C
113 | LDA $097A
114 | STA $097E
115 | LDA $097C
116 | STA $0980
117 | XBA
118 | LSR
119 | LSR
120 | CLC
121 | ADC $097A
122 | CLC
123 | ADC $097A
124 | STA $099A
125 | ;STZ $0986 --Don't reset palette offset
126 |
127 | LDA $border_state
128 | ;AND #$0003
129 | ASL
130 | TAX
131 | LDA @border_lookup, X
132 | STA $3E
133 | LDA #*border_lookup
134 | STA $40
135 |
136 | ;LDA #$*dlg_borders_03E4CE
137 | ;STA $40
138 | ;LDA #$&dlg_borders_03E4CE
139 | ;STA $3E
140 |
141 | LDA $0982
142 | ASL
143 | STA $18
144 | PHA
145 | LDA $0984
146 | ASL
147 | STA $1C
148 | LDA $0998
149 | DEC
150 | DEC
151 | SEC
152 | SBC #$0040
153 | STA $00
154 | TAX
155 | JSR $&sub_03E4DE
156 | PLX
157 | PHX
158 | STX $18
159 | JSR $&sub_03E505
160 | PLY
161 | STY $18
162 | JSR $&sub_03E4DE
163 | LDA #$0001
164 | TSB $09EC
165 | LDA $scene_current
166 | AND #$00FF
167 | CMP #$00FA
168 | BEQ code_03E4CB
169 | JSR $&sub_03E7B2
170 | }
171 |
172 | ----------------------------------------------------
173 | ;Entry point for command 8 (clear dialog) to support border styles
174 |
175 | code_03E59F {
176 | STA $7F0200, X
177 | INX
178 | INX
179 | DEC $18
180 | BPL code_03E59F
181 | LDA $00
182 | STA $18
183 | LDA $099A
184 | CLC
185 | ADC #$0040
186 | STA $099A
187 | TAX
188 | DEC $1C
189 | BPL code_03E59C
190 |
191 | LDA #$0010
192 | STA $0996
193 |
194 | LDA $0B04 --Reset print delay
195 | STA $007E
196 |
197 | STZ $border_state --Reset border state
198 | STZ $0986 --Reset font palette
199 |
200 | LDA $@fx_palette_198040+2 --Also reset font colors
201 | STA $7F0A02
202 | LDA $@fx_palette_198040+4
203 | STA $7F0A04
204 | LDA $@fx_palette_198040+6
205 | STA $7F0A06
206 | LDA $@fx_palette_198040+22
207 | STA $7F0A22
208 | LDA $@fx_palette_198040+24
209 | STA $7F0A24
210 | LDA $@fx_palette_198040+26
211 | STA $7F0A26
212 |
213 | ;PHX
214 | ;LDX #$0022
215 | ;LDA #$675D
216 | ;STA $7F0A00, X
217 | ;LDA #$10F2
218 | ;STA $7F0A02, X
219 | ;LDA #$0000
220 | ;STA $7F0A04, X
221 | ;PLX
222 |
223 | LDA #$0001
224 | TSB $09EC
225 | ;JSR $&sub_03E7B2 --This prevents a flicker due to forced redraw
226 | LDX $0998
227 | STX $099A
228 | STZ $099C
229 | PLB
230 | PLY
231 | RTS
232 | }
233 |
234 | ------------------------------------
235 |
236 | cmd_cf_03E6A4 {
237 | LDA #$advance_button_mask
238 | TSB $0658
239 |
240 | code_03E6AA:
241 | JSR $&sub_03E7B2
242 | LDA $0656
243 | AND #$advance_button_mask
244 | BNE code_03E6C1
245 | SEC
246 | JSR $&sub_03E80C
247 | LDA #$0001
248 | TSB $09EC
249 | BRA code_03E6AA
250 | }
251 |
252 | ---------------------------------------------
253 |
254 | cmd_d0_03E6D2 {
255 | LDA #$advance_button_mask
256 | TSB $0658
257 |
258 | code_03E6D8:
259 | JSR $&sub_03E7B2
260 | LDA $0656
261 | AND #$advance_button_mask
262 | BEQ code_03E6D8
263 | STA $0658
264 | RTS
265 | }
--------------------------------------------------------------------------------
/modules/plain-borders/patches/StringProcessing.asm:
--------------------------------------------------------------------------------
1 | ?BANK 03
2 |
3 | ?INCLUDE 'chunk_03BAE1'
4 | ?INCLUDE 'templates_01CA95'
5 | ?INCLUDE 'SwitchNameDictionary'
6 |
7 | !scene_next 0642
8 | !scene_current 0644
9 | !advance_button_mask C080
10 | !default_background 0000
11 | !border_state 09F8
12 | !default_bg 0C03
13 | !default_fg 7FFB
14 | !default_dt 762F
15 |
16 | --------------------------------------------------------
17 |
18 | border_lookup [
19 | &dlg_borders_03E4CE
20 | &border_index_1
21 | &border_index_2
22 | &border_index_3
23 | &border_index_4
24 | &border_index_5
25 | &border_index_6
26 | &border_index_7
27 | &border_index_8
28 | &border_index_9
29 | &border_index_A
30 | &border_index_B
31 | &border_index_C
32 | &border_index_D
33 | ]
34 |
35 | border_index_1 #1320142013601520156013A014A013E0
36 | border_index_2 #1620172016601820186016A017A016E0
37 | border_index_3 #19201A2019601B201B6019A01AA019E0
38 | border_index_4 #A320A420A360A520A560A3A0A4A0A3E0
39 | border_index_5 #A620A720A6601C201C60A6A0A7A0A6E0
40 | border_index_6 #A020A120A060A220A260A0A0A1A0A0E0
41 | border_index_7 #B020B120B060B220B260B0A0B1A0B0E0
42 | border_index_8 #B320B420B360B520B560B3A0B4A0B3E0
43 | border_index_9 #B620B720B660B820B860B6A0B7A0B6E0
44 | border_index_A #B920BA20B960BB20BB60B9A0BAA0B9E0
45 | border_index_B #A920AA20A960AB20AB60A9A0AAA0A9E0
46 | border_index_C #C920CA20C960CB20CB60C9A0CAA0C9E0
47 | border_index_D #C620C720C660C820C860C6A0C7A0C6E0
48 |
49 | ----------------------------------------------------
50 | ;Command for setting current border id
51 |
52 | cmd_d9 {
53 | LDA $0000, Y
54 | AND #$00FF
55 | STA $border_state
56 | INY
57 | RTS
58 | }
59 |
60 | ----------------------------------------------------
61 | ;Command for using name dictionaries
62 |
63 | cmd_dA {
64 | JSL name_dictionary_command
65 | RTS
66 | }
67 |
68 | ----------------------------------------------------
69 |
70 | wide_cmd_table_03E2C3 [
71 | &cmd_c0_03E2F5 ;00
72 | &cmd_c1_03E30F ;01
73 | &cmd_c2_03E335 ;02
74 | &cmd_c3_03E35B ;03
75 | &cmd_c4_03E36B ;04
76 | &cmd_c5_03E36F ;05
77 | &cmd_c6_03E393 ;06
78 | &cmd_c7_03E43F ;07
79 | &cmd_c8_03E579 ;08
80 | &cmd_c9_03E5EB ;09
81 | &code_03E307 ;0A
82 | &cmd_cb_03E5F8 ;0B
83 | &cmd_cc_03E61E ;0C
84 | &cmd_cd_03E636 ;0D
85 | &cmd_ce_03E656 ;0E
86 | &cmd_cf_03E6A4 ;0F
87 | &cmd_d0_03E6D2 ;10
88 | &cmd_d1_03E6E7 ;11
89 | &cmd_d2_03E6EC ;12
90 | &cmd_d3_03E6F7 ;13
91 | &cmd_d4_03E721 ;14
92 | &cmd_d5_03E736 ;15
93 | &cmd_d6_03E743 ;16
94 | &cmd_d7_03E769 ;17
95 | &cmd_d8_03E78F ;18
96 | &cmd_d9
97 | &cmd_dA
98 | ]
99 |
100 |
101 | ----------------------------------------------------
102 | ;Entry point for command 7 (setting up dialog borders)
103 |
104 | code_03E453 {
105 | PHY
106 | PHX
107 | ;LDA $0B04 --Don't reset print delay
108 | ;STA $007E
109 | ;LDA #$0010 --Don't reset sfx
110 | ;STA $0996
111 | STZ $00DC
112 | STZ $099C
113 | LDA $097A
114 | STA $097E
115 | LDA $097C
116 | STA $0980
117 | XBA
118 | LSR
119 | LSR
120 | CLC
121 | ADC $097A
122 | CLC
123 | ADC $097A
124 | STA $099A
125 | ;STZ $0986 --Don't reset palette offset
126 |
127 | ;LDA $border_state
128 |
129 | ;ASL
130 | ;TAX
131 | ;LDA @border_lookup, X
132 | ;STA $3E
133 | ;LDA #*border_lookup
134 | ;STA $40
135 |
136 | LDA #$*dlg_borders_03E4CE
137 | STA $40
138 | LDA #$&dlg_borders_03E4CE
139 | STA $3E
140 |
141 | LDA $0982
142 | ASL
143 | STA $18
144 | PHA
145 | LDA $0984
146 | ASL
147 | STA $1C
148 | LDA $0998
149 | DEC
150 | DEC
151 | SEC
152 | SBC #$0040
153 | STA $00
154 | TAX
155 | JSR $&sub_03E4DE
156 | PLX
157 | PHX
158 | STX $18
159 | JSR $&sub_03E505
160 | PLY
161 | STY $18
162 | JSR $&sub_03E4DE
163 | LDA #$0001
164 | TSB $09EC
165 | LDA $scene_current
166 | AND #$00FF
167 | CMP #$00FA
168 | BEQ code_03E4CB
169 | JSR $&sub_03E7B2
170 | }
171 |
172 | ----------------------------------------------------
173 | ;Entry point for command 8 (clear dialog) to support border styles
174 |
175 | code_03E59F {
176 | STA $7F0200, X
177 | INX
178 | INX
179 | DEC $18
180 | BPL code_03E59F
181 | LDA $00
182 | STA $18
183 | LDA $099A
184 | CLC
185 | ADC #$0040
186 | STA $099A
187 | TAX
188 | DEC $1C
189 | BPL code_03E59C
190 |
191 | LDA #$0010
192 | STA $0996
193 |
194 | LDA $0B04 --Reset print delay
195 | STA $007E
196 |
197 | STZ $border_state --Reset border state
198 | STZ $0986 --Reset font palette
199 |
200 | LDA $@fx_palette_198040+2 --Also reset font colors
201 | STA $7F0A02
202 | LDA $@fx_palette_198040+4
203 | STA $7F0A04
204 | LDA $@fx_palette_198040+6
205 | STA $7F0A06
206 | LDA $@fx_palette_198040+22
207 | STA $7F0A22
208 | LDA $@fx_palette_198040+24
209 | STA $7F0A24
210 | LDA $@fx_palette_198040+26
211 | STA $7F0A26
212 |
213 | ;PHX
214 | ;LDX #$0022
215 | ;LDA #$675D
216 | ;STA $7F0A00, X
217 | ;LDA #$10F2
218 | ;STA $7F0A02, X
219 | ;LDA #$0000
220 | ;STA $7F0A04, X
221 | ;PLX
222 |
223 | LDA #$0001
224 | TSB $09EC
225 | ;JSR $&sub_03E7B2 --This prevents a flicker due to forced redraw
226 | LDX $0998
227 | STX $099A
228 | STZ $099C
229 | PLB
230 | PLY
231 | RTS
232 | }
233 |
234 | ------------------------------------
235 |
236 | cmd_cf_03E6A4 {
237 | LDA #$advance_button_mask
238 | TSB $0658
239 |
240 | code_03E6AA:
241 | JSR $&sub_03E7B2
242 | LDA $0656
243 | AND #$advance_button_mask
244 | BNE code_03E6C1
245 | SEC
246 | JSR $&sub_03E80C
247 | LDA #$0001
248 | TSB $09EC
249 | BRA code_03E6AA
250 | }
251 |
252 | ---------------------------------------------
253 |
254 | cmd_d0_03E6D2 {
255 | LDA #$advance_button_mask
256 | TSB $0658
257 |
258 | code_03E6D8:
259 | JSR $&sub_03E7B2
260 | LDA $0656
261 | AND #$advance_button_mask
262 | BEQ code_03E6D8
263 | STA $0658
264 | RTS
265 | }
--------------------------------------------------------------------------------
/modules/base/patches/ExpandedOverworldRoutes.asm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ------------------------------------------
6 | ?INCLUDE 'overworld_options'
7 | ------------------------------------------
8 |
9 | overworld_options [
10 | &code_03B44F ;00
11 | &code_03B451 ;01
12 | &code_03B47D ;02
13 | &code_03B4A8 ;03
14 | &code_03B4CC ;04
15 | &code_03B4F0 ;05
16 | &code_03B51A ;06
17 | &code_03B53F ;07
18 | &code_03B563 ;08
19 | &code_03B587 ;09
20 | &code_03B5A1 ;0A
21 | &code_03B5C7 ;0B
22 | &code_03B5F2 ;0C
23 | &code_03B62A ;0D
24 | &code_03B650 ;0E
25 | &code_03B697 ;0F
26 | &code_03B6BD ;10
27 | &code_03B6F3 ;11
28 | &code_03B719 ;12
29 | &code_03B73F ;13
30 | &code_03B778 ;14
31 | &code_03B7A5 ;15
32 | &code_03B7B5 ;16
33 | &code_03B7E2 ;17
34 | &code_03B81A ;18
35 | &code_03B843 ;19
36 | &code_03B88C ;1A
37 | &code_03B8D6 ;1B
38 | &euro_full_options ;1C
39 | &code_03B8EC ;1D
40 | &code_03B8F2 ;1E
41 | &code_03B8F8 ;1F
42 | &code_03B8FE ;20
43 | &code_03B904 ;21
44 | &code_03B90A ;22
45 | &code_03B910 ;23
46 | &code_03B916 ;24
47 | &code_03B91C ;25
48 | &code_03B922 ;26
49 | ]
50 |
51 |
52 |
53 |
54 | -----------------
55 | ;Dao to Euro
56 | -----------------
57 |
58 | code_03B7E2 {
59 | COP [BF] ( &widestring_03B7F6 )
60 | COP [BE] ( #42, #01, &code_list_03B7EE )
61 | COP [C5]
62 | }
63 |
64 |
65 | code_list_03B7EE [
66 | &code_03BAC5 ;00
67 | &code_03BAC5 ;01
68 | &dao_euro_trip
69 | &code_03BAB1 ;03
70 | &code_03BAA1 ;02
71 | ]
72 |
73 | dao_euro_trip {
74 | COP [67] ( #00, #26 )
75 | }
76 |
77 |
78 | dao_euro_warp {
79 | COP [26] ( #91, #$03D0, #$0430, #06, #$5400 )
80 | COP [C5]
81 | }
82 |
83 | widestring_03B7F6 `[TPL:11][SFX:0] [LU1:42] [LU1:3F][N] Euro City Natives' Vil.`
84 |
85 | -----------------
86 | ;Euro to Dao
87 | -----------------
88 |
89 | euro_full_options {
90 | COP [BF] ( &euro_full_option_str )
91 | COP [BE] ( #53, #00, &euro_full_option_list )
92 | COP [C5]
93 | }
94 |
95 |
96 | euro_full_option_list [
97 | &code_03BA1F ;00
98 | &code_03BA1F ;01
99 | &code_03BA2B ;02
100 | &code_03BA41 ;03
101 | &euro_dao_trip
102 | &code_03BA61 ;04
103 | ]
104 |
105 | euro_dao_trip {
106 | COP [67] ( #00, #27 )
107 | }
108 |
109 | euro_dao_warp {
110 | COP [26] ( #C3, #$0010, #$00E0, #07, #$2300 )
111 | COP [C5]
112 | }
113 |
114 | euro_full_option_str `[DLG:2,14][SIZ:E,3][SFX:0] Quit Dao[N] Watermia Natives' Vil.[N] Mt.Temple (Where to?)`
115 |
116 | ------------------------------------------
117 | ?INCLUDE 'overworld_exit'
118 | ------------------------------------------
119 |
120 | code_00CC56 {
121 | COP [D0] ( #B6, #01, &euro_dao_option_switch )
122 | COP [D0] ( #AC, #01, &code_00CC82 )
123 | COP [D0] ( #9F, #01, &code_00CC72 )
124 | LDA #$0000
125 | STA $0D60
126 | COP [66] ( #$01D4, #$0134, #0F )
127 | JMP $&code_00CAC1
128 | }
129 |
130 | euro_dao_option_switch {
131 | LDA #$0000
132 | STA $0D60
133 | COP [66] ( #$01D4, #$0134, #1C )
134 | JMP $&code_00CAC1
135 | }
136 |
137 | -----------------------
138 | ;Itory to South Cape
139 | -----------------------
140 |
141 | code_03B51A {
142 | COP [BF] ( &widestring_03B52C )
143 | COP [BE] ( #32, #01, &code_list_03B526 )
144 | COP [C5]
145 | }
146 |
147 |
148 | code_list_03B526 [
149 | &code_03B999
150 | &code_03B999
151 | &code_03B9A5
152 | &code_03B985
153 | ]
154 |
155 | widestring_03B52C `[TPL:11][SFX:0] Quit South Cape[N] [LU1:1E]Ruins`
156 |
157 |
158 | ------------------------------------------
159 | ?INCLUDE 'overworld_routes'
160 | ------------------------------------------
161 | ;New routes
162 |
163 | overworld_routes [
164 | &motion_03ADC3 ;00
165 | &motion_03ADC3 ;01
166 | &motion_03ADD8 ;02
167 | &motion_03ADF1 ;03
168 | &motion_03AE06 ;04
169 | &motion_03AE23 ;05
170 | &motion_03AE38 ;06
171 | &motion_03AE5D ;07
172 | &motion_03AE76 ;08
173 | &motion_03AE9B ;09
174 | &motion_03AEA0 ;0A
175 | &motion_03AEBD ;0B
176 | &motion_03AEDA ;0C
177 | &motion_03AEEB ;0D
178 | &motion_03AF10 ;0E
179 | &motion_03AF2D ;0F
180 | &motion_03AF42 ;10
181 | &motion_03AF5F ;11
182 | &motion_03AF9C ;12
183 | &motion_03AFBD ;13
184 | &motion_03AFCE ;14
185 | &motion_03AFEB ;15
186 | &motion_03B00C ;16
187 | &motion_03B02D ;17
188 | &motion_03B046 ;18
189 | &motion_03B063 ;19
190 | &motion_03B080 ;1A
191 | &motion_03B09D ;1B
192 | &motion_03B0AE ;1C
193 | &motion_03B0C7 ;1D
194 | &motion_03B0E0 ;1E
195 | &motion_03B0F5 ;1F
196 | &motion_03B10E ;20
197 | &motion_03B12F ;21
198 | &motion_03B154 ;22
199 | &motion_03B17D ;23
200 | &motion_03B19E ;24
201 | &motion_03B1BF ;25
202 | &dao_euro_sequence ;26
203 | &euro_dao_sequence ;27
204 | &watermia_freejia_sequence ;28
205 | &freejia_watermia_sequence ;29
206 | &south_cape_freejia_sequence ;2A
207 | &freejia_south_cape_sequence ;2B
208 | ]
209 |
210 | dao_euro_sequence [
211 | motion < #00, #00, #02, #80 >
212 | motion < #01, #00, #00, #C0 >
213 | motion < #00, #00, #02, #40 >
214 | motion < #01, #01, #00, #20 >
215 | motion < #00, #00, #01, #40 >
216 | motion < #01, #00, #00, #5E >
217 | motion < #00, #00, #01, #80 >
218 | ]
219 |
220 | euro_dao_sequence [
221 | motion < #00, #00, #01, #80 >
222 | motion < #02, #00, #00, #5E >
223 | motion < #00, #00, #02, #40 >
224 | motion < #02, #02, #00, #20 >
225 | motion < #00, #00, #01, #40 >
226 | motion < #02, #00, #00, #C0 >
227 | motion < #00, #00, #02, #80 >
228 | ]
229 |
230 | watermia_freejia_sequence [
231 | motion < #00, #00, #03, #80 >
232 | motion < #00, #01, #00, #30 >
233 | motion < #00, #00, #02, #28 >
234 | motion < #02, #03, #00, #80 >
235 | motion < #00, #00, #04, #6C >
236 | ]
237 |
238 | freejia_watermia_sequence [
239 | motion < #00, #00, #02, #28 >
240 | motion < #01, #04, #00, #80 >
241 | motion < #00, #00, #01, #28 >
242 | motion < #00, #02, #00, #2C >
243 | ]
244 |
245 | south_cape_freejia_sequence [
246 | motion < #00, #00, #02, #58 >
247 | motion < #03, #02, #00, #BF >
248 | motion < #00, #00, #01, #58 >
249 | motion < #00, #02, #00, #12 >
250 | ]
251 |
252 | freejia_south_cape_sequence [
253 | motion < #00, #00, #03, #80 >
254 | motion < #00, #01, #00, #12 >
255 | motion < #00, #00, #02, #58 >
256 | motion < #04, #01, #00, #BF >
257 | motion < #00, #00, #04, #54 >
258 | ]
--------------------------------------------------------------------------------
/site/src/components/RomFilePicker.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef } from 'react';
2 | import { crc32_buffer } from '@gaialabs/shared';
3 | import { RomValidationResult } from '../types';
4 | import './RomFilePicker.css';
5 |
6 | interface RomFilePickerProps {
7 | expectedCrc?: number;
8 | onFileValidated: (file: File, romData: Uint8Array) => void;
9 | onValidationError: (error: string) => void;
10 | }
11 |
12 | export function RomFilePicker({ expectedCrc, onFileValidated, onValidationError }: RomFilePickerProps) {
13 | const [selectedFile, setSelectedFile] = useState(null);
14 | const [validationResult, setValidationResult] = useState(null);
15 | const [isValidating, setIsValidating] = useState(false);
16 | const fileInputRef = useRef(null);
17 |
18 | const validateRomFile = async (file: File): Promise => {
19 | try {
20 | // Read file as array buffer
21 | const arrayBuffer = await file.arrayBuffer();
22 | const romData = new Uint8Array(arrayBuffer);
23 |
24 | // Calculate CRC32
25 | const actualCrc = crc32_buffer(romData);
26 |
27 | // Check if we have an expected CRC to validate against
28 | if (expectedCrc !== undefined) {
29 | const isValid = actualCrc === expectedCrc;
30 | return {
31 | isValid,
32 | expectedCrc,
33 | actualCrc,
34 | error: isValid ? undefined : `CRC mismatch. Expected: ${expectedCrc}, Got: ${actualCrc}`
35 | };
36 | } else {
37 | // If no expected CRC, just return the calculated CRC
38 | return {
39 | isValid: true,
40 | expectedCrc: actualCrc,
41 | actualCrc
42 | };
43 | }
44 | } catch (error) {
45 | return {
46 | isValid: false,
47 | expectedCrc: expectedCrc || 0,
48 | error: `Failed to read ROM file: ${error instanceof Error ? error.message : 'Unknown error'}`
49 | };
50 | }
51 | };
52 |
53 | const handleFileSelect = async (event: React.ChangeEvent) => {
54 | const file = event.target.files?.[0];
55 | if (!file) {
56 | setSelectedFile(null);
57 | setValidationResult(null);
58 | return;
59 | }
60 |
61 | setSelectedFile(file);
62 | setIsValidating(true);
63 | setValidationResult(null);
64 |
65 | try {
66 | const result = await validateRomFile(file);
67 | setValidationResult(result);
68 |
69 | if (result.isValid) {
70 | // Re-read the file to pass the data to the parent
71 | const arrayBuffer = await file.arrayBuffer();
72 | const romData = new Uint8Array(arrayBuffer);
73 | onFileValidated(file, romData);
74 | } else {
75 | onValidationError(result.error || 'ROM validation failed');
76 | }
77 | } catch (error) {
78 | const errorMessage = `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`;
79 | setValidationResult({
80 | isValid: false,
81 | expectedCrc: expectedCrc || 0,
82 | error: errorMessage
83 | });
84 | onValidationError(errorMessage);
85 | } finally {
86 | setIsValidating(false);
87 | }
88 | };
89 |
90 | const handleClearFile = () => {
91 | setSelectedFile(null);
92 | setValidationResult(null);
93 | if (fileInputRef.current) {
94 | fileInputRef.current.value = '';
95 | }
96 | };
97 |
98 | const handleButtonClick = () => {
99 | fileInputRef.current?.click();
100 | };
101 |
102 | return (
103 |
104 |
Select ROM File
105 |
106 | Choose your original Illusion of Gaia ROM file (.smc, .sfc, or .bin format).
107 | {expectedCrc && ` The file will be validated against CRC32: ${expectedCrc}`}
108 |
109 |
110 |
111 |
119 |
120 | {selectedFile ? selectedFile.name : 'Choose ROM File...'}
121 |
122 | {selectedFile && (
123 |
124 | Clear
125 |
126 | )}
127 |
128 |
129 | {isValidating && (
130 |
131 | ⏳
132 | Validating ROM file...
133 |
134 | )}
135 |
136 | {validationResult && !isValidating && (
137 |
138 |
139 | {validationResult.isValid ? '✅' : '❌'}
140 |
141 |
142 | {validationResult.isValid ? (
143 |
144 |
ROM file is valid!
145 |
CRC32: {validationResult.actualCrc}
146 |
147 | ) : (
148 |
149 |
ROM validation failed
150 |
{validationResult.error}
151 | {validationResult.actualCrc && (
152 |
153 | Expected: {validationResult.expectedCrc}, Got: {validationResult.actualCrc}
154 |
155 | )}
156 |
157 | )}
158 |
159 |
160 | )}
161 |
162 | {selectedFile && validationResult?.isValid && (
163 |
164 |
File Information
165 |
166 | Name: {selectedFile.name}
167 | Size: {(selectedFile.size / 1024 / 1024).toFixed(2)} MB
168 | Type: {selectedFile.type || 'Unknown'}
169 | CRC32: {validationResult.actualCrc}
170 |
171 |
172 | )}
173 |
174 | );
175 | }
176 |
--------------------------------------------------------------------------------