[Scummvm-cvs-logs] SF.net SVN: scummvm:[52467] scummvm/trunk/engines/sci

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Tue Aug 31 12:53:27 CEST 2010


Revision: 52467
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52467&view=rev
Author:   m_kiewitz
Date:     2010-08-31 10:53:27 +0000 (Tue, 31 Aug 2010)

Log Message:
-----------
SCI: enable new kDoBresen/InitBresen

enable replacement of save/load dialogs per default
add config-var "sci_originalsaveload" for not replacing dialogs
add config-var "sci_dither" for enabling dithering in EGA games
new kDoBresen fix qfg2 walk against wall bug (#3053131) and hoyle3 unreadable dice bug (#3036922)

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kmovement.cpp
    scummvm/trunk/engines/sci/sci.cpp

Modified: scummvm/trunk/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmovement.cpp	2010-08-31 10:12:35 UTC (rev 52466)
+++ scummvm/trunk/engines/sci/engine/kmovement.cpp	2010-08-31 10:53:27 UTC (rev 52467)
@@ -166,79 +166,10 @@
 	return s->r_acc;
 }
 
-#define USE_OLD_BRESEN 1
-
-#ifdef USE_OLD_BRESEN
-#define _K_BRESEN_AXIS_X 0
-#define _K_BRESEN_AXIS_Y 1
-
 reg_t kInitBresen(EngineState *s, int argc, reg_t *argv) {
 	SegManager *segMan = s->_segMan;
 	reg_t mover = argv[0];
 	reg_t client = readSelector(segMan, mover, SELECTOR(client));
-
-	int deltax = (int16)readSelectorValue(segMan, mover, SELECTOR(x)) - (int16)readSelectorValue(segMan, client, SELECTOR(x));
-	int deltay = (int16)readSelectorValue(segMan, mover, SELECTOR(y)) - (int16)readSelectorValue(segMan, client, SELECTOR(y));
-	int step_factor = (argc < 1) ? argv[1].toUint16() : 1;
-	int stepx = (int16)readSelectorValue(segMan, client, SELECTOR(xStep)) * step_factor;
-	int stepy = (int16)readSelectorValue(segMan, client, SELECTOR(yStep)) * step_factor;
-	int numsteps_x = stepx ? (ABS(deltax) + stepx - 1) / stepx : 0;
-	int numsteps_y = stepy ? (ABS(deltay) + stepy - 1) / stepy : 0;
-	int bdi, i1;
-	int numsteps;
-	int deltax_step;
-	int deltay_step;
-
-	if (numsteps_x > numsteps_y) {
-		numsteps = numsteps_x;
-		deltax_step = (deltax < 0) ? -stepx : stepx;
-		deltay_step = numsteps ? deltay / numsteps : deltay;
-	} else { // numsteps_x <= numsteps_y
-		numsteps = numsteps_y;
-		deltay_step = (deltay < 0) ? -stepy : stepy;
-		deltax_step = numsteps ? deltax / numsteps : deltax;
-	}
-
-/*	if (ABS(deltax) > ABS(deltay)) {*/ // Bresenham on y
-	if (numsteps_y < numsteps_x) {
-
-		writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), _K_BRESEN_AXIS_Y);
-		writeSelectorValue(segMan, mover, SELECTOR(b_incr), (deltay < 0) ? -1 : 1);
-		//i1 = 2 * (ABS(deltay) - ABS(deltay_step * numsteps)) * ABS(deltax_step);
-		//bdi = -ABS(deltax);
-		i1 = 2 * (ABS(deltay) - ABS(deltay_step * (numsteps - 1))) * ABS(deltax_step);
-		bdi = -ABS(deltax);
-	} else { // Bresenham on x
-		writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), _K_BRESEN_AXIS_X);
-		writeSelectorValue(segMan, mover, SELECTOR(b_incr), (deltax < 0) ? -1 : 1);
-		//i1= 2 * (ABS(deltax) - ABS(deltax_step * numsteps)) * ABS(deltay_step);
-		//bdi = -ABS(deltay);
-		i1 = 2 * (ABS(deltax) - ABS(deltax_step * (numsteps - 1))) * ABS(deltay_step);
-		bdi = -ABS(deltay);
-
-	}
-
-	writeSelectorValue(segMan, mover, SELECTOR(dx), deltax_step);
-	writeSelectorValue(segMan, mover, SELECTOR(dy), deltay_step);
-
-	debugC(2, kDebugLevelBresen, "Init bresen for mover %04x:%04x: d=(%d,%d)", PRINT_REG(mover), deltax, deltay);
-	debugC(2, kDebugLevelBresen, "    steps=%d, mv=(%d, %d), i1= %d, i2=%d",
-	          numsteps, deltax_step, deltay_step, i1, bdi*2);
-
-	//writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), numsteps); // Needed for HQ1/Ogre?
-	writeSelectorValue(segMan, mover, SELECTOR(b_di), bdi);
-	writeSelectorValue(segMan, mover, SELECTOR(b_i1), i1);
-	writeSelectorValue(segMan, mover, SELECTOR(b_i2), bdi * 2);
-
-	return s->r_acc;
-}
-#endif
-
-#ifndef USE_OLD_BRESEN
-reg_t kInitBresen(EngineState *s, int argc, reg_t *argv) {
-	SegManager *segMan = s->_segMan;
-	reg_t mover = argv[0];
-	reg_t client = readSelector(segMan, mover, SELECTOR(client));
 	int16 stepFactor = (argc >= 2) ? argv[1].toUint16() : 1;
 	int16 mover_x = readSelectorValue(segMan, mover, SELECTOR(x));
 	int16 mover_y = readSelectorValue(segMan, mover, SELECTOR(y));
@@ -325,9 +256,7 @@
 	writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), mover_xAxis);
 	return s->r_acc;
 }
-#endif
 
-#ifndef USE_OLD_BRESEN
 reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) {
 	SegManager *segMan = s->_segMan;
 	reg_t mover = argv[0];
@@ -446,138 +375,7 @@
 	}
 	return s->r_acc;
 }
-#endif
 
-#ifdef USE_OLD_BRESEN
-#define MOVING_ON_X (((axis == _K_BRESEN_AXIS_X)&&bi1) || dx)
-#define MOVING_ON_Y (((axis == _K_BRESEN_AXIS_Y)&&bi1) || dy)
-
-reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) {
-	SegManager *segMan = s->_segMan;
-	reg_t mover = argv[0];
-	reg_t client = readSelector(segMan, mover, SELECTOR(client));
-
-	int x = (int16)readSelectorValue(segMan, client, SELECTOR(x));
-	int y = (int16)readSelectorValue(segMan, client, SELECTOR(y));
-	uint16 signal = readSelectorValue(segMan, client, SELECTOR(signal));
-	int16 max_movcnt = (int16)readSelectorValue(segMan, client, SELECTOR(moveSpeed));
-	int16 old_x = x;
-	int16 old_y = y;
-	int16 dest_x = (int16)readSelectorValue(segMan, mover, SELECTOR(x));
-	int16 dest_y = (int16)readSelectorValue(segMan, mover, SELECTOR(y));
-	int16 dx = (int16)readSelectorValue(segMan, mover, SELECTOR(dx));
-	int16 dy = (int16)readSelectorValue(segMan, mover, SELECTOR(dy));
-	int16 bdi = (int16)readSelectorValue(segMan, mover, SELECTOR(b_di));
-	int16 bi1 = (int16)readSelectorValue(segMan, mover, SELECTOR(b_i1));
-	int16 bi2 = (int16)readSelectorValue(segMan, mover, SELECTOR(b_i2));
-	int16 movcnt = (int16)readSelectorValue(segMan, mover, SELECTOR(b_movCnt));
-	int16 bdelta = (int16)readSelectorValue(segMan, mover, SELECTOR(b_incr));
-	int16 axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis));
-	bool completed = false;
-
-	if (getSciVersion() > SCI_VERSION_01) {
-		signal &= ~kSignalHitObstacle;
-		writeSelector(segMan, client, SELECTOR(signal), make_reg(0, signal));
-	}
-
-	if ((getSciVersion() >= SCI_VERSION_1_LATE)) {
-		// Mixed-Up Fairy Tales has no xLast/yLast selectors
-		if (SELECTOR(xLast) != -1) {
-			// save last position into mover
-			writeSelectorValue(segMan, mover, SELECTOR(xLast), x);
-			writeSelectorValue(segMan, mover, SELECTOR(yLast), y);
-		}
-	}
-
-	//printf("movecnt %d, move speed %d\n", movcnt, max_movcnt);
-
-	if (g_sci->_features->handleMoveCount()) {
-		if (max_movcnt > movcnt) {
-			++movcnt;
-			writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), movcnt);
-			return NULL_REG; // sierra sci1+ checks, if destination got reached in this case
-		} else {
-			movcnt = 0;
-			writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), movcnt);
-		}
-	}
-
-	if ((bdi += bi1) > 0) {
-		bdi += bi2;
-
-		if (axis == _K_BRESEN_AXIS_X)
-			dx += bdelta;
-		else
-			dy += bdelta;
-	}
-
-	writeSelectorValue(segMan, mover, SELECTOR(b_di), bdi);
-
-	x += dx;
-	y += dy;
-
-	if ((MOVING_ON_X && (((x < dest_x) && (old_x >= dest_x)) // Moving left, exceeded?
-	            || ((x > dest_x) && (old_x <= dest_x)) // Moving right, exceeded?
-	            || ((x == dest_x) && (ABS(dx) > ABS(dy))) // Moving fast, reached?
-	            // Treat this last case specially- when doing sub-pixel movements
-	            // on the other axis, we could still be far away from the destination
-				)) || (MOVING_ON_Y && (((y < dest_y) && (old_y >= dest_y)) /* Moving upwards, exceeded? */
-	                || ((y > dest_y) && (old_y <= dest_y)) /* Moving downwards, exceeded? */
-	                || ((y == dest_y) && (ABS(dy) >= ABS(dx))) /* Moving fast, reached? */
-				))) {
-		// Whew... in short: If we have reached or passed our target position
-
-		x = dest_x;
-		y = dest_y;
-		completed = true;
-
-		debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x", PRINT_REG(mover));
-	}
-
-	writeSelectorValue(segMan, client, SELECTOR(x), x);
-	writeSelectorValue(segMan, client, SELECTOR(y), y);
-
-	debugC(2, kDebugLevelBresen, "New data: (x,y)=(%d,%d), di=%d", x, y, bdi);
-
-	bool collision = false;
-	reg_t cantBeHere = NULL_REG;
-
-	if (SELECTOR(cantBeHere) != -1) {
-		// adding this here for hoyle 3 to get happy. CantBeHere is a dummy in hoyle 3 and acc is != 0 so we would
-		//  get a collision otherwise
-		s->r_acc = NULL_REG;
-		invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv);
-		if (!s->r_acc.isNull())
-			collision = true;
-		cantBeHere = s->r_acc;
-	} else {
-		invokeSelector(s, client, SELECTOR(canBeHere), argc, argv);
-		if (s->r_acc.isNull())
-			collision = true;
-	}
-
-	if (collision) {
-		signal = readSelectorValue(segMan, client, SELECTOR(signal));
-
-		writeSelectorValue(segMan, client, SELECTOR(x), old_x);
-		writeSelectorValue(segMan, client, SELECTOR(y), old_y);
-		writeSelectorValue(segMan, client, SELECTOR(signal), (signal | kSignalHitObstacle));
-
-		debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision", PRINT_REG(mover));
-		// We shall not set completed in this case, sierra sci also doesn't do it
-		//  if we call .moveDone in those cases qfg1 vga gate at the castle and lsl1 casino door will not work
-	}
-
-	if ((getSciVersion() >= SCI_VERSION_1_EGA))
-		if (completed)
-			invokeSelector(s, mover, SELECTOR(moveDone), argc, argv);
-
-	if (SELECTOR(cantBeHere) != -1)
-		return cantBeHere;
-	return make_reg(0, completed);
-}
-#endif
-
 extern void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv);
 
 int getAngle(int xrel, int yrel) {

Modified: scummvm/trunk/engines/sci/sci.cpp
===================================================================
--- scummvm/trunk/engines/sci/sci.cpp	2010-08-31 10:12:35 UTC (rev 52466)
+++ scummvm/trunk/engines/sci/sci.cpp	2010-08-31 10:53:27 UTC (rev 52467)
@@ -257,6 +257,11 @@
 	// Patch in our save/restore code, so that dialogs are replaced
 	patchGameSaveRestore(segMan);
 
+	// Switch off undithering, if requested by user
+	Common::String ditherOption = ConfMan.get("sci_dither");
+	if (ditherOption != "")
+		_gfxScreen->debugUnditherSetState(false);
+
 	if (_gameDescription->flags & ADGF_ADDENGLISH) {
 		// if game is multilingual
 		Common::Language selectedLanguage = Common::parseLanguage(ConfMan.get("language"));
@@ -348,8 +353,8 @@
 		break;
 	}
 
-	Common::String replaceDialogOption = ConfMan.get("scireplacedialog", Common::ConfigManager::kApplicationDomain);
-	if (replaceDialogOption == "")
+	Common::String originalSaveLoadOption = ConfMan.get("sci_originalsaveload");
+	if (originalSaveLoadOption != "")
 		return;
 
 	for (uint16 kernelNr = 0; kernelNr < kernelCount; kernelNr++) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list