void Ananke::copySufamiTurboSaves(const string &pathname) { if(!file::exists({pathname, "save.ram"})) { if(file::exists({information.path, nall::basename(information.name), ".srm"})) { file::copy({information.path, nall::basename(information.name), ".srm"}, {pathname, "save.ram"}); } } } string Ananke::createSufamiTurboDatabase(vector<uint8_t> &buffer, Markup::Node &document, const string &manifest) { string pathname = { userpath(), "Emulation/Sufami Turbo/", document["release/information/name"].text(), " (", document["release/information/region"].text(), ")", " (", document["release/information/revision"].text(), ")", ".st/" }; directory::create(pathname); //strip "release" root node from database entry (since a single game manifest isn't part of a database) string markup = manifest; markup.replace("\n ", "\n"); markup.replace("information", "\ninformation"); markup.ltrim<1>("release\n"); file::write({pathname, "manifest.bml"}, markup); file::write({pathname, "program.rom"}, buffer); copySufamiTurboSaves(pathname); return ""; } string Ananke::createSufamiTurboHeuristic(vector<uint8_t> &buffer) { string pathname = { userpath(), "Emulation/Sufami Turbo/", nall::basename(information.name), " (!).st/" }; directory::create(pathname); file::write({pathname, "manifest.bml"}, { "cartridge\n", " rom name=program.rom size=0x", hex(buffer.size()), "\n", " ram name=save.ram size=0x2000\n" "\n" "information\n" " title: ", nall::basename(information.name), "\n" }); file::write({pathname, "program.rom"}, buffer); copySufamiTurboSaves(pathname); return ""; } string Ananke::openSufamiTurbo(vector<uint8_t> &buffer) { string sha256 = nall::sha256(buffer.data(), buffer.size()); string databaseText = string::read({configpath(), "ananke/database/Sufami Turbo.bml"}).strip(); if(databaseText.empty()) databaseText = string{Database::SufamiTurbo}.strip(); lstring databaseItem = databaseText.split("\n\n"); for(auto &item : databaseItem) { item.append("\n"); auto document = Markup::Document(item); if(document["release/information/sha256"].text() == sha256) { return createSufamiTurboDatabase(buffer, document, item); } } return createSufamiTurboHeuristic(buffer); }