diff options
author | Robert Göffringmann | 2003-07-12 01:12:00 +0000 |
---|---|---|
committer | Robert Göffringmann | 2003-07-12 01:12:00 +0000 |
commit | a857771521346eb29c5d2aa27e997f8f3ec058c8 (patch) | |
tree | 7ab3610149cd8893419eabc37388ea84c192a51e /sky | |
parent | 9c531b56090a094d5fb44aa1ad43478ff4f06097 (diff) | |
download | scummvm-rg350-a857771521346eb29c5d2aa27e997f8f3ec058c8.tar.gz scummvm-rg350-a857771521346eb29c5d2aa27e997f8f3ec058c8.tar.bz2 scummvm-rg350-a857771521346eb29c5d2aa27e997f8f3ec058c8.zip |
implemented dialog skipping and cleaned up mouse code
svn-id: r8919
Diffstat (limited to 'sky')
-rw-r--r-- | sky/logic.cpp | 40 | ||||
-rw-r--r-- | sky/mouse.cpp | 87 | ||||
-rw-r--r-- | sky/mouse.h | 45 | ||||
-rw-r--r-- | sky/sky.cpp | 8 | ||||
-rw-r--r-- | sky/skydefs.h | 2 | ||||
-rw-r--r-- | sky/sound.cpp | 6 | ||||
-rw-r--r-- | sky/sound.h | 1 |
7 files changed, 69 insertions, 120 deletions
diff --git a/sky/logic.cpp b/sky/logic.cpp index 9258d29c18..691f3d9ed1 100644 --- a/sky/logic.cpp +++ b/sky/logic.cpp @@ -416,8 +416,7 @@ void SkyLogic::cursor() { _skyText->logicCursor(_compact, _skyMouse->giveMouseX(), _skyMouse->giveMouseY()); } -/* -static uint16 clickTable[] = { +static uint16 clickTable[46] = { ID_FOSTER, ID_JOEY, ID_JOBS, @@ -471,7 +470,6 @@ static uint16 clickTable[] = { ID_HOLOGRAM_B, 12289 }; -*/ void SkyLogic::talk() { // first count through the frames @@ -484,33 +482,27 @@ void SkyLogic::talk() { // Are we allowed to click -#if 0 - for (int i = 0; i < ARRAYSIZE(clickTable); i++) { - if (clickTable[i] == (uint16)_scriptVariables[CUR_ID]) { - if (_compact->extCompact->spTextId == 0xffff) { // is this a voc file? - warning("fnStopVoc not implemented"); - //TODO: fnStopVoc + if (_skyMouse->wasClicked()) + for (int i = 0; i < ARRAYSIZE(clickTable); i++) + if (clickTable[i] == (uint16)_scriptVariables[CUR_ID]) { + if ((SkyState::_systemVars.systemFlags & SF_ALLOW_SPEECH) && (!_skySound->speechFinished())) + _skySound->stopSpeech(); + if ((SkyState::_systemVars.systemFlags & SF_ALLOW_TEXT) && + (_compact->extCompact->spTextId > 0) && + (_compact->extCompact->spTextId < 0xFFFF)) { + + SkyState::fetchCompact(_compact->extCompact->spTextId)->status = 0; + } if (_compact->grafixProg) { _compact->frame = _compact->getToFlag; // set character to stand - _compact->grafixProg = 0; + _compact->grafixProg = NULL; } - } else { - if (_compact->grafixProg) // if anim flag stop it - _compact->frame = _compact->getToFlag; - if (_compact->extCompact->spTextId) { - Compact *cpt = SkyState::fetchCompact(_compact->extCompact->spTextId); // get text id to kill - cpt->status = 0; // kill the text - } + _compact->logic = L_SCRIPT; + logicScript(); + return; } - _compact->logic = L_SCRIPT; - logicScript(); - return; - } - } -#endif - // If speech is allowed then check for it to finish before finishing animations if ((_compact->extCompact->spTextId == 0xFFFF) && // is this a voc file? diff --git a/sky/mouse.cpp b/sky/mouse.cpp index bc0c7d60eb..5252461d52 100644 --- a/sky/mouse.cpp +++ b/sky/mouse.cpp @@ -81,22 +81,14 @@ SkyMouse::SkyMouse(OSystem *system, SkyDisk *skyDisk) { _skyDisk = skyDisk; _system = system; - _mouseWidth = 6; - _mouseHeight = 6; - _maskWidth = 6; - _maskHeight = 6; _mouseB = 0; _miceData = _skyDisk->loadFile(MICE_FILE, NULL); fixMouseTransparency(_miceData, _skyDisk->_lastLoadedFileSize); - _mouseData2 = _miceData; //load in the object mouse file _objectMouseData = _skyDisk->loadFile(MICE_FILE + 1, NULL); fixMouseTransparency(_objectMouseData, _skyDisk->_lastLoadedFileSize); - _mouseWidth = 1; - _mouseHeight = 1; - //_systemFlags |= SF_MOUSE;; } SkyMouse::~SkyMouse( ){ @@ -115,13 +107,11 @@ bool SkyMouse::fnAddHuman(void) { if (!SkyLogic::_scriptVariables[MOUSE_STOP]) { SkyLogic::_scriptVariables[MOUSE_STATUS] |= 6; //cursor & mouse - _tMouseX = _newSafeX; - _tMouseY = _newSafeY; - if (_aMouseY < 2) { //stop mouse activating top line - _aMouseY = 2; - _system->warp_mouse(GAME_SCREEN_WIDTH / 2, GAME_SCREEN_HEIGHT / 2); - } + if (_mouseY < 2) //stop mouse activating top line + _mouseY = 2; + + _system->warp_mouse(_mouseX, _mouseY); //force the pointer engine into running a get-off //even if it's over nothing @@ -141,18 +131,16 @@ bool SkyMouse::fnAddHuman(void) { } void SkyMouse::fnSaveCoods(void) { - SkyLogic::_scriptVariables[SAFEX] = _tMouseX; - SkyLogic::_scriptVariables[SAFEY] = _tMouseY; + SkyLogic::_scriptVariables[SAFEX] = _mouseX + TOP_LEFT_X; + SkyLogic::_scriptVariables[SAFEY] = _mouseY + TOP_LEFT_Y; } void SkyMouse::lockMouse(void) { - _lockMouseX = _aMouseX; - _lockMouseY = _aMouseY; + SkyState::_systemVars.systemFlags |= SF_MOUSE_LOCKED; } void SkyMouse::unlockMouse(void) { - _aMouseX = _lockMouseX; - _aMouseY = _lockMouseY; + SkyState::_systemVars.systemFlags &= ~SF_MOUSE_LOCKED; } void SkyMouse::restoreMouseData(uint16 frameNum) { @@ -178,7 +166,6 @@ void SkyMouse::waitMouseNotPressed(void) { mousePressed = false; } } - _bMouseB = 0; } //original sky uses different colors for transparency than our backends do, @@ -201,46 +188,38 @@ void SkyMouse::fixMouseTransparency(byte *mouseData, uint32 size) { } void SkyMouse::spriteMouse(uint16 frameNum, uint8 mouseX, uint8 mouseY) { - SkyState::_systemVars.mouseFlag |= MF_IN_INT; - _mouseType2 = frameNum; + + _currentCursor = frameNum; - byte *mouseData = _miceData; - uint32 pos = ((struct dataFileHeader *)mouseData)->s_sp_size * frameNum; - pos += sizeof(struct dataFileHeader); - _mouseData2 = mouseData + pos; + byte *newCursor = _miceData; + newCursor += ((struct dataFileHeader *)_miceData)->s_sp_size * frameNum; + newCursor += sizeof(struct dataFileHeader); - _mouseWidth = ((struct dataFileHeader *)mouseData)->s_width; - _mouseHeight = ((struct dataFileHeader *)mouseData)->s_height; + uint16 mouseWidth = ((struct dataFileHeader *)_miceData)->s_width; + uint16 mouseHeight = ((struct dataFileHeader *)_miceData)->s_height; - //_system->set_mouse_cursor(_mouseData2, _mouseWidth, _mouseHeight, mouseX, mouseY); - // there's something wrong about the mouse's hotspot. using 4/4 seems to work fine. - _system->set_mouse_cursor(_mouseData2, _mouseWidth, _mouseHeight, mouseX, mouseY); + _system->set_mouse_cursor(newCursor, mouseWidth, mouseHeight, mouseX, mouseY); if (frameNum == MOUSE_BLANK) _system->show_mouse(false); else _system->show_mouse(true); - - SkyState::_systemVars.mouseFlag &= ~MF_IN_INT; } void SkyMouse::mouseEngine(uint16 mouseX, uint16 mouseY) { - _aMouseX = mouseX; - _aMouseY = mouseY; - _tMouseX = _aMouseX + TOP_LEFT_X; - _tMouseY = _aMouseY + TOP_LEFT_Y; + _mouseX = mouseX; + _mouseY = mouseY; + + _logicClick = (_mouseB > 0); // click signal is available for SkyLogic for one gamecycle - _eMouseB = _bMouseB; - _bMouseB = 0; - if (!SkyLogic::_scriptVariables[MOUSE_STOP]) { if (SkyLogic::_scriptVariables[MOUSE_STATUS] & (1 << 1)) { - pointerEngine(); + pointerEngine(mouseX + TOP_LEFT_X, mouseY + TOP_LEFT_Y); if (SkyLogic::_scriptVariables[MOUSE_STATUS] & (1 << 2)) //buttons enabled? buttonEngine1(); } } - _eMouseB = 0; //don't save up buttons + _mouseB = 0; //don't save up buttons } -void SkyMouse::pointerEngine(void) { +void SkyMouse::pointerEngine(uint16 xPos, uint16 yPos) { uint32 currentListNum = SkyLogic::_scriptVariables[MOUSE_LIST_NO]; uint16 *currentList; do { @@ -250,10 +229,10 @@ void SkyMouse::pointerEngine(void) { Compact *itemData = SkyState::fetchCompact(itemNum); currentList++; if ((itemData->screen == SkyLogic::_scriptVariables[SCREEN]) && (itemData->status & 16)) { - if (itemData->xcood + ((int16)itemData->mouseRelX) > _tMouseX) continue; - if (itemData->xcood + ((int16)itemData->mouseRelX) + itemData->mouseSizeX < _tMouseX) continue; - if (itemData->ycood + ((int16)itemData->mouseRelY) > _tMouseY) continue; - if (itemData->ycood + ((int16)itemData->mouseRelY) + itemData->mouseSizeY < _tMouseY) continue; + if (itemData->xcood + ((int16)itemData->mouseRelX) > xPos) continue; + if (itemData->xcood + ((int16)itemData->mouseRelX) + itemData->mouseSizeX < xPos) continue; + if (itemData->ycood + ((int16)itemData->mouseRelY) > yPos) continue; + if (itemData->ycood + ((int16)itemData->mouseRelY) + itemData->mouseSizeY < yPos) continue; // we've hit the item if (SkyLogic::_scriptVariables[SPECIAL_ITEM] == itemNum) return; @@ -279,22 +258,16 @@ void SkyMouse::pointerEngine(void) { } void SkyMouse::buttonPressed(uint8 button) { - if (_bMouseB == button) - _mouseB = 1; - else - _mouseB = 0; - - _bMouseB = button; + _mouseB = button; } void SkyMouse::buttonEngine1(void) { //checks for clicking on special item //"compare the size of this routine to S1 mouse_button" - if (_eMouseB) { //anything pressed? - SkyLogic::_scriptVariables[BUTTON] = _eMouseB; - _eMouseB = 0; + if (_mouseB) { //anything pressed? + SkyLogic::_scriptVariables[BUTTON] = _mouseB; if (SkyLogic::_scriptVariables[SPECIAL_ITEM]) { //over anything? Compact *item = SkyState::fetchCompact(SkyLogic::_scriptVariables[SPECIAL_ITEM]); if (item->mouseClick) diff --git a/sky/mouse.h b/sky/mouse.h index 65c9b179ea..0fad0cf0d4 100644 --- a/sky/mouse.h +++ b/sky/mouse.h @@ -50,51 +50,28 @@ public: void useLogicInstance(SkyLogic *skyLogic) { _skyLogic = skyLogic; }; void buttonPressed(uint8 button); void waitMouseNotPressed(void); - uint16 giveMouseX(void) { return _aMouseX; }; - uint16 giveMouseY(void) { return _aMouseY; }; - uint16 giveCurrentMouseType(void) { return _mouseType2; }; + uint16 giveMouseX(void) { return _mouseX; }; + uint16 giveMouseY(void) { return _mouseY; }; + uint16 giveCurrentMouseType(void) { return _currentCursor; }; + bool wasClicked(void) { return _logicClick; }; protected: - void pointerEngine(void); + void pointerEngine(uint16 xPos, uint16 yPos); void buttonEngine1(void); void fixMouseTransparency(byte *mouseData, uint32 size); - - uint16 _mouseB; //used to check for repeat presses - uint16 _eMouseB; - uint16 _bMouseB; - - uint16 _aMouseX; //actual mouse coordinates - uint16 _aMouseY; - - uint16 _tMouseX; - uint16 _tMouseY; - - uint16 _newSafeX; - uint16 _newSafeY; - - uint16 _lockMouseX; - uint16 _lockMouseY; - uint16 _mouseType2; //number of current mouse - byte *_mouseData2; //pointer to mouse data - - uint16 _mouseWidth; //mouse width and height - uint16 _mouseHeight; - - byte *_mousePosition; //current screen address of mouse - uint16 _maskWidth; //width on screen - uint16 _maskHeight; //height on screen + bool _logicClick; + + uint16 _mouseB; //mouse button + uint16 _mouseX; //actual mouse coordinates + uint16 _mouseY; - uint32 _mouseFlag; //bit 0 set when in handler - //bit 1 set when screen data has been saved - //bit 2 set when we don't want to show mouse + uint16 _currentCursor; byte *_miceData; //address of mouse sprites byte *_objectMouseData; //address of object mouse sprites - uint16 _mouseXOff; - static uint32 _mouseMainObjects[24]; static uint32 _mouseLincObjects[21]; diff --git a/sky/sky.cpp b/sky/sky.cpp index e36076a41e..c0307782a2 100644 --- a/sky/sky.cpp +++ b/sky/sky.cpp @@ -359,9 +359,11 @@ void SkyState::delay(uint amount) { //copied and mutilated from Simon.cpp break; case OSystem::EVENT_MOUSEMOVE: - _sdl_mouse_x = event.mouse.x; - _sdl_mouse_y = event.mouse.y; - _system->set_mouse_pos(_sdl_mouse_x, _sdl_mouse_y); + if (!(_systemVars.systemFlags & SF_MOUSE_LOCKED)) { + _sdl_mouse_x = event.mouse.x; + _sdl_mouse_y = event.mouse.y; + _system->set_mouse_pos(_sdl_mouse_x, _sdl_mouse_y); + } break; case OSystem::EVENT_LBUTTONDOWN: diff --git a/sky/skydefs.h b/sky/skydefs.h index 7e1fdc9001..0f2030d48f 100644 --- a/sky/skydefs.h +++ b/sky/skydefs.h @@ -4269,7 +4269,7 @@ #define SF_ALLOW_TEXT (1 << 24) // text allowed on cd sblaster version #define SF_ALLOW_QUICK (1 << 25) // when set allow speed playing #define SF_TEST_DISK (1 << 26) // set when loading files -#define SF_MOUSE_STOPPED (1 << 27) // set if mouse handler skipped to prevent stack overflow +#define SF_MOUSE_LOCKED (1 << 27) // set if coordinates are locked // Mouse flags #define MF_NO_UPDATE (1 << 0) // set to disable mouse updating diff --git a/sky/sound.cpp b/sky/sound.cpp index 700e6934d1..47958b39ec 100644 --- a/sky/sound.cpp +++ b/sky/sound.cpp @@ -1215,6 +1215,10 @@ void SkySound::fnStopFx(void) { _saveSounds[0] = _saveSounds[1] = 0xFFFF; } +void SkySound::stopSpeech(void) { + _mixer->stopID(SOUND_SPEECH); +} + bool SkySound::startSpeech(uint16 textNum) { if (!(SkyState::_systemVars.systemFlags & SF_ALLOW_SPEECH)) @@ -1234,6 +1238,6 @@ bool SkySound::startSpeech(uint16 textNum) { free(speechData); _mixer->stopID(SOUND_SPEECH); - _mixer->playRaw(&_ingameSpeech, playBuffer, speechSize, 11025, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE); + _mixer->playRaw(&_ingameSpeech, playBuffer, speechSize, 11025, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE, SOUND_SPEECH); return true; } diff --git a/sky/sound.h b/sky/sound.h index e330eea2d0..1613bf5e0a 100644 --- a/sky/sound.h +++ b/sky/sound.h @@ -63,6 +63,7 @@ public: void fnPauseFx(void) { _mixer->pause(true); }; void fnUnPauseFx(void) { _mixer->pause(false); }; void fnStopFx(void); + void stopSpeech(void); void checkFxQueue(void); void restoreSfx(void); uint8 _soundsTotal; |