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; SetObject *setEntry = setEntries + i;
if (getmapad(setEntry->mapad) == 0) if (getmapad(setEntry->mapad) == 0)
continue; continue;
uint8 currentFrame = setEntry->b18[0]; uint8 currentFrame = setEntry->frames[0];
data.word(kCurrentframe) = currentFrame; data.word(kCurrentframe) = currentFrame;
if (currentFrame == 0xff) if (currentFrame == 0xff)
continue; continue;
calcfrframe(); calcfrframe();
uint16 x, y; uint16 x, y;
finalframe(&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)) { if ((setEntry->type == 0) && (setEntry->priority != 5) && (setEntry->priority != 6)) {
x += data.word(kMapadx); x += data.word(kMapadx);
y += data.word(kMapady); y += data.word(kMapady);

View file

@ -60,11 +60,11 @@ void DreamGenContext::printasprite(const Sprite *sprite) {
} }
uint8 c; uint8 c;
if (sprite->b29 != 0) if (sprite->walkFrame != 0)
c = 8; c = 8;
else else
c = 0; 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() { void DreamGenContext::clearsprites() {
@ -73,7 +73,7 @@ void DreamGenContext::clearsprites() {
Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) { Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) {
Sprite *sprite = spritetable(); 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; ++sprite;
} }
@ -83,7 +83,7 @@ Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uin
sprite->setFrameData(frameData); sprite->setFrameData(frameData);
WRITE_LE_UINT16(&sprite->w8, somethingInDi); WRITE_LE_UINT16(&sprite->w8, somethingInDi);
sprite->w2 = 0xffff; sprite->w2 = 0xffff;
sprite->b15 = 0; sprite->frameNumber = 0;
sprite->delay = 0; sprite->delay = 0;
return sprite; return sprite;
} }
@ -114,8 +114,8 @@ void DreamGenContext::spriteupdate() {
void DreamGenContext::initman() { void DreamGenContext::initman() {
Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0); Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0);
sprite->priority = 4; sprite->priority = 4;
sprite->b22 = 0; sprite->speed = 0;
sprite->b29 = 0; sprite->walkFrame = 0;
} }
void DreamGenContext::mainman() { void DreamGenContext::mainman() {
@ -137,15 +137,15 @@ void DreamGenContext::mainman(Sprite *sprite) {
data.byte(kResetmanxy) = 0; data.byte(kResetmanxy) = 0;
sprite->x = data.byte(kRyanx); sprite->x = data.byte(kRyanx);
sprite->y = data.byte(kRyany); sprite->y = data.byte(kRyany);
sprite->b29 = 0; sprite->walkFrame = 0;
} }
--sprite->b22; --sprite->speed;
if (sprite->b22 != 0xff) { if (sprite->speed != 0xff) {
ds = pop(); ds = pop();
es = pop(); es = pop();
return; return;
} }
sprite->b22 = 0; sprite->speed = 0;
if (data.byte(kTurntoface) != data.byte(kFacing)) { if (data.byte(kTurntoface) != data.byte(kFacing)) {
aboutturn(sprite); aboutturn(sprite);
} else { } else {
@ -156,16 +156,16 @@ void DreamGenContext::mainman(Sprite *sprite) {
} }
data.byte(kTurndirection) = 0; data.byte(kTurndirection) = 0;
if (data.byte(kLinepointer) == 254) { if (data.byte(kLinepointer) == 254) {
sprite->b29 = 0; sprite->walkFrame = 0;
} else { } else {
++sprite->b29; ++sprite->walkFrame;
if (sprite->b29 == 11) if (sprite->walkFrame == 11)
sprite->b29 = 1; sprite->walkFrame = 1;
walking(sprite); walking(sprite);
if (data.byte(kLinepointer) != 254) { if (data.byte(kLinepointer) != 254) {
if ((data.byte(kFacing) & 1) == 0) if ((data.byte(kFacing) & 1) == 0)
walking(sprite); walking(sprite);
else if ((sprite->b29 != 2) && (sprite->b29 != 7)) else if ((sprite->walkFrame != 2) && (sprite->walkframe != 7))
walking(sprite); walking(sprite);
} }
if (data.byte(kLinepointer) == 254) { 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 }; 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(kRyanx) = sprite->x;
data.byte(kRyany) = sprite->y; data.byte(kRyany) = sprite->y;
@ -241,11 +241,11 @@ void DreamGenContext::aboutturn(Sprite *sprite) {
if (incdir) { if (incdir) {
data.byte(kTurndirection) = 1; data.byte(kTurndirection) = 1;
data.byte(kFacing) = (data.byte(kFacing) + 1) & 7; data.byte(kFacing) = (data.byte(kFacing) + 1) & 7;
sprite->b29 = 0; sprite->walkFrame = 0;
} else { } else {
data.byte(kTurndirection) = (uint8)-1; data.byte(kTurndirection) = (uint8)-1;
data.byte(kFacing) = (data.byte(kFacing) - 1) & 7; 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) { void DreamGenContext::constant(Sprite *sprite, SetObject *objData) {
++sprite->frame; ++sprite->animFrame;
if (objData->b18[sprite->frame] == 255) { if (objData->frames[sprite->animFrame] == 255) {
sprite->frame = 0; sprite->animFrame = 0;
} }
uint8 b18 = objData->b18[sprite->frame]; uint8 frame = objData->frames[sprite->animFrame];
objData->index = b18; objData->index = frame;
sprite->b15 = b18; sprite->frameNumber = frame;
} }
void DreamGenContext::random(Sprite *sprite, SetObject *objData) { void DreamGenContext::random(Sprite *sprite, SetObject *objData) {
randomnum1(); randomnum1();
uint16 r = ax; uint16 r = ax;
sprite->b15 = objData->b18[r&7]; sprite->frameNumber = objData->frames[r&7];
} }
void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) { void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) {
@ -316,46 +316,46 @@ void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData, Common::Rect ch
if (openDoor) { if (openDoor) {
if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) if ((data.byte(kThroughdoor) == 1) && (sprite->animFrame == 0))
sprite->frame = 6; sprite->animFrame = 6;
++sprite->frame; ++sprite->animFrame;
if (sprite->frame == 1) { // doorsound2 if (sprite->animFrame == 1) { // doorsound2
if (data.byte(kReallocation) == 5) // hoteldoor2 if (data.byte(kReallocation) == 5) // hoteldoor2
al = 13; al = 13;
else else
al = 0; al = 0;
playchannel1(); playchannel1();
} }
if (objData->b18[sprite->frame] == 255) if (objData->frames[sprite->animFrame] == 255)
--sprite->frame; --sprite->animFrame;
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
data.byte(kThroughdoor) = 1; data.byte(kThroughdoor) = 1;
} else { } else {
// shut door // shut door
if (sprite->frame == 5) { // doorsound1; if (sprite->animFrame == 5) { // doorsound1;
if (data.byte(kReallocation) == 5) // hoteldoor1 if (data.byte(kReallocation) == 5) // hoteldoor1
al = 13; al = 13;
else else
al = 1; al = 1;
playchannel1(); playchannel1();
} }
if (sprite->frame != 0) if (sprite->animFrame != 0)
--sprite->frame; --sprite->animFrame;
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
if (sprite->frame == 5) // nearly if (sprite->animFrame == 5) // nearly
data.byte(kThroughdoor) = 0; data.byte(kThroughdoor) = 0;
} }
} }
void DreamGenContext::steady(Sprite *sprite, SetObject *objData) { void DreamGenContext::steady(Sprite *sprite, SetObject *objData) {
uint8 b18 = objData->b18[0]; uint8 frame = objData->frames[0];
objData->index = b18; objData->index = frame;
sprite->b15 = b18; sprite->frameNumber = frame;
} }
void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) { void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) {
@ -372,40 +372,40 @@ void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) {
if (openDoor) { if (openDoor) {
if (sprite->frame == 1) { if (sprite->animFrame == 1) {
al = 0; al = 0;
playchannel1(); playchannel1();
} }
if (sprite->frame == 6) if (sprite->animFrame == 6)
turnpathon(data.byte(kDoorpath)); turnpathon(data.byte(kDoorpath));
if (data.byte(kThroughdoor) == 1 && sprite->frame == 0) if (data.byte(kThroughdoor) == 1 && sprite->animFrame == 0)
sprite->frame = 6; sprite->animFrame = 6;
++sprite->frame; ++sprite->animFrame;
if (objData->b18[sprite->frame] == 255) if (objData->frames[sprite->animFrame] == 255)
--sprite->frame; --sprite->animFrame;
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
if (sprite->frame == 5) if (sprite->animFrame == 5)
data.byte(kThroughdoor) = 1; data.byte(kThroughdoor) = 1;
} else { } else {
// shut door // shut door
if (sprite->frame == 5) { if (sprite->animFrame == 5) {
al = 1; al = 1;
playchannel1(); playchannel1();
} }
if (sprite->frame != 0) if (sprite->animFrame != 0)
--sprite->frame; --sprite->animFrame;
data.byte(kThroughdoor) = 0; 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)); turnpathoff(data.byte(kDoorpath));
data.byte(kLockstatus) = 1; data.byte(kLockstatus) = 1;
} }
@ -422,8 +422,8 @@ void DreamGenContext::liftsprite(Sprite *sprite, SetObject *objData) {
if (data.byte(kCounttoopen) == 0) if (data.byte(kCounttoopen) == 0)
data.byte(kLiftflag) = 3; data.byte(kLiftflag) = 3;
} }
sprite->frame = 0; sprite->animFrame = 0;
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
} }
else if (liftFlag == 1) { //liftopen else if (liftFlag == 1) { //liftopen
turnpathon(data.byte(kLiftpath)); turnpathon(data.byte(kLiftpath));
@ -433,32 +433,32 @@ void DreamGenContext::liftsprite(Sprite *sprite, SetObject *objData) {
if (data.byte(kCounttoclose) == 0) if (data.byte(kCounttoclose) == 0)
data.byte(kLiftflag) = 2; data.byte(kLiftflag) = 2;
} }
sprite->frame = 12; sprite->animFrame = 12;
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
} }
else if (liftFlag == 3) { //openlift else if (liftFlag == 3) { //openlift
if (sprite->frame == 12) { if (sprite->animFrame == 12) {
data.byte(kLiftflag) = 1; data.byte(kLiftflag) = 1;
return; return;
} }
++sprite->frame; ++sprite->animFrame;
if (sprite->frame == 1) { if (sprite->animFrame == 1) {
al = 2; al = 2;
liftnoise(); liftnoise();
} }
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
} else { //closeLift } else { //closeLift
assert(liftFlag == 2); assert(liftFlag == 2);
if (sprite->frame == 0) { if (sprite->animFrame == 0) {
data.byte(kLiftflag) = 0; data.byte(kLiftflag) = 0;
return; return;
} }
--sprite->frame; --sprite->animFrame;
if (sprite->frame == 11) { if (sprite->animFrame == 11) {
al = 3; al = 3;
liftnoise(); 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; 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() { Frame *DreamGenContext::findsource() {
uint16 currentFrame = data.word(kCurrentframe); uint16 currentFrame = data.word(kCurrentframe);
if (currentFrame < 160) { if (currentFrame < 160) {
@ -525,8 +529,8 @@ void DreamGenContext::showrain() {
return; return;
ds = data.word(kMainsprites); ds = data.word(kMainsprites);
si = 6*58; si = 6*58; // Frame 58
ax = ds.word(si+2); ax = ds.word(si+2); // Frame::ptr
si = ax + 2080; si = ax + 2080;
for (; rain->x != 255; ++rain) { for (; rain->x != 255; ++rain) {
@ -541,7 +545,7 @@ void DreamGenContext::showrain() {
uint8 v = src[i]; uint8 v = src[i];
if (v != 0) if (v != 0)
*dst = v; *dst = v;
dst += 320-1; dst += 320-1; // advance diagonally
} }
} }
@ -551,9 +555,10 @@ void DreamGenContext::showrain() {
return; return;
if (data.byte(kReallocation) == 55) if (data.byte(kReallocation) == 55)
return; return;
randomnum1();
if (al >= 1) if (engine->randomNumber() >= 1) // play thunder with 1 in 256 chance
return; return;
if (data.byte(kCh0playing) != 6) if (data.byte(kCh0playing) != 6)
al = 4; al = 4;
else else

View file

@ -37,20 +37,20 @@ struct Sprite {
uint8 y; uint8 y;
uint16 w12; uint16 w12;
uint8 b14; uint8 b14;
uint8 b15; uint8 frameNumber;
uint8 b16; uint8 b16;
uint8 b17; uint8 b17;
uint8 delay; uint8 delay;
uint8 frame; uint8 animFrame; // index into SetObject::frames
uint16 _objData; uint16 _objData;
uint16 objData() const { return READ_LE_UINT16(&_objData); } uint16 objData() const { return READ_LE_UINT16(&_objData); }
void setObjData(uint16 v) { WRITE_LE_UINT16(&_objData, v); } void setObjData(uint16 v) { WRITE_LE_UINT16(&_objData, v); }
uint8 b22; uint8 speed;
uint8 priority; uint8 priority;
uint16 w24; uint16 w24;
uint16 w26; uint16 w26;
uint8 b28; uint8 b28;
uint8 b29; uint8 walkFrame;
uint8 type; uint8 type;
uint8 hidden; uint8 hidden;
}; };
@ -83,7 +83,8 @@ struct SetObject {
uint8 name[4]; uint8 name[4];
uint8 b16; uint8 b16;
uint8 index; 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 b31;
uint8 b32; uint8 b32;
uint8 b33; uint8 b33;

View file

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