From 309a34731292736b22c0fafc69eb852715203cee Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Thu, 21 Jul 2022 14:23:47 -0700 Subject: [PATCH] fix flags for JP Plus subversion --- src/Client.hh | 47 +++++++++++++++++++++++++++++-------- src/SendCommands.cc | 3 +++ src/Version.cc | 31 ++++++++++++------------ tests/PC-BasicGame.test.txt | 8 +++---- 4 files changed, 59 insertions(+), 30 deletions(-) diff --git a/src/Client.hh b/src/Client.hh index f61595c2..0bc46c55 100644 --- a/src/Client.hh +++ b/src/Client.hh @@ -48,17 +48,44 @@ struct Client { SAVE_ENABLED = 0x0400, // Client requires doubly-encrypted code section in send_function_call ENCRYPTED_SEND_FUNCTION_CALL = 0x0800, + // Client supports send_function_call but does not actually run the code + SEND_FUNCTION_CALL_CHECKSUM_ONLY = 0x1000, - // TODO: Do DCv1 and PC support send_function_call? Here we assume they don't - DEFAULT_V1 = DCV1 | NO_MESSAGE_BOX_CLOSE_CONFIRMATION | DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, - DEFAULT_V2_DC = NO_MESSAGE_BOX_CLOSE_CONFIRMATION, - DEFAULT_V2_PC = NO_MESSAGE_BOX_CLOSE_CONFIRMATION | DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, - DEFAULT_V3_GC = 0x0000, - DEFAULT_V3_GC_PLUS = NO_MESSAGE_BOX_CLOSE_CONFIRMATION_AFTER_LOBBY_JOIN | ENCRYPTED_SEND_FUNCTION_CALL, - DEFAULT_V3_GC_PLUS_NO_SFC = DEFAULT_V3_GC_PLUS | DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, - DEFAULT_V3_GC_EP3 = NO_MESSAGE_BOX_CLOSE_CONFIRMATION_AFTER_LOBBY_JOIN | EPISODE_3 | ENCRYPTED_SEND_FUNCTION_CALL, - DEFAULT_V3_GC_EP3_NO_SFC = DEFAULT_V3_GC_EP3 | DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, - DEFAULT_V4_BB = NO_MESSAGE_BOX_CLOSE_CONFIRMATION_AFTER_LOBBY_JOIN | NO_MESSAGE_BOX_CLOSE_CONFIRMATION | SAVE_ENABLED, + DEFAULT_V1_DC = + DCV1 | + NO_MESSAGE_BOX_CLOSE_CONFIRMATION | + DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, + + DEFAULT_V2_DC = + NO_MESSAGE_BOX_CLOSE_CONFIRMATION, + + DEFAULT_V2_PC = + NO_MESSAGE_BOX_CLOSE_CONFIRMATION | + SEND_FUNCTION_CALL_CHECKSUM_ONLY, + + DEFAULT_V3_GC = 0, + + DEFAULT_V3_GC_PLUS = + NO_MESSAGE_BOX_CLOSE_CONFIRMATION_AFTER_LOBBY_JOIN | + ENCRYPTED_SEND_FUNCTION_CALL, + + DEFAULT_V3_GC_PLUS_NO_SFC = + DEFAULT_V3_GC_PLUS | + DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, + + DEFAULT_V3_GC_EP3 = + NO_MESSAGE_BOX_CLOSE_CONFIRMATION_AFTER_LOBBY_JOIN | + EPISODE_3 | + ENCRYPTED_SEND_FUNCTION_CALL, + + DEFAULT_V3_GC_EP3_NO_SFC = + DEFAULT_V3_GC_EP3 | + DOES_NOT_SUPPORT_SEND_FUNCTION_CALL, + + DEFAULT_V4_BB = + NO_MESSAGE_BOX_CLOSE_CONFIRMATION_AFTER_LOBBY_JOIN | + NO_MESSAGE_BOX_CLOSE_CONFIRMATION | + SAVE_ENABLED, }; uint64_t id; diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 5ad7b1d2..9e1afe60 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -229,6 +229,9 @@ void send_function_call( if (c->flags & Client::Flag::DOES_NOT_SUPPORT_SEND_FUNCTION_CALL) { throw logic_error("client does not support function calls"); } + if (code.get() && (c->flags & Client::Flag::SEND_FUNCTION_CALL_CHECKSUM_ONLY)) { + throw logic_error("client only supports checksums in send_function_call"); + } string data; uint32_t index = 0; diff --git a/src/Version.cc b/src/Version.cc index fb891d87..f9fb229f 100644 --- a/src/Version.cc +++ b/src/Version.cc @@ -29,24 +29,23 @@ uint16_t flags_for_version(GameVersion version, uint8_t sub_version) { case 0x29: // PSO PC return Client::Flag::DEFAULT_V2_PC; case 0x30: // ??? - case 0x31: // PSO Ep1&2 US10, US11, EU10, JP10 - case 0x33: // PSO Ep1&2 EU50HZ - case 0x34: // PSO Ep1&2 JP11 + case 0x31: // PSO Ep1&2 US v1.00, US v1.01, EU v1.00, JP v1.00 + case 0x33: // PSO Ep1&2 EU 50Hz + case 0x34: // PSO Ep1&2 JP v1.01 return Client::Flag::DEFAULT_V3_GC; - // TODO: Which of these is the first version of JP PSO Plus? That version - // supports encrypted send_function_call; we should set the appropriate flag - // here. - case 0x32: // PSO Ep1&2 US12, JP12 - case 0x35: // PSO Ep1&2 US12, JP12 - case 0x36: // PSO Ep1&2 US12, JP12 - case 0x39: // PSO Ep1&2 US12, JP12 - return Client::Flag::DEFAULT_V3_GC_PLUS_NO_SFC; - case 0x40: // PSO Ep3 trial - case 0x41: // PSO Ep3 US - case 0x43: // PSO Ep3 UK - return Client::Flag::DEFAULT_V3_GC_EP3_NO_SFC; - case 0x42: // PSO Ep3 JP + case 0x35: // PSO Ep1&2 JP Plus (1.04) return Client::Flag::DEFAULT_V3_GC_PLUS; + // TODO: Figure out which of the below is which and update the comments + case 0x32: // PSO Ep1&2 US v1.02, JP v1.02 + case 0x36: // PSO Ep1&2 US v1.02, JP v1.02 + case 0x39: // PSO Ep1&2 US v1.02, JP v1.02 + return Client::Flag::DEFAULT_V3_GC_PLUS_NO_SFC; + case 0x42: // PSO Ep3 JP + return Client::Flag::DEFAULT_V3_GC_EP3; + case 0x40: // PSO Ep3 trial (TODO: Does this support send_function_call?) + case 0x41: // PSO Ep3 US + case 0x43: // PSO Ep3 EU + return Client::Flag::DEFAULT_V3_GC_EP3_NO_SFC; } return 0; } diff --git a/tests/PC-BasicGame.test.txt b/tests/PC-BasicGame.test.txt index eecfb98b..8ae1cfb8 100644 --- a/tests/PC-BasicGame.test.txt +++ b/tests/PC-BasicGame.test.txt @@ -128,7 +128,7 @@ I 80820 2022-07-07 23:34:04 - [Commands] Received from C-2 (version=PC command=9 0000000000000140 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | I 80820 2022-07-07 23:34:04 - [Commands] Sending to C-2 (version=PC command=04 flag=00) 0000000000000000 | 2C 00 04 00 00 00 01 00 78 62 F8 10 39 98 AC 82 | , xb 9 -0000000000000010 | 0E 89 2A 49 04 02 00 00 00 00 00 00 FF FF FF FF | *I +0000000000000010 | 0E 89 2A 49 04 10 00 00 00 00 00 00 FF FF FF FF | *I 0000000000000020 | FF FF FF FF FF FF FF FF FF FF FF FF | I 80820 2022-07-07 23:34:04 - [Commands] Sending to C-2 (version=PC command=07 flag=05) 0000000000000000 | 0C 01 07 05 11 00 00 11 FF FF FF FF 04 00 41 00 | A @@ -161,7 +161,7 @@ I 80820 2022-07-07 23:34:09 - [Commands] Sending to C-2 (version=PC command=97 f 0000000000000000 | 04 00 97 01 | I 80820 2022-07-07 23:34:09 - [Commands] Sending to C-2 (version=PC command=04 flag=00) 0000000000000000 | 2C 00 04 00 00 00 01 00 78 62 F8 10 39 98 AC 82 | , xb 9 -0000000000000010 | 0E 89 2A 49 04 06 00 00 00 00 00 00 FF FF FF FF | *I +0000000000000010 | 0E 89 2A 49 04 14 00 00 00 00 00 00 FF FF FF FF | *I 0000000000000020 | FF FF FF FF FF FF FF FF FF FF FF FF | I 80820 2022-07-07 23:34:10 - [Commands] Received from C-2 (version=PC command=B1 flag=00) 0000000000000000 | 04 00 B1 00 | @@ -208,7 +208,7 @@ I 80820 2022-07-07 23:34:10 - [Commands] Received from C-3 (version=PC command=9 00000000000000C0 | 65 61 00 00 00 00 00 00 00 00 00 00 | ea I 80820 2022-07-07 23:34:10 - [Commands] Sending to C-3 (version=PC command=04 flag=00) 0000000000000000 | 2C 00 04 00 00 00 01 00 78 62 F8 10 39 98 AC 82 | , xb 9 -0000000000000010 | 0E 89 2A 49 04 02 00 00 00 00 00 00 FF FF FF FF | *I +0000000000000010 | 0E 89 2A 49 04 10 00 00 00 00 00 00 FF FF FF FF | *I 0000000000000020 | FF FF FF FF FF FF FF FF FF FF FF FF | I 80820 2022-07-07 23:34:10 - [Commands] Sending to C-3 (version=PC command=83 flag=0F) 0000000000000000 | B8 00 83 0F 33 00 00 33 01 00 00 00 00 00 00 00 | 3 3 @@ -2130,7 +2130,7 @@ I 80820 2022-07-07 23:37:10 - [Commands] Received from C-4 (version=PC command=9 0000000000000140 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | I 80820 2022-07-07 23:37:10 - [Commands] Sending to C-4 (version=PC command=04 flag=00) 0000000000000000 | 2C 00 04 00 00 00 01 00 78 62 F8 10 39 98 AC 82 | , xb 9 -0000000000000010 | 0E 89 2A 49 04 02 00 00 00 00 00 00 FF FF FF FF | *I +0000000000000010 | 0E 89 2A 49 04 10 00 00 00 00 00 00 FF FF FF FF | *I 0000000000000020 | FF FF FF FF FF FF FF FF FF FF FF FF | I 80820 2022-07-07 23:37:10 - [Commands] Sending to C-4 (version=PC command=07 flag=05) 0000000000000000 | 0C 01 07 05 11 00 00 11 FF FF FF FF 04 00 41 00 | A