Пример #1
0
/*
** Will check if an option like l or h is here
*/
int	my_check_lh(const char *str, t_ptr_fun *s, int i, char c)
{
  int	flag;

  flag = 0;
  if (str[i] == c && str[i + 1] != 0 &&
      (flag = my_pos(s->tab, str[i + 1])) <= 6)
    return (flag);
  return (-1);
}
Пример #2
0
int     my_getnbr_base(char *str, char *base, int j, int limit)
{
  int   sign;
  int   result;

  sign = 1;
  result = 0;
  if (str[j + 1] != '\0' && str[j + 2] != '\0')
    j += 2;
  while (limit > 0)
    {
      while ((str[j] >= '0' && str[j] <= '9') || (str[j] >= 'a' && str[j] <= 'z'))
	{
	  result = (result * my_strlen(base)) + my_pos(str[j], base);
	  if (result < 0)
	    return (0);
	  j++;
	}
      limit--;
    }
  return (my_putchar((char)(result)));
}
/*!

 */
bool
Body_GoToPoint2009::doOmniDash( PlayerAgent * agent )
{
    const ServerParam & SP = ServerParam::i();
    const WorldModel & wm = agent->world();

    const Vector2D inertia_point = wm.self().inertiaPoint( M_cycle );
    Vector2D target_rel = M_target_point - inertia_point;
    target_rel.rotate( - wm.self().body() );

    if ( target_rel.absY() < M_dist_thr )
    {
#ifdef DEBUG_PRINT
        dlog.addText( Logger::ACTION,
                      __FILE__": (doOmniDash) target_y_diff=%.3f, omni dash is not required.",
                      target_rel.y );
#endif
        return false;
    }

    const AngleDeg target_angle = target_rel.th();

    if ( target_angle.abs() < M_dir_thr )
    {
#ifdef DEBUG_PRINT
        dlog.addText( Logger::ACTION,
                      __FILE__": (doOmniDash) target_angle=%.3f dir_thr=%.3f omni dash is not required.",
                      target_angle.degree(), M_dir_thr );
#endif
        return false;
    }

    if ( target_rel.absY() > 3.0 ) // XXX magic number XXX
    {
#ifdef DEBUG_PRINT
        dlog.addText( Logger::ACTION,
                      __FILE__": (doOmniDash) big y diff. target_y_diff=%.3f",
                      target_rel.y );
#endif
        return false;
    }

    const AngleDeg target_rel_angle = target_rel.th();

    const Vector2D rel_vel = wm.self().vel().rotatedVector( - wm.self().body() );

    const double dash_angle_step = std::max( 15.0, SP.dashAngleStep() );
    const double min_dash_angle = ( -180.0 < SP.minDashAngle() && SP.maxDashAngle() < 180.0
                                    ? SP.minDashAngle()
                                    : dash_angle_step * static_cast< int >( -180.0 / dash_angle_step ) );
    const double max_dash_angle = ( -180.0 < SP.minDashAngle() && SP.maxDashAngle() < 180.0
                                    ? SP.maxDashAngle() + dash_angle_step * 0.5
                                    : dash_angle_step * static_cast< int >( 180.0 / dash_angle_step ) - 1.0 );

    double best_dir = -360.0;
    int best_cycle = 1000;
    double best_dash_power = 0.0;
    double best_stamina = 0.0;

    for ( double dir = min_dash_angle;
          dir < max_dash_angle;
          dir += dash_angle_step )
    {
        if ( std::fabs( dir ) < 0.5 ) continue;
        if ( std::fabs( dir ) > 100.0 ) continue;

        const AngleDeg dash_angle = SP.discretizeDashAngle( SP.normalizeDashAngle( dir ) );

        if ( ( dash_angle - target_rel_angle ).abs() > 90.0 )
        {
#ifdef DEBUG_PRINT
            dlog.addText( Logger::ACTION,
                          "__ dir=%.1f, invalid direction. continue",
                          dash_angle.degree() );
#endif
            continue;
        }

        const double dash_rate = wm.self().dashRate() * SP.dashDirRate( dir );

#ifdef DEBUG_PRINT
        dlog.addText( Logger::ACTION,
                      "__ dir=%.1f, dash_rate=%f",
                      dash_angle.degree(), dash_rate );
#endif
        //
        // check if player can adjust y diff within 3 dashes.
        //

        const int max_cycle = std::min( 2, M_cycle );

        Vector2D my_pos( 0.0, 0.0 );
        Vector2D my_vel = rel_vel;
        StaminaModel stamina_model = wm.self().staminaModel();
        double first_dash_power = -1.0;

        my_pos = wm.self().playerType().inertiaPoint( my_pos, rel_vel, max_cycle );

        int cycle = 1;
        for ( ; cycle <= max_cycle; ++cycle )
        {
            Vector2D required_move = target_rel - my_pos;
            required_move.rotate( - dash_angle );

            double required_x_accel
                = calc_first_term_geom_series( required_move.x,
                                               wm.self().playerType().playerDecay(),
                                               M_cycle );

            if ( required_x_accel < 0.01 )
            {
                break;
            }

            double required_dash_power = required_x_accel / dash_rate;
            double available_stamina = ( M_save_recovery
                                         ? std::max( 0.0, stamina_model.stamina() - SP.recoverDecThrValue() - 1.0 )
                                         : stamina_model.stamina() + wm.self().playerType().extraStamina() );

            double dash_power = std::min( available_stamina, M_max_dash_power );
            dash_power = std::min( dash_power, required_dash_power );
            dash_power = std::min( dash_power, SP.maxDashPower() );

            if ( cycle == 0 )
            {
                first_dash_power = dash_power;
            }

            Vector2D accel = Vector2D::polar2vector( dash_power * dash_rate,
                                                     dash_angle );

#ifdef DEBUG_PRINT
            dlog.addText( Logger::ACTION,
                          "____ cycle=%d requied_accel=%.3f required_power=%.3f available_stamina=%.1f dash_power=%.1f",
                          cycle, required_x_accel, required_dash_power,
                          available_stamina, dash_power );
#endif
            my_vel += accel;
            my_pos += my_vel;
            my_vel *= wm.self().playerType().playerDecay();

            stamina_model.simulateDash( wm.self().playerType(), dash_power );
        }

        if ( first_dash_power < 0.0 )
        {
            continue;
        }

        my_pos = wm.self().playerType().inertiaPoint( my_pos, my_vel, M_cycle - cycle );

#ifdef DEBUG_PRINT
        dlog.addText( Logger::ACTION,
                      "__ dir=%.1f y_diff=%.3f cycle=%d requied_accel=%.3f required_power=%.3f dash_power=%.1f stamina=%.1f",
                      dir, target_rel.y - my_pos.y,
                      cycle, first_dash_power, best_stamina );
#endif

        if ( std::fabs( target_rel.y - my_pos.y ) < M_dist_thr )
        {
            if ( best_cycle > cycle )
            {
                best_dir = dir;
                best_cycle = cycle;
                best_dash_power = first_dash_power;
                best_stamina = stamina_model.stamina();
#ifdef DEBUG_PRINT
                dlog.addText( Logger::ACTION,
                              "update(1) dir=%.1f cycle=%d power=%.1f stamina=%.1f",
                              dir, best_cycle, best_dash_power, best_stamina );
#endif
            }
            else if ( best_cycle == cycle )
            {
                if ( best_stamina < stamina_model.stamina() )
                {
                    best_dir = dir;
                    best_cycle = cycle;
                    best_dash_power = first_dash_power;
                    best_stamina = stamina_model.stamina();
#ifdef DEBUG_PRINT
                    dlog.addText( Logger::ACTION,
                                  "update(2) dir=%.1f cycle=%d power=%.1f stamina=%.1f",
                                  dir, best_cycle, best_dash_power, best_stamina );
#endif
                }
            }
        }
    }

    if ( best_dir != -360.0 )
    {
        AngleDeg dash_angle = SP.discretizeDashAngle( SP.normalizeDashAngle( best_dir ) );
#ifdef DEBUG_PRINT
        std::cerr << wm.self().unum() << ' ' << wm.time()
                  << " GoToPoint omnidash power=" << best_dash_power << " dir="  << best_dir
                  << std::endl;
        agent->debugClient().addMessage( "OmniDash%.0f", best_dir );
        dlog.addText( Logger::ACTION,
                      __FILE__": (doOmniDash) power=%.3f dir=%.1f",
                      best_dash_power, dash_angle.degree() );
#endif
        return agent->doDash( best_dash_power, dash_angle );
    }

    return false;
}