static void cas_execute(cas_t *cas) { uint32_t inst; int fcycles, qcycles, cycles; uint8_t op; fcycles = 0; if (!cas->fidle) fcycles = cas_execute_full(cas); cas->fcycles += fcycles; qcycles = 0; if (!cas->qidle && !cas->ready) qcycles = cas_execute_quarter(cas); cas->qcycles += qcycles; cycles = fcycles > qcycles ? fcycles : qcycles; cas->cycles += cycles; add_energy(cas, cycles); if (fcycles > 0 && cas->qidle) cas->could_save_cycles += fcycles > cas->last_qcycles ? cas->last_qcycles : fcycles; if (!cas->fidle && cas->qidle) { cas->qidle = 0; cas->qcur = cas->fcur; cas->qcur_stride = cas->fcur_stride; cas->qpts_done_off = cas->qpts_done_n = 0; cas->q_pixel = cas->f_pixel; cas->q_pixf = cas->f_pixf; cas->qfx = cas->fx; cas->qfy = cas->fy; cas->qx = cas->qy = 0; cas->qcost = cas->fcost; cas->qstarted = 0; cas->qcounter = cas->fcounter; cas->qjmpflag = cas->fjmpflag; cas->qwinner = 0; cas->interp_done = 0; inst = cas->prog_mem[cas->fcounter]; op = (inst & 0xf0000) >> 16; if (cas->qeu > 0 && op == 1) { /* frac pel */ cycles = icycles_iter[cas->q_pixel]; cas->cycles += cycles; add_energy(cas, cycles); interp_ori(cas); interp_hor(cas); } cas->fidle = 1; }
void Player::step_judo_correcting() { judo.move_center_by = 0; if (currentInputDir != 0) { if (judo.keyReleased) { judo.keyReleased = false; } } else judo.keyReleased = true; judo.dir = facingDirection; judo.move_to = game->center_of_gravity + (judo.dir * (judo.reach/2)); // Should keep moving, or stop? if (judo.dir < 0) { if (judo.move_to <= pos.x) { if ( vel.x > -judo.move_speed_max ) xDelta -= judo.move_acceleration; } else { vel.x = judo.dir = 0; } } else if (judo.dir > 0) { if (judo.move_to >= pos.x) { if ( vel.x < judo.move_speed_max ) xDelta += judo.move_acceleration; } else { vel.x = judo.dir = 0; } } else { vel.x = 0; } step_normal_test(); facingDirection = (orientation == POS_LEFT) ? 1 : -1; float d = fabs(game->center_of_gravity - pos.x); if (d <= 1.0) balance->setRange(0,0); else if (d <= 2.0) balance->setRange(0.25,0.015); else if (d >= 3.0) balance->setRange(0.75,0.04); balance->set_safe_range_percents(0.25,0.75); // temp placement balance->step(); judo.action = action; if (judo.action && judo.energy >= 1.0) spend_energy(1.0); else judo.action = false; judo.elapsed_breath += TIME_STEP; if (judo.elapsed_breath > 0.5) add_energy(1); // Reset everything for the next step. judo.dir = 0; judo.move_to = pos.x; }
void Player::step_judo() { auto movement_outcome = [this] () { if (game->right_of_way != id) { if ( fabs(judo.move_to - game->center_of_gravity) > judo.reach){ if ( (judo.dir < 0 && game->center_of_gravity > pos.x) || (judo.dir > 0 && game->center_of_gravity < pos.x) ){ judo.move_to = game->center_of_gravity + (judo.dir * judo.reach); if ( fabs(judo.move_to - pos.x) < 0.75 ) { // prevent wasting tiny steps judo.move_to = pos.x; judo.dir = 0; } } } } else { judo.move_center_by = judo.move_distance * judo.dir; // raycast here? } }; judo.move_center_by = 0; if (currentInputDir != 0) { if (judo.keyReleased) { if (judo.energy >= 0.5) { judo.move_to = pos.x + (judo.move_distance * currentInputDir); judo.dir = currentInputDir; movement_outcome(); spend_energy(0.5); } judo.keyReleased = false; } } else judo.keyReleased = true; // Should stop moving? if (judo.dir < 0) { if (judo.move_to <= pos.x) { if ( vel.x > -judo.move_speed_max ) xDelta -= judo.move_acceleration; } else { vel.x = judo.dir = 0; } } else if (judo.dir > 0) { if (judo.move_to >= pos.x) { if ( vel.x < judo.move_speed_max ) xDelta += judo.move_acceleration; } else { vel.x = judo.dir = 0; } } else { vel.x = 0; } step_normal_test(); facingDirection = (orientation == POS_LEFT) ? 1 : -1; float d = fabs(game->center_of_gravity - pos.x); if (d <= 1.0) balance->setRange(0,0); else if (d <= 2.0) balance->setRange(0.25,0.015); else if (d >= 3.0) balance->setRange(0.75,0.04); balance->set_safe_range_percents(0.25,0.75); // temp placement balance->step(); judo.action = action; if (judo.action && judo.energy >= 1.0) spend_energy(1.0); else judo.action = false; judo.elapsed_breath += TIME_STEP; if (judo.elapsed_breath > 0.5) add_energy(1); }