public BattleEngine(Controller controller, Heroes.Core.Hero attacker, Heroes.Core.Hero defender, Heroes.Core.Monster monster, Heroes.Core.Town castle) : base() { _isFirstRun = true; _disableControl = false; _controller = controller; _inputCommand = new InputCommand(); _battleTerrain = new Heroes.Core.Battle.Terrains.BattleTerrain(controller); _spells = new Hashtable(); _spellActions = new ArrayList(); // init hero and armies { _activeCharacters = new ArrayList(); InitHero(attacker, ArmySideEnum.Attacker, controller, out _attacker); if (defender != null) { InitHero(defender, ArmySideEnum.Defender, controller, out _defender); } if (monster != null) { InitMonster(monster, ArmySideEnum.Defender, controller, out _monster); } // sort armies by speed SortBySpeed(_activeCharacters); } // initialize graphics { foreach (StandardCharacter c in _activeCharacters) { c.Initalize(); c.Command = _inputCommand; c.Command.InitalizeGraphics(c); } _attacker.Initalize(); if (_defender != null) _defender.Initalize(); } _turn = new Turn(_activeCharacters, _attacker, _defender); _turn.NextTurned += new Turn.NextTurnedEventHandler(_turn_NextTurned); _actions = new ArrayList(); }
private void HasRangeAttackPenalty(BattleTerrain battleTerrain, Heroes.Core.Battle.Armies.Army currentArmy, Heroes.Core.Battle.Armies.Army targetArmy, out bool hasRangePenalty, out bool hasObstaclePenalty) { hasRangePenalty = false; hasObstaclePenalty = false; // Range Penalty // Whenever any shooter, except Sharpshooters or those under the command of a hero with the Golden Bow or Bow of the Sharpshooter equipped, attacks a unit standing more than 10(?) hexes away, they will only do half damage. This is cumulative with the Obstacle Penalty. // obstacle Penalty // Whenever most units tries shooting over Walls into a castle, they will only do half Damage. Certain units don't have this penalty, and neither do units under the command of a hero with the Golden Bow or Bow of the Sharpshooter. This penalty is cumulative with the Range Penalty // find attack range ArrayList path = new ArrayList(); battleTerrain.FindPath(currentArmy._cell, targetArmy._cell, path, true, true); if (path.Count > 10) hasRangePenalty = true; }
private void SetAttackDamage(BattleTerrain battleTerrain, Heroes.Core.Hero currentHero, Heroes.Core.Battle.Armies.Army currentArmy, Heroes.Core.Hero targetHero, Heroes.Core.Battle.Armies.Army targetArmy, bool isRangeAttack) { bool hasRangePenalty = false; bool hasObstaclePenalty = false; HasRangeAttackPenalty(battleTerrain, currentArmy, targetArmy, out hasRangePenalty, out hasObstaclePenalty); bool hasHandToHandPenalty = HasHandToHandPenalty(currentArmy); int minDamage = 0; int maxDamage = 0; int minKill = 0; int maxKill = 0; int avgKill = 0; CalculateDamage(currentHero, currentArmy, targetHero, targetArmy, isRangeAttack, hasRangePenalty, hasObstaclePenalty, hasHandToHandPenalty, out minDamage, out maxDamage, out minKill, out maxKill, out avgKill); // random from minDamage to maxDamage //Random rnd = new Random(); //int rndDamage = rnd.Next(minDamage, maxDamage); int rndDamage = (minDamage + maxDamage) / 2; // use average damage because rnd Damage need to inform other player SetDamage(rndDamage, targetArmy); }
public BattleCommander(Heroes.Core.Player attackPlayer, Heroes.Core.Hero attackHero, Heroes.Core.Player defendPlayer, Heroes.Core.Hero defendHero, Heroes.Core.Monster monster, bool quickCombat) { _battleTerrain = new BattleTerrain(); _attackPlayer = attackPlayer; _defendPlayer = defendPlayer; { _attackHeroOriginal = attackHero; _attackHero = new Heroes.Core.Battle.Heros.Hero(); _attackHero.CopyFrom(attackHero); _attackHero._armySide = Heroes.Core.Battle.Characters.ArmySideEnum.Attacker; _attackHero._spells = attackHero._spells; foreach (Heroes.Core.Army army in attackHero._armyKSlots.Values) { Heroes.Core.Battle.Armies.Army army2 = new Heroes.Core.Battle.Armies.Army(); army2.CopyFrom(army); army2._armySide = Heroes.Core.Battle.Characters.ArmySideEnum.Attacker; army2._qtyLeft = army2._qty; army2._healthRemain = army2._health; army2._shotRemain = army2._noOfShot; army2._retaliateRemain = army2._noOfRetaliate; army2._cell = GetCell(army2._armySide, army2._slotNo, army2._isBig); army2._cell._character = army2; _attackHero._armyKSlots.Add(army2._slotNo, army2); } _attackArmies = _attackHero._armyKSlots; } _defendHeroOriginal = null; _defendHero = null; if (defendHero != null) { _defendHeroOriginal = defendHero; _defendHero = new Heroes.Core.Battle.Heros.Hero(); _defendHero.CopyFrom(defendHero); _defendHero._armySide = Heroes.Core.Battle.Characters.ArmySideEnum.Defender; _defendHero._spells = attackHero._spells; foreach (Heroes.Core.Army army in defendHero._armyKSlots.Values) { Heroes.Core.Battle.Armies.Army army2 = new Heroes.Core.Battle.Armies.Army(); army2.CopyFrom(army); army2._armySide = Heroes.Core.Battle.Characters.ArmySideEnum.Defender; army2._qtyLeft = army2._qty; army2._healthRemain = army2._health; army2._shotRemain = army2._noOfShot; army2._retaliateRemain = army2._noOfRetaliate; army2._cell = GetCell(army2._armySide, army2._slotNo, army2._isBig); army2._cell._character = army2; _defendHero._armyKSlots.Add(army2._slotNo, army2); } _defendArmies = _defendHero._armyKSlots; } _monsterOriginal = null; _monster = null; if (monster != null) { _monsterOriginal = monster; _monster = new Heroes.Core.Battle.Quick.Monster(); _monster.CopyFrom(monster); _monster._armySide = Heroes.Core.Battle.Characters.ArmySideEnum.Defender; foreach (Heroes.Core.Army army in monster._armyKSlots.Values) { Heroes.Core.Battle.Armies.Army army2 = new Heroes.Core.Battle.Armies.Army(); army2.CopyFrom(army); army2._armySide = Heroes.Core.Battle.Characters.ArmySideEnum.Defender; army2._qtyLeft = army2._qty; army2._healthRemain = army2._health; army2._shotRemain = army2._noOfShot; army2._retaliateRemain = army2._noOfRetaliate; army2._cell = GetCell(army2._armySide, army2._slotNo, army2._isBig); army2._cell._character = army2; _monster._armyKSlots.Add(army2._slotNo, army2); } _defendArmies = _monster._armyKSlots; } _heroes = new Hashtable(); _heroes.Add(_attackHero._id, _attackHero); if (_defendHero != null) _heroes.Add(_defendHero._id, _defendHero); _armies = new ArrayList(); foreach (Heroes.Core.Army army in _attackArmies.Values) { _armies.Add(army); } foreach (Heroes.Core.Army army in _defendArmies.Values) { _armies.Add(army); } BattleEngine.SortBySpeed(_armies); _quickCombat = quickCombat; _turn = new Turn(_armies, _attackHero, _attackArmies, _defendHero, _monster, _defendArmies); }