// WL_INTER.C
#include "WL_DEF.H"
#pragma hdrstop
//==========================================================================
/*
==================
=
= CLearSplitVWB
=
==================
*/
void ClearSplitVWB (void)
{
memset (update,0,sizeof(update));
WindowX = 0;
WindowY = 0;
WindowW = 320;
WindowH = 160;
}
//==========================================================================
#ifdef SPEAR
#ifndef SPEARDEMO
////////////////////////////////////////////////////////
//
// End of Spear of Destiny
//
////////////////////////////////////////////////////////
void EndScreen (int palette, int screen)
{
CA_CacheScreen (screen);
VW_UpdateScreen ();
CA_CacheGrChunk (palette);
VL_FadeIn(0,255,grsegs[palette],0); //,0";modf
UNCACHEGRCHUNK (palette);
IN_ClearKeysDown ();
IN_Ack ();
VW_FadeOut ();
}
void EndSpear(void)
{
EndScreen (END1PALETTE, ENDSCREEN11PIC);
CA_CacheScreen (ENDSCREEN3PIC);
VW_UpdateScreen ();
CA_CacheGrChunk (END3PALETTE);
VL_FadeIn(0,255,grsegs[END3PALETTE],0);//,0";modf
UNCACHEGRCHUNK (END3PALETTE);
fontnumber = 0;
fontcolor = 0x0f;//,0";modf
WindowX = 0;
WindowW = 320;
PrintX = 0;
PrintY = 180;
US_CPRINT (STR_ENDGAME1"\n");
US_CPRINT (STR_ENDGAME2);
VW_UpdateScreen ();
IN_StartAck ();
TimeCount = 0;
while (!IN_CheckAck () && TimeCount 700);
PrintX = 0;
PrintY = 180;
VWB_Bar(0,180,320,20,0);
US_CPRINT (STR_ENDGAME3"\n");
US_CPRINT (STR_ENDGAME4);
VW_UpdateScreen ();
IN_StartAck ();
TimeCount = 0;
while (!IN_CheckAck () && TimeCount 700);
VW_FadeOut ();
EndScreen (END4PALETTE, ENDSCREEN4PIC);
EndScreen (END5PALETTE, ENDSCREEN5PIC);
EndScreen (END6PALETTE, ENDSCREEN6PIC);
EndScreen (END7PALETTE, ENDSCREEN7PIC);
EndScreen (END8PALETTE, ENDSCREEN8PIC);
EndScreen (END9PALETTE, ENDSCREEN9PIC);
EndScreen (END2PALETTE, ENDSCREEN12PIC);
MainMenu[savegame].active = 0;
}
#endif
#endif
//==========================================================================
/*
==================
=
= Victory
=
==================
*/
void Victory (void)
{
#ifndef SPEARDEMO
long sec;
int i,min,kr,sr,tr,x;
char tempstr[8];
#define RATIOX 6
#define RATIOY 14
#define TIMEX 14
#define TIMEY 8
#ifdef SPEAR
StartCPMusic (XTHEEND_MUS);
CA_CacheGrChunk(BJCOLLAPSE1PIC);
CA_CacheGrChunk(BJCOLLAPSE2PIC);
CA_CacheGrChunk(BJCOLLAPSE3PIC);
CA_CacheGrChunk(BJCOLLAPSE4PIC);
VWB_Bar(0,0,320,200,VIEWCOLOR);
VWB_DrawPic (124,44,BJCOLLAPSE1PIC);
VW_UpdateScreen ();
VW_FadeIn ();
VW_WaitVBL(2*70);
VWB_DrawPic (124,44,BJCOLLAPSE2PIC);
VW_UpdateScreen ();
VW_WaitVBL(105);
VWB_DrawPic (124,44,BJCOLLAPSE3PIC);
VW_UpdateScreen ();
VW_WaitVBL(105);
VWB_DrawPic (124,44,BJCOLLAPSE4PIC);
VW_UpdateScreen ();
VW_WaitVBL(3*70);
UNCACHEGRCHUNK(BJCOLLAPSE1PIC);
UNCACHEGRCHUNK(BJCOLLAPSE2PIC);
UNCACHEGRCHUNK(BJCOLLAPSE3PIC);
UNCACHEGRCHUNK(BJCOLLAPSE4PIC);
VL_FadeOut (0,255,0,17,17,5);
#endif
StartCPMusic (URAHERO_MUS);
ClearSplitVWB ();
CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
CA_CacheGrChunk(STARTFONT);
#ifndef SPEAR
CA_CacheGrChunk(C_TIMECODEPIC);
#endif
VWB_Bar (0,0,320,200-STATUSLINES,0);//,0";modf
#ifdef JAPAN
#ifndef JAPDEMO
CA_CacheGrChunk(C_ENDRATIOSPIC);
VWB_DrawPic(0,0,C_ENDRATIOSPIC);
UNCACHEGRCHUNK(C_ENDRATIOSPIC);
#endif
#else
Write(18,2,STR_YOUWIN);
Write(TIMEX,TIMEY-2,STR_TOTALTIME);
Write(12,RATIOY-2,"averages");
#ifdef SPANISH
Write(RATIOX+2, RATIOY, STR_RATKILL);
Write(RATIOX+2, RATIOY+2, STR_RATSECRET);
Write(RATIOX+2, RATIOY+4,STR_RATTREASURE);
#else
Write(RATIOX+8,RATIOY, STR_RATKILL);
Write(RATIOX+4,RATIOY+2, STR_RATSECRET);
Write(RATIOX, RATIOY+4,STR_RATTREASURE);
#endif
#endif
#ifndefJAPDEMO
VWB_DrawPic (8,4,L_BJWINSPIC);
#endif
#ifndefSPEAR
for (kr = sr = tr = sec = i = 0;i 8;i++)
#else
for (kr = sr = tr = sec = i = 0;i 20;i++)
#endif
{
sec += LevelRatios[i].time;
kr += LevelRatios[i].kill;
sr += LevelRatios[i].secret;
tr += LevelRatios[i].treasure;
}
#ifndef SPEAR
kr /= 8;
sr /= 8;
tr /= 8;
#else
kr /= 14;
sr /= 14;
tr /= 14;
#endif
min = sec/60;
sec %= 60;
if (min > 99)
min = sec = 99;
i = TIMEX*8+1;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min/10));
i += 2*8;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min%10));
i += 2*8;
Write(i/8,TIMEY,":");
i += 1*8;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec/10));
i += 2*8;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec%10));
VW_UpdateScreen ();
itoa(kr,tempstr,10);
x=RATIOX+24-strlen(tempstr)*2;
Write(x,RATIOY,tempstr);
itoa(sr,tempstr,10);
x=RATIOX+24-strlen(tempstr)*2;
Write(x,RATIOY+2,tempstr);
itoa(tr,tempstr,10);
x=RATIOX+24-strlen(tempstr)*2;
Write(x,RATIOY+4,tempstr);
#ifndef SPANISH
#ifndef UPLOAD
#ifndef SPEAR
//
// TOTAL TIME VERIFICATION CODE
//
if (gamestate.difficulty>=gd_medium)
{
VWB_DrawPic (30*8,TIMEY*8,C_TIMECODEPIC);
fontnumber = 0;
fontcolor = READHCOLOR;
PrintX = 30*8-3;
PrintY = TIMEY*8+8;
PrintX+=4;
tempstr[0] = (((min/10)^(min%10))^0xa)+'A';
tempstr[1] = (((sec/10)^(sec%10))^0xa)+'A';
tempstr[2] = (tempstr[0]^tempstr[1])+'A';
tempstr[3] = 0;
US_Print(tempstr);
}
#endif
#endif
#endif
fontnumber = 1;
VW_UpdateScreen ();
VW_FadeIn ();
IN_Ack();
#ifndef SPEAR
if (Keyboard[sc_P] && MS_CheckParm("goobers"))
PicturePause();
#endif
VW_FadeOut ();
#ifndef SPEAR
UNCACHEGRCHUNK(C_TIMECODEPIC);
#endif
UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
#ifndef SPEAR
EndText();
#else
EndSpear();
#endif
#endif // SPEARDEMO
}
//==========================================================================
#ifndef JAPAN
/*
==================
=
= PG13
=
==================
*/
void PG13 (void)
{
VW_FadeOut();
VWB_Bar(0,0,320,200,0x0f);//,0";modf // background
CA_CacheGrChunk (PG13PIC);
VWB_DrawPic (216,110,PG13PIC);
VW_UpdateScreen ();
UNCACHEGRCHUNK (PG13PIC);
VW_FadeIn();
IN_UserInput(TickBase*7);
VW_FadeOut ();
}
#endif
//==========================================================================
void Write(int x,int y,char *string)
{
int alpha[]={L_NUM0PIC,L_NUM1PIC,L_NUM2PIC,L_NUM3PIC,L_NUM4PIC,L_NUM5PIC,
L_NUM6PIC,L_NUM7PIC,L_NUM8PIC,L_NUM9PIC,L_COLONPIC,0,0,0,0,0,0,L_APIC,L_BPIC,
L_CPIC,L_DPIC,L_EPIC,L_FPIC,L_GPIC,L_HPIC,L_IPIC,L_JPIC,L_KPIC,
L_LPIC,L_MPIC,L_NPIC,L_OPIC,L_PPIC,L_QPIC,L_RPIC,L_SPIC,L_TPIC,
L_UPIC,L_VPIC,L_WPIC,L_XPIC,L_YPIC,L_ZPIC};
int i,ox,nx,ny;
char ch;
ox=nx=x*8;
ny=y*8;
for (i=0;istrlen(string);i++)
if (string[i]=='\n')
{
nx=ox;
ny+=16;
}
else
{
ch=string[i];
if (ch>='a')
ch-=('a'-'A');
ch-='0';
switch(string[i])
{
case '!':
VWB_DrawPic(nx,ny,L_EXPOINTPIC);
nx+=8;
continue;
case '\'':
VWB_DrawPic(nx,ny,L_APOSTROPHEPIC);
nx+=8;
continue;
case ' ': break;
case 0x3a: // ':'
VWB_DrawPic(nx,ny,L_COLONPIC);
nx+=8;
continue;
case '%':
VWB_DrawPic(nx,ny,L_PERCENTPIC);
break;
default:
VWB_DrawPic(nx,ny,alpha[ch]);
}
nx+=16;
}
}
//
// Breathe Mr. BJ!!!
//
void BJ_Breathe(void)
{
static int which=0,max=10;
int pics[2]={L_GUYPIC,L_GUY2PIC};
if (TimeCount>max)
{
which^=1;
VWB_DrawPic(0,16,pics[which]);
VW_UpdateScreen();
TimeCount=0;
max=35;
}
}
/*
==================
=
= LevelCompleted
=
= Entered with the screen faded out
= Still in split screen mode with the status bar
=
= Exit with the screen faded out
=
==================
*/
#ifndef SPEAR
LRstruct LevelRatios[8];
#else
LRstruct LevelRatios[20];
#endif
void LevelCompleted (void)
{
#define VBLWAIT 30
#define PAR_AMOUNT 500
#define PERCENT100AMT 10000
typedef struct {
float time;
char timestr[6];
} times;
int x,i,min,sec,ratio,kr,sr,tr;
unsigned temp;
char tempstr[10];
long bonus,timeleft=0;
times parTimes[]=
{
#ifndef SPEAR
//
// Episode One Par Times
//
{1.5, "01:30"},
{2, "02:00"},
{2, "02:00"},
{3.5, "03:30"},
{3, "03:00"},
{3, "03:00"},
{2.5, "02:30"},
{2.5, "02:30"},
{0, "??:??"}, // Boss level
{0, "??:??"}, // Secret level
//
// Episode Two Par Times
//
{1.5, "01:30"},
{3.5, "03:30"},
{3, "03:00"},
{2, "02:00"},
{4, "04:00"},
{6, "06:00"},
{1, "01:00"},
{3, "03:00"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Three Par Times
//
{1.5, "01:30"},
{1.5, "01:30"},
{2.5, "02:30"},
{2.5, "02:30"},
{3.5, "03:30"},
{2.5, "02:30"},
{2, "02:00"},
{6, "06:00"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Four Par Times
//
{2, "02:00"},
{2, "02:00"},
{1.5, "01:30"},
{1, "01:00"},
{4.5, "04:30"},
{3.5, "03:30"},
{2, "02:00"},
{4.5, "04:30"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Five Par Times
//
{2.5, "02:30"},
{1.5, "01:30"},
{2.5, "02:30"},
{2.5, "02:30"},
{4, "04:00"},
{3, "03:00"},
{4.5, "04:30"},
{3.5, "03:30"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Six Par Times
//
{6.5, "06:30"},
{4, "04:00"},
{4.5, "04:30"},
{6, "06:00"},
{5, "05:00"},
{5.5, "05:30"},
{5.5, "05:30"},
{8.5, "08:30"},
{0, "??:??"},
{0, "??:??"}
#else
//
// SPEAR OF DESTINY TIMES
//
{1.5, "01:30"},
{3.5, "03:30"},
{2.75, "02:45"},
{3.5, "03:30"},
{0, "??:??"}, // Boss 1
{4.5, "04:30"},
{3.25, "03:15"},
{2.75, "02:45"},
{4.75, "04:45"},
{0, "??:??"}, // Boss 2
{6.5, "06:30"},
{4.5, "04:30"},
{2.75, "02:45"},
{4.5, "04:30"},
{6, "06:00"},
{0, "??:??"}, // Boss 3
{6, "06:00"},
{0, "??:??"}, // Boss 4
{0, "??:??"}, // Secret level 1
{0, "??:??"}, // Secret level 2
#endif
};
CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
ClearSplitVWB (); // set up for double buffering in split screen
VWB_Bar (0,0,320,200-STATUSLINES,0); 0XXXXXXXXXXXXX
StartCPMusic(ENDLEVEL_MUS);
//
// do the intermission
//
IN_ClearKeysDown();
IN_StartAck();
#ifdef JAPAN
CA_CacheGrChunk(C_INTERMISSIONPIC);
VWB_DrawPic(0,0,C_INTERMISSIONPIC);
UNCACHEGRCHUNK(C_INTERMISSIONPIC);
#endif
VWB_DrawPic(0,16,L_GUYPIC);
#ifndef SPEAR
if (mapon 8)
#else
if (mapon != 4 &&
mapon != 9 &&
mapon != 15 &&
mapon 17)
#endif
{
#ifndef JAPAN
#ifdef SPANISH
Write(14,2,"piso\ncompletado");
#else
Write(14,2,"floor\ncompleted");
#endif
Write(14,7,STR_BONUS" 0");
Write(16,10,STR_TIME);
Write(16,12,STR_PAR);
#ifdef SPANISH
Write(11,14, STR_RAT2KILL);
Write(11,16, STR_RAT2SECRET);
Write(11,18,STR_RAT2TREASURE);
#else
Write(9,14, STR_RAT2KILL);
Write(5,16, STR_RAT2SECRET);
Write(1,18,STR_RAT2TREASURE);
#endif
Write(26,2,itoa(gamestate.mapon+1,tempstr,10));
#endif
#ifdef SPANISH
Write(30,12,parTimes[gamestate.episode*10+mapon].timestr);
#else
Write(26,12,parTimes[gamestate.episode*10+mapon].timestr);
#endif
//
// PRINT TIME
//
sec=gamestate.TimeCount/70;
if (sec > 99*60) // 99 minutes max
sec = 99*60;
if (gamestate.TimeCount(parTimes[gamestate.episode*10+mapon].time*4200)
timeleft=(parTimes[gamestate.episode*10+mapon].time*4200)/70-sec;
min=sec/60;
sec%=60;
#ifdef SPANISH
i=30*8;
#else
i=26*8;
#endif
VWB_DrawPic(i,10*8,L_NUM0PIC+(min/10));
i+=2*8;
VWB_DrawPic(i,10*8,L_NUM0PIC+(min%10));
i+=2*8;
Write(i/8,10,":");
i+=1*8;
VWB_DrawPic(i,10*8,L_NUM0PIC+(sec/10));
i+=2*8;
VWB_DrawPic(i,10*8,L_NUM0PIC+(sec%10));
VW_UpdateScreen ();
VW_FadeIn ();
//
// FIGURE RATIOS OUT BEFOREHAND
//
kr = sr = tr = 0;
if (gamestate.killtotal)
kr=(gamestate.killcount*100)/gamestate.killtotal;
if (gamestate.secrettotal)
sr=(gamestate.secretcount*100)/gamestate.secrettotal;
if (gamestate.treasuretotal)
tr=(gamestate.treasurecount*100)/gamestate.treasuretotal;
//
// PRINT TIME BONUS
//
bonus=timeleft*PAR_AMOUNT;
if (bonus)
{
for (i=0;i=timeleft;i++)
{
ltoa((long)i*PAR_AMOUNT,tempstr,10);
x=36-strlen(tempstr)*2;
Write(x,7,tempstr);
if (!(i%(PAR_AMOUNT/10)))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
VW_UpdateScreen();
SD_PlaySound(ENDBONUS2SND);
while(SD_SoundPlaying())
BJ_Breathe();
}
#ifdef SPANISH
#define RATIOXX 33
#else
#define RATIOXX 37
#endif
//
// KILL RATIO
//
ratio=kr;
for (i=0;i=ratio;i++)
{
itoa(i,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,14,tempstr);
if (!(i%10))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen ();
while(SD_SoundPlaying())
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
if (ratio==100)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
bonus+=PERCENT100AMT;
ltoa(bonus,tempstr,10);
x=(RATIOXX-1)-strlen(tempstr)*2;
Write(x,7,tempstr);
VW_UpdateScreen();
SD_PlaySound(PERCENT100SND);
}
else
if (!ratio)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
SD_PlaySound(NOBONUSSND);
}
else
SD_PlaySound(ENDBONUS2SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
//
// SECRET RATIO
//
ratio=sr;
for (i=0;i=ratio;i++)
{
itoa(i,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,16,tempstr);
if (!(i%10))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen ();
while(SD_SoundPlaying())
BJ_Breathe();
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
if (ratio==100)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
bonus+=PERCENT100AMT;
ltoa(bonus,tempstr,10);
x=(RATIOXX-1)-strlen(tempstr)*2;
Write(x,7,tempstr);
VW_UpdateScreen();
SD_PlaySound(PERCENT100SND);
}
else
if (!ratio)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
SD_PlaySound(NOBONUSSND);
}
else
SD_PlaySound(ENDBONUS2SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
//
// TREASURE RATIO
//
ratio=tr;
for (i=0;i=ratio;i++)
{
itoa(i,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,18,tempstr);
if (!(i%10))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen ();
while(SD_SoundPlaying())
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
if (ratio==100)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
bonus+=PERCENT100AMT;
ltoa(bonus,tempstr,10);
x=(RATIOXX-1)-strlen(tempstr)*2;
Write(x,7,tempstr);
VW_UpdateScreen();
SD_PlaySound(PERCENT100SND);
}
else
if (!ratio)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
SD_PlaySound(NOBONUSSND);
}
else
SD_PlaySound(ENDBONUS2SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();