[Scummvm-cvs-logs] CVS: scummvm/scumm actor.cpp,1.271,1.272 akos.cpp,1.141,1.142 debugger.cpp,1.127,1.128 intern.h,2.202,2.203 resource.cpp,1.255,1.256 script.cpp,1.183,1.184 script_v72he.cpp,2.27,2.28 script_v7he.cpp,2.49,2.50 scumm.cpp,1.154,1.155 scumm.h,1.456,1.457
Travis Howell
kirben at users.sourceforge.net
Fri Aug 27 20:20:21 CEST 2004
Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22119/scumm
Modified Files:
actor.cpp akos.cpp debugger.cpp intern.h resource.cpp
script.cpp script_v72he.cpp script_v7he.cpp scumm.cpp scumm.h
Log Message:
akos should queue commmands and executate after drawing costumes (Caused race issues in HE games).
Remove some duplciate code
Enable from HE games
Add a few stubs for some additional akos codes
Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
retrieving revision 1.271
retrieving revision 1.272
diff -u -d -r1.271 -r1.272
--- actor.cpp 22 Aug 2004 08:53:53 -0000 1.271
+++ actor.cpp 28 Aug 2004 03:18:49 -0000 1.272
@@ -962,6 +962,9 @@
}
delete [] actors;
+
+ if (_features & GF_NEW_COSTUMES)
+ akos_processQueue();
}
// Used in Scumm v8, to allow the verb coin to be drawn over the inventory
Index: akos.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/akos.cpp,v
retrieving revision 1.141
retrieving revision 1.142
diff -u -d -r1.141 -r1.142
--- akos.cpp 26 Aug 2004 14:28:41 -0000 1.141
+++ akos.cpp 28 Aug 2004 03:18:51 -0000 1.142
@@ -29,6 +29,8 @@
#include "scumm/imuse_digi/dimuse.h"
#include "scumm/sound.h"
+#include "common/util.h"
+
namespace Scumm {
#if !defined(__GNUC__)
@@ -59,6 +61,7 @@
AKC_SetVar = 0xC010,
AKC_CmdQue3 = 0xC015,
AKC_ComplexChan = 0xC020,
+ AKC_Unk3 = 0xC021,
AKC_Unk2 = 0xC025,
AKC_Jump = 0xC030,
AKC_JumpIfSet = 0xC031,
@@ -96,6 +99,7 @@
AKC_SkipG = 0xC094,
AKC_SkipGE = 0xC095,
AKC_ClearFlag = 0xC09F,
+ AKC_Unk4 = 0xC0A1,
AKC_EndSeq = 0xC0FF
};
@@ -282,6 +286,9 @@
if (code == AKC_Return || code == AKC_EndSeq)
return 0;
+ if (code == 0xC025)
+ error("akos_drawLimb: unsupported case %x", code);
+
if (code != AKC_ComplexChan) {
off = akof + (code & 0xFFF);
@@ -1163,6 +1170,7 @@
case AKC_Flip:
case AKC_Jump:
case AKC_StartAnimInActor:
+ case AKC_Unk4:
curpos += 4;
break;
case AKC_ComplexChan:
@@ -1173,10 +1181,14 @@
curpos += (aksq[curpos] & 0x80) ? 2 : 1;
}
break;
+ case AKC_Unk3:
+ curpos += aksq[curpos + 2];
+ break;
default:
if ((code & 0xC000) == 0xC000)
error("akos_increaseAnim: invalid code %x", code);
curpos += (code & 0x8000) ? 2 : 1;
+ break;
}
break;
case 2:
@@ -1296,6 +1308,7 @@
case AKC_ComplexChan:
case AKC_Unk1:
case AKC_Unk2:
+ case AKC_Unk3:
break;
case AKC_Cmd3:
@@ -1314,6 +1327,9 @@
flag_value = true;
continue;
+ case AKC_Unk4:
+ curpos = GUW(2);
+ break;
default:
if ((code & 0xC000) == 0xC000)
error("Undefined uSweat token %X", code);
@@ -1332,56 +1348,84 @@
}
void ScummEngine::akos_queCommand(byte cmd, Actor *a, int param_1, int param_2) {
- switch (cmd) {
- case 1:
- a->putActor(0, 0, 0);
- break;
- case 2:
- warning("unimplemented akos_queCommand(2,%d,%d,%d)", a->number, param_1, param_2);
- // start script token in actor
- break;
- case 3:
- if (param_1 != 0) {
- if (_features & GF_DIGI_IMUSE)
- _imuseDigital->startSfx(param_1, 63);
- else
- _sound->addSoundToQueue(param_1);
- }
- break;
- case 4:
- a->startAnimActor(param_1);
- break;
- case 5:
- a->forceClip = param_1;
- break;
- case 6:
- a->offs_x = param_1;
- a->offs_y = param_2;
- break;
- case 7:
- if (param_1 != 0) {
- if (_imuseDigital) {
- _imuseDigital->setVolume(param_1, param_2);
+ if (_queuePos > 32)
+ error("overflow");
+;
+ _queuePos++;
+ _queueCmd[_queuePos] = cmd;
+ _queueActor[_queuePos] = a->number;
+ _queueParam1[_queuePos] = param_1;
+ _queueParam2[_queuePos] = param_2;
+
+
+ warning("_queuePos %d", _queuePos);
+}
+
+
+
+void ScummEngine::akos_processQueue() {
+ byte cmd;
+ int actor, param_1, param_2;
+
+ while (_queuePos) {
+ cmd = _queueCmd[_queuePos];
+ actor = _queueActor[_queuePos];
+ param_1 = _queueParam1[_queuePos];
+ param_2 = _queueParam2[_queuePos];
+ _queuePos--;
+
+ Actor *a = derefActor(actor, "akos_processQueue");
+
+ switch (cmd) {
+ case 1:
+ a->putActor(0, 0, 0);
+ break;
+ case 2:
+ warning("unimplemented akos_queCommand(2,%d,%d,%d)", a->number, param_1, param_2);
+ // start script token in actor
+ break;
+ case 3:
+ if (param_1 != 0) {
+ if (_features & GF_DIGI_IMUSE)
+ _imuseDigital->startSfx(param_1, 63);
+ else
+ _sound->addSoundToQueue(param_1);
}
- }
- break;
- case 8:
- if (param_1 != 0) {
- if (_imuseDigital) {
- _imuseDigital->setPan(param_1, param_2);
+ break;
+ case 4:
+ a->startAnimActor(param_1);
+ break;
+ case 5:
+ a->forceClip = param_1;
+ break;
+ case 6:
+ a->offs_x = param_1;
+ a->offs_y = param_2;
+ break;
+ case 7:
+ if (param_1 != 0) {
+ if (_imuseDigital) {
+ _imuseDigital->setVolume(param_1, param_2);
+ }
}
- }
- break;
- case 9:
- if (param_1 != 0) {
- if (_imuseDigital) {
- _imuseDigital->setPriority(param_1, param_2);
+ break;
+ case 8:
+ if (param_1 != 0) {
+ if (_imuseDigital) {
+ _imuseDigital->setPan(param_1, param_2);
+ }
}
+ break;
+ case 9:
+ if (param_1 != 0) {
+ if (_imuseDigital) {
+ _imuseDigital->setPriority(param_1, param_2);
+ }
+ }
+ break;
+ default:
+ warning("akos_queCommand(%d,%d,%d,%d)", cmd, a->number, param_1, param_2);
}
- break;
-
- default:
- warning("akos_queCommand(%d,%d,%d,%d)", cmd, a->number, param_1, param_2);
}
}
Index: debugger.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/debugger.cpp,v
retrieving revision 1.127
retrieving revision 1.128
diff -u -d -r1.127 -r1.128
--- debugger.cpp 15 Aug 2004 14:40:02 -0000 1.127
+++ debugger.cpp 28 Aug 2004 03:18:51 -0000 1.128
@@ -364,7 +364,7 @@
bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
Actor *a;
int actnum;
- int value = 0;
+ int value = 0, value2 = 0;
if (argc < 3) {
DebugPrintf("Syntax: actor <actornum> <command> <parameter>\n");
@@ -380,8 +380,15 @@
a = &_vm->_actors[actnum];
if (argc > 3)
value = atoi(argv[3]);
+ if (argc > 4)
+ value2 = atoi(argv[4]);
- if (!strcmp(argv[2], "ignoreboxes")) {
+ if (!strcmp(argv[2], "animvar")) {
+
+ a->setAnimVar(value, value2);
+ DebugPrintf("Actor[%d].animVar[%d] = %d\n", actnum, value, a->getAnimVar(value));
+
+ } else if (!strcmp(argv[2], "ignoreboxes")) {
a->ignoreBoxes = (value > 0);
DebugPrintf("Actor[%d].ignoreBoxes = %d\n", actnum, a->ignoreBoxes);
} else if (!strcmp(argv[2], "x")) {
Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.202
retrieving revision 2.203
diff -u -d -r2.202 -r2.203
--- intern.h 26 Aug 2004 14:56:10 -0000 2.202
+++ intern.h 28 Aug 2004 03:18:51 -0000 2.203
@@ -711,7 +711,6 @@
void o72_getPixel();
void o72_pickVarRandom();
void o72_redimArray();
- void o72_stringLen();
void o72_readINI();
void o72_unknownF4();
void o72_unknownF8();
Index: resource.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/resource.cpp,v
retrieving revision 1.255
retrieving revision 1.256
diff -u -d -r1.255 -r1.256
--- resource.cpp 26 Aug 2004 23:30:27 -0000 1.255
+++ resource.cpp 28 Aug 2004 03:18:52 -0000 1.256
@@ -992,19 +992,17 @@
total_size = _fileHandle.readUint32BE();
_fileHandle.read(createResource(type, idx, total_size), total_size - 8);
return 1;
+ } else if (basetag == MKID('HDHS')) {
+ _fileHandle.seek(-12, SEEK_CUR);
+ total_size = _fileHandle.readUint32BE();
+ _fileHandle.read(createResource(type, idx, total_size), total_size - 8);
+ return 1;
} else if (basetag == MKID('TALK')) {
- debugC(DEBUG_SOUND, "Found base tag TALK in sound %d, size %d", idx, total_size);
- debugC(DEBUG_SOUND, "It was at position %d", _fileHandle.pos());
-
_fileHandle.seek(-12, SEEK_CUR);
total_size = _fileHandle.readUint32BE();
_fileHandle.read(createResource(type, idx, total_size), total_size - 8);
return 1;
} else if (basetag == MKID('DIGI')) {
- // Use in Putt-Putt Demo
- debugC(DEBUG_SOUND, "Found base tag DIGI in sound %d, size %d", idx, total_size);
- debugC(DEBUG_SOUND, "It was at position %d", _fileHandle.pos());
-
_fileHandle.seek(-12, SEEK_CUR);
total_size = _fileHandle.readUint32BE();
_fileHandle.read(createResource(type, idx, total_size), total_size - 8);
Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script.cpp,v
retrieving revision 1.183
retrieving revision 1.184
diff -u -d -r1.183 -r1.184
--- script.cpp 26 Aug 2004 23:30:27 -0000 1.183
+++ script.cpp 28 Aug 2004 03:18:52 -0000 1.184
@@ -516,7 +516,7 @@
}
if (var & 0x8000) {
- if (_gameId == GID_PAJAMA) {
+ if (_gameId == GID_PAJAMA || _gameId == GID_WATER) {
var &= 0xFFF;
checkRange(_numRoomVariables - 1, 0, var, "Room variable %d out of range(w)");
return _roomVars[var];
@@ -599,7 +599,7 @@
}
if (var & 0x8000) {
- if (_gameId == GID_PAJAMA) {
+ if (_gameId == GID_PAJAMA || _gameId == GID_WATER) {
var &= 0xFFF;
checkRange(_numRoomVariables - 1, 0, var, "Room variable %d out of range(w)");
_roomVars[var] = value;
Index: script_v72he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v72he.cpp,v
retrieving revision 2.27
retrieving revision 2.28
diff -u -d -r2.27 -r2.28
--- script_v72he.cpp 26 Aug 2004 14:56:10 -0000 2.27
+++ script_v72he.cpp 28 Aug 2004 03:18:52 -0000 2.28
@@ -343,7 +343,7 @@
/* EC */
OPCODE(o6_invalid),
OPCODE(o6_invalid),
- OPCODE(o72_stringLen),
+ OPCODE(o7_stringLen),
OPCODE(o6_invalid),
/* F0 */
OPCODE(o6_invalid),
@@ -1142,24 +1142,6 @@
}
-void ScummEngine_v72he::o72_stringLen() {
- int a, len;
- byte *addr;
-
- a = pop();
-
- addr = getStringAddress(a);
- if (!addr) {
- // FIXME: should be error here
- warning("o72_stringLen: Reference to zeroed array pointer (%d)", a);
- push(0);
- return;
- }
-
- len = strlen((char *)getStringAddress(a));
- push(len);
-}
-
void ScummEngine_v72he::o72_readINI() {
byte name[100];
int type;
@@ -1185,16 +1167,22 @@
void ScummEngine_v72he::o72_unknownF4() {
byte b;
+ byte name[256], name2[1024];
+
b = fetchScriptByte();
switch (b) {
case 6:
pop();
+ copyScriptString(name);
break;
+ warning("o72_unknownF4 stub (%s)", name);
case 7:
+ copyScriptString(name2);
+ copyScriptString(name);
+ warning("o72_unknownF4 stub (%s, %s)", name, name2);
break;
}
- warning("o72_unknownF4 stub");
}
void ScummEngine_v72he::o72_unknownFA() {
Index: script_v7he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v7he.cpp,v
retrieving revision 2.49
retrieving revision 2.50
diff -u -d -r2.49 -r2.50
--- script_v7he.cpp 26 Aug 2004 14:28:41 -0000 2.49
+++ script_v7he.cpp 28 Aug 2004 03:18:52 -0000 2.50
@@ -41,12 +41,6 @@
namespace Scumm {
-// Compatibility notes:
-//
-// FREDDEMO (freddemo)
-// stringLen is completely different
-// unknownF4 is completely different
-
#define OPCODE(x) { &ScummEngine_v7he::x, #x }
void ScummEngine_v7he::setupOpcodes() {
@@ -421,9 +415,14 @@
switch (subOp) {
case 0x13: // HE 7.2 (Not all games)
case 0x14:
- // Maybe load cursor image
+ // Loads cursors from another resource
+ // Use old cursors for now
a = pop();
- warning("o7_cursorCommand: case %d (%d)", subOp, a);
+ if (a == 2)
+ _Win32ResExtractor->setCursor(102);
+ else if (a == 5)
+ _Win32ResExtractor->setCursor(103);
+ debug(1, "o7_cursorCommand: case %x (%d)", subOp, a);
break;
case 0x90: // SO_CURSOR_ON Turn cursor on
_cursor.state = 1;
@@ -718,20 +717,16 @@
}
void ScummEngine_v7he::o7_stringLen() {
- int a, len;
+ int id, len;
byte *addr;
- a = pop();
+ id = pop();
- addr = getStringAddress(a);
- if (!addr) {
- // FIXME: should be error here
- warning("o7_stringLen: Reference to zeroed array pointer (%d)", a);
- push(0);
- return;
- }
+ addr = getStringAddress(id);
+ if (!addr)
+ error("o72_stringLen: Reference to zeroed array pointer (%d)", id);
- len = stringLen(addr);
+ len = strlen((char *)getStringAddress(id));
push(len);
}
Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -d -r1.154 -r1.155
--- scumm.cpp 26 Aug 2004 23:30:27 -0000 1.154
+++ scumm.cpp 28 Aug 2004 03:18:52 -0000 1.155
@@ -277,7 +277,6 @@
{"pajama", "Pajama Sam 1: No Need to Hide When It's Dark Outside", GID_PAJAMA, 6, 72, MDT_NONE,
GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0, 0},
-#ifdef HEGAMES
// Humongous Entertainment Scumm Version 9.0 ? Scummsys.90
{"kinddemo", "Big Thinkers Kindergarten (Demo)", GID_PAJAMA, 6, 90, MDT_NONE,
GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0, 0},
@@ -304,6 +303,7 @@
{"chase", "Spy Fox in Cheese Chase Game", GID_HEGAME, 6, 90, MDT_NONE,
GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0, 0},
+#ifdef HEGAMES
// Humongous Entertainment Scumm Version 9.8 ? Scummsys.98
// these and later games can easily be identified by the .(a) file instead of a .he1
// and INIB chunk in the .he0
@@ -659,6 +659,12 @@
_heSndSoundFreq = 0;
memset(_timers, 0, sizeof(_timers));
+ memset(_queueCmd, 0, sizeof(_queueCmd));
+ memset(_queueActor, 0, sizeof(_queueActor));
+ memset(_queueParam1, 0, sizeof(_queueParam1));
+ memset(_queueParam2, 0, sizeof(_queueParam2));
+ _queuePos = 0;
+
//
// Init all VARS to 0xFF
//
@@ -1367,8 +1373,11 @@
} else if (_version >= 7) {
VAR(VAR_V6_EMSSPACE) = 10000;
VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
- } else if (_heversion >= 72) {
+ } else if (_heversion >= 71) {
// TODO
+
+ // Set amount of sound channels
+ VAR(9) = 8;
} else {
VAR(VAR_CURRENTDRIVE) = 0;
switch (_midiDriver) {
Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.456
retrieving revision 1.457
diff -u -d -r1.456 -r1.457
--- scumm.h 26 Aug 2004 23:30:28 -0000 1.456
+++ scumm.h 28 Aug 2004 03:18:52 -0000 1.457
@@ -840,9 +840,16 @@
int cost_frameToAnim(Actor *a, int frame);
// Akos Class
+ int16 _queueCmd[32];
+ int16 _queueActor[32];
+ int16 _queueParam1[32];
+ int16 _queueParam2[32];
+ int16 _queuePos;
+
bool akos_increaseAnims(const byte *akos, Actor *a);
bool akos_increaseAnim(Actor *a, int i, const byte *aksq, const uint16 *akfo, int numakfo);
void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2);
+ void akos_processQueue();
void akos_decodeData(Actor *a, int frame, uint usemask);
int akos_frameToAnim(Actor *a, int frame);
bool akos_hasManyDirections(int costume);
More information about the Scummvm-git-logs
mailing list