#include "cutscene.h"
#include "drmem.h"
#include "errors.h"
#include "flicplay.h"
#include "globvars.h"
#include "globvrpb.h"
#include "graphics.h"
#include "harness/config.h"
#include "harness/hooks.h"
#include "harness/os.h"
#include "harness/trace.h"
#include "input.h"
#include "loading.h"
#include "pd/sys.h"
#include "smackw32/smackw32.h"
#include "sound.h"
#include "utility.h"
#include <stdlib.h>
#include <time.h>
tS32 gLast_demo_end_anim = -90000;
// IDA: void __usercall ShowCutScene(int pIndex@<EAX>, int pWait_end@<EDX>, int pSound_ID@<EBX>, br_scalar pDelay)
void ShowCutScene(int pIndex, int pWait_end, int pSound_ID, br_scalar pDelay) {
LOG_TRACE("(%d, %d, %d, %f)", pIndex, pWait_end, pSound_ID, pDelay);
gProgram_state.cut_scene = 1;
if (pSound_ID >= 0) {
DRS3LoadSound(pSound_ID);
SetFlicSound(pSound_ID, PDGetTotalTime() + 1000.f * pDelay);
}
SetNonFatalAllocationErrors();
RunFlic(pIndex);
ResetNonFatalAllocationErrors();
if (pWait_end) {
WaitForAKey();
} else {
WaitForNoKeys();
}
FadePaletteDown();
ClearEntireScreen();
if (pSound_ID >= 0) {
DRS3ReleaseSound(pSound_ID);
SetFlicSound(0, 0);
}
gProgram_state.cut_scene = 0;
}
// IDA: void __cdecl DoSCILogo()
void DoSCILogo(void) {
}
// IDA: void __cdecl DoStainlessLogo()
void DoStainlessLogo(void) {
LOG_TRACE("()");
}
// IDA: void __usercall PlaySmackerFile(char *pSmack_name@<EAX>)
void PlaySmackerFile(char* pSmack_name) {
tPath_name the_path;
br_colour* br_colours_ptr;
tU8* smack_colours_ptr;
Smack* smk;
unsigned long i; // Pierre-Marie Baty -- fixed type
int j;
//int len; // Pierre-Marie Baty -- unused variable
int fuck_off;
LOG_TRACE("(\"%s\")", pSmack_name);
if (!gSound_override && !gCut_scene_override) {
StopMusic();
FadePaletteDown();
ClearEntireScreen();
SmackSoundUseDirectSound(NULL);
br_colours_ptr = gCurrent_palette->pixels;
PathCat(the_path, gApplication_path, "CUTSCENE");
PathCat(the_path, the_path, pSmack_name);
dr_dprintf("Trying to open smack file '%s'", the_path);
smk = SmackOpen(the_path, SMACKTRACKS, SMACKAUTOEXTRA);
if (smk == NULL) {
dr_dprintf("Unable to open smack file - attempt to load smack from CD...");
if (GetCDPathFromPathsTxtFile(the_path)) {
strcat(the_path
, gDir_separator
);
PathCat(the_path, the_path, "CUTSCENE");
PathCat(the_path, the_path, pSmack_name);
if (PDCheckDriveExists(the_path)) {
smk = SmackOpen(the_path, SMACKTRACKS, SMACKAUTOEXTRA);
}
} else {
dr_dprintf("Can't get CD directory name");
}
}
if (smk != NULL) {
dr_dprintf("Smack file opened OK");
for (i = 1; i <= smk->Frames; i++) {
SmackToBuffer(smk, 0, 0, gBack_screen->row_bytes, gBack_screen->height, gBack_screen->pixels, 0);
if (smk->NewPalette) {
smack_colours_ptr = smk->Palette;
for (j = 0; j < 256; j++) {
br_colours_ptr[j] = (smack_colours_ptr[j * 3] << 16) | smack_colours_ptr[j * 3 + 2] | (smack_colours_ptr[j * 3 + 1] << 8);
}
// TOOD: remove the commented-out line below when smk->NewPalette is set correctly per-frame
// memset(gBack_screen->pixels, 0, gBack_screen->row_bytes * gBack_screen->height);
DRSetPalette(gCurrent_palette);
PDScreenBufferSwap(0);
EnsurePaletteUp();
}
SmackDoFrame(smk);
if (i != smk->Frames) {
SmackNextFrame(smk);
}
PDScreenBufferSwap(0);
do {
fuck_off = AnyKeyDown() || EitherMouseButtonDown();
} while (!fuck_off && SmackWait(smk));
if (fuck_off) {
break;
}
}
FadePaletteDown();
ClearEntireScreen();
SmackClose(smk);
} else {
dr_dprintf("Smack file '%s' failed to open", pSmack_name);
}
StartMusic();
}
}
// IDA: void __cdecl DoOpeningAnimation()
void DoOpeningAnimation(void) {
LOG_TRACE("()");
PlaySmackerFile("LOGO.SMK");
PlaySmackerFile(harness_game_info.defines.INTRO_SMK_FILE);
WaitForNoKeys();
}
// IDA: void __cdecl DoNewGameAnimation()
void DoNewGameAnimation(void) {
LOG_TRACE("()");
}
// IDA: void __cdecl DoGoToRaceAnimation()
void DoGoToRaceAnimation(void) {
LOG_TRACE("()");
if (gNet_mode == eNet_mode_none) {
if (PercentageChance(50)) {
PlaySmackerFile("GARAGE2.SMK");
} else {
PlaySmackerFile("GARAGE1.SMK");
}
}
}
// IDA: void __cdecl DoEndRaceAnimation()
void DoEndRaceAnimation(void) {
int made_a_profit;
int went_up_a_rank;
LOG_TRACE("()");
made_a_profit = gProgram_state.credits_earned >= gProgram_state.credits_lost;
went_up_a_rank = gProgram_state.credits_earned >= gProgram_state.credits_per_rank;
FadePaletteDown();
if (gAusterity_mode || gNet_mode != eNet_mode_none) {
return;
}
if (gProgram_state.credits + gProgram_state.credits_earned - gProgram_state.credits_lost >= 0) {
if (made_a_profit && went_up_a_rank) {
PlaySmackerFile("SUCCESS.SMK");
} else if (made_a_profit || went_up_a_rank) {
PlaySmackerFile("MUNDANE.SMK");
} else {
PlaySmackerFile("UNSUCSES.SMK");
}
}
}
// IDA: void __cdecl DoGameOverAnimation()
void DoGameOverAnimation(void) {
LOG_TRACE("()");
StopMusic();
PlaySmackerFile("CRASH.SMK");
StartMusic();
}
// IDA: void __cdecl DoGameCompletedAnimation()
void DoGameCompletedAnimation(void) {
LOG_TRACE("()");
StopMusic();
PlaySmackerFile("TOPRANK.SMK");
StartMusic();
}
void DoFeatureUnavailableInDemo(void) {
LOG_TRACE("()");
PrintMemoryDump(0, "BEFORE DEMO-ONLY SCREEN");
SuspendPendingFlic();
FadePaletteDown();
ShowCutScene(7, 1, 8502, gCut_delay_3);
FadePaletteDown();
PrintMemoryDump(0, "AFTER DEMO-ONLY SCREEN");
}
void DoFullVersionPowerpoint(void) {
LOG_TRACE("()");
FadePaletteDown();
DRSetPalette(gRender_palette);
if (harness_game_info.mode == eGame_splatpack_demo) {
PlaySmackerFile("DEMOEND.SMK");
} else {
ShowCutScene(9, 0, 8503, gCut_delay_4);
}
FadePaletteDown();
gLast_demo_end_anim = PDGetTotalTime();
}
void DoDemoGoodbye(void) {
if (PDGetTotalTime() - gLast_demo_end_anim > 90000) {
DoFullVersionPowerpoint();
}
}
// IDA: void __cdecl StartLoadingScreen()
void StartLoadingScreen(void) {
LOG_TRACE("()");
PossibleService();
if (gProgram_state.sausage_eater_mode) {
SplashScreenWith(harness_game_info.defines.GERMAN_LOADSCRN);
} else {
SplashScreenWith("LOADSCRN.PIX");
}
}