Beispiel #1
0
        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();
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }