diff options
author | Max Horn | 2002-12-25 21:04:47 +0000 |
---|---|---|
committer | Max Horn | 2002-12-25 21:04:47 +0000 |
commit | fca9ec09e7709ff4400d2a9a7fd76f4f21781006 (patch) | |
tree | 2c9dd18841983469c4780c75d90762f8a167c048 /scumm | |
parent | f1808d20ac90f4212fd14aeaf544a8aaac6a3fbc (diff) | |
download | scummvm-rg350-fca9ec09e7709ff4400d2a9a7fd76f4f21781006.tar.gz scummvm-rg350-fca9ec09e7709ff4400d2a9a7fd76f4f21781006.tar.bz2 scummvm-rg350-fca9ec09e7709ff4400d2a9a7fd76f4f21781006.zip |
moved CharsetRendere into its own header/source file; changed Scumm::_charset into a pointer, to make it possible to use different implementations of it
svn-id: r6147
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/actor.cpp | 7 | ||||
-rw-r--r-- | scumm/actor.h | 6 | ||||
-rw-r--r-- | scumm/charset.cpp | 386 | ||||
-rw-r--r-- | scumm/charset.h | 82 | ||||
-rw-r--r-- | scumm/gfx.cpp | 22 | ||||
-rw-r--r-- | scumm/module.mk | 1 | ||||
-rw-r--r-- | scumm/saveload.cpp | 19 | ||||
-rw-r--r-- | scumm/script_v5.cpp | 3 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 7 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 3 | ||||
-rw-r--r-- | scumm/scumm.h | 57 | ||||
-rw-r--r-- | scumm/scummvm.cpp | 8 | ||||
-rw-r--r-- | scumm/string.cpp | 619 | ||||
-rw-r--r-- | scumm/verbs.cpp | 25 |
14 files changed, 656 insertions, 589 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp index 54f5e0f613..0422f11b73 100644 --- a/scumm/actor.cpp +++ b/scumm/actor.cpp @@ -24,6 +24,7 @@ #include "scumm.h" #include "actor.h" #include "akos.h" +#include "charset.h" #include "costume.h" #include "resource.h" #include "scumm/sound.h" @@ -1095,9 +1096,9 @@ void Scumm::actorTalk() int oldact; Actor *a; - _msgPtrToAdd = _charset._buffer; + _msgPtrToAdd = _charset->_buffer; _messagePtr = addMessageToStack(_messagePtr); - assert((int)(_msgPtrToAdd - _charset._buffer) < (int)(sizeof(_charset._buffer))); + assert((int)(_msgPtrToAdd - _charset->_buffer) < (int)(sizeof(_charset->_buffer))); if (_actorToPrintStrFor == 0xFF) { if (!_keepText) @@ -1128,7 +1129,7 @@ void Scumm::actorTalk() a = derefActorSafe(_vars[VAR_TALK_ACTOR], "actorTalk(2)"); _charsetColor = a->talkColor; } - _charset._bufPos = 0; + _charset->_bufPos = 0; _talkDelay = 0; _haveMsg = 0xFF; _vars[VAR_HAVE_MSG] = 0xFF; diff --git a/scumm/actor.h b/scumm/actor.h index 3aad3e4300..f1e993f863 100644 --- a/scumm/actor.h +++ b/scumm/actor.h @@ -24,10 +24,9 @@ #ifndef ACTOR_H #define ACTOR_H -#include <string.h> -#include "scummsys.h" +#include "common/scummsys.h" -class Scumm; +#include "scumm.h" enum MoveFlags { MF_NEW_LEG = 1, @@ -158,6 +157,7 @@ public: bool isInCurrentRoom() { return room == _vm->_currentRoom; } + int getRoom() { return room; } diff --git a/scumm/charset.cpp b/scumm/charset.cpp new file mode 100644 index 0000000000..0ae52733a4 --- /dev/null +++ b/scumm/charset.cpp @@ -0,0 +1,386 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001/2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + */ + +#include "stdafx.h" +#include "charset.h" +#include "scumm.h" + +void CharsetRenderer::setCurID(byte id) { + _curId = id; + _fontPtr = getFontPtr(id); +} + +byte *CharsetRenderer::getFontPtr(byte id) +{ + byte *ptr = _vm->getResourceAddress(rtCharset, id); + assert(ptr); + if (_vm->_features & GF_SMALL_HEADER) + ptr += 17; + else + ptr += 29; + return ptr; +} + +// do spacing for variable width old-style font +int CharsetRenderer::getSpacing(byte chr, byte *charset) +{ + int spacing = 0; + + if (_vm->_features & GF_OLD256) { + spacing = *(charset - 11 + chr); + } else { + int offs = READ_LE_UINT32(charset + chr * 4 + 4); + if (offs) { + spacing = charset[offs]; + if (charset[offs + 2] >= 0x80) { + spacing += charset[offs + 2] - 0x100; + } else { + spacing += charset[offs + 2]; + } + } + } + + // FIXME - this fixes the inventory icons in Zak256/Indy3 + // see bug #613109. + // chars 1,2: up arrow chars 3,4: down arrow + if ((_vm->_gameId == GID_ZAK256 || _vm->_gameId == GID_INDY3_256) + && (chr >= 1 && chr <= 4)) + spacing = 6; + + return spacing; +} + +int CharsetRenderer::getStringWidth(int arg, byte *text, int pos) +{ + byte *ptr; + int width; + byte chr; + + width = 1; + ptr = _fontPtr; + + while ((chr = text[pos++]) != 0) { + if (chr == 0xD) + break; + if (chr == '@') + continue; + if (chr == 254 || chr == 255) { + chr = text[pos++]; + if (chr == 3) // 'WAIT' + break; + if (chr == 8) { // 'Verb on next line' + if (arg == 1) + break; + while (text[pos] == ' ') + text[pos++] = '@'; + continue; + } + if (chr == 10 || chr == 21 || chr == 12 || chr == 13) { + pos += 2; + continue; + } + if (chr == 9 || chr == 1 || chr == 2) // 'Newline' + break; + if (chr == 14) { + int set = text[pos] | (text[pos + 1] << 8); + pos += 2; + ptr = getFontPtr(set); + continue; + } + } + width += getSpacing(chr, ptr); + } + + return width; +} + +void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth) +{ + int lastspace = -1; + int curw = 1; + byte *ptr; + byte chr; + + ptr = _fontPtr; + + while ((chr = str[pos++]) != 0) { + if (chr == '@') + continue; + if (chr == 254) + chr = 255; + if (chr == 255) { + chr = str[pos++]; + if (chr == 3) // 'Wait' + break; + if (chr == 8) { // 'Verb on next line' + if (a == 1) { + curw = 1; + } else { + while (str[pos] == ' ') + str[pos++] = '@'; + } + continue; + } + if (chr == 10 || chr == 21 || chr == 12 || chr == 13) { + pos += 2; + continue; + } + if (chr == 1) { // 'Newline' + curw = 1; + continue; + } + if (chr == 2) // 'Don't terminate with \n' + break; + if (chr == 14) { + int set = str[pos] | (str[pos + 1] << 8); + pos += 2; + ptr = getFontPtr(set); + continue; + } + } + + if (chr == ' ') + lastspace = pos - 1; + + curw += getSpacing(chr, ptr); + if (lastspace == -1) + continue; + if (curw > maxwidth) { + str[lastspace] = 0xD; + curw = 1; + pos = lastspace + 1; + lastspace = -1; + } + } +} + + +void CharsetRenderer::printCharOld(int chr) +{ // Indy3 / Zak256 + VirtScreen *vs; + byte *char_ptr, *dest_ptr; + unsigned int buffer = 0, mask = 0, x = 0, y = 0; + unsigned char color; + + _vm->checkRange(_vm->_maxCharsets - 1, 0, _curId, "Printing with bad charset %d"); + + if ((vs = _vm->findVirtScreen(_top)) == NULL) + return; + + if (chr == '@') + return; + + if (_firstChar) { + _strLeft = _left; + _strTop = _top; + _strRight = _left; + _strBottom = _top; + _firstChar = false; + } + char_ptr = _fontPtr + 207 + (chr + 1) * 8; + dest_ptr = vs->screenPtr + vs->xstart + (_top - vs->topline) * _vm->_realWidth + _left; + _vm->updateDirtyRect(vs->number, _left, _left + 8, _top - vs->topline, _top - vs->topline + 8, 0); + + for (y = 0; y < 8; y++) { + for (x = 0; x < 8; x++) { + if ((mask >>= 1) == 0) { + buffer = *char_ptr++; + mask = 0x80; + } + color = ((buffer & mask) != 0); + if (color) + *(dest_ptr + y * _vm->_realWidth + x) = _color; + } + } + + // FIXME + _left += getSpacing(chr, _fontPtr); + + if (_left > _strRight) + _strRight = _left; + + if (_top + 8 > _strBottom) + _strBottom = _top + 8; + +} + + +void CharsetRenderer::printChar(int chr) +{ + int width, height; + int d; + VirtScreen *vs; + + _vm->checkRange(_vm->_maxCharsets - 1, 1, _curId, "Printing with bad charset %d"); + + if ((vs = _vm->findVirtScreen(_top)) == NULL) + return; + + if (chr == '@') + return; + + _bpp = *_fontPtr; + _colorMap[1] = _color; + + _charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4); + + if (!_charOffs) + return; + + assert(_charOffs < 0x10000); + + _charPtr = _fontPtr + _charOffs; + + width = _charPtr[0]; + height = _charPtr[1]; + if (_firstChar) { + _strLeft = 0; + _strTop = 0; + _strRight = 0; + _strBottom = 0; + } + + if (_disableOffsX) { + _offsX = 0; + } else { + d = _charPtr[2]; + if (d >= 0x80) + d -= 0x100; + _offsX = d; + } + + d = _charPtr[3]; + if (d >= 0x80) + d -= 0x100; + _offsY = d; + + _top += _offsY; + _left += _offsX; + + if (_left + width > _right + 1 || _left < 0) { + _left += width; + _top -= _offsY; + return; + } + + _disableOffsX = false; + + if (_firstChar) { + _strLeft = _left; + _strTop = _top; + _strRight = _left; + _strBottom = _top; + _firstChar = false; + } + + if (_left < _strLeft) + _strLeft = _left; + + if (_top < _strTop) + _strTop = _top; + + int drawTop = _top - vs->topline; + if (drawTop < 0) + drawTop = 0; + int bottom = drawTop + height + _offsY; + + _vm->updateDirtyRect(vs->number, _left, _left + width, drawTop, bottom, 0); + + if (vs->number != 0) + _blitAlso = false; + if (vs->number == 0 && !_blitAlso) + _hasMask = true; + + _charPtr += 4; + + byte *mask = _vm->getResourceAddress(rtBuffer, 9) + + drawTop * _vm->gdi._numStrips + _left / 8 + _vm->_screenStartStrip; + + byte *dst = vs->screenPtr + vs->xstart + drawTop * _vm->_realWidth + _left; + + if (_blitAlso) { + byte *back = dst; + dst = _vm->getResourceAddress(rtBuffer, vs->number + 5) + + vs->xstart + drawTop * _vm->_realWidth + _left; + + drawBits(vs, dst, mask, drawTop, width, height); + + _vm->blit(back, dst, width, height); + } else { + drawBits(vs, dst, mask, drawTop, width, height); + } + + _left += width; + if (_left > _strRight) + _strRight = _left; + + if (_top + height > _strBottom) + _strBottom = _top + height; + + _top -= _offsY; +} + +void CharsetRenderer::drawBits(VirtScreen *vs, byte *dst, byte *mask, int drawTop, int width, int height) +{ + byte maskmask; + int y, x; + int maskpos; + int color; + byte numbits, bits; + bool useMask = (vs->number == 0 && !_ignoreCharsetMask); + + bits = *_charPtr++; + numbits = 8; + + y = 0; + + for (y = 0; y < height && y + drawTop < vs->height; y++) { + maskmask = revBitMask[_left & 7]; + maskpos = 0; + + for (x = 0; x < width; x++) { + int myMask = (0xFF << (8 - _bpp)) & 0xFF; + int myColor = (bits & myMask) >> (8 - _bpp); + color = (bits >> (8 - _bpp)) & 0xFF; + assert(color == myColor); + + if (color) { + if (useMask) { + mask[maskpos] |= maskmask; + } + *dst = _colorMap[color]; + } + dst++; + bits <<= _bpp; + numbits -= _bpp; + if (numbits == 0) { + bits = *_charPtr++; + numbits = 8; + } + maskmask >>= 1; + if (maskmask == 0) { + maskmask = 0x80; + maskpos++; + } + } + dst += _vm->_realWidth - width; + mask += _vm->gdi._numStrips; + } +} diff --git a/scumm/charset.h b/scumm/charset.h new file mode 100644 index 0000000000..9bd786da63 --- /dev/null +++ b/scumm/charset.h @@ -0,0 +1,82 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001/2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + */ + +#ifndef CHARSET_H +#define CHARSET_H + +#include "common/scummsys.h" + +class Scumm; +struct VirtScreen; + +class CharsetRenderer { +public: + int _strLeft, _strRight, _strTop, _strBottom; + int _nextLeft, _nextTop; + + int _top; + int _left, _startLeft; + byte _center; + int _right; + byte _color; + bool _hasMask; + bool _blitAlso; + + int _bufPos; + bool _firstChar; + bool _disableOffsX; + + bool _ignoreCharsetMask; + + byte _colorMap[16]; + byte _buffer[512]; // TODO - would be really nice to get rid of this + +protected: + Scumm *_vm; + + byte _curId; + byte *_fontPtr; + + byte _bpp; + uint32 _charOffs; + byte *_charPtr; + int _offsX, _offsY; + + void drawBits(VirtScreen *vs, byte *dst, byte *mask, int drawTop, int width, int height); + +public: + + CharsetRenderer(Scumm *vm) : _vm(vm) {} + + void printChar(int chr); + void printCharOld(int chr); + int getSpacing(byte chr, byte *charset); + int getStringWidth(int a, byte *str, int pos); + void addLinebreaks(int a, byte *str, int pos, int maxwidth); + + void setCurID(byte id); + int getCurID() { return _curId; } + + byte *getFontPtr() { return _fontPtr; } + byte *getFontPtr(byte id); +}; + + +#endif diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp index 075aee2760..02cd689ee8 100644 --- a/scumm/gfx.cpp +++ b/scumm/gfx.cpp @@ -22,7 +22,7 @@ #include "stdafx.h" #include "scumm.h" #include "actor.h" -#include "gui/newgui.h" +#include "charset.h" #include "resource.h" #include "util.h" @@ -337,7 +337,7 @@ void Scumm::drawDirtyScreenParts() } /* Handle shaking */ - if (_shakeEnabled && !_newgui->isActive()) { + if (_shakeEnabled) { _shakeFrame = (_shakeFrame + 1) & (NUM_SHAKE_POSITIONS - 1); _system->set_shake_pos(shake_positions[_shakeFrame]); } else if (!_shakeEnabled &&_shakeFrame != 0) { @@ -613,7 +613,7 @@ void Scumm::redrawBGAreas() int diff; if (!(_features & GF_AFTER_V7)) - if (camera._cur.x != camera._last.x && _charset._hasMask) + if (camera._cur.x != camera._last.x && _charset->_hasMask) stopTalk(); val = 0; @@ -675,14 +675,14 @@ void Scumm::restoreCharsetBg() { if (gdi._mask_left != -1) { restoreBG(gdi._mask_left, gdi._mask_top, gdi._mask_right, gdi._mask_bottom); - _charset._hasMask = false; + _charset->_hasMask = false; gdi._mask_left = -1; - _charset._strLeft = -1; - _charset._left = -1; + _charset->_strLeft = -1; + _charset->_left = -1; } - _charset._nextLeft = _string[0].xpos; - _charset._nextTop = _string[0].ypos; + _charset->_nextLeft = _string[0].xpos; + _charset->_nextTop = _string[0].ypos; } void Scumm::restoreBG(int left, int top, int right, int bottom, byte backColor) @@ -725,7 +725,7 @@ void Scumm::restoreBG(int left, int top, int right, int bottom, byte backColor) if (vs->alloctwobuffers && _currentRoom != 0 /*&& _vars[VAR_V5_DRAWFLAGS]&2 */ ) { blit(backbuff, bgbak, width, height); - if (vs->number == 0 && _charset._hasMask && height) { + if (vs->number == 0 && _charset->_hasMask && height) { byte *mask; int mask_width = (width >> 3); @@ -751,7 +751,7 @@ void Scumm::restoreBG(int left, int top, int right, int bottom, byte backColor) int Scumm::hasCharsetMask(int x, int y, int x2, int y2) { - if (!_charset._hasMask || y > gdi._mask_bottom || x > gdi._mask_right || + if (!_charset->_hasMask || y > gdi._mask_bottom || x > gdi._mask_right || y2 < gdi._mask_top || x2 < gdi._mask_left) return 0; return 1; @@ -1737,7 +1737,7 @@ void Scumm::setCameraAt(int pos_x, int pos_y) runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0); } - if (camera._cur.x != camera._last.x && _charset._hasMask) + if (camera._cur.x != camera._last.x && _charset->_hasMask) stopTalk(); } } diff --git a/scumm/module.mk b/scumm/module.mk index 1f74deb23a..e0018eea24 100644 --- a/scumm/module.mk +++ b/scumm/module.mk @@ -5,6 +5,7 @@ SCUMM_OBJS = \ scumm/akos.o \ scumm/boxes.o \ scumm/bundle.o \ + scumm/charset.o \ scumm/costume.o \ scumm/debugger.o \ scumm/dialogs.o \ diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp index cc8c21dde6..965ea2958f 100644 --- a/scumm/saveload.cpp +++ b/scumm/saveload.cpp @@ -21,15 +21,16 @@ */ #include "stdafx.h" -#include "scumm.h" -#include "sound/mididrv.h" -#include "scumm/sound.h" -#include "scumm/imuse.h" #include "actor.h" -#include "config-file.h" +#include "charset.h" +#include "imuse.h" #include "resource.h" #include "saveload.h" +#include "scumm.h" +#include "sound.h" #include "verbs.h" +#include "common/config-file.h" +#include "sound/mididrv.h" struct SaveGameHeader { uint32 type; @@ -358,7 +359,7 @@ void Scumm::saveOrLoad(Serializer *s, uint32 savegameVersion) MKARRAY(Scumm, vm.localvar[0][0], sleUint16, NUM_SCRIPT_SLOT * 17, VER_V9), MKARRAY(Scumm, _resourceMapper[0], sleByte, 128, VER_V8), - MKARRAY(Scumm, _charset._colorMap[0], sleByte, 16, VER_V8), + MKARRAY(Scumm, _charset->_colorMap[0], sleByte, 16, VER_V8), // _charsetData grew from 10*16 to 15*16 bytes MKARRAY_OLD(Scumm, _charsetData[0][0], sleByte, 10 * 16, VER_V8, VER_V9), @@ -386,8 +387,8 @@ void Scumm::saveOrLoad(Serializer *s, uint32 savegameVersion) MKLINE(Scumm, _charsetColor, sleByte, VER_V8), // charset._bufPos was changed from byte to int - MKLINE_OLD(Scumm, _charset._bufPos, sleByte, VER_V8, VER_V9), - MKLINE(Scumm, _charset._bufPos, sleInt16, VER_V10), + MKLINE_OLD(Scumm, _charset->_bufPos, sleByte, VER_V8, VER_V9), + MKLINE(Scumm, _charset->_bufPos, sleInt16, VER_V10), MKLINE(Scumm, _haveMsg, sleByte, VER_V8), MKLINE(Scumm, _useTalkAnims, sleByte, VER_V8), @@ -429,7 +430,7 @@ void Scumm::saveOrLoad(Serializer *s, uint32 savegameVersion) MKARRAY(Scumm, _proc_special_palette[0], sleByte, 256, VER_V8), - MKARRAY(Scumm, _charset._buffer[0], sleByte, 256, VER_V8), + MKARRAY(Scumm, _charset->_buffer[0], sleByte, 256, VER_V8), MKLINE(Scumm, _egoPositioned, sleByte, VER_V8), diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index 0b82f0dd85..f98d57f0a8 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -23,6 +23,7 @@ #include "stdafx.h" #include "scumm.h" #include "actor.h" +#include "charset.h" #include "intern.h" #include "sound.h" #include "verbs.h" @@ -655,7 +656,7 @@ void Scumm_v5::o5_cursorCommand() case 14: /* unk */ getWordVararg(table); for (i = 0; i < 16; i++) - _charset._colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)table[i]; + _charset->_colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)table[i]; break; } diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index 99d8e89054..f27c6fe18e 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -24,6 +24,7 @@ #include "stdafx.h" #include "scumm.h" #include "actor.h" +#include "charset.h" #include "imuse.h" #include "intern.h" #include "sound.h" @@ -863,7 +864,7 @@ void Scumm_v6::o6_cursorCommand() case 0x9D: /* set charset colors */ getStackList(args, sizeof(args) / sizeof(args[0])); for (i = 0; i < 16; i++) - _charset._colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)args[i]; + _charset->_colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)args[i]; break; case 0xD6: makeCursorColorTransparent(pop()); @@ -2581,10 +2582,10 @@ void Scumm_v6::o6_miscOps() setStringVars(0); addMessageToStack(getStringAddressVar(VAR_STRING2DRAW)); if (strncmp("/SYSTEM.007/ /", (char *)buf, 14) == 0) { - translateText(buf + 13, _charset._buffer); + translateText(buf + 13, _charset->_buffer); //description(); } else if (strncmp("/SYSTEM.007/ ", (char *)buf, 13) == 0) { - strcpy((char *)_charset._buffer, (char *)buf + 13); + strcpy((char *)_charset->_buffer, (char *)buf + 13); //description(); } } else { diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index f3cc78e95d..6a215189d1 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -22,6 +22,7 @@ #include "stdafx.h" #include "scumm.h" #include "actor.h" +#include "charset.h" #include "intern.h" #include "sound.h" #include "verbs.h" @@ -794,7 +795,7 @@ void Scumm_v8::o8_cursorCommand() case 0xE8: // SO_CHARSET_COLOR getStackList(args, sizeof(args) / sizeof(args[0])); for (i = 0; i < 16; i++) - _charset._colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)args[i]; + _charset->_colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)args[i]; break; case 0xE9: // SO_CURSOR_PUT default: diff --git a/scumm/scumm.h b/scumm/scumm.h index 1414ad16f2..57651b42ef 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -31,6 +31,7 @@ #include "common/timer.h" #include "common/util.h" +class CharsetRenderer; class GameDetector; class NewGui; class Dialog; @@ -175,56 +176,6 @@ enum { #define _roomFileOffsets res.roomoffs[rtRoom] -class CharsetRenderer { -protected: - byte _curId; - byte *_fontPtr; - -public: - Scumm *_vm; - int _strLeft, _strRight, _strTop, _strBottom; - int _nextLeft, _nextTop; - - int _top; - int _left, _startLeft; - byte _center; - int _right; - byte _color; - bool _hasMask; - bool _blitAlso; - - int _bufPos; - bool _firstChar; - bool _disableOffsX; - - bool _ignoreCharsetMask; - -protected: - byte _bpp; - uint32 _charOffs; - byte *_charPtr; - int _offsX, _offsY; - int _virtScreenHeight; - - void drawBits(byte *dst, byte *mask, int drawTop, int width, int height, bool useMask); - -public: - byte _colorMap[16]; - byte _buffer[512]; - - void printChar(int chr); - void printCharOld(int chr); - int getSpacing(byte chr, byte *charset); - int getStringWidth(int a, byte *str, int pos); - void addLinebreaks(int a, byte *str, int pos, int maxwidth); - - void setCurID(byte id); - int getCurID() { return _curId; } - - byte *getFontPtr() { return _fontPtr; } - byte *getFontPtr(byte id); -}; - #define ARRAY_HDR_SIZE 6 struct ArrayHeader { int16 dim1_size; @@ -906,17 +857,17 @@ public: /* String class */ - CharsetRenderer _charset; + CharsetRenderer *_charset; byte _charsetColor; bool _noSubtitles; // Skip all subtitles? byte _charsetData[15][16]; + void initCharset(int charset); void restoreCharsetBg(); int hasCharsetMask(int x, int y, int x2, int y2); void CHARSET_1(); void description(); void drawDescString(byte *msg); - byte *_msgPtrToAdd; byte *addMessageToStack(byte *msg); void addIntToStack(int var); void addVerbToStack(int var); @@ -925,7 +876,9 @@ public: void unkMessage1(); void unkMessage2(); void clearMsgQueue(); + int _numInMsgStack; + byte *_msgPtrToAdd; byte *_messagePtr; int16 _talkDelay; bool _keepText; diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index 0baa7f32a8..9b2d6b1554 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -24,6 +24,7 @@ #include "scumm.h" #include "actor.h" #include "bundle.h" +#include "charset.h" #include "debugger.h" #include "dialogs.h" #include "imuse.h" @@ -289,7 +290,7 @@ void Scumm::scummInit() _numObjectsInRoom = 0; _actorToPrintStrFor = 0; - _charset._bufPos = 0; + _charset->_bufPos = 0; _haveMsg = 0; _varwatch = -1; @@ -487,7 +488,7 @@ int Scumm::scummLoop(int delta) if (_completeScreenRedraw) { _completeScreenRedraw = false; gdi.clearUpperMask(); - _charset._hasMask = false; + _charset->_hasMask = false; redrawVerbs(); _fullRedraw = true; } @@ -1557,7 +1558,8 @@ void Scumm::mainRun() void Scumm::launch() { - _charset._vm = this; + _charset = new CharsetRenderer(this); + gdi._vm = this; _maxHeapThreshold = 450000; diff --git a/scumm/string.cpp b/scumm/string.cpp index 43a81984ea..a956194be0 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -23,374 +23,11 @@ #include "stdafx.h" #include "scumm.h" #include "actor.h" +#include "charset.h" #include "dialogs.h" #include "verbs.h" #include "scumm/sound.h" -void CharsetRenderer::setCurID(byte id) { - _curId = id; - _fontPtr = getFontPtr(id); -} - -byte *CharsetRenderer::getFontPtr(byte id) -{ - byte *ptr = _vm->getResourceAddress(rtCharset, id); - assert(ptr); - if (_vm->_features & GF_SMALL_HEADER) - ptr += 17; - else - ptr += 29; - return ptr; -} - -// do spacing for variable width old-style font -int CharsetRenderer::getSpacing(byte chr, byte *charset) -{ - int spacing = 0; - - if (_vm->_features & GF_OLD256) { - spacing = *(charset - 11 + chr); - } else { - int offs = READ_LE_UINT32(charset + chr * 4 + 4); - if (offs) { - spacing = charset[offs]; - if (charset[offs + 2] >= 0x80) { - spacing += charset[offs + 2] - 0x100; - } else { - spacing += charset[offs + 2]; - } - } - } - - // FIXME - this fixes the inventory icons in Zak256/Indy3 - // see bug #613109. - // chars 1,2: up arrow chars 3,4: down arrow - if ((_vm->_gameId == GID_ZAK256 || _vm->_gameId == GID_INDY3_256) - && (chr >= 1 && chr <= 4)) - spacing = 6; - - return spacing; -} - -int CharsetRenderer::getStringWidth(int arg, byte *text, int pos) -{ - byte *ptr; - int width; - byte chr; - - width = 1; - ptr = _fontPtr; - - while ((chr = text[pos++]) != 0) { - if (chr == 0xD) - break; - if (chr == '@') - continue; - if (chr == 254 || chr == 255) { - chr = text[pos++]; - if (chr == 3) // 'WAIT' - break; - if (chr == 8) { // 'Verb on next line' - if (arg == 1) - break; - while (text[pos] == ' ') - text[pos++] = '@'; - continue; - } - if (chr == 10 || chr == 21 || chr == 12 || chr == 13) { - pos += 2; - continue; - } - if (chr == 9 || chr == 1 || chr == 2) // 'Newline' - break; - if (chr == 14) { - int set = text[pos] | (text[pos + 1] << 8); - pos += 2; - ptr = getFontPtr(set); - continue; - } - } - width += getSpacing(chr, ptr); - } - - return width; -} - -void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth) -{ - int lastspace = -1; - int curw = 1; - byte *ptr; - byte chr; - - ptr = _fontPtr; - - while ((chr = str[pos++]) != 0) { - if (chr == '@') - continue; - if (chr == 254) - chr = 255; - if (chr == 255) { - chr = str[pos++]; - if (chr == 3) // 'Wait' - break; - if (chr == 8) { // 'Verb on next line' - if (a == 1) { - curw = 1; - } else { - while (str[pos] == ' ') - str[pos++] = '@'; - } - continue; - } - if (chr == 10 || chr == 21 || chr == 12 || chr == 13) { - pos += 2; - continue; - } - if (chr == 1) { // 'Newline' - curw = 1; - continue; - } - if (chr == 2) // 'Don't terminate with \n' - break; - if (chr == 14) { - int set = str[pos] | (str[pos + 1] << 8); - pos += 2; - ptr = getFontPtr(set); - continue; - } - } - - if (chr == ' ') - lastspace = pos - 1; - - curw += getSpacing(chr, ptr); - if (lastspace == -1) - continue; - if (curw > maxwidth) { - str[lastspace] = 0xD; - curw = 1; - pos = lastspace + 1; - lastspace = -1; - } - } -} - - -void CharsetRenderer::printCharOld(int chr) -{ // Indy3 / Zak256 - VirtScreen *vs; - byte *char_ptr, *dest_ptr; - unsigned int buffer = 0, mask = 0, x = 0, y = 0; - unsigned char color; - - _vm->checkRange(_vm->_maxCharsets - 1, 0, _curId, "Printing with bad charset %d"); - - if ((vs = _vm->findVirtScreen(_top)) == NULL) - return; - - if (chr == '@') - return; - - if (_firstChar) { - _strLeft = _left; - _strTop = _top; - _strRight = _left; - _strBottom = _top; - _firstChar = false; - } - char_ptr = _fontPtr + 207 + (chr + 1) * 8; - dest_ptr = vs->screenPtr + vs->xstart + (_top - vs->topline) * _vm->_realWidth + _left; - _vm->updateDirtyRect(vs->number, _left, _left + 8, _top - vs->topline, _top - vs->topline + 8, 0); - - for (y = 0; y < 8; y++) { - for (x = 0; x < 8; x++) { - if ((mask >>= 1) == 0) { - buffer = *char_ptr++; - mask = 0x80; - } - color = ((buffer & mask) != 0); - if (color) - *(dest_ptr + y * _vm->_realWidth + x) = _color; - } - } - - // FIXME - _left += getSpacing(chr, _fontPtr); - - if (_left > _strRight) - _strRight = _left; - - if (_top + 8 > _strBottom) - _strBottom = _top + 8; - -} - - -void CharsetRenderer::printChar(int chr) -{ - int width, height; - int d; - VirtScreen *vs; - - _vm->checkRange(_vm->_maxCharsets - 1, 1, _curId, "Printing with bad charset %d"); - - if ((vs = _vm->findVirtScreen(_top)) == NULL) - return; - - if (chr == '@') - return; - - _bpp = *_fontPtr; - _colorMap[1] = _color; - - _charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4); - - if (!_charOffs) - return; - - assert(_charOffs < 0x10000); - - _charPtr = _fontPtr + _charOffs; - - width = _charPtr[0]; - height = _charPtr[1]; - if (_firstChar) { - _strLeft = 0; - _strTop = 0; - _strRight = 0; - _strBottom = 0; - } - - if (_disableOffsX) { - _offsX = 0; - } else { - d = _charPtr[2]; - if (d >= 0x80) - d -= 0x100; - _offsX = d; - } - - d = _charPtr[3]; - if (d >= 0x80) - d -= 0x100; - _offsY = d; - - _top += _offsY; - _left += _offsX; - - if (_left + width > _right + 1 || _left < 0) { - _left += width; - _top -= _offsY; - return; - } - - _disableOffsX = false; - - if (_firstChar) { - _strLeft = _left; - _strTop = _top; - _strRight = _left; - _strBottom = _top; - _firstChar = false; - } - - if (_left < _strLeft) - _strLeft = _left; - - if (_top < _strTop) - _strTop = _top; - - int drawTop = _top - vs->topline; - if (drawTop < 0) - drawTop = 0; - int bottom = drawTop + height + _offsY; - - _vm->updateDirtyRect(vs->number, _left, _left + width, drawTop, bottom, 0); - - if (vs->number != 0) - _blitAlso = false; - if (vs->number == 0 && !_blitAlso) - _hasMask = true; - - _virtScreenHeight = vs->height; - _charPtr += 4; - - byte *mask = _vm->getResourceAddress(rtBuffer, 9) - + drawTop * _vm->gdi._numStrips + _left / 8 + _vm->_screenStartStrip; - - byte *dst = vs->screenPtr + vs->xstart + drawTop * _vm->_realWidth + _left; - bool useMask = (vs->number == 0 && !_ignoreCharsetMask); - - if (_blitAlso) { - byte *back = dst; - dst = _vm->getResourceAddress(rtBuffer, vs->number + 5) - + vs->xstart + drawTop * _vm->_realWidth + _left; - - drawBits(dst, mask, drawTop, width, height, useMask); - - _vm->blit(back, dst, width, height); - } else { - drawBits(dst, mask, drawTop, width, height, useMask); - } - - _left += width; - if (_left > _strRight) - _strRight = _left; - - if (_top + height > _strBottom) - _strBottom = _top + height; - - _top -= _offsY; -} - -void CharsetRenderer::drawBits(byte *dst, byte *mask, int drawTop, int width, int height, bool useMask) -{ - byte maskmask; - int y, x; - int maskpos; - int color; - byte numbits, bits; - - bits = *_charPtr++; - numbits = 8; - - y = 0; - - for (y = 0; y < height && y + drawTop < _virtScreenHeight; y++) { - maskmask = revBitMask[_left & 7]; - maskpos = 0; - - for (x = 0; x < width; x++) { - int myMask = (0xFF << (8 - _bpp)) & 0xFF; - int myColor = (bits & myMask) >> (8 - _bpp); - color = (bits >> (8 - _bpp)) & 0xFF; - assert(color == myColor); - - if (color) { - if (useMask) { - mask[maskpos] |= maskmask; - } - *dst = _colorMap[color]; - } - dst++; - bits <<= _bpp; - numbits -= _bpp; - if (numbits == 0) { - bits = *_charPtr++; - numbits = 8; - } - maskmask >>= 1; - if (maskmask == 0) { - maskmask = 0x80; - maskpos++; - } - } - dst += _vm->_realWidth - width; - mask += _vm->gdi._numStrips; - } -} - void Scumm::unkMessage1() { byte buffer[100]; @@ -494,28 +131,28 @@ void Scumm::CHARSET_1() } } - _charset._top = _string[0].ypos; - _charset._startLeft = _charset._left = _string[0].xpos; + _charset->_top = _string[0].ypos; + _charset->_startLeft = _charset->_left = _string[0].xpos; if (a && a->charset) - _charset.setCurID(a->charset); + _charset->setCurID(a->charset); else - _charset.setCurID(_string[0].charset); + _charset->setCurID(_string[0].charset); - _charset._center = _string[0].center; - _charset._right = _string[0].right; - _charset._color = _charsetColor; + _charset->_center = _string[0].center; + _charset->_right = _string[0].right; + _charset->_color = _charsetColor; if (!(_features & GF_OLD256)) // FIXME for (i = 0; i < 4; i++) - _charset._colorMap[i] = _charsetData[_charset.getCurID()][i]; + _charset->_colorMap[i] = _charsetData[_charset->getCurID()][i]; if (_keepText) { - _charset._strLeft = gdi._mask_left; - _charset._strRight = gdi._mask_right; - _charset._strTop = gdi._mask_top; - _charset._strBottom = gdi._mask_bottom; + _charset->_strLeft = gdi._mask_left; + _charset->_strRight = gdi._mask_right; + _charset->_strTop = gdi._mask_top; + _charset->_strBottom = gdi._mask_bottom; } if (_talkDelay) @@ -555,23 +192,23 @@ void Scumm::CHARSET_1() restoreCharsetBg(); } - t = _charset._right - _string[0].xpos - 1; - if (_charset._center) { - if (t > _charset._nextLeft) - t = _charset._nextLeft; + t = _charset->_right - _string[0].xpos - 1; + if (_charset->_center) { + if (t > _charset->_nextLeft) + t = _charset->_nextLeft; t <<= 1; } - buffer = _charset._buffer + _charset._bufPos; - _charset.addLinebreaks(0, buffer, 0, t); + buffer = _charset->_buffer + _charset->_bufPos; + _charset->addLinebreaks(0, buffer, 0, t); - if (_charset._center) { - _charset._nextLeft -= _charset.getStringWidth(0, buffer, 0) >> 1; - if (_charset._nextLeft < 0) - _charset._nextLeft = 0; + if (_charset->_center) { + _charset->_nextLeft -= _charset->getStringWidth(0, buffer, 0) >> 1; + if (_charset->_nextLeft < 0) + _charset->_nextLeft = 0; } - _charset._disableOffsX = _charset._firstChar = !_keepText; + _charset->_disableOffsX = _charset->_firstChar = !_keepText; do { c = *buffer++; @@ -585,16 +222,16 @@ void Scumm::CHARSET_1() if (c == 13) { newLine:; if (_features & GF_OLD256) { - _charset._nextTop = 8; - _charset._nextLeft = 0; + _charset->_nextTop = 8; + _charset->_nextLeft = 0; continue; } else { - _charset._nextLeft = _string[0].xpos; - if (_charset._center) { - _charset._nextLeft -= _charset.getStringWidth(0, buffer, 0) >> 1; + _charset->_nextLeft = _string[0].xpos; + if (_charset->_center) { + _charset->_nextLeft -= _charset->getStringWidth(0, buffer, 0) >> 1; } - _charset._nextTop += _charset.getFontPtr()[1]; - _charset._disableOffsX = true; + _charset->_nextTop += _charset->getFontPtr()[1]; + _charset->_disableOffsX = true; continue; } } @@ -603,20 +240,20 @@ void Scumm::CHARSET_1() c = 0xFF; if (c != 0xFF) { - _charset._left = _charset._nextLeft; - _charset._top = _charset._nextTop; + _charset->_left = _charset->_nextLeft; + _charset->_top = _charset->_nextTop; if (_features & GF_OLD256) - _charset.printCharOld(c); + _charset->printCharOld(c); else if (!(_features & GF_AFTER_V6)) { if (!(_haveMsg == 0xFE && _noSubtitles)) - _charset.printChar(c); + _charset->printChar(c); } else { if (!((_haveMsg == 0xFE || _haveMsg == 0xFF) && _noSubtitles)) - _charset.printChar(c); + _charset->printChar(c); } - _charset._nextLeft = _charset._left; - _charset._nextTop = _charset._top; + _charset->_nextLeft = _charset->_left; + _charset->_nextTop = _charset->_top; _talkDelay += _vars[VAR_CHARINC]; continue; } @@ -654,21 +291,21 @@ void Scumm::CHARSET_1() color = *buffer++; color |= *buffer++ << 8; if (color == 0xFF) - _charset._color = _charsetColor; + _charset->_color = _charsetColor; else - _charset._color = color; + _charset->_color = color; break; case 13: buffer += 2; break; case 14: { - int oldy = _charset.getFontPtr()[1]; + int oldy = _charset->getFontPtr()[1]; - _charset.setCurID(*buffer++); + _charset->setCurID(*buffer++); buffer += 2; for (i = 0; i < 4; i++) - _charset._colorMap[i] = _charsetData[_charset.getCurID()][i]; - _charset._nextTop -= _charset.getFontPtr()[1] - oldy; + _charset->_colorMap[i] = _charsetData[_charset->getCurID()][i]; + _charset->_nextTop -= _charset->getFontPtr()[1] - oldy; break; } default: @@ -689,12 +326,12 @@ void Scumm::CHARSET_1() if (a && has_anim) a->startAnimActor(frme != -1 ? frme : a->talkFrame1); - _charset._bufPos = buffer - _charset._buffer; + _charset->_bufPos = buffer - _charset->_buffer; - gdi._mask_left = _charset._strLeft; - gdi._mask_right = _charset._strRight; - gdi._mask_top = _charset._strTop; - gdi._mask_bottom = _charset._strBottom; + gdi._mask_left = _charset->_strLeft; + gdi._mask_right = _charset->_strRight; + gdi._mask_top = _charset->_strTop; + gdi._mask_bottom = _charset->_strBottom; } void Scumm::description() @@ -702,22 +339,22 @@ void Scumm::description() int c; byte *buffer; - buffer = _charset._buffer; + buffer = _charset->_buffer; _string[0].ypos = camera._cur.y + 88; - _string[0].xpos = (_realWidth / 2) - (_charset.getStringWidth(0, buffer, 0) >> 1); + _string[0].xpos = (_realWidth / 2) - (_charset->getStringWidth(0, buffer, 0) >> 1); if (_string[0].xpos < 0) _string[0].xpos = 0; - _charset._bufPos = 0; - _charset._top = _string[0].ypos; - _charset._startLeft = _charset._left = _string[0].xpos; - _charset._right = _realWidth - 1; - _charset._center = false; - _charset._color = 15; - _charset._disableOffsX = _charset._firstChar = true; - _charset.setCurID(3); - _charset._nextLeft = _string[0].xpos; - _charset._nextTop = _string[0].ypos; + _charset->_bufPos = 0; + _charset->_top = _string[0].ypos; + _charset->_startLeft = _charset->_left = _string[0].xpos; + _charset->_right = _realWidth - 1; + _charset->_center = false; + _charset->_color = 15; + _charset->_disableOffsX = _charset->_firstChar = true; + _charset->setCurID(3); + _charset->_nextLeft = _string[0].xpos; + _charset->_nextTop = _string[0].ypos; // FIXME: _talkdelay = 1 - display description, not correct ego actor talking, // 0 - no display, correct ego actor talking _talkDelay = 0; @@ -731,19 +368,19 @@ void Scumm::description() break; } if (c != 0xFF) { - _charset._left = _charset._nextLeft; - _charset._top = _charset._nextTop; - _charset.printChar(c); - _charset._nextLeft = _charset._left; - _charset._nextTop = _charset._top; + _charset->_left = _charset->_nextLeft; + _charset->_top = _charset->_nextTop; + _charset->printChar(c); + _charset->_nextLeft = _charset->_left; + _charset->_nextTop = _charset->_top; continue; } } while (1); - gdi._mask_left = _charset._strLeft; - gdi._mask_right = _charset._strRight; - gdi._mask_top = _charset._strTop; - gdi._mask_bottom = _charset._strBottom; + gdi._mask_left = _charset->_strLeft; + gdi._mask_right = _charset->_strRight; + gdi._mask_top = _charset->_strTop; + gdi._mask_bottom = _charset->_strBottom; } void Scumm::drawDescString(byte *msg) @@ -753,21 +390,21 @@ void Scumm::drawDescString(byte *msg) buf = _msgPtrToAdd = buffer; addMessageToStack(msg); - _charset._bufPos = 0; - _charset._top = _string[0].ypos; - _charset._startLeft = _charset._left = _string[0].xpos; - _charset._right = _realWidth - 1; - _charset._center = _string[0].center; - _charset._color = _string[0].color; - _charset._disableOffsX = _charset._firstChar = true; - _charset.setCurID(_string[0].charset); - _charset._nextLeft = _string[0].xpos; - _charset._nextTop = _string[0].ypos; + _charset->_bufPos = 0; + _charset->_top = _string[0].ypos; + _charset->_startLeft = _charset->_left = _string[0].xpos; + _charset->_right = _realWidth - 1; + _charset->_center = _string[0].center; + _charset->_color = _string[0].color; + _charset->_disableOffsX = _charset->_firstChar = true; + _charset->setCurID(_string[0].charset); + _charset->_nextLeft = _string[0].xpos; + _charset->_nextTop = _string[0].ypos; // Center text - _charset._nextLeft -= _charset.getStringWidth(0, buffer, 0) >> 1; - if (_charset._nextLeft < 0) - _charset._nextLeft = 0; + _charset->_nextLeft -= _charset->getStringWidth(0, buffer, 0) >> 1; + if (_charset->_nextLeft < 0) + _charset->_nextLeft = 0; _talkDelay = 1; @@ -780,19 +417,19 @@ void Scumm::drawDescString(byte *msg) break; } if (c != 0xFF) { - _charset._left = _charset._nextLeft; - _charset._top = _charset._nextTop; - _charset.printChar(c); - _charset._nextLeft = _charset._left; - _charset._nextTop = _charset._top; + _charset->_left = _charset->_nextLeft; + _charset->_top = _charset->_nextTop; + _charset->printChar(c); + _charset->_nextLeft = _charset->_left; + _charset->_nextTop = _charset->_top; continue; } } while (1); - gdi._mask_left = _charset._strLeft; - gdi._mask_right = _charset._strRight; - gdi._mask_top = _charset._strTop; - gdi._mask_bottom = _charset._strBottom; + gdi._mask_left = _charset->_strLeft; + gdi._mask_right = _charset->_strRight; + gdi._mask_top = _charset->_strTop; + gdi._mask_bottom = _charset->_strBottom; } void Scumm::drawString(int a) @@ -806,19 +443,19 @@ void Scumm::drawString(int a) _msgPtrToAdd = buf; _messagePtr = addMessageToStack(_messagePtr); - _charset._top = _string[a].ypos; - _charset._startLeft = _charset._left = _string[a].xpos; - _charset._right = _string[a].right; - _charset._center = _string[a].center; - _charset._color = _string[a].color; - _charset._disableOffsX = _charset._firstChar = true; - _charset.setCurID(_string[a].charset); + _charset->_top = _string[a].ypos; + _charset->_startLeft = _charset->_left = _string[a].xpos; + _charset->_right = _string[a].right; + _charset->_center = _string[a].center; + _charset->_color = _string[a].color; + _charset->_disableOffsX = _charset->_firstChar = true; + _charset->setCurID(_string[a].charset); if (!(_features & GF_OLD256)) { for (i = 0; i < 4; i++) - _charset._colorMap[i] = _charsetData[_charset.getCurID()][i]; + _charset->_colorMap[i] = _charsetData[_charset->getCurID()][i]; - fontHeight = _charset.getFontPtr()[1]; + fontHeight = _charset->getFontPtr()[1]; } _msgPtrToAdd = buf; @@ -836,12 +473,12 @@ void Scumm::drawString(int a) } if (space) *space = '\0'; - if (_charset._center) { - _charset._left -= _charset.getStringWidth(a, buf, 0) >> 1; + if (_charset->_center) { + _charset->_left -= _charset->getStringWidth(a, buf, 0) >> 1; } if (!(_features & GF_AFTER_V7)) - _charset._ignoreCharsetMask = true; + _charset->_ignoreCharsetMask = true; // In Full Throttle (and other games?), verb text should always mask @@ -868,55 +505,55 @@ void Scumm::drawString(int a) break; case 1: case 8: - if (_charset._center) { - _charset._left = _charset._startLeft - _charset.getStringWidth(a, buf, i); + if (_charset->_center) { + _charset->_left = _charset->_startLeft - _charset->getStringWidth(a, buf, i); } else { - _charset._left = _charset._startLeft; + _charset->_left = _charset->_startLeft; } - _charset._top += fontHeight; + _charset->_top += fontHeight; break; case 12: color = buf[i] + (buf[i + 1] << 8); i += 2; if (color == 0xFF) - _charset._color = _string[a].color; + _charset->_color = _string[a].color; else - _charset._color = color; + _charset->_color = color; break; } } else { if (a == 1 && (_features & GF_AFTER_V6)) { if (_string[a].no_talk_anim == 0) - _charset._blitAlso = true; + _charset->_blitAlso = true; } if (_features & GF_OLD256) - _charset.printCharOld(chr); + _charset->printCharOld(chr); else - _charset.printChar(chr); - _charset._blitAlso = false; + _charset->printChar(chr); + _charset->_blitAlso = false; } } - _charset._ignoreCharsetMask = false; + _charset->_ignoreCharsetMask = false; if (a == 0) { - _charset._nextLeft = _charset._left; - _charset._nextTop = _charset._top; + _charset->_nextLeft = _charset->_left; + _charset->_nextTop = _charset->_top; } - _string[a].xpos = _charset._strRight + 8; // Indy3: Fixes Grail Diary text positioning + _string[a].xpos = _charset->_strRight + 8; // Indy3: Fixes Grail Diary text positioning if (_features & GF_AFTER_V7) { - _charset._hasMask = true; - if (_charset._strLeft < gdi._mask_left) - gdi._mask_left = _charset._strLeft; - if (_charset._strRight > gdi._mask_right) - gdi._mask_right = _charset._strRight; - if (_charset._strTop < gdi._mask_top) - gdi._mask_top = _charset._strTop; - if (_charset._strBottom > gdi._mask_bottom) - gdi._mask_bottom = _charset._strBottom; + _charset->_hasMask = true; + if (_charset->_strLeft < gdi._mask_left) + gdi._mask_left = _charset->_strLeft; + if (_charset->_strRight > gdi._mask_right) + gdi._mask_right = _charset->_strRight; + if (_charset->_strTop < gdi._mask_top) + gdi._mask_top = _charset->_strTop; + if (_charset->_strBottom > gdi._mask_bottom) + gdi._mask_bottom = _charset->_strBottom; } } @@ -1118,7 +755,7 @@ void Scumm::initCharset(int charsetno) _string[1].t_charset = charsetno; for (i = 0; i < 16; i++) - _charset._colorMap[i] = _charsetData[_charset.getCurID()][i]; + _charset->_colorMap[i] = _charsetData[_charset->getCurID()][i]; } void Scumm::loadLanguageBundle() { File file; diff --git a/scumm/verbs.cpp b/scumm/verbs.cpp index e72210df53..f377df8a7f 100644 --- a/scumm/verbs.cpp +++ b/scumm/verbs.cpp @@ -21,9 +21,10 @@ */ #include "stdafx.h" -#include "scumm.h" +#include "charset.h" #include "object.h" #include "resource.h" +#include "scumm.h" #include "verbs.h" void Scumm::redrawVerbs() @@ -156,18 +157,18 @@ void Scumm::drawVerb(int verb, int mode) return; assert(_messagePtr); - tmp = _charset._center; - _charset._center = 0; + tmp = _charset->_center; + _charset->_center = 0; drawString(4); - _charset._center = tmp; - - vs->right = _charset._strRight; - vs->bottom = _charset._strBottom; - vs->oldleft = _charset._strLeft; - vs->oldright = _charset._strRight; - vs->oldtop = _charset._strTop; - vs->oldbottom = _charset._strBottom; - _charset._strLeft = _charset._strRight; + _charset->_center = tmp; + + vs->right = _charset->_strRight; + vs->bottom = _charset->_strBottom; + vs->oldleft = _charset->_strLeft; + vs->oldright = _charset->_strRight; + vs->oldtop = _charset->_strTop; + vs->oldbottom = _charset->_strBottom; + _charset->_strLeft = _charset->_strRight; } else { restoreVerbBG(verb); } |