DM: Add missing code to several display functions

This commit is contained in:
Bendegúz Nagy 2016-07-04 20:54:17 +02:00
parent 7fef7b8312
commit 411ad40ca4
8 changed files with 804 additions and 343 deletions

View File

@ -427,6 +427,28 @@ void ChampionMan::f301_addObjectInSlot(ChampionIndex champIndex, Thing thing, Ch
champ->setAttributeFlag(k0x4000_ChampionAttributeViewport, true);
}
int16 ChampionMan::f315_getScentOrdinal(int16 mapX, int16 mapY) {
uint16 searchedScentRedEagle;
int16 scentIndex;
Scent* scent;
Scent searchedScent;
if (scentIndex = _g407_party._scentCount) {
searchedScent.setMapX(mapX);
searchedScent.setMapY(mapY);
searchedScent.setMapIndex(_vm->_dungeonMan->_g272_currMapIndex);
searchedScentRedEagle = searchedScent.toUint16();
scent = &_g407_party._scents[scentIndex--];
do {
if ((*(--scent)).toUint16() == searchedScentRedEagle) {
return _vm->M0_indexToOrdinal(scentIndex);
}
} while (scentIndex--);
}
return 0;
}
ChampionIndex ChampionMan::f285_getIndexInCell(ViewCell cell) {
for (uint16 i = 0; i < _g305_partyChampionCount; ++i) {
if ((_gK71_champions[i]._cell == cell) && _gK71_champions[i]._currHealth)

View File

@ -55,6 +55,8 @@ public:
void setMapX(uint16 val) { _scent = (_scent & ~0x1F) & (val & 0x1F); }
void setMapY(uint16 val) { _scent = (_scent & ~(0x1F << 5)) & (val & 0x1F); }
void setMapIndex(uint16 val) { _scent = (_scent & ~(0x1F << 10)) & (val & 0x3F); }
uint16 toUint16() { return _scent; }
}; // @ SCENT
class Party {
@ -466,6 +468,8 @@ public:
bool f295_hasObjectIconInSlotBoxChanged(int16 slotBoxIndex, Thing thing); // @ F0295_CHAMPION_HasObjectIconInSlotBoxChanged
void f296_drawChangedObjectIcons(); // @ F0296_CHAMPION_DrawChangedObjectIcons
void f301_addObjectInSlot(ChampionIndex champIndex, Thing thing, ChampionSlot slotIndex); // @ F0301_CHAMPION_AddObjectInSlot
int16 f315_getScentOrdinal(int16 mapX, int16 mapY); // @ F0315_CHAMPION_GetScentOrdinal
};

View File

@ -88,6 +88,10 @@ uint16 M75_bitmapByteCount(uint16 pixelWidth, uint16 height) {
return pixelWidth / 2 * height;
}
uint16 M21_normalizeModulo4(uint16 val) {
return val & 3;
}
DMEngine::DMEngine(OSystem *syst) : Engine(syst), _console(nullptr) {
// Do not load data files
// Do not initialize graphics here

View File

@ -70,6 +70,7 @@ 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
uint16 M21_normalizeModulo4(uint16 val); // @ M21_NORMALIZE
enum ThingType {

View File

@ -30,6 +30,7 @@
#include "dungeonman.h"
#include "timeline.h"
#include "champion.h"
@ -512,7 +513,7 @@ byte g236_AdditionalThingCounts[16] = { // @ G0236_auc_Graphic559_AdditionalThin
0, /* Unused */
60, /* Projectile */
50 /* Explosion */
};
};
// this is the number of uint16s the data has to be stored, not the length of the data in dungeon.dat!
byte g235_ThingDataWordCount[16] = { // @ G0235_auc_Graphic559_ThingDataByteCount
@ -532,7 +533,7 @@ byte g235_ThingDataWordCount[16] = { // @ G0235_auc_Graphic559_ThingDataByteCoun
0, /* Unused */
5, /* Projectile */
2 /* Explosion */
};
};
const Thing Thing::_none(0); // @ C0xFFFF_THING_NONE
const Thing Thing::_endOfList(0xFFFE); // @ C0xFFFE_THING_ENDOFLIST
@ -826,140 +827,154 @@ Thing DungeonMan::f161_getSquareFirstThing(int16 mapX, int16 mapY) {
}
// TODO: get rid of the GOTOs
// TODO: produce more GOTOs
void DungeonMan::f172_setSquareAspect(uint16 *aspectArray, direction dir, int16 mapX, int16 mapY) { // complete, except where marked
_vm->_displayMan->_g289_championPortraitOrdinal = 0; // BUG0_75, possible fix
#define thingType dir
byte L0307_uc_Multiple;
#define square L0307_uc_Multiple
#define footprintsAllowed L0307_uc_Multiple
#define scentOrdinal L0307_uc_Multiple
Sensor* sensor;
bool leftRandWallOrnAllowed;
int16 L0310_i_Multiple;
#define frontRandWallOrnAllowed L0310_i_Multiple
#define sideIndex L0310_i_Multiple
bool rightRandWallOrnAllowed;
int16 thingTypeRedEagle;
bool squreIsFakeWall;
Thing thing;
for (uint16 i = 0; i < 5; ++i)
aspectArray[i] = 0;
Thing thing = f161_getSquareFirstThing(mapX, mapY);
Square square = f151_getSquare(mapX, mapY);
aspectArray[k0_ElemAspect] = square.getType();
bool leftOrnAllowed = false;
bool rightOrnAllowed = false;
bool frontOrnAllowed = false;
bool squareIsFakeWall = false;
bool footPrintsAllowed = false;
switch (square.getType()) {
case k0_WallElemType:
thing = _vm->_dungeonMan->f161_getSquareFirstThing(mapX, mapY);
square = _vm->_dungeonMan->f151_getSquare(mapX, mapY).toByte();
switch (aspectArray[k0_ElemAspect] = Square(square).getType()) {
case k0_ElementTypeWall:
switch (dir) {
case kDirNorth:
leftOrnAllowed = square.get(k0x0004_WallEastRandOrnAllowed);
frontOrnAllowed = square.get(k0x0002_WallSouthRandOrnAllowed);
rightOrnAllowed = square.get(k0x0001_WallWestRandOrnAllowed);
leftRandWallOrnAllowed = getFlag(square, k0x0004_WallEastRandOrnAllowed);
frontRandWallOrnAllowed = getFlag(square, k0x0002_WallSouthRandOrnAllowed);
rightRandWallOrnAllowed = getFlag(square, k0x0001_WallWestRandOrnAllowed);
break;
case kDirEast:
leftOrnAllowed = square.get(k0x0002_WallSouthRandOrnAllowed);
frontOrnAllowed = square.get(k0x0001_WallWestRandOrnAllowed);
rightOrnAllowed = square.get(k0x0008_WallNorthRandOrnAllowed);
leftRandWallOrnAllowed = getFlag(square, k0x0002_WallSouthRandOrnAllowed);
frontRandWallOrnAllowed = getFlag(square, k0x0001_WallWestRandOrnAllowed);
rightRandWallOrnAllowed = getFlag(square, k0x0008_WallNorthRandOrnAllowed);
break;
case kDirSouth:
leftOrnAllowed = square.get(k0x0001_WallWestRandOrnAllowed);
frontOrnAllowed = square.get(k0x0008_WallNorthRandOrnAllowed);
rightOrnAllowed = square.get(k0x0004_WallEastRandOrnAllowed);
leftRandWallOrnAllowed = getFlag(square, k0x0001_WallWestRandOrnAllowed);
frontRandWallOrnAllowed = getFlag(square, k0x0008_WallNorthRandOrnAllowed);
rightRandWallOrnAllowed = getFlag(square, k0x0004_WallEastRandOrnAllowed);
break;
case kDirWest:
leftOrnAllowed = square.get(k0x0008_WallNorthRandOrnAllowed);
frontOrnAllowed = square.get(k0x0004_WallEastRandOrnAllowed);
rightOrnAllowed = square.get(k0x0002_WallSouthRandOrnAllowed);
break;
default:
break;
leftRandWallOrnAllowed = getFlag(square, k0x0008_WallNorthRandOrnAllowed);
frontRandWallOrnAllowed = getFlag(square, k0x0004_WallEastRandOrnAllowed);
rightRandWallOrnAllowed = getFlag(square, k0x0002_WallSouthRandOrnAllowed);
}
/* BUG0_75 Multiple champion portraits are drawn (one at a time) then the game crashes. This variable is only
reset to 0 when at least one square in the dungeon view is a wall. If the party is in front of a wall with a
champion portrait and the next time the dungeon view is drawn there is no wall square in the view and the
square in front of the party is a fake wall with a random ornament then the same champion portrait will be
drawn again because the variable was not reset to 0. Each time _vm->_displayMan->f107_isDrawnWallOrnAnAlcove
draws the portrait, _vm->_displayMan->_g289_championPortraitOrdinal is decremented so that the portait is
different each time the dungeon view is drawn until the game crashes */
_vm->_displayMan->_g289_championPortraitOrdinal = 0;
squreIsFakeWall = false;
T0172010_ClosedFakeWall:
f171_setSquareAspectOrnOrdinals(aspectArray, leftOrnAllowed, frontOrnAllowed, rightOrnAllowed, dir, mapX, mapY, squareIsFakeWall);
while ((thing != Thing::_endOfList) && (thing.getType() <= k3_SensorThingType)) {
int16 sideIndex = (thing.getCell() - dir) & 3;
if (sideIndex) {
if (thing.getType() == k2_TextstringType) {
if (TextString(f156_getThingData(thing)).isVisible()) {
aspectArray[sideIndex + 1] = _g265_currMapInscriptionWallOrnIndex + 1;
_vm->_displayMan->_g290_inscriptionThing = thing; // BUG0_76
_vm->_dungeonMan->f171_setSquareAspectOrnOrdinals(aspectArray,
leftRandWallOrnAllowed, frontRandWallOrnAllowed, rightRandWallOrnAllowed, dir, mapX, mapY, squreIsFakeWall);
while ((thing != Thing::_endOfList) && ((thingTypeRedEagle = thing.getType()) <= k3_SensorThingType)) {
if (sideIndex = M21_normalizeModulo4(thing.getCell() - dir)) { /* Invisible on the back wall if 0 */
sensor = (Sensor*)_vm->_dungeonMan->f156_getThingData(thing);
if (thingTypeRedEagle == k2_TextstringType) {
if (((TextString*)sensor)->isVisible()) {
aspectArray[sideIndex + 1] = _vm->_dungeonMan->_g265_currMapInscriptionWallOrnIndex + 1;
/* BUG0_76 The same text is drawn on multiple sides of a wall square. The engine stores only a
single text to draw on a wall in a global variable. Even if different texts are placed on
differents sides of the wall, the same text is drawn on each affected side */
_vm->_displayMan->_g290_inscriptionThing = thing;
}
} else {
Sensor sensor(f156_getThingData(thing));
aspectArray[sideIndex + 1] = sensor.getOrnOrdinal();
if (sensor.getType() == k127_SensorWallChampionPortrait) {
_vm->_displayMan->_g289_championPortraitOrdinal = _vm->M0_indexToOrdinal(sensor.getData());
aspectArray[sideIndex + 1] = sensor->getOrnOrdinal();
if (sensor->getType() == k127_SensorWallChampionPortrait) {
_vm->_displayMan->_g289_championPortraitOrdinal = _vm->M0_indexToOrdinal(sensor->getData());
}
}
}
thing = f159_getNextThing(thing);
thing = _vm->_dungeonMan->f159_getNextThing(thing);
}
if (squareIsFakeWall && (_g306_partyMapX != mapX) && (_g307_partyMapY != mapY)) {
if (squreIsFakeWall && (_vm->_dungeonMan->_g306_partyMapX != mapX) && (_vm->_dungeonMan->_g307_partyMapY != mapY)) {
aspectArray[k1_FirstGroupOrObjectAspect] = Thing::_endOfList.toUint16();
return;
}
break;
case k2_PitElemType:
if (square.get(k0x0008_PitOpen)) {
aspectArray[k2_PitInvisibleAspect] = square.get(k0x0004_PitInvisible);
footPrintsAllowed = square.toByte() & 1;
case k2_ElementTypePit:
if (getFlag(square, k0x0008_PitOpen)) {
aspectArray[k2_PitInvisibleAspect] = getFlag(square, k0x0004_PitInvisible);
footprintsAllowed &= 0x0001;
} else {
aspectArray[k0_ElemAspect] = k1_CorridorElemType;
footPrintsAllowed = true;
footprintsAllowed = true;
}
goto T0172030_Pit;
case k6_FakeWallElemType:
if (!square.get(k0x0004_FakeWallOpen)) {
aspectArray[k0_ElemAspect] = k0_WallElemType;
leftOrnAllowed = rightOrnAllowed = frontOrnAllowed = square.get(k0x0008_FakeWallRandOrnOrFootPAllowed);
squareIsFakeWall = true;
case k6_ElementTypeFakeWall:
if (!getFlag(square, k0x0004_FakeWallOpen)) {
aspectArray[k0_ElemAspect] = k0_ElementTypeWall;
leftRandWallOrnAllowed = rightRandWallOrnAllowed = frontRandWallOrnAllowed = getFlag(square, k0x0008_FakeWallRandOrnOrFootPAllowed);
squreIsFakeWall = true;
goto T0172010_ClosedFakeWall;
}
aspectArray[k0_WallElemType] = k1_CorridorElemType;
footPrintsAllowed = square.get(k0x0008_FakeWallRandOrnOrFootPAllowed);
square = Square(footPrintsAllowed ? 8 : 0);
// intentional fallthrough
aspectArray[k0_ElemAspect] = k1_CorridorElemType;
footprintsAllowed = getFlag(square, k0x0008_FakeWallRandOrnOrFootPAllowed) ? 8 : 0;
case k1_CorridorElemType:
aspectArray[k4_FloorOrnOrdAspect] = f170_getRandomOrnOrdinal(square.get(k0x0008_CorridorRandOrnAllowed), _g269_currMap->_randFloorOrnCount, mapX, mapY, 30);
aspectArray[k4_FloorOrnOrdAspect] = _vm->_dungeonMan->f170_getRandomOrnOrdinal(getFlag(square, k0x0008_CorridorRandOrnAllowed),
_vm->_dungeonMan->_g269_currMap->_randFloorOrnCount, mapX, mapY, 30);
T0172029_Teleporter:
footPrintsAllowed = true;
footprintsAllowed = true;
T0172030_Pit:
while ((thing != Thing::_endOfList) && (thing.getType() <= k3_SensorThingType)) {
if (thing.getType() == k3_SensorThingType)
aspectArray[k4_FloorOrnOrdAspect] = Sensor(f156_getThingData(thing)).getOrnOrdinal();
thing = f159_getNextThing(thing);
while ((thing != Thing::_endOfList) && ((thingType = (direction)thing.getType()) <= k3_SensorThingType)) {
if (thingType == k3_SensorThingType) {
sensor = (Sensor*)_vm->_dungeonMan->f156_getThingData(thing);
aspectArray[k4_FloorOrnOrdAspect] = sensor->getOrnOrdinal();
}
thing = _vm->_dungeonMan->f159_getNextThing(thing);
}
goto T0172049_Footprints;
case k5_TeleporterElemType:
aspectArray[k2_TeleporterVisibleAspect] = square.get(k0x0008_TeleporterOpen) && square.get(k0x0004_TeleporterVisible);
case k5_ElementTypeTeleporter:
aspectArray[k2_TeleporterVisibleAspect] = getFlag(square, k0x0008_TeleporterOpen) && getFlag(square, k0x0004_TeleporterVisible);
goto T0172029_Teleporter;
case k3_StairsElemType:
aspectArray[k0_ElemAspect] = ((square.get(k0x0008_StairsNorthSouthOrient) >> 3) == (isOrientedWestEast(dir) ? 1 : 0)) ? k18_StairsSideElemType : k19_StairsFrontElemType;
aspectArray[k2_StairsUpAspect] = square.get(k0x0004_StairsUp);
footPrintsAllowed = false;
case k3_ElementTypeStairs:
aspectArray[k0_ElemAspect] = ((getFlag(square, k0x0008_StairsNorthSouthOrient) >> 3) == isOrientedWestEast(dir)) ? k18_ElementTypeStairsSide : k19_ElementTypeStaisFront;
aspectArray[k2_StairsUpAspect] = getFlag(square, k0x0004_StairsUp);
footprintsAllowed = false;
goto T0172046_Stairs;
case k4_DoorElemType:
if ((square.get(k0x0008_DoorNorthSouthOrient) >> 3) == (isOrientedWestEast(dir) ? 1 : 0)) {
if ((getFlag(square, k0x0008_DoorNorthSouthOrient) >> 3) == isOrientedWestEast(dir)) {
aspectArray[k0_ElemAspect] = k16_DoorSideElemType;
} else {
aspectArray[k0_ElemAspect] = k17_DoorFrontElemType;
aspectArray[k2_DoorStateAspect] = square.getDoorState();
aspectArray[k3_DoorThingIndexAspect] = f161_getSquareFirstThing(mapX, mapY).getIndex();
aspectArray[k2_DoorStateAspect] = Square(square).getDoorState();
aspectArray[k3_DoorThingIndexAspect] = _vm->_dungeonMan->f161_getSquareFirstThing(mapX, mapY).getIndex();
}
footPrintsAllowed = true;
footprintsAllowed = true;
T0172046_Stairs:
while ((thing != Thing::_endOfList) && (thing.getType() <= k3_SensorThingType))
thing = f159_getNextThing(thing);
while ((thing != Thing::_endOfList) && (thing.getType() <= k3_SensorThingType)) {
thing = _vm->_dungeonMan->f159_getNextThing(thing);
}
T0172049_Footprints:
unsigned char scentOrdinal; // see next line comment
if (footPrintsAllowed) // TODO: I skipped some party query code, must come back later and complete
aspectArray[k4_FloorOrnOrdAspect] &= k0x8000_FootprintsAspect;
break;
default:
break;
if (footprintsAllowed && (scentOrdinal = _vm->_championMan->f315_getScentOrdinal(mapX, mapY))
&& (--scentOrdinal >= _vm->_championMan->_g407_party._firstScentIndex)
&& (scentOrdinal < _vm->_championMan->_g407_party._lastScentIndex)) {
setFlag(aspectArray[k4_FloorOrnOrdAspect], k0x8000_FootprintsAspect);
}
}
aspectArray[k1_FirstGroupOrObjectAspect] = thing.toUint16();
}
void DungeonMan::f171_setSquareAspectOrnOrdinals(uint16 *aspectArray, bool leftAllowed, bool frontAllowed, bool rightAllowed, direction dir,
int16 mapX, int16 mapY, bool isFakeWall) {
int16 mapX, int16 mapY, bool isFakeWall) {
int16 ornCount = _g269_currMap->_randWallOrnCount;
turnDirRight(dir);
@ -1336,4 +1351,34 @@ int16 DungeonMan::f142_getProjectileAspect(Thing thing) {
return g237_ObjectInfo[f141_getObjectInfoIndex(thing)]._objectAspectIndex;
}
int16 DungeonMan::f154_getLocationAfterLevelChange(int16 mapIndex, int16 levelDelta, int16* mapX, int16* mapY) {
int16 newMapX;
int16 newMapY;
int16 newLevel;
int16 offset;
Map* map;
int16 targetMapIndex;
if (_vm->_dungeonMan->_g309_partyMapIndex == k255_mapIndexEntrance) {
return kM1_mapIndexNone;
}
map = _vm->_dungeonMan->_g277_dungeonMaps + mapIndex;
newMapX = map->_offsetMapX + *mapX;
newMapY = map->_offsetMapY + *mapY;
newLevel = map->_level + levelDelta;
map = _vm->_dungeonMan->_g277_dungeonMaps;
for (targetMapIndex = 0; targetMapIndex < _vm->_dungeonMan->_g278_dungeonFileHeader._mapCount; targetMapIndex++) {
if ((map->_level == newLevel)
&& (newMapX >= (offset = map->_offsetMapX))
&& (newMapX <= (offset + map->_width))
&& (newMapY >= (offset = map->_offsetMapY)) && (newMapY <= (offset + map->_height))) {
*mapY = newMapY - offset;
*mapX = newMapX - map->_offsetMapX;
return targetMapIndex;
}
map++;
}
return kM1_mapIndexNone;
}
}

View File

@ -648,6 +648,7 @@ public:
void f163_linkThingToList(Thing thingToLink, Thing thingInList, int16 mapX, int16 mapY); // @ F0163_DUNGEON_LinkThingToList
WeaponInfo *f158_getWeaponInfo(Thing thing); // @ F0158_DUNGEON_GetWeaponInfo
int16 f142_getProjectileAspect(Thing thing); // @ F0142_DUNGEON_GetProjectileAspect
int16 f154_getLocationAfterLevelChange(int16 mapIndex, int16 levelDelta, int16 *mapX, int16 *mapY); // @ F0154_DUNGEON_GetLocationAfterLevelChange
uint32 _rawDunFileDataSize; // @ probably NONE
byte *_rawDunFileData; // @ ???

File diff suppressed because it is too large Load Diff

View File

@ -57,6 +57,11 @@ namespace DM {
#define k1_ViewDoorOrnament_D2LCR 1 // @ C1_VIEW_DOOR_ORNAMENT_D2LCR
#define k2_ViewDoorOrnament_D1LCR 2 // @ C2_VIEW_DOOR_ORNAMENT_D1LCR
#define k0_viewDoorButton_D3R 0 // @ C0_VIEW_DOOR_BUTTON_D3R
#define k1_viewDoorButton_D3C 1 // @ C1_VIEW_DOOR_BUTTON_D3C
#define k2_viewDoorButton_D2C 2 // @ C2_VIEW_DOOR_BUTTON_D2C
#define k3_viewDoorButton_D1C 3 // @ C3_VIEW_DOOR_BUTTON_D1C
#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
@ -222,6 +227,7 @@ enum GraphicIndice {
k38_BorderPartyFireshieldIndice = 38, // @ C038_GRAPHIC_BORDER_PARTY_FIRESHIELD
k39_BorderPartySpellshieldIndice = 39, // @ C039_GRAPHIC_BORDER_PARTY_SPELLSHIELD
k40_PanelResurectReincaranteIndice = 40, // @ C040_GRAPHIC_PANEL_RESURRECT_REINCARNATE
k41_holeInWall_GraphicIndice = 41, // @ C041_GRAPHIC_HOLE_IN_WALL
k42_ObjectIcons_000_TO_031 = 42, // @ C042_GRAPHIC_OBJECT_ICONS_000_TO_031
k43_ObjectIcons_032_TO_063 = 43, // @ C043_GRAPHIC_OBJECT_ICONS_032_TO_063
k44_ObjectIcons_064_TO_095 = 44, // @ C044_GRAPHIC_OBJECT_ICONS_064_TO_095
@ -237,11 +243,24 @@ enum GraphicIndice {
k54_FloorPit_D1C_GraphicIndice = 54, // @ C054_GRAPHIC_FLOOR_PIT_D1C
k55_FloorPit_D0L_GraphicIndice = 55, // @ C055_GRAPHIC_FLOOR_PIT_D0L
k56_FloorPit_D0C_GraphicIndice = 56, // @ C056_GRAPHIC_FLOOR_PIT_D0C
k57_FloorPir_Invisible_D2L_GraphicIndice = 57, // @ C057_GRAPHIC_FLOOR_PIT_INVISIBLE_D2L
k58_FloorPit_invisible_D2C_GraphicIndice = 58, // @ C058_GRAPHIC_FLOOR_PIT_INVISIBLE_D2C
k59_floorPit_invisible_D1L_GraphicIndice = 59, // @ C059_GRAPHIC_FLOOR_PIT_INVISIBLE_D1L
k60_floorPitInvisibleD1C_GraphicIndice = 60, // @ C060_GRAPHIC_FLOOR_PIT_INVISIBLE_D1C
k61_floorPitInvisibleD0L_GraphicIndice = 61, // @ C061_GRAPHIC_FLOOR_PIT_INVISIBLE_D0L
k62_flootPitInvisibleD0C_graphicIndice = 62, // @ C062_GRAPHIC_FLOOR_PIT_INVISIBLE_D0C
k63_ceilingPit_D2L_GraphicIndice = 63, // @ C063_GRAPHIC_CEILING_PIT_D2L
k64_ceilingPitD2C_GraphicIndice = 64, // @ C064_GRAPHIC_CEILING_PIT_D2C
k65_ceilingPitD1L_GraphicIndice = 65, // @ C065_GRAPHIC_CEILING_PIT_D1L
k66_ceilingPitD1C_GraphicIndice = 66, // @ C066_GRAPHIC_CEILING_PIT_D1C
k67_ceilingPitD0L_grahicIndice = 67, // @ C067_GRAPHIC_CEILING_PIT_D0L
k68_ceilingPitD0C_graphicIndice = 68, // @ C068_GRAPHIC_CEILING_PIT_D0C
k69_FieldMask_D3R_GraphicIndice = 69, // @ C069_GRAPHIC_FIELD_MASK_D3R
k73_FieldTeleporterGraphicIndice = 73, // @ C073_GRAPHIC_FIELD_TELEPORTER
k120_InscriptionFontIndice = 120, // @ C120_GRAPHIC_INSCRIPTION_FONT
k241_FloorOrn_15_D3L_footprints = 241, // @ C241_GRAPHIC_FLOOR_ORNAMENT_15_D3L_FOOTPRINTS
k301_DoorMaskDestroyedIndice = 301, // @ C301_GRAPHIC_DOOR_MASK_DESTROYED
k315_firstDoorButton_GraphicIndice = 315, // @ C315_GRAPHIC_FIRST_DOOR_BUTTON
k316_FirstProjectileGraphicIndice = 316, // @ C316_GRAPHIC_FIRST_PROJECTILE
k348_FirstExplosionGraphicIndice = 348, // @ C348_GRAPHIC_FIRST_EXPLOSION
k351_FirstExplosionPatternGraphicIndice = 351, // @ C351_GRAPHIC_FIRST_EXPLOSION_PATTERN
@ -590,6 +609,8 @@ public:
void loadPalette(uint16 *palette);
void f461_allocateFlippedWallBitmaps(); // @ F0461_START_AllocateFlippedWallBitmaps
void f102_drawDoorBitmap(Frame *frame);// @ F0102_DUNGEONVIEW_DrawDoorBitmap
void f103_drawDoorFrameBitmapFlippedHorizontally(byte *bitmap, Frame *frame); // @ F0103_DUNGEONVIEW_DrawDoorFrameBitmapFlippedHorizontally
void f110_drawDoorButton(int16 doorButtonOrdinal, int16 viewDoorButtonIndex); // @ F0110_DUNGEONVIEW_DrawDoorButton
/// Gives the width of an IMG0 type item
uint16 getPixelWidth(uint16 index);
@ -602,6 +623,8 @@ public:
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
void f112_drawCeilingPit(int16 nativeBitmapIndex, Frame *frame, int16 mapX, int16 mapY, bool flipHorizontal); // @ F0112_DUNGEONVIEW_DrawCeilingPit
/* srcHeight and destHeight are not necessary for blitting, only error checking, thus they are defaulted for existing code which