aboutsummaryrefslogtreecommitdiff
path: root/sky
diff options
context:
space:
mode:
authorRobert Göffringmann2003-07-12 01:12:00 +0000
committerRobert Göffringmann2003-07-12 01:12:00 +0000
commita857771521346eb29c5d2aa27e997f8f3ec058c8 (patch)
tree7ab3610149cd8893419eabc37388ea84c192a51e /sky
parent9c531b56090a094d5fb44aa1ad43478ff4f06097 (diff)
downloadscummvm-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.cpp40
-rw-r--r--sky/mouse.cpp87
-rw-r--r--sky/mouse.h45
-rw-r--r--sky/sky.cpp8
-rw-r--r--sky/skydefs.h2
-rw-r--r--sky/sound.cpp6
-rw-r--r--sky/sound.h1
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;