/* ESEQ_EP2.C Ending sequence for Episode 2. */ #include "keen.h" #include "include/game.h" #include "include/gamedo.h" #include "include/gamepdo.h" #include "sdl/CTimer.h" #include "sdl/CInput.h" #include "sdl/sound/CSound.h" #include "include/eseq_ep2.h" #include "include/eseq_ep1.h" #include "include/menu.h" #include "include/enemyai.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 stShipQueue shipqueue[32]; int ShipQueuePtr; #define LETTER_SHOW_SPD 30 // start x,y map scroll position for eseq2_TantalusRay() #define TANTALUS_X 0 #define TANTALUS_Y 0 #define TANTALUS_SPD_X 21 #define TANTALUS_SPD_Y 9 #define TANTALUS_SPRITE 58 #define TAN_DELAY_BEFORE_FIRE 500 #define TAN_STATE_WAITBEFOREFIRE 0 #define TAN_STATE_FIRING 1 #define TAN_STATE_EARTH_EXPLODING 2 #define TAN_STATE_CHUNKS_FLYING 3 #define TAN_STATE_GAMEOVER 4 #define EARTHCHUNK_BIG_UP 64 #define EARTHCHUNK_BIG_DN 66 #define EARTHCHUNK_SMALL_UP 68 #define EARTHCHUNK_SMALL_DN 70 int eseq2_TantalusRay(stCloneKeenPlus *pCKP) { char enter,lastenterstate; int x, y, t, o, i; int tantalus_animframe, tantalus_animtimer=0; int state, timer, spawnedcount=0; o=0; fade.mode = FADE_GO; fade.rate = FADE_NORM; fade.dir = FADE_OUT; fade.curamt = PAL_FADE_SHADES; fade.fadetimer = 0; do { gamedo_fades(); g_pInput->pollEvents(); g_pTimer->SpeedThrottle(); } while(fade.mode!=FADE_COMPLETE); pCKP->Control.levelcontrol.dark = 0; g_pGraphics->initPalette(pCKP->Control.levelcontrol.dark); initgame(pCKP); state = TAN_STATE_WAITBEFOREFIRE; showmapatpos(81,TANTALUS_X, TANTALUS_Y, 0, pCKP); AllPlayersInvisible(); numplayers = 1; player[0].hideplayer = 0; objects[player[0].useObject].onscreen = 1; // place the player (which is actually the tantalus ray) at the mouth // of the vorticon mothership if (map_findtile(593, &x, &y)) { // found the tile player[0].x = ((x<<4)-1)< TAN_DELAY_BEFORE_FIRE) { g_pSound->playStereofromCoord(SOUND_KEEN_FIRE, PLAY_NOW, objects[o].scrx); state = TAN_STATE_FIRING; timer = 0; } else timer++; break; case TAN_STATE_FIRING: if (tantalus_animtimer>5) { tantalus_animframe ^= 1; player[0].playframe = TANTALUS_SPRITE + tantalus_animframe; } else tantalus_animtimer++; player[0].x += TANTALUS_SPD_X; player[0].y += TANTALUS_SPD_Y; t = getmaptileat((player[0].x>>CSF)+(sprites[TANTALUS_SPRITE].xsize/2), (player[0].y>>CSF)+(sprites[TANTALUS_SPRITE].ysize/2)); if (t==586) { // hit center of earth state = TAN_STATE_EARTH_EXPLODING; player[0].playframe = BlankSprite; timer = 0; spawnedcount = 0; srand(300); o = spawn_object(player[0].x+(24<playSound(SOUND_EARTHPOW, PLAY_NOW); } break; case TAN_STATE_EARTH_EXPLODING: if (!timer) { if (spawnedcount<16) o = spawn_object(player[0].x+((rand()%32)< 4) { objects[o].sprite = EARTHCHUNK_SMALL_DN; } else { objects[o].sprite = EARTHCHUNK_SMALL_UP; } } break; case 6: o = spawn_object(player[0].x+(16<playSound(SOUND_GAME_OVER, PLAY_NOW); SetGameOver(pCKP); break; } spawnedcount++; timer = 60; } else timer--; break; case TAN_STATE_GAMEOVER: break; } if (fade.dir==FADE_OUT && fade.mode==FADE_COMPLETE) { // we're done return 0; } enter = (g_pInput->getPressedCommand(KENTER) || g_pInput->getPressedCommand(KCTRL) || g_pInput->getPressedCommand(KALT) ); if (enter && state==TAN_STATE_GAMEOVER) { if (fade.dir!=FADE_OUT) { fade.dir = FADE_OUT; fade.curamt = PAL_FADE_SHADES; fade.fadetimer = 0; fade.rate = FADE_NORM; fade.mode = FADE_GO; } } lastenterstate = enter; gamedo_fades(); if (state!=TAN_STATE_GAMEOVER) gamedo_AnimatedTiles(); gamedo_frameskipping(pCKP); gamedo_enemyai(pCKP); if(((player[0].x>>CSF)-scroll_x) > 160-16) map_scroll_right(); if (((player[0].y>>CSF)-scroll_y) > 100) { map_scroll_down(); } g_pInput->pollEvents(); g_pTimer->SpeedThrottle(); } while(!g_pInput->getPressedCommand(KQUIT)); return 1; } void eseq2_vibrate(stCloneKeenPlus *pCKP) { int xamt, yamt; int xdir, ydir; int vibratetimes; //int enter,lastenterstate; int i; int x,y,w,h; vibratetimes = 0; #define VIBRATE_AMT 16 #define VIBRATE_NUM_FRAMES 500 xamt = yamt = 0; xdir = 0; ydir = 0; do { // undo the scroll from last time if (!xdir) { for(i=0;i>CSF)-scroll_x; objects[i].scry = (objects[i].y>>CSF)-scroll_y; } } // show the frame gamedo_frameskipping(pCKP); vibratetimes++; g_pInput->pollEvents(); g_pTimer->SpeedThrottle(); } while(!g_pInput->getPressedCommand(KQUIT) && vibratetimes < VIBRATE_NUM_FRAMES); // display the "uh-oh." x = GetStringAttribute("EP2_AfterVibrateString", "LEFT"); y = GetStringAttribute("EP2_AfterVibrateString", "TOP"); w = GetStringAttribute("EP2_AfterVibrateString", "WIDTH"); h = GetStringAttribute("EP2_AfterVibrateString", "HEIGHT"); eseq_showmsg(getstring("EP2_AfterVibrateString"),x,y,w,h,1, pCKP); } #define HEADFOREARTH_X 0 #define HEADFOREARTH_Y 0 #define HEADFOREARTH_WAIT_TIME 600 #define SPR_SHIP_RIGHT_EP2 132 #define SPR_SHIP_LEFT_EP2 133 #define SPR_VORTICON_MOTHERSHIP 72 #define HEADSFOREARTH_X 3 #define HEADSFOREARTH_Y 15 #define HEADSFOREARTH_W 33 #define HEADSFOREARTH_H 8 void eseq_showmsg(const std::string& text, int boxleft, int boxtop, int boxwidth, int boxheight, char autodismiss, stCloneKeenPlus *pCKP) { //int draw; //int i; std::string tempbuf; char textline, showtimer; unsigned int amountshown; int waittimer; int cancel, lastcancelstate; textline = 0; amountshown = 0; showtimer = 0; lastcancelstate = 1; waittimer = 0; do { gamedo_fades(); gamedo_AnimatedTiles(); gamedo_render_drawobjects(pCKP); cancel = (g_pInput->getPressedCommand(KENTER) || g_pInput->getPressedCommand(KCTRL) || g_pInput->getPressedCommand(KALT)); // draw the text up to the amount currently shown tempbuf = text; tempbuf.erase(amountshown); sb_dialogbox(boxleft,boxtop,boxwidth,boxheight); g_pGraphics->sb_font_draw( tempbuf, (boxleft+1)*8, (boxtop+1+textline)*8); gamedo_frameskipping_blitonly(); gamedo_render_eraseobjects(); if (showtimer > LETTER_SHOW_SPD) { // it's time to show a new letter if (amountshown < text.size()) { amountshown++; } showtimer = 0; } else showtimer++; // user pressed enter or some other key if (cancel && !lastcancelstate) { if (amountshown < text.size()) { amountshown = text.size(); } else return; } // when all text is shown wait a sec then return if (autodismiss) { if (amountshown >= text.size()) { if (waittimer > HEADFOREARTH_WAIT_TIME) return; waittimer++; } } lastcancelstate = cancel; g_pInput->pollEvents(); g_pTimer->SpeedThrottle(); } while(!g_pInput->getPressedCommand(KQUIT)); return; } int eseq2_HeadsForEarth(stCloneKeenPlus *pCKP) { char enter,lastenterstate; int x, y; int downtimer; int afterfadewaittimer; initgame(pCKP); // set up the ship's route ShipQueuePtr = 0; addshipqueue(CMD_WAIT, 10, 0); addshipqueue(CMD_MOVE, 2360, DDOWNRIGHT); addshipqueue(CMD_FADEOUT, 0, 0); showmapatpos(81, HEADFOREARTH_X, HEADFOREARTH_Y, 0, pCKP); numplayers = 1; // place the player near the vorticon mothership if (map_findtile(593, &x, &y)) { player[0].x = ((x<<4)+2)< 6) { player[0].y++; downtimer = 0; } else downtimer++; 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.rate = FADE_NORM; fade.mode = FADE_GO; } 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) { if (afterfadewaittimer > 80) { return 0; } else afterfadewaittimer++; } enter = (g_pInput->getPressedCommand(KENTER)||g_pInput->getPressedCommand(KCTRL)||g_pInput->getPressedCommand(KALT)); if (enter && !lastenterstate) { if (fade.dir!=FADE_OUT) { fade.dir = FADE_OUT; fade.curamt = PAL_FADE_SHADES; fade.fadetimer = 0; fade.rate = FADE_NORM; fade.mode = FADE_GO; } } lastenterstate = enter; gamedo_fades(); gamedo_AnimatedTiles(); gamedo_frameskipping(pCKP); gamedo_ScrollTriggers(0); g_pInput->pollEvents(); g_pTimer->SpeedThrottle(); } while(!g_pInput->getPressedCommand(KQUIT)); return 1; } #define LIMPSHOME_X 0 #define LIMPSHOME_Y 344 int eseq2_LimpsHome(stCloneKeenPlus *pCKP) { char enter,lastenterstate; //int x, y; int downtimer; int afterfadewaittimer = 0; initgame(pCKP); // set up the ship's route ShipQueuePtr = 0; addshipqueue(CMD_WAIT, 10, 0); addshipqueue(CMD_MOVE, 1600, DUPLEFT); addshipqueue(CMD_FADEOUT, 0, 0); showmapatpos(81, LIMPSHOME_X, LIMPSHOME_Y, 0, pCKP); numplayers = 1; player[0].x = (10 <<4< 80) { return 0; } else afterfadewaittimer++; } enter = (g_pInput->getPressedCommand(KENTER)||g_pInput->getPressedCommand(KCTRL)||g_pInput->getPressedCommand(KALT)); if (enter && !lastenterstate) { if (fade.dir!=FADE_OUT) { fade.dir = FADE_OUT; fade.curamt = PAL_FADE_SHADES; fade.fadetimer = 0; fade.rate = FADE_NORM; fade.mode = FADE_GO; } } lastenterstate = enter; gamedo_fades(); gamedo_AnimatedTiles(); gamedo_frameskipping(pCKP); g_pInput->pollEvents(); g_pTimer->SpeedThrottle(); } while(!g_pInput->getPressedCommand(KQUIT)); return 1; } int eseq2_SnowedOutside(stCloneKeenPlus *pCKP) { int curpage; int lastpage; std::string tempstr; std::string text; //int enter, lastenterstate; int dlgX, dlgY, dlgW, dlgH; scrollx_buf = scroll_x = 0; scrolly_buf = scroll_y = 0; finale_draw("finale.ck2", pCKP->GameData[pCKP->Resources.GameSelected-1].DataDirectory); curpage = 1; fade.mode = FADE_GO; fade.rate = FADE_NORM; fade.dir = FADE_IN; fade.curamt = 0; fade.fadetimer = 0; numplayers = 1; player[0].x = player[0].y = 0; player[0].playframe = BlankSprite; do { tempstr = "EP2_ESEQ_PART3_PAGE" + itoa(curpage); text = getstring(tempstr); dlgX = GetStringAttribute(tempstr, "LEFT"); dlgY = GetStringAttribute(tempstr, "TOP"); dlgW = GetStringAttribute(tempstr, "WIDTH"); dlgH = GetStringAttribute(tempstr, "HEIGHT"); lastpage = GetStringAttribute(tempstr, "LASTPAGE"); eseq_showmsg(text, dlgX, dlgY, dlgW, dlgH, 1, pCKP); if (lastpage==1) break; curpage++; } while(!g_pInput->getPressedCommand(KQUIT)); finale_draw("finale.ck2", pCKP->GameData[pCKP->Resources.GameSelected-1].DataDirectory); eseq_ToBeContinued(pCKP); return 0; }