diff options
-rw-r--r-- | engines/kyra/lol.cpp | 4 | ||||
-rw-r--r-- | engines/kyra/lol.h | 6 | ||||
-rw-r--r-- | engines/kyra/scene_lol.cpp | 36 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 10 |
4 files changed, 36 insertions, 20 deletions
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 106feafae1..efa17305e7 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -1916,8 +1916,8 @@ uint16 LoLEngine::getClosestPartyMember(int x, int y) { if (!(_characters[i].flags & 1) || _characters[i].hitPointsCur <= 0) continue; - int16 charX = 0; - int16 charY = 0; + uint16 charX = 0; + uint16 charY = 0; calcCoordinatesForSingleCharacter(i, charX, charY); int d = ABS(x - charX) + ABS(y - charY); diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 2674575ca8..f717ece3bf 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -851,8 +851,8 @@ private: uint16 calcNewBlockPosition(uint16 curBlock, uint16 direction); uint16 calcBlockIndex(uint16 x, uint16 y); void calcCoordinates(uint16 &x, uint16 &y, int block, uint16 xOffs, uint16 yOffs); - void calcCoordinatesForSingleCharacter(int charNum, int16 &x, int16 &y); - void calcCoordinatesAddDirectionOffset(int16 &x, int16 &y, int direction); + void calcCoordinatesForSingleCharacter(int charNum, uint16 &x, uint16 &y); + void calcCoordinatesAddDirectionOffset(uint16 &x, uint16 &y, int direction); int clickedWallShape(uint16 block, uint16 direction); int clickedLeverOn(uint16 block, uint16 direction); @@ -1205,7 +1205,7 @@ private: uint8 *_mapCursorOverlay; uint8 _automapTopLeftX; uint8 _automapTopLeftY; - static const uint8 _mapCoords[12][4]; + static const int8 _mapCoords[12][4]; bool _mapUpdateNeeded; }; diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 5674dba761..e591a5cc91 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -662,7 +662,7 @@ void LoLEngine::calcCoordinates(uint16 &x, uint16 &y, int block, uint16 xOffs, u y = ((block & 0xffe0) << 3) | yOffs; } -void LoLEngine::calcCoordinatesForSingleCharacter(int charNum, int16 &x, int16 &y) { +void LoLEngine::calcCoordinatesForSingleCharacter(int charNum, uint16 &x, uint16 &y) { static const uint8 xOffsets[] = { 0x80, 0x00, 0x00, 0x40, 0xC0, 0x00, 0x40, 0x80, 0xC0 }; int c = countActiveCharacters(); if (!c) @@ -679,19 +679,25 @@ void LoLEngine::calcCoordinatesForSingleCharacter(int charNum, int16 &x, int16 & y |= (_partyPosY & 0xff00); } -void LoLEngine::calcCoordinatesAddDirectionOffset(int16 &x, int16 &y, int direction) { +void LoLEngine::calcCoordinatesAddDirectionOffset(uint16 &x, uint16 &y, int direction) { if (!direction) return; + int tx = x; + int ty = y; + if (direction & 1) - SWAP(x, y); + SWAP(tx, ty); - if (direction == 1) - y = (y - 256) * -1; + if (direction != 1) + ty = (ty - 256) * -1; - if (direction == 3) { - x = (x - 256) * -1; + if (direction != 3) { + tx = (tx - 256) * -1; } + + x = tx; + y = ty; } bool LoLEngine::checkBlockPassability(uint16 block, uint16 direction) { @@ -781,6 +787,16 @@ int LoLEngine::clickedDoorSwitch(uint16 block, uint16 direction) { } int LoLEngine::clickedNiche(uint16 block, uint16 direction) { + uint8 v = _wllShapeMap[_levelBlockProperties[block].walls[direction]]; + if (!clickedShape(v) || !_itemInHand) + return 0; + + uint16 x = 0x80; + uint16 y = 0xff; + calcCoordinatesAddDirectionOffset(x, y, _currentDirection); + calcCoordinates(x, y, block, x, y); + setItemPosition(_itemInHand, x, y, 8, 1); + setHandItem(0); return 1; } @@ -1878,7 +1894,7 @@ void LoLEngine::drawDecorations(int index) { } void LoLEngine::drawBlockEffects(int index, int type) { - static const int16 yOffs[] = { 0xff, 0xff, 0x80, 0x80 }; + static const uint16 yOffs[] = { 0xff, 0xff, 0x80, 0x80 }; uint8 flg = _visibleBlocks[index]->flags; // flags: 0x10 = ice wall, 0x20 = teleporter, 0x40 = blue slime spot, 0x80 = blood spot if (!(flg & 0xf0)) @@ -1890,8 +1906,8 @@ void LoLEngine::drawBlockEffects(int index, int type) { if (!((0x10 << type) & flg)) continue; - int16 x = 0x80; - int16 y = yOffs[type]; + uint16 x = 0x80; + uint16 y = yOffs[type]; uint16 drawFlag = (type == 3) ? 0x80 : 0x20; uint8 *ovl = (type == 3) ? _screen->_grayOverlay : 0; diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index fc37b2d9cd..87aae17f0e 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -3063,11 +3063,11 @@ const uint8 LoLEngine::_clock2Timers[] = { 0x51, 0x52, 0x08, 0x09, 0x0A }; -const uint8 LoLEngine::_mapCoords[12][4] = { - { 0x00, 0x07, 0x00, 0xFB }, { 0xFB, 0x00, 0x06, 0x00 }, { 0x07, 0x05, 0x07, 0x01 }, - { 0x05, 0x06, 0x04, 0x06 }, { 0x00, 0x07, 0x00, 0xFF }, { 0xFD, 0x00, 0x06, 0x00 }, - { 0x06, 0x07, 0x06, 0xFD }, { 0xFD, 0x05, 0x06, 0x05 }, { 0x01, 0x05, 0x01, 0x01 }, - { 0x03, 0x01, 0x03, 0x01 }, { 0xFF, 0x06, 0xFF, 0xF8 }, { 0xF9, 0xFF, 0x05, 0xFF } +const int8 LoLEngine::_mapCoords[12][4] = { + { 0, 7, 0, -5 }, { -5, 0, 6, 0 }, { 7, 5, 7, 1 }, + { 5, 6, 4, 6 }, { 0, 7, 0, -1 }, { -3, 0, 6, 0 }, + { 6, 7, 6, -3 }, { -3, 5, 6, 5 }, { 1, 5, 1, 1 }, + { 3, 1, 3, 1 }, { -1, 6, -1, -8 }, { -7, -1, 5, -1 } }; const uint8 LoLEngine::_numClock2Timers = ARRAYSIZE(LoLEngine::_clock2Timers); |