diff options
author | Bendegúz Nagy | 2016-07-04 17:14:32 +0200 |
---|---|---|
committer | Bendegúz Nagy | 2016-08-26 23:02:22 +0200 |
commit | 7fef7b83127f532781fec64eea3229d56c080902 (patch) | |
tree | de112cad8a1af14b2d5959e961b67c1cc0cbe99c | |
parent | 94c878143e75e872ba8c82b31a5564c9b4e6437c (diff) | |
download | scummvm-rg350-7fef7b83127f532781fec64eea3229d56c080902.tar.gz scummvm-rg350-7fef7b83127f532781fec64eea3229d56c080902.tar.bz2 scummvm-rg350-7fef7b83127f532781fec64eea3229d56c080902.zip |
DM: Add paritial drawing of doors
-rw-r--r-- | engines/dm/dm.cpp | 4 | ||||
-rw-r--r-- | engines/dm/dm.h | 1 | ||||
-rw-r--r-- | engines/dm/dungeonman.cpp | 13 | ||||
-rw-r--r-- | engines/dm/dungeonman.h | 11 | ||||
-rw-r--r-- | engines/dm/gfx.cpp | 264 | ||||
-rw-r--r-- | engines/dm/gfx.h | 48 |
6 files changed, 324 insertions, 17 deletions
diff --git a/engines/dm/dm.cpp b/engines/dm/dm.cpp index 7de740d3a9..7fa1eea7b9 100644 --- a/engines/dm/dm.cpp +++ b/engines/dm/dm.cpp @@ -84,6 +84,10 @@ uint16 toggleFlag(uint16& val, uint16 mask) { return val ^= mask; } +uint16 M75_bitmapByteCount(uint16 pixelWidth, uint16 height) { + return pixelWidth / 2 * height; +} + DMEngine::DMEngine(OSystem *syst) : Engine(syst), _console(nullptr) { // Do not load data files // Do not initialize graphics here diff --git a/engines/dm/dm.h b/engines/dm/dm.h index 207416c18f..8133fd231f 100644 --- a/engines/dm/dm.h +++ b/engines/dm/dm.h @@ -69,6 +69,7 @@ uint16 getFlag(uint16 val, uint16 mask); // @ M07_GET uint16 setFlag(uint16 &val, uint16 mask); // @ M08_SET uint16 clearFlag(uint16 &val, uint16 mask); // @ M09_CLEAR uint16 toggleFlag(uint16 &val, uint16 mask); // @ M10_TOGGLE +uint16 M75_bitmapByteCount(uint16 pixelWidth, uint16 height); // @ M75_BITMAP_BYTE_COUNT enum ThingType { diff --git a/engines/dm/dungeonman.cpp b/engines/dm/dungeonman.cpp index 2a037a70d0..0cecd049e7 100644 --- a/engines/dm/dungeonman.cpp +++ b/engines/dm/dungeonman.cpp @@ -384,7 +384,7 @@ DungeonMan::DungeonMan(DMEngine *dmEngine) : _vm(dmEngine), _rawDunFileData(NULL _g306_partyMapX = 0; _g307_partyMapY = 0; _g309_partyMapIndex = 0; - _g272_currMapIndex = 0; + _g272_currMapIndex = kM1_mapIndexNone; _g273_currMapWidth = 0; _g274_currMapHeight = 0; @@ -729,11 +729,22 @@ void DungeonMan::f434_loadDungeonFile() { } void DungeonMan::f173_setCurrentMap(uint16 mapIndex) { + static DoorInfo g254_doorInfo[4] = { // @ G0254_as_Graphic559_DoorInfo + /* { Attributes, Defense } */ + DoorInfo(3, 110), /* Door type 0 Portcullis */ + DoorInfo(0, 42), /* Door type 1 Wooden door */ + DoorInfo(0, 230), /* Door type 2 Iron door */ + DoorInfo(5, 255)}; /* Door type 3 Ra door */ + + if (_g272_currMapIndex == mapIndex) + return; _g272_currMapIndex = mapIndex; _g271_currMapData = _g279_dungeonMapData[mapIndex]; _g269_currMap = _g277_dungeonMaps + mapIndex; _g273_currMapWidth = _g277_dungeonMaps[mapIndex]._width + 1; _g274_currMapHeight = _g277_dungeonMaps[mapIndex]._height + 1; + _g275_currMapDoorInfo[0] = g254_doorInfo[_g269_currMap->_doorSet0]; + _g275_currMapDoorInfo[1] = g254_doorInfo[_g269_currMap->_doorSet1]; _g270_currMapColCumulativeSquareFirstThingCount = &_g280_dungeonColumnsCumulativeSquareThingCount[_g281_dungeonMapsFirstColumnIndex[mapIndex]]; } diff --git a/engines/dm/dungeonman.h b/engines/dm/dungeonman.h index 331c3c9e17..d2a82ac8f2 100644 --- a/engines/dm/dungeonman.h +++ b/engines/dm/dungeonman.h @@ -594,6 +594,14 @@ struct Map { }; // @ MAP +class DoorInfo { +public: + byte _attributes; + byte _defense; + DoorInfo(byte b1, byte b2): _attributes(b1), _defense(b2){} + DoorInfo() {} +}; // @ DOOR_INFO + class DungeonMan { DMEngine *_vm; @@ -659,7 +667,7 @@ public: int16 _g306_partyMapX; // @ G0306_i_PartyMapX int16 _g307_partyMapY; // @ G0307_i_PartyMapY uint8 _g309_partyMapIndex; // @ G0309_i_PartyMapIndex - uint8 _g272_currMapIndex; // @ G0272_i_CurrentMapIndex + int16 _g272_currMapIndex; // @ G0272_i_CurrentMapIndex byte **_g271_currMapData; // @ G0271_ppuc_CurrentMapData Map *_g269_currMap; // @ G0269_ps_CurrentMap uint16 _g273_currMapWidth; // @ G0273_i_CurrentMapWidth @@ -678,6 +686,7 @@ public: bool _g288_isFacingFountain; // @ G0288_B_FacingFountain ElementType _g285_squareAheadElement; // @ G0285_i_SquareAheadElement Thing _g292_pileTopObject[5]; // @ G0292_aT_PileTopObject + DoorInfo _g275_currMapDoorInfo[2]; // @ G0275_as_CurrentMapDoorInfo }; } diff --git a/engines/dm/gfx.cpp b/engines/dm/gfx.cpp index 45a636830a..2a9a90dc7a 100644 --- a/engines/dm/gfx.cpp +++ b/engines/dm/gfx.cpp @@ -35,10 +35,136 @@ #include "dungeonman.h" #include "group.h" #include "timeline.h" +#include "champion.h" namespace DM { +DoorFrames g179_doorFrame_D3L = { // @ G0179_s_Graphic558_Frames_Door_D3L + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(24, 71, 28, 67, 24, 41, 0, 0), /* Closed Or Destroyed */ + Frame(24, 71, 28, 38, 24, 41, 0, 30), /* Vertical Closed one fourth */ + Frame(24, 71, 28, 48, 24, 41, 0, 20), /* Vertical Closed half */ + Frame(24, 71, 28, 58, 24, 41, 0, 10), /* Vertical Closed three fourth */ + Frame(24, 29, 28, 67, 24, 41, 18, 0), /* Left Horizontal Closed one fourth */ + Frame(24, 35, 28, 67, 24, 41, 12, 0), /* Left Horizontal Closed half */ + Frame(24, 41, 28, 67, 24, 41, 6, 0), /* Left Horizontal Closed three fourth */ + Frame(66, 71, 28, 67, 24, 41, 24, 0), /* Right Horizontal Closed one fourth */ + Frame(60, 71, 28, 67, 24, 41, 24, 0), /* Right Horizontal Closed half */ + Frame(54, 71, 28, 67, 24, 41, 24, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g180_doorFrame_D3C = { // @ G0180_s_Graphic558_Frames_Door_D3C + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(88, 135, 28, 67, 24, 41, 0, 0), /* Closed Or Destroyed */ + Frame(88, 135, 28, 38, 24, 41, 0, 30), /* Vertical Closed one fourth */ + Frame(88, 135, 28, 48, 24, 41, 0, 20), /* Vertical Closed half */ + Frame(88, 135, 28, 58, 24, 41, 0, 10), /* Vertical Closed three fourth */ + Frame(88, 93, 28, 67, 24, 41, 18, 0), /* Left Horizontal Closed one fourth */ + Frame(88, 99, 28, 67, 24, 41, 12, 0), /* Left Horizontal Closed half */ + Frame(88, 105, 28, 67, 24, 41, 6, 0), /* Left Horizontal Closed three fourth */ + Frame(130, 135, 28, 67, 24, 41, 24, 0), /* Right Horizontal Closed one fourth */ + Frame(124, 135, 28, 67, 24, 41, 24, 0), /* Right Horizontal Closed half */ + Frame(118, 135, 28, 67, 24, 41, 24, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g181_doorFrame_D3R = { // @ G0181_s_Graphic558_Frames_Door_D3R + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(150, 197, 28, 67, 24, 41, 0, 0), /* Closed Or Destroyed */ + Frame(150, 197, 28, 38, 24, 41, 0, 30), /* Vertical Closed one fourth */ + Frame(150, 197, 28, 48, 24, 41, 0, 20), /* Vertical Closed half */ + Frame(150, 197, 28, 58, 24, 41, 0, 10), /* Vertical Closed three fourth */ + Frame(150, 153, 28, 67, 24, 41, 18, 0), /* Left Horizontal Closed one fourth */ + Frame(150, 161, 28, 67, 24, 41, 12, 0), /* Left Horizontal Closed half */ + Frame(150, 167, 28, 67, 24, 41, 6, 0), /* Left Horizontal Closed three fourth */ + Frame(192, 197, 28, 67, 24, 41, 24, 0), /* Right Horizontal Closed one fourth */ + Frame(186, 197, 28, 67, 24, 41, 24, 0), /* Right Horizontal Closed half */ + Frame(180, 197, 28, 67, 24, 41, 24, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g182_doorFrame_D2L = { // @ G0182_s_Graphic558_Frames_Door_D2L + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(0, 63, 24, 82, 32, 61, 0, 0), /* Closed Or Destroyed */ + Frame(0, 63, 24, 39, 32, 61, 0, 45), /* Vertical Closed one fourth */ + Frame(0, 63, 24, 54, 32, 61, 0, 30), /* Vertical Closed half */ + Frame(0, 63, 24, 69, 32, 61, 0, 15), /* Vertical Closed three fourth */ + Frame(0, 7, 24, 82, 32, 61, 24, 0), /* Left Horizontal Closed one fourth */ + Frame(0, 15, 24, 82, 32, 61, 16, 0), /* Left Horizontal Closed half */ + Frame(0, 23, 24, 82, 32, 61, 8, 0), /* Left Horizontal Closed three fourth */ + Frame(56, 63, 24, 82, 32, 61, 32, 0), /* Right Horizontal Closed one fourth */ + Frame(48, 63, 24, 82, 32, 61, 32, 0), /* Right Horizontal Closed half */ + Frame(40, 63, 24, 82, 32, 61, 32, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g183_doorFrame_D2C = { // @ G0183_s_Graphic558_Frames_Door_D2C + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(80, 143, 24, 82, 32, 61, 0, 0), /* Closed Or Destroyed */ + Frame(80, 143, 24, 39, 32, 61, 0, 45), /* Vertical Closed one fourth */ + Frame(80, 143, 24, 54, 32, 61, 0, 30), /* Vertical Closed half */ + Frame(80, 143, 24, 69, 32, 61, 0, 15), /* Vertical Closed three fourth */ + Frame(80, 87, 24, 82, 32, 61, 24, 0), /* Left Horizontal Closed one fourth */ + Frame(80, 95, 24, 82, 32, 61, 16, 0), /* Left Horizontal Closed half */ + Frame(80, 103, 24, 82, 32, 61, 8, 0), /* Left Horizontal Closed three fourth */ + Frame(136, 143, 24, 82, 32, 61, 32, 0), /* Right Horizontal Closed one fourth */ + Frame(128, 143, 24, 82, 32, 61, 32, 0), /* Right Horizontal Closed half */ + Frame(120, 143, 24, 82, 32, 61, 32, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g184_doorFrame_D2R = { // @ G0184_s_Graphic558_Frames_Door_D2R + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(160, 223, 24, 82, 32, 61, 0, 0), /* Closed Or Destroyed */ + Frame(160, 223, 24, 39, 32, 61, 0, 45), /* Vertical Closed one fourth */ + Frame(160, 223, 24, 54, 32, 61, 0, 30), /* Vertical Closed half */ + Frame(160, 223, 24, 69, 32, 61, 0, 15), /* Vertical Closed three fourth */ + Frame(160, 167, 24, 82, 32, 61, 24, 0), /* Left Horizontal Closed one fourth */ + Frame(160, 175, 24, 82, 32, 61, 16, 0), /* Left Horizontal Closed half */ + Frame(160, 183, 24, 82, 32, 61, 8, 0), /* Left Horizontal Closed three fourth */ + Frame(216, 223, 24, 82, 32, 61, 32, 0), /* Right Horizontal Closed one fourth */ + Frame(208, 223, 24, 82, 32, 61, 32, 0), /* Right Horizontal Closed half */ + Frame(200, 223, 24, 82, 32, 61, 32, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g185_doorFrame_D1L = { // @ G0185_s_Graphic558_Frames_Door_D1L + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(0, 31, 17, 102, 48, 88, 64, 0), /* Closed Or Destroyed */ + Frame(0, 31, 17, 38, 48, 88, 64, 66), /* Vertical Closed one fourth */ + Frame(0, 31, 17, 60, 48, 88, 64, 44), /* Vertical Closed half */ + Frame(0, 31, 17, 82, 48, 88, 64, 22), /* Vertical Closed three fourth */ + Frame(0, 0, 0, 0, 0, 0, 0, 0), /* Left Horizontal Closed one fourth */ + Frame(0, 0, 0, 0, 0, 0, 0, 0), /* Left Horizontal Closed half */ + Frame(0, 0, 0, 0, 0, 0, 0, 0), /* Left Horizontal Closed three fourth */ + Frame(20, 31, 17, 102, 48, 88, 48, 0), /* Right Horizontal Closed one fourth */ + Frame(8, 31, 17, 102, 48, 88, 48, 0), /* Right Horizontal Closed half */ + Frame(0, 31, 17, 102, 48, 88, 52, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g186_doorFrame_D1C = { // @ G0186_s_Graphic558_Frames_Door_D1C + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(64, 159, 17, 102, 48, 88, 0, 0), /* Closed Or Destroyed */ + Frame(64, 159, 17, 38, 48, 88, 0, 66), /* Vertical Closed one fourth */ + Frame(64, 159, 17, 60, 48, 88, 0, 44), /* Vertical Closed half */ + Frame(64, 159, 17, 82, 48, 88, 0, 22), /* Vertical Closed three fourth */ + Frame(64, 75, 17, 102, 48, 88, 36, 0), /* Left Horizontal Closed one fourth */ + Frame(64, 87, 17, 102, 48, 88, 24, 0), /* Left Horizontal Closed half */ + Frame(64, 99, 17, 102, 48, 88, 12, 0), /* Left Horizontal Closed three fourth */ + Frame(148, 159, 17, 102, 48, 88, 48, 0), /* Right Horizontal Closed one fourth */ + Frame(136, 159, 17, 102, 48, 88, 48, 0), /* Right Horizontal Closed half */ + Frame(124, 159, 17, 102, 48, 88, 48, 0)}; /* Right Horizontal Closed three fourth */ +DoorFrames g187_doorFrame_D1R = { // @ G0187_s_Graphic558_Frames_Door_D1R + /* { X1, X2, Y1, Y2, ByteWidth, Height, X, Y } */ + Frame(192, 223, 17, 102, 48, 88, 0, 0), /* Closed Or Destroyed */ + Frame(192, 223, 17, 38, 48, 88, 0, 66), /* Vertical Closed one fourth */ + Frame(192, 223, 17, 60, 48, 88, 0, 44), /* Vertical Closed half */ + Frame(192, 223, 17, 82, 48, 88, 0, 22), /* Vertical Closed three fourth */ + Frame(192, 203, 17, 102, 48, 88, 36, 0), /* Left Horizontal Closed one fourth */ + Frame(192, 215, 17, 102, 48, 88, 24, 0), /* Left Horizontal Closed half */ + Frame(192, 223, 17, 102, 48, 88, 12, 0), /* Left Horizontal Closed three fourth */ + Frame(0, 0, 0, 0, 0, 0, 0, 0), /* Right Horizontal Closed one fourth */ + Frame(0, 0, 0, 0, 0, 0, 0, 0), /* Right Horizontal Closed half */ + Frame(0, 0, 0, 0, 0, 0, 0, 0)}; /* Right Horizontal Closed three fourth */ + +uint16 g207_doorOrnCoordSets[4][3][6] = { // @ G0207_aaauc_Graphic558_DoorOrnamentCoordinateSets + /* { X1, X2, Y1, Y2, ByteWidth, Height } */ + {{17, 31, 8, 17, 8, 10}, /* D3LCR */ + {22, 42, 11, 23, 16, 13}, /* D2LCR */ + {32, 63, 13, 31, 16, 19}}, /* D1LCR */ + {{0, 47, 0, 40, 24, 41}, /* D3LCR */ + {0, 63, 0, 60, 32, 61}, /* D2LCR */ + {0, 95, 0, 87, 48, 88}}, /* D1LCR */ + {{17, 31, 15, 24, 8, 10}, /* D3LCR */ + {22, 42, 22, 34, 16, 13}, /* D2LCR */ + {32, 63, 31, 49, 16, 19}}, /* D1LCR */ + {{23, 35, 31, 39, 8, 9}, /* D3LCR */ + {30, 48, 41, 52, 16, 12}, /* D2LCR */ + {44, 75, 61, 79, 16, 19}}}; /* D1LCR */ + + Frame g164_Frame_DoorFrameLeft_D3L = Frame(0, 31, 28, 70, 16, 43, 0, 0); // @ G0164_s_Graphic558_Frame_DoorFrameLeft_D3L Frame g165_Frame_DoorFrameRight_D3R = Frame(192, 223, 28, 70, 16, 43, 0, 0); // @ G0165_s_Graphic558_Frame_DoorFrameRight_D3R Frame g166_Frame_DoorFrameLeft_D3C = Frame(64, 95, 27, 70, 16, 44, 0, 0); // @ G0166_s_Graphic558_Frame_DoorFrameLeft_D3C @@ -945,6 +1071,14 @@ void DisplayMan::f461_allocateFlippedWallBitmaps() { _g94_bitmapWall_D0R_Flipped = new byte[32 * 136]; } +void DisplayMan::f102_drawDoorBitmap(Frame* frame) { + if (frame->_srcByteWidth) { + f132_blitToBitmap(_vm->_displayMan->_g74_tmpBitmap, + _vm->_displayMan->_g296_bitmapViewport, + frame->_box, frame->_srcX, frame->_srcY, frame->_srcByteWidth, k112_byteWidthViewport, k10_ColorFlesh, frame->_srcHeight, k136_heightViewport); + } +} + void DisplayMan::f565_viewportSetPalette(uint16* middleScreenPalette, uint16* topAndBottomScreen) { if (middleScreenPalette && topAndBottomScreen) debugC(kDMDebugOftenCalledWarning, "MISSING CODE: F0508_AMIGA_BuildPaletteChangeCopperList"); @@ -1064,7 +1198,7 @@ void DisplayMan::f130_flipBitmapHorizontal(byte *bitmap, uint16 byteWidth, uint1 } } -void DisplayMan::flipBitmapVertical(byte *bitmap, uint16 byteWidth, uint16 height) { +void DisplayMan::f131_flipVertical(byte *bitmap, uint16 byteWidth, uint16 height) { uint16 width = byteWidth * 2; byte *tmp = new byte[width]; @@ -1159,7 +1293,7 @@ void DisplayMan::f99_copyBitmapAndFlipHorizontal(byte* srcBitmap, byte* destBitm } void DisplayMan::f108_drawFloorOrnament(uint16 floorOrnOrdinal, uint16 viewFloorIndex) { -#define AP0118_ui_FloorOrnamentIndex floorOrnOrdinal + uint16 floorOrnIndex; int16 nativeBitmapIndex; bool drawFootprints; byte* bitmap; @@ -1213,12 +1347,13 @@ void DisplayMan::f108_drawFloorOrnament(uint16 floorOrnOrdinal, uint16 viewFloor goto T0108005; } floorOrnOrdinal--; - nativeBitmapIndex = _vm->_displayMan->_g102_currMapFloorOrnInfo[AP0118_ui_FloorOrnamentIndex][k0_NativeBitmapIndex] + floorOrnIndex = floorOrnOrdinal; + nativeBitmapIndex = _vm->_displayMan->_g102_currMapFloorOrnInfo[floorOrnIndex][k0_NativeBitmapIndex] + g191_floorOrnNativeBitmapndexInc[viewFloorIndex]; - coordSets = g206_floorOrnCoordSets[_vm->_displayMan->_g102_currMapFloorOrnInfo[AP0118_ui_FloorOrnamentIndex][k1_CoordinateSet]][viewFloorIndex]; + coordSets = g206_floorOrnCoordSets[_vm->_displayMan->_g102_currMapFloorOrnInfo[floorOrnIndex][k1_CoordinateSet]][viewFloorIndex]; if ((viewFloorIndex == k8_viewFloor_D1R) || (viewFloorIndex == k5_viewFloor_D2R) || (viewFloorIndex == k2_viewFloor_D3R) - || ((AP0118_ui_FloorOrnamentIndex == k15_FloorOrnFootprints) && _vm->_displayMan->_g76_useFlippedWallAndFootprintsBitmap && + || ((floorOrnIndex == k15_FloorOrnFootprints) && _vm->_displayMan->_g76_useFlippedWallAndFootprintsBitmap && ((viewFloorIndex == k7_viewFloor_D1C) || (viewFloorIndex == k4_viewFloor_D2C) || (viewFloorIndex == k1_viewFloor_D3C)))) { _vm->_displayMan->f99_copyBitmapAndFlipHorizontal(_vm->_displayMan->f489_getNativeBitmapOrGraphic(nativeBitmapIndex), bitmap = _vm->_displayMan->_g74_tmpBitmap, coordSets[4], coordSets[5]); @@ -1226,7 +1361,7 @@ void DisplayMan::f108_drawFloorOrnament(uint16 floorOrnOrdinal, uint16 viewFloor bitmap = _vm->_displayMan->f489_getNativeBitmapOrGraphic(nativeBitmapIndex); } _vm->_displayMan->f132_blitToBitmap(bitmap, _vm->_displayMan->_g296_bitmapViewport, - *(Box*)coordSets, 0, 0, coordSets[4], k112_byteWidthViewport, k10_ColorFlesh, coordSets[5], k136_heightViewport); + *(Box*)coordSets, 0, 0, coordSets[4], k112_byteWidthViewport, k10_ColorFlesh, coordSets[5], k136_heightViewport); T0108005: if (drawFootprints) { f108_drawFloorOrnament(_vm->M0_indexToOrdinal(k15_FloorOrnFootprints), viewFloorIndex); @@ -1234,6 +1369,96 @@ T0108005: } } +void DisplayMan::f111_drawDoor(uint16 doorThingIndex, uint16 doorState, int16* doorNativeBitmapIndices, int16 byteCount, int16 viewDoorOrnIndex, DoorFrames* doorFrames) { + uint16 doorType; + DoorFrames* doorFramesTemp; + Door* door; + + + doorFramesTemp = doorFrames; + if (doorState != k0_doorState_OPEN) { + door = (Door*)(_vm->_dungeonMan->_g284_thingData[k0_DoorThingType]) + doorThingIndex; + memmove(_g74_tmpBitmap, f489_getNativeBitmapOrGraphic(doorNativeBitmapIndices[doorType = door->getType()]), byteCount * 2); + f109_drawDoorOrnament(door->getOrnOrdinal(), viewDoorOrnIndex); + if (getFlag(_vm->_dungeonMan->_g275_currMapDoorInfo[doorType]._attributes, k0x0004_MaskDoorInfo_Animated)) { + if (_vm->_rnd->getRandomNumber(1)) { + _vm->_displayMan->f130_flipBitmapHorizontal(_vm->_displayMan->_g74_tmpBitmap, doorFramesTemp->_closedOrDestroyed._srcByteWidth, doorFramesTemp->_closedOrDestroyed._srcHeight); + } + if (_vm->_rnd->getRandomNumber(1)) { + f131_flipVertical(_vm->_displayMan->_g74_tmpBitmap, doorFramesTemp->_closedOrDestroyed._srcByteWidth, doorFramesTemp->_closedOrDestroyed._srcHeight); + } + } + if ((doorFramesTemp == &g186_doorFrame_D1C) && _vm->_championMan->_g407_party._event73Count_ThievesEye) { + f109_drawDoorOrnament(_vm->M0_indexToOrdinal(k16_DoorOrnThivesEyeMask), k2_ViewDoorOrnament_D1LCR); + } + if (doorState == k4_doorState_CLOSED) { + f102_drawDoorBitmap(&doorFramesTemp->_closedOrDestroyed); + } else { + if (doorState == k5_doorState_DESTROYED) { + f109_drawDoorOrnament(_vm->M0_indexToOrdinal(k15_DoorOrnDestroyedMask), viewDoorOrnIndex); + f102_drawDoorBitmap(&doorFramesTemp->_closedOrDestroyed); + } else { + doorState--; + if (door->opensVertically()) { + f102_drawDoorBitmap(&doorFramesTemp->_vertical[doorState]); + } else { + f102_drawDoorBitmap(&doorFramesTemp->_leftHorizontal[doorState]); + f102_drawDoorBitmap(&doorFramesTemp->_rightHorizontal[doorState]); + } + } + } + } +} + +void DisplayMan::f109_drawDoorOrnament(int16 doorOrnOrdinal, int16 viewDoorOrnIndex) { + static byte g200_palChangesDoorOrn_D3[16] = {0, 120, 10, 30, 40, 30, 0, 60, 30, 90, 100, 110, 0, 20, 0, 130}; // @ G0200_auc_Graphic558_PaletteChanges_DoorOrnament_D3 + static byte g201PalChangesDoorOrn_D2[16] = {0, 10, 20, 30, 40, 30, 60, 70, 50, 90, 100, 110, 120, 130, 140, 150}; // @ G0201_auc_Graphic558_PaletteChanges_DoorOrnament_D2 + + +#define height doorOrnOrdinal +#define byteWidth viewDoorOrnIndex + int16 nativeBitmapIndex; + int16 coordSetGreenToad; + uint16* coordSetOrangeElk; + byte* L0107_puc_Multiple; +#define bitmap L0107_puc_Multiple + byte* bitmapNative; + + + if (doorOrnOrdinal) { + doorOrnOrdinal--; + nativeBitmapIndex = _vm->_displayMan->_g103_currMapDoorOrnInfo[doorOrnOrdinal][k0_NativeBitmapIndex]; + coordSetOrangeElk = g207_doorOrnCoordSets[coordSetGreenToad = _vm->_displayMan->_g103_currMapDoorOrnInfo[doorOrnOrdinal][k1_CoordinateSet]][viewDoorOrnIndex]; + if (viewDoorOrnIndex == k2_ViewDoorOrnament_D1LCR) { + bitmap = _vm->_displayMan->f489_getNativeBitmapOrGraphic(nativeBitmapIndex); + byteWidth = 48; + height = 88; + } else { + if (!_vm->_displayMan->f491_isDerivedBitmapInCache(doorOrnOrdinal = k68_DerivedBitmapFirstDoorOrnament_D3 + (doorOrnOrdinal * 2) + viewDoorOrnIndex)) { + uint16 *coordSetRedEagle = g207_doorOrnCoordSets[coordSetGreenToad][k2_ViewDoorOrnament_D1LCR]; + bitmapNative = _vm->_displayMan->f489_getNativeBitmapOrGraphic(nativeBitmapIndex); + _vm->_displayMan->f129_blitToBitmapShrinkWithPalChange(bitmapNative, + f492_getDerivedBitmap(doorOrnOrdinal), + coordSetRedEagle[4] << 1, coordSetRedEagle[5], + coordSetOrangeElk[2] - coordSetOrangeElk[0] + 1, + coordSetOrangeElk[5], + (viewDoorOrnIndex == k0_ViewDoorOrnament_D3LCR) ? g200_palChangesDoorOrn_D3 : g201PalChangesDoorOrn_D2); + _vm->_displayMan->f493_addDerivedBitmap(doorOrnOrdinal); + } + bitmap = _vm->_displayMan->f492_getDerivedBitmap(doorOrnOrdinal); + if (viewDoorOrnIndex == k0_ViewDoorOrnament_D3LCR) { + byteWidth = 24; + height = 41; + } else { + byteWidth = 32; + height = 61; + } + } + _vm->_displayMan->f132_blitToBitmap(bitmap, _vm->_displayMan->_g74_tmpBitmap, + *(Box*)coordSetOrangeElk, 0, 0, coordSetOrangeElk[4], byteWidth, k9_ColorGold, coordSetOrangeElk[5], height); + } +} + void DisplayMan::f101_drawWallSetBitmapWithoutTransparency(byte *bitmap, Frame &f) { if (f._srcByteWidth) f132_blitToBitmap(bitmap, _g296_bitmapViewport, f._box, f._srcX, f._srcY, f._srcByteWidth, k112_byteWidthViewport, k255_ColorNoTransparency); @@ -1274,7 +1499,8 @@ void DisplayMan::f116_drawSquareD3L(direction dir, int16 posX, int16 posY) { f108_drawFloorOrnament(squareAspect[k4_FloorOrnOrdAspect], k0_viewFloor_D3L); f115_cthulhu(Thing(squareAspect[k1_FirstGroupOrObjectAspect]), dir, posX, posY, k1_ViewSquare_D3L, k0x0218_CellOrder_DoorPass1_BackLeft_BackRight); f100_drawWallSetBitmap(_g705_bitmapWallSet_DoorFrameLeft_D3L, g164_Frame_DoorFrameLeft_D3L); - warning("MISSING CODE: F0111_DUNGEONVIEW_DrawDoor"); + f111_drawDoor(squareAspect[k3_DoorThingIndexAspect], squareAspect[k2_DoorStateAspect], + _g693_doorNativeBitmapIndex_Front_D3LCR, M75_bitmapByteCount(48, 41), k0_ViewDoorOrnament_D3LCR, &g179_doorFrame_D3L); order = k0x0349_CellOrder_DoorPass2_FrontLeft_FrontRight; goto T0116017_orangeElk; case k2_ElementTypePit: @@ -1287,7 +1513,7 @@ T0116015_redEagle: order = k0x3421_CellOrder_BackLeft_BackRight_FrontLeft_FrontRight; T0116016_blueToad: /* BUG0_64 Floor ornaments are drawn over open pits. There is no check to prevent drawing floor ornaments over open pits */ - f108_drawFloorOrnament(squareAspect[k4_FloorOrnOrdAspect], k0_viewFloor_D3L); + f108_drawFloorOrnament(squareAspect[k4_FloorOrnOrdAspect], k0_viewFloor_D3L); T0116017_orangeElk: f115_cthulhu(Thing(squareAspect[k1_FirstGroupOrObjectAspect]), dir, posX, posY, k1_ViewSquare_D3L, order); } @@ -1331,8 +1557,9 @@ void DisplayMan::f117_drawSquareD3R(direction dir, int16 posX, int16 posY) { if (((Door*)_vm->_dungeonMan->_g284_thingData[k0_DoorThingType])[squareAspect[k3_DoorThingIndexAspect]].hasButton()) { warning("MISSING CODE: F0110_DUNGEONVIEW_DrawDoorButton"); } - warning("MISSING CODE: F0111_DUNGEONVIEW_DrawDoor"); - order = k0x0439_CellOrder_DoorPass2_FrontRight_FrontLeft; + f111_drawDoor(squareAspect[k3_DoorThingIndexAspect], + squareAspect[k2_DoorStateAspect], _g693_doorNativeBitmapIndex_Front_D3LCR, + M75_bitmapByteCount(48, 41), k0_ViewDoorOrnament_D3LCR, &g181_doorFrame_D3R); goto T0117018; case k2_ElementTypePit: if (!squareAspect[k2_PitInvisibleAspect]) { @@ -1750,8 +1977,17 @@ void DisplayMan::f96_loadCurrentMapGraphics() { for (int16 i = 0; i < k1_FountainOrnCount; ++i) _g268_currMapFountainOrnIndices[i] = -1; - - + { + uint16 doorSets[2]; + doorSets[0] = _vm->_dungeonMan->_g269_currMap->_doorSet0; + doorSets[1] = _vm->_dungeonMan->_g269_currMap->_doorSet1; + for (uint16 doorSet = 0; doorSet <= 1; doorSet++) { + int16 counter = k108_FirstDoorSet + (doorSets[doorSet] * k3_DoorSetGraphicsCount); + _g693_doorNativeBitmapIndex_Front_D3LCR[doorSet] = counter++; + _g694_doorNativeBitmapIndex_Front_D2LCR[doorSet] = counter++; + _g695_doorNativeBitmapIndex_Front_D1LCR[doorSet] = counter++; + } + } uint16 alcoveCount = 0; uint16 fountainCount = 0; @@ -2865,7 +3101,7 @@ continue; AL_6_bitmapRedBanana = _g74_tmpBitmap; } if (flipVertical) { - flipBitmapVertical(AL_6_bitmapRedBanana, AL_4_normalizdByteWidth, heightRedEagle); + f131_flipVertical(AL_6_bitmapRedBanana, AL_4_normalizdByteWidth, heightRedEagle); } if (flipHorizontal) { f130_flipBitmapHorizontal(AL_6_bitmapRedBanana, AL_4_normalizdByteWidth, heightRedEagle); @@ -3036,7 +3272,7 @@ then a wrong part of the bitmap is drawn on screen. To fix this bug, "+ paddingP f130_flipBitmapHorizontal(AL_6_bitmapRedBanana, byteWidth, heightRedEagle); } if (flipVertical) { - flipBitmapVertical(AL_6_bitmapRedBanana, byteWidth, heightRedEagle); + f131_flipVertical(AL_6_bitmapRedBanana, byteWidth, heightRedEagle); } f132_blitToBitmap(AL_6_bitmapRedBanana, _g296_bitmapViewport, boxByteGreen, AL_4_xPos, 0, byteWidth, k112_byteWidthViewport, k10_ColorFlesh); } diff --git a/engines/dm/gfx.h b/engines/dm/gfx.h index 5b75676c75..1db59901e4 100644 --- a/engines/dm/gfx.h +++ b/engines/dm/gfx.h @@ -46,6 +46,22 @@ namespace DM { #define k7_viewFloor_D1C 7 // @ C7_VIEW_FLOOR_D1C #define k8_viewFloor_D1R 8 // @ C8_VIEW_FLOOR_D1R +#define k0_doorState_OPEN 0 // @ C0_DOOR_STATE_OPEN +#define k1_doorState_FOURTH 1 // @ C1_DOOR_STATE_CLOSED_ONE_FOURTH +#define k2_doorState_HALF 2 // @ k2_DoorStateAspect_CLOSED_HALF +#define k3_doorState_FOURTH 3 // @ C3_DOOR_STATE_CLOSED_THREE_FOURTH +#define k4_doorState_CLOSED 4 // @ C4_DOOR_STATE_CLOSED +#define k5_doorState_DESTROYED 5 // @ C5_DOOR_STATE_DESTROYED + +#define k0_ViewDoorOrnament_D3LCR 0 // @ C0_VIEW_DOOR_ORNAMENT_D3LCR +#define k1_ViewDoorOrnament_D2LCR 1 // @ C1_VIEW_DOOR_ORNAMENT_D2LCR +#define k2_ViewDoorOrnament_D1LCR 2 // @ C2_VIEW_DOOR_ORNAMENT_D1LCR + +#define k0x0001_MaskDoorInfo_CraturesCanSeeThrough 0x0001 // @ MASK0x0001_CREATURES_CAN_SEE_THROUGH +#define k0x0002_MaskDoorInfo_ProjectilesCanPassThrough 0x0002 // @ MASK0x0002_PROJECTILES_CAN_PASS_THROUGH +#define k0x0004_MaskDoorInfo_Animated 0x0004 // @ MASK0x0004_ANIMATED + + #define k2_FloorSetGraphicCount 2 // @ C002_FLOOR_SET_GRAPHIC_COUNT #define k13_WallSetGraphicCount 13 // @ C013_WALL_SET_GRAPHIC_COUNT #define k18_StairsGraphicCount 18 // @ C018_STAIRS_GRAPHIC_COUNT @@ -418,6 +434,28 @@ public: #define k160_byteWidthScreen 160 // @ C160_BYTE_WIDTH_SCREEN #define k200_heightScreen 200 // @ C200_HEIGHT_SCREEN +class DoorFrames { +public: + Frame _closedOrDestroyed; + Frame _vertical[3]; + Frame _leftHorizontal[3]; + Frame _rightHorizontal[3]; + DoorFrames(Frame f1, Frame f2_1, Frame f2_2, Frame f2_3, + Frame f3_1, Frame f3_2, Frame f3_3, + Frame f4_1, Frame f4_2, Frame f4_3) { + _closedOrDestroyed = f1; + _vertical[0] = f2_1; + _vertical[1] = f2_2; + _vertical[2] = f2_3; + _leftHorizontal[0] = f3_1; + _leftHorizontal[1] = f3_2; + _leftHorizontal[2] = f3_3; + _rightHorizontal[0] = f4_1; + _rightHorizontal[1] = f4_2; + _rightHorizontal[2] = f4_3; + } +}; // @ DOOR_FRAMES + class DisplayMan { friend class DM::TextMan; @@ -521,6 +559,10 @@ class DisplayMan { int16 _g230_currentFloorSet;// @ G0230_i_CurrentFloorSet bool _g76_useFlippedWallAndFootprintsBitmap; // @ G0076_B_UseFlippedWallAndFootprintsBitmaps + + int16 _g693_doorNativeBitmapIndex_Front_D3LCR[2]; // @ G0693_ai_DoorNativeBitmapIndex_Front_D3LCR + int16 _g694_doorNativeBitmapIndex_Front_D2LCR[2]; // @ G0694_ai_DoorNativeBitmapIndex_Front_D2LCR + int16 _g695_doorNativeBitmapIndex_Front_D1LCR[2]; // @ G0695_ai_DoorNativeBitmapIndex_Front_D1LCR public: uint16 _screenWidth; uint16 _screenHeight; @@ -547,6 +589,7 @@ public: void f96_loadCurrentMapGraphics(); // @ F0096_DUNGEONVIEW_LoadCurrentMapGraphics_CPSDF void loadPalette(uint16 *palette); void f461_allocateFlippedWallBitmaps(); // @ F0461_START_AllocateFlippedWallBitmaps + void f102_drawDoorBitmap(Frame *frame);// @ F0102_DUNGEONVIEW_DrawDoorBitmap /// Gives the width of an IMG0 type item uint16 getPixelWidth(uint16 index); @@ -556,6 +599,9 @@ public: void f99_copyBitmapAndFlipHorizontal(byte *srcBitmap, byte *destBitmap, uint16 byteWidth, uint16 height); // @ F0099_DUNGEONVIEW_CopyBitmapAndFlipHorizontal void f108_drawFloorOrnament(uint16 floorOrnOrdinal, uint16 viewFloorIndex); // @ F0108_DUNGEONVIEW_DrawFloorOrnament + void f111_drawDoor(uint16 doorThingIndex, uint16 doorState, int16 *doorNativeBitmapIndices, int16 byteCount, + int16 viewDoorOrnIndex, DoorFrames *doorFrames); // @ F0111_DUNGEONVIEW_DrawDoor + void f109_drawDoorOrnament(int16 doorOrnOdinal, int16 viewDoorOrnIndex); // @ F0109_DUNGEONVIEW_DrawDoorOrnament /* srcHeight and destHeight are not necessary for blitting, only error checking, thus they are defaulted for existing code which @@ -572,7 +618,7 @@ public: void f129_blitToBitmapShrinkWithPalChange(byte *srcBitmap, byte *destBitmap, int16 srcPixelWidth, int16 srcHight, int16 destPixelWidth, int16 destHeight, byte *palChange); // @ F0129_VIDEO_BlitShrinkWithPaletteChanges void f130_flipBitmapHorizontal(byte *bitmap, uint16 byteWidth, uint16 height); // @ F0130_VIDEO_FlipHorizontal - void flipBitmapVertical(byte *bitmap, uint16 byteWidth, uint16 height); + void f131_flipVertical(byte *bitmap, uint16 byteWidth, uint16 height); byte *f114_getExplosionBitmap(uint16 explosionAspIndex, uint16 scale, int16 &returnByteWidth, int16 &returnHeight); // @ F0114_DUNGEONVIEW_GetExplosionBitmap void f134_fillBitmap(byte *bitmap, Color color, uint16 byteWidth, uint16 height); // @ F0134_VIDEO_FillBitmap |