DREAMWEB: Blacklisted liftsprite

This commit is contained in:
Bertrand Augereau 2011-06-28 05:10:35 +02:00
parent 25528a56e8
commit 40e5e03e32
5 changed files with 81 additions and 96 deletions

View File

@ -33,6 +33,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'showframe',
'spriteupdate',
'dodoor',
'liftsprite',
'frameoutv',
'modifychar',
'lockmon'

View File

@ -2955,98 +2955,6 @@ steadyob:
steady();
}
void DreamGenContext::liftsprite() {
STACK_CHECK;
al = data.byte(kLiftflag);
_cmp(al, 0);
if (flags.z())
goto liftclosed;
_cmp(al, 1);
if (flags.z())
goto liftopen;
_cmp(al, 3);
if (flags.z())
goto openlift;
al = es.byte(bx+19);
_cmp(al, 0);
if (flags.z())
goto finishclose;
_dec(al);
_cmp(al, 11);
if (!flags.z())
goto pokelift;
push(ax);
al = 3;
liftnoise();
ax = pop();
goto pokelift;
finishclose:
data.byte(kLiftflag) = 0;
return;
openlift:
al = es.byte(bx+19);
_cmp(al, 12);
if (flags.z())
goto endoflist;
_inc(al);
_cmp(al, 1);
if (!flags.z())
goto pokelift;
push(ax);
al = 2;
liftnoise();
ax = pop();
pokelift:
es.byte(bx+19) = al;
ah = 0;
push(di);
_add(di, ax);
al = ds.byte(di+18);
di = pop();
es.byte(bx+15) = al;
ds.byte(di+17) = al;
return;
endoflist:
data.byte(kLiftflag) = 1;
return;
liftopen:
al = data.byte(kLiftpath);
push(es);
push(bx);
turnpathon();
bx = pop();
es = pop();
_cmp(data.byte(kCounttoclose), 0);
if (flags.z())
goto nocountclose;
_dec(data.byte(kCounttoclose));
_cmp(data.byte(kCounttoclose), 0);
if (!flags.z())
goto nocountclose;
data.byte(kLiftflag) = 2;
nocountclose:
al = 12;
goto pokelift;
liftclosed:
al = data.byte(kLiftpath);
push(es);
push(bx);
turnpathoff();
bx = pop();
es = pop();
_cmp(data.byte(kCounttoopen), 0);
if (flags.z())
goto nocountopen;
_dec(data.byte(kCounttoopen));
_cmp(data.byte(kCounttoopen), 0);
if (!flags.z())
goto nocountopen;
data.byte(kLiftflag) = 3;
nocountopen:
al = 0;
goto pokelift;
}
void DreamGenContext::liftnoise() {
STACK_CHECK;
_cmp(data.byte(kReallocation), 5);
@ -21687,7 +21595,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) {
case addr_getblockofpixel: getblockofpixel(); break;
case addr_showrain: showrain(); break;
case addr_backobject: backobject(); break;
case addr_liftsprite: liftsprite(); break;
case addr_liftnoise: liftnoise(); break;
case addr_random: random(); break;
case addr_steady: steady(); break;

View File

@ -653,7 +653,6 @@ public:
static const uint16 addr_steady = 0xc180;
static const uint16 addr_random = 0xc17c;
static const uint16 addr_liftnoise = 0xc178;
static const uint16 addr_liftsprite = 0xc174;
static const uint16 addr_backobject = 0xc170;
static const uint16 addr_showrain = 0xc16c;
static const uint16 addr_getblockofpixel = 0xc168;
@ -1455,7 +1454,7 @@ public:
void dealwithspecial();
//void eraseoldobs();
void dircom();
void liftsprite();
//void liftsprite();
void dumpkeypad();
void dumpzoom();
void endgameseq();

View File

@ -825,7 +825,7 @@ void DreamGenContext::backobject(Sprite* sprite) {
else if (objData->type == 4)
lockeddoorway();
else if (objData->type == 3)
liftsprite();
liftsprite(sprite, objData);
else if (objData->type == 2)
doorway();
else if (objData->type == 1)
@ -913,6 +913,80 @@ void DreamGenContext::steady(Sprite* sprite, ObjData* objData) {
sprite->b15 = b18;
}
void DreamGenContext::turnpathonCPP(uint8 param) {
al = param;
push(es);
push(bx);
turnpathon();
bx = pop();
es = pop();
}
void DreamGenContext::turnpathoffCPP(uint8 param) {
al = param;
push(es);
push(bx);
turnpathoff();
bx = pop();
es = pop();
}
void DreamGenContext::liftsprite() {
Sprite *sprite = (Sprite*)es.ptr(bx, sizeof(Sprite));
ObjData *objData = (ObjData*)ds.ptr(di, 0);
liftsprite(sprite, objData);
}
void DreamGenContext::liftsprite(Sprite* sprite, ObjData* objData) {
uint8 liftFlag = data.byte(kLiftflag);
if (liftFlag == 0) { //liftclosed
turnpathoffCPP(data.byte(kLiftpath));
if (data.byte(kCounttoopen) != 0) {
_dec(data.byte(kCounttoopen));
if (data.byte(kCounttoopen) == 0)
data.byte(kLiftflag) = 3;
}
sprite->frame = 0;
sprite->b15 = objData->b17 = objData->b18[sprite->frame];
}
else if (liftFlag == 1) { //liftopen
turnpathonCPP(data.byte(kLiftpath));
if (data.byte(kCounttoclose) != 0) {
_dec(data.byte(kCounttoclose));
if (data.byte(kCounttoclose) == 0)
data.byte(kLiftflag) = 2;
}
sprite->frame = 12;
sprite->b15 = objData->b17 = objData->b18[sprite->frame];
}
else if (liftFlag == 3) { //openlift
if (sprite->frame == 12) {
data.byte(kLiftflag) = 1;
return;
}
++sprite->frame;
if (sprite->frame == 1) {
al = 2;
liftnoise();
}
sprite->b15 = objData->b17 = objData->b18[sprite->frame];
} else { //closeLift
assert(liftFlag == 2);
if (sprite->frame == 0) {
data.byte(kLiftflag) = 0;
return;
}
--sprite->frame;
if (sprite->frame == 11) {
al = 3;
liftnoise();
}
sprite->b15 = objData->b17 = objData->b18[sprite->frame];
}
}
void DreamGenContext::modifychar() {
al = engine->modifyChar(al);
}

View File

@ -31,6 +31,10 @@
void steady(Sprite* sprite, ObjData* objData);
void dodoor();
void dodoor(Sprite* sprite, ObjData* objData);
void liftsprite();
void liftsprite(Sprite* sprite, ObjData* objData);
void turnpathonCPP(uint8 param);
void turnpathoffCPP(uint8 param);
void modifychar();
void lockmon();