move gba files to system/gba/
This commit is contained in:
+13
-8
@@ -827,6 +827,9 @@ void process_menu_selection(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (l) {
|
if (l) {
|
||||||
|
if (is_ep3 || !dat_contents) {
|
||||||
|
throw runtime_error("episode 3 quests cannot be loaded during games");
|
||||||
|
}
|
||||||
if (q->joinable) {
|
if (q->joinable) {
|
||||||
l->flags |= Lobby::Flag::JOINABLE_QUEST_IN_PROGRESS;
|
l->flags |= Lobby::Flag::JOINABLE_QUEST_IN_PROGRESS;
|
||||||
} else {
|
} else {
|
||||||
@@ -842,10 +845,10 @@ void process_menu_selection(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
|||||||
// cause GC clients to crash in rare cases. Find a way to slow this down
|
// cause GC clients to crash in rare cases. Find a way to slow this down
|
||||||
// (perhaps by only sending each new chunk when they acknowledge the
|
// (perhaps by only sending each new chunk when they acknowledge the
|
||||||
// previous chunk with a 44 [first chunk] or 13 [later chunks] command).
|
// previous chunk with a 44 [first chunk] or 13 [later chunks] command).
|
||||||
send_quest_file(l->clients[x], bin_basename + ".bin", bin_basename, *bin_contents, false, is_ep3);
|
send_quest_file(l->clients[x], bin_basename + ".bin", bin_basename,
|
||||||
if (dat_contents) {
|
*bin_contents, QuestFileType::ONLINE);
|
||||||
send_quest_file(l->clients[x], dat_basename + ".dat", dat_basename, *dat_contents, false, is_ep3);
|
send_quest_file(l->clients[x], dat_basename + ".dat", dat_basename,
|
||||||
}
|
*dat_contents, QuestFileType::ONLINE);
|
||||||
|
|
||||||
// There is no such thing as command AC on PSO PC - quests just start
|
// There is no such thing as command AC on PSO PC - quests just start
|
||||||
// immediately when they're done downloading. There are also no chunk
|
// immediately when they're done downloading. There are also no chunk
|
||||||
@@ -865,9 +868,11 @@ void process_menu_selection(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
|||||||
if (!is_ep3) {
|
if (!is_ep3) {
|
||||||
q = q->create_download_quest();
|
q = q->create_download_quest();
|
||||||
}
|
}
|
||||||
send_quest_file(c, quest_name, bin_basename, *q->bin_contents(), true, is_ep3);
|
send_quest_file(c, quest_name, bin_basename, *q->bin_contents(),
|
||||||
|
is_ep3 ? QuestFileType::EPISODE_3 : QuestFileType::DOWNLOAD);
|
||||||
if (dat_contents) {
|
if (dat_contents) {
|
||||||
send_quest_file(c, quest_name, dat_basename, *q->dat_contents(), true, is_ep3);
|
send_quest_file(c, quest_name, dat_basename, *q->dat_contents(),
|
||||||
|
is_ep3 ? QuestFileType::EPISODE_3 : QuestFileType::DOWNLOAD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1024,9 +1029,9 @@ void process_gba_file_request(shared_ptr<ServerState>, shared_ptr<Client> c,
|
|||||||
uint16_t, uint32_t, const string& data) { // D7
|
uint16_t, uint32_t, const string& data) { // D7
|
||||||
string filename(data);
|
string filename(data);
|
||||||
strip_trailing_zeroes(filename);
|
strip_trailing_zeroes(filename);
|
||||||
auto contents = file_cache.get(filename);
|
auto contents = file_cache.get("system/gba/" + filename);
|
||||||
|
|
||||||
send_quest_file(c, filename, filename, *contents, false, false);
|
send_quest_file(c, "", filename, *contents, QuestFileType::GBA_DEMO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+33
-18
@@ -1348,21 +1348,37 @@ void send_quest_open_file_t(
|
|||||||
const string& quest_name,
|
const string& quest_name,
|
||||||
const string& filename,
|
const string& filename,
|
||||||
uint32_t file_size,
|
uint32_t file_size,
|
||||||
bool is_download_quest,
|
QuestFileType type) {
|
||||||
bool is_ep3_quest) {
|
|
||||||
CommandT cmd;
|
CommandT cmd;
|
||||||
cmd.unused = 0;
|
uint8_t command_num;
|
||||||
if (is_ep3_quest) {
|
switch (type) {
|
||||||
cmd.flags = 3;
|
case QuestFileType::ONLINE:
|
||||||
} else if (is_download_quest) {
|
command_num = 0x44;
|
||||||
cmd.flags = 0;
|
cmd.name = "PSO/" + quest_name;
|
||||||
} else {
|
cmd.flags = 2;
|
||||||
cmd.flags = 2;
|
break;
|
||||||
|
case QuestFileType::GBA_DEMO:
|
||||||
|
command_num = 0xA6;
|
||||||
|
cmd.name = "GBA Demo";
|
||||||
|
cmd.flags = 2;
|
||||||
|
break;
|
||||||
|
case QuestFileType::DOWNLOAD:
|
||||||
|
command_num = 0xA6;
|
||||||
|
cmd.name = "PSO/" + quest_name;
|
||||||
|
cmd.flags = 0;
|
||||||
|
break;
|
||||||
|
case QuestFileType::EPISODE_3:
|
||||||
|
command_num = 0xA6;
|
||||||
|
cmd.name = "PSO/" + quest_name;
|
||||||
|
cmd.flags = 3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw logic_error("invalid quest file type");
|
||||||
}
|
}
|
||||||
|
cmd.unused = 0;
|
||||||
cmd.file_size = file_size;
|
cmd.file_size = file_size;
|
||||||
cmd.name = "PSO/" + quest_name;
|
|
||||||
cmd.filename = filename.c_str();
|
cmd.filename = filename.c_str();
|
||||||
send_command_t(c, is_download_quest ? 0xA6 : 0x44, 0x00, cmd);
|
send_command_t(c, command_num, 0x00, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_quest_file_chunk(
|
void send_quest_file_chunk(
|
||||||
@@ -1371,7 +1387,7 @@ void send_quest_file_chunk(
|
|||||||
size_t chunk_index,
|
size_t chunk_index,
|
||||||
const void* data,
|
const void* data,
|
||||||
size_t size,
|
size_t size,
|
||||||
bool is_download_quest) {
|
QuestFileType type) {
|
||||||
if (size > 0x400) {
|
if (size > 0x400) {
|
||||||
throw invalid_argument("quest file chunks must be 1KB or smaller");
|
throw invalid_argument("quest file chunks must be 1KB or smaller");
|
||||||
}
|
}
|
||||||
@@ -1384,19 +1400,18 @@ void send_quest_file_chunk(
|
|||||||
}
|
}
|
||||||
cmd.data_size = size;
|
cmd.data_size = size;
|
||||||
|
|
||||||
send_command_t(c, is_download_quest ? 0xA7 : 0x13, chunk_index, cmd);
|
send_command_t(c, (type == QuestFileType::ONLINE) ? 0x13 : 0xA7, chunk_index, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_quest_file(shared_ptr<Client> c, const string& quest_name,
|
void send_quest_file(shared_ptr<Client> c, const string& quest_name,
|
||||||
const string& basename, const string& contents, bool is_download_quest,
|
const string& basename, const string& contents, QuestFileType type) {
|
||||||
bool is_ep3_quest) {
|
|
||||||
|
|
||||||
if (c->version == GameVersion::PC || c->version == GameVersion::GC) {
|
if (c->version == GameVersion::PC || c->version == GameVersion::GC) {
|
||||||
send_quest_open_file_t<S_OpenFile_PC_GC_44_A6>(
|
send_quest_open_file_t<S_OpenFile_PC_GC_44_A6>(
|
||||||
c, quest_name, basename, contents.size(), is_download_quest, is_ep3_quest);
|
c, quest_name, basename, contents.size(), type);
|
||||||
} else if (c->version == GameVersion::BB) {
|
} else if (c->version == GameVersion::BB) {
|
||||||
send_quest_open_file_t<S_OpenFile_BB_44_A6>(
|
send_quest_open_file_t<S_OpenFile_BB_44_A6>(
|
||||||
c, quest_name, basename, contents.size(), is_download_quest, is_ep3_quest);
|
c, quest_name, basename, contents.size(), type);
|
||||||
} else {
|
} else {
|
||||||
throw invalid_argument("cannot send quest files to this version of client");
|
throw invalid_argument("cannot send quest files to this version of client");
|
||||||
}
|
}
|
||||||
@@ -1407,7 +1422,7 @@ void send_quest_file(shared_ptr<Client> c, const string& quest_name,
|
|||||||
chunk_bytes = 0x400;
|
chunk_bytes = 0x400;
|
||||||
}
|
}
|
||||||
send_quest_file_chunk(c, basename.c_str(), offset / 0x400,
|
send_quest_file_chunk(c, basename.c_str(), offset / 0x400,
|
||||||
contents.data() + offset, chunk_bytes, is_download_quest);
|
contents.data() + offset, chunk_bytes, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -209,9 +209,16 @@ void send_ep3_rank_update(std::shared_ptr<Client> c);
|
|||||||
void send_ep3_map_list(std::shared_ptr<Lobby> l);
|
void send_ep3_map_list(std::shared_ptr<Lobby> l);
|
||||||
void send_ep3_map_data(std::shared_ptr<Lobby> l, uint32_t map_id);
|
void send_ep3_map_data(std::shared_ptr<Lobby> l, uint32_t map_id);
|
||||||
|
|
||||||
|
enum class QuestFileType {
|
||||||
|
ONLINE = 0,
|
||||||
|
DOWNLOAD,
|
||||||
|
EPISODE_3,
|
||||||
|
GBA_DEMO,
|
||||||
|
};
|
||||||
|
|
||||||
void send_quest_file(std::shared_ptr<Client> c, const std::string& quest_name,
|
void send_quest_file(std::shared_ptr<Client> c, const std::string& quest_name,
|
||||||
const std::string& basename, const std::string& contents,
|
const std::string& basename, const std::string& contents,
|
||||||
bool is_download_quest, bool is_ep3_quest);
|
QuestFileType type);
|
||||||
|
|
||||||
void send_server_time(std::shared_ptr<Client> c);
|
void send_server_time(std::shared_ptr<Client> c);
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user