From 6490c61642a4d4ceb964045d78eb813e1c1bc3a3 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 1 Jul 2001 18:40:03 +0000 Subject: [PATCH] --- data/Scripts/defs/charanim.scr | 2 +- source/game/convo.cpp | 109 +++++++++++++++++++++++++-------- source/game/convo.h | 51 +++++++++------ source/gfx/font.cpp | 68 ++++++++++++++++++++ source/gfx/font.h | 3 +- 5 files changed, 188 insertions(+), 45 deletions(-) diff --git a/data/Scripts/defs/charanim.scr b/data/Scripts/defs/charanim.scr index 24e131b7d..827fb71ed 100644 --- a/data/Scripts/defs/charanim.scr +++ b/data/Scripts/defs/charanim.scr @@ -10,7 +10,7 @@ #define CHAR_MERMAIDMAN 6 #define CHAR_BARNACLEBOY 7 #define CHAR_JACKCUSTARD 8 -#define CHAR_GARY 8 +#define CHAR_GARY 9 #define ANIM_QUIET 0 #define ANIM_TALKING 1 diff --git a/source/game/convo.cpp b/source/game/convo.cpp index 00e909513..1fbba5713 100644 --- a/source/game/convo.cpp +++ b/source/game/convo.cpp @@ -272,6 +272,7 @@ CConversation::CHAR_ICON_FRAMES CConversation::s_characterIconFrames[]= { FRM_MERMAIDMAN }, // CHAR_MERMAIDMAN, { FRM_BARNACLEBOY }, // CHAR_BARNACLEBOY, { -1 }, // CHAR_JACKCUSTARD + { FRM_GARY }, // CHAR_GARY }; @@ -285,16 +286,18 @@ int CConversation::s_numRegisteredScripts=0; class CScript *CConversation::s_currentScript=NULL; int CConversation::s_currentState=STATE_INACTIVE; -int CConversation::s_currentQuestion; -int CConversation::s_currentAnswer; -int CConversation::s_currentSelectedAnswer; +int CConversation::s_currentQuestion; +int CConversation::s_currentAnswer; +int CConversation::s_currentSelectedAnswer; + +int CConversation::s_faceFrame; +int CConversation::s_speechId; +int CConversation::s_textPageOffset; +int CConversation::s_maxTextPageOffset; +SpriteBank *CConversation::s_sprites; -int CConversation::s_faceFrame; -int CConversation::s_speechId; -int CConversation::s_textOffset; -int CConversation::s_maxTextOffset; -static xmPlayingId s_playingSfxId; +static xmPlayingId s_playingSfxId; /*---------------------------------------------------------------------- @@ -310,7 +313,6 @@ void CConversation::init() s_textFontBank=new ("Conversation Font") FontBank(); s_textFontBank->initialise(&standardFont); s_textFontBank->setOt(0); - s_textFontBank->setPrintArea(TEXTBOX_X,TEXTBOX_Y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT); s_textFontBank->setColour(TEXT_R,TEXT_G,TEXT_B); s_questionFontBank=new ("Conversation Font") FontBank(); @@ -319,6 +321,9 @@ void CConversation::init() s_currentState=STATE_INACTIVE; s_currentScript=NULL; + + s_sprites=new ("ConvoSprites") SpriteBank(); + s_sprites->load(SPRITES_SPRITES_SPR); } @@ -330,6 +335,7 @@ void CConversation::init() ---------------------------------------------------------------------- */ void CConversation::shutdown() { + s_sprites->dump(); delete s_sprites; s_questionFontBank->dump(); delete s_questionFontBank; s_textFontBank->dump(); delete s_textFontBank; dumpConversationScripts(); @@ -388,7 +394,14 @@ void CConversation::render() { renderText(); renderQuestion(); - drawSpeechBubbleBorder(TEXTBOX_X,TEXTBOX_Y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT+TEXTBOX_QUESTIONHEIGHT,0,s_faceFrame); + if(s_faceFrame!=-1) + { + drawSpeechBubbleBorder(TEXTBOX_X,TEXTBOX_Y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT+TEXTBOX_QUESTIONHEIGHT,0,s_faceFrame); + } + else + { + drawSpeechBubbleBorder(TEXTBOX_X_FOR_NARRATOR,TEXTBOX_Y,TEXTBOX_WIDTH_FOR_NARRATOR,TEXTBOX_HEIGHT+TEXTBOX_QUESTIONHEIGHT,0,-1); + } } } @@ -462,11 +475,15 @@ int CConversation::isActive() ---------------------------------------------------------------------- */ void CConversation::setCharacterAndText(int _characterId,int _textId) { + RECT clipTextRegion; + s_faceFrame=(s_characterIconFrames[_characterId].m_frame); s_speechId=_textId; - s_textOffset=0; - s_maxTextOffset=s_textFontBank->getStringHeight((char*)TranslationDatabase::getString(s_speechId))-TEXTBOX_HEIGHT; - if(s_maxTextOffset<0)s_maxTextOffset=0; + s_textPageOffset=0; + clipTextRegion=getTextRegion(); + s_textFontBank->setPrintArea(clipTextRegion.x,clipTextRegion.y,clipTextRegion.w,clipTextRegion.h); + s_maxTextPageOffset=(s_textFontBank->getStringHeight((char*)TranslationDatabase::getString(s_speechId))-s_textFontBank->getCharHeight())/(s_textFontBank->getCharHeight()*TEXTBOX_FONT_NUM_LINES_IN_BOX); + if(s_maxTextPageOffset<0)s_maxTextPageOffset=0; for (int i=0; is_maxTextOffset) + s_textPageOffset++; + if(s_textPageOffset>s_maxTextPageOffset) { - s_textOffset=s_maxTextOffset; + s_textPageOffset=s_maxTextPageOffset; } sfx=CSoundMediator::SFX_FRONT_END__MOVE_CURSOR; } @@ -533,12 +550,12 @@ void CConversation::thinkText() } else if(PadGetRepeat(0)&PAD_UP) { - if(s_textOffset>0) + if(s_textPageOffset>0) { - s_textOffset-=TEXT_STEP_SIZE; - if(s_textOffset<0) + s_textPageOffset--; + if(s_textPageOffset<0) { - s_textOffset=0; + s_textPageOffset=0; } sfx=CSoundMediator::SFX_FRONT_END__MOVE_CURSOR; } @@ -603,11 +620,35 @@ void CConversation::thinkQuestion() ---------------------------------------------------------------------- */ void CConversation::renderText() { - RECT clipTextRegion={TEXTBOX_X,TEXTBOX_Y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT}; + RECT clipTextRegion; + char buf[1024],*pBuf; + int i; + + clipTextRegion=getTextRegion(); PrimFullScreen(0); - s_textFontBank->print(0,-s_textOffset,s_speechId); + sprintf(buf,TranslationDatabase::getString(s_speechId)); + pBuf=buf; + for(i=0;iprintTillEndOfLine(0,-50,pBuf); + } + for(i=0;iprintTillEndOfLine(0,i*TEXTBOX_FONT_LINE_SPACING,pBuf); + } PrimClip(&clipTextRegion,0); + + // Render up/down button hints + if(s_textPageOffset!=0) + { + s_sprites->printFT4(FRM__BUTU,clipTextRegion.x+TEXTBOX_BUTTONS_XOFF,TEXTBOX_Y+TEXTBOX_BUTTONS_YOFF,0,0,0); + } + if(s_textPageOffsetprintFT4(FRM__BUTD,clipTextRegion.x+TEXTBOX_BUTTONS_XOFF+TEXTBOX_BUTTONS_GAP,TEXTBOX_Y+TEXTBOX_BUTTONS_YOFF,0,0,0); + } } @@ -617,7 +658,6 @@ void CConversation::renderText() Params: Returns: ---------------------------------------------------------------------- */ -//drawSpeechBubbleBorder(TEXTBOX_X,TEXTBOX_Y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT+TEXTBOX_QUESTIONHEIGHT,0,s_faceFrame); void CConversation::renderQuestion() { int y; @@ -807,5 +847,26 @@ void CConversation::registerConversationLevelScripts(int level) break; } } + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +RECT CConversation::getTextRegion() +{ + RECT clipRegion={TEXTBOX_X,TEXTBOX_Y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT}; + + if(s_faceFrame==-1) + { + // Narrators box.. + clipRegion.x=TEXTBOX_X_FOR_NARRATOR; + clipRegion.w=TEXTBOX_WIDTH_FOR_NARRATOR; + } + + return clipRegion; +} + /*=========================================================================== end */ diff --git a/source/game/convo.h b/source/game/convo.h index c96041663..b6145de52 100644 --- a/source/game/convo.h +++ b/source/game/convo.h @@ -18,6 +18,10 @@ Includes -------- */ +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" +#endif + #ifndef __FILE_EQUATES_H__ #include #endif @@ -37,20 +41,21 @@ class CConversation { public: - static void init(); - static void shutdown(); - - static void think(int _frames); - static void render(); - - static void registerConversationLevelScripts(int level); - static void registerConversationScript(FileEquate _feScript); - static void trigger(FileEquate _feScript); - static int isActive(); - - static void setCharacterAndText(int _characterId,int _textId); - static void setResponseOptions(int _responseOptions); - static int getResponse(); + static void init(); + static void shutdown(); + + static void think(int _frames); + static void render(); + + static void registerConversationLevelScripts(int level); + static void registerConversationScript(FileEquate _feScript); + static void trigger(FileEquate _feScript); + static int isActive(); + + static void setCharacterAndText(int _characterId,int _textId); + static void setResponseOptions(int _responseOptions); + static int getResponse(); + static RECT getTextRegion(); private: @@ -58,12 +63,18 @@ private: { TEXTBOX_X=125, - TEXTBOX_Y=140, + TEXTBOX_Y=35, TEXTBOX_WIDTH=357, - TEXTBOX_HEIGHT=50, + TEXTBOX_HEIGHT=62, + TEXTBOX_X_FOR_NARRATOR=512-TEXTBOX_X-TEXTBOX_WIDTH, + TEXTBOX_WIDTH_FOR_NARRATOR=512-(TEXTBOX_X_FOR_NARRATOR*2), TEXTBOX_QUESTIONHEIGHT=16, - TEXT_STEP_SIZE=5, OT_POS=0, + TEXTBOX_FONT_LINE_SPACING=14, + TEXTBOX_FONT_NUM_LINES_IN_BOX=4, + TEXTBOX_BUTTONS_XOFF=0, + TEXTBOX_BUTTONS_YOFF=68, + TEXTBOX_BUTTONS_GAP=20, // Main text TEXT_R=120, TEXT_G=115, @@ -89,6 +100,7 @@ private: CHAR_MERMAIDMAN, CHAR_BARNACLEBOY, CHAR_JACKCUSTARD, + CHAR_GARY, MAX_CHARS, }; typedef struct @@ -153,8 +165,9 @@ private: static int s_faceFrame; static int s_speechId; - static int s_textOffset; - static int s_maxTextOffset; + static int s_textPageOffset; + static int s_maxTextPageOffset; + static class SpriteBank *s_sprites; }; diff --git a/source/gfx/font.cpp b/source/gfx/font.cpp index a40e0046a..d133f837d 100644 --- a/source/gfx/font.cpp +++ b/source/gfx/font.cpp @@ -186,6 +186,74 @@ void FontBank::print( int _x, int _y, const char *_text ) } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::printTillEndOfLine( int _x, int _y, const char *_text ) +{ + ASSERT( m_initialised ); + + int Size; + int StartX; + int Length=0; + int RectWidth; + int numCharsPrinted=0; + + switch(m_justification) + { + case JUST_CENTRE: + RectWidth=m_printArea.w; + break; + default: + RectWidth=m_printArea.w-_x; + break; + } + _x+=m_printArea.x; + _y+=m_printArea.y; + _y+=getCharHeight(); // origin at top left please... + StartX=_x; + + while (*_text) + { + Length=getStrWrapLen(_text,RectWidth); + switch (m_justification) + { + case JUST_LEFT: + _x=StartX; + break; + case JUST_RIGHT: + _x=StartX/*+RectWidth*/-Length; + break; + case JUST_CENTRE: + _x=StartX-(Length/2); + break; + } + + int fy=_y; + while(*_text && Length>0) + { + if(m_wobble) + { + fy=_y+(msin((s_wobbleValue+(_x*wstep))&4095)/wscale); + } + Size=printChar(*_text++,_x,fy)+getCharGapX(); + numCharsPrinted++; + _x+=Size; + Length-=Size; + } + break; +// _y+=(getCharHeight()); +// if(*_text=='\n') _text++; // kill newline if there is one ( preserve multiple \n ) +// while (*_text==' ') _text++; // kill trailing spaces + } + + return numCharsPrinted; +} + + /*---------------------------------------------------------------------- Function: Purpose: diff --git a/source/gfx/font.h b/source/gfx/font.h index cd809ccff..e966d760f 100644 --- a/source/gfx/font.h +++ b/source/gfx/font.h @@ -51,8 +51,9 @@ public: virtual void initialise( FontData *_fontData ); void dump(); int isInitialised() { return m_initialised; } - virtual void print( int _x, int _y, const char *_text ); void print( int _x, int _y, s32 _textId ); + virtual void print( int _x, int _y, const char *_text ); + int printTillEndOfLine( int _x, int _y, const char *_text ); void setColour( u8 _r, u8 _g, u8 _b ); void setJustification( Justification _justification ); void setOt( u16 _ot );