aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBendegúz Nagy2016-06-28 00:30:32 +0200
committerBendegúz Nagy2016-08-26 23:02:22 +0200
commit49aae8932bcb4698c37516f00ae2f6728044b0bd (patch)
tree1300c683f4196e05186eeb1bd8585ea741171b6f
parent652b2c6f98f291a76397c9035e4f8338b9c792f9 (diff)
downloadscummvm-rg350-49aae8932bcb4698c37516f00ae2f6728044b0bd.tar.gz
scummvm-rg350-49aae8932bcb4698c37516f00ae2f6728044b0bd.tar.bz2
scummvm-rg350-49aae8932bcb4698c37516f00ae2f6728044b0bd.zip
DM: Add F0341_INVENTORY_DrawPanel_Scroll
-rw-r--r--engines/dm/dm.h2
-rw-r--r--engines/dm/dungeonman.h1
-rw-r--r--engines/dm/gfx.h3
-rw-r--r--engines/dm/inventory.cpp48
-rw-r--r--engines/dm/inventory.h2
5 files changed, 54 insertions, 2 deletions
diff --git a/engines/dm/dm.h b/engines/dm/dm.h
index 5a7e548448..19eda10dfd 100644
--- a/engines/dm/dm.h
+++ b/engines/dm/dm.h
@@ -106,7 +106,7 @@ public:
byte getCell() const { return _data >> 14; }
ThingType getType() const { return (ThingType)((_data >> 10) & 0xF); }
- uint16 getIndex() const { return _data & 0x1FF; }
+ uint16 getIndex() const { return _data & 0x3FF; }
uint16 toUint16() const { return _data; } // I don't like 'em cast operators
bool operator==(const Thing &rhs) const { return _data == rhs._data; }
bool operator!=(const Thing &rhs) const { return _data != rhs._data; }
diff --git a/engines/dm/dungeonman.h b/engines/dm/dungeonman.h
index 1175298917..767044e9af 100644
--- a/engines/dm/dungeonman.h
+++ b/engines/dm/dungeonman.h
@@ -389,6 +389,7 @@ public:
}
Thing getNextThing() { return _nextThing; }
uint16 getClosed() { return (_attributes >> 10) & 0x3F; } // ??? dunno why, the original bitfield is 6 bits long
+ uint16 getTextStringThingIndex() { return _attributes & 0x3FF; }
}; // @ SCROLL
enum PotionType {
diff --git a/engines/dm/gfx.h b/engines/dm/gfx.h
index 9354b99de3..3ff4bf5c33 100644
--- a/engines/dm/gfx.h
+++ b/engines/dm/gfx.h
@@ -74,7 +74,8 @@ enum GraphicIndice {
kPanelRenameChampionIndice = 27, // @ C027_GRAPHIC_PANEL_RENAME_CHAMPION
kMenuActionAreaIndice = 10, // @ C010_GRAPHIC_MENU_ACTION_AREA
kMenuSpellAreLinesIndice = 11, // @ C011_GRAPHIC_MENU_SPELL_AREA_LINES
- kMenuSpellAreaBackground = 9 // @ C009_GRAPHIC_MENU_SPELL_AREA_BACKGROUND
+ kMenuSpellAreaBackground = 9, // @ C009_GRAPHIC_MENU_SPELL_AREA_BACKGROUND
+ kPanelOpenScrollIndice = 23 // @ C023_GRAPHIC_PANEL_OPEN_SCROLL
};
extern uint16 gPalSwoosh[16];
diff --git a/engines/dm/inventory.cpp b/engines/dm/inventory.cpp
index 1a08022e62..eb3192aae1 100644
--- a/engines/dm/inventory.cpp
+++ b/engines/dm/inventory.cpp
@@ -246,4 +246,52 @@ void InventoryMan::drawPanelScrollTextLine(int16 yPos, char* text) {
}
_vm->_textMan->printToViewport(162 - (6 * strlen(text) / 2), yPos, kColorBlack, text, kColorWhite);
}
+
+void InventoryMan::drawPanelScroll(Scroll* scroll) {
+ DisplayMan &dispMan = *_vm->_displayMan;
+
+ char stringFirstLine[300];
+ _vm->_dungeonMan->decodeText(stringFirstLine, Thing(scroll->getTextStringThingIndex()), (TextType)(kTextTypeScroll | kDecodeEvenIfInvisible));
+ char *charRed = stringFirstLine;
+ while (*charRed && (*charRed != '\n')) {
+ charRed++;
+ }
+ *charRed = '\0';
+ dispMan.blitToScreen(dispMan.getBitmap(kPanelOpenScrollIndice), 144, 0, 0, gBoxPanel, kColorRed, gDungeonViewport);
+ int16 lineCount = 1;
+ charRed++;
+ char *charGreen = charRed; // first char of the second line
+ while (*charGreen) {
+ warning("BUG0_47");
+ /* BUG0_47 Graphical glitch when you open a scroll. If there is a single line of text in a scroll
+ (with no carriage return) then charGreen points to undefined data. This may result in a graphical
+ glitch and also corrupt other memory. This is not an issue in the original dungeons where all
+ scrolls contain at least one carriage return character */
+ if (*charGreen == '\n') {
+ lineCount++;
+ }
+ charGreen++;
+ }
+ if (*(charGreen - 1) != '\n') {
+ lineCount++;
+ } else if (*(charGreen - 2) == '\n') {
+ lineCount--;
+ }
+ int16 yPos = 92 - (7 * lineCount) / 2; // center the text vertically
+ drawPanelScrollTextLine(yPos, stringFirstLine);
+ charGreen = charRed;
+ while (*charGreen) {
+ yPos += 7;
+ while (*charRed && (*charRed != '\n')) {
+ charRed++;
+ }
+ if (!(*charRed)) {
+ charRed[1] = '\0';
+ }
+ *charRed++ = '\0';
+ drawPanelScrollTextLine(yPos, charGreen);
+ charGreen = charRed;
+ }
+}
+
}
diff --git a/engines/dm/inventory.h b/engines/dm/inventory.h
index fe974b6c1b..3f6783b37c 100644
--- a/engines/dm/inventory.h
+++ b/engines/dm/inventory.h
@@ -28,6 +28,7 @@
#include "dm.h"
#include "gfx.h"
#include "champion.h"
+#include "dungeonman.h"
@@ -66,6 +67,7 @@ public:
void drawPanel(); // @ F0347_INVENTORY_DrawPanel
void closeChest(); // @ F0334_INVENTORY_CloseChest
void drawPanelScrollTextLine(int16 yPos, char *text); // @ F0340_INVENTORY_DrawPanel_ScrollTextLine
+ void drawPanelScroll(Scroll *scoll); // @ F0341_INVENTORY_DrawPanel_Scroll
};