DREAMWEB: Port 'swapwithopen' to C++

This commit is contained in:
Filippos Karapetis 2011-12-25 17:54:22 +02:00
parent c531c4c1ea
commit bf4271dfc1
5 changed files with 83 additions and 113 deletions
devtools/tasmrecover
engines/dreamweb

@ -860,6 +860,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'steady',
'storeit',
'swapwithinv',
'swapwithopen',
'switchryanoff',
'switchryanon',
'talk',

@ -284,108 +284,6 @@ findopen2a:
goto findopen1a;
}
void DreamGenContext::swapWithOpen() {
STACK_CHECK;
al = data.byte(kItemframe);
ah = data.byte(kObjecttype);
_cmp(ax, data.word(kOldsubject));
if (!flags.z())
goto difsub8;
_cmp(data.byte(kCommandtype), 242);
if (flags.z())
goto alreadyswap2;
data.byte(kCommandtype) = 242;
difsub8:
data.word(kOldsubject) = ax;
bx = ax;
al = 34;
commandWithOb();
alreadyswap2:
ax = data.word(kMousebutton);
_cmp(ax, data.word(kOldbutton));
if (flags.z())
return /* (cantswap2) */;
_and(ax, 1);
if (!flags.z())
goto doswap2;
return;
doswap2:
getEitherAd();
isItWorn();
if (!flags.z())
goto notwornswap;
wornError();
return;
notwornswap:
delPointer();
al = data.byte(kItemframe);
_cmp(al, data.byte(kOpenedob));
if (!flags.z())
goto isntsame2;
al = data.byte(kObjecttype);
_cmp(al, data.byte(kOpenedtype));
if (!flags.z())
goto isntsame2;
errorMessage1();
return;
isntsame2:
checkObjectSize();
_cmp(al, 0);
if (flags.z())
goto sizeok2;
return;
sizeok2:
ah = data.byte(kObjecttype);
al = data.byte(kItemframe);
push(ax);
findOpenPos();
ax = es.word(bx);
data.byte(kItemframe) = al;
data.byte(kObjecttype) = ah;
_cmp(ah, 4);
if (!flags.z())
goto makeswapex;
getEitherAd();
es.byte(bx+2) = 20;
es.byte(bx+3) = 255;
goto actuallyswap;
makeswapex:
transferToEx();
data.byte(kItemframe) = al;
data.byte(kObjecttype) = 4;
getEitherAd();
es.byte(bx+2) = 20;
es.byte(bx+3) = 255;
actuallyswap:
bl = data.byte(kItemframe);
bh = data.byte(kObjecttype);
ax = pop();
data.byte(kObjecttype) = ah;
data.byte(kItemframe) = al;
push(bx);
findOpenPos();
getEitherAd();
al = data.byte(kOpenedtype);
es.byte(bx+2) = al;
al = data.byte(kOpenedob);
es.byte(bx+3) = al;
al = data.byte(kLastinvpos);
es.byte(bx+4) = al;
al = data.byte(kReallocation);
es.byte(bx+5) = al;
ax = pop();
data.byte(kObjecttype) = ah;
data.byte(kItemframe) = al;
fillOpen();
fillRyan();
underTextLine();
readMouse();
useOpened();
showPointer();
workToScreen();
delPointer();
}
void DreamGenContext::getFreeAd() {
STACK_CHECK;
ah = 0;

@ -469,7 +469,6 @@ public:
void findAllOpen();
void fillOpen();
void getEitherAd();
void swapWithOpen();
void dreamweb();
void findPathOfPoint();
void getDestInfo();

@ -834,6 +834,49 @@ void DreamGenContext::reExFromInv() {
data.byte(kPointermode) = 0;
}
void DreamGenContext::swapWithInv() {
uint16 subject = (data.byte(kObjecttype) << 8) | data.byte(kItemframe);
if (subject == data.word(kOldsubject)) {
if (data.byte(kCommandtype) != 243) {
data.byte(kCommandtype) = 243;
data.word(kOldsubject) = subject;
commandWithOb(34, data.byte(kObjecttype), data.byte(kItemframe));
}
} else {
data.word(kOldsubject) = subject;
commandWithOb(34, data.byte(kObjecttype), data.byte(kItemframe));
}
if (data.word(kMousebutton) == data.word(kOldbutton) || !(data.word(kMousebutton) & 1))
return;
byte prevType = data.byte(kObjecttype);
byte prevFrame = data.byte(kItemframe);
uint16 objectId = getSegment(data.word(kBuffers)).word(findInvPosCPP());
data.byte(kItemframe) = objectId & 0x00FF;
data.byte(kObjecttype) = objectId >> 8;
DynObject *object = getEitherAdCPP();
object->mapad[0] = 20;
object->mapad[1] = 255;
byte prevType2 = data.byte(kObjecttype);
byte prevFrame2 = data.byte(kItemframe);
data.byte(kObjecttype) = prevType;
data.byte(kItemframe) = prevFrame;
//findInvPosCPP(); // found in the original source, but it seems to be useless
delPointer();
object = getEitherAdCPP();
object->mapad[0] = 4;
object->mapad[1] = 255;
object->mapad[2] = data.byte(kLastinvpos);
data.byte(kObjecttype) = prevType2;
data.byte(kItemframe) = prevFrame2;
fillRyan();
readMouse();
showPointer();
workToScreenCPP();
delPointer();
}
void DreamGenContext::useOpened() {
if (data.byte(kOpenedob) == 255)
return; // cannot use opened object
@ -902,11 +945,11 @@ void DreamGenContext::useOpened() {
delPointer();
}
void DreamGenContext::swapWithInv() {
void DreamGenContext::swapWithOpen() {
uint16 subject = (data.byte(kObjecttype) << 8) | data.byte(kItemframe);
if (subject == data.word(kOldsubject)) {
if (data.byte(kCommandtype) != 243) {
data.byte(kCommandtype) = 243;
if (data.byte(kCommandtype) != 242) {
data.byte(kCommandtype) = 242;
data.word(kOldsubject) = subject;
commandWithOb(34, data.byte(kObjecttype), data.byte(kItemframe));
}
@ -918,28 +961,56 @@ void DreamGenContext::swapWithInv() {
if (data.word(kMousebutton) == data.word(kOldbutton) || !(data.word(kMousebutton) & 1))
return;
if (isItWorn(getEitherAdCPP())) {
wornError();
return;
}
delPointer();
if (data.byte(kItemframe) == data.byte(kOpenedob) &&
data.byte(kObjecttype) == data.byte(kOpenedtype)) {
errorMessage1();
return;
}
if (!checkObjectSizeCPP())
return;
byte prevType = data.byte(kObjecttype);
byte prevFrame = data.byte(kItemframe);
uint16 objectId = getSegment(data.word(kBuffers)).word(findInvPosCPP());
data.byte(kItemframe) = objectId & 0x00FF;
data.byte(kObjecttype) = objectId >> 8;
findOpenPos();
ax = es.word(bx);
data.byte(kItemframe) = al;
data.byte(kObjecttype) = ah;
if (data.byte(kObjecttype) != 4) {
transferToEx();
data.byte(kItemframe) = al;
data.byte(kObjecttype) = 4;
}
DynObject *object = getEitherAdCPP();
object->mapad[0] = 20;
object->mapad[1] = 255;
byte prevType2 = data.byte(kObjecttype);
byte prevFrame2 = data.byte(kItemframe);
data.byte(kObjecttype) = prevType;
data.byte(kItemframe) = prevFrame;
//findInvPosCPP(); // found in the original source, but it seems to be useless
delPointer();
findOpenPos();
object = getEitherAdCPP();
object->mapad[0] = 4;
object->mapad[1] = 255;
object->mapad[0] = data.byte(kOpenedtype);
object->mapad[1] = data.byte(kOpenedob);
object->mapad[2] = data.byte(kLastinvpos);
object->mapad[3] = data.byte(kReallocation);
data.byte(kObjecttype) = prevType2;
data.byte(kItemframe) = prevFrame2;
fillOpen();
fillRyan();
underTextLine();
readMouse();
useOpened();
showPointer();
workToScreenCPP();
delPointer();

@ -196,6 +196,7 @@
void reExFromInv();
void locationPic();
void useOpened();
void swapWithOpen();
void swapWithInv();
#endif