[Scummvm-cvs-logs] scummvm master -> 8449493eff5ff26e8550dec6c50470521fc31947

wjp wjp at usecode.org
Sun Dec 18 16:02:10 CET 2011


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ebbc8ae3d2 DREAMWEB: Set es for reel callbacks while it may be necessary
8449493eff DREAMWEB: Convert removeObFromInv, deleteExObject, deleteExFrame, deleteExText


Commit: ebbc8ae3d2f7b868d4392b3df82ec1f332599dd7
    https://github.com/scummvm/scummvm/commit/ebbc8ae3d2f7b868d4392b3df82ec1f332599dd7
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-18T06:57:24-08:00

Commit Message:
DREAMWEB: Set es for reel callbacks while it may be necessary

Changed paths:
    engines/dreamweb/people.cpp



diff --git a/engines/dreamweb/people.cpp b/engines/dreamweb/people.cpp
index 8998e2f..81de17c 100644
--- a/engines/dreamweb/people.cpp
+++ b/engines/dreamweb/people.cpp
@@ -143,11 +143,14 @@ void DreamGenContext::updatePeople() {
 	ReelRoutine *r = (ReelRoutine *)data.ptr(kReelroutines, 0);
 
 	for (int i = 0; r[i].reallocation != 255; ++i) {
-		bx = kReelroutines + 8*i;
 		if (r[i].reallocation == data.byte(kReallocation) &&
 		        r[i].mapX == data.byte(kMapx) &&
 		        r[i].mapY == data.byte(kMapy)) {
 			assert(reelCallbacks[i]);
+			// Set es:bx to the ReelRoutine, while not all ReelCallbacks are in
+			// DreamBase
+			es = data;
+			bx = kReelroutines + 8*i;
 			(this->*(reelCallbacks[i]))(r[i]);
 		}
 	}


Commit: 8449493eff5ff26e8550dec6c50470521fc31947
    https://github.com/scummvm/scummvm/commit/8449493eff5ff26e8550dec6c50470521fc31947
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-18T07:01:06-08:00

Commit Message:
DREAMWEB: Convert removeObFromInv, deleteExObject, deleteExFrame, deleteExText

Changed paths:
    devtools/tasmrecover/tasm-recover
    engines/dreamweb/dreambase.h
    engines/dreamweb/dreamgen.cpp
    engines/dreamweb/dreamgen.h
    engines/dreamweb/object.cpp
    engines/dreamweb/people.cpp
    engines/dreamweb/stubs.cpp
    engines/dreamweb/stubs.h



diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index 29b9ae5..36e04a2 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -336,6 +336,9 @@ generator = cpp(context, "DreamGen", blacklist = [
 	'decide',
 	'delchar',
 	'delcurs',
+	'deleteexframe',
+	'deleteextext',
+	'deleteexobject',
 	'deletetaken',
 	'deleverything',
 	'delpointer',
@@ -700,6 +703,7 @@ generator = cpp(context, "DreamGen", blacklist = [
 	'removeemm',
 	'removefreeobject',
 	'removesetobject',
+	'removeobfrominv',
 	'resetkeyboard',
 	'restoreall',
 	'restoreems',
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 6f78bca..eae1d05 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -137,6 +137,10 @@ public:
 	void findAllRyan(uint8 *inv);
 	void obToInv(uint8 index, uint8 flag, uint16 x, uint16 y);
 	void obPicture();
+	void removeObFromInv();
+	void deleteExObject(uint8 index);
+	void deleteExFrame(uint8 frameNum);
+	void deleteExText(uint8 textNum);
 
 	// from pathfind.cpp
 	void turnPathOn(uint8 param);
@@ -417,6 +421,7 @@ public:
 	void hangOnCurs(uint16 frameCount);
 	const uint8 *findObName(uint8 type, uint8 index);
 	void copyName(uint8 type, uint8 index, uint8 *dst);
+	uint16 findExObject(const char *id);
 
 	// from use.cpp
 	void placeFreeObject(uint8 index);
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 6034e0e..6d303e6 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -985,18 +985,6 @@ notinlift:
 	es.byte(bx) = al;
 }
 
-void DreamGenContext::removeObFromInv() {
-	STACK_CHECK;
-	_cmp(data.byte(kCommand), 100);
-	if (flags.z())
-		return /* (obnotexist) */;
-	getAnyAd();
-	di = bx;
-	cl = data.byte(kCommand);
-	ch = 0;
-	deleteExObject();
-}
-
 void DreamGenContext::selectOpenOb() {
 	STACK_CHECK;
 	al = data.byte(kCommand);
@@ -1466,137 +1454,6 @@ cantpurge2:
 		goto lookforpurge2;
 }
 
-void DreamGenContext::deleteExObject() {
-	STACK_CHECK;
-	push(cx);
-	push(cx);
-	push(cx);
-	push(cx);
-	al = 255;
-	cx = 16;
-	_stosb(cx, true);
-	ax = pop();
-	cl = al;
-	_add(al, al);
-	_add(al, cl);
-	deleteExFrame();
-	ax = pop();
-	cl = al;
-	_add(al, al);
-	_add(al, cl);
-	_inc(al);
-	deleteExFrame();
-	ax = pop();
-	deleteExText();
-	bx = pop();
-	bh = bl;
-	bl = 4;
-	di = (0+2080+30000);
-	cx = 0;
-deleteconts:
-	_cmp(es.word(di+2), bx);
-	if (!flags.z())
-		goto notinsideex;
-	push(bx);
-	push(cx);
-	push(di);
-	deleteExObject();
-	di = pop();
-	cx = pop();
-	bx = pop();
-notinsideex:
-	_add(di, 16);
-	_inc(cx);
-	_cmp(cx, (114));
-	if (!flags.z())
-		goto deleteconts;
-}
-
-void DreamGenContext::deleteExFrame() {
-	STACK_CHECK;
-	di = (0);
-	ah = 0;
-	_add(ax, ax);
-	_add(di, ax);
-	_add(ax, ax);
-	_add(di, ax);
-	al = es.byte(di);
-	ah = 0;
-	cl = es.byte(di+1);
-	ch = 0;
-	_mul(cx);
-	si = es.word(di+2);
-	push(si);
-	_add(si, (0+2080));
-	cx = (30000);
-	_sub(cx, es.word(di+2));
-	di = si;
-	_add(si, ax);
-	push(ax);
-	ds = es;
-	_movsb(cx, true);
-	bx = pop();
-	_sub(data.word(kExframepos), bx);
-	si = pop();
-	cx = (114)*3;
-	di = (0);
-shuffleadsdown:
-	ax = es.word(di+2);
-	_cmp(ax, si);
-	if (flags.c())
-		goto beforethisone;
-	_sub(ax, bx);
-beforethisone:
-	es.word(di+2) = ax;
-	_add(di, 6);
-	if (--cx)
-		goto shuffleadsdown;
-}
-
-void DreamGenContext::deleteExText() {
-	STACK_CHECK;
-	di = (0+2080+30000+(16*114));
-	ah = 0;
-	_add(ax, ax);
-	_add(di, ax);
-	ax = es.word(di);
-	si = ax;
-	di = ax;
-	_add(si, (0+2080+30000+(16*114)+((114+2)*2)));
-	_add(di, (0+2080+30000+(16*114)+((114+2)*2)));
-	ax = 0;
-findlenextext:
-	cl = es.byte(si);
-	_inc(ax);
-	_inc(si);
-	_cmp(cl, 0);
-	if (!flags.z())
-		goto findlenextext;
-	cx = (18000);
-	bx = si;
-	_sub(bx, (0+2080+30000+(16*114)+((114+2)*2)));
-	push(bx);
-	push(ax);
-	_sub(cx, bx);
-	_movsb(cx, true);
-	bx = pop();
-	_sub(data.word(kExtextpos), bx);
-	si = pop();
-	cx = (114);
-	di = (0+2080+30000+(16*114));
-shuffletextads:
-	ax = es.word(di);
-	_cmp(ax, si);
-	if (flags.c())
-		goto beforethistext;
-	_sub(ax, bx);
-beforethistext:
-	es.word(di) = ax;
-	_add(di, 2);
-	if (--cx)
-		goto shuffletextads;
-}
-
 void DreamGenContext::startTalk() {
 	STACK_CHECK;
 	data.byte(kTalkmode) = 0;
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index 7f1601e..b7a644f 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -482,9 +482,7 @@ public:
 	void getAnyAd();
 	void reminders();
 	void inToInv();
-	void deleteExText();
 	void getFreeAd();
-	void removeObFromInv();
 	void dirFile();
 	void pickupConts();
 	void fadeUpMon();
@@ -496,13 +494,11 @@ public:
 	void getSetAd();
 	void nextColon();
 	void findOpenPos();
-	void deleteExFrame();
 	void searchForSame();
 	void rollEm();
 	void lookAtPlace();
 	void findAllOpen();
 	void fillOpen();
-	void deleteExObject();
 	void getEitherAd();
 	void dropObject();
 	void useOpened();
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index 53ecc0c..384e001 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -477,4 +477,90 @@ void DreamGenContext::setPickup() {
 	workToScreenM();
 }
 
+void DreamGenContext::deleteExFrame() {
+	deleteExFrame(al);
+}
+
+void DreamBase::deleteExFrame(uint8 frameNum) {
+	Frame *frame = (Frame *)getSegment(data.word(kExtras)).ptr(kExframedata + sizeof(Frame)*frameNum, sizeof(Frame));
+
+	uint16 frameSize = frame->width * frame->height;
+	// Note: the original asm didn't subtract frameSize from remainder
+	uint16 remainder = kExframeslen - frame->ptr() - frameSize;
+	uint16 startOff = kExframes + frame->ptr();
+	uint16 endOff = startOff + frameSize;
+
+	// Shift frame data after this one down
+	memmove(getSegment(data.word(kExtras)).ptr(startOff, remainder), getSegment(data.word(kExtras)).ptr(endOff, remainder), remainder);
+
+	// Combined frame data is now frameSize smaller
+	data.word(kExframepos) -= frameSize;
+
+	// Adjust all frame pointers pointing into the shifted data
+	for (unsigned int i = 0; i < 3*kNumexobjects; ++i) {
+		frame = (Frame *)getSegment(data.word(kExtras)).ptr(kExframedata + sizeof(Frame)*i, sizeof(Frame));
+		if (frame->ptr() >= startOff)
+			frame->setPtr(frame->ptr() - frameSize);
+	}
+}
+
+void DreamGenContext::deleteExText() {
+	deleteExText(al);
+}
+
+void DreamBase::deleteExText(uint8 textNum) {
+	uint16 offset = getSegment(data.word(kExtras)).word(kExtextdat + 2*textNum);
+
+	uint16 startOff = kExtext + offset;
+	uint16 textSize = strlen((char *)getSegment(data.word(kExtras)).ptr(startOff, 0)) + 1;
+	uint16 endOff = startOff + textSize;
+	uint16 remainder = kExtextlen - offset - textSize;
+
+	// Shift text data after this one down
+	memmove(getSegment(data.word(kExtras)).ptr(startOff, remainder), getSegment(data.word(kExtras)).ptr(endOff, remainder), remainder);
+
+	// Combined text data is now frameSize smaller
+	data.word(kExtextpos) -= textSize;
+
+	// Adjust all text pointers pointing into the shifted data
+	for (unsigned int i = 0; i < kNumexobjects; ++i) {
+		uint16 t = getSegment(data.word(kExtras)).word(kExtextdat + 2*i);
+		if (t >= offset + textSize)
+			getSegment(data.word(kExtras)).word(kExtextdat + 2*i) = t - textSize;
+	}
+}
+
+// This takes es:di and cl as input, but es:di always points to getExAd(cl)
+void DreamGenContext::deleteExObject() {
+	deleteExObject(cl);
+}
+
+void DreamBase::deleteExObject(uint8 index) {
+	DynObject *obj = getExAd(index);
+
+	memset(obj, 0xFF, sizeof(DynObject));
+
+	deleteExFrame(3*index);
+	deleteExFrame(3*index + 1);
+
+	deleteExText(index);
+
+	for (uint8 i = 0; i < kNumexobjects; ++i) {
+		DynObject *t = getExAd(index);
+		// Is this object contained in the one we've just deleted?
+		if (t->mapad[0] == 4 && t->mapad[1] == index)
+			deleteExObject(i);
+	}
+}
+
+void DreamBase::removeObFromInv() {
+	if (data.byte(kCommand) == 100)
+		return; // object doesn't exit
+
+	assert(data.byte(kObjecttype) == kExObjectType);
+
+	deleteExObject(data.byte(kCommand));
+}
+
+
 } // End of namespace DreamGen
diff --git a/engines/dreamweb/people.cpp b/engines/dreamweb/people.cpp
index 81de17c..20d6776 100644
--- a/engines/dreamweb/people.cpp
+++ b/engines/dreamweb/people.cpp
@@ -48,7 +48,7 @@ static void (DreamGenContext::*reelCallbacks[57])(ReelRoutine &) = {
 	&DreamBase::gates, &DreamBase::introMagic3,
 	&DreamBase::introMonks1, &DreamBase::candles,
 	&DreamBase::introMonks2, &DreamBase::handClap,
-	&DreamBase::monkAndRyan, &DreamGenContext::endGameSeq,
+	&DreamBase::monkAndRyan, &DreamBase::endGameSeq,
 	&DreamBase::priest, &DreamBase::madman,
 	&DreamBase::madmansTelly, &DreamBase::alleyBarkSound,
 	&DreamBase::foghornSound, &DreamBase::carParkDrip,
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 51587f1..6b7e9a7 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -1734,7 +1734,7 @@ void DreamGenContext::findExObject() {
 	bx = kExdata + al * 16;
 }
 
-uint16 DreamGenContext::findExObject(const char *id) {
+uint16 DreamBase::findExObject(const char *id) {
 	for (uint16 index = 0; index < kNumexobjects; index++) {
 		if (objectMatches(getExAd(index), id))
 			return index;
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
index 3e61367..aeda662 100644
--- a/engines/dreamweb/stubs.h
+++ b/engines/dreamweb/stubs.h
@@ -349,7 +349,9 @@
 	void lookAtCard();
 	bool execCommand();
 	void findExObject();
-	uint16 findExObject(const char *id);
+	uint16 findExObject(const char *id) {
+		return DreamBase::findExObject(id);
+	}
 	void isRyanHolding();
 	bool isRyanHolding(const char *id) {
 		return DreamBase::isRyanHolding(id);
@@ -371,5 +373,17 @@
 	void showDiaryKeys();
 	void showKeys();
 	void getKeyAndLogo();
+	void deleteExObject();
+	void deleteExObject(uint8 index) {
+		DreamBase::deleteExObject(index);
+	}
+	void deleteExFrame();
+	void deleteExFrame(uint8 frameNum) {
+		DreamBase::deleteExFrame(frameNum);
+	}
+	void deleteExText();
+	void deleteExText(uint8 textNum) {
+		DreamBase::deleteExText(textNum);
+	}
 
 #endif






More information about the Scummvm-git-logs mailing list