first blastText version. this is work in progress (note that e.g. text is not clipped, and the extra information is not removed)
svn-id: r6472
This commit is contained in:
parent
ec006a4357
commit
8ad002b3a3
6 changed files with 128 additions and 77 deletions
|
@ -1271,12 +1271,12 @@ void Scumm::enqueueObject(int objectNumber, int objectX, int objectY, int object
|
|||
BlastObject *eo;
|
||||
ObjectData *od;
|
||||
|
||||
if (_enqueuePos == sizeof(_enqueuedObjects) / sizeof(_enqueuedObjects[0])) {
|
||||
if (_blastObjectQueuePos == sizeof(_blastObjectQueue) / sizeof(_blastObjectQueue[0])) {
|
||||
warning("enqueueObject: overflow");
|
||||
return;
|
||||
}
|
||||
|
||||
eo = &_enqueuedObjects[_enqueuePos++];
|
||||
eo = &_blastObjectQueue[_blastObjectQueuePos++];
|
||||
eo->number = objectNumber;
|
||||
eo->posX = objectX + (camera._cur.x & 7);
|
||||
eo->posY = objectY + (camera._cur.y - (_realHeight / 2));
|
||||
|
@ -1305,8 +1305,8 @@ void Scumm::drawBlastObjects()
|
|||
BlastObject *eo;
|
||||
int i;
|
||||
|
||||
eo = _enqueuedObjects;
|
||||
for (i = 0; i < _enqueuePos; i++, eo++) {
|
||||
eo = _blastObjectQueue;
|
||||
for (i = 0; i < _blastObjectQueuePos; i++, eo++) {
|
||||
drawBlastObject(eo);
|
||||
}
|
||||
}
|
||||
|
@ -1568,8 +1568,8 @@ void Scumm::removeBlastObjects()
|
|||
BlastObject *eo;
|
||||
int i;
|
||||
|
||||
eo = _enqueuedObjects;
|
||||
for (i = 0; i < _enqueuePos; i++, eo++) {
|
||||
eo = _blastObjectQueue;
|
||||
for (i = 0; i < _blastObjectQueuePos; i++, eo++) {
|
||||
removeBlastObject(eo);
|
||||
}
|
||||
|
||||
|
|
|
@ -2294,8 +2294,8 @@ void Scumm_v6::o6_printActor()
|
|||
|
||||
void Scumm_v6::o6_printEgo()
|
||||
{
|
||||
push(_vars[VAR_EGO]);
|
||||
decodeParseString(0, 1);
|
||||
_actorToPrintStrFor = _vars[VAR_EGO];
|
||||
decodeParseString(0, 0);
|
||||
}
|
||||
|
||||
void Scumm_v6::o6_talkActor()
|
||||
|
|
|
@ -199,7 +199,7 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o6_dummy), // O_RETURN boils down to a NOP
|
||||
OPCODE(o6_startObjectEx),
|
||||
/* 80 */
|
||||
OPCODE(o6_stopObjectScript), // FIXME - is this right?
|
||||
OPCODE(o6_stopObjectScript),
|
||||
OPCODE(o6_cutscene),
|
||||
OPCODE(o6_endCutscene),
|
||||
OPCODE(o6_freezeUnfreeze),
|
||||
|
@ -236,7 +236,7 @@ void Scumm_v8::setupOpcodes()
|
|||
/* 9C */
|
||||
OPCODE(o8_cursorCommand),
|
||||
OPCODE(o6_loadRoom),
|
||||
OPCODE(o6_loadRoomWithEgo), // FIXME - this is a pure guess
|
||||
OPCODE(o6_loadRoomWithEgo),
|
||||
OPCODE(o6_walkActorToObj),
|
||||
/* A0 */
|
||||
OPCODE(o6_walkActorTo),
|
||||
|
@ -249,7 +249,7 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o6_pickupObject),
|
||||
OPCODE(o6_setBoxFlags),
|
||||
/* A8 */
|
||||
OPCODE(o6_createBoxMatrix), // fixme?
|
||||
OPCODE(o6_createBoxMatrix),
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o8_resourceRoutines),
|
||||
OPCODE(o8_roomOps),
|
||||
|
@ -289,7 +289,7 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_invalid),
|
||||
/* C8 */
|
||||
OPCODE(o6_startScriptQuick), // FIXME - this function returns something in V8 !
|
||||
OPCODE(o6_startScriptQuick),
|
||||
OPCODE(o6_startObjectQuick),
|
||||
OPCODE(o6_pickOneOf),
|
||||
OPCODE(o6_pickOneOfDefault),
|
||||
|
@ -299,7 +299,7 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o6_getRandomNumber),
|
||||
OPCODE(o6_getRandomNumberRange),
|
||||
/* D0 */
|
||||
OPCODE(o6_ifClassOfIs), // FIXME - this is a guess
|
||||
OPCODE(o6_ifClassOfIs),
|
||||
OPCODE(o6_getState),
|
||||
OPCODE(o6_getOwner),
|
||||
OPCODE(o6_isScriptRunning),
|
||||
|
@ -331,7 +331,7 @@ void Scumm_v8::setupOpcodes()
|
|||
/* E8 */
|
||||
OPCODE(o6_getActorElevation),
|
||||
OPCODE(o6_getActorWidth),
|
||||
OPCODE(o6_getObjectNewDir), // FIXME: is this right?
|
||||
OPCODE(o6_getObjectNewDir),
|
||||
OPCODE(o6_getObjectX),
|
||||
/* EC */
|
||||
OPCODE(o6_getObjectY),
|
||||
|
@ -460,6 +460,7 @@ void Scumm_v8::writeVar(uint var, int value)
|
|||
void Scumm_v8::decodeParseString(int m, int n)
|
||||
{
|
||||
byte b;
|
||||
bool containsSpeech;
|
||||
|
||||
b = fetchScriptByte();
|
||||
|
||||
|
@ -468,7 +469,7 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
setStringVars(m);
|
||||
if (n)
|
||||
_actorToPrintStrFor = pop();
|
||||
return;
|
||||
break;
|
||||
case 0xC9:
|
||||
_string[m].t_xpos = _string[m].xpos;
|
||||
_string[m].t_ypos = _string[m].ypos;
|
||||
|
@ -478,7 +479,7 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
_string[m].t_right = _string[m].right;
|
||||
_string[m].t_color = _string[m].color;
|
||||
_string[m].t_charset = _string[m].charset;
|
||||
return;
|
||||
break;
|
||||
case 0xCA:
|
||||
_string[m].ypos = pop();
|
||||
_string[m].xpos = pop();
|
||||
|
@ -491,11 +492,8 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
_string[m].center = true;
|
||||
_string[m].overhead = false;
|
||||
break;
|
||||
case 0xCD: { // SO_PRINT_CHARSET Set print character set
|
||||
// FIXME - TODO
|
||||
int charset = pop();
|
||||
_string[m].charset = charset;
|
||||
}
|
||||
case 0xCD: // SO_PRINT_CHARSET Set print character set
|
||||
_string[m].charset = pop();
|
||||
break;
|
||||
case 0xCE:
|
||||
_string[m].center = false;
|
||||
|
@ -512,7 +510,9 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
case 0xD1:
|
||||
_messagePtr = _scriptPointer;
|
||||
|
||||
if (_messagePtr[0] == '/') {
|
||||
containsSpeech = (_messagePtr[0] == '/');
|
||||
|
||||
if (containsSpeech) {
|
||||
char pointer[20];
|
||||
int i, j;
|
||||
|
||||
|
@ -530,6 +530,7 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
|
||||
// _sound->_talkChannel = _sound->playBundleSound(pointer);
|
||||
_messagePtr = _transText;
|
||||
}
|
||||
|
||||
switch (m) {
|
||||
case 0:
|
||||
|
@ -544,26 +545,17 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
case 3:
|
||||
unkMessage2();
|
||||
break;
|
||||
case 5:{
|
||||
byte buffer[256];
|
||||
_msgPtrToAdd = buffer;
|
||||
_messagePtr = addMessageToStack(_messagePtr);
|
||||
enqueueText(buffer, _string[m].xpos, _string[m].ypos, _string[m].color, _string[m].charset, _string[m].center);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
switch (m) {
|
||||
case 0:
|
||||
actorTalk();
|
||||
break;
|
||||
case 1:
|
||||
drawString(1);
|
||||
break;
|
||||
case 2:
|
||||
unkMessage1();
|
||||
break;
|
||||
case 3:
|
||||
unkMessage2();
|
||||
break;
|
||||
}
|
||||
|
||||
if (!containsSpeech)
|
||||
_scriptPointer = _messagePtr;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
// case 0xD2: // SO_PRINT_WRAP Set print wordwrap
|
||||
// error("decodeParseString: SO_PRINT_MUMBLE");
|
||||
|
@ -573,6 +565,56 @@ void Scumm_v8::decodeParseString(int m, int n)
|
|||
}
|
||||
}
|
||||
|
||||
void Scumm::enqueueText(byte *text, int x, int y, byte color, byte charset, bool center)
|
||||
{
|
||||
BlastText &bt = _blastTextQueue[_blastTextQueuePos++];
|
||||
assert(_blastTextQueuePos <= 8);
|
||||
|
||||
strcpy((char *)bt.text, (const char *)text);
|
||||
bt.xpos = x;
|
||||
bt.ypos = y;
|
||||
bt.color = color;
|
||||
bt.charset = charset;
|
||||
bt.center = center;
|
||||
}
|
||||
|
||||
void Scumm::drawBlastTexts()
|
||||
{
|
||||
// FIXME
|
||||
|
||||
byte *buf;
|
||||
byte c;
|
||||
int i;
|
||||
|
||||
_charset->_ignoreCharsetMask = true;
|
||||
for (i = 0; i < _blastTextQueuePos; i++) {
|
||||
|
||||
buf = _blastTextQueue[i].text;
|
||||
|
||||
_charset->_top = _blastTextQueue[i].ypos;
|
||||
_charset->_startLeft = _charset->_left = _blastTextQueue[i].xpos;
|
||||
_charset->_right = _realWidth - 1;
|
||||
_charset->_center = _blastTextQueue[i].center;
|
||||
_charset->_color = _blastTextQueue[i].color;
|
||||
_charset->_disableOffsX = _charset->_firstChar = true;
|
||||
_charset->setCurID(_blastTextQueue[i].charset);
|
||||
_charset->_nextLeft = _blastTextQueue[i].xpos;
|
||||
_charset->_nextTop = _blastTextQueue[i].ypos;
|
||||
|
||||
do {
|
||||
c = *buf++;
|
||||
if (c != 0 && c != 0xFF) {
|
||||
_charset->_left = _charset->_nextLeft;
|
||||
_charset->_top = _charset->_nextTop;
|
||||
_charset->printChar(c);
|
||||
_charset->_nextLeft = _charset->_left;
|
||||
_charset->_nextTop = _charset->_top;
|
||||
}
|
||||
} while (c);
|
||||
}
|
||||
_charset->_ignoreCharsetMask = false;
|
||||
}
|
||||
|
||||
void Scumm_v8::o8_mod()
|
||||
{
|
||||
int a = pop();
|
||||
|
@ -732,7 +774,7 @@ void Scumm_v8::o8_arrayOps()
|
|||
void Scumm_v8::o8_blastText()
|
||||
{
|
||||
// FIXME
|
||||
decodeParseString(1, 0);
|
||||
decodeParseString(5, 0);
|
||||
}
|
||||
|
||||
void Scumm_v8::o8_cursorCommand()
|
||||
|
@ -1261,7 +1303,6 @@ void Scumm_v8::o8_verbOps()
|
|||
case 0xA6: // SO_VERB_CHARSET Choose charset for verb
|
||||
// FIXME - TODO
|
||||
vs->charset_nr = pop();
|
||||
//printf("Set to charset %d\n", vs->charset_nr);
|
||||
break;
|
||||
case 0xA7: // SO_VERB_LINE_SPACING Choose linespacing for verb
|
||||
// FIXME - TODO
|
||||
|
@ -1478,8 +1519,8 @@ void Scumm_v8::o8_kernelGetFunctions()
|
|||
int y = args[2] + (camera._cur.y - (_realHeight /2));;
|
||||
BlastObject *eo;
|
||||
|
||||
for (int i = _enqueuePos; i >= 0; i--) {
|
||||
eo = &_enqueuedObjects[i];
|
||||
for (int i = _blastObjectQueuePos; i >= 0; i--) {
|
||||
eo = &_blastObjectQueue[i];
|
||||
|
||||
if (eo->posX <= x && eo->width + eo->posX > x &&
|
||||
eo->posY <= y && eo->height + eo->posY > y) {
|
||||
|
|
|
@ -114,6 +114,14 @@ struct NestedScript {
|
|||
uint8 slot;
|
||||
};
|
||||
|
||||
struct BlastText {
|
||||
int16 xpos, ypos;
|
||||
byte color;
|
||||
byte charset;
|
||||
bool center;
|
||||
byte text[256];
|
||||
};
|
||||
|
||||
enum ResTypes {
|
||||
rtFirst = 1,
|
||||
rtRoom = 1,
|
||||
|
@ -792,12 +800,20 @@ public:
|
|||
uint _shakeFrame;
|
||||
int _screenStartStrip, _screenEndStrip;
|
||||
int _screenLeft, _screenTop;
|
||||
int _enqueuePos;
|
||||
BlastObject _enqueuedObjects[128];
|
||||
|
||||
int _blastObjectQueuePos;
|
||||
BlastObject _blastObjectQueue[128];
|
||||
|
||||
int _blastTextQueuePos;
|
||||
BlastText _blastTextQueue[8]; // FIXME - how many blast texts can there be at once?
|
||||
|
||||
void enqueueText(byte *text, int x, int y, byte color, byte charset, bool center);
|
||||
void drawBlastTexts();
|
||||
void removeBlastTexts() { _blastTextQueuePos = 0; }
|
||||
|
||||
void enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth,
|
||||
int objectHeight, int scaleX, int scaleY, int image, int mode);
|
||||
void clearEnqueue() { _enqueuePos = 0; }
|
||||
void clearEnqueue() { _blastObjectQueuePos = 0; }
|
||||
void drawBlastObjects();
|
||||
void drawBlastObject(BlastObject *eo);
|
||||
void removeBlastObjects();
|
||||
|
|
|
@ -558,8 +558,10 @@ int Scumm::scummLoop(int delta)
|
|||
}
|
||||
|
||||
drawBlastObjects();
|
||||
drawBlastTexts();
|
||||
drawDirtyScreenParts();
|
||||
removeBlastObjects();
|
||||
removeBlastTexts();
|
||||
|
||||
if (!(_features & GF_AFTER_V6))
|
||||
playActorSounds();
|
||||
|
|
|
@ -374,19 +374,15 @@ void Scumm::description()
|
|||
|
||||
do {
|
||||
c = *buf++;
|
||||
if (c == 0) {
|
||||
_haveMsg = 1;
|
||||
break;
|
||||
}
|
||||
if (c != 0xFF) {
|
||||
if (c != 0 && c != 0xFF) {
|
||||
_charset->_left = _charset->_nextLeft;
|
||||
_charset->_top = _charset->_nextTop;
|
||||
_charset->printChar(c);
|
||||
_charset->_nextLeft = _charset->_left;
|
||||
_charset->_nextTop = _charset->_top;
|
||||
continue;
|
||||
}
|
||||
} while (1);
|
||||
} while (c);
|
||||
_haveMsg = 1;
|
||||
|
||||
gdi._mask_left = _charset->_strLeft;
|
||||
gdi._mask_right = _charset->_strRight;
|
||||
|
@ -423,19 +419,15 @@ void Scumm::drawDescString(byte *msg)
|
|||
|
||||
do {
|
||||
c = *buf++;
|
||||
if (c == 0) {
|
||||
_haveMsg = 1;
|
||||
break;
|
||||
}
|
||||
if (c != 0xFF) {
|
||||
if (c != 0 && c != 0xFF) {
|
||||
_charset->_left = _charset->_nextLeft;
|
||||
_charset->_top = _charset->_nextTop;
|
||||
_charset->printChar(c);
|
||||
_charset->_nextLeft = _charset->_left;
|
||||
_charset->_nextTop = _charset->_top;
|
||||
continue;
|
||||
}
|
||||
} while (1);
|
||||
} while (c);
|
||||
_haveMsg = 1;
|
||||
|
||||
gdi._mask_left = _charset->_strLeft;
|
||||
gdi._mask_right = _charset->_strRight;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue