KYRA: (EOB/PC98) - fix Japanese text display

This commit is contained in:
athrxx 2019-11-26 22:07:32 +01:00
parent 1f42999a7c
commit 5a1162e999
18 changed files with 573 additions and 327 deletions

View File

@ -980,8 +980,9 @@ void CharacterGenerator::printStats(int index, int mode) {
}
void CharacterGenerator::processNameInput(int index, int textColor) {
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_screen->fillRect(_chargenNameFieldX[index], _chargenNameFieldY[index], _chargenNameFieldX[index] + 59, _chargenNameFieldY[index] + 5, _vm->guiSettings()->colors.guiColorBlack);
_screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_SMALL_FNT : Screen::FID_6_FNT);
int xOffs = (60 - _screen->getTextWidth(_characters[index].name)) >> 1;
_screen->printText(_characters[index].name, _chargenNameFieldX[index] + xOffs, _chargenNameFieldY[index], textColor, 0);
_screen->updateScreen();

View File

@ -70,11 +70,13 @@ Common::Error EoBEngine::init() {
_screen->modifyScreenDim(7, 0x01, 0xB3, 0x22, 0x12);
_screen->modifyScreenDim(9, 0x01, 0x7D, 0x26, 0x3F);
_screen->modifyScreenDim(12, 0x01, 0x04, 0x14, 0xA0);
// adjust main menu coords for EOB I PC-98
if (_flags.platform == Common::kPlatformPC98)
if (_flags.platform == Common::kPlatformPC98) {
_screen->modifyScreenDim(28, 0x0A, 0xA4, 0x15, 0x18);
_screen->modifyScreenDim(12, 0x01, 0x04, 0x14, 0x9A);
} else {
_screen->modifyScreenDim(12, 0x01, 0x04, 0x14, 0xA0);
}
_scriptTimersCount = 1;
@ -628,8 +630,10 @@ void EoBEngine::healParty() {
const KyraRpgGUISettings *EoBEngine::guiSettings() const {
if (_flags.platform == Common::kPlatformAmiga)
return _useMainMenuGUISettings ? &_guiSettingsAmigaMainMenu : &_guiSettingsAmiga;
else if (_flags.platform == Common::kPlatformPC98 || _configRenderMode == Common::kRenderCGA || _configRenderMode == Common::kRenderEGA)
else if (_configRenderMode == Common::kRenderCGA || _configRenderMode == Common::kRenderEGA)
return &_guiSettingsEGA;
else if (_flags.platform == Common::kPlatformPC98)
return &_guiSettingsPC98;
else
return &_guiSettingsVGA;
}

View File

@ -148,6 +148,7 @@ private:
static const KyraRpgGUISettings _guiSettingsVGA;
static const KyraRpgGUISettings _guiSettingsEGA;
static const KyraRpgGUISettings _guiSettingsPC98;
static const KyraRpgGUISettings _guiSettingsAmiga;
static const KyraRpgGUISettings _guiSettingsAmigaMainMenu;
static const uint8 _egaDefaultPalette[];

View File

@ -675,7 +675,7 @@ void EoBCoreEngine::runLoop() {
_flashShapeTimer = 0;
_drawSceneTimer = _system->getMillis();
_screen->setFont(Screen::FID_6_FNT);
_screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_screen->setScreenDim(7);
_runFlag = true;
@ -719,10 +719,10 @@ bool EoBCoreEngine::checkPartyStatus(bool handleDeath) {
gui_drawAllCharPortraitsWithStats();
if (checkPartyStatusExtra()) {
_screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
gui_updateControls();
if (_gui->runLoadMenu(0, 0)) {
_screen->setFont(Screen::FID_6_FNT);
_screen->setFont(of);
return true;
}
}
@ -1720,7 +1720,7 @@ int EoBCoreEngine::runDialogue(int dialogueTextId, int numStr, ...) {
void EoBCoreEngine::restParty_displayWarning(const char *str) {
int od = _screen->curDimIndex();
_screen->setScreenDim(7);
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_screen->setCurPage(0);
_txt->printMessage(Common::String::format("\r%s\r", str).c_str());
@ -1737,7 +1737,7 @@ bool EoBCoreEngine::restParty_updateMonsters() {
for (int i = 0; i < 5; i++) {
_partyResting = true;
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
int od = _screen->curDimIndex();
_screen->setScreenDim(7);
updateMonsters(0);

View File

@ -232,17 +232,19 @@ void KyraRpgEngine::drawDialogueButtons() {
for (int i = 0; i < _dialogueNumButtons; i++) {
int x = _dialogueButtonPosX[i];
if (_flags.lang == Common::JA_JPN && _flags.use16ColorMode) {
if (_flags.gameID == GI_LOL && _flags.use16ColorMode) {
gui_drawBox(x, ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1, 74, 10, 0xEE, 0xCC, -1);
screen()->printText(_dialogueButtonString[i], (x + 37 - (screen()->getTextWidth(_dialogueButtonString[i])) / 2) & ~3,
((_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2) & ~7, _dialogueHighlightedButton == i ? 0xC1 : 0xE1, 0);
} else {
int sjisYOffset = (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformFMTowns) ? 1 : ((_flags.lang == Common::JA_JPN && (_dialogueButtonString[i][0] & 0x80)) ? 2 : 0);
int yOffset = guiSettings()->buttons.txtOffsY;
if (_flags.gameID == GI_LOL && _flags.lang == Common::JA_JPN && (_dialogueButtonString[i][0] & 0x80))
yOffset = 0;
screen()->set16bitShadingLevel(4);
gui_drawBox(x, (_dialogueButtonYoffs + _dialogueButtonPosY[i]), _dialogueButtonWidth, guiSettings()->buttons.height, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
screen()->set16bitShadingLevel(0);
screen()->printText(_dialogueButtonString[i], x + (_dialogueButtonWidth >> 1) - (screen()->getTextWidth(_dialogueButtonString[i])) / 2,
(_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2 - sjisYOffset, _dialogueHighlightedButton == i ? _dialogueButtonLabelColor1 : _dialogueButtonLabelColor2, 0);
(_dialogueButtonYoffs + _dialogueButtonPosY[i]) + yOffset, _dialogueHighlightedButton == i ? _dialogueButtonLabelColor1 : _dialogueButtonLabelColor2, 0);
}
}
screen()->setFont(of);

View File

@ -86,6 +86,7 @@ struct KyraRpgGUISettings {
uint8 labelColor2;
uint16 width;
uint16 height;
int16 txtOffsY;
int waitReserve;
uint16 waitX[2];
uint8 waitY[2];

View File

@ -238,7 +238,7 @@ void EoBCoreEngine::removeCharacterEffect(int spell, int charIndex, int showWarn
if (showWarning) {
int od = _screen->curDimIndex();
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_screen->setScreenDim(7);
printWarning(Common::String::format(_magicStrings3[_flags.gameID == GI_EOB1 ? 3 : 2], c->name, s->name).c_str());
_screen->setScreenDim(od);

View File

@ -305,7 +305,7 @@ void EoBCoreEngine::timerSpecialCharacterUpdate(int timerNum) {
}
int od = _screen->curDimIndex();
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_screen->setScreenDim(7);
switch (evt) {

View File

@ -68,6 +68,7 @@ Screen::Screen(KyraEngine_v1 *vm, OSystem *system, const ScreenDim *dimTable, co
_currentFont = FID_8_FNT;
_currentFontType = FTYPE_ASCII;
_paletteChanged = true;
_textMarginRight = SCREEN_W;
_curDim = 0;
}
@ -163,20 +164,23 @@ bool Screen::init() {
if (_useSJIS) {
Common::SharedPtr<Graphics::FontSJIS> font(Graphics::FontSJIS::createFont(_vm->gameFlags().platform));
if (!font.get())
error("Could not load any SJIS font, neither the original nor ScummVM's 'SJIS.FNT'");
if (_use16ColorMode) {
_fonts[FID_SJIS_TEXTMODE_FNT] = new SJISFont(font, _sjisInvisibleColor, true, false, _vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns, 0);
if (_vm->game() == GI_EOB1)
_fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, false, false, _vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns, 0);
_fonts[FID_SJIS_TEXTMODE_FNT] = new SJISFont(font, _sjisInvisibleColor, true, false, 0);
if (_vm->game() == GI_EOB1) {
int temp;
_fonts[FID_SJIS_FNT] = new SJISFontEoB1PC98(font, 12, _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable1, temp), _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable2, temp));
}
} else {
_fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, false, _vm->game() != GI_LOL && _vm->game() != GI_EOB2, _vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns, _vm->game() == GI_LOL ? 1 : 0);
_fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, false, _vm->game() != GI_LOL && _vm->game() != GI_EOB2, _vm->game() == GI_LOL ? 1 : 0);
}
if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns)
_fonts[FID_SJIS_LARGE_FNT] = new SJISFontLarge(font);
if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) {
_fonts[FID_SJIS_FNT]->setStyle(Font::kFSFat);
_fonts[FID_SJIS_LARGE_FNT] = new SJISFontLarge(font);
}
}
}
@ -1383,13 +1387,6 @@ bool Screen::loadFont(FontId fontId, const char *filename) {
if (!fnt) {
if (_vm->game() == GI_KYRA1 && _isAmiga)
fnt = new AMIGAFont();
#ifdef ENABLE_EOB
else if (_isAmiga)
fnt = new AmigaDOSFont(_vm->resource(), _vm->game() == GI_EOB2 && _vm->gameFlags().lang == Common::DE_DEU);
else if (_vm->game() == GI_EOB1 || _vm->game() == GI_EOB2)
// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode);
#endif // ENABLE_EOB
else
fnt = new DOSFont();
@ -1498,7 +1495,7 @@ void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2
y += (charHeightFnt + _charOffset);
} else {
int charWidth = getCharWidth(c);
if (x + charWidth > SCREEN_W) {
if (x + charWidth > _textMarginRight) {
x = x_start;
y += (charHeightFnt + _charOffset);
if (y >= SCREEN_H)
@ -3785,8 +3782,8 @@ void AMIGAFont::unload() {
memset(_chars, 0, sizeof(_chars));
}
SJISFont::SJISFont(Common::SharedPtr<Graphics::FontSJIS> &font, const uint8 invisColor, bool is16Color, bool drawOutline, bool fatPrint, int extraSpacing)
: _colorMap(0), _font(font), _invisColor(invisColor), _isTextMode(is16Color), _drawOutline(drawOutline), _fatPrint(fatPrint), _sjisWidthOffset(extraSpacing) {
SJISFont::SJISFont(Common::SharedPtr<Graphics::FontSJIS> &font, const uint8 invisColor, bool is16Color, bool drawOutline, int extraSpacing)
: _colorMap(0), _font(font), _invisColor(invisColor), _isTextMode(is16Color), _style(kFSNone), _drawOutline(drawOutline), _sjisWidthOffset(extraSpacing) {
assert(_font);
_sjisWidth = _font->getMaxFontWidth() >> 1;
_fontHeight = _font->getFontHeight() >> 1;
@ -3830,7 +3827,7 @@ void SJISFont::drawChar(uint16 c, byte *dst, int pitch, int) const {
else
_font->setDrawingMode(_drawOutline ? Graphics::FontSJIS::kOutlineMode : Graphics::FontSJIS::kDefaultMode);
_font->toggleFatPrint(_fatPrint);
_font->toggleFatPrint(_style == kFSFat);
_font->drawChar(dst, c, 640, 1, color1, color2, 640, 400);
}

View File

@ -98,6 +98,17 @@ public:
* Sets a text 16bit palette map. Only used in in EOB II FM-Towns. The map contains 2 entries.
*/
virtual void set16bitColorMap(const uint16 *src) {}
enum FontStyle {
kFSNone = 0,
kFSLeftShadow,
kFSFat
};
/**
* Sets a drawing style. Only rudimentary implementation based on what is needed.
*/
virtual void setStyle(FontStyle style) {}
/**
* Draws a specific character.
@ -144,115 +155,6 @@ private:
uint16 *_bitmapOffsets;
};
#ifdef ENABLE_EOB
/**
* Implementation of the Font interface for old DOS fonts used
* in EOB and EOB II.
*
*/
class OldDOSFont : public Font {
public:
OldDOSFont(Common::RenderMode mode);
~OldDOSFont();
bool load(Common::SeekableReadStream &file);
int getHeight() const { return _height; }
int getWidth() const { return _width; }
int getCharWidth(uint16 c) const;
void setColorMap(const uint8 *src) { _colorMap8bit = src; }
void set16bitColorMap(const uint16 *src) { _colorMap16bit = src; }
void drawChar(uint16 c, byte *dst, int pitch, int bpp) const;
private:
void unload();
uint8 *_data;
uint16 *_bitmapOffsets;
int _width, _height;
const uint8 *_colorMap8bit;
const uint16 *_colorMap16bit;
int _numGlyphs;
Common::RenderMode _renderMode;
static uint16 *_cgaDitheringTable;
static int _numRef;
};
/**
* Implementation of the Font interface for native AmigaDOS system fonts (normally to be loaded via diskfont.library)
*/
class Resource;
class AmigaDOSFont : public Font {
public:
AmigaDOSFont(Resource *res, bool needsLocalizedFont = false);
~AmigaDOSFont() { unload(); }
bool load(Common::SeekableReadStream &file);
int getHeight() const { return _height; }
int getWidth() const { return _width; }
int getCharWidth(uint16 c) const;
void setColorMap(const uint8 *src) { _colorMap = src; }
void drawChar(uint16 c, byte *dst, int pitch, int) const;
static void errorDialog(int index);
private:
void unload();
struct TextFont {
TextFont() : data(0), bitmap(0), location(0), spacing(0), kerning(0), height(0), width(0), baseLine(0), firstChar(0), lastChar(0), modulo(0) {}
~TextFont() {
delete[] data;
}
uint16 height;
uint16 width;
uint16 baseLine;
uint8 firstChar;
uint8 lastChar;
uint16 modulo;
const uint8 *data;
const uint8 *bitmap;
const uint16 *location;
const int16 *spacing;
const int16 *kerning;
};
TextFont *loadContentFile(const Common::String fileName);
void selectMode(int mode);
struct FontContent {
FontContent() : height(0), style(0), flags(0) {}
~FontContent() {
data.reset();
}
Common::String contentFile;
Common::SharedPtr<TextFont> data;
uint16 height;
uint8 style;
uint8 flags;
};
int _width, _height;
uint8 _first, _last;
FontContent *_content;
uint16 _numElements;
uint16 _selectedElement;
const uint8 *_colorMap;
const uint16 _maxPathLen;
const bool _needsLocalizedFont;
static uint8 _errorDialogDisplayed;
Resource *_res;
};
#endif // ENABLE_EOB
/**
* Implementation of the Font interface for Kyra 1 style (non-native AmigaDOS) AMIGA fonts.
*/
@ -290,7 +192,7 @@ private:
*/
class SJISFont : public Font {
public:
SJISFont(Common::SharedPtr<Graphics::FontSJIS> &font, const uint8 invisColor, bool is16Color, bool drawOutline, bool fatPrint, int extraSpacing);
SJISFont(Common::SharedPtr<Graphics::FontSJIS> &font, const uint8 invisColor, bool is16Color, bool drawOutline, int extraSpacing);
virtual ~SJISFont() {}
virtual bool usesOverlay() const { return true; }
@ -298,8 +200,9 @@ public:
bool load(Common::SeekableReadStream &) { return true; }
int getHeight() const;
int getWidth() const;
int getCharWidth(uint16 c) const;
virtual int getCharWidth(uint16 c) const;
void setColorMap(const uint8 *src);
void setStyle(FontStyle style) { _style = style; }
virtual void drawChar(uint16 c, byte *dst, int pitch, int) const;
protected:
@ -308,7 +211,7 @@ protected:
int _sjisWidth, _asciiWidth;
int _fontHeight;
const bool _drawOutline;
const bool _fatPrint;
FontStyle _style;
private:
const uint8 _invisColor;
@ -587,6 +490,9 @@ public:
void setScreenDim(int dim);
int curDimIndex() const { return _curDimIndex; }
void setTextMarginRight(int x) { _textMarginRight = x; }
uint16 _textMarginRight;
const ScreenDim *_curDim;
// shape handling

View File

@ -92,6 +92,8 @@ bool Screen_EoB::init() {
_convertHiColorBuffer = new uint8[SCREEN_H * SCREEN_W];
enableHiColorMode(true);
loadFont(FID_SJIS_SMALL_FNT, "FONT.DMP");
} else if (_vm->game() == GI_EOB1 && _vm->gameFlags().platform == Common::kPlatformPC98) {
loadFont(FID_SJIS_SMALL_FNT, "FONT12.FNT");
}
if (_vm->gameFlags().useHiRes && _renderMode == Common::kRenderEGA) {
@ -145,7 +147,7 @@ void Screen_EoB::setClearScreenDim(int dim) {
void Screen_EoB::clearCurDim() {
static const uint8 amigaColorMap[16] = { 0x00, 0x06, 0x1d, 0x1b, 0x1a, 0x17, 0x18, 0x0e, 0x19, 0x1c, 0x1c, 0x1e, 0x13, 0x0a, 0x11, 0x1f };
fillRect(_curDim->sx << 3, _curDim->sy, ((_curDim->sx + _curDim->w) << 3) - 1, (_curDim->sy + _curDim->h) - 1, _isAmiga ? amigaColorMap[_curDim->unkA] : _curDim->unkA);
fillRect(_curDim->sx << 3, _curDim->sy, ((_curDim->sx + _curDim->w) << 3) - 1, (_curDim->sy + _curDim->h) - 1, _isAmiga ? amigaColorMap[_curDim->unkA] : _use16ColorMode ? 0 : _curDim->unkA);
}
void Screen_EoB::setMouseCursor(int x, int y, const byte *shape) {
@ -236,14 +238,21 @@ void Screen_EoB::loadFileDataToPage(Common::SeekableReadStream *s, int pageNum,
}
void Screen_EoB::printShadedText(const char *string, int x, int y, int col1, int col2, int shadowCol) {
if (_vm->gameFlags().platform != Common::kPlatformFMTowns) {
if (_vm->gameFlags().lang != Common::JA_JPN) {
printText(string, x - 1, y, shadowCol, col2);
printText(string, x, y + 1, shadowCol, 0);
printText(string, x - 1, y + 1, shadowCol, 0);
} else if (col2) {
fillRect(x, y, x + getTextWidth(string) - 1, y + getFontHeight() - 1, col2);
}
if (_vm->gameFlags().use16ColorMode)
_fonts[_currentFont]->setStyle(Font::kFSLeftShadow);
printText(string, x, y, col1, 0);
if (_vm->gameFlags().use16ColorMode)
_fonts[_currentFont]->setStyle(Font::kFSNone);
}
void Screen_EoB::loadShapeSetBitmap(const char *file, int tempPage, int destPage) {
@ -1472,19 +1481,23 @@ const uint8 *Screen_EoB::getEGADitheringTable() {
}
bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
if (scumm_stricmp(filename, "FONT.DMP"))
return Screen::loadFont(fontId, filename);
Font *&fnt = _fonts[fontId];
int temp;
int temp = 0;
if (fnt)
delete fnt;
const uint16 *tbl = _vm->staticres()->loadRawDataBe16(kEoB2FontDmpSearchTbl, temp);
assert(tbl);
if (!scumm_stricmp(filename, "FONT.DMP"))
fnt = new SJISFont12x12(_vm->staticres()->loadRawDataBe16(kEoB2FontDmpSearchTbl, temp));
else if (!scumm_stricmp(filename, "FONT12.FNT"))
fnt = new Font12x12PC98(12, _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable1, temp),
_vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable2, temp), _vm->staticres()->loadRawData(kEoB1FontLookupTable, temp));
else if (_isAmiga)
fnt = new AmigaDOSFont(_vm->resource(), _vm->game() == GI_EOB2 && _vm->gameFlags().lang == Common::DE_DEU);
else
// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12);
if (!fnt) {
fnt = new SJISFont12x12(tbl);
assert(fnt);
}
assert(fnt);
Common::SeekableReadStream *file = _vm->resource()->createReadStream(filename);
if (!file)
@ -2037,10 +2050,11 @@ const uint8 Screen_EoB::_egaMatchTable[] = {
uint16 *OldDOSFont::_cgaDitheringTable = 0;
int OldDOSFont::_numRef = 0;
OldDOSFont::OldDOSFont(Common::RenderMode mode) : _renderMode(mode) {
OldDOSFont::OldDOSFont(Common::RenderMode mode, uint8 shadowColor) : _renderMode(mode), _shadowColor(shadowColor) {
_data = 0;
_width = _height = _numGlyphs = 0;
_bitmapOffsets = 0;
_style = kFSNone;
_numRef++;
if (!_cgaDitheringTable && _numRef == 1) {
@ -2097,13 +2111,134 @@ int OldDOSFont::getCharWidth(uint16 c) const {
return _width;
}
void OldDOSFont::setColorMap(const uint8 *src) {
_colorMap8bit = src;
}
void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch, int bpp) const {
static const uint8 renderMaskTable6[] = { 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8 };
static const uint8 renderMaskTable8[] = { 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE };
uint16 color1 = _colorMap8bit[1];
uint16 color2 = _colorMap8bit[0];
if (_width != 8 && _width != 6)
error("EOB font rendering not implemented for other font widths than 6 and 8.");
if (_style == kFSLeftShadow) {
drawCharIntern(c, dst + pitch, pitch, 1, _shadowColor, 0);
drawCharIntern(c, dst - 1, pitch, 1, _shadowColor, 0);
drawCharIntern(c, dst - 1 + pitch, pitch, 1, _shadowColor, 0);
}
if (bpp == 2) {
color1 = _colorMap16bit[1];
color2 = _colorMap16bit[0];
}
drawCharIntern(c, dst, pitch, bpp, color1, color2);
}
void OldDOSFont::drawCharIntern(uint16 c, byte *dst, int pitch, int bpp, int col1, int col2) const {
static const uint16 renderMaskTable[] = {
0x0000, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff
};
c = convert(c);
if (c >= _numGlyphs)
return;
pitch *= bpp;
const uint8 *src = &_data[_bitmapOffsets[c]];
uint8 *dst2 = dst + pitch;
int w = (_width - 1) >> 3;
pitch -= _width * bpp;
if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA) {
col1 &= 0x0F;
col2 &= 0x0F;
}
static const uint16 cgaColorMask[] = { 0, 0x5555, 0xAAAA, 0xFFFF };
uint16 cgaMask1 = cgaColorMask[col1 & 3];
uint16 cgaMask2 = cgaColorMask[col2 & 3];
int cH = _height;
while (cH--) {
int cW = w;
uint16 mask = renderMaskTable[_width];
if (_renderMode == Common::kRenderCGA) {
uint16 s = (*src++) << 8;
if (_width > 8)
s |= *src++;
uint16 cmp1 = 0;
uint16 cmp2 = 0;
if (col1) {
s &= mask;
cmp1 = _cgaDitheringTable[s >> 8];
}
if (col2) {
s = ~s & mask;
cmp2 = _cgaDitheringTable[s >> 8];
}
uint16 cDst = 0;
uint8 sh = 6;
for (int i = 0; i < _width; i++) {
cDst |= ((dst[i] & 3) << sh);
sh = (sh - 2) & 0x0F;
}
uint16 out = (~(cmp1 | cmp2) & cDst) | (cmp1 & cgaMask1) | (cmp2 & cgaMask2);
sh = 6;
for (int i = 0; i < _width; i++) {
*dst++ = (out >> sh) & 3;
sh = (sh - 2) & 0x0F;
}
} else {
for (bool runWidthLoop = true; runWidthLoop;) {
uint16 s = (*src++) << 8;
if (_width > 8)
s |= *src++;
for (uint16 i = 0x8000; i; i >>= 1) {
if (!(mask & i)) {
runWidthLoop = false;
break;
}
if (s & i) {
if (bpp == 2)
*(uint16*)dst = col1;
else if (col1)
*dst = col1;
} else {
if (bpp == 2) {
if (col2 != 0xFFFF)
*(uint16*)dst = col2;
} else if (col2) {
*dst = col2;
}
}
dst += bpp;
}
mask >>= 1;
if (cW)
cW--;
else
runWidthLoop = false;
}
}
dst += pitch;
dst2 += pitch;
}
}
uint16 OldDOSFont::convert(uint16 c) const {
if (_width == 6) {
switch (c) {
case 0x81:
@ -2120,8 +2255,6 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch, int bpp) const {
case 0xE1:
// TODO: recheck this: no conversion for 'ß' ?
break;
default:
break;
}
} else if (_width == 8) {
switch (c) {
@ -2147,114 +2280,9 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch, int bpp) const {
case 0xE1:
c = 0x19;
break;
default:
break;
}
}
if (c >= _numGlyphs)
return;
pitch *= bpp;
const uint8 *src = &_data[_bitmapOffsets[c]];
uint8 *dst2 = dst + pitch;
int w = (_width - 1) >> 3;
pitch -= _width * bpp;
uint16 color1 = _colorMap8bit[1];
uint16 color2 = _colorMap8bit[0];
if (bpp == 2) {
color1 = _colorMap16bit[1];
color2 = _colorMap16bit[0];
} else if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA) {
color1 &= 0x0F;
color2 &= 0x0F;
}
static const uint16 cgaColorMask[] = { 0, 0x5555, 0xAAAA, 0xFFFF };
uint16 cgaMask1 = cgaColorMask[color1 & 3];
uint16 cgaMask2 = cgaColorMask[color2 & 3];
int cH = _height;
while (cH--) {
int cW = w;
uint8 last = 0;
const uint8 *mtbl = _width == 8 ? renderMaskTable8 : renderMaskTable6;
if (_renderMode == Common::kRenderCGA) {
uint8 s = *src++;
uint8 m = *mtbl++;
uint8 in = s | last;
uint16 cmp1 = 0;
uint16 cmp2 = 0;
if (color1) {
in &= m;
cmp1 = _cgaDitheringTable[in];
}
if (color2) {
in = ~in & m;
cmp2 = _cgaDitheringTable[in];
}
uint16 cDst = 0;
uint8 sh = 6;
for (int i = 0; i < _width; i++) {
cDst |= ((dst[i] & 3) << sh);
sh = (sh - 2) & 0x0F;
}
uint16 out = (~(cmp1 | cmp2) & cDst) | (cmp1 & cgaMask1) | (cmp2 & cgaMask2);
sh = 6;
for (int i = 0; i < _width; i++) {
*dst++ = (out >> sh) & 3;
sh = (sh - 2) & 0x0F;
}
last = s;
} else {
for (bool runWidthLoop = true; runWidthLoop;) {
uint8 s = *src++;
uint8 m = *mtbl++;
for (uint8 i = 0x80; i; i >>= 1) {
if (!(m & i)) {
runWidthLoop = false;
break;
}
if (s & i) {
if (bpp == 2)
*(uint16*)dst = color1;
else if (color1)
*dst = color1;
} else {
if (bpp == 2) {
if (color2 != 0xFFFF)
*(uint16*)dst = color2;
} else if (color2) {
*dst = color2;
}
}
dst += bpp;
}
if (cW)
cW--;
else
runWidthLoop = false;
}
}
dst += pitch;
dst2 += pitch;
}
return c;
}
void OldDOSFont::unload() {
@ -2509,7 +2537,126 @@ void AmigaDOSFont::selectMode(int mode) {
_last = _content[mode].data->lastChar;
}
SJISFontLarge::SJISFontLarge(Common::SharedPtr<Graphics::FontSJIS> &font) : SJISFont(font, 0, false, false, false, 0) {
SJISFontEoB1PC98::SJISFontEoB1PC98(Common::SharedPtr<Graphics::FontSJIS> &font, uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2) : SJISFont(font, 0, false, false, 0),
_shadowColor(shadowColor), _convTable1(convTable1), _convTable2(convTable2), _defaultConv(true) {
assert(_convTable1);
assert(_convTable2);
}
int SJISFontEoB1PC98::getCharWidth(uint16 c) const {
return SJISFont::getCharWidth(convert(c));
}
void SJISFontEoB1PC98::drawChar(uint16 c, byte *dst, int pitch, int) const {
c = convert(c);
_font->setDrawingMode(_style == kFSLeftShadow ? Graphics::FontSJIS::kShadowLeftMode : Graphics::FontSJIS::kDefaultMode);
_font->toggleFatPrint(false);
_font->drawChar(dst, c, 640, 1, _colorMap[1], _colorMap[0], 640, 400);
}
uint16 SJISFontEoB1PC98::convert(uint16 c) const {
uint8 l = c & 0xFF;
uint8 h = c >> 8;
if (c < 128) {
c = _convTable2[l - 32];
} else if (l > 160 && l < 225) {
bool done = false;
if (_defaultConv) {
if (h == 0xDE) {
if ((l >= 182 && l <= 196) || (l >= 202 && l <= 206)) {
c = _convTable1[l - 182];
done = true;
}
} else if (h == 0xDF) {
if (l >= 202 && l <= 206) {
c = _convTable1[l - 177];
done = true;
}
}
}
if (!done)
c = _convTable2[l - 64];
}
return c;
}
Font12x12PC98::Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable) : OldDOSFont(Common::kRenderDefault, 12),
_convTable1(convTable1), _convTable2(convTable2) {
assert(convTable1);
assert(convTable2);
assert(lookupTable);
_width = _height = 12;
_numGlyphs = 275;
_bmpOffs = new uint16[_numGlyphs];
for (int i = 0; i < _numGlyphs; ++i)
_bmpOffs[i] = lookupTable[i] * 24;
}
Font12x12PC98::~Font12x12PC98() {
delete[] _bmpOffs;
}
bool Font12x12PC98::load(Common::SeekableReadStream &file) {
unload();
_width = _height = 12;
_numGlyphs = 275;
_bitmapOffsets = _bmpOffs;
_data = new uint8[file.size()];
assert(_data);
file.read(_data, file.size());
if (file.err())
return false;
return true;
}
uint16 Font12x12PC98::convert(uint16 c) const {
uint8 l = c & 0xFF;
uint8 h = c >> 8;
if (c < 128) {
c = _convTable2[l - 32];
} else if (l > 160 && l < 225) {
bool done = false;
if (1) {
if (h == 0xDE) {
if ((l >= 182 && l <= 196) || (l >= 202 && l <= 206)) {
c = _convTable1[l - 182];
done = true;
}
} else if (h == 0xDF) {
if (l >= 202 && l <= 206) {
c = _convTable1[l - 177];
done = true;
}
}
}
if (!done)
c = _convTable2[l - 64];
}
c = SWAP_BYTES_16(c);
if (c < 0x813F)
c = 1;
else if (c < 0x824F)
c -= 0x813F;
else if (c < 0x833F)
c -= 0x81EE;
else if (c > 0x839F)
c = 1;
else
c -= 0x828D;
return c;
}
SJISFontLarge::SJISFontLarge(Common::SharedPtr<Graphics::FontSJIS> &font) : SJISFont(font, 0, false, false, 0) {
_sjisWidth = _font->getMaxFontWidth();
_fontHeight = _font->getFontHeight();
_asciiWidth = _font->getCharWidth('a');

View File

@ -155,7 +155,155 @@ private:
};
/**
* SJIS Font variant used in the intro and outro of EOB II FM-Towns. It appears twice as large, since it is not rendered on the hires overlay pages
* Implementation of the Font interface for old DOS fonts used
* in EOB and EOB II.
*
*/
class OldDOSFont : public Font {
public:
OldDOSFont(Common::RenderMode mode, uint8 shadowColor);
virtual ~OldDOSFont();
virtual bool load(Common::SeekableReadStream &file);
int getHeight() const { return _height; }
int getWidth() const { return _width; }
int getCharWidth(uint16 c) const;
void setColorMap(const uint8 *src);
void set16bitColorMap(const uint16 *src) { _colorMap16bit = src; }
virtual void setStyle(FontStyle style) { _style = style; }
void drawChar(uint16 c, byte *dst, int pitch, int bpp) const;
protected:
void unload();
FontStyle _style;
const uint8 *_colorMap8bit;
uint8 *_data;
uint16 *_bitmapOffsets;
int _width, _height;
int _numGlyphs;
uint8 _shadowColor;
private:
void drawCharIntern(uint16 c, byte *dst, int pitch, int bpp, int col1, int col2) const;
virtual uint16 convert(uint16 c) const;
Common::RenderMode _renderMode;
const uint16 *_colorMap16bit;
static uint16 *_cgaDitheringTable;
static int _numRef;
};
/**
* Implementation of the Font interface for native AmigaDOS system fonts (normally to be loaded via diskfont.library)
*/
class Resource;
class AmigaDOSFont : public Font {
public:
AmigaDOSFont(Resource *res, bool needsLocalizedFont = false);
~AmigaDOSFont() { unload(); }
bool load(Common::SeekableReadStream &file);
int getHeight() const { return _height; }
int getWidth() const { return _width; }
int getCharWidth(uint16 c) const;
void setColorMap(const uint8 *src) { _colorMap = src; }
void drawChar(uint16 c, byte *dst, int pitch, int) const;
static void errorDialog(int index);
private:
void unload();
struct TextFont {
TextFont() : data(0), bitmap(0), location(0), spacing(0), kerning(0), height(0), width(0), baseLine(0), firstChar(0), lastChar(0), modulo(0) {}
~TextFont() {
delete[] data;
}
uint16 height;
uint16 width;
uint16 baseLine;
uint8 firstChar;
uint8 lastChar;
uint16 modulo;
const uint8 *data;
const uint8 *bitmap;
const uint16 *location;
const int16 *spacing;
const int16 *kerning;
};
TextFont *loadContentFile(const Common::String fileName);
void selectMode(int mode);
struct FontContent {
FontContent() : height(0), style(0), flags(0) {}
~FontContent() {
data.reset();
}
Common::String contentFile;
Common::SharedPtr<TextFont> data;
uint16 height;
uint8 style;
uint8 flags;
};
int _width, _height;
uint8 _first, _last;
FontContent *_content;
uint16 _numElements;
uint16 _selectedElement;
const uint8 *_colorMap;
const uint16 _maxPathLen;
const bool _needsLocalizedFont;
static uint8 _errorDialogDisplayed;
Resource *_res;
};
/**
* SJIS Font variant used in EOB I PC-98. It converts 1-byte characters into 2-byte characters and has a specific shadowing to the left.
*/
class SJISFontEoB1PC98 : public SJISFont {
public:
SJISFontEoB1PC98(Common::SharedPtr<Graphics::FontSJIS> &font, uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2);
virtual ~SJISFontEoB1PC98() {}
virtual int getCharWidth(uint16 c) const;
virtual void drawChar(uint16 c, byte *dst, int pitch, int) const;
private:
uint16 convert(uint16 c) const;
const uint16 *_convTable1, *_convTable2;
bool _defaultConv;
uint8 _shadowColor;
};
/**
* OldDOSFont variant used in EOB I PC-98. It uses the same drawing routine, but has a different loader. It contains
* ASCII and Katakana characters and requires several conversion tables to display these. It gets drawn on the SJIS overlay.
*/
class Font12x12PC98 : public OldDOSFont{
public:
Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable);
virtual ~Font12x12PC98();
bool usesOverlay() const { return true; }
int getHeight() const { return _height >> 1; }
int getWidth() const { return _width >> 1; }
int getCharWidth(uint16 c) const { return _width >> 1; };
virtual bool load(Common::SeekableReadStream &file);
private:
virtual uint16 convert(uint16 c) const;
const uint16 *_convTable1, *_convTable2;
uint16 *_bmpOffs;
};
/**
* SJIS Font variant used in the intro and outro of EOB II FM-Towns. It appears twice as large, since it is not rendered on the hires overlay pages.
*/
class SJISFontLarge : public SJISFont {
public:

View File

@ -103,16 +103,19 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index) {
if (_currentControlMode == 0) {
int x2 = charPortraitPosX[index & 1];
int y2 = charPortraitPosY[index >> 1];
Screen::FontId cf = _screen->setFont(Screen::FID_6_FNT);
_screen->copyRegion(176, 168, x2 , y2, 64, 24, 2, 2, Screen::CR_NO_P_CHECK);
_screen->copyRegion(240, 168, x2, y2 + 24, 64, 26, 2, 2, Screen::CR_NO_P_CHECK);
int cp = _screen->setCurPage(2);
Screen::FontId cf = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_SMALL_FNT : Screen::FID_6_FNT);
if (index == _exchangeCharacterId)
_screen->printText(_characterGuiStringsSt[0], x2 + 2, y2 + 2, guiSettings()->colors.guiColorDarkRed, guiSettings()->colors.fill);
else
_screen->printText(c->name, x2 + 2, y2 + (_flags.platform == Common::kPlatformFMTowns ? 1 : 2), txtCol1, guiSettings()->colors.fill);
_screen->printText(c->name, x2 + 2, y2 + (_flags.platform == Common::kPlatformFMTowns ? 1 : 2), txtCol1, _flags.use16ColorMode ? 0 : guiSettings()->colors.fill);
_screen->setFont(Screen::FID_6_FNT);
gui_drawFaceShape(index);
gui_drawWeaponSlot(index, 0);
@ -139,16 +142,17 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index) {
_screen->copyRegion(176, 0, 0, 0, 144, 168, 2, 2, Screen::CR_NO_P_CHECK);
_screen->_curPage = 2;
gui_drawFaceShape(index);
Screen::FontId cf = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_SMALL_FNT : Screen::FID_6_FNT);
_screen->printShadedText(c->name, 219, 6, txtCol2, 0, guiSettings()->colors.guiColorBlack);
_screen->setFont(Screen::FID_6_FNT);
gui_drawHitpoints(index);
gui_drawFoodStatusGraph(index);
if (_currentControlMode == 1) {
Screen::FontId cf = _screen->setFont(Screen::FID_6_FNT);
int statusTxtY = 158;
if (_flags.platform == Common::kPlatformFMTowns) {
if (_flags.lang == Common::JA_JPN) {
statusTxtY = 157;
_screen->setFont(Screen::FID_8_FNT);
_screen->setFont(_flags.platform == Common::kPlatformFMTowns ? Screen::FID_8_FNT : Screen::FID_SJIS_FNT);
}
if (c->hitPointsCur == -10)
@ -164,12 +168,14 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index) {
else if (c->flags & 8)
_screen->printShadedText(_characterGuiStringsSt[6], 232, statusTxtY, guiSettings()->colors.guiColorLightRed, 0, guiSettings()->colors.guiColorBlack);
_screen->setFont(cf);
_screen->setFont(Screen::FID_6_FNT);
for (int i = 0; i < 27; i++)
gui_drawInventoryItem(i, 0, 2);
gui_drawInventoryItem(16, 1, 2);
_screen->setFont(cf);
} else {
static const uint16 cm2X1[] = { 179, 272, 301 };
static const uint16 cm2Y1[] = { 36, 51, 51 };
@ -179,6 +185,8 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index) {
for (int i = 0; i < 3; i++)
_screen->fillRect(cm2X1[i], cm2Y1[i], cm2X2[i], cm2Y2[i], guiSettings()->colors.sfill);
_screen->setFont(cf);
_screen->printShadedText(_characterGuiStringsIn[0], 183, 42, guiSettings()->colors.guiColorWhite, guiSettings()->colors.sfill, guiSettings()->colors.guiColorBlack);
_screen->printText(_chargenClassStrings[c->cClass], 183, 55, guiSettings()->colors.guiColorBlack, guiSettings()->colors.sfill);
_screen->printText(_chargenAlignmentStrings[c->alignment], 183, 62, guiSettings()->colors.guiColorBlack, guiSettings()->colors.sfill);
@ -521,8 +529,10 @@ void EoBCoreEngine::gui_drawInventoryItem(int slot, int redraw, int pageNum) {
_screen->fillRect(227, 65, 238, 69, guiSettings()->colors.guiColorBlack);
int cnt = countQueuedItems(_characters[_updateCharNum].inventory[slot], -1, -1, 1, 1);
x = cnt >= 10 ? 227 : 233;
Screen::FontId cf = _screen->setFont(Screen::FID_6_FNT);
Common::String str = Common::String::format("%d", cnt);
_screen->printText(str.c_str(), x, 65, guiSettings()->colors.guiColorWhite, 0);
_screen->setFont(cf);
}
}
@ -563,6 +573,8 @@ void EoBCoreEngine::gui_drawSpellbook() {
int numTab = (_flags.gameID == GI_EOB1) ? 5 : 6;
_screen->copyRegion(64, 121, 64, 121, 112, 56, 0, 2, Screen::CR_NO_P_CHECK);
Screen::FontId of = (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformPC98) ? _screen->setFont(Screen::FID_SJIS_SMALL_FNT) : _screen->_currentFont;
for (int i = 0; i < numTab; i++) {
int col1 = 0;
int col2 = 1;
@ -627,12 +639,15 @@ void EoBCoreEngine::gui_drawSpellbook() {
col5 = textCol1;
}
int textCol3 = _flags.use16ColorMode ? 0 : textCol2;
int textCol4 = _flags.use16ColorMode ? 0 : col3;
for (int i = 0; i < 7; i++) {
int d = _openBookAvailableSpells[_openBookSpellLevel * 10 + _openBookSpellListOffset + i];
if (_openBookSpellSelectedItem == i) {
if (d >= 0 && i < 6 && (i + _openBookSpellListOffset) < 9) {
_screen->fillRect(textXs, 132 + 6 * i, textXs + _screen->getTextWidth(_openBookSpellList[d]) - 1, 137 + 6 * i, textCol2);
_screen->printText(_openBookSpellList[d], textXs, 132 + 6 * i, textCol1, textCol2);
_screen->printText(_openBookSpellList[d], textXs, 132 + 6 * i, textCol1, textCol3);
} else if (i == 6) {
if (_flags.gameID == GI_EOB2)
_screen->fillRect(69, 169, 144, 175, textCol2);
@ -640,7 +655,7 @@ void EoBCoreEngine::gui_drawSpellbook() {
}
} else {
if (d >= 0 && i < 6 && (i + _openBookSpellListOffset) < 9)
_screen->printText(_openBookSpellList[d], textXs, 132 + 6 * i, textCol1, col3);
_screen->printText(_openBookSpellList[d], textXs, 132 + 6 * i, textCol1, textCol4);
else
_screen->printText(_magicStrings1[0], textXa, textY, col5, col4);
}
@ -658,6 +673,7 @@ void EoBCoreEngine::gui_drawSpellbook() {
if (_openBookAvailableSpells[_openBookSpellLevel * 10 + 6] <= 0)
_screen->drawShape(2, _blackBoxWideGrid, 146, 168, 0);
_screen->setFont(of);
_screen->setCurPage(0);
_screen->copyRegion(64, 121, 64, 121, 112, 56, 2, 0, Screen::CR_NO_P_CHECK);
if (!_loading)
@ -818,11 +834,12 @@ int EoBCoreEngine::clickedCamp(Button *button) {
_gui->runCampMenu();
_screen->fillRect(0, 0, 175, 143, 0, 2);
_screen->copyRegion(0, 0, 0, 120, 176, 24, 12, 2, Screen::CR_NO_P_CHECK);
_screen->setScreenDim(cd);
_thumbNail.free();
drawScene(0);
for (int i = 0; i < 6; i++)
@ -2067,7 +2084,7 @@ void GUI_EoB::simpleMenu_flashSelection(const char *str, int x, int y, int color
}
void GUI_EoB::runCampMenu() {
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
Button *highlightButton = 0;
Button *prevHighlightButton = 0;
@ -2233,9 +2250,9 @@ void GUI_EoB::runCampMenu() {
_vm->dropCharacter(selectCharacterDialogue(53));
_vm->gui_drawPlayField(false);
_screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK);
_screen->setFont(Screen::FID_6_FNT);
Screen::FontId cfn = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_vm->gui_drawAllCharPortraitsWithStats();
_screen->setFont(Screen::FID_8_FNT);
_screen->setFont(cfn);
} else {
displayTextBox(45);
}
@ -2349,7 +2366,7 @@ bool GUI_EoB::runLoadMenu(int x, int y, bool fromMainMenu) {
bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
int od = _screen->curDimIndex();
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
_screen->setScreenDim(dim);
drawTextBox(dim, id);
@ -2418,7 +2435,7 @@ bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) {
int od = _screen->curDimIndex();
_screen->setScreenDim(dim);
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
drawTextBox(dim, id);
const ScreenDim *dm = _screen->getScreenDim(dim);
@ -2554,7 +2571,7 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
_menuCur = -1;
printKatakanaOptions(0);
int bytesPerChar = (_vm->_flags.lang == Common::JA_JPN) ? 2 : 1;
int bytesPerChar = (_vm->_flags.platform == Common::kPlatformFMTowns) ? 2 : 1;
int in = 0;
do {
@ -2632,7 +2649,8 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
} else if ((in > 31 && in < 126) || (in == 0x89)) {
if (!(in == 32 && pos == 0)) {
if (in >= 97 && in <= 122)
// EOBI/PC-98 is the only version that allows small characters
if (in >= 97 && in <= 122 && !_vm->_flags.use16ColorMode)
in -= 32;
if (pos < len) {
@ -2999,6 +3017,8 @@ int GUI_EoB::selectSaveSlotDialogue(int x, int y, int id) {
_screen->printShadedText(title, 52, 5, col1, 0, _vm->guiSettings()->colors.guiColorBlack);
_screen->copyRegion(0, 0, x, y, 176, 144, 2, 0, Screen::CR_NO_P_CHECK);
_screen->fillRect(0, 0, 175, 143, 0, 2);
_screen->setCurPage(0);
_screen->updateScreen();
@ -3333,9 +3353,9 @@ void GUI_EoB::runMemorizePrayMenu(int charIndex, int spellType) {
releaseButtons(buttonList);
updateBoxFrameHighLight(-1);
_screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
_vm->gui_drawCharPortraitWithStats(charIndex);
_screen->setFont(Screen::FID_8_FNT);
_screen->setFont(of);
memset(charSpellList, 0, 80);
if (spellType && _vm->game() == GI_EOB2)
@ -3378,7 +3398,6 @@ void GUI_EoB::runMemorizePrayMenu(int charIndex, int spellType) {
delete[] lh;
}
void GUI_EoB::scribeScrollDialogue() {
int16 *scrollInvSlot = new int16[32];
int16 *scrollCharacter = new int16[32];
@ -3560,7 +3579,7 @@ bool GUI_EoB::restParty() {
}
_screen->setClearScreenDim(7);
_screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
restParty_updateRestTime(hours, true);
@ -3708,7 +3727,6 @@ bool GUI_EoB::restParty() {
if (_vm->_characters[i].food) {
if (_vm->_characters[i].hitPointsCur < _vm->_characters[i].hitPointsMax) {
_vm->_characters[i].hitPointsCur++;
_screen->setFont(Screen::FID_6_FNT);
_vm->gui_drawCharPortraitWithStats(i);
}
@ -3725,7 +3743,6 @@ bool GUI_EoB::restParty() {
continue;
_vm->inflictCharacterDamage(i, 1);
starving = true;
_screen->setFont(Screen::FID_6_FNT);
_vm->gui_drawCharPortraitWithStats(i);
}
}
@ -3771,7 +3788,7 @@ bool GUI_EoB::restParty() {
_vm->removeInputTop();
_screen->setScreenDim(4);
_screen->setFont(Screen::FID_8_FNT);
_screen->setFont(of);
if (!res) {
if (!injured)
@ -3785,7 +3802,7 @@ bool GUI_EoB::restParty() {
bool GUI_EoB::confirmDialogue(int id) {
int od = _screen->curDimIndex();
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
Button *buttonList = initMenu(5);
@ -3899,7 +3916,7 @@ int GUI_EoB::selectCharacterDialogue(int id) {
_screen->drawShape(0, _vm->_blackBoxSmallGrid, selX[i] + 48, selY[i], 0);
_charSelectRedraw = true;
}
_screen->updateScreen();
if (count == 1) {
int l = _vm->getCharacterLevelIndex(4, _vm->_characters[result].cClass);
@ -3925,7 +3942,7 @@ int GUI_EoB::selectCharacterDialogue(int id) {
}
}
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
while (result == -2 && !_vm->shouldQuit()) {
int inputFlag = _vm->checkInput(buttonList, false, 0);
@ -3958,13 +3975,13 @@ int GUI_EoB::selectCharacterDialogue(int id) {
result = hlCur;
} else if (inputFlag == _vm->_keyMap[Common::KEYCODE_ESCAPE] || inputFlag == 0x8010) {
_screen->setFont(Screen::FID_8_FNT);
_screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
drawMenuButton(buttonList, true, true, true);
_screen->updateScreen();
_vm->_system->delayMillis(80);
drawMenuButton(buttonList, false, false, true);
_screen->updateScreen();
_screen->setFont(Screen::FID_6_FNT);
_screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
result = -1;
} else if (inputFlag > 0x8010 && inputFlag < 0x8017) {
@ -3978,7 +3995,7 @@ int GUI_EoB::selectCharacterDialogue(int id) {
if (hlCur >= 0)
_vm->gui_drawCharPortraitWithStats(hlCur);
_screen->setFont(Screen::FID_8_FNT);
_screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
if (result != -1 && id != 53) {
if (flags & 4) {
@ -4006,12 +4023,14 @@ int GUI_EoB::selectCharacterDialogue(int id) {
void GUI_EoB::displayTextBox(int id) {
int op = _screen->setCurPage(2);
int od = _screen->curDimIndex();
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
_screen->setClearScreenDim(11);
const ScreenDim *dm = _screen->getScreenDim(11);
drawMenuButtonBox(dm->sx << 3, dm->sy, dm->w << 3, dm->h, false, false);
_screen->setTextMarginRight((dm->sx + dm->w) << 3);
_screen->printShadedText(getMenuString(id), (dm->sx << 3) + 5, dm->sy + 5, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
_screen->setTextMarginRight(Screen::SCREEN_W);
_screen->copyRegion(dm->sx << 3, dm->sy, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 2, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
@ -4037,10 +4056,12 @@ Button *GUI_EoB::initMenu(int id) {
const ScreenDim *dm = _screen->getScreenDim(m->dim);
_screen->fillRect(dm->sx << 3, dm->sy, ((dm->sx + dm->w) << 3) - 1, (dm->sy + dm->h) - 1, _vm->guiSettings()->colors.fill);
_screen->setScreenDim(m->dim);
_screen->setTextMarginRight((dm->sx + dm->w) << 3);
drawMenuButtonBox(dm->sx << 3, dm->sy, dm->w << 3, dm->h, false, false);
}
_screen->printShadedText(getMenuString(m->titleStrId), 5, 5, m->titleCol, 0, _vm->guiSettings()->colors.guiColorBlack);
_screen->setTextMarginRight(Screen::SCREEN_W);
Button *buttons = 0;
for (int i = 0; i < m->numButtons; i++) {
@ -4123,7 +4144,7 @@ void GUI_EoB::drawTextBox(int dim, int id) {
int od = _screen->curDimIndex();
_screen->setScreenDim(dim);
const ScreenDim *dm = _screen->getScreenDim(dim);
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
if (dm->w <= 22 && dm->h <= 84)
_screen->copyRegion(dm->sx << 3, dm->sy, 0, dm->h, dm->w << 3, dm->h, 0, 2, Screen::CR_NO_P_CHECK);
@ -4179,7 +4200,7 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
if (spellId) {
Common::String s;
if (_vm->_flags.platform == Common::kPlatformFMTowns) {
if (_vm->_flags.lang == Common::JA_JPN) {
s = spellType ? _vm->_clericSpellList[spellId] : _vm->_mageSpellList[spellId];
for (int i = s.size() >> 1; i < 17; ++i)
s.insertChar(' ', s.size());
@ -4327,7 +4348,7 @@ void GUI_EoB::sortSaveSlots() {
}
void GUI_EoB::restParty_updateRestTime(int hours, bool init) {
Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
Screen::FontId of = _screen->setFont(_vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
int od = _screen->curDimIndex();
_screen->setScreenDim(10);

View File

@ -280,7 +280,7 @@ Common::Error EoBCoreEngine::loadGameState(int slot) {
_screen->setScreenPalette(_screen->getPalette(0));
_sceneUpdateRequired = true;
_screen->setFont(Screen::FID_6_FNT);
_screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
for (int i = 0; i < 6; i++) {
for (int ii = 0; ii < 10; ii++) {

View File

@ -1326,22 +1326,27 @@ void EoBEngine::initSpells() {
}
const KyraRpgGUISettings EoBEngine::_guiSettingsVGA = {
{ 9, 15, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 9, 15, 95, 9, 2, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 135, 130, 132, 180, 133, 17, 23, 20, 184, 177, 180, 184, 177, 180, 15, 6, 8, 9, 2, 5, 4, 3, 12 }
};
const KyraRpgGUISettings EoBEngine::_guiSettingsEGA = {
{ 9, 15, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 9, 15, 95, 9, 2, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 13, 9, 2, 14, 2, 6, 13, 8, 13, 15, 14, 13, 15, 14, 15, 6, 8, 9, 2, 5, 4, 3, 12 }
};
const KyraRpgGUISettings EoBEngine::_guiSettingsPC98 = {
{ 9, 15, 95, 11, 1, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 13, 9, 2, 14, 2, 6, 13, 8, 13, 15, 14, 13, 15, 14, 15, 6, 8, 9, 2, 5, 4, 3, 12 }
};
const KyraRpgGUISettings EoBEngine::_guiSettingsAmiga = {
{ 28, 31, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 28, 31, 95, 9, 2, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 18, 17, 10, 17, 11, 24, 22, 25, 18, 9, 10, 18, 9, 10, 31, 24, 25, 28, 29, 7, 26, 27, 19 }
};
const KyraRpgGUISettings EoBEngine::_guiSettingsAmigaMainMenu = {
{ 28, 31, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 28, 31, 95, 9, 2, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
{ 22, 28, 30, 17, 11, 24, 22, 25, 18, 9, 10, 18, 9, 10, 31, 24, 25, 28, 29, 7, 26, 27, 19 }
};
@ -1491,17 +1496,17 @@ void DarkMoonEngine::initSpells() {
}
const KyraRpgGUISettings DarkMoonEngine::_guiSettingsFMTowns = {
{ 9, 15, 95, 11, 7, { 221, 76 }, { 187, 162 }, { 95, 95 } },
{ 9, 15, 95, 11, 1, 7, { 221, 76 }, { 187, 162 }, { 95, 95 } },
{ 186, 181, 183, 183, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180, 15, 6, 8, 9, 2, 5, 4, 3, 12 }
};
const KyraRpgGUISettings DarkMoonEngine::_guiSettingsDOS = {
{ 9, 15, 95, 9, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
{ 9, 15, 95, 9, 2, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
{ 186, 181, 183, 183, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180, 15, 6, 8, 9, 2, 5, 4, 3, 12 }
};
const KyraRpgGUISettings DarkMoonEngine::_guiSettingsAmiga = {
{ 28, 31, 95, 9, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
{ 28, 31, 95, 9, 2, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
{ 18, 17, 10, 17, 11, 10, 12, 25, 18, 9, 10, 18, 9, 10, 31, 24, 25, 28, 29, 7, 26, 27, 19 }
};

View File

@ -778,7 +778,7 @@ const int8 LoLEngine::_mapCoords[12][4] = {
};
const KyraRpgGUISettings LoLEngine::_guiSettings = {
{ 144, 254, 74, 9, 80, { 0, 0 }, { 0, 0 }, { 0, 0 } },
{ 144, 254, 74, 9, 2, 80, { 0, 0 }, { 0, 0 }, { 0, 0 } },
{ 136, 251, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

View File

@ -36,7 +36,8 @@ enum {
TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(engine), _screen(scr),
_lineCount(0), _printFlag(false), _lineWidth(0), _numCharsTotal(0), _allowPageBreak(true),
_numCharsLeft(0), _numCharsPrinted(0), _sjisTextModeLineBreak(false), _waitButtonMode(1),
_pc98TextMode(engine->gameFlags().use16ColorMode && engine->game() == GI_LOL) {
_pc98TextMode(engine->gameFlags().use16ColorMode && engine->game() == GI_LOL),
_waitButtonFont(Screen::FID_6_FNT) {
static const uint8 amigaColorMap[16] = {
0x00, 0x06, 0x1d, 0x1b, 0x1a, 0x17, 0x18, 0x0e, 0x19, 0x1c, 0x1c, 0x1e, 0x13, 0x0a, 0x11, 0x1f
@ -48,6 +49,13 @@ TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(e
_currentLine = new char[85];
memset(_currentLine, 0, 85);
if (_pc98TextMode)
_waitButtonFont = Screen::FID_SJIS_TEXTMODE_FNT;
else if ((_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns))
_waitButtonFont = Screen::FID_8_FNT;
else if ((_vm->game() == GI_EOB1 && _vm->gameFlags().platform == Common::kPlatformPC98))
_waitButtonFont = Screen::FID_SJIS_FNT;
_textDimData = new TextDimData[_screen->screenDimTableCount()];
for (int i = 0; i < 256; ++i)
@ -140,7 +148,7 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
int sdx = _screen->curDimIndex();
bool sjisTextMode = (_pc98TextMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false;
int sjisOffs = (sjisTextMode || _vm->game() == GI_EOB2) ? 8 : 9;
int sjisOffs = (sjisTextMode || _vm->game() != GI_LOL) ? 8 : 9;
Screen::FontId of = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) ? _screen->setFont(Screen::FID_8_FNT) : _screen->_currentFont;
uint16 charsPerLine = (sd->w << 3) / (_screen->getFontWidth() + _screen->_charWidth);
@ -174,6 +182,8 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
_currentLine[_numCharsLeft] = '\0';
_lineWidth += sjisOffs;
if (_vm->game() == GI_EOB1 && ((sd->w << 3) - sjisOffs) <= (_textDimData[sdx].column + _lineWidth))
printLine(_currentLine);
c = parseCommand();
continue;
}
@ -218,6 +228,7 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
_sjisTextModeLineBreak = true;
printLine(_currentLine);
_sjisTextModeLineBreak = false;
//_lineWidth = 0;
_lineCount++;
_textDimData[sdx].column = 0;
_textDimData[sdx].line++;
@ -309,7 +320,8 @@ void TextDisplayer_rpg::readNextPara() {
void TextDisplayer_rpg::printLine(char *str) {
const ScreenDim *sd = _screen->_curDim;
int sdx = _screen->curDimIndex();
bool sjisTextMode = _vm->gameFlags().lang == Common::JA_JPN && (_vm->gameFlags().use16ColorMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false;
bool sjisTextMode = _pc98TextMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15) ? true : false;
int sjisOffs = (sjisTextMode || _vm->game() != GI_LOL) ? 8 : 9;
int fh = (_screen->_currentFont == Screen::FID_SJIS_TEXTMODE_FNT) ? 9 : (_screen->getFontHeight() + _screen->_charOffset);
int lines = (sd->h - _screen->_charOffset) / fh;
@ -379,7 +391,7 @@ void TextDisplayer_rpg::printLine(char *str) {
for (int i = 0; i < s; ++i) {
uint8 cu = (uint8) str[i];
if (cu >= 0xE0 || (cu > 0x80 && cu < 0xA0))
twoByteCharOffs = 8;
twoByteCharOffs = (_vm->game() == GI_EOB1) ? 16 : 8;
}
}
@ -401,7 +413,7 @@ void TextDisplayer_rpg::printLine(char *str) {
for (strPos = 0; strPos < s; ++strPos) {
uint8 cu = (uint8) str[strPos];
if (cu >= 0xE0 || (cu > 0x80 && cu < 0xA0)) {
lw += 9;
lw += sjisOffs;
strPos++;
} else {
lw += _screen->getCharWidth((uint8)c);
@ -585,7 +597,7 @@ int TextDisplayer_rpg::clearDim(int dim) {
void TextDisplayer_rpg::clearCurDim() {
int d = _screen->curDimIndex();
const ScreenDim *tmp = _screen->getScreenDim(d);
if (_vm->gameFlags().use16ColorMode) {
if (_pc98TextMode) {
_screen->fillRect(tmp->sx << 3, tmp->sy, ((tmp->sx + tmp->w) << 3) - 2, (tmp->sy + tmp->h) - 2, _textDimData[d].color2);
} else
_screen->fillRect(tmp->sx << 3, tmp->sy, ((tmp->sx + tmp->w) << 3) - 1, (tmp->sy + tmp->h) - 1, _textDimData[d].color2);
@ -599,7 +611,7 @@ void TextDisplayer_rpg::textPageBreak() {
SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2);
int cp = _screen->setCurPage(0);
Screen::FontId cf = _screen->setFont(_pc98TextMode ? Screen::FID_SJIS_TEXTMODE_FNT : ((_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) ? Screen::FID_8_FNT : Screen::FID_6_FNT));
Screen::FontId cf = _screen->setFont(_waitButtonFont);
if (_vm->game() == GI_LOL)
_vm->_timer->pauseSingleTimer(11, true);
@ -643,15 +655,14 @@ void TextDisplayer_rpg::textPageBreak() {
w = _vm->guiSettings()->buttons.waitWidth[_waitButtonMode];
}
if (_vm->gameFlags().use16ColorMode) {
if (_vm->game() == GI_LOL && _vm->gameFlags().use16ColorMode) {
_vm->gui_drawBox(x + 8, (y & ~7) - 1, 66, 10, 0xEE, 0xCC, -1);
_screen->printText(_pageBreakString, (x + 37 - (strlen(_pageBreakString) << 1) + 4) & ~3, (y + 2) & ~7, 0xC1, 0);
} else {
int yOffs = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) ? 1 : 2;
_screen->set16bitShadingLevel(4);
_vm->gui_drawBox(x, y, w, _vm->guiSettings()->buttons.height, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
_screen->printText(_pageBreakString, x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString) >> 1), y + yOffs, _vm->_dialogueButtonLabelColor1, 0);
_screen->printText(_pageBreakString, x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString) >> 1), y + _vm->guiSettings()->buttons.txtOffsY, _vm->_dialogueButtonLabelColor1, 0);
}
_vm->removeInputTop();
@ -696,7 +707,7 @@ void TextDisplayer_rpg::textPageBreak() {
} while (loop && !_vm->shouldQuit());
_screen->set16bitShadingLevel(4);
if (_vm->gameFlags().use16ColorMode)
if (_vm->game() == GI_LOL && _vm->gameFlags().use16ColorMode)
_screen->fillRect(x + 8, y, x + 57, y + 9, _textDimData[_screen->curDimIndex()].color2);
else
_screen->fillRect(x, y, x + w - 1, y + _vm->guiSettings()->buttons.height - 1, _textDimData[_screen->curDimIndex()].color2);

View File

@ -26,10 +26,10 @@
#define KYRA_TEXT_EOB_H
#include "common/scummsys.h"
#include "kyra/graphics/screen.h"
namespace Kyra {
class Screen;
class KyraRpgEngine;
class TextDisplayer_rpg {
@ -111,6 +111,8 @@ private:
char *_table1;
char *_table2;
Screen::FontId _waitButtonFont;
uint8 _colorMap[256];
};