#include "netgame.h"
#include "brender/brender.h"
#include "car.h"
#include "displays.h"
#include "errors.h"
#include "globvars.h"
#include "globvrpb.h"
#include "grafdata.h"
#include "graphics.h"
#include "harness/trace.h"
#include "loading.h"
#include "network.h"
#include "newgame.h"
#include "opponent.h"
#include "pd/sys.h"
#include "pedestrn.h"
#include "powerup.h"
#include "racestrt.h"
#include "structur.h"
#include "utility.h"
#include <stdlib.h>
#include <string.h>
int gPowerup_cost[4] = { 1500, 2500, 4000, 6000 };
int gGame_scores[6];
int gPed_target;
int gNot_shown_race_type_headup;
tU32 gLast_it_change;
tU32 gTime_for_punishment;
tNet_game_player_info* gLast_lepper;
int gInitialised_grid;
int gIt_or_fox;
// IDA: void __usercall SendCarData(tU32 pNext_frame_time@<EAX>)
void SendCarData(tU32 pNext_frame_time) {
//tNet_contents* contents; // Pierre-Marie Baty -- unused variable
//tCar_spec* car; // Pierre-Marie Baty -- unused variable
//tCollision_info* ncar; // Pierre-Marie Baty -- unused variable
//int i; // Pierre-Marie Baty -- unused variable
//int j; // Pierre-Marie Baty -- unused variable
//static tU32 last_time; // Pierre-Marie Baty -- unused variable
//tU32 time; // Pierre-Marie Baty -- unused variable
//int damaged_wheels; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d)", pNext_frame_time);
if (gNet_mode) {
TELL_ME_IF_WE_PASS_THIS_WAY();
}
}
// IDA: void __usercall ReceivedRecover(tNet_contents *pContents@<EAX>)
void ReceivedRecover(tNet_contents* pContents) {
//int i; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pContents);
NOT_IMPLEMENTED();
}
// IDA: void __usercall CopyMechanics(tCar_spec *pCar@<EAX>, tNet_contents *pContents@<EDX>)
void CopyMechanics(tCar_spec* pCar, tNet_contents* pContents) {
//int j; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p)", pCar, pContents);
NOT_IMPLEMENTED();
}
// IDA: void __usercall ReceivedMechanics(tNet_contents *pContents@<EAX>)
void ReceivedMechanics(tNet_contents* pContents) {
//int i; // Pierre-Marie Baty -- unused variable
//tCar_spec* car; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pContents);
NOT_IMPLEMENTED();
}
// IDA: void __usercall ReceivedCopInfo(tNet_contents *pContents@<EAX>)
void ReceivedCopInfo(tNet_contents* pContents) {
//tCar_spec* c; // Pierre-Marie Baty -- unused variable
//int i; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pContents);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl SendAllNonCarPositions()
void SendAllNonCarPositions(void) {
int i;
br_actor** list;
tNon_car_spec* non_car;
tNet_contents* contents;
LOG_TRACE("()");
list = gProgram_state.track_spec.non_car_list;
for (i = 0; i < gProgram_state.track_spec.ampersand_digits; ++i) {
if (list[i]->type_data != NULL) {
non_car = (tNon_car_spec*)list[i]->type_data;
if (non_car->collision_info.driver == eDriver_non_car_unused_slot || non_car->collision_info.car_ID != i) {
contents = NetGetBroadcastContents(NETMSGID_NONCARPOSITION, 0);
BrMatrix34Copy(&contents->data.non_car_position.mat, &list[i]->t.t.mat);
contents->data.non_car_position.ID = i;
contents->data.non_car_position.flags = list[i]->identifier[3] == '!';
}
}
}
NetSendMessageStacks();
}
// IDA: void __usercall ReceivedNonCarPosition(tNet_contents *pContents@<EAX>)
void ReceivedNonCarPosition(tNet_contents* pContents) {
//br_actor* actor; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pContents);
NOT_IMPLEMENTED();
}
// IDA: void __usercall ReceivedNonCar(tNet_contents *pContents@<EAX>)
void ReceivedNonCar(tNet_contents* pContents) {
//br_actor* actor; // Pierre-Marie Baty -- unused variable
//br_vector3 tv; // Pierre-Marie Baty -- unused variable
//tU8 cx; // Pierre-Marie Baty -- unused variable
//tU8 cz; // Pierre-Marie Baty -- unused variable
//tTrack_spec* track_spec; // Pierre-Marie Baty -- unused variable
//tNon_car_spec* ncar; // Pierre-Marie Baty -- unused variable
//tCollision_info* c; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pContents);
NOT_IMPLEMENTED();
}
// IDA: void __usercall SignalToStartRace2(int pIndex@<EAX>)
void SignalToStartRace2(int pIndex) {
tNet_message* the_message;
int i;
int j;
LOG_TRACE("(%d)", pIndex);
if (gCurrent_race.number_of_racers > 6) {
FadePaletteUp();
dr_dprintf("AAAARRRGGGHHH!!!! More than 6 racers!!!!");
PDFatalError("AAAARRRGGGHHH!!!! More than 6 racers!!!!");
}
gNeed_to_send_start_race = 0;
gStart_race_sent = 1;
the_message = NetBuildMessage(NETMSGID_STARTRACE, 0);
the_message->contents.data.start_race.racing = gProgram_state.racing;
if (pIndex >= 0) {
gNet_players[pIndex].last_waste_message = 0;
gNet_players[pIndex].wasteage_attributed = 0;
the_message->contents.data.start_race.car_count = -1;
the_message->contents.data.start_race.car_list[0].index = pIndex;
BrMatrix34Copy(&the_message->contents.data.start_race.car_list[0].mat,
&gCurrent_race.opponent_list[gNet_players[pIndex].opponent_list_index].car_spec->car_master_actor->t.t.mat);
} else {
the_message->contents.data.start_race.car_count = gCurrent_race.number_of_racers;
for (i = 0; i < gCurrent_race.number_of_racers; i++) {
BrMatrix34Copy(&the_message->contents.data.start_race.car_list[i].mat,
&gCurrent_race.opponent_list[i].car_spec->car_master_actor->t.t.mat);
for (j = 0; j < gNumber_of_net_players; j++) {
if (gCurrent_race.opponent_list[i].car_spec == gNet_players[j].car) {
the_message->contents.data.start_race.car_list[i].index = j;
break;
}
}
if (gCurrent_net_game->options.random_car_choice && (gCurrent_net_game->options.car_choice == eNet_car_all || gCurrent_net_game->options.car_choice == eNet_car_both)) {
if (gNet_players[the_message->contents.data.start_race.car_list[i].index].next_car_index < 0) {
gNet_players[the_message->contents.data.start_race.car_list[i].index].next_car_index = PickARandomCar();
gCar_details[gNet_players[the_message->contents.data.start_race.car_list[i].index].next_car_index].ownership = eCar_owner_someone;
}
the_message->contents.data.start_race.car_list[i].next_car_index = gNet_players[the_message->contents.data.start_race.car_list[i].index].next_car_index;
}
}
if (gPending_race < 0) {
gPending_race = PickNetRace(gProgram_state.current_race_index,
gCurrent_net_game->options.race_sequence_type);
}
the_message->contents.data.start_race.next_race = gPending_race;
}
NetGuaranteedSendMessageToAllPlayers(gCurrent_net_game, the_message, NULL);
if (gProgram_state.racing) {
SendCurrentPowerups();
}
}
// IDA: void __cdecl SignalToStartRace()
void SignalToStartRace(void) {
LOG_TRACE("()");
gCurrent_net_game->no_races_yet = 0;
SignalToStartRace2(-1);
}
// IDA: void __cdecl SetUpNetCarPositions()
void SetUpNetCarPositions(void) {
int i;
//int j; // Pierre-Marie Baty -- unused variable
int k;
int grid_index;
int racer_count;
LOG_TRACE("()");
DisableNetService();
if (!gInitialised_grid) {
for (i = 0; i < gNumber_of_net_players; i++) {
gNet_players[i].grid_position_set = 0;
gNet_players[i].last_waste_message = 0;
gNet_players[i].wasteage_attributed = 0;
}
}
for (i = 0; i < gNumber_of_net_players; i++) {
gCurrent_race.opponent_list[i].index = -1;
gCurrent_race.opponent_list[i].ranking = IRandomBetween(0, 99);
gCurrent_race.opponent_list[i].car_spec = gNet_players[i].car;
gCurrent_race.opponent_list[i].net_player_index = i;
gNet_players[i].opponent_list_index = i;
}
if (!gInitialised_grid && gCurrent_net_game->options.grid_start) {
qsort(gCurrent_race.
opponent_list, gNumber_of_net_players
, sizeof(tOpp_spec
), SortGridFunction
);
}
gCurrent_race.number_of_racers = 0;
for (i = 0; i < gNumber_of_net_players; i++) {
gNet_players[gCurrent_race.opponent_list[i].net_player_index].opponent_list_index = i;
}
for (i = 0; i < gNumber_of_net_players; i++) {
if ((gCurrent_race.opponent_list[i].car_spec->driver == eDriver_oppo && !gInitialised_grid)
|| (gCurrent_race.opponent_list[i].car_spec->driver >= eDriver_net_human && !gNet_players[gCurrent_race.opponent_list[i].net_player_index].grid_position_set)) {
grid_index = -1;
racer_count = 0;
while (racer_count < 6 && grid_index < 0) {
grid_index = racer_count;
for (k = 0; k < gNumber_of_net_players; k++) {
if (k != i
&& gNet_players[gCurrent_race.opponent_list[k].net_player_index].grid_position_set
&& gNet_players[gCurrent_race.opponent_list[k].net_player_index].grid_index == racer_count) {
grid_index = -1;
break;
}
}
racer_count++;
}
if (grid_index < 0) {
FatalError(kFatalError_NetworkCodeSelfCheck);
}
SetInitialPosition(&gCurrent_race, i, grid_index);
gNet_players[gCurrent_race.opponent_list[i].net_player_index].grid_index = grid_index;
if (gInitialised_grid) {
InitialiseCar2(gCurrent_race.opponent_list[i].car_spec, 0);
} else {
gCurrent_race.number_of_racers = i + 1;
}
gNet_players[gCurrent_race.opponent_list[i].net_player_index].grid_position_set = 1;
}
}
gCurrent_race.number_of_racers = gNumber_of_net_players;
gInitialised_grid = 1;
ReenableNetService();
}
// IDA: void __usercall ReinitialiseCar(tCar_spec *pCar@<EAX>)
void ReinitialiseCar(tCar_spec* pCar) {
//int i; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pCar);
NOT_IMPLEMENTED();
}
// IDA: void __usercall RepositionPlayer(int pIndex@<EAX>)
void RepositionPlayer(int pIndex) {
//tNet_message* the_message; // Pierre-Marie Baty -- unused variable
//tCar_spec* car; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d)", pIndex);
NOT_IMPLEMENTED();
}
// IDA: void __usercall DisableCar(tCar_spec *pCar@<EAX>)
void DisableCar(tCar_spec* pCar) {
LOG_TRACE("(%p)", pCar);
if (pCar->driver_name[0] != '\0') {
if (!pCar->disabled) {
pCar->disabled = 1;
ForceRebuildActiveCarList();
}
if (pCar->car_master_actor->t.t.mat.m[3][0] < 500.0f) {
pCar->car_master_actor->t.t.mat.m[3][0] = pCar->car_master_actor->t.t.mat.m[3][0] + 1000.0f;
pCar->car_master_actor->t.t.mat.m[3][1] = pCar->car_master_actor->t.t.mat.m[3][1] + 1000.0f;
pCar->car_master_actor->t.t.mat.m[3][2] = pCar->car_master_actor->t.t.mat.m[3][2] + 1000.0f;
pCar->old_frame_mat.m[3][0] = pCar->car_master_actor->t.t.mat.m[3][0];
pCar->old_frame_mat.m[3][1] = pCar->car_master_actor->t.t.mat.m[3][1];
pCar->old_frame_mat.m[3][2] = pCar->car_master_actor->t.t.mat.m[3][2];
}
}
}
// IDA: void __usercall EnableCar(tCar_spec *pCar@<EAX>)
void EnableCar(tCar_spec* pCar) {
LOG_TRACE("(%p)", pCar);
if (pCar->driver_name[0] != '\0') {
if (pCar->disabled) {
pCar->disabled = 0;
ForceRebuildActiveCarList();
}
if (pCar->car_master_actor->t.t.mat.m[3][0] > 500.0f) {
pCar->car_master_actor->t.t.mat.m[3][0] = pCar->car_master_actor->t.t.mat.m[3][0] - 1000.0f;
pCar->car_master_actor->t.t.mat.m[3][1] = pCar->car_master_actor->t.t.mat.m[3][1] - 1000.0f;
pCar->car_master_actor->t.t.mat.m[3][2] = pCar->car_master_actor->t.t.mat.m[3][2] - 1000.0f;
pCar->old_frame_mat.m[3][0] = pCar->car_master_actor->t.t.mat.m[3][0];
pCar->old_frame_mat.m[3][1] = pCar->car_master_actor->t.t.mat.m[3][1];
pCar->old_frame_mat.m[3][2] = pCar->car_master_actor->t.t.mat.m[3][2];
}
}
}
// IDA: void __usercall DoNetworkHeadups(int pCredits@<EAX>)
void DoNetworkHeadups(int pCredits) {
char s[256];
char s2[256];
static tU32 last_flash;
static int flash_state;
LOG_TRACE("(%d)", pCredits);
if (gNot_shown_race_type_headup) {
gNot_shown_race_type_headup = 0;
NewTextHeadupSlot(4, 0, 2000, -4, GetMiscString(kMiscString_NetworkGameTypeNames_START + gCurrent_net_game->type));
}
if (gTime_for_punishment && gTime_for_punishment <= (tU32) PDGetTotalTime()) { // Pierre-Marie Baty -- added type cast
gTime_for_punishment = 0;
switch (gCurrent_net_game->type) {
case eNet_game_type_carnage:
NewTextHeadupSlot(4, 0, 2000, -4, GetMiscString(kMiscString_THAT_HALVED_YOUR_KILL_COUNT));
break;
case eNet_game_type_checkpoint:
NewTextHeadupSlot(4, 0, 2000, -4, GetMiscString(kMiscString_THAT_LOST_YOU_A_CHECKPOINT));
break;
case eNet_game_type_sudden_death:
NewTextHeadupSlot(4, 0, 2000, -4, GetMiscString(kMiscString_BACK_TO_THE_START));
break;
case eNet_game_type_foxy:
NewTextHeadupSlot(4, 0, 2000, -4, GetMiscString(kMiscString_THAT_HALVED_YOUR_TIME));
break;
default:
break;
}
}
if (gNet_mode == eNet_mode_none || gNet_recovery_cost[gCurrent_net_game->type] <= gProgram_state.credits_earned - gProgram_state.credits_lost || Flash(200, &last_flash, &flash_state)) {
sprintf(s
, "\xf8%d\xfa %s", pCredits
, GetMiscString
(kMiscString_CREDITS
));
ChangeHeadupText(gNet_cash_headup, s);
} else {
ChangeHeadupText(gNet_cash_headup, "");
}
switch (gCurrent_net_game->type) {
case eNet_game_type_carnage:
sprintf(s
, "%s \xf8%d\xfa", GetMiscString
(kMiscString_TARGET_180
), gPed_target
);
break;
case eNet_game_type_car_crusher:
sprintf(s
, "%s \xf8%d\xfa", GetMiscString
(kMiscString_TARGET_181
), gCurrent_net_game
->options.
race_end_target);
break;
case eNet_game_type_foxy:
TimerString(gCurrent_net_game->options.race_end_target, s2, 1, 1);
sprintf(s
, "%s \xf8%s\xfa", GetMiscString
(kMiscString_TARGET_182
), s2
);
break;
case eNet_game_type_tag:
TimerString(gCurrent_net_game->options.race_end_target, s2, 1, 1);
sprintf(s
, "%s \xf8%s\xfa", GetMiscString
(kMiscString_LIMIT
), s2
);
break;
default:
s[0] = '\0';
break;
}
ChangeHeadupText(gNet_ped_headup, s);
}
// IDA: int __usercall SortNetHeadAscending@<EAX>(void *pFirst_one@<EAX>, void *pSecond_one@<EDX>)
int SortNetHeadAscending(void* pFirst_one, void* pSecond_one) {
LOG_TRACE("(%p, %p)", pFirst_one, pSecond_one);
NOT_IMPLEMENTED();
}
// IDA: int __usercall SortNetHeadDescending@<EAX>(void *pFirst_one@<EAX>, void *pSecond_one@<EDX>)
int SortNetHeadDescending(void* pFirst_one, void* pSecond_one) {
LOG_TRACE("(%p, %p)", pFirst_one, pSecond_one);
NOT_IMPLEMENTED();
}
// IDA: void __usercall ClipName(char *pName@<EAX>, tDR_font *pFont@<EDX>, int pMax_width@<EBX>)
void ClipName(char* pName, tDR_font* pFont, int pMax_width) {
LOG_TRACE("(\"%s\", %p, %d)", pName, pFont, pMax_width);
NOT_IMPLEMENTED();
}
// IDA: void __usercall DoNetScores2(int pOnly_sort_scores@<EAX>)
void DoNetScores2(int pOnly_sort_scores) {
//int i; // Pierre-Marie Baty -- unused variable
//int j; // Pierre-Marie Baty -- unused variable
//int score; // Pierre-Marie Baty -- unused variable
//int flags; // Pierre-Marie Baty -- unused variable
//int index; // Pierre-Marie Baty -- unused variable
//int right_edge; // Pierre-Marie Baty -- unused variable
//int x; // Pierre-Marie Baty -- unused variable
//int len; // Pierre-Marie Baty -- unused variable
//int ascending_order; // Pierre-Marie Baty -- unused variable
//char s[256]; // Pierre-Marie Baty -- unused variable
//static tU32 last_flash; // Pierre-Marie Baty -- unused variable
//static int flash_state; // Pierre-Marie Baty -- unused variable
//tHeadup_pair headup_pairs[6]; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d)", pOnly_sort_scores);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl DoNetScores()
void DoNetScores(void) {
LOG_TRACE("()");
NOT_IMPLEMENTED();
}
// IDA: void __cdecl InitNetHeadups()
void InitNetHeadups(void) {
LOG_TRACE("()");
gIcons_pix = LoadPixelmap("CARICONS.PIX");
if (gIcons_pix != NULL) {
BrMapAdd(gIcons_pix);
}
gDigits_pix = LoadPixelmap("HDIGITS.PIX");
if (gDigits_pix != NULL) {
BrMapAdd(gDigits_pix);
}
/* The Windows version does not use gIcons_pix_low_res. */
if (gGraf_data_index != 0) {
SwitchToLoresMode();
gIcons_pix_low_res = LoadPixelmap("CARICONS.PIX");
SwitchToRealResolution();
} else {
gIcons_pix_low_res = gIcons_pix;
}
}
// IDA: void __cdecl DisposeNetHeadups()
void DisposeNetHeadups(void) {
LOG_TRACE("()");
/* Windows version does not use gIcons_pix_low_res. */
if (gIcons_pix_low_res != NULL && gIcons_pix_low_res != gIcons_pix) {
BrPixelmapFree(gIcons_pix_low_res);
}
if (gIcons_pix != NULL) {
BrMapRemove(gIcons_pix);
BrPixelmapFree(gIcons_pix);
}
if (gDigits_pix != NULL) {
BrMapRemove(gDigits_pix);
BrPixelmapFree(gDigits_pix);
}
}
// IDA: void __cdecl EverybodysLost()
void EverybodysLost(void) {
//tNet_message* the_message; // Pierre-Marie Baty -- unused variable
//int i; // Pierre-Marie Baty -- unused variable
LOG_TRACE("()");
NOT_IMPLEMENTED();
}
// IDA: void __usercall DeclareWinner(int pWinner_index@<EAX>)
void DeclareWinner(int pWinner_index) {
//tNet_message* the_message; // Pierre-Marie Baty -- unused variable
//int i; // Pierre-Marie Baty -- unused variable
//int j; // Pierre-Marie Baty -- unused variable
//int best_score_index; // Pierre-Marie Baty -- unused variable
//char s[256]; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d)", pWinner_index);
NOT_IMPLEMENTED();
}
// IDA: void __usercall PlayerIsIt(tNet_game_player_info *pPlayer@<EAX>)
void PlayerIsIt(tNet_game_player_info* pPlayer) {
//int i; // Pierre-Marie Baty -- unused variable
//char s[256]; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pPlayer);
NOT_IMPLEMENTED();
}
// IDA: int __usercall FarEnoughAway@<EAX>(tNet_game_player_info *pPlayer_1@<EAX>, tNet_game_player_info *pPlayer_2@<EDX>)
int FarEnoughAway(tNet_game_player_info* pPlayer_1, tNet_game_player_info* pPlayer_2) {
//br_vector3 difference; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p)", pPlayer_1, pPlayer_2);
NOT_IMPLEMENTED();
}
// IDA: void __usercall CarInContactWithItOrFox(tNet_game_player_info *pPlayer@<EAX>)
void CarInContactWithItOrFox(tNet_game_player_info* pPlayer) {
LOG_TRACE("(%p)", pPlayer);
NOT_IMPLEMENTED();
}
// IDA: void __usercall SelectRandomItOrFox(int pNot_this_one@<EAX>)
void SelectRandomItOrFox(int pNot_this_one) {
//int i; // Pierre-Marie Baty -- unused variable
//int new_choice; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d)", pNot_this_one);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl CalcPlayerScores()
void CalcPlayerScores(void) {
//int i; // Pierre-Marie Baty -- unused variable
//int j; // Pierre-Marie Baty -- unused variable
//int knock_out_bit; // Pierre-Marie Baty -- unused variable
//int e_dam; // Pierre-Marie Baty -- unused variable
//int t_dam; // Pierre-Marie Baty -- unused variable
//int d_dam; // Pierre-Marie Baty -- unused variable
//int w_dam; // Pierre-Marie Baty -- unused variable
//int cars_left; // Pierre-Marie Baty -- unused variable
//int car_left; // Pierre-Marie Baty -- unused variable
//int flags; // Pierre-Marie Baty -- unused variable
//int score; // Pierre-Marie Baty -- unused variable
//int highest; // Pierre-Marie Baty -- unused variable
//int next_highest; // Pierre-Marie Baty -- unused variable
//int lowest_score; // Pierre-Marie Baty -- unused variable
//int player_left; // Pierre-Marie Baty -- unused variable
//int new_choice; // Pierre-Marie Baty -- unused variable
//tCar_spec* car; // Pierre-Marie Baty -- unused variable
//tNet_message* message; // Pierre-Marie Baty -- unused variable
//tS32 time; // Pierre-Marie Baty -- unused variable
//char s[256]; // Pierre-Marie Baty -- unused variable
//tNet_game_player_info* lowest_score_player; // Pierre-Marie Baty -- unused variable
LOG_TRACE("()");
NOT_IMPLEMENTED();
}
// IDA: void __cdecl SendPlayerScores()
void SendPlayerScores(void) {
tNet_contents* the_contents;
int i;
LOG_TRACE("()");
the_contents = NetGetBroadcastContents(NETMSGID_SCORES, 0);
if (gCurrent_net_game->type == eNet_game_type_carnage) {
the_contents->data.scores.general_score = gPed_target;
} else if (gCurrent_net_game->type == eNet_game_type_tag || gCurrent_net_game->type == eNet_game_type_foxy) {
the_contents->data.scores.general_score = gNet_players[gIt_or_fox].ID;
}
for (i = 0; i < gNumber_of_net_players; i++) {
the_contents->data.scores.scores[i] = gNet_players[i].score;
}
}
// IDA: void __cdecl DoNetGameManagement()
void DoNetGameManagement(void) {
LOG_TRACE("()");
if (gNet_mode == eNet_mode_host) {
CalcPlayerScores();
SendPlayerScores();
}
}
// IDA: void __usercall InitialisePlayerScore(tNet_game_player_info *pPlayer@<EAX>)
void InitialisePlayerScore(tNet_game_player_info* pPlayer) {
LOG_TRACE("(%p)", pPlayer);
PossibleService();
switch (gCurrent_net_game->type) {
case eNet_game_type_fight_to_death:
pPlayer->score = 100;
break;
case eNet_game_type_car_crusher:
case eNet_game_type_carnage:
pPlayer->score = 0;
break;
case eNet_game_type_checkpoint:
pPlayer->score = 0xffff;
break;
case eNet_game_type_sudden_death:
pPlayer->score = 0;
break;
case eNet_game_type_tag:
pPlayer->score = 0;
break;
case eNet_game_type_foxy:
pPlayer->score = 0;
break;
default:
TELL_ME_IF_WE_PASS_THIS_WAY();
}
pPlayer->credits = gInitial_net_credits[gCurrent_net_game->options.starting_money_index];
pPlayer->wasted = 0;
pPlayer->reposition_time = 0;
}
// IDA: void __cdecl InitPlayers()
void InitPlayers(void) {
int i;
LOG_TRACE("()");
for (i = 0; i < gNumber_of_net_players; i++) {
InitialisePlayerScore(&gNet_players[i]);
}
if (gNet_mode == eNet_mode_host) {
gLast_it_change = 0;
gLast_lepper = NULL;
}
gTime_for_punishment = 0;
gNot_shown_race_type_headup = 1;
gIt_or_fox = -1;
}
// IDA: void __usercall BuyPSPowerup(int pIndex@<EAX>)
void BuyPSPowerup(int pIndex) {
char s[256];
char s2[256];
LOG_TRACE("(%d)", pIndex);
if (gNet_mode == eNet_mode_none) {
NewTextHeadupSlot(4, 0, 3000, -4, GetMiscString(kMiscString_ONLY_AVAILABLE_IN_NET_GAMES));
} else if (gProgram_state.current_car.power_up_levels[pIndex] < 4) {
if (gNet_mode == eNet_mode_none || gPowerup_cost[gProgram_state.current_car.power_up_levels[pIndex]] <= (gProgram_state.credits_earned - gProgram_state.credits_lost)) {
SpendCredits(gPowerup_cost[gProgram_state.current_car.power_up_levels[pIndex]]);
ImprovePSPowerup(&gProgram_state.current_car, pIndex);
} else {
strcpy(s
, GetMiscString
(kMiscString_CANNOT_AFFORD_IT
));
sprintf(s2
, "%d", gPowerup_cost
[gProgram_state.
current_car.
power_up_levels[pIndex
]]);
SubsStringJob(s, s2);
NewTextHeadupSlot(4, 0, 3008, -4, s);
}
} else {
NewTextHeadupSlot(4, 0, 3000, -4, GetMiscString(kMiscString_YOU_ARE_ALREADY_AT_MAX));
}
}
// IDA: void __cdecl BuyArmour()
void BuyArmour(void) {
LOG_TRACE("()");
BuyPSPowerup(0);
}
// IDA: void __cdecl BuyPower()
void BuyPower(void) {
LOG_TRACE("()");
if (gNet_mode != eNet_mode_none && gCurrent_net_game->type == eNet_game_type_foxy && gThis_net_player_index == gIt_or_fox) {
NewTextHeadupSlot(4, 0, 1000, -4, GetMiscString(kMiscString_THE_FOX_CANNOT_DO_THAT));
} else if (gNet_mode != eNet_mode_none && gCurrent_net_game->type == eNet_game_type_tag && gThis_net_player_index != gIt_or_fox) {
NewTextHeadupSlot(4, 0, 1000, -4, GetMiscString(kMiscString_ONLY_IT_CAN_DO_THAT));
} else {
BuyPSPowerup(1);
}
}
// IDA: void __cdecl BuyOffense()
void BuyOffense(void) {
LOG_TRACE("()");
BuyPSPowerup(2);
}
// IDA: void __usercall UseGeneralScore(int pScore@<EAX>)
void UseGeneralScore(int pScore) {
//int i; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d)", pScore);
NOT_IMPLEMENTED();
}
// IDA: void __usercall NetSendEnvironmentChanges(tNet_game_player_info *pPlayer@<EAX>)
void NetSendEnvironmentChanges(tNet_game_player_info* pPlayer) {
LOG_TRACE("(%p)", pPlayer);
SendAllPedestrianPositions(pPlayer->ID);
SendAllNonCarPositions();
}
// IDA: void __cdecl UpdateEnvironments()
void UpdateEnvironments(void) {
int i;
LOG_TRACE("()");
for (i = 1; i < gNumber_of_net_players; i++) {
if (!gNet_players[i].race_stuff_initialised) {
NetSendEnvironmentChanges(&gNet_players[i]);
gNet_players[i].race_stuff_initialised = 1;
}
NetSendMessageStacks();
SendGameplay(gNet_players[i].ID, eNet_gameplay_go_for_it, 0, 0, 0, 0);
}
}
// IDA: void __usercall ReceivedGameplay(tNet_contents *pContents@<EAX>, tNet_message *pMessage@<EDX>, tU32 pReceive_time@<EBX>)
void ReceivedGameplay(tNet_contents* pContents, tNet_message* pMessage, tU32 pReceive_time) {
//int must_revert_reentrancy; // Pierre-Marie Baty -- unused variable
//int gPixel_buffer_size; // Pierre-Marie Baty -- unused variable
//char* gPixels_copy; // Pierre-Marie Baty -- unused variable
//char* gPalette_copy; // Pierre-Marie Baty -- unused variable
//static int pause_semaphore; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p, %d)", pContents, pMessage, pReceive_time);
NOT_IMPLEMENTED();
}
// IDA: void __usercall SendGameplay(tPlayer_ID pPlayer@<EAX>, tNet_gameplay_mess pMess@<EDX>, int pParam_1@<EBX>, int pParam_2@<ECX>, int pParam_3, int pParam_4)
void SendGameplay(tPlayer_ID pPlayer, tNet_gameplay_mess pMess, int pParam_1, int pParam_2, int pParam_3, int pParam_4) {
tNet_message* the_message;
LOG_TRACE("(%d, %d, %d, %d, %d, %d)", pPlayer, pMess, pParam_1, pParam_2, pParam_3, pParam_4);
the_message = NetBuildMessage(NETMSGID_GAMEPLAY, 0);
the_message->contents.data.gameplay.mess = pMess;
the_message->contents.data.gameplay.param_1 = pParam_1;
the_message->contents.data.gameplay.param_2 = pParam_2;
the_message->contents.data.gameplay.param_3 = pParam_3;
the_message->contents.data.gameplay.param_4 = pParam_4;
NetGuaranteedSendMessageToPlayer(gCurrent_net_game, the_message, pPlayer, 0);
}
// IDA: void __usercall SendGameplayToAllPlayers(tNet_gameplay_mess pMess@<EAX>, int pParam_1@<EDX>, int pParam_2@<EBX>, int pParam_3@<ECX>, int pParam_4)
void SendGameplayToAllPlayers(tNet_gameplay_mess pMess, int pParam_1, int pParam_2, int pParam_3, int pParam_4) {
tNet_message* the_message;
LOG_TRACE("(%d, %d, %d, %d, %d)", pMess, pParam_1, pParam_2, pParam_3, pParam_4);
the_message = NetBuildMessage(NETMSGID_GAMEPLAY, 0);
the_message->contents.data.gameplay.mess = pMess;
the_message->contents.data.gameplay.param_1 = pParam_1;
the_message->contents.data.gameplay.param_2 = pParam_2;
the_message->contents.data.gameplay.param_3 = pParam_3;
the_message->contents.data.gameplay.param_4 = pParam_4;
NetGuaranteedSendMessageToAllPlayers(gCurrent_net_game, the_message, NULL);
}
// IDA: void __usercall SendGameplayToHost(tNet_gameplay_mess pMess@<EAX>, int pParam_1@<EDX>, int pParam_2@<EBX>, int pParam_3@<ECX>, int pParam_4)
void SendGameplayToHost(tNet_gameplay_mess pMess, int pParam_1, int pParam_2, int pParam_3, int pParam_4) {
//tNet_message* the_message; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%d, %d, %d, %d, %d)", pMess, pParam_1, pParam_2, pParam_3, pParam_4);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl InitNetGameplayStuff()
void InitNetGameplayStuff(void) {
LOG_TRACE("()");
}
// IDA: void __cdecl DefaultNetName()
void DefaultNetName(void) {
NetObtainSystemUserName(gNet_player_name, 32);
}
// IDA: void __usercall NetSendPointCrush(tCar_spec *pCar@<EAX>, tU16 pCrush_point_index@<EDX>, br_vector3 *pEnergy_vector@<EBX>)
void NetSendPointCrush(tCar_spec* pCar, tU16 pCrush_point_index, br_vector3* pEnergy_vector) {
//tNet_contents* contents; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %d, %p)", pCar, pCrush_point_index, pEnergy_vector);
STUB_ONCE();
}
// IDA: void __usercall RecievedCrushPoint(tNet_contents *pContents@<EAX>)
void RecievedCrushPoint(tNet_contents* pContents) {
//tCar_spec* car; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", pContents);
NOT_IMPLEMENTED();
}
// IDA: void __usercall GetReducedMatrix(tReduced_matrix *m1@<EAX>, br_matrix34 *m2@<EDX>)
void GetReducedMatrix(tReduced_matrix* m1, br_matrix34* m2) {
LOG_TRACE("(%p, %p)", m1, m2);
NOT_IMPLEMENTED();
}
// IDA: void __usercall GetExpandedMatrix(br_matrix34 *m1@<EAX>, tReduced_matrix *m2@<EDX>)
void GetExpandedMatrix(br_matrix34* m1, tReduced_matrix* m2) {
LOG_TRACE("(%p, %p)", m1, m2);
NOT_IMPLEMENTED();
}
// IDA: void __usercall NetEarnCredits(tNet_game_player_info *pPlayer@<EAX>, tS32 pCredits@<EDX>)
void NetEarnCredits(tNet_game_player_info* pPlayer, tS32 pCredits) {
LOG_TRACE("(%p, %d)", pPlayer, pCredits);
NOT_IMPLEMENTED();
}