Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions desktop-ui/emulator/emulator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ struct Emulator {
vector<Firmware> firmware;
shared_pointer<mia::Pak> system;
shared_pointer<mia::Pak> game;
shared_pointer<mia::Pak> gamepad;
shared_pointer<mia::Pak> gb;
vector<InputPort> ports;
vector<string> inputBlacklist;
vector<string> portBlacklist;
Expand Down
2 changes: 0 additions & 2 deletions desktop-ui/emulator/nintendo-64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ struct Nintendo64 : Emulator {
auto save() -> bool override;
auto pak(ares::Node::Object) -> shared_pointer<vfs::directory> override;

shared_pointer<mia::Pak> gamepad;
shared_pointer<mia::Pak> disk;
shared_pointer<mia::Pak> gb;
u32 regionID = 0;
sTimer diskInsertTimer;
};
Expand Down
40 changes: 31 additions & 9 deletions desktop-ui/emulator/nintendo-64dd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ struct Nintendo64DD : Emulator {
auto save() -> bool override;
auto pak(ares::Node::Object) -> shared_pointer<vfs::directory> override;

shared_pointer<mia::Pak> gamepad;
u32 regionID = 0;
sTimer diskInsertTimer;
};
Expand Down Expand Up @@ -95,16 +94,39 @@ auto Nintendo64DD::load() -> bool {
if(auto port = root->find<ares::Node::Port>({"Controller Port ", 1 + id})) {
auto peripheral = port->allocate("Gamepad");
port->connect();
bool transferPakConnected = false;
if(auto port = peripheral->find<ares::Node::Port>("Pak")) {
if(id == 0 && game->pak->attribute("cpak").boolean()) {
gamepad = mia::Pak::create("Nintendo 64");
gamepad->pak->append("save.pak", 32_KiB);
gamepad->load("save.pak", ".pak", game->location);
port->allocate("Controller Pak");
port->connect();
} else if(game->pak->attribute("rpak").boolean()) {
port->allocate("Rumble Pak");
if(id == 0 && game->pak->attribute("tpak").boolean()) {
#if defined(CORE_GB)
auto transferPak = port->allocate("Transfer Pak");
port->connect();

if(auto slot = transferPak->find<ares::Node::Port>("Cartridge Slot")) {
gb = mia::Medium::create("Game Boy");
string tmpPath;
if(gb->load(Emulator::load(gb, tmpPath))) {
slot->allocate();
slot->connect();
transferPakConnected = true;
} else {
port->disconnect();
gb.reset();
}
}
#endif
}

if(!transferPakConnected) {
if(id == 0 && game->pak->attribute("cpak").boolean()) {
gamepad = mia::Pak::create("Nintendo 64");
gamepad->pak->append("save.pak", 32_KiB);
gamepad->load("save.pak", ".pak", game->location);
port->allocate("Controller Pak");
port->connect();
} else if(game->pak->attribute("rpak").boolean()) {
port->allocate("Rumble Pak");
port->connect();
}
}
}
}
Expand Down
109 changes: 109 additions & 0 deletions desktop-ui/presentation/presentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,115 @@ auto Presentation::refreshSystemMenu() -> void {
if(peripheralItem.text() == connected->name()) peripheralItem.setChecked();
}
}

// Allow for additional paks for N64 gamepads
if((emulator->name == "Nintendo 64" || emulator->name == "Nintendo 64DD")
&& port->type() == "Controller") {
const string portNum = port->name()[port->name().length() - 1];

// remove this check to enable pak menu option for all 4 controllers
if(portNum == "1") {

if(portMenu.actionCount() > 0) portMenu.append(MenuSeparator());
Menu pakMenu{&portMenu};
pakMenu.setText("Pak");
Group pakGroup;
MenuRadioItem nothing{&pakMenu};;
nothing.setText("Nothing");
nothing.setAttribute<ares::Node::Port>("port", port);
nothing.onActivate([=] {
auto port = nothing.attribute<ares::Node::Port>("port");
const string portName = port->name();
if(auto port = emulator->root->find<ares::Node::Port>(portName)) {
port->disconnect();
auto peripheral = port->allocate("Gamepad");
port->connect();
}
});
pakGroup.append(nothing);

MenuRadioItem cpak{&pakMenu};
cpak.setAttribute<ares::Node::Port>("port", port);
cpak.setText("Controller Pak");
cpak.onActivate([=] {
auto port = cpak.attribute<ares::Node::Port>("port");
const string portName = port->name();
if(auto port = emulator->root->find<ares::Node::Port>(portName)) {
port->disconnect();
auto peripheral = port->allocate("Gamepad");
port->connect();
if(auto port = peripheral->find<ares::Node::Port>("Pak")) {
emulator->gamepad = mia::Pak::create("Nintendo 64");
emulator->gamepad->pak->append("save.pak", 32_KiB);
string pakExt = ".pak";
if(portNum != "1") { pakExt = string(".", portNum, ".pak");}
emulator->gamepad->load("save.pak", pakExt, emulator->game->location);
port->allocate("Controller Pak");
port->connect();
}
}
});
pakGroup.append(cpak);

MenuRadioItem rpak{&pakMenu};
rpak.setAttribute<ares::Node::Port>("port", port);
rpak.setText("Rumble Pak");
rpak.onActivate([=] {
auto port = rpak.attribute<ares::Node::Port>("port");
const string portName = port->name();
if(auto port = emulator->root->find<ares::Node::Port>(portName)) {
port->disconnect();
auto peripheral = port->allocate("Gamepad");
port->connect();
if(auto port = peripheral->find<ares::Node::Port>("Pak")) {
port->allocate("Rumble Pak");
port->connect();
}
}
});
pakGroup.append(rpak);

MenuRadioItem tpak{&pakMenu};
tpak.setAttribute<ares::Node::Port>("port", port);
tpak.setText("Transfer Pak");
tpak.onActivate([=] {
auto port = tpak.attribute<ares::Node::Port>("port");
const string portName = port->name();
if(auto port = emulator->root->find<ares::Node::Port>(portName)) {
port->disconnect();
auto peripheral = port->allocate("Gamepad");
port->connect();
if(auto port = peripheral->find<ares::Node::Port>("Pak")) {
#if defined(CORE_GB)
emulator->gb.reset();
auto transferPak = port->allocate("Transfer Pak");
port->connect();

if(auto slot = transferPak->find<ares::Node::Port>("Cartridge Slot")) {
emulator->gb = mia::Medium::create("Game Boy");
string tmpPath;
if(emulator->gb->load(emulator->load(emulator->gb, tmpPath))) {
slot->allocate();
slot->connect();
} else {
port->disconnect();
emulator->gb.reset();
}
}
#endif
}
}
});
pakGroup.append(tpak);

// set currently enabled pak
// Note: based on initialization routine in desktop-ui/emulator/nintendo-64.cpp & nintedo-64dd.cpp
if(emulator->game->pak->attribute("tpak").boolean() && portNum == "1") tpak.setChecked();
else if(emulator->game->pak->attribute("cpak").boolean() && portNum == "1") cpak.setChecked();
else if(emulator->game->pak->attribute("rpak").boolean()) rpak.setChecked();
else nothing.setChecked();
}
}
}

if(portsFound > 0) systemMenu.append(MenuSeparator());
Expand Down
Loading