From b80218a8c1fafb174e3f05c0b51c61005531bf05 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Wed, 8 Mar 2023 16:48:05 -0400 Subject: TProtocol: Start work on `handle_command()`, and the command handlers Hopefully, we can make some good progress. Also, oof, I didn't realize that what I thought were `operator=()`, or a manual `assign()` function, was actually a copy ctor. --- include/pso/TProtocol.h | 107 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 94 insertions(+), 13 deletions(-) (limited to 'include/pso/TProtocol.h') diff --git a/include/pso/TProtocol.h b/include/pso/TProtocol.h index f9d22f9..9d24830 100644 --- a/include/pso/TProtocol.h +++ b/include/pso/TProtocol.h @@ -5,9 +5,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -29,16 +29,6 @@ struct packet { } pkt; u8 bytes[0x7c00]; }; - - template - T &as() { - return reinterpret_cast(*this); - }; - - template - T *as_ptr() { - return reinterpret_cast(this); - }; }; struct GameListEntry { @@ -58,7 +48,80 @@ struct QuestListEntry { char short_description[112]; }; -typedef void (*recv_packet_handler)(packet &pkt); + +#define RECV_PACKET_HANDLERS \ + o(handle_unused_login, void) \ + o(handle_03_recv_regist, void) \ + o(handle_04_recv_login, void) \ + o(handle_05_recv_logout, void) \ + o(handle_07_A0_A1_recv_dir_list, int entry_count, TMenuListEntry *entries, TMenuListEntry &entry_0) \ + o(handle_08_recv_game_list, int entry_count, TMenuListEntry *entries, TMenuListEntry &entry_0) \ + o(handle_01_recv_error, char *mesg) \ + o(handle_06_recv_chat, TPlyGuildCardTag &tag, char *mesg) \ + o(handle_11_additional_info_reply_packet, void) \ + o(handle_1A_D5_large_message_box_packet, void) \ + o(handle_0E_recv_start_game, void) \ + o(unused7, void) \ + o(handle_64_join_game_packet, void) \ + o(unused8, void) \ + o(handle_67_join_lobby_packet, void) \ + o(handle_80_unused_ignored_packet, void) \ + o(unused9, void) \ + o(handle_65_add_player_to_game_packet, void) \ + o(handle_66_player_left_game_packet, void) \ + o(handle_68_add_player_to_lobby_packet, void) \ + o(handle_69_player_left_lobby_packet, void) \ + o(handle_18_90_9A_login_response_packet, void) \ + o(handle_92_9C_register_response_packet, void) \ + o(unused10, void) \ + o(handle_95_request_character_data_packet, void) \ + o(handle_81_simple_mail_packet, void) \ + o(handle_41_guild_card_search_reply_packet, void) \ + o(send_96_unused, void) \ + o(handle_97_checksum_reply_packet, void) \ + o(handle_B1_current_time_packet, void) \ + o(handle_C0_choice_search_option_packet, void) \ + o(handle_C4_choice_search_reply_packet, void) \ + o(handle_D8_infoboard_packet, void) \ + o(handle_A2_quest_list_packet, void) \ + o(handle_A3_quest_info_packet, void) \ + o(handle_44_quest_file_list_packet, void) \ + o(handle_13_quest_data_packet, void) \ + o(handle_A4_downloadable_quest_menu_packet, void) \ + o(handle_A5_downloadable_quest_info_packet, void) \ + o(handle_A6_download_quest_file_list_packet, void) \ + o(handle_A7_download_quest_file_data_packet, void) \ + o(unused11, void) \ + o(handle_1F_lobby_info_desk_list_packet, void) \ + o(handle_B0_server_message_packet, void) \ + o(handle_88_player_arrow_color_list_packet, void) \ + o(handle_8A_lobby_name_packet, void) \ + o(handle_C5_player_challenge_data_packet, void) \ + o(handle_DA_lobby_event_packet, void) \ + o(handle_AB_quest_stats_response_packet, void) \ + o(handle_D3_execute_trade_packet, void) \ + o(handle_D4_trade_result_packet, void) \ + o(handle_D1_advance_trade_state_packet, void) + +#define recv_packet_handler(name) recv_packet_handler_##name + +#define o(name, ...) typedef void (*recv_packet_handler(name))(__VA_ARGS__); +RECV_PACKET_HANDLERS; +#undef o + +struct recv_packet_handlers { + #define o(name, ...) recv_packet_handler(name) name; + RECV_PACKET_HANDLERS; + #undef o +}; + +typedef void (TProtocol::*command_handler)(packet &pkt); + +struct command_handler_entry { + int command; + command_handler handler; +}; + class TProtocol : public TTcpSocket { public: @@ -96,7 +159,7 @@ public: int m_packet_offset; int m_packet_size; struct packet m_packet; - recv_packet_handler m_recv_handlers[52]; + struct recv_packet_handlers m_recv_handlers; public: TProtocol(TObject *parent, u16 sub_version, int language, char *serial_number, char *access_key, char *password); virtual ~TProtocol(); @@ -107,6 +170,24 @@ public: void some_stub() {}; int handle_command(struct packet *pkt); void parse_packet(); + + // Command handlers. + // 0x01 + void recv_error(packet &pkt); + // 0x03 + void recv_regist(packet &pkt); + // 0x04 + void recv_login(packet &pkt); + // 0x05 + void recv_logout(packet &pkt); + // 0x06 + void recv_chat(packet &pkt); + // 0x07 + void recv_dir_list(packet &pkt); + // 0x08 + void recv_game_list(packet &pkt); + // 0x0E + void recv_start_game(packet &pkt); }; #endif -- cgit v1.2.3-13-gbd6f