DREAMWEB: Convert findAllOpen, fillOpen
This commit is contained in:
parent
4a30fa8845
commit
1fef9d1f75
6 changed files with 61 additions and 127 deletions
|
@ -468,9 +468,11 @@ generator = cpp(context, "DreamGen", blacklist = [
|
|||
'fadeupmonfirst',
|
||||
'fadeupyellows',
|
||||
'femalefan',
|
||||
'fillopen',
|
||||
'fillryan',
|
||||
'fillspace',
|
||||
'finalframe',
|
||||
'findallopen',
|
||||
'findallryan',
|
||||
'findexobject',
|
||||
'findfirstpath',
|
||||
|
|
|
@ -212,6 +212,11 @@ public:
|
|||
void makeWorn(DynObject *object);
|
||||
void dropObject();
|
||||
uint16 findOpenPos();
|
||||
byte getOpenedSlotSize();
|
||||
byte getOpenedSlotCount();
|
||||
void openOb();
|
||||
void findAllOpen();
|
||||
void fillOpen();
|
||||
|
||||
// from pathfind.cpp
|
||||
void turnPathOn(uint8 param);
|
||||
|
|
|
@ -73,123 +73,6 @@ void DreamGenContext::transferMap() {
|
|||
_add(data.word(kExframepos), cx);
|
||||
}
|
||||
|
||||
void DreamGenContext::fillOpen() {
|
||||
STACK_CHECK;
|
||||
delTextLine();
|
||||
getOpenedSize();
|
||||
_cmp(ah, 4);
|
||||
if (flags.c())
|
||||
goto lessthanapage;
|
||||
ah = 4;
|
||||
lessthanapage:
|
||||
al = 1;
|
||||
push(ax);
|
||||
es = data.word(kBuffers);
|
||||
di = (0+(228*13));
|
||||
findAllOpen();
|
||||
si = (0+(228*13));
|
||||
di = (80);
|
||||
bx = (58)+96;
|
||||
cx = pop();
|
||||
openloop1:
|
||||
push(cx);
|
||||
push(di);
|
||||
push(bx);
|
||||
ax = es.word(si);
|
||||
_add(si, 2);
|
||||
push(si);
|
||||
push(es);
|
||||
_cmp(ch, cl);
|
||||
if (flags.c())
|
||||
goto nextopenslot;
|
||||
obToInv();
|
||||
nextopenslot:
|
||||
es = pop();
|
||||
si = pop();
|
||||
bx = pop();
|
||||
di = pop();
|
||||
cx = pop();
|
||||
_add(di, (44));
|
||||
_inc(cl);
|
||||
_cmp(cl, 5);
|
||||
if (!flags.z())
|
||||
goto openloop1;
|
||||
underTextLine();
|
||||
}
|
||||
|
||||
void DreamGenContext::findAllOpen() {
|
||||
STACK_CHECK;
|
||||
push(di);
|
||||
cx = 16;
|
||||
ax = 0x0ffff;
|
||||
_stosw(cx, true);
|
||||
di = pop();
|
||||
cl = data.byte(kOpenedob);
|
||||
dl = data.byte(kOpenedtype);
|
||||
ds = data.word(kExtras);
|
||||
bx = (0+2080+30000);
|
||||
ch = 0;
|
||||
findopen1:
|
||||
_cmp(ds.byte(bx+3), cl);
|
||||
if (!flags.z())
|
||||
goto findopen2;
|
||||
_cmp(ds.byte(bx+2), dl);
|
||||
if (!flags.z())
|
||||
goto findopen2;
|
||||
_cmp(data.byte(kOpenedtype), 4);
|
||||
if (flags.z())
|
||||
goto noloccheck;
|
||||
al = ds.byte(bx+5);
|
||||
_cmp(al, data.byte(kReallocation));
|
||||
if (!flags.z())
|
||||
goto findopen2;
|
||||
noloccheck:
|
||||
al = ds.byte(bx+4);
|
||||
ah = 0;
|
||||
push(di);
|
||||
_add(di, ax);
|
||||
_add(di, ax);
|
||||
al = ch;
|
||||
ah = 4;
|
||||
_stosw();
|
||||
di = pop();
|
||||
findopen2:
|
||||
_add(bx, 16);
|
||||
_inc(ch);
|
||||
_cmp(ch, (114));
|
||||
if (!flags.z())
|
||||
goto findopen1;
|
||||
cl = data.byte(kOpenedob);
|
||||
dl = data.byte(kOpenedtype);
|
||||
push(dx);
|
||||
ds = data.word(kFreedat);
|
||||
dx = pop();
|
||||
bx = 0;
|
||||
ch = 0;
|
||||
findopen1a:
|
||||
_cmp(ds.byte(bx+3), cl);
|
||||
if (!flags.z())
|
||||
goto findopen2a;
|
||||
_cmp(ds.byte(bx+2), dl);
|
||||
if (!flags.z())
|
||||
goto findopen2a;
|
||||
al = ds.byte(bx+4);
|
||||
ah = 0;
|
||||
push(di);
|
||||
_add(di, ax);
|
||||
_add(di, ax);
|
||||
al = ch;
|
||||
ah = 2;
|
||||
_stosw();
|
||||
di = pop();
|
||||
findopen2a:
|
||||
_add(bx, 16);
|
||||
_inc(ch);
|
||||
_cmp(ch, 80);
|
||||
if (!flags.z())
|
||||
goto findopen1a;
|
||||
}
|
||||
|
||||
void DreamGenContext::getFreeAd() {
|
||||
STACK_CHECK;
|
||||
ah = 0;
|
||||
|
|
|
@ -434,8 +434,6 @@ public:
|
|||
void pickupConts();
|
||||
void transferMap();
|
||||
void getSetAd();
|
||||
void findAllOpen();
|
||||
void fillOpen();
|
||||
void dreamweb();
|
||||
void read();
|
||||
void searchForString();
|
||||
|
|
|
@ -277,7 +277,8 @@ void DreamBase::getBackFromOb() {
|
|||
}
|
||||
|
||||
void DreamGenContext::getOpenedSize() {
|
||||
//ax = getOpenedSlotCount();
|
||||
//ah = getOpenedSlotSize();
|
||||
//ah = getOpenedSlotCount();
|
||||
|
||||
// We need to call the ASM-style versions of get*Ad, as these also set
|
||||
// bx and es
|
||||
|
@ -300,7 +301,7 @@ void DreamGenContext::getOpenedSize() {
|
|||
}
|
||||
}
|
||||
|
||||
byte DreamGenContext::getOpenedSlotCount() {
|
||||
byte DreamBase::getOpenedSlotCount() {
|
||||
byte obj = data.byte(kOpenedob);
|
||||
switch (data.byte(kOpenedtype)) {
|
||||
case 4:
|
||||
|
@ -312,7 +313,7 @@ byte DreamGenContext::getOpenedSlotCount() {
|
|||
}
|
||||
}
|
||||
|
||||
byte DreamGenContext::getOpenedSlotSize() {
|
||||
byte DreamBase::getOpenedSlotSize() {
|
||||
byte obj = data.byte(kOpenedob);
|
||||
switch (data.byte(kOpenedtype)) {
|
||||
case 4:
|
||||
|
@ -324,14 +325,14 @@ byte DreamGenContext::getOpenedSlotSize() {
|
|||
}
|
||||
}
|
||||
|
||||
void DreamGenContext::openOb() {
|
||||
void DreamBase::openOb() {
|
||||
uint8 commandLine[64] = "OBJECT NAME ONE ";
|
||||
|
||||
copyName(data.byte(kOpenedtype), data.byte(kOpenedob), commandLine);
|
||||
|
||||
printMessage(kInventx, kInventy+86, 62, 240, false);
|
||||
|
||||
al = printDirect(commandLine, data.word(kLastxpos) + 5, kInventy+86, 220, false);
|
||||
printDirect(commandLine, data.word(kLastxpos) + 5, kInventy+86, 220, false);
|
||||
|
||||
fillOpen();
|
||||
_openChangeSize = getOpenedSlotCount() * kItempicsize + kInventx;
|
||||
|
@ -1081,4 +1082,52 @@ byte DreamGenContext::transferToEx() {
|
|||
return pos;
|
||||
}
|
||||
|
||||
void DreamBase::fillOpen() {
|
||||
delTextLine();
|
||||
uint8 size = getOpenedSlotCount();
|
||||
if (size > 4)
|
||||
size = 4;
|
||||
findAllOpen();
|
||||
uint8 *openInvList = getSegment(data.word(kBuffers)).ptr(kOpeninvlist, 32);
|
||||
for (uint8 i = 0; i < size; ++i) {
|
||||
uint8 index = openInvList[2*i];
|
||||
uint8 type = openInvList[2*i + 1];
|
||||
obToInv(index, type, kInventx + (i-1)*kItempicsize, kInventy + 96);
|
||||
}
|
||||
underTextLine();
|
||||
}
|
||||
|
||||
void DreamBase::findAllOpen() {
|
||||
uint8 *openInvList = getSegment(data.word(kBuffers)).ptr(kOpeninvlist, 32);
|
||||
|
||||
memset(openInvList, 0xFF, 32);
|
||||
|
||||
const DynObject *obj;
|
||||
|
||||
obj = (const DynObject *)getSegment(data.word(kExtras)).ptr(kExdata, 0);
|
||||
for (uint8 i = 0; i < kNumexobjects; ++i, ++obj) {
|
||||
if (obj->mapad[1] != data.byte(kOpenedob))
|
||||
continue;
|
||||
if (obj->mapad[0] != data.byte(kOpenedtype))
|
||||
continue;
|
||||
if (data.byte(kOpenedtype) != kExObjectType && obj->mapad[3] != data.byte(kReallocation))
|
||||
continue;
|
||||
uint8 slot = obj->mapad[2];
|
||||
assert(slot < 16);
|
||||
openInvList[2*slot] = i;
|
||||
openInvList[2*slot + 1] = kExObjectType;
|
||||
}
|
||||
|
||||
obj = (const DynObject *)getSegment(data.word(kFreedat)).ptr(0, 0);
|
||||
for (uint8 i = 0; i < 80; ++i, ++obj) {
|
||||
if (obj->mapad[1] != data.byte(kOpenedob))
|
||||
continue;
|
||||
if (obj->mapad[0] != data.byte(kOpenedtype))
|
||||
continue;
|
||||
uint8 index = obj->mapad[2];
|
||||
openInvList[2*index] = i;
|
||||
openInvList[2*index + 1] = kFreeObjectType;
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace DreamGen
|
||||
|
|
|
@ -119,10 +119,7 @@
|
|||
void processTrigger();
|
||||
bool execCommand();
|
||||
void getOpenedSize();
|
||||
byte getOpenedSlotSize();
|
||||
byte getOpenedSlotCount();
|
||||
bool checkObjectSizeCPP();
|
||||
void openOb();
|
||||
void identifyOb();
|
||||
void selectOb();
|
||||
void findInvPos();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue