aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/dreamweb/dreambase.h15
-rw-r--r--engines/dreamweb/object.cpp82
-rw-r--r--engines/dreamweb/stubs.cpp25
-rw-r--r--engines/dreamweb/stubs.h15
4 files changed, 65 insertions, 72 deletions
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index ef08738cf6..3fe00ad847 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -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);
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index 0f0599b7f6..4fa21e7618 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -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;
}
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 9351a01bb5..55e61101e1 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -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;
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
index 0c62abdc1b..feedef9aae 100644
--- a/engines/dreamweb/stubs.h
+++ b/engines/dreamweb/stubs.h
@@ -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