diff options
author | Robert Göffringmann | 2003-06-05 18:54:26 +0000 |
---|---|---|
committer | Robert Göffringmann | 2003-06-05 18:54:26 +0000 |
commit | 8e253b1937377151dcaa66b6931a5ad6b8938122 (patch) | |
tree | 2fee4c65176cfc94c259f444830b5cfe9f6f0c5f /sky | |
parent | da6ac080af95ed7a0a2e3a5d691ef6af0b6732f3 (diff) | |
download | scummvm-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.cpp | 11 | ||||
-rw-r--r-- | sky/logic.h | 4 | ||||
-rw-r--r-- | sky/mouse.cpp | 80 | ||||
-rw-r--r-- | sky/mouse.h | 15 | ||||
-rw-r--r-- | sky/screen.cpp | 10 | ||||
-rw-r--r-- | sky/sky.cpp | 16 | ||||
-rw-r--r-- | sky/sky.h | 5 | ||||
-rw-r--r-- | sky/skydefs.h | 2 | ||||
-rw-r--r-- | sky/text.cpp | 27 | ||||
-rw-r--r-- | sky/text.h | 5 |
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; @@ -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 |