Compare commits

..

10 Commits

102 changed files with 249 additions and 303 deletions

View File

@ -1 +1,2 @@
Sheila Aman <sheila@vulpine.house> Kiyoshi Aman <kiyoshi.aman@gmail.com>
Síle Ekaterin Liszka <sheila@vulpine.house> Kiyoshi Aman <kiyoshi.aman@gmail.com>
Síle Ekaterin Liszka <sheila@vulpine.house> Sheila Aman

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

101
dist/readme.html vendored Normal file
View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Exdeath readme</title>
<style>
body {
width: 60vw;
margin: 0 auto;
}
@media (prefers-color-scheme: light) {
body {
color: #000;
background-color: #F2F2F2;
}
a:link, a:visited {
color: #05B;
}
a:hover, a:active {
color: #50B;
}
}
@media (prefers-color-scheme: dark) {
body {
color: #BBB;
background-color: #000;
}
a:link, a:visited {
color: #5BF;
}
a:hover, a:active {
color: #B5F;
}
}
</style>
<head>
<body>
<h2>Exdeath</h2>
<p>Exdeath is a patch compactor, a tool that applies multiple patches to a single target file. You will need the US version of the Gameboy Advance release, which you can find through your favourite search engine. </p>
<p>The program should have the following file layout:</p>
<ul>
<li><tt>Exdeath.exe</tt> — the program itself.</li>
<li><tt>libgcc_s_seh-1.dll</tt> — base library for programs built with GCC for Windows.</li>
<li><tt>libstdc++-6.dll</tt> — base library for C++ programs.</li>
<li><tt>libwinpthread-1.dll</tt> — library for threaded execution.</li>
<li><tt>modes/</tt> — This directory contains patches which alter Final Fantasy V Advance gameplay significantly.</li>
<li><tt>ned/</tt> — This directory contains patches which replace Neo Exdeath graphics.</li>
<li><tt>platforms/qwindows.dll</tt> — Qt 6 platform library for Windows.</li>
<li><tt>Qt6Core.dll</tt> — Qt 6 core library.</li>
<li><tt>Qt6Gui.dll</tt> — Qt 6 GUI library.</li>
<li><tt>Qt6Widgets.dll</tt> — Qt 6 widgets library.</li>
<li><tt>readme.html</tt> — This document, which you are reading now.</li>
<li><tt>readme.balance.html</tt> — Documentation for Ian's Rebalance patch.</li>
<li><tt>readme.waddle.html</tt> — Documentation for The Great Waddler's Balance patch.</li>
</ul>
<p>This version provides the following features:</p>
<h3>Main</h3>
<p>The real meat of the program: the patches. As of 0.10.0, only the base game is built in to Exdeath. You can add more modes by placing them in the <tt>modes/</tt> directory. No support is provided for mode patches which did not come with Exdeath, however.</p>
<ul>
<li><b>Base</b>:<ul>
<li>None &mdash; The base game.</li>
<li><a href="http://jeffludwig.com/ff5a/download.php">Custom Classes</a> &mdash; A different remixed version by ludmeister.</li>
<li><a href="readme.balance.html">Ian's Rebalance</a> &mdash; A remixed version that has a more subtle touch than the other three.</li>
<li><a href="https://www.dropbox.com/s/rvf9l3pwbkelu42/ffvamod-doc.txt?dl=0">Balance</a> &mdash; A remixed version which adds the Hero Job and changes things up.</li>
<li><a href="readme.waddle.html">Waddler Rebalance</a> &mdash; Yet another remixed version which aims to pump up some underwhelming Jobs without altering overall balance too much.</li>
</ul></li>
<li><b>Unlocked Jobs</b>: Unlocks all jobs directly out of the gate. Half of <a href="https://www.dropbox.com/s/ldlmpoepxk5nxgl/fiesta.ups?dl=0">wormsofcan's Fiesta patch</a>.</li>
<li><b>FFT-style Portraits</b>: As the name implies, this option replaces the portraits with edited Final Fantasy Tactics portraits. (missing attribution, sorry.)</li>
<li><b>Sound Restoration</b>: The <a href="http://www.romhacking.net/hacks/563/">Sound Restoration</a> hack modifies the soundfont and corrects some slow-down issues. It can cause artifacting, however. Older versions of VisualBoyAdvance will require the GBA BIOS file in order to run normally with this option.</li>
<li><b>Save Config</b>: Saves your current configuration, including the ROM location. This configuration will be automatically loaded on next run.</li>
</ul>
<h3>Randomization</h3>
<p>Randomizable components. Note that, as of 0.10.0, you can add your own Neo Exdeath patches by placing them in the <tt>ned/</tt> directory.</p>
<ul>
<li><b>Seed</b>: A number used to set the random number generator to a known state. The range accepted is 0 through 2<sup>31</sup> &ndash; 1, inclusive. Default value is the current time in seconds since 1 January 1970 00:00 UTC, divided by 3600.</li>
<li><b>Neo ExDeath</b>: Pick graphics for the final boss.</li>
<li><b>Abilities</b>: Shuffles abilities such that all Jobs learn five abilities and have a randomized command.</li>
</ul>
<h3>Innate abilities</h3>
<p>Each checkbox applies the listed innate ability to all Jobs.</p>
<h3>Multipliers</h3>
<p>Multiply experience, ability point, or gil awards from battle. Experience and gil are hard-capped at 65,535 and ability points are hard-capped at 255, regardless of multiplier.</p>
<h2>Notes</h2>
<p>The 'Unlocked Jobs' patch includes a patch that allows <b>!Combine</b> ammo to drop prior to unlocking the sealed weapons. This alters the drop tables for the following enemies:</p>
<ul>
<li>Buckshot:<ul>
<li>Black Flame</li>
<li>Birostris</li>
<li>Elm Gigas</li>
</ul></li>
<li>Blastshot:<ul>
<li>Blood Slime</li>
<li>Executor</li>
</ul></li>
<li>Blitzshot:<ul>
<li>Mummy</li>
</ul></li>
</ul>
</body>
</html>

View File

@ -1,6 +1,6 @@
HEADERS += src/exdeath.hh src/data.hh src/randodata.hh src/randomizer.hh src/fiesta.hh
SOURCES += src/exdeath.cc src/main.cc src/randomizer.cc src/fiesta.cc
HEADERS += src/exdeath.hh src/data.hh src/randodata.hh src/randomizer.hh src/fiesta.hh src/patch.hh
SOURCES += src/exdeath.cc src/main.cc src/randomizer.cc src/fiesta.cc src/patch.cc
RESOURCES += patches.qrc
CONFIG += release

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@ -3,10 +3,6 @@
<qresource>
<file>patches/fixnames.ips</file>
<file>patches/unlock.ips</file>
<file>patches/Ian's Balance Patch.ips</file>
<file>patches/balance.ips</file>
<file>patches/custom_classes.ips</file>
<file>patches/waddle.ips</file>
<file>patches/portraits.ips</file>
<file>patches/sound_restoration.ips</file>
<file>patches/xp/2x.ips</file>
@ -20,86 +16,5 @@
<file>patches/gil/8x.ips</file>
<file>gallery/ned/random.png</file>
<file>gallery/ned/vanilla.png</file>
<file>patches/ned/abs_vir.ips</file>
<file>gallery/ned/abs_vir.png</file>
<file>patches/ned/barf.ips</file>
<file>gallery/ned/barf.png</file>
<file>patches/ned/biolizard.ips</file>
<file>gallery/ned/biolizard.png</file>
<file>patches/ned/BizarroParty.ips</file>
<file>gallery/ned/BizarroParty.png</file>
<file>patches/ned/cactuar.ips</file>
<file>gallery/ned/cactuar.png</file>
<file>patches/ned/cad.ips</file>
<file>gallery/ned/cad.png</file>
<file>patches/ned/chaos.ips</file>
<file>gallery/ned/chaos.png</file>
<file>patches/ned/chomp.ips</file>
<file>gallery/ned/chomp.png</file>
<file>patches/ned/classic.ips</file>
<file>patches/ned/emperor.ips</file>
<file>gallery/ned/emperor.png</file>
<file>patches/ned/fancy.ips</file>
<file>gallery/ned/fancy.png</file>
<file>patches/ned/fiend_ned.ips</file>
<file>gallery/ned/fiend_ned.png</file>
<file>patches/ned/FiestaParty.ips</file>
<file>gallery/ned/FiestaParty.png</file>
<file>patches/ned/flammie1.ips</file>
<file>gallery/ned/flammie1.png</file>
<file>patches/ned/flammie2.ips</file>
<file>gallery/ned/flammie2.png</file>
<file>patches/ned/flavortown.ips</file>
<file>gallery/ned/flavortown.png</file>
<file>patches/ned/flanders.ips</file>
<file>gallery/ned/flanders.png</file>
<file>patches/ned/fly.ips</file>
<file>gallery/ned/fly.png</file>
<file>patches/ned/godzilla.ips</file>
<file>gallery/ned/godzilla.png</file>
<file>patches/ned/Jace.ips</file>
<file>gallery/ned/Jace.png</file>
<file>patches/ned/kefka.ips</file>
<file>gallery/ned/kefka.png</file>
<file>patches/ned/lavos-spawn.ips</file>
<file>gallery/ned/lavos-spawn.png</file>
<file>patches/ned/Majima.ips</file>
<file>gallery/ned/Majima.png</file>
<file>patches/ned/MajimaFlipped.ips</file>
<file>gallery/ned/MajimaFlipped.png</file>
<file>patches/ned/mechagodzilla.ips</file>
<file>gallery/ned/mechagodzilla.png</file>
<file>patches/ned/metroid.ips</file>
<file>gallery/ned/metroid.png</file>
<file>patches/ned/neo-x-death.ips</file>
<file>gallery/ned/neo-x-death.png</file>
<file>patches/ned/NeoExChonk.ips</file>
<file>gallery/ned/NeoExChonk.png</file>
<file>patches/ned/neoexduck.ips</file>
<file>gallery/ned/neoexduck.png</file>
<file>patches/ned/NeoExDesert.ips</file>
<file>gallery/ned/NeoExDesert.png</file>
<file>patches/ned/nero_exdeath.ips</file>
<file>gallery/ned/nero_exdeath.png</file>
<file>patches/ned/omega_cannon.ips</file>
<file>gallery/ned/omega_cannon.png</file>
<file>patches/ned/pad.ips</file>
<file>gallery/ned/pad.png</file>
<file>patches/ned/rs3boss.ips</file>
<file>gallery/ned/rs3boss.png</file>
<file>patches/ned/shaq.ips</file>
<file>gallery/ned/shaq.png</file>
<file>patches/ned/targetned.ips</file>
<file>gallery/ned/targetned.png</file>
<file>patches/ned/thomas.ips</file>
<file>gallery/ned/thomas.png</file>
<file>patches/ned/train.ips</file>
<file>gallery/ned/train.png</file>
<file>patches/ned/tree.ips</file>
<file>gallery/ned/tree.png</file>
<file>patches/ned/yiazmat.ips</file>
<file>gallery/ned/yiazmat.png</file>
<file>patches/ned/Zeromus.ips</file>
<file>gallery/ned/Zeromus.png</file>
</qresource>
</RCC>

Binary file not shown.

View File

@ -1,124 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Exdeath 0.2 readme</title>
<style>
body {
width: 60vw;
margin: 0 auto;
}
@media (prefers-color-scheme: light) {
body {
color: #000;
background-color: #F2F2F2;
}
a:link, a:visited {
color: #05B;
}
a:hover, a:active {
color: #50B;
}
}
@media (prefers-color-scheme: dark) {
body {
color: #BBB;
background-color: #000;
}
a:link, a:visited {
color: #5BF;
}
a:hover, a:active {
color: #B5F;
}
}
</style>
<head>
<body>
<h2>Exdeath</h2>
<p>Exdeath is a patch compactor, a tool that applies multiple patches to a single target file. You will need the US version of the Gameboy Advance release, which you can find through your favourite search engine. This version provides the following features:</p>
<h3>Main</h3>
<p>The real meat of the program: the patches.</p>
<ul>
<li><b>Base</b>:<ul>
<li>None &mdash; The base game.</li>
<li><a href="readme.waddle.html">Waddle Rebalance</a> &mdash; Yet another remixed version which aims to pump up some underwhelming Jobs without altering overall balance too much.</li>
<li><a href="https://www.dropbox.com/s/rvf9l3pwbkelu42/ffvamod-doc.txt?dl=0">Balance</a> &mdash; A remixed version which adds the Hero Job and changes things up.</li>
<li><a href="http://jeffludwig.com/ff5a/download.php">Custom Classes</a> &mdash; A different remixed version by ludmeister.</li>
</ul></li>
<li><b>Unlocked Jobs</b>: Unlocks all jobs directly out of the gate. Half of <a href="https://www.dropbox.com/s/ldlmpoepxk5nxgl/fiesta.ups?dl=0">wormsofcan's Fiesta patch</a>.</li>
<li><b>FFT-style Portraits</b>: As the name implies, this option replaces the portraits with edited Final Fantasy Tactics portraits. (missing attribution, sorry.)</li>
<li><b>Sound Restoration</b>: The <a href="http://www.romhacking.net/hacks/563/">Sound Restoration</a> hack modifies the soundfont and corrects some slow-down issues. It can cause artifacting, however. Older versions of VisualBoyAdvance will require the GBA BIOS file in order to run normally with this option.</li>
<li><b>Save Config</b>: Saves your current configuration, including the ROM location. This configuration will be automatically loaded on next run.</li>
</ul>
<h3>Randomization</h3>
<p>Randomizable components.</p>
<ul>
<li><b>Seed</b>: A number used to set the random number generator to a known state. The range accepted is 0 through 2<sup>31</sup> &ndash; 1, inclusive. Default value is the current time in seconds since 1 January 1970 00:00 UTC, divided by 3600.</li>
<li><b>Neo ExDeath</b>: Pick graphics for the final boss.<ul>
<li>Random: Chooses a random NED.</li>
<li>Vanilla: The original.</li>
<li>Absolute Virtue: From Final Fantasy XI: Chains of Promathia.</li>
<li>Barf: From Earthbound.</li>
<li>Biolizard: A biolizard from Sonic Adventure 2.</li>
<li>Cactuar: Jumbotender/gigantuar from Final Fantasy VI Advance.</li>
<li>Chain Chomp: From the Mario series.</li>
<li>Chaos: From Final Fantasy I: Dawn of Souls.</li>
<!--<li>Classic: Assembled from Final Fantasy I bosses.</li>-->
<li>Cloud of Darkness: From Final Fantasy III.</li>
<li>Doomtrain: From Final Fantasy VI.</li>
<li>Emperor: From Final Fantasy II.</li>
<li>Fat Chocobo: From Final Fantasy VII.</li>
<li>Fiends: From Final Fantasy IV.</li>
<li>Flammie: From Secret of Mana; the Mana Beast versions.</li>
<li>Fly: From Breath of Fire 2.</li>
<li>Godzilla: From Super Godzilla.</li>
<li>Guy Fieri: From AFK.</li>
<li>Jace: From Magic: the Gathering.</li>
<li>Kefka: From Final Fantasy VI.</li>
<li>Lavos Spawn: From Chrono Trigger.</li>
<li>Majima: From Yakuza VIII.</li>
<li>Majima (flipped): Above, but flipped.</li>
<li>MechaGodzilla: From Super Godzilla.</li>
<li>Metroid: From Super Metroid.</li>
<li>Neo ExDesert: From this very game.</li>
<li>Neo ExDuck: From "A Duck Amuck".</li>
<li>Neo X Death: From The Matrix, Megaman X, and Super Castlevania IV.</li>
<li>Neon Exdeath: From the Mobile/PC port of Final Fantasy V.</li>
<li>Nero Exdeath: Did you know that the critically-acclaimed MMORPG Final Fantasy XIV has an expanded free trial? you can play through the entirety of "A Realm Reborn" and the award-winning "Heavensward" expansion up to level 60 for <b>free</b> with no restriction on playtime.</li>
<li>Omega Larboard Cannon: From Final Fantasy XIV.</li>
<li>Puzzle &amp; Dragon: From the Puzzle And Dragon crossover.</li>
<li>Romancing SaGa 3 Boss: Guess where.</li>
<li>Shaq: Himself.</li>
<li>Stupid Sexy Flanders: From The Simpsons.</li>
<li>Territorial Oak: From Earthbound?</li>
<li>Warriors of Light: From a Japanese artist who flippped the perspective of the fight with Gilgamesh and Enkidu on the ship.</li>
<li>Warriors of Light (fiesta): Above, but edited to resemble a more normal Fiesta party.</li>
<li>Yiazmat: From Final Fantasy: Record Keeper.</li>
</ul></li>
<li><b>Abilities</b>: Shuffles abilities such that all Jobs learn five abilities and have a randomized command.</li>
</ul>
<p>There is one graphic present that will not be enumerated. You'll know it when you see it.</p>
<h3>Innate abilities</h3>
<p>Each checkbox applies the listed innate ability to all Jobs.</p>
<h3>Multipliers</h3>
<p>Multiply experience, ability point, or gil awards from battle. Experience and gil are hard-capped at 65,535 and ability points are hard-capped at 255, regardless of multiplier.</p>
<h2>Notes</h2>
<p>The 'Unlocked Jobs' mode includes a patch that allows <b>!Combine</b> ammo to drop prior to unlocking the sealed weapons. This alters the drop tables for the following enemies:</p>
<ul>
<li>Buckshot:<ul>
<li>Black Flame</li>
<li>Birostris</li>
<li>Elm Gigas</li>
</ul></li>
<li>Blastshot:<ul>
<li>Blood Slime</li>
<li>Executor</li>
</ul></li>
<li>Blitzshot:<ul>
<li>Mummy</li>
</ul></li>
</ul>
</body>
</html>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2021, Sheila Aman.
* Copyright (c) 2023, Síle Ekaterin Liszka.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -27,8 +27,10 @@
#include <QApplication>
#include <QTextStream>
#include <iostream>
#include "exdeath.hh"
#include "patch.hh"
#include <cstring>
#include <cstdlib>
@ -36,7 +38,7 @@
#include <ctime>
#include <climits>
Exdeath::Exdeath(QSettings *cfg, QWidget *parent) : QWidget(parent) {
Exdeath::Exdeath(QSettings *cfg, QList<QPair<QString,QString> > modes, QList<QPair<QString,QString> > NEDs, QWidget *parent) : QWidget(parent) {
error = new QErrorMessage();
filename = nullptr;
_cfg = cfg;
@ -51,15 +53,15 @@ Exdeath::Exdeath(QSettings *cfg, QWidget *parent) : QWidget(parent) {
layColumns->addLayout(layLeft);
layColumns->addLayout(layRight);
initMain();
initRandom();
initMain(modes);
initRandom(NEDs);
initInnates();
initMulti();
initPreview();
initConfig();
connect(btnROM, &QPushButton::clicked, this, &Exdeath::btnROM_clicked);
connect(selMode, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Exdeath::selMode_index);
connect(selMode, QOverload<int>::of(&QComboBox::activated), this, &Exdeath::selMode_index);
connect(selNED, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Exdeath::selNED_index);
connect(btnApply, &QPushButton::clicked, this, &Exdeath::btnApply_clicked);
connect(btnSave, &QPushButton::clicked, this, &Exdeath::btnSave_clicked);
@ -67,7 +69,7 @@ Exdeath::Exdeath(QSettings *cfg, QWidget *parent) : QWidget(parent) {
Exdeath::~Exdeath() {}
void Exdeath::initMain(void) {
void Exdeath::initMain(QList<QPair<QString,QString> > modes) {
layMain = new QGridLayout(this);
grpMain = new QGroupBox("Main");
grpMain->setLayout(layMain);
@ -79,10 +81,12 @@ void Exdeath::initMain(void) {
txtMode = new QLabel("Mode:");
selMode = new QComboBox();
selMode->addItem("Base");
selMode->addItem("Ian's Balance", "Ian's Balance Patch.ips");
selMode->addItem("Waddler Rebalance", "waddle.ips");
selMode->addItem("Balance", "balance.ips");
selMode->addItem("Custom Classes", "custom_classes.ips");
for (int i = 0; i < modes.size(); i++) {
QPair<QString,QString> file = modes.at(i);
selMode->addItem(file.first, file.second);
}
txtUnlock = new QLabel("Unlock Jobs:");
chkUnlock = new QCheckBox("Yes");
@ -111,7 +115,7 @@ void Exdeath::initMain(void) {
layMain->addWidget(btnSave, 5, 1);
}
void Exdeath::initRandom(void) {
void Exdeath::initRandom(QList<QPair<QString,QString> > NEDs) {
layRandom = new QFormLayout(this);
grpRandom = new QGroupBox("Randomization");
grpRandom->setLayout(layRandom);
@ -127,47 +131,11 @@ void Exdeath::initRandom(void) {
selNED->addItem("Random", "random");
selNED->addItem("Vanilla", "vanilla");
selNED->setCurrentIndex(1);
selNED->addItem("Absolute Virtue", "abs_vir");
selNED->addItem("Barf", "barf");
selNED->addItem("Biolizard", "biolizard");
selNED->addItem("Cactuar", "cactuar");
selNED->addItem("Chain Chomp", "chomp");
//selNED->addItem("Classic", "classic");
selNED->addItem("Chaos", "chaos");
selNED->addItem("Cloud of Darkness", "cad");
selNED->addItem("Doomtrain", "train");
selNED->addItem("Emperor", "emperor");
selNED->addItem("Fat Chocobo", "NeoExChonk");
selNED->addItem("Fiends", "fiend_ned");
selNED->addItem("Flammie (1)", "flammie1");
selNED->addItem("Flammie (2)", "flammie2");
selNED->addItem("Fly", "fly");
selNED->addItem("Godzilla", "godzilla");
selNED->addItem("Guy Fieri", "flavortown");
selNED->addItem("Jace", "Jace");
selNED->addItem("Lavos Spawn", "lavos-spawn");
selNED->addItem("Kefka", "kefka");
selNED->addItem("Majima", "Majima");
selNED->addItem("Majima (flipped)", "MajimaFlipped");
selNED->addItem("MechaGodzilla", "mechagodzilla");
selNED->addItem("Metroid", "metroid");
selNED->addItem("Neo X Death", "neo-x-death");
selNED->addItem("Neo ExDesert", "NeoExDesert");
selNED->addItem("Neo ExDuck", "neoexduck");
selNED->addItem("Neon ExDeath", "fancy");
selNED->addItem("Nero Exdeath", "nero_exdeath");
selNED->addItem("Omega Larboard Cannon", "omega_cannon");
selNED->addItem("Puzzle & Dragon", "pad");
selNED->addItem("Romancing SaGa 3 Boss", "rs3boss");
selNED->addItem("Shaq", "shaq");
selNED->addItem("Stupid Sexy Flanders", "flanders");
selNED->addItem("TargetNED", "targetned");
selNED->addItem("Territorial Oak", "tree");
selNED->addItem("Thomas the Tank Engine", "thomas");
selNED->addItem("Warriors of Light", "BizarroParty");
selNED->addItem("Warriors of Light (Fiesta)", "FiestaParty");
selNED->addItem("Yiazmat", "yiazmat");
selNED->addItem("Zeromus", "Zeromus");
for (int i = 0; i < NEDs.size(); i++) {
QPair<QString,QString> file = NEDs.at(i);
selNED->addItem(file.first, file.second);
}
layRandom->addRow("Neo ExDeath:", selNED);
chkRandom = new QCheckBox("Yes");
@ -282,7 +250,7 @@ void Exdeath::initConfig(void) {
}
// don't load config from old versions.
if (version.compare(cfgVersion) != 0) {
out << "doesn't match!\n";
std::cout << "doesn't match!\n";
return;
}
QString temp = _cfg->value("rom/filename", "").toString();
@ -311,40 +279,30 @@ void Exdeath::initConfig(void) {
}
void Exdeath::selNED_index(int idx) {
imgPreview = new QPixmap(":/gallery/ned/" + selNED->itemData(idx).toString() + ".png");
QString filename = selNED->itemData(idx).toString();
if (filename == "random") {
filename = ":/gallery/ned/random.png";
} else if (filename == "vanilla") {
filename = ":/gallery/ned/vanilla.png";
} else {
filename += ".png";
}
imgPreview = new QPixmap(filename);
txtPreview->setPixmap(*imgPreview);
}
void Exdeath::selMode_index(int idx) {
bool random_ok = false;
bool unlock_ok = false;
bool innate_ok = false;
bool sound_ok = false;
bool ned_ok = false;
if (idx == 0) return;
int ret = QMessageBox::warning(
this,
tr("Exdeath"),
tr("Using a mode other than Base may cause innate abilities, ability randomization, or Neo Exdeath graphic changes to break the game.\nAre you sure you want to do this?"),
QMessageBox::Yes | QMessageBox::No
);
if (idx < 3) {
unlock_ok = true;
innate_ok = true;
sound_ok = true;
ned_ok = true;
if (ret == QMessageBox::No) {
selMode->setCurrentIndex(0);
}
if (idx <= 1) {
random_ok = true;
}
chkRandom->setEnabled(random_ok);
chkUnlock->setEnabled(unlock_ok);
chkSound->setEnabled(sound_ok);
selNED->setEnabled(ned_ok);
chkPassages->setEnabled(innate_ok);
chkPitfalls->setEnabled(innate_ok);
chkLiteStep->setEnabled(innate_ok);
chkDash->setEnabled(innate_ok);
chkLearning->setEnabled(innate_ok);
innates_enabled = innate_ok;
}
void Exdeath::btnSave_clicked(bool trigger) {
@ -410,7 +368,11 @@ void Exdeath::btnApply_clicked(bool trigger) {
QString output = QFileDialog::getSaveFileName(
this,
"Select target ROM image",
#ifdef __WIN32__
QApplication::applicationDirPath(),
#else
QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0],
#endif
"GBA ROM images (*.gba)"
);
QFile::copy(filename, output);
@ -422,7 +384,7 @@ void Exdeath::btnApply_clicked(bool trigger) {
patches << ":/patches/fixnames.ips";
if (mode > 0) {
patches << ":/patches/" + selMode->itemData(mode).toString();
patches << selMode->itemData(mode).toString();
}
if (chkUnlock->isChecked() && chkUnlock->isEnabled()) {
patches << ":/patches/unlock.ips";

View File

@ -15,6 +15,8 @@
#include <QGroupBox>
#include <QIODevice>
#include <QLabel>
#include <QList>
#include <QMessageBox>
#include <QPixmap>
#include <QPushButton>
#include <QRadioButton>
@ -32,7 +34,7 @@
class Exdeath : public QWidget {
public:
Exdeath(QSettings *cfg, QWidget *parent = nullptr);
Exdeath(QSettings *cfg, QList<QPair<QString,QString> > modes, QList<QPair<QString,QString> > NEDs, QWidget *parent = nullptr);
~Exdeath();
private:
@ -105,9 +107,9 @@ private:
QPixmap *imgPreview;
// Initialization
void initMain(void);
void initMain(QList<QPair<QString,QString> > modes);
void initInnates(void);
void initRandom(void);
void initRandom(QList<QPair<QString,QString> > NEDs);
void initMulti(void);
void initPreview(void);
void initConfig(void);

View File

@ -1,10 +1,9 @@
/*
* Copyright (c) 202BER, Sheila Aman.
* Copyright (c) 2023, Síle Ekaterin Liszka.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2021, Sheila Aman.
* Copyright (c) 2023, Síle Ekaterin Liszka.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -26,8 +26,10 @@
*/
#include "exdeath.hh"
#include "patch.hh"
#include <QApplication>
#include <iostream>
int main(int argc, char **argv) {
QApplication *app = new QApplication(argc, argv);
@ -35,10 +37,19 @@ int main(int argc, char **argv) {
QApplication::setOrganizationDomain("aerdan.org");
QApplication::setApplicationName("Exdeath");
QApplication::setApplicationDisplayName("Exdeath");
QApplication::setApplicationVersion("0.9.1");
QApplication::setApplicationVersion("0.10.0");
#ifdef __WIN32__
QString path = QApplication::applicationDirPath();
#else
QString path = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation)[0];
#endif
QDir dir = QDir(path);
QList<QPair<QString,QString> > modes = getPatchList(dir, PatchType::Mode);
QList<QPair<QString,QString> > NEDs = getPatchList(dir, PatchType::NED);
QSettings *cfg = new QSettings();
Exdeath *win = new Exdeath(cfg);
Exdeath *win = new Exdeath(cfg, modes, NEDs);
win->show();

64
src/patch.cc Normal file
View File

@ -0,0 +1,64 @@
/*
* Copyright (c) 2023, Síle Ekaterin Liszka.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the software nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "patch.hh"
QList<QPair<QString,QString> > getPatchList(QDir dir, PatchType type) {
QList<QPair<QString,QString> > list;
if (!dir.exists()) {
return list;
}
if (type == PatchType::Mode) {
dir.cd("modes");
if (!dir.exists()) {
return list;
}
} else if (type == PatchType::NED) {
dir.cd("ned");
if (!dir.exists()) {
return list;
}
}
dir.setFilter(QDir::Files | QDir::Readable);
dir.setSorting(QDir::Name);
QFileInfoList files = dir.entryInfoList();
for (int i = 0; i < files.size(); i++) {
QFileInfo file = files.at(i);
if (file.suffix() == "ips") {
QString filename = file.canonicalPath() + "/" + file.completeBaseName() + ".ips";
QPair<QString,QString> pair = {file.completeBaseName(), filename};
list.append(pair);
}
}
return list;
}

Some files were not shown because too many files have changed in this diff Show More