implements main method (#16)

* Implements: main, Usage
This commit is contained in:
Jeff Harris 2019-12-02 11:24:18 -08:00 committed by GitHub
parent cee44698b2
commit 66fe07e9a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 385 additions and 20 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -2,6 +2,13 @@
#include <time.h>
#include <sys/stat.h>
#include <string.h>
#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

View File

@ -9,6 +9,35 @@
#include <string.h>
#include <math.h>
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

View File

@ -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);
}

View File

@ -0,0 +1,26 @@
#include "watcom_functions.h"
#include <ctype.h>
#include <libgen.h>
#include <stdlib.h>
#include <string.h>
#if defined(_WIN32) || defined(_WIN64)
#define snprintf _snprintf
#define vsnprintf _vsnprintf
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#else
#include <strings.h>
#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
}

View File

@ -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

View File

@ -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)