fix differentiation between Episode 3 Trial Edition and final JP version
This commit is contained in:
@@ -68,6 +68,7 @@ Current known issues / missing features / things to do:
|
||||
- Implement the C5 (battle/challenge records) command.
|
||||
- Implement choice search.
|
||||
- Episode 3 bugs
|
||||
- Re-record the Episode 3 battle replay test.
|
||||
- Fix behavior when joining a spectator team after the beginning of a battle.
|
||||
- Disconnecting during a match turns you into a COM if there are other humans in the match, even if the match is part of a tournament. This may be incorrect behavior for tournaments.
|
||||
- Disconnecting during a tournament when there are no other humans in the match simply cancels the match (so it can be replayed) instead of forfeiting, which is almost certainly incorrect behavior. (Then again, no one likes losing tournaments to COMs...)
|
||||
|
||||
+20
-10
@@ -231,15 +231,6 @@ static void send_main_menu(shared_ptr<ServerState> s, shared_ptr<Client> c) {
|
||||
}
|
||||
|
||||
void on_login_complete(shared_ptr<ServerState> s, shared_ptr<Client> c) {
|
||||
if (c->flags & Client::Flag::IS_EPISODE_3) {
|
||||
auto team = s->ep3_tournament_index->team_for_serial_number(c->license->serial_number);
|
||||
auto tourn = team ? team->tournament.lock() : nullptr;
|
||||
c->ep3_tournament_team = team;
|
||||
if (!(c->flags & Client::Flag::IS_EP3_TRIAL_EDITION)) {
|
||||
send_ep3_confirm_tournament_entry(s, c, tourn);
|
||||
}
|
||||
}
|
||||
|
||||
// On the BB data server, this function is called only on the last connection
|
||||
// (when we should send the ship select menu).
|
||||
if ((c->server_behavior == ServerBehavior::LOGIN_SERVER) ||
|
||||
@@ -252,8 +243,8 @@ void on_login_complete(shared_ptr<ServerState> s, shared_ptr<Client> c) {
|
||||
} else if (s->pre_lobby_event) {
|
||||
send_change_event(c, s->pre_lobby_event);
|
||||
}
|
||||
send_ep3_card_list_update(s, c);
|
||||
send_ep3_rank_update(c);
|
||||
send_get_player_info(c);
|
||||
} else if (s->pre_lobby_event) {
|
||||
send_change_event(c, s->pre_lobby_event);
|
||||
}
|
||||
@@ -2493,9 +2484,28 @@ static void on_61_98(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
||||
c->game_data.ep3_config.reset(new Episode3::PlayerConfig(pd3->ep3_config));
|
||||
cmd = reinterpret_cast<const C_CharacterData_V3_61_98*>(pd3);
|
||||
} else {
|
||||
if (c->flags & Client::Flag::IS_EPISODE_3) {
|
||||
c->flags = (c->flags | Client::Flag::IS_EP3_TRIAL_EDITION) & (~Client::Flag::ENCRYPTED_SEND_FUNCTION_CALL);
|
||||
}
|
||||
cmd = &check_size_t<C_CharacterData_V3_61_98>(data, 0xFFFF);
|
||||
}
|
||||
|
||||
// We use the flag field in this command to differentiate between Ep3
|
||||
// Trial Edition and the final version: Trial Edition sends flag=3, and
|
||||
// the final version sends flag=4. Because the contents of the card list
|
||||
// update and the current tournament entry depend on this flag, we have
|
||||
// to delay sending them until now, instead of sending them during the
|
||||
// login sequence.
|
||||
if ((c->flags & Client::Flag::IS_EPISODE_3) && !(c->flags & Client::Flag::HAS_EP3_CARD_DEFS)) {
|
||||
send_ep3_card_list_update(s, c);
|
||||
auto team = s->ep3_tournament_index->team_for_serial_number(c->license->serial_number);
|
||||
auto tourn = team ? team->tournament.lock() : nullptr;
|
||||
c->ep3_tournament_team = team;
|
||||
if (!(c->flags & Client::Flag::IS_EP3_TRIAL_EDITION)) {
|
||||
send_ep3_confirm_tournament_entry(s, c, tourn);
|
||||
}
|
||||
}
|
||||
|
||||
auto account = c->game_data.account();
|
||||
auto player = c->game_data.player();
|
||||
player->inventory = cmd->inventory;
|
||||
|
||||
+5
-5
@@ -81,14 +81,14 @@ uint32_t flags_for_version(GameVersion version, int64_t sub_version) {
|
||||
return Client::Flag::NO_D6_AFTER_LOBBY |
|
||||
Client::Flag::NO_SEND_FUNCTION_CALL;
|
||||
|
||||
case 0x40: // GC Ep3 trial
|
||||
// TODO: Is this sub_version used for any other Ep3 versions? Is the final
|
||||
// JP release really 42 and not 40?
|
||||
case 0x40: // GC Ep3 JP and Trial Edition
|
||||
// sub_version can't be used to tell JP final and Trial Edition apart; we
|
||||
// instead look at header.flag in the 61 command.
|
||||
return Client::Flag::NO_D6_AFTER_LOBBY |
|
||||
Client::Flag::IS_EPISODE_3 |
|
||||
Client::Flag::IS_EP3_TRIAL_EDITION |
|
||||
Client::Flag::ENCRYPTED_SEND_FUNCTION_CALL |
|
||||
Client::Flag::SEND_FUNCTION_CALL_NO_CACHE_PATCH;
|
||||
case 0x42: // GC Ep3 JP
|
||||
case 0x42: // Also GC Ep3 JP?
|
||||
return Client::Flag::NO_D6_AFTER_LOBBY |
|
||||
Client::Flag::IS_EPISODE_3 |
|
||||
Client::Flag::ENCRYPTED_SEND_FUNCTION_CALL |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user