git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@107 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
444 lines
12 KiB
C++
444 lines
12 KiB
C++
/* ESEQ_EP1.C
|
|
Ending sequence for Episode 1.
|
|
*/
|
|
|
|
#include "keen.h"
|
|
#include "include/game.h"
|
|
#include "include/gamedo.h"
|
|
#include "include/gamepdo.h"
|
|
#include "sdl/CInput.h"
|
|
#include "sdl/CTimer.h"
|
|
#include "include/eseq_ep1.h"
|
|
#include "include/eseq_ep2.h"
|
|
#include "include/menu.h"
|
|
#include "CGraphics.h"
|
|
#include "StringUtils.h"
|
|
|
|
#define CMD_MOVE 0
|
|
#define CMD_WAIT 1
|
|
#define CMD_SPAWNSPR 2
|
|
#define CMD_REMOVESPR 3
|
|
#define CMD_FADEOUT 4
|
|
#define CMD_ENDOFQUEUE 5
|
|
#define CMD_ENABLESCROLLING 6
|
|
#define CMD_DISABLESCROLLING 7
|
|
|
|
|
|
// start x,y map scroll position for eseq1_ShipFlys()
|
|
#define SHIPFLY_X 32
|
|
#define SHIPFLY_Y 0
|
|
|
|
// worldmap scroll position for eseq1_ReturnsToShip()
|
|
#define WM_X 40
|
|
#define WM_Y 540
|
|
|
|
#define LETTER_SHOW_SPD 30
|
|
#define RETURNTOSHIP_WAIT_TIME 600
|
|
|
|
#define SPR_SHIP_RIGHT 115
|
|
#define SPR_SHIP_LEFT 116
|
|
#define SPR_EXCLAMATION 117
|
|
#define SPR_QUESTION 118
|
|
#define SHIPSPD 4
|
|
|
|
#define BACKHOME_SHORT_WAIT_TIME 250
|
|
|
|
int eseq1_ReturnsToShip(stCloneKeenPlus *pCKP)
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<MAX_LEVELS;i++)
|
|
pCKP->Control.levelcontrol.levels_completed[i] = 0;
|
|
|
|
showmapatpos(80, WM_X, WM_Y, 0, pCKP);
|
|
|
|
// draw keen next to his ship
|
|
g_pGraphics->drawSprite(168, 85, PMAPLEFTFRAME, 0);
|
|
// do not show player when we render the screen
|
|
numplayers = 1;
|
|
player[0].x = 0;
|
|
player[0].y = 0;
|
|
player[0].playframe = BlankSprite;
|
|
// all objects -> nonexistant
|
|
for(i=0;i<MAX_OBJECTS;i++) objects[i].exists = 0;
|
|
|
|
fade.mode = FADE_GO;
|
|
fade.dir = FADE_IN;
|
|
fade.curamt = 0;
|
|
fade.fadetimer = 0;
|
|
fade.rate = FADE_NORM;
|
|
|
|
eseq_showmsg(getstring("EP1_ESEQ_PART1"),1,18,37,6,1, pCKP);
|
|
|
|
// fade out
|
|
fade.mode = FADE_GO;
|
|
fade.dir = FADE_OUT;
|
|
fade.curamt = PAL_FADE_SHADES;
|
|
fade.fadetimer = 0;
|
|
fade.rate = FADE_NORM;
|
|
do
|
|
{
|
|
gamedo_fades();
|
|
gamedo_AnimatedTiles();
|
|
|
|
g_pInput->pollEvents();
|
|
g_pTimer->SpeedThrottle();
|
|
} while(fade.mode != FADE_COMPLETE && !g_pInput->getPressedKey(KQUIT));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void addshipqueue(int cmd, int time, int flag1)
|
|
{
|
|
shipqueue[ShipQueuePtr].cmd = cmd;
|
|
shipqueue[ShipQueuePtr].time = time;
|
|
shipqueue[ShipQueuePtr].flag1 = flag1;
|
|
ShipQueuePtr++;
|
|
}
|
|
|
|
int eseq1_ShipFlys(stCloneKeenPlus *pCKP)
|
|
{
|
|
char enter,lastenterstate;
|
|
int x, y;
|
|
int scrollingon;
|
|
|
|
scrollingon = 1;
|
|
|
|
#define MARK_SPR_NUM 5
|
|
initgame(pCKP);
|
|
|
|
// set up the ship's route
|
|
ShipQueuePtr = 0;
|
|
addshipqueue(CMD_MOVE, 230, DUP);
|
|
addshipqueue(CMD_WAIT, 50, 0);
|
|
addshipqueue(CMD_MOVE, 2690, DDOWNRIGHT);
|
|
addshipqueue(CMD_WAIT, 100, 0);
|
|
addshipqueue(CMD_MOVE, 480, DDOWN);
|
|
addshipqueue(CMD_WAIT, 150, 0);
|
|
addshipqueue(CMD_SPAWNSPR, 0, SPR_QUESTION);
|
|
addshipqueue(CMD_DISABLESCROLLING, 0, 0);
|
|
addshipqueue(CMD_WAIT, 350, 0);
|
|
addshipqueue(CMD_REMOVESPR, 0, 0);
|
|
addshipqueue(CMD_WAIT, 50, 0);
|
|
addshipqueue(CMD_MOVE, 700, DLEFT);
|
|
addshipqueue(CMD_WAIT, 150, 0);
|
|
addshipqueue(CMD_SPAWNSPR, 0, SPR_EXCLAMATION);
|
|
addshipqueue(CMD_WAIT, 500, 0);
|
|
addshipqueue(CMD_REMOVESPR, 0, 0);
|
|
addshipqueue(CMD_WAIT, 50, 0);
|
|
addshipqueue(CMD_MOVE, 700, DRIGHT);
|
|
addshipqueue(CMD_WAIT, 25, 0);
|
|
addshipqueue(CMD_ENABLESCROLLING, 0, 0);
|
|
addshipqueue(CMD_MOVE, 465, DDOWN);
|
|
addshipqueue(CMD_FADEOUT, 0, 0);
|
|
addshipqueue(CMD_MOVE, 100, DDOWN);
|
|
addshipqueue(CMD_ENDOFQUEUE, 0, 0);
|
|
|
|
showmapatpos(81, SHIPFLY_X, SHIPFLY_Y, 0, pCKP);
|
|
|
|
objects[MARK_SPR_NUM].type = OBJ_YORP; // doesn't matter
|
|
objects[MARK_SPR_NUM].exists = 0;
|
|
objects[MARK_SPR_NUM].sprite = SPR_QUESTION;
|
|
|
|
numplayers = 1;
|
|
// place the player at the center of mars
|
|
if (map_findtile(593, &x, &y))
|
|
{ // found the tile at the center of mars
|
|
player[0].x = ((x<<4)+1)<<CSF;
|
|
player[0].y = ((y<<4)-3)<<CSF;
|
|
}
|
|
else
|
|
{
|
|
crashflag = 1;
|
|
why_term_ptr = "eseq1_shipflys(): unable to find center of Mars.";
|
|
return 1;
|
|
}
|
|
|
|
player[0].playframe = SPR_SHIP_RIGHT;
|
|
// player[0].pbgprioritycorners = 0;
|
|
|
|
fade.mode = FADE_GO;
|
|
fade.dir = FADE_IN;
|
|
fade.curamt = 0;
|
|
fade.fadetimer = 0;
|
|
fade.rate = FADE_NORM;
|
|
ShipQueuePtr = 0;
|
|
max_scroll_x = max_scroll_y = 20000;
|
|
do
|
|
{
|
|
// keep the question or exclamation mark sprite next to the player
|
|
objects[MARK_SPR_NUM].x = player[0].x + (20<<CSF);
|
|
objects[MARK_SPR_NUM].y = player[0].y - (10<<CSF);
|
|
objects[MARK_SPR_NUM].onscreen = 1;
|
|
// objects[MARK_SPR_NUM].priorityptsfound = 0;
|
|
// objects[MARK_SPR_NUM].priorityptschecked = 4;
|
|
objects[MARK_SPR_NUM].scrx = (objects[MARK_SPR_NUM].x>>CSF)-scroll_x;
|
|
objects[MARK_SPR_NUM].scry = (objects[MARK_SPR_NUM].y>>CSF)-scroll_y;
|
|
|
|
// execute the current command in the queue
|
|
if (fade.dir != FADE_OUT)
|
|
{
|
|
switch(shipqueue[ShipQueuePtr].cmd)
|
|
{
|
|
case CMD_MOVE:
|
|
switch(shipqueue[ShipQueuePtr].flag1)
|
|
{
|
|
case DUP:
|
|
player[0].y-=SHIPSPD;
|
|
player[0].playframe = SPR_SHIP_RIGHT;
|
|
break;
|
|
case DDOWN:
|
|
player[0].y+=SHIPSPD/2;
|
|
player[0].playframe = SPR_SHIP_RIGHT;
|
|
break;
|
|
case DLEFT:
|
|
player[0].x-=SHIPSPD;
|
|
player[0].playframe = SPR_SHIP_LEFT;
|
|
break;
|
|
case DRIGHT:
|
|
player[0].x+=SHIPSPD;
|
|
player[0].playframe = SPR_SHIP_RIGHT;
|
|
break;
|
|
case DDOWNRIGHT:
|
|
player[0].x+=SHIPSPD*2;
|
|
player[0].y+=SHIPSPD*0.8;
|
|
player[0].playframe = SPR_SHIP_RIGHT;
|
|
break;
|
|
}
|
|
break;
|
|
case CMD_SPAWNSPR:
|
|
objects[MARK_SPR_NUM].sprite = shipqueue[ShipQueuePtr].flag1;
|
|
objects[MARK_SPR_NUM].exists = 1;
|
|
break;
|
|
case CMD_REMOVESPR:
|
|
objects[MARK_SPR_NUM].sprite = shipqueue[ShipQueuePtr].flag1;
|
|
objects[MARK_SPR_NUM].exists = 0;
|
|
break;
|
|
case CMD_ENABLESCROLLING:
|
|
scrollingon = 1;
|
|
break;
|
|
case CMD_DISABLESCROLLING:
|
|
scrollingon = 0;
|
|
break;
|
|
case CMD_WAIT:
|
|
break;
|
|
case CMD_FADEOUT:
|
|
if (fade.dir!=FADE_OUT)
|
|
{
|
|
fade.dir = FADE_OUT;
|
|
fade.curamt = PAL_FADE_SHADES;
|
|
fade.fadetimer = 0;
|
|
fade.mode = FADE_GO;
|
|
fade.rate = FADE_NORM;
|
|
}
|
|
break;
|
|
default: break;
|
|
}
|
|
// decrease the time remaining
|
|
if (shipqueue[ShipQueuePtr].time)
|
|
{
|
|
shipqueue[ShipQueuePtr].time--;
|
|
}
|
|
else
|
|
{ // no time left on this command, go to next cmd
|
|
ShipQueuePtr++;
|
|
}
|
|
}
|
|
|
|
if (fade.dir==FADE_OUT && fade.mode==FADE_COMPLETE)
|
|
{ // we're done
|
|
return 0;
|
|
}
|
|
|
|
enter = ( g_pInput->getPressedKey(KENTER) || g_pInput->getPressedKey(KCTRL) || g_pInput->getPressedKey(KALT) );
|
|
if (enter)
|
|
{
|
|
if (fade.dir!=FADE_OUT)
|
|
{
|
|
fade.dir = FADE_OUT;
|
|
fade.curamt = PAL_FADE_SHADES;
|
|
fade.fadetimer = 0;
|
|
fade.mode = FADE_GO;
|
|
fade.rate = FADE_NORM;
|
|
}
|
|
}
|
|
lastenterstate = enter;
|
|
|
|
gamedo_fades();
|
|
gamedo_AnimatedTiles();
|
|
|
|
gamedo_frameskipping(pCKP);
|
|
if (scrollingon) gamedo_ScrollTriggers(0);
|
|
|
|
g_pInput->pollEvents();
|
|
g_pTimer->SpeedThrottle();
|
|
} while(!g_pInput->getPressedKey(KQUIT));
|
|
return 1;
|
|
}
|
|
|
|
int eseq1_BackAtHome(stCloneKeenPlus *pCKP)
|
|
{
|
|
/*int draw;*/
|
|
int i;
|
|
std::string text[10];
|
|
std::string strname;
|
|
std::string tempbuf;
|
|
short textline, showtimer;
|
|
unsigned short amountshown;
|
|
signed int waittimer;
|
|
int state;
|
|
int enter, lastenterstate;
|
|
int dlgX, dlgY, dlgW, dlgH;
|
|
|
|
#define STATE_TEXTAPPEARING 0
|
|
#define STATE_WAITASEC 1
|
|
#define STATE_FADING 2
|
|
|
|
// get pointers to all the strings we're going to be using
|
|
for(i=0;i<8;i++)
|
|
{
|
|
strname = "EP1_ESEQ_PART2_PAGE" + itoa(i+1);
|
|
text[i] = getstring(strname);
|
|
}
|
|
|
|
textline = 0;
|
|
amountshown = 0;
|
|
showtimer = 0;
|
|
state = STATE_TEXTAPPEARING;
|
|
lastenterstate = 1;
|
|
waittimer = 0;
|
|
|
|
finale_draw("finale.ck1", pCKP->GameData[pCKP->Resources.GameSelected-1].DataDirectory);
|
|
scrollx_buf = scroll_x = 0;
|
|
scrolly_buf = scroll_y = 0;
|
|
|
|
numplayers = 1;
|
|
player[0].x = 16;
|
|
player[0].y = 16;
|
|
player[0].playframe = BlankSprite;
|
|
|
|
dlgX = GetStringAttribute("EP1_ESEQ_PART2_PAGE1", "LEFT");
|
|
dlgY = GetStringAttribute("EP1_ESEQ_PART2_PAGE1", "TOP");
|
|
dlgW = GetStringAttribute("EP1_ESEQ_PART2_PAGE1", "WIDTH");
|
|
dlgH = GetStringAttribute("EP1_ESEQ_PART2_PAGE1", "HEIGHT");
|
|
|
|
fade.mode = FADE_GO;
|
|
fade.rate = FADE_NORM;
|
|
fade.dir = FADE_IN;
|
|
fade.curamt = 0;
|
|
fade.fadetimer = 0;
|
|
do
|
|
{
|
|
enter = ( g_pInput->getPressedKey(KENTER) || g_pInput->getPressedKey(KCTRL) || g_pInput->getPressedKey(KALT) );
|
|
|
|
sb_dialogbox(dlgX, dlgY, dlgW, dlgH);
|
|
|
|
// draw the current text line up to the amount currently shown
|
|
tempbuf = text[textline];
|
|
tempbuf.erase(amountshown);
|
|
g_pGraphics->sb_font_draw( tempbuf, (dlgX+1)*8, (dlgY+1)*8);
|
|
|
|
if (state==STATE_TEXTAPPEARING)
|
|
{
|
|
if (enter) goto fullshow;
|
|
if (showtimer > LETTER_SHOW_SPD)
|
|
{ // it's time to show a new letter
|
|
amountshown++;
|
|
if (amountshown > text[textline].size())
|
|
{ // reached end of line
|
|
state = STATE_WAITASEC;
|
|
// if (textline==8)
|
|
// waittimer = -BACKHOME_SHORT_WAIT_TIME*3;
|
|
// else
|
|
waittimer = -BACKHOME_SHORT_WAIT_TIME*2;
|
|
}
|
|
// if the last letter shown is a dash/cr ('Billy...are you a-'),
|
|
// show the rest of the text immediately
|
|
// (for when the mom shouts "WHAT IS THIS ONE-EYED GREEN THING..."
|
|
if (text[textline][amountshown]==13 && \
|
|
text[textline][amountshown-1]=='-')
|
|
{
|
|
fullshow: ;
|
|
amountshown = text[textline].size();
|
|
state = STATE_WAITASEC;
|
|
waittimer = -BACKHOME_SHORT_WAIT_TIME*3;
|
|
}
|
|
showtimer = 0;
|
|
} else showtimer++;
|
|
|
|
// user pressed enter
|
|
if (enter)
|
|
{ // show all text immediately
|
|
|
|
}
|
|
}
|
|
else if (state==STATE_WAITASEC)
|
|
{
|
|
if (enter) goto nextline;
|
|
if (waittimer<BACKHOME_SHORT_WAIT_TIME)
|
|
{
|
|
waittimer++;
|
|
if (waittimer==BACKHOME_SHORT_WAIT_TIME)
|
|
{
|
|
nextline: ;
|
|
textline++;
|
|
state = STATE_TEXTAPPEARING;
|
|
amountshown = 0;
|
|
if (textline>7)
|
|
{ // end of text
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (fade.dir==FADE_OUT && fade.mode==FADE_COMPLETE)
|
|
return 0;
|
|
|
|
gamedo_fades();
|
|
gamedo_frameskipping_blitonly();
|
|
|
|
lastenterstate = enter;
|
|
|
|
g_pInput->pollEvents();
|
|
g_pTimer->SpeedThrottle();
|
|
if (g_pInput->getPressedKey(KQUIT)) return 1;
|
|
} while(1);
|
|
|
|
finale_draw("finale.ck1", pCKP->GameData[pCKP->Resources.GameSelected-1].DataDirectory);
|
|
eseq_ToBeContinued(pCKP);
|
|
return 1;
|
|
}
|
|
|
|
void eseq_ToBeContinued(stCloneKeenPlus *pCKP)
|
|
{
|
|
int i;
|
|
std::string text;
|
|
int dlgX, dlgY, dlgW, dlgH;
|
|
|
|
// remove all objects because eseq_showmsg will call drawobjects
|
|
for(i=0;i<MAX_OBJECTS;i++)
|
|
objects[i].exists = 0;
|
|
|
|
text = getstring("TO_BE_CONTINUED");
|
|
dlgX = GetStringAttribute("TO_BE_CONTINUED", "LEFT");
|
|
dlgY = GetStringAttribute("TO_BE_CONTINUED", "TOP");
|
|
dlgW = GetStringAttribute("TO_BE_CONTINUED", "WIDTH");
|
|
dlgH = GetStringAttribute("TO_BE_CONTINUED", "HEIGHT");
|
|
eseq_showmsg(text, dlgX, dlgY, dlgW, dlgH, 0, pCKP);
|
|
|
|
fade.dir = FADE_OUT;
|
|
fade.curamt = PAL_FADE_SHADES;
|
|
fade.fadetimer = 0;
|
|
fade.rate = FADE_NORM;
|
|
fade.mode = FADE_GO;
|
|
do
|
|
{
|
|
gamedo_fades();
|
|
if (g_pInput->getPressedKey(KQUIT)) return;
|
|
g_pInput->pollEvents();
|
|
g_pTimer->SpeedThrottle();
|
|
} while(fade.mode == FADE_GO);
|
|
}
|