Changes for the new webpage and bug fixes since 0.2.9.6
git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@36 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
Commander Genius v0.2.9.5 Beta (CloneKeenPlus):
|
||||
Commander Genius v0.2.9.6 Beta (CloneKeenPlus):
|
||||
-----------------------------------------------
|
||||
|
||||
21-06-2009
|
||||
- Crash of scale4x and hi-resolutions has been fixed! (Iv4n)
|
||||
- Added scale4x in software rendering mode (Iv4n)
|
||||
- Fixed Crash when loading keen2 or 3 fixed! (Iv4n)
|
||||
- Cixed some issues (Thanks to Iv4n!)
|
||||
|
||||
20-06-2009
|
||||
- Intro has been replaced and now is part of the About CG Option
|
||||
- The original Intro screen is now included in the interpreter
|
||||
|
||||
@@ -4,6 +4,8 @@ Here are the features that I still want to implement:
|
||||
until 0.3:
|
||||
- Write a instruction keys manual in the readme file
|
||||
- tie up the code
|
||||
- New Resolutions system
|
||||
- Add 1920x1200, 1280x800, 1600x1200
|
||||
|
||||
until 0.4:
|
||||
- User folder detection and save the files there!
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
* (c)2003-2005 Caitlin Shaw *
|
||||
* Released under GNU/GPL *
|
||||
* *
|
||||
* Beta v0.2.9.5 *
|
||||
* Beta v0.2.9.6 *
|
||||
* *
|
||||
*************************************
|
||||
|
||||
|
||||
@@ -54,7 +54,6 @@ short CGame::runCycle(stCloneKeenPlus *pCKP)
|
||||
{
|
||||
CIntro Intro;
|
||||
Intro.Render(pCKP);
|
||||
//if (intro(pCKP)){ pCKP->shutdown=SHUTDOWN_EXIT; return 0; }
|
||||
pCKP->Control.skipstarting=0;
|
||||
}
|
||||
|
||||
@@ -147,16 +146,7 @@ short CGame::runCycle(stCloneKeenPlus *pCKP)
|
||||
break;
|
||||
|
||||
case MAINMNU_NEW_GAME:
|
||||
if(loadStartMenu(pCKP) == 1)
|
||||
{
|
||||
pCKP->shutdown = SHUTDOWN_EXIT;
|
||||
break;
|
||||
}
|
||||
//loadResourcesforGame(pCKP);
|
||||
loadResources(pCKP->Control.levelcontrol.episode, pCKP->GameData[pCKP->Resources.GameSelected-1].DataDirectory);
|
||||
|
||||
|
||||
pCKP->shutdown = SHUTDOWN_RESTART;
|
||||
pCKP->shutdown = SHUTDOWN_NEW_GAME;
|
||||
break;
|
||||
|
||||
case MAINMNU_ABOUT:
|
||||
@@ -210,6 +200,9 @@ short CGame::runCycle(stCloneKeenPlus *pCKP)
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
if(pCKP->shutdown == SHUTDOWN_NEW_GAME) return 0;
|
||||
|
||||
g_pLogFile->ftextOut("bottom of game control loop opt=%d crashflag=%d<br>", opt, crashflag);
|
||||
if(pCKP->shutdown == SHUTDOWN_EXIT) break;
|
||||
} while(opt != MAINMNU_QUIT && opt != MAINMNU_NEW_GAME && !crashflag);
|
||||
|
||||
@@ -529,6 +529,27 @@ unsigned char *bmdataptr;
|
||||
}
|
||||
}
|
||||
|
||||
void CGraphics::drawBitmap2FG(int xa, int ya, int b)
|
||||
{
|
||||
int x,y;
|
||||
unsigned char *bmdataptr;
|
||||
|
||||
// for "b" arguments passed from GetBitmapNumberFromName(),
|
||||
// in case the specified name was not found
|
||||
if (b==-1) return;
|
||||
|
||||
bmdataptr = bitmaps[b].bmptr;
|
||||
for(y=0;y<bitmaps[b].ysize;y++)
|
||||
{
|
||||
for(x=0;x<bitmaps[b].xsize;x++)
|
||||
{
|
||||
g_pVideoDriver->setpixel((x+xa+scrollx_buf-130)&511,(y+ya+scrolly_buf-30)&511,*bmdataptr);
|
||||
bmdataptr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int CGraphics::getBitmapNumberFromName(const char *bmname)
|
||||
{
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
void initPalette(int dark);
|
||||
void fadePalette(int fadeamt);
|
||||
void drawBitmap(int xa, int ya, int b);
|
||||
void drawBitmap2FG(int xa, int ya, int b);
|
||||
int getBitmapNumberFromName(const char *bmname);
|
||||
void sb_drawCharacterinverse(int x, int y, int f);
|
||||
void drawFont(unsigned char *text, int xoff, int yoff, int highlight);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#ifndef CLOGFILE_H_
|
||||
#define CLOGFILE_H_
|
||||
|
||||
#define REVISION "CloneKeenPlus Beta v0.2.9.5 (Commander Genius)"
|
||||
#define REVISION "CloneKeenPlus Beta v0.2.9.7 (Commander Genius)"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "CSingleton.h"
|
||||
|
||||
@@ -96,7 +96,7 @@ unsigned int ep3;
|
||||
// got hit?
|
||||
if (objects[o].zapped)
|
||||
{
|
||||
if (objects[o].zapped > 1 || !options[OPT_MEAN].value)
|
||||
if (objects[o].zapped > 1 || !levelcontrol.hardmode)
|
||||
{ // we're fried!!
|
||||
if (objects[o].ai.baby.state != BABY_DYING)
|
||||
{
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#define BUTLER_TURNLEFT_FRAME 96
|
||||
#define BUTLER_TURNRIGHT_FRAME 97
|
||||
|
||||
void butler_ai(int o)
|
||||
void butler_ai(int o, bool hardmode)
|
||||
{
|
||||
char not_about_to_fall;
|
||||
if (objects[o].needinit)
|
||||
@@ -58,14 +58,14 @@ char not_about_to_fall;
|
||||
if (player[primaryplayer].x < objects[o].x)
|
||||
{
|
||||
player[objects[o].touchedBy].playpushed_x = -butlerpushamount;
|
||||
if (options[OPT_MEAN].value) player[objects[o].touchedBy].playpushed_x -= BUTLERPUSHAMOUNTFAST;
|
||||
if (hardmode) player[objects[o].touchedBy].playpushed_x -= BUTLERPUSHAMOUNTFAST;
|
||||
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
||||
player[objects[o].touchedBy].pdir = player[objects[o].touchedBy].pshowdir = LEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
player[objects[o].touchedBy].playpushed_x = butlerpushamount;
|
||||
if (options[OPT_MEAN].value) player[objects[o].touchedBy].playpushed_x += BUTLERPUSHAMOUNTFAST;
|
||||
if (hardmode) player[objects[o].touchedBy].playpushed_x += BUTLERPUSHAMOUNTFAST;
|
||||
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
||||
player[objects[o].touchedBy].pdir = player[objects[o].touchedBy].pshowdir = RIGHT;
|
||||
}
|
||||
@@ -91,7 +91,7 @@ char not_about_to_fall;
|
||||
objects[o].sprite = BUTLER_WALK_LEFT_FRAME + objects[o].ai.butler.frame;
|
||||
if (!objects[o].blockedl && not_about_to_fall)
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (hardmode)
|
||||
objects[o].x -= BUTLER_WALK_SPEED_FAST;
|
||||
else
|
||||
objects[o].x -= BUTLER_WALK_SPEED;
|
||||
@@ -113,7 +113,7 @@ char not_about_to_fall;
|
||||
objects[o].sprite = BUTLER_WALK_RIGHT_FRAME + objects[o].ai.butler.frame;
|
||||
if (!objects[o].blockedr && not_about_to_fall)
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (hardmode)
|
||||
objects[o].x += BUTLER_WALK_SPEED_FAST;
|
||||
else
|
||||
objects[o].x += BUTLER_WALK_SPEED;
|
||||
@@ -129,7 +129,7 @@ char not_about_to_fall;
|
||||
}
|
||||
// walk animation
|
||||
if (objects[o].ai.butler.animtimer > BUTLER_WALK_ANIM_TIME || \
|
||||
(objects[o].ai.butler.animtimer > BUTLER_WALK_ANIM_TIME_FAST && options[OPT_MEAN].value))
|
||||
(objects[o].ai.butler.animtimer > BUTLER_WALK_ANIM_TIME_FAST && hardmode))
|
||||
{
|
||||
if (objects[o].ai.butler.frame>=3) objects[o].ai.butler.frame=0;
|
||||
else objects[o].ai.butler.frame++;
|
||||
|
||||
@@ -54,7 +54,7 @@ unsigned int i;
|
||||
objects[o].ai.foob.state = FOOB_EXPLODE;
|
||||
objects[o].canbezapped = 0;
|
||||
if (objects[o].onscreen) g_pSound->playStereofromCoord(SOUND_YORP_DIE, PLAY_NOW, objects[o].scrx);
|
||||
if (options[OPT_MEAN].value && objects[o].touchPlayer)
|
||||
if (pCKP->Control.levelcontrol.hardmode && objects[o].touchPlayer)
|
||||
{
|
||||
killplayer(objects[o].touchedBy, pCKP);
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@ unsigned int i;
|
||||
|
||||
if (garg_CanWalkLeft(o))
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
objects[o].x -= GARG_WALK_SPEED_FAST;
|
||||
else
|
||||
objects[o].x -= GARG_WALK_SPEED;
|
||||
@@ -223,7 +223,7 @@ unsigned int i;
|
||||
objects[o].sprite = GARG_WALK_RIGHT + objects[o].ai.garg.walkframe;
|
||||
if (garg_CanWalkRight(o))
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
objects[o].x += GARG_WALK_SPEED_FAST;
|
||||
else
|
||||
objects[o].x += GARG_WALK_SPEED;
|
||||
@@ -239,7 +239,7 @@ unsigned int i;
|
||||
|
||||
/* walk animation */
|
||||
if (objects[o].ai.garg.timer > GARG_WALK_ANIM_TIME || \
|
||||
(objects[o].ai.garg.timer > GARG_WALK_ANIM_TIME && options[OPT_MEAN].value))
|
||||
(objects[o].ai.garg.timer > GARG_WALK_ANIM_TIME && pCKP->Control.levelcontrol.hardmode))
|
||||
{
|
||||
objects[o].ai.garg.walkframe ^= 1;
|
||||
objects[o].ai.garg.timer = 0;
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
#define MOTHER_HURT 2
|
||||
#define MOTHER_DEAD 3
|
||||
|
||||
#define MOTHER_WALK_ANIM_RATE 70
|
||||
#define MOTHER_WALK_SPD 1
|
||||
#define MOTHER_WALK_ANIM_RATE 40
|
||||
#define MOTHER_WALK_SPD 4
|
||||
|
||||
#define MOTHER_SPIT_PROB 1000
|
||||
#define MOTHER_SPIT_SHOW_TIME 100
|
||||
|
||||
@@ -35,7 +35,7 @@ int onsamelevel;
|
||||
{
|
||||
objects[o].ai.ninja.state = NINJA_STAND;
|
||||
objects[o].ai.ninja.timetillkick = (rand()%(NINJA_MAX_TIME_TILL_KICK-NINJA_MIN_TIME_TILL_KICK))+NINJA_MIN_TIME_TILL_KICK;
|
||||
if (options[OPT_MEAN].value) objects[o].ai.ninja.timetillkick /= 3;
|
||||
if (pCKP->Control.levelcontrol.hardmode) objects[o].ai.ninja.timetillkick /= 3;
|
||||
|
||||
if (player[primaryplayer].x < objects[o].x)
|
||||
{ objects[o].ai.ninja.dir = LEFT; }
|
||||
|
||||
@@ -57,7 +57,7 @@ void sndwave_ai(int o, stCloneKeenPlus *pCKP)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
objects[o].x += SNDWAVE_SPEED_FAST;
|
||||
else
|
||||
objects[o].x += SNDWAVE_SPEED;
|
||||
@@ -72,7 +72,7 @@ void sndwave_ai(int o, stCloneKeenPlus *pCKP)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
objects[o].x -= SNDWAVE_SPEED_FAST;
|
||||
else
|
||||
objects[o].x -= SNDWAVE_SPEED;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
char tank_CanMoveLeft(int o);
|
||||
char tank_CanMoveRight(int o);
|
||||
|
||||
void tank_ai(int o)
|
||||
void tank_ai(int o, bool hardmode)
|
||||
{
|
||||
int newobject;
|
||||
unsigned int i;
|
||||
@@ -150,11 +150,11 @@ unsigned int i;
|
||||
if (objects[o].ai.tank.detectedPlayer)
|
||||
{
|
||||
objects[o].ai.tank.ponsameleveltime++;
|
||||
if (objects[o].ai.tank.ponsameleveltime > TANK_SAME_LEVEL_TIME_FAST && options[OPT_MEAN].value)
|
||||
if (objects[o].ai.tank.ponsameleveltime > TANK_SAME_LEVEL_TIME_FAST && hardmode)
|
||||
{ // keen would be a good target now. (hard mode)
|
||||
if (!objects[o].ai.tank.alreadyfiredcauseonsamelevel ||\
|
||||
objects[o].ai.tank.ponsameleveltime > TANK_REPEAT_FIRE_TIME || \
|
||||
(objects[o].ai.tank.ponsameleveltime > TANK_REPEAT_FIRE_TIME_FAST && options[OPT_MEAN].value))
|
||||
(objects[o].ai.tank.ponsameleveltime > TANK_REPEAT_FIRE_TIME_FAST && hardmode))
|
||||
{
|
||||
// facing keen?
|
||||
objects[o].ai.tank.alreadyfiredcauseonsamelevel = 1;
|
||||
@@ -232,7 +232,7 @@ unsigned int i;
|
||||
break;
|
||||
case TANK_FIRE:
|
||||
if (objects[o].ai.tank.timer > TANK_PREPAREFIRE_TIME || \
|
||||
(objects[o].ai.tank.timer > TANK_PREPAREFIRE_TIME_FAST && options[OPT_MEAN].value))
|
||||
(objects[o].ai.tank.timer > TANK_PREPAREFIRE_TIME_FAST && hardmode))
|
||||
{
|
||||
if (objects[o].onscreen) g_pSound->playStereofromCoord(SOUND_TANK_FIRE, PLAY_NOW, objects[o].scrx);
|
||||
if (objects[o].ai.tank.movedir==RIGHT)
|
||||
|
||||
@@ -141,7 +141,7 @@ unsigned int i;
|
||||
else
|
||||
{
|
||||
// no we're not facing him, on hard difficulty turn around
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
{
|
||||
objects[o].ai.tank.frame = 0;
|
||||
objects[o].ai.tank.timer = 0;
|
||||
|
||||
@@ -44,7 +44,7 @@ int bonk,kill;
|
||||
objects[o].canbezapped = 1;
|
||||
objects[o].needinit = 0;
|
||||
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
{
|
||||
objects[o].ai.vort.ep1style = 1;
|
||||
}
|
||||
@@ -118,7 +118,7 @@ int bonk,kill;
|
||||
else
|
||||
{
|
||||
objects[o].ai.vort.state = VORT2_DYING;
|
||||
if (options[OPT_MEAN].value)
|
||||
if (pCKP->Control.levelcontrol.hardmode)
|
||||
{
|
||||
fade.mode = FADE_GO;
|
||||
fade.dir = FADE_IN;
|
||||
|
||||
@@ -126,7 +126,7 @@ char numlooks;
|
||||
{
|
||||
bump_left: ;
|
||||
player[objects[o].touchedBy].playpushed_x = -pushamt;
|
||||
if (options[OPT_MEAN].value) player[objects[o].touchedBy].playpushed_x -= YORPPUSHAMOUNT_FAST;
|
||||
if (levelcontrol.hardmode) player[objects[o].touchedBy].playpushed_x -= YORPPUSHAMOUNT_FAST;
|
||||
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
||||
if (!player[objects[o].touchedBy].pjumping)
|
||||
{
|
||||
@@ -137,7 +137,7 @@ char numlooks;
|
||||
{
|
||||
bump_right: ;
|
||||
player[objects[o].touchedBy].playpushed_x = pushamt;
|
||||
if (options[OPT_MEAN].value) player[objects[o].touchedBy].playpushed_x += YORPPUSHAMOUNT_FAST;
|
||||
if (levelcontrol.hardmode) player[objects[o].touchedBy].playpushed_x += YORPPUSHAMOUNT_FAST;
|
||||
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
||||
if (!player[objects[o].touchedBy].pjumping)
|
||||
{
|
||||
@@ -185,7 +185,7 @@ char numlooks;
|
||||
}
|
||||
break;
|
||||
case YORP_LOOK:
|
||||
if (options[OPT_MEAN].value) numlooks = YORP_NUM_LOOKS_FAST; else numlooks = YORP_NUM_LOOKS;
|
||||
if (levelcontrol.hardmode) numlooks = YORP_NUM_LOOKS_FAST; else numlooks = YORP_NUM_LOOKS;
|
||||
if (objects[o].ai.yorp.looktimes>numlooks &&\
|
||||
objects[o].ai.yorp.timer==YORP_LOOK_TIME-(YORP_LOOK_TIME/4))
|
||||
{
|
||||
@@ -251,7 +251,7 @@ char numlooks;
|
||||
objects[o].sprite = YORP_WALK_LEFT + objects[o].ai.yorp.walkframe;
|
||||
if (!objects[o].blockedl)
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (levelcontrol.hardmode)
|
||||
objects[o].x -= YORP_WALK_SPEED_FAST;
|
||||
else
|
||||
objects[o].x -= YORP_WALK_SPEED;
|
||||
@@ -271,7 +271,7 @@ char numlooks;
|
||||
objects[o].sprite = YORP_WALK_RIGHT + objects[o].ai.yorp.walkframe;
|
||||
if (!objects[o].blockedr)
|
||||
{
|
||||
if (options[OPT_MEAN].value)
|
||||
if (levelcontrol.hardmode)
|
||||
objects[o].x += YORP_WALK_SPEED_FAST;
|
||||
else
|
||||
objects[o].x += YORP_WALK_SPEED;
|
||||
@@ -287,7 +287,7 @@ char numlooks;
|
||||
}
|
||||
// walk animation
|
||||
if (objects[o].ai.yorp.timer > YORP_WALK_ANIM_TIME || \
|
||||
(objects[o].ai.yorp.timer > YORP_WALK_ANIM_TIME_FAST && options[OPT_MEAN].value))
|
||||
(objects[o].ai.yorp.timer > YORP_WALK_ANIM_TIME_FAST && levelcontrol.hardmode))
|
||||
{
|
||||
objects[o].ai.yorp.walkframe ^= 1;
|
||||
objects[o].ai.yorp.timer = 0;
|
||||
@@ -297,7 +297,7 @@ char numlooks;
|
||||
objects[o].sprite = YORP_STUNFRAME + objects[o].ai.yorp.walkframe;
|
||||
if (objects[o].ai.yorp.timer > YORP_STUN_ANIM_TIME)
|
||||
{
|
||||
if (options[OPT_MEAN].value) numlooks = YORP_STUNTIME_FAST; else numlooks = YORP_STUNTIME;
|
||||
if (levelcontrol.hardmode) numlooks = YORP_STUNTIME_FAST; else numlooks = YORP_STUNTIME;
|
||||
if (objects[o].ai.yorp.looktimes>numlooks)
|
||||
{
|
||||
objects[o].ai.yorp.looktimes = 0;
|
||||
|
||||
@@ -1064,7 +1064,7 @@ g_pLogFile->ftextOut("loadstrings(): Opening string file '%s'.<br>", fname);
|
||||
// into it. We'll need room for both the name and the string, plus
|
||||
// null-terminators for each.
|
||||
RAMSize = strlen( (char*) stName) + strlen((char*)stString) + 2;
|
||||
RAMPtr = (char*) malloc(RAMSize);
|
||||
RAMPtr = (char*) malloc(RAMSize);
|
||||
if (!RAMPtr)
|
||||
{
|
||||
g_pLogFile->ftextOut(RED,"loadstrings(): Could not allocate memory for string '%s'<br>", stName);
|
||||
|
||||
@@ -71,7 +71,7 @@ int readStoryText(char **ptext, int episode, char *path)
|
||||
}
|
||||
else
|
||||
{
|
||||
*ptext = (char*) malloc((endflag-startflag)*sizeof(char));
|
||||
*ptext = (char*) malloc((endflag-startflag+10)*sizeof(char));
|
||||
strncpy((*ptext),(char*)filebuf+startflag,(endflag-startflag)*sizeof(char));
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ int readStoryText(char **ptext, int episode, char *path)
|
||||
|
||||
pos = 0;
|
||||
|
||||
*ptext = (char*) malloc(filesize*sizeof(char));
|
||||
*ptext = (char*) malloc((filesize+10)*sizeof(char));
|
||||
|
||||
while(!feof(fp))
|
||||
{
|
||||
|
||||
@@ -253,8 +253,8 @@ int i;
|
||||
case OBJ_YORP: yorp_ai(i, pCKP->Control.levelcontrol); break;
|
||||
case OBJ_GARG: garg_ai(i, pCKP); break;
|
||||
case OBJ_VORT: vort_ai(i, pCKP, pCKP->Control.levelcontrol); break;
|
||||
case OBJ_BUTLER: butler_ai(i); break;
|
||||
case OBJ_TANK: tank_ai(i); break;
|
||||
case OBJ_BUTLER: butler_ai(i, pCKP->Control.levelcontrol.hardmode); break;
|
||||
case OBJ_TANK: tank_ai(i, pCKP->Control.levelcontrol.hardmode); break;
|
||||
case OBJ_RAY: ray_ai(i, pCKP, pCKP->Control.levelcontrol); break;
|
||||
case OBJ_DOOR: door_ai(i); break;
|
||||
case OBJ_ICECHUNK: icechunk_ai(i); break;
|
||||
|
||||
@@ -409,7 +409,7 @@ void gamepdo_setblockedlru(unsigned int cp, stCloneKeenPlus *pCKP)
|
||||
|
||||
for( i=2 ; i < PLAYERHEIGHT ; i++ )
|
||||
{
|
||||
if (checkissolidl((player[cp].x>>CSF)+PLAYERWIDTH, (player[cp].y>>CSF)+i,cp, pCKP))
|
||||
if (checkissolidl((player[cp].x>>CSF)+PLAYERWIDTH+1, (player[cp].y>>CSF)+i,cp, pCKP))
|
||||
{
|
||||
player[cp].blockedr = 1;
|
||||
player[cp].widejump = false;
|
||||
@@ -419,7 +419,7 @@ void gamepdo_setblockedlru(unsigned int cp, stCloneKeenPlus *pCKP)
|
||||
|
||||
for( i=2 ; i < PLAYERHEIGHT ; i++ )
|
||||
{
|
||||
if (checkissolidr((player[cp].x>>CSF)+4, (player[cp].y>>CSF)+i,cp, pCKP))
|
||||
if (checkissolidr((player[cp].x>>CSF)+2, (player[cp].y>>CSF)+i,cp, pCKP))
|
||||
{
|
||||
player[cp].blockedl = 1;
|
||||
player[cp].widejump = false;
|
||||
@@ -1645,7 +1645,6 @@ void gamepdo_walking(int cp, stCloneKeenPlus *pCKP)
|
||||
}
|
||||
else if (player[cp].playcontrol[PA_X] < 0)
|
||||
{
|
||||
|
||||
// quickly reach PFASTINCMAXSPEED
|
||||
if (player[cp].pwalkincreasetimer>=cur_pfastincrate && player[cp].pinertia_x>-PFASTINCMAXSPEED)
|
||||
{
|
||||
|
||||
@@ -41,6 +41,7 @@ typedef struct stLevelControl
|
||||
char dark; // 1 if level is currently dark (lights are out)
|
||||
|
||||
int episode; // which episode we're playing (1-3)
|
||||
bool hardmode;
|
||||
|
||||
// array of which levels have been completed (have "Done" tiles over them
|
||||
// on the world map)
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
void yorp_ai(int o, stLevelControl levelcontrol);
|
||||
void garg_ai(int o, stCloneKeenPlus *pCKP);
|
||||
void vort_ai(int o, stCloneKeenPlus *pCKP, stLevelControl levelcontrol);
|
||||
void butler_ai(int o);
|
||||
void tank_ai(int o);
|
||||
void butler_ai(int o, bool hardmode);
|
||||
void tank_ai(int o, bool hardmode);
|
||||
void ray_ai(int o, stCloneKeenPlus *pCKP, stLevelControl levelcontrol);
|
||||
void door_ai(int o);
|
||||
void icechunk_ai(int o);
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
// PFASTINCMAXSPEED. keen can, at a slower rate,
|
||||
// reach up to PMAXSPEED (increased every walk anim frame)
|
||||
#define PFASTINCMAXSPEED 9
|
||||
#define PMAXSPEED 13
|
||||
#define PMAXSPEED 14
|
||||
#define PJUMPINERTIA 30 // The higher, the value, the more difficult it is to jump or pogo
|
||||
#define PFASTINCRATE 16 // accel delay rate up to PFASTINCMAXSPEED
|
||||
#define PFASTINCRATE_POGO 50 // rate when pogo stick is out
|
||||
|
||||
@@ -838,7 +838,8 @@ typedef struct stShipQueue
|
||||
#define SHUTDOWN_NO_ERRORS 0
|
||||
#define SHUTDOWN_BOOTUP 1
|
||||
#define SHUTDOWN_RESTART 2
|
||||
#define SHUTDOWN_EXIT 3
|
||||
#define SHUTDOWN_NEW_GAME 3
|
||||
#define SHUTDOWN_EXIT 4
|
||||
|
||||
|
||||
// Video Modes
|
||||
|
||||
20
src/main.cpp
20
src/main.cpp
@@ -191,6 +191,22 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
CKP.shutdown = SHUTDOWN_NONE; // Game is runnning
|
||||
Game->runCycle(&CKP);
|
||||
|
||||
if(CKP.shutdown == SHUTDOWN_NEW_GAME)
|
||||
{
|
||||
if(loadStartMenu(&CKP) == 1)
|
||||
{
|
||||
CKP.shutdown = SHUTDOWN_EXIT;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
//loadResourcesforGame(pCKP);
|
||||
Game->loadResources(CKP.Control.levelcontrol.episode, CKP.GameData[CKP.Resources.GameSelected-1].DataDirectory);
|
||||
|
||||
CKP.shutdown = SHUTDOWN_RESTART;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,7 +309,7 @@ void playgame_levelmanager(stCloneKeenPlus *pCKP)
|
||||
initgame(pCKP);
|
||||
|
||||
newlevel = p_levelcontrol->chglevelto;
|
||||
if (p_levelcontrol->episode==1 && p_option[OPT_MEAN].value)
|
||||
if (p_levelcontrol->episode==1 && p_levelcontrol->hardmode)
|
||||
{
|
||||
// in high-difficulity mode switch levels 5 & 9 so
|
||||
// you can't get the pogo stick until you make it
|
||||
@@ -610,7 +626,7 @@ short readCommandLine(int argc, char *argv[], stCloneKeenPlus *pCKP)
|
||||
}
|
||||
else if (strcmp(tempbuf, "-mean")==0) // increase difficulty
|
||||
{
|
||||
pCKP->Option[OPT_MEAN].value = 1;
|
||||
pCKP->Control.levelcontrol.hardmode = true;
|
||||
}
|
||||
else if (strcmp(tempbuf, "-cheat")==0) // enable cheat codes
|
||||
{
|
||||
|
||||
67
src/menu.cpp
67
src/menu.cpp
@@ -159,7 +159,7 @@ short loadStartMenu(stCloneKeenPlus *pCKP)
|
||||
// Prepare the Games Menu
|
||||
GamesMenu = new CDialog();
|
||||
|
||||
GamesMenu->setDimensions(2,2,36,5);
|
||||
GamesMenu->setDimensions(2,2,36,15);
|
||||
|
||||
// Show me the games you detected!
|
||||
for( i=0 ; i < pCKP->numGames ; i++ )
|
||||
@@ -182,10 +182,9 @@ short loadStartMenu(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(0, IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
GamesMenu->setNextSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(0, IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
GamesMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(0, IC_STATUS))
|
||||
@@ -220,6 +219,12 @@ int mainmenu(stCloneKeenPlus *pCKP,int defaultopt)
|
||||
int x;
|
||||
int selection;
|
||||
|
||||
for(unsigned int cp=0 ; cp<numplayers ; cp++) // in some situations. the player is shown for a short time.
|
||||
{
|
||||
player[cp].x = 0;
|
||||
player[cp].y = 0;
|
||||
}
|
||||
|
||||
fade.mode = FADE_GO;
|
||||
fade.rate = FADE_NORM;
|
||||
fade.dir = FADE_IN;
|
||||
@@ -266,10 +271,9 @@ int mainmenu(stCloneKeenPlus *pCKP,int defaultopt)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
MainMenu->setNextSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
MainMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
@@ -286,7 +290,10 @@ int mainmenu(stCloneKeenPlus *pCKP,int defaultopt)
|
||||
gamedo_frameskipping_blitonly();
|
||||
|
||||
if(g_pInput->getExitEvent())
|
||||
{
|
||||
delete MainMenu;
|
||||
return MAINMNU_QUIT;
|
||||
}
|
||||
|
||||
} while(1);
|
||||
|
||||
@@ -299,7 +306,7 @@ int mainmenu(stCloneKeenPlus *pCKP,int defaultopt)
|
||||
return BACK2MAINMENU;
|
||||
}
|
||||
|
||||
options[OPT_MEAN].value = diff;
|
||||
pCKP->Control.levelcontrol.hardmode = (diff == 1) ? true : false;
|
||||
|
||||
loadslot = save_slot_box(0, pCKP);
|
||||
if (loadslot)
|
||||
@@ -325,15 +332,16 @@ int mainmenu(stCloneKeenPlus *pCKP,int defaultopt)
|
||||
{
|
||||
if(selection==MAINMNU_1PLAYER || selection==MAINMNU_2PLAYER)
|
||||
{
|
||||
|
||||
int diff;
|
||||
diff = getDifficulty(pCKP);
|
||||
|
||||
if(diff>2)
|
||||
{
|
||||
delete MainMenu;
|
||||
return BACK2MAINMENU;
|
||||
}
|
||||
|
||||
options[OPT_MEAN].value = diff;
|
||||
pCKP->Control.levelcontrol.hardmode = (diff == 1) ? true : false;
|
||||
}
|
||||
|
||||
fade.dir = FADE_OUT;
|
||||
@@ -400,10 +408,9 @@ int getDifficulty(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
DifficultyMenu->setNextSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
DifficultyMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
@@ -473,10 +480,9 @@ int AudioDlg(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
AudioMenu->setNextSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
AudioMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
@@ -584,9 +590,9 @@ void OptionsDlg(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
OptionsMenu->setNextSelection();
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
OptionsMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
@@ -737,9 +743,9 @@ short GraphicsDlg(stCloneKeenPlus *pCKP)
|
||||
aspect = g_pVideoDriver->getAspectCorrection();
|
||||
|
||||
if(aspect)
|
||||
DisplayMenu->addOptionText("Aspect Ratio Enabled");
|
||||
DisplayMenu->addOptionText("OGL Aspect Ratio Enabled");
|
||||
else
|
||||
DisplayMenu->addOptionText("Aspect Ratio Disabled");
|
||||
DisplayMenu->addOptionText("OGL Aspect Ratio Disabled");
|
||||
|
||||
DisplayMenu->addSeparator();
|
||||
DisplayMenu->addOptionText("Save and return");
|
||||
@@ -755,9 +761,9 @@ short GraphicsDlg(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
DisplayMenu->setNextSelection();
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
DisplayMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
@@ -821,7 +827,7 @@ short GraphicsDlg(stCloneKeenPlus *pCKP)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(zoom >= 3)
|
||||
if(zoom >= 4)
|
||||
zoom = 1;
|
||||
else
|
||||
zoom++;
|
||||
@@ -849,7 +855,7 @@ short GraphicsDlg(stCloneKeenPlus *pCKP)
|
||||
else if(filter == 2)
|
||||
DisplayMenu->setOptionText(3,"Scale3x Filter");
|
||||
else if(filter == 3)
|
||||
DisplayMenu->setOptionText(3,"Scale4x Filter (OpenGL)");
|
||||
DisplayMenu->setOptionText(3,"Scale4x Filter");
|
||||
}
|
||||
else if(selection == 4)
|
||||
{
|
||||
@@ -890,9 +896,9 @@ short GraphicsDlg(stCloneKeenPlus *pCKP)
|
||||
aspect = !aspect;
|
||||
|
||||
if(aspect)
|
||||
DisplayMenu->setOptionText(7,"Aspect Ratio Enabled");
|
||||
DisplayMenu->setOptionText(7,"OGL Aspect Ratio Enabled");
|
||||
else
|
||||
DisplayMenu->setOptionText(7,"Aspect Ratio Disabled");
|
||||
DisplayMenu->setOptionText(7,"OGL Aspect Ratio Disabled");
|
||||
|
||||
}
|
||||
else if(selection == 9)
|
||||
@@ -1147,10 +1153,9 @@ char configmenu(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
OptionsMenu->setNextSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
OptionsMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
@@ -1282,9 +1287,9 @@ char controlsmenu(stCloneKeenPlus *pCKP)
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
// Check the Input
|
||||
if(g_pInput->getPressedCommand(IC_DOWN))
|
||||
if(g_pInput->getPulsedCommand(IC_DOWN, 80))
|
||||
ControlsMenu->setNextSelection();
|
||||
if(g_pInput->getPressedCommand(IC_UP))
|
||||
if(g_pInput->getPulsedCommand(IC_UP, 80))
|
||||
ControlsMenu->setPrevSelection();
|
||||
|
||||
if(g_pInput->getPressedCommand(IC_STATUS))
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "CInput.h"
|
||||
#include "../CLogFile.h"
|
||||
#include "CVideoDriver.h"
|
||||
#include "CTimer.h"
|
||||
|
||||
#ifdef WIZ
|
||||
#include "gp2x.h"
|
||||
@@ -21,6 +22,8 @@ CInput::CInput() {
|
||||
Uint8 i;
|
||||
|
||||
m_exit = false;
|
||||
m_cmdpulse = 0;
|
||||
m_joydeadzone = 6400;
|
||||
|
||||
memset(immediate_keytable,false,KEYTABLE_SIZE);
|
||||
memset(last_immediate_keytable,false,KEYTABLE_SIZE);
|
||||
@@ -40,7 +43,7 @@ CInput::CInput() {
|
||||
InputCommand[i][IC_DOWN].keysym = SDLK_DOWN;
|
||||
|
||||
InputCommand[i][IC_JUMP].keysym = SDLK_RCTRL;
|
||||
InputCommand[i][IC_POGO].keysym = SDLK_MODE;
|
||||
InputCommand[i][IC_POGO].keysym = SDLK_RALT;
|
||||
InputCommand[i][IC_FIRE].keysym = SDLK_SPACE;
|
||||
InputCommand[i][IC_STATUS].keysym = SDLK_RETURN;
|
||||
|
||||
@@ -254,8 +257,8 @@ void CInput::processJoystickAxis(void)
|
||||
if(Event.jaxis.axis == InputCommand[j][i].joyaxis && Event.jaxis.which == InputCommand[j][i].which )
|
||||
{
|
||||
// Deadzone
|
||||
if((Event.jaxis.value > 3200 && InputCommand[0][i].joyvalue > 0) ||
|
||||
(Event.jaxis.value < -3200 && InputCommand[0][i].joyvalue < 0))
|
||||
if((Event.jaxis.value > m_joydeadzone && InputCommand[0][i].joyvalue > 0) ||
|
||||
(Event.jaxis.value < -m_joydeadzone && InputCommand[0][i].joyvalue < 0))
|
||||
InputCommand[j][i].active = true;
|
||||
else
|
||||
InputCommand[j][i].active = false;
|
||||
@@ -314,7 +317,7 @@ void CInput::processKeys(int value)
|
||||
case SDLK_RETURN:immediate_keytable[KENTER] = value; break;
|
||||
case SDLK_RCTRL:immediate_keytable[KCTRL] = value; break;
|
||||
case SDLK_SPACE:immediate_keytable[KSPACE] = value; break;
|
||||
case SDLK_MODE:immediate_keytable[KALT] = value; break;
|
||||
case SDLK_RALT:immediate_keytable[KALT] = value; break;
|
||||
case SDLK_TAB:immediate_keytable[KTAB] = value; break;
|
||||
case SDLK_LSHIFT:immediate_keytable[KLSHIFT] = value; break;
|
||||
case SDLK_ESCAPE:immediate_keytable[KQUIT] = value; break;
|
||||
@@ -392,6 +395,7 @@ bool CInput::getPressedKey(int key)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CInput::getPressedAnyKey(void)
|
||||
{
|
||||
int i;
|
||||
@@ -438,6 +442,33 @@ bool CInput::getPressedCommand(Uint8 player, int command)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CInput::getPulsedCommand(int command, int msec)
|
||||
{
|
||||
bool retval = false;
|
||||
for(Uint8 player=0; player<NUM_INPUTS ; player++ )
|
||||
retval |= getPulsedCommand(player, command, msec);
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool CInput::getPulsedCommand(Uint8 player, int command, int msec)
|
||||
{
|
||||
if(InputCommand[player][command].active)
|
||||
{
|
||||
bool value = true;
|
||||
|
||||
if(m_cmdpulse % msec != 0)
|
||||
{
|
||||
value = false;
|
||||
}
|
||||
m_cmdpulse++;
|
||||
return value;
|
||||
}
|
||||
if(!InputCommand[player][command].active && InputCommand[player][command].lastactive )
|
||||
m_cmdpulse = 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CInput::getPressedAnyCommand()
|
||||
{
|
||||
bool retval = true;
|
||||
@@ -457,11 +488,19 @@ bool CInput::getPressedAnyCommand(Uint8 player)
|
||||
return false;
|
||||
}
|
||||
|
||||
void CInput::flushCommands(void)
|
||||
{
|
||||
for(int i=0 ; i<NUM_INPUTS ; i++)
|
||||
for(int j=0 ; j<NUMBER_OF_COMMANDS ; j++)
|
||||
InputCommand[i][j].active = InputCommand[i][j].lastactive = false;
|
||||
}
|
||||
|
||||
void CInput::flushKeys(void)
|
||||
{
|
||||
memset(immediate_keytable,false,KEYTABLE_SIZE);
|
||||
memset(last_immediate_keytable,false,KEYTABLE_SIZE);
|
||||
}
|
||||
void CInput::flushAll(void){ flushKeys(); flushCommands(); }
|
||||
|
||||
#ifdef WIZ
|
||||
void CInput::WIZ_EmuKeyboard( int button, int value )
|
||||
|
||||
@@ -149,10 +149,12 @@ public:
|
||||
bool getPressedAnyKey(void);
|
||||
void sendKey(int key);
|
||||
|
||||
bool getPressedAnyCommand();
|
||||
bool getPulsedCommand(int command, int msec);
|
||||
bool getPulsedCommand(Uint8 player, int command, int msec);
|
||||
bool getHoldedCommand(Uint8 player, int command);
|
||||
bool getHoldedCommand(int command);
|
||||
bool getPressedCommand(int command);
|
||||
bool getPressedAnyCommand();
|
||||
bool getHoldedCommand(Uint8 player, int command);
|
||||
bool getPressedCommand(Uint8 player, int command);
|
||||
bool getPressedAnyCommand(Uint8 player);
|
||||
bool getExitEvent(void);
|
||||
@@ -165,11 +167,15 @@ public:
|
||||
short saveControlconfig(void);
|
||||
|
||||
void flushKeys(void);
|
||||
void flushCommands(void);
|
||||
void flushAll(void);
|
||||
|
||||
private:
|
||||
SDL_Event Event;
|
||||
stInputCommand InputCommand[NUM_INPUTS][NUMBER_OF_COMMANDS];
|
||||
bool m_exit;
|
||||
int m_cmdpulse;
|
||||
short m_joydeadzone;
|
||||
|
||||
bool immediate_keytable[KEYTABLE_SIZE];
|
||||
bool last_immediate_keytable[KEYTABLE_SIZE];
|
||||
|
||||
@@ -15,9 +15,8 @@
|
||||
#define OPT_TWOBUTTON 4
|
||||
#define OPT_KEYCARDSTACK 5
|
||||
#define OPT_ANALOGJOYSTICK 6
|
||||
#define OPT_MEAN 7
|
||||
|
||||
#define NUM_OPTIONS 8
|
||||
#define NUM_OPTIONS 7
|
||||
|
||||
typedef struct stOption
|
||||
{
|
||||
|
||||
@@ -43,6 +43,8 @@ public:
|
||||
uint8 getFrameskip(void){ return m_frameskip; }
|
||||
void setFrameskip(uint8 frameskip){ m_frameskip = frameskip; }
|
||||
|
||||
uint64 getTime(void) { return ltime; }
|
||||
|
||||
private:
|
||||
|
||||
uint64 ttime;
|
||||
|
||||
@@ -154,14 +154,18 @@ bool CVideoDriver::initOpenGL()
|
||||
bool CVideoDriver::applyMode(void)
|
||||
{
|
||||
// Check if some zoom/filter modes are illogical
|
||||
// TODO: Make this call clearer to understand
|
||||
if( (Zoom == 3 && Filtermode == 1) && !m_opengl )
|
||||
Zoom = 2;
|
||||
|
||||
// Grab a surface on the screen
|
||||
Mode = SDL_HWPALETTE;
|
||||
|
||||
|
||||
#ifndef WIZ
|
||||
// Support for doublebuffering
|
||||
Mode |= SDL_DOUBLEBUF;
|
||||
#endif
|
||||
|
||||
// Enable OpenGL
|
||||
#ifdef USE_OPENGL
|
||||
@@ -506,6 +510,39 @@ void CVideoDriver::update_screen(void)
|
||||
SDL_UnlockSurface(screen);
|
||||
SDL_UnlockSurface(BlitSurface);
|
||||
}
|
||||
else if (Zoom == 4)
|
||||
{
|
||||
SDL_LockSurface(BlitSurface);
|
||||
SDL_LockSurface(screen);
|
||||
|
||||
if(Filtermode == 0)
|
||||
{
|
||||
scale4xnofilter((char*)VRAMPtr, (char*)BlitSurface->pixels, (Depth>>3));
|
||||
}
|
||||
else if(Filtermode == 1)
|
||||
{
|
||||
scale(2, VRAMPtr, Width*(Depth>>3), BlitSurface->pixels,
|
||||
GAME_STD_WIDTH*(Depth>>3), (Depth>>3), GAME_STD_WIDTH, GAME_STD_HEIGHT);
|
||||
}
|
||||
else if(Filtermode == 2)
|
||||
{
|
||||
scale(3, VRAMPtr, Width*(Depth>>3), BlitSurface->pixels,
|
||||
GAME_STD_WIDTH*(Depth>>3), (Depth>>3), GAME_STD_WIDTH, GAME_STD_HEIGHT);
|
||||
}
|
||||
else if(Filtermode == 3)
|
||||
{
|
||||
scale(4, VRAMPtr, Width*(Depth>>3), BlitSurface->pixels,
|
||||
GAME_STD_WIDTH*(Depth>>3), (Depth>>3), GAME_STD_WIDTH, GAME_STD_HEIGHT);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_pLogFile->textOut(PURPLE,"Sorry, but this filter doesn't work at that zoom mode<br>");
|
||||
g_pLogFile->textOut(PURPLE,"Try to use a higher zoom factor. Switching to no-filter<br>");
|
||||
Filtermode = 0;
|
||||
}
|
||||
SDL_UnlockSurface(screen);
|
||||
SDL_UnlockSurface(BlitSurface);
|
||||
}
|
||||
|
||||
SDL_Flip(screen);
|
||||
//SDL_UpdateRect(screen, screenrect.x, screenrect.y, screenrect.w, screenrect.h);
|
||||
@@ -569,10 +606,44 @@ void CVideoDriver::scale3xnofilter(char *dest, char *src, short bbp)
|
||||
}
|
||||
}
|
||||
|
||||
void CVideoDriver::scale4xnofilter(char *dest, char *src, short bbp)
|
||||
{
|
||||
// workaround for copying correctly stuff to the screen, so the screen is scaled normally
|
||||
// to 2x (without filter). This applies to 16 and 32-bit colour depth.
|
||||
// use bit shifting method for faster blit!
|
||||
bbp >>= 1;
|
||||
|
||||
char *srctemp;
|
||||
char *desttemp;
|
||||
int size;
|
||||
|
||||
int i,j;
|
||||
for(i=0 ; i < GAME_STD_HEIGHT ; i++)
|
||||
{
|
||||
for(j = 0; j < GAME_STD_WIDTH ; j++)
|
||||
{
|
||||
// j*4 = (j<<2)
|
||||
srctemp = src+((j+(i*GAME_STD_WIDTH))<<bbp);
|
||||
desttemp = dest+((4*(j+(i*Width)))<<bbp);
|
||||
memcpy(desttemp,srctemp,bbp<<1);
|
||||
memcpy(desttemp+(1<<bbp),srctemp,bbp<<1);
|
||||
memcpy(desttemp+(2<<bbp),srctemp,bbp<<1);
|
||||
memcpy(desttemp+(3<<bbp),srctemp,bbp<<1);
|
||||
}
|
||||
srctemp = dest+(((i<<2)*Width)<<bbp);
|
||||
desttemp = dest+((((i<<2)+1)*Width)<<bbp);
|
||||
size = GAME_STD_WIDTH*(bbp<<1<<2);
|
||||
|
||||
memcpy(desttemp,srctemp,size);
|
||||
memcpy(desttemp+(Width<<bbp),srctemp,size);
|
||||
memcpy(desttemp+((Width<<bbp)<<1),srctemp,size);
|
||||
}
|
||||
}
|
||||
|
||||
// functions to directly set and retrieve pixels from the VGA display
|
||||
void CVideoDriver::setpixel(unsigned int x, unsigned int y, unsigned char c)
|
||||
{
|
||||
if( x > Width || y > Height )
|
||||
if( x >= GAME_STD_WIDTH || y >= GAME_STD_HEIGHT ) // out of Bonds!!!
|
||||
return;
|
||||
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ public:
|
||||
void noscale(char *dest, char *src, short bbp);
|
||||
void scale2xnofilter(char *dest, char *src, short bbp);
|
||||
void scale3xnofilter(char *dest, char *src, short bbp);
|
||||
void scale4xnofilter(char *dest, char *src, short bbp);
|
||||
|
||||
void setpixel(unsigned int x, unsigned int y, unsigned char c);
|
||||
unsigned char getpixel(int x, int y);
|
||||
@@ -69,9 +70,9 @@ public:
|
||||
void setFrameskip(unsigned short value);
|
||||
void setFilter(short value);
|
||||
void setZoom(short vale);
|
||||
bool initOpenGL();
|
||||
#ifdef USE_OPENGL
|
||||
void enableOpenGL(bool value) { m_opengl = value; }
|
||||
bool initOpenGL();
|
||||
void setOGLFilter(unsigned char value) { m_opengl_filter = (value==1) ? GL_LINEAR : GL_NEAREST ; }
|
||||
#else
|
||||
void enableOpenGL(bool value) { m_opengl = false; }
|
||||
|
||||
@@ -27,7 +27,6 @@ void CCallback(void *unused, Uint8 *stream, int len)
|
||||
|
||||
CSound::CSound() {
|
||||
m_active = false;
|
||||
m_volume = 0;
|
||||
m_mixing_channels = 0;
|
||||
m_soundchannel = NULL;
|
||||
m_soundslot = NULL;
|
||||
@@ -46,33 +45,40 @@ CSound::~CSound() {
|
||||
bool CSound::init(void)
|
||||
{
|
||||
char name[MAX_STRING_LENGTH];
|
||||
SDL_AudioSpec *desired, *obtained;
|
||||
|
||||
desired = &AudioSpec;
|
||||
obtained = new SDL_AudioSpec;
|
||||
|
||||
// now start up the SDL sound system
|
||||
AudioSpec.silence = 0;
|
||||
AudioSpec.samples = 1024;
|
||||
|
||||
switch (AudioSpec.freq)
|
||||
{
|
||||
case 11000: AudioSpec.samples = 256; break;
|
||||
case 22000: AudioSpec.samples = 512; break;
|
||||
default: AudioSpec.samples = 1024; break;
|
||||
|
||||
}
|
||||
|
||||
AudioSpec.callback = CCallback;
|
||||
AudioSpec.userdata = NULL;
|
||||
|
||||
/* Initialize fillerup() variables */
|
||||
if( SDL_OpenAudio(&AudioSpec, NULL) < 0 )
|
||||
/* Initialize variables */
|
||||
if( SDL_OpenAudio(desired, obtained) < 0 )
|
||||
{
|
||||
g_pLogFile->ftextOut("SoundDrv_Start(): The Sound settings don't work! Going into Failsafemode!<br>");
|
||||
|
||||
AudioSpec.channels = 1;
|
||||
AudioSpec.freq = 11000;
|
||||
|
||||
if( SDL_OpenAudio(&AudioSpec, NULL) < 0 )
|
||||
{
|
||||
g_pLogFile->ftextOut("SoundDrv_Start(): Couldn't open audio: %s<br>", SDL_GetError());
|
||||
g_pLogFile->ftextOut("Sound will be disabled.<br>");
|
||||
AudioSpec.channels = 0;
|
||||
AudioSpec.format = 0;
|
||||
AudioSpec.freq = 0;
|
||||
m_active = false;
|
||||
return false;
|
||||
}
|
||||
g_pLogFile->ftextOut("SoundDrv_Start(): Couldn't open audio: %s<br>", SDL_GetError());
|
||||
g_pLogFile->ftextOut("Sound will be disabled.<br>");
|
||||
AudioSpec.channels = 0;
|
||||
AudioSpec.format = 0;
|
||||
AudioSpec.freq = 0;
|
||||
m_active = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(&AudioSpec,obtained,sizeof(SDL_AudioSpec));
|
||||
delete obtained;
|
||||
|
||||
m_MixedForm = new Uint8[AudioSpec.size];
|
||||
|
||||
g_pLogFile->ftextOut("SDL_AudioSpec:<br>");
|
||||
@@ -83,16 +89,6 @@ bool CSound::init(void)
|
||||
|
||||
m_mixing_channels = 7;
|
||||
|
||||
switch(m_mixing_channels)
|
||||
{
|
||||
case 15: m_mixing_channels_base = 4; break;
|
||||
case 7: m_mixing_channels_base = 3; break;
|
||||
case 3: m_mixing_channels_base = 2;
|
||||
default: break;
|
||||
}
|
||||
|
||||
m_volume = 2; // Max Value!;
|
||||
|
||||
if(m_soundchannel) delete[] m_soundchannel; m_soundchannel = NULL;
|
||||
m_soundchannel = new CSoundChannel[m_mixing_channels];
|
||||
|
||||
@@ -502,7 +498,7 @@ char CSound::extractOfExeFile(char *inputpath, int episode)
|
||||
if (get_bit(&bit_count, &fin))
|
||||
{
|
||||
unsigned char tmp[2];
|
||||
if(fread(tmp, 1, 2, fin))
|
||||
if(!fread(tmp, 1, 2, fin))
|
||||
{
|
||||
g_pLogFile->ftextOut(RED,"Read-Error!");
|
||||
return 1;
|
||||
|
||||
@@ -52,10 +52,8 @@ private:
|
||||
|
||||
SDL_AudioSpec AudioSpec;
|
||||
|
||||
unsigned short m_volume;
|
||||
bool m_active;
|
||||
unsigned short m_mixing_channels;
|
||||
unsigned short m_mixing_channels_base;
|
||||
|
||||
Uint8 *m_MixedForm; // Mainly used by the callback function. Declared once and allocated
|
||||
};
|
||||
|
||||
@@ -24,14 +24,11 @@ CCredits::~CCredits() {
|
||||
|
||||
void CCredits::Render(stCloneKeenPlus *pCKP)
|
||||
{
|
||||
// TODO: Now that the new intro function works, the old one must become
|
||||
// a credits class
|
||||
|
||||
int mid[7];
|
||||
char scrolltext[7][80];
|
||||
int mid[51];
|
||||
char scrolltext[51][80];
|
||||
unsigned char pagenumber = 0;
|
||||
int timer = 8;
|
||||
int scrolly = 0;
|
||||
int scrolly = -51*8;
|
||||
bool cancel = false;
|
||||
|
||||
fade.mode = FADE_GO;
|
||||
@@ -42,7 +39,7 @@ void CCredits::Render(stCloneKeenPlus *pCKP)
|
||||
|
||||
showmapatpos(90, 104<<4, 32, 0, pCKP);
|
||||
|
||||
memset(scrolltext,0,7*80);
|
||||
memset(scrolltext,0,51*80);
|
||||
|
||||
do
|
||||
{
|
||||
@@ -61,11 +58,10 @@ void CCredits::Render(stCloneKeenPlus *pCKP)
|
||||
else
|
||||
{
|
||||
timer=0;
|
||||
if(scrolly>-7*8) scrolly--;
|
||||
if(scrolly>-51*8) scrolly--;
|
||||
else
|
||||
{
|
||||
scrolly = 200;
|
||||
memset(scrolltext,0,7*80);
|
||||
|
||||
switch(pagenumber)
|
||||
{
|
||||
@@ -74,71 +70,67 @@ void CCredits::Render(stCloneKeenPlus *pCKP)
|
||||
strcpy(scrolltext[1],"Interpreter of");
|
||||
strcpy(scrolltext[2],"Commander Keen 1-3");
|
||||
strcpy(scrolltext[3],"Credits");
|
||||
break;
|
||||
case 1:
|
||||
strcpy(scrolltext[0],"based on the engine of");
|
||||
strcpy(scrolltext[1],"CloneKeen by Shaw");
|
||||
strcpy(scrolltext[2],"and");
|
||||
strcpy(scrolltext[3],"CloneKeenPlus by Gerstrong");
|
||||
break;
|
||||
|
||||
case 2:
|
||||
strcpy(scrolltext[0],"Developers");
|
||||
strcpy(scrolltext[1],"of");
|
||||
strcpy(scrolltext[2],"Commander Genius");
|
||||
strcpy(scrolltext[3],"");
|
||||
strcpy(scrolltext[4],"Aka CloneKeenPlus");
|
||||
break;
|
||||
|
||||
case 3:
|
||||
strcpy(scrolltext[0],"Main Developer:");
|
||||
strcpy(scrolltext[1]," Gerstrong");
|
||||
strcpy(scrolltext[2],"Handheld Devices (Wiz):");
|
||||
strcpy(scrolltext[3]," Pickle");
|
||||
strcpy(scrolltext[4],"Resources:");
|
||||
strcpy(scrolltext[5]," Tulip");
|
||||
break;
|
||||
|
||||
case 4:
|
||||
strcpy(scrolltext[0],"Thanks to ID Software");
|
||||
strcpy(scrolltext[1],"for the wonderful");
|
||||
strcpy(scrolltext[2],"\"Commander Keen\" series.");
|
||||
strcpy(scrolltext[3],"");
|
||||
strcpy(scrolltext[4],"\"As a child, I spent way too");
|
||||
strcpy(scrolltext[5],"much time playing these games.");
|
||||
break;
|
||||
|
||||
|
||||
case 5:
|
||||
strcpy(scrolltext[0],"And now I have spent way");
|
||||
strcpy(scrolltext[1],"too much time programming");
|
||||
strcpy(scrolltext[2],"this game.");
|
||||
strcpy(scrolltext[3],"");
|
||||
strcpy(scrolltext[4],"...");
|
||||
strcpy(scrolltext[5],"Hmmm... Does history repeat itself?");
|
||||
strcpy(scrolltext[6],":)");
|
||||
break;
|
||||
|
||||
case 6:
|
||||
strcpy(scrolltext[0],"This is my tribute to");
|
||||
strcpy(scrolltext[1],"the \"Keen legacy\".");
|
||||
strcpy(scrolltext[2],"");
|
||||
strcpy(scrolltext[3],"Enjoy the Game.\"");
|
||||
strcpy(scrolltext[4],"");
|
||||
strcpy(scrolltext[5]," -Katy");
|
||||
strcpy(scrolltext[5],"");
|
||||
strcpy(scrolltext[6],"");
|
||||
strcpy(scrolltext[7],"");
|
||||
strcpy(scrolltext[8],"based on the engine of");
|
||||
strcpy(scrolltext[9],"CloneKeen by Shaw");
|
||||
strcpy(scrolltext[10],"and");
|
||||
strcpy(scrolltext[11],"CloneKeenPlus by Gerstrong");
|
||||
strcpy(scrolltext[12],"");
|
||||
strcpy(scrolltext[13],"");
|
||||
strcpy(scrolltext[14],"");
|
||||
strcpy(scrolltext[15],"");
|
||||
strcpy(scrolltext[16],"Developers");
|
||||
strcpy(scrolltext[17],"of");
|
||||
strcpy(scrolltext[18],"Commander Genius");
|
||||
strcpy(scrolltext[19],"");
|
||||
strcpy(scrolltext[20],"Aka CloneKeenPlus");
|
||||
strcpy(scrolltext[21],"");
|
||||
strcpy(scrolltext[22],"Main Developer:");
|
||||
strcpy(scrolltext[23]," Gerstrong");
|
||||
strcpy(scrolltext[24],"Handheld Devices (Wiz):");
|
||||
strcpy(scrolltext[25]," Pickle");
|
||||
strcpy(scrolltext[26],"Resources:");
|
||||
strcpy(scrolltext[27]," Tulip");
|
||||
strcpy(scrolltext[28],"");
|
||||
strcpy(scrolltext[29],"");
|
||||
strcpy(scrolltext[30],"");
|
||||
strcpy(scrolltext[31],"");
|
||||
strcpy(scrolltext[32],"\"As a child, I spent way too");
|
||||
strcpy(scrolltext[33],"much time playing these games.");
|
||||
strcpy(scrolltext[34],"Thanks to ID Software");
|
||||
strcpy(scrolltext[35],"for the wonderful");
|
||||
strcpy(scrolltext[36],"\"Commander Keen\" series.");
|
||||
strcpy(scrolltext[37],"");
|
||||
strcpy(scrolltext[38],"And now I have spent way");
|
||||
strcpy(scrolltext[39],"too much time programming");
|
||||
strcpy(scrolltext[40],"this game.");
|
||||
strcpy(scrolltext[41],"");
|
||||
strcpy(scrolltext[42],"...");
|
||||
strcpy(scrolltext[43],"Hmmm... Does history repeat itself?");
|
||||
strcpy(scrolltext[44],":)");
|
||||
strcpy(scrolltext[45],"");
|
||||
strcpy(scrolltext[46],"This is my tribute to");
|
||||
strcpy(scrolltext[47],"the \"Keen legacy\".");
|
||||
strcpy(scrolltext[48],"");
|
||||
strcpy(scrolltext[49],"Enjoy the Game.\"");
|
||||
strcpy(scrolltext[50]," -Katy");
|
||||
break;
|
||||
|
||||
default: cancel = true; break;
|
||||
}
|
||||
|
||||
for(int j=0 ; j<7 ; j++)
|
||||
for(int j=0 ; j<51 ; j++)
|
||||
mid[j] = (320-(strlen(scrolltext[j])<<3))>>1;
|
||||
pagenumber++;
|
||||
}
|
||||
}
|
||||
|
||||
for(int j=0 ; j<7 ; j++)
|
||||
g_pGraphics->sb_font_draw_inverse( (unsigned char*) scrolltext[j], mid[j], scrolly+(j<<3));
|
||||
for(int j=0 ; j<51 ; j++)
|
||||
if(scrolly+(j<<3) > -8 && scrolly+(j<<3) < 200)
|
||||
g_pGraphics->sb_font_draw_inverse( (unsigned char*) scrolltext[j], mid[j], scrolly+(j<<3));
|
||||
|
||||
if( g_pInput->getPressedAnyCommand() )
|
||||
{
|
||||
|
||||
@@ -332,6 +332,8 @@ bool CDialog::setNextSelection()
|
||||
|
||||
selection += i;
|
||||
}
|
||||
else if(selection >= number_of_options-1)
|
||||
selection = -1;
|
||||
|
||||
return setSelection(selection+1);
|
||||
}
|
||||
@@ -346,6 +348,8 @@ bool CDialog::setPrevSelection()
|
||||
|
||||
selection -= i;
|
||||
}
|
||||
else if(selection-1 < 0)
|
||||
selection = number_of_options;
|
||||
|
||||
return setSelection(selection-1);
|
||||
}
|
||||
|
||||
@@ -54,6 +54,8 @@ void CIntro::Render(stCloneKeenPlus *pCKP)
|
||||
for(int j=0 ; j<7 ; j++)
|
||||
mid[j] = (320/2)-(bitmaps[bmnum[j]].xsize/2);
|
||||
|
||||
g_pInput->flushAll();
|
||||
|
||||
do
|
||||
{
|
||||
// do fades
|
||||
@@ -63,13 +65,13 @@ void CIntro::Render(stCloneKeenPlus *pCKP)
|
||||
// blit the scrollbuffer to the display
|
||||
gamedo_frameskipping_blitonly();
|
||||
|
||||
g_pGraphics->drawBitmap(mid[0], scrolly, bmnum[0]);
|
||||
g_pGraphics->drawBitmap(mid[1], scrolly+9, bmnum[1]);
|
||||
g_pGraphics->drawBitmap(mid[2], scrolly+43, bmnum[2]);
|
||||
g_pGraphics->drawBitmap(mid[3], scrolly+56, bmnum[3]);
|
||||
g_pGraphics->drawBitmap(mid[4], scrolly+77, bmnum[4]);
|
||||
g_pGraphics->drawBitmap(mid[5], scrolly+87, bmnum[5]);
|
||||
g_pGraphics->drawBitmap(mid[6], scrolly+120, bmnum[6]);
|
||||
g_pGraphics->drawBitmap2FG(mid[0], scrolly, bmnum[0]);
|
||||
g_pGraphics->drawBitmap2FG(mid[1], scrolly+9, bmnum[1]);
|
||||
g_pGraphics->drawBitmap2FG(mid[2], scrolly+43, bmnum[2]);
|
||||
g_pGraphics->drawBitmap2FG(mid[3], scrolly+56, bmnum[3]);
|
||||
g_pGraphics->drawBitmap2FG(mid[4], scrolly+77, bmnum[4]);
|
||||
g_pGraphics->drawBitmap2FG(mid[5], scrolly+87, bmnum[5]);
|
||||
g_pGraphics->drawBitmap2FG(mid[6], scrolly+120, bmnum[6]);
|
||||
|
||||
gamedo_AnimatedTiles();
|
||||
|
||||
@@ -83,7 +85,7 @@ void CIntro::Render(stCloneKeenPlus *pCKP)
|
||||
if(scrolly>35) scrolly--;
|
||||
}
|
||||
|
||||
if( g_pInput->getPressedAnyCommand() )
|
||||
if( g_pInput->getPressedAnyKey() || g_pInput->getPressedAnyCommand() )
|
||||
{
|
||||
cancel = true;
|
||||
fade.dir = FADE_OUT;
|
||||
|
||||
Reference in New Issue
Block a user