public Missile(HeroInBattle hero, BattlefieldTile target) { Hero = hero; SourceTile = hero.CurrentTile; DestTile = target; StepsPassed = 0; Debug.Assert(SourceTile != null); Debug.Assert(DestTile != null); // Считаем количество шагов до цели // Для этого вычисляем расстояние в клетках и делим на скорость double distance = Utils.DistanceBetweenPoints(SourceTile.Coord, DestTile.Coord); // Костыль для магов if (hero.PlayerHero.RangeWeapon != null) { StepsToTarget = (int)(distance / hero.PlayerHero.RangeWeapon.VelocityMissile * FormMain.Config.StepsInSecond); } else { StepsToTarget = (int)(distance / 5 * FormMain.Config.StepsInSecond); } Debug.Assert(StepsToTarget > 0); }
internal int CalcDamageShoot(HeroInBattle target) { int delta = Parameters.MaxArcherDamage - Parameters.MinArcherDamage; int value = FormMain.Rnd.Next(delta); int d = Parameters.MaxArcherDamage;// Parameters.MinArcherDamage + value; return(d); }
internal int CalcDamageMelee(HeroInBattle target) { int delta = Parameters.MaxMeleeDamage - Parameters.MinMeleeDamage; int value = FormMain.Rnd.Next(delta); int d = Parameters.MaxMeleeDamage;// Parameters.MinMeleeDamage + value; return(d); }
internal int CalcDamageMagic(HeroInBattle target) { int d = Parameters.MagicDamage; return(d); }
//internal int MoveStepPaa // Делает шаг битвы internal void DoStepBattle(Battle b) { Debug.Assert(IsLive == true); Debug.Assert(CurrentTile != null); priorState = State; if (inRollbackAfterAction == false) { switch (State) { case StateHeroInBattle.None: Debug.Assert(Target == null); Debug.Assert(countAction == 0); Debug.Assert(CurrentHealth > 0); Debug.Assert(IsLive == true); // Если сейчас ничего не выполняем, ищем, что можно сделать // Сначала пробуем атаковать стрелковым оружием if (((PlayerHero.RangeWeapon != null) && (QuantityArrows > 0)) || (PlayerHero.TypeCreature.ID == "Cleric") || (PlayerHero.TypeCreature.ID == "Mage")) { bool underMeleeAttack = false; // Если юнит не атакован врукопашную, можно атаковать стрелковой атакой foreach (HeroInBattle h in b.ActiveHeroes) { if ((h != this) && (h.Target == this) && (h.State == StateHeroInBattle.MeleeAttack)) { underMeleeAttack = true; break; } } if (!underMeleeAttack) { SearchTargetForShoot(); } } if (Target == null) { if (!SearchTargetForMelee()) { // Если целей нет, идем к ней if (Target == null) { if (SearchTargetForMove() == true) { State = StateHeroInBattle.Move; countAction = (int)(TimeMove() * 1.00 * ((TileForMove.X != 0) && (TileForMove.Y != 0) ? 1.4 : 1)); timeAction = countAction; inRollbackAfterAction = false; //State = StateHeroInBattle.PrepareMove; } } } } break; case StateHeroInBattle.MeleeAttack: countAction--; if (Target.State != StateHeroInBattle.Tumbstone) { if (countAction == 0) { // Делаем удар по противнику Target.GetDamage(CalcDamageMelee(Target), CalcDamageShoot(Target), CalcDamageMagic(Target)); LastTarget = Target.Coord; Target = null; // После удара делаем паузу длиной во время атаки countAction = TimeAttack(); inRollbackAfterAction = true; } } else { // Противника уже убили, пропускаем ход LastTarget = Target.Coord; Target = null; State = StateHeroInBattle.None; countAction = timeAction - countAction; timeAction = countAction; inRollbackAfterAction = true; } break; case StateHeroInBattle.RangeAttack: case StateHeroInBattle.Cast: countAction--; if (Target.State != StateHeroInBattle.Tumbstone) { if (countAction == 0) { // Делаем удар по противнику LastTarget = Target.Coord; Target = null; // После удара делаем паузу длиной во время атаки countAction = TimeAttack(); inRollbackAfterAction = true; } } else { // Противника уже убили, пропускаем ход LastTarget = Target.Coord; Target = null; State = StateHeroInBattle.None; countAction = timeAction - countAction; timeAction = countAction; inRollbackAfterAction = true; } break; case StateHeroInBattle.Tumbstone: Debug.Assert(Target == null); countAction--; if (countAction == 0) { IsLive = false; State = StateHeroInBattle.Dead; currentTile.Unit = null; currentTile = null; } else { // Если осталось шагов меньше, чем шагов на исчезновение, то надо перерисовать иконку if (countAction <= FormMain.Config.UnitStepsTimeToDisappearance) { inDisappearance = true; needRedraw = true; } } break; case StateHeroInBattle.Move: Debug.Assert(TileForMove != null); Debug.Assert(TileForMove.Unit == null); countAction--; if (countAction == 0) { Debug.Assert(TileForMove.ReservedForMove == this); // Пришли на тайл Target = null; CurrentTile = TileForMove; TileForMove.ReservedForMove = null; TileForMove = null; if (PathToDestination.Count() > 1) { // Заново осматриваемся State = StateHeroInBattle.None; /*TileForMove = PathToDestination.First(); * PathToDestination.RemoveAt(0); * countAction = TimeMove(); * timeAction = countAction;*/ } else { // Пришли на конечный тайл State = StateHeroInBattle.None; } PathToDestination = null; DestinationForMove = null; } break; default: break; } } else { countAction--; if (countAction == 0) { LastTarget = default; State = StateHeroInBattle.None; inRollbackAfterAction = false; } } if (priorState != State) { needRedraw = true; } bool SearchTargetForMelee() { // Ищем, кого атаковать List <HeroInBattle> targets = new List <HeroInBattle>(); foreach (HeroInBattle h in b.ActiveHeroes) { // Собираем список вражеских героев вокруг себя if (h.IsLive == true) { if (h.Player != Player) { if (h.CurrentHealth > 0) { if (IsNeighbour(h) == true) { targets.Add(h); } } } } } if (targets.Count > 0) { Debug.Assert(this != targets[0]); State = StateHeroInBattle.MeleeAttack; Target = targets[0]; countAction = TimeAttack(); timeAction = countAction; return(true); } else { return(false); } } bool SearchTargetForShoot() { //Debug.Assert(PlayerHero.RangeWeapon != null); // Если герой, по которому стреляли, жив, атакуем его снова if ((lastAttackedHero != null) && (lastAttackedHero.CurrentHealth > 0)) { Target = lastAttackedHero; } else { // Ищем, кого атаковать List <HeroInBattle> targets = new List <HeroInBattle>(); foreach (HeroInBattle h in b.ActiveHeroes) { // Собираем список вражеских героев if (h.Player != Player) { if (h.CurrentHealth > 0) { targets.Add(h); } } } if (targets.Count > 0) { Debug.Assert(this != targets[0]); Target = targets[0];// targets[Battle.Rnd.Next(0, targets.Count - 1)]; } } if (Target != null) { State = StateHeroInBattle.RangeAttack; countAction = TimeAttack(); timeAction = countAction; lastAttackedHero = Target; // Создаем выстрел if (PlayerHero.RangeWeapon != null) { Debug.Assert(QuantityArrows > 0); Battle.Missiles.Add(new Arrow(this, Target.CurrentTile)); QuantityArrows--; } else { Battle.Missiles.Add(new MagicStrike(this, Target.CurrentTile)); } return(true); } else { return(false); } } bool IsNeighbour(HeroInBattle hb) { Debug.Assert(this != hb); return(currentTile.IsNeighbourTile(hb.currentTile)); } }
public Arrow(HeroInBattle hero, BattlefieldTile target) : base(hero, target) { penArrow = new Pen(FormMain.Config.ColorEntity(Hero.PlayerHero.BattleParticipant == Hero.Battle.Player1)); penArrow.Width = 2; penArrow.CustomEndCap = new System.Drawing.Drawing2D.AdjustableArrowCap(4.0F, 8.0F, true); }
public MagicStrike(HeroInBattle hero, BattlefieldTile target) : base(hero, target) { brush = new SolidBrush(FormMain.Config.ColorEntity(Hero.PlayerHero.BattleParticipant == Hero.Battle.Player1)); }