├── .gitignore ├── src ├── icon.ico ├── icon.icns ├── icons │ ├── iceSprayCan.png │ ├── redSprayCan.png │ ├── chalkSprayCan.png │ ├── grapeSprayCan.png │ ├── greenSprayCan.png │ ├── oceanSprayCan.png │ ├── pinkSprayCan.png │ ├── snowSprayCan.png │ ├── stoneSprayCan.png │ ├── KDL3blueSprayCan.png │ ├── KDL3pinkSprayCan.png │ ├── carbonSprayCan.png │ ├── cherrySprayCan.png │ ├── emeraldSprayCan.png │ ├── lalalaSprayCan.png │ ├── lololoSprayCan.png │ ├── mirrorSprayCan.png │ ├── orangeSprayCan.png │ ├── randomSprayCan.png │ ├── sapphireSprayCan.png │ ├── yellowSprayCan.png │ ├── chocolateSprayCan.png │ ├── grayscaleSprayCan.png │ ├── metaKnightSprayCan.png │ └── waddleDeeSprayCan.png ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── rgb2gba.py ├── KNDL-Script.lua ├── Kirby.pro ├── KNDL-Randomize.py ├── mainwindow.py ├── mainwindow.ui └── Kirby.pro.user ├── docs ├── kndl.css ├── index.html └── aquova_kndl_notes.txt ├── LICENSE.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *__pycache__ 2 | *.swp 3 | *build 4 | *dist 5 | *.spec 6 | -------------------------------------------------------------------------------- /src/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icon.ico -------------------------------------------------------------------------------- /src/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icon.icns -------------------------------------------------------------------------------- /src/icons/iceSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/iceSprayCan.png -------------------------------------------------------------------------------- /src/icons/redSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/redSprayCan.png -------------------------------------------------------------------------------- /src/icons/chalkSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/chalkSprayCan.png -------------------------------------------------------------------------------- /src/icons/grapeSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/grapeSprayCan.png -------------------------------------------------------------------------------- /src/icons/greenSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/greenSprayCan.png -------------------------------------------------------------------------------- /src/icons/oceanSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/oceanSprayCan.png -------------------------------------------------------------------------------- /src/icons/pinkSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/pinkSprayCan.png -------------------------------------------------------------------------------- /src/icons/snowSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/snowSprayCan.png -------------------------------------------------------------------------------- /src/icons/stoneSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/stoneSprayCan.png -------------------------------------------------------------------------------- /src/icons/KDL3blueSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/KDL3blueSprayCan.png -------------------------------------------------------------------------------- /src/icons/KDL3pinkSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/KDL3pinkSprayCan.png -------------------------------------------------------------------------------- /src/icons/carbonSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/carbonSprayCan.png -------------------------------------------------------------------------------- /src/icons/cherrySprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/cherrySprayCan.png -------------------------------------------------------------------------------- /src/icons/emeraldSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/emeraldSprayCan.png -------------------------------------------------------------------------------- /src/icons/lalalaSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/lalalaSprayCan.png -------------------------------------------------------------------------------- /src/icons/lololoSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/lololoSprayCan.png -------------------------------------------------------------------------------- /src/icons/mirrorSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/mirrorSprayCan.png -------------------------------------------------------------------------------- /src/icons/orangeSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/orangeSprayCan.png -------------------------------------------------------------------------------- /src/icons/randomSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/randomSprayCan.png -------------------------------------------------------------------------------- /src/icons/sapphireSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/sapphireSprayCan.png -------------------------------------------------------------------------------- /src/icons/yellowSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/yellowSprayCan.png -------------------------------------------------------------------------------- /src/icons/chocolateSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/chocolateSprayCan.png -------------------------------------------------------------------------------- /src/icons/grayscaleSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/grayscaleSprayCan.png -------------------------------------------------------------------------------- /src/icons/metaKnightSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/metaKnightSprayCan.png -------------------------------------------------------------------------------- /src/icons/waddleDeeSprayCan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aquova/KNDL-Rando/HEAD/src/icons/waddleDeeSprayCan.png -------------------------------------------------------------------------------- /docs/kndl.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | text-align: center; 3 | } 4 | 5 | body { 6 | margin-left: 15%; 7 | margin-right: 15%; 8 | } 9 | 10 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | MainWindow w; 8 | w.show(); 9 | 10 | return a.exec(); 11 | } 12 | -------------------------------------------------------------------------------- /src/mainwindow.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include "ui_mainwindow.h" 3 | 4 | MainWindow::MainWindow(QWidget *parent) : 5 | QMainWindow(parent), 6 | ui(new Ui::MainWindow) 7 | { 8 | ui->setupUi(this); 9 | } 10 | 11 | MainWindow::~MainWindow() 12 | { 13 | delete ui; 14 | } 15 | -------------------------------------------------------------------------------- /src/mainwindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MAINWINDOW_H 2 | #define MAINWINDOW_H 3 | 4 | #include 5 | 6 | namespace Ui { 7 | class MainWindow; 8 | } 9 | 10 | class MainWindow : public QMainWindow 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | explicit MainWindow(QWidget *parent = 0); 16 | ~MainWindow(); 17 | 18 | private: 19 | Ui::MainWindow *ui; 20 | }; 21 | 22 | #endif // MAINWINDOW_H 23 | -------------------------------------------------------------------------------- /src/rgb2gba.py: -------------------------------------------------------------------------------- 1 | # A utility to convert 24-bit RGB values into 2 byte GBA values 2 | import sys 3 | 4 | def main(): 5 | rawRGB = input("Give me an RGB color to convert, separated by commas: ") 6 | try: 7 | RGB24 = rawRGB.split(",") 8 | BGR15 = [round(int(x) * 31 / 255) for x in RGB24] 9 | byteValue = (BGR15[2] << 10) + (BGR15[1] << 5) + BGR15[0] 10 | print(hex(byteValue)) 11 | except Exception as e: 12 | print(e) 13 | 14 | if __name__ == "__main__": 15 | try: 16 | print("Press Ctrl-C to quit.") 17 | print("Keep in mind that all bytes need to be reversed for GBA.") 18 | while(True): 19 | main() 20 | except KeyboardInterrupt: 21 | sys.exit(0) 22 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Austin Bricker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/KNDL-Script.lua: -------------------------------------------------------------------------------- 1 | -- This is a script to randomize Kirby's ability in Kirby: Nightmare in Dreamland 2 | -- To be used with the Lua-compatible emulator and a US ROM of K.N.D. 3 | -- Written by Austin Bricker (Aquova), 2017 4 | 5 | -- The power in Kirby's mouth is stored in 0x217A 6 | address = 0x217B 7 | 8 | -- These are the valid values for Kirby abilities, including no ability 9 | abilities = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18} 10 | 11 | -- Function that chooses a random ability when called 12 | function rand_kirby(a) 13 | val = math.random(0,#a - 1) 14 | return a[val] 15 | end 16 | 17 | prev_mouth = 0x00 -- If nothing in Kirby's mouth, defaults to 0x00 18 | while true do 19 | mouth = memory.readbyte(address) -- Read what's currently in mouth 20 | if mouth ~= prev_mouth and mouth ~= 0x00 then 21 | next_ability = rand_kirby(abilities) -- Chooses new ability 22 | memory.writebyte(address, next_ability) -- Replaces old mouth content 23 | prev_mouth = next_ability 24 | end 25 | emu.frameadvance() 26 | end 27 | -------------------------------------------------------------------------------- /src/Kirby.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2017-11-15T15:52:10 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = Kirby 12 | TEMPLATE = app 13 | 14 | # The following define makes your compiler emit warnings if you use 15 | # any feature of Qt which has been marked as deprecated (the exact warnings 16 | # depend on your compiler). Please consult the documentation of the 17 | # deprecated API in order to know how to port your code away from it. 18 | DEFINES += QT_DEPRECATED_WARNINGS 19 | 20 | # You can also make your code fail to compile if you use deprecated APIs. 21 | # In order to do so, uncomment the following line. 22 | # You can also select to disable deprecated APIs only up to a certain version of Qt. 23 | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 24 | 25 | 26 | SOURCES += \ 27 | main.cpp \ 28 | mainwindow.cpp 29 | 30 | HEADERS += \ 31 | mainwindow.h 32 | 33 | FORMS += \ 34 | mainwindow.ui 35 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | KNDL Randomizer 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |

Kirby: Nightmare in Dream Land Randomizer

14 |

I've made a randomizer for Kirby: Nightmare in Dream Land for Game Boy Advance. This is a remake of Kirby's Adventure, the other game I've made a randomizer for. It has many of the same features, but doesn't support level randomization yet. However, it does offer more new color combinations!

15 | 16 |

Changed Abilities

17 |

Eating enemies now gives you a new ability at random! When you run the randomizer and select the Randomize enemies option, all of the enemy abilities are switched around. This is only done once, so the abilities that enemies give you are set for the entire game. If you want the abilities to be truely random, I've also included a Lua script for certain emulators that does just that!

18 | 19 |

New Color Options

20 |

Nightmare in Dream Land is a cool game. However, the other Game Boy Advance Kirby game, Kirby and the Amazing Mirror had different colors you could unlock for Kirby, I wish you could do that in this game... Well, worry not! The randomizer also allows you to change Kirby's palette to any of the 13 new colors from Amazing Mirror, and several other colors based on other games in the series!

21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KNDL-Rando 2 | 3 | Kirby: Nightmare in Dream Land Randomizer 4 | 5 | Randomization program for Kirby: Nightmare in Dream Land (KNDL) for GBA 6 | 7 | https://github.com/aquova/KNDL-Rando 8 | 9 | Written by Austin Bricker (aquova), 2017-2018 10 | 11 | `https://twitter.com/aquova_` 12 | 13 | ## -- Overview -- 14 | 15 | Contained are programs to randomize the enemy abilities in Kirby: Nightmare in Dream Land. There are three programs contained within this repository which are to be used with a US version of Kirby: Nightmare in Dream Land for GBA. 16 | 17 | First is a .lua script intended to be used with BizHawk or similar lua-compatible emulator. The lua script edits the RAM in real time, ensuring a completely random ability each time an enemy is swallowed. Keep in mind this is a work in progress, and some bugs have been known to occur. 18 | 19 | Secondly, there is a program that edits the ROM, allowing it to be distributed and used with any emulator, as detailed below. 20 | However, while the abilites are randomized, they are always constant within that ROM. 21 | Ex. If a fire enemy now gives you the spark ability, ALL fire enemies will always give you the spark ability. 22 | 23 | ## -- Features -- 24 | 25 | - Randomizes which ability you gain from swallowing an enemy 26 | - Change Kirby and Meta Knight's colors to several different options, including all the colors from *Kirby and the Amazing Mirror* 27 | 28 | ## -- Usage -- 29 | 30 | In addition to the files included in the repository, you will also need a US copy of the Kirby: Nightmare in Dream Land ROM (which is left to the user to obtain). Follow the instructions in the subcategories below for your operating system/preference. 31 | 32 | #### --- Windows --- 33 | 34 | Run `KNDL-Randomize-PC.exe`, found on the 'Releases' page. Select the options you desire, and select the location of your .gba KNDL ROM. Finish by clicking the 'Randomize' button. The randomized ROM will be saved into the same folder as the original, with the seed appended onto the end of the file name. 35 | 36 | #### --- macOS --- 37 | 38 | Run `KNDL-Randomize-Mac.app`, found on the 'Releases' page. Select the options you desire, and select the location of your .gba KNDL ROM. Finish by clicking the 'Randomize' button. The randomized ROM will be saved into the same folder as the original, with the seed appended onto the end of the file name. 39 | 40 | #### --- Linux/Python --- 41 | 42 | Linux users, or users who don't want to build it themselves, will have to build the binaries. 43 | 44 | 1. Install Python3, Qt5, and PyQt5 using your favorite package manager. 45 | 46 | 2. While in the 'src' directory, run the following command in Terminal: 47 | 48 | `python3 KNDL-Randomize.py` 49 | 50 | This will open the same application as the PC and Mac binaries. 51 | 52 | #### --- Lua Compatible Emulator --- 53 | 54 | If your emulator supports Lua scripts (such as Bizhawk), you are welcome to instead use the `KNDL-Script.lua` script. This script edits the RAM in real time, allowing for complete randomization of Kirby's abilities, meaning that eating enemies of the same type may give different results. This script is in an incomplete state at the moment. 55 | 56 | ## -- Known Issues / Future Plans -- 57 | 58 | - Enemies normally without abilities are not randomized 59 | - Mini-bosses are not randomized 60 | - The Star Rod, while available, is very experimental, and has many visual bugs. 61 | - Meta Knight's sword will default back to its original color during certain animations. This is due to the game handling his palette differently on occasion, and is unlikely to be fixed. 62 | 63 | ## -- Version History -- 64 | 65 | v1.1.0 - Slighty modified GUI, added several more Kirby palettes. Added support for changing Meta Knight's palettes. Added spray can icons in the GUI. Remove 'KNDL-Simple' program. 66 | 67 | v1.0.1 - Fixed visual glitch of color going back to default during certain animations 68 | 69 | v1.0.0 - I've added support for changing Kirby's color to those from The Amazing Mirror 70 | 71 | v0.1.0 - Initial Release. All enemies with an ability are randomized. Mini-bosses and enemies normally without abilities are not supported. Star Rod is available, but very glitchy. 72 | 73 | ## -- Special Thanks -- 74 | 75 | The author of MapDeluxe, which helped me learn how to spawn in different enemies for testing. 76 | 77 | DrSchnaps and Spriter's Resource for the palettes from *Kirby and the Amazing Mirror*, as well as some custom palettes. 78 | -------------------------------------------------------------------------------- /src/KNDL-Randomize.py: -------------------------------------------------------------------------------- 1 | # Program that randomizes Kirby: Nightmare in Dream Land for GBA 2 | # Written by Aquova, 2017-2018 3 | # http://github.com/Aquova/KNDL-Rando 4 | 5 | from PyQt5 import QtWidgets 6 | import os, random, sys, hashlib 7 | from mainwindow import Ui_MainWindow 8 | 9 | VERSION = '1.1.0' 10 | 11 | # Valid byte values for Kirby's ability 12 | abilityValues = ["00","01","02","03","04","05","06","07","08","09","0A","0B","0C", 13 | "0D","0E","0F","10","11","12","13","14","15","16","17","18"] 14 | 15 | # ROM locations of enemy abilities 16 | abilityLocations = ["7417C4", "7429F4", "740C38", "743344", "742A20", "7417F0", "742A4C", 17 | "7418A0", "740C64", "740C90", "7418F8", "742B28", "741924", "741950", 18 | "740CE8", "740D14", "741A58", "741A84", "740D6C", "740D98", "740DC4"] 19 | 20 | # ROM locations of Kirby's palette 21 | kirbyPaletteLocations = ["DC62A", "DC8AA", "DC96C", "DCB2A", "DCBAA", "DD0C4", "DD0E6", "DD23A", "DD306", 22 | "E7418", "E745C", "E74A0", "E9D5C", "E9D7E", "E9ED2", "E9F9E", "F997C", "F997C", 23 | "F99C0", "F9A04", "FEFFC", "FF01E", "FF172", "FF23E", "108364", "1083A8", "1083EC", 24 | "10C260", "10C282", "10C3D6", "10C4A2", "123604", "123648", "12368C", "12A6DC", 25 | "12A6FE", "12A852", "12A91E", "137F80", "137FC4", "138008", "13BF44", "13BF66", 26 | "13C0BA", "13C186", "149734", "149778", "14D078", "14D09A", "14D1EE", "14D2BA", 27 | "150320", "150364", "1503A8", "1517E4", "151806", "15197C", "151A48", "153810", 28 | "153854", "153898", "1543E0", "154402", "154600", "15ECE0", "15ED24", "15ED68", 29 | "162678", "16269A", "166CE4", "166D06", "166F04", "16FCF0", "16FD34", "16FD78", 30 | "172448", "17246A", "1751A0", "1751C2", "175316", "1753E2", "17C3E4", "17C428", 31 | "1801E4", "180206", "18035A", "180426", "183F34", "183F78", "183FBC", "1845E8", 32 | "18460A", "18464E", "186C7C", "186C9E", "189714", "189736", "196E48", "196E6A", 33 | "1A1890", "1A394C", "1A7818", "1A8830", "1A9D94", "1AB300", "1AC5CC", "1AD30C", 34 | "1AE878", "1AF444", "1B19EC", "1B3E14", "1B66FC", "1B6E34", "1BC074", "1BE6BE", 35 | "1BE8C0", "1BEFF8", "1C051C", "1C7260", "1C9890", "1CC7EC", "1CC82E", "1CF814", 36 | "1D4348", "1D60B8", "1D9F20", "1E1F28", "1E1F6A", "1F0074", "1F0096", "1F1F4C", 37 | "1F5A34", "1FA7E0", "1FB9D8", "1FDF58", "1FDF9A", "201374", "203BF4", "20D1E4", 38 | "218CD4", "21C3D0", "21DEF0", "23F834", "23F988", "23FA54", "23FA98", "2476A0", 39 | "2476E4", "24A9FC", "53F4E6", "596D22", "599922", "5BA46E", "5BD09A", "5BF426", 40 | "5C220E", "5C4AAA", "5C7452", "5C9B22", "5CCC90", "5CCCD2", "5E2C22", "609D42", 41 | "7DB192", "DC9AA", "DCA2A", "DD34A", "E9FE2", "FF282", "10C4E6", "12A962", 42 | "13C1CA", "14D2FE", "151A8C", "154644", "166F48", "175426", "18046A", "184692", 43 | "1DD060", "1DEF1C", "2055C4", "20831C", "20B3BC", "20C0E8"] 44 | 45 | metaKnightLocations = ["226278", "227A60", "2290C0", "22B2AC", "22EB7C", "23118C", "231BDC", "232030", 46 | "2352B4", "235BB0", "238BA4", "238BC6", "23AC00", "23AD88", "23E944", "249BAE", 47 | "27D826", "2DFFEC", "2E000E", "2E24BC", "2E24DE", "2E692C", "2EA4BC", "2EA758", 48 | "2EE490", "2F0660", "2F1A5C", "2F3242"] 49 | 50 | metaKnightSwordLocations = ["226298", "227A80", "2290E0", "22B2CC", "22EB9C", "2311AC", "231BFC", 51 | "232050", "2352D4", "235BD0", "235BF2", "235C34", "235C76", "238BE6", 52 | "23ADA8", "23E964", "27D846", "2E002E", "2E24FE", "2E694C", "2EA4DC", 53 | "2EA778", "2EE4B0", "2F0680", "2F1A7C", "2F3262"] 54 | 55 | # Palettes need to be in the same order as in the GUI 56 | kirbyPalettes = ["2104BF563F203C18571053084E082A043F543C383718", # Red 57 | "2104DF07FF129F121F169F193911D10C5F05F9049104", # Orange 58 | "2104FF077F07FF06DD061606B1054C059F047C043604", # Yellow 59 | "2104F953F01BCF136D07880606068305FC055A051205", # Green 60 | "21047F7F7F721F66BF55FC3C74206D0CA432272EC621", # Cherry 61 | "2104F873EF63684FA13A2136C12D6121BF2A1C169805", # Emerald 62 | "2104F57F927F0E7F8B7E067EA365E6408D7D2A71875C", # Ocean 63 | "2104577F907A2D72EB69615D0151A1402B60294C2838", # Sapphire 64 | "21041A7F977EF57D727D4F6CCD05AA383745B338302C", # Grape 65 | "21049B4A3B36D82D7425111DCE148B10B41071082F04", # Chocolate 66 | "2104FF7F9C7318639452EF3D6B2DE71C10428C312925", # Chalk 67 | "2104FF7FFF7F9C731863734EEF3D6B2D5F35BB243718", # Snow 68 | "21043146EF3DAD356B2D29250821C6189F0A1F067A05", # Carbon 69 | "0000324A1146CE398C314A290821C6184A29E71CA514", # Mirror 70 | "00005D635D63784E784EB235EC18E71C7D2D171DF11C", # Stone 71 | "0000FF7FFA7FF57F347B6C7A8779E578357911791179", # Ice 72 | "0000BD77607460744354435427282728DA48B5449138", # GBA Meta Knight 73 | "5325FB417D733C679C5AFB41F841D3397A29F914B410", # KDL3 Pink 74 | "494DF06D7C7739739672F06DF061CE4D6A64E564A450", # KDL3 Blue 75 | "00003D3FBD14BD14D914D914B20CAD593D3F5B32B925", # Waddle Dee 76 | "0000DE7B2A7664756475E16C405C2038D66AEF51083D", # Lololo 77 | "0000DE7BDE451C2D1C2DB6186F0C2700F67A306E2861", # Lalala 78 | "0000DE7BFF7F7B6FF75E524ACE394A297B6FF75E524A"] # Grayscale 79 | 80 | metaKnightPalettes = ["0000397F317E8E6D0C59DE513B39082C1D4C1848133CFF03DF025702FF7F", # Pink 81 | "0000397F317E8E6D0C59FF7F7B6F082C5B6FD65A324AFF03DF025702FF7F", # White 82 | "0000397F317E8E6D0C59DD20B918082CB2108F084D04FF03DF025702FF7F", # Red 83 | "0000397F317E8E6D0C596932092A082CB2108F084D04FF03DF025702FF7F", # Green 84 | "21048C318C314B2D8410630C210421042104210421048C316B2DA514EF3D"] # Mirror 85 | 86 | metaKnightSwordPalettes = ["0000D25F2D4F6936073212011614D25F", # Green 87 | "0000537FCF7A6C7AE77912011614537F", # Blue 88 | "0000757AD37970798D6412011614757A", # Purple 89 | "00001936B62D5225EF18120116141936", # Brown 90 | "00005D6E1D62BC511939120116145D6E", # Pink 91 | "0000FF7F7B6FF75E524A12011614FF7F"] # White 92 | 93 | # Creating a custom exception, how fancy 94 | class HashError(Exception): 95 | pass 96 | 97 | class KirbyApp(QtWidgets.QMainWindow, Ui_MainWindow): 98 | def __init__(self, parent=None): 99 | super(KirbyApp, self).__init__(parent) 100 | self.setupUi(self) 101 | self.findROMButton.clicked.connect(self.openFile) 102 | self.randomizeButton.clicked.connect(self.runRandomizer) 103 | self.title.setText(self.title.text() + VERSION) 104 | 105 | # Fades out starRodCheck if not clicked 106 | self.starRodCheck.setEnabled(False) 107 | self.enemyCheck.toggled.connect(self.starRodCheck.setEnabled) 108 | self.enemyCheck.toggled.connect( 109 | lambda checked: not checked and self.starRodCheck.setChecked(False)) 110 | 111 | # If noAbilitiesCheck is clicked, enemyCheck is disabled 112 | self.noAbilitiesCheck.setEnabled(True) 113 | self.enemyCheck.toggled.connect(self.noAbilitiesCheck.setDisabled) 114 | self.enemyCheck.toggled.connect( 115 | lambda checked: checked and self.noAbilitiesCheck.setChecked(False)) 116 | 117 | # If enemyCheck is clicked, noAbilitiesCheck is disabled 118 | self.enemyCheck.setEnabled(True) 119 | self.noAbilitiesCheck.toggled.connect(self.enemyCheck.setDisabled) 120 | self.noAbilitiesCheck.toggled.connect( 121 | lambda checked: checked and self.enemyCheck.setChecked(False)) 122 | 123 | # Opens ROM selector window, clears the previous path text 124 | def openFile(self): 125 | self.romDisplay.clear() 126 | self.romFile = QtWidgets.QFileDialog.getOpenFileName(self, "Open file", os.path.dirname(__file__), "GBA ROMs (*.gba)")[0] 127 | if self.romFile: 128 | self.romDisplay.setText(self.romFile) 129 | 130 | def getKirbyColor(self): 131 | c = self.kirbyComboBox.currentIndex() 132 | if c == (len(kirbyPalettes) + 1): 133 | return random.randint(0, len(kirbyPalettes)-1) 134 | return (c - 1) 135 | 136 | def getMKColor(self): 137 | c = self.MKcomboBox.currentIndex() 138 | if c == (len(metaKnightPalettes) + 1): 139 | return random.randint(0, len(metaKnightPalettes)-1) 140 | return (c - 1) 141 | 142 | def getSwordColor(self): 143 | c = self.swordComboBox.currentIndex() 144 | if c == (len(metaKnightSwordPalettes) + 1): 145 | return random.randint(0, len(metaKnightSwordPalettes)-1) 146 | return (c - 1) 147 | 148 | def runRandomizer(self): 149 | try: 150 | rom = open(self.romFile, 'rb').read() 151 | testHash = hashlib.md5(rom).hexdigest() 152 | # Checks for the correct ROM 153 | if testHash != "35ae64b0f27e60107c14ab956f6cdf70": 154 | raise HashError("Invalid checksum") 155 | romList = list(rom) 156 | 157 | # Uses given input as seed, else randomly picks a new seed to use 158 | KNDL_seed = self.seedValue.text() 159 | if KNDL_seed == "": 160 | KNDL_seed = random.randint(0, 999999999) 161 | random.seed(KNDL_seed) 162 | 163 | if self.enemyCheck.isChecked(): 164 | if self.starRodCheck.isChecked(): 165 | abilityValues.append("19") 166 | 167 | # Gives enemies new abilities based on random selection from file 168 | for item in abilityLocations: 169 | address = int(item, 16) 170 | new_enemy = random.choice(abilityValues) 171 | new_enemy = int(new_enemy,16) 172 | romList[address] = new_enemy 173 | 174 | elif self.noAbilitiesCheck.isChecked(): 175 | for item in abilityLocations: 176 | address = int(item, 16) 177 | romList[address] = 0 # Every enemy should be given the "0x00" value, or no ability 178 | 179 | if self.kirbyComboBox.currentIndex() != 0: 180 | new_color = self.getKirbyColor() 181 | row = kirbyPalettes[new_color] 182 | new_colors = [] 183 | for i in range(0, len(row), 2): 184 | new_colors.append(int(row[i:i+2],16)) 185 | 186 | # Replaces old color palettes with the new 187 | for item in kirbyPaletteLocations: 188 | color_address = int(item, 16) 189 | for i in range(0, len(new_colors)): 190 | romList[color_address + i] = new_colors[i] 191 | 192 | # Want to change the color of the life icon to match 193 | # TODO: Someday make this nicer 194 | romList[int("5A56F2", 16)] = new_colors[0] # 16th byte - Outline 195 | romList[int("5A56F3", 16)] = new_colors[1] 196 | romList[int("5A56EE", 16)] = new_colors[4] # 14th byte - Main body 197 | romList[int("5A56EF", 16)] = new_colors[5] 198 | romList[int("5A56EA", 16)] = new_colors[12] # 12th byte - Body highlight 199 | romList[int("5A56EB", 16)] = new_colors[13] 200 | romList[int("5A56D8", 16)] = new_colors[18] # 3rd byte - Feet 201 | romList[int("5A56D9", 16)] = new_colors[19] 202 | 203 | # Changing the life icon also messes with the health bar palette, so that needs to be changed too 204 | romList[int("5A56D6", 16)] = new_colors[20] 205 | romList[int("5A56D7", 16)] = new_colors[21] 206 | romList[int("5A56DA", 16)] = new_colors[16] 207 | romList[int("5A56DB", 16)] = new_colors[17] 208 | romList[int("5A56DC", 16)] = new_colors[16] 209 | romList[int("5A56DD", 17)] = new_colors[17] 210 | 211 | if self.MKcomboBox.currentIndex() != 0: 212 | new_color = self.getMKColor() 213 | row = metaKnightPalettes[new_color] 214 | new_colors = [] 215 | for i in range(0, len(row), 2): 216 | new_colors.append(int(row[i:i+2],16)) 217 | 218 | # Replaces old color palettes with the new 219 | for item in metaKnightLocations: 220 | color_address = int(item, 16) 221 | for i in range(0, len(new_colors)): 222 | romList[color_address + i] = new_colors[i] 223 | 224 | if self.swordComboBox.currentIndex() != 0: 225 | new_color = self.getSwordColor() 226 | row = metaKnightSwordPalettes[new_color] 227 | new_colors = [] 228 | for i in range(0, len(row), 2): 229 | new_colors.append(int(row[i:i+2],16)) 230 | 231 | # Replaces old color palettes with the new 232 | for item in metaKnightSwordLocations: 233 | color_address = int(item, 16) 234 | for i in range(0, len(new_colors)): 235 | romList[color_address + i] = new_colors[i] 236 | 237 | rom = bytes(romList) 238 | new_rom = open('.'.join(self.romFile.split(".")[:-1]) + "_" + str(KNDL_seed) + ".gba", 'wb') 239 | new_rom.write(rom) 240 | new_rom.close() 241 | 242 | QtWidgets.QMessageBox.about(self, "Success", "Your copy of Nightmare in Dream Land has been randomized. Enjoy!") 243 | except AttributeError: 244 | QtWidgets.QMessageBox.about(self, "Error", "Error: Specify a ROM location") 245 | except FileNotFoundError: 246 | QtWidgets.QMessageBox.about(self, "Error", "Error: File not found") 247 | except HashError: 248 | QtWidgets.QMessageBox.about(self, "Error", "The given file is invalid. Please use a US GBA Kirby: Nightmare in Dream Land ROM.") 249 | except Exception as e: 250 | QtWidgets.QMessageBox.about(self, "Error", "Some mysterious error has occurred. Please contact the developers with information about what happened. {}".format(e)) 251 | 252 | def main(): 253 | app = QtWidgets.QApplication(sys.argv) 254 | window = KirbyApp() 255 | window.show() 256 | app.exec_() 257 | 258 | if __name__ == "__main__": 259 | main() 260 | -------------------------------------------------------------------------------- /docs/aquova_kndl_notes.txt: -------------------------------------------------------------------------------- 1 | ========================================== 2 | == Kirby's Nightmare in Dreamland Notes == 3 | ========================================== 4 | 5 | Written by Aquova 6 | 7 | ------------------------------------------------------------------------------- 8 | Kirby's Mouth Byte Address: 0x217B 9 | 10 | Values: 11 | 12 | 00 - Default 13 | 01 - Fire 14 | 02 - Spark 15 | 03 - Cutter 16 | 04 - Sword 17 | 05 - Burning 18 | 06 - Laser 19 | 07 - Mike 20 | 08 - Wheel 21 | 09 - Hammer 22 | 0A - Parasol 23 | 0B - Sleep 24 | 0C - Needle 25 | 0D - Ice 26 | 0E - Freeze 27 | 0F - Hi-Jump 28 | 10 - Beam 29 | 11 - Stone 30 | 12 - Ball 31 | 13 - Tornado 32 | 14 - Crash 33 | 15 - Light 34 | 16 - Backdrop 35 | 17 - Throw 36 | 18 - UFO 37 | 19 - Star rod (glitched) 38 | 1A - Wait (Some multiplayer thing) 39 | 1B - Normal (Glitched) 40 | 1C - ??? 41 | 1D - ??? 42 | 1E - ??? 43 | 44 | ------------------------------------------------------------------------------- 45 | 46 | Enemy values: 47 | 48 | *===========================================================================* 49 | | Byte Location | Enemy Number | Ability Value | Enemy Name | 50 | +---------------+--------------+---------------+----------------------------+ 51 | | | 00 | 00 | Waddle Dee | 52 | | 7417C4 | 01 | 11 | Rocky | 53 | | 7429F4 | 02 | 0B | Noddy | 54 | | 740BF8-740BFB | 03 | 00 | Broom Hatter | 55 | | 740C38 | 04 | 0D | Pengi | 56 | | 743344 | 05 | 06 | Laser Ball | 57 | | 742A20 | 06 | 0E | Chilly | 58 | | 7417F0 | 07 | 03 | Sir Kibble | 59 | | | 08 | 00 | Cappy | 60 | | 742A4C | 09 | 10 | Waddle Doo | 61 | | N/A | 0A | N/A | Gordo | 62 | | 7418A0 | 0B | 15 | Cool Spook | 63 | | | 0C | 00 | Bronto Burt | 64 | | | 0D | 00 | Kabu | 65 | | 740C64 | 0E | 14 | Bomber | 66 | | ?? | 0F | ?? | Blew up immediately | 67 | | | 10 | 00 | Twizzy | 68 | | N/A | 11 | N/A | Shotzo | 69 | | 740C90 | 12 | 02 | Sparky | 70 | | 7418F8 | 13 | 13 | Twister | 71 | | | 14 | 00 | Squishy | 72 | | | 15 | 00 | Scarfy | 73 | | 742B28 | 16 | 12 | Bubbles | 74 | | 741924 | 17 | 0F | Starman | 75 | | 741950 | 18 | 01 | Hot Head | 76 | | | 19 | 00 | Glunk | 77 | | | 1A | 00 | Slippy | 78 | | | 1B | 00 | Blipper | 79 | | 740CE8 | 1C | 04 | Sword Knight | 80 | | 740D14 | 1D | 04 | Blade Knight | 81 | | | 1E | 00 | Poppy Bros. Jr. | 82 | | | 1F | 00 | Poppy Bros. Jr. w/ Apple | 83 | | | 20 | 00 | Poppy Bros. Jr. w/ Tomato | 84 | | | 21 | 00 | Coner | 85 | | 741A58 | 22 | 08 | Wheelie | 86 | | 741A84 | 23 | 05 | Flamer | 87 | | 740D6C | 24 | 0C | Needlous | 88 | | 740D98 | 25 | 18 | UFO | 89 | | 740DC4 | 26 | 0A | Parasol (No Waddle Dee) | 90 | | | 27 | 00 | Gip | 91 | | ?? | 28 | ?? | Blew up immediately | 92 | | | 29 | 09 | Bonkers | 93 | *===============*==============*===============*============================* 94 | 95 | All others glitch out the game 96 | 97 | The very first enemy is located at: 0x35DD71 98 | Changing 0x74064A turned Waddle Dees into fast and exploding enemies 99 | 100 | ------------------------------------------------------------------------------- 101 | Color palettes: 102 | 103 | Color palettes in the game, and those taken from Kirby and the Amazing Mirror 104 | Normal - 00005F7B9F6E5F62DE513B39961C4C087F401A2816145C4B9D5BDF6FFF7F 105 | Green - 2104F953F01BCF136D07880606068305FC055A05120594361853DE6FFF7F 106 | Yellow - 2104FF077F07FF06DD061606B1054C059F047C04360494361853DE6FFF7F 107 | Red - 2104BF563F203C18571053084E082A043F543C38371894361853DE6FFF7F 108 | Snow - 2104FF7FFF7F9C731863734EEF3D6B2D5F35BB24371894361853DE6FFF7F 109 | Carbon - 21043146EF3DAD356B2D29250821C6189F0A1F067A0594361853DE6FFF7F 110 | Ocean - 2104F57F927F0E7F8B7E067EA365E6408D7D2A71875C94361853DE6FFF7F 111 | Sapphire - 2104577F907A2D72EB69615D0151A1402B60294C283894361853DE6FFF7F 112 | Grape - 21041A7F977EF57D727D4F6CCD05AA383745B338302C94361853DE6FFF7F 113 | Emerald - 2104F873EF63684FA13A2136C12D6121BF2A1C16980594361853DE6FFF7F 114 | Orange - 2104DF07FF129F121F169F193911D10C5F05F904910494361853DE6FFF7F 115 | Chocolate - 21049B4A3B36D82D7425111DCE148B10B41071082F0494361853DE6FFF7F 116 | Cherry - 21047F7F7F721F66BF55FC3C74206D0CA432272EC62194361853DE6FFF7F 117 | Chalk - 2104FF7F9C7318639452EF3D6B2DE71C10428C31292594361853DE6FFF7F 118 | 119 | The last 4 colors have to do with ability accessories, i.e. for neutral Kirby it's 4 white colors, but they change for Throw Kirby's headband. Probably should leave those intact. 120 | 121 | Throw Kirby's palette - 00009F779F6E5F62DE513B39961C4C087F401A281614 122 | 123 | Locations in ROM of Kirby's palette (all 163 of them...) 124 | DC62A, DC8AA, DC96C, DCB2A, DCBAA, DD0C4, DD0E6, DD23A, DD306, E7418, E745C, E74A0, E9D5C, 39D7E, 393D2, 39F9E, F997C, F997C, F99C0, F9A04, FEFFC, FF01E, FF172, FF23E, 108364, 1083A8, 1083EC, 10C260, 10C282, 10C3D6, 10C4A2, 123604, 123648, 12368C, 12A6DC, 12A6FE, 12A852, 12A91E, 137F80, 137FC4, 138008, 13BF44, 13BF66, 13C0BA, 13C186, 149734, 149778, 14D078, 14D09A, 14D1EE, 14D2BA, 150320, 150364, 1503A8, 151734, 151806, 15197C, 151A48, 153810, 153854, 153898, 1543E0, 154402, 154600, 15ECE0, 15ED24, 153D68, 162678, 16269A, 166CE4, 166D06, 166F04, 16FCF0, 16FD34, 16FD78, 172448, 17246A, 1751A0, 1751C2, 175316, 1753E2, 17C3E4, 17C428, 1801E4, 180206, 18035A, 180426, 183F34, 183F78, 183FBC, 1845E8, 18460A, 18464E, 186C7C, 186C9E, 189714, 189736, 196E48, 196E6A, 1A1890, 1A394C, 1A7818, 1A8830, 1A9D94, 1AB300, 1AC5CC, 1AD30C, 1AE878, 1AF444, 1B19EC, 1B3E14, 1B66FC, 1B6E34, 1BC074, 1BE6BE, 1BE8C0, 1BEFF8, 1C051C, 1C7260, 1C9890, 1CC7EC, 1CC82E, 1CF814, 1D4348, 1D60B8, 1D9F20, 1E1F28, 1E1F6A, 1F0074, 1F0096, 1F1F4C, 1F5A34, 1FA7E0, 1FB9D8, 1FDF58, 1FDF9A, 201374, 203BF4, 20D1E4, 218CD4, 21C3D0, 21DEF0, 23F834, 23F988, 23FA54, 23FA98, 2476A0, 2476E4, 24A9FC, 53F4E6, 596D22, 599922, 5BA46E, 5BD09A, 5BF426, 5C220E, 5C4AAA, 5C7452, 5C9B22, 5CCC90, 5CCCD2, 5E2C22, 609D42, 7DB192, DC9AA, DCA2A, DD34A, E9FE2, FF282, 10C4E6, 12A962, 13C1CA, 14D2FE, 151A8C, 154644, 166F48, 175426, 18046A, 184692, 1DD060, 1DEF1C, 2055C4, 2831C, 20B3BC, 20C0E8 125 | 126 | Changing Kirby's icon: 127 | The icon palette seems to be the second background palette. 128 | Made of four colors: the 3rd - feet (1F00), 12th - darker body (9A41), 14th - lighter body (9F6E), and 16th - border (000C) colors 129 | That palette normally: 130 | 5F1A12001F00FF189F2D08031F1A5F03086D527EEF179A417F4A9F6EFF7F000C at 0x5A56D4 131 | Want to change 5A56D8-9, 5A56EA-B, 5A56EE-F, 5A56F2-5A56F3 132 | 133 | 0 BBBBB GGGGG RRRRR 134 | 3nd byte: 1F00 = 0 00111 11000 00000 135 | 2nd byte: 1200 = 0 00100 10000 00000 136 | 4th byte: FF18 = 1 11111 11000 11000 137 | 5th byte: 9F2D = 1 00111 11001 01101 138 | 139 | Custom colors, made by Drschnaps 140 | How to make custom colors: 141 | Need 10 palettes in RGB (the other 6 are transparent, the outline (probably black), and 4 colors used for powerup accessory colors) 142 | Each color should be 0-255 (8-bits each, 24-bits total) 143 | Take each value, multiply by 31/255 to get 5-bit values. Write them 0BBBBBGGGGGRRRRR, turn into hex. Reverse first and second byte as GBA uses little endian. 144 | 145 | Mirror: 0000BD77324A1146CE398C314A290821C6184A29E71CA514 146 | GBA Meta Knight: 0000607460744354435427282728DA48B5449138 147 | Red & Purple (Was a mistake, but looks kinda cool): 0000BD777D007D00550C550C2A1C2A1CD268B1548E44 148 | Stone: 00005D635D63784E784EB235EC18E71C7D2D171DF11C 149 | Ice: 0000FF7FFA7FF57F347B6C7A8779E578357911791179 150 | Waddle Dee: 00003D3FBD14BD14D914D914B20CAD593D3F5B32B925 151 | KDL3 Pink: 5325FB417D733C679C5AFB41F841D3397A29F914B410 152 | KDL3 Blue: 494DF06D7C7739739672F06DF061CE4D6A64E564A450 153 | Lololo: 0000DE7B2A7664756475E16C405C2038D66AEF51083D 154 | Lalala: 0000DE7BDE451C2D1C2DB6186F0C2700F67A306E2861 155 | Grayscale: 0000DE7BFF7F7B6FF75E524ACE394A297B6FF75E524A 156 | 157 | --- 158 | 159 | Meta Knight: 160 | Default: 0000397F317E8E6D0C59007C0458082C1D4C1848133CFF03DF025702FF7F 161 | Pink: 0000397F317E8E6D0C59DE513B39082C1D4C1848133CFF03DF025702FF7F 162 | White: 0000397F317E8E6D0C59FF7F7B6F082C5B6FD65A324AFF03DF025702FF7F 163 | Red: 0000397F317E8E6D0C59DD20B918082CB2108F084D04FF03DF025702FF7F 164 | Green: 0000397F317E8E6D0C596932092A082CB2108F084D04FF03DF025702FF7F 165 | Mirror: 21048C318C314B2D8410630C210421042104210421048C316B2DA514EF3D 166 | 167 | Memory addresses: 168 | 226278, 227A60, 2290C0, 22B2AC, 22EB7C, 23118C, 231BDC, 232030, 2352B4, 235BB0, 238BA4, 238BC6, 23AC00, 23AD88, 23E944, 249BAE, 27D826, 2DFFEC, 2E000E, 2E24BC, 2E24DE, 2E692C, 2EA4BC, 2EA758, 2EE490, 2F0660, 2F1A5C, 2F3242 169 | 170 | --- 171 | 172 | Meta Knight's Sword: 173 | May only need to change up to space 174 | Default: 0000FF03DF02DF015F0112011614FF57 175 | Green: 0000D25F2D4F6936073212011614D25F 176 | Blue: 0000537FCF7A6C7AE77912011614537F 177 | Purple: 0000757AD37970798D6412011614757A 178 | Brown: 00001936B62D5225EF18120116141936 179 | Pink: 00005D6E1D62BC511939120116145D6E 180 | White: 0000FF7F7B6FF75E524A12011614FF7F 181 | 182 | Memory Addresses: 183 | 226298, 227A80, 2290E0, 22B2CC, 22EB9C, 2311AC, 231BFC, 232050, 2352D4, 235BD0, 235BF2, 235C34, 235C76, 238BE6, 23ADA8, 23E964, 27D846, 2E002E, 2E24FE, 2E694C, 2EA4DC, 2EA778, 2EE4B0, 2F0680, 2F1A7C, 2F3262 184 | 185 | ------------------------------------------------------------------------------- 186 | 187 | Door values: 188 | 189 | KND Door Data: 190 | -- 191 | Door Data: 0x3A246C?-0x??? 192 | Made of ten? bytes 193 | First byte: ? 194 | Second byte: ? 195 | Third byte: X coordinate? 196 | Fourth byte: ? 197 | Fifth byte: Y coordinate? 198 | Sixth byte: ? 199 | Seventh byte: Door type 200 | Eigth byte: ? 201 | Ninth byte: Destination Door 202 | Tenth byte: Exit coordinates? 203 | 204 | I *think* that it's actually handled two bytes at a time. Thus: 205 | Bytes 1-2: ?? 206 | Bytes 3-4: X coordinate 207 | Bytes 5-6: Y coordinate 208 | Bytes 7-8: Door Type 209 | Bytes 9-10: Destination 210 | Bytes 11-12: Idk if this exists 211 | -- 212 | 213 | Beginning at 0x3A24CC is the Level 1-1 Room 1 Door 214 | World 2 doors exist between 0x3A3000-0x3A4000 215 | 216 | --- 217 | 218 | Seventh byte door values: 219 | 220 | 00 - Level entrance 221 | 01 - World 1 Map 'previous' door 222 | 02 - World 1 Boss - didn't display door 223 | 03 - Bomb Rally mini-game 224 | 04 - Air Grind mini-game 225 | 05 - Quick Draw mini-game 226 | 06 - Door didn't work - didn't display door 227 | 07 - Wheelie Arena, but museum info played - didn't display door 228 | 08 - Actual Wheelie Arena 229 | From here on out, the game will freeze... 230 | 231 | Ninth byte door values: 232 | Anytime the ninth byte is changed, the destination changes, but the door sprite doesn't load 233 | 234 | 00 - Level 1-1 entrance 235 | 01 - Level 1-2 entrance 236 | 02 - Level 1-3 entrance 237 | 03 - Level 1-4 entrance 238 | 04 - World 1 Boss 239 | 05 - Game Crashed 240 | 241 | --- 242 | 243 | I didn't look at the enemies from 244 | 0x100000 - 0x370000 245 | 246 | 0x0-0x10000 Crashes immediately 247 | 0x10000-0x20000 Crashes on file select 248 | 0x20000-0x30000 Crashes after selecting file 249 | 0x30000-0x40000 Crashes after selecting file 250 | 0x40000-0x50000 Crashes after world 1 animation 251 | 0x50000-0x60000 Crashes after Kirby hits the ground in level 1 252 | 0x50000-0x51000 Froze at Beam Kirby inital beam, possibly controls powerup behavior? 253 | 254 | 0x60000-0x70000 Crashes after world 1 animation 255 | 0x70000-0x80000 Crashes after world 1 animation 256 | 0x80000-0x90000 Crashes right when first enemy loads 257 | 0xB0000-0xC0000 Crashes immediately 258 | 0xC0000-0xD0000 Crashes immediately 259 | 260 | 0xD0000-0xD5000 Messes with palettes, warp star is black for example 261 | 262 | 0xD7000-0xD7500 Entire World 1 map is stone, can't move 263 | 0xD7500-0xD7600 Area around Level 1-1 door is stone, but there is a space for Kirby to move. Seems to move 'stone' region around 264 | 0xD7600-0xD7700 Similar to above 265 | 266 | 0xDA000-0xDF000 Game crashes when Kirby lands 267 | 268 | 0x0E0000-0x0F0000 Crashes shortly after entering level 1-1 269 | 270 | 170000-176000 271 | Game freezes when Kirby lands 272 | 273 | Changing 0x24BCB2 glitches out the ability enemies 274 | That row is of interest 275 | ^ I had this in my notes from before, but I can't seem to recreate this, the game just crashes now 276 | 277 | Similar issue between 250000 and 260000 278 | 279 | Corrupting 0x35D000-0x35E000 seems to have redircted Stage 1-1 Door to End of level 280 | (Screen went white, but the music played) 281 | 282 | 0x3A24A0-0x3A2500 Replacing 0F with 35 made Door 1-1 vanish 283 | 284 | It appears 0x35D9D0-0x35DAF0 is the tile data for room 1-1? 285 | - Doesn't seem useful for my purposes, moving on 286 | 287 | 0x3A0000-0x3B0000 Crashes game immediately 288 | 289 | 0x3B0000-0x3C0000 Messes with the level sprites, but game is still playable 290 | 291 | 0x530000-0x540000 Messes with the level palettes, and it looks really cool. 292 | The 0x5XXXXX block seems to do with graphics 293 | 294 | 0x590000-0x5A0000 Glitched door graphics 295 | Door is still functional, however 296 | 297 | 0x5B0000-0x5C0000 Crashed game on World 1 animation 298 | 0x600000-0x610000 Crashes immediately 299 | 300 | 0x71A000-0x71F000 Crashes after hitting start 301 | 302 | 0x720000-0x730000 Freezes after displaying HAL logo 303 | 0x730000-0x740000 Crashes immediately 304 | 305 | 0x740000-0x745000 Game resets once first Waddle Dee loads 306 | Similar pattern for each 0x001000 block within this section 307 | 308 | 0x74C000-0x74D000 Crashes once Kirby lands, door missing. 309 | Breaking it down, door and other sprites will gitch in and out, but still functional 310 | 311 | 0x750000-0x760000 Many sprites missing, crashes on menu select 312 | 0x760000-0x770000 Crashes after World 1 animation 313 | 314 | 0x7E0000-0x7F0000 Crashes after selecting file 315 | This is the end of the game. 316 | ------------------------------------------------------------------------------- 317 | 318 | -------------------------------------------------------------------------------- /src/mainwindow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'mainwindow.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.9.1 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_MainWindow(object): 12 | def setupUi(self, MainWindow): 13 | MainWindow.setObjectName("MainWindow") 14 | MainWindow.resize(522, 475) 15 | self.centralWidget = QtWidgets.QWidget(MainWindow) 16 | self.centralWidget.setObjectName("centralWidget") 17 | self.gridLayout = QtWidgets.QGridLayout(self.centralWidget) 18 | self.gridLayout.setContentsMargins(11, 11, 11, 11) 19 | self.gridLayout.setSpacing(6) 20 | self.gridLayout.setObjectName("gridLayout") 21 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 22 | self.gridLayout.addItem(spacerItem, 1, 0, 1, 1) 23 | spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 24 | self.gridLayout.addItem(spacerItem1, 7, 0, 1, 1) 25 | spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 26 | self.gridLayout.addItem(spacerItem2, 11, 0, 1, 1) 27 | self.randomizeButton = QtWidgets.QPushButton(self.centralWidget) 28 | self.randomizeButton.setObjectName("randomizeButton") 29 | self.gridLayout.addWidget(self.randomizeButton, 16, 0, 1, 1) 30 | spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 31 | self.gridLayout.addItem(spacerItem3, 14, 0, 1, 1) 32 | self.urlLabel = QtWidgets.QLabel(self.centralWidget) 33 | self.urlLabel.setAlignment(QtCore.Qt.AlignCenter) 34 | self.urlLabel.setObjectName("urlLabel") 35 | self.gridLayout.addWidget(self.urlLabel, 18, 0, 1, 1) 36 | self.noAbilitiesCheck = QtWidgets.QCheckBox(self.centralWidget) 37 | self.noAbilitiesCheck.setObjectName("noAbilitiesCheck") 38 | self.gridLayout.addWidget(self.noAbilitiesCheck, 4, 0, 1, 1) 39 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 40 | self.horizontalLayout_2.setSpacing(6) 41 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 42 | self.romDisplay = QtWidgets.QLineEdit(self.centralWidget) 43 | self.romDisplay.setReadOnly(True) 44 | self.romDisplay.setObjectName("romDisplay") 45 | self.horizontalLayout_2.addWidget(self.romDisplay) 46 | self.findROMButton = QtWidgets.QPushButton(self.centralWidget) 47 | self.findROMButton.setObjectName("findROMButton") 48 | self.horizontalLayout_2.addWidget(self.findROMButton) 49 | self.gridLayout.addLayout(self.horizontalLayout_2, 13, 0, 1, 1) 50 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout() 51 | self.horizontalLayout_3.setSpacing(6) 52 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 53 | self.kirbyColorLabel = QtWidgets.QLabel(self.centralWidget) 54 | self.kirbyColorLabel.setObjectName("kirbyColorLabel") 55 | self.horizontalLayout_3.addWidget(self.kirbyColorLabel) 56 | self.kirbyComboBox = QtWidgets.QComboBox(self.centralWidget) 57 | self.kirbyComboBox.setObjectName("kirbyComboBox") 58 | icon = QtGui.QIcon() 59 | icon.addPixmap(QtGui.QPixmap("icons/pinkSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 60 | self.kirbyComboBox.addItem(icon, "") 61 | icon1 = QtGui.QIcon() 62 | icon1.addPixmap(QtGui.QPixmap("icons/redSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 63 | self.kirbyComboBox.addItem(icon1, "") 64 | icon2 = QtGui.QIcon() 65 | icon2.addPixmap(QtGui.QPixmap("icons/orangeSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 66 | self.kirbyComboBox.addItem(icon2, "") 67 | icon3 = QtGui.QIcon() 68 | icon3.addPixmap(QtGui.QPixmap("icons/yellowSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 69 | self.kirbyComboBox.addItem(icon3, "") 70 | icon4 = QtGui.QIcon() 71 | icon4.addPixmap(QtGui.QPixmap("icons/greenSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 72 | self.kirbyComboBox.addItem(icon4, "") 73 | icon5 = QtGui.QIcon() 74 | icon5.addPixmap(QtGui.QPixmap("icons/cherrySprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 75 | self.kirbyComboBox.addItem(icon5, "") 76 | icon6 = QtGui.QIcon() 77 | icon6.addPixmap(QtGui.QPixmap("icons/emeraldSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 78 | self.kirbyComboBox.addItem(icon6, "") 79 | icon7 = QtGui.QIcon() 80 | icon7.addPixmap(QtGui.QPixmap("icons/oceanSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 81 | self.kirbyComboBox.addItem(icon7, "") 82 | icon8 = QtGui.QIcon() 83 | icon8.addPixmap(QtGui.QPixmap("icons/sapphireSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 84 | self.kirbyComboBox.addItem(icon8, "") 85 | icon9 = QtGui.QIcon() 86 | icon9.addPixmap(QtGui.QPixmap("icons/grapeSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 87 | self.kirbyComboBox.addItem(icon9, "") 88 | icon10 = QtGui.QIcon() 89 | icon10.addPixmap(QtGui.QPixmap("icons/chocolateSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 90 | self.kirbyComboBox.addItem(icon10, "") 91 | icon11 = QtGui.QIcon() 92 | icon11.addPixmap(QtGui.QPixmap("icons/chalkSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 93 | self.kirbyComboBox.addItem(icon11, "") 94 | icon12 = QtGui.QIcon() 95 | icon12.addPixmap(QtGui.QPixmap("icons/snowSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 96 | self.kirbyComboBox.addItem(icon12, "") 97 | icon13 = QtGui.QIcon() 98 | icon13.addPixmap(QtGui.QPixmap("icons/carbonSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 99 | self.kirbyComboBox.addItem(icon13, "") 100 | icon14 = QtGui.QIcon() 101 | icon14.addPixmap(QtGui.QPixmap("icons/mirrorSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 102 | self.kirbyComboBox.addItem(icon14, "") 103 | icon15 = QtGui.QIcon() 104 | icon15.addPixmap(QtGui.QPixmap("icons/stoneSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 105 | self.kirbyComboBox.addItem(icon15, "") 106 | icon16 = QtGui.QIcon() 107 | icon16.addPixmap(QtGui.QPixmap("icons/iceSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 108 | self.kirbyComboBox.addItem(icon16, "") 109 | icon17 = QtGui.QIcon() 110 | icon17.addPixmap(QtGui.QPixmap("icons/metaKnightSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 111 | self.kirbyComboBox.addItem(icon17, "") 112 | icon18 = QtGui.QIcon() 113 | icon18.addPixmap(QtGui.QPixmap("icons/KDL3pinkSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 114 | self.kirbyComboBox.addItem(icon18, "") 115 | icon19 = QtGui.QIcon() 116 | icon19.addPixmap(QtGui.QPixmap("icons/KDL3blueSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 117 | self.kirbyComboBox.addItem(icon19, "") 118 | icon20 = QtGui.QIcon() 119 | icon20.addPixmap(QtGui.QPixmap("icons/waddleDeeSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 120 | self.kirbyComboBox.addItem(icon20, "") 121 | icon21 = QtGui.QIcon() 122 | icon21.addPixmap(QtGui.QPixmap("icons/lololoSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 123 | self.kirbyComboBox.addItem(icon21, "") 124 | icon22 = QtGui.QIcon() 125 | icon22.addPixmap(QtGui.QPixmap("icons/lalalaSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 126 | self.kirbyComboBox.addItem(icon22, "") 127 | icon23 = QtGui.QIcon() 128 | icon23.addPixmap(QtGui.QPixmap("icons/grayscaleSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 129 | self.kirbyComboBox.addItem(icon23, "") 130 | icon24 = QtGui.QIcon() 131 | icon24.addPixmap(QtGui.QPixmap("icons/randomSprayCan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 132 | self.kirbyComboBox.addItem(icon24, "") 133 | self.horizontalLayout_3.addWidget(self.kirbyComboBox) 134 | self.gridLayout.addLayout(self.horizontalLayout_3, 8, 0, 1, 1) 135 | self.line = QtWidgets.QFrame(self.centralWidget) 136 | self.line.setFrameShape(QtWidgets.QFrame.HLine) 137 | self.line.setFrameShadow(QtWidgets.QFrame.Sunken) 138 | self.line.setObjectName("line") 139 | self.gridLayout.addWidget(self.line, 12, 0, 1, 1) 140 | self.line_2 = QtWidgets.QFrame(self.centralWidget) 141 | self.line_2.setFrameShape(QtWidgets.QFrame.HLine) 142 | self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) 143 | self.line_2.setObjectName("line_2") 144 | self.gridLayout.addWidget(self.line_2, 15, 0, 1, 1) 145 | self.horizontalLayout_4 = QtWidgets.QHBoxLayout() 146 | self.horizontalLayout_4.setSpacing(6) 147 | self.horizontalLayout_4.setObjectName("horizontalLayout_4") 148 | self.MKcolorLabel = QtWidgets.QLabel(self.centralWidget) 149 | self.MKcolorLabel.setObjectName("MKcolorLabel") 150 | self.horizontalLayout_4.addWidget(self.MKcolorLabel) 151 | self.MKcomboBox = QtWidgets.QComboBox(self.centralWidget) 152 | self.MKcomboBox.setObjectName("MKcomboBox") 153 | self.MKcomboBox.addItem("") 154 | self.MKcomboBox.addItem("") 155 | self.MKcomboBox.addItem("") 156 | self.MKcomboBox.addItem("") 157 | self.MKcomboBox.addItem("") 158 | self.MKcomboBox.addItem("") 159 | self.horizontalLayout_4.addWidget(self.MKcomboBox) 160 | self.gridLayout.addLayout(self.horizontalLayout_4, 9, 0, 1, 1) 161 | spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 162 | self.gridLayout.addItem(spacerItem4, 3, 0, 1, 1) 163 | self.enemyCheck = QtWidgets.QCheckBox(self.centralWidget) 164 | self.enemyCheck.setObjectName("enemyCheck") 165 | self.gridLayout.addWidget(self.enemyCheck, 5, 0, 1, 1) 166 | self.starRodCheck = QtWidgets.QCheckBox(self.centralWidget) 167 | self.starRodCheck.setObjectName("starRodCheck") 168 | self.gridLayout.addWidget(self.starRodCheck, 6, 0, 1, 1) 169 | self.title = QtWidgets.QLabel(self.centralWidget) 170 | self.title.setAlignment(QtCore.Qt.AlignCenter) 171 | self.title.setObjectName("title") 172 | self.gridLayout.addWidget(self.title, 0, 0, 1, 1) 173 | self.horizontalLayout = QtWidgets.QHBoxLayout() 174 | self.horizontalLayout.setSpacing(6) 175 | self.horizontalLayout.setObjectName("horizontalLayout") 176 | self.seedLabel = QtWidgets.QLabel(self.centralWidget) 177 | self.seedLabel.setObjectName("seedLabel") 178 | self.horizontalLayout.addWidget(self.seedLabel) 179 | self.seedValue = QtWidgets.QLineEdit(self.centralWidget) 180 | self.seedValue.setObjectName("seedValue") 181 | self.horizontalLayout.addWidget(self.seedValue) 182 | self.gridLayout.addLayout(self.horizontalLayout, 2, 0, 1, 1) 183 | self.horizontalLayout_5 = QtWidgets.QHBoxLayout() 184 | self.horizontalLayout_5.setSpacing(6) 185 | self.horizontalLayout_5.setObjectName("horizontalLayout_5") 186 | self.MKswordLabel = QtWidgets.QLabel(self.centralWidget) 187 | self.MKswordLabel.setObjectName("MKswordLabel") 188 | self.horizontalLayout_5.addWidget(self.MKswordLabel) 189 | self.swordComboBox = QtWidgets.QComboBox(self.centralWidget) 190 | self.swordComboBox.setObjectName("swordComboBox") 191 | self.swordComboBox.addItem("") 192 | self.swordComboBox.addItem("") 193 | self.swordComboBox.addItem("") 194 | self.swordComboBox.addItem("") 195 | self.swordComboBox.addItem("") 196 | self.swordComboBox.addItem("") 197 | self.swordComboBox.addItem("") 198 | self.horizontalLayout_5.addWidget(self.swordComboBox) 199 | self.gridLayout.addLayout(self.horizontalLayout_5, 10, 0, 1, 1) 200 | spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 201 | self.gridLayout.addItem(spacerItem5, 17, 0, 1, 1) 202 | MainWindow.setCentralWidget(self.centralWidget) 203 | 204 | self.retranslateUi(MainWindow) 205 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 206 | 207 | def retranslateUi(self, MainWindow): 208 | _translate = QtCore.QCoreApplication.translate 209 | MainWindow.setWindowTitle(_translate("MainWindow", "Kirby: Nightmare in Dream Land Randomizer")) 210 | self.randomizeButton.setText(_translate("MainWindow", "Randomize!")) 211 | self.urlLabel.setText(_translate("MainWindow", "https://github.com/Aquova/KNDL-Rando")) 212 | self.noAbilitiesCheck.setText(_translate("MainWindow", "Enemies give no abilities")) 213 | self.findROMButton.setText(_translate("MainWindow", "Choose ROM Location")) 214 | self.kirbyColorLabel.setText(_translate("MainWindow", "Kirby Color:")) 215 | self.kirbyComboBox.setItemText(0, _translate("MainWindow", "Default (Pink)")) 216 | self.kirbyComboBox.setItemText(1, _translate("MainWindow", "Red")) 217 | self.kirbyComboBox.setItemText(2, _translate("MainWindow", "Orange")) 218 | self.kirbyComboBox.setItemText(3, _translate("MainWindow", "Yellow")) 219 | self.kirbyComboBox.setItemText(4, _translate("MainWindow", "Green")) 220 | self.kirbyComboBox.setItemText(5, _translate("MainWindow", "Cherry")) 221 | self.kirbyComboBox.setItemText(6, _translate("MainWindow", "Emerald")) 222 | self.kirbyComboBox.setItemText(7, _translate("MainWindow", "Ocean")) 223 | self.kirbyComboBox.setItemText(8, _translate("MainWindow", "Sapphire")) 224 | self.kirbyComboBox.setItemText(9, _translate("MainWindow", "Grape")) 225 | self.kirbyComboBox.setItemText(10, _translate("MainWindow", "Chocolate")) 226 | self.kirbyComboBox.setItemText(11, _translate("MainWindow", "Chalk")) 227 | self.kirbyComboBox.setItemText(12, _translate("MainWindow", "Snow")) 228 | self.kirbyComboBox.setItemText(13, _translate("MainWindow", "Carbon")) 229 | self.kirbyComboBox.setItemText(14, _translate("MainWindow", "Mirror")) 230 | self.kirbyComboBox.setItemText(15, _translate("MainWindow", "Stone")) 231 | self.kirbyComboBox.setItemText(16, _translate("MainWindow", "Ice")) 232 | self.kirbyComboBox.setItemText(17, _translate("MainWindow", "Meta Knight")) 233 | self.kirbyComboBox.setItemText(18, _translate("MainWindow", "Kirby\'s Dream Land 3 Pink")) 234 | self.kirbyComboBox.setItemText(19, _translate("MainWindow", "Kirby\'s Dream Land 3 Blue")) 235 | self.kirbyComboBox.setItemText(20, _translate("MainWindow", "Waddle Dee")) 236 | self.kirbyComboBox.setItemText(21, _translate("MainWindow", "Lololo")) 237 | self.kirbyComboBox.setItemText(22, _translate("MainWindow", "Lalala")) 238 | self.kirbyComboBox.setItemText(23, _translate("MainWindow", "Grayscale")) 239 | self.kirbyComboBox.setItemText(24, _translate("MainWindow", "Random")) 240 | self.MKcolorLabel.setText(_translate("MainWindow", "Meta Knight Color:")) 241 | self.MKcomboBox.setItemText(0, _translate("MainWindow", "Default (Blue)")) 242 | self.MKcomboBox.setItemText(1, _translate("MainWindow", "Kirby")) 243 | self.MKcomboBox.setItemText(2, _translate("MainWindow", "White")) 244 | self.MKcomboBox.setItemText(3, _translate("MainWindow", "Red")) 245 | self.MKcomboBox.setItemText(4, _translate("MainWindow", "Green")) 246 | self.MKcomboBox.setItemText(5, _translate("MainWindow", "Mirror")) 247 | self.enemyCheck.setText(_translate("MainWindow", "Randomize Enemies")) 248 | self.starRodCheck.setText(_translate("MainWindow", "Use Star Rod - EXPERIMENTAL")) 249 | self.title.setText(_translate("MainWindow", "Kirby: Nightmare in Dream Land Randomizer - Version: ")) 250 | self.seedLabel.setText(_translate("MainWindow", "Seed:")) 251 | self.MKswordLabel.setText(_translate("MainWindow", "Meta Knight Sword Color:")) 252 | self.swordComboBox.setItemText(0, _translate("MainWindow", "Default (Yellow)")) 253 | self.swordComboBox.setItemText(1, _translate("MainWindow", "Green")) 254 | self.swordComboBox.setItemText(2, _translate("MainWindow", "Blue")) 255 | self.swordComboBox.setItemText(3, _translate("MainWindow", "Purple")) 256 | self.swordComboBox.setItemText(4, _translate("MainWindow", "Brown")) 257 | self.swordComboBox.setItemText(5, _translate("MainWindow", "Pink")) 258 | self.swordComboBox.setItemText(6, _translate("MainWindow", "White")) 259 | 260 | -------------------------------------------------------------------------------- /src/mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 522 10 | 475 11 | 12 | 13 | 14 | Kirby: Nightmare in Dream Land Randomizer 15 | 16 | 17 | 18 | 19 | 20 | 21 | Qt::Vertical 22 | 23 | 24 | 25 | 20 26 | 40 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | Qt::Vertical 35 | 36 | 37 | 38 | 20 39 | 40 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | Qt::Vertical 48 | 49 | 50 | 51 | 20 52 | 40 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | Randomize! 61 | 62 | 63 | 64 | 65 | 66 | 67 | Qt::Vertical 68 | 69 | 70 | 71 | 20 72 | 40 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | https://github.com/Aquova/KNDL-Rando 81 | 82 | 83 | Qt::AlignCenter 84 | 85 | 86 | 87 | 88 | 89 | 90 | Enemies give no abilities 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | true 100 | 101 | 102 | 103 | 104 | 105 | 106 | Choose ROM Location 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | Kirby Color: 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | Default (Pink) 126 | 127 | 128 | 129 | icons/pinkSprayCan.pngicons/pinkSprayCan.png 130 | 131 | 132 | 133 | 134 | Red 135 | 136 | 137 | 138 | icons/redSprayCan.pngicons/redSprayCan.png 139 | 140 | 141 | 142 | 143 | Orange 144 | 145 | 146 | 147 | icons/orangeSprayCan.pngicons/orangeSprayCan.png 148 | 149 | 150 | 151 | 152 | Yellow 153 | 154 | 155 | 156 | icons/yellowSprayCan.pngicons/yellowSprayCan.png 157 | 158 | 159 | 160 | 161 | Green 162 | 163 | 164 | 165 | icons/greenSprayCan.pngicons/greenSprayCan.png 166 | 167 | 168 | 169 | 170 | Cherry 171 | 172 | 173 | 174 | icons/cherrySprayCan.pngicons/cherrySprayCan.png 175 | 176 | 177 | 178 | 179 | Emerald 180 | 181 | 182 | 183 | icons/emeraldSprayCan.pngicons/emeraldSprayCan.png 184 | 185 | 186 | 187 | 188 | Ocean 189 | 190 | 191 | 192 | icons/oceanSprayCan.pngicons/oceanSprayCan.png 193 | 194 | 195 | 196 | 197 | Sapphire 198 | 199 | 200 | 201 | icons/sapphireSprayCan.pngicons/sapphireSprayCan.png 202 | 203 | 204 | 205 | 206 | Grape 207 | 208 | 209 | 210 | icons/grapeSprayCan.pngicons/grapeSprayCan.png 211 | 212 | 213 | 214 | 215 | Chocolate 216 | 217 | 218 | 219 | icons/chocolateSprayCan.pngicons/chocolateSprayCan.png 220 | 221 | 222 | 223 | 224 | Chalk 225 | 226 | 227 | 228 | icons/chalkSprayCan.pngicons/chalkSprayCan.png 229 | 230 | 231 | 232 | 233 | Snow 234 | 235 | 236 | 237 | icons/snowSprayCan.pngicons/snowSprayCan.png 238 | 239 | 240 | 241 | 242 | Carbon 243 | 244 | 245 | 246 | icons/carbonSprayCan.pngicons/carbonSprayCan.png 247 | 248 | 249 | 250 | 251 | Mirror 252 | 253 | 254 | 255 | icons/mirrorSprayCan.pngicons/mirrorSprayCan.png 256 | 257 | 258 | 259 | 260 | Stone 261 | 262 | 263 | 264 | icons/stoneSprayCan.pngicons/stoneSprayCan.png 265 | 266 | 267 | 268 | 269 | Ice 270 | 271 | 272 | 273 | icons/iceSprayCan.pngicons/iceSprayCan.png 274 | 275 | 276 | 277 | 278 | Meta Knight 279 | 280 | 281 | 282 | icons/metaKnightSprayCan.pngicons/metaKnightSprayCan.png 283 | 284 | 285 | 286 | 287 | Kirby's Dream Land 3 Pink 288 | 289 | 290 | 291 | icons/KDL3pinkSprayCan.pngicons/KDL3pinkSprayCan.png 292 | 293 | 294 | 295 | 296 | Kirby's Dream Land 3 Blue 297 | 298 | 299 | 300 | icons/KDL3blueSprayCan.pngicons/KDL3blueSprayCan.png 301 | 302 | 303 | 304 | 305 | Waddle Dee 306 | 307 | 308 | 309 | icons/waddleDeeSprayCan.pngicons/waddleDeeSprayCan.png 310 | 311 | 312 | 313 | 314 | Lololo 315 | 316 | 317 | 318 | icons/lololoSprayCan.pngicons/lololoSprayCan.png 319 | 320 | 321 | 322 | 323 | Lalala 324 | 325 | 326 | 327 | icons/lalalaSprayCan.pngicons/lalalaSprayCan.png 328 | 329 | 330 | 331 | 332 | Grayscale 333 | 334 | 335 | 336 | icons/grayscaleSprayCan.pngicons/grayscaleSprayCan.png 337 | 338 | 339 | 340 | 341 | Random 342 | 343 | 344 | 345 | icons/randomSprayCan.pngicons/randomSprayCan.png 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | Qt::Horizontal 356 | 357 | 358 | 359 | 360 | 361 | 362 | Qt::Horizontal 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | Meta Knight Color: 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | Default (Blue) 380 | 381 | 382 | 383 | 384 | Kirby 385 | 386 | 387 | 388 | 389 | White 390 | 391 | 392 | 393 | 394 | Red 395 | 396 | 397 | 398 | 399 | Green 400 | 401 | 402 | 403 | 404 | Mirror 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | Qt::Vertical 415 | 416 | 417 | 418 | 20 419 | 40 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | Randomize Enemies 428 | 429 | 430 | 431 | 432 | 433 | 434 | Use Star Rod - EXPERIMENTAL 435 | 436 | 437 | 438 | 439 | 440 | 441 | Kirby: Nightmare in Dream Land Randomizer - Version: 442 | 443 | 444 | Qt::AlignCenter 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | Seed: 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | Meta Knight Sword Color: 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | Default (Yellow) 476 | 477 | 478 | 479 | 480 | Green 481 | 482 | 483 | 484 | 485 | Blue 486 | 487 | 488 | 489 | 490 | Purple 491 | 492 | 493 | 494 | 495 | Brown 496 | 497 | 498 | 499 | 500 | Pink 501 | 502 | 503 | 504 | 505 | White 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | Qt::Vertical 516 | 517 | 518 | 519 | 20 520 | 40 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | -------------------------------------------------------------------------------- /src/Kirby.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {3057596e-413d-4dca-a24a-e9d5776db4b4} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 2 32 | UTF-8 33 | false 34 | 4 35 | false 36 | 80 37 | true 38 | true 39 | 1 40 | true 41 | false 42 | 0 43 | true 44 | true 45 | 0 46 | 8 47 | true 48 | 1 49 | true 50 | true 51 | true 52 | false 53 | 54 | 55 | 56 | ProjectExplorer.Project.PluginSettings 57 | 58 | 59 | 60 | ProjectExplorer.Project.Target.0 61 | 62 | Desktop 63 | Desktop 64 | {08adeeb0-7369-4bc2-ad8d-999eb222b088} 65 | 0 66 | 0 67 | 0 68 | 69 | /Users/austinbricker/Desktop/build-Kirby-Desktop-Debug 70 | 71 | 72 | true 73 | qmake 74 | 75 | QtProjectManager.QMakeBuildStep 76 | true 77 | 78 | false 79 | false 80 | false 81 | 82 | 83 | true 84 | Make 85 | 86 | Qt4ProjectManager.MakeStep 87 | 88 | -w 89 | -r 90 | 91 | false 92 | 93 | 94 | 95 | 2 96 | Build 97 | 98 | ProjectExplorer.BuildSteps.Build 99 | 100 | 101 | 102 | true 103 | Make 104 | 105 | Qt4ProjectManager.MakeStep 106 | 107 | -w 108 | -r 109 | 110 | true 111 | clean 112 | 113 | 114 | 1 115 | Clean 116 | 117 | ProjectExplorer.BuildSteps.Clean 118 | 119 | 2 120 | false 121 | 122 | Debug 123 | 124 | Qt4ProjectManager.Qt4BuildConfiguration 125 | 2 126 | true 127 | 128 | 129 | /Users/austinbricker/Desktop/build-Kirby-Desktop-Release 130 | 131 | 132 | true 133 | qmake 134 | 135 | QtProjectManager.QMakeBuildStep 136 | false 137 | 138 | false 139 | false 140 | false 141 | 142 | 143 | true 144 | Make 145 | 146 | Qt4ProjectManager.MakeStep 147 | 148 | -w 149 | -r 150 | 151 | false 152 | 153 | 154 | 155 | 2 156 | Build 157 | 158 | ProjectExplorer.BuildSteps.Build 159 | 160 | 161 | 162 | true 163 | Make 164 | 165 | Qt4ProjectManager.MakeStep 166 | 167 | -w 168 | -r 169 | 170 | true 171 | clean 172 | 173 | 174 | 1 175 | Clean 176 | 177 | ProjectExplorer.BuildSteps.Clean 178 | 179 | 2 180 | false 181 | 182 | Release 183 | 184 | Qt4ProjectManager.Qt4BuildConfiguration 185 | 0 186 | true 187 | 188 | 189 | /Users/austinbricker/Desktop/build-Kirby-Desktop-Profile 190 | 191 | 192 | true 193 | qmake 194 | 195 | QtProjectManager.QMakeBuildStep 196 | true 197 | 198 | false 199 | true 200 | false 201 | 202 | 203 | true 204 | Make 205 | 206 | Qt4ProjectManager.MakeStep 207 | 208 | -w 209 | -r 210 | 211 | false 212 | 213 | 214 | 215 | 2 216 | Build 217 | 218 | ProjectExplorer.BuildSteps.Build 219 | 220 | 221 | 222 | true 223 | Make 224 | 225 | Qt4ProjectManager.MakeStep 226 | 227 | -w 228 | -r 229 | 230 | true 231 | clean 232 | 233 | 234 | 1 235 | Clean 236 | 237 | ProjectExplorer.BuildSteps.Clean 238 | 239 | 2 240 | false 241 | 242 | Profile 243 | 244 | Qt4ProjectManager.Qt4BuildConfiguration 245 | 0 246 | true 247 | 248 | 3 249 | 250 | 251 | 0 252 | Deploy 253 | 254 | ProjectExplorer.BuildSteps.Deploy 255 | 256 | 1 257 | Deploy locally 258 | 259 | ProjectExplorer.DefaultDeployConfiguration 260 | 261 | 1 262 | 263 | 264 | false 265 | false 266 | 1000 267 | 268 | true 269 | 270 | false 271 | false 272 | false 273 | false 274 | true 275 | 0.01 276 | 10 277 | true 278 | 1 279 | 25 280 | 281 | 1 282 | true 283 | false 284 | true 285 | valgrind 286 | 287 | 0 288 | 1 289 | 2 290 | 3 291 | 4 292 | 5 293 | 6 294 | 7 295 | 8 296 | 9 297 | 10 298 | 11 299 | 12 300 | 13 301 | 14 302 | 303 | 2 304 | 305 | 306 | 307 | %{buildDir} 308 | Custom Executable 309 | 310 | ProjectExplorer.CustomExecutableRunConfiguration 311 | 3768 312 | false 313 | true 314 | false 315 | false 316 | true 317 | 318 | 1 319 | 320 | 321 | 322 | ProjectExplorer.Project.TargetCount 323 | 1 324 | 325 | 326 | ProjectExplorer.Project.Updater.FileVersion 327 | 18 328 | 329 | 330 | Version 331 | 18 332 | 333 | 334 | --------------------------------------------------------------------------------