From 12d359166ca87d74cfe6598162d78da97939c0d3 Mon Sep 17 00:00:00 2001 From: Bendegúz Nagy Date: Sat, 25 Jun 2016 16:27:31 +0200 Subject: DM: Add F0387_MENUS_DrawActionArea --- engines/dm/gfx.h | 3 ++- engines/dm/inventory.cpp | 2 +- engines/dm/menus.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++- engines/dm/menus.h | 19 ++++++++++++++++- engines/dm/text.cpp | 15 ++++++++++++- engines/dm/text.h | 4 ++++ 6 files changed, 93 insertions(+), 5 deletions(-) (limited to 'engines') diff --git a/engines/dm/gfx.h b/engines/dm/gfx.h index 5db354d458..d3e19479d8 100644 --- a/engines/dm/gfx.h +++ b/engines/dm/gfx.h @@ -71,7 +71,8 @@ enum GraphicIndice { kChampionIcons = 28, // @ C028_GRAPHIC_CHAMPION_ICONS kFontGraphicIndice = 557, // @ C557_GRAPHIC_FONT kSlotBoxActingHandIndice = 35, // @ C035_GRAPHIC_SLOT_BOX_ACTING_HAND - kPanelRenameChampionIndice = 27 // @ C027_GRAPHIC_PANEL_RENAME_CHAMPION + kPanelRenameChampionIndice = 27, // @ C027_GRAPHIC_PANEL_RENAME_CHAMPION + kMenuActionAreaIndice = 10 // @ C010_GRAPHIC_MENU_ACTION_AREA }; extern uint16 gPalSwoosh[16]; diff --git a/engines/dm/inventory.cpp b/engines/dm/inventory.cpp index f6fe61f78f..550c4c85c6 100644 --- a/engines/dm/inventory.cpp +++ b/engines/dm/inventory.cpp @@ -37,7 +37,7 @@ namespace DM { Box gBoxFloppyZzzCross = Box(174, 218, 2, 12); // @ G0041_s_Graphic562_Box_ViewportFloppyZzzCross -Box gBoxPanel = Box(80, 223, 52, 124); +Box gBoxPanel = Box(80, 223, 52, 124); // @ G0032_s_Graphic562_Box_Panel Box gBoxFood = Box(112, 159, 60, 68); // @ G0035_s_Graphic562_Box_Food Box gBoxWater = Box(112, 159, 83, 91); // @ G0036_s_Graphic562_Box_Water Box gBoxPoisoned = Box(112, 207, 105, 119); // @ G0037_s_Graphic562_Box_Poisoned diff --git a/engines/dm/menus.cpp b/engines/dm/menus.cpp index 25ed432621..ec87a3b77c 100644 --- a/engines/dm/menus.cpp +++ b/engines/dm/menus.cpp @@ -31,10 +31,15 @@ #include "dungeonman.h" #include "objectman.h" #include "inventory.h" +#include "text.h" namespace DM { +Box gBoxActionArea3ActionMenu = Box(224, 319, 77, 121); // @ G0499_s_Graphic560_Box_ActionArea3ActionsMenu +Box gBoxActionArea2ActionMenu = Box(224, 319, 77, 109); // @ G0500_s_Graphic560_Box_ActionArea2ActionsMenu +Box gBoxActionArea1ActionMenu = Box(224, 319, 77, 97); // @ G0501_s_Graphic560_Box_ActionArea1ActionMenu +Box gBoxActionArea = Box(224, 319, 77, 121); // @ G0001_s_Graphic562_Box_ActionArea byte gPalChangesActionAreaObjectIcon[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0}; // @ G0498_auc_Graphic560_PaletteChanges_ActionAreaObjectIcon MenuMan::MenuMan(DMEngine *vm) : _vm(vm) { @@ -160,7 +165,7 @@ void MenuMan::refreshActionAreaAndSetChampDirMaxDamageReceived() { _actionDamage = 0; } else { _actionAreaContainsIcons = true; - warning("MISSING CODE: F0387_MENUS_DrawActionArea"); + drawActionArea(); } } else { _actionAreaContainsIcons = false; @@ -170,4 +175,52 @@ void MenuMan::refreshActionAreaAndSetChampDirMaxDamageReceived() { } } } + +#define kChampionNameMaximumLength 7 // @ C007_CHAMPION_NAME_MAXIMUM_LENGTH +#define kActionNameMaximumLength 12 // @ C012_ACTION_NAME_MAXIMUM_LENGTH + +void MenuMan::drawActionArea() { + DisplayMan &dispMan = *_vm->_displayMan; + ChampionMan &champMan = *_vm->_championMan; + TextMan &textMan = *_vm->_textMan; + + warning("MISSING CODE: F0077_MOUSE_HidePointer_CPSE"); + dispMan._useByteBoxCoordinates = false; + dispMan.clearScreenBox(kColorBlack, gBoxActionArea); + if (_actionAreaContainsIcons) { + for (uint16 champIndex = kChampionFirst; champIndex < champMan._partyChampionCount; ++champIndex) + drawActionIcon((ChampionIndex)champIndex); + } else if (champMan._actingChampionOrdinal) { + Box box = gBoxActionArea3ActionMenu; + if (_actionList._actionIndices[2] == kChampionActionNone) + box = gBoxActionArea2ActionMenu; + if (_actionList._actionIndices[1] == kChampionActionNone) + box = gBoxActionArea1ActionMenu; + dispMan.blitToScreen(dispMan.getBitmap(kMenuActionAreaIndice), 96, 0, 0, box, kColorNoTransparency); + textMan.printWithTrailingSpacesToScreen(235, 83, kColorBlack, kColorCyan, champMan._champions[_vm->ordinalToIndex(champMan._actingChampionOrdinal)]._name, + kChampionNameMaximumLength); + for (uint16 actionListIndex = 0; actionListIndex < 3; actionListIndex++) { + textMan.printWithTrailingSpacesToScreen(241, 93 + actionListIndex * 12, kColorCyan, kColorBlack, + getActionName(_actionList._actionIndices[actionListIndex]), + kActionNameMaximumLength); + } + } + warning("MISSING CODE: F0078_MOUSE_ShowPointer"); + _refreshActionArea = false; +} + +const char *gChampionActionNames[44] = { + "N", "BLOCK", "CHOP", "X", "BLOW HORN", "FLIP", "PUNCH", + "KICK", "WAR CRY", "STAB", "CLIMB DOWN", "FREEZE LIFE", + "HIT", "SWING", "STAB", "THRUST", "JAB", "PARRY", "HACK", + "BERZERK", "FIREBALL", "DISPELL", "CONFUSE", "LIGHTNING", + "DISRUPT", "MELEE", "X", "INVOKE", "SLASH", "CLEAVE", + "BASH", "STUN", "SHOOT", "SPELLSHIELD", "FIRESHIELD", + "FLUXCAGE", "HEAL", "CALM", "LIGHT", "WINDOW", "SPIT", + "BRANDISH", "THROW", "FUSE"}; + +const char* MenuMan::getActionName(ChampionAction actionIndex) { + return (actionIndex == kChampionActionNone) ? "" : gChampionActionNames[actionIndex]; +} + } diff --git a/engines/dm/menus.h b/engines/dm/menus.h index 3562ced34a..4ae7784c4d 100644 --- a/engines/dm/menus.h +++ b/engines/dm/menus.h @@ -33,6 +33,20 @@ namespace DM { +extern Box gBoxActionArea; + +class ActionList { +public: + byte _minimumSkillLevel[3]; /* Bit 7: requires charge, Bit 6-0: minimum skill level. */ + ChampionAction _actionIndices[3]; + ActionList() { + for (uint16 i = 0; i < 3; ++i) { + _minimumSkillLevel[i] = 0; + _actionIndices[i] = kChampionActionNone; + } + } +}; // @ ACTION_LIST + class MenuMan { DMEngine *_vm; public: @@ -40,7 +54,8 @@ public: bool _refreshActionArea; // @ G0508_B_RefreshActionArea bool _actionAreaContainsIcons; // @ G0509_B_ActionAreaContainsIcons - int16 _actionDamage; + int16 _actionDamage; // @ G0513_i_ActionDamage + ActionList _actionList; // @ G0713_s_ActionList void clearActingChampion(); // @ F0388_MENUS_ClearActingChampion void drawActionIcon(ChampionIndex championIndex); // @ F0386_MENUS_DrawActionIcon @@ -48,6 +63,8 @@ public: void drawMovementArrows(); // @ F0395_MENUS_DrawMovementArrows void drawDisabledMenu(); // @ F0456_START_DrawDisabledMenus void refreshActionAreaAndSetChampDirMaxDamageReceived(); // @ F0390_MENUS_RefreshActionAreaAndSetChampionDirectionMaximumDamageReceived + void drawActionArea(); // @ F0387_MENUS_DrawActionArea + const char* getActionName(ChampionAction actionIndex); // @ F0384_MENUS_GetActionName }; } diff --git a/engines/dm/text.cpp b/engines/dm/text.cpp index 3adc1a9ecb..ab22ac473e 100644 --- a/engines/dm/text.cpp +++ b/engines/dm/text.cpp @@ -60,7 +60,7 @@ void TextMan::printTextToBitmap(byte* destBitmap, uint16 destPixelWidth, uint16 break; uint16 srcX = (1 + 5) * toupper(*begin); // 1 + 5 is not the letter width, arbitrary choice of the unpacking code _vm->_displayMan->blitToBitmap(srcBitmap, 6 * 128, (nextX == destX) ? (srcX + 1) : srcX, 0, destBitmap, destPixelWidth, - (nextX == destX) ? (nextX + 1) : nextX, nextX + kLetterWidth + 1, nextY, nextY + kLetterHeight, kColorNoTransparency, viewport); + (nextX == destX) ? (nextX + 1) : nextX, nextX + kLetterWidth + 1, nextY, nextY + kLetterHeight, kColorNoTransparency, viewport); nextX += kLetterWidth + 1; } } @@ -73,4 +73,17 @@ void TextMan::printToViewport(int16 posX, int16 posY, Color textColor, const cha printTextToScreen(posX, posY, textColor, kColorDarkestGray, text, gDungeonViewport); } +void TextMan::printWithTrailingSpaces(byte* destBitmap, int16 destPixelWidth, int16 destX, int16 destY, Color textColor, + Color bgColor, const char* text, int16 requiredTextLength, int16 destHeight, Viewport& viewport) { + Common::String str = text; + for (int16 i = str.size(); i < requiredTextLength; ++i) + str += ' '; + printTextToBitmap(destBitmap, destPixelWidth, destX, destY, textColor, bgColor, str.c_str(), destHeight, viewport); +} + +void TextMan::printWithTrailingSpacesToScreen(int16 destX, int16 destY, Color textColor, Color bgColor, const char* text, int16 strLenght, Viewport& viewport) { + printWithTrailingSpaces(_vm->_displayMan->_vgaBuffer, _vm->_displayMan->_screenWidth, destX, destY, + textColor, bgColor, text, strLenght, _vm->_displayMan->_screenHeight, viewport); +} + } diff --git a/engines/dm/text.h b/engines/dm/text.h index 1a413ee87f..b03d00a00d 100644 --- a/engines/dm/text.h +++ b/engines/dm/text.h @@ -41,6 +41,10 @@ public: Color textColor, Color bgColor, const char *text, uint16 destHeight, Viewport &viewport = gDefultViewPort); // @ F0040_TEXT_Print void printTextToScreen(uint16 destX, uint16 destY, Color textColor, Color bgColor, const char *text, Viewport &viewport = gDefultViewPort); // @ F0053_TEXT_PrintToLogicalScreen void printToViewport(int16 posX, int16 posY, Color textColor, const char *text); // @ F0052_TEXT_PrintToViewport + void printWithTrailingSpaces(byte *destBitmap, int16 destPixelWidth, int16 destX, int16 destY, Color textColor, Color bgColor, + const char *text, int16 strLenght, int16 destHeight, Viewport &viewport = gDefultViewPort); // @ F0041_TEXT_PrintWithTrailingSpaces + void printWithTrailingSpacesToScreen(int16 destX, int16 destY, Color textColor, Color bgColor, + const char *text, int16 strLenght, Viewport &viewport = gDefultViewPort); // @ F0041_TEXT_PrintWithTrailingSpaces }; } -- cgit v1.2.3