private void WindowOnKeyPressed(object sender, KeyEventArgs e)
        {
            if (e.Code == Keyboard.Key.C)
            {
                observeTarget = true;
                Audios.Wizard_Union_Selected();
                ToggleTargetObserving?.Invoke(this, true);
            }

            if (e.Code == Keyboard.Key.D)
            {
                showDebugInfo = !showDebugInfo;
            }

            if (e.Code == Keyboard.Key.F)
            {
                showDebugInfo = !showDebugInfo;
                showHealth    = showDebugInfo;
                showMinimap   = showDebugInfo;
                showWayPoints = showDebugInfo;
                // ForceSmooth = showDebugInfo;
            }

            if (e.Code == Keyboard.Key.H)
            {
                showHealth = !showHealth;
            }

            if (e.Code == Keyboard.Key.A)
            {
                if (Audios.EnabledAudio)
                {
                    Audios.DisableAudio();
                }
                Audios.EnabledAudio = !Audios.EnabledAudio;
                ToggleAudio?.Invoke(this, Audios.EnabledAudio);
            }

            if (e.Code == Keyboard.Key.M)
            {
                showMinimap = !showMinimap;
            }

            if (e.Code == Keyboard.Key.W)
            {
                showWayPoints = !showWayPoints;
            }

            if (e.Code == Keyboard.Key.S)
            {
                ForceSmooth = !ForceSmooth;
                if (ForceSmooth)
                {
                    Audios.EnableSmooth();
                }
            }
        }
Beispiel #2
0
        public void Start()
        {
            if (Visualizer != null)
            {
                throw new InvalidOperationException("Visualizer is already initialized.");
            }

            Visualizer = new SfmlVisualizer();
            Visualizer.SetStaticData(this.extendedRunnerModel.Game.LevelUpXpValues.Sum(), this.extendedRunnerModel.Game.LevelUpXpValues.Length);

            Visualizer.ToggleAudio += (sender, enableAudio) =>
            {
                if (enableAudio && BackgroundMusic == null)
                {
                    BackgroundMusic = Audios.PlayBackgroundMusic();
                }
                else if (!enableAudio && BackgroundMusic != null)
                {
                    BackgroundMusic.Stop();
                    BackgroundMusic.Dispose();
                    BackgroundMusic = null;
                }
            };

            Visualizer.ToggleTargetObserving += (sender, observe) =>
            {
                targetUnitId = null;
                targetUnit   = null;
            };

            string debugText = "";

            Visualizer.LeftMousePressed += (sender, position) =>
            {
                debugText = string.Format("{0};{1}", position.X, position.Y);
                Unit nearestUnit = extendedRunnerModel.AllWizards.Values
                                   .Cast <LivingUnit>()
                                   .Union(extendedRunnerModel.AllBuildings.Values)
                                   .Union(extendedRunnerModel.AllMinions.Values)
                                   .Select(
                    x =>
                {
                    var distanceTo = x.GetDistanceTo(position.X, position.Y);
                    return(new
                    {
                        Distance = distanceTo > x.Radius * TargetSelectionRadiusK ? (double?)null : distanceTo,
                        Unit = x
                    });
                })
                                   .Where(x => x.Distance.HasValue)
                                   .OrderBy(x => x.Distance.Value)
                                   .Select(x => x.Unit)
                                   .FirstOrDefault();
                if (nearestUnit != null)
                {
                    bool canObserve = false;
                    if (nearestUnit is Building)
                    {
                        if (nearestUnit.Faction == Faction.Academy)
                        {
                            if (((Building)nearestUnit).Type == BuildingType.FactionBase)
                            {
                                Audios.Union_Base_Selected();
                            }
                            else
                            {
                                Audios.Union_Tower_Selected();
                            }
                        }
                        else if (nearestUnit.Faction == Faction.Renegades)
                        {
                            if (((Building)nearestUnit).Type == BuildingType.FactionBase)
                            {
                                Audios.Enemy_Base_Selected();
                            }
                            else
                            {
                                Audios.Enemy_Tower_Selected();
                            }
                        }
                    }
                    else if (nearestUnit is Wizard)
                    {
                        if (nearestUnit.Faction == Faction.Academy)
                        {
                            Audios.Wizard_Selected_Union();
                            canObserve = true;
                        }
                        else if (nearestUnit.Faction == Faction.Renegades)
                        {
                            Audios.Wizard_Selected_Enemy();
                            canObserve = true;
                        }
                    }
                    else if (nearestUnit is Minion)
                    {
                        if (nearestUnit.Faction == Faction.Academy)
                        {
                            Audios.Minion_Selected_Union(((Minion)nearestUnit).Type == MinionType.FetishBlowdart);
                            canObserve = true;
                        }
                        else if (nearestUnit.Faction == Faction.Renegades)
                        {
                            Audios.Minion_Selected_Enemy(((Minion)nearestUnit).Type == MinionType.FetishBlowdart);
                            canObserve = true;
                        }
                    }
                    if (canObserve)
                    {
                        targetUnitId = nearestUnit.Id;
                        targetUnit   = null;
                        Visualizer.EnableTargetObservation();
                    }
                }
            };
        }
Beispiel #3
0
        private void BeforeMove(object sender, EventArgs e)
        {
            if (extendedRunnerModel.World.TickIndex == 35)
            {
                BackgroundMusic = Audios.PlayBackgroundMusic();
                Audios.Wizard_Union_Start();
            }

            if (targetUnit != null)
            {
                Visualizer.BeginDrawing(targetUnit.X, targetUnit.Y);
            }
            else
            {
                Visualizer.BeginDrawing(extendedRunnerModel.Me.X, extendedRunnerModel.Me.Y);
            }

            Visualizer.DrawBonus(new[] { new Vector2f(1200, 1200), new Vector2f(2800, 2800) }, extendedRunnerModel.World.Bonuses.Select(x => new Vector2f((float)x.X, (float)x.Y)).ToArray());
            Visualizer.DrawMinionRespawn(new[] { new Vector2f(1000, 3750), new Vector2f(850, 3150), new Vector2f(250, 3000) }, true);
            Visualizer.DrawMinionRespawn(new[] { new Vector2f(3000, 250), new Vector2f(3150, 850), new Vector2f(3750, 1000) }, false);

            foreach (var deadUnit in extendedRunnerModel.DeadWizards)
            {
                var unit = deadUnit.Value;
                if (unit.IsUnion)
                {
                    UnitStateSprite?state1 = GetKilledWizardUnionState(unit, extendedRunnerModel.World.TickIndex);
                    if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                    {
                        Audios.KillWizard_Union();
                    }
                    // CorpseState? state2 = state1.HasValue ? null : GetCorpseState(unit, extendedRunnerModel.World.TickIndex);
                    // TODO remove from dictionary if state2 is null
                    Visualizer.DrawDeadWizardUnion(unit.X, unit.Y, unit.Angle, state1, null);
                }
                else
                {
                    UnitStateSprite?state1 = GetKilledWizardEnemyState(unit, extendedRunnerModel.World.TickIndex);
                    if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                    {
                        Audios.KillWizard_Enemy();
                    }
                    // CorpseState? state2 = state1.HasValue ? null : GetCorpseState(unit, extendedRunnerModel.World.TickIndex);
                    // TODO remove from dictionary if state2 is null
                    Visualizer.DrawDeadWizardEnemy(unit.X, unit.Y, unit.Angle, state1, null);
                }
            }
            foreach (var deadUnit in extendedRunnerModel.DeadMinions)
            {
                var             minion = deadUnit.Value;
                UnitStateSprite?state1 = GetKilledMinionState(minion, extendedRunnerModel.World.TickIndex);
                CorpseSprite?   state2 = state1.HasValue ? null : GetCorpseState(minion, extendedRunnerModel.World.TickIndex);
                if (minion.MinionType == MinionType.FetishBlowdart)
                {
                    if (minion.IsUnion)
                    {
                        if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                        {
                            Audios.KillMinion_Union();
                        }
                        Visualizer.DrawDeadFetishBlowdartUnion(minion.X, minion.Y, minion.Angle, state1, state2);
                    }
                    else if (minion.Faction == Faction.Neutral)
                    {
                        if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                        {
                            Audios.KillMinion_Union();
                        }
                        Visualizer.DrawDeadFetishBlowdartNeutral(minion.X, minion.Y, minion.Angle, state1, state2);
                    }
                    else
                    {
                        if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                        {
                            Audios.KillMinion_Enemy();
                        }
                        Visualizer.DrawDeadFetishBlowdartEnemy(minion.X, minion.Y, minion.Angle, state1, state2);
                    }
                }
                else
                {
                    if (minion.IsUnion)
                    {
                        if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                        {
                            Audios.KillMinion_Union();
                        }
                        Visualizer.DrawDeadOrcWoodcutterUnion(minion.X, minion.Y, minion.Angle, state1, state2);
                    }
                    else if (minion.Faction == Faction.Neutral)
                    {
                        if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                        {
                            Audios.KillMinion_Union();
                        }
                        Visualizer.DrawDeadOrcWoodcutterNeutral(minion.X, minion.Y, minion.Angle, state1, state2);
                    }
                    else
                    {
                        if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && extendedRunnerModel.World.TickIndex == deadUnit.Value.TickIndex)
                        {
                            Audios.KillMinion_Enemy();
                        }
                        Visualizer.DrawDeadOrcWoodcutterEnemy(minion.X, minion.Y, minion.Angle, state1, state2);
                    }
                }
            }

            Visualizer.DrawTrees();

            foreach (var deadUnit in extendedRunnerModel.DeadBuildings)
            {
                var building = deadUnit.Value;
                int?state    = GetDestroyedUnitState(building, extendedRunnerModel.World.TickIndex);
                if (Visualizer.IsInWindow(building.X, building.Y) && extendedRunnerModel.World.TickIndex == building.TickIndex)
                {
                    Audios.DestroyBuilding();
                }

                if (building.BuildingType == BuildingType.FactionBase)
                {
                    if (building.IsUnion)
                    {
                        Visualizer.DrawDestroyedBaseUnion(building.X, building.Y, state);
                    }
                    else
                    {
                        Visualizer.DrawDestroyedBaseEnemy(building.X, building.Y, state);
                    }
                }
                else
                {
                    if (building.IsUnion)
                    {
                        Visualizer.DrawDestroyedTowerUnion(building.X, building.Y, state);
                    }
                    else
                    {
                        Visualizer.DrawDestroyedTowerEnemy(building.X, building.Y, state);
                    }
                }
            }
            foreach (var building in extendedRunnerModel.World.Buildings)
            {
                if (building.Type == BuildingType.FactionBase)
                {
                    if (Visualizer.IsInWindow(building.X, building.Y) && building.RemainingActionCooldownTicks >= extendedRunnerModel.Game.FactionBaseCooldownTicks - 1)
                    {
                        Audios.BaseHit();
                    }
                    if (building.IsUnion(extendedRunnerModel.Me))
                    {
                        if (!playedBaseAttack1 && building.Life < building.MaxLife)
                        {
                            playedBaseAttack1 = true; Audios.BaseAttacked_Union();
                        }
                        Visualizer.DrawBaseUnion(building.X, building.Y, building.Radius, building.Life, building.MaxLife, building.CooldownTicks, building.RemainingActionCooldownTicks);
                    }
                    else
                    {
                        Visualizer.DrawBaseEnemy(building.X, building.Y, building.Radius, building.Life, building.MaxLife, building.CooldownTicks, building.RemainingActionCooldownTicks);
                    }
                }
                else
                {
                    if (Visualizer.IsInWindow(building.X, building.Y) && building.RemainingActionCooldownTicks >= extendedRunnerModel.Game.FactionBaseCooldownTicks - 1)
                    {
                        Audios.TowerHit();
                    }
                    if (building.IsUnion(extendedRunnerModel.Me))
                    {
                        if (!playedBaseAttack2 && building.Life < building.MaxLife)
                        {
                            playedBaseAttack2 = true; Audios.TowerAttacked_Union();
                        }
                        Visualizer.DrawTowerUnion(building.X, building.Y, building.Radius, building.Life, building.MaxLife, building.CooldownTicks, building.RemainingActionCooldownTicks);
                    }
                    else
                    {
                        Visualizer.DrawTowerEnemy(building.X, building.Y, building.Radius, building.Life, building.MaxLife, building.CooldownTicks, building.RemainingActionCooldownTicks);
                    }
                }
            }
            foreach (var wizard in extendedRunnerModel.World.Wizards)
            {
                UnitStateSprite stateSprite = GetUnitState(wizard, extendedRunnerModel.World.TickIndex, wizard.RemainingActionCooldownTicks);
                var             isBurning   = wizard.Statuses.Any(x => x.Type == StatusType.Burning);
                var             isFrozen    = wizard.Statuses.Any(x => x.Type == StatusType.Frozen);
                if (wizard.IsUnion(extendedRunnerModel.Me))
                {
                    Visualizer.WizardUnion(wizard.X, wizard.Y, wizard.Angle, wizard.Radius, wizard.Life, wizard.MaxLife, wizard.Xp, wizard.Level, stateSprite, isBurning, isFrozen, wizard.IsMe);
                }
                else
                {
                    Visualizer.WizardEnemy(wizard.X, wizard.Y, wizard.Angle, wizard.Radius, wizard.Life, wizard.MaxLife, wizard.Xp, wizard.Level, stateSprite, isBurning, isFrozen);
                }
                if (Visualizer.IsInWindow(wizard.X, wizard.Y))
                {
                    if (wizard.RemainingCooldownTicksByAction[(int)ActionType.Staff] >= extendedRunnerModel.Game.StaffCooldownTicks - 1)
                    {
                        Audios.Tree();
                    }
                    if (wizard.RemainingCooldownTicksByAction[(int)ActionType.Fireball] >= extendedRunnerModel.Game.FireballCooldownTicks - 1)
                    {
                        Audios.Fireball();
                    }
                    if (wizard.RemainingCooldownTicksByAction[(int)ActionType.FrostBolt] >= extendedRunnerModel.Game.FrostBoltCooldownTicks - 1)
                    {
                        Audios.FrostBolt();
                    }
                    if (wizard.RemainingCooldownTicksByAction[(int)ActionType.Haste] >= extendedRunnerModel.Game.HasteCooldownTicks - 1)
                    {
                        Audios.Haste();
                    }
                    if (wizard.RemainingCooldownTicksByAction[(int)ActionType.Shield] >= extendedRunnerModel.Game.ShieldCooldownTicks - 1)
                    {
                        Audios.Shield();
                    }
                    if (wizard.RemainingCooldownTicksByAction[(int)ActionType.MagicMissile] >= extendedRunnerModel.Game.MagicMissileCooldownTicks - 1)
                    {
                        if (wizard.IsUnion(extendedRunnerModel.Me))
                        {
                            Audios.MagicMissile_Union();
                        }
                        else
                        {
                            Audios.MagicMissile_Enemy();
                        }
                    }
                }
            }

            foreach (var minion in extendedRunnerModel.World.Minions)
            {
                var             isBurning   = minion.Statuses.Any(x => x.Type == StatusType.Burning);
                var             isFrozen    = minion.Statuses.Any(x => x.Type == StatusType.Frozen);
                UnitStateSprite stateSprite = GetUnitState(minion, extendedRunnerModel.World.TickIndex, minion.RemainingActionCooldownTicks);
                if (minion.Type == MinionType.FetishBlowdart)
                {
                    if (minion.IsUnion(extendedRunnerModel.Me))
                    {
                        if (Visualizer.IsInWindow(minion.X, minion.Y) && minion.RemainingActionCooldownTicks >= extendedRunnerModel.Game.FetishBlowdartActionCooldownTicks - 1)
                        {
                            Audios.Axe();
                        }
                        Visualizer.DrawFetishBlowdartUnion(minion.X, minion.Y, minion.Angle, minion.Radius, minion.Life, minion.MaxLife, stateSprite, isBurning, isFrozen);
                    }
                    else if (minion.Faction == Faction.Neutral)
                    {
                        if (Visualizer.IsInWindow(minion.X, minion.Y) && minion.RemainingActionCooldownTicks >= extendedRunnerModel.Game.FetishBlowdartActionCooldownTicks - 1)
                        {
                            Audios.Axe();
                        }
                        Visualizer.DrawFetishBlowdartNeutral(minion.X, minion.Y, minion.Angle, minion.Radius, minion.Life, minion.MaxLife, stateSprite, isBurning, isFrozen, IsNeutralAttacking(minion));
                    }
                    else
                    {
                        if (Visualizer.IsInWindow(minion.X, minion.Y) && minion.RemainingActionCooldownTicks >= extendedRunnerModel.Game.FetishBlowdartActionCooldownTicks - 1)
                        {
                            Audios.Arrow();
                        }
                        Visualizer.DrawFetishBlowdartEnemy(minion.X, minion.Y, minion.Angle, minion.Radius, minion.Life, minion.MaxLife, stateSprite, isBurning, isFrozen);
                    }
                }
                else
                {
                    if (minion.IsUnion(extendedRunnerModel.Me))
                    {
                        if (Visualizer.IsInWindow(minion.X, minion.Y) && minion.RemainingActionCooldownTicks >= extendedRunnerModel.Game.OrcWoodcutterActionCooldownTicks - 1)
                        {
                            Audios.OrcHit();
                        }
                        Visualizer.DrawOrcWoodcutterUnion(minion.X, minion.Y, minion.Angle, minion.Radius, minion.Life, minion.MaxLife, stateSprite, isBurning, isFrozen);
                    }
                    else if (minion.Faction == Faction.Neutral)
                    {
                        if (Visualizer.IsInWindow(minion.X, minion.Y) && minion.RemainingActionCooldownTicks >= extendedRunnerModel.Game.OrcWoodcutterActionCooldownTicks - 1)
                        {
                            Audios.OrcHit();
                        }
                        Visualizer.DrawOrcWoodcutterNeutral(minion.X, minion.Y, minion.Angle, minion.Radius, minion.Life, minion.MaxLife, stateSprite, isBurning, isFrozen, IsNeutralAttacking(minion));
                    }
                    else
                    {
                        if (Visualizer.IsInWindow(minion.X, minion.Y) && minion.RemainingActionCooldownTicks >= extendedRunnerModel.Game.OrcWoodcutterActionCooldownTicks - 1)
                        {
                            Audios.SwordHit();
                        }
                        Visualizer.DrawOrcWoodcutterEnemy(minion.X, minion.Y, minion.Angle, minion.Radius, minion.Life, minion.MaxLife, stateSprite, isBurning, isFrozen);
                    }
                }
            }
            foreach (var projectile in extendedRunnerModel.World.Projectiles)
            {
                if (projectile.IsUnion(extendedRunnerModel.Me))
                {
                    if (projectile.Type == ProjectileType.MagicMissile)
                    {
                        Visualizer.DrawMagicMissle_Union(projectile.X, projectile.Y, projectile.Angle);
                    }
                    else if (projectile.Type == ProjectileType.Dart)
                    {
                        Visualizer.DrawDart_Union(projectile.X, projectile.Y, projectile.Angle);
                    }
                    else if (projectile.Type == ProjectileType.Fireball)
                    {
                        Visualizer.DrawFireball_Union(projectile.X, projectile.Y, projectile.Angle);
                    }
                    else if (projectile.Type == ProjectileType.FrostBolt)
                    {
                        Visualizer.DrawFrostBolt_Union(projectile.X, projectile.Y, projectile.Angle);
                    }
                }
                else // TODO neutral
                {
                    if (projectile.Type == ProjectileType.MagicMissile)
                    {
                        Visualizer.DrawMagicMissle_Enemy(projectile.X, projectile.Y, projectile.Angle);
                    }
                    else if (projectile.Type == ProjectileType.Dart)
                    {
                        Visualizer.DrawDart_Enemy(projectile.X, projectile.Y, projectile.Angle);
                    }
                    else if (projectile.Type == ProjectileType.Fireball)
                    {
                        Visualizer.DrawFireball_Enemy(projectile.X, projectile.Y, projectile.Angle);
                    }
                    else if (projectile.Type == ProjectileType.FrostBolt)
                    {
                        Visualizer.DrawFrostBolt_Enemy(projectile.X, projectile.Y, projectile.Angle);
                    }
                }
            }

            var deadProjectilesInVisibleArea = extendedRunnerModel.DeadProjectiles.Where(x => Visualizer.IsInVisibleArea(x.Value.X, x.Value.Y)).ToDictionary(x => x.Key, x => x.Value);

            foreach (var deadUnit in deadProjectilesInVisibleArea)
            {
                var projectile = deadUnit.Value;
                if (projectile.ProjectileType == ProjectileType.MagicMissile)
                {
                    if (projectile.IsUnion)
                    {
                        // if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && deadUnit.Value.IsTargetTree && extendedRunnerModel.World.TickIndex <= deadUnit.Value.TickIndex) Audios.Tree();
                        Visualizer.DrawMagicMissleAtTarget_Union(deadUnit.Value.X, deadUnit.Value.Y, Visualizer.GetNumberDependingOnIndex <MagicMissleSprite>(4));
                    }
                    else
                    {
                        // if (Visualizer.IsInWindow(deadUnit.Value.X, deadUnit.Value.Y) && deadUnit.Value.IsTargetTree && extendedRunnerModel.World.TickIndex <= deadUnit.Value.TickIndex) Audios.Tree();
                        Visualizer.DrawMagicMissleAtTarget_Enemy(deadUnit.Value.X, deadUnit.Value.Y, Visualizer.GetNumberDependingOnIndex <MagicMissleSprite>(4));
                    }
                }
            }

            foreach (var pair in extendedRunnerModel.CurrentBuildingTargets)
            {
                var buildingUnit        = extendedRunnerModel.CurrentBuildings[pair.Key];
                var buildingUnitTargets = pair.Value;
                foreach (var unit in buildingUnitTargets)
                {
                    Visualizer.DrawLine(buildingUnit.X, buildingUnit.Y, unit.X, unit.Y, 0xFFFFFF44);
                    if (buildingUnit.RemainingActionCooldownTicks != 0)
                    {
                        if (buildingUnit.RemainingActionCooldownTicks == 1)
                        {
                            buildingShoots.Add(new AnimatedUnitInfo(unit.X, unit.Y,
                                                                    extendedRunnerModel.World.TickIndex));
                        }
                        else
                        {
                            const double radius = 10;
                            var          max    = buildingUnit.CooldownTicks;
                            var          i      = (max - buildingUnit.RemainingActionCooldownTicks);
                            var          xC     = buildingUnit.X - (buildingUnit.X - unit.X) * i / max;
                            var          yC     = buildingUnit.Y - (buildingUnit.Y - unit.Y) * i / max;
                            // Visualizer.Circle(xC, yC, radius, 0xFFFFFF00 + (byte) (200* buildingUnit.RemainingActionCooldownTicks / max), true);
                            Visualizer.DrawCircle(xC, yC, radius, 0x000000AA, false);
                            Visualizer.DrawLine(xC, yC - radius, xC, yC + radius, 0x000000AA);
                            Visualizer.DrawLine(xC - radius, yC, xC + radius, yC, 0x000000AA);
                        }
                    }
                }
            }

            foreach (var info in buildingShoots)
            {
                Visualizer.BuildingShoot(info.X, info.Y, Visualizer.GetNumberDependingOnIndex <BuildingShoortSprite>(4));
            }

            buildingShoots = buildingShoots
                             .Where(x => extendedRunnerModel.World.TickIndex < x.TickIndex + 5 * 4)
                             .ToList();

            if (targetUnit != null)
            {
                Visualizer.DrawCircle(targetUnit.X, targetUnit.Y, targetUnit.Radius * TargetSelectionRadiusK, 0xFFFFFFFF);
            }
        }