From 3e2e1585d55ad304b2953bd844bbe3b140200f49 Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:57:41 +0100 Subject: [PATCH 01/17] Add New Hack Python Script --- scripts/new_hack.py | 42 ++++++++++++++++++++++++++++++++++++ tutorials/how_to_add_hack.md | 8 ++++--- 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 scripts/new_hack.py diff --git a/scripts/new_hack.py b/scripts/new_hack.py new file mode 100644 index 0000000..8d4dca6 --- /dev/null +++ b/scripts/new_hack.py @@ -0,0 +1,42 @@ +import shutil +import os +import sys + +def copy_template(destination_name, overwrite=False): + if destination_name == '.': + print(f"Cannot use '{destination_name}' as destination.") + return + + source = "./hacks/template" + destination = f"./hacks/{destination_name}" + patches_dir = os.path.join(destination, "patches") + + if not os.path.exists(source): + print(f"Source folder '{source}' does not exist.") + return + + if os.path.exists(destination): + if overwrite: + shutil.rmtree(destination) + print(f"Removing folder '{destination}' for overwrite.") + else: + print(f"Destination folder '{destination}' already exists. Use overwrite=True to replace it.") + return + + try: + shutil.copytree(source, destination) + os.makedirs(patches_dir, exist_ok=True) + print(f"ROM Patching Page created successfully at '{destination}'") + + except Exception as e: + print(f"Error copying folder: {e}") + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: python copy_folder.py [overwrite]") + else: + dest_name = sys.argv[1] + overwrite_flag = False + if len(sys.argv) >= 3: + overwrite_flag = sys.argv[2].lower() in ["true", "1", "yes"] + copy_template(dest_name, overwrite_flag) diff --git a/tutorials/how_to_add_hack.md b/tutorials/how_to_add_hack.md index 6c0c04b..9c517ad 100644 --- a/tutorials/how_to_add_hack.md +++ b/tutorials/how_to_add_hack.md @@ -20,8 +20,10 @@ Firstly we'll create your very own patching page, allowing information about you + └── patches.zip ``` ### Visuals -1. Duplicate the `hacks/template` folder and rename it to match the name of your game, **with no spaces**. - > Note: This will also be part of the pages URL. +1. First, you must create your ROM Patching folder. This can be done two ways: + - In the root of your fork, use the python script `python3 scripts/new_hack.py name` where `name` is your hack name **with no spaces**. + - Duplicate the `hacks/template` folder and rename it to match the name of your game, **with no spaces**. + > Note: Your hack name will also be part of the pages URL. 2. Inside your new folder, open `config.js` and edit it with your hack’s `title:` and the ROM `base:` used for your patches. 3. Within this same file, the `discord:`, `github:`, `pokécommunity:` and/or `reddit:` fields can be filled with links in order to display buttons for each on your patching page. 4. Add a high-resolution logo for your hack to your folder, named `logo.png`. This will appear at the top of your hack’s page. @@ -29,7 +31,7 @@ Firstly we'll create your very own patching page, allowing information about you 6. Open `color.css`. Changing the value of `--page-title-color`, will edit the title colour and `--page-bg-color` will change the background colour of the patching page. ### Patches & Info -1. Create a subfolder called `patches` within your patching page directory. +1. If it doesn't already exist, create a subfolder called `patches` within your patching page directory. 2. Place your patch files inside it. > Only `.bps`, `.ups` and `.xdelta` patches are able to be used. 3. Open the `patches.info` file, which contains details about each patch. From a7239e7f38b68eaa029ddef194f50d9a6522843a Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:15:55 +0100 Subject: [PATCH 02/17] Update Base ROM Text --- hacks/template/index.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hacks/template/index.html b/hacks/template/index.html index b05057f..1eadad3 100644 --- a/hacks/template/index.html +++ b/hacks/template/index.html @@ -99,8 +99,10 @@

{title}

The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. -->
- Base ROM:
- {base} + + Base ROM:
+ {base} +
From 657c753540a56fd56893861ee357f051ea4e8f56 Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:07:26 +0100 Subject: [PATCH 03/17] Refactor Anomaly Forest --- hacks/anomaly_forest/color.css | 1 + hacks/anomaly_forest/config.js | 11 ++ hacks/anomaly_forest/index.html | 188 ++++++++++++++++++++---------- hacks/anomaly_forest/info.md | 0 hacks/anomaly_forest/patches.info | 4 +- hacks/archiesquest/patches.info | 2 +- 6 files changed, 143 insertions(+), 63 deletions(-) create mode 100644 hacks/anomaly_forest/config.js create mode 100644 hacks/anomaly_forest/info.md diff --git a/hacks/anomaly_forest/color.css b/hacks/anomaly_forest/color.css index 3729580..9fc8a5d 100644 --- a/hacks/anomaly_forest/color.css +++ b/hacks/anomaly_forest/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/anomaly_forest/config.js b/hacks/anomaly_forest/config.js new file mode 100644 index 0000000..813281d --- /dev/null +++ b/hacks/anomaly_forest/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Anomaly Forest", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/anomaly_forest/index.html b/hacks/anomaly_forest/index.html index 5141e02..1eadad3 100644 --- a/hacks/anomaly_forest/index.html +++ b/hacks/anomaly_forest/index.html @@ -2,13 +2,10 @@ - - Anomaly Forest + - - @@ -19,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -62,35 +59,35 @@ - +
- Anomaly Forest logo -

Anomaly Forest

+ {title} Logo +

{title}

-
+
@@ -101,6 +98,12 @@

Anomaly Forest

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -148,23 +151,88 @@

Anomaly Forest

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file diff --git a/hacks/anomaly_forest/info.md b/hacks/anomaly_forest/info.md new file mode 100644 index 0000000..e69de29 diff --git a/hacks/anomaly_forest/patches.info b/hacks/anomaly_forest/patches.info index 77c9376..5a7dc66 100644 --- a/hacks/anomaly_forest/patches.info +++ b/hacks/anomaly_forest/patches.info @@ -4,8 +4,8 @@ { "file": "Pokemon - Anomaly Forest v1.1.bps", "name": "Anomaly Forest (v1.1)", - "description": "Pokémon Emerald (USA, Europe) Base ROM", - "outputName": "pokemon_anomaly_forest_v1.1" + "outputName": "pokemon_anomaly_forest_v1.1", + "description": "" } ] } \ No newline at end of file diff --git a/hacks/archiesquest/patches.info b/hacks/archiesquest/patches.info index 8953683..caa41a1 100644 --- a/hacks/archiesquest/patches.info +++ b/hacks/archiesquest/patches.info @@ -4,7 +4,7 @@ { "file": "ArchiesQuest_1.2.1.bps", "name": "Archies Quest v1.2.1", - "description": "Pokémon Emerald (USA, Europe) Base ROM", + "description": "", "outputName": "ArchiesQuest_v1.2.1" } ] From 6af4af21a001963b3800be69c375dc97a7c0695b Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:53:27 +0100 Subject: [PATCH 04/17] Refactor Archie's Quest --- hacks/anomaly_forest/patches.info | 4 +- hacks/archiesquest/color.css | 1 + hacks/archiesquest/config.js | 11 ++ hacks/archiesquest/index.html | 186 ++++++++++++++++++++---------- 4 files changed, 140 insertions(+), 62 deletions(-) create mode 100644 hacks/archiesquest/config.js diff --git a/hacks/anomaly_forest/patches.info b/hacks/anomaly_forest/patches.info index 5a7dc66..22aec3e 100644 --- a/hacks/anomaly_forest/patches.info +++ b/hacks/anomaly_forest/patches.info @@ -4,8 +4,8 @@ { "file": "Pokemon - Anomaly Forest v1.1.bps", "name": "Anomaly Forest (v1.1)", - "outputName": "pokemon_anomaly_forest_v1.1", - "description": "" + "description": "", + "outputName": "pokemon_anomaly_forest_v1.1" } ] } \ No newline at end of file diff --git a/hacks/archiesquest/color.css b/hacks/archiesquest/color.css index 3729580..9fc8a5d 100644 --- a/hacks/archiesquest/color.css +++ b/hacks/archiesquest/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/archiesquest/config.js b/hacks/archiesquest/config.js new file mode 100644 index 0000000..34c82c9 --- /dev/null +++ b/hacks/archiesquest/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Archie's Quest", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "https://github.com/RubyRaven6/archies-quest", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/archiesquest/index.html b/hacks/archiesquest/index.html index 56219e2..c36b0e5 100644 --- a/hacks/archiesquest/index.html +++ b/hacks/archiesquest/index.html @@ -2,12 +2,10 @@ - Archie's Quest Patcher Website + - - @@ -18,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -61,35 +59,35 @@ - +
- Archie's Quest Logo -

Archie's Quest

+ {title} Logo +

{title}

-
+
@@ -100,6 +98,12 @@

Archie's Quest

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -147,26 +151,88 @@

Archie's Quest

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file From 430a40c43611ac853f886bb57476f1c023953260 Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:27:02 +0100 Subject: [PATCH 05/17] Refactor Collapse Frostborne --- hacks/collapse_frostborne/color.css | 1 + hacks/collapse_frostborne/config.js | 11 ++ hacks/collapse_frostborne/index.html | 190 +++++++++++++++++-------- hacks/collapse_frostborne/info.md | 0 hacks/collapse_frostborne/patches.info | 2 +- 5 files changed, 141 insertions(+), 63 deletions(-) create mode 100644 hacks/collapse_frostborne/config.js create mode 100644 hacks/collapse_frostborne/info.md diff --git a/hacks/collapse_frostborne/color.css b/hacks/collapse_frostborne/color.css index 3729580..9fc8a5d 100644 --- a/hacks/collapse_frostborne/color.css +++ b/hacks/collapse_frostborne/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/collapse_frostborne/config.js b/hacks/collapse_frostborne/config.js new file mode 100644 index 0000000..62ee6d4 --- /dev/null +++ b/hacks/collapse_frostborne/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Pokémon Collapse: Frostborne", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/collapse_frostborne/index.html b/hacks/collapse_frostborne/index.html index 2fa3ecc..1eadad3 100644 --- a/hacks/collapse_frostborne/index.html +++ b/hacks/collapse_frostborne/index.html @@ -2,12 +2,10 @@ - Pokémon Collapse: Frostborne + - - @@ -18,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -61,38 +59,35 @@ - +
- - Collapse Frostborne Logo -

Pokémon Collapse: Frostborne

+ {title} Logo +

{title}

-
+
@@ -103,6 +98,12 @@

Pokémon Collapse: Frostborne

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -150,23 +151,88 @@

Pokémon Collapse: Frostborne

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file diff --git a/hacks/collapse_frostborne/info.md b/hacks/collapse_frostborne/info.md new file mode 100644 index 0000000..e69de29 diff --git a/hacks/collapse_frostborne/patches.info b/hacks/collapse_frostborne/patches.info index 5ff35b6..3a08d2e 100644 --- a/hacks/collapse_frostborne/patches.info +++ b/hacks/collapse_frostborne/patches.info @@ -4,7 +4,7 @@ { "file": "CollapseFrostborneTARC2_VER2.bps", "name": "Pokémon Collapse: Frostborne (English v2.0)", - "description": "Pokémon Emerald (USA, Europe) Base ROM", + "description": "", "outputName": "pokemon_frostbornecollapse_v2.0" } ] From 52f397cf95503e934b7894eeaa1e4118a947db43 Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:39:00 +0100 Subject: [PATCH 06/17] Refactor Fire Of Sky --- hacks/fire_of_sky/color.css | 1 + hacks/fire_of_sky/config.js | 11 ++ hacks/fire_of_sky/index.html | 186 ++++++++++++++++++++++----------- hacks/fire_of_sky/info.md | 0 hacks/fire_of_sky/patches.info | 2 +- hacks/fire_of_sky/patches.zip | Bin 19596841 -> 19596453 bytes 6 files changed, 138 insertions(+), 62 deletions(-) create mode 100644 hacks/fire_of_sky/config.js create mode 100644 hacks/fire_of_sky/info.md diff --git a/hacks/fire_of_sky/color.css b/hacks/fire_of_sky/color.css index 3729580..9fc8a5d 100644 --- a/hacks/fire_of_sky/color.css +++ b/hacks/fire_of_sky/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/fire_of_sky/config.js b/hacks/fire_of_sky/config.js new file mode 100644 index 0000000..b7dcd33 --- /dev/null +++ b/hacks/fire_of_sky/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Pokémon Fire of Sky", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "https://github.com/jschoeny/TARC2", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/fire_of_sky/index.html b/hacks/fire_of_sky/index.html index 27feeed..1eadad3 100644 --- a/hacks/fire_of_sky/index.html +++ b/hacks/fire_of_sky/index.html @@ -2,12 +2,10 @@ - Pokémon Fire of Sky + - - @@ -18,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -61,35 +59,35 @@ - +
- Pokémon Fire of Sky -

Pokémon Fire of Sky

+ {title} Logo +

{title}

-
+
@@ -100,6 +98,12 @@

Pokémon Fire of Sky

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -147,28 +151,88 @@

Pokémon Fire of Sky

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file diff --git a/hacks/fire_of_sky/info.md b/hacks/fire_of_sky/info.md new file mode 100644 index 0000000..e69de29 diff --git a/hacks/fire_of_sky/patches.info b/hacks/fire_of_sky/patches.info index 293758e..32471f7 100644 --- a/hacks/fire_of_sky/patches.info +++ b/hacks/fire_of_sky/patches.info @@ -4,7 +4,7 @@ { "file": "Pokemon-Fire-of-Sky-v1.0.2.bps", "name": "Fire of Sky (v1.0.2)", - "description": "Pokémon Emerald (USA, Europe) Base ROM", + "description": "", "outputName": "fire_of_sky_v1.0.2" } ] diff --git a/hacks/fire_of_sky/patches.zip b/hacks/fire_of_sky/patches.zip index 53460e95f5456ea892a7db253c2fa19cff53b7bf..be0707734cad2db2684170ef30ac4a58e6472f17 100644 GIT binary patch delta 1044 zcmZ|O_qWdl9LMp`=icufUwd5Fy5DQ5jvQkg#O9N>rjij+Ok*3m2noEhakWy(Wt)#WI zk+xDMIVqP4X(yG^UOGre=_H+{i*%K4(p{=#2k9X@N>ABIddbeRi|i`9$?noy_K-f( zSN4>>WN+C=_LY9JpX@LFWq=Hn17wgKD1+r7sg@yfund($q(%;vVKQ6}lf&f*IZ}?2 zqvaSGA+gD^a-58mLmkVT!jFk)J zBDq*DkxONqTqfh?a=AjTlnHW`Oq5BYTrJngwNfkB$z+)#Q{{S@Cevkx+#oY$mdutL zWsc01c`{#alAGlgSs)ALR=G`XmpkN6StNJKVp$?fSUQLmwV+txnCZT2jwAo zSXRg*vQk#bqw<(MF017Uc~YK|r{x)0BhSin^1QqtFUm{uvaFSL@`}7FugUB3hP)|n z$=kACHpn~juDmDj%LnqId?X*sM)^cOmCxjJ`9i*wujFg_M!uErkA zDkNhj!Ye}b)hP;p;GNB+8hN4g$vY}q69~y*)p;2fY znuMmIS!fPrJ@C>hd78cP$&lq_i~&7`@skZj43T*;G`(n?xO z8_AcpQXqxWPKueVwQQGfHgZwBvr6Ql)ogL*-FP(Nr8Gz>C=MnU7CNst+2 z1x|sm-H#yUazdGbW+^x z%=otH&0?eT(x>d4mQ@uuGcT`OX@0L&b#k}%9I&z~y-CUX4V#MF7p(5RsiHptLv^ml6MOcI|$p>?pIkG7Q_H z{~p68MzLL)_225hTL06zFv<*1f3NwI$Amt6e1wjB@0*ykt1>R^jp6K?SQK*ePmJ8s ABme*a From c3fc25185b28fcea16cb6858dd7ea14cfdbb40dd Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:41:59 +0100 Subject: [PATCH 07/17] Refactor Inkwell --- hacks/inkwell/color.css | 1 + hacks/inkwell/config.js | 11 +++ hacks/inkwell/index.html | 187 ++++++++++++++++++++++++++------------- hacks/inkwell/info.md | 0 4 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 hacks/inkwell/config.js create mode 100644 hacks/inkwell/info.md diff --git a/hacks/inkwell/color.css b/hacks/inkwell/color.css index 3729580..9fc8a5d 100644 --- a/hacks/inkwell/color.css +++ b/hacks/inkwell/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/inkwell/config.js b/hacks/inkwell/config.js new file mode 100644 index 0000000..376ee4c --- /dev/null +++ b/hacks/inkwell/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Inkwell", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "https://github.com/DizzyEggg/pokeemerald/tree/tarc2", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/inkwell/index.html b/hacks/inkwell/index.html index 36f0761..1eadad3 100644 --- a/hacks/inkwell/index.html +++ b/hacks/inkwell/index.html @@ -2,13 +2,10 @@ - - Inkwell + - - @@ -19,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -62,35 +59,35 @@ - +
- Inkwell Logo -

Inkwell

+ {title} Logo +

{title}

-
+
@@ -101,6 +98,12 @@

Inkwell

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -148,28 +151,88 @@

Inkwell

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file diff --git a/hacks/inkwell/info.md b/hacks/inkwell/info.md new file mode 100644 index 0000000..e69de29 From 9d17bfe8e40fd7b975fcf51a115436d287eec822 Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:44:43 +0100 Subject: [PATCH 08/17] Refactor Legends SB --- hacks/legends_sb/color.css | 1 + hacks/legends_sb/config.js | 11 ++ hacks/legends_sb/index.html | 190 +++++++++++++++++++++++----------- hacks/legends_sb/info.md | 0 hacks/legends_sb/logo.png | Bin 28360 -> 26146 bytes hacks/legends_sb/patches.info | 2 +- 6 files changed, 141 insertions(+), 63 deletions(-) create mode 100644 hacks/legends_sb/config.js create mode 100644 hacks/legends_sb/info.md diff --git a/hacks/legends_sb/color.css b/hacks/legends_sb/color.css index 3729580..9fc8a5d 100644 --- a/hacks/legends_sb/color.css +++ b/hacks/legends_sb/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/legends_sb/config.js b/hacks/legends_sb/config.js new file mode 100644 index 0000000..71c20d2 --- /dev/null +++ b/hacks/legends_sb/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Pokémon Legends SB", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/legends_sb/index.html b/hacks/legends_sb/index.html index bf255f0..1eadad3 100644 --- a/hacks/legends_sb/index.html +++ b/hacks/legends_sb/index.html @@ -2,12 +2,10 @@ - Pokémon Legends SB + - - @@ -18,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -61,38 +59,35 @@ - +
- - Pokemon Legends SB -

Pokémon Legends SB

+ {title} Logo +

{title}

-
+
@@ -103,6 +98,12 @@

Pokémon Legends SB

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -150,23 +151,88 @@

Pokémon Legends SB

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file diff --git a/hacks/legends_sb/info.md b/hacks/legends_sb/info.md new file mode 100644 index 0000000..e69de29 diff --git a/hacks/legends_sb/logo.png b/hacks/legends_sb/logo.png index 920e8bfd89996e46b8c36a786ffa62607c8f4930..eda1f65b0dc6bb51654f17a9d974db6eb8bc8f6e 100644 GIT binary patch literal 26146 zcmeFY^;eY98a7NwiNpW`5<`c8gwh>DN`sVu3W{`hO3Bb2lF}t0(k(EwG)Q-Mcld73 zS?BxyhIg%(ADG3=TFic)XYc#I>JC;_mc@BY_818X2}fQIrjCS!N`-`k%!`Q*-a$&@ zum``99n@tdkxBp_#ny#t4O+HcN8*Up{m2@5{5mG9i+RypbO2rc@$hOpb zne74ZY|5>}oAL=3cP$HEs`SDOMc4ncaCx=j zap4Jf9TH@Qk1wCCWl{G8SR^m{{a}lN$_t$Hw*Vh}Sc6Q}A zv(;AHj)LWs#^9fC(Zu%rOiN3n{`d6a>Gv?blFo$0#KJl2i`%!N8Tlp^X5}JAFxZXv zpFHJ!sQ?}bzN-=ihaOmJU{{^PhPv0ti&+n_>Ev9?04mO)4~t#|w^n810rMV3n1XV|QZu z0Z5#`NKL^dcze%lAUm+cKTdO#bsMXBiM}&Q)2F)&c~)@l@0l;bx#y4{=8GL`$@?1o zXtF0BQ6d`$n>UjsB$a0DJN0St8T@-sDfDse#O<#ouSe&wb&Va4f6iuI&0+s1HAi^& zaAa;SgPy)VLO`f9>~;v7_{_-Ad1}cYh=HS2lQh^l0fV)< zY;l4x?stI_yd=T45#-wym$^oek#g}zM32#`tE<fbj$V>n(?Z#Cm! z#0#wz8sBnc-s{*{-5n@|N{PX+H!XQBe$XKOqsW3Y6Nipj*OYj-`RCAzD~~kPA|>^< zSzW}CPHCaNo%`5tGRpe6&Embj31QxV6Sdo~sUNRhFQ3NY`Bz?rIM{_@F_0oCW=bFb z^=vI9;39Z0cWS(v1_KX%VidEJ=$WX%vR=3yJ~%dM!fr7+*Ac1{nT?^Ll8*05gJnhG z@O4qQTtcaHPAnKM3#e{d(UaFk4800v7F@`^NN*ve{yl!hpseMbE=cPf3Zj5QG!hChWxi%Dk;bTJ-(p zp&oFOy2BIG&3stP)OuvCc({!*?j#?^KeB|TUiQ1&OH`bb*t$Xc44*(c-?339dx-$r zVN`ArLw$g`y)382p6C@QJ3C-+)QgVvJA;3{E@yopaAtom*s<-1eeN{WQTX4uGi{rH z>KH3btTQDOA)7t?8w({&s#HVpCOx*4yfJopQ6WS1n>Tf6u0rle|6D>B?w{OY)1Uh6 zL7IsWh=!hu*PVmH!n>gG&<}?SH89j#$HUu`!HU2@H0|wD^I;lVvc@D;2du15%ttgF z%i`CCEv~v}_>%1wjDCNgA4v!F&WWX4GY~l4yQn7Lls0aOSfYh3)K5q7W-hSs zfC_De_?ybB&x7fot~}Ez`E9=_rwNW5t7qvs+D<~tJw?lQ?|k*X5>PP`r|?}EWYe`= z1Pq66=E%RcYuv>hFN=yTv3@yxR5-dt54|fGHy3e&vXoY=H(NL^mg~l_RY?TE&73C9 zB5=pM)X#4Gj~GFDud5S?5t{$}@>!84OJ#F&slFrp&%l7Q&%m0!j5JQG>5~*8YyI-8 zlm(YKXJ_Z`YAg3G711(Bw&aWEP4yD3Z#r9q z$=>Fw%X4oJ&$@))Uc)t6p6co94xgv;V3irEq-~%|sk+;Qyf4-8wi$olj7|gU{U3_~ z#*OBS!*)E4dnhK&FS=ArLL2Mi@FPPT){0`x`R7=QDWJ98Gc~lB`?V|&OM#V5q19Z6e z8H5p)MF*b7K}A%;p8^i4&C-50H%E*Wb0IIcV;DLB`x_!r{yBYF4H(PaU!YI3ejedwZXN=ffi0A=`#TX!v?8Napro(K=g;9p&%AYRdI)wFqt=C> z%%Pr#jh^Wv1SIzSo>6!=%gb44gD0l=7W8^0T0ainun{-38JnB4{Mu{<-JpI1|JRh| z53gs-#LzPmjuROTcGr~-{snUCDu#ZT-5%o$VMGB&fUKwM+3Y6CFuuH$V>Xp#nRVLnTT| zdJp#O&OQ5fNYckLymtEKa1 z#IJs@2|4Smgr1M!XsXre<5qR=Vf?r45s-Hm>Wsne>SDxio2_O{Sn4tGmhW#4Twdgz zTzRf$1%Y#2z918~5yjk=Z5UVDbXIuv5qGf4__!d(8d$rJNQ$0f&A>c4{H3Lv& z>V%IN{uvxsAelzA(cK!;XM^C`3O#S5>*Z2VgIM;4?DaGAw&)!i!~~Z8t157*A0uxR zawQuY8W1j}*nucs+Y2%+n}>Z4cx?p&2t#XH^gU1KF3P-nh5^AuPtn0kL^`+(00^~& zU?Uf#AMm1d?8k4?4w5r`O1YTSSmThwtj{mL&&|#4>zlpDNg7}-yP}RHE0@d^x3I8C zUnsF`NL{T}+uA2YW-z7iI>J#5#!?WjZg=W#1O7f_YNAnvzf*C%mkb}zZ zHsep9I^vJZtE-9M#)$`>vAXSgnl~PvWC>|eZom6GG11^wu^cfnFc9%H|1fHJNyoKS z;|D@s-|>Frc?Sz-iB_oP3@;P)sFUg_lP7`u91!P%qne^;!LTdtuPek8cDE_+)a`A!%@T z3LIEN)d$PR{%u-(-x342sk3UI!}*>OhProPNjP06X;Vc?W=3^qDPIKAMY8ptp$Q2I z{q5}yaa!$$tPF_Q2h4*b5e+@excc+CUTnc(P(-0Ci||$$rylNbp8+v~r8D`FYSQbP zDi@q>z8=c5wbPJQPFuzsb+;~H+;^fL3W_GCi&qE?bYwjASb)8djs0GCK-T}~54`22 zHL?yHvF>DLEvfoz(w=Jne}~tYhP{SnE$fk~VzSv_?EK)$av>T<}3!&3%ypSJO^!y{d&1J-Qu1T98a1-5cVpEMl+Fl=4 zE3rL($r&?VN?3RJy5l(KUCkDE(L6VIzdXweYkZ@k-{848ty8YS0)uc5D~r5^x*DT~ z#g~@+O00kF?O9nE8ToZj-IZ#xF!p1YVrr7{YP2o7lsaQuYx7}Bawm?HLe!k+ z)VU#Nu1~poml%W_L)yBksD-gWYxK5&ML}t|PKNV|5gp$RQH(y!PfwFsEi{XTEIn@r z$5}mof}E!)aA|Bz)1_wraH-w6CMs4sXaU!tTqno5!75lpOYv)o^||YB@)+;&6@`S4VfSm>y6N+1FEdISp=#cH9qV%_`N%e_e>KCW1!yN?~Ri&5T98*Kv7ZdfymEHt* z6SaYhBADCfxAEF}yHzH7`H}vBi^XXBO_ko>d89cvnWA!s(y}NkEtXo(b7F~!Yzr@)(Z_*N&+EXYRHe4JA)g8J}YDObJc?550fjkQ;a zi{B_MXmVBytU$pv%wepZqbY>kKBwHFwy?WU+f2R{!@4r{3u3OK;`5;T(K`xFk(}SI zSa_oj2Mk|XVkmO?Wd6gPnr?(M1~pc+(On86{cCA;z1%ly@m)3)ok||V53b($9Q|sv z9X;cJR4=2hc{@|V4;LI6#>-%a9~acgmZhaHUn=AhG>pbO?M5-oYjn|U0}efTeEjRc z1UIDf3_WmTOSYjKLw-0iKiyqnOUG{nz?1;%5!eGgN^s5>*au)R)+iY z;gRW=bL@PN6>J*YpL&g!PwIqqKVjMYRGeZqxwI3Z%SIguzTO2%nJ6b87iRZ}9)2m` zW>llf>=+2By5sro)Z~H&L#}#oeBT;$iAHZFD?!R;63X?w$ZUBQ^ZNUqq|7YD^Zsh% zxyROlCSFhCb!g(&YELYEkb?$`@Ym`fiace>X)H#vC_X9@&`3XV1o>>iXq0kO^0Z#PtTUejFh;``P!qxge2_}_v z$8Z{}!eqF84xxqEmgs~(WavEf&zk*@adU_Op-IeKu|MtZk2-7X=g-+M=&G|ExcU{| zP~i;#AUGD^pt40AC&;BbyUilLDtYq#xgX>C4W^!E2KV1`sRY*p(rOO1vFc z6NS`eDdip3cm>U}iE#dwuZWYzo%BSHNuG(c>sLJ6Ow!Sx;^SV6SsOmWQrcD$?Q3?)C4STG6?+1%P8Y7OAxTID{;$sG28@4T zs>S2(*61#CP9z46uH`rSpQL!p+U#k6bxNxy`<0>uWcL{fo3GZD>9Cn!=uT}jYRo0V zD*$+GzSCbWy}zYEZiO51I!4ad)^8OpWdikzk*Au7Nkfh5+KFCaUpO{!af{HADvzEJgaLJNe$Pl{5<-%&AY#$DdeNZJ4W8l`Cb^ zcRW1hx7(v%{y`UIz-eOoLR9mw*Vwy8MGR=lTF3W47B!z{N%AE|(E-m(^xXZ}&~^O! z-J?jyS}~_6tZ76**D=$$=&d|*_vD!9c&GGH6XN{ z)sC}p#r-Uj(I)4HhYS6Q)!LtEgP)c&c{14$4-J{4dQ9Uz^DlGODh^5pbkLW_<>52a ze~#UCOz?J&zPkRKoN;S@hPPApz#$RGm23I;CI*(PKN}AxO?G0(K zAmqd82vir7o*kj~dMww>rpu(Xw7q-J``aryLyi4Wnhko|-r-QwncAwVPq%guF+5u6 zR@U{&1>piW;C#zs((Fmn4O?o&Zi2*VeG~AWVP!kQ*Io6=1rUoUMbtA&6KayU_Md1^ z{Lh!O_1RrUnb{2+N#!SJi&Zd4DB$+4bWUqL*Nmz@NA{~YOF&}W#EjddOX>fmklTis z=U>4EcMND_RWo}!X+N{-*&SI06GwX-&FT5s48t)-AD0=g3@S}CAG4@_JsiT0WR@LV zfAQq4IDRDw6}|30FIjjrBTb#h8PNLd3A!-n>0g@rIh%(2J2xn?va-%yqcivq#U+)v z(!G`^$bKxy79n;Ntm5c{J0tfKU@*$7CZ>Y><+Xw!KJL87`JAL=XSOel)D|+S^3#9B zybGzXb+fP!AfgX~EKAK+O#{rbRmI4}WI(8!KRVp$oB1F4A#oG8{>0GOH>g;Zo>Id} z?@*{MIk+KXMVSJHemjo7teHq&53LWT_DYpKv2fgc`1aN_P72kFlUt-ZU;OH-tQzZ# z(*5UM&EPOc;|k{sc6RW^g1k1ZKS}L=rHXhY^!N8e1h%j;u4_Uw-&x#O@Web0FVreF zqYQu@__ z2sSk}HCggmmY(;m=2S=`;RyQ6XT+6F&`*jHnL?2ory;>Yq zF8tJ8W0~w}p~uTQG=^OgTg&d6^S8~}rL(upfkBf@FpLi-K;czVQY!a`v;k@gKzF_2 zP5Jr9Lqck9Pq6@<&O(X7$oY=<-8%*~9nID&!Km#BjDVod?&`WbUS?!cVq@j3;9x8+ zCdXB@pOdG-E$hr>e2+yTkuc&b!_aZ_Di#&aa(2uWnBkuzMl(n=8XZ%MyM@JT@(;wY z08{r@!FT!J`PX#ImO? z=xjyf=8iXeH5P8l$S0gx>;5^*b$TVd$MjX8gJd_uK6bZds~6I1QTKp@`uA@FE0wpK zfPQkIHTQ+V3YtBP3lmSEMUP}jV&KAkYa)G{m-pmX`ktfUFC;4L$!*5sCX00N0wno# zADfyPpo{mEK^53LBgmdsH`wEZ_Uvn|gwWi*rWWRwVPn~7>DxGQJX)50kC3bZ9VXYnxqOlNdCNi*8T5PZVf#XMM)Qw zsqusxqO0D@r{cd$_Uce6vX;Cyc%i>w-&;a1wq&1QqfoPc;ah~Vb`}=;?2pr|yMH1F zx|$K*l+^5D5Go@)f34zN@Qp+N@kZiDOMc`8Vm$ESIzn6ClsDV8gy{3)zx3G~7>Akl zOGf;(D?{Nrg_>kDhBU%t%TKXrXvk;}FgwfTT3nBeK7ucWw`q|SbUf6sa7{ts0!t29NGIX?OQ)m3awu8A5L1XHW4)Le%?8A zuhH%XIz@a&D9a`Z79`j~R#lO8ZZ@oimu6oM7fw=F{=KsBJ5kw{tAz!&nN~=2L+nYo z;D37j$oY9S@87x)y_GpwZn{LZotGdSDm!3G2V**-C|STz$>uzF)w(a0J0<5XwJE;s6=3MjRg}mid_A2 z2>}IcPpj`N?8*~rruF!UkaCqM{$0JJd@!=Sm|f;C-?IHAHdy7ioUha``6wv$KWUD+ zK58wdp)%Vgi2YI=uQ;)`JyIs}^ji8hqGG`((!!1zM$j>#J#8$R=%D1>`Fc6|Y02-E zYbY$Si9h6zlSAT&m9QF(Zm@-&%Eh(-;yexqgI`1lm`oz%XkRxSh@NE`co6}|3m75X zLPD=2cki@5mKCFFM;dPKjLBWs>zsc-TlC~K@T?{7F1nFC&A#1wMW3-MIA6Jj<~b{E zAH#Djhs|rZw8)UO8vN}d3$7MWo8EZ@MIBQ1EO@_e{F?rhHu%;fYR_+lKi~1~?hbEy z!O&uI{FXo@&?I<7r)J(_AR?r9O`JpO z8D9@R#AC|j8hnee{QT@>;I?~g$LV$8-sk_wgutSBT{)`MmPW^tSPbOY(ure1Do|AQ z2i=m+#wNr_&aHfr|EIb}FW6>yUyskzGrz=8qshxQ`JXh4yOfD(A*MTJ`IkYsc2uWf zPC2Kvz09Ot%2fwra6#5El4H<-2{Y0VH@zit@5O?`!<$g{1Ovn=+faPc;und4YzEJhw=A2bC3o+HahB8z)MY02AxA4?)vfC3-`_bgBi*k~G3D z*RZFIvP(bbZH`3E5iAgWf{lj^hjE~9F0Z)YKo!M?h*@^vbuPj9&RNc2wC{#EXaY8W z7GnOGsw+lSvPD?U&S?%>Vt2v|RG%o3h6TueMUoa*x#xSAb z)p`-H5N!~oCRl}B)xG5)-{#@ky&rB{sUAdlWLu}Bq^t~ZZ=zAz9&@}x^MGcAh8bVU zHc!jV=;@A)JLA9-5{7QnCJI7U@=5O=A6ox)vCi4s-#Guv0?4nG*lT)6+PO4X?>7){ z^!d{SXP2Ajs(*mH=U}wPQ6E8Hc#FiVE=02ddkJ^;8-s;dG^yDlxx>uN%wN#vpfh!? zbd=tOq8&!j$^DEW9lqFbJhUXwcD}k6g|V<}5%lNlB<+)cGGsT-iKpVuixaMP7O8zV zCb7iF1^X>DgM^TfFu0{fTP61umBH2p6SWaAAE&D4G#b+eH)2_sFFb9ydVP)T7CUr8 z@zT;#9i^*xUMF*VeV*+pde;>6j#Oy-nz&9P+wAO>Spd*Jn8}NKtvwiR{E%Gexd*PP zsb&+7sDy$vS<&Fpinx*7^oQr^111YeEoerlPd@(WkY!KQ5DEAV8qqE`wKOF z#yPYZL1#Glw7BCop4i01q<$eYqr-$E$>dpv7PzS3XvMB5M99v~B9G{C)ANkMQ6M&* zO?@L#pBUq?(id@;NU?AN3z{{&R#X2UL~7j5WL9Y+kj~yN4{Jl}d;cu7#2Vn~Ck(={ z%vLJY5L91u#M3l6+HD%y=QDfGi&wAn`-u%88_gM4-!g*l?k<-#h|A%w^mrU>8-pw9 z6-^ZVa+}40azXd}ZBpbbbXJ#7-=uk zW+aJ46ei631ch*1XOvMirrzZWE7DjlNnC zglplGJzAP&8WWR;vR*jZf6$$8wTdZWA4>m*>AG)4toFS0iAxqR9I%!@Nf;Enx zBRo-lyI;Gx$cHUJ&%yg4V2CqTGL!n=a#dhJi%)mY-~_Rg;3t~JsU=4z@5E~Z6fx&k z|1|4H;7c6u%(bG4Q=HV9?y!g8dgJ+q#(%pFD*mU?C+c9#Au6YbVCUdqrNqWW|F1kx zHgTX#Ou5`ISt+7ek3|QE9+?0cdfi+Ub1XZHU$k&w-Tr_IGxBmVtKEj~`92Zr)R%xz zTt_;-#9~`oii`V21)FXEhR}}N<$}iyIdXl^SaUti<%i? zSWq3<iP!<3DX3ma{1;n-F2oH19Gl3 zh=Wr6Q~BJ0J|LT(8dTN3_WyVD2YurwdAjvO-M_di=H}y*b*#Y3*`|3W%^17&mwhwN z{XNR<{K~A)q_2>To_!+pcPb$|`(kZu9GhV6oZGBJy(N7V@6IgKI~Su#L%qz!g>TAg zS^v4^Z$ol(b9G8;+rN*$|4MD&*Zt_nTUoLSOBeFoe_pDN)kT#6n1dEi_z1J(P$a^0 zKJY1d^68=+ii~pCI#7Azw#!Ys{&Xe4qD98)@IOV;$C~ap$bf3QT=s)GdyZwjepz^tXR}4jujF3USlmj9q+#%@eur%G{5KhiBYtWXmzij|VAT zi-E*GbTj6qh2P=jVHL(^XZE{ni3`=Io0>NDKY#vqRIXW05_E$>ujIa4IMW-SZ}YOZ zyQpO;_l*b~w+3H%JUOF;x>{;=8E{Za__rbhA*`-#D;p-J2~&xcNyh`ST+VsZ@lHPf zG0k%FyWxXu62rcwiPbl;0xdU9l)^q4Z67XAmMrj|gpuK7sTU6Q_A2Oi=@uI^^AY~g zDz2=pEm*5ZiN?dwaBc@+2>m_-aOyStx_nz*&m10eS|QY}p)ZG*M=Rd{xOvrZ@Noc( z4?Z7hm$^V(0j(s*9(NIlM}JasAp&Y01vg*e!}WF&`(*)`aPoPgp<;=QQiuDXGLi4@ zm?977gU_6vWc9)W!5~bL$Y~W7C@Y#Vq2(G?xGc4MNuD1X9C2v9V)R&xbb8M@>u;32 zdfCK_EA&EZ?lSMs$EBtvTBGL2D0h(24b6~?swy7sg~$)d7VPZodds)p{t7%ehB4UY zE4EJ*dYu&L3(@_(yYJ$u#SNwRWd=xk?9MkZL#x+qP483$T zQ*?m#O*tq4q3a0RKYQj6HyWm8H|^-+%z}mBpLWnkZ;XFYtwLJbL4xLE#CwetS>QFRxE0LFV?s|arIC0S)X9kItlseM7VwpW)PhH z1c`*wTP=dWp+4w4Q+z~2Kp|OFaGU>=(yQ-D+oJj^bZ%-Gu?{6`jq4zn^m)NSeeXNU z;@X$0=4NF&?gjFz)L4T)$AKQrFV#F$&?*@0aoHNCd5V5Rh20puaJm0Lh((s3)~RN@ zxu8oR8sWz3C7SCHB-}Dxtpp-im9|FZ2Mf8ueE<3sRUZ9`L;Jq_fdJ&>GI49mg^y{uu$=C`9}f3yO3wbdN=D3Cil&YrT= zGhzfnR%S$EfR8jjEXca4l{f<5qNpbcH zrC$?WBf$#wFjV;+&&3@Z8*Ay|kXsqp+zy9TjlTM?q0BGcjR2lBVd2BMSk!mb9e2yu2_wG{O(X zDZ39|=tfb4lm|uo?`XJp`jOoSg&g+Sp3~J8XTh{+m$ME^>vZEXsl5o-3S13WWmv+j z5FDQL+#xnh+ubx7a$~*u8}L#dE-r~x*eJpSgA}hZKoskpHZtdvbV@@N6BoxaTN_iqLB@7P15`cq*r}dwj#Q&D(=^#2@ql>@<7Z#_M*1jqz zql^d)>V3JiKL|=R^tuA}tnTqhSqEM^35W{P9lVVq-ad05EWN+|Y$4@i1N;|ZpR!PS z@g~Cqy^Ukfn-5EB_`^-iA-4xPhXl}mlULQJTo0rVqN*h z4wP!E{dGT_CbK7=E7Esb-5&xQqq3=qa+;wVah>=pWh|zg?O8fGzoL62^tDWuTxlw`b1fu2k6I6!8TK5OLY#Ro8l}4{$v7Hp~LUA{mCuIuhZj+ zX|awlXI1iC-vU>!!--+Lh-D`ad%D(#)j>WSiRQe;`Kmy1g8EvR(X(0PY}FLU-bpIL zsAk5BC9&^gh{pS|2yLBM0qEP8h19MO- zD8;;m50xzmy450qq&Gb`heKHy?Yt8w>$y6oPS*UdO9v*VPIN^b<9zAoZF6U+G0&yx zg)`_=&6x5$;CkR=B8diwsg~!{^g3h{UBSKBIT?;=)QiWHgck_ZifE~Uoa>$^%(zL! z&l1gVSQz1X>fk>n(ne!!j~7WzN`AHI*4r+siH#RyE;hZ#3p7~siiXX2v3?sewWoiJ zoK;wwj&Q-Ms&J`9XYb}X@5B^e;bQu;Zy3itxoNr@_po)G;SxTHu&0+nw{Hr2PH*s! zn}>%XU%%spa9AT_-`cOLh6W4yuT*SGJk;1s#KC)WvjO-^xc15=zSZ!PP7jV2r7azq z%y)^72D3$eQO-*ejG=g=(Hi`YI*9A1)}2R&MdZol<4Vp)%N?qJqm0A?L6b8kLGwPG zCcPJak&ydqsr@@+Ks%=TxL-2e;~#1xqL=Ftn|Zn9ECa9Otu+i21{sIVtMv2G%?PRK z;rMP73%dBMEnPR6GcpSJK$X|dHXxZ@*AB`$`u@<3WBR>E7=VNCr-9yvDro0hM&*e zMKl8hf`dX%)N^Oz64xrsxKsL}$m-rc&z&fT)8bzCW#huPpjgA7=%f*^O;1DZ@uQs% zZ@u&;99)l9ca(=7BD`g1+>Zf1SBVKRJ&lNe<9rcZBbKJtXsa7z~*b6KKqbT zreRsb2quUoo6}O)Ul5Q6x;I&$ogy9mT#V0#dT%8kM`Uh0Bm-emjd`m!3TY*rO?>-I zkWv7oJ8n5%oeEKj&0W|i`Rzd(P6J=WSpATP2YiPZbNX>l@No6g*q?2p?K~uY#$|do zl#;((s)p6NZaE4Da~Q1KSbdI}gY!*~n4u@s8#tJp&7CIP&SBao? zuPV2>pGK_283#vyqZT+>v!8-DzmVXp8@k=f&)C1GaGdo#8Xcrzk+Z=ws80(8J~1zD zspX1a&xr#5^jXFg;EA!2y!@;sz)K0TTOdC_5burfc$>t| z-3X$wmip=?Flte5NyAOVhjx$s8||&qhW#u6^qqZ3J|o&$17*9$SnY`|?b{1L5Z+&M zIVMtQH1m+3Esr=kwBaUSIgQMG_Sj`$IFo6Jxx3WTtljY<|7T9sx6IU#aV05bwMQ`U z+-9byx3B)d5SBA0*x1;GZ%r@!^L2Z|rGT@}LQ7%zaHW42*@1lql{Kt6=@X*XY2~*71};HtbDcPz3!^BC7c~as;~(6BrQ`>g|v`&gWo>{ z1X-7A$B8dsjpwx9J!dxK^~GNr?*3jFo3}!O1~#SR_So~})KtYYok?%_oTf5gFIe2u6t0iIGkG`y5QuDupC(JZwZtgM7#RRLS-uw@Va9T|=_rW0 zBL+kMYLg9e#go(I|Ar;JzxNvw zOjf_h*Xj8;fG8Ll86f~cXPX$QCuouGm}<;#P9!NdbYlXbKKi>ixgK(&OiG0RyyR|O zJyJiHM@l%;QzYJ0b2F(i#%2OZCl@1T?_-%Ch%X4b9p_j`hzba772$;Y?h81B;*x2& zI8))Xm27i8$I&#Os1Dux&b4I-eFPKbmf4rbe=11CeU)4Iz+LEs4K`>f12E9!AhA}l z*`*V~*j%(<3uNn~2IXO&+D2zxl+N%wx3A+!N`ZS-Sc(jJE~1(@H)o&?5smcQoXxSF zj5Fs-i=r0pd<@6yhX_59rGeF2!07$Sk&imtUMQCs2chr~s!QW<&_$M3>$!;40N#rj z*f$$siX>N4-JumsbEHp1LSBj@S7Gd^9rL&x(m;L5K41lo=1Qy*aH9}6@^-a!c}3+{ zM*yzdE&hYtxX5h<6e?BFVn#x#MW09#(SD#3Tzh(6!5?o&d{5_duLhOCj;g7y4%_l( zXSZ~O!@q@HrtQF{cW7cHt%avdxd{Ms);d^{ZkTf(7tbrflM`#qqDJ`v`YVX^T9w)z zHM9R!upeHE?^k6b*4Q$UhMfW$ITSA2B7+aLrWXD3@|I26tz1_J+`OoU45o2@ds2{< zb$(%~nD)d;ptPc*VlKm>PM^glM=*=_sTl|ksz1egrj6(pI|#Ph?kO7KVnB=ZJ7f&Z z!Y`cIaa`?=PAAIy0Fm~ucun<~t2lGc`UIYtze&B}T{fC$8uy=uRUtqvY>je+9Jln@ zE;%7sZr6LDeYKt~u5QnMTJ;+t$25Jl-iuEwhek=v*;t!VA@s76%i@Vwk{AFvs;Gq7 z{rF(yfmlsvKHa|R2GQM}Kbx{~(KFP~m%%^>k3sJzU?jZn8O9x9-ZQ|U7Da+%edc0O z;nu^%FOwA082&(0BxJVZ%+7x6B*!Xr65$$fTg$6{>VJW}G$@pYn>+V)0=rxcu20yW z@(TC0X7mj3Cyd|K{yQktJBv`T8;<^a9q~}ztF2xMOh@O1k2C-FMUvp0LwO?rqUJm) z{re}DyfgjA%H~I!AVK|tgTo`R+3CtqGVOD6n(_41p1RwUB^hrp!u?1{3|QYO7rYvdroL zgBArDKLN8I@%eqDAYx%+=Ym*2?+_FU&PAi7ER&1f6xXCCLlQmo#j8y}*xemkUZx$- zD11&HYYy^K<#=+%UB&eudGXgQ7EE@?(vJWJ`akbwbE3^)$ZV_`5qy*Cw+9KS!KShj| zQ}=<~Wi|6duS60K>y9lGlHh~hk;MZ9|4I&bmhQ$snEXkOUdgYHjt+@`{m0V=($inW zG&D3UEi71vFUEu)S$a;tDbX?(UJy*|8@|5r(O9$9-*ilsfytYbkCdLmn#Dd<=<4a| zk%cO6K7^!?>stVVCR?Nkt}OoId2p%iZut|H;@#pG|3_atRl*#Z?)c`1?*I?GdmgXw z!?3LDUi9na%`*;B3dfQgTah<>G10!4NQRCrcr(>oxh+ysN*oZQ8E2IXS7dl3GA1vg z^i(CB@2v8Xnf7~ASg3wo#E04T`F2{~h_F6J;&X3m>F@KXuC#fTfbo@^NlxNb%Ythu z?#i01i>L?blfHp;kGC_c>fwKc}4Lv)+;YQwkSk$q39kfSy8L^`>jp z9xe`6OtFod^L!)H2ZpIW=~S=&O|&f$|#2t*ecB_jV0wuiA3R2Mj%ZTX79L5X4(2J#>ntm!kOeIn`S zkFosQ=EIj0oJ)eCH&*z)gItBkdRaoJcXAR(zd}0wv@&k3W%vwsHXrQIiJOM>&SS>s zGM4-1GrVa64kkYge%=;{X`F=Z2X|}%UoO8xIDyE}TI(xm4XJNTHyA~EKV_NFBdu}= z1+PF5EEl{|>M)+bY6yH!J=^_VkH;fOoo%0u=yCagZX;jVC{x}6>XXQKX~CBs`C6>@ zs-Is9_L~rTiK8rH{z^a5*(E$q=eXkze@(yoa9M1^?`H{KDByl%jQwy-LLPujY=`tE z4xjOH*0-+ueR76+iu@0%kSkjeC3`j-?*%otjd8?*qQEi0HCkp%h;GPVP5bR07Qk9Y z8s^W~r)OrewTjoSFF-_NdVaoogaR#kM`+RHDPFLQsCg9`h~H%fU^ErAAtODPt#rV> z9+Gpd-PU$QRg-%qo+i(Y>44>57s)#DIW^P!=NJki+|LvHoc?(My#o%P z(`^WRD2ZO4|5gfvzj|IyqdKk(mqqI@ATL4i%BjX4EclI$x*ZrEIXOA%J7afuJ1zk#7j1EoOeOS@Yjx5hxHyM?dn30Jvscm1v-E`#qDuXmC3 zz+!!$zNDqH2Bh?a&=JxySi4(*f^;f7Razt~qV^*iuY4X=U}IQ=C0++a+U_DI;%Fa_ zPyyo?gg8MNVomJhDrZMjTh%*m5!@~FdB52r4Qg#4e>|awf`DE{oxIpGDH@+Nm<8jX zKupb~Y;a8r+q{hjvnSlx6c&vG4Fy!TKT+Gi7e&YfM*G&1g6S3LJdS~*$?AY|0ooSc z44szycSSHzah?Ab2GinAVX%)_y1Q7g(WJyQFCP2C=#QoL9}^8t?@uUpi+$a0N_D~` z=3^?nkC{OB!?45t+RAFhXwB`QiV6XGMAMI^=&wAF0HA1?+t(wrv9Zy}RDGX^iEpQ| zGAv8=MlivSwkI~bq5WA-w>~|Cnf5ZS&Bd!RbDrwPMhe%=E{)9j(f%V@( z9|jweTCdO)>Hb!-5~VOjPDVvVedXb9IXN1A&^GoRKovx#x!vVN=c?o=?oK12!>R=0%ZilO0^!n&^a;Cd>mT%4b(-zv1GZIrwFI`20p_ z`M383JzWPNEDrL!y4Tw8?(lj$$MJ@@SYmsI1_p3TYaV^Ml>5Sow#@P<2#((6nKRgL zLpqGpkhf25DM4#Ab|-6XRNHOoP79zbOxp_ zre(wtStlS5Ju*8>QCgQI(JzZaA?Dq9&_WU_ZBOwVE~cEy&*dC=r5=4EXS*Y2IH_Nv z)wQh?a%jwgjpsdow?uXSA*&4)3CS@qWfk7BNnx1(HOtWlu$R~GCTZ2Ug)X4y^L;iN z0^IKqrd=8;A|O*^j6zG*1Gzp4)o<}`vN<4n#)b0!OH=vh*o^Nh-se-F&BTrQGzQaD zU8MyzVFHbEJv<`ZU{~F(+uSog%xlQuaHr7oy|PVbMzB5&CCW1fZF-nV^a#rxOqosC`#ML8kzvA-^k+i?%Jn!JELh%QympZU>xj0O48k;C zEaU?;CBd6=2f7w(g0YN3wK~re(p7tb>%TpG1yFT7xHmmEEftpTxwg^&vH*lfxL=;G zX6}?qm1ylipaAcU=p}}S<1q5!0?UtPraFGYmzylyH~dy+t0sDI1F|)QDNv6Q^Jy&a zn~{cMrknK-JWRa1Lvz(l*@n41`#QzH-p8I4wXa@->;U?BRQCfBA|LkzDJYklFO_;P zUZmjDUPrUxQ(=voR}r*q0^tb+e5?O*ytgN9Ga=}6B+4M zW{8)c6ZQ<>0E)IOIr#{{G_$+RPlRniLVA6vyZ2rlcchfyyDBrMH*E&U8(KG={T(X% zbX|_WDIXXj<=U;NqH-~b6q9vNEuq1uIm0g7PxbGJY7_{j(S%rz2)pT{>wVgP4;4-1 z2tjzdXXBG{e}C{#bj%{BP+J)^Pdm70`-Wi@l3o7#RJ9VvodHwzL?jugnf7$Dl%azi zdHx_`&LAi5DDFxBWmE8U)?qNvkVy4$M4&&br?BORs{*iuw^`JyhY{8C;q5d8B-|Q@ z1+83X6wm}1LKd{mm zIsl&9mu8nGyweh4BeCD>0-<9d0zH~=M^NvvAR`<@)dFP6epCR;yv7kIQm%2JKsSjZEFg4rqKm2`~dzUuRqhh@o^3uynO3bwX*#Q<>O2lQzjF*KL9r+P%=_2%^%P)UsGfDyB z!t+$1FHC85<@#)g`_(JD`(DHeA6qa?6mbEF6S`hEg`tJt9CGst0Mh3zu(-UjaIN4TcS~94*x}ynW=GBPtbIfXU^@AfvP- zNFoCF{DQ!DX>x)_rb%?McO8Vh9iXGNY*~43tAc=f2a6o?eSF>Kt@pjFiSm$WOoFO`+^D z9I3VvbXZrUFXaPsTEV!oYB}OCU-XTHifb_wbr;$_?ms=POw_=Utr3{|WQso_(*^$iG*fLcT=4rR z3TcQbtX;tKk`n;q6$nYz2zGf6Y_!-cH&oIO;%+Pk}l(?PxwV2S;MzVC(aeP{NjV~#O9)ZbH7 zh3a}JNXD&BZutLn_nrT2wr|{Vw??%#rB)&owYAh9wL;CPmYOX^?M;lLW{B0QQhQey z)uOexs4BJ9o;6~xi20nk@89$C`3D{^d_E$%a>aFC$9WvzWoE*Vo`AyFPIJ7w)i1`+ zKjpP<4k{||Rk;r5jIrHQURx=lF)ak$DeZP_#OS}=W4Xr5lbIElemzgPk1cCA7YNJP zPZdxQn@YI5Z|^vn-efL4_}RyqW&l?CMJlQcQG`{|5jqs#kW8o0(to>1F=T`#fF=8F(b0%dD+4uoAt@&eYCL zZF7N6Df$y}Un!zhmnHKTXWu(akFaXYOi5w-;v$D6=a;D${;~YtWU0KaE_3wwpVK#K zY3}L|`FMGOlT*c86O6ysvhQ8dY%*Y$STUx{tv_UuG?sC37witE(N#m}t5!>hGevUCf=u0gVA*k$9 zwqH!P)xf~O>&)>D>7e#!E>!z6Wmb)PySuv$D(Opent@ksJ>8tj4Y^1hl`vDS<}rsh=P7NB~7eVh~!&^Fk!KW|I$DT!NKsO3s$M?=B*M zCuW*}bz)wi(7c^Nm2#Wsaw5<1n`KC1SZArV$H4m>7O?LfuGH*)uL{ysEeWNNPU5idX>-xHDz=sn6+W>xp$RMZ?gWg-cByY zP@Pdd)`ueAr$eg0BcHDrRhs^~&Tdp#)fSlwxn$ESC>l24n;F)ReJ%Bx%{z_iJxtH7 zhg!%>=-qL{Mn?zP@zF@5o|>8!q02bz3JD9f{->8qx{S%u_O`a_xSpj2iX_ozE7}q= zGJj69-ZS1yzU2D+ViRrK(61nanu`=s$*lCt=MMx@npXIVzm%6ZgT}4i8THVB&C;JP zXs#`$e3EK@r0$+EcX4I8^gy>tk7Vh#(TDrIBD|=Dzklp=)^Qg*8$SZkyRnO$EMfb+yc{H?tRK((cpRGmDK~^d@r*x7EEXKC`#Y^4^lxysg2D2 z4)l)iQoph})pm!lLPxLUFTpHFbKlKVXH;v%Ah~c@bb0sfYmF7ReYjcU2HqC(d48>{ z(=jeJN8T1mk`L~qqE7S-T4Iy){#ziZSr!YKLj4A65eKgfy|_pqhx@!UDa7Hm-y-yx zu%uN$QSG^S*Ep`dk468^fZXC?b#XlA_j0szYi(WK#DHj9c-|^?$2+Ien13QNOQ`4` z<|p5;HZKM(Ed`vX{cy>#KxD@D0s@@wuAynSWk^ z=rRB0HHjEnPLfsbjyR_P^6p$fGhNL(T?=hBxr;gHOW=*JdHf#2mB^o$qp*jw#MfLz zkmjo~vIk4DJ13&o>GIhxH6NgXAa+Flo!MSEOj)I%e#q5C`)(P#uIslOV{q!@8ZMS2 zuV_NIXK4*{{^DY8MH0nFWkl5>qswbsL&i^H{joBX^q(_0Rz?+%*S?mjw19dI9HL7O zGTEEA;)=Xgd}~d!tdM4Ga&3y(E+5$GVIK5|D_}9jxL-`FC>@xUzAi4>?qFQMJ4uHM zbZv_EbV^?FBsKg7e*W7JS%<1`p>1ZdH9$Avp7d}`@F}Bot zq63o$z}p&dNh+w%%V$ycQ9Uae!3{S&JB~VHYZ$HuQkzNCo)Zx}Zj-DNL5E&JthNDy zf-z&zoB5NcNbTswyV$`GpD)sJO{ly?r7D zvmb=rbp6Z3izF87eTinZzV8j7TtZJ~$W_l3^phhXeHfz{BDL(hF(I>UJRHNoN4B8> zAT=0ikw&vR`XntqedjdeUxm{{JuS#1=h;ZYY0DA-U(m9C>yBSaRO+nbZ`M27Em|*tWu%pgg%;N#6lmQ^_7$rzd zvkXGtuCb;7sStQ34$sy5jbZ%~vl1sbK^3(y-z#LWU(U|XVr3lb*5xdBQNPn z8fs~Xc;EM6f7wyxBCabo2p=}`7L`uSh=>!dP$Y8;IUa8>L0Egm%j1E{+rB3=&$BwS z%b)iX5e}%RPzwwUtZ}EE8Xr$qw zaxXdLpr<7I52^a{SsEw7J<9;>*I<@ps$lbKbge|fOx;&G?`+-W6T2Q=-}iJ+;>DFC zgGp!43BN|{waLi8xpr@nqyCts5Rp{vHPpm2{3OptEcKUrWRBa8j5=x`%|!;jHS7xm z(te+b)0&ImWi=JGCB{-l7I9~_{lxK++r)RemBS~rB->btZ7zL9HNDvTzmF0ML3)*r zx6@5qE;m*%&;T?vawDL}LcC5*i~b$U{O~48S}QPcP2*y%d8e-FuufV*f=k-t+ykR^1DCFjCdG|)LtIdV6iIUcxK^uR8VX#5_nXRNGaN&Z-{P- z9HFl2>9JE*069H-=_3~#6*^UTmaDIi^lypGY0auNTJ%KoTH$2j2w~6&sJLDAZ{`s8 z=WY^xb^y;JEK{a%@-vLLig>X;4rHvcGw$4h!Sny^K{D#`JLCD#k_*f*>q0+!`)Kg; zj@$Eh0=LCG#|+k{^BAlLZA@_O(iZM@zDK&2=0CCiHa6T_Hc8jTqs{i;1jN<(QW5M8 zhj8k6&Rg?62*n+`nt*+Q%`uKnWYqi!$pj6SY!Wb&YiF)$Y+t0Uq7=#&Tn~yZaav-| z3)X2R>Pp``XRe`R6qquekn;YJXfQRQ$HIOBNuVvt(zXXJNwyEYH8Ca+j=m2_>gZ~P*3 zRXX*-NNJsSitZpg{q5O9*H^h5JnBJgRsFb1ha8{BDMjF~+z+(^=_gllAU1_FP z^T)P;aw1Amhw6<^M~Wf)YhWm94BnBhlv31nYrt_H#pHCU-&7P+Tss!8buytlIFkp8 z&jI}Pjg4iZ&Z_QjcWX4w0B|s2t)~DDY!KAe4hrkiCDGiWCFARgYV@YBcy1^jjz*`O z5F&Kw81G^*-9U@)dd^NhW)XhVfey-!Gy;;nkZtA=x^+lg=v z9!(`6kJ0c9IdCuZoZOwGheM~&rGZ#@0BFZ>ctB|GKj>!j+D+x8nZt_x@vE~fBheqeIlyS?5Ev*| z>6Hk2Oh^f@tG3 zV3y2(b~3;C@Mv|QQGcY=vUsWIe952;pKfLe#JOuuq1y$7b~28CF`8H*^(;ASe;(3|#4!Gnp{b!uvjXT|oQ zJ077gfH^qpP;8SZcf}0U$iNhkj1)Aqk~=Do8UHs_s~Dc49Ph!xV8!P3vp!0UD^9!N zaf5=emI97oj2pt)dlR_k1Yb-UFJ!|eUgCjJ88i9%8_>Aa+>&i0hg=Y==L4x8GMAEK zvu`T9Ed(T&l$v>vd_cmSmDbaP} z(JHUDeYgeu-vI&}Ip0b+ArK^&>>jFGC{lf|(yu>KBls6jHGo(c`~r8}h2b~FLe9EU z1ovX}gTg>W5nREb>8bRF(aDXB>}<}Jz;WV;YsH!!KyrC%d6uDL`b_t7sj*E$Wlq2b z6xgRKoko^VH$xgZF!OsG?f^O0CVMg-2l@*5%<|4_rR=(QjJbSR8)C7^w z4{{!)K%0m5+!O7PN$0CEQjduo{7~K@_^ay=;oD(x*!v?vF4CVbam_C^o9EP**L^bt zQewAvsQ^_*ie!waCy>9p&+^K!&5yT*GO1$iX2}e|1quNXxixfNKd%o*VeU8U24CdV}dKrtcB!*|8xcScNK`#K(-YR4H0SpCpU!T)bfMKQx z8pE{~FKo{(+{IX6xV4*ioHROio7#Ii9f&6CH*emkO<`pE5_1j{W9m2zbWY!-e=Q&I zwaA#DLrTpyzZm#@xPJ}+a!e7|Y+2(9(Q#N&Rn-yFPVdUdc_T($QNn$K16GhDgYE|wceXzr=^>@Uf@ z6{q$P@-WHyuaoxT0aYcmbOKXiVFZ;Okc0$P1% z_qmzT%dg?`&XdtbP)6UN$<6$n#Wirrmx;YUgLNmKJxY0An~l@A4hhBm##Z+FV>`9D zIjW+bcH(1V4Y07a?+at0VoP4;*eCxnFZ(B!AN$b#dISI_*V?y@RHV}q<9K(+8oEgQ`As|2kzV|WZ>3|`re@e=7pNu z{eFjDd5iwZEffE#yZV?HmMGyk#QPFq5y2L;UzTK-DyK$_7f+Hd!n zBFPPb;Buki+WR$5AB4T1w0#23=ep2R;Ts7HUQSH#`RMgu?X3IcW5 ze+b2hX@B0*%0pz$N5a})1pnZMSzDOp8T<}boK+5LQ|p%$nWGXefyLC?2qStT*?Db? z4EWJXSkK1*VlCps4|-JHv|}cLaIjR~o&i8GU1ABd5?#v@p9ggcv~`b))rdyLHCjlR znF{o%?GHCSY--f7=TDNS2ru5QWI_GY&rYiw;db>kLbD8FvN;*ryBMl+zv#CGDPNl7 zH9tL=A1TFgNpTmZ-TsK8p*;&?vEdwIIW9_+1N3%GEjb73Z8b)p zZ=jj}tzApGo37fRZ^V=CE4jMu570hgw^$xe;iIA_`{8f(sTi7Z_CwmN z#ZPQ+UQ0bh-&|bn@Qxu;O+ugSLuP%C{16*F@O-JMqkDUEmqS#Q2)k}?$2U(GJEz#x zFvbG+m0I>Tlln{J7C=R|_Mbdoxp%Ihwf@Sh7cIT6=g*n$rK=KJKfH~;(z{N5^V_~x=UiEVVQA+xVo=1Gvqi&Fxq7Ch zdrY545!gdko(woDMeBy~j;Sa%RPZpG`17KnRx@K7`Ay7tIXfX*CCw&ZoV=0;G zt@i}Nin$5uFrR6PM{1Q6F z*Fb$9@KhY~G=QD%32t@&i{5YN1%@4ZEOs&VT1&@g-maj7ewzvqRM;Q9=e;peEv+5} zrG@q}WE>_%1_7}o1E1cNT~66Fg|_C-C3Fr11aH(uiChH)L-JA=KuQH0J%FlHn#IC54b~sp^ByEg4{P|-;YrWnAsgdok)x7 zWlPj7=~4XjA(gEA43QKU@R)skH?Pqog}n6%sz$? z(OVt<9_-v@e!d^>vb~$asXt}2j_<;u<`e!!`7r>CuQpErDIVD-eij89-Ou91cJ3g3 zWfJ9fxH!Wfci={{#uIa~#-j%AZxqtf9fzX%dtY?=-3%|BjnJ>OF6FxE&}2QRTCnUz z;}G*c&b=3x?d9>XEes{bb@aTG+(571GS#mT9xZ2BG47&$Yj$?*#$r5IK`@OB>w-`~ zpzr4&53ghc_VEzkx8nT~gjc`ek=Jxb#5f@)BSe<+RlCLJIXWKlE^lXn^~4@s-P97k z*@b(gz!t^d^Mc=L_HcWXPd>JN4lT*~AjjS{RnQ`mT%GoQ-(udp0!>?@bNvTbo~fCL zi^MxV1#o*pTiXD^K-0TtCWct?roeyKVcf25p%0Yj_zm|&{o|u=0 zTAI9WXQ}mS3n^wTjj3R{2$@fy|Oy`g!vXC!C9G8a6*bPK>?`MFExjj}vbr1CX=>CqQ= z^EKQPZr}Wbf({KSlm+tbfL2=(#!o1fxk-F=YcI2`mIq}bF zq}a(HGbkYHs*_q*lYRkW&C}DfT99;3`_oD<@%xe=0c02h&vSYCc0k9qe^HVw-UMm`9S7RBXX+5UzCvWc;3ZRG6+sEq-!B!&YoLc$0lV%b{> zqZ=fRAVZ_{V)=n;YCJ2r9FPvmJ{2zm(+n%ePO%3S zcf@2!i*mNmI4>7x=g$aE|A<06(|5YfM*~Wy_Z&Z+(Mg`A-sGriP!HM9NnMF-biJWl zu!@aeq31YH)(zW&D2vKwQLl(0tp9;PLbqY7lc?Zx^oPeYP1{6}m5C0yGrM`>JKW*ic%HvR_JHvfs@mXe_xOE$ETkAS0Fo@z;OZ6)wi)xdZKUQmPQJP z-cZr0@BjDC1;=kfi#&KQmm*iyERy;iNaVpTV!E~w-=!^Ducma^OtYM_89Z=Z9<3=i z+g!i_Y`6+7tqYx;5C@oZ>!0snrUiNTv?8)~=C6$?XsGp@=_h}Ivj_75$QS@hPF6t` z7Ms0RrIXgZ@blvk<`CR=vMH)URZ)~32y1^)LMn;CfVYBiy$p~xLLj-K!Nb)P9rshV zXo*vyR+TX*uL=$iJqDgiz-!+%p6!=0=X0LeS}6>6(bUY_EvDE-j!{GQR6f4Q07_EX zt2$S}32~}b@&6UkM%HK3_6+ieOE~@

7?j79B`8C`who7a2*Ix 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 Yv7Z-VUpX{@?sIouz*M1C@@B#R2V)&OEdT%j diff --git a/hacks/legends_sb/patches.info b/hacks/legends_sb/patches.info index 06629e2..d5ec9f4 100644 --- a/hacks/legends_sb/patches.info +++ b/hacks/legends_sb/patches.info @@ -4,7 +4,7 @@ { "file": "legends.bps", "name": "Pokémon Legends SB", - "description": "Pokémon Emerald (USA, Europe) Base ROM", + "description": "", "outputName": "pokemon_legends_sb" } ] From 4b73e1c351b90ffeeef00ff0fceb33c04f75466d Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:47:53 +0100 Subject: [PATCH 09/17] =?UTF-8?q?Refactor=20Pok=C3=A9mon=20Two?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hacks/pokemon_two/color.css | 1 + hacks/pokemon_two/config.js | 11 ++ hacks/pokemon_two/index.html | 187 ++++++++++++++++++++++----------- hacks/pokemon_two/info.md | 0 hacks/pokemon_two/patches.info | 2 +- 5 files changed, 136 insertions(+), 65 deletions(-) create mode 100644 hacks/pokemon_two/config.js create mode 100644 hacks/pokemon_two/info.md diff --git a/hacks/pokemon_two/color.css b/hacks/pokemon_two/color.css index 3729580..9fc8a5d 100644 --- a/hacks/pokemon_two/color.css +++ b/hacks/pokemon_two/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/pokemon_two/config.js b/hacks/pokemon_two/config.js new file mode 100644 index 0000000..44fd446 --- /dev/null +++ b/hacks/pokemon_two/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "POKéMON TWO", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "", + github: "https://github.com/shachar700/tarc2", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/pokemon_two/index.html b/hacks/pokemon_two/index.html index e7c831b..1eadad3 100644 --- a/hacks/pokemon_two/index.html +++ b/hacks/pokemon_two/index.html @@ -2,12 +2,10 @@ - POKéMON TWO + - - @@ -18,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -61,35 +59,35 @@ - +

- Hack Logo Alttext -

POKéMON TWO

+ {title} Logo +

{title}

-
+
@@ -100,6 +98,12 @@

POKéMON TWO

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -147,33 +151,88 @@

POKéMON TWO

- +

Powered by Rom Patcher JS + src="../../rom-patcher-js/assets/powered_by_rom_patcher_js.png" loading="lazy" />Powered by Rom Patcher + JS
+ + + + \ No newline at end of file diff --git a/hacks/pokemon_two/info.md b/hacks/pokemon_two/info.md new file mode 100644 index 0000000..e69de29 diff --git a/hacks/pokemon_two/patches.info b/hacks/pokemon_two/patches.info index 9e3305b..ad6339d 100644 --- a/hacks/pokemon_two/patches.info +++ b/hacks/pokemon_two/patches.info @@ -4,7 +4,7 @@ { "file": "Pokemon_TWO v1.0.bps", "name": "POKéMON TWO (v1.0)", - "description": "Pokémon Emerald (USA, Europe) Base ROM", + "description": "", "outputName": "pokemon_two_v1.0" } ] From d553602df4b21844a0a5ad01027447df6b8432a1 Mon Sep 17 00:00:00 2001 From: HashtagMarky <143505183+HashtagMarky@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:51:37 +0100 Subject: [PATCH 10/17] Refactor Recordkeepers --- hacks/recordkeepers/color.css | 1 + hacks/recordkeepers/config.js | 11 ++ hacks/recordkeepers/index.html | 187 ++++++++++++++++++++----------- hacks/recordkeepers/info.md | 0 hacks/recordkeepers/patches.info | 2 +- 5 files changed, 135 insertions(+), 66 deletions(-) create mode 100644 hacks/recordkeepers/config.js create mode 100644 hacks/recordkeepers/info.md diff --git a/hacks/recordkeepers/color.css b/hacks/recordkeepers/color.css index 3729580..9fc8a5d 100644 --- a/hacks/recordkeepers/color.css +++ b/hacks/recordkeepers/color.css @@ -1,3 +1,4 @@ :root { + --page-title-color: #e4e4e6; --page-bg-color: #3f547b; } diff --git a/hacks/recordkeepers/config.js b/hacks/recordkeepers/config.js new file mode 100644 index 0000000..1a0bc39 --- /dev/null +++ b/hacks/recordkeepers/config.js @@ -0,0 +1,11 @@ +window.TARP_CONFIG = { + title: "Pokémon Recordkeepers", + base: "Pokémon Emerald (USA, Europe)", + + externalLinks: { + discord: "https://discord.com/invite/C7jdUwPTky", + github: "https://github.com/hedara90/tarc2/tree/TARC2-Release", + pokécommunity: "", + reddit: "" + } +}; \ No newline at end of file diff --git a/hacks/recordkeepers/index.html b/hacks/recordkeepers/index.html index 46f3b95..1eadad3 100644 --- a/hacks/recordkeepers/index.html +++ b/hacks/recordkeepers/index.html @@ -2,13 +2,10 @@ - - Pokémon Recordkeepers + - - @@ -19,34 +16,34 @@ window.addEventListener('load', function (evt) { try { fetch("./patches.info") - .then(res => res.json()) - .then(patchInfo => { - RomPatcherWeb.initialize( - { - language: 'en', - requireValidation: true, - allowDropFiles: true - }, - patchInfo - ); - - const downloadBtn = document.getElementById('rom-patcher-button-download'); - const patchSelect = document.getElementById('rom-patcher-select-patch'); - - downloadBtn.onclick = () => { - const selectedIndex = patchSelect.selectedIndex; - if (selectedIndex < 0) return; - - const patch = patchInfo.patches[selectedIndex]; - const link = document.createElement('a'); - link.href = `./patches/${patch.file}`; - link.download = patch.file.split('/').pop(); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - }) - .catch(err => console.error(err)); + .then(res => res.json()) + .then(patchInfo => { + RomPatcherWeb.initialize( + { + language: 'en', + requireValidation: true, + allowDropFiles: true + }, + patchInfo + ); + + const downloadBtn = document.getElementById('rom-patcher-button-download'); + const patchSelect = document.getElementById('rom-patcher-select-patch'); + + downloadBtn.onclick = () => { + const selectedIndex = patchSelect.selectedIndex; + if (selectedIndex < 0) return; + + const patch = patchInfo.patches[selectedIndex]; + const link = document.createElement('a'); + link.href = `./patches/${patch.file}`; + link.download = patch.file.split('/').pop(); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + }) + .catch(err => console.error(err)); } catch (err) { var message = err.message; if (/incompatible browser/i.test(message) || /variable RomPatcherWeb/i.test(message)) @@ -62,35 +59,35 @@ - +
- Pokémon Transform Logo -

Pokémon Recordkeepers

+ {title} Logo +

{title}

-
+
@@ -101,6 +98,12 @@

Pokémon Recordkeepers

#rom-patcher-button-apply The rest of elements are informative and can be removed, though it's recommended to keep them for a better user experience. --> +
+ + Base ROM:
+ {base} +
+
@@ -148,34 +151,88 @@

Pokémon Recordkeepers

- +

diff --git a/rom-patcher-js/style.css b/rom-patcher-js/style.css index c4ab243..a4e4b5c 100644 --- a/rom-patcher-js/style.css +++ b/rom-patcher-js/style.css @@ -525,8 +525,11 @@ img { text-align: center; } +:root { + --rom-patcher-link-color: #cce; +} #rom-patcher-powered a { - color: #cce; + color: var(--rom-patcher-link-color); padding: 4px 8px; text-decoration: none; opacity: .25; @@ -551,7 +554,7 @@ img { } #team-aqua-homepage a { - color: #cce; + color: var(--rom-patcher-link-color); padding: 4px 8px; text-decoration: none; opacity: .25; diff --git a/tutorials/how_to_add_hack.md b/tutorials/how_to_add_hack.md index 9c517ad..ef287b2 100644 --- a/tutorials/how_to_add_hack.md +++ b/tutorials/how_to_add_hack.md @@ -28,7 +28,10 @@ Firstly we'll create your very own patching page, allowing information about you 3. Within this same file, the `discord:`, `github:`, `pokécommunity:` and/or `reddit:` fields can be filled with links in order to display buttons for each on your patching page. 4. Add a high-resolution logo for your hack to your folder, named `logo.png`. This will appear at the top of your hack’s page. 5. Open `info.md`. When adding more information such as screenshots, features, credits, etc. to this file, it will display the content on your hack page. -6. Open `color.css`. Changing the value of `--page-title-color`, will edit the title colour and `--page-bg-color` will change the background colour of the patching page. +6. Open `color.css`. Changing the colours within this will change parts of the patching page. + - `--page-title-color` will edit the title colour + - `--page-bg-color` will change the background colour + - `--page-rom-patcher-link-color` will change the link colour below the rom patcher from the default if defined ### Patches & Info 1. If it doesn't already exist, create a subfolder called `patches` within your patching page directory.