DREAMWEB: Reduce dependency on globals and move functions to DreamBase

This commit is contained in:
Willem Jan Palenstijn 2011-12-26 19:48:47 +01:00
parent 6f85de6b6e
commit cb3eee8635
4 changed files with 65 additions and 72 deletions

View File

@ -222,6 +222,16 @@ public:
void reExFromInv();
void swapWithInv();
void transferText(uint8 from, uint8 to);
void pickupConts(uint8 from, uint8 containerEx);
byte transferToEx(uint8 from);
void swapWithOpen();
void outOfOpen();
void inToInv();
void outOfInv();
bool checkObjectSize();
void useOpened();
void setPickup();
void selectOpenOb();
// from pathfind.cpp
void turnPathOn(uint8 param);
@ -576,6 +586,10 @@ public:
void showSymbol();
void updateSymbolTop();
void updateSymbolBot();
void pickupOb(uint8 command, uint8 pos);
void errorMessage1();
void errorMessage2();
void errorMessage3();
// from talk.cpp
void talk();
@ -600,6 +614,7 @@ public:
void loadIntroRoom();
void set16ColPalette();
void realCredits();
uint8 getExPos();
// from use.cpp
void placeFreeObject(uint8 index);

View File

@ -163,8 +163,8 @@ void DreamGenContext::examineOb(bool examineAgain) {
RectWithCallback<DreamGenContext> examList[] = {
{ 273,320,157,198,&DreamBase::getBackFromOb },
{ 260,300,0,44,&DreamGenContext::useObject },
{ 210,254,0,44,&DreamGenContext::selectOpenOb },
{ 144,176,64,96,&DreamGenContext::setPickup },
{ 210,254,0,44,&DreamBase::selectOpenOb },
{ 144,176,64,96,&DreamBase::setPickup },
{ 0,50,50,200,&DreamBase::examineInventory },
{ 0,320,0,200,&DreamBase::blank },
{ 0xFFFF,0,0,0,0 }
@ -174,12 +174,12 @@ void DreamGenContext::examineOb(bool examineAgain) {
}
case 1: {
// Note: This table contains the non-constant _openChangeSize!
RectWithCallback<DreamGenContext> invList1[] = {
RectWithCallback<DreamBase> invList1[] = {
{ 273,320,157,198,&DreamBase::getBackFromOb },
{ 255,294,0,24,&DreamGenContext::dropObject },
{ kInventx+167,kInventx+167+(18*3),kInventy-18,kInventy-2,&DreamGenContext::incRyanPage },
{ kInventx,_openChangeSize,kInventy+100,kInventy+100+kItempicsize,&DreamGenContext::useOpened },
{ kInventx,kInventx+(5*kItempicsize),kInventy,kInventy+(2*kItempicsize),&DreamGenContext::inToInv },
{ 255,294,0,24,&DreamBase::dropObject },
{ kInventx+167,kInventx+167+(18*3),kInventy-18,kInventy-2,&DreamBase::incRyanPage },
{ kInventx,_openChangeSize,kInventy+100,kInventy+100+kItempicsize,&DreamBase::useOpened },
{ kInventx,kInventx+(5*kItempicsize),kInventy,kInventy+(2*kItempicsize),&DreamBase::inToInv },
{ 0,320,0,200,&DreamBase::blank },
{ 0xFFFF,0,0,0,0 }
};
@ -189,7 +189,7 @@ void DreamGenContext::examineOb(bool examineAgain) {
default: {
RectWithCallback<DreamGenContext> withList1[] = {
{ 273,320,157,198,&DreamBase::getBackFromOb },
{ kInventx+167,kInventx+167+(18*3),kInventy-18,kInventy-2,&DreamGenContext::incRyanPage },
{ kInventx+167,kInventx+167+(18*3),kInventy-18,kInventy-2,&DreamBase::incRyanPage },
{ kInventx,kInventx+(5*kItempicsize), kInventy,kInventy+(2*kItempicsize),&DreamGenContext::selectOb },
{ 0,320,0,200,&DreamBase::blank },
{ 0xFFFF,0,0,0,0 }
@ -383,7 +383,7 @@ void DreamGenContext::selectOb() {
useRoutine();
}
void DreamGenContext::setPickup() {
void DreamBase::setPickup() {
if (data.byte(kObjecttype) != kSetObjectType1 && data.byte(kObjecttype) != kSetObjectType3) {
// Object types 1 and 3 are excluded, so the resulting object is a DynObject
uint8 dummy;
@ -414,9 +414,9 @@ void DreamGenContext::setPickup() {
data.byte(kInvopen) = 2;
if (data.byte(kObjecttype) != kExObjectType) {
data.byte(kItemframe) = data.byte(kCommand);
assert(data.byte(kObjecttype) == kFreeObjectType);
data.byte(kOpenedob) = 255;
data.byte(kItemframe) = transferToEx();
data.byte(kItemframe) = transferToEx(data.byte(kCommand));
data.byte(kObjecttype) = kExObjectType;
DynObject *object = getExAd(data.byte(kItemframe));
object->mapad[0] = 20;
@ -502,7 +502,7 @@ void DreamBase::removeObFromInv() {
deleteExObject(data.byte(kCommand));
}
void DreamGenContext::inToInv() {
void DreamBase::inToInv() {
if (!data.byte(kPickup)) {
outOfInv();
return;
@ -542,7 +542,7 @@ void DreamGenContext::inToInv() {
delPointer();
}
void DreamGenContext::outOfInv() {
void DreamBase::outOfInv() {
ObjectRef subject = findInvPos();
if (subject._index == 255) {
@ -713,7 +713,7 @@ void DreamBase::dropObject() {
object->currentLocation = data.byte(kReallocation);
}
bool DreamGenContext::checkObjectSize() {
bool DreamBase::checkObjectSize() {
byte containerSize = getOpenedSlotSize();
DynObject *object = getEitherAdCPP();
// If there is no size defined for the object in the editor, set its size
@ -742,7 +742,7 @@ bool DreamGenContext::checkObjectSize() {
return false;
}
void DreamGenContext::selectOpenOb() {
void DreamBase::selectOpenOb() {
uint8 slotSize, slotCount;
getAnyAd(&slotSize, &slotCount);
if (slotCount == 255) {
@ -823,7 +823,7 @@ void DreamBase::swapWithInv() {
delPointer();
}
void DreamGenContext::useOpened() {
void DreamBase::useOpened() {
if (data.byte(kOpenedob) == 255)
return; // cannot use opened object
@ -887,7 +887,7 @@ void DreamGenContext::useOpened() {
delPointer();
}
void DreamGenContext::outOfOpen() {
void DreamBase::outOfOpen() {
if (data.byte(kOpenedob) == 255)
return; // cannot use opened object
@ -921,7 +921,8 @@ void DreamGenContext::outOfOpen() {
data.byte(kItemframe) = objectId._index;
if (data.byte(kObjecttype) != kExObjectType) {
data.byte(kItemframe) = transferToEx();
assert(objectId._type == kFreeObjectType);
data.byte(kItemframe) = transferToEx(objectId._index);
data.byte(kObjecttype) = kExObjectType;
}
@ -938,7 +939,7 @@ void DreamGenContext::outOfOpen() {
delPointer();
}
void DreamGenContext::swapWithOpen() {
void DreamBase::swapWithOpen() {
ObjectRef subject;
subject._type = data.byte(kObjecttype);
subject._index = data.byte(kItemframe);
@ -975,7 +976,8 @@ void DreamGenContext::swapWithOpen() {
data.byte(kItemframe) = objectId._index;
if (data.byte(kObjecttype) != kExObjectType) {
data.byte(kItemframe) = transferToEx();
assert(objectId._type == kFreeObjectType);
data.byte(kItemframe) = transferToEx(objectId._index);
data.byte(kObjecttype) = kExObjectType;
}
@ -1011,30 +1013,30 @@ ObjectRef DreamBase::findOpenPos() {
return _openInvList[pos];
}
byte DreamGenContext::transferToEx() {
byte DreamBase::transferToEx(uint8 from) {
emergencyPurge();
DynObject *exObject = getExPos(); // Also sets es:di
byte pos = data.byte(kExpos);
byte pos = getExPos();
DynObject *exObject = getExAd(pos);
DynObject *freeObject = getFreeAd(data.byte(kItemframe));
DynObject *freeObject = getFreeAd(from);
memcpy(exObject, freeObject, sizeof(DynObject));
exObject->currentLocation = data.byte(kReallocation);
exObject->initialLocation = data.byte(kReallocation);
exObject->index = data.byte(kItemframe);
exObject->index = from;
exObject->mapad[0] = 4;
exObject->mapad[1] = 255;
exObject->mapad[2] = data.byte(kLastinvpos);
transferFrame(data.byte(kItemframe), pos, 0);
transferFrame(data.byte(kItemframe), pos, 1);
transferText(data.byte(kItemframe), pos);
transferFrame(from, pos, 0);
transferFrame(from, pos, 1);
transferText(from, pos);
freeObject->mapad[0] = 254;
pickupConts();
pickupConts(from, pos);
return pos;
}
@ -1082,35 +1084,33 @@ void DreamBase::findAllOpen() {
}
}
void DreamGenContext::pickupConts() {
assert(data.byte(kObjecttype) == kFreeObjectType);
const DynObject *obj = getFreeAd(data.byte(kItemframe));
void DreamBase::pickupConts(uint8 from, uint8 containerEx) {
const DynObject *obj = getFreeAd(from);
if (obj->slotCount == 255)
return; // not openable
uint8 expos = data.byte(kExpos);
for (uint8 index = 0; index < 80; ++index) {
DynObject *freeObj = getFreeAd(index);
if (freeObj->mapad[0] != data.byte(kObjecttype))
if (freeObj->mapad[0] != kFreeObjectType)
continue;
if (freeObj->mapad[1] != data.byte(kItemframe))
if (freeObj->mapad[1] != from)
continue;
DynObject *exObj = getExPos(); // Also sets es:di to exObj
uint8 pos = getExPos();
DynObject *exObj = getExAd(pos);
memcpy(exObj, freeObj, sizeof(DynObject));
exObj->currentLocation = data.byte(kReallocation);
exObj->initialLocation = data.byte(kReallocation);
exObj->index = index;
exObj->mapad[0] = 4; // kExObjectType?
exObj->mapad[1] = expos;
exObj->mapad[1] = containerEx;
transferFrame(index, data.byte(kExpos), 0);
transferFrame(index, data.byte(kExpos), 1);
transferText(index, data.byte(kExpos));
transferFrame(index, pos, 0);
transferFrame(index, pos, 1);
transferText(index, pos);
freeObj->mapad[0] = 0xFF;
}

View File

@ -1364,19 +1364,13 @@ void DreamBase::deleteTaken() {
}
}
DynObject *DreamGenContext::getExPos() {
es = data.word(kExtras);
uint8 DreamBase::getExPos() {
DynObject *objects = (DynObject *)getSegment(data.word(kExtras)).ptr(kExdata, sizeof(DynObject));
for (size_t i = 0; i < kNumexobjects; ++i) {
if (objects[i].mapad[0] == 0xff) {
data.byte(kExpos) = i;
di = kExdata + i * sizeof(DynObject);
return &objects[i];
}
if (objects[i].mapad[0] == 0xff)
return i;
}
data.byte(kExpos) = kNumexobjects;
di = kExdata + kNumexobjects * sizeof(DynObject);
return 0;
error("Out of Ex object positions");
}
void DreamBase::placeSetObject(uint8 index) {
@ -2717,14 +2711,14 @@ void DreamBase::newGame() {
data.byte(kGetback) = 3;
}
void DreamGenContext::pickupOb(uint8 command, uint8 pos) {
void DreamBase::pickupOb(uint8 command, uint8 pos) {
data.byte(kLastinvpos) = pos;
data.byte(kObjecttype) = kFreeObjectType;
data.byte(kItemframe) = command;
data.byte(kCommand) = command;
//uint8 dummy;
//getAnyAd(&dummy, &dummy); // was in the original source, seems useless here
transferToEx();
transferToEx(command);
}
void DreamGenContext::initialInv() {
@ -2870,7 +2864,7 @@ void DreamBase::delEverything() {
}
}
void DreamGenContext::errorMessage1() {
void DreamBase::errorMessage1() {
delPointer();
printMessage(76, 21, 58, 240, (240 & 1));
readMouse();
@ -2888,7 +2882,7 @@ void DreamGenContext::errorMessage1() {
delPointer();
}
void DreamGenContext::errorMessage2() {
void DreamBase::errorMessage2() {
data.byte(kCommandtype) = 255;
delPointer();
printMessage(76, 21, 59, 240, (240 & 1));
@ -2907,7 +2901,7 @@ void DreamGenContext::errorMessage2() {
delPointer();
}
void DreamGenContext::errorMessage3() {
void DreamBase::errorMessage3() {
delPointer();
printMessage(76, 21, 60, 240, (240 & 1));
workToScreenM();
@ -3606,7 +3600,6 @@ void DreamBase::clearChanges() {
memcpy(data.ptr(kStartvars, kLengthofvars), _initialVars, kLengthofvars);
data.byte(kExpos) = 0;
data.word(kExframepos) = 0;
data.word(kExtextpos) = 0;

View File

@ -66,7 +66,6 @@
void walkAndExamine();
void obName(uint8 command, uint8 commandType);
DynObject *getExPos();
bool checkIfSet(uint8 x, uint8 y);
void obToInv();
void obToInv(uint8 index, uint8 flag, uint16 x, uint16 y) {
@ -103,13 +102,9 @@
void inventory();
void mainScreen();
void zoomOnOff();
void pickupOb(uint8 command, uint8 pos);
void initialInv();
void walkIntoRoom();
void allPointer();
void errorMessage1();
void errorMessage2();
void errorMessage3();
void afterNewRoom();
void madmanRun();
void decide();
@ -117,21 +112,11 @@
void triggerMessage(uint16 index);
void processTrigger();
bool execCommand();
bool checkObjectSize();
void identifyOb();
void selectOb();
void setPickup();
void getKeyAndLogo();
void signOn();
void inToInv();
void outOfInv();
void selectOpenOb();
void useOpened();
void outOfOpen();
void swapWithOpen();
void searchForFiles(uint16 segment);
byte transferToEx();
void dirCom();
void pickupConts();
#endif