mirror of
https://github.com/Cesarus85/ringfall-mjolnir-vr.git
synced 2026-10-23 00:00:32 +02:00
346 lines
7.7 KiB
C
346 lines
7.7 KiB
C
/*
|
|
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 */
|