int getInitialActionPoints(Trooper tr) { var points = tr.InitialActionPoints; if (CommanderId != -1 && tr.GetDistanceTo(state.Position[CommanderId].X, state.Position[CommanderId].Y) <= game.CommanderAuraRange) { points += game.CommanderAuraBonusActionPoints; } return(points); }
private double getDanger(Trooper opp, int x, int y, int st, int h) { if (GetPlayer(opp.PlayerId) != null && GetPlayer(opp.PlayerId).IsStrategyCrashed) { return(0); } // Чтобы не бояться одного снайпера var oppShootingRange = state.opphit.Count(e => e > 0) == 1 && opp.Type == TrooperType.Sniper ? GetVisionRange(opp, Troopers[state.id], state.Stance) : GetShootingRange(opp, opp.Stance); int d = GetDistanceToShoot((int)(oppShootingRange + Eps), opp.X, opp.Y, GetStanceId(opp.Stance), x, y, st); // если он достреливает сразу: if (d == 0) { return(200); } int v; if (world.IsVisible(GetVisionRange(opp, Troopers[state.id], state.Stance), opp.X, opp.Y, opp.Stance, x, y, GetStance(state.Stance))) { v = 0; } else { v = GetDistanceTo((int)(GetVisionRange(opp, Troopers[state.id], state.Stance) + Eps), opp.X, opp.Y, GetStanceId(opp.Stance), x, y, st); } double visiblePenalty = 50 * (v == 0 ? 1 : Math.Exp(-v)); var oppAct = opp.InitialActionPoints; if (opp.Type != TrooperType.Scout && opp.Type != TrooperType.Soldier && OpponentCommander != null && OpponentCommander.GetDistanceTo(opp) <= game.CommanderAuraRange) { oppAct += game.CommanderAuraBonusActionPoints; } // если он подходит и убивает int act = oppAct - d * 2; // TODO: ??? int can = act / opp.ShootCost; double dam = can * opp.StandingDamage; if (dam >= h) { return(150 + visiblePenalty); } // если он подходит и отнимает жизни // тогда теперь он вынужден отбегать act = oppAct - (d * 2) * 2; // TODO: ??? can = act / opp.ShootCost; dam = Math.Max(0, can * opp.StandingDamage) + visiblePenalty; if (dam <= 0) { return(0); } return(dam); }