aboutsummaryrefslogtreecommitdiff
path: root/engines/dm
diff options
context:
space:
mode:
authorBendegúz Nagy2016-06-21 17:45:10 +0200
committerBendegúz Nagy2016-08-26 23:02:22 +0200
commitc986a71beabb7ba8f54a79f3b20735ab6a83e7e0 (patch)
tree755238fbda6e1c9e7f5b1664830f940432258bfd /engines/dm
parent2c669d4119c2e218010c7d1d2eca0b81be58a99b (diff)
downloadscummvm-rg350-c986a71beabb7ba8f54a79f3b20735ab6a83e7e0.tar.gz
scummvm-rg350-c986a71beabb7ba8f54a79f3b20735ab6a83e7e0.tar.bz2
scummvm-rg350-c986a71beabb7ba8f54a79f3b20735ab6a83e7e0.zip
DM: Add F0292_CHAMPION_DrawState, G0407_s_Party, M26_CHAMPION_ICON_INDEX, several graphic indices, fix missing kPanelResurectReincaranteIndice value
Diffstat (limited to 'engines/dm')
-rw-r--r--engines/dm/champion.cpp166
-rw-r--r--engines/dm/champion.h3
-rw-r--r--engines/dm/dm.h1
-rw-r--r--engines/dm/gfx.h15
4 files changed, 180 insertions, 5 deletions
diff --git a/engines/dm/champion.cpp b/engines/dm/champion.cpp
index 3dfc2e3b84..ca5c6acc83 100644
--- a/engines/dm/champion.cpp
+++ b/engines/dm/champion.cpp
@@ -364,4 +364,168 @@ uint16 ChampionMan::getMaximumLoad(Champion *champ) {
return maximumLoad;
}
-} \ No newline at end of file
+void ChampionMan::drawChampionState(ChampionIndex champIndex) {
+ InventoryMan &invMan = *_vm->_inventoryMan;
+ DisplayMan &dispMan = *_vm->_displayMan;
+ MenuMan &menuMan = *_vm->_menuMan;
+ EventManager &eventMan = *_vm->_eventMan;
+
+ Box box;
+ int16 champStatusBoxX = champIndex * kChampionStatusBoxSpacing;
+ Champion *champ = &_champions[champIndex];
+ uint16 champAttributes = champ->getAttributes();
+ if (!((champAttributes) & (kChampionAttributeNameTitle | kChampionAttributeStatistics | kChampionAttributeLoad | kChampionAttributeIcon |
+ kChampionAttributePanel | kChampionAttributeStatusBox | kChampionAttributeWounds | kChampionAttributeViewport |
+ kChampionAttributeActionHand))) {
+ return;
+ }
+ bool isInventoryChamp = (indexToOrdinal(champIndex) == invMan._inventoryChampionOrdinal);
+ dispMan._useByteBoxCoordinates = false;
+ if (champAttributes & kChampionAttributeStatusBox) {
+ box._y1 = 0;
+ box._y2 = 28;
+ box._x1 = champStatusBoxX;
+ box._x2 = box._x1 + 66;
+ if (champ->_currHealth) {
+ dispMan.clearScreenBox(kColorDarkestGray, box);
+ int16 nativeBitmapIndices[3];
+ for (int16 i = 0; i < 3; ++i)
+ nativeBitmapIndices[i] = 0;
+ int16 AL_0_borderCount = 0;
+ if (_party._fireShieldDefense > 0)
+ nativeBitmapIndices[AL_0_borderCount++] = kBorderPartyFireshieldIndice;
+ if (_party._spellShieldDefense > 0)
+ nativeBitmapIndices[AL_0_borderCount++] = kBorderPartySpellshieldIndice;
+ if (_party._shieldDefense > 0)
+ nativeBitmapIndices[AL_0_borderCount++] = kBorderPartyShieldIndice;
+ while (AL_0_borderCount--) {
+ dispMan.blitToScreen(dispMan.getBitmap(nativeBitmapIndices[AL_0_borderCount]), 80, 0, 0, box, kColorFlesh);
+ }
+ if (isInventoryChamp) {
+ invMan.drawStatusBoxPortrait(champIndex);
+ champAttributes |= kChampionAttributeStatistics;
+ } else {
+ champAttributes |= (kChampionAttributeNameTitle | kChampionAttributeStatistics | kChampionAttributeWounds | kChampionAttributeActionHand);
+ }
+ } else {
+ dispMan.blitToScreen(dispMan.getBitmap(kStatusBoxDeadChampion), 80, 0, 0, box, kColorNoTransparency);
+ warning("MISSING CODE: F0053_TEXT_PrintToLogicalScreen");
+ menuMan.drawActionIcon(champIndex);
+ goto T0292042_green;
+ }
+ }
+
+ if (!champ->_currHealth)
+ goto T0292042_green;
+
+ if(champAttributes & kChampionAttributeNameTitle) {
+ int16 AL_0_colorIndex = (champIndex == _leaderIndex) ? kColorGold : kColorLightestGray; // unused because of missing functions
+ if(isInventoryChamp) {
+ char *champName = champ->_name;
+ warning("MISSING CODE: F0052_TEXT_PrintToViewport");
+ int16 champTitleX = 6 * strlen(champName) + 3;
+ char champTitleFirstChar = champ->_title[0];
+ if ((champTitleFirstChar != ',') && (champTitleFirstChar != ';') && (champTitleFirstChar != '-')) {
+ champTitleX += 6;
+ }
+ warning("MISSING CODE: F0052_TEXT_PrintToViewport");
+ champAttributes |= kChampionAttributeViewport;
+ } else {
+ box._y1 = 0;
+ box._y2 = 6;
+ box._x1 = champStatusBoxX;
+ box._x2 = box._x1 + 42;
+ dispMan.clearScreenBox(kColorDarkGary, box);
+ warning("MISSING CODE: F0053_TEXT_PrintToLogicalScreen");
+ }
+ }
+
+ if (champAttributes & kChampionAttributeStatistics) {
+ drawChampionBarGraphs(champIndex);
+ if (isInventoryChamp) {
+ warning("MISSING CODE: F0290_CHAMPION_DrawHealthStaminaManaValues");
+ int16 AL_2_nativeBitmapIndex;
+ if ((champ->_food < 0) || (champ->_water < 0) || (champ->_poisonEventCount)) {
+ AL_2_nativeBitmapIndex = kSlotBoxWoundedIndice;
+ } else {
+ AL_2_nativeBitmapIndex = kSlotBoxNormalIndice;
+ }
+ dispMan.blitToScreen(dispMan.getBitmap(AL_2_nativeBitmapIndex), 32, 0, 0, gBoxMouth, kColorDarkestGray, gDungeonViewport);
+ AL_2_nativeBitmapIndex = kSlotBoxNormalIndice;
+ for (int16 AL_0_statisticIndex = kChampionStatStrength; AL_0_statisticIndex <= kChampionStatAntifire; AL_0_statisticIndex++) {
+ if (champ->getStatistic((ChampionStatisticType)AL_0_statisticIndex, kChampionStatCurrent)
+ < champ->getStatistic((ChampionStatisticType)AL_0_statisticIndex, kChampionStatMaximum)) {
+ AL_2_nativeBitmapIndex = kSlotBoxWoundedIndice;
+ break;
+ }
+ }
+ dispMan.blitToScreen(dispMan.getBitmap(AL_2_nativeBitmapIndex), 32, 0, 0, gBoxEye, kColorDarkestGray, gDungeonViewport);
+ champAttributes |= kChampionAttributeViewport;
+ }
+ }
+
+ if (champAttributes & kChampionAttributeWounds) {
+ for (int16 AL_0_slotIndex = isInventoryChamp ? kChampionSlotFeet : kChampionSlotActionHand; AL_0_slotIndex >= kChampionSlotReadyHand; AL_0_slotIndex--) {
+ warning("MISSING CODE: F0291_CHAMPION_DrawSlot");
+ }
+ if (isInventoryChamp) {
+ champAttributes |= kChampionAttributeViewport;
+ }
+ }
+
+ if (champAttributes & kChampionAttributeLoad) {
+ warning("MISSING CODE: whole if branch, many F0052_TEXT_PrintToViewport-s");
+
+
+
+ champAttributes |= kChampionAttributeViewport;
+ }
+
+ { // block so goto won't skip AL_0_championIconIndex initialization
+ int16 AL_0_championIconIndex = championIconIndex(champ->_cell, _vm->_dungeonMan->_currMap._partyDir);
+
+ if ((champAttributes & kChampionIcons) && (eventMan._useChampionIconOrdinalAsMousePointerBitmap != indexToOrdinal(AL_0_championIconIndex))) {
+ dispMan.clearScreenBox(gChampionColor[champIndex], gBoxChampionIcons[AL_0_championIconIndex]);
+ dispMan.blitToScreen(dispMan.getBitmap(kChampionIcons), 80, championIconIndex(champ->_dir, _vm->_dungeonMan->_currMap._partyDir) * 19, 0,
+ gBoxChampionIcons[AL_0_championIconIndex], kColorDarkestGray);
+ }
+ }
+
+ if ((champAttributes & kChampionAttributePanel) && isInventoryChamp) {
+ if (_vm->_pressingMouth) {
+ invMan.drawPanelFoodWaterPoisoned();
+ } else if (_vm->_pressingEye) {
+ if (_leaderEmptyHanded) {
+ warning("MISSING CODE: F0351_INVENTORY_DrawChampionSkillsAndStatistics");
+ }
+ } else {
+ invMan.drawPanel();
+ }
+ champAttributes |= kChampionAttributeViewport;
+ }
+
+ if (champAttributes & kChampionAttributeActionHand) {
+ warning("MISSING CODE: F0291_CHAMPION_DrawSlot");
+ menuMan.drawActionIcon(champIndex);
+ if (isInventoryChamp) {
+ champAttributes |= kChampionAttributeViewport;
+ }
+ }
+
+ if (champAttributes & kChampionAttributeViewport) {
+ warning("MISSGIN CODE: F0097_DUNGEONVIEW_DrawViewport");
+ }
+
+
+T0292042_green:
+ champ->setAttributeFlag((ChampionAttribute)(kChampionAttributeNameTitle | kChampionAttributeStatistics | kChampionAttributeLoad | kChampionAttributeIcon |
+ kChampionAttributePanel | kChampionAttributeStatusBox | kChampionAttributeWounds | kChampionAttributeViewport |
+ kChampionAttributeActionHand), false);
+ warning("MISSING CODE: F0078_MOUSE_ShowPointer");
+}
+
+ uint16 ChampionMan::championIconIndex(int16 val, direction dir)
+ {
+ return ((val + 4 - dir) & 0x3);
+ }
+}
diff --git a/engines/dm/champion.h b/engines/dm/champion.h
index db554120f2..f8ea79c82f 100644
--- a/engines/dm/champion.h
+++ b/engines/dm/champion.h
@@ -401,6 +401,7 @@ public:
uint16 _actingChampionOrdinal; // @ G0506_ui_ActingChampionOrdinal
IconIndice _leaderHandObjectIconIndex; // @ G0413_i_LeaderHandObjectIconIndex
bool _leaderEmptyHanded; // @ G0415_B_LeaderEmptyHanded
+ Party _party; // @ G0407_s_Party
ChampionMan(DMEngine *vm);
void resetDataToStartGame(); // @ F0278_CHAMPION_ResetDataToStartGame
@@ -408,6 +409,8 @@ public:
void drawChampionBarGraphs(ChampionIndex champIndex); // @ F0287_CHAMPION_DrawBarGraphs
uint16 getStaminaAdjustedValue(Champion *champ, int16 val); // @ F0306_CHAMPION_GetStaminaAdjustedValue
uint16 getMaximumLoad(Champion *champ); // @ F0309_CHAMPION_GetMaximumLoad
+ void drawChampionState(ChampionIndex champIndex); // @ F0292_CHAMPION_DrawState
+ uint16 championIconIndex(int16 val, direction dir); // @ M26_CHAMPION_ICON_INDEX
};
diff --git a/engines/dm/dm.h b/engines/dm/dm.h
index 0b69aff89e..2a718ce868 100644
--- a/engines/dm/dm.h
+++ b/engines/dm/dm.h
@@ -35,6 +35,7 @@ void turnDirLeft(direction &dir);
direction returnOppositeDir(direction dir);
bool isOrientedWestEast(direction dir);
+
enum ThingType {
kPartyThingType = -1, // @ CM1_THING_TYPE_PARTY, special value
kDoorThingType = 0,
diff --git a/engines/dm/gfx.h b/engines/dm/gfx.h
index 07dabce88a..0c92214a0f 100644
--- a/engines/dm/gfx.h
+++ b/engines/dm/gfx.h
@@ -33,7 +33,14 @@ enum GraphicIndice {
kFoodLabelIndice = 30, // @ C030_GRAPHIC_FOOD_LABEL
kWaterLabelIndice = 31, // @ C031_GRAPHIC_WATER_LABEL
kPoisionedLabelIndice = 32, // @ C032_GRAPHIC_POISONED_LABEL
- kPanelResurectReincaranteIndice // @ C040_GRAPHIC_PANEL_RESURRECT_REINCARNATE
+ kPanelResurectReincaranteIndice = 40, // @ C040_GRAPHIC_PANEL_RESURRECT_REINCARNATE
+ kBorderPartyShieldIndice = 37, // @ C037_GRAPHIC_BORDER_PARTY_SHIELD
+ kBorderPartyFireshieldIndice = 38, // @ C038_GRAPHIC_BORDER_PARTY_FIRESHIELD
+ kBorderPartySpellshieldIndice = 39, // @ C039_GRAPHIC_BORDER_PARTY_SPELLSHIELD
+ kStatusBoxDeadChampion = 8, // @ C008_GRAPHIC_STATUS_BOX_DEAD_CHAMPION
+ kSlotBoxNormalIndice = 33, // @ C033_GRAPHIC_SLOT_BOX_NORMAL
+ kSlotBoxWoundedIndice = 34, // @ C034_GRAPHIC_SLOT_BOX_WOUNDED
+ kChampionIcons = 28 // @ C028_GRAPHIC_CHAMPION_ICONS
};
extern uint16 gPalSwoosh[16];
@@ -49,7 +56,7 @@ public:
uint16 _y1;
uint16 _y2;
- Box(uint16 x1, uint16 x2, uint16 y1, uint16 y2): _x1(x1), _x2(x2 + 1), _y1(y1), _y2(y2 + 1) {}
+ Box(uint16 x1, uint16 x2, uint16 y1, uint16 y2) : _x1(x1), _x2(x2 + 1), _y1(y1), _y2(y2 + 1) {}
Box() {}
bool isPointInside(Common::Point point) {
return (_x1 <= point.x) && (point.x < _x2) && (_y1 <= point.y) && (point.y < _y2);
@@ -66,8 +73,8 @@ struct Frame {
Frame() {}
Frame(uint16 destFromX, uint16 destToX, uint16 destFromY, uint16 destToY,
- uint16 srcWidth, uint16 srcHeight, uint16 srcX, uint16 srcY) :
- _destFromX(destFromX), _destToX(destToX + 1), _destFromY(destFromY), _destToY(destToY + 1),
+ uint16 srcWidth, uint16 srcHeight, uint16 srcX, uint16 srcY) :
+ _destFromX(destFromX), _destToX(destToX + 1), _destFromY(destFromY), _destToY(destToY + 1),
_srcWidth(srcWidth * 2), _srcHeight(srcHeight), _srcX(srcX), _srcY(srcY) {}
};