示例#1
0
文件: cas.c 项目: gvaf/Estimo
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;
    }
示例#2
0
文件: step.cpp 项目: blaketrahan/King
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;
}
示例#3
0
文件: step.cpp 项目: blaketrahan/King
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);
}