diff --git a/src/DETHRACE/common/cutscene.c b/src/DETHRACE/common/cutscene.c index 1e3644ce..cc7b24f8 100644 --- a/src/DETHRACE/common/cutscene.c +++ b/src/DETHRACE/common/cutscene.c @@ -129,7 +129,7 @@ void PlaySmackerFile(char* pSmack_name) { void DoOpeningAnimation() { LOG_TRACE("()"); PlaySmackerFile("LOGO.SMK"); - PlaySmackerFile("MIX_INTR.SMK"); + PlaySmackerFile(harness_game_mode.intro_smk_file); return WaitForNoKeys(); } diff --git a/src/DETHRACE/common/graphics.c b/src/DETHRACE/common/graphics.c index 181d0922..9d3066bd 100644 --- a/src/DETHRACE/common/graphics.c +++ b/src/DETHRACE/common/graphics.c @@ -1410,7 +1410,14 @@ void ShadowMode() { // IDA: int __cdecl SwitchToRealResolution() int SwitchToRealResolution() { LOG_TRACE("()"); - NOT_IMPLEMENTED(); + + if (gGraf_data_index == gReal_graf_data_index) { + return 0; + } + gGraf_data_index = gReal_graf_data_index; + gGraf_spec_index = gReal_graf_data_index; + gCurrent_graf_data = &gGraf_data[gReal_graf_data_index]; + return 1; } // IDA: int __cdecl SwitchToLoresMode() diff --git a/src/DETHRACE/common/loading.c b/src/DETHRACE/common/loading.c index b40b4a0b..2b69965f 100644 --- a/src/DETHRACE/common/loading.c +++ b/src/DETHRACE/common/loading.c @@ -1445,7 +1445,7 @@ void GetAString(FILE* pF, char* pString) { // IDA: void __cdecl AboutToLoadFirstCar() void AboutToLoadFirstCar() { LOG_TRACE("()"); - NOT_IMPLEMENTED(); + memset(gFunk_groove_flags, 0, sizeof(gFunk_groove_flags)); } // IDA: void __usercall LoadOpponentsCars(tRace_info *pRace_info@) @@ -1663,6 +1663,11 @@ int TestForOriginalCarmaCDinDrive() { tPath_name paths_txt; int paths_txt_first_char; + // JeffH: Added to optionally bypass this check + if (!harness_enable_cd_check) { + return 1; + } + paths_txt[0] = 0; strcat(paths_txt, gApplication_path); strcat(paths_txt, gDir_separator); @@ -1703,14 +1708,8 @@ int TestForOriginalCarmaCDinDrive() { return 0; } - if (Harness_GameMode() == eGame_mode_SplatPack) { - if (!PDCheckDriveExists2(cutscene_pathname, "SPLINTRO.SMK", 2000000)) { - return 0; - } - } else { - if (!PDCheckDriveExists2(cutscene_pathname, "MIX_INTR.SMK", 2000000)) { - return 0; - } + if (!PDCheckDriveExists2(cutscene_pathname, harness_game_mode.intro_smk_file, 2000000)) { + return 0; } if (paths_txt_first_char != '@') { diff --git a/src/DETHRACE/common/main.c b/src/DETHRACE/common/main.c index 231c3b1f..33c7b290 100644 --- a/src/DETHRACE/common/main.c +++ b/src/DETHRACE/common/main.c @@ -76,7 +76,6 @@ void GameMain(int pArgc, char** pArgv) { strcat(gApplication_path, "DATA"); UsePathFileToDetermineIfFullInstallation(); - if (!gCD_fully_installed && GetCDPathFromPathsTxtFile(CD_dir) && !PDCheckDriveExists(CD_dir)) { PDInitialiseSystem(); fprintf(stderr, "Can't find the Carmageddon CD\n"); diff --git a/src/DETHRACE/common/sound.c b/src/DETHRACE/common/sound.c index 8a801b1f..c2007e85 100644 --- a/src/DETHRACE/common/sound.c +++ b/src/DETHRACE/common/sound.c @@ -46,11 +46,10 @@ void UsePathFileToDetermineIfFullInstallation() { strcat(path_file, gDir_separator); strcat(path_file, "PATHS.TXT"); - if (PDCheckDriveExists(path_file) == 0) { + if (PDCheckDriveExists(path_file)) { fp = fopen(path_file, "rt"); if (fp != NULL) { if (GetALineWithNoPossibleService(fp, line2) && GetALineWithNoPossibleService(fp, line2) && GetALineWithNoPossibleService(fp, line3) && strcmp(line3, "Full") == 0) { - gCD_fully_installed = 1; } fclose(fp); diff --git a/src/DETHRACE/main.c b/src/DETHRACE/main.c index 177cc692..f76b139d 100644 --- a/src/DETHRACE/main.c +++ b/src/DETHRACE/main.c @@ -9,8 +9,6 @@ extern int original_main(int pArgc, char* pArgv[]); int main(int argc, char* argv[]) { int result; - Harness_Init(argv[0], &OpenGLRenderer); - char* root_dir = getenv("DETHRACE_ROOT_DIR"); if (!root_dir) { LOG_PANIC("DETHRACE_ROOT_DIR is not set"); @@ -21,5 +19,7 @@ int main(int argc, char* argv[]) { LOG_PANIC("Failed to chdir. Returned %d", result); } + Harness_Init(argv[0], &OpenGLRenderer); + return original_main(argc, argv); } diff --git a/src/DETHRACE/pc-dos/dossys.c b/src/DETHRACE/pc-dos/dossys.c index 42cf95ac..730a5bc2 100644 --- a/src/DETHRACE/pc-dos/dossys.c +++ b/src/DETHRACE/pc-dos/dossys.c @@ -611,6 +611,11 @@ int original_main(int pArgc, char** pArgv) { float f; for (i = 1; i < pArgc; i++) { + + if (Harness_Hook_HandleCommandLineArg(pArgv[i])) { + continue; + } + if (strcasecmp(pArgv[i], "-hires") == 0) { gGraf_spec_index = 1; } else if (strcasecmp(pArgv[i], "-yon") == 0 && i < pArgc - 1) { diff --git a/src/harness/harness.c b/src/harness/harness.c index 9db19f02..7e8d4d0f 100644 --- a/src/harness/harness.c +++ b/src/harness/harness.c @@ -2,25 +2,44 @@ #include "harness.h" #include "input/keyboard.h" #include "stack_trace_handler.h" +#include "unistd.h" +#include SDL_Window* window; renderer* current_renderer; br_pixelmap* palette; uint32_t* screen_buffer; -eGame_mode game_mode; br_pixelmap* last_dst = NULL; br_pixelmap* last_src = NULL; +// if not 0, enable the original CD check code, otherwise just skip +int harness_enable_cd_check; + +// SplatPack or Carmageddon. This is where we represent the code differences between the two. For example, the intro smack file. +tHarness_GameMode harness_game_mode; + +void Harness_DetectGameMode() { + if (access("DATA/CUTSCENE/SPLINTRO.SMK", F_OK) != -1) { + harness_game_mode.name = "Splat Pack"; + harness_game_mode.intro_smk_file = "SPLINTRO.SMK"; + } else { + harness_game_mode.name = "Carmageddon"; + harness_game_mode.intro_smk_file = "MIX_INTR.SMK"; + } + LOG_INFO("\"%s\"", harness_game_mode.name); +} + void Harness_Init(char* name, renderer* renderer) { install_signal_handler(name); current_renderer = renderer; screen_buffer = NULL; - game_mode = eGame_mode_Carmageddon; if (SDL_Init(SDL_INIT_TIMER) != 0) { LOG_PANIC("SDL_INIT_TIMER error: %s", SDL_GetError()); } + + Harness_DetectGameMode(); } void Harness_PumpEvents() { @@ -41,8 +60,12 @@ void Harness_PumpEvents() { } } -eGame_mode Harness_GameMode() { - return game_mode; +int Harness_Hook_HandleCommandLineArg(char* arg) { + if (strcasecmp(arg, "-cdcheck") == 0) { + harness_enable_cd_check = 1; + return 1; + } + return 0; } void Harness_Hook_DOSGfxBegin() { diff --git a/src/harness/harness.h b/src/harness/harness.h index 94c5f760..591671ec 100644 --- a/src/harness/harness.h +++ b/src/harness/harness.h @@ -5,25 +5,24 @@ #include "debug.h" #include -typedef int harness_game_func(void*); - typedef struct renderer { int (*get_window_flags)(); void (*init)(SDL_Window* window); void (*doubleBuffer)(uint32_t* src, SDL_Window* window); } renderer; -typedef enum eGame_mode { - eGame_mode_Carmageddon, - eGame_mode_SplatPack -} eGame_mode; +typedef struct tHarness_GameMode { + char* name; + char* intro_smk_file; +} tHarness_GameMode; + +extern tHarness_GameMode harness_game_mode; +extern int harness_enable_cd_check; void Harness_Init(char* name, renderer* renderer); -void Harness_RunWindowLoop(harness_game_func* game_func, void* arg); - -eGame_mode Harness_GameMode(); // Hooks are called from original game code. +int Harness_Hook_HandleCommandLineArg(char* arg); void Harness_Hook_DOSGfxBegin(); void Harness_Hook_BrDevPaletteSetOld(br_pixelmap* pm); void Harness_Hook_BrDevPaletteSetEntryOld(int i, br_colour colour);