FITD/FitdLib/AITD1.cpp

429 lines
9.2 KiB
C++

#include "common.h"
// DEMO mapping
/*
#define PALETTE_JEU 0
#define ITDFONT 1
*/
int AITD1KnownCVars[] =
{
SAMPLE_PAGE,
BODY_FLAMME,
MAX_WEIGHT_LOADABLE,
TEXTE_CREDITS,
SAMPLE_TONNERRE,
INTRO_DETECTIVE,
INTRO_HERITIERE,
WORLD_NUM_PERSO,
CHOOSE_PERSO,
SAMPLE_CHOC,
SAMPLE_PLOUF,
REVERSE_OBJECT,
KILLED_SORCERER,
LIGHT_OBJECT,
FOG_FLAG,
DEAD_PERSO,
-1
};
enumLifeMacro AITD1LifeMacroTable[] =
{
LM_DO_MOVE,
LM_ANIM_ONCE,
LM_ANIM_ALL_ONCE,
LM_BODY,
LM_IF_EGAL,
LM_IF_DIFFERENT,
LM_IF_SUP_EGAL,
LM_IF_SUP,
LM_IF_INF_EGAL,
LM_IF_INF,
LM_GOTO,
LM_RETURN,
LM_END,
LM_ANIM_REPEAT,
LM_ANIM_MOVE,
LM_MOVE,
LM_HIT,
LM_MESSAGE,
LM_MESSAGE_VALUE,
LM_VAR,
LM_INC,
LM_DEC,
LM_ADD,
LM_SUB,
LM_LIFE_MODE,
LM_SWITCH,
LM_CASE,
LM_CAMERA,
LM_START_CHRONO,
LM_MULTI_CASE,
LM_FOUND,
LM_LIFE,
LM_DELETE,
LM_TAKE,
LM_IN_HAND,
LM_READ,
LM_ANIM_SAMPLE,
LM_SPECIAL,
LM_DO_REAL_ZV,
LM_SAMPLE,
LM_TYPE,
LM_GAME_OVER,
LM_MANUAL_ROT,
LM_RND_FREQ,
LM_MUSIC,
LM_SET_BETA,
LM_DO_ROT_ZV,
LM_STAGE,
LM_FOUND_NAME,
LM_FOUND_FLAG,
LM_FOUND_LIFE,
LM_CAMERA_TARGET,
LM_DROP,
LM_FIRE,
LM_TEST_COL,
LM_FOUND_BODY,
LM_SET_ALPHA,
LM_STOP_BETA,
LM_DO_MAX_ZV,
LM_PUT,
LM_C_VAR,
LM_DO_NORMAL_ZV,
LM_DO_CARRE_ZV,
LM_SAMPLE_THEN,
LM_LIGHT,
LM_SHAKING,
LM_INVENTORY,
LM_FOUND_WEIGHT,
LM_UP_COOR_Y,
LM_SPEED,
LM_PUT_AT,
LM_DEF_ZV,
LM_HIT_OBJECT,
LM_GET_HARD_CLIP,
LM_ANGLE,
LM_REP_SAMPLE,
LM_THROW,
LM_WATER,
LM_PICTURE,
LM_STOP_SAMPLE,
LM_NEXT_MUSIC,
LM_FADE_MUSIC,
LM_STOP_HIT_OBJECT,
LM_COPY_ANGLE,
LM_END_SEQUENCE,
LM_SAMPLE_THEN_REPEAT,
LM_WAIT_GAME_OVER,
};
int makeIntroScreens(void)
{
char* data;
unsigned int chrono;
data = loadPak("ITD_RESS", AITD1_TITRE);
FastCopyScreen(data + 770, frontBuffer);
osystem_CopyBlockPhys(frontBuffer, 0, 0, 320, 200);
FadeInPhys(8, 0);
memcpy(logicalScreen, frontBuffer, 320 * 200);
osystem_flip(NULL);
free(data);
LoadPak("ITD_RESS", AITD1_LIVRE, aux);
startChrono(&chrono);
osystem_drawBackground();
do
{
int time;
process_events();
time = evalChrono(&chrono);
if (time >= 0x30)
break;
} while (key == 0 && Click == 0);
playSound(CVars[getCVarsIdx(SAMPLE_PAGE)]);
/* LastSample = -1;
LastPriority = -1;
LastSample = -1;
LastPriority = 0; */
turnPageFlag = 1;
Lire(CVars[getCVarsIdx(TEXTE_CREDITS)] + 1, 48, 2, 260, 197, 1, 26, 0);
return(0);
}
void CopyBox_Aux_Log(int x1, int y1, int x2, int y2)
{
int i;
int j;
for (i = y1; i < y2; i++)
{
for (j = x1; j < x2; j++)
{
*(screenSm3 + i * 320 + j) = *(screenSm1 + i * 320 + j);
}
}
}
int ChoosePerso(void)
{
int choice = 0;
int firsttime = 1;
int choiceMade = 0;
uiLayer.fill(0);
InitCopyBox(aux, logicalScreen);
while (choiceMade == 0)
{
process_events();
osystem_drawBackground();
// TODO: missing code for music stop
LoadPak("ITD_RESS", 10, aux);
FastCopyScreen(aux, logicalScreen);
FastCopyScreen(logicalScreen, aux2);
if (choice == 0)
{
AffBigCadre(80, 100, 160, 200);
CopyBox_Aux_Log(10, 10, 149, 190);
}
else
{
AffBigCadre(240, 100, 160, 200);
CopyBox_Aux_Log(170, 10, 309, 190);
}
FastCopyScreen(logicalScreen, frontBuffer);
osystem_CopyBlockPhys(frontBuffer, 0, 0, 320, 200);
if (firsttime != 0)
{
FadeInPhys(0x40, 0);
do
{
process_events();
} while (Click || key);
firsttime = 0;
}
while ((localKey = key) != 28 && Click == 0) // process input
{
process_events();
osystem_drawBackground();
if (JoyD & 4) // left
{
choice = 0;
FastCopyScreen(aux2, logicalScreen);
AffBigCadre(80, 100, 160, 200);
CopyBox_Aux_Log(10, 10, 149, 190);
osystem_CopyBlockPhys((unsigned char*)logicalScreen, 0, 0, 320, 200);
while (JoyD != 0)
{
process_events();
}
}
if (JoyD & 8) // right
{
choice = 1;
FastCopyScreen(aux2, logicalScreen);
AffBigCadre(240, 100, 160, 200);
CopyBox_Aux_Log(170, 10, 309, 190);
osystem_CopyBlockPhys((unsigned char*)logicalScreen, 0, 0, 320, 200);
while (JoyD != 0)
{
process_events();
}
}
if (localKey == 1)
{
InitCopyBox(aux2, logicalScreen);
FadeOutPhys(0x40, 0);
return(-1);
}
}
FadeOutPhys(0x40, 0);
turnPageFlag = 0;
switch (choice)
{
case 0:
{
FastCopyScreen(frontBuffer, logicalScreen);
SetClip(0, 0, 319, 199);
LoadPak("ITD_RESS", AITD1_FOND_INTRO, aux);
CopyBox_Aux_Log(160, 0, 319, 199);
FastCopyScreen(logicalScreen, aux);
Lire(CVars[getCVarsIdx(INTRO_HERITIERE)] + 1, 165, 5, 314, 194, 2, 15, 0);
CVars[getCVarsIdx(CHOOSE_PERSO)] = 1;
break;
}
case 1:
{
FastCopyScreen(frontBuffer, logicalScreen);
SetClip(0, 0, 319, 199);
LoadPak("ITD_RESS", AITD1_FOND_INTRO, aux);
CopyBox_Aux_Log(0, 0, 159, 199);
FastCopyScreen(logicalScreen, aux);
Lire(CVars[getCVarsIdx(INTRO_DETECTIVE)] + 1, 5, 5, 154, 194, 2, 15, 0);
CVars[getCVarsIdx(CHOOSE_PERSO)] = 0;
break;
}
}
if (localKey && 0x1C)
{
choiceMade = 1;
}
}
FadeOutPhys(64, 0);
InitCopyBox(aux2, logicalScreen);
return(choice);
}
void startAITD1()
{
fontHeight = 16;
g_gameUseCDA = true;
setPalette(currentGamePalette);
#ifndef AITD_UE4
if (!make3dTatou())
{
makeIntroScreens();
}
#endif
while (1)
{
#ifndef AITD_UE4
int startupMenuResult = MainMenu();
#else
int startupMenuResult = 0;
#endif
switch (startupMenuResult)
{
case -1: // timeout
{
CVars[getCVarsIdx(CHOOSE_PERSO)] = rand() & 1;
startGame(7, 1, 0);
if (!make3dTatou())
{
if (!makeIntroScreens())
{
//makeSlideshow();
}
}
break;
}
case 0: // new game
{
// here, original would ask for protection
#if !TARGET_OS_IOS && !AITD_UE4
if(ChoosePerso()!=-1)
#endif
{
process_events();
while (key)
{
process_events();
}
#if !TARGET_OS_IOS
startGame(7, 1, 0);
#endif
// here, original would quit if protection flag was false
startGame(0, 0, 1);
}
break;
}
case 1: // continue
{
// here, original would ask for protection
if (restoreSave(12, 0))
{
// here, original would quit if protection flag was false
// updateShaking();
FlagInitView = 2;
InitView();
PlayWorld(1, 1);
// freeScene();
FadeOutPhys(8, 0);
}
break;
}
case 2: // exit
{
freeAll();
exit(-1);
break;
}
}
}
}
void AITD1_ReadBook(int index, int type)
{
switch (type)
{
case 0: // READ_MESSAGE
{
LoadPak("ITD_RESS", AITD1_LETTRE, aux);
turnPageFlag = 0;
Lire(index, 60, 10, 245, 190, 0, 26, 0);
break;
}
case 1: // READ_BOOK
{
LoadPak("ITD_RESS", AITD1_LIVRE, aux);
turnPageFlag = 1;
Lire(index, 48, 2, 260, 197, 0, 26, 0);
break;
}
case 2: // READ_CARNET
{
LoadPak("ITD_RESS", AITD1_CARNET, aux);
turnPageFlag = 0;
Lire(index, 50, 20, 250, 199, 0, 26, 0);
break;
}
default:
assert(0);
}
}