aboutsummaryrefslogtreecommitdiff
path: root/script_v2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'script_v2.cpp')
-rw-r--r--script_v2.cpp282
1 files changed, 232 insertions, 50 deletions
diff --git a/script_v2.cpp b/script_v2.cpp
index cb98b718eb..f4f2155d53 100644
--- a/script_v2.cpp
+++ b/script_v2.cpp
@@ -276,7 +276,7 @@ void Scumm::setupOpcodes2() {
&Scumm::o6_distObjectPt,
&Scumm::o6_distPtPt,
/* C8 */
- &Scumm::o6_invalid,
+ &Scumm::o6_kernelFunction,
&Scumm::o6_miscOps,
&Scumm::o6_breakMaybe,
&Scumm::o6_pickOneOf,
@@ -292,11 +292,11 @@ void Scumm::setupOpcodes2() {
&Scumm::o6_invalid,
/* D4 */
&Scumm::o6_invalid,
- &Scumm::o6_invalid,
+ &Scumm::o6_jumpToScript,
&Scumm::o6_invalid,
&Scumm::o6_invalid,
/* D8 */
- &Scumm::o6_invalid,
+ &Scumm::o6_isRoomScriptRunning,
&Scumm::o6_invalid,
&Scumm::o6_invalid,
&Scumm::o6_invalid,
@@ -353,7 +353,9 @@ void Scumm::setupOpcodes2() {
int Scumm::readArray(int array, int index, int base) {
ArrayHeader *ah = (ArrayHeader*)getResourceAddress(rtString, readVar(array));
- assert(ah);
+ if (ah==NULL) {
+ error("readArray: invalid array %d (%d)", array, readVar(array));
+ }
base += index*ah->dim1_size;
@@ -617,6 +619,17 @@ void Scumm::o6_startScriptEx() {
runScript(script, flags&1, flags&2, args);
}
+void Scumm::o6_jumpToScript() {
+ int16 args[16];
+ int script,flags;
+
+ getStackList(args,sizeof(args)/sizeof(args[0]));
+ script = pop();
+ flags = pop();
+ o6_stopObjectCode();
+ runScript(script, flags&1, flags&2, args);
+}
+
void Scumm::o6_startScript() {
int16 args[16];
int script;
@@ -638,14 +651,19 @@ void Scumm::o6_startObject() {
void Scumm::o6_setObjectState() {
int a = pop();
+ int b = pop();
if (a==0) a=1;
- setObjectState(pop(), a, -1, -1);
+// debug(1, "setObjectState(%d,%d)", a, b);
+
+ setObjectState(b, a, -1, -1);
}
void Scumm::o6_setObjectXY() {
int y = pop();
int x = pop();
- setObjectState(pop(), 1, x, y);
+ int obj = pop();
+// debug(1, "setObjectXY(%d,%d,%d)", obj, x, y);
+ setObjectState(obj, 1, x, y);
}
void Scumm::o6_stopObjectCode() {
@@ -711,7 +729,7 @@ void Scumm::o6_cursorCommand() {
break;
case 0x99:
a = pop();
- setCursorImg(a, pop());
+ setCursorImg(a, pop(), 1);
break;
case 0x9A:
a = pop();
@@ -728,6 +746,8 @@ void Scumm::o6_cursorCommand() {
case 0xD6:
makeCursorColorTransparent(pop());
break;
+ default:
+ error("o6_cursorCommand: default case");
}
_vars[VAR_CURSORSTATE] = _cursorState;
@@ -783,6 +803,8 @@ void Scumm::o6_setState() {
int state = pop();
int obj = pop();
+// debug(1, "setState(%d,%d)", obj, state);
+
putState(obj, state);
removeObjectFromRoom(obj);
if (_BgNeedsRedraw)
@@ -851,7 +873,7 @@ void Scumm::o6_walkActorToObj() {
obj = pop();
a = derefActorSafe(pop(), "o6_walkActorToObj");
- if (obj >= 17) {
+ if (obj >= NUM_ACTORS) {
if (whereIsObject(obj)==WIO_NOT_FOUND)
return;
getObjectXYPos(obj);
@@ -870,7 +892,7 @@ void Scumm::o6_walkActorToObj() {
x += dist;
else
x -= dist;
- startWalkActor(a, x, a2->y, 0xFF);
+ startWalkActor(a, x, a2->y, -1);
}
}
@@ -878,7 +900,7 @@ void Scumm::o6_walkActorTo() {
int x,y;
y = pop();
x = pop();
- startWalkActor(derefActorSafe(pop(), "o6_walkActorTo"), x, y, 0xFF);
+ startWalkActor(derefActorSafe(pop(), "o6_walkActorTo"), x, y, -1);
}
void Scumm::o6_putActorInRoom() {
@@ -889,6 +911,7 @@ void Scumm::o6_putActorInRoom() {
y = pop();
x = pop();
a = derefActorSafe(pop(), "o6_putActorInRoom");
+
if (room==0xFF) {
room = a->room;
} else {
@@ -905,8 +928,13 @@ void Scumm::o6_putActorAtObject() {
int room,obj,x,y;
Actor *a;
- room = pop();
- obj = pop();
+ if (_features & GF_HAS_ROOMTABLE) {
+ obj = pop();
+ room = getObjectRoom(obj);
+ } else {
+ room = pop();
+ obj = pop();
+ }
a = derefActorSafe(pop(), "o6_putActorAtObject");
if (whereIsObject(obj)!=WIO_NOT_FOUND) {
@@ -943,35 +971,37 @@ void Scumm::o6_animateActor() {
void Scumm::o6_doSentence() {
int a,b,c;
- SentenceTab *st;
a = pop();
pop(); //dummy pop
b = pop();
c = pop();
- st = &sentence[++_sentenceIndex];
-
- st->unk5 = c;
- st->unk4 = b;
- st->unk3 = a;
-
- if (!(st->unk3&0xFF00))
- st->unk2 = 0;
- else
- st->unk2 = 1;
-
- st->unk = 0;
+ doSentence(c,b,a);
}
void Scumm::o6_pickupObject() {
int obj, room;
+ int i;
- room = pop();
- obj = pop();
+ if (_features & GF_HAS_ROOMTABLE) {
+ obj = pop();
+ room = getObjectRoom(obj);
+ } else {
+ room = pop();
+ obj = pop();
+ if (room==0)
+ room = _roomResource;
+ }
+
+ for(i=1; i<_maxInventoryItems; i++) {
+ if (_inventory[i] == (uint16)obj) {
+ putOwner(obj, _vars[VAR_EGO]);
+ runHook(obj);
+ return;
+ }
+ }
- if (room==0)
- room = _roomResource;
addObjectToInventory(obj, room);
putOwner(obj, _vars[VAR_EGO]);
putClass(obj, 32, 1);
@@ -987,9 +1017,15 @@ void Scumm::o6_loadRoomWithEgo() {
y = pop();
x = pop();
- room = pop();
- obj = pop();
-
+
+ if (_features & GF_HAS_ROOMTABLE) {
+ obj = pop();
+ room = getObjectRoom(obj);
+ } else {
+ room = pop();
+ obj = pop();
+ }
+
a = derefActorSafe(_vars[VAR_EGO], "o_loadRoomWithEgo");
putActor(a, 0, 0, room);
@@ -1004,7 +1040,7 @@ void Scumm::o6_loadRoomWithEgo() {
setCameraFollows(a);
_fullRedraw=1;
if (x != -1) {
- startWalkActor(a, x, y, 0xFF);
+ startWalkActor(a, x, y, -1);
}
}
@@ -1028,7 +1064,11 @@ void Scumm::o6_getActorMoving() {
}
void Scumm::o6_getScriptRunning() {
- push(getScriptRunning(pop()));
+ push(isScriptRunning(pop()));
+}
+
+void Scumm::o6_isRoomScriptRunning() {
+ push(isRoomScriptRunning(pop()));
}
void Scumm::o6_getActorRoom() {
@@ -1044,11 +1084,18 @@ void Scumm::o6_getObjectY() {
}
void Scumm::o6_getObjectDir() {
- push(getObjDir(pop()));
+ int dir = getObjDir(pop());
+
+ if (_features & GF_USE_ANGLES) {
+ dir = oldDirToNewDir(dir);
+ }
+
+ push(dir);
}
void Scumm::o6_getActorWalkBox() {
- push(derefActorSafe(pop(),"o6_getActorWalkBox")->walkbox);
+ Actor *a = derefActorSafe(pop(),"o6_getActorWalkBox");
+ push(a->ignoreBoxes ? 0 : a->walkbox);
}
void Scumm::o6_getActorCostume() {
@@ -1086,7 +1133,7 @@ void Scumm::o6_setObjectName() {
int obj = pop();
int i;
- if (obj <= _vars[VAR_NUM_ACTOR])
+ if (obj < NUM_ACTORS)
error("Can't set actor %d name with new-name-of", obj);
if (!getObjectAddress(obj))
@@ -1137,6 +1184,7 @@ void Scumm::o6_createBoxMatrix() {
void Scumm::o6_resourceRoutines() {
int res;
+ int obj,room;
switch(fetchScriptByte()) {
case 100: /* load script */
@@ -1226,8 +1274,7 @@ void Scumm::o6_resourceRoutines() {
nukeCharset(res);
break;
case 119:/* load fl object */
- res = pop();
- loadFlObject(pop(), res);
+ loadFlObject(pop(), (_features & GF_HAS_ROOMTABLE) ? -1 : pop());
break;
default:
error("o6_resourceRoutines: default case");
@@ -1245,8 +1292,8 @@ void Scumm::o6_roomOps() {
if (a > ((_scrWidthIn8Unit-20)<<3)) a=((_scrWidthIn8Unit-20)<<3);
if (b < 160) b=160;
if (b > ((_scrWidthIn8Unit-20)<<3)) b=((_scrWidthIn8Unit-20)<<3);
- _vars[VAR_CAMERA_MIN] = a;
- _vars[VAR_CAMERA_MAX] = b;
+ _vars[VAR_CAMERA_MIN_X] = a;
+ _vars[VAR_CAMERA_MAX_X] = b;
break;
case 174: /* set screen */
@@ -1430,6 +1477,7 @@ void Scumm::o6_actorSet() {
case 93:
a->neverZClip = 0;
break;
+ case 225:
case 94:
a->neverZClip = pop();
break;
@@ -1448,8 +1496,8 @@ FixRooms:;
a->animSpeed = pop();
a->animProgress = 0;
break;
- case 98: /* set data8 */
- a->data8 = pop();
+ case 98:
+ a->unk1 = pop();
break;
case 99:
a->new_1 = pop();
@@ -1463,9 +1511,22 @@ FixRooms:;
break;
case 217:
initActor(a, 2);
- break;
+ 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: /* ? */
+
default:
- error("o6_actorset: default case");
+ error("o6_actorset: default case %d", b);
}
}
@@ -1742,8 +1803,8 @@ void Scumm::o6_wait() {
break;
return;
case 171:
- if (_sentenceIndex!=0xFF) {
- if (sentence[_sentenceIndex].unk &&
+ if (_sentenceNum) {
+ if (sentence[_sentenceNum-1].unk &&
!isScriptInUse(_vars[VAR_SENTENCE_SCRIPT]) )
return;
break;
@@ -1832,7 +1893,7 @@ void Scumm::o6_delayVeryLong() {
}
void Scumm::o6_stopSentence() {
- _sentenceIndex = 0xFF;
+ _sentenceNum = 0;
stopScriptNr(_vars[VAR_SENTENCE_SCRIPT]);
clearClickedStatus();
}
@@ -1992,6 +2053,78 @@ void Scumm::o6_miscOps() {
Actor *a;
getStackList(args,sizeof(args)/sizeof(args[0]));
+
+#if defined(FULL_THROTTLE)
+ switch(args[0]) {
+ case 4:
+ grabCursor(args[1], args[2], args[3], args[4]);
+ break;
+ case 6:
+ warning("o6_miscOps: startVideo(%d,%s)", args[1], getStringAddress(_vars[0xf6/2]));
+ break;
+ case 7:
+ warning("o6_miscOps: stub7()");
+ break;
+ case 10:
+ warning("o6_miscOps: stub10(%d,%d,%d,%d)",args[1],args[2],args[3],args[4]);
+ break;
+ case 11:
+ warning("o6_miscOps: stub11(%d)", args[1]);
+ break;
+ case 12:
+ setCursorImg(args[1], -1, args[2]);
+ break;
+ case 13:
+ warning("o6_miscOps: stub13(%d,%d,%d,%d)",args[1],args[2],args[3],args[4]);
+ break;
+ case 14:
+ remapActor(derefActorSafe(args[1], "o6_miscOps:14"), args[2],args[3],args[4],args[5]);
+ break;
+ 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]);
+ break;
+ case 17:
+ warning("o6_miscOps: stub17(%d,%d,%d,%d)",args[1],args[2],args[3],args[4]);
+ break;
+ case 18:
+ warning("o6_miscOps: stub18(%d,%d)", args[1], args[2]);
+ break;
+ case 107:
+ a = derefActorSafe(args[1], "o6_miscops: 107");
+ a->scalex = args[2];
+ a->needBgReset = true;
+ a->needRedraw = true;
+ break;
+ case 108:
+ setupShadowPalette(args[1],args[2],args[3],args[4],args[5],args[6]);
+ break;
+ case 109:
+ setupShadowPalette(0, args[1],args[2],args[3],args[4],args[5]);
+ break;
+ case 114:
+ warning("o6_miscOps: stub114()");
+ break;
+ case 117:
+ warning("o6_miscOps: stub117()");
+ 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]);
+ 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]);
+ break;
+ case 120:
+ warning("o6_miscOps: stub120(%d,%d)", args[1], args[2]);
+ break;
+ case 124:
+ warning("o6_miscOps: stub124(%d)", args[1]);
+ break;
+ }
+
+#else
switch(args[0]) {
case 3:
warning("o6_miscOps: nothing in 3");
@@ -2049,7 +2182,7 @@ void Scumm::o6_miscOps() {
case 111:
a = derefActorSafe(args[1], "o6_miscops: 111");
- a->data8 = args[2] + args[3];
+ a->unk1 = args[2] + args[3];
break;
case 112:
@@ -2099,6 +2232,54 @@ void Scumm::o6_miscOps() {
default:
error("o6_miscOps: default case %d", args[0]);
}
+#endif
+}
+
+void Scumm::o6_kernelFunction() {
+ int16 args[30];
+ int i;
+ Actor *a;
+
+ getStackList(args,sizeof(args)/sizeof(args[0]));
+
+ switch(args[0]) {
+ case 115:
+ warning("o6_kernelFunction: stub115(%d,%d)", args[1], args[2]);
+ push(0);
+ break;
+ case 116:
+ push(checkXYInBoxBounds(args[3], args[1], args[2]));
+ break;
+ case 206:
+ push(remapPaletteColor(args[1],args[2],args[3],(uint)-1));
+ break;
+ case 207:
+ i = getObjectIndex(pop());
+ push(_objs[i].x_pos);
+ break;
+ case 208:
+ i = getObjectIndex(pop());
+ push(_objs[i].y_pos);
+ break;
+ case 209:
+ i = getObjectIndex(pop());
+ push(_objs[i].width);
+ break;
+ case 210:
+ i = getObjectIndex(pop());
+ push(_objs[i].height);
+ break;
+ case 211:
+ warning("o6_kernelFunction: stub211(%d)", args[1]);
+ push(0);
+ break;
+ case 212:
+ a = derefActorSafe(args[1], "o6_kernelFunction:212");
+ push(a->frame);
+ break;
+ default:
+ error("o6_kernelFunction: default case %d", args[0]);
+ }
}
void Scumm::o6_breakMaybe() {
@@ -2179,7 +2360,8 @@ void Scumm::decodeParseString2(int m, int n) {
switch(m) {
case 0: actorTalk(); break;
case 1: drawString(1); break;
- case 2: unkMessage1(); break;
+
+ case 2: unkMessage1(); break;
case 3: unkMessage2(); break;
}
_scriptPointer = _messagePtr;