aboutsummaryrefslogtreecommitdiff
path: root/sky
diff options
context:
space:
mode:
authorRobert Göffringmann2003-06-05 18:54:26 +0000
committerRobert Göffringmann2003-06-05 18:54:26 +0000
commit8e253b1937377151dcaa66b6931a5ad6b8938122 (patch)
tree2fee4c65176cfc94c259f444830b5cfe9f6f0c5f /sky
parentda6ac080af95ed7a0a2e3a5d691ef6af0b6732f3 (diff)
downloadscummvm-rg350-8e253b1937377151dcaa66b6931a5ad6b8938122.tar.gz
scummvm-rg350-8e253b1937377151dcaa66b6931a5ad6b8938122.tar.bz2
scummvm-rg350-8e253b1937377151dcaa66b6931a5ad6b8938122.zip
fixed sprite drawing, added some mouse support and some logic routines.
svn-id: r8332
Diffstat (limited to 'sky')
-rw-r--r--sky/logic.cpp11
-rw-r--r--sky/logic.h4
-rw-r--r--sky/mouse.cpp80
-rw-r--r--sky/mouse.h15
-rw-r--r--sky/screen.cpp10
-rw-r--r--sky/sky.cpp16
-rw-r--r--sky/sky.h5
-rw-r--r--sky/skydefs.h2
-rw-r--r--sky/text.cpp27
-rw-r--r--sky/text.h5
10 files changed, 109 insertions, 66 deletions
diff --git a/sky/logic.cpp b/sky/logic.cpp
index 57fc4c38e9..59e56c55f6 100644
--- a/sky/logic.cpp
+++ b/sky/logic.cpp
@@ -396,7 +396,7 @@ void SkyLogic::turn() {
}
void SkyLogic::cursor() {
- error("Stub: SkyLogic::cursor");
+ _skyText->logicCursor(_compact, _skyMouse->giveMouseX(), _skyMouse->giveMouseY());
}
/*
@@ -1470,7 +1470,7 @@ bool SkyLogic::fnKillId(uint32 id, uint32 b, uint32 c) {
bool SkyLogic::fnNoHuman(uint32 a, uint32 b, uint32 c) {
if (!_scriptVariables[MOUSE_STOP]) {
- _scriptVariables[MOUSE_STOP] &= 1;
+ _scriptVariables[MOUSE_STATUS] &= 1;
runGetOff();
fnBlankMouse(0, 0, 0);
}
@@ -1500,7 +1500,9 @@ bool SkyLogic::fnClearStop(uint32 a, uint32 b, uint32 c) {
}
bool SkyLogic::fnPointerText(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnPointerText");
+
+ _skyText->fnPointerText(a, _skyMouse->giveMouseX(), _skyMouse->giveMouseY());
+ return true;
}
bool SkyLogic::fnQuit(uint32 a, uint32 b, uint32 c) {
@@ -2050,7 +2052,8 @@ bool SkyLogic::fnFlushChip(uint32 a, uint32 b, uint32 c) {
}
bool SkyLogic::fnSaveCoods(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnSaveCoods");
+ _skyMouse->fnSaveCoods();
+ return true;
}
bool SkyLogic::fnPlotGrid(uint32 x, uint32 y, uint32 width) {
diff --git a/sky/logic.h b/sky/logic.h
index 2acae2339d..4b7f0d2cdd 100644
--- a/sky/logic.h
+++ b/sky/logic.h
@@ -42,6 +42,9 @@ enum scriptVariableOffsets {
BUTTON = 15,
SPECIAL_ITEM = 17,
GET_OFF = 18,
+ CURSOR_ID = 22,
+ SAFEX = 25,
+ SAFEY = 26,
PLAYER_X = 27,
PLAYER_Y = 28,
PLAYER_MOOD = 29,
@@ -89,6 +92,7 @@ public:
void pause();
void waitSync();
void simpleAnim();
+ uint16 script(uint32 num) { return script((uint16)(num & 0xFFFF), (uint16)(num >> 16)); };
uint16 script(uint16 scriptNo, uint16 offset);
bool fnCacheChip(uint32 a, uint32 b, uint32 c);
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) {
diff --git a/sky/mouse.h b/sky/mouse.h
index b6e52b9e61..842d939324 100644
--- a/sky/mouse.h
+++ b/sky/mouse.h
@@ -33,21 +33,25 @@ class SkyMouse {
public:
- SkyMouse(OSystem *system, SkyDisk *skyDisk, SkyLogic *skyLogic);
+ SkyMouse(OSystem *system, SkyDisk *skyDisk);
~SkyMouse(void);
+ void mouseEngine(uint16 mouseX, uint16 mouseY);
void replaceMouseCursors(uint16 fileNo);
- //void setMouseSprite(uint8 sprNum, uint16 mouseX, uint16 mouseY);
bool fnAddHuman(void);
+ void fnSaveCoods(void);
void lockMouse(void);
void unlockMouse(void);
void restoreMouseData(uint16 frameNum);
void drawNewMouse(void);
- void spriteMouse(uint16 frameNum, uint16 mouseX, uint16 mouseY);
+ void spriteMouse(uint16 frameNum, uint8 mouseX, uint8 mouseY);
+ void useLogicInstance(SkyLogic *skyLogic) { _skyLogic = skyLogic; };
+ void buttonPressed(void) { _bMouseB = 1; };
+ uint16 giveMouseX(void) { return _aMouseX; };
+ uint16 giveMouseY(void) { return _aMouseY; };
protected:
- void mouseEngine(void);
void pointerEngine(void);
void buttonEngine1(void);
@@ -66,9 +70,6 @@ protected:
uint16 _lockMouseX;
uint16 _lockMouseY;
- uint16 _mouseOffsetX; //for offsetting the mouse
- uint16 _mouseOffsetY; //positive offsets only, mouse moves left or up
-
uint16 _mouseType2; //number of current mouse
byte *_mouseData2; //pointer to mouse data
diff --git a/sky/screen.cpp b/sky/screen.cpp
index 15e5cd081b..a875a8d9cd 100644
--- a/sky/screen.cpp
+++ b/sky/screen.cpp
@@ -591,7 +591,7 @@ void SkyScreen::drawSprite(uint8 *spriteInfo, Compact *sprCompact) {
spriteData += sizeof(dataFileHeader);
int32 spriteY = sprCompact->ycood + (int16)FROM_LE_16(sprDataFile->s_offset_y) - TOP_LEFT_Y;
if (spriteY < 0) {
- spriteY = ~spriteY;
+ spriteY = -spriteY;
if (_sprHeight <= (uint32)spriteY) {
_sprWidth = 0;
return ;
@@ -612,7 +612,7 @@ void SkyScreen::drawSprite(uint8 *spriteInfo, Compact *sprCompact) {
_sprY = (uint32)spriteY;
int32 spriteX = sprCompact->xcood + (int16)FROM_LE_16(sprDataFile->s_offset_x) - TOP_LEFT_X;
if (spriteX < 0) {
- spriteX = ~spriteX;
+ spriteX = -spriteX;
if (_sprWidth <= (uint32)spriteX) {
_sprWidth = 0;
return ;
@@ -621,9 +621,9 @@ void SkyScreen::drawSprite(uint8 *spriteInfo, Compact *sprCompact) {
_maskX1 = spriteX;
spriteX = 0;
} else {
- int32 rightClip = GAME_SCREEN_WIDTH - FROM_LE_16(sprDataFile->s_width) - spriteX;
+ int32 rightClip = GAME_SCREEN_WIDTH - (FROM_LE_16(sprDataFile->s_width) + spriteX);
if (rightClip < 0) {
- rightClip = ~rightClip;
+ rightClip = (-rightClip) + 1;
if (_sprWidth <= (uint32)rightClip) {
_sprWidth = 0;
return ;
@@ -643,7 +643,7 @@ void SkyScreen::drawSprite(uint8 *spriteInfo, Compact *sprCompact) {
for (uint8 cnty = 0; cnty < _sprHeight; cnty++) {
for (uint8 cntx = 0; cntx < _sprWidth; cntx++)
if (spriteData[cntx + _maskX1]) screenPtr[cntx] = spriteData[cntx + _maskX1];
- spriteData += _sprWidth;
+ spriteData += _sprWidth + _maskX2;
screenPtr += GAME_SCREEN_WIDTH;
}
// Convert the sprite coordinate/size values to blocks for vertical mask and/or vector to game
diff --git a/sky/sky.cpp b/sky/sky.cpp
index 99d376841d..d68237b3d6 100644
--- a/sky/sky.cpp
+++ b/sky/sky.cpp
@@ -125,12 +125,6 @@ void SkyState::errorString(const char *buf1, char *buf2) {
strcpy(buf2, buf1);
}
-void SkyState::pollMouseXY() {
-
- _mouse_x = _sdl_mouse_x;
- _mouse_y = _sdl_mouse_y;
-}
-
void SkyState::go() {
if (!_dump_file)
@@ -147,6 +141,7 @@ void SkyState::go() {
while (1) {
delay(50);
+ _skyMouse->mouseEngine((uint16)_sdl_mouse_x, (uint16)_sdl_mouse_y);
_skyLogic->engine();
_skyScreen->recreate();
_skyScreen->spriteEngine();
@@ -174,16 +169,16 @@ void SkyState::initialise(void) {
_systemVars.systemFlags |= SF_PLAY_VOCS;
_skyText = new SkyText(_skyDisk);
- _skyMouse = new SkyMouse(_system, _skyDisk, _skyLogic);
+ _skyMouse = new SkyMouse(_system, _skyDisk);
_skyScreen = new SkyScreen(_system, _skyDisk);
initVirgin();
- //initMouse();
initItemList();
//initScript();
//initialiseRouter();
loadFixedItems();
_skyLogic = new SkyLogic(_skyScreen, _skyDisk, _skyText, _skyMusic, _skyMouse, _skySound);
+ _skyMouse->useLogicInstance(_skyLogic);
_timer = Engine::_timer; // initialize timer *after* _skyScreen has been initialized.
_timer->installProcedure(&timerHandler, 1000000 / 50); //call 50 times per second
@@ -271,7 +266,6 @@ void SkyState::delay(uint amount) { //copied and mutilated from Simon.cpp
uint32 start = _system->get_msecs();
uint32 cur = start;
_key_pressed = 0; //reset
- _mouse_pos_changed = false;
_rnd.getRandomNumber(2);
do {
@@ -288,12 +282,12 @@ void SkyState::delay(uint amount) { //copied and mutilated from Simon.cpp
case OSystem::EVENT_MOUSEMOVE:
_sdl_mouse_x = event.mouse.x;
_sdl_mouse_y = event.mouse.y;
- _mouse_pos_changed = true;
_system->set_mouse_pos(_sdl_mouse_x, _sdl_mouse_y);
break;
- case OSystem::EVENT_LBUTTONDOWN:
+ case OSystem::EVENT_LBUTTONDOWN:
_left_button_down++;
+ _skyMouse->buttonPressed();
#ifdef _WIN32_WCE
_sdl_mouse_x = event.mouse.x;
_sdl_mouse_y = event.mouse.y;
diff --git a/sky/sky.h b/sky/sky.h
index 8c3280b26f..fcbc1f0484 100644
--- a/sky/sky.h
+++ b/sky/sky.h
@@ -65,15 +65,11 @@ protected:
uint16 _debugMode;
uint16 _debugLevel;
- uint _mouse_x, _mouse_y;
- uint _mouse_x_old, _mouse_y_old;
- bool _mouse_pos_changed;
uint _left_button_down;
int _numScreenUpdates;
Timer *_timer;
- //int _timer_id;
FILE *_dump_file;
@@ -116,7 +112,6 @@ public:
protected:
void logic_engine();
void delay(uint amount);
- void pollMouseXY();
void go();
//intro related
diff --git a/sky/skydefs.h b/sky/skydefs.h
index 0ca0b7e7bc..08a6822796 100644
--- a/sky/skydefs.h
+++ b/sky/skydefs.h
@@ -4299,5 +4299,7 @@
#define MOUSE_CROSS 7 // angry mouse
#define MOUSE_UP 8 // mouse up
+#define TEXT_MOUSE_WIDTH 0x80
+
#endif
diff --git a/sky/text.cpp b/sky/text.cpp
index 9809be4e4a..2db13aa624 100644
--- a/sky/text.cpp
+++ b/sky/text.cpp
@@ -176,6 +176,31 @@ void SkyText::getText(uint32 textNr) { //load text #"textNr" into textBuffer
} while(textChar);
}
+void SkyText::fnPointerText(uint32 pointedId, uint16 mouseX, uint16 mouseY) {
+
+ Compact *ptrComp = SkyState::fetchCompact(pointedId);
+ lowTextManager_t text = lowTextManager(ptrComp->cursorText, TEXT_MOUSE_WIDTH, L_CURSOR, 242, false);
+ SkyLogic::_scriptVariables[CURSOR_ID] = text.compactNum;
+ if (SkyLogic::_scriptVariables[MENU]) {
+ _mouseOfsY = TOP_LEFT_Y - 2;
+ if (mouseX < 150) _mouseOfsX = TOP_LEFT_X + 24;
+ else _mouseOfsX = TOP_LEFT_X - 8 - _lowTextWidth;
+ } else {
+ _mouseOfsY = TOP_LEFT_Y - 10;
+ if (mouseX < 150) _mouseOfsX = TOP_LEFT_X + 13;
+ else _mouseOfsX = TOP_LEFT_X - 8 - _lowTextWidth;
+ }
+ Compact *textCompact = SkyState::fetchCompact(text.compactNum);
+ logicCursor(textCompact, mouseX, mouseY);
+}
+
+void SkyText::logicCursor(Compact *textCompact, uint16 mouseX, uint16 mouseY) {
+
+ textCompact->xcood = (uint16)(mouseX + _mouseOfsX);
+ textCompact->ycood = (uint16)(mouseY + _mouseOfsY);
+ if (textCompact->ycood < TOP_LEFT_Y) textCompact->ycood = TOP_LEFT_Y;
+}
+
bool SkyText::getTBit() {
if (_shiftBits) {
@@ -376,7 +401,7 @@ lowTextManager_t SkyText::lowTextManager(uint32 textNum, uint16 width, uint16 lo
cpt->logic = logicNum;
cpt->status = ST_LOGIC | ST_FOREGROUND | ST_RECREATE;
- cpt->screen = (uint16) SkyLogic::_scriptVariables[SCREEN];
+ cpt->screen = (uint16) SkyLogic::_scriptVariables[SCREEN];
struct lowTextManager_t ret;
ret.textData = _dtData;
diff --git a/sky/text.h b/sky/text.h
index bf5f6b7ceb..8d947ed766 100644
--- a/sky/text.h
+++ b/sky/text.h
@@ -23,6 +23,7 @@
#define SKYTEXT_H
#include "sky/disk.h"
+#include "sky/struc.h"
struct HuffTree {
unsigned char lChild;
@@ -41,6 +42,8 @@ public:
struct lowTextManager_t lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, bool centre);
void fnSetFont(uint32 fontNr);
void fnTextModule(uint32 textInfoId, uint32 textNo);
+ void fnPointerText(uint32 pointedId, uint16 mouseX, uint16 mouseY);
+ void logicCursor(Compact *textCompact, uint16 mouseX, uint16 mouseY);
protected:
bool getTBit();
@@ -79,7 +82,7 @@ protected:
uint32 _dtWidth; //width of chars in last line (for editing (?))
uint32 _dtLastWidth;
bool _dtCentre; //set for centre text
- uint32 _lowTextWidth;
+ uint32 _lowTextWidth, _mouseOfsX, _mouseOfsY;
public:
uint32 _dtLetters; //no of chars in message