allow word select across NTE/proto boundary
This commit is contained in:
@@ -631,14 +631,21 @@ static void on_word_select_t(shared_ptr<Client> c, uint8_t command, uint8_t, con
|
|||||||
lc_version = Version::GC_V3;
|
lc_version = Version::GC_V3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t subcommand = cmd.subcommand;
|
||||||
|
if (lc->version() == Version::DC_NTE) {
|
||||||
|
subcommand = 0x62;
|
||||||
|
} else if (lc->version() == Version::DC_V1_11_2000_PROTOTYPE) {
|
||||||
|
subcommand = 0x69;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_big_endian(lc->version())) {
|
if (is_big_endian(lc->version())) {
|
||||||
G_WordSelect_6x74<true> out_cmd = {
|
G_WordSelect_6x74<true> out_cmd = {
|
||||||
cmd.subcommand, cmd.size, cmd.client_id.load(),
|
subcommand, cmd.size, cmd.client_id.load(),
|
||||||
s->word_select_table->translate(cmd.message, from_version, lc_version)};
|
s->word_select_table->translate(cmd.message, from_version, lc_version)};
|
||||||
send_command_t(lc, 0x60, 0x00, out_cmd);
|
send_command_t(lc, 0x60, 0x00, out_cmd);
|
||||||
} else {
|
} else {
|
||||||
G_WordSelect_6x74<false> out_cmd = {
|
G_WordSelect_6x74<false> out_cmd = {
|
||||||
cmd.subcommand, cmd.size, cmd.client_id.load(),
|
subcommand, cmd.size, cmd.client_id.load(),
|
||||||
s->word_select_table->translate(cmd.message, from_version, lc_version)};
|
s->word_select_table->translate(cmd.message, from_version, lc_version)};
|
||||||
send_command_t(lc, 0x60, 0x00, out_cmd);
|
send_command_t(lc, 0x60, 0x00, out_cmd);
|
||||||
}
|
}
|
||||||
@@ -2838,7 +2845,7 @@ SubcommandDefinition subcommand_definitions[0x100] = {
|
|||||||
/* 6x71 */ {0x00, 0x00, 0x71, on_forward_check_game_loading},
|
/* 6x71 */ {0x00, 0x00, 0x71, on_forward_check_game_loading},
|
||||||
/* 6x72 */ {0x00, 0x00, 0x72, on_forward_check_game_loading},
|
/* 6x72 */ {0x00, 0x00, 0x72, on_forward_check_game_loading},
|
||||||
/* 6x73 */ {0x00, 0x00, 0x73, on_invalid},
|
/* 6x73 */ {0x00, 0x00, 0x73, on_invalid},
|
||||||
/* 6x74 */ {0x00, 0x00, 0x74, on_word_select},
|
/* 6x74 */ {0x62, 0x69, 0x74, on_word_select},
|
||||||
/* 6x75 */ {0x00, 0x00, 0x75, on_set_quest_flag},
|
/* 6x75 */ {0x00, 0x00, 0x75, on_set_quest_flag},
|
||||||
/* 6x76 */ {0x00, 0x00, 0x76, on_forward_check_size_game},
|
/* 6x76 */ {0x00, 0x00, 0x76, on_forward_check_size_game},
|
||||||
/* 6x77 */ {0x00, 0x00, 0x77, on_forward_check_size_game},
|
/* 6x77 */ {0x00, 0x00, 0x77, on_forward_check_size_game},
|
||||||
@@ -3068,6 +3075,16 @@ static void handle_subcommand_dc_prototypes(shared_ptr<Client> c, uint8_t comman
|
|||||||
if (final_data.empty()) {
|
if (final_data.empty()) {
|
||||||
final_data.assign(reinterpret_cast<const char*>(data), size);
|
final_data.assign(reinterpret_cast<const char*>(data), size);
|
||||||
final_data[0] = final_subcommand;
|
final_data[0] = final_subcommand;
|
||||||
|
// The Word Select command is a different size in final vs. NTE and
|
||||||
|
// proto, so handle that here by appending FFFFFFFF0000000000000000
|
||||||
|
if (final_subcommand == 0x74) {
|
||||||
|
final_data.resize(0x20, 0x00);
|
||||||
|
final_data[0x01] = 0x08;
|
||||||
|
final_data[0x14] = 0xFF;
|
||||||
|
final_data[0x15] = 0xFF;
|
||||||
|
final_data[0x16] = 0xFF;
|
||||||
|
final_data[0x17] = 0xFF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
send_command(lc, command, flag, final_data);
|
send_command(lc, command, flag, final_data);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user