This commit is contained in:
Paul 2001-02-09 17:01:04 +00:00
parent 0d4d68d560
commit abd4133a86
24 changed files with 429 additions and 164 deletions

View File

@ -30,6 +30,7 @@ music/sb-title.vh
sfx/ingame.pxm
sfx/ingame.vb
sfx/ingame.vh
demo/demo____.dmo
backdrop/credits.gfx
backdrop/sky.gfx
memcard/memhead.bin

View File

@ -141,7 +141,8 @@ pad_src := pads
paul_src := paul \
scenesel
player_src := panimsfx \
player_src := demoplay \
panimsfx \
player \
pmodes \
psbutt \

View File

@ -464,6 +464,31 @@ GRAF_DIRS_TO_MAKE += $(SCRIPTS_OUT_DIR)
GFX_DATA_OUT += $(SCRIPTS_OUT)
#----------------------------------------------------------------------------
# Demo mode data
#----------------------------------------------------------------------------
DEMO_IN_DIR := data/demo
DEMO_OUT_DIR := $(DATA_OUT)/demo
DEMO_LIST := demo____
DEMO_ALL_IN := $(foreach DEMO,$(DEMO_LIST),$(DEMO_IN_DIR)/$(DEMO).dmo)
DEMO_ALL_OUT := $(foreach DEMO,$(DEMO_LIST),$(DEMO_OUT_DIR)/$(DEMO).dmo)
demo: $(DEMO_ALL_OUT)
cleandemo:
@$(RM) -f $(DEMO_ALL_OUT)
@$(ECHO) Demo Cleaned
$(DEMO_ALL_OUT) : $(DEMO_ALL_IN)
$(CP) $(DEMO_ALL_IN) $(DEMO_OUT_DIR)
$(ATTRIB) -r $(DEMO_ALL_OUT)
GRAF_DIRS_TO_MAKE += $(DEMO_OUT_DIR)
GFX_DATA_OUT += $(DEMO_ALL_OUT)
#----------------------------------------------------------------------------
# Dirs to Make
#----------------------------------------------------------------------------

View File

@ -46,6 +46,10 @@
#include "gfx\prim.h"
#endif
#ifndef __PLAYER_DEMOPLAY_H__
#include "player\demoplay.h"
#endif
/* Std Lib
------- */
@ -73,7 +77,25 @@
/*----------------------------------------------------------------------
Vars
---- */
static int count;
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CDemoGameScene::createPlayer()
{
m_player=new ("player") CDemoPlayer();
((CDemoPlayer*)m_player)->loadControlData(DEMO_DEMO_____DMO); // Ooo
}
/*----------------------------------------------------------------------
Function:
@ -87,6 +109,7 @@ void CFrontEndDemoMode::init()
m_smallFont->initialise(&standardFont);
m_smallFont->setJustification(FontBank::JUST_CENTRE);
m_smallFont->setOt(500);
m_smallFont->setWobble(true);
}
/*----------------------------------------------------------------------
@ -108,9 +131,9 @@ void CFrontEndDemoMode::shutdown()
---------------------------------------------------------------------- */
void CFrontEndDemoMode::select()
{
// LOAD UP DEMO AND DEMO LEVEL
m_gameScene=new ("Demo Game Scene") CDemoGameScene();
m_gameScene->init();
m_shuttingDown=false;
count=0;
CFader::setFadingIn();
}
@ -122,7 +145,7 @@ count=0;
---------------------------------------------------------------------- */
void CFrontEndDemoMode::unselect()
{
// DUMP DEMO AND LEVEL
m_gameScene->shutdown(); delete m_gameScene;
}
/*----------------------------------------------------------------------
@ -135,6 +158,8 @@ void CFrontEndDemoMode::render()
{
sFrameHdr *fh;
m_gameScene->render();
// Game logo/title
CFrontEndScene::renderLogo();
@ -143,20 +168,6 @@ void CFrontEndDemoMode::render()
m_smallFont->setColour(PRESS_START_TEXT_R,PRESS_START_TEXT_G,PRESS_START_TEXT_B);
m_smallFont->print(256,PRESS_START_TEXT_Y,STR__FRONTEND__PRESS_START);
}
m_smallFont->setColour(getRndRange(255),getRndRange(255),getRndRange(255));
m_smallFont->print(getRndRange(512),getRndRange(256),">DEMO MODE<");
POLY_G4 *g4;
g4=GetPrimG4();
setXYWH(g4,0,0,512,256);
setRGB0(g4,99,50,50);
setRGB1(g4,50,50,99);
setRGB2(g4,50,99,50);
setRGB3(g4,99,50,99);
AddPrimToList(g4,MAX_OT-1);
}
/*----------------------------------------------------------------------
@ -167,10 +178,12 @@ void CFrontEndDemoMode::render()
---------------------------------------------------------------------- */
void CFrontEndDemoMode::think(int _frames)
{
m_gameScene->think(_frames);
if(!m_shuttingDown&&!CFader::isFading())
{
count+=_frames;
if(PadGetDown(0)&PAD_START||count>60*20) // OR DEMO ENDED
if(PadGetDown(0)&PAD_START||
((CDemoPlayer*)m_gameScene->getPlayer())->getFramesLeft()<FADE_OUT_FRAMES)
{
m_shuttingDown=true;
CFader::setFadingOut();

View File

@ -22,6 +22,10 @@
#include "frontend\frontend.h"
#endif
#ifndef __GAME_GAME_H__
#include "game\game.h"
#endif
/* Std Lib
------- */
@ -34,6 +38,13 @@
Structure defintions
-------------------- */
class CDemoGameScene : public CGameScene
{
public:
void createPlayer();
};
class CFrontEndDemoMode : public CFrontEndMode
{
public:
@ -51,21 +62,20 @@ public:
private:
enum
{
LOGO_CENTRE_Y=74,
GAME_TITLE_TEXT_CENTRE_Y=100,
GAME_TITLE_TEXT_R=128,
GAME_TITLE_TEXT_G=128,
GAME_TITLE_TEXT_B=128,
PRESS_START_TEXT_Y=180,
PRESS_START_TEXT_R=150,
PRESS_START_TEXT_G=100,
PRESS_START_TEXT_B=100,
// Fade-out to titles this many frames before end of demo
FADE_OUT_FRAMES=95,
};
class FontBank *m_smallFont;
int m_shuttingDown;
CDemoGameScene *m_gameScene;
};

View File

@ -175,8 +175,8 @@ void CFrontEndMainTitles::select()
SetScreenImage(s_image);
CSoundMediator::setSong(CSoundMediator::SONG_TITLE);
CSoundMediator::playSong();
m_musicStarted=false;
CFader::setFadingIn();
}
@ -306,6 +306,13 @@ void CFrontEndMainTitles::think(int _frames)
{
sval=(sval+(seaspeed*_frames))&4095;
// Wait until fade in has finished before starting music
if(!m_musicStarted&&!CFader::isFading())
{
CSoundMediator::playSong();
m_musicStarted=true;
}
switch(m_mode)
{
case MODE__PRESS_START:

View File

@ -100,6 +100,7 @@ private:
int m_gotoCreditsFlag;
int m_demoTimeout;
int m_musicStarted;
};

View File

@ -21,6 +21,7 @@
#ifndef __PLAYER_PLAYER_H__
#include "player\player.h"
#endif
#include "player\demoplay.h"
#ifndef __ENEMY_2DENEMY_H__
#include "enemy\2denemy.h"
@ -34,9 +35,6 @@
#include "gfx\fader.h"
#endif
#include "level\level.h"
#include "gfx\anim.h"
#ifndef __GFX_BUBICLES__
#include "gfx\bubicles.h"
#endif
@ -45,6 +43,9 @@
#include <ingamefx.h>
#endif
#ifndef _ANIMTEX_HEADER_
#include "gfx\animtex.h"
#endif
int GX=248;
@ -83,19 +84,26 @@ void CGameScene::init()
enemy->init();
#endif
m_player=new ("player") CPlayer();
createPlayer();
m_player->init();
m_player->setLayerCollision(Level.getCollisionLayer());
CAnimDB::LoadAnims();
CFader::setFadingIn();
SetGeomOffset( GX, GY );
SetGeomScreen(GH);
}
/*****************************************************************************/
// This is a seperate funtion ( and virtual ) so that we can overload it for
// the demo mode (pkg)
// NB: This function should *only* include the new function - Don't add anything else here!
void CGameScene::createPlayer()
{
m_player=new ("player") CPlayer();
}
/*****************************************************************************/
void CGameScene::shutdown()
@ -121,12 +129,12 @@ void CGameScene::render()
/*****************************************************************************/
void CGameScene::think(int _frames)
{
#ifdef __USER_paul__
if(!CConversation::isActive()&&PadGetDown(0)&PAD_START)
{
CConversation::trigger(SCRIPTS_SPEECHTEST_DAT);
}
#endif
//#ifdef __USER_paul__
// if(!CConversation::isActive()&&PadGetDown(0)&PAD_START)
// {
// CConversation::trigger(SCRIPTS_SPEECHTEST_DAT);
// }
//#endif
CConversation::think(_frames);
if(!CConversation::isActive())

View File

@ -27,6 +27,7 @@ virtual ~CGameScene() {;}
void init();
virtual void createPlayer();
void shutdown();
void render();
void think(int _frames);
@ -37,7 +38,7 @@ virtual ~CGameScene() {;}
class CPlayer *getPlayer();
void sendEvent( GAME_EVENT evt, CThing *sourceThing );
private:
protected:
CLevel Level;
class CPlayer *m_player;

View File

@ -64,6 +64,8 @@ int Size=Width*Height;
/*****************************************************************************/
void CLayerTile3d::shutdown()
{
MemFree(RenderFlagTable);
MemFree(PrimGrid);
}
/*****************************************************************************/

View File

@ -38,7 +38,11 @@ CLevel::~CLevel()
{
for (int i=0; i<CLayerTile::LAYER_TILE_TYPE_MAX; i++)
{
if (TileLayers[i]) delete TileLayers[i];
if (TileLayers[i])
{
TileLayers[i]->shutdown();
delete TileLayers[i];
}
}
}
@ -47,7 +51,7 @@ void CLevel::init()
{
TileBankHdr=(sTileBankHdr *)CFileIO::loadFile(LEVELS_CHAPTER02_LEVEL04_TBK,"Tile Bank Data");
LevelHdr=(sLvlHdr *)CFileIO::loadFile(LEVELS_CHAPTER02_LEVEL0401_LVL,"Level Data");
TPLoadTex(LEVELS_CHAPTER02_LEVEL04_TEX);
m_levelTPage=TPLoadTex(LEVELS_CHAPTER02_LEVEL04_TEX);
initLayers();
}
@ -110,6 +114,9 @@ sTile *TileList=(sTile*)MakePtr(TileBankHdr,TileBankHdr->TileList);
/*****************************************************************************/
void CLevel::shutdown()
{
TPFree(m_levelTPage);
CollisionLayer->shutdown(); MemFree(CollisionLayer);
MemFree(TileBankHdr);
MemFree(LevelHdr);
}

View File

@ -34,6 +34,8 @@ private:
sTileBankHdr *TileBankHdr;
static DVECTOR MapPos;
TPAGE_DESC m_levelTPage;
// Tile Layers
CLayerTile *TileLayers[CLayerTile::LAYER_TILE_TYPE_MAX];

View File

@ -47,10 +47,79 @@
Params:
Returns:
---------------------------------------------------------------------- */
#include "utils\utils.h"
void CDemoPlayer::loadControlData(FileEquate _fe)
{
int *hdr;
m_demoData=(char*)CFileIO::loadFile(_fe);
hdr=(int*)m_demoData;
m_controlFrameCount=hdr[0];
m_controlDataSize=hdr[1];
m_controlData=(demoPlayerControl*)(m_demoData+(sizeof(int)*2));
m_currentControlFrame=0;
m_frameCount=0;
m_totalFrameCount=0;
PAUL_DBGMSG("Loaded demo data");
PAUL_DBGMSG("%d actions, %d frames",m_controlDataSize,m_controlFrameCount);
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
int CDemoPlayer::getFramesLeft()
{
return m_controlFrameCount-m_totalFrameCount;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CDemoPlayer::shutdown()
{
MemFree(m_demoData);
CPlayer::shutdown();
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
PLAYERINPUT CDemoPlayer::readPadInput()
{
return PI_NONE;
PLAYERINPUT input;
if(m_currentControlFrame>=m_controlDataSize)
{
// End of control data reached
input=PI_NONE;
}
else
{
demoPlayerControl *crnt;
crnt=&m_controlData[m_currentControlFrame];
input=(PLAYERINPUT)crnt->m_inputValue;
if(++m_frameCount==crnt->m_length)
{
m_currentControlFrame++;
m_frameCount=0;
}
m_totalFrameCount++;
}
return input;
}

View File

@ -22,6 +22,10 @@
#include "player/player.h"
#endif
#ifndef _FILEIO_HEADER_
#include "fileio\fileio.h"
#endif
/* Std Lib
------- */
@ -43,9 +47,26 @@ public:
u8 m_length;
}demoPlayerControl;
void loadControlData(FileEquate _fe);
int getFramesLeft();
virtual void shutdown();
protected:
virtual PLAYERINPUT readPadInput();
private:
char *m_demoData;
demoPlayerControl *m_controlData;
int m_controlDataSize;
int m_controlFrameCount;
int m_currentControlFrame;
int m_frameCount;
int m_totalFrameCount;
};

View File

@ -56,6 +56,9 @@
Tyepdefs && Defines
------------------- */
//#define _RECORD_DEMO_MODE_
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
@ -68,8 +71,42 @@
Vars
---- */
#ifdef _RECORD_DEMO_MODE_
#include "player\demoplay.h"
#define MAX_DEMO_SIZE 512 // So max size of a demo is 1k
#define MAX_DEMO_TIME_IN_FRAMES 30*60 // Recorded demo will last 60 seconds
static CDemoPlayer::demoPlayerControl s_demoControls[MAX_DEMO_SIZE]={{PI_NONE,0}};
static int s_demoSize=0;
static int s_demoFrameCount=0;
static void writeDemoControls()
{
char filename[32];
int fh;
int fc=MAX_DEMO_TIME_IN_FRAMES;
sprintf(filename,"demo____.dmo");
fh=PCcreat((char *)filename,0);
ASSERT(fh!=-1);
PCwrite(fh,(char*)&fc,sizeof(fc)); // frame count
PCwrite(fh,(char*)&s_demoSize,sizeof(s_demoSize)); // demo size
for(int i=0;i<s_demoSize;i++)
PCwrite(fh,(char*)&s_demoControls[i],sizeof(CDemoPlayer::demoPlayerControl)); // control data
PCclose(fh);
SYSTEM_DBGMSG("Written demo file %s with %d frames",filename,s_demoSize);
}
#endif
int s_health;
int s_screenPos;
int m_cameraScrollPos=0;
int m_cameraScrollDir=0;
int MAP3D_CENTRE_X=170;
@ -80,10 +117,6 @@ int MAP2D_CENTRE_X=-256;
int MAP2D_CENTRE_Y=-136;
int MAP2D_BLOCKSTEPSIZE=16;
int m_cameraScrollPos=0;
int m_cameraScrollDir=0;
int CAMERA_SCROLLLIMIT=8;
int CAMERA_SCROLLTHRESHOLD=6;
int CAMERA_SCROLLSPEED=60;
@ -93,6 +126,9 @@ int CAMERA_STOPMOVETHRESHOLD=10;
int angg=900;
DVECTOR ppos={0,0};
DVECTOR ofs={0,0};
/*----------------------------------------------------------------------
Function:
@ -131,14 +167,12 @@ m_animFrame=0;
Pos.vy=10;
#endif
m_cameraOffsetTarget.vx=0;
m_cameraOffsetTarget.vy=0;
m_cameraOffset.vx=0;
m_cameraOffset.vy=0;
m_cameraLookYOffset=0;
m_cameraLookTimer=0;
m_lastPadInput=m_padInput=0;
m_lastPadInput=m_padInput=PI_NONE;
s_health=5;
s_screenPos=128;
@ -165,13 +199,7 @@ void CPlayer::shutdown()
Returns:
---------------------------------------------------------------------- */
#ifdef __USER_paul__
// -90,-136
// -256,-136
// -432,-136
DVECTOR ofs={-256,-136}; // nearly -256,-128 ;)
int newmode=-1;
#else
DVECTOR ofs={0,0}; //temporary
#endif
void CPlayer::think(int _frames)
@ -221,6 +249,7 @@ if(newmode!=-1)
// Horizontal movement
if(m_layerCollision->Get((Pos.vx+(m_moveVel.vx>>VELOCITY_SHIFT))>>4,(Pos.vy-1)>>4))
{
// Will hit a wall this frame - Do collision
// Move flush with the edge of the obstruction
int dir,vx,cx,y,i;
if(m_moveVel.vx<0)
@ -245,7 +274,7 @@ if(newmode!=-1)
}
Pos.vx=cx-dir;
// If running then idle, otherwise leave in same state
// If running then go to idle, otherwise leave in same state
if(m_currentState==STATE_RUN)
{
setState(STATE_IDLE);
@ -254,13 +283,9 @@ if(newmode!=-1)
}
else
{
// No obstruction this frame - Do the movement
Pos.vx+=m_moveVel.vx>>VELOCITY_SHIFT;
}
if(m_currentState==STATE_IDLE&&isOnEdge())
{
setState(STATE_IDLETEETER);
}
// Vertical movement
Pos.vy+=m_moveVel.vy>>VELOCITY_SHIFT;
@ -318,6 +343,12 @@ Pos.vy=((Pos.vy-16)&0xfffffff0)+colHeight;
m_invincibleFrameCount--;
}
// Teeter if on an edge
if(m_currentState==STATE_IDLE&&isOnEdge())
{
setState(STATE_IDLETEETER);
}
// Look around
int pad=getPadInputHeld();
if(getPadInputDown()&PAD_CIRCLE)
@ -326,34 +357,31 @@ if(getPadInputDown()&PAD_CIRCLE)
}
// Map scroll..
if(m_cameraScrollDir==-1)
{
//right
if(m_cameraScrollPos>-CAMERA_SCROLLLIMIT<<8)
// Camera scroll..
if(m_cameraScrollDir==-1)
{
m_cameraScrollPos-=CAMERA_SCROLLSPEED;
if(m_cameraScrollPos<-CAMERA_SCROLLLIMIT<<8)
if(m_cameraScrollPos>-CAMERA_SCROLLLIMIT<<8)
{
m_cameraScrollPos=-CAMERA_SCROLLLIMIT<<8;
m_cameraScrollDir=0;
m_cameraScrollPos-=CAMERA_SCROLLSPEED;
if(m_cameraScrollPos<-CAMERA_SCROLLLIMIT<<8)
{
m_cameraScrollPos=-CAMERA_SCROLLLIMIT<<8;
m_cameraScrollDir=0;
}
}
}
}
else if(m_cameraScrollDir==+1)
{
//left
if(m_cameraScrollPos<(CAMERA_SCROLLLIMIT<<8))
else if(m_cameraScrollDir==+1)
{
m_cameraScrollPos+=CAMERA_SCROLLSPEED;
if(m_cameraScrollPos>CAMERA_SCROLLLIMIT<<8)
if(m_cameraScrollPos<(CAMERA_SCROLLLIMIT<<8))
{
m_cameraScrollPos=CAMERA_SCROLLLIMIT<<8;
m_cameraScrollDir=0;
m_cameraScrollPos+=CAMERA_SCROLLSPEED;
if(m_cameraScrollPos>CAMERA_SCROLLLIMIT<<8)
{
m_cameraScrollPos=CAMERA_SCROLLLIMIT<<8;
m_cameraScrollDir=0;
}
}
}
}
@ -417,29 +445,15 @@ if(getPadInputDown()&PAD_CIRCLE)
#endif
// Move the camera offset
m_cameraOffsetTarget=ofs;
m_cameraOffset=ofs;
/*
for(i=0;i<_frames;i++)
{
int moveDelta;
moveDelta=(m_cameraOffset.vx-m_cameraOffsetTarget.vx);
if(moveDelta)
{
if(moveDelta<0)
{
moveDelta>>=2;
if(moveDelta==0)moveDelta=1;
}
else if(moveDelta>0)
{
moveDelta>>=2;
if(moveDelta==0)moveDelta=-1;
}
m_cameraOffset.vx+=moveDelta;
}
}
*/
ppos.vx=MAP3D_CENTRE_X+((MAP3D_BLOCKSTEPSIZE*m_cameraScrollPos)>>8);
ppos.vy=MAP3D_CENTRE_Y;
ofs.vx=MAP2D_CENTRE_X+((MAP2D_BLOCKSTEPSIZE*(-m_cameraScrollPos))>>8);
ofs.vy=MAP2D_CENTRE_Y;
m_cameraOffset=ofs;
if(Pos.vx<0)Pos.vx=0;
if(Pos.vy<0)Pos.vy=0;
}
@ -451,11 +465,6 @@ m_cameraOffset=ofs;
Returns:
---------------------------------------------------------------------- */
int panim=-1;
// -3912,500
// 130,500
// 4172,500
DVECTOR ppos={130,500};
//int moff=0;
#ifdef __USER_paul__
int mouth=-1,eyes=-1;
@ -480,12 +489,6 @@ if(eyes!=-1)
}
#endif
ppos.vx=MAP3D_CENTRE_X+((MAP3D_BLOCKSTEPSIZE*m_cameraScrollPos)>>8);
ppos.vy=MAP3D_CENTRE_Y;
ofs.vx=MAP2D_CENTRE_X+((MAP2D_BLOCKSTEPSIZE*(-m_cameraScrollPos))>>8);
ofs.vy=MAP2D_CENTRE_Y;
//int xval=255-(MAP2D_BLOCKSTEPSIZE*(-m_cameraScrollPos>>8));
//DrawLine(xval-7,0,xval-7,255,0,128,255,0);
//DrawLine(xval+7,0,xval+7,255,0,128,255,0);
@ -513,7 +516,7 @@ DVECTOR CPlayer::getCameraPos()
{
DVECTOR cameraPos;
cameraPos.vx=Pos.vx+m_cameraOffset.vx;
cameraPos.vy=Pos.vy+m_cameraOffset.vy;//+m_cameraLookYOffset;
cameraPos.vy=Pos.vy+m_cameraOffset.vy;
return cameraPos;
}
@ -678,11 +681,11 @@ DVECTOR CPlayer::getPlayerPos()
Params:
Returns:
---------------------------------------------------------------------- */
int CPlayer::getPadInputHeld()
PLAYERINPUT CPlayer::getPadInputHeld()
{
return m_padInput;
}
int CPlayer::getPadInputDown()
PLAYERINPUT CPlayer::getPadInputDown()
{
return m_padInputDown;
}
@ -905,7 +908,7 @@ void CPlayer::updatePadInput()
{
m_lastPadInput=m_padInput;
m_padInput=readPadInput();
m_padInputDown=m_padInput&(m_lastPadInput^-1);
m_padInputDown=(PLAYERINPUT)(m_padInput&(m_lastPadInput^-1));
}
@ -915,9 +918,74 @@ void CPlayer::updatePadInput()
Params:
Returns:
---------------------------------------------------------------------- */
int CPlayer::readPadInput()
PLAYERINPUT CPlayer::readPadInput()
{
return PadGetHeld(0);
PLAYERINPUT input;
int pad;
input=PI_NONE;
pad=PadGetHeld(0);
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_UP))
{
input=(PLAYERINPUT)(input|PI_UP);
}
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN))
{
input=(PLAYERINPUT)(input|PI_DOWN);
}
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
{
input=(PLAYERINPUT)(input|PI_LEFT);
}
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
{
input=(PLAYERINPUT)(input|PI_RIGHT);
}
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP))
{
input=(PLAYERINPUT)(input|PI_JUMP);
}
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION))
{
input=(PLAYERINPUT)(input|PI_ACTION);
}
#ifdef _RECORD_DEMO_MODE_
CDemoPlayer::demoPlayerControl *crnt;
PLAYERINPUT lastInput;
crnt=&s_demoControls[s_demoSize];
if(s_demoFrameCount==0)
{
crnt->m_inputValue=input;
}
lastInput=(PLAYERINPUT)crnt->m_inputValue;
if(crnt->m_length==255)
{
lastInput=(PLAYERINPUT)(input-1);
}
if(lastInput==input)
{
crnt->m_length++;
}
else
{
s_demoSize++;
ASSERT(s_demoSize<MAX_DEMO_SIZE);
crnt++;
crnt->m_inputValue=input;
crnt->m_length=1;
}
s_demoFrameCount++;
if(s_demoFrameCount==30*60)
{
writeDemoControls();
ASSERT(!"DEMO ENDED");
}
#endif
return input;
}

View File

@ -106,6 +106,22 @@ typedef enum
}DAMAGE_TYPE;
// The input from the control pad is remapped to this rather than keeping it in the
// normal pad format. This allows us to store all input in one byte ( as opposed to
// two bytes ) for demo recording and means that the player state codes don't have
// to keep using CPadConfig to remap the controls internally.
typedef enum
{
PI_NONE =0,
PI_UP =1<<0,
PI_DOWN =1<<1,
PI_LEFT =1<<2,
PI_RIGHT =1<<3,
PI_JUMP =1<<4,
PI_ACTION =1<<5,
}PLAYERINPUT;
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
@ -124,10 +140,10 @@ public:
VELOCITY_SHIFT=2
};
void init();
void shutdown();
void think(int _frames);
void render();
virtual void init();
virtual void shutdown();
virtual void think(int _frames);
virtual void render();
DVECTOR getCameraPos();
@ -161,8 +177,8 @@ protected:
DVECTOR getMoveVelocity();
void setMoveVelocity(DVECTOR *_moveVel);
DVECTOR getPlayerPos();
int getPadInputHeld();
int getPadInputDown();
PLAYERINPUT getPadInputHeld();
PLAYERINPUT getPadInputDown();
// Collision
int isOnSolidGround();
@ -231,17 +247,19 @@ private:
int m_lives;
DVECTOR m_cameraOffsetTarget;
DVECTOR m_cameraOffset;
int m_cameraLookYOffset;
int m_cameraLookTimer;
void updatePadInput();
virtual int readPadInput();
int m_padInput; // Controls that are being held down
int m_lastPadInput; // Last frames controls
int m_padInputDown; // Controls that were pressed this frame
protected:
virtual PLAYERINPUT readPadInput();
private:
PLAYERINPUT m_padInput; // Controls that are being held down
PLAYERINPUT m_lastPadInput; // Last frames controls
PLAYERINPUT m_padInputDown; // Controls that were pressed this frame
// Pointer to the collision layer for the current map
class CLayerCollision *m_layerCollision;
};

View File

@ -93,11 +93,11 @@ void CPlayerStateRunChop::think(CPlayer *_player)
int controlHeld;
controlHeld=getPadInputHeld(_player);
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
moveLeft(_player);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
moveRight(_player);
}
@ -131,11 +131,11 @@ void CPlayerStateAirChop::think(CPlayer *_player)
int controlHeld;
controlHeld=getPadInputHeld(_player);
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
moveLeft(_player);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
moveRight(_player);
}

View File

@ -114,7 +114,7 @@ void CPlayerStateSoakUp::think(CPlayer *_player)
int controlHeld;
controlHeld=getPadInputHeld(_player);
if(!(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)))
if(!(controlHeld&PI_DOWN))
{
setState(_player,STATE_GETUP);
}

View File

@ -83,11 +83,11 @@ void CPlayerStateFall::think(CPlayer *_player)
metrics=getPlayerMetrics(_player);
controlHeld=getPadInputHeld(_player);
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
moveLeft(_player);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
moveRight(_player);
}
@ -98,11 +98,11 @@ void CPlayerStateFall::think(CPlayer *_player)
fall(_player);
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION))
if(controlHeld&PI_ACTION)
{
setState(_player,STATE_AIRATTACK);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN))
else if(controlHeld&PI_DOWN)
{
move.vx=0;
move.vy=0;
@ -138,11 +138,11 @@ void CPlayerStateFallFar::think(CPlayer *_player)
controlHeld=getPadInputHeld(_player);
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
moveLeft(_player);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
moveRight(_player);
}

View File

@ -71,25 +71,25 @@ void CPlayerStateBaseIdle::thinkControl(CPlayer *_player)
controlDown=getPadInputDown(_player);
controlHeld=getPadInputHeld(_player);
if(controlDown&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP))
if(controlDown&PI_JUMP)
{
setState(_player,STATE_JUMP);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
else if(controlHeld&PI_LEFT)
{
if(canMoveLeft(_player))
setState(_player,STATE_RUN);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
if(canMoveRight(_player))
setState(_player,STATE_RUN);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION))
else if(controlHeld&PI_ACTION)
{
setState(_player,STATE_ATTACK);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN))
else if(controlHeld&PI_DOWN)
{
setState(_player,STATE_DUCK);
}

View File

@ -95,7 +95,7 @@ void CPlayerStateJump::think(CPlayer *_player)
metrics=getPlayerMetrics(_player);
controlHeld=getPadInputHeld(_player);
if(m_jumpFrames<=metrics->m_metric[PM__MAX_JUMP_FRAMES]&&controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP))
if(m_jumpFrames<=metrics->m_metric[PM__MAX_JUMP_FRAMES]&&PI_JUMP)
{
m_jumpFrames++;
}
@ -104,15 +104,15 @@ void CPlayerStateJump::think(CPlayer *_player)
setState(_player,STATE_FALL);
}
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION))
if(controlHeld&PI_ACTION)
{
setState(_player,STATE_AIRATTACK);
}
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
moveLeft(_player);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
moveRight(_player);
}

View File

@ -78,11 +78,11 @@ void CPlayerStateRun::enter(CPlayer *_player)
setAnimNo(_player,ANIM_PLAYER_ANIM_RUNSTART);
}
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
setFacing(_player,FACING_LEFT);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
setFacing(_player,FACING_RIGHT);
}
@ -103,24 +103,24 @@ void CPlayerStateRun::think(CPlayer *_player)
controlDown=getPadInputDown(_player);
controlHeld=getPadInputHeld(_player);
if(controlDown&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP))
if(controlDown&PI_JUMP)
{
setState(_player,STATE_JUMP);
}
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN))
if(controlHeld&PI_DOWN)
{
setState(_player,STATE_DUCK);
}
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION))
if(controlHeld&PI_ACTION)
{
setState(_player,STATE_RUNATTACK);
}
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT))
if(controlHeld&PI_LEFT)
{
moveLeft(_player);
}
else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))
else if(controlHeld&PI_RIGHT)
{
moveRight(_player);
}

View File

@ -13,6 +13,7 @@
#include "utils\utils.h"
#include "system\gp.h"
#include "gfx\anim.h"
// scenes
#include "game\game.h"
@ -116,6 +117,8 @@ void InitSystem() // reordered to reduce black screen (hope all is well
CBubicleFactory::init();
CAnimDB::LoadAnims();
#if defined(__DEBUG_MEM__)
DebugMemFontInit();
#endif

View File

@ -669,6 +669,14 @@ SOURCE=..\..\..\source\paul\scenesel.h
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\..\..\source\player\demoplay.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\source\player\demoplay.h
# End Source File
# Begin Source File
SOURCE=..\..\..\source\player\panimsfx.cpp
# End Source File
# Begin Source File