/* NETWORK_GAME_MANAGER.C symbols in this file: 0011A170 0040: _network_game_invalidate_player (0000) 0011A1B0 0090: _network_game_add_machine (0000) 0011A240 0090: _network_game_update_machine (0000) 0011A2D0 0070: _xbox_set_machine_name (0000) 0011A340 0090: _network_game_generate_local_machine_name (0000) 0011A3D0 0040: _network_game_end_and_load_ui (0000) 0011A410 00b0: _network_game_reset_for_next_round (0000) 0011A4C0 0010: _code_0011a4c0 (0000) 0011A4D0 0030: _network_player_is_valid (0000) 0011A500 00b0: _network_game_invalidate_machine (0000) 0011A5B0 01a0: _network_game_add_player (0000) 0011A750 0140: _code_0011a750 (0000) 0011A890 0080: _network_game_spawn_player (0000) 0011A910 0090: _network_game_player_is_valid (0000) 0011A9A0 00a0: _network_game_invalidate (0000) 0011AA40 00a0: _network_game_update_player (0000) 0011AAE0 00c0: _network_game_remove_player (0000) 0011ABA0 01b0: _network_game_create_game_objects (0000) 0011AD50 00e0: _network_game_remove_machine (0000) 00283DA4 0031: ??_C@_0DB@DPKLAPFE@c?3?2halo?2SOURCE?2networking?2networ@ (0000) 00283DD8 0035: ??_C@_0DF@FMJAGNKK@game?5?$CG?$CG?5machine?5?$CG?$CG?5network_machi@ (0000) 00283E10 0043: ??_C@_0ED@LDCLPLHI@?8?$CFs?8?5is?5not?5a?5valid?5machine?5name@ (0000) 00283E54 0016: ??_C@_0BG@OIMNPPEI@XSetNickname?$CI?$CJ?5failed?$AA@ (0000) 00283E6C 002d: ??_C@_0CN@JCIPKPMA@XSetNickname?$CI?$CJ?5failed?5to?5set?5sys@ (0000) 00283E9C 001c: ??_C@_0BM@GOCBNICP@system?5nickname?5set?5to?5?8?$CFs?8?$AA@ (0000) 00283EB8 0036: ??_C@_0DG@KPIAMNFF@game?5?$CG?$CG?5?$CImachine_index?$DMMAXIMUM_N@ (0000) 00283EF0 0039: ??_C@_0DJ@PKEDFKIN@game?5is?5already?5at?5maximum?5playe@ (0000) 00283F2C 000f: ??_C@_0P@KHIDKAOH@game?5?$CG?$CG?5player?$AA@ (0000) 00283F40 004b: ??_C@_0EL@LDBNCIG@multiple?5players?5on?5the?5same?5mac@ (0000) 00283F8C 000f: ??_C@_0P@NHMFPDJJ@player?5?$CG?$CG?5game?$AA@ (0000) 00283F9C 002c: ??_C@_0CM@KIIMJJBI@tried?5to?5update?5a?5player?5with?5in@ (0000) 00283FC8 002c: ??_C@_0CM@NFHLBLAN@tried?5to?5remove?5a?5player?5with?5in@ (0000) 00283FF4 0017: ??_C@_0BH@GFBBGLI@?$CB?$CCbad?5game?5connection?$CC?$AA@ (0000) 0028400C 0024: ??_C@_0CE@GKPEJODL@failed?5to?5remove?5a?5machine?8s?5pla@ (0000) 00284030 0010: ??_C@_0BA@OPIINEDG@game?5?$CG?$CG?5machine?$AA@ (0000) */ /* ---------- headers */ #include "cseries/cseries.h" #include "game/game.h" #include "game/players.h" #include "main/main.h" #include "network_game_globals.h" #include "network_game_manager.h" #include "text/unicode.h" /* ---------- constants */ /* ---------- macros */ #define network_machine_is_valid(machine) \ ((machine) && (machine)->machine_index >= 0 && (machine)->machine_index < 4) /* ---------- structures */ struct network_machine { byte __unknown0[0x40]; char machine_index; byte __padding41[3]; }; struct network_game { byte __unknown0[0x10D]; byte game_mode; byte maximum_player_count; byte __padding10F; short difficulty; short machine_count; struct network_machine machines[4]; short player_count; struct network_player players[16]; byte __unknown426[0xA]; boolean load_ui; byte __padding431[3]; }; /* ---------- prototypes */ void main_load_ui_scenario( boolean load_ui); long __stdcall XFindFirstNicknameW( long this_title_only, wchar_t *nickname, unsigned long size); long __stdcall XFindClose( long handle); long __stdcall XSetNicknameW( wchar_t const *nickname, long preserve_case); wchar_t const *network_game_get_random_player_name( void); boolean network_game_player_is_local( struct network_player const *player); long player_new( long machine_index, long unit_index, short controller_index, struct network_player const *player); /* ---------- globals */ /* ---------- public code */ boolean network_game_update_machine( struct network_game *game, struct network_machine *machine) { long machine_index; boolean result = FALSE; match_assert( "c:\\halo\\SOURCE\\networking\\network_game_manager.c", 0x81, game && machine && network_machine_is_valid(machine)); for (machine_index = 0; machine_index < 4; machine_index++) { if (game->machines[machine_index].machine_index == machine->machine_index) { csmemcpy(&game->machines[machine_index], machine, sizeof(*machine)); result = TRUE; break; } } return result; } void xbox_set_machine_name( char const *machine_name) { wchar_t wide_machine_name[32]; if (machine_name && machine_name[0]) { if (ascii_to_wide(machine_name, wide_machine_name, sizeof(wide_machine_name))) { wide_machine_name[31] = 0; if (!XSetNicknameW(wide_machine_name, TRUE)) error(2, "XSetNickname() failed"); } else { error(2, "'%s' is not a valid machine name (max. name length= %d characters)", wide_machine_name, 31); } } return; } void network_game_generate_local_machine_name( wchar_t *machine_name) { char ascii_machine_name[32]; long find_handle = XFindFirstNicknameW(FALSE, machine_name, 32); if (find_handle == NONE) { ustrncpy(machine_name, network_game_get_random_player_name(), 32); machine_name[31] = 0; if (XSetNicknameW(machine_name, TRUE)) error(2, "system nickname set to '%s'", wide_to_ascii(machine_name, ascii_machine_name, 32)); else error(2, "XSetNickname() failed to set system nickname"); } else { XFindClose(find_handle); } machine_name[31] = 0; return; } void network_game_invalidate_player( struct network_player *player) { match_assert( "c:\\halo\\SOURCE\\networking\\network_game_manager.c", 0x58, player); player->machine_index = NONE; player->controller_index = NONE; player->team_index = NONE; player->player_list_index = NONE; player->name[0] = 0; return; } void network_game_end_and_load_ui( struct network_game *game) { if (game->load_ui) main_load_ui_scenario(TRUE); csmemset(&game->load_ui, 0, sizeof(long)); return; } void code_0011a4c0( void) { return; } boolean network_player_is_valid( struct network_player *player) { if (player && player->controller_index >= 0 && player->controller_index < MAXIMUM_LOCAL_PLAYERS && player->machine_index >= 0 && player->machine_index < MAXIMUM_LOCAL_PLAYERS) { return TRUE; } return FALSE; } boolean network_game_spawn_player( struct network_player *player) { long player_index; short controller_index; match_assert( "c:\\halo\\SOURCE\\networking\\network_game_manager.c", 0x1BC, network_player_is_valid(player)); controller_index = network_game_player_is_local(player) ? player->controller_index : NONE; player_index = player_new(player->machine_index, NONE, controller_index, player); if (player_index != NONE) { player->player_list_index = (char)player_index; return TRUE; } return FALSE; } boolean network_game_player_is_valid( struct network_player *player, struct network_game *game) { long player_index; struct network_player *current_player; boolean result = FALSE; match_assert( "c:\\halo\\SOURCE\\networking\\network_game_manager.c", 0x247, player && game); if (network_player_is_valid(player)) { current_player = &game->players[0]; for (player_index = 0; player_index < 16; player_index++, current_player++) { if (current_player->machine_index == player->machine_index && current_player->controller_index == player->controller_index) { result = TRUE; break; } } } return result; } void network_game_reset_for_next_round( struct network_game *game, boolean load_ui) { match_assert( "c:\\halo\\SOURCE\\networking\\network_game_manager.c", 0x22D, game); if (load_ui && game->load_ui) { main_load_ui_scenario(TRUE); csmemset(&game->load_ui, 0, sizeof(long)); if (global_network_game_server_get()) game_connection_set(2); else if (global_network_game_client_get()) game_connection_set(1); } else { csmemset(&game->load_ui, 0, sizeof(long)); } game_time_end(); return; } /* ---------- private code */