Skip to content

Commit

Permalink
Update main.cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
LandonAndEmma authored Apr 8, 2024
1 parent 377ab28 commit fa25bb3
Showing 1 changed file with 117 additions and 87 deletions.
204 changes: 117 additions & 87 deletions main.cpp
Original file line number Diff line number Diff line change
@@ -1,115 +1,145 @@
#include <iostream>
#include <windows.h>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;

const int TRACK_COUNT = 53;
const int OFFSET = 1388909;

// Structure to hold track information
struct Track {
string name;
int seqValue;
};

// Function to load track names and default sequence values
vector<Track> loadTracks() {
vector<Track> tracks(TRACK_COUNT);
// Initialize track names and default sequence values
tracks[0] = {"Unknown", 0};
tracks[1] = {"Course Intro 2", 0};
tracks[2] = {"Course Intro 1", 0};
// Add more tracks...
return tracks;
}

// Function to read file contents into a string
string getFileContents(const string& filename) {
ifstream file(filename, ios::in | ios::binary);
if (!file.is_open()) {
cerr << "Error: Unable to open file " << filename << endl;
// Function to read file contents
string getFileContents(const string &filename) {
ifstream in(filename, ios::in | ios::binary);
if (in) {
ostringstream contents; // Correctly declared ostringstream
contents << in.rdbuf();
in.close();
return contents.str();
} else {
cerr << "Failed to open file: " << filename << endl;
cin.ignore();
exit(1);
}
// Read file contents into a string
return string((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
}

// Function to save string contents into a file
void saveFileContents(const string& filename, const string& contents) {
ofstream file(filename, ios::binary);
if (!file.is_open()) {
cerr << "Error: Unable to save file " << filename << endl;
// Function to get the path of the ARM9 binary file
string getArm9BinPath() {
OPENFILENAME ofn;
char szFile[260] = {0};

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "Binary Files (*.bin)\0*.bin\0All Files (*.*)\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;

if (GetOpenFileName(&ofn) == TRUE) {
return string(szFile);
} else {
cerr << "No file selected." << endl;
cin.ignore();
exit(1);
}
// Write string contents into a file
file << contents;
}

// Function to print track names and their corresponding sequence values
void printTracks(const vector<Track>& tracks) {
for (int i = 0; i < TRACK_COUNT; ++i) {
cout << i << ") " << tracks[i].name << " [" << tracks[i].seqValue << "]" << endl;
}
}

int main() {
// Load track information
vector<Track> tracks = loadTracks();
// Read arm9.bin file into a string
string arm9Data = getFileContents("arm9.bin");
// Extract sequence values from arm9.bin data
vector<int> arm9Values(arm9Data.begin() + OFFSET, arm9Data.begin() + OFFSET + TRACK_COUNT * 4);

// Prompt user to start the program
cout << "Mario Kart DS ARM9 Music Table Editor" << endl;
cout << "Press ENTER to start the program." << endl;
const int offset = 1388909;
int selected;
int newValue;
char choice;

// Track names
vector<string> tracks = {
"Unknown", "Course Intro 2", "Course Intro 1", "Course Intro 3", "Course Intro 1", "Battle Mode Intro",
"Boss Intro", "Figure-8 Circuit", "GCN Luigi Circuit", "GCN Yoshi Circuit", "Cheep Cheep Beach",
"Yoshi Falls", "GCN Baby Park", "N64 Moo Moo Farm", "N64 Frappe Snowland", "Delfino Sqare",
"Airship Fortress", "Wario Stadium", "GCN Mushroom Bridge", "Peach Gardens", "Luigi's Mansion",
"SNES Mario Circuit 1", "SNES Koopa Beach 2", "SNES Donut Plains 1", "SNES Choco Island 2",
"GBA Peach Circuit", "GBA Luigi Circuit", "Shroom Ridge", "N64 Choco Mountain", "N64 Banshee Boardwalk",
"DK Pass", "Desert Hills", "Waluigi Pinball", "Tick-Tock Clock", "Mario Circuit", "Rainbow Road",
"GBA Bowser Castle 2", "Bowser Castle", "GBA Sky Garden", "Battle Stage Theme", "Boss Battle Theme",
"Jingle", "GP Results", "Credits", "Credits True", "Wi-Fi Menu", "Multiplayer Menu", "Records Menu",
"Options Menu", "Intro", "Singleplayer Menu", "Unknown", "Mario Circuit"
};

cout << "Mario Kart DS ARM9 Music Table Editor by Ermelber and Landon & Emma\n\nPress any key to start the program.\n";
cin.ignore();

char choice;
string arm9BinPath = getArm9BinPath();
string text = getFileContents(arm9BinPath);
vector<int> armValues(211);
for (int i = offset; i < min<int>(text.size(), offset + 211); i++)
armValues[i - offset] = static_cast<int>(text[i]);

int seqIndex; // Declare seqIndex outside the loop

do {
// Display track names and sequence values
printTracks(tracks);
for (size_t i = 0; i < tracks.size(); i++) {
cout << i << ") " << tracks[i] << " [" << armValues[i * 4] << "]" << endl;
}

int selected;
// Prompt user to select a track slot
do {
cout << "\nSelect a slot to change [0.." << TRACK_COUNT - 1 << "]: ";
cout << "\n\nSelect a track to change [0.." << tracks.size() - 1 << "]: ";
cin >> selected;
} while (selected < 0 || selected >= TRACK_COUNT);

// Prompt user to confirm editing of the selected track
cout << "\nDo you want to change Slot " << selected << "'s (" << tracks[selected].name << ") SEQ value? [Y/N] ";
cin >> choice;

// If user confirms editing, prompt for new sequence value
if (tolower(choice) == 'y') {
int newValue;
do {
cout << "\nEnter the new SEQ value (Old value was " << arm9Values[selected] << ") [-1..75]: ";
cin >> newValue;
} while (newValue < -1 || newValue > 75);
// Update the selected track's sequence value
arm9Values[selected] = newValue;
} while (selected < 0 || selected >= tracks.size());

while (true) {
cout << "\nDo you want to change Track " << selected << "'s (" << tracks[selected] << ") SEQ value? [Y/N] ";
cin >> choice;
if (toupper(choice) == 'Y') {
do {
// Get the index of the SEQ value for the selected track
seqIndex = selected * 4;

cout << "\nInsert the new SEQ value (Old value was " << armValues[seqIndex] << ") [-1..75]=";
cin >> newValue;
} while (newValue < -1 || newValue > 75);

// Update the SEQ value for the selected track
armValues[seqIndex] = newValue;
break;
} else if (toupper(choice) == 'N') {
break;
} else {
cout << "\nThe Choice isn't valid.";
}
}

// Prompt user to continue editing
cout << "\nDo you want to edit it further? [Y/N] ";
cin >> choice;
} while (tolower(choice) == 'y');
while (true) {
cout << "\nDo you want to edit it furthermore? [Y/N] ";
cin >> choice;

if (toupper(choice) == 'Y') {
break;
} else if (toupper(choice) == 'N') {
break;
} else {
cout << "\nThe Choice isn't valid.";
}
}
} while (toupper(choice) == 'Y');

// Update arm9 data with modified sequence values and save it
for (int i = 0; i < TRACK_COUNT; ++i) {
arm9Data[OFFSET + i * 4] = arm9Values[i];
}
saveFileContents("arm9.bin.bak", arm9Data);
saveFileContents("arm9.bin", arm9Data);
// Save the modified ARM9 binary file
ofstream out("arm9.bin.bak", ios_base::binary | ios_base::out);
out << text;
out.close();

// Inform user about successful save and prompt to exit
cout << "\nSuccessfully saved edited_arm9.bin in your folder!" << endl;
cout << "Press ENTER to exit the program." << endl;
for (int i = offset; i < min<int>(text.size(), offset + 211); i++)
text[i] = armValues[i - offset];

out.open("arm9.bin", ios_base::binary | ios_base::out);
out << text;
out.close();

cout << "\nSuccessfully saved edited_arm9.bin in your folder!\nPress ENTER to exit the program :3\n";
cin.ignore();
cin.ignore();

return 0;
}
}

0 comments on commit fa25bb3

Please sign in to comment.