DREAMWEB: Add some sprite-related comments and names

This commit is contained in:
Willem Jan Palenstijn 2011-11-18 22:34:46 +01:00
parent 13b2e89378
commit f4be01b1c1
4 changed files with 85 additions and 79 deletions

View file

@ -153,14 +153,14 @@ void DreamGenContext::showallobs() {
SetObject *setEntry = setEntries + i;
if (getmapad(setEntry->mapad) == 0)
continue;
uint8 currentFrame = setEntry->b18[0];
uint8 currentFrame = setEntry->frames[0];
data.word(kCurrentframe) = currentFrame;
if (currentFrame == 0xff)
continue;
calcfrframe();
uint16 x, y;
finalframe(&x, &y);
setEntry->index = setEntry->b18[0];
setEntry->index = setEntry->frames[0];
if ((setEntry->type == 0) && (setEntry->priority != 5) && (setEntry->priority != 6)) {
x += data.word(kMapadx);
y += data.word(kMapady);

View file

@ -60,11 +60,11 @@ void DreamGenContext::printasprite(const Sprite *sprite) {
}
uint8 c;
if (sprite->b29 != 0)
if (sprite->walkFrame != 0)
c = 8;
else
c = 0;
showframe((const Frame *)segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->b15, c);
showframe((const Frame *)segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->frameNumber, c);
}
void DreamGenContext::clearsprites() {
@ -73,7 +73,7 @@ void DreamGenContext::clearsprites() {
Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) {
Sprite *sprite = spritetable();
while (sprite->b15 != 0xff) { // NB: No boundchecking in the original code either
while (sprite->frameNumber != 0xff) { // NB: No boundchecking in the original code either
++sprite;
}
@ -83,7 +83,7 @@ Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uin
sprite->setFrameData(frameData);
WRITE_LE_UINT16(&sprite->w8, somethingInDi);
sprite->w2 = 0xffff;
sprite->b15 = 0;
sprite->frameNumber = 0;
sprite->delay = 0;
return sprite;
}
@ -114,8 +114,8 @@ void DreamGenContext::spriteupdate() {
void DreamGenContext::initman() {
Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0);
sprite->priority = 4;
sprite->b22 = 0;
sprite->b29 = 0;
sprite->speed = 0;
sprite->walkFrame = 0;
}
void DreamGenContext::mainman() {
@ -137,15 +137,15 @@ void DreamGenContext::mainman(Sprite *sprite) {
data.byte(kResetmanxy) = 0;
sprite->x = data.byte(kRyanx);
sprite->y = data.byte(kRyany);
sprite->b29 = 0;
sprite->walkFrame = 0;
}
--sprite->b22;
if (sprite->b22 != 0xff) {
--sprite->speed;
if (sprite->speed != 0xff) {
ds = pop();
es = pop();
return;
}
sprite->b22 = 0;
sprite->speed = 0;
if (data.byte(kTurntoface) != data.byte(kFacing)) {
aboutturn(sprite);
} else {
@ -156,16 +156,16 @@ void DreamGenContext::mainman(Sprite *sprite) {
}
data.byte(kTurndirection) = 0;
if (data.byte(kLinepointer) == 254) {
sprite->b29 = 0;
sprite->walkFrame = 0;
} else {
++sprite->b29;
if (sprite->b29 == 11)
sprite->b29 = 1;
++sprite->walkFrame;
if (sprite->walkFrame == 11)
sprite->walkFrame = 1;
walking(sprite);
if (data.byte(kLinepointer) != 254) {
if ((data.byte(kFacing) & 1) == 0)
walking(sprite);
else if ((sprite->b29 != 2) && (sprite->b29 != 7))
else if ((sprite->walkFrame != 2) && (sprite->walkframe != 7))
walking(sprite);
}
if (data.byte(kLinepointer) == 254) {
@ -178,7 +178,7 @@ void DreamGenContext::mainman(Sprite *sprite) {
}
}
static const uint8 facelist[] = { 0,60,33,71,11,82,22,93 };
sprite->b15 = sprite->b29 + facelist[data.byte(kFacing)];
sprite->frameNumber = sprite->walkFrame + facelist[data.byte(kFacing)];
data.byte(kRyanx) = sprite->x;
data.byte(kRyany) = sprite->y;
@ -241,11 +241,11 @@ void DreamGenContext::aboutturn(Sprite *sprite) {
if (incdir) {
data.byte(kTurndirection) = 1;
data.byte(kFacing) = (data.byte(kFacing) + 1) & 7;
sprite->b29 = 0;
sprite->walkFrame = 0;
} else {
data.byte(kTurndirection) = (uint8)-1;
data.byte(kFacing) = (data.byte(kFacing) - 1) & 7;
sprite->b29 = 0;
sprite->walkFrame = 0;
}
}
@ -279,19 +279,19 @@ void DreamGenContext::backobject(Sprite *sprite) {
}
void DreamGenContext::constant(Sprite *sprite, SetObject *objData) {
++sprite->frame;
if (objData->b18[sprite->frame] == 255) {
sprite->frame = 0;
++sprite->animFrame;
if (objData->frames[sprite->animFrame] == 255) {
sprite->animFrame = 0;
}
uint8 b18 = objData->b18[sprite->frame];
objData->index = b18;
sprite->b15 = b18;
uint8 frame = objData->frames[sprite->animFrame];
objData->index = frame;
sprite->frameNumber = frame;
}
void DreamGenContext::random(Sprite *sprite, SetObject *objData) {
randomnum1();
uint16 r = ax;
sprite->b15 = objData->b18[r&7];
sprite->frameNumber = objData->frames[r&7];
}
void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) {
@ -316,46 +316,46 @@ void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData, Common::Rect ch
if (openDoor) {
if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0))
sprite->frame = 6;
if ((data.byte(kThroughdoor) == 1) && (sprite->animFrame == 0))
sprite->animFrame = 6;
++sprite->frame;
if (sprite->frame == 1) { // doorsound2
++sprite->animFrame;
if (sprite->animFrame == 1) { // doorsound2
if (data.byte(kReallocation) == 5) // hoteldoor2
al = 13;
else
al = 0;
playchannel1();
}
if (objData->b18[sprite->frame] == 255)
--sprite->frame;
if (objData->frames[sprite->animFrame] == 255)
--sprite->animFrame;
sprite->b15 = objData->index = objData->b18[sprite->frame];
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
data.byte(kThroughdoor) = 1;
} else {
// shut door
if (sprite->frame == 5) { // doorsound1;
if (sprite->animFrame == 5) { // doorsound1;
if (data.byte(kReallocation) == 5) // hoteldoor1
al = 13;
else
al = 1;
playchannel1();
}
if (sprite->frame != 0)
--sprite->frame;
if (sprite->animFrame != 0)
--sprite->animFrame;
sprite->b15 = objData->index = objData->b18[sprite->frame];
if (sprite->frame == 5) // nearly
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
if (sprite->animFrame == 5) // nearly
data.byte(kThroughdoor) = 0;
}
}
void DreamGenContext::steady(Sprite *sprite, SetObject *objData) {
uint8 b18 = objData->b18[0];
objData->index = b18;
sprite->b15 = b18;
uint8 frame = objData->frames[0];
objData->index = frame;
sprite->frameNumber = frame;
}
void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) {
@ -372,40 +372,40 @@ void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) {
if (openDoor) {
if (sprite->frame == 1) {
if (sprite->animFrame == 1) {
al = 0;
playchannel1();
}
if (sprite->frame == 6)
if (sprite->animFrame == 6)
turnpathon(data.byte(kDoorpath));
if (data.byte(kThroughdoor) == 1 && sprite->frame == 0)
sprite->frame = 6;
if (data.byte(kThroughdoor) == 1 && sprite->animFrame == 0)
sprite->animFrame = 6;
++sprite->frame;
if (objData->b18[sprite->frame] == 255)
--sprite->frame;
++sprite->animFrame;
if (objData->frames[sprite->animFrame] == 255)
--sprite->animFrame;
sprite->b15 = objData->index = objData->b18[sprite->frame];
if (sprite->frame == 5)
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
if (sprite->animFrame == 5)
data.byte(kThroughdoor) = 1;
} else {
// shut door
if (sprite->frame == 5) {
if (sprite->animFrame == 5) {
al = 1;
playchannel1();
}
if (sprite->frame != 0)
--sprite->frame;
if (sprite->animFrame != 0)
--sprite->animFrame;
data.byte(kThroughdoor) = 0;
sprite->b15 = objData->index = objData->b18[sprite->frame];
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
if (sprite->frame == 0) {
if (sprite->animFrame == 0) {
turnpathoff(data.byte(kDoorpath));
data.byte(kLockstatus) = 1;
}
@ -422,8 +422,8 @@ void DreamGenContext::liftsprite(Sprite *sprite, SetObject *objData) {
if (data.byte(kCounttoopen) == 0)
data.byte(kLiftflag) = 3;
}
sprite->frame = 0;
sprite->b15 = objData->index = objData->b18[sprite->frame];
sprite->animFrame = 0;
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
}
else if (liftFlag == 1) { //liftopen
turnpathon(data.byte(kLiftpath));
@ -433,32 +433,32 @@ void DreamGenContext::liftsprite(Sprite *sprite, SetObject *objData) {
if (data.byte(kCounttoclose) == 0)
data.byte(kLiftflag) = 2;
}
sprite->frame = 12;
sprite->b15 = objData->index = objData->b18[sprite->frame];
sprite->animFrame = 12;
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
}
else if (liftFlag == 3) { //openlift
if (sprite->frame == 12) {
if (sprite->animFrame == 12) {
data.byte(kLiftflag) = 1;
return;
}
++sprite->frame;
if (sprite->frame == 1) {
++sprite->animFrame;
if (sprite->animFrame == 1) {
al = 2;
liftnoise();
}
sprite->b15 = objData->index = objData->b18[sprite->frame];
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
} else { //closeLift
assert(liftFlag == 2);
if (sprite->frame == 0) {
if (sprite->animFrame == 0) {
data.byte(kLiftflag) = 0;
return;
}
--sprite->frame;
if (sprite->frame == 11) {
--sprite->animFrame;
if (sprite->animFrame == 11) {
al = 3;
liftnoise();
}
sprite->b15 = objData->index = objData->b18[sprite->frame];
sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
}
}
@ -469,6 +469,10 @@ void DreamGenContext::facerightway() {
data.byte(kLeavedirection) = dir;
}
// Locate the reel segment (reel1, reel2, reel3) this frame is stored in.
// The return value is a pointer to the start of the segment.
// data.word(kCurrentframe) - data.word(kTakeoff) is the number of the frame
// inside that segment
Frame *DreamGenContext::findsource() {
uint16 currentFrame = data.word(kCurrentframe);
if (currentFrame < 160) {
@ -525,8 +529,8 @@ void DreamGenContext::showrain() {
return;
ds = data.word(kMainsprites);
si = 6*58;
ax = ds.word(si+2);
si = 6*58; // Frame 58
ax = ds.word(si+2); // Frame::ptr
si = ax + 2080;
for (; rain->x != 255; ++rain) {
@ -541,7 +545,7 @@ void DreamGenContext::showrain() {
uint8 v = src[i];
if (v != 0)
*dst = v;
dst += 320-1;
dst += 320-1; // advance diagonally
}
}
@ -551,9 +555,10 @@ void DreamGenContext::showrain() {
return;
if (data.byte(kReallocation) == 55)
return;
randomnum1();
if (al >= 1)
if (engine->randomNumber() >= 1) // play thunder with 1 in 256 chance
return;
if (data.byte(kCh0playing) != 6)
al = 4;
else

View file

@ -37,20 +37,20 @@ struct Sprite {
uint8 y;
uint16 w12;
uint8 b14;
uint8 b15;
uint8 frameNumber;
uint8 b16;
uint8 b17;
uint8 delay;
uint8 frame;
uint8 animFrame; // index into SetObject::frames
uint16 _objData;
uint16 objData() const { return READ_LE_UINT16(&_objData); }
void setObjData(uint16 v) { WRITE_LE_UINT16(&_objData, v); }
uint8 b22;
uint8 speed;
uint8 priority;
uint16 w24;
uint16 w26;
uint8 b28;
uint8 b29;
uint8 walkFrame;
uint8 type;
uint8 hidden;
};
@ -83,7 +83,8 @@ struct SetObject {
uint8 name[4];
uint8 b16;
uint8 index;
uint8 b18[13]; // NB: Don't know the size yet
uint8 frames[13]; // Table mapping animFrame to sprite frame number
// NB: Don't know the size yet
uint8 b31;
uint8 b32;
uint8 b33;

View file

@ -804,7 +804,7 @@ void DreamGenContext::makebackob(SetObject *objData) {
sprite->type = type;
sprite->b16 = 0;
sprite->delay = 0;
sprite->frame = 0;
sprite->animFrame = 0;
}
void DreamGenContext::getroomdata() {