From cb3eee86358e73251081d0d285ac2303db5aa775 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Mon, 26 Dec 2011 19:48:47 +0100 Subject: DREAMWEB: Reduce dependency on globals and move functions to DreamBase --- engines/dreamweb/dreambase.h | 15 ++++++++ engines/dreamweb/object.cpp | 82 ++++++++++++++++++++++---------------------- engines/dreamweb/stubs.cpp | 25 +++++--------- engines/dreamweb/stubs.h | 15 -------- 4 files changed, 65 insertions(+), 72 deletions(-) (limited to 'engines') 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 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 invList1[] = { + RectWithCallback 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 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 -- cgit v1.2.3