[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.57,1.58 script_v6.cpp,1.40,1.41 script_v8.cpp,2.117,2.118 scumm.h,1.134,1.135 scummvm.cpp,2.39,2.40 string.cpp,1.78,1.79
Max Horn
fingolfin at users.sourceforge.net
Wed Jan 15 16:41:03 CET 2003
Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv10064/scumm
Modified Files:
object.cpp script_v6.cpp script_v8.cpp scumm.h scummvm.cpp
string.cpp
Log Message:
first blastText version. this is work in progress (note that e.g. text is not clipped, and the extra information is not removed)
Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- object.cpp 14 Jan 2003 10:05:40 -0000 1.57
+++ object.cpp 16 Jan 2003 00:40:19 -0000 1.58
@@ -1271,12 +1271,12 @@
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 @@
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 @@
BlastObject *eo;
int i;
- eo = _enqueuedObjects;
- for (i = 0; i < _enqueuePos; i++, eo++) {
+ eo = _blastObjectQueue;
+ for (i = 0; i < _blastObjectQueuePos; i++, eo++) {
removeBlastObject(eo);
}
Index: script_v6.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v6.cpp,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- script_v6.cpp 14 Jan 2003 10:33:18 -0000 1.40
+++ script_v6.cpp 16 Jan 2003 00:40:19 -0000 1.41
@@ -2294,8 +2294,8 @@
void Scumm_v6::o6_printEgo()
{
- push(_vars[VAR_EGO]);
- decodeParseString(0, 1);
+ _actorToPrintStrFor = _vars[VAR_EGO];
+ decodeParseString(0, 0);
}
void Scumm_v6::o6_talkActor()
Index: script_v8.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
retrieving revision 2.117
retrieving revision 2.118
diff -u -d -r2.117 -r2.118
--- script_v8.cpp 15 Jan 2003 16:23:04 -0000 2.117
+++ script_v8.cpp 16 Jan 2003 00:40:19 -0000 2.118
@@ -199,7 +199,7 @@
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 @@
/* 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 @@
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 @@
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 @@
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 @@
/* 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::decodeParseString(int m, int n)
{
byte b;
+ bool containsSpeech;
b = fetchScriptByte();
@@ -468,7 +469,7 @@
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 @@
_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 @@
_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;
@@ -511,8 +509,10 @@
break;
case 0xD1:
_messagePtr = _scriptPointer;
+
+ containsSpeech = (_messagePtr[0] == '/');
- if (_messagePtr[0] == '/') {
+ if (containsSpeech) {
char pointer[20];
int i, j;
@@ -530,40 +530,32 @@
// _sound->_talkChannel = _sound->playBundleSound(pointer);
_messagePtr = _transText;
-
- switch (m) {
- case 0:
- actorTalk();
- break;
- case 1:
- drawString(1);
- break;
- case 2:
- unkMessage1();
- break;
- case 3:
- unkMessage2();
- break;
- }
- return;
- } else {
- switch (m) {
- case 0:
- actorTalk();
- break;
- case 1:
- drawString(1);
- break;
- case 2:
- unkMessage1();
- break;
- case 3:
- unkMessage2();
- break;
+ }
+
+ switch (m) {
+ case 0:
+ actorTalk();
+ break;
+ case 1:
+ drawString(1);
+ break;
+ case 2:
+ unkMessage1();
+ break;
+ 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);
}
- _scriptPointer = _messagePtr;
- return;
+ break;
}
+
+ if (!containsSpeech)
+ _scriptPointer = _messagePtr;
break;
// case 0xD2: // SO_PRINT_WRAP Set print wordwrap
// error("decodeParseString: SO_PRINT_MUMBLE");
@@ -573,6 +565,56 @@
}
}
+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_blastText()
{
// FIXME
- decodeParseString(1, 0);
+ decodeParseString(5, 0);
}
void Scumm_v8::o8_cursorCommand()
@@ -1261,7 +1303,6 @@
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 @@
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) {
Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -d -r1.134 -r1.135
--- scumm.h 15 Jan 2003 16:23:04 -0000 1.134
+++ scumm.h 16 Jan 2003 00:40:19 -0000 1.135
@@ -113,7 +113,15 @@
uint8 where;
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 @@
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();
Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.39
retrieving revision 2.40
diff -u -d -r2.39 -r2.40
--- scummvm.cpp 13 Jan 2003 18:59:50 -0000 2.39
+++ scummvm.cpp 16 Jan 2003 00:40:19 -0000 2.40
@@ -558,8 +558,10 @@
}
drawBlastObjects();
+ drawBlastTexts();
drawDirtyScreenParts();
removeBlastObjects();
+ removeBlastTexts();
if (!(_features & GF_AFTER_V6))
playActorSounds();
Index: string.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/string.cpp,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- string.cpp 31 Dec 2002 14:59:06 -0000 1.78
+++ string.cpp 16 Jan 2003 00:40:19 -0000 1.79
@@ -374,19 +374,15 @@
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 @@
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;
More information about the Scummvm-git-logs
mailing list