From 839945795e25fee251c76e7d88b2a667a8349252 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 31 Aug 2010 10:53:27 +0000 Subject: 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) svn-id: r52467 --- engines/sci/engine/kmovement.cpp | 202 --------------------------------------- 1 file changed, 202 deletions(-) (limited to 'engines/sci/engine/kmovement.cpp') diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index ff70b1dd98..5b64934133 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -166,75 +166,6 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) { 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]; @@ -325,9 +256,7 @@ reg_t kInitBresen(EngineState *s, int argc, reg_t *argv) { 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,137 +375,6 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { } 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); -- cgit v1.2.3