Named / documented the V0-V2 object states (we should probably rename the corresponding opcodes here and in descumm to make reading script dumps easier)

svn-id: r24566
This commit is contained in:
Max Horn 2006-10-29 14:45:31 +00:00
parent 41b4a34b5b
commit 46dc61163a
4 changed files with 54 additions and 44 deletions

View File

@ -278,7 +278,7 @@ int ScummEngine::getState(int obj) {
// blowing up the mansion, should they feel the urge to.
if (_game.id == GID_MANIAC && (obj == 182 || obj == 193))
_objectStateTable[obj] |= 0x08;
_objectStateTable[obj] |= kObjectState_08;
}
return _objectStateTable[obj];
@ -466,17 +466,17 @@ int ScummEngine::getObjActToObjActDist(int a, int b) {
int ScummEngine::findObject(int x, int y) {
int i, b;
byte a;
const int mask = (_game.version <= 2) ? 0x8 : 0xF;
const int mask = (_game.version <= 2) ? kObjectState_08 : 0xF;
for (i = 1; i < _numLocalObjects; i++) {
if ((_objs[i].obj_nr < 1) || getClass(_objs[i].obj_nr, kObjectClassUntouchable))
continue;
if (_game.version == 0) {
if (_objs[i].flags == 0 && _objs[i].state & 0x2)
if (_objs[i].flags == 0 && _objs[i].state & kObjectStateUntouchable)
continue;
} else {
if (_game.version <= 2 && _objs[i].state & 0x2)
if (_game.version <= 2 && _objs[i].state & kObjectStateUntouchable)
continue;
}
@ -505,7 +505,7 @@ int ScummEngine::findObject(int x, int y) {
void ScummEngine::drawRoomObject(int i, int arg) {
ObjectData *od;
byte a;
const int mask = (_game.version <= 2) ? 0x8 : 0xF;
const int mask = (_game.version <= 2) ? kObjectState_08 : 0xF;
od = &_objs[i];
if ((i < 1) || (od->obj_nr < 1) || !od->state)
@ -524,7 +524,7 @@ void ScummEngine::drawRoomObject(int i, int arg) {
void ScummEngine::drawRoomObjects(int arg) {
int i;
const int mask = (_game.version <= 2) ? 0x8 : 0xF;
const int mask = (_game.version <= 2) ? kObjectState_08 : 0xF;
if (_game.heversion >= 60) {
// In HE games, normal objects are drawn, followed by FlObjects.

View File

@ -34,6 +34,20 @@ enum ObjectClass {
kObjectClassUntouchable = 32
};
enum ObjectStateV2 {
kObjectStatePickupable = 1,
kObjectStateUntouchable = 2,
kObjectStateLocked = 4,
// FIXME: Not quite sure how to name state 8. It seems to mark some kind
// of "activation state" for the given object. E.g. is a door open?
// Is a drawer extended? In addition it is used to toggle the look
// of objects that the user can "pick up" (i.e. it is set in
// o2_pickupObject together with kObjectStateUntouchable). So in a sense,
// it can also mean "invisible" in some situations.
kObjectState_08 = 8
};
struct ObjectData {
uint32 OBIMoffset;
uint32 OBCDoffset;

View File

@ -439,23 +439,19 @@ void ScummEngine_c64::clearStateCommon(byte type) {
void ScummEngine_c64::ifStateCommon(byte type) {
int obj = getObjectFlag();
if ((getState(obj) & type) == 0) {
if ((getState(obj) & type) != 0)
ScummEngine::fetchScriptWord();
else
o_jumpRelative();
} else {
fetchScriptByte();
fetchScriptByte();
}
}
void ScummEngine_c64::ifNotStateCommon(byte type) {
int obj = getObjectFlag();
if ((getState(obj) & type) != 0) {
if ((getState(obj) & type) == 0)
ScummEngine::fetchScriptWord();
else
o_jumpRelative();
} else {
fetchScriptByte();
fetchScriptByte();
}
}
void ScummEngine_c64::drawSentence() {
@ -563,14 +559,14 @@ void ScummEngine_c64::drawSentence() {
void ScummEngine_c64::o_setState08() {
int obj = getObjectFlag();
putState(obj, getState(obj) | 0x08);
putState(obj, getState(obj) | kObjectState_08);
markObjectRectAsDirty(obj);
clearDrawObjectQueue();
}
void ScummEngine_c64::o_clearState08() {
int obj = getObjectFlag();
putState(obj, getState(obj) & ~0x08);
putState(obj, getState(obj) & ~kObjectState_08);
markObjectRectAsDirty(obj);
clearDrawObjectQueue();
}
@ -775,7 +771,7 @@ void ScummEngine_c64::o_pickupObject() {
addObjectToInventory(obj, _roomResource);
markObjectRectAsDirty(obj);
putOwner(obj, VAR(VAR_EGO));
putState(obj, getState(obj) | 0xA);
putState(obj, getState(obj) | kObjectState_08 | kObjectStateUntouchable);
clearDrawObjectQueue();
runInventoryScript(1);

View File

@ -472,40 +472,40 @@ void ScummEngine_v2::clearStateCommon(byte type) {
void ScummEngine_v2::o2_setState08() {
int obj = getVarOrDirectWord(PARAM_1);
putState(obj, getState(obj) | 0x08);
putState(obj, getState(obj) | kObjectState_08);
markObjectRectAsDirty(obj);
clearDrawObjectQueue();
}
void ScummEngine_v2::o2_clearState08() {
int obj = getVarOrDirectWord(PARAM_1);
putState(obj, getState(obj) & ~0x08);
putState(obj, getState(obj) & ~kObjectState_08);
markObjectRectAsDirty(obj);
clearDrawObjectQueue();
}
void ScummEngine_v2::o2_setState04() {
setStateCommon(0x04);
setStateCommon(kObjectStateLocked);
}
void ScummEngine_v2::o2_clearState04() {
clearStateCommon(0x04);
clearStateCommon(kObjectStateLocked);
}
void ScummEngine_v2::o2_setState02() {
setStateCommon(0x02);
setStateCommon(kObjectStateUntouchable);
}
void ScummEngine_v2::o2_clearState02() {
clearStateCommon(0x02);
clearStateCommon(kObjectStateUntouchable);
}
void ScummEngine_v2::o2_setState01() {
setStateCommon(0x01);
setStateCommon(kObjectStatePickupable);
}
void ScummEngine_v2::o2_clearState01() {
clearStateCommon(0x01);
clearStateCommon(kObjectStatePickupable);
}
void ScummEngine_v2::o2_assignVarWordIndirect() {
@ -575,51 +575,51 @@ void ScummEngine_v2::o2_getBitVar() {
void ScummEngine_v2::ifStateCommon(byte type) {
int obj = getVarOrDirectWord(PARAM_1);
if ((getState(obj) & type) == 0)
o5_jumpRelative();
else
if ((getState(obj) & type) != 0)
ignoreScriptWord();
else
o5_jumpRelative();
}
void ScummEngine_v2::ifNotStateCommon(byte type) {
int obj = getVarOrDirectWord(PARAM_1);
if ((getState(obj) & type) != 0)
o5_jumpRelative();
else
if ((getState(obj) & type) == 0)
ignoreScriptWord();
else
o5_jumpRelative();
}
void ScummEngine_v2::o2_ifState08() {
ifStateCommon(0x08);
ifStateCommon(kObjectState_08);
}
void ScummEngine_v2::o2_ifNotState08() {
ifNotStateCommon(0x08);
ifNotStateCommon(kObjectState_08);
}
void ScummEngine_v2::o2_ifState04() {
ifStateCommon(0x04);
ifStateCommon(kObjectStateLocked);
}
void ScummEngine_v2::o2_ifNotState04() {
ifNotStateCommon(0x04);
ifNotStateCommon(kObjectStateLocked);
}
void ScummEngine_v2::o2_ifState02() {
ifStateCommon(0x02);
ifStateCommon(kObjectStateUntouchable);
}
void ScummEngine_v2::o2_ifNotState02() {
ifNotStateCommon(0x02);
ifNotStateCommon(kObjectStateUntouchable);
}
void ScummEngine_v2::o2_ifState01() {
ifStateCommon(0x01);
ifStateCommon(kObjectStatePickupable);
}
void ScummEngine_v2::o2_ifNotState01() {
ifNotStateCommon(0x01);
ifNotStateCommon(kObjectStatePickupable);
}
void ScummEngine_v2::o2_addIndirect() {
@ -753,10 +753,10 @@ void ScummEngine_v2::o2_drawObject() {
i = _numLocalObjects;
while (i--) {
if (_objs[i].obj_nr && _objs[i].x_pos == x && _objs[i].y_pos == y && _objs[i].width == w && _objs[i].height == h)
putState(_objs[i].obj_nr, getState(_objs[i].obj_nr) & ~0x08);
putState(_objs[i].obj_nr, getState(_objs[i].obj_nr) & ~kObjectState_08);
}
putState(obj, getState(od->obj_nr) | 0x08);
putState(obj, getState(od->obj_nr) | kObjectState_08);
}
void ScummEngine_v2::o2_resourceRoutines() {
@ -1547,7 +1547,7 @@ void ScummEngine_v2::o2_pickupObject() {
addObjectToInventory(obj, _roomResource);
markObjectRectAsDirty(obj);
putOwner(obj, VAR(VAR_EGO));
putState(obj, getState(obj) | 0xA);
putState(obj, getState(obj) | kObjectState_08 | kObjectStateUntouchable);
clearDrawObjectQueue();
runInventoryScript(1);