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); } }