Files
Cesarus85--ringfall-mjolnir-vr/source/networking/network_client_manager.c
T

1022 lines
28 KiB
C

/*
NETWORK_CLIENT_MANAGER.C
symbols in this file:
001141C0 0040:
_code_001141c0 (0000)
00114200 0060:
_network_game_client_dispose (0000)
00114260 0020:
_network_game_client_keep_alive (0000)
00114280 0070:
_network_game_client_get_state (0000)
001142F0 0100:
_network_game_client_initiate_join_game (0000)
001143F0 0070:
_network_game_client_set_machine (0000)
00114460 0030:
_network_game_client_get_machine (0000)
00114490 0040:
_network_game_client_get_machine_index (0000)
001144D0 0040:
_network_game_client_get_available_games (0000)
00114510 0040:
_network_game_client_get_error (0000)
00114550 0040:
_network_game_client_get_seconds_to_game_start (0000)
00114590 0010:
_network_game_client_write (0000)
001145A0 00d0:
_network_game_client_address_matches_server (0000)
00114670 0070:
_network_game_client_game_out_of_sync (0000)
001146E0 00b0:
_network_game_client_ponged (0000)
00114790 0110:
_network_game_client_accepted_into_game (0000)
001148A0 0130:
_network_game_client_game_settings_updated (0000)
001149D0 0060:
_unstrip_player_index (0000)
00114A30 01a0:
_network_game_client_game_has_started (0000)
00114BD0 0190:
_network_game_client_handle_game_update (0000)
00114D60 0100:
_network_game_client_add_player_to_game (0000)
00114E60 0050:
_network_game_client_switch_to_postgame (0000)
00114EB0 00b0:
_network_game_client_switch_to_pregame (0000)
00114F60 0040:
_network_game_client_get_connection (0000)
00114FA0 0050:
_network_game_client_get_remote_server_address (0000)
00114FF0 0040:
_network_game_client_get_game (0000)
00115030 0040:
_network_game_client_server_has_started_game (0000)
00115070 0040:
_network_game_client_get_next_update_number (0000)
001150B0 0040:
_network_client_get_oos (0000)
001150F0 01f0:
_network_game_client_add_player (0000)
001152E0 0100:
_network_game_client_update_local_player_data (0000)
001153E0 00d0:
_network_game_client_request_start_time_change (0000)
001154B0 0050:
_network_game_client_countdown_timer_update (0000)
00115500 0030:
_network_game_client_advertised_game_is_valid (0000)
00115530 02d0:
_code_00115530 (0000)
00115800 0050:
_code_00115800 (0000)
00115850 00c0:
_code_00115850 (0000)
00115910 0080:
_code_00115910 (0000)
00115990 0260:
_network_game_client_leave_game (0000)
00115BF0 01f0:
_network_game_client_request_remove_player (0000)
00115DE0 0170:
_network_game_client_remove_player (0000)
00115F50 0050:
_network_game_client_new_advertised_game (0000)
00115FA0 0070:
_network_game_client_game_shutdown (0000)
00116010 00e0:
_network_game_client_reset (0000)
001160F0 02c0:
_code_001160f0 (0000)
001163B0 0180:
_code_001163b0 (0000)
00116530 00d0:
_code_00116530 (0000)
00116600 0190:
_code_00116600 (0000)
00116790 00a0:
_code_00116790 (0000)
00116830 0090:
_network_game_client_create (0000)
001168C0 0130:
_network_game_client_idle (0000)
001169F0 00c0:
_network_game_client_rejected_by_game (0000)
0027FC5C 0018:
??_C@_0BI@DEMLIONO@network?5client?5disposed?$AA@ (0000)
0027FC74 002d:
??_C@_0CN@POHNGKMA@network_game_client_dont_use_dir@ (0000)
0027FCA4 0033:
??_C@_0DD@GHLNCEHN@c?3?2halo?2SOURCE?2networking?2networ@ (0000)
0027FCD8 0007:
??_C@_06DGDLPBAN@client?$AA@ (0000)
0027FCE0 0035:
??_C@_0DF@IEPBBGCD@failed?5attempt?5to?5initiate?5a?5con@ (0000)
0027FD18 0023:
??_C@_0CD@NIGOILLF@attempting?5to?5connect?5to?5game?5?$EA?5@ (0000)
0027FD40 00e1:
??_C@_0OB@CAKDCBMD@client?5?$CG?$CG?5?$CIclient?9?$DOstate?5?$DN?$DN?5_net@ (0000)
0027FE28 0065:
??_C@_0GF@JAOOPLIH@client?5?$CG?$CG?5?$CIclient?9?$DOmachine_index@ (0000)
0027FE90 001e:
??_C@_0BO@IIIGFMHE@address?9?$DOaddress?4ipv4_address?$AA@ (0000)
0027FEB0 0010:
??_C@_0BA@IONABMGK@address?5?$CB?$DN?5NULL?$AA@ (0000)
0027FEC0 0013:
??_C@_0BD@PONNKDL@client?9?$DOconnection?$AA@ (0000)
0027FED4 000f:
??_C@_0P@FOLJNCCO@client?5?$CB?$DN?5NULL?$AA@ (0000)
0027FEE4 002d:
??_C@_0CN@FOHIFFFA@local?5machine?5is?5out?5of?5sync?5wit@ (0000)
0027FF14 0036:
??_C@_0DG@JNMFILGG@received?5a?5pong?5from?5a?5system?5we@ (0000)
0027FF4C 0020:
??_C@_0CA@IDICKDHG@received?5a?5pong?5from?5the?5future?$AA@ (0000)
0027FF6C 0019:
??_C@_0BJ@NIPOLBAB@client?5?$CG?$CG?5source_address?$AA@ (0000)
0027FF88 004c:
??_C@_0EM@DJKCNCJP@received?5a?5message_server_machin@ (0000)
0027FFD4 003b:
??_C@_0DL@PONBKBJJ@failed?5to?5create?5a?5message_clien@ (0000)
00280010 005b:
??_C@_0FL@OHPOKFBL@network_game_client_write?$CI?$CJ?5fail@ (0000)
0028006C 0033:
??_C@_0DD@POLEJMBC@successfully?5joined?5a?5net?5game?$DL?5@ (0000)
002800A0 0064:
??_C@_0GE@OLBCDHF@client?5?$CG?$CG?5source_address?5?$CG?$CG?5mess@ (0000)
00280108 005e:
??_C@_0FO@NIJHHMKN@invalid?5message_server_game_sett@ (0000)
00280168 0021:
??_C@_0CB@KMIKJFNP@player?5count?5?$CFd?5machine?5count?5?$CFd@ (0000)
00280190 0060:
??_C@_0GA@FCJMEIKG@received?5updated?5game?5settings?5f@ (0000)
002801F0 0017:
??_C@_0BH@KPFLOHLF@precaching?5map?5?8?$CFs?8?4?4?4?$AA@ (0000)
00280208 0019:
??_C@_0BJ@MGLALEIH@client?5?$CG?$CG?5message_packet?$AA@ (0000)
00280224 0027:
??_C@_0CH@CHLJGLMB@failed?5to?5load?5the?5necessary?5gam@ (0000)
0028024C 0031:
??_C@_0DB@BGLEMKKH@failed?5to?5create?5a?5message_clien@ (0000)
00280280 0051:
??_C@_0FB@NFJPBNDI@network_game_client_write?$CI?$CJ?5fail@ (0000)
002802D4 0028:
??_C@_0CI@DFFIDDAF@local?5machine?5is?5loaded?5?$CG?5ready?5@ (0000)
00280300 0040:
??_C@_0EA@MFKNPKNH@client?5?$CG?$CG?5?$CIclient?9?$DOstate?5?$DN?$DN?5_net@ (0000)
00280340 0036:
??_C@_0DG@PKKMJLJH@client?5is?5lagging?5behind?5the?5ser@ (0000)
00280378 0061:
??_C@_0GB@LLAIIL@out?5of?5sync?3?5client?1server?5rando@ (0000)
002803DC 002d:
??_C@_0CN@HEOJJEAC@not?5a?5bug?0?5but?5update?5?$CFd?5time?5?$CFd@ (0000)
0028040C 003e:
??_C@_0DO@OFILJPBP@out?5of?5sync?3?5missed?5a?5server?5upd@ (0000)
0028044C 003c:
??_C@_0DM@JCJEPCIA@added?5new?5player?5to?5the?5game?5?$CIma@ (0000)
00280488 0011:
??_C@_0BB@NJALFKEL@client?5?$CG?$CG?5player?$AA@ (0000)
0028049C 0016:
??_C@_0BG@OEHGDLGH@switching?5to?5postgame?$AA@ (0000)
002804B4 0015:
??_C@_0BF@FFECCEDB@switching?5to?5pregame?$AA@ (0000)
002804CC 001e:
??_C@_0BO@NFAGDPGC@client?5is?5in?5an?5unknown?5state?$AA@ (0000)
002804EC 002e:
??_C@_0CO@BDJGBKN@client?5tried?5to?5add?5a?5new?5player@ (0000)
00280520 0044:
??_C@_0EE@EPIGONGI@failed?5to?5create?5a?5message_clien@ (0000)
00280568 0064:
??_C@_0GE@JOEDNBHN@network_game_client_write?$CI?$CJ?5fail@ (0000)
002805D0 0045:
??_C@_0EF@CDEPJEJP@failed?5to?5create?5a?5message_clien@ (0000)
00280618 0065:
??_C@_0GF@EOEDLFEI@network_game_client_write?$CI?$CJ?5fail@ (0000)
00280680 0039:
??_C@_0DJ@IAEGENPP@can?8t?5add?5players?5to?5a?5game?5unti@ (0000)
002806BC 0034:
??_C@_0DE@DFECLBOM@requesting?5a?5player?5addition?5?$CIco@ (0000)
002806F0 005a:
??_C@_0FK@DNGOMOFK@client?5?$CG?$CG?5?$CIlocal_player_index?$DO?$DN0@ (0000)
00280750 0075:
??_C@_0HF@KCCMHIFI@network_game_client_update_local@ (0000)
002807C8 0020:
??_C@_0CA@GNHJCNBC@network_player_is_valid?$CIplayer?$CJ?$AA@ (0000)
002807E8 002d:
??_C@_0CN@MLPKDKFB@player?9?$DOmachine_index?$DN?$DNclient?9?$DOm@ (0000)
00280818 005b:
??_C@_0FL@EPANHPNG@failed?5to?5send?5a?5message_client_@ (0000)
00280878 006b:
??_C@_0GL@IAFAMNHJ@network_game_client_request_star@ (0000)
002808E8 0042:
??_C@_0EC@OCMHEGGP@?$CIrequest_type?$DO?$DN0?$CJ?5?$CG?$CG?5?$CIrequest_ty@ (0000)
0028092C 0038:
??_C@_0DI@NNABEADG@there?5is?5?$CFs?5?$CFs?5net?5game?5with?5?$CFd?5@ (0000)
00280964 0009:
??_C@_08EDJFMNDP@a?5closed?$AA@ (0000)
00280970 0008:
??_C@_07JPIGLNNP@an?5open?$AA@ (0000)
00280978 0013:
??_C@_0BD@DEAGDPEH@?$DMunknown?5platform?$DO?$AA@ (0000)
0028098C 0003:
??_C@_02LHFGBEJL@PC?$AA@ (0000)
00280990 0005:
??_C@_04KEMOGDLN@XBox?$AA@ (0000)
00280998 0008:
??_C@_17JLFEDMMI@?$AA?$DP?$AA?$DP?$AA?$DP?$AA?$AA@ (0000)
002809A0 0050:
??_C@_0FA@NLFFOHBN@not?5fatal?0?5but?5we?5have?5to?5many?5a@ (0000)
002809F0 000f:
??_C@_0P@JAPJELHA@current?9?$DOvalid?$AA@ (0000)
00280A00 0065:
??_C@_0GF@OLAKLCGH@network_game_client_write?$CI?$CJ?5fail@ (0000)
00280A68 005f:
??_C@_0FP@INNHEEHK@network_game_client_handle_messa@ (0000)
00280AC8 004b:
??_C@_0EL@PNCEEMAP@network_connection_disconnect?$CI?$CJ?5@ (0000)
00280B18 0066:
??_C@_0GG@PLNHOJNK@network_game_client_write?$CI?$CJ?5fail@ (0000)
00280B80 0049:
??_C@_0EJ@ENIOKCKK@network_connection_disconnect?$CI?$CJ?5@ (0000)
00280BD0 004a:
??_C@_0EK@GLADDNKH@network_connection_disconnect?$CI?$CJ?5@ (0000)
00280C20 0045:
??_C@_0EF@IGAGJDLA@failed?5to?5create?5a?5message_clien@ (0000)
00280C68 004a:
??_C@_0EK@PGHLLHE@network_connection_disconnect?$CI?$CJ?5@ (0000)
00280CB4 0032:
??_C@_0DC@NBAMODMB@?$CBnetwork_connection_connected?$CIcl@ (0000)
00280CE8 0015:
??_C@_0BF@IHNDJMJI@leaving?5network?5game?$AA@ (0000)
00280D00 001d:
??_C@_0BN@LOKEMLAG@client?5?$CG?$CG?5client?9?$DOconnection?$AA@ (0000)
00280D20 0049:
??_C@_0EJ@ENDAFHHG@failed?5to?5create?5a?5message_clien@ (0000)
00280D70 0069:
??_C@_0GJ@FAIKKIGI@network_game_client_write?$CI?$CJ?5fail@ (0000)
00280DE0 0047:
??_C@_0EH@PAHGGHIO@failed?5to?5create?5a?5message_clien@ (0000)
00280E28 0047:
??_C@_0EH@NIHALOOC@failed?5to?5create?5a?5message_clien@ (0000)
00280E70 003e:
??_C@_0DO@LCAGMDAF@can?8t?5remove?5players?5from?5a?5game@ (0000)
00280EB0 0033:
??_C@_0DD@MJJEPI@requesting?5a?5player?5removal?5?$CIcon@ (0000)
00280EE4 0039:
??_C@_0DJ@ICFAMCBO@client?8s?5can?5only?5remove?5players@ (0000)
00280F20 002a:
??_C@_0CK@HGKAMGLN@client?5?$CG?$CG?5network_player_is_vali@ (0000)
00280F50 004b:
??_C@_0EL@IAJNHEOO@network?5game?5tried?5to?5delete?5a?5p@ (0000)
00280F9C 003a:
??_C@_0DK@NONHICBE@no?5local?5players?5remain?5in?5the?5g@ (0000)
00280FD8 0027:
??_C@_0CH@HDEKFDCH@?$CFx?5quit?5of?5of?5game?5at?5tick?5?$CFd?5?$CIn@ (0000)
00281000 001f:
??_C@_0BP@BGMFPCP@the?5game?5host?5is?5shutting?5down?$AA@ (0000)
00281020 002b:
??_C@_0CL@FIOOPCIN@failed?5to?5reinitialize?5network?5g@ (0000)
0028104C 002f:
??_C@_0CP@KMAGFDPK@failed?5to?5create?5a?5message_clien@ (0000)
00281080 004f:
??_C@_0EP@PHHJAEIL@network_game_client_write?$CI?$CJ?5fail@ (0000)
002810D0 0040:
??_C@_0EA@BPICBMAG@failed?5to?5create?5a?5message_clien@ (0000)
00281110 0060:
??_C@_0GA@PDNHMAGG@network_game_client_write?$CI?$CJ?5fail@ (0000)
00281170 0028:
??_C@_0CI@BAIHEHNF@sent?5out?5a?5broadcast?5game?5search@ (0000)
00281198 005f:
??_C@_0FP@MCNPILK@network_game_client_process_inco@ (0000)
002811F8 0049:
??_C@_0EJ@CNGHFAJM@network_connection_idle?$CI?$CJ?5failed@ (0000)
00281244 0030:
??_C@_0DA@OHNFENCP@network_game_client_initiate_joi@ (0000)
00281278 0047:
??_C@_0EH@NDJKGODE@network_connection_idle?$CI?$CJ?5failed@ (0000)
002812C0 0045:
??_C@_0EF@EDNLPKBO@client?5connection?5process?5has?5ti@ (0000)
00281308 005d:
??_C@_0FN@FLBCCMKM@network_game_client_process_inco@ (0000)
00281368 003c:
??_C@_0DM@ONBHNBGE@failed?5to?5create?5a?5message_clien@ (0000)
002813A8 0056:
??_C@_0FG@EPCJDBOJ@network_game_client_write?$CI?$CJ?5fail@ (0000)
00281400 005d:
??_C@_0FN@PFNMPIAB@network_game_client_process_inco@ (0000)
00281460 0047:
??_C@_0EH@HNFELKJJ@network_connection_idle?$CI?$CJ?5failed@ (0000)
002814A8 0046:
??_C@_0EG@BKDKHIKF@network_connection_idle?$CI?$CJ?5failed@ (0000)
002814F0 001c:
??_C@_0BM@GGCBKEBE@new2?5idle?5in?5game?5abort?5hit?$AA@ (0000)
0028150C 001b:
??_C@_0BL@IEONCJFK@new?5idle?5in?5game?5abort?5hit?$AA@ (0000)
00281528 005c:
??_C@_0FM@JKCCAGHN@network_game_client_process_inco@ (0000)
00281588 0050:
??_C@_0FA@IKFHHCAC@network?5client?5connection?5has?5be@ (0000)
002815D8 002d:
??_C@_0CN@GOKOEOFK@network?5connection?5went?5down?5?$CIid@ (0000)
00281608 005e:
??_C@_0FO@IANECALJ@network_game_client_process_inco@ (0000)
00281668 0048:
??_C@_0EI@HOIILDIN@network_connection_idle?$CI?$CJ?5failed@ (0000)
002816B0 0049:
??_C@_0EJ@KIFFADMI@network_game_create_client?$CI?$CJ?5fai@ (0000)
002816FC 002e:
??_C@_0CO@LNIBCIDF@?$CBnetwork_game_client_dont_use_di@ (0000)
0028172C 0018:
??_C@_0BI@HFOMKHNG@?$CB?$CCunknown?5client?5state?$CC?$AA@ (0000)
00281744 002b:
??_C@_0CL@EHLJKOCJ@network_game_client_idle_postgam@ (0000)
00281770 0029:
??_C@_0CJ@NNEAELPC@network_game_client_idle_ingame?$CI@ (0000)
0028179C 002a:
??_C@_0CK@IFHOOMMF@network_game_client_idle_pregame@ (0000)
002817C8 002a:
??_C@_0CK@NBDMDINO@network_game_client_idle_joining@ (0000)
002817F4 002c:
??_C@_0CM@IDLHBFKK@network_game_client_idle_searchi@ (0000)
00281820 0024:
??_C@_0CE@DOGOGKDE@unable?5to?5join?5game?3?5reason?$DN?5?$CD?$CFd@ (0000)
00281844 0024:
??_C@_0CE@JOPGMOA@_rejection_code_blacklisted_mach@ (0000)
00281868 001f:
??_C@_0BP@EHGPFGEK@_rejection_code_game_is_closed?$AA@ (0000)
00281888 001d:
??_C@_0BN@IDHMJFHO@_rejection_code_game_is_full?$AA@ (0000)
002818A8 001d:
??_C@_0BN@NIEJJECI@_rejection_code_bad_password?$AA@ (0000)
002818C8 001f:
??_C@_0BP@MGMNOIHD@_rejection_code_bad_join_token?$AA@ (0000)
002818E8 0020:
??_C@_0CA@EEFCENHL@_rejection_code_version_too_new?$AA@ (0000)
00281908 0020:
??_C@_0CA@JCNAFAAD@_rejection_code_version_too_old?$AA@ (0000)
004566D8 0002:
_allow_out_of_sync (0000)
_network_game_client_dont_use_directly_in_use (0001)
*/
/* ---------- headers */
#include "cseries.h"
/* ---------- constants */
enum
{
MAXIMUM_NETWORK_MACHINE_COUNT = 4,
_error_silent = 2
};
/* ---------- macros */
#define network_machine_is_valid(machine) \
((machine) && (machine)->machine_index >= 0 && \
(machine)->machine_index < MAXIMUM_NETWORK_MACHINE_COUNT)
/* ---------- structures */
struct network_machine
{
byte __unknown0[0x40];
char machine_index;
byte __padding41[3];
};
struct network_game
{
byte __unknown0[0x114];
struct network_machine machines[MAXIMUM_NETWORK_MACHINE_COUNT];
byte __unknown224[0x210];
};
struct network_advertised_game
{
byte __unknown0[0x2C];
unsigned long update_time;
byte __unknown30[0xB1];
boolean valid;
};
struct data_array;
struct data_iterator
{
struct data_array *data;
short absolute_index;
short pad;
long datum_index;
unsigned long signature;
};
struct network_game_client
{
unsigned short machine_index;
byte __padding2[2];
byte available_games[0x828];
void *connection;
byte __padding830[4];
unsigned long connection_attempt_time;
byte __padding838[0x24];
struct network_game game;
unsigned long join_in_progress;
byte __paddingC94[4];
unsigned long next_update_number;
unsigned long __unknownC9C;
byte __paddingCA0[4];
short seconds_to_game_start;
short state;
short error;
byte __paddingCAA[2];
boolean out_of_sync;
boolean connection_silent;
};
typedef char network_machine_size_assert[
sizeof(struct network_machine) == 0x44 ? 1 : -1];
typedef char network_game_size_assert[
sizeof(struct network_game) == 0x434 ? 1 : -1];
typedef char network_advertised_game_update_time_offset_assert[
offsetof(struct network_advertised_game, update_time) == 0x2C ? 1 : -1];
typedef char network_advertised_game_valid_offset_assert[
offsetof(struct network_advertised_game, valid) == 0xE1 ? 1 : -1];
typedef char data_iterator_size_assert[
sizeof(struct data_iterator) == 0x10 ? 1 : -1];
typedef char data_iterator_datum_index_offset_assert[
offsetof(struct data_iterator, datum_index) == 8 ? 1 : -1];
typedef char network_game_client_connection_offset_assert[
offsetof(struct network_game_client, connection) == 0x82C ? 1 : -1];
typedef char network_game_client_connection_attempt_time_offset_assert[
offsetof(struct network_game_client, connection_attempt_time) == 0x834 ? 1 : -1];
typedef char network_game_client_game_offset_assert[
offsetof(struct network_game_client, game) == 0x85C ? 1 : -1];
typedef char network_game_client_join_in_progress_offset_assert[
offsetof(struct network_game_client, join_in_progress) == 0xC90 ? 1 : -1];
typedef char network_game_client_next_update_number_offset_assert[
offsetof(struct network_game_client, next_update_number) == 0xC98 ? 1 : -1];
typedef char network_game_client_unknownC9C_offset_assert[
offsetof(struct network_game_client, __unknownC9C) == 0xC9C ? 1 : -1];
typedef char network_game_client_seconds_to_game_start_offset_assert[
offsetof(struct network_game_client, seconds_to_game_start) == 0xCA4 ? 1 : -1];
typedef char network_game_client_error_offset_assert[
offsetof(struct network_game_client, error) == 0xCA8 ? 1 : -1];
typedef char network_game_client_out_of_sync_offset_assert[
offsetof(struct network_game_client, out_of_sync) == 0xCAC ? 1 : -1];
typedef char network_game_client_connection_silent_offset_assert[
offsetof(struct network_game_client, connection_silent) == 0xCAD ? 1 : -1];
/* ---------- prototypes */
boolean network_connection_write(
void *connection,
void *message,
unsigned short message_size,
void *address,
long flags);
void network_connection_keep_alive(
void *connection);
void network_connection_get_address(
void *connection,
void *address,
boolean include_port);
void network_connection_delete(
void *connection);
unsigned long system_milliseconds(
void);
void game_engine_switch_to_postgame(
void);
void network_event(
char *format,
...);
boolean network_game_is_splitscreen_local(
void);
boolean transport_network_available(
void);
void error(
short priority,
const char *format,
...);
void display_error_when_main_menu_loaded(
short error_code);
void network_game_reset_for_next_round(
struct network_game *game,
boolean load_ui);
void network_game_reset_to_pregame_ui(
void);
void network_game_client_all_local_players_have_quit(
void);
short local_player_get_next(
short local_player_index);
void display_error(
short error_code,
short local_player_index,
boolean modal,
boolean pause_game_time);
void data_iterator_new(
struct data_iterator *iterator,
struct data_array *data);
void *data_iterator_next(
struct data_iterator *iterator);
boolean network_game_client_write(
void *connection,
void *message,
unsigned short message_size,
void *address,
long flags);
boolean code_001141c0(
void);
void network_game_client_dispose(
struct network_game_client *client);
void network_game_client_game_out_of_sync(
struct network_game_client *client);
long unstrip_player_index(
long player_index);
short network_game_client_get_state(
struct network_game_client *client,
short *state_data);
boolean network_game_client_set_machine(
struct network_game_client *client,
struct network_machine *machine);
void network_game_client_switch_to_postgame(
struct network_game_client *client);
boolean network_game_client_switch_to_pregame(
struct network_game_client *client);
void network_game_client_countdown_timer_update(
struct network_game_client *client,
short seconds_to_game_start);
boolean network_game_client_advertised_game_is_valid(
struct network_advertised_game *advertised_game);
void network_game_client_game_shutdown(
struct network_game_client *client);
void network_game_client_reset(
struct network_game_client *client,
boolean leave_connection_open);
void network_game_client_rejected_by_game(
struct network_game_client *client,
void *source_address,
unsigned short rejection_code);
struct network_machine *network_game_client_get_machine(
struct network_game_client *client);
short network_game_client_get_machine_index(
struct network_game_client *client);
void *network_game_client_get_available_games(
struct network_game_client *client);
short network_game_client_get_error(
struct network_game_client *client);
short network_game_client_get_seconds_to_game_start(
struct network_game_client *client);
void network_game_client_keep_alive(
struct network_game_client *client);
void *network_game_client_get_connection(
struct network_game_client *client);
void network_game_client_get_remote_server_address(
struct network_game_client *client,
void *address);
struct network_game *network_game_client_get_game(
struct network_game_client *client);
boolean network_game_client_server_has_started_game(
struct network_game_client *client);
long network_game_client_get_next_update_number(
struct network_game_client *client);
boolean network_client_get_oos(
struct network_game_client *client);
/* ---------- globals */
extern struct data_array *player_data;
boolean allow_out_of_sync = FALSE;
boolean network_game_client_dont_use_directly_in_use = FALSE;
/* ---------- public code */
boolean code_001141c0(
void)
{
boolean connected = TRUE;
if (!network_game_is_splitscreen_local())
{
connected = transport_network_available();
if (!connected)
{
error(_error_silent, "network connection went down!");
display_error_when_main_menu_loaded(6);
}
}
return connected;
}
void network_game_client_dispose(
struct network_game_client *client)
{
if (client)
{
if (client->connection)
network_connection_delete(client->connection);
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0xB2,
network_game_client_dont_use_directly_in_use);
network_game_client_dont_use_directly_in_use = FALSE;
}
network_event("network client disposed");
return;
}
void network_game_client_game_out_of_sync(
struct network_game_client *client)
{
short local_player_index;
if (!allow_out_of_sync)
{
network_event("local machine is out of sync with the server");
if (!client->out_of_sync)
{
for (local_player_index = local_player_get_next(NONE);
local_player_index != NONE;
local_player_index = local_player_get_next(local_player_index))
{
display_error(8, local_player_index, TRUE, FALSE);
}
}
client->out_of_sync = TRUE;
}
return;
}
long unstrip_player_index(
long player_index)
{
struct data_iterator iterator;
long result = NONE;
data_iterator_new(&iterator, player_data);
while (data_iterator_next(&iterator))
{
if ((iterator.datum_index & 0xFFFF) == (player_index & 0xFFFF))
{
result = iterator.datum_index;
break;
}
}
return result;
}
short network_game_client_get_state(
struct network_game_client *client,
short *state_data)
{
unsigned long elapsed_time;
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0xF9,
client);
if (state_data)
{
*state_data = 0;
if (client->state == 1)
{
elapsed_time = system_milliseconds() * 100 -
client->connection_attempt_time * 100;
*state_data = (short)(elapsed_time / 120000);
}
}
return client->state;
}
boolean network_game_client_set_machine(
struct network_game_client *client,
struct network_machine *machine)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x1E1,
client && (client->machine_index<MAXIMUM_NETWORK_MACHINE_COUNT) && network_machine_is_valid(machine));
csmemcpy(
&client->game.machines[client->machine_index],
machine,
sizeof(*machine));
return TRUE;
}
void network_game_client_switch_to_postgame(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x48C,
client);
game_engine_switch_to_postgame();
client->state = 4;
network_event("switching to postgame");
return;
}
boolean network_game_client_switch_to_pregame(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x499,
client);
if (client->state != 2)
{
network_game_reset_for_next_round(&client->game, TRUE);
network_connection_keep_alive(client->connection);
client->next_update_number = 0;
client->join_in_progress = TRUE;
client->__unknownC9C = 0;
client->connection_silent = FALSE;
client->state = 2;
client->out_of_sync = FALSE;
network_event("switching to pregame");
network_game_reset_to_pregame_ui();
network_connection_keep_alive(client->connection);
}
return TRUE;
}
void network_game_client_countdown_timer_update(
struct network_game_client *client,
short seconds_to_game_start)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x5C3,
client);
client->seconds_to_game_start = seconds_to_game_start;
return;
}
boolean network_game_client_advertised_game_is_valid(
struct network_advertised_game *advertised_game)
{
boolean valid = TRUE;
if (!advertised_game->valid ||
(long)(system_milliseconds() - advertised_game->update_time) > 6000)
{
valid = FALSE;
}
return valid;
}
void network_game_client_game_shutdown(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x3FC,
client);
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x662,
client);
if (client->error == 0)
client->error = 8;
network_event("the game host is shutting down");
network_game_client_all_local_players_have_quit();
return;
}
struct network_machine *network_game_client_get_machine(
struct network_game_client *client)
{
if (client && client->machine_index < MAXIMUM_NETWORK_MACHINE_COUNT)
return &client->game.machines[client->machine_index];
return NULL;
}
short network_game_client_get_machine_index(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x1FD,
client);
return client->machine_index;
}
void *network_game_client_get_available_games(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x2AC,
client);
return client->available_games;
}
short network_game_client_get_error(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x2B4,
client);
return client->error;
}
short network_game_client_get_seconds_to_game_start(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x2BC,
client);
return client->seconds_to_game_start;
}
void network_game_client_keep_alive(
struct network_game_client *client)
{
network_connection_keep_alive(client->connection);
return;
}
void *network_game_client_get_connection(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x4B3,
client);
return client->connection;
}
void network_game_client_get_remote_server_address(
struct network_game_client *client,
void *address)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x4BC,
client);
network_connection_get_address(client->connection, address, FALSE);
return;
}
struct network_game *network_game_client_get_game(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x4CD,
client);
return &client->game;
}
boolean network_game_client_server_has_started_game(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x4D5,
client);
return client->next_update_number > 0;
}
long network_game_client_get_next_update_number(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x4DD,
client);
return client->next_update_number;
}
boolean network_client_get_oos(
struct network_game_client *client)
{
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x4E5,
client);
return client->out_of_sync;
}
boolean network_game_client_write(
void *connection,
void *message,
unsigned short message_size,
void *address,
long flags)
{
return network_connection_write(
connection,
message,
message_size,
address,
flags);
}
void network_game_client_rejected_by_game(
struct network_game_client *client,
void *source_address,
unsigned short rejection_code)
{
const char *reason = "<unknown>";
match_assert(
"c:\\halo\\SOURCE\\networking\\network_client_manager.c",
0x35A,
client && source_address);
client->state = 0;
switch (rejection_code)
{
case 0:
reason = "_rejection_code_version_too_old";
break;
case 1:
reason = "_rejection_code_version_too_new";
break;
case 2:
reason = "_rejection_code_bad_join_token";
break;
case 3:
reason = "_rejection_code_bad_password";
break;
case 4:
reason = "_rejection_code_game_is_full";
break;
case 5:
reason = "_rejection_code_game_is_closed";
break;
case 6:
reason = "_rejection_code_blacklisted_machine";
break;
}
network_event(
"unable to join game: reason= #%d/%s",
rejection_code,
reason);
network_game_client_reset(client, TRUE);
return;
}
/* ---------- private code */