DREAMWEB: Port 'setpickup' to C++ and added an enum for the object types
This commit is contained in:
parent
f69dfba21a
commit
421c8cd262
9 changed files with 75 additions and 81 deletions
|
@ -733,6 +733,7 @@ generator = cpp(context, "DreamGen", blacklist = [
|
||||||
'setlocation',
|
'setlocation',
|
||||||
'setmode',
|
'setmode',
|
||||||
'setmouse',
|
'setmouse',
|
||||||
|
'setpickup',
|
||||||
'setsoundoff',
|
'setsoundoff',
|
||||||
'settopleft',
|
'settopleft',
|
||||||
'settopright',
|
'settopright',
|
||||||
|
|
|
@ -519,71 +519,6 @@ foundmatch:
|
||||||
bx = pop();
|
bx = pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DreamGenContext::setPickup() {
|
|
||||||
STACK_CHECK;
|
|
||||||
_cmp(data.byte(kObjecttype), 1);
|
|
||||||
if (flags.z())
|
|
||||||
goto cantpick;
|
|
||||||
_cmp(data.byte(kObjecttype), 3);
|
|
||||||
if (flags.z())
|
|
||||||
goto cantpick;
|
|
||||||
getAnyAd();
|
|
||||||
al = es.byte(bx+2);
|
|
||||||
_cmp(al, 4);
|
|
||||||
if (!flags.z())
|
|
||||||
goto canpick;
|
|
||||||
cantpick:
|
|
||||||
blank();
|
|
||||||
return;
|
|
||||||
canpick:
|
|
||||||
_cmp(data.byte(kCommandtype), 209);
|
|
||||||
if (flags.z())
|
|
||||||
goto alreadysp;
|
|
||||||
data.byte(kCommandtype) = 209;
|
|
||||||
bl = data.byte(kCommand);
|
|
||||||
bh = data.byte(kObjecttype);
|
|
||||||
al = 33;
|
|
||||||
commandWithOb();
|
|
||||||
alreadysp:
|
|
||||||
ax = data.word(kMousebutton);
|
|
||||||
_cmp(ax, 1);
|
|
||||||
if (!flags.z())
|
|
||||||
return /* (nosetpick) */;
|
|
||||||
_cmp(ax, data.word(kOldbutton));
|
|
||||||
if (!flags.z())
|
|
||||||
goto dosetpick;
|
|
||||||
return;
|
|
||||||
dosetpick:
|
|
||||||
createPanel();
|
|
||||||
showPanel();
|
|
||||||
showMan();
|
|
||||||
showExit();
|
|
||||||
examIcon();
|
|
||||||
data.byte(kPickup) = 1;
|
|
||||||
data.byte(kInvopen) = 2;
|
|
||||||
_cmp(data.byte(kObjecttype), 4);
|
|
||||||
if (flags.z())
|
|
||||||
goto pickupexob;
|
|
||||||
al = data.byte(kCommand);
|
|
||||||
data.byte(kItemframe) = al;
|
|
||||||
data.byte(kOpenedob) = 255;
|
|
||||||
transferToEx();
|
|
||||||
data.byte(kItemframe) = al;
|
|
||||||
data.byte(kObjecttype) = 4;
|
|
||||||
getEitherAd();
|
|
||||||
es.byte(bx+2) = 20;
|
|
||||||
es.byte(bx+3) = 255;
|
|
||||||
openInv();
|
|
||||||
workToScreenM();
|
|
||||||
return;
|
|
||||||
pickupexob:
|
|
||||||
al = data.byte(kCommand);
|
|
||||||
data.byte(kItemframe) = al;
|
|
||||||
data.byte(kOpenedob) = 255;
|
|
||||||
openInv();
|
|
||||||
workToScreenM();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DreamGenContext::reExFromInv() {
|
void DreamGenContext::reExFromInv() {
|
||||||
STACK_CHECK;
|
STACK_CHECK;
|
||||||
findInvPos();
|
findInvPos();
|
||||||
|
|
|
@ -506,7 +506,6 @@ public:
|
||||||
void fillOpen();
|
void fillOpen();
|
||||||
void deleteExObject();
|
void deleteExObject();
|
||||||
void getEitherAd();
|
void getEitherAd();
|
||||||
void setPickup();
|
|
||||||
void dropObject();
|
void dropObject();
|
||||||
void showDiaryKeys();
|
void showDiaryKeys();
|
||||||
void useOpened();
|
void useOpened();
|
||||||
|
|
|
@ -108,10 +108,10 @@ void DreamBase::obToInv(uint8 index, uint8 flag, uint16 x, uint16 y) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DreamBase::obPicture() {
|
void DreamBase::obPicture() {
|
||||||
if (data.byte(kObjecttype) == 1)
|
if (data.byte(kObjecttype) == kSetObjectType1)
|
||||||
return;
|
return;
|
||||||
Frame *frames;
|
Frame *frames;
|
||||||
if (data.byte(kObjecttype) == 4)
|
if (data.byte(kObjecttype) == kExObjectType)
|
||||||
frames = (Frame *)getSegment(data.word(kExtras)).ptr(0, 0);
|
frames = (Frame *)getSegment(data.word(kExtras)).ptr(0, 0);
|
||||||
else
|
else
|
||||||
frames = (Frame *)getSegment(data.word(kFreeframes)).ptr(0, 0);
|
frames = (Frame *)getSegment(data.word(kFreeframes)).ptr(0, 0);
|
||||||
|
@ -133,6 +133,7 @@ void DreamBase::obIcons() {
|
||||||
void DreamGenContext::examineOb(bool examineAgain) {
|
void DreamGenContext::examineOb(bool examineAgain) {
|
||||||
data.byte(kPointermode) = 0;
|
data.byte(kPointermode) = 0;
|
||||||
data.word(kTimecount) = 0;
|
data.word(kTimecount) = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (examineAgain) {
|
if (examineAgain) {
|
||||||
data.byte(kInmaparea) = 0;
|
data.byte(kInmaparea) = 0;
|
||||||
|
@ -140,8 +141,7 @@ void DreamGenContext::examineOb(bool examineAgain) {
|
||||||
data.byte(kOpenedob) = 255;
|
data.byte(kOpenedob) = 255;
|
||||||
data.byte(kOpenedtype) = 255;
|
data.byte(kOpenedtype) = 255;
|
||||||
data.byte(kInvopen) = 0;
|
data.byte(kInvopen) = 0;
|
||||||
al = data.byte(kCommandtype);
|
data.byte(kObjecttype) = data.byte(kCommandtype);
|
||||||
data.byte(kObjecttype) = al;
|
|
||||||
data.byte(kItemframe) = 0;
|
data.byte(kItemframe) = 0;
|
||||||
data.byte(kPointerframe) = 0;
|
data.byte(kPointerframe) = 0;
|
||||||
createPanel();
|
createPanel();
|
||||||
|
@ -167,6 +167,7 @@ void DreamGenContext::examineOb(bool examineAgain) {
|
||||||
dumpTextLine();
|
dumpTextLine();
|
||||||
delPointer();
|
delPointer();
|
||||||
data.byte(kGetback) = 0;
|
data.byte(kGetback) = 0;
|
||||||
|
|
||||||
switch (data.byte(kInvopen)) {
|
switch (data.byte(kInvopen)) {
|
||||||
case 0: {
|
case 0: {
|
||||||
RectWithCallback examList[] = {
|
RectWithCallback examList[] = {
|
||||||
|
@ -207,6 +208,7 @@ void DreamGenContext::examineOb(bool examineAgain) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.byte(kQuitrequested) != 0)
|
if (data.byte(kQuitrequested) != 0)
|
||||||
break;
|
break;
|
||||||
if (data.byte(kExamagain) != 0)
|
if (data.byte(kExamagain) != 0)
|
||||||
|
@ -426,4 +428,53 @@ void DreamGenContext::selectOb() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DreamGenContext::setPickup() {
|
||||||
|
if (data.byte(kObjecttype) != kSetObjectType1 && data.byte(kObjecttype) != kSetObjectType3) {
|
||||||
|
// The original called getAnyAd() here. However, since object types
|
||||||
|
// 1 and 3 are excluded, the resulting object is a DynObject, so
|
||||||
|
// we can use getEitherAd() instead.
|
||||||
|
DynObject *object = getEitherAdCPP();
|
||||||
|
if (object->mapad[0] == 4) {
|
||||||
|
blank();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
blank();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.byte(kCommandtype) != 209) {
|
||||||
|
data.byte(kCommandtype) = 209;
|
||||||
|
commandWithOb(33, data.byte(kObjecttype), data.byte(kCommand));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.word(kMousebutton) == 1 && data.word(kMousebutton) == data.word(kOldbutton))
|
||||||
|
return;
|
||||||
|
|
||||||
|
createPanel();
|
||||||
|
showPanel();
|
||||||
|
showMan();
|
||||||
|
showExit();
|
||||||
|
examIcon();
|
||||||
|
data.byte(kPickup) = 1;
|
||||||
|
data.byte(kInvopen) = 2;
|
||||||
|
|
||||||
|
if (data.byte(kObjecttype) != kExObjectType) {
|
||||||
|
data.byte(kItemframe) = data.byte(kCommand);
|
||||||
|
data.byte(kOpenedob) = 255;
|
||||||
|
transferToEx();
|
||||||
|
data.byte(kItemframe) = data.byte(kCommand);
|
||||||
|
data.byte(kObjecttype) = kExObjectType;
|
||||||
|
DynObject *object = getEitherAdCPP();
|
||||||
|
object->mapad[0] = 20;
|
||||||
|
object->mapad[1] = 255;
|
||||||
|
} else {
|
||||||
|
data.byte(kItemframe) = data.byte(kCommand);
|
||||||
|
data.byte(kOpenedob) = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
openInv();
|
||||||
|
workToScreenM();
|
||||||
|
}
|
||||||
|
|
||||||
} // End of namespace DreamGen
|
} // End of namespace DreamGen
|
||||||
|
|
|
@ -941,10 +941,10 @@ void DreamGenContext::mugger(ReelRoutine &routine) {
|
||||||
findXYFromPath();
|
findXYFromPath();
|
||||||
data.byte(kResetmanxy) = 1;
|
data.byte(kResetmanxy) = 1;
|
||||||
data.byte(kCommand) = findExObject("WETA");
|
data.byte(kCommand) = findExObject("WETA");
|
||||||
data.byte(kObjecttype) = 4;
|
data.byte(kObjecttype) = kExObjectType;
|
||||||
removeObFromInv();
|
removeObFromInv();
|
||||||
data.byte(kCommand) = findExObject("WETB");
|
data.byte(kCommand) = findExObject("WETB");
|
||||||
data.byte(kObjecttype) = 4;
|
data.byte(kObjecttype) = kExObjectType;
|
||||||
removeObFromInv();
|
removeObFromInv();
|
||||||
makeMainScreen();
|
makeMainScreen();
|
||||||
DreamBase::setupTimedUse(48, 70, 10, 68 - 32, 54 + 64);
|
DreamBase::setupTimedUse(48, 70, 10, 68 - 32, 54 + 64);
|
||||||
|
|
|
@ -296,6 +296,13 @@ struct Atmosphere {
|
||||||
uint8 _repeat;
|
uint8 _repeat;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ObjectTypes {
|
||||||
|
kSetObjectType1 = 1,
|
||||||
|
kFreeObjectType = 2,
|
||||||
|
kSetObjectType3 = 3,
|
||||||
|
kExObjectType = 4
|
||||||
|
};
|
||||||
|
|
||||||
} // End of namespace DreamWeb
|
} // End of namespace DreamWeb
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1354,24 +1354,24 @@ DynObject *DreamBase::getExAd(uint8 index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
DynObject *DreamBase::getEitherAdCPP() {
|
DynObject *DreamBase::getEitherAdCPP() {
|
||||||
if (data.byte(kObjecttype) == 4)
|
if (data.byte(kObjecttype) == kExObjectType)
|
||||||
return getExAd(data.byte(kItemframe));
|
return getExAd(data.byte(kItemframe));
|
||||||
else
|
else
|
||||||
return getFreeAd(data.byte(kItemframe));
|
return getFreeAd(data.byte(kItemframe));
|
||||||
}
|
}
|
||||||
|
|
||||||
void *DreamBase::getAnyAd(uint8 *value1, uint8 *value2) {
|
void *DreamBase::getAnyAd(uint8 *value1, uint8 *value2) {
|
||||||
if (data.byte(kObjecttype) == 4) {
|
if (data.byte(kObjecttype) == kExObjectType) {
|
||||||
DynObject *exObject = getExAd(data.byte(kCommand));
|
DynObject *exObject = getExAd(data.byte(kCommand));
|
||||||
*value1 = exObject->slotSize;
|
*value1 = exObject->slotSize;
|
||||||
*value2 = exObject->slotCount;
|
*value2 = exObject->slotCount;
|
||||||
return exObject;
|
return exObject;
|
||||||
} else if (data.byte(kObjecttype) == 2) {
|
} else if (data.byte(kObjecttype) == kFreeObjectType) {
|
||||||
DynObject *freeObject = getFreeAd(data.byte(kCommand));
|
DynObject *freeObject = getFreeAd(data.byte(kCommand));
|
||||||
*value1 = freeObject->slotSize;
|
*value1 = freeObject->slotSize;
|
||||||
*value2 = freeObject->slotCount;
|
*value2 = freeObject->slotCount;
|
||||||
return freeObject;
|
return freeObject;
|
||||||
} else {
|
} else { // 1 or 3. 0 should never happen
|
||||||
SetObject *setObject = getSetAd(data.byte(kCommand));
|
SetObject *setObject = getSetAd(data.byte(kCommand));
|
||||||
// Note: the original returned slotCount/priority (bytes 4 and 5)
|
// Note: the original returned slotCount/priority (bytes 4 and 5)
|
||||||
// instead of slotSize/slotCount (bytes 3 and 4).
|
// instead of slotSize/slotCount (bytes 3 and 4).
|
||||||
|
@ -1615,7 +1615,7 @@ void DreamBase::showPointer() {
|
||||||
data.word(kOldpointery) = data.word(kMousey);
|
data.word(kOldpointery) = data.word(kMousey);
|
||||||
if (data.byte(kPickup) == 1) {
|
if (data.byte(kPickup) == 1) {
|
||||||
const Frame *frames;
|
const Frame *frames;
|
||||||
if (data.byte(kObjecttype) != 4)
|
if (data.byte(kObjecttype) != kExObjectType)
|
||||||
frames = (const Frame *)getSegment(data.word(kFreeframes)).ptr(0, 0);
|
frames = (const Frame *)getSegment(data.word(kFreeframes)).ptr(0, 0);
|
||||||
else
|
else
|
||||||
frames = (const Frame *)getSegment(data.word(kExtras)).ptr(0, 0);
|
frames = (const Frame *)getSegment(data.word(kExtras)).ptr(0, 0);
|
||||||
|
@ -3209,7 +3209,7 @@ void DreamBase::getBackToOps() {
|
||||||
|
|
||||||
void DreamGenContext::pickupOb(uint8 command, uint8 pos) {
|
void DreamGenContext::pickupOb(uint8 command, uint8 pos) {
|
||||||
data.byte(kLastinvpos) = pos;
|
data.byte(kLastinvpos) = pos;
|
||||||
data.byte(kObjecttype) = 2;
|
data.byte(kObjecttype) = kFreeObjectType;
|
||||||
data.byte(kItemframe) = command;
|
data.byte(kItemframe) = command;
|
||||||
data.byte(kCommand) = command;
|
data.byte(kCommand) = command;
|
||||||
getAnyAd();
|
getAnyAd();
|
||||||
|
@ -3353,13 +3353,13 @@ void DreamGenContext::obsThatDoThings() {
|
||||||
void DreamGenContext::describeOb() {
|
void DreamGenContext::describeOb() {
|
||||||
const uint8 *obText = getObTextStartCPP();
|
const uint8 *obText = getObTextStartCPP();
|
||||||
uint16 y = 92;
|
uint16 y = 92;
|
||||||
if (data.byte(kForeignrelease) && data.byte(kObjecttype) == 1)
|
if (data.byte(kForeignrelease) && data.byte(kObjecttype) == kSetObjectType1)
|
||||||
y = 82;
|
y = 82;
|
||||||
data.word(kCharshift) = 91 + 91;
|
data.word(kCharshift) = 91 + 91;
|
||||||
printDirect(&obText, 33, &y, 241, 241 & 1);
|
printDirect(&obText, 33, &y, 241, 241 & 1);
|
||||||
data.word(kCharshift) = 0;
|
data.word(kCharshift) = 0;
|
||||||
y = 104;
|
y = 104;
|
||||||
if (data.byte(kForeignrelease) && data.byte(kObjecttype) == 1)
|
if (data.byte(kForeignrelease) && data.byte(kObjecttype) == kSetObjectType1)
|
||||||
y = 94;
|
y = 94;
|
||||||
printDirect(&obText, 36, &y, 241, 241 & 1);
|
printDirect(&obText, 36, &y, 241, 241 & 1);
|
||||||
obsThatDoThings();
|
obsThatDoThings();
|
||||||
|
|
|
@ -403,5 +403,6 @@
|
||||||
void selectOb();
|
void selectOb();
|
||||||
void findInvPos();
|
void findInvPos();
|
||||||
uint16 findInvPosCPP();
|
uint16 findInvPosCPP();
|
||||||
|
void setPickup();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -760,7 +760,7 @@ void DreamGenContext::useChurchGate() {
|
||||||
|
|
||||||
void DreamGenContext::useGun() {
|
void DreamGenContext::useGun() {
|
||||||
|
|
||||||
if (data.byte(kObjecttype) != 4) {
|
if (data.byte(kObjecttype) != kExObjectType) {
|
||||||
// gun is not taken
|
// gun is not taken
|
||||||
showSecondUse();
|
showSecondUse();
|
||||||
putBackObStuff();
|
putBackObStuff();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue