aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kmovement.cpp
diff options
context:
space:
mode:
authorMartin Kiewitz2010-08-31 10:53:27 +0000
committerMartin Kiewitz2010-08-31 10:53:27 +0000
commit839945795e25fee251c76e7d88b2a667a8349252 (patch)
treecf1f7cf50a71e2f7066cd87acb5934177456ed2b /engines/sci/engine/kmovement.cpp
parent7e6141dcfa880b5d24032351a4a0bffd2f47d3f8 (diff)
downloadscummvm-rg350-839945795e25fee251c76e7d88b2a667a8349252.tar.gz
scummvm-rg350-839945795e25fee251c76e7d88b2a667a8349252.tar.bz2
scummvm-rg350-839945795e25fee251c76e7d88b2a667a8349252.zip
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
Diffstat (limited to 'engines/sci/engine/kmovement.cpp')
-rw-r--r--engines/sci/engine/kmovement.cpp202
1 files changed, 0 insertions, 202 deletions
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);