From 40e5e03e32f08562738abde8a22ce4b0c98264f0 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Tue, 28 Jun 2011 05:10:35 +0200 Subject: DREAMWEB: Blacklisted liftsprite --- engines/dreamweb/dreamgen.cpp | 93 ------------------------------------------- engines/dreamweb/dreamgen.h | 3 +- engines/dreamweb/stubs.cpp | 76 ++++++++++++++++++++++++++++++++++- engines/dreamweb/stubs.h | 4 ++ 4 files changed, 80 insertions(+), 96 deletions(-) (limited to 'engines/dreamweb') diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 478a7380e7..ce978b223d 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -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; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index f7e19f2eec..d924c62c3c 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -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(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index d0fdf6fd42..3271b701d6 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -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); } diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index d840a8c8fa..461cef7419 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -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(); -- cgit v1.2.3