aboutsummaryrefslogtreecommitdiff
path: root/sky/mouse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sky/mouse.cpp')
-rw-r--r--sky/mouse.cpp80
1 files changed, 48 insertions, 32 deletions
diff --git a/sky/mouse.cpp b/sky/mouse.cpp
index a4d7a67823..f702c41828 100644
--- a/sky/mouse.cpp
+++ b/sky/mouse.cpp
@@ -77,10 +77,9 @@ uint32 _mouseObjectList[] = {
24829
};
-SkyMouse::SkyMouse(OSystem *system, SkyDisk *skyDisk, SkyLogic *skyLogic) {
+SkyMouse::SkyMouse(OSystem *system, SkyDisk *skyDisk) {
_skyDisk = skyDisk;
- _skyLogic = skyLogic;
_system = system;
_mouseWidth = 6;
_mouseHeight = 6;
@@ -112,23 +111,6 @@ void SkyMouse::replaceMouseCursors(uint16 fileNo) {
_skyDisk->loadFile(fileNo, _objectMouseData);
}
-/*bool SkyMouse::fnBlankMouse(void) {
- _mouseXOff = 0; //re-align mouse
- spriteMouse(MOUSE_BLANK, 0, 0);
- return true;
-}
-
-bool SkyMouse::fnDiskMouse(void) {
- //turn the mouse into a disk mouse
- spriteMouse(MOUSE_DISK, 11, 11);
- return true; //don't quit from the interpreter
-}
-
-bool SkyMouse::fnNormalMouse(void) {
- spriteMouse(MOUSE_NORMAL, 0, 0);
- return true;
-}*/
-
bool SkyMouse::fnAddHuman(void) {
//reintroduce the mouse so that the human can control the player
//could still be switched out at high-level
@@ -148,9 +130,8 @@ bool SkyMouse::fnAddHuman(void) {
//get off may contain script to remove mouse pointer text
//surely this script should be run just in case
//I am going to try it anyway
- uint32 getOff = SkyLogic::_scriptVariables[GET_OFF];
- if (getOff)
- _skyLogic->script((uint16)(getOff & 0xFFFF), (uint16)(getOff >> 16));
+ if (SkyLogic::_scriptVariables[GET_OFF])
+ _skyLogic->script(SkyLogic::_scriptVariables[GET_OFF]);
SkyLogic::_scriptVariables[SPECIAL_ITEM] = 0xFFFFFFFF;
SkyLogic::_scriptVariables[GET_OFF] = RESET_MOUSE;
@@ -159,6 +140,11 @@ bool SkyMouse::fnAddHuman(void) {
return true;
}
+void SkyMouse::fnSaveCoods(void) {
+ SkyLogic::_scriptVariables[SAFEX] = _tMouseX;
+ SkyLogic::_scriptVariables[SAFEY] = _tMouseY;
+}
+
void SkyMouse::lockMouse(void) {
_lockMouseX = _aMouseX;
_lockMouseY = _aMouseY;
@@ -180,14 +166,10 @@ void SkyMouse::drawNewMouse() {
//drawMouse();
}
-void SkyMouse::spriteMouse(uint16 frameNum, uint16 mouseX, uint16 mouseY) {
+void SkyMouse::spriteMouse(uint16 frameNum, uint8 mouseX, uint8 mouseY) {
SkyState::_systemVars.mouseFlag |= MF_IN_INT;
_mouseType2 = frameNum;
- _mouseOffsetX = mouseX;
- _mouseOffsetY = mouseY;
- //restoreMouseData(frameNum);
- printf("drawing mouse %d\n",frameNum);
byte *mouseData = _miceData;
uint32 pos = ((struct dataFileHeader *)mouseData)->s_sp_size * frameNum;
pos += sizeof(struct dataFileHeader);
@@ -196,16 +178,18 @@ void SkyMouse::spriteMouse(uint16 frameNum, uint16 mouseX, uint16 mouseY) {
_mouseWidth = ((struct dataFileHeader *)mouseData)->s_width;
_mouseHeight = ((struct dataFileHeader *)mouseData)->s_height;
- _system->set_mouse_cursor(_mouseData2, _mouseWidth, _mouseHeight, mouseX, mouseY);
+ //_system->set_mouse_cursor(_mouseData2, _mouseWidth, _mouseHeight, mouseX, mouseY);
+ // there's something wrong about the mouse's hotspot. using 0/0 works fine.
+ _system->set_mouse_cursor(_mouseData2, _mouseWidth, _mouseHeight, 0, 0);
if (frameNum == MOUSE_BLANK) _system->show_mouse(false);
else _system->show_mouse(true);
- //drawNewMouse();
-
SkyState::_systemVars.mouseFlag &= ~MF_IN_INT;
}
-void SkyMouse::mouseEngine(void) {
+void SkyMouse::mouseEngine(uint16 mouseX, uint16 mouseY) {
+ _aMouseX = mouseX;
+ _aMouseY = mouseY;
_tMouseX = _aMouseX + TOP_LEFT_X;
_tMouseY = _aMouseY + TOP_LEFT_Y;
@@ -223,7 +207,39 @@ void SkyMouse::mouseEngine(void) {
}
void SkyMouse::pointerEngine(void) {
- warning("Stub: pointerEngine()");
+ uint32 currentListNum = SkyLogic::_scriptVariables[MOUSE_LIST_NO];
+ uint16 *currentList;
+ do {
+ currentList = (uint16*)SkyState::fetchCompact(currentListNum);
+ while ((*currentList != 0) && (*currentList != 0xFFFF)) {
+ uint16 itemNum = *currentList;
+ Compact *itemData = SkyState::fetchCompact(itemNum);
+ currentList++;
+ if ((itemData->screen == SkyLogic::_scriptVariables[SCREEN]) && (itemData->status & 16)) {
+ if (itemData->xcood + itemData->mouseRelX > _tMouseX) continue;
+ if (itemData->xcood + itemData->mouseRelX + itemData->mouseSizeX < _tMouseX) continue;
+ if (itemData->ycood + itemData->mouseRelY > _tMouseY) continue;
+ if (itemData->ycood + itemData->mouseRelY + itemData->mouseSizeY < _tMouseY) continue;
+ // we've hit the item
+ if (SkyLogic::_scriptVariables[SPECIAL_ITEM] == itemNum)
+ return;
+ SkyLogic::_scriptVariables[SPECIAL_ITEM] = itemNum;
+ if (SkyLogic::_scriptVariables[GET_OFF])
+ _skyLogic->script(SkyLogic::_scriptVariables[GET_OFF]);
+ SkyLogic::_scriptVariables[GET_OFF] = itemData->mouseOff;
+ if (itemData->mouseOn) _skyLogic->script(itemData->mouseOn);
+ return;
+ }
+ }
+ if (*currentList == 0xFFFF) currentListNum = currentList[1];
+
+ } while (*currentList != 0);
+ if (SkyLogic::_scriptVariables[SPECIAL_ITEM] != 0) {
+ SkyLogic::_scriptVariables[SPECIAL_ITEM] = 0;
+ if (SkyLogic::_scriptVariables[GET_OFF])
+ _skyLogic->script(SkyLogic::_scriptVariables[GET_OFF]);
+ SkyLogic::_scriptVariables[GET_OFF] = 0;
+ }
}
void SkyMouse::buttonEngine1(void) {