public void MoreThanOneCharacterTriesToUseHeldActionAtSameTime_CharacterWhoWinsDexRollGoesFirst()
        {
            //arrange
            CombatSequence sequence = Factory.SequenceWithFastMediumAndSlowCharacters;

            sequence.StartCombat();
            HeroSystemCharacter holder1 = sequence.ActivePhase.Character;


            HeroSystemCharacter holder2 = sequence.ActiveSegment.PhaseNextInDexOrder.Character;

            HoldActionManuever held1 = holder1.Manuevers["Hold Action"] as HoldActionManuever;

            held1.DexWaitingFor = 10;

            HoldActionManuever held2 = holder2.Manuevers["Hold Action"] as HoldActionManuever;

            held2.DexWaitingFor = 10;


            held1.Perform();
            holder1.DEX.CurrentValue = 30;

            held2.Perform();

            Dice.RandomnessState = RandomnessState.average;

            Assert.AreEqual(holder1, sequence.ActivePhase.Character);
            sequence.CompleteActivePhase();

            Assert.AreEqual(holder2, sequence.ActivePhase.Character);
        }
Ejemplo n.º 2
0
 public CharacterMovement(HeroSystemCharacter character)
 {
     Character = character;
     Run       = new Movement(character, "Run", 6, false);
     Swim      = new Movement(character, "Swim", 2, false);
     Leap      = new Movement(character, "Leap", 2, false);
 }
        public void CharacterHoldsActionGenerically_HeGoesAfterOtherCharactersPhaseIfHeLosesDexRoll()
        {
            //arrange
            CombatSequence sequence = Factory.SequenceWithFastMediumAndSlowCharacters;

            sequence.StartCombat();
            HeroSystemCharacter holder = sequence.ActivePhase.Character;

            HoldActionManuever held = holder.Manuevers["Hold Action"] as HoldActionManuever;

            HeroSystemCharacter attacker = sequence.NextCombatPhase.Character;
            Attack ranged = new Attack("Basic Ranged", attacker, DamageType.Normal, 5, DefenseType.PD, true);

            HeroSystemCharacter defender = sequence.NextCombatPhase.Character;

            Dice.RandomnessState = RandomnessState.average;


            //act

            held.Perform();

            ranged.Target(defender);

            holder.DEX.CurrentValue = 5;
            held.Interrupt(InterruptionWith.Generic);

            Assert.AreNotEqual(holder, sequence.ActivePhase.Character);
            Assert.AreEqual(attacker, sequence.ActivePhase.Character);

            sequence.CompleteActivePhase();
            Assert.AreEqual(holder, sequence.ActivePhase.Character);
        }
 public void PerceptiveCharacterAndTargetCharacterThatsIsFarAway()
 {
     Map        = MapFactory.ActiveGameMap;
     Viewer     = Factory.BaseCharacter;
     Target     = Factory.BaseCharacter;
     Target.Hex = new GameHex(1, 1, 22);
 }
        public void AttackWithKnockback_DamagesCharacter()
        {
            HeroSystemCharacter attacker = new HeroSystemCharacter();
            Attack cm = new Attack("Basic", attacker, DamageType.Normal, 5,
                                   DefenseType.PD);


            DamageAmount attackDamage = new DamageAmount();

            attackDamage.Type = DamageType.Normal;
            attackDamage.BOD  = 13;
            attackDamage.WorksAgainstDefense = DefenseType.PD;

            HeroSystemCharacter defender        = new HeroSystemCharacter();
            KnockbackResult     actualKnockback = cm.KnockBackCharacter(defender, attackDamage);

            KnockbackResultType actualResult   = actualKnockback.Result;
            KnockbackResultType expectedResult = KnockbackResultType.KnockBacked;

            Assert.AreEqual(actualResult, expectedResult);

            bool isProne = defender.State.ContainsKey(CharacterStateType.Prone);

            Assert.AreEqual(isProne, true);
        }
        public void CharacterHoldsActionUntilLowerDexAndTheCompletesHeldAction_InterruptedPhaseActsNext()
        {
            //arrange
            CombatSequence sequence = Factory.SequenceWithFastMediumAndSlowCharacters;

            sequence.StartCombat();
            HeroSystemCharacter character = sequence.ActivePhase.Character;


            HoldActionManuever holdManuever = (HoldActionManuever)character.Manuevers["Hold Action"];

            holdManuever.DexWaitingFor = 15;

            character.Manuevers["Hold Action"].Perform();

            sequence.CompleteActivePhase();
            //act

            //execute the held action
            sequence.CompleteActivePhase();

            //assert
            Assert.AreEqual(sequence.ActiveSegment.CombatPhases[2], sequence.ActivePhase);
            Assert.AreEqual(character.HeldManuever, null);
            Assert.AreEqual(sequence.HeldManuevers.Count, 0);
        }
Ejemplo n.º 7
0
        public override void ApplyModifierTo(HeroSystemCharacter character)
        {
            int deltaMod = ModiferAmount - CumulativeModifierApplied;

            character.Characteristics[Charasteristic].Modifier += deltaMod;


            if (MultiplierApplied == 0 && Multiplier != 0)
            {
                MultiplierApplied = Multiplier;
                if (character.Characteristics[Charasteristic].Multiplier == 0)
                {
                    character.Characteristics[Charasteristic].Multiplier = Multiplier;
                }
                else
                {
                    character.Characteristics[Charasteristic].Multiplier *= Multiplier;
                }
            }

            if (SetToZero == true)
            {
                character.Characteristics[Charasteristic].ToZero = true;
            }

            CumulativeModifierApplied += deltaMod;
        }
 public void TestGiven()
 {
     Defender = HeroSystemCharacterRepository.GetInstance().Characters["Default Character"];
     Attacker = HeroSystemCharacterRepository.GetInstance().LoadBaseCharacter();
     Attacker.STR.MaxValue     = 15;
     Dice.Dice.RandomnessState = RandomnessState.average;
 }
Ejemplo n.º 9
0
 public override void RemoveModifierFrom(HeroSystemCharacter character)
 {
     character.DamageClassModifier -= CumulativeModifierApplied;
     CumulativeModifierApplied      = 0;
     character.DamageMultiplier     = 0;
     // character.DamageModifierAppliesTo = HealthType.ALL;
 }
Ejemplo n.º 10
0
 public Brace(HeroSystemCharacter character)
     : base(ManueverType.CombatManuever, "Brace", character, false)
 {
     PhaseActionTakes = PhaseLength.Zero;
     Modifier.RangedModifer.ModiferAmount = +2;
     Modifier.DCV.Multiplier = .5;
 }
        public void CharacterHoldsActionGenerically_HeCanInteruptOtherCharactersPhaseOnlyIfHeWinsDexRoll()
        {
            //arrange
            CombatSequence sequence = Factory.SequenceWithFastMediumAndSlowCharacters;

            sequence.StartCombat();
            HeroSystemCharacter holder = sequence.ActivePhase.Character;

            HoldActionManuever held = holder.Manuevers["Hold Action"] as HoldActionManuever;

            HeroSystemCharacter attacker = sequence.NextCombatPhase.Character;
            Attack ranged = new Attack("Basic Ranged", attacker, DamageType.Normal, 5, DefenseType.PD, true);

            HeroSystemCharacter defender = sequence.NextCombatPhase.Character;

            Dice.RandomnessState = RandomnessState.average;


            //act

            held.Perform();
            ranged.Target(defender);
            held.Interrupt(InterruptionWith.Generic);

            //assert
            Assert.AreEqual(holder, sequence.ActivePhase.Character);
            Assert.AreEqual(sequence.ActivePhase, held.HeldPhase);
            Assert.AreEqual(sequence.InterruptedPhase.Character, attacker);
            Assert.AreEqual(sequence.InterruptedPhase.PhaseLeft, 1);
        }
        public void AbortingToAction_CharacterCannotAbortAgainUntilNextPhaseStarts()
        {
            //arrange
            CombatSequence      sequence = Factory.SequenceWithFastMediumAndSlowCharacters;
            HeroSystemCharacter other    = Factory.Factory.BaseCharacter;

            other.DEX.MaxValue = 9;
            sequence.AddCharacter(other);

            sequence.StartCombat();
            HeroSystemCharacter attacker = sequence.ActivePhase.Character;

            attacker.DEX.MaxValue = 20;

            HeroSystemCharacter defender = sequence.ActiveSegment.PhaseNextInDexOrder.Character;

            defender.DEX.MaxValue = 10;
            TestAbortableManuever abortableManuever = new TestAbortableManuever("Abortable Manuever", defender);



            Attack attack = attacker.Manuevers["Strike"] as Attack;

            attack?.Target(defender);


            defender.Manuevers["Abort"].Perform();
            defender.Manuevers["Abortable Manuever"].Perform();

            Assert.AreEqual(false, defender.Manuevers["Abort"].CanPerform);


            Assert.AreEqual(sequence.InterruptedPhase.Character, attacker);
        }
        public Phase AddCharacter(HeroSystemCharacter character)
        {
            Phase phase = new Phase(character, this);

            _combatPhases[character.Name] = phase;
            character.SPD.Phases[Number]  = phase;
            return(phase);
        }
        public void HandKillingAttackHits_StrengthModAddedToDamgeDice()
        {
            HeroSystemCharacter attacker = characterFactory.BaseCharacterWithOneHandKillingAttackCombatManuever;

            HandKillingAttack attack = attacker.Manuevers["Hand Killing PerformAttack"] as HandKillingAttack;

            Assert.AreEqual(attack.DamageDiceNumber, 6);
        }
 public void CharacterWithStandardSensesAndAttackerWithSenseAffectingPower()
 {
     Target          = Factory.BaseCharacter;
     CharacterSenses = Target.CharacterSenses;
     Attacker        = Factory.BaseCharacter;
     BlindingPower   = new SenseAffectingPower(Attacker, 10, true);
     SuperSight      = CharacterSenses.SightGroup.CreateSenseWithNameForGroup("Super Sight");
     SightGroup      = CharacterSenses.SenseGroups["Sight"];
 }
 public void Given()
 {
     Sequence = new CombatSequence();
     Sequence.StartCombat();
     Character = Factory.BaseCharacter;
     Character.SPD.MaxValue = 6;
     Sequence.AddCharacter(Character);
     Sequence.StartCombat();
 }
Ejemplo n.º 17
0
        public int RequiredRollToBlockAttacker(HeroSystemCharacter attacker)
        {
            int roll = 0;

            if (Character?.OCV?.CurrentValue != null && attacker?.OCV?.CurrentValue != null)
            {
                roll = Character.OCV.CurrentValue - attacker.OCV.CurrentValue + 11;
            }
            return(roll);
        }
Ejemplo n.º 18
0
 public Manuever(ManueverType type, String name, HeroSystemCharacter character, bool isAbortable = false)
 {
     IsAbortable = isAbortable;
     Name        = name;
     Character   = character;
     Type        = type;
     Character.AddManuever(this);
     PhaseActionTakes = PhaseLength.Half;
     Modifier         = new ManueverModifier();
 }
Ejemplo n.º 19
0
 public override void RemoveModifierFrom(HeroSystemCharacter character)
 {
     character.Characteristics[Charasteristic].Modifier -= CumulativeModifierApplied;
     if (character.Characteristics[Charasteristic].Multiplier != 0 && MultiplierApplied != 0)
     {
         character.Characteristics[Charasteristic].Multiplier /= MultiplierApplied;
     }
     CumulativeModifierApplied = 0;
     MultiplierApplied         = 0;
 }
 private void addCharacterPhaseToSegments(HeroSystemCharacter character)
 {
     character.CombatSequence = this;
     Characters.Add(character);
     foreach (var phaseNumber in ((SPD)character.SPD).SegmentNumbersCharacterHasPhases)
     {
         Segment segment = Segments[phaseNumber];
         Phase   phase   = segment.AddCharacter(character);
         character.SPD.Phases[segment.Number] = phase;
     }
 }
 public ConcealmentAmount BlockingCoverProvidedAgainstOtherCharacter(HeroSystemCharacter viewingCharacter, ITargetable coveredCharacter)
 {
     if (coveredCharacter?.Name == "attacker")
     {
         return(ConcealmentAmount);
     }
     else
     {
         return(ConcealmentAmount.None);
     }
 }
Ejemplo n.º 22
0
        public Movement(HeroSystemCharacter character, string name, int inches, bool turningModeRequired)
        {
            this.Character           = character;
            this.Name                = name;
            this.Inches              = inches;
            this.TurningModeRequired = turningModeRequired;
            Facing = new HexFacing();

            MovementManuever manuever = new MovementManuever(this.Character, this);

            NonCombatCVModifier = new ManueverModifier();
        }
        public void AdddingCharacterToCombatSequence_CharacterIsOrderedByPhasesAndDex()
        {
            CombatSequence sequence = Factory.SequenceWithFastMediumAndSlowCharacters;

            sequence.StartCombat();

            //segment 12
            Segment             currentSegment   = sequence.ActiveSegment;
            List <Phase>        phases           = currentSegment.CombatPhases;
            HeroSystemCharacter currentCharacter = phases.First().Character;

            Assert.AreEqual("Fast Character", currentCharacter.Name);

            currentCharacter = phases.ElementAt(1).Character;
            Assert.AreEqual("Medium Character", currentCharacter.Name);

            currentCharacter = phases.ElementAt(2).Character;
            Assert.AreEqual("Slow Character", currentCharacter.Name);


            //segment 2
            currentSegment   = sequence.SegmentAfter(currentSegment);
            currentSegment   = sequence.SegmentAfter(currentSegment);
            phases           = currentSegment.CombatPhases;
            currentCharacter = phases.ElementAt(0).Character;
            Assert.AreEqual("Fast Character", currentCharacter.Name);

            //segment 3
            currentSegment   = sequence.SegmentAfter(currentSegment);
            phases           = currentSegment.CombatPhases;
            currentCharacter = phases.ElementAt(0).Character;
            Assert.AreEqual("Medium Character", currentCharacter.Name);

            //segment 4
            currentSegment   = sequence.SegmentAfter(currentSegment);
            phases           = currentSegment.CombatPhases;
            currentCharacter = phases.First().Character;
            Assert.AreEqual("Fast Character", currentCharacter.Name);

            //segment 6
            currentSegment   = sequence.SegmentAfter(currentSegment);
            currentSegment   = sequence.SegmentAfter(currentSegment);
            phases           = currentSegment.CombatPhases;
            currentCharacter = phases.First().Character;
            Assert.AreEqual("Fast Character", currentCharacter.Name);

            currentCharacter = phases.ElementAt(1).Character;
            Assert.AreEqual("Medium Character", currentCharacter.Name);

            currentCharacter = phases.ElementAt(2).Character;
            Assert.AreEqual("Slow Character", currentCharacter.Name);
        }
 public void AffectSense(HeroSystemCharacter defender)
 {
     if (AffectsGroup != null)
     {
         SenseGroup affected = defender.CharacterSenses.SenseGroupList.Where(x => x.Type == AffectsGroup).ToList().FirstOrDefault();
         affected.IsDisabled = true;
     }
     else if (AffectsPower != null)
     {
         List <Sense> powerSenses = defender.CharacterSenses.Senses.Where(x => x.Power == AffectsPower).ToList();
         powerSenses.ForEach((Sense sense) => { sense.IsDisabled = true; });
     }
 }
 public void CharacterWithSightAndOtherCharacterTarget()
 {
     Character = Factory.BaseCharacter;
     Character.OCV.MaxValue = 4;
     Character.DCV.MaxValue = 4;
     Target                 = Factory.BaseCharacter;
     Sight                  = Character.CharacterSenses.Sight;
     Hearing                = Character.CharacterSenses.Hearing;
     Touch                  = Character.CharacterSenses.Touch;
     CharacterSenses        = Character.CharacterSenses;
     Strike                 = Character.Manuevers["Strike"] as Strike;
     Ranged                 = Factory.AddRangedAttackToCharacter(Character);
     CharacterSenses.Target = Target;
 }
        public void WhenSegmentTwelveFinished_PostSegmentTwelveRecoveryRunOnAllCharcters()
        {
            CombatSequence sequence = Factory.SequenceWithFastMediumAndSlowCharactersWithMocRecManeuver;

            sequence.StartCombat();
            HeroSystemCharacter character = sequence.Characters.FirstOrDefault();

            sequence.CompleteActivePhase();
            sequence.CompleteActivePhase();
            sequence.CompleteActivePhase();

            Mock.Get(character?.Manuevers["Recover"])
            .Verify(foo => foo.Perform(), Times.Exactly(3));
        }
        public void TestActivatingAttack_AttackIsUsedCalculatesChanceToHitOnDefender()
        {
            HeroSystemCharacter character = characterFactory.BaseCharacterWithOneCombatManuever;
            HeroSystemCharacter defender  = characterFactory.BaseCharacter;

            character.OCV.CurrentValue = 5;
            defender.DCV.CurrentValue  = 3;


            var cm    = character.Manuevers["Basic"] as Attack;
            int tohit = cm.RollRequiredToHitWithoutModifiers(defender);

            Assert.AreEqual(13, tohit);
        }
        public void CharacterPerformsHalfPhaseAction_OnlyHalfPhaseIsleft()
        {
            //arrange
            CombatSequence sequence = Factory.SequenceWithCharacterWithMixOfFullAndHalfPhaseManuevers;

            sequence.StartCombat();
            Phase phase = sequence.ActivePhase;
            HeroSystemCharacter character         = phase.Character;
            IManuever           halfPhaseManuever = character.Manuevers["Sample Half 1"];

            //act
            halfPhaseManuever.Perform();

            //arrange
            Assert.AreEqual(.5, phase.PhaseLeft);
        }
        public void TestTakeDamage_EffectsCharacterStateBasedOnAmount()
        {
            DamageAmount attackDamage = new DamageAmount();

            attackDamage.STUN = 35;
            attackDamage.BOD  = 5;
            attackDamage.WorksAgainstDefense = DefenseType.PD;
            HeroSystemCharacter defender = new HeroSystemCharacter();

            defender.PD.CurrentValue   = 5;
            defender.STUN.CurrentValue = 50;
            defender.BOD.CurrentValue  = 10;
            defender.BOD.MaxValue      = 10;
            defender.CON.CurrentValue  = 29;

            defender.TakeDamage(attackDamage);

            bool actualStunned   = defender.State.ContainsKey(CharacterStateType.Stunned);
            bool expectedStunned = true;

            Assert.AreEqual(actualStunned, expectedStunned);

            attackDamage      = new DamageAmount();
            attackDamage.STUN = 35;
            attackDamage.BOD  = 10;
            attackDamage.WorksAgainstDefense = DefenseType.PD;

            defender.TakeDamage(attackDamage);
            bool actualUnconsious   = defender.State.ContainsKey(CharacterStateType.Unconsious);
            bool expectedUnconsious = true;

            Assert.AreEqual(actualUnconsious, expectedUnconsious);

            attackDamage.BOD = 11;
            defender.TakeDamage(attackDamage);
            bool actualDying   = defender.State.ContainsKey(CharacterStateType.Dying);
            bool expectedDying = true;

            Assert.AreEqual(actualDying, expectedDying);

            attackDamage.BOD = 14;
            defender.TakeDamage(attackDamage);
            bool actualDead   = defender.State.ContainsKey(CharacterStateType.Dying);
            bool expectedDead = true;

            Assert.AreEqual(actualDead, expectedDead);
        }
        public void WhenNoDefendersWithinOneHex_HTHAttackAbilityIsDisabled()
        {
            //arrange
            HeroSystemCharacter character = characterFactory.BaseCharacterWithOneCombatManuever;
            HeroSystemCharacter defender  = characterFactory.BaseCharacter;

            MapFactory.ActiveGameMap.HexBesideOtherHex = false;

            //act
            character.Hex = new GameHex(1, 1, 1);
            defender.Hex  = new GameHex(1, 1, 3);

            //assert
            var strike = character.Manuevers["Basic"];

            Assert.AreEqual(strike.CanPerform, false);
        }