/* ** 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); }
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; }