diff options
Diffstat (limited to 'engines/sci/engine/kmovement.cpp')
-rw-r--r-- | engines/sci/engine/kmovement.cpp | 495 |
1 files changed, 305 insertions, 190 deletions
diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 8c43a35fea..db54705694 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -129,7 +129,7 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) { // Compute x step if (tmp != 0) - vx = (int)(dx * sqrt(gy / (2.0 * tmp))); + vx = (int16)((float)(dx * sqrt(gy / (2.0 * tmp)))); else vx = 0; @@ -145,7 +145,7 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) { // FIXME: This choice of vy makes t roughly (2+sqrt(2))/gy * sqrt(dy); // so if gy==3, then t is roughly sqrt(dy)... - vy = (int)sqrt((double)gy * ABS(2 * dy)) + 1; + vy = (int)sqrt((float)gy * ABS(2 * dy)) + 1; } else { // As stated above, the vertical direction is correlated to the horizontal by the // (non-zero) factor c. @@ -166,230 +166,345 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -#define _K_BRESEN_AXIS_X 0 -#define _K_BRESEN_AXIS_Y 1 - -static void initialize_bresen(SegManager *segMan, int argc, reg_t *argv, reg_t mover, int step_factor, int deltax, int deltay) { - reg_t client = readSelector(segMan, mover, SELECTOR(client)); - 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); -} - 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)); + int16 client_xStep = readSelectorValue(segMan, client, SELECTOR(xStep)) * stepFactor; + int16 client_yStep = readSelectorValue(segMan, client, SELECTOR(yStep)) * stepFactor; + + int16 client_step; + if (client_xStep < client_yStep) + client_step = client_yStep * 2; + else + client_step = client_xStep * 2; + + int16 deltaX = mover_x - readSelectorValue(segMan, client, SELECTOR(x)); + int16 deltaY = mover_y - readSelectorValue(segMan, client, SELECTOR(y)); + int16 mover_dx = 0; + int16 mover_dy = 0; + int16 mover_i1 = 0; + int16 mover_i2 = 0; + int16 mover_di = 0; + int16 mover_incr = 0; + int16 mover_xAxis = 0; + + while (1) { + mover_dx = client_xStep; + mover_dy = client_yStep; + mover_incr = 1; + + if (ABS(deltaX) >= ABS(deltaY)) { + mover_xAxis = 1; + if (deltaX < 0) + mover_dx = -mover_dx; + mover_dy = deltaX ? mover_dx * deltaY / deltaX : 0; + mover_i1 = ((mover_dx * deltaY) - (mover_dy * deltaX)) * 2; + if (deltaY < 0) { + mover_incr = -1; + mover_i1 = -mover_i1; + } + mover_i2 = mover_i1 - (deltaX * 2); + mover_di = mover_i1 - deltaX; + if (deltaX < 0) { + mover_i1 = -mover_i1; + mover_i2 = -mover_i2; + mover_di = -mover_di; + } + } else { + mover_xAxis = 0; + if (deltaY < 0) + mover_dy = -mover_dy; + mover_dx = deltaY ? mover_dy * deltaX / deltaY : 0; + mover_i1 = ((mover_dy * deltaX) - (mover_dx * deltaY)) * 2; + if (deltaX < 0) { + mover_incr = -1; + mover_i1 = -mover_i1; + } + mover_i2 = mover_i1 - (deltaY * 2); + mover_di = mover_i1 - deltaY; + if (deltaY < 0) { + mover_i1 = -mover_i1; + mover_i2 = -mover_i2; + mover_di = -mover_di; + } + break; + } + if (client_xStep <= client_yStep) + break; + if (!client_xStep) + break; + if (client_yStep >= ABS(mover_dy + mover_incr)) + break; + + client_step--; + if (!client_step) + error("kInitBresen failed"); + client_xStep--; + } - 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; - - initialize_bresen(s->_segMan, argc, argv, mover, step_factor, deltax, deltay); - + // set mover + writeSelectorValue(segMan, mover, SELECTOR(dx), mover_dx); + writeSelectorValue(segMan, mover, SELECTOR(dy), mover_dy); + writeSelectorValue(segMan, mover, SELECTOR(b_i1), mover_i1); + writeSelectorValue(segMan, mover, SELECTOR(b_i2), mover_i2); + writeSelectorValue(segMan, mover, SELECTOR(b_di), mover_di); + writeSelectorValue(segMan, mover, SELECTOR(b_incr), mover_incr); + writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), mover_xAxis); return s->r_acc; } -#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)); + bool completed = false; + bool handleMoveCount = g_sci->_features->handleMoveCount(); - int x = (int16)readSelectorValue(segMan, client, SELECTOR(x)); - int y = (int16)readSelectorValue(segMan, client, SELECTOR(y)); - int oldx, oldy, destx, desty, dx, dy, bdi, bi1, bi2, movcnt, bdelta, axis; - uint16 signal = readSelectorValue(segMan, client, SELECTOR(signal)); - int completed = 0; - int max_movcnt = readSelectorValue(segMan, client, SELECTOR(moveSpeed)); - - if (getSciVersion() > SCI_VERSION_01) - signal &= ~kSignalHitObstacle; - - writeSelector(segMan, client, SELECTOR(signal), make_reg(0, signal)); // This is a NOP for SCI0 - oldx = x; - oldy = y; - destx = (int16)readSelectorValue(segMan, mover, SELECTOR(x)); - desty = (int16)readSelectorValue(segMan, mover, SELECTOR(y)); - dx = (int16)readSelectorValue(segMan, mover, SELECTOR(dx)); - dy = (int16)readSelectorValue(segMan, mover, SELECTOR(dy)); - bdi = (int16)readSelectorValue(segMan, mover, SELECTOR(b_di)); - bi1 = (int16)readSelectorValue(segMan, mover, SELECTOR(b_i1)); - bi2 = (int16)readSelectorValue(segMan, mover, SELECTOR(b_i2)); - movcnt = readSelectorValue(segMan, mover, SELECTOR(b_movCnt)); - bdelta = (int16)readSelectorValue(segMan, mover, SELECTOR(b_incr)); - axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); - - 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); - } + if (getSciVersion() >= SCI_VERSION_1_EGA) { + uint client_signal = readSelectorValue(segMan, client, SELECTOR(signal)); + writeSelectorValue(segMan, client, SELECTOR(signal), client_signal & ~kSignalHitObstacle); + } + + int16 mover_moveCnt = 1; + int16 client_moveSpeed = 0; + if (handleMoveCount) { + mover_moveCnt = readSelectorValue(segMan, mover, SELECTOR(b_movCnt)); + client_moveSpeed = readSelectorValue(segMan, client, SELECTOR(moveSpeed)); + mover_moveCnt++; } - //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt); + if (client_moveSpeed < mover_moveCnt) { + mover_moveCnt = 0; + int16 client_x = readSelectorValue(segMan, client, SELECTOR(x)); + int16 client_y = readSelectorValue(segMan, client, SELECTOR(y)); + int16 client_org_x = client_x; + int16 client_org_y = client_y; + int16 mover_x = readSelectorValue(segMan, mover, SELECTOR(x)); + int16 mover_y = readSelectorValue(segMan, mover, SELECTOR(y)); + int16 mover_xAxis = readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); + int16 mover_dx = readSelectorValue(segMan, mover, SELECTOR(dx)); + int16 mover_dy = readSelectorValue(segMan, mover, SELECTOR(dy)); + int16 mover_incr = readSelectorValue(segMan, mover, SELECTOR(b_incr)); + int16 mover_i1 = readSelectorValue(segMan, mover, SELECTOR(b_i1)); + int16 mover_i2 = readSelectorValue(segMan, mover, SELECTOR(b_i2)); + int16 mover_di = readSelectorValue(segMan, mover, SELECTOR(b_di)); + int16 mover_org_i1 = mover_i1; + int16 mover_org_i2 = mover_i2; + int16 mover_org_di = mover_di; + + if ((getSciVersion() >= SCI_VERSION_1_EGA)) { + // save current position into mover + writeSelectorValue(segMan, mover, SELECTOR(xLast), client_x); + writeSelectorValue(segMan, mover, SELECTOR(yLast), client_y); + } + // sierra sci saves full client selector variables here - if (g_sci->_features->handleMoveCount()) { - if (max_movcnt > movcnt) { - ++movcnt; - writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), movcnt); // Needed for HQ1/Ogre? - return NULL_REG; + if (mover_xAxis) { + if (ABS(mover_x - client_x) < ABS(mover_dx)) + completed = true; } else { - movcnt = 0; - writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), movcnt); // Needed for HQ1/Ogre? + if (ABS(mover_y - client_y) < ABS(mover_dy)) + completed = true; + } + if (completed) { + client_x = mover_x; + client_y = mover_y; + } else { + client_x += mover_dx; + client_y += mover_dy; + if (mover_di < 0) { + mover_di += mover_i1; + } else { + mover_di += mover_i2; + if (mover_xAxis == 0) { + client_x += mover_incr; + } else { + client_y += mover_incr; + } + } + } + writeSelectorValue(segMan, client, SELECTOR(x), client_x); + writeSelectorValue(segMan, client, SELECTOR(y), client_y); + + // Now call client::canBeHere/client::cantBehere to check for collisions + 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 ((bdi += bi1) > 0) { - bdi += bi2; + if (collision) { + // sierra restores full client variables here, seems that restoring x/y is enough + writeSelectorValue(segMan, client, SELECTOR(x), client_org_x); + writeSelectorValue(segMan, client, SELECTOR(y), client_org_y); + mover_i1 = mover_org_i1; + mover_i2 = mover_org_i2; + mover_di = mover_org_di; - if (axis == _K_BRESEN_AXIS_X) - dx += bdelta; + uint16 client_signal = readSelectorValue(segMan, client, SELECTOR(signal)); + writeSelectorValue(segMan, client, SELECTOR(signal), client_signal | kSignalHitObstacle); + } + writeSelectorValue(segMan, mover, SELECTOR(b_i1), mover_i1); + writeSelectorValue(segMan, mover, SELECTOR(b_i2), mover_i2); + writeSelectorValue(segMan, mover, SELECTOR(b_di), mover_di); + + if ((getSciVersion() >= SCI_VERSION_1_EGA)) { + // this calling code here was right before the last return in + // sci1ega and got changed to this position since sci1early + // this was an uninitialized issue in sierra sci + if ((handleMoveCount) && (getSciVersion() >= SCI_VERSION_1_EARLY)) + writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), mover_moveCnt); + // We need to compare directly in here, complete may have happened during + // the current move + if ((client_x == mover_x) && (client_y == mover_y)) + invokeSelector(s, mover, SELECTOR(moveDone), argc, argv); + if (getSciVersion() >= SCI_VERSION_1_EARLY) + return s->r_acc; + } + } + if (handleMoveCount) { + if (getSciVersion() <= SCI_VERSION_1_EGA) + writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), mover_moveCnt); else - dy += bdelta; + writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), client_moveSpeed); } + return s->r_acc; +} - writeSelectorValue(segMan, mover, SELECTOR(b_di), bdi); +extern void kDirLoopWorker(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv); +extern uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2); - x += dx; - y += dy; +reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { + SegManager *segMan = s->_segMan; + reg_t avoider = argv[0]; + int16 timesStep = argc > 1 ? argv[1].toUint16() : 1; - if ((MOVING_ON_X && (((x < destx) && (oldx >= destx)) // Moving left, exceeded? - || ((x > destx) && (oldx <= destx)) // Moving right, exceeded? - || ((x == destx) && (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 < desty) && (oldy >= desty)) /* Moving upwards, exceeded? */ - || ((y > desty) && (oldy <= desty)) /* Moving downwards, exceeded? */ - || ((y == desty) && (ABS(dy) >= ABS(dx))) /* Moving fast, reached? */ - ))) { - // Whew... in short: If we have reached or passed our target position + if (!s->_segMan->isHeapObject(avoider)) { + error("DoAvoider() where avoider %04x:%04x is not an object", PRINT_REG(avoider)); + return SIGNAL_REG; + } - x = destx; - y = desty; - completed = 1; + reg_t client = readSelector(segMan, avoider, SELECTOR(client)); + reg_t mover = readSelector(segMan, client, SELECTOR(mover)); + if (mover.isNull()) + return SIGNAL_REG; - debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x", PRINT_REG(mover)); - } + // call mover::doit + invokeSelector(s, mover, SELECTOR(doit), argc, argv); - writeSelectorValue(segMan, client, SELECTOR(x), x); - writeSelectorValue(segMan, client, SELECTOR(y), y); + // Read mover again + mover = readSelector(segMan, client, SELECTOR(mover)); + if (mover.isNull()) + return SIGNAL_REG; - debugC(2, kDebugLevelBresen, "New data: (x,y)=(%d,%d), di=%d", x, y, bdi); + int16 clientX = readSelectorValue(segMan, client, SELECTOR(x)); + int16 clientY = readSelectorValue(segMan, client, SELECTOR(y)); + int16 moverX = readSelectorValue(segMan, mover, SELECTOR(x)); + int16 moverY = readSelectorValue(segMan, mover, SELECTOR(y)); + int16 avoiderHeading = readSelectorValue(segMan, avoider, SELECTOR(heading)); - bool collision = false; - reg_t cantBeHere = NULL_REG; + // call client::isBlocked + invokeSelector(s, client, SELECTOR(isBlocked), argc, argv); - 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 (s->r_acc.isNull()) { + // not blocked + if (avoiderHeading == -1) + return SIGNAL_REG; + avoiderHeading = -1; - if (collision) { - signal = readSelectorValue(segMan, client, SELECTOR(signal)); + uint16 angle = kGetAngleWorker(clientX, clientY, moverX, moverY); - writeSelectorValue(segMan, client, SELECTOR(x), oldx); - writeSelectorValue(segMan, client, SELECTOR(y), oldy); - writeSelectorValue(segMan, client, SELECTOR(signal), (signal | kSignalHitObstacle)); + reg_t clientLooper = readSelector(segMan, client, SELECTOR(looper)); + if (clientLooper.isNull()) { + kDirLoopWorker(client, angle, s, argc, argv); + } else { + // call looper::doit + reg_t params[2] = { make_reg(0, angle), client }; + invokeSelector(s, clientLooper, SELECTOR(doit), argc, argv, 2, params); + } + s->r_acc = SIGNAL_REG; + + } else { + // is blocked + if (avoiderHeading == -1) + avoiderHeading = g_sci->getRNG().getRandomBit() ? 45 : -45; + int16 clientHeading = readSelectorValue(segMan, client, SELECTOR(heading)); + clientHeading = (clientHeading / 45) * 45; + + int16 clientXstep = readSelectorValue(segMan, client, SELECTOR(xStep)) * timesStep; + int16 clientYstep = readSelectorValue(segMan, client, SELECTOR(yStep)) * timesStep; + int16 newHeading = clientHeading; + + while (1) { + int16 newX = clientX; + int16 newY = clientY; + switch (newHeading) { + case 45: + case 90: + case 135: + newX += clientXstep; + break; + case 225: + case 270: + case 315: + newX -= clientXstep; + } - 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 set call .moveDone in those cases qfg1 vga gate at the castle and lsl1 casino door will not work - } + switch (newHeading) { + case 0: + case 45: + case 315: + newY -= clientYstep; + break; + case 135: + case 180: + case 225: + newY += clientYstep; + } + writeSelectorValue(segMan, client, SELECTOR(x), newX); + writeSelectorValue(segMan, client, SELECTOR(y), newY); - if ((getSciVersion() >= SCI_VERSION_1_EGA)) - if (completed) - invokeSelector(s, mover, SELECTOR(moveDone), argc, argv); + // call client::canBeHere + invokeSelector(s, client, SELECTOR(canBeHere), argc, argv); - if (SELECTOR(cantBeHere) != -1) - return cantBeHere; - return make_reg(0, completed); -} + if (!s->r_acc.isNull()) { + s->r_acc = make_reg(0, newHeading); + break; // break out + } -extern void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv); - -int getAngle(int xrel, int yrel) { - if ((xrel == 0) && (yrel == 0)) - return 0; - else { - int val = (int)(180.0 / PI * atan2((double)xrel, (double) - yrel)); - if (val < 0) - val += 360; - - // Take care of OB1 differences between SSCI and - // FSCI. SCI games sometimes check for equality with - // "round" angles - if (val % 45 == 44) - val++; - else if (val % 45 == 1) - val--; - - return val; + newHeading += avoiderHeading; + if (newHeading >= 360) + newHeading -= 360; + if (newHeading < 0) + newHeading += 360; + if (newHeading == clientHeading) { + // tried everything + writeSelectorValue(segMan, client, SELECTOR(x), clientX); + writeSelectorValue(segMan, client, SELECTOR(y), clientY); + s->r_acc = SIGNAL_REG; + break; // break out + } + } } -} + writeSelectorValue(segMan, avoider, SELECTOR(heading), avoiderHeading); + return s->r_acc; -reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { - SegManager *segMan = s->_segMan; - reg_t avoider = argv[0]; +#if 0 reg_t client, looper, mover; int angle; int dx, dy; @@ -486,18 +601,18 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, angle); - reg_t params[2] = { make_reg(0, angle), client }; - if (looper.segment) { + reg_t params[2] = { make_reg(0, angle), client }; invokeSelector(s, looper, SELECTOR(doit), argc, argv, 2, params); return s->r_acc; } else { // No looper? Fall back to DirLoop - _k_dirloop(client, (uint16)angle, s, argc, argv); + kDirLoopWorker(client, (uint16)angle, s, argc, argv); } } return s->r_acc; +#endif } } // End of namespace Sci |