aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/agi/agi.h4
-rw-r--r--engines/agi/op_cmd.cpp57
-rw-r--r--engines/agi/opcodes.cpp118
-rw-r--r--engines/agi/opcodes.h4
4 files changed, 122 insertions, 61 deletions
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 1c89718a6e..579580127c 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -640,6 +640,10 @@ struct AgiGame {
// IF condition handling
int testResult;
+
+
+ int max_logics;
+ int logic_list[256];
};
/**
diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp
index bd189eeac5..673cac450b 100644
--- a/engines/agi/op_cmd.cpp
+++ b/engines/agi/op_cmd.cpp
@@ -1420,9 +1420,11 @@ void cmdSetString(AgiGame *state, uint8 *p) {
}
void cmdDisplay(AgiGame *state, uint8 *p) {
+ // V1 has 4 args
+ int t = (getVersion() >= 0x2000 ? p2 : p3);
int len = 40;
- char *s = state->_vm->wordWrapString(state->_curLogic->texts[p2 - 1], &len);
+ char *s = state->_vm->wordWrapString(state->_curLogic->texts[t - 1], &len);
state->_vm->printText(s, p1, 0, p0, 40, state->colorFg, state->colorBg);
@@ -1581,6 +1583,34 @@ void cmdSetSpeed(AgiGame *state, uint8 *p) {
(void)p;
}
+void cmdSetItemView(AgiGame *state, uint8 *p) {
+ // V1 command
+ (void)state;
+ (void)p;
+}
+
+void cmdCallV1(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rLOGIC, p0);
+ state->logic_list[++state->max_logics];
+ _v[13] = 1;
+}
+
+void cmdNewRoomV1(AgiGame *state, uint8 *p) {
+ warning("cmdNewRoomV1()");
+ state->_vm->agiLoadResource(rLOGIC, p0);
+ state->max_logics = 1;
+ state->logic_list[1] = p0;
+ _v[13] = 1;
+}
+
+void cmdNewRoomVV1(AgiGame *state, uint8 *p) {
+ warning("cmdNewRoomVV1()");
+ state->_vm->agiLoadResource(rLOGIC, _v[p0]);
+ state->max_logics = 1;
+ state->logic_list[1] = _v[p0];
+ _v[13] = 1;
+}
+
void cmdUnknown(AgiGame *state, uint8 *p) {
warning("Skipping unknown opcode %2X", *(code + ip - 1));
}
@@ -1595,6 +1625,10 @@ int AgiEngine::runLogic(int n) {
uint8 p[CMD_BSIZE] = { 0 };
int num = 0;
ScriptPos sp;
+ //int logic_index = 0;
+
+ state->logic_list[0] = 0;
+ state->max_logics = 0;
debugC(2, kDebugLevelScripts, "=================");
debugC(2, kDebugLevelScripts, "runLogic(%d)", n);
@@ -1659,6 +1693,18 @@ int AgiEngine::runLogic(int n) {
debugC(2, kDebugLevelScripts, "%sreturn() // Logic %d", st, n);
debugC(2, kDebugLevelScripts, "=================");
+// if (getVersion() < 0x2000) {
+// if (logic_index < state->max_logics) {
+// n = state->logic_list[++logic_index];
+// state->_curLogic = &state->logics[n];
+// state->lognum = n;
+// ip = 2;
+// warning("running logic %d\n", n);
+// break;
+// }
+// _v[13]=0;
+// }
+
_game.execStack.pop_back();
return 1;
default:
@@ -1672,6 +1718,14 @@ int AgiEngine::runLogic(int n) {
ip += num;
}
+// if ((op == 0x0B || op == 0x3F || op == 0x40) && logic_index < state->max_logics) {
+// n = state->logic_list[++logic_index];
+// state->_curLogic = &state->logics[n];
+// state->lognum = n;
+// ip = 2;
+// warning("running logic %d\n", n);
+// }
+
if (_game.exitAllLogics)
break;
}
@@ -1685,7 +1739,6 @@ void AgiEngine::executeAgiCommand(uint8 op, uint8 *p) {
debugC(2, kDebugLevelScripts, "%s(%d %d %d)", logicNamesCmd[op].name, p[0], p[1], p[2]);
_agiCommands[op](&_game, p);
-// (this->*_agiCommands[op])(p);
}
} // End of namespace Agi
diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
index ba7f587d11..e69d16701e 100644
--- a/engines/agi/opcodes.cpp
+++ b/engines/agi/opcodes.cpp
@@ -49,103 +49,103 @@ AgiInstruction insV1Test[] = {
};
AgiInstruction insV1[] = {
- { "return", "", NULL }, // 00
- { "increment", "v", &cmdIncrement }, // 01
- { "decrement", "v", &cmdDecrement }, // 02
- { "assignn", "vn", &cmdAssignN }, // 03
- { "assignv", "vv", &cmdAssignV }, // 04
+ { "return", "", NULL }, // 00
+ { "increment", "v", &cmdIncrement }, // 01
+ { "decrement", "v", &cmdDecrement }, // 02
+ { "assignn", "vn", &cmdAssignN }, // 03
+ { "assignv", "vv", &cmdAssignV }, // 04
{ "addn", "vn", &cmdAddN }, // 05
{ "addv", "vv", &cmdAddV }, // 06
{ "subn", "vn", &cmdSubN }, // 07
{ "subv", "vv", &cmdSubV }, // 08
{ "load.view", "n", &cmdLoadView }, // 09
- { "animate.obj", "n", &cmdAnimateObj }, // 0A
- { "new.room", "n", &cmdNewRoom }, // 0B
+ { "animate.obj", "n", &cmdAnimateObj }, // 0A
+ { "new.room", "n", &cmdNewRoomV1 }, // 0B
{ "draw.pic", "v", &cmdDrawPic }, // 0C
- { "print", "s", &cmdPrint }, // 0D
- { "status", "", &cmdStatus }, // 0E
+ { "print", "s", &cmdPrint }, // 0D
+ { "status", "", &cmdStatus }, // 0E
{ "save.game", "", &cmdSaveGame }, // 0F
{ "restore.game", "", &cmdLoadGame }, // 10
{ "...", "", &cmdInitDisk }, // 11 TODO
{ "restart.game", "", &cmdRestartGame }, // 12
- { "random", "v", &cmdRandom }, // 13 TODO: 1 vs 3 vars
- { "get", "n", &cmdGet }, // 14
+ { "random", "v", &cmdRandom }, // 13 TODO: 1 vs 3 vars
+ { "get", "n", &cmdGet }, // 14
{ "drop", "n", &cmdDrop }, // 15
{ "draw", "n", &cmdDraw }, // 16
- { "erase", "n", &cmdErase }, // 17
+ { "erase", "n", &cmdErase }, // 17
{ "position", "nnn", &cmdPosition }, // 18
- { "position.v", "nvv", &cmdPositionF }, // 19
+ { "position.v", "nvv", &cmdPositionF }, // 19
{ "get.posn", "nvv", &cmdGetPosn }, // 1A
- { "set.cel", "nn", &cmdSetCel }, // 1B
+ { "set.cel", "nn", &cmdSetCel }, // 1B
{ "set.loop", "nn", &cmdSetLoop }, // 1C
- { "end.of.loop", "nn", &cmdEndOfLoop }, // 1D
+ { "end.of.loop", "nn", &cmdEndOfLoop }, // 1D
{ "reverse.loop", "nn", &cmdReverseLoop }, // 1E
{ "move.obj", "nnnnn", &cmdMoveObj }, // 1F
{ "set.view", "nn", &cmdSetView }, // 20
- { "follow.ego", "nnn", &cmdFollowEgo }, // 21
- { "...", "", &cmdUnknown }, // 22
- { "...", "", &cmdUnknown }, // 23
+ { "follow.ego", "nnn", &cmdFollowEgo }, // 21
+ { "...", "", &cmdUnknown }, // 22
+ { "...", "", &cmdUnknown }, // 23
{ "ignore.blocks", "n", &cmdIgnoreBlocks }, // 24
- { "observe.blocks", "n", &cmdObserveBlocks }, // 25
- { "wander", "n", &cmdWander }, // 26
- { "reposition", "nvv", &cmdReposition }, // 27
- { "stop.motion", "n", &cmdStopMotion }, // 28
+ { "observe.blocks", "n", &cmdObserveBlocks }, // 25
+ { "wander", "n", &cmdWander }, // 26
+ { "reposition", "nvv", &cmdReposition }, // 27
+ { "stop.motion", "n", &cmdStopMotion }, // 28
{ "start.motion", "n", &cmdStartMotion }, // 29
{ "stop.cycling", "n", &cmdStopCycling }, // 2A
{ "start.cycling", "n", &cmdStartCycling }, // 2B
- { "stop.update", "n", &cmdStopUpdate }, // 2C
+ { "stop.update", "n", &cmdStopUpdate }, // 2C
{ "start.update", "n", &cmdStartUpdate }, // 2D
- { "program.control", "", &cmdProgramControl }, // 2E
- { "player.control", "", &cmdPlayerControl }, // 2F
+ { "program.control", "", &cmdProgramControl }, // 2E
+ { "player.control", "", &cmdPlayerControl }, // 2F
{ "set.priority", "nn", &cmdSetPriority }, // 30
{ "release.priority", "n", &cmdReleasePriority }, // 31
{ "add.to.pic", "nnnnnn", &cmdAddToPic }, // 32 TODO: 7 vs 8 args
- { "set.horizon", "n", &cmdSetHorizon }, // 33
- { "ignore.horizon", "n", &cmdIgnoreHorizon }, // 34
- { "observe.horizon", "n", &cmdObserveHorizon }, // 35
- { "load.logics", "n", &cmdLoadLogic }, // 36
- { "object.on.water", "n", &cmdObjectOnWater }, // 37
+ { "set.horizon", "n", &cmdSetHorizon }, // 33
+ { "ignore.horizon", "n", &cmdIgnoreHorizon }, // 34
+ { "observe.horizon", "n", &cmdObserveHorizon }, // 35
+ { "load.logics", "n", &cmdLoadLogic }, // 36
+ { "object.on.water", "n", &cmdObjectOnWater }, // 37
{ "load.pic", "v", &cmdLoadPic }, // 38
- { "load.sound", "n", &cmdLoadSound }, // 39
- { "sound", "nn", &cmdSound }, // 3A
- { "stop.sound", "", &cmdStopSound }, // 3B
+ { "load.sound", "n", &cmdLoadSound }, // 39
+ { "sound", "nn", &cmdSound }, // 3A
+ { "stop.sound", "", &cmdStopSound }, // 3B
{ "set.v", "v", &cmdSetV }, // 3C
- { "reset.v", "v", &cmdResetV }, // 3D
+ { "reset.v", "v", &cmdResetV }, // 3D
{ "toggle.v", "v", &cmdToggleV }, // 3E
- { "new.room.v", "v", &cmdNewRoomF }, // 3F
- { "call", "n", &cmdCall }, // 40
- { "...", "", &cmdUnknown }, // 41
+ { "new.room.v", "v", &cmdNewRoomVV1 }, // 3F
+ { "call", "n", &cmdCallV1 }, // 40
+ { "...", "", &cmdUnknown }, // 41
{ "set.speed", "v", &cmdSetSpeed }, // 42
{ "move.obj.v", "nvvvv", &cmdMoveObjF }, // 43
- { "...", "", &cmdUnknown }, // 44
- { "...", "", &cmdUnknown }, // 45
- { "...", "", &cmdUnknown }, // 46
- { "...", "", &cmdUnknown }, // 47
- { "...", "nv", &cmdUnknown }, // 48 get.priority??
- { "ignore.objs", "n", &cmdIgnoreObjs }, // 49
+ { "...", "nn", &cmdUnknown }, // 44
+ { "get.v", "v", &cmdUnknown }, // 45
+ { "assign.v", "vv", &cmdUnknown }, // 46
+ { "...", "n", &cmdUnknown }, // 47
+ { "get.priority", "nv", &cmdGetPriority }, // 48
+ { "ignore.objs", "n", &cmdIgnoreObjs }, // 49
{ "observe.objs", "n", &cmdObserveObjs }, // 4A
{ "distance", "nnv", &cmdDistance }, // 4B
{ "object.on.land", "n", &cmdObjectOnLand }, // 4C
- { "...", "nv", &cmdUnknown }, // 4D set.priority.v???
- { "...", "", &cmdUnknown }, // 4E
- { "load.logics", "n", &cmdLoadLogic }, // 4F TODO: what is the other load.logics then?
- { "display", "nnns", &cmdDisplay }, // 50 TODO: 4 vs 3 args
- { "prevent.input???", "", &cmdUnknown }, // 51
- { "...", "", &cmdUnknown }, // 52
- { "...", "n", &cmdUnknown }, // 53 ???
- { "...", "", &cmdUnknown }, // 54 ???
- { "stop.motion", "", &cmdStopMotion }, // 55 or force.update??
+ { "...", "nv", &cmdUnknown }, // 4D set.priority.v???
+ { "...", "", &cmdUnknown }, // 4E
+ { "load.logics", "n", &cmdLoadLogic }, // 4F TODO: what is the other load.logics then?
+ { "display", "nnns", &cmdDisplay }, // 50 TODO: 4 vs 3 args
+ { "prevent.input???", "", &cmdUnknown }, // 51
+ { "...", "", &cmdUnknown }, // 52
+ { "...", "n", &cmdUnknown }, // 53 ???
+ { "...", "", &cmdUnknown }, // 54 ???
+ { "stop.motion", "", &cmdStopMotion }, // 55 or force.update??
{ "discard.view", "n", &cmdDiscardView }, // 56
- { "discard.pic", "v", &cmdDiscardPic }, // 57
- { "...", "nn", &cmdUnknown }, // 58
- { "...", "", &cmdUnknown }, // 59
+ { "discard.pic", "v", &cmdDiscardPic }, // 57
+ { "set.item.view", "nn", &cmdSetItemView }, // 58
+ { "...", "", &cmdUnknown }, // 59
{ "last.cel", "nv", &cmdLastCel }, // 5A
{ "set.cel.v", "nv", &cmdSetCelF }, // 5B
- { "...", "", &cmdUnknown }, // 5C
+ { "...", "", &cmdUnknown }, // 5C
{ "load.view", "n", &cmdLoadView }, // 5D
- { "...", "", &cmdUnknown }, // 5E
- { "...", "", &cmdUnknown }, // 5F
- { "setbit", "nv", &cmdUnknown }, // 60
+ { "...", "", &cmdUnknown }, // 5E
+ { "...", "", &cmdUnknown }, // 5F
+ { "setbit", "nv", &cmdUnknown }, // 60
};
AgiInstruction insV2Test[] = {
diff --git a/engines/agi/opcodes.h b/engines/agi/opcodes.h
index f45a52b611..3885c10aac 100644
--- a/engines/agi/opcodes.h
+++ b/engines/agi/opcodes.h
@@ -222,6 +222,10 @@ void cmdReleaseKey(AgiGame *state, uint8 *p);
void cmdAdjEgoMoveToXY(AgiGame *state, uint8 *p);
void cmdSetSpeed(AgiGame *state, uint8 *p);
+void cmdSetItemView(AgiGame *state, uint8 *p);
+void cmdCallV1(AgiGame *state, uint8 *p);
+void cmdNewRoomV1(AgiGame *state, uint8 *p);
+void cmdNewRoomVV1(AgiGame *state, uint8 *p);
void cmdUnknown(AgiGame *state, uint8 *p);
void condEqual(AgiGame *state, uint8 *p);