mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-04-21 03:01:56 +02:00
byuu says: Changelog: - added Cocoa target: higan can now be compiled for OS X Lion [Cydrak, byuu] - SNES/accuracy profile hires color blending improvements - fixes Marvelous text [AWJ] - fixed a slight bug in SNES/SA-1 VBR support caused by a typo - added support for multi-pass shaders that can load external textures (requires OpenGL 3.2+) - added game library path (used by ananke->Import Game) to Settings->Advanced - system profiles, shaders and cheats database can be stored in "all users" shared folders now (eg /usr/share on Linux) - all configuration files are in BML format now, instead of XML (much easier to read and edit this way) - main window supports drag-and-drop of game folders (but not game files / ZIP archives) - audio buffer clears when entering a modal loop on Windows (prevents audio repetition with DirectSound driver) - a substantial amount of code clean-up (probably the biggest refactoring to date) One highly desired target for this release was to default to the optimal drivers instead of the safest drivers, but because AMD drivers don't seem to like my OpenGL 3.2 driver, I've decided to postpone that. AMD has too big a market share. Hopefully with v093 officially released, we can get some public input on what AMD doesn't like.
180 lines
6.0 KiB
C++
180 lines
6.0 KiB
C++
#include <nall/nall.hpp>
|
|
#include <nall/beat/patch.hpp>
|
|
#include "heuristics/famicom.hpp"
|
|
#include "heuristics/super-famicom.hpp"
|
|
#include "heuristics/game-boy.hpp"
|
|
#include "heuristics/game-boy-advance.hpp"
|
|
using namespace nall;
|
|
|
|
#include <phoenix/phoenix.hpp>
|
|
using namespace phoenix;
|
|
|
|
namespace Database {
|
|
#include "database/super-famicom.hpp"
|
|
#include "database/sufami-turbo.hpp"
|
|
#include "database/bsx-satellaview.hpp"
|
|
};
|
|
|
|
struct Ananke {
|
|
#include "configuration.cpp"
|
|
string libraryPath;
|
|
|
|
Ananke();
|
|
|
|
struct Information {
|
|
string path; //path to selected file
|
|
string name; //name of selected file (inside of archive if .zip)
|
|
string archive; //pathname of archive
|
|
string manifest; //manifest from successfully applied patch
|
|
} information;
|
|
|
|
//archive.cpp
|
|
vector<uint8_t> extractROM();
|
|
vector<uint8_t> extractFile(const string &filename);
|
|
|
|
//patch.cpp
|
|
void applyBeatPatch(vector<uint8_t> &buffer);
|
|
|
|
//famicom.cpp
|
|
void copyFamicomSaves(const string &pathname);
|
|
string createFamicomHeuristic(vector<uint8_t> &buffer);
|
|
string openFamicom(vector<uint8_t> &buffer);
|
|
string syncFamicom(const string &pathname);
|
|
|
|
//super-famicom.cpp
|
|
void copySuperFamicomSaves(const string &pathname);
|
|
string createSuperFamicomDatabase(vector<uint8_t> &buffer, Markup::Node &document, const string &manifest);
|
|
string createSuperFamicomHeuristic(vector<uint8_t> &buffer);
|
|
void createSuperFamicomHeuristicFirmware(vector<uint8_t> &buffer, const string &pathname, bool firmware_appended);
|
|
string openSuperFamicom(vector<uint8_t> &buffer);
|
|
string syncSuperFamicom(const string &pathname);
|
|
|
|
//sufami-turbo.cpp
|
|
void copySufamiTurboSaves(const string &pathname);
|
|
string createSufamiTurboDatabase(vector<uint8_t> &buffer, Markup::Node &document, const string &manifest);
|
|
string createSufamiTurboHeuristic(vector<uint8_t> &buffer);
|
|
string openSufamiTurbo(vector<uint8_t> &buffer);
|
|
string syncSufamiTurbo(const string &pathname);
|
|
|
|
//bsx-satellaview.cpp
|
|
string createBsxSatellaviewDatabase(vector<uint8_t> &buffer, Markup::Node &document, const string &manifest);
|
|
string createBsxSatellaviewHeuristic(vector<uint8_t> &buffer);
|
|
string openBsxSatellaview(vector<uint8_t> &buffer);
|
|
string syncBsxSatellaview(const string &pathname);
|
|
|
|
//game-boy.cpp
|
|
void copyGameBoySaves(const string &pathname);
|
|
string createGameBoyHeuristic(vector<uint8_t> &buffer);
|
|
string openGameBoy(vector<uint8_t> &buffer);
|
|
string syncGameBoy(const string &pathname);
|
|
|
|
//game-boy-advance.cpp
|
|
void copyGameBoyAdvanceSaves(const string &pathname);
|
|
string createGameBoyAdvanceHeuristic(vector<uint8_t> &buffer);
|
|
string openGameBoyAdvance(vector<uint8_t> &buffer);
|
|
string syncGameBoyAdvance(const string &pathname);
|
|
|
|
static bool supported(const string &filename);
|
|
string open(string filename = "");
|
|
string sync(string pathname);
|
|
};
|
|
|
|
#include "resource/resource.cpp"
|
|
#include "file-dialog.cpp"
|
|
#include "archive.cpp"
|
|
#include "patch.cpp"
|
|
#include "famicom.cpp"
|
|
#include "super-famicom.cpp"
|
|
#include "sufami-turbo.cpp"
|
|
#include "bsx-satellaview.cpp"
|
|
#include "game-boy.cpp"
|
|
#include "game-boy-advance.cpp"
|
|
|
|
FileDialog *fileDialog = nullptr;
|
|
|
|
Ananke::Ananke() {
|
|
libraryPath = string::read({configpath(), "higan/library.bml"}).strip().ltrim<1>("Path: ").replace("\\", "/");
|
|
if(libraryPath.empty()) libraryPath = {userpath(), "Emulation/"};
|
|
if(libraryPath.endswith("/") == false) libraryPath.append("/");
|
|
}
|
|
|
|
bool Ananke::supported(const string &filename) {
|
|
string extension = nall::extension(filename);
|
|
|
|
if(extension == "fc" ) return true;
|
|
if(extension == "nes") return true;
|
|
if(extension == "sfc") return true;
|
|
if(extension == "smc") return true;
|
|
if(extension == "st" ) return true;
|
|
if(extension == "bs" ) return true;
|
|
if(extension == "gb" ) return true;
|
|
if(extension == "gbc") return true;
|
|
if(extension == "gba") return true;
|
|
if(extension == "zip") return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
string Ananke::open(string filename) {
|
|
if(filename.empty()) {
|
|
if(!fileDialog) {
|
|
fileDialog = new FileDialog;
|
|
fileDialog->setGeometry(config.geometry);
|
|
}
|
|
fileDialog->setPath(config.path);
|
|
filename = fileDialog->open();
|
|
config.geometry = fileDialog->geometry().text();
|
|
}
|
|
|
|
if(filename.empty()) return "";
|
|
|
|
information.path = dir(filename);
|
|
information.name = notdir(filename);
|
|
config.path = information.path; //remember last used directory
|
|
|
|
vector<uint8_t> buffer;
|
|
if(filename.endswith(".zip")) {
|
|
information.archive = filename;
|
|
buffer = extractROM();
|
|
} else {
|
|
buffer = file::read(filename);
|
|
}
|
|
if(buffer.size() == 0) return ""; //failed to read file
|
|
|
|
applyBeatPatch(buffer);
|
|
|
|
if(information.name.endswith(".fc") || information.name.endswith(".nes")) return openFamicom(buffer);
|
|
if(information.name.endswith(".sfc") || information.name.endswith(".smc")) return openSuperFamicom(buffer);
|
|
if(information.name.endswith(".st")) return openSufamiTurbo(buffer);
|
|
if(information.name.endswith(".bs")) return openBsxSatellaview(buffer);
|
|
if(information.name.endswith(".gb") || information.name.endswith(".gbc")) return openGameBoy(buffer);
|
|
if(information.name.endswith(".gba")) return openGameBoyAdvance(buffer);
|
|
return "";
|
|
}
|
|
|
|
string Ananke::sync(string pathname) {
|
|
if(pathname.endswith(".fc/")) return syncFamicom(pathname);
|
|
if(pathname.endswith(".sfc/")) return syncSuperFamicom(pathname);
|
|
if(pathname.endswith(".st/")) return syncSufamiTurbo(pathname);
|
|
if(pathname.endswith(".bs/")) return syncBsxSatellaview(pathname);
|
|
if(pathname.endswith(".gb/")) return syncGameBoy(pathname);
|
|
if(pathname.endswith(".gbc/")) return syncGameBoy(pathname);
|
|
if(pathname.endswith(".gba/")) return syncGameBoyAdvance(pathname);
|
|
return "";
|
|
}
|
|
|
|
extern "C" string ananke_browse(const string &filename) {
|
|
Ananke ananke;
|
|
return ananke.open();
|
|
}
|
|
|
|
extern "C" string ananke_open(const string &filename) {
|
|
Ananke ananke;
|
|
return ananke.open(filename);
|
|
}
|
|
|
|
extern "C" string ananke_sync(const string &pathname) {
|
|
Ananke ananke;
|
|
return ananke.sync(pathname);
|
|
}
|