aboutsummaryrefslogtreecommitdiff
path: root/engines/agi
diff options
context:
space:
mode:
authorEugene Sandulenko2011-08-11 16:58:04 +0100
committerEugene Sandulenko2011-08-13 23:27:27 +0100
commit3fb50b815e78b9284497deb6ead60a6efff02453 (patch)
tree03f99691e629104772fb39fab5b6e4ada3b13924 /engines/agi
parentaf691e46c4ccbe0457d2a7d5a4386d9287518740 (diff)
downloadscummvm-rg350-3fb50b815e78b9284497deb6ead60a6efff02453.tar.gz
scummvm-rg350-3fb50b815e78b9284497deb6ead60a6efff02453.tar.bz2
scummvm-rg350-3fb50b815e78b9284497deb6ead60a6efff02453.zip
AGI: Further work on v1 opcode difference
Diffstat (limited to 'engines/agi')
-rw-r--r--engines/agi/agi.h1
-rw-r--r--engines/agi/op_cmd.cpp70
-rw-r--r--engines/agi/op_test.cpp5
-rw-r--r--engines/agi/opcodes.cpp51
-rw-r--r--engines/agi/opcodes.h6
5 files changed, 100 insertions, 33 deletions
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 579580127c..102ecd9301 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -88,6 +88,7 @@ typedef signed int Err;
#define _EMPTY 0xfffff
#define EGO_OWNED 0xff
+#define EGO_OWNED_V1 0xf9
#define CRYPT_KEY_SIERRA "Avis Durgan"
#define CRYPT_KEY_AGDS "Alex Simkin"
diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp
index 673cac450b..62606911dc 100644
--- a/engines/agi/op_cmd.cpp
+++ b/engines/agi/op_cmd.cpp
@@ -56,8 +56,13 @@ namespace Agi {
#define getflag(a) state->_vm->getflag(a)
void cmdIncrement(AgiGame *state, uint8 *p) {
- if (_v[p0] != 0xff)
- ++_v[p0];
+ if (getVersion() < 0x2000) {
+ if (_v[p0] < 0xf0)
+ ++_v[p0];
+ } else {
+ if (_v[p0] != 0xff)
+ ++_v[p0];
+ }
}
void cmdDecrement(AgiGame *state, uint8 *p) {
@@ -115,6 +120,10 @@ void cmdDivV(AgiGame *state, uint8 *p) {
_v[p0] /= _v[p1];
}
+void cmdRandomV1(AgiGame *state, uint8 *p) {
+ _v[p0] = state->_vm->_rnd->getRandomNumber(250);
+}
+
void cmdRandom(AgiGame *state, uint8 *p) {
_v[p2] = state->_vm->_rnd->getRandomNumber(p1 - p0) + p0;
}
@@ -399,6 +408,10 @@ void cmdGet(AgiGame *state, uint8 *p) {
state->_vm->objectSetLocation(p0, EGO_OWNED);
}
+void cmdGetV1(AgiGame *state, uint8 *p) {
+ state->_vm->objectSetLocation(p0, EGO_OWNED_V1);
+}
+
void cmdGetF(AgiGame *state, uint8 *p) {
state->_vm->objectSetLocation(_v[p0], EGO_OWNED);
}
@@ -732,6 +745,16 @@ void cmdCallF(AgiGame *state, uint8 *p) {
cmdCall(state, &_v[p0]);
}
+void cmdDrawPicV1(AgiGame *state, uint8 *p) {
+ debugC(6, kDebugLevelScripts, "=== draw pic V1 %d ===", _v[p0]);
+ state->_vm->_picture->decodePicture(_v[p0], true);
+
+ state->_vm->clearPrompt();
+
+ // Simulate slowww computer. Many effects rely on this
+ state->_vm->pause(kPausePicture);
+}
+
void cmdDrawPic(AgiGame *state, uint8 *p) {
debugC(6, kDebugLevelScripts, "=== draw pic %d ===", _v[p0]);
state->_vm->_sprites->eraseBoth();
@@ -811,11 +834,21 @@ void cmdShowPriScreen(AgiGame *state, uint8 *p) {
}
void cmdAnimateObj(AgiGame *state, uint8 *p) {
- if (vt.flags & ANIMATED)
- return;
+ if (getVersion() < 0x2000) {
+ if (vt.flags & DIDNT_MOVE)
+ return;
+ } else {
+ if (vt.flags & ANIMATED)
+ return;
+ }
debugC(4, kDebugLevelScripts, "animate vt entry #%d", p0);
vt.flags = ANIMATED | UPDATE | CYCLING;
+
+ if (getVersion() < 0x2000) {
+ vt.flags |= DIDNT_MOVE;
+ }
+
vt.motion = MOTION_NORMAL;
vt.cycle = CYCLE_NORMAL;
vt.direction = 0;
@@ -918,6 +951,11 @@ void cmdPosition(AgiGame *state, uint8 *p) {
state->_vm->clipViewCoordinates(&vt);
}
+void cmdPositionV1(AgiGame *state, uint8 *p) {
+ vt.xPos = p1;
+ vt.yPos = p2;
+}
+
void cmdPositionF(AgiGame *state, uint8 *p) {
vt.xPos = vt.xPos2 = _v[p1];
vt.yPos = vt.yPos2 = _v[p2];
@@ -929,6 +967,11 @@ void cmdPositionF(AgiGame *state, uint8 *p) {
state->_vm->clipViewCoordinates(&vt);
}
+void cmdPositionFV1(AgiGame *state, uint8 *p) {
+ vt.xPos = _v[p1];
+ vt.yPos = _v[p2];
+}
+
void cmdGetPosn(AgiGame *state, uint8 *p) {
state->vars[p1] = (unsigned char)vt.xPos;
state->vars[p2] = (unsigned char)vt.yPos;
@@ -1045,8 +1088,14 @@ void cmdFollowEgo(AgiGame *state, uint8 *p) {
vt.parm1 = p1 > vt.stepSize ? p1 : vt.stepSize;
vt.parm2 = p2;
vt.parm3 = 0xff;
- setflag(p2, false);
- vt.flags |= UPDATE;
+
+ if (getVersion() < 0x2000) {
+ _v[p2] = 0;
+ vt.flags |= UPDATE | ANIMATED;
+ } else {
+ setflag(p2, false);
+ vt.flags |= UPDATE;
+ }
}
void cmdMoveObj(AgiGame *state, uint8 *p) {
@@ -1061,8 +1110,13 @@ void cmdMoveObj(AgiGame *state, uint8 *p) {
if (p3 != 0)
vt.stepSize = p3;
- setflag(p4, false);
- vt.flags |= UPDATE;
+ if (getVersion() < 0x2000) {
+ _v[p4] = 0;
+ vt.flags |= UPDATE | ANIMATED;
+ } else {
+ setflag(p4, false);
+ vt.flags |= UPDATE;
+ }
if (p0 == 0)
state->playerControl = false;
diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp
index f8fd7674f1..bc711652f9 100644
--- a/engines/agi/op_test.cpp
+++ b/engines/agi/op_test.cpp
@@ -38,6 +38,7 @@ namespace Agi {
#define testGreater(v1, v2) (getvar(v1) > (v2))
#define testIsSet(flag) (getflag(flag))
#define testHas(obj) (state->_vm->objectGetLocation(obj) == EGO_OWNED)
+#define testHasV1(obj) (state->_vm->objectGetLocation(obj) == EGO_OWNED_V1)
#define testObjInRoom(obj, v) (state->_vm->objectGetLocation(obj) == getvar(v))
void condEqual(AgiGame *state, uint8 *p) {
@@ -92,6 +93,10 @@ void condHas(AgiGame *state, uint8 *p) {
state->testResult = testHas(p[0]);
}
+void condHasV1(AgiGame *state, uint8 *p) {
+ state->testResult = testHasV1(p[0]);
+}
+
void condObjInRoom(AgiGame *state, uint8 *p) {
state->testResult = testObjInRoom(p[0], p[1]);
}
diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
index e69d16701e..d39307c3cd 100644
--- a/engines/agi/opcodes.cpp
+++ b/engines/agi/opcodes.cpp
@@ -37,7 +37,7 @@ AgiInstruction insV1Test[] = {
{ "greatern", "vn", &condGreater }, // 05
{ "greaterv", "vv", &condGreaterV }, // 06
{ "isset", "v", &condIsSetV1 }, // 07
- { "has", "n", &condHas }, // 08
+ { "has", "n", &condHasV1 }, // 08
{ "said", "nnnn", &condSaid2 }, // 09
{ "posn", "nnnnn", &condPosn }, // 0A
{ "controller", "n", &condController }, // 0B
@@ -61,20 +61,20 @@ AgiInstruction insV1[] = {
{ "load.view", "n", &cmdLoadView }, // 09
{ "animate.obj", "n", &cmdAnimateObj }, // 0A
{ "new.room", "n", &cmdNewRoomV1 }, // 0B
- { "draw.pic", "v", &cmdDrawPic }, // 0C
- { "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
+ { "draw.pic", "v", &cmdDrawPicV1 }, // 0C
+ { "print", "s", &cmdPrint }, // 0D TODO
+ { "status", "", &cmdStatus }, // 0E TODO
+ { "save.game", "", &cmdSaveGame }, // 0F TODO
+ { "restore.game", "", &cmdLoadGame }, // 10 TODO
+ { "init.disk", "", &cmdInitDisk }, // 11 TODO
+ { "restart.game", "", &cmdRestartGame }, // 12 TODO
+ { "random", "v", &cmdRandomV1 }, // 13
+ { "get", "n", &cmdGetV1 }, // 14
{ "drop", "n", &cmdDrop }, // 15
- { "draw", "n", &cmdDraw }, // 16
- { "erase", "n", &cmdErase }, // 17
- { "position", "nnn", &cmdPosition }, // 18
- { "position.v", "nvv", &cmdPositionF }, // 19
+ { "draw", "n", &cmdDraw }, // 16 TODO
+ { "erase", "n", &cmdErase }, // 17 TODO
+ { "position", "nnn", &cmdPositionV1 }, // 18
+ { "position.v", "nvv", &cmdPositionFV1 }, // 19
{ "get.posn", "nvv", &cmdGetPosn }, // 1A
{ "set.cel", "nn", &cmdSetCel }, // 1B
{ "set.loop", "nn", &cmdSetLoop }, // 1C
@@ -83,8 +83,8 @@ AgiInstruction insV1[] = {
{ "move.obj", "nnnnn", &cmdMoveObj }, // 1F
{ "set.view", "nn", &cmdSetView }, // 20
{ "follow.ego", "nnn", &cmdFollowEgo }, // 21
- { "...", "", &cmdUnknown }, // 22
- { "...", "", &cmdUnknown }, // 23
+ { "...", "", &cmdUnknown }, // 22 # block
+ { "...", "", &cmdUnknown }, // 23 # unblock
{ "ignore.blocks", "n", &cmdIgnoreBlocks }, // 24
{ "observe.blocks", "n", &cmdObserveBlocks }, // 25
{ "wander", "n", &cmdWander }, // 26
@@ -120,32 +120,33 @@ AgiInstruction insV1[] = {
{ "...", "nn", &cmdUnknown }, // 44
{ "get.v", "v", &cmdUnknown }, // 45
{ "assign.v", "vv", &cmdUnknown }, // 46
- { "...", "n", &cmdUnknown }, // 47
+ { "...", "n", &cmdUnknown }, // 47 # printvar.v
{ "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?
+ { "...", "nv", &cmdUnknown }, // 4D # set.priority.f
+ { "...", "", &cmdUnknown }, // 4E # show.obj
+ { "load.logics", "n", &cmdLoadLogic }, // 4F # load.global.logics
{ "display", "nnns", &cmdDisplay }, // 50 TODO: 4 vs 3 args
- { "prevent.input???", "", &cmdUnknown }, // 51
- { "...", "", &cmdUnknown }, // 52
- { "...", "n", &cmdUnknown }, // 53 ???
+ { "prevent.input???", "", &cmdUnknown }, // 51
+ { "...", "", &cmdUnknown }, // 52 # nop
+ { "...", "n", &cmdUnknown }, // 53 # text.screen
{ "...", "", &cmdUnknown }, // 54 ???
{ "stop.motion", "", &cmdStopMotion }, // 55 or force.update??
{ "discard.view", "n", &cmdDiscardView }, // 56
{ "discard.pic", "v", &cmdDiscardPic }, // 57
{ "set.item.view", "nn", &cmdSetItemView }, // 58
- { "...", "", &cmdUnknown }, // 59
+ { "...", "", &cmdUnknown }, // 59 # reverse.cycle
{ "last.cel", "nv", &cmdLastCel }, // 5A
{ "set.cel.v", "nv", &cmdSetCelF }, // 5B
- { "...", "", &cmdUnknown }, // 5C
+ { "...", "", &cmdUnknown }, // 5C # normal.cycle
{ "load.view", "n", &cmdLoadView }, // 5D
{ "...", "", &cmdUnknown }, // 5E
{ "...", "", &cmdUnknown }, // 5F
{ "setbit", "nv", &cmdUnknown }, // 60
+ { "...", "nv", &cmdUnknown }, // 61 # clearbit
};
AgiInstruction insV2Test[] = {
diff --git a/engines/agi/opcodes.h b/engines/agi/opcodes.h
index 3885c10aac..f0a1c178b5 100644
--- a/engines/agi/opcodes.h
+++ b/engines/agi/opcodes.h
@@ -63,6 +63,7 @@ void cmdCall(AgiGame *state, uint8 *p);
void cmdCallF(AgiGame *state, uint8 *p);
void cmdLoadPic(AgiGame *state, uint8 *p); // 0x18
void cmdDrawPic(AgiGame *state, uint8 *p);
+void cmdDrawPicV1(AgiGame *state, uint8 *p);
void cmdShowPic(AgiGame *state, uint8 *p);
void cmdDiscardPic(AgiGame *state, uint8 *p);
void cmdOverlayPic(AgiGame *state, uint8 *p);
@@ -75,7 +76,9 @@ void cmdUnanimateAll(AgiGame *state, uint8 *p);
void cmdDraw(AgiGame *state, uint8 *p);
void cmdErase(AgiGame *state, uint8 *p);
void cmdPosition(AgiGame *state, uint8 *p);
+void cmdPositionV1(AgiGame *state, uint8 *p);
void cmdPositionF(AgiGame *state, uint8 *p);
+void cmdPositionFV1(AgiGame *state, uint8 *p);
void cmdGetPosn(AgiGame *state, uint8 *p);
void cmdReposition(AgiGame *state, uint8 *p); // 0x28
void cmdSetView(AgiGame *state, uint8 *p);
@@ -130,6 +133,7 @@ void cmdObserveBlocks(AgiGame *state, uint8 *p);
void cmdBlock(AgiGame *state, uint8 *p);
void cmdUnblock(AgiGame *state, uint8 *p);
void cmdGet(AgiGame *state, uint8 *p);
+void cmdGetV1(AgiGame *state, uint8 *p);
void cmdGetF(AgiGame *state, uint8 *p);
void cmdDrop(AgiGame *state, uint8 *p);
void cmdPut(AgiGame *state, uint8 *p);
@@ -168,6 +172,7 @@ void cmdInitDisk(AgiGame *state, uint8 *p);
void cmdRestartGame(AgiGame *state, uint8 *p); // 0x80
void cmdShowObj(AgiGame *state, uint8 *p);
void cmdRandom(AgiGame *state, uint8 *p);
+void cmdRandomV1(AgiGame *state, uint8 *p);
void cmdProgramControl(AgiGame *state, uint8 *p);
void cmdPlayerControl(AgiGame *state, uint8 *p);
void cmdObjStatusF(AgiGame *state, uint8 *p);
@@ -237,6 +242,7 @@ void condGreaterV(AgiGame *state, uint8 *p);
void condIsSet(AgiGame *state, uint8 *p);
void condIsSetV(AgiGame *state, uint8 *p);
void condHas(AgiGame *state, uint8 *p);
+void condHasV1(AgiGame *state, uint8 *p);
void condObjInRoom(AgiGame *state, uint8 *p);
void condPosn(AgiGame *state, uint8 *p);
void condController(AgiGame *state, uint8 *p);