From 66fe07e9a27d4753721695c264629de3ed178f70 Mon Sep 17 00:00:00 2001 From: Jeff Harris Date: Mon, 2 Dec 2019 11:24:18 -0800 Subject: [PATCH] implements main method (#16) * Implements: main, Usage --- src/BRSRC13/Makefile | 2 +- src/DETHRACE/Makefile | 4 +- src/DETHRACE/common/car.h | 62 +++++++++++++++ src/DETHRACE/common/globvars.h | 137 ++++++++++++++++++++++++++++++++ src/DETHRACE/common/sound.h | 29 +++++++ src/DETHRACE/pc-dos/dossys.c | 94 +++++++++++++++++++--- src/DETHRACE/pc-dos/dossys.h | 29 +++++++ src/DETHRACE/pc-dos/main.c | 11 +-- src/DETHRACE/watcom_functions.c | 26 ++++++ src/DETHRACE/watcom_functions.h | 9 +++ test/Makefile | 2 +- 11 files changed, 385 insertions(+), 20 deletions(-) create mode 100644 src/DETHRACE/watcom_functions.c create mode 100644 src/DETHRACE/watcom_functions.h diff --git a/src/BRSRC13/Makefile b/src/BRSRC13/Makefile index 021a8ad3..0b25ecae 100644 --- a/src/BRSRC13/Makefile +++ b/src/BRSRC13/Makefile @@ -3,7 +3,7 @@ TARGET_EXEC ?= c1 BUILD_DIR ?= ./build SRC_DIR ?= . -SRCS := $(shell find $(SRC_DIR) -name *.c) +SRCS := $(shell find $(SRC_DIR) -name "*.c") OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) DEPS := $(OBJS:.o=.d) diff --git a/src/DETHRACE/Makefile b/src/DETHRACE/Makefile index 8b1c3836..6b16d5c6 100644 --- a/src/DETHRACE/Makefile +++ b/src/DETHRACE/Makefile @@ -4,9 +4,9 @@ BUILD_DIR ?= ./build SRC_DIR ?= . BR_SRC_DIR ?= ../BRSRC13 -SRCS := $(shell find $(SRC_DIR) -name *.c) +SRCS := $(shell find $(SRC_DIR) -name "*.c") OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) -OBJS += $(shell find $(BR_SRC_DIR) -name *.o) +OBJS += $(shell find $(BR_SRC_DIR) -name "*.o") DEPS := $(OBJS:.o=.d) INC_DIRS := $(shell find $(SRC_DIR) -type d) $(BR_SRC_DIR) diff --git a/src/DETHRACE/common/car.h b/src/DETHRACE/common/car.h index 9190adbd..22180c6e 100644 --- a/src/DETHRACE/common/car.h +++ b/src/DETHRACE/common/car.h @@ -4,6 +4,68 @@ #include "dr_types.h" #include "br_types.h" +#define CAR_MAX_SIMPLIFICATION_LEVEL 4 + +extern float gEngine_powerup_factor[6]; +extern tCar_spec *gLast_car_to_skid[2]; +extern tS3_sound_tag gSkid_tag[2]; +extern tSave_camera gSave_camera[2]; +extern tFace_ref gFace_list[150]; +extern void (*ControlCar[6])(tCar_spec*, br_scalar); +extern tNon_car_spec *gActive_non_car_list[50]; +extern float gCar_simplification_factor[2][CAR_MAX_SIMPLIFICATION_LEVEL+1]; +extern float gDefensive_powerup_factor[6]; +extern float gOffensive_powerup_factor[6]; +extern int gNet_player_to_view_index; +extern int gOver_shoot; +extern int gDouble_pling_water; +extern int gOpponent_viewing_mode; +extern br_scalar gMin_world_y; +extern int gMetal_crunch_sound_id[5]; +extern int gFreeze_mechanics; +extern int gWoz_upside_down_at_all; +extern tU32 gQuite_wild_end; +extern tU32 gLast_mechanics_time; +extern tU32 gOn_me_wheels_start; +extern int gCar_car_collisions; +extern br_scalar gAccel; +extern br_vector3 gAverage_grid_position; +extern br_actor *gPed_actor; +extern tU32 gWild_start; +extern tU32 gLast_cunning_stunt; +extern int gCollision_count; +extern tU32 gQuite_wild_start; +extern int gCamera_frozen; +extern tU32 gSwitch_time; +extern int gMaterial_index; +extern int gEliminate_faces; +extern int gInTheSea; +extern int gMetal_scrape_sound_id[3]; +extern br_vector3 gZero_v; +extern int gCamera_mode; +extern int gDoing_physics; +extern br_scalar gOur_yaw; +extern br_vector3 gCamera_pos_before_collide; +extern br_scalar gGravity; +extern br_vector3 gNew_ground_normal; +extern br_scalar gDt; +extern int gFace_num; +extern int gCollision_detection_on; +extern int gControl; +extern br_vector3 gGround_normal; +extern char gNon_car_spec_list[100]; +extern int gCamera_has_collided; +extern int gCar_simplification_level; +extern int gNum_active_non_cars; +extern br_scalar gPanning_camera_height; +extern int gStop_opponents_moving; +extern tU32 gMechanics_time_sync; +extern int gNum_cars_and_non_cars; +extern int gFace_count; +extern br_angle gOld_yaw; +extern br_angle gOld_zoom; +extern br_angle gPanning_camera_angle; + // Offset: 0 // Size: 91 // EAX: pCar diff --git a/src/DETHRACE/common/globvars.h b/src/DETHRACE/common/globvars.h index 59eaf6c5..defa0c9e 100644 --- a/src/DETHRACE/common/globvars.h +++ b/src/DETHRACE/common/globvars.h @@ -4,4 +4,141 @@ #include "dr_types.h" #include "br_types.h" +extern char gNet_player_name[32]; +extern br_matrix34 gRearview_camera_to_world; +extern tSpecial_volume gDefault_default_water_spec_vol; +extern br_matrix34 gCamera_to_world; +extern tRace_list_spec gRace_list[100]; +extern tPath_name gApplication_path; +extern tU32 gI_am_cheating; +extern float gPinball_factor; +extern float gOpponent_speed_factor; +extern float gCar_crush_min_fold; +extern float gNet_recovery_cost[7]; +extern float gCar_crush_softness; +extern br_vector3 gDisabled_vector; +extern br_vector3 *gOur_pos; +extern float gCar_crush_max_fold; +extern tBrender_storage gNet_cars_storage_space; +extern float gNet_softness[7]; +extern tS32 gJoystick_deadzone; +extern float gCar_crush_limit_deviant; +extern float gNet_offensive[7]; +extern float gCar_crush_split_chance; +extern float gGravity_multiplier; +extern float gCar_crush_wibble; +extern float gRepair_cost[3]; +extern float gCop_speed_factor; +extern float gDefault_gravity; +extern tU32 gKeys_pressed; +extern tSpecial_volume *gDefault_water_spec_vol; +extern float gNet_repair_cost[7]; +extern br_font *gFont_7; +extern tU32 gLast_replay_frame_time; +extern tU32 gTag_start_time; +extern tOpponent *gOpponents; +extern tU32 gLast_credit_tick; +extern tBrender_storage gTheir_cars_storage_space; +extern br_font *gHeadup_font; +extern tSave_game *gPre_race_saved_game; +extern tU32 gRace_finished; +extern FILE *gDiagnostic_file; +extern tU32 gFrame_start_time; +extern tProgram_state gProgram_state; +extern tU32 gCredit_period_single[3]; +extern tU32 gRace_start; +extern tBrender_storage gTrack_storage_space; +extern br_scalar gYon_multiplier; +extern tU32 gFrame_period; +extern tU32 gCredit_period; +extern tU32 gCredit_period_network[7]; +extern tBrender_storage gOur_car_storage_space; +extern tU32 gFox_start_time; +extern br_font *gBig_font; +extern tBrender_storage gPedestrians_storage_space; +extern tRace_info gCurrent_race; +extern br_scalar gCut_delay_4; +extern br_actor *gSelf; +extern br_scalar gCut_delay_1; +extern br_scalar gCut_delay_2; +extern br_actor *gDont_render_actor; +extern br_scalar gCut_delay_3; +extern br_pixelmap *gScreen; +extern br_pixelmap *gRender_screen; +extern br_actor *gRearview_camera; +extern br_scalar gCamera_hither; +extern br_pixelmap *gRearview_screen; +extern br_pixelmap *gBack_screen; +extern br_scalar gCamera_angle; +extern br_pixelmap *gDigits_pix; +extern br_pixelmap *gRender_shade_table; +extern br_pixelmap *gRearview_depth_buffer; +extern br_pixelmap *gWhole_screen; +extern br_pixelmap *gIcons_pix; +extern br_scalar gCamera_yon; +extern br_actor *gCamera; +extern br_actor *gArrow_actor; +extern br_pixelmap *gIcons_pix_low_res; +extern br_pixelmap *gDepth_buffer; +extern int gSound_override; +extern int gAustere_override; +extern int gInitial_net_credits[5]; +extern float gCar_cred_value[3]; +extern int gNo_races_yet; +extern int gDefault_engine_noise_index; +extern int gGame_to_load; +extern int gJump_start_fine[3]; +extern int gSausage_override; +extern int gAusterity_mode; +extern int gReal_graf_data_index; +extern float gCar_time_value[3]; +extern int gTyping_slot; +extern int gCunning_stunt_bonus[3]; +extern int gKnobbled_frame_period; +extern int gCD_is_in_drive; +extern int gInterface_within_race_mode; +extern br_actor *gNon_track_actor; +extern int gCut_scene_override; +extern int gKey_map_index; +extern int gWait_for_it; +extern int gCheck_point_cash[3]; +extern int gPoints_per_second[3]; +extern br_actor *gUniverse_actor; +extern br_actor *gTrack_actor; +extern int gMap_mode; +extern int gPed_time_value[3]; +extern int gHost_abandon_game; +extern int gAbandon_game; +extern int gLap; +extern int gShow_opponents; +extern int gPipe_reg_snap_before_new_game; +extern int gTotal_laps; +extern int gDisallow_abandon_race; +extern int gFree_repairs; +extern int gFreeze_timer; +extern int gRoll_over_creds[3]; +extern int gShow_peds_on_map; +extern int gOn_drugs; +extern int gWasted_time[3]; +extern int gAction_replay_mode; +extern int gPipe_reg_snap_after_our_car; +extern int gRecover_car; +extern int gCheckpoint; +extern int gRoll_over_time[3]; +extern int gPipe_reg_snap_before_our_car; +extern int gWasted_creds[3]; +extern int gTimer; +extern int gCheckpoint_count; +extern int gCountdown; +extern int gFrame_rate; +extern int gNumber_of_racers; +extern int gSound_enabled; +extern int gInfo_on; +extern int gGraf_spec_index; +extern int gTyping; +extern int gSound_available; +extern int gNumber_of_races; +extern int gArrow_mode; +extern char gDir_separator[3]; + #endif diff --git a/src/DETHRACE/common/sound.h b/src/DETHRACE/common/sound.h index d685438d..ca39502b 100644 --- a/src/DETHRACE/common/sound.h +++ b/src/DETHRACE/common/sound.h @@ -4,6 +4,35 @@ #include "dr_types.h" #include "br_types.h" +extern tS3_outlet_ptr gIndexed_outlets[6]; +extern int gRandom_CDA_tunes[7]; +extern tU32 gLast_sound_service; +extern int gSong_repeat_count; +extern int gServicing_sound; +extern int gCD_fully_installed; +extern int gCD_is_disabled; +extern int gCDA_is_playing; +extern int gSound_sources_inited; +extern tS3_sound_tag gCDA_tag; +extern tS3_outlet_ptr gEngine_outlet; +extern int gRandom_Rockin_MIDI_tunes[3]; +extern int gOld_sound_detail_level; +extern int gLast_tune; +extern int gVirgin_pass; +extern br_vector3 gCamera_left; +extern int gRandom_MIDI_tunes[3]; +extern br_vector3 gCamera_position; +extern br_vector3 gOld_camera_position; +extern br_vector3 gCamera_velocity; +extern int gSound_detail_level; +extern tS3_outlet_ptr gDriver_outlet; +extern tS3_outlet_ptr gPedestrians_outlet; +extern tS3_outlet_ptr gCar_outlet; +extern tS3_sound_id gMIDI_id; +extern int gMusic_available; +extern tS3_outlet_ptr gMusic_outlet; +extern tS3_outlet_ptr gEffects_outlet; + // Offset: 0 // Size: 224 void UsePathFileToDetermineIfFullInstallation(); diff --git a/src/DETHRACE/pc-dos/dossys.c b/src/DETHRACE/pc-dos/dossys.c index cf3b323b..33e91d6c 100644 --- a/src/DETHRACE/pc-dos/dossys.c +++ b/src/DETHRACE/pc-dos/dossys.c @@ -2,6 +2,13 @@ #include #include +#include + +#include "watcom_functions.h" +#include "common/globvars.h" +#include "common/main.h" +#include "common/car.h" +#include "common/sound.h" int gASCII_table[128]; tU32 gKeyboard_bits[8]; @@ -383,17 +390,86 @@ void PDDisposeActionReplayBuffer(char *pBuffer) { // EAX: pProgpath void Usage(char *pProgpath) { char basename[9]; + + splitpath(pProgpath, NULL, NULL, basename, NULL); + + fprintf(stderr, + "Usage: %s [%s] [%s YonFactor] [%s CarSimplificationLevel] [%s SoundDetailLevel] [%s] [%s] [%s] [%s] [%s] [%s]\nWhere YonFactor is between 0 and 1,\nCarSimplificationLevel is a whole number between 0 and %d,\nand SoundDetailLevel is a whole number.\n", + basename, + "-hires", + "-yon", + "-simple", + "-sound", + "-robots", + "-lomem", + "-nosound", + "-spamfritter", + "-nocutscenes", + "-noreplay", + CAR_MAX_SIMPLIFICATION_LEVEL); + exit(1); } -// // Offset: 6972 -// // Size: 722 -// // EAX: pArgc -// // EDX: pArgv -// int main(int pArgc, char **pArgv) { -// int arg; -// int i; -// float f; -// } +// Offset: 6972 +// Size: 722 +// EAX: pArgc +// EDX: pArgv +// Renamed from "main" to "_main" to allow for unit testing +int _main(int pArgc, char **pArgv) { + int arg; + int i; + float f; + + for (i = 1; i < pArgc; i++) { + if (strcasecmp(pArgv[i], "-hires") == 0) { + gReal_graf_data_index = 1; + } + else if (strcasecmp(pArgv[i], "-yon") == 0 && i < pArgc - 1) { + i++; + sscanf(pArgv[i], "%f", &f); + if (f >= 0.0 && f <= 1065353216 ) + { + gYon_multiplier = f; + } + } + else if (strcasecmp(pArgv[i], "-simple") == 0 && i < pArgc - 1) { + i++; + sscanf(pArgv[i], "%d", &arg); + if (arg >= 0 && arg < 5) { + gCar_simplification_level = arg; + } + } + else if (strcasecmp(pArgv[i], "-sound") == 0 && i < pArgc - 1) { + i++; + sscanf(pArgv[i], "%d", &arg); + gSound_detail_level = arg; + + } + else if (strcasecmp(pArgv[i], "-robots") == 0) { + gSausage_override = 1; + } + else if (strcasecmp(pArgv[i], "-lomem") == 0) { + gAustere_override = 1; + } + else if (strcasecmp(pArgv[i], "-nosound") == 0) { + gSound_override = 1; + } + else if (strcasecmp(pArgv[i], "-spamfritter") == 0) { + gExtra_mem = 2000000; + } + else if (strcasecmp(pArgv[i], "-nocutscenes") == 0) { + gCut_scene_override = 1; + } + else if (strcasecmp(pArgv[i], "-noreplay") == 0) { + gReplay_override = 1; + } + else { + Usage(pArgv[0]); + } + } + GameMain(pArgc, pArgv); + return 0; +} // Offset: 7696 // Size: 62 diff --git a/src/DETHRACE/pc-dos/dossys.h b/src/DETHRACE/pc-dos/dossys.h index 3723218a..5f2fe580 100644 --- a/src/DETHRACE/pc-dos/dossys.h +++ b/src/DETHRACE/pc-dos/dossys.h @@ -9,6 +9,35 @@ #include #include +extern int gASCII_table[128]; +extern tU32 gKeyboard_bits[8]; +extern int gASCII_shift_table[128]; +extern tGraf_spec gGraf_specs[2]; +extern char gNetwork_profile_fname[256]; +extern tS32 gJoystick_min1y; +extern tS32 gJoystick_min2y; +extern tS32 gJoystick_min2x; +extern tS32 gRaw_joystick2y; +extern tS32 gRaw_joystick2x; +extern tS32 gRaw_joystick1y; +extern tS32 gRaw_joystick1x; +extern tS32 gJoystick_range2y; +extern tS32 gJoystick_range2x; +extern tS32 gJoystick_range1y; +extern tS32 gJoystick_range1x; +extern int gNo_voodoo; +extern int gSwitched_resolution; +extern int gReplay_override; +extern br_pixelmap *gReal_back_screen; +extern tS32 gJoystick_min1x; +extern br_pixelmap *gTemp_screen; +extern int gDOSGfx_initialized; +extern tU32 gUpper_loop_limit; +extern int gExtra_mem; +extern int gReal_back_screen_locked; +extern void (*gPrev_keyboard_handler)(); +extern tU8 gScan_code[123][2]; + extern int _unittest_do_not_exit; // Offset: 0 diff --git a/src/DETHRACE/pc-dos/main.c b/src/DETHRACE/pc-dos/main.c index c0949352..55d784cd 100644 --- a/src/DETHRACE/pc-dos/main.c +++ b/src/DETHRACE/pc-dos/main.c @@ -1,13 +1,10 @@ #include "pc-dos/dossys.h" -// main method Moved from pc-dos/dossys.c to enable unit testing +extern int _main(int pArgc, char* pArgv[]); -// Offset: 6972 -// Size: 722 // EAX: pArgc // EDX: pArgv -int main(int pArgc, char **pArgv) { - int arg; - int i; - float f; +// Moved from pc-dos/dossys.c to enable unit testing +int main(int pArgc, char* pArgv[]) { + return _main(pArgc, pArgv); } diff --git a/src/DETHRACE/watcom_functions.c b/src/DETHRACE/watcom_functions.c new file mode 100644 index 00000000..b96564d7 --- /dev/null +++ b/src/DETHRACE/watcom_functions.c @@ -0,0 +1,26 @@ +#include "watcom_functions.h" + +#include +#include +#include +#include + +#if defined(_WIN32) || defined(_WIN64) + #define snprintf _snprintf + #define vsnprintf _vsnprintf + #define strcasecmp _stricmp + #define strncasecmp _strnicmp +#else + #include +#endif + +void splitpath( char *path, char *drive, char *dir, char *fname, char *ext ) { + #if defined(_WIN32) || defined(_WIN64) + _splitpath(path, drive, dr, fname, ext); + #else + // shortcut - we only ever call this method asking for 'fname' + // 9 is hardcoded to match `basename` defined in `Usage` + strncpy(fname, basename(path), 9); + + #endif +} diff --git a/src/DETHRACE/watcom_functions.h b/src/DETHRACE/watcom_functions.h new file mode 100644 index 00000000..042dff05 --- /dev/null +++ b/src/DETHRACE/watcom_functions.h @@ -0,0 +1,9 @@ +#ifndef _WATCOM_FUNCTIONS_H_ +#define _WATCOM_FUNCTIONS_H_ + +// These functions are used by the game and were originally provided by Watcom C lib. +// Reimplemented here without Watcom code + +void splitpath( char *path, char *drive, char *dir, char *fname, char *ext ); + +#endif diff --git a/test/Makefile b/test/Makefile index e47d38fd..49bb5f14 100644 --- a/test/Makefile +++ b/test/Makefile @@ -7,7 +7,7 @@ BR_SRC_DIR ?= ../src/BRSRC13 SRCS := $(shell find $(SRC_DIR) -name "*.c") OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) -OBJS += $(shell find $(BR_SRC_DIR) -name *.o) +OBJS += $(shell find $(BR_SRC_DIR) -name "*.o") # include all DR objects except the main method to avoid _main symbol collision OBJS += $(shell find $(DR_SRC_DIR) -name *.o | grep -v pc-dos/main.c.o)