This commit is contained in:
parent
bdce9e6b57
commit
69cacf1ddb
13 changed files with 554 additions and 28 deletions
|
@ -18,12 +18,54 @@
|
|||
|
||||
#include "game\convo.h"
|
||||
|
||||
#ifndef __MEMORY_HEADER__
|
||||
#include "mem\memory.h"
|
||||
#endif
|
||||
|
||||
#ifndef __GUI_GFRAME_H__
|
||||
#include "gui\gframe.h"
|
||||
#endif
|
||||
|
||||
#ifndef __GUI_GSPRITE_H__
|
||||
#include "gui\gsprite.h"
|
||||
#endif
|
||||
|
||||
#ifndef __GUI_GTEXTBOX_H__
|
||||
#include "gui\gtextbox.h"
|
||||
#endif
|
||||
|
||||
#ifndef __GFX_SPRBANK_H__
|
||||
#include "gfx\sprbank.h"
|
||||
#endif
|
||||
|
||||
#ifndef __GFX_FONT_H__
|
||||
#include "gfx\font.h"
|
||||
#endif
|
||||
|
||||
#ifndef __SCRIPT_SCRIPT_H__
|
||||
#include "script\script.h"
|
||||
#endif
|
||||
|
||||
#ifndef __PAD_PADS_H__
|
||||
#include "pad\pads.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* Std Lib
|
||||
------- */
|
||||
|
||||
/* Data
|
||||
---- */
|
||||
|
||||
#ifndef __SPR_UIGFX_H__
|
||||
#include <uigfx.h>
|
||||
#endif
|
||||
|
||||
#ifndef __STRING_ENUMS__
|
||||
#include <trans.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Tyepdefs && Defines
|
||||
------------------- */
|
||||
|
@ -40,15 +82,288 @@
|
|||
Vars
|
||||
---- */
|
||||
|
||||
CConversation::CHAR_ICON_FRAMES CConversation::s_characterIconFrames[]=
|
||||
{
|
||||
{ FRM_SPONGEBOB, }, // CHAR_SPONGEBOB
|
||||
{ FRM_SANDY }, // CHAR_SANDY
|
||||
{ FRM_PATRICK }, // CHAR_PATRICK
|
||||
{ FRM_SQUIDWARD }, // CHAR_SQUIDWARD
|
||||
{ FRM_MR_KRABS }, // CHAR_KRABS
|
||||
{ FRM_PLANKTON }, // CHAR_PLANKTON
|
||||
};
|
||||
|
||||
class CGUIGroupFrame *CConversation::s_guiFrame=NULL;
|
||||
class CGUISprite *CConversation::s_guiIcon=NULL;
|
||||
class CGUITextBox *CConversation::s_guiText=NULL;
|
||||
|
||||
int CConversation::s_currentCharacterId=-1;
|
||||
int CConversation::s_currentTextId=-1;
|
||||
int CConversation::s_currentQuestion=QUESTION_NONE;
|
||||
int CConversation::s_currentAnswer=ANSWER_NONE;
|
||||
int CConversation::s_currentSelectedAnswer=0;
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void somethingToStopTheLinkerComplaining()
|
||||
void CConversation::init()
|
||||
{
|
||||
s_guiFrame=new ("Conversation GUI") CGUIGroupFrame();
|
||||
s_guiFrame->init(0);
|
||||
s_guiFrame->setObjectXYWH((512-FRAME_WIDTH)/2,256-FRAME_BOTTOM_OFFSET-FRAME_HEIGHT,FRAME_WIDTH,FRAME_HEIGHT);
|
||||
s_guiFrame->setOt(OT_POS);
|
||||
s_guiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER);
|
||||
|
||||
s_guiIcon=new("Conversation Icon") CGUISprite();
|
||||
s_guiIcon->init(s_guiFrame);
|
||||
s_guiIcon->setObjectXYWH(0,0,FRAME_HEIGHT,FRAME_HEIGHT);
|
||||
s_guiIcon->setOt(OT_POS);
|
||||
s_guiIcon->setSpriteBank(UI_UIGFX_SPR);
|
||||
s_guiIcon->setFrame(0);
|
||||
|
||||
s_guiText=new("Conversation Text") CGUITextBox();
|
||||
s_guiText->init(s_guiFrame);
|
||||
s_guiText->setObjectXYWH(FRAME_HEIGHT,TEXT_BORDER,FRAME_WIDTH-FRAME_HEIGHT-TEXT_BORDER,FRAME_HEIGHT-(TEXT_BORDER*2));
|
||||
s_guiText->setOt(OT_POS);
|
||||
|
||||
m_fontBank=new ("Conversation Font") FontBank();
|
||||
m_fontBank->initialise(&standardFont);
|
||||
m_fontBank->setOt(0);
|
||||
|
||||
m_currentState=STATE_INACTIVE;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::shutdown()
|
||||
{
|
||||
s_guiFrame->shutdown(); delete s_guiFrame;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::think(int _frames)
|
||||
{
|
||||
if(isActive())
|
||||
{
|
||||
if(m_currentState==STATE_JUST_ACTIVATED)
|
||||
{
|
||||
m_currentState=STATE_ACTIVE;
|
||||
}
|
||||
|
||||
s_guiFrame->think(_frames);
|
||||
|
||||
thinkQuestion();
|
||||
|
||||
m_currentScript->run();
|
||||
if(m_currentScript->isFinished())
|
||||
{
|
||||
m_currentState=STATE_INACTIVE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::render()
|
||||
{
|
||||
if(m_currentState==STATE_ACTIVE)
|
||||
{
|
||||
renderQuestion();
|
||||
s_guiFrame->render();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::registerConversationScript(FileEquate _feScript)
|
||||
{
|
||||
// Blah blah..
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::trigger(FileEquate _feScript)
|
||||
{
|
||||
ASSERT(!isActive());
|
||||
|
||||
m_currentScript=new ("script") CScript();
|
||||
m_currentScript->initialise(_feScript);
|
||||
|
||||
m_currentState=STATE_JUST_ACTIVATED;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
int CConversation::isActive()
|
||||
{
|
||||
return m_currentState!=STATE_INACTIVE;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::setCharacterAndText(int _characterId,int _textId)
|
||||
{
|
||||
s_guiIcon->setFrame(s_characterIconFrames[_characterId].m_frame);
|
||||
s_guiText->setText(_textId);
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::setResponseOptions(int _responseOptions)
|
||||
{
|
||||
s_currentQuestion=_responseOptions;
|
||||
s_currentAnswer=ANSWER_NONE;
|
||||
s_currentSelectedAnswer=0;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
int CConversation::getResponse()
|
||||
{
|
||||
return s_currentAnswer;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::thinkQuestion()
|
||||
{
|
||||
if(s_currentQuestion!=QUESTION_NONE)
|
||||
{
|
||||
int pad=PadGetDown(0);
|
||||
|
||||
if(s_currentQuestion==QUESTION_YES_NO)
|
||||
{
|
||||
if(pad&PAD_CROSS)
|
||||
{
|
||||
s_currentAnswer=s_currentSelectedAnswer==0?ANSWER_YES:ANSWER_NO;
|
||||
s_currentQuestion=QUESTION_NONE;
|
||||
}
|
||||
else if(pad&(PAD_LEFT|PAD_RIGHT))
|
||||
{
|
||||
s_currentSelectedAnswer^=1;
|
||||
}
|
||||
}
|
||||
else if(s_currentQuestion==QUESTION_OK)
|
||||
{
|
||||
if(pad&PAD_CROSS)
|
||||
{
|
||||
s_currentAnswer=ANSWER_OK;
|
||||
s_currentQuestion=QUESTION_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CConversation::renderQuestion()
|
||||
{
|
||||
int xbase,y;
|
||||
|
||||
xbase=(512-FRAME_WIDTH)/2;
|
||||
y=256-FRAME_BOTTOM_OFFSET-(TEXT_BORDER/2)-(m_fontBank->getCharHeight()/2);
|
||||
|
||||
switch(s_currentQuestion)
|
||||
{
|
||||
case QUESTION_OK:
|
||||
{
|
||||
m_fontBank->setColour(SELECT_TEXT_R,SELECT_TEXT_G,SELECT_TEXT_B);
|
||||
m_fontBank->setJustification(FontBank::JUST_RIGHT);
|
||||
m_fontBank->print(xbase+FRAME_WIDTH-TEXT_BORDER,y,STR__OK);
|
||||
}
|
||||
break;
|
||||
|
||||
case QUESTION_YES_NO:
|
||||
{
|
||||
if(s_currentSelectedAnswer==0)
|
||||
{
|
||||
m_fontBank->setColour(SELECT_TEXT_R,SELECT_TEXT_G,SELECT_TEXT_B);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fontBank->setColour(UNSELECT_TEXT_R,UNSELECT_TEXT_G,UNSELECT_TEXT_B);
|
||||
}
|
||||
m_fontBank->setJustification(FontBank::JUST_LEFT);
|
||||
m_fontBank->print(xbase+FRAME_HEIGHT,y,STR__YES);
|
||||
|
||||
if(s_currentSelectedAnswer==1)
|
||||
{
|
||||
m_fontBank->setColour(SELECT_TEXT_R,SELECT_TEXT_G,SELECT_TEXT_B);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fontBank->setColour(UNSELECT_TEXT_R,UNSELECT_TEXT_G,UNSELECT_TEXT_B);
|
||||
}
|
||||
m_fontBank->setJustification(FontBank::JUST_RIGHT);
|
||||
m_fontBank->print(xbase+FRAME_WIDTH-TEXT_BORDER,y,STR__NO);
|
||||
}
|
||||
break;
|
||||
|
||||
case QUESTION_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
end */
|
||||
|
|
|
@ -18,6 +18,11 @@
|
|||
Includes
|
||||
-------- */
|
||||
|
||||
#ifndef __FILE_EQUATES_H__
|
||||
#include <biglump.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* Std Lib
|
||||
------- */
|
||||
|
||||
|
@ -29,6 +34,108 @@
|
|||
Structure defintions
|
||||
-------------------- */
|
||||
|
||||
class CConversation
|
||||
{
|
||||
public:
|
||||
void init();
|
||||
void shutdown();
|
||||
|
||||
void think(int _frames);
|
||||
void render();
|
||||
|
||||
void registerConversationScript(FileEquate _feScript);
|
||||
|
||||
void trigger(FileEquate _feScript);
|
||||
int isActive();
|
||||
|
||||
static void setCharacterAndText(int _characterId,int _textId);
|
||||
static void setResponseOptions(int _responseOptions);
|
||||
static int getResponse();
|
||||
|
||||
|
||||
private:
|
||||
enum
|
||||
{
|
||||
FRAME_WIDTH=400,
|
||||
FRAME_HEIGHT=90,
|
||||
FRAME_BOTTOM_OFFSET=40,
|
||||
TEXT_BORDER=20,
|
||||
OT_POS=0,
|
||||
SELECT_TEXT_R=250,
|
||||
SELECT_TEXT_G=250,
|
||||
SELECT_TEXT_B=250,
|
||||
UNSELECT_TEXT_R=100,
|
||||
UNSELECT_TEXT_G=100,
|
||||
UNSELECT_TEXT_B=100,
|
||||
};
|
||||
|
||||
// This order is the same as in scripts/defs/charanim.scr
|
||||
enum
|
||||
{
|
||||
CHAR_SPONGEBOB,
|
||||
CHAR_SANDY,
|
||||
CHAR_PATRICK,
|
||||
CHAR_SQUIDWARD,
|
||||
CHAR_KRABS,
|
||||
CHAR_PLANKTON,
|
||||
MAX_CHARS,
|
||||
};
|
||||
typedef struct
|
||||
{
|
||||
int m_frame;
|
||||
} CHAR_ICON_FRAMES;
|
||||
|
||||
// These two are as in scripts/defs/response.scr
|
||||
enum
|
||||
{
|
||||
QUESTION_NONE,
|
||||
QUESTION_OK,
|
||||
QUESTION_YES_NO,
|
||||
MAX_QUESTIONS,
|
||||
};
|
||||
enum
|
||||
{
|
||||
ANSWER_NONE,
|
||||
ANSWER_OK,
|
||||
ANSWER_YES,
|
||||
ANSWER_NO,
|
||||
MAX_ANSWERS
|
||||
};
|
||||
|
||||
// State of the conversation dialog
|
||||
enum
|
||||
{
|
||||
STATE_INACTIVE,
|
||||
STATE_JUST_ACTIVATED,
|
||||
STATE_ACTIVE,
|
||||
};
|
||||
|
||||
|
||||
void thinkQuestion();
|
||||
void renderQuestion();
|
||||
|
||||
|
||||
// PKG - These don't need to be static..
|
||||
// Make the sprites/text readouts maybe?
|
||||
static class CGUIGroupFrame *s_guiFrame;
|
||||
static class CGUISprite *s_guiIcon;
|
||||
static class CGUITextBox *s_guiText;
|
||||
|
||||
class FontBank *m_fontBank;
|
||||
|
||||
static CHAR_ICON_FRAMES s_characterIconFrames[MAX_CHARS];
|
||||
|
||||
class CScript *m_currentScript;
|
||||
int m_currentState;
|
||||
|
||||
static int s_currentCharacterId;
|
||||
static int s_currentTextId;
|
||||
static int s_currentQuestion;
|
||||
static int s_currentAnswer;
|
||||
static int s_currentSelectedAnswer;
|
||||
};
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Globals
|
||||
------- */
|
||||
|
|
|
@ -41,29 +41,35 @@ void CGameScene::init()
|
|||
s_genericFont->initialise( &standardFont );
|
||||
s_genericFont->setColour( 255, 255 , 0 );
|
||||
VidSetClearScreen(1);
|
||||
m_conversation.init();
|
||||
Level.init();
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void CGameScene::shutdown()
|
||||
{
|
||||
s_genericFont->dump(); delete s_genericFont;
|
||||
Level.shutdown();
|
||||
|
||||
m_conversation.shutdown();
|
||||
s_genericFont->dump(); delete s_genericFont;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void CGameScene::render()
|
||||
{
|
||||
m_conversation.render();
|
||||
Level.render();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void CGameScene::think(int _frames)
|
||||
{
|
||||
m_conversation.think(_frames);
|
||||
Level.think(_frames);
|
||||
|
||||
if(!m_conversation.isActive()&&PadGetDown(0)&PAD_START)
|
||||
m_conversation.trigger(SCRIPTS_SPEECHTEST_DAT);
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -8,6 +8,10 @@
|
|||
#include "system\gstate.h"
|
||||
#include "level\level.h"
|
||||
|
||||
#ifndef __GAME_CONVO_H__
|
||||
#include "game\convo.h"
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
class FontBank;
|
||||
|
||||
|
@ -29,6 +33,7 @@ public:
|
|||
private:
|
||||
|
||||
CLevel Level;
|
||||
CConversation m_conversation;
|
||||
static FontBank *s_genericFont;
|
||||
//static class SpriteBank *s_sprites; <-- Was causing compile error, sorry
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue