From c8689b29d891eaca26e80393b89e8a41e0f2dddf Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sat, 30 Sep 2006 06:47:41 +0000 Subject: Add mouse cursor support for PP and minor cleanup svn-id: r24027 --- engines/agos/agos.cpp | 12 +++-- engines/agos/agos.h | 16 +++---- engines/agos/cursor.cpp | 124 ++++++++++++++++++++++++++++-------------------- engines/agos/items.cpp | 1 + 4 files changed, 89 insertions(+), 64 deletions(-) diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index d07579f2ef..260d1d0f4a 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -167,9 +167,12 @@ AGOSEngine::AGOSEngine(OSystem *syst) _subtitles = false; _animatePointer = 0; - _mouseCursor = 0; + _maxCursorWidth = 0; + _maxCursorHeight = 0; _mouseAnim = 0; _mouseAnimMax = 0; + _mouseCursor = 0; + _mouseData = 0; _oldMouseCursor = 0; _currentMouseCursor = 0; _currentMouseAnim = 0; @@ -607,6 +610,7 @@ void AGOSEngine::setupGame() { allocItemHeap(); allocTablesHeap(); + initMouse(); _variableArray = (int16 *)calloc(_numVars, sizeof(int16)); _variableArray2 = (int16 *)calloc(_numVars, sizeof(int16)); @@ -1367,9 +1371,9 @@ void AGOSEngine::setZoneBuffers() { byte *AGOSEngine::allocBlock(uint32 size) { byte *block, *blockEnd; - uint i; + int vgaMemSize = _vgaMemSize; - for (i = 0; i < _vgaMemSize / size; i++) { + do { block = _vgaMemPtr; blockEnd = block + size; @@ -1387,7 +1391,7 @@ byte *AGOSEngine::allocBlock(uint32 size) { _vgaMemPtr = blockEnd; return block; } - } + } while (vgaMemSize--); error("allocBlock: Couldn't find free block"); } diff --git a/engines/agos/agos.h b/engines/agos/agos.h index 0b5db6cd96..1ebda88f95 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -330,16 +330,12 @@ protected: int _mouseX, _mouseY; int _mouseXOld, _mouseYOld; - enum { - kMaxCursorWidth = 40, - kMaxCursorHeight = 40 - }; - - byte _mouseData[kMaxCursorWidth * kMaxCursorHeight]; + byte *_mouseData; byte _animatePointer; - byte _mouseCursor, _mouseAnim, _mouseAnimMax; - byte _currentMouseCursor, _currentMouseAnim; - byte _oldMouseCursor, _oldMouseAnimMax; + byte _maxCursorWidth, _maxCursorHeight; + byte _mouseAnim, _mouseAnimMax, _mouseCursor; + byte _currentMouseAnim, _currentMouseCursor; + byte _oldMouseAnimMax, _oldMouseCursor; uint _mouseHideCount; bool _mouseToggle; @@ -687,6 +683,8 @@ protected: void handleMouseMoved(); void pollMouseXY(); + void initMouse(); + void loadMouseImage(); void drawMousePointer(); void drawMousePointer_FF(); void drawMousePart(int image, byte x, byte y); diff --git a/engines/agos/cursor.cpp b/engines/agos/cursor.cpp index 70318f649e..27db13a019 100644 --- a/engines/agos/cursor.cpp +++ b/engines/agos/cursor.cpp @@ -226,13 +226,48 @@ static const byte _simon2_cursors[10][256] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0xe5,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, }; -void AGOSEngine::drawMousePointer() { - if (getGameType() == GType_SIMON2) { - CursorMan.replaceCursor(_simon2_cursors[_mouseCursor], 16, 16, 7, 7); - } else { - CursorMan.replaceCursor(_simon1_cursor, 16, 16, 0, 0); - } -} +// Feeble Files specific +static const byte _mouseOffs[29 * 32] = { + 6,0,15,21,16,21,14,21,15,21,16,21,16,21,16,21,15,21,15,21,15,21,14,21,12,21,12,21,12,21,12,21, + 6,2,10,12,9,12,8,11,7,10,6,9,4,8,3,7,1,7,0,6,3,7,4,8,6,9,7,10,8,11,9,12, + 0,0,0,0,0,0,0,0,0,1,0,3,0,3,0,4,1,4,1,3,2,3,2,2,1,3,0,4,0,3,0,0, + + 0,0,5,16,4,19,2,21,1,21,1,21,1,21,1,18,3,9,6,2,6,0,3,6,4,12,4,13,4,13,4,14, + 0,0,6,13,5,15,4,16,3,19,2,19,2,19,2,18,1,16,4,10,7,3,7,0,4,2,4,6,0,0,0,0, + + 0,0,7,0,7,1,8,1,11,1,13,1,9,1,6,1,6,0,6,0,6,0,7,0,11,0,13,0,9,0,7,0, + + 0,0,7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + +// SAM icons + 0,0,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3, + 0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 0,0,5,5,5,5,5,5,5,5,5,4,1,1,2,2,3,3,5,5,7,6,9,8,11,10,14,13,16,16,0,0, + 0,0,4,3,5,2,4,2,4,3,5,3,5,2,4,2,4,3,5,3,5,2,4,3,4,3,5,3,5,2,4,2, + +// Asteroid Map icons + 0,0,3,0,4,1,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,3,0,4,1,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,8,0,7,0,8,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +// Other icons + 0,0,9,9,9,10,8,11,7,11,7,11,8,11,9,10,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,10,7,10,6,10,5,10,4,10,3,10,4,10,5,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,7,3,4,3,2,4,0,5,0,7,0,7,0,5,2,4,4,3,7,3,0,0,0,0,0,0,0,0,0,0, + 0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +// Vent icons + 0,0,8,3,7,3,6,3,5,3,4,3,3,3,2,3,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,3,3,3,4,3,8,3,10,3,12,3,14,3,17,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,3,14,4,12,5,10,6,9,7,8,7,7,8,6,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,3,3,2,3,4,3,4,3,5,3,4,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + + 0,0,7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,9,9,9,10,8,11,7,11,7,11,8,11,9,10,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,10,7,10,6,10,5,10,4,10,3,10,4,10,5,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; void AGOSEngine::handleMouseMoved() { uint x; @@ -353,48 +388,35 @@ void AGOSEngine::pollMouseXY() { _mouseY = _sdlMouseY; } -// Feeble Files specific -static const byte _mouseOffs[29 * 32] = { - 6,0,15,21,16,21,14,21,15,21,16,21,16,21,16,21,15,21,15,21,15,21,14,21,12,21,12,21,12,21,12,21, - 6,2,10,12,9,12,8,11,7,10,6,9,4,8,3,7,1,7,0,6,3,7,4,8,6,9,7,10,8,11,9,12, - 0,0,0,0,0,0,0,0,0,1,0,3,0,3,0,4,1,4,1,3,2,3,2,2,1,3,0,4,0,3,0,0, - - 0,0,5,16,4,19,2,21,1,21,1,21,1,21,1,18,3,9,6,2,6,0,3,6,4,12,4,13,4,13,4,14, - 0,0,6,13,5,15,4,16,3,19,2,19,2,19,2,18,1,16,4,10,7,3,7,0,4,2,4,6,0,0,0,0, - - 0,0,7,0,7,1,8,1,11,1,13,1,9,1,6,1,6,0,6,0,6,0,7,0,11,0,13,0,9,0,7,0, - - 0,0,7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +void AGOSEngine::initMouse() { + if (getGameType() == GType_PP) { + _maxCursorWidth = 75; + _maxCursorHeight = 97; + _mouseData = (byte *)calloc(_maxCursorWidth * _maxCursorHeight, 1); + } else if (getGameType() == GType_FF) { + _maxCursorWidth = 40; + _maxCursorHeight = 40; + _mouseData = (byte *)calloc(_maxCursorWidth * _maxCursorHeight, 1); + } +} -// SAM icons - 0,0,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3, - 0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 0,0,5,5,5,5,5,5,5,5,5,4,1,1,2,2,3,3,5,5,7,6,9,8,11,10,14,13,16,16,0,0, - 0,0,4,3,5,2,4,2,4,3,5,3,5,2,4,2,4,3,5,3,5,2,4,3,4,3,5,3,5,2,4,2, +void AGOSEngine::loadMouseImage() { + loadZone(_variableArray[500]); + VgaPointersEntry *vpe = &_vgaBufferPointers[_variableArray[500]]; -// Asteroid Map icons - 0,0,3,0,4,1,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,0,4,1,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,8,0,7,0,8,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -// Other icons - 0,0,9,9,9,10,8,11,7,11,7,11,8,11,9,10,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,10,7,10,6,10,5,10,4,10,3,10,4,10,5,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,7,3,4,3,2,4,0,5,0,7,0,7,0,5,2,4,4,3,7,3,0,0,0,0,0,0,0,0,0,0, - 0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -// Vent icons - 0,0,8,3,7,3,6,3,5,3,4,3,3,3,2,3,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,3,3,3,4,3,8,3,10,3,12,3,14,3,17,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,14,4,12,5,10,6,9,7,8,7,7,8,6,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,3,3,2,3,4,3,4,3,5,3,4,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + byte *src = vpe->vgaFile2 + READ_LE_UINT32(vpe->vgaFile2 + _variableArray[501] * 8); + memcpy(_mouseData, src, _maxCursorWidth * _maxCursorHeight); +} - 0,0,7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,9,9,9,10,8,11,7,11,7,11,8,11,9,10,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,10,7,10,6,10,5,10,4,10,3,10,4,10,5,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; +void AGOSEngine::drawMousePointer() { + if (getGameType() == GType_PP) { + CursorMan.replaceCursor(_mouseData, _maxCursorWidth, _maxCursorHeight, 37, 48, 0); + } else if (getGameType() == GType_SIMON2) { + CursorMan.replaceCursor(_simon2_cursors[_mouseCursor], 16, 16, 7, 7); + } else { + CursorMan.replaceCursor(_simon1_cursor, 16, 16, 0, 0); + } +} void AGOSEngine::drawMousePointer_FF() { uint cursor; @@ -449,7 +471,7 @@ void AGOSEngine::drawMousePointer_FF() { hotspotY += 18; } - CursorMan.replaceCursor(_mouseData, kMaxCursorWidth, kMaxCursorHeight, hotspotX, hotspotY, 0); + CursorMan.replaceCursor(_mouseData, _maxCursorWidth, _maxCursorHeight, hotspotX, hotspotY, 0); } } @@ -458,7 +480,7 @@ void AGOSEngine::drawMousePart(int image, byte x, byte y) { byte *src; int width, height; - byte *dst = _mouseData + y * kMaxCursorWidth + x; + byte *dst = _mouseData + y * _maxCursorWidth + x; src = vpe->vgaFile2 + image * 8; width = READ_LE_UINT16(src + 6); @@ -466,8 +488,8 @@ void AGOSEngine::drawMousePart(int image, byte x, byte y) { src = vpe->vgaFile2 + READ_LE_UINT32(src); - assert(width + x <= kMaxCursorWidth); - assert(height + y <= kMaxCursorWidth); + assert(width + x <= _maxCursorWidth); + assert(height + y <= _maxCursorWidth); for (int h = 0; h < height; h++) { for (int w = 0; w < width; w++) { @@ -475,7 +497,7 @@ void AGOSEngine::drawMousePart(int image, byte x, byte y) { dst[w] = src[w]; } src += width; - dst += kMaxCursorWidth; + dst += _maxCursorWidth; } } diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp index 8762e0511c..565f90c260 100644 --- a/engines/agos/items.cpp +++ b/engines/agos/items.cpp @@ -2580,6 +2580,7 @@ void AGOSEngine::o4_loadMouseImage() { // 38: load mouse image getVarOrByte(); getNextItemPtr(); + loadMouseImage(); } void AGOSEngine::o4_setShortText() { -- cgit v1.2.3