diff options
-rw-r--r-- | scumm/object.cpp | 2 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 45 | ||||
-rw-r--r-- | scumm/scumm.h | 4 | ||||
-rw-r--r-- | scumm/smush/frenderer.h | 1 | ||||
-rw-r--r-- | scumm/smush/player.cpp | 2 |
5 files changed, 45 insertions, 9 deletions
diff --git a/scumm/object.cpp b/scumm/object.cpp index 5c2653cf85..a8639f4f86 100644 --- a/scumm/object.cpp +++ b/scumm/object.cpp @@ -1326,7 +1326,7 @@ void Scumm::drawBlastObject(BlastObject *eo) if (!bomp) error("object %d is not a blast object", eo->number); - hexdump(bomp,32); + //hexdump(bomp,32); if (_features & GF_AFTER_V8) { bdd.srcwidth = READ_LE_UINT32(&((BompHeader *)bomp)->v8.width); diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 6382833d4f..20b611041c 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -26,6 +26,9 @@ #include "sound.h" #include "verbs.h" +#include "smush/player.h" +#include "smush/frenderer.h" + /* * NO, we do NOT support CMI yet :-) This file is mostly a placeholder and a place * to grow real support in. For now, only a few opcodes are implemented, and they @@ -34,6 +37,17 @@ #define OPCODE(x) { &Scumm_v8::x, #x } +// FIXME: Copied from smush/player.cpp - this should probably go somewhere sensible :) +static FontRenderer *loadFont(const char * file, const char * directory, bool original = false) { +#ifdef DEBUG + debug(5, "loading font from \"%s\"", file); +#endif + FontRenderer * fr = new FontRenderer(original); + SmushPlayer p(fr, false, false); + p.play(file, directory); + return fr; +} + void Scumm_v8::setupOpcodes() { // TODO: any of the o6_ entries are potentially wrong and pure guesses :-) @@ -493,7 +507,8 @@ void Scumm_v8::decodeParseString(int m, int n) break; case 0xCD: // SO_PRINT_CHARSET Set print character set // FIXME - TODO - pop(); + _string[m].charset = pop(); + printf("so_print_charset(%d)\n", _string[m].charset); break; case 0xCE: _string[m].center = false; @@ -506,15 +521,23 @@ void Scumm_v8::decodeParseString(int m, int n) case 0xD0: // SO_PRINT_MUMBLE error("decodeParseString: SO_PRINT_MUMBLE"); break; - case 0xD1: + case 0xD1: { // TODO - FIXME _messagePtr = _scriptPointer; + Point screenSize(_realHeight, _realWidth); byte buffer[1024]; _msgPtrToAdd = buffer; _scriptPointer = _messagePtr = addMessageToStack(_messagePtr); + + if (_fr[_string[m].charset] != NULL) { + _fr[_string[m].charset]->drawStringAbsolute((const char*)buffer, (char*)virtscr[0].screenPtr, screenSize, (int16)_string[m].xpos, (int16)_string[m].ypos); + printf("Drawn message(%d)\n", m); + } + // printf("Message(%d): '%s'\n", m, buffer); break; + } case 0xD2: // SO_PRINT_WRAP Set print wordwrap error("decodeParseString: SO_PRINT_MUMBLE"); break; @@ -729,11 +752,20 @@ void Scumm_v8::o8_cursorCommand() case 0xE6: // SO_CURSOR_TRANSPARENT Set cursor transparent color makeCursorColorTransparent(pop()); break; - case 0xE7: // SO_CHARSET_SET + case 0xE7: { // SO_CHARSET_SET // FIXME - TODO - pop(); -// initCharset(pop()); + int charset = pop(); + if (_fr[charset] == NULL) { + char fontname[255]; + sprintf(fontname, "resource/font%d.nut", charset); + +// _fr[charset] = loadFont(fontname, getGameDataPath(), true); + + if (!_fr[charset]) + warning("Failed to load font %d from %s%s\n", charset, getGameDataPath(), fontname); + } break; + } case 0xE8: // SO_CHARSET_COLOR getStackList(args, sizeof(args) / sizeof(args[0])); for (i = 0; i < 16; i++) @@ -1125,6 +1157,7 @@ void Scumm_v8::o8_kludge() // TODO int16 args[30]; getStackList(args, sizeof(args) / sizeof(args[0])); + warning("o8_kludge %d\n", args[0]); switch (args[0]) { case 11: @@ -1177,7 +1210,7 @@ void Scumm_v8::o8_kludge2() // TODO int16 args[30]; getStackList(args, sizeof(args) / sizeof(args[0])); - + warning("o8_kludge2 %d\n", args[0]); switch (args[0]) { case 0xCE: // getRGBSlot case 0xD3: // getKeyState diff --git a/scumm/scumm.h b/scumm/scumm.h index ae95680274..7c8292ef07 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -31,6 +31,7 @@ #include "common/timer.h" #include "common/util.h" +class FontRenderer; class GameDetector; class NewGui; class Dialog; @@ -680,6 +681,9 @@ public: void actorTalk(); void stopTalk(); + /* FIXME: This should not be here, probably. Hack for CMI v8 fonts */ + FontRenderer *_fr[4]; + /* Akos Class */ bool akos_increaseAnims(byte *akos, Actor *a); diff --git a/scumm/smush/frenderer.h b/scumm/smush/frenderer.h index cd1e74fed0..8f26c6f887 100644 --- a/scumm/smush/frenderer.h +++ b/scumm/smush/frenderer.h @@ -161,7 +161,6 @@ public: @return \c true if everything went fine, \c false otherwise */ bool drawStringAbsolute(const char * str, char * buffer, const Point & size, int32 x, int32 y) const; - }; #endif diff --git a/scumm/smush/player.cpp b/scumm/smush/player.cpp index 999bacdfbf..960282e28b 100644 --- a/scumm/smush/player.cpp +++ b/scumm/smush/player.cpp @@ -698,7 +698,7 @@ bool SmushPlayer::readString(const char * file, const char * directory, bool & f return false; } -static FontRenderer * loadFont(const char * file, const char * directory, bool original = false) { +static FontRenderer *loadFont(const char * file, const char * directory, bool original = false) { #ifdef DEBUG debug(5, "loading font from \"%s\"", file); #endif |