enabled room & local scripts in V8; some more opcodes
svn-id: r6105
This commit is contained in:
parent
190685dc69
commit
13518c3d36
4 changed files with 57 additions and 22 deletions
|
@ -408,6 +408,7 @@ protected:
|
|||
|
||||
/* Version 8 script opcodes */
|
||||
void o8_mod();
|
||||
void o8_breakHereVar();
|
||||
void o8_wait();
|
||||
|
||||
void o8_dim();
|
||||
|
|
|
@ -247,8 +247,13 @@ void Scumm::getScriptBaseAddress()
|
|||
|
||||
case 3:
|
||||
case WIO_ROOM: /* room script */
|
||||
if (_features & GF_AFTER_V8) {
|
||||
_scriptOrgPointer = getResourceAddress(rtRoomScripts, _roomResource);
|
||||
_lastCodePtr = &res.address[rtRoomScripts][_roomResource];
|
||||
} else {
|
||||
_scriptOrgPointer = getResourceAddress(rtRoom, _roomResource);
|
||||
_lastCodePtr = &_baseRooms[_roomResource];
|
||||
}
|
||||
break;
|
||||
|
||||
case WIO_GLOBAL: /* global script */
|
||||
|
|
|
@ -169,7 +169,7 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o6_jump),
|
||||
OPCODE(o6_breakHere),
|
||||
/* 68 */
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o8_breakHereVar),
|
||||
OPCODE(o8_wait),
|
||||
OPCODE(o6_delay), // FIXME - is the delay period right?
|
||||
OPCODE(o6_delayLonger), // FIXME - is the delay period right?
|
||||
|
@ -202,7 +202,7 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o6_stopObjectScript), // FIXME - is this right?
|
||||
OPCODE(o6_cutscene),
|
||||
OPCODE(o6_endCutscene),
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_freezeUnfreeze),
|
||||
/* 84 */
|
||||
OPCODE(o6_beginOverride),
|
||||
OPCODE(o6_endOverride),
|
||||
|
@ -211,8 +211,8 @@ void Scumm_v8::setupOpcodes()
|
|||
/* 88 */
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_setClass),
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_setState),
|
||||
OPCODE(o6_setOwner),
|
||||
/* 8C */
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_invalid),
|
||||
|
@ -257,9 +257,9 @@ void Scumm_v8::setupOpcodes()
|
|||
OPCODE(o8_actorOps),
|
||||
OPCODE(o8_cameraOps),
|
||||
OPCODE(o8_verbOps),
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_startSound),
|
||||
/* B0 */
|
||||
OPCODE(o6_invalid),
|
||||
OPCODE(o6_startMusic),
|
||||
OPCODE(o6_stopSound),
|
||||
OPCODE(o8_soundKludge),
|
||||
OPCODE(o8_system),
|
||||
|
@ -528,6 +528,12 @@ void Scumm_v8::o8_mod()
|
|||
push(pop() % a);
|
||||
}
|
||||
|
||||
void Scumm_v8::o8_breakHereVar()
|
||||
{
|
||||
warning("o8_breakHereVar NYI");
|
||||
o6_breakHere();
|
||||
}
|
||||
|
||||
void Scumm_v8::o8_wait()
|
||||
{
|
||||
// TODO
|
||||
|
@ -821,8 +827,14 @@ void Scumm_v8::o8_roomOps()
|
|||
case 0x5A: // SO_ROOM_CYCLE_SPEED Set palette cycling speed
|
||||
case 0x5B: // SO_ROOM_COPY_PALETTE Copy palette
|
||||
case 0x5C: // SO_ROOM_NEW_PALETTE Create new palette
|
||||
error("o8_roomOps: default case %d", subOp);
|
||||
break;
|
||||
case 0x5D: // SO_ROOM_SAVE_GAME Save game
|
||||
warning("V8 Save game opcode not implemented");
|
||||
break;
|
||||
case 0x5E: // SO_ROOM_LOAD_GAME Load game
|
||||
warning("V8 Load game opcode not implemented");
|
||||
break;
|
||||
case 0x5F: // SO_ROOM_SATURATION Set saturation of room colors
|
||||
default:
|
||||
error("o8_roomOps: default case %d", subOp);
|
||||
|
@ -1078,9 +1090,11 @@ void Scumm_v8::o8_verbOps()
|
|||
|
||||
void Scumm_v8::o8_soundKludge()
|
||||
{
|
||||
// TODO
|
||||
int16 args[30];
|
||||
int16 args[16];
|
||||
getStackList(args, sizeof(args) / sizeof(args[0]));
|
||||
|
||||
// FIXME - is this right?
|
||||
_sound->soundKludge(args);
|
||||
}
|
||||
|
||||
void Scumm_v8::o8_system()
|
||||
|
@ -1108,13 +1122,13 @@ void Scumm_v8::o8_kludge()
|
|||
// not used
|
||||
break;
|
||||
case 22:
|
||||
warning("o8_kludge: BannerSetBannerColor(%d, %d, %d, %d)", args[1], args[2], args[3], args[4]);
|
||||
// warning("o8_kludge: BannerSetBannerColor(%d, %d, %d, %d)", args[1], args[2], args[3], args[4]);
|
||||
break;
|
||||
case 29:
|
||||
warning("o8_kludge: opcode 29 (%d, %d)", args[1], args[2]);
|
||||
break;
|
||||
case 108:
|
||||
warning("o8_kludge: PaletteBuildRedirection(%d, %d, %d, %d, %d, %d)", args[1], args[2], args[3], args[4], args[5], args[6]);
|
||||
// warning("o8_kludge: PaletteBuildRedirection(%d, %d, %d, %d, %d, %d)", args[1], args[2], args[3], args[4], args[5], args[6]);
|
||||
break;
|
||||
case 12:
|
||||
case 13:
|
||||
|
|
|
@ -709,7 +709,7 @@ void Scumm::initRoomSubBlocks()
|
|||
{
|
||||
int i, offs;
|
||||
byte *ptr;
|
||||
byte *roomptr, *searchptr;
|
||||
byte *roomptr, *searchptr, *roomResPtr;
|
||||
RoomHeader *rmhd;
|
||||
|
||||
_ENCD_offs = 0;
|
||||
|
@ -723,7 +723,10 @@ void Scumm::initRoomSubBlocks()
|
|||
for (i = 1; i < _maxScaleTable; i++)
|
||||
nukeResource(rtScaleTable, i);
|
||||
|
||||
roomptr = getResourceAddress(rtRoom, _roomResource);
|
||||
// Determine the room and room script base address
|
||||
roomResPtr = roomptr = getResourceAddress(rtRoom, _roomResource);
|
||||
if (_features & GF_AFTER_V8)
|
||||
roomResPtr = getResourceAddress(rtRoomScripts, _roomResource);
|
||||
|
||||
rmhd = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
|
||||
|
||||
|
@ -748,17 +751,19 @@ void Scumm::initRoomSubBlocks()
|
|||
findResource(MKID('IM00'),
|
||||
findResource(MKID('RMIM'), roomptr)) - roomptr;
|
||||
|
||||
ptr = findResourceData(MKID('EXCD'), roomptr);
|
||||
// Look for an exit script
|
||||
ptr = findResourceData(MKID('EXCD'), roomResPtr);
|
||||
if (ptr) {
|
||||
_EXCD_offs = ptr - roomptr;
|
||||
_EXCD_offs = ptr - roomResPtr;
|
||||
#ifdef DUMP_SCRIPTS
|
||||
dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
|
||||
#endif
|
||||
}
|
||||
|
||||
ptr = findResourceData(MKID('ENCD'), roomptr);
|
||||
// Look for an entry script
|
||||
ptr = findResourceData(MKID('ENCD'), roomResPtr);
|
||||
if (ptr) {
|
||||
_ENCD_offs = ptr - roomptr;
|
||||
_ENCD_offs = ptr - roomResPtr;
|
||||
#ifdef DUMP_SCRIPTS
|
||||
dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
|
||||
#endif
|
||||
|
@ -833,9 +838,19 @@ void Scumm::initRoomSubBlocks()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Setup local script
|
||||
//
|
||||
memset(_localScriptList, 0, sizeof(_localScriptList));
|
||||
|
||||
searchptr = roomptr = getResourceAddress(rtRoom, _roomResource);
|
||||
// Determine the room script base address
|
||||
roomResPtr = roomptr = getResourceAddress(rtRoom, _roomResource);
|
||||
if (_features & GF_AFTER_V8)
|
||||
roomResPtr = getResourceAddress(rtRoomScripts, _roomResource);
|
||||
searchptr = roomResPtr;
|
||||
|
||||
if (_features & GF_SMALL_HEADER) {
|
||||
while ((ptr = findResourceSmall(MKID('LSCR'), searchptr)) != NULL) {
|
||||
int id = 0;
|
||||
|
@ -860,14 +875,14 @@ void Scumm::initRoomSubBlocks()
|
|||
if (_features & GF_AFTER_V8) {
|
||||
id = READ_LE_UINT32(ptr);
|
||||
checkRange(NUM_LOCALSCRIPT + _numGlobalScripts, _numGlobalScripts, id, "Invalid local script %d");
|
||||
_localScriptList[id - _numGlobalScripts] = ptr + 4 - roomptr;
|
||||
_localScriptList[id - _numGlobalScripts] = ptr + 4 - roomResPtr;
|
||||
} else if (_features & GF_AFTER_V7) {
|
||||
id = READ_LE_UINT16(ptr);
|
||||
checkRange(NUM_LOCALSCRIPT + _numGlobalScripts, _numGlobalScripts, id, "Invalid local script %d");
|
||||
_localScriptList[id - _numGlobalScripts] = ptr + 2 - roomptr;
|
||||
_localScriptList[id - _numGlobalScripts] = ptr + 2 - roomResPtr;
|
||||
} else {
|
||||
id = ptr[0];
|
||||
_localScriptList[id - _numGlobalScripts] = ptr + 1 - roomptr;
|
||||
_localScriptList[id - _numGlobalScripts] = ptr + 1 - roomResPtr;
|
||||
}
|
||||
#ifdef DUMP_SCRIPTS
|
||||
do {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue