Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }