DREAMWEB: Port 'swapwithinv' to C++

This commit is contained in:
Filippos Karapetis 2011-12-25 17:32:56 +02:00
parent 0fff97b4b0
commit c531c4c1ea
5 changed files with 45 additions and 61 deletions

View file

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

View file

@ -284,66 +284,6 @@ findopen2a:
goto findopen1a; goto findopen1a;
} }
void DreamGenContext::swapWithInv() {
STACK_CHECK;
al = data.byte(kItemframe);
ah = data.byte(kObjecttype);
_cmp(ax, data.word(kOldsubject));
if (!flags.z())
goto difsub7;
_cmp(data.byte(kCommandtype), 243);
if (flags.z())
goto alreadyswap1;
data.byte(kCommandtype) = 243;
difsub7:
data.word(kOldsubject) = ax;
bx = ax;
al = 34;
commandWithOb();
alreadyswap1:
ax = data.word(kMousebutton);
_cmp(ax, data.word(kOldbutton));
if (flags.z())
return /* (cantswap1) */;
_and(ax, 1);
if (!flags.z())
goto doswap1;
return;
doswap1:
ah = data.byte(kObjecttype);
al = data.byte(kItemframe);
push(ax);
findInvPos();
ax = es.word(bx);
data.byte(kItemframe) = al;
data.byte(kObjecttype) = ah;
getEitherAd();
es.byte(bx+2) = 20;
es.byte(bx+3) = 255;
bl = data.byte(kItemframe);
bh = data.byte(kObjecttype);
ax = pop();
data.byte(kObjecttype) = ah;
data.byte(kItemframe) = al;
push(bx);
findInvPos();
delPointer();
al = data.byte(kItemframe);
getEitherAd();
es.byte(bx+2) = 4;
es.byte(bx+3) = 255;
al = data.byte(kLastinvpos);
es.byte(bx+4) = al;
ax = pop();
data.byte(kObjecttype) = ah;
data.byte(kItemframe) = al;
fillRyan();
readMouse();
showPointer();
workToScreen();
delPointer();
}
void DreamGenContext::swapWithOpen() { void DreamGenContext::swapWithOpen() {
STACK_CHECK; STACK_CHECK;
al = data.byte(kItemframe); al = data.byte(kItemframe);

View file

@ -477,7 +477,6 @@ public:
void searchForString(); void searchForString();
void searchForFiles(); void searchForFiles();
void getExAd(); void getExAd();
void swapWithInv();
void transferToEx(); void transferToEx();
void parser(); void parser();
void emergencyPurge(); void emergencyPurge();

View file

@ -902,4 +902,47 @@ void DreamGenContext::useOpened() {
delPointer(); delPointer();
} }
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();
}
} // End of namespace DreamGen } // End of namespace DreamGen

View file

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