aboutsummaryrefslogtreecommitdiff
path: root/script_v2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'script_v2.cpp')
-rw-r--r--script_v2.cpp228
1 files changed, 160 insertions, 68 deletions
diff --git a/script_v2.cpp b/script_v2.cpp
index 3e83d89c54..09140c17d2 100644
--- a/script_v2.cpp
+++ b/script_v2.cpp
@@ -149,7 +149,7 @@ void Scumm::setupOpcodes2() {
&Scumm::o6_startObject,
&Scumm::o6_setObjectState,
&Scumm::o6_setObjectXY,
- &Scumm::o6_invalid,
+ &Scumm::o6_drawBlastObject,
/* 64 */
&Scumm::o6_invalid,
&Scumm::o6_stopObjectCode,
@@ -204,7 +204,7 @@ void Scumm::setupOpcodes2() {
&Scumm::o6_getActorRoom,
&Scumm::o6_getObjectX,
&Scumm::o6_getObjectY,
- &Scumm::o6_getObjectDir,
+ &Scumm::o6_getObjectOldDir,
/* 90 */
&Scumm::o6_getActorWalkBox,
&Scumm::o6_getActorCostume,
@@ -288,7 +288,7 @@ void Scumm::setupOpcodes2() {
/* D0 */
&Scumm::o6_invalid,
&Scumm::o6_invalid,
- &Scumm::o6_invalid,
+ &Scumm::o6_getAnimateVariable,
&Scumm::o6_invalid,
/* D4 */
&Scumm::o6_invalid,
@@ -322,7 +322,7 @@ void Scumm::setupOpcodes2() {
&Scumm::o6_invalid,
/* EC */
&Scumm::o6_invalid,
- &Scumm::o6_invalid,
+ &Scumm::o6_getObjectNewDir,
&Scumm::o6_invalid,
&Scumm::o6_invalid,
/* F0 */
@@ -350,6 +350,21 @@ void Scumm::setupOpcodes2() {
_opcodes = opcode_list;
}
+int Scumm::popRoomAndObj(int *room) {
+ int obj;
+
+ if (_features & GF_HAS_ROOMTABLE) {
+ obj = pop();
+ *room = getObjectRoom(obj);
+ } else {
+ *room = pop();
+ obj = pop();
+ }
+
+ return obj;
+}
+
+
int Scumm::readArray(int array, int index, int base) {
ArrayHeader *ah = (ArrayHeader*)getResourceAddress(rtString, readVar(array));
@@ -727,10 +742,11 @@ void Scumm::o6_cursorCommand() {
case 0x97:
_userPut--;
break;
- case 0x99:
- a = pop();
- setCursorImg(pop(), a, 1);
+ case 0x99: {
+ int room,obj = popRoomAndObj(&room);
+ setCursorImg(obj,room, 1);
break;
+ }
case 0x9A:
a = pop();
setCursorHotspot2(pop(),a);
@@ -839,15 +855,36 @@ void Scumm::o6_stopObjectScript() {
}
void Scumm::o6_panCameraTo() {
- panCameraTo(pop());
+#if defined(FULL_THROTTLE)
+ int y = pop();
+ int x = pop();
+ panCameraTo(x,y);
+#else
+ panCameraTo(pop(), 0);
+#endif
}
void Scumm::o6_actorFollowCamera() {
+#if defined(FULL_THROTTLE)
+ setCameraFollows(derefActorSafe(pop(), "actorFollowCamera"));
+#else
actorFollowCamera(pop());
+#endif
}
void Scumm::o6_setCameraAt() {
+#if defined(FULL_THROTTLE)
+ int x,y;
+
+ camera._follows = 0;
+
+ y = pop();
+ x = pop();
+
+ setCameraAt(x,y);
+#else
setCameraAtEx(pop());
+#endif
}
void Scumm::o6_loadRoom() {
@@ -924,17 +961,12 @@ void Scumm::o6_putActorInRoom() {
putActor(a, x, y, room);
}
+
void Scumm::o6_putActorAtObject() {
int room,obj,x,y;
Actor *a;
- if (_features & GF_HAS_ROOMTABLE) {
- obj = pop();
- room = getObjectRoom(obj);
- } else {
- room = pop();
- obj = pop();
- }
+ obj=popRoomAndObj(&room);
a = derefActorSafe(pop(), "o6_putActorAtObject");
if (whereIsObject(obj)!=WIO_NOT_FOUND) {
@@ -984,15 +1016,9 @@ void Scumm::o6_pickupObject() {
int obj, room;
int i;
- if (_features & GF_HAS_ROOMTABLE) {
- obj = pop();
- room = getObjectRoom(obj);
- } else {
- room = pop();
- obj = pop();
- if (room==0)
- room = _roomResource;
- }
+ obj=popRoomAndObj(&room);
+ if (room==0)
+ room = _roomResource;
for(i=1; i<_maxInventoryItems; i++) {
if (_inventory[i] == (uint16)obj) {
@@ -1018,14 +1044,8 @@ void Scumm::o6_loadRoomWithEgo() {
y = pop();
x = pop();
- if (_features & GF_HAS_ROOMTABLE) {
- obj = pop();
- room = getObjectRoom(obj);
- } else {
- room = pop();
- obj = pop();
- }
-
+ obj=popRoomAndObj(&room);
+
a = derefActorSafe(_vars[VAR_EGO], "o_loadRoomWithEgo");
putActor(a, 0, 0, room);
@@ -1036,8 +1056,10 @@ void Scumm::o6_loadRoomWithEgo() {
_vars[VAR_WALKTO_OBJ] = 0;
/* startScene maybe modifies VAR_EGO, i hope not */
- camera._destPos = camera._curPos = a->x;
+#if !defined(FULL_THROTTLE)
+ camera._dest.x = camera._cur.x = a->x;
setCameraFollows(a);
+#endif
_fullRedraw=1;
if (x != -1) {
startWalkActor(a, x, y, -1);
@@ -1083,14 +1105,12 @@ void Scumm::o6_getObjectY() {
push(getObjY(pop()));
}
-void Scumm::o6_getObjectDir() {
- int dir = getObjDir(pop());
-
- if (_features & GF_USE_ANGLES) {
- dir = oldDirToNewDir(dir);
- }
+void Scumm::o6_getObjectOldDir() {
+ push(getObjOldDir(pop()));
+}
- push(dir);
+void Scumm::o6_getObjectNewDir() {
+ push(getObjNewDir(pop()));
}
void Scumm::o6_getActorWalkBox() {
@@ -1136,7 +1156,7 @@ void Scumm::o6_setObjectName() {
if (obj < NUM_ACTORS)
error("Can't set actor %d name with new-name-of", obj);
- if (!getObjectAddress(obj))
+ if (!getOBCDFromObject(obj))
error("Can't set name of object %d", obj);
for (i=1; i<50; i++) {
@@ -1189,6 +1209,10 @@ void Scumm::o6_resourceRoutines() {
switch(fetchScriptByte()) {
case 100: /* load script */
res = pop();
+#if defined(FULL_THROTTLE)
+ if (res >= _numGlobalScripts)
+ break;
+#endif
ensureResourceLoaded(rtScript, res);
break;
case 101: /* load sound */
@@ -1205,6 +1229,10 @@ void Scumm::o6_resourceRoutines() {
break;
case 104: /* nuke script */
res = pop();
+#if defined(FULL_THROTTLE)
+ if (res >= _numGlobalScripts)
+ break;
+#endif
setResourceCounter(rtScript, res, 0x7F);
debug(5, "nuke script %d", res);
break;
@@ -1273,10 +1301,11 @@ void Scumm::o6_resourceRoutines() {
res = pop();
nukeCharset(res);
break;
- case 119:/* load fl object */
- res = (_features & GF_HAS_ROOMTABLE) ? -1 : pop();
- loadFlObject(pop(), res);
+ case 119: {/* load fl object */
+ int room,obj = popRoomAndObj(&room);
+ loadFlObject(obj,room);
break;
+ }
default:
error("o6_resourceRoutines: default case");
}
@@ -1290,9 +1319,9 @@ void Scumm::o6_roomOps() {
b = pop();
a = pop();
if (a < 160) a=160;
- if (a > ((_scrWidthIn8Unit-20)<<3)) a=((_scrWidthIn8Unit-20)<<3);
+ if (a > _scrWidth) a=_scrWidth;
if (b < 160) b=160;
- if (b > ((_scrWidthIn8Unit-20)<<3)) b=((_scrWidthIn8Unit-20)<<3);
+ if (b > _scrHeight) b=_scrHeight;
_vars[VAR_CAMERA_MIN_X] = a;
_vars[VAR_CAMERA_MAX_X] = b;
break;
@@ -1498,12 +1527,16 @@ FixRooms:;
a->animProgress = 0;
break;
case 98:
- a->unk1 = pop();
+ a->shadow_mode = pop();
break;
case 99:
a->new_1 = pop();
a->new_2 = pop();
break;
+ case 198: /* set anim variable */
+ i = pop(); /* value */
+ setAnimVar(a, pop(), i);
+ break;
case 215:
a->new_3 = 1;
break;
@@ -1513,19 +1546,32 @@ FixRooms:;
case 217:
initActor(a, 2);
break;
+ case 227: /* actor_layer */
+ a->layer = pop();
+ break;
+ case 228: /* walk script */
+ a->walk_script = pop();
+ break;
case 235: /* talk_script */
a->talk_script = pop();
break;
-
- case 198: /* set anim variable */
- case 227: /* actor_unk2 */
- case 228: /* actor script */
case 229: /* stand */
- case 230: /* turn? */
- case 231: /* turn? */
- case 233: /* ? */
- case 234: /* ? */
-
+ stopActorMoving(a);
+ startAnimActor(a, a->standFrame);
+ break;
+ case 230: /* set direction */
+ a->moving&=~4;
+ fixActorDirection(a, pop());
+ break;
+ case 231: /* turn to direction */
+ turnToDirection(a, pop());
+ break;
+ case 233: /* freeze actor */
+ a->moving|=0x80;
+ break;
+ case 234: /* unfreeze actor */
+ a->moving&=~0x7f;
+ break;
default:
error("o6_actorset: default case %d", b);
}
@@ -1787,21 +1833,27 @@ void Scumm::o6_wait() {
byte oldaddr;
switch(fetchScriptByte()) {
- case 168:
+ case 168: {
+ int offs = (int16)fetchScriptWord();
if (derefActorSafe(pop(), "o6_wait")->moving) {
- _scriptPointer += (int16)fetchScriptWord();
+ _scriptPointer += offs;
o6_breakHere();
- } else {
- fetchScriptWord();
}
return;
+ }
case 169:
if (_vars[VAR_HAVE_MSG])
break;
return;
case 170:
- if (camera._curPos>>3 != camera._destPos>>3)
+#if !defined(FULL_THROTTLE)
+ if (camera._cur.x>>3 != camera._dest.x>>3)
break;
+#else
+ if (camera._dest.x != camera._cur.x ||
+ camera._dest.y != camera._cur.y)
+ break;
+#endif
return;
case 171:
if (_sentenceNum) {
@@ -1813,6 +1865,24 @@ void Scumm::o6_wait() {
if (!isScriptInUse(_vars[VAR_SENTENCE_SCRIPT]))
return;
break;
+ case 226: { /* wait until actor drawn */
+ Actor *a = derefActorSafe(pop(), "o6_wait:226");
+ int offs = (int16)fetchScriptWord();
+ if (a->room==_currentRoom && a->needRedraw) {
+ _scriptPointer += offs;
+ o6_breakHere();
+ }
+ return;
+ }
+ case 232: { /* wait until actor stops turning */
+ Actor *a = derefActorSafe(pop(), "o6_wait:226");
+ int offs = (int16)fetchScriptWord();
+ if (a->room==_currentRoom && a->moving&4) {
+ _scriptPointer += offs;
+ o6_breakHere();
+ }
+ return;
+ }
default:
error("o6_wait: default case");
}
@@ -1829,6 +1899,11 @@ void Scumm::o6_getActorAnimCounter1() {
push(derefActorSafe(pop(),"o6_getActorAnimCounter")->cost.animCounter1);
}
+void Scumm::o6_getAnimateVariable() {
+ int var = pop();
+ push(getAnimVar(derefActorSafe(pop(),"o6_getAnimateVariable"), var));
+}
+
void Scumm::o6_soundKludge() {
int16 list[16];
getStackList(list,sizeof(list)/sizeof(list[0]));
@@ -2048,6 +2123,19 @@ void Scumm::o6_dummy_stacklist() {
error("opcode o6_dummy_stacklist invalid");
}
+void Scumm::o6_drawBlastObject() {
+ int16 args[16];
+ int a,b,c,d,e;
+
+ getStackList(args,sizeof(args)/sizeof(args[0]));
+ e = pop();
+ d = pop();
+ c = pop();
+ b = pop();
+ a = pop();
+ enqueueObject(a, b, c, d, e, 0xFF, 0xFF, 1, 0);
+}
+
void Scumm::o6_miscOps() {
int16 args[30];
int i;
@@ -2084,9 +2172,13 @@ void Scumm::o6_miscOps() {
case 15:
warning("o6_miscOps: stub15(%d)", args[1]);
break;
- case 16:
- warning("o6_miscOps: stub16(%d,%d,%d,%d)",args[1],args[2],args[3],args[4]);
+ case 16: {
+ byte buf[200];
+ _msgPtrToAdd = buf;
+ addMessageToStack(getStringAddress(_vars[VAR_STRING2DRAW]));
+ warning("o6_miscOps: drawString(%s,charset=%d,color=%d,x=%d,y=%d)",buf, args[1],args[2],args[3],args[4]);
break;
+ }
case 17:
warning("o6_miscOps: stub17(%d,%d,%d,%d)",args[1],args[2],args[3],args[4]);
break;
@@ -2109,13 +2201,13 @@ void Scumm::o6_miscOps() {
warning("o6_miscOps: stub114()");
break;
case 117:
- warning("o6_miscOps: stub117()");
+ freezeScripts(2);
break;
case 118:
- warning("o6_miscOps: stub118(%d,%d,%d,%d,%d,%d,%d,%d)",args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
+ enqueueObject(args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8], 3);
break;
case 119:
- warning("o6_miscOps: stub119(%d,%d,%d,%d,%d,%d,%d,%d)",args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
+ enqueueObject(args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8], 0);
break;
case 120:
warning("o6_miscOps: stub120(%d,%d)", args[1], args[2]);
@@ -2183,7 +2275,7 @@ void Scumm::o6_miscOps() {
case 111:
a = derefActorSafe(args[1], "o6_miscops: 111");
- a->unk1 = args[2] + args[3];
+ a->shadow_mode = args[2] + args[3];
break;
case 112:
@@ -2208,7 +2300,7 @@ void Scumm::o6_miscOps() {
case 119:
enqueueObject(args[1], args[2], args[3], args[4], args[5],
- args[6], args[7], args[8]);
+ args[6], args[7], args[8], 0);
break;
case 120: