SBSPSS/source/game/game.cpp

396 lines
9.2 KiB
C++
Raw Normal View History

2000-08-29 21:54:22 +02:00
/**********************/
/*** Main Game File ***/
/**********************/
#include "system\global.h"
#include "fileio\fileio.h"
#include "pad\pads.h"
#include "system\vid.h"
#include "gfx\prim.h"
#include "utils\utils.h"
2000-12-07 16:56:20 +01:00
#include "level\level.h"
2000-08-29 21:54:22 +02:00
#include "game\game.h"
#include "system\gstate.h"
#include "gfx\font.h"
#include "gfx\fdata.h"
2001-01-22 21:57:39 +01:00
#ifndef __GAME_CONVO_H__
#include "game\convo.h"
#endif
2001-01-16 17:20:45 +01:00
#ifndef __PLAYER_PLAYER_H__
#include "player\player.h"
#endif
2001-02-09 18:01:04 +01:00
#include "player\demoplay.h"
2001-01-16 17:20:45 +01:00
2001-02-28 20:49:12 +01:00
#ifndef __ENEMY_NPC_H__
#include "enemy\npc.h"
2001-01-16 17:20:45 +01:00
#endif
2001-03-08 21:12:47 +01:00
#ifndef __ENEMY_NPLATFRM_H__
#include "enemy\nplatfrm.h"
#endif
2001-01-22 17:02:38 +01:00
#ifndef __PROJECTL_PROJECTL_H__
#include "projectl\projectl.h"
#endif
2001-01-15 23:02:25 +01:00
#ifndef __GFX_FADER_H__
#include "gfx\fader.h"
#endif
2000-10-18 20:37:39 +02:00
#ifndef __GFX_BUBICLES__
#include "gfx\bubicles.h"
#endif
2000-10-31 17:41:02 +01:00
#ifndef __SPR_INGAMEFX_H__
#include <ingamefx.h>
#endif
2001-02-09 18:01:04 +01:00
#ifndef _ANIMTEX_HEADER_
#include "gfx\animtex.h"
#endif
2000-10-18 20:37:39 +02:00
2001-02-09 22:41:55 +01:00
#ifndef __GAME_PAUSE_H__
#include "game\pause.h"
#endif
2001-02-12 18:18:17 +01:00
#ifndef __FRONTEND_FRONTEND_H__
#include "frontend\frontend.h"
#endif
2001-02-21 18:09:19 +01:00
#ifndef __PICKUPS_PICKUP_H__
#include "pickups\pickup.h"
#endif
2001-02-12 18:18:17 +01:00
2000-08-29 21:54:22 +02:00
2001-03-29 18:13:50 +02:00
#ifndef __SOUND_SOUND_H__
#include "sound\sound.h"
#endif
2001-04-01 22:22:49 +02:00
#include "gfx\actor.h"
2001-03-29 18:13:50 +02:00
2001-03-09 00:02:47 +01:00
//int GX=512/2;
//int GY=256/;
2001-01-17 22:53:31 +01:00
int GH=256;
2001-03-09 00:02:47 +01:00
int ZPos=5100/16;
2001-01-15 16:22:33 +01:00
2000-08-29 21:54:22 +02:00
/*****************************************************************************/
2001-01-15 16:22:33 +01:00
FontBank *CGameScene::s_genericFont;
MATRIX CGameScene::CamMtx;
2000-10-18 20:37:39 +02:00
2000-08-29 21:54:22 +02:00
/*****************************************************************************/
2001-03-02 22:26:07 +01:00
#ifndef __USER_paul__
2001-02-12 17:06:24 +01:00
int s_globalLevelSelectThing=0;
2001-03-02 22:26:07 +01:00
#else
2001-03-06 18:10:23 +01:00
int s_globalLevelSelectThing=120;
2001-03-02 22:26:07 +01:00
#endif
2001-02-12 18:18:17 +01:00
int CGameScene::s_readyToExit;
2001-03-05 21:01:25 +01:00
int CGameScene::s_levelFinished;
2001-02-21 18:09:19 +01:00
2001-02-12 17:06:24 +01:00
/*****************************************************************************/
2000-08-29 21:54:22 +02:00
CGameScene GameScene;
/*****************************************************************************/
2000-09-12 01:41:29 +02:00
void CGameScene::init()
2000-08-29 21:54:22 +02:00
{
2001-01-30 19:46:07 +01:00
SetIdentNoTrans(&CamMtx);
CamMtx.t[2]=ZPos;
2000-12-07 16:56:20 +01:00
s_genericFont=new ("CGameScene::Init") FontBank();
s_genericFont->initialise( &standardFont );
s_genericFont->setColour( 255, 255 , 0 );
2001-03-09 00:02:47 +01:00
VidSetClearScreen(0);
2001-01-23 22:05:48 +01:00
2001-03-09 00:02:47 +01:00
// SetGeomOffset( GX, GY );
2001-03-06 23:14:15 +01:00
SetGeomScreen(GH);
2001-01-16 18:34:38 +01:00
2001-02-09 22:41:55 +01:00
m_pauseMenu=new ("Pause Menu") CPauseMenu();
m_pauseMenu->init();
2001-02-12 18:18:17 +01:00
s_readyToExit=false;
2001-03-05 21:01:25 +01:00
2001-03-06 23:14:15 +01:00
CFader::setFadingIn();
initLevel();
2001-04-04 02:16:26 +02:00
CFileIO::EnableASync(true);
2001-02-09 18:01:04 +01:00
}
2001-01-17 22:53:31 +01:00
2001-02-09 18:01:04 +01:00
/*****************************************************************************/
// 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();
2000-08-29 21:54:22 +02:00
}
2001-02-12 18:24:58 +01:00
// This is also to be overloaded for demomode.. to stop the pause menu appearing
int CGameScene::canPause()
{
return true;
}
2001-02-09 18:01:04 +01:00
2000-08-29 21:54:22 +02:00
/*****************************************************************************/
2000-12-07 16:56:20 +01:00
void CGameScene::shutdown()
2000-08-29 21:54:22 +02:00
{
2001-04-04 02:16:26 +02:00
CFileIO::EnableASync(false);
2001-04-03 23:28:56 +02:00
shutdownLevel(true);
CSoundMediator::dumpSong();
2001-03-29 18:13:50 +02:00
2001-04-03 23:28:56 +02:00
m_pauseMenu->shutdown(); delete m_pauseMenu;
s_genericFont->dump(); delete s_genericFont;
2000-08-29 21:54:22 +02:00
}
/*****************************************************************************/
2000-09-12 01:41:29 +02:00
void CGameScene::render()
2000-08-29 21:54:22 +02:00
{
2001-01-15 16:22:33 +01:00
CamMtx.t[2]=ZPos; // Temp
2001-02-09 22:41:55 +01:00
m_pauseMenu->render();
2001-01-22 21:57:39 +01:00
CConversation::render();
2001-02-26 21:42:25 +01:00
CThingManager::renderAllThings();
2001-01-12 23:49:25 +01:00
Level.render();
2000-08-29 21:54:22 +02:00
}
/*****************************************************************************/
2000-10-19 17:40:24 +02:00
void CGameScene::think(int _frames)
2000-08-29 21:54:22 +02:00
{
2001-02-09 18:01:04 +01:00
//#ifdef __USER_paul__
// if(!CConversation::isActive()&&PadGetDown(0)&PAD_START)
// {
// CConversation::trigger(SCRIPTS_SPEECHTEST_DAT);
// }
//#endif
2001-01-16 18:34:38 +01:00
2001-04-04 02:16:26 +02:00
CFileIO::LoadASyncFiles();
2001-03-29 18:13:50 +02:00
2001-03-06 23:14:15 +01:00
if(s_readyToExit)
{
// Temporarily.. exiting game scene always goes back to the front end (pkg)
GameState::setNextScene(&FrontEndScene);
}
else if(s_levelFinished)
{
2001-04-03 23:28:56 +02:00
s_globalLevelSelectThing=Level.GetNextLevel(s_globalLevelSelectThing);
shutdownLevel(s_globalLevelSelectThing%12==0);
2001-03-06 23:14:15 +01:00
initLevel();
s_levelFinished=false;
}
2001-02-12 18:24:58 +01:00
if(!m_pauseMenu->isActive()&&PadGetDown(0)&PAD_START&&canPause())
2001-02-09 22:41:55 +01:00
{
m_pauseMenu->select();
}
2001-01-22 21:57:39 +01:00
CConversation::think(_frames);
2001-02-09 22:41:55 +01:00
m_pauseMenu->think(_frames);
if(!CConversation::isActive()&&
!m_pauseMenu->isActive())
2001-01-16 18:34:38 +01:00
{
2001-01-25 16:25:46 +01:00
DVECTOR camPos;
2001-02-26 21:42:25 +01:00
CThingManager::thinkAllThings(_frames);
2001-01-25 16:25:46 +01:00
camPos=m_player->getCameraPos();
//PKG
2001-02-12 16:26:00 +01:00
// if(camPos.vx<0){camPos.vx=0;PAUL_DBGMSG("cx<0");}
// if(camPos.vy<0){camPos.vy=0;PAUL_DBGMSG("cy<0");}
2001-01-25 16:25:46 +01:00
//PKG
CBubicleFactory::setMapOffset(&camPos);
Level.setCameraCentre(camPos);
2000-12-07 16:56:20 +01:00
Level.think(_frames);
2001-02-21 18:09:19 +01:00
if(PadGetDown(0)&PAD_R2)
{
2001-03-05 21:01:25 +01:00
levelFinished();
2001-02-21 18:09:19 +01:00
}
2001-01-16 18:34:38 +01:00
}
2000-08-29 21:54:22 +02:00
}
/*****************************************************************************/
2000-10-26 18:50:54 +02:00
int CGameScene::readyToShutdown()
{
2001-02-12 18:18:17 +01:00
return s_readyToExit;
2000-10-26 18:50:54 +02:00
}
/*****************************************************************************/
2001-01-16 20:00:08 +01:00
CPlayer * CGameScene::getPlayer()
{
return( m_player );
}
/*****************************************************************************/
2001-01-16 21:55:44 +01:00
void CGameScene::sendEvent( GAME_EVENT evt, CThing *sourceThing )
{
2001-02-26 21:42:25 +01:00
CThingManager::processEventAllThings(evt, sourceThing);
2001-01-16 21:55:44 +01:00
}
2001-03-06 23:14:15 +01:00
/*****************************************************************************/
void CGameScene::initLevel()
{
CThingManager::init();
CConversation::init();
CConversation::registerConversationScript(SCRIPTS_SPEECHTEST_DAT); // Register one script for testing..
#ifdef __USER_paul__
DVECTOR pos={16*10,16*10};
createPickup(PICKUP__BIG_HEALTH,&pos);
2001-03-30 19:49:33 +02:00
pos.vx+=64; createPickup(PICKUP__MEDIUM_HEALTH,&pos);
pos.vx+=64; createPickup(PICKUP__SMALL_HEALTH,&pos);
pos.vx+=64; createPickup(PICKUP__LIFE,&pos);
pos.vx+=64; createPickup(PICKUP__SPATULA,&pos);
pos.vx+=64; createPickup(PICKUP__JELLY_LAUNCHER_AMMO,&pos);
pos.vx+=64; createPickup(PICKUP__BUBBLE_MIXTURE,&pos);
2001-03-31 04:05:24 +02:00
pos.vx+=64; createPickup(PICKUP__BUBBLE_WAND,&pos);
pos.vx+=64; createPickup(PICKUP__NET,&pos);
2001-03-30 19:49:33 +02:00
pos.vx+=64; createPickup(PICKUP__GLASSES,&pos);
pos.vx+=64; createPickup(PICKUP__SQUEAKY_SHOES,&pos);
pos.vx+=64; createPickup(PICKUP__BALLOON,&pos);
pos.vx+=64; createPickup(PICKUP__HELMET,&pos);
pos.vx+=64; createPickup(PICKUP__CORAL_BLOWER,&pos);
pos.vx+=64; createPickup(PICKUP__QUEST_ITEM__TEST,&pos);
2001-03-29 18:13:50 +02:00
2001-03-31 04:05:24 +02:00
// CNpcPlatform *platform;
// platform=new ("test platform") CNpcPlatform;
// platform->init();
// platform->setLayerCollision( Level.getCollisionLayer() );
2001-03-06 23:14:15 +01:00
#endif
s_levelFinished=false;
Level.init();
createPlayer();
2001-03-07 22:29:07 +01:00
m_player->setRespawnPos(Level.getPlayerSpawnPos());
2001-03-06 23:14:15 +01:00
m_player->init();
m_player->setLayerCollision(Level.getCollisionLayer());
m_player->setMapSize(Level.getMapSize());
2001-03-29 18:13:50 +02:00
2001-04-03 23:28:56 +02:00
// Init actors (needs moving and tidying
2001-04-08 22:46:34 +02:00
int pointNum;
2001-04-02 21:21:46 +02:00
int actorNum;
2001-04-08 22:46:34 +02:00
int platformNum;
2001-04-02 21:21:46 +02:00
2001-04-04 02:16:26 +02:00
sThingActor **actorList = Level.getActorList();
if (actorList)
{
2001-04-04 18:51:04 +02:00
for ( actorNum = 0 ; actorNum < Level.getActorCount() ; actorNum++ )
2001-04-02 21:21:46 +02:00
{
2001-04-04 18:51:04 +02:00
CActorPool::ACTOR_TYPE actorType = CActorPool::getActorType( actorList[actorNum]->Type );
2001-04-02 21:21:46 +02:00
2001-04-04 18:51:04 +02:00
switch ( actorType )
{
case CActorPool::ACTOR_ENEMY_NPC:
{
CNpcEnemy *enemy;
enemy = new ("npc enemy") CNpcEnemy;
ASSERT(enemy);
enemy->setTypeFromMapEdit( actorList[actorNum]->Type );
enemy->init();
enemy->setLayerCollision( Level.getCollisionLayer() );
u16 *PntList=(u16*)MakePtr(actorList[actorNum],sizeof(sThingActor));
u16 newXPos, newYPos;
newXPos = (u16) *PntList;
PntList++;
newYPos = (u16) *PntList;
PntList++;
enemy->setStartPos( newXPos, newYPos );
enemy->addWaypoint( newXPos, newYPos );
if ( actorList[actorNum]->PointCount > 1 )
{
for ( pointNum = 1 ; pointNum < actorList[actorNum]->PointCount ; pointNum++ )
{
newXPos = (u16) *PntList;
PntList++;
newYPos = (u16) *PntList;
PntList++;
enemy->addWaypoint( newXPos, newYPos );
}
}
enemy->postInit();
break;
}
default:
break;
2001-04-02 21:21:46 +02:00
}
}
2001-04-04 02:16:26 +02:00
}
2001-04-08 22:46:34 +02:00
sThingPlatform **platformList = Level.getPlatformList();
if (platformList)
{
for ( platformNum = 0 ; platformNum < Level.getPlatformCount() ; platformNum++ )
{
CNpcPlatform *platform;
platform = new ("platform") CNpcPlatform;
ASSERT(platform);
platform->setTypeFromMapEdit( platformList[platformNum]->Type );
u16 *PntList=(u16*)MakePtr(platformList[platformNum],sizeof(sThingPlatform));
u16 newXPos, newYPos;
newXPos = (u16) *PntList;
PntList++;
newYPos = (u16) *PntList;
PntList++;
DVECTOR startPos;
2001-04-09 17:57:20 +02:00
startPos.vx = newXPos << 4;
startPos.vy = newYPos << 4;
2001-04-08 22:46:34 +02:00
platform->init( startPos );
platform->setLayerCollision( Level.getCollisionLayer() );
2001-04-09 17:57:20 +02:00
platform->setTiltable( false );
2001-04-08 22:46:34 +02:00
platform->addWaypoint( newXPos, newYPos );
if ( platformList[platformNum]->PointCount > 1 )
{
for ( pointNum = 1 ; pointNum < platformList[platformNum]->PointCount ; pointNum++ )
{
newXPos = (u16) *PntList;
PntList++;
newYPos = (u16) *PntList;
PntList++;
platform->addWaypoint( newXPos, newYPos );
}
}
}
}
2001-03-29 18:13:50 +02:00
// Song is loaded/dumped by the level, and played from here. This just gives some
// better timing over when it starts (pkg)
CSoundMediator::playSong();
2001-03-06 23:14:15 +01:00
}
/*****************************************************************************/
2001-04-03 23:28:56 +02:00
void CGameScene::shutdownLevel(bool CleanUp)
2001-03-06 23:14:15 +01:00
{
CConversation::shutdown();
CThingManager::shutdown();
2001-04-03 23:28:56 +02:00
Level.shutdown(CleanUp);
2001-03-06 23:14:15 +01:00
}
2001-01-16 21:55:44 +01:00
/*****************************************************************************/