public static void Action(NagibatorTank me, CustomEvent e) { Console.WriteLine($"{nameof(OnCustomEventModule)}: {e.Condition.Name}"); //if (e.Condition.Name.Equals("too_close_to_walls")) // me.MoveDirection *= -1; }
public static void Action(NagibatorTank me, RobotDeathEvent e) { Console.WriteLine($"{nameof(OnRobotDeathModule)}: {e.Name}"); if (me.Target?.Equals(e.Name) == true) { me.Target = null; Console.WriteLine($"{nameof(OnRobotDeathModule)}: Set target to NULL"); } }
public static void SendMessage(NagibatorTank me, Dictionary <string, string> message) { var strMessage = string.Join(Separator.ToString(), message.Select(m => $"{m.Key}{KvpSeparator}{m.Value}")); foreach (var teammate in me.Teammates) { me.SendMessage(teammate, strMessage); } }
public static void NewTargetAction(NagibatorTank me, Dictionary <string, string> message) { Console.WriteLine($"{nameof(ActionModule)}: Got new target {message[Name]}"); me.Target = message[Name]; me.TargetPoint = new Point { X = double.Parse(message[X]), Y = double.Parse(message[Y]) }; me.TargetBearing = double.Parse(message[Bearing]); me.TargetDistance = double.Parse(message[Distance]); Action(me); }
public static void Action(NagibatorTank me, MessageEvent e) { Console.WriteLine($"{nameof(OnMessageReceivedModule)}: {e.Message}"); var message = MessageHelper.ReadMessage(e.Message.ToString()); switch (message[MessageType]) { case EnemyPositionMessage.Type: ActionModule.NewTargetAction(me, message); break; default: return; } }
public static double GetFirePower(NagibatorTank me, ScannedRobotEvent e, Point newTargetPosition) { double firePower = Math.Min(400 / e.Distance, 3); if (me.TargetPoint == null || newTargetPosition == null) { return(firePower); } if (IsTheSamePosition(me.TargetPoint, newTargetPosition) || e.Energy < 3) { return(3); } if (Math.Abs(Math.Abs(e.Heading) - Math.Abs(me.GunHeading)) < 3) { return(firePower * 1.5); } return(firePower); }
public static void Action(NagibatorTank me) { if (me.TargetPoint == null) { Console.WriteLine($"{nameof(ActionModule)}: no target!"); return; } var angleToTarget = Math.Atan2(me.TargetPoint.X - me.X, me.TargetPoint.Y - me.Y); Console.WriteLine($"{nameof(ActionModule)}: angle to target {angleToTarget}"); me.TurnGunRightRadians(Utils.NormalRelativeAngle(angleToTarget - me.GunHeadingRadians)); if (me.IsMovingToEnemy) { me.IsMovingToEnemy = me.TargetDistance <= 300; Console.WriteLine($"{nameof(ActionModule)}: [{nameof(me.IsMovingToEnemy)}:{me.IsMovingToEnemy}]"); } else { me.IsMovingToEnemy = me.TargetDistance >= 700; Console.WriteLine($"{nameof(ActionModule)}: [{nameof(me.IsMovingToEnemy)}:{me.IsMovingToEnemy}]"); } if (me.IsMovingToEnemy) { var x = me.TargetPoint.X - me.X; var y = me.TargetPoint.Y - me.Y; var goAngle = Utils.NormalRelativeAngle(Math.Atan2(x, y) - me.HeadingRadians); me.SetTurnRightRadians(Math.Atan(Math.Tan(goAngle))); me.SetAhead(Math.Cos(goAngle) * Hypotenuse(x, y) - 500); } else { if (Random.Next(0, 100) > 98 || me.Velocity == 0) { me.MoveDirection *= -1; } me.SetTurnRight(me.TargetBearing + 90); me.SetAhead(1000 * me.MoveDirection); } }
public static void Action(NagibatorTank me, ScannedRobotEvent e) { try { if (me.IsTeammate(e.Name)) { return; } Console.WriteLine($"{nameof(OnScannedRobotModule)}: spotted [{e.Name}]. My target is [{me.Target}]"); var enemyPosition = CoordHelper.GetEnemyCoordinate(me.Heading, me.Status, e); if (string.IsNullOrWhiteSpace(me.Target)) { Console.WriteLine($"{nameof(OnScannedRobotModule)}: Setting team target {e.Name}"); me.Target = e.Name; } if (me.Target.Equals(e.Name)) { //me.SetTurnRadarRight(2.0 * Utils.NormalRelativeAngleDegrees(me.Heading + e.Bearing - me.RadarHeading)); ActionModule.Action(me); Console.WriteLine($"{nameof(OnScannedRobotModule)}: Fire to {e.Name}"); me.Fire(FireHelper.GetFirePower(me, e, enemyPosition)); MessageHelper.SendMessage(me, new Dictionary <string, string> { [Constants.MessageType] = Constants.EnemyPositionMessage.Type, [Name] = e.Name, [X] = enemyPosition.X.ToString(CultureInfo.InvariantCulture), [Y] = enemyPosition.Y.ToString(CultureInfo.InvariantCulture), [Bearing] = e.Bearing.ToString(CultureInfo.InvariantCulture), [Distance] = e.Distance.ToString(CultureInfo.InvariantCulture) }); me.TargetPoint = enemyPosition; } } catch (Exception ex) { Console.WriteLine($"{nameof(OnScannedRobotModule)}: {ex}"); } }
public static void Action(NagibatorTank me) { Console.WriteLine("Loop started"); me.SetTurnRadarRight(double.PositiveInfinity); if (me.CurrentEnemiesAlive != me.Others) { me.Target = null; me.CurrentEnemiesAlive = me.Others; } if (!string.IsNullOrWhiteSpace(me.Target)) { ActionModule.Action(me); } else { me.Ahead(5000); me.TurnRight(90); } }
public static void Action(NagibatorTank me) { Console.WriteLine("I'm started"); me.IsAdjustGunForRobotTurn = true; foreach (var gameEvent in me.GetAllEvents()) { switch (gameEvent) { case DeathEvent deathEvent: deathEvent.Priority = 0; break; case StatusEvent statusEvent: statusEvent.Priority = 1; break; case ScannedRobotEvent scannedRobotEvent: scannedRobotEvent.Priority = 2; break; case MessageEvent messageEvent: messageEvent.Priority = 3; break; } } var triggerHitCondition = new Condition("too_close_to_walls", c => { const int wallMargin = 300; return( (me.X <= wallMargin || me.X >= me.BattleFieldWidth - wallMargin || me.Y <= wallMargin || me.Y >= me.BattleFieldHeight - wallMargin) ); }); me.AddCustomEvent(triggerHitCondition); }
public static void Action(NagibatorTank me, StatusEvent e) { me.Status = e.Status; }