Source code is a bit clearer and cleaner now. removed more useless stuff

git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@215 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
This commit is contained in:
gerstrong
2009-08-08 16:38:27 +00:00
parent 3ab713f7c5
commit e383b31151
19 changed files with 100 additions and 153 deletions

View File

@@ -1,5 +1,13 @@
Commander Genius Pre-Release v0.3 (CloneKeenPlus):
--------------------------------------------------
--------------------------------------------------
08-08-2009
- Special key items can only be taken once. Even replaying the levels
- Now levels can be exited without doing something before through the exit door. Be careful ;-)
- Vorticon Commander in Ep1 now dies with 105 shots.
- Improved consistency of the program
- Improved Enemys AI
05-08-2009
- fixed crash when game in EP1 or 2 was ending
- fixed fonts problems in story section.

View File

@@ -287,8 +287,6 @@ void CGame::preallocateCKP(stCloneKeenPlus *pCKP)
pCKP->GameData = NULL;
pCKP->GameData = new stGameData[1];
framebyframe = 0;
pCKP->Control.levelcontrol.demomode = DEMO_NODEMO;
current_demo = 1;

View File

@@ -494,7 +494,6 @@ void CGraphics::fadePalette(int fadeamt)
{
int c;
int r,g,b;
if (framebyframe) fadeamt = PAL_FADE_SHADES;
for(c=0;c<17;c++)
{

View File

@@ -51,7 +51,7 @@ typedef struct stVortData
unsigned int dist_traveled;
signed int inertiay;
char ep1style; // episode 1 style four-shots-to-kill
char hp; // episode 1 style four-shots-to-kill
unsigned char movedir;
// these hold the animation frames indexes since they're

View File

@@ -44,11 +44,17 @@ int bonk,kill;
objects[o].canbezapped = 1;
objects[o].needinit = 0;
if (p_levelcontrol->hardmode)
// give him some health points, depening on episode and level
if(p_levelcontrol->episode == 1)
{
objects[o].ai.vort.ep1style = 1;
if(p_levelcontrol->curlevel == 16) // He is the vorticon commander and has much more HP
objects[o].ai.vort.hp = 105;
else
objects[o].ai.vort.hp = 4;
}
else objects[o].ai.vort.ep1style = 0;
else
objects[o].ai.vort.hp = (p_levelcontrol->hardmode) ? 4 : 1;
// In EP2 and 3 the Vorticons are much weaker, when no hardmode selected
// copy in animation frame indexes for the current ep
if (p_levelcontrol->episode==1)
@@ -59,7 +65,6 @@ int bonk,kill;
objects[o].ai.vort.JumpRightFrame = VORT1_JUMP_RIGHT_FRAME;
objects[o].ai.vort.JumpLeftFrame = VORT1_JUMP_LEFT_FRAME;
objects[o].ai.vort.DyingFrame = VORT1_DYING_FRAME;
objects[o].ai.vort.ep1style = 1;
}
else if (p_levelcontrol->episode==2)
{
@@ -89,13 +94,10 @@ int bonk,kill;
kill = 0;
// if we touch a glowcell, we die!
if (objects[o].zapped >= VORT_HP && !p_levelcontrol->isfinallevel) kill = 1;
else if (objects[o].zapped >= VORT_COMMANDER_HP && p_levelcontrol->isfinallevel) kill = 1;
else if (objects[o].zapped && !objects[o].ai.vort.ep1style) kill = 1;
if ( objects[o].zapped >= objects[o].ai.vort.hp ) kill = 1;
else if (p_levelcontrol->episode==2 && getmaptileat((objects[o].x>>CSF)+12, (objects[o].y>>CSF)+16)==TILE_GLOWCELL)
{
kill = 1;
}
if (kill)
{
objects[o].inhibitfall = 0;
@@ -294,11 +296,6 @@ vort_reprocess: ;
case VORT_DYING:
objects[o].sprite = objects[o].ai.vort.DyingFrame + objects[o].ai.vort.frame;
if (p_levelcontrol->isfinallevel && p_levelcontrol->episode==1)
{
p_levelcontrol->canexit = true;
}
if (objects[o].ai.vort.animtimer > VORT_DIE_ANIM_TIME)
{
objects[o].ai.vort.palflashamt -= PAL_FLASH_DEC_AMT;

View File

@@ -19,7 +19,7 @@
// number of shots to kill
#define VORT_HP 4
#define VORT_COMMANDER_HP 99
#define VORT_COMMANDER_HP 105
#define VORT_DIE_ANIM_TIME 125
#define VORT2_DIE_ANIM_TIME 125

View File

@@ -14,7 +14,7 @@ void eseq_showmsg(const std::string& text, int boxleft, int boxtop,
int boxwidth, int boxheight, bool autodismiss);
// references to ../gamedo.cpp
void gamedo_frameskipping();
void gamedo_frameskipping( bool gameovermode = false );
void gamedo_enemyai(stLevelControl *p_levelcontrol);
#endif /* ENDINGSEQUENCEEP2_H_ */

View File

@@ -24,18 +24,31 @@ unsigned int curmapx, curmapy;
unsigned char mapdone;
void addmaptile(unsigned int t)
{
map.mapdata[curmapx][curmapy] = t;
curmapx++;
if (curmapx >= map.xsize)
{
curmapx = 0;
curmapy++;
// Special cases. Those happen normally, when level are not replayed.
// For example if one player has battery, the level won't show that item
for(unsigned int cp=0 ; cp<numplayers ; cp++)
{
if( (TileProperty[t][BEHAVIOR] == 11 && player[cp].inventory.HasJoystick) ||
(TileProperty[t][BEHAVIOR] == 12 && player[cp].inventory.HasBattery) ||
(TileProperty[t][BEHAVIOR] == 13 && player[cp].inventory.HasVacuum) ||
(TileProperty[t][BEHAVIOR] == 14 && player[cp].inventory.HasWiskey) ||
(TileProperty[t][BEHAVIOR] == 16 && player[cp].inventory.HasPogo) )
t = tiles[t].chgtile; // is it a battery!!
}
if (curmapy >= map.ysize) mapdone = 1;
}
// Now set this this tile at pos(curmapx, curmapy)
map.mapdata[curmapx][curmapy] = t;
curmapx++;
if (curmapx >= map.xsize)
{
curmapx = 0;
curmapy++;
if (curmapy >= map.ysize) mapdone = 1;
}
}
short checkConsistencyofGameData(stGameData *p_GameData)
{
short ok = 0;
@@ -200,7 +213,7 @@ levelmarker: ;
}
void addenemytile(unsigned int t, int episode,
int chglevelto, bool *canexit)
int chglevelto)
{
int o,x;
map.objectlayer[curmapx][curmapy] = t;
@@ -339,7 +352,6 @@ int o,x;
if (episode==2)
{
o = spawn_object(curmapx<<4<<CSF,curmapy<<4<<CSF,OBJ_SPARK);
*canexit = false; // can't exit till spark is shot
}
else if (episode==3)
{
@@ -474,8 +486,6 @@ unsigned int loadmap(const std::string& filename, const std::string& path,
int episode = p_levelcontrol->episode;
int chglevelto = p_levelcontrol->chglevelto;
int *levels_completed = p_levelcontrol->levels_completed;
bool *p_canexit = &(p_levelcontrol->canexit);
NessieAlreadySpawned = 0;
map.isworldmap = (lvlnum == 80);
@@ -552,7 +562,7 @@ unsigned int loadmap(const std::string& filename, const std::string& path,
t = filebuf[c];
if (map.isworldmap) addobjectlayertile(t, episode, levels_completed);
else addenemytile(t, episode, chglevelto, p_canexit);
else addenemytile(t, episode, chglevelto);
if (++resetcnt==resetpt) curmapx=curmapy=0;

View File

@@ -136,10 +136,8 @@ void gameloop(stCloneKeenPlus *pCKP)
if (gamedo_ScrollTriggers(primaryplayer)) ScreenIsScrolling = 1;
}
// do frameskipping, and render/blit the screen if it's time
gamedo_frameskipping();
gamedo_frameskipping( pCKP->Control.levelcontrol.gameovermode );
// when we complete a fade out flag to exit the game loop
if (fade.mode==FADE_COMPLETE)
@@ -212,7 +210,7 @@ void gameloop(stCloneKeenPlus *pCKP)
extras[1] = true;
if(player[0].inventory.HasVacuum)
extras[2] = true;
if(player[0].inventory.HasFuel)
if(player[0].inventory.HasWiskey)
extras[3] = true;
}
@@ -438,7 +436,7 @@ unsigned int i;
sprites[DOOR_BLUE_SPRITE].ysize = 32;
p_levelcontrol->level_done_timer = 0;
p_levelcontrol->gameovermode = 0;
p_levelcontrol->gameovermode = false;
// all objects -> not exist
for(i=1;i<MAX_OBJECTS-1;i++) objects[i].exists = 0;
@@ -1204,25 +1202,21 @@ void procgoodie(int t, int mpx, int mpy, int theplayer, stCloneKeenPlus *pCKP)
break;
case 11:
player[theplayer].inventory.HasJoystick = 1;
pCKP->Control.levelcontrol.canexit = 1;
player[theplayer].inventory.HasJoystick = true;
g_pSound->playSound(SOUND_GET_PART, PLAY_NOW);
break;
case 12:
player[theplayer].inventory.HasBattery = 1;
pCKP->Control.levelcontrol.canexit = 1;
player[theplayer].inventory.HasBattery = true;
g_pSound->playSound(SOUND_GET_PART, PLAY_NOW);
break;
case 13:
player[theplayer].inventory.HasVacuum = 1;
pCKP->Control.levelcontrol.canexit = 1;
player[theplayer].inventory.HasVacuum = true;
g_pSound->playSound(SOUND_GET_PART, PLAY_NOW);
break;
case 14:
player[theplayer].inventory.HasFuel = 1;
pCKP->Control.levelcontrol.canexit = 1;
player[theplayer].inventory.HasWiskey = true;
g_pSound->playSound(SOUND_GET_PART, PLAY_NOW);
break;
@@ -1251,12 +1245,9 @@ void procgoodie(int t, int mpx, int mpy, int theplayer, stCloneKeenPlus *pCKP)
break;
case 17:
if (pCKP->Control.levelcontrol.canexit)
{
pCKP->Control.levelcontrol.exitXpos = (mpx+2)<<4;
PlayerTouchedExit(theplayer, pCKP);
}
break;
pCKP->Control.levelcontrol.exitXpos = (mpx+2)<<4;
PlayerTouchedExit(theplayer, pCKP);
break;
case 23:break; // these are switches. They cannot not be picked up!
case 25:break; // Refer to JumpandPogo to check the activation code

View File

@@ -21,7 +21,6 @@
#include "include/enemyai.h"
extern unsigned long gotPlayX;
extern unsigned long CurrentTickCount;
@@ -664,33 +663,26 @@ extern int NumConsoleMessages;
// performs frameskipping and blits the display as needed,
// at end of functions erases all drawn objects from the scrollbuf.
void gamedo_RenderScreen()
{
//int x,y, bmnum;
void gamedo_RenderScreen(bool gameovermode) // gameovermode is not a good idea.
{ // TODO: Make a list of Bitmaps to be drawn and draw them, like the objects and tiles
g_pGraphics->renderHQBitmap();
//if(pCKP != NULL)
//{
gamedo_render_drawobjects();
gamedo_render_drawobjects(); // (Sprites)
//if (pCKP->Control.levelcontrol.gameovermode)
// TODO: make this Bitmap also a object or tile to be added.
/*if (special_bitmap == GAMEOVER_BITMAP)
{
// figure out where to center the gameover bitmap and draw it
bmnum = g_pGraphics->getBitmapNumberFromName("GAMEOVER");
x = (320/2)-(bitmaps[bmnum].xsize/2);
y = (200/2)-(bitmaps[bmnum].ysize/2);
g_pGraphics->drawBitmap(x, y, bmnum);
}*/
//}
g_pVideoDriver->sb_blit(); // blit scrollbuffer to display
g_pVideoDriver->sb_blit(); // blit scrollbuffer to display (Tiles)
gamedo_render_erasedebug();
gamedo_render_eraseobjects();
if(gameovermode) // (Gameover Bitmap) More to come!
{
int bmnum = g_pGraphics->getBitmapNumberFromName("GAMEOVER");
// figure out where to center the gameover bitmap and draw it
int x = (320/2)-(bitmaps[bmnum].xsize/2);
int y = (200/2)-(bitmaps[bmnum].ysize/2);
g_pGraphics->drawBitmap(x, y, bmnum);
}
curfps++;
}
@@ -804,30 +796,19 @@ int i;
player[i].pfrozentime = 0;
}
}
// F8 - frame by frame
if(g_pInput->getPressedKey(KF8))
{
framebyframe = 1;
#ifdef BUILD_SDL
g_pVideoDriver->AddConsoleMsg("Frame-by-frame mode F8:advance F7:stop");
#endif
}
// F9 - exit level immediately
if(g_pInput->getPressedKey(KF9))
{
endlevel(1, &(pCKP->Control.levelcontrol) );
}
// F6 - onscreen debug--toggle through debug/radar/off
if(g_pInput->getPressedKey(KF6))
{
debugmode++;
if (debugmode>2) debugmode=0;
}
// F7 - accelerate mode/frame by frame frame advance
if(g_pInput->getPressedKey(KF7))
{
if (!framebyframe) acceleratemode=1-acceleratemode;
}
}
// F10 - change primary player
@@ -878,32 +859,20 @@ void gamedo_fades(void)
}
}
void gamedo_frameskipping()
void gamedo_frameskipping( bool gameovermode )
{
if (framebyframe)
{
gamedo_RenderScreen();
return;
}
if (frameskiptimer >= g_pVideoDriver->getFrameskip())
{
gamedo_RenderScreen();
frameskiptimer = 0;
} else frameskiptimer++;
gamedo_RenderScreen(gameovermode);
frameskiptimer = 0;
} else frameskiptimer++;
}
// same as above but only does a sb_blit, not the full RenderScreen.
// used for intros etc.
void gamedo_frameskipping_blitonly()
{
if (framebyframe)
{
g_pVideoDriver->sb_blit();
return;
}
if (frameskiptimer >= g_pVideoDriver->getFrameskip())
{
g_pVideoDriver->sb_blit();

View File

@@ -33,9 +33,7 @@ char doFall;
{
gamepdo_dieanim(cp, pCKP);
if (!pCKP->Control.levelcontrol.gameovermode)
{
gamepdo_StatusBox(cp, pCKP);
}
}
else
{
@@ -79,15 +77,13 @@ char doFall;
if (player[cp].inhibitfall) doFall = 0;
if (doFall)
{
gamepdo_falling(cp, pCKP);
}
gamepdo_falling(cp, pCKP);
else
{
if(player[cp].pjumping == PJUMPED)
player[cp].pfalling = 0;
player[cp].psupportingtile = 145;
player[cp].psupportingobject = 0;
player[cp].psupportingtile = 145;
player[cp].psupportingobject = 0;
}
}

View File

@@ -41,11 +41,9 @@ struct stLevelControl
int tobonuslevel; // if 1 player will warp to bonus level on return to WM (for ep1)
// data about current level
int curlevel; // number of current level
char success; // 1 if level was finished, 0 if he died
char isfinallevel; // 1 if this is the final level
bool canexit; // true if player is allowed to use the exit door
char gameovermode; // 1 if "Game Over" is displayed
bool dokeensleft; // 1 if we need to do the "Keens Left"
bool success; // true if level was finished, 0 if he died
bool gameovermode; // true if "Game Over" is displayed
bool dokeensleft; // true if we need to do the "Keens Left"
bool dark; // true if level is currently dark (lights are out)
int episode; // which episode we're playing (1-3)

View File

@@ -12,8 +12,6 @@
unsigned int loadmap(const std::string& filename, const std::string& path,
int lvlnum, stLevelControl* p_levelcontrol);
void addmaptile(unsigned int t);
void addenemytile(unsigned int t, stCloneKeenPlus *pCKP);
short checkConsistencyofGameData(stGameData *p_GameData);
std::string formatPathString(const std::string& path);
void assignChangeTileAttribute(stTile *tile, int episode);

View File

@@ -1,7 +1,7 @@
void gamedo_RenderScreen();
void gamedo_RenderScreen(bool gameovermode = false);
void gamedo_frameskipping();
void gamedo_frameskipping( bool gameovermode = false );
void gamedo_HandleFKeys(stCloneKeenPlus *pCKP);
void gamedo_frameskipping_blitonly();
void gamedo_getInput(stLevelControl *p_levelcontrol);

View File

@@ -141,11 +141,12 @@ struct stInventory
unsigned char HasCardRed;
unsigned char HasCardGreen;
unsigned char HasCardBlue;
// ep1 only
unsigned char HasJoystick;
unsigned char HasFuel;
unsigned char HasBattery;
unsigned char HasVacuum;
// ep1 normally
bool HasJoystick;
bool HasWiskey;
bool HasBattery;
bool HasVacuum;
};
// for strings loaded from "strings.dat"

View File

@@ -53,7 +53,6 @@ int NessieObjectHandle;
int DemoObjectHandle;
int BlankSprite;
int DemoSprite;
int framebyframe;
int fps=0, curfps=0;
stOption *options = NULL;
@@ -300,11 +299,7 @@ void playgame_levelmanager(stCloneKeenPlus *pCKP)
char SaveGameFileName[40];
int newlevel;
stLevelControl *p_levelcontrol;
stOption *p_option;
p_option = pCKP->Option;
p_levelcontrol = &(pCKP->Control.levelcontrol);
stLevelControl *p_levelcontrol = &(pCKP->Control.levelcontrol);
if( p_levelcontrol->command != LVLC_START_LEVEL )
{
@@ -333,14 +328,9 @@ void playgame_levelmanager(stCloneKeenPlus *pCKP)
sprintf(levelname, "level%02d.ck%d", newlevel, p_levelcontrol->episode);
if (p_levelcontrol->chglevelto==WORLD_MAP)
{
wm = 1;
}
else
{
wm = 0;
}
p_levelcontrol->canexit = 1; // assume can exit before loading map
if (loadmap(levelname, pCKP->GameData[pCKP->Resources.GameSelected-1].DataDirectory, newlevel, p_levelcontrol))
{
@@ -350,15 +340,6 @@ void playgame_levelmanager(stCloneKeenPlus *pCKP)
}
p_levelcontrol->curlevel = p_levelcontrol->chglevelto;
if (p_levelcontrol->curlevel == FINAL_MAP && p_levelcontrol->episode == 1)
{
p_levelcontrol->isfinallevel = 1;
p_levelcontrol->canexit = 0;
}
else
{
p_levelcontrol->isfinallevel = 0;
}
if (firsttime)
{

View File

@@ -8,7 +8,6 @@
#include "include/misc.h"
#include "sdl/CVideoDriver.h"
#include "include/game.h"
#include "include/gamedo.h"
#include "sdl/CTimer.h"
#include "sdl/sound/CSound.h"
#include "include/fileio.h"
@@ -22,6 +21,7 @@
#include "vorticon/CDialog.h"
#include "CLogFile.h"
#include "sdl/CSettings.h"
#include <SDL.h>
#include <iostream>
#include <fstream>
@@ -1020,7 +1020,7 @@ void showPage(const std::string& str_text, stCloneKeenPlus *pCKP, int textsize)
delete [] text;
std::string coverline(38, (char)2);
std::string coverline(38, (char) 2);
do
{

View File

@@ -275,7 +275,7 @@ int dlgX,dlgY,dlgW,dlgH;
g_pGraphics->drawTile_direct((dlgX+21)<<3, ((dlgY+4)<<3)+3, t);
if (player[p].inventory.HasVacuum) t=450; else t=323;
g_pGraphics->drawTile_direct((dlgX+24)<<3, ((dlgY+4)<<3)+3, t);
if (player[p].inventory.HasFuel) t=451; else t=324;
if (player[p].inventory.HasWiskey) t=451; else t=324;
g_pGraphics->drawTile_direct((dlgX+27)<<3, ((dlgY+4)<<3)+3, t);
// ray gun charges
i = player[p].inventory.charges;
@@ -580,7 +580,7 @@ int dlgX,dlgY,dlgW,dlgH;
if (!player[cp].inventory.HasVacuum)
g_pGraphics->drawTile_direct((dlgX+15)<<3, (dlgY+3)<<3, 450);
if (!player[cp].inventory.HasFuel)
if (!player[cp].inventory.HasWiskey)
g_pGraphics->drawTile_direct((dlgX+18)<<3, (dlgY+3)<<3, 451);
g_pVideoDriver->update_screen();
@@ -1004,7 +1004,7 @@ int i;
{
if (player[i].inventory.HasJoystick) partcount++;
if (player[i].inventory.HasBattery) partcount++;
if (player[i].inventory.HasFuel) partcount++;
if (player[i].inventory.HasWiskey) partcount++;
if (player[i].inventory.HasVacuum) partcount++;
}
}
@@ -1047,6 +1047,8 @@ return 0;
void usage(void)
{
// TODO: Many options has to be changed. For now it is disabled
/*
printf("Usage: keen [lvlnum] [-*player] [-nopk] [-ep*] [-dtm] [-nocheat] [-rec] -[eseq]<br>\n");
printf("lvlnum specify a level number (such as 2) to go directly to that level<br>");
printf("-*player select number of players (1-4); defaults to 1<br>");
@@ -1063,15 +1065,13 @@ void usage(void)
printf("-ogl hardware acceleration<br>");
printf("-showfps show FPS in upper-right of screen<br>");
#endif
#ifdef TARGET_WIN32
printf("<br>-host & -join for the experimental network play mode. These DON'T work yet.\n");
#endif
printf("<br>");
printf("Examples:<br>");
printf(" keen 3 -ep2 play ep 2, level 3 in 1-player mode<br>");
printf(" keen -ep3 -dtm -2player play ep3, skip title&intro, 2-player mode<br>");
printf(" keen -ep3 play a normal game of ep3<br>");
*/
}
unsigned int rnd(void)

View File

@@ -229,6 +229,7 @@ void CDialog::renderDialog()
// The original Game had a open Dialog Animation. This is what that function does...
void CDialog::animateDialogBox(bool value){ isanimated = value; }
void CDialog::renderOpenDialogAnimation(int x,int y, int w, int h)
{
if(!isanimated || !isVisible)