aboutsummaryrefslogtreecommitdiff
path: root/sky
diff options
context:
space:
mode:
authorRobert Göffringmann2003-07-04 22:39:10 +0000
committerRobert Göffringmann2003-07-04 22:39:10 +0000
commita4bd31578b41bfd9fc33cf33d77cafed4de40013 (patch)
tree0772b8f941c055d9e535f1bc7e11579044b01268 /sky
parent67ba28170f26080fed61ce97b4ae6bb5d81a9d03 (diff)
downloadscummvm-rg350-a4bd31578b41bfd9fc33cf33d77cafed4de40013.tar.gz
scummvm-rg350-a4bd31578b41bfd9fc33cf33d77cafed4de40013.tar.bz2
scummvm-rg350-a4bd31578b41bfd9fc33cf33d77cafed4de40013.zip
support text and speech at the same time
svn-id: r8750
Diffstat (limited to 'sky')
-rw-r--r--sky/control.cpp126
-rw-r--r--sky/control.h10
-rw-r--r--sky/sky.cpp2
3 files changed, 116 insertions, 22 deletions
diff --git a/sky/control.cpp b/sky/control.cpp
index ff9878a5eb..a2cbb54230 100644
--- a/sky/control.cpp
+++ b/sky/control.cpp
@@ -83,6 +83,16 @@ SkyTextResource::~SkyTextResource(void) {
free(_oldScreen);
}
+void SkyTextResource::flushForRedraw(void) {
+
+ if (_oldX < GAME_SCREEN_WIDTH) {
+ uint16 cpWidth = (PAN_LINE_WIDTH > (GAME_SCREEN_WIDTH - _oldX))?(GAME_SCREEN_WIDTH - _oldX):(PAN_LINE_WIDTH);
+ for (uint8 cnty = 0; cnty < PAN_CHAR_HEIGHT; cnty++)
+ memcpy(_screen + (cnty + _oldY) * GAME_SCREEN_WIDTH + _oldX, _oldScreen + cnty * PAN_LINE_WIDTH, cpWidth);
+ }
+ _oldX = GAME_SCREEN_WIDTH;
+}
+
void SkyTextResource::drawToScreen(bool doMask) {
doMask = true;
@@ -198,10 +208,7 @@ void SkyControl::initPanel(void) {
_fxPanButton = createResource( _sprites.button, 3, 2, 58, 99, 87, TOGGLE_FX, MAINPANEL);
if (SkyState::isCDVersion()) { // CD Version: Toggle text/speech
- if (SkyState::_systemVars.systemFlags & SF_ALLOW_TEXT)
- _musicPanButton = createResource( _sprites.button, 3, 2, 58, 119, 21, TOGGLE_TEXT, MAINPANEL);
- else
- _musicPanButton = createResource( _sprites.button, 3, 0, 58, 119, 35, TOGGLE_TEXT, MAINPANEL);
+ _musicPanButton = createResource( _sprites.button, 3, 0, 58, 119, 52, TOGGLE_TEXT, MAINPANEL);
} else { // disk version: toggle music on/off
_musicPanButton = createResource( _sprites.button, 3, 0, 58, 119, 91, TOGGLE_MS, MAINPANEL);
}
@@ -262,15 +269,46 @@ void SkyControl::buttonControl(SkyConResource *pButton) {
_text->setXY(_mouseX + 12, _mouseY - 16);
}
+void SkyControl::drawTextCross(uint32 flags) {
+
+ _bodge->drawToScreen(NO_MASK);
+ if (!(flags & SF_ALLOW_SPEECH))
+ drawCross(151, 124);
+ if (!(flags & SF_ALLOW_TEXT))
+ drawCross(173, 124);
+}
+
+void SkyControl::drawCross(uint16 x, uint16 y) {
+
+ _text->flushForRedraw();
+ uint8 *bufPos, *crossPos;
+ bufPos = _screenBuf + y * GAME_SCREEN_WIDTH + x;
+ crossPos = _crossImg;
+ for (uint16 cnty = 0; cnty < CROSS_SZ_Y; cnty++) {
+ for (uint16 cntx = 0; cntx < CROSS_SZ_X; cntx++)
+ if (crossPos[cntx] != 0xFF)
+ bufPos[cntx] = crossPos[cntx];
+ bufPos += GAME_SCREEN_WIDTH;
+ crossPos += CROSS_SZ_X;
+ }
+ bufPos = _screenBuf + y * GAME_SCREEN_WIDTH + x;
+ _system->copy_rect(bufPos, GAME_SCREEN_WIDTH, x, y, CROSS_SZ_X, CROSS_SZ_Y);
+ _text->drawToScreen(WITH_MASK);
+}
+
void SkyControl::animClick(SkyConResource *pButton) {
if (pButton->_curSprite != pButton->_numSprites -1) {
pButton->_curSprite++;
+ _text->flushForRedraw();
pButton->drawToScreen(NO_MASK);
+ _text->drawToScreen(WITH_MASK);
_system->update_screen();
delay(150);
pButton->_curSprite--;
+ _text->flushForRedraw();
pButton->drawToScreen(NO_MASK);
+ _text->drawToScreen(WITH_MASK);
_system->update_screen();
}
}
@@ -291,6 +329,8 @@ void SkyControl::drawMainPanel(void) {
_slide->drawToScreen(WITH_MASK);
_slide2->drawToScreen(WITH_MASK);
_bodge->drawToScreen(WITH_MASK);
+ if (SkyState::isCDVersion())
+ drawTextCross(SkyState::_systemVars.systemFlags & TEXT_FLAG_MASK);
}
void SkyControl::restartGame(void) {
@@ -372,9 +412,9 @@ void SkyControl::doControlPanel(void) {
buttonControl(_controlPanLookList[lookCnt]);
if (_mouseClicked && _controlPanLookList[lookCnt]->_onClick) {
clickRes = handleClick(_controlPanLookList[lookCnt]);
- buttonControl(NULL);
- _text->drawToScreen(WITH_MASK); // flush text restore buffer
+ _text->flushForRedraw();
drawMainPanel();
+ _text->drawToScreen(WITH_MASK);
if ((clickRes == QUIT_PANEL) || (clickRes == GAME_SAVED) ||
(clickRes == GAME_RESTORED))
quitPanel = true;
@@ -455,7 +495,8 @@ uint16 SkyControl::handleClick(SkyConResource *pButton) {
return 0;
case TOGGLE_TEXT:
- return toggleText(pButton);
+ animClick(pButton);
+ return toggleText();
case EXIT:
animClick(pButton);
@@ -585,20 +626,23 @@ uint16 SkyControl::toggleFx(SkyConResource *pButton) {
return TOGGLED;
}
-uint16 SkyControl::toggleText(SkyConResource *pButton) {
+uint16 SkyControl::toggleText(void) {
+
+ uint32 flags = SkyState::_systemVars.systemFlags & TEXT_FLAG_MASK;
+ SkyState::_systemVars.systemFlags &= ~TEXT_FLAG_MASK;
+
+
+ if (flags == SF_ALLOW_TEXT)
+ flags = SF_ALLOW_SPEECH;
+ else if (flags == SF_ALLOW_SPEECH)
+ flags = SF_ALLOW_SPEECH | SF_ALLOW_TEXT;
+ else
+ flags = SF_ALLOW_TEXT;
+
+ SkyState::_systemVars.systemFlags |= flags;
+
+ drawTextCross(flags);
- SkyState::_systemVars.systemFlags ^= SF_ALLOW_SPEECH;
- if (SkyState::_systemVars.systemFlags & SF_ALLOW_SPEECH) {
- pButton->_curSprite = 0;
- pButton->_text = 0x7000 + 35;
- SkyState::_systemVars.systemFlags &= ~SF_ALLOW_TEXT;
- } else {
- pButton->_curSprite = 2;
- pButton->_text = 0x7000 + 21;
- SkyState::_systemVars.systemFlags |= SF_ALLOW_TEXT;
- }
- pButton->drawToScreen(WITH_MASK);
- buttonControl(pButton);
_system->update_screen();
return TOGGLED;
}
@@ -1384,3 +1428,45 @@ char SkyControl::_quitTexts[12][30] = {
"Fim de jogo para o jogador um",
"BE VIGILANT"
};
+
+uint8 SkyControl::_crossImg[594] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x4D, 0x61,
+ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x08, 0x4E, 0x53, 0x50, 0x4F, 0x0C, 0x4D, 0x4E, 0x51, 0x58, 0x58, 0x54, 0x4E, 0x08, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x54, 0x58, 0x50, 0x4E, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x50, 0x4E, 0x54, 0x58, 0x58, 0x54, 0x4E, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x61, 0x53, 0x58, 0x54, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x50, 0x4E, 0x55, 0x58, 0x58, 0x53, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x51, 0x58, 0x58,
+ 0x51, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x51, 0x58,
+ 0x59, 0x58, 0x51, 0x61, 0xFF, 0xFF, 0x61, 0x54, 0x58, 0x58, 0x4F, 0x52, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x55, 0x58, 0x58, 0x57, 0x4E,
+ 0x4F, 0x56, 0x58, 0x57, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x51, 0x58, 0x58, 0x58, 0x58, 0x58, 0x54, 0x4E, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x6A, 0x4F, 0x58, 0x58, 0x58, 0x58, 0x52, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x54, 0x58,
+ 0x58, 0x58, 0x58, 0x57, 0x53, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x09, 0x58, 0x58, 0x58, 0x57, 0x56, 0x58, 0x58, 0x58,
+ 0x57, 0x4F, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x61, 0x55, 0x58, 0x58, 0x58, 0x58, 0x4E, 0x64, 0x57, 0x58, 0x58, 0x58, 0x58, 0x53, 0x61, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x57, 0x58, 0x58, 0x58, 0x58,
+ 0x50, 0xFF, 0xFF, 0x4E, 0x57, 0x58, 0x58, 0x58, 0x58, 0x56, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x58, 0x58, 0x58, 0x58, 0x58, 0x53, 0x09, 0xFF, 0xFF, 0xFF, 0x4E,
+ 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x57,
+ 0x58, 0x58, 0x58, 0x58, 0x56, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x58, 0x58, 0x58, 0x58,
+ 0x58, 0x57, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x55, 0x58, 0x58, 0x58, 0x58, 0x58, 0x4E,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x58, 0x58, 0x58, 0x58, 0x4E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x06, 0x58, 0x58, 0x58, 0x58, 0x58, 0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x0C, 0x52, 0x58, 0x58, 0x51, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x56, 0x58,
+ 0x58, 0x58, 0x58, 0x56, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x56,
+ 0x58, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x4D, 0x4D, 0x51, 0x56, 0x58, 0x58, 0x50, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x54, 0x09, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x50, 0x54, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
diff --git a/sky/control.h b/sky/control.h
index fe2da43111..9adf0b1829 100644
--- a/sky/control.h
+++ b/sky/control.h
@@ -47,6 +47,10 @@ class SkyMouse;
#define SP_HEIGHT 149
#define SP_TOP_GAP 12
#define SP_BOT_GAP 27
+#define CROSS_SZ_X 27
+#define CROSS_SZ_Y 22
+
+#define TEXT_FLAG_MASK (SF_ALLOW_SPEECH | SF_ALLOW_TEXT)
#define GAME_NAME_X (SPNL_X + 18) // x coordinate of game names
#define GAME_NAME_Y (SPNL_Y + SP_TOP_GAP) // start y coord of game names
@@ -138,6 +142,7 @@ public:
SkyTextResource(void *pSpData, uint32 pNSprites, uint32 pCurSprite, uint16 pX, uint16 pY, uint32 pText, uint8 pOnClick, OSystem *system, uint8 *screen);
virtual ~SkyTextResource(void);
virtual void drawToScreen(bool doMask);
+ void flushForRedraw(void);
private:
uint16 _oldX, _oldY;
uint8 *_oldScreen;
@@ -166,9 +171,11 @@ private:
uint16 doMusicSlide(void);
uint16 doSpeedSlide(void);
uint16 toggleFx(SkyConResource *pButton);
- uint16 toggleText(SkyConResource *pButton);
+ uint16 toggleText(void);
uint16 shiftDown(uint8 speed);
uint16 shiftUp(uint8 speed);
+ void drawTextCross(uint32 flags);
+ void drawCross(uint16 x, uint16 y);
uint16 saveRestorePanel(bool allowSave);
void loadDescriptions(uint8 *destBuf);
@@ -249,6 +256,7 @@ private:
SkyConResource *_savePanLookList[6], *_restorePanLookList[6];
static char _quitTexts[12][30];
+ static uint8 _crossImg[594];
};
#endif // CONTROL_H
diff --git a/sky/sky.cpp b/sky/sky.cpp
index b7a07ef335..ed94bd7471 100644
--- a/sky/sky.cpp
+++ b/sky/sky.cpp
@@ -183,7 +183,7 @@ void SkyState::initialise(void) {
_skyMusic = new SkyGmMusic(_detector->createMidi(), _skyDisk, _system);
}
if (isCDVersion())
- _systemVars.systemFlags |= SF_ALLOW_SPEECH;
+ _systemVars.systemFlags |= SF_ALLOW_SPEECH | SF_ALLOW_TEXT;
else
_systemVars.systemFlags |= SF_ALLOW_TEXT;