private void ChooseMovement() { var dec = UnityEngine.Random.Range(-1, 4); switch (dec) { case 0: decision = MovementDecision.NOTHING; break; case 1: decision = MovementDecision.RANDOM_DIRECTION; calculateRandomDir = true; break; case 2: decision = MovementDecision.STRAFE_LEFT; break; case 3: decision = MovementDecision.STRAFE_RIGHT; break; } }
protected override EnvShooter.Action GetAction() { Vector2 move_target = new Vector2(this.Pos.X, 20); Vector2 aim_target = new Vector2(0, 0); if (env.Bullets.Length == 0) { move_target.Y = this.Pos.Y; } EnvShooter.Bot[] bots = this.enemies.ToList().FindAll(x => x.Alive).ToArray(); aim_target = bots[rand.Next(bots.Length)].Pos; bool do_charge = false;//this.Id == 0; Bullet[] collectible_bullets = this.env.Bullets.ToList().FindAll(x => x.Collectible).ToArray(); Bullet[] active_bullets = this.env.Bullets.ToList().FindAll(x => !x.Collectible).ToArray(); Vector2[,] bullet_poses = BulletSim3.Get_Bullet_Poses(active_bullets, this.map, frames_till_hit_max); /* MOVEMENT START */ MovementDecision md = new MovementDecision(bullet_poses); // Add the most desired position first and least desired one last // 1. Get out of danger Zone if (InMortalDanger(this.Pos, enemies[0].Pos)) { Vector2 rel_vec = -(enemies[0].Pos - this.Pos); if (!IsPosInWall(this.Pos + rel_vec)) { md.desired_poses.Add(TargetToNextFramePos(this.Pos + rel_vec)); } } // 2. Get to collectable List <Tuple <float, Vector2> > collectible_dists = collectible_bullets.Select(x => new Tuple <float, Vector2>(Vector2.Distance(x.Pos, this.Pos), x.Pos)).ToList(); collectible_dists.OrderBy(x => x.Item1); for (int i = 0; i < collectible_dists.Count; i++) { if (!InMortalDanger(collectible_dists[i].Item2, enemies[0].Pos)) { md.desired_poses.Add(TargetToNextFramePos(collectible_dists[i].Item2)); } } //if (!InMortalDanger(new Vector2(9, 9), enemies[0].Pos) && // !InNoChargeSafeZone(new Vector2(9, 9), enemies[0].Pos)) // md.desired_poses.Add(TargetToNextFramePos(new Vector2(9, 9))); // 3. Get to edge of no charge safe zone if (InSafety(this.Pos, enemies[0].Pos)) { Vector2 rel_vec = (enemies[0].Pos - this.Pos); if (!IsPosInWall(this.Pos + rel_vec)) { md.desired_poses.Add(TargetToNextFramePos(this.Pos + rel_vec)); } } else if (InNoChargeSafeZone(this.Pos, enemies[0].Pos)) { Vector2 rel_vec = -(enemies[0].Pos - this.Pos); if (!IsPosInWall(this.Pos + rel_vec)) { md.desired_poses.Add(TargetToNextFramePos(this.Pos + rel_vec)); } } // Add backup targets Vector2[] move_vecs = new Vector2[] { new Vector2(1, -1), new Vector2(1, 0), new Vector2(1, 1), new Vector2(0, 1), new Vector2(-1, 1), new Vector2(-1, 0), new Vector2(-1, -1), new Vector2(0, -1) }; for (int i = 0; i < move_vecs.Length; i++) { md.desired_poses.Add(TargetToNextFramePos(this.Pos + move_vecs[i])); } md.desired_poses.Add(Vector2.Zero); move_target = md.GetOptimalPos(this.Pos); /* MOVEMENT END */ color = md.IsMovementTargetSafe == true ? Color.DeepPink : Color.Purple; /* CHARGE START */ if (InMortalDanger(move_target, enemies[0].Pos) || md.IsMovementTargetSafe == false) { do_charge = false; } else { // Fully charged if (this.Charge >= 0.95) { // Only shoot in no charge safety zone if (InNoChargeSafeZone(this.Pos, enemies[0].Pos)) { do_charge = false; } else { do_charge = true; } } else { do_charge = true; } } /* CHARGE END */ //if (this.Id == 0) // do_charge = false; EnvShooter.Action action = GoToXY(move_target); action.aim = AimToPos(aim_target); action.charge = do_charge; return(action); }