Пример #1
0
    public void SetupNewBattle(CharacterTeam inPlayerTeam, CharacterTeam inEnemyTeam)
    {
        turnQueue.Clear();
        currentSkillResults.Clear();
        currentDeadCharacters.Clear();
        activeCharacter         = null;
        activeSkillCommand      = null;
        isProcessing            = false;
        stepIndex               = 0;
        turnNum                 = 0;
        curBattleTransmuteCount = 0;

        playerTeam = inPlayerTeam;
        enemyTeam  = inEnemyTeam;
        RefreshCharactersInBattleList();

        playerTeam.PrepareForBattle();
        enemyTeam.PrepareForBattle();

        /*
         * Debug.Log("battle order:");
         * foreach (CharacterData c in charactersInBattle)
         * {
         *  Debug.Log(c.name + " : " + c.orderInTeam);
         * }
         */
    }
Пример #2
0
    public void RunAutocombatForActiveCharacter()
    {
        CharacterTeam opposingTeam = adventure.GetTeamOppositeOfFaction(activeCharacter.curFaction);
        CharacterTeam ownTeam      = adventure.GetTeamForFaction(activeCharacter.curFaction);

        SodaScript acScript = null;

        if (activeCharacter.curFaction == Faction.PLAYER)
        {
            acScript = activeCharacter.activeSodaScript;
        }
        else
        {
            acScript = defaultEnemyScript;
        }

        acScript.Execute(activeCharacter, adventure, cachedSkillCommand);

        //keep track of how many times a team has healed itself in a row. this is used inside of soda script execution to break out of infinite heal loops
        if (cachedSkillCommand.skill.isHealing)
        {
            ownTeam.consecutiveHeals++;
        }
        else
        {
            ownTeam.consecutiveHeals = 0;
        }

        adventure.ReceiveCommand(cachedSkillCommand);
    }
Пример #3
0
    private void EnactPendingCharacterTransformations()
    {
        for (int i = 0; i < pendingCharacterTransformations.Count; i++)
        {
            CharacterData c1, c2;
            c1 = pendingCharacterTransformations[i][0];
            c2 = pendingCharacterTransformations[i][1];

            CharacterTeam team = c1.IsInFaction(Faction.PLAYER) ? playerTeam : enemyTeam;
            turnQueue.Remove(c1);
            team.TurnMemberInto(c1, c2);
            RefreshCharactersInBattleList();

            if (GameContext.DEBUG_WEAK_ENEMIES && team == enemyTeam)
            {
                c2.stats.Set(Stat.hp, 1);
            }

            if (ECharacterTransformed != null)
            {
                ECharacterTransformed(c1, c2);
            }
        }

        pendingCharacterTransformations.Clear();
    }
Пример #4
0
        public Fight GetFight(CharacterTeam computerTeam, CharacterTeam playerTeam)
        {
            IUserImpl cpu    = UserGenerator.GetUser(false, computerTeam);
            IUserImpl player = UserGenerator.GetUser(true, playerTeam);

            return(new Fight(cpu, player));
        }
Пример #5
0
        public IUserImpl GetUser(bool isPlayer)
        {
            CharacterTeam team = TeamGenerator.GenerateRandomTeam(isPlayer);

            if (isPlayer)
            {
                return(new ConsolePlayer(team));
            }
            return(new ConsoleComputer(team));
        }
Пример #6
0
    public SkillCommand PopulateAISkillCommand(SkillCommand inCommand, CharacterTeam opposingTeam)
    {
        //right now always choose a random target
        CharacterData target = opposingTeam.GetRandomLivingMember();

        Skill skillToUse = GetDefaultSkill();

        inCommand.Reset(skillToUse, this);
        inCommand.AddTarget(target);
        return(inCommand);
    }
Пример #7
0
 public IUserImpl GetUser(bool isPlayer, CharacterTeam team)
 {
     if (isPlayer)
     {
         return(new ConsolePlayer(team));
     }
     else
     {
         return(new ConsoleComputer(team));
     }
 }
Пример #8
0
    // Use this for initialization
    void Start()
    {
        Team = GameObject.Find("GameControlCenter").GetComponent<CharacterTeam> ();
        enTeam = GameObject.Find("EnemyTeam").GetComponent<CharacterTeam> ();
        chDT = GameObject.Find ("GameControlCenter").GetComponent<CharacterData> ();

        for (int i=0; i<chDT.character.Count; i++)
            if (chDT.character[i].chID == ID) {
            ch = i;
            break;
        }
    }
 public void Verify_Add_Should_AddTheEntityToTheContext()
 {
     // Arrange
     Mock<IDbSet<CharacterTeam>> mockSetCharacterTeams;
     var mockContext = CharacterTeamsMockingSetup.DoMockingSetupForContext(false, out mockSetCharacterTeams);
     var repository = new CharacterTeamsRepository(mockContext.Object);
     var characterTeams = new CharacterTeam { Active = true, CustomKey = "SALVATORE-RAA", };
     // Act
     repository.Add(characterTeams);
     // Assert
     mockSetCharacterTeams.Verify(x => x.Add(characterTeams), Times.Once);
 }
Пример #10
0
        private static void TeamBuilding()
        {
            TeamBuilderDisplay builderDisplay = new TeamBuilderDisplay(false);
            CharacterTeam      computerTeam   = builderDisplay.TeamBuilderHome();

            builderDisplay = new TeamBuilderDisplay(true);
            CharacterTeam playerTeam = builderDisplay.TeamBuilderHome();

            Console.Clear();
            Fight fight = generator.GetFight(computerTeam, playerTeam);

            EndFight(fight);
        }
Пример #11
0
        public CharacterTeam GenerateRandomTeam(bool isPlayer)
        {
            CharacterTeam team = new CharacterTeam();

            for (int i = 0; i < 4; ++i)
            {
                IWeapon           weapon    = WeaponGenerator.GetRandomWeapon();
                AbstractCharacter character = CharGenerator.GetRandomCharacter();
                character.EquipWeapon(weapon);
                team.InsertCharacter(character, isPlayer);
            }
            return(team);
        }
Пример #12
0
        public void Verify_Add_Should_AddTheEntityToTheContext()
        {
            // Arrange
            Mock <IDbSet <CharacterTeam> > mockSetCharacterTeams;
            var mockContext    = CharacterTeamsMockingSetup.DoMockingSetupForContext(false, out mockSetCharacterTeams);
            var repository     = new CharacterTeamsRepository(mockContext.Object);
            var characterTeams = new CharacterTeam {
                Active = true, CustomKey = "SALVATORE-RAA",
            };

            // Act
            repository.Add(characterTeams);
            // Assert
            mockSetCharacterTeams.Verify(x => x.Add(characterTeams), Times.Once);
        }
Пример #13
0
    private void EndBattle(CharacterTeam inWinningTeam)
    {
        Pause();

        if (!adventure.isInteractiveCutscene)
        {
            //REMOVED: awarding mastery xp to player team
        }

        //REMOVED: increase pet xp

        if (EBattleEnded != null)
        {
            EBattleEnded(inWinningTeam);
        }
    }
Пример #14
0
    public void PrepareForAdventure(CharacterTeam inTeam)
    {
        team = inTeam;
        UpdateCurFaction(team.faction);
        RebuildSkillList();
        CalculateModifiedStats();

        _statusEffects = new List <StatusEffect>();
        stats.Set(Stat.max_hp, stats.Get(Stat.hp));
        stats.Set(Stat.max_mp, stats.Get(Stat.mp));

        cooldowns = new List <CooldownData>();

        _dead               = false;
        isDefending         = false;
        exhaustionTurnCount = 0;
    }
Пример #15
0
    private void CheckForBattleEnd()
    {
        CharacterTeam winningTeam = null;

        if (playerTeam.AllMembersDefeated())
        {
            winningTeam = enemyTeam;
        }
        else if (enemyTeam.AllMembersDefeated())
        {
            winningTeam = playerTeam;
        }

        if (winningTeam != null)
        {
            EndBattle(winningTeam);
        }
    }
Пример #16
0
    public void ExecuteTriggers(CharacterData inActiveCharacter, Adventure inAdventure, SkillCommand inCommandToPopulate)
    {
        //store some data up front that will probably be useful
        activeCharacter = inActiveCharacter;
        adventure       = inAdventure;
        opposingTeam    = inAdventure.GetTeamOppositeOfFaction(activeCharacter.curFaction);
        ownTeam         = inAdventure.GetTeamForFaction(activeCharacter.curFaction);

        if (potentialTargets == null)
        {
            potentialTargets = new List <CharacterData>();
        }
        if (culledTargets == null)
        {
            culledTargets = new List <CharacterData>();
        }

        potentialSkill = null;

        //for a trigger to eval it needs a valid target, and the ability to cast the requested spell
        bool atLeastOneTriggerEvaluated = false;

        for (int i = 0; i < triggers.Count; i++)
        {
            if (EvalTrigger(triggers[i], inCommandToPopulate))
            {
                atLeastOneTriggerEvaluated = true;
                break;
            }
        }

        //if we made it this far, fall back to the default trigger that will always fire
        if (!atLeastOneTriggerEvaluated)
        {
            EvalTrigger(defaultTrigger, inCommandToPopulate);
        }


        //cleanup
        potentialTargets.Clear();
        culledTargets.Clear();
        potentialSkill = null;
    }
Пример #17
0
        public void Verify_MapToEntity_WithExistingEntity_AssignsCharacterTeamProperties()
        {
            // Arrange
            var mapper = new CharacterTeamMapper();
            var model  = CharacterTeamsMockingSetup.DoMockingSetupForCharacterTeamModel();
            // Act
            ICharacterTeam existingEntity = new CharacterTeam {
                Id = 1
            };

            mapper.MapToEntity(model.Object, ref existingEntity);
            // Assert
            // <None>
            // Related Objects
            Assert.Equal(model.Object.CharacterId, existingEntity.CharacterId);
            Assert.Equal(model.Object.TeamId, existingEntity.TeamId);
            // Associated Objects
            // <None>
        }
Пример #18
0
 public void SetUp()
 {
     Fixture = new CharacterTeam();
 }
Пример #19
0
    public void ResolveActiveSkillCommand()
    {
        SkillResult   curResult;
        CharacterData source = activeSkillCommand.source;
        CharacterData curTarget;

        currentSkillResults.Clear();

        //tally up damage that was reflected back at the source
        float accumulatedDamageReflected = 0;

        //tally up other properties to be used for stats
        float accumulatedHpChange       = 0;
        float accumulatedDamageAbsorbed = 0;
        uint  totalCrits       = 0;
        uint  totalEvades      = 0;
        uint  totalBackAttacks = 0;
        uint  totalDefends     = 0;

        //we take special actions for the defend and surrender skills
        if (activeSkillCommand.skill.id == SkillId.DEFEND)
        {
            source.isDefending = true;

            curResult = PoolManager.poolSkillResults.GetNext();
            curResult.Init(activeSkillCommand.skill, source, activeSkillCommand.targets[0]);
            currentSkillResults.Add(curResult);
        }
        else if (activeSkillCommand.skill.id == SkillId.SURRENDER)
        {
            //no action taken here; battle will be ended before anything meaningful can happen
        }
        else
        {
            for (int i = 0; i < activeSkillCommand.targets.Count; i++)
            {
                curTarget = activeSkillCommand.targets[i];
                curResult = activeSkillCommand.skill.GenerateResultToTarget(source, curTarget);
                Stats statChanges = curResult.statChanges;

                //make adjustments to the damage based on battle conditions AND the target's stats/conditions
                float hpChange = statChanges.Get(Stat.hp);

                //check this value here before any kind of absorb or defend is applied
                if (hpChange < 0)
                {
                    curResult.skillAttemptedToInflictDamage = true;
                }

                //REMOVED: add extra damage for huntress kill count, also increase damage if target is "marked"

                //check for special case where pickaxe deals bonus damage to something turned to stone
                if (curTarget.HasStatusEffect(StatusEffectType.STONE) && curResult.skill.id == SkillId.PICKAXE)
                {
                    hpChange *= GameContext.PICKAXE_AGAINST_STONE_MULTIPLIER;
                }

                //back attack? can't back attack mineable ore
                if (curResult.skill.canBackAttack && !curTarget.isOre)
                {
                    if (curTarget.BackIsTurnedTo(source) && !curTarget.IsImmuneToBackAttackBonus())
                    {
                        hpChange *= GameContext.BACK_ATTACK_MULTIPLIER;
                        curResult.wasBackAttack = true;
                        totalBackAttacks++;
                    }
                }

                //boost magic attack and phys attacks
                if (curResult.skill.IsType(SkillType.MAGICAL))
                {
                    long magBoost = source.stats.Get(Stat.magic_boost);
                    if (magBoost != 0)
                    {
                        float boostAmt = 1f + (magBoost / 100f);
                        hpChange *= boostAmt;
                    }

                    //hard max for group heal: cannot exceed half of target's max hp
                    if (curResult.skill.id == SkillId.GROUP_HEAL)
                    {
                        long max = curTarget.stats.Get(Stat.max_hp) / 2;
                        if (hpChange > max)
                        {
                            hpChange = max;
                        }
                    }
                }
                else if (curResult.skill.IsType(SkillType.PHYSICAL))
                {
                    long physBoost = source.stats.Get(Stat.phys_boost);
                    if (physBoost != 0)
                    {
                        float boostAmt = 1f + (physBoost / 100f);
                        hpChange *= boostAmt;
                    }
                }

                //crit. right now just manually check when using the strike skill. can't crit ore
                if (curResult.skill.id == SkillId.STRIKE && !curTarget.isOre)
                {
                    if (activeSkillCommand.source.RollPrimaryCritChance())
                    {
                        hpChange          = activeSkillCommand.source.GetPrimaryCritBonusAppliedToDamage(hpChange);
                        curResult.wasCrit = true;
                    }
                }

                if (curResult.wasDoubleCrit)
                {
                    totalCrits += 2;
                }
                else if (curResult.wasCrit)
                {
                    totalCrits++;
                }

                //apply super bonus crit damage?
                if (curResult.wasCrit || curResult.wasDoubleCrit)
                {
                    if (adventure.nextCritDamageBoostPercent > 0)
                    {
                        float boostAmt = 1f + (adventure.nextCritDamageBoostPercent / 100f);
                        hpChange *= boostAmt;
                        adventure.nextCritDamageBoostPercent = 0;
                    }
                }

                bool sourceMissed = false;
                bool targetEvaded = false;

                //additional checks for non-friendly skills: (evade, reduce damage, defend, etc)
                if (!curResult.skill.isFriendly)
                {
                    //damage absorb/reduce?
                    long reduction = curTarget.stats.Get(Stat.dmg_reduction);
                    if (curTarget.HasStatusEffect(StatusEffectType.STONE) && curResult.skill.id != SkillId.PICKAXE)
                    {
                        reduction += 50;
                    }

                    if (reduction != 0)
                    {
                        float prevHpChange = hpChange;
                        float reductionAmt = 1f - (reduction / 100f);
                        hpChange *= reductionAmt;
                        accumulatedDamageAbsorbed += (Math.Abs(prevHpChange) - Math.Abs(hpChange));
                    }

                    //is target defending? cut damage in half
                    if (curTarget.isDefending)
                    {
                        hpChange = hpChange / 2f;
                        totalDefends++;
                    }

                    //if the skill attempted to inflict damage but damage was reduced below 1, make it 1
                    if (curResult.skillAttemptedToInflictDamage && Math.Abs(hpChange) < 1)
                    {
                        hpChange = -1;
                    }

                    //did the source miss because they were confused?
                    sourceMissed = activeSkillCommand.source.HasStatusEffect(StatusEffectType.CONFUSION) && Utils.PercentageChance(75);

                    //did the target evade successfully? note that they would never evade a friendly attack
                    CharacterTeam targetsTeam = adventure.GetTeamForFaction(curTarget.curFaction);
                    bool          targetHasPartyProtection = curTarget.HasSkill(SkillId.PARTY_PROTECTION) && targetsTeam.GetNumLivingMembers() > 1;
                    if (curResult.source.curFaction != curResult.target.curFaction &&
                        (curTarget.PassesEvasionCheck() || targetHasPartyProtection))
                    {
                        targetEvaded = true;
                        totalEvades++;
                    }
                }

                //is target an ore? they take damage from the ore bust stat instead (min 1)
                if (curTarget.isOre && curResult.skillAttemptedToInflictDamage)
                {
                    //ore bust is a mixture of our existing ore bust stat plus whatever the attack itself specified. it's always at least 1
                    long oreBust = activeSkillCommand.source.stats.Get(Stat.ore_bust);
                    oreBust += statChanges.Get(Stat.ore_bust);
                    oreBust  = Math.Max(oreBust, 1);

                    //ore bust is stored as a positive number but must be converted to negative for damage
                    hpChange = -oreBust;
                }

                //finalize damage
                statChanges.Set(Stat.hp, (long)hpChange);

                //debug invincible characters
                if ((GameContext.DEBUG_INVINCIBLE_CHARACTERS && curTarget.curFaction == Faction.PLAYER) ||
                    (GameContext.DEBUG_INVINCIBLE_ENEMIES && curTarget.curFaction == Faction.ENEMY))
                {
                    if (statChanges.Get(Stat.hp) < 0)
                    {
                        statChanges.Set(Stat.hp, 0);
                    }
                }

                //this line will always knock the target down to 1hp
                //statChanges.Set(Stat.hp, -(curTarget.stats.Get(Stat.max_hp) - 1) );

                if (sourceMissed || targetEvaded)
                {
                    curResult.SetAsEvaded();
                }
                else
                {
                    curResult.ResolveEffects(adventure);

                    //resolve team effects for the first result (we only do this once because technically all results contain copies of the same team effects
                    if (i == 0)
                    {
                        curResult.ResolveTeamEffects(adventure);
                    }

                    //NOW THAT THE ATTACK CONNECTED AND WAS RESOLVED:
                    //tally it
                    accumulatedHpChange += hpChange;

                    //damage reflect
                    long damageReflect = curTarget.stats.Get(Stat.dmg_reflection);
                    if (damageReflect > 0 && hpChange < 0)
                    {
                        float reflectValue = (hpChange * (damageReflect / 100f));
                        accumulatedDamageReflected += Math.Abs(reflectValue);
                    }

                    //dark savior
                    if (curTarget.stats.Get(Stat.hp) == 0)
                    {
                        CharacterData savior = curTarget.GetCurTeam().GetMemberWhoCanUseDarkSaviorThatIsnt(curTarget);
                        if (savior != null)
                        {
                            curTarget.stats.Set(Stat.hp, 1);
                            savior.IncrementDarkSaviorUseCount();
                            curResult.invokedDarkSavior = true;
                        }
                    }

                    //was this a transmute? max one per battle, and must be a common enemy
                    if (curResult.transmutesTarget)
                    {
                        bool isCommonEnemy = false;
                        if (curResult.target is EnemyCharacterData && !curResult.target.isOre)
                        {
                            if (((EnemyCharacterData)curResult.target).rank == EnemyRank.NORM)
                            {
                                isCommonEnemy = true;
                            }
                        }

                        //special exception for the grill which currently counts as a NORM enemy
                        if (curResult.target.id == EnemyId.GRILL)
                        {
                            isCommonEnemy = false;
                        }

                        if (isCommonEnemy && !CurBattleTransmuteLimitReached())
                        {
                            curBattleTransmuteCount++;

                            CharacterData newOre = CharacterData.Get(adventure.curOreTable.RollSpawn()).GetCopy();
                            newOre.UnsetFlags(CharacterFlags.DEATH_OPTIONAL); //unset the death optional flag, since the player transmuted them on purpose (it would be weird to instantly end the battle now)
                            curResult.transmuteResult = newOre;

                            curTarget.GetCurTeam().TurnMemberInto(curTarget, newOre);

                            turnQueue.Remove(curTarget);
                            RefreshCharactersInBattleList();
                        }
                        else
                        {
                            curResult.transmutesTarget = false;
                            curResult.failedATransmute = true;
                        }
                    }
                }

                currentSkillResults.Add(curResult);
            }
        }

        //last step is to see if we create an additional result to send reflected damage back to the source
        if (accumulatedDamageReflected > 0 && !source.HasSkill(SkillId.PARTY_PROTECTION))
        {
            curResult = PoolManager.poolSkillResults.GetNext();
            curResult.Init(Skill.GetSkill(SkillId.STRIKE), source, source);
            curResult.statChanges.Set(Stat.hp, -accumulatedDamageReflected);
            curResult.ResolveEffects(adventure);
            currentSkillResults.Add(curResult);
        }

        //REMOVED: some local stat reporting to the save file

        if (ESkillResolved != null)
        {
            ESkillResolved(currentSkillResults);
        }
    }
Пример #20
0
 public void TearDown()
 {
     Fixture = null;
 }
 public void Verify_MapToEntity_WithExistingEntity_AssignsCharacterTeamProperties()
 {
     // Arrange
     var mapper = new CharacterTeamMapper();
     var model = CharacterTeamsMockingSetup.DoMockingSetupForCharacterTeamModel();
     // Act
     ICharacterTeam existingEntity = new CharacterTeam { Id = 1 };
     mapper.MapToEntity(model.Object, ref existingEntity);
     // Assert
     // <None>
     // Related Objects
     Assert.Equal(model.Object.CharacterId, existingEntity.CharacterId);
     Assert.Equal(model.Object.TeamId, existingEntity.TeamId);
     // Associated Objects
     // <None>
 }
 public void CreateTeam()
 {
     Team = new CharacterTeam();
 }
Пример #23
0
        public override AbstractUser GetUser(CharacterTeam team)
        {
            IUserImpl user = new ConsoleComputer(team);

            return(new User(user));
        }
Пример #24
0
 void Awake()
 {
     //初始化定義
     Team = GameObject.Find("GameControlCenter").GetComponent<CharacterTeam> ();
     enTeam = GameObject.Find("EnemyTeam").GetComponent<CharacterTeam> ();
     chUnitWindow = GameObject.Find ("CH_UNIT");
     enUnitWindow = GameObject.Find ("EN_UNIT");
 }
Пример #25
0
    // Use this for initialization
    void Start()
    {
        Team = GameObject.FindGameObjectWithTag ("GCC").GetComponent<CharacterTeam> ();
        chUnitWindow = GameObject.Find ("CH_UNIT");
        chFace = GameObject.Find("CharacterFace").GetComponent<Image>();
        NAME = GameObject.Find ("NAME").GetComponent<Text>();
        LV= GameObject.Find ("LV").GetComponent<Text>();
        STR= GameObject.Find ("STR").GetComponent<Text>();
        INT= GameObject.Find ("INT").GetComponent<Text>();
        AGI= GameObject.Find ("AGI").GetComponent<Text>();
        CHA= GameObject.Find ("CHA").GetComponent<Text>();
        COU= GameObject.Find ("COU").GetComponent<Text>();

        DrawGrid ();
        DrawCH ();
    }
Пример #26
0
 public ConsolePlayer(CharacterTeam team) : base(team)
 {
 }
 public abstract AbstractUser GetUser(CharacterTeam team);
 public ConsoleComputer(CharacterTeam team) : base(team)
 {
 }
Пример #29
0
    //return true if this evals true for any target provided
    private void EvalCondition(SodaScriptCondition inCondition, SodaScriptComparison inComparison, string inCompareValue, List <CharacterData> inTargets)
    {
        CharacterData       targ;
        EnemyCharacterData  ecd;
        PlayerCharacterData pcd;

        culledTargets.Clear();

        if (inCondition == SodaScriptCondition.WEAKEST)
        {
            culledTargets.Add(GetLowestHpPercentTarget(inTargets));
        }
        else if (inCondition == SodaScriptCondition.TEAM_ALIVE)
        {
            targ = inTargets[0];
            CharacterTeam team = targ.IsInFaction(Faction.PLAYER) ? adventure.playerTeam : adventure.enemyTeam;
            if (EvalNumericComparison(team.GetNumLivingMembers(), int.Parse(inCompareValue), inComparison))
            {
                culledTargets.Add(targ);
            }
        }
        else if (inCondition == SodaScriptCondition.TEAM_HP)
        {
            targ = inTargets[0];
            CharacterTeam team = targ.IsInFaction(Faction.PLAYER) ? adventure.playerTeam : adventure.enemyTeam;
            if (EvalNumericComparison(team.GetTeamHPPercent(), int.Parse(inCompareValue), inComparison))
            {
                culledTargets.Add(targ);
            }
        }
        else if (inCondition == SodaScriptCondition.TEAM_NUM_BACK_TURNED)
        {
            targ = inTargets[0];
            CharacterTeam team          = targ.IsInFaction(Faction.PLAYER) ? adventure.playerTeam : adventure.enemyTeam;
            int           numBackTurned = team.GetNumMembersWithBackTurnedTo(activeCharacter);
            if (EvalNumericComparison(numBackTurned, int.Parse(inCompareValue), inComparison))
            {
                culledTargets.Add(targ);
            }
        }
        else
        {
            for (int i = 0; i < inTargets.Count; i++)
            {
                targ = inTargets[i];
                if (inCondition == SodaScriptCondition.HP)
                {
                    if (EvalNumericComparison(targ.GetHpPercent(), int.Parse(inCompareValue), inComparison))
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.MP)
                {
                    if (EvalNumericComparison(targ.GetMpPercent(), int.Parse(inCompareValue), inComparison))
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.POSITION)
                {
                    if (EvalNumericComparison(targ.originalOrderInTeam + 1, int.Parse(inCompareValue), inComparison))
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.RANK)
                {
                    bool      foundRank  = false;
                    EnemyRank enemyRank  = EnemyRank.NORM;
                    EnemyRank parsedRank = (EnemyRank)Enum.Parse(typeof(EnemyRank), inCompareValue);

                    if (targ is EnemyCharacterData)
                    {
                        foundRank = true;
                        ecd       = (EnemyCharacterData)targ;
                        enemyRank = ecd.rank;
                    }
                    else if (targ.id == CharId.JANITOR)
                    {
                        foundRank = true;
                        enemyRank = EnemyRank.BOSS;
                    }

                    if (foundRank)
                    {
                        if (EvalNumericComparison((int)enemyRank, (int)parsedRank, inComparison))
                        {
                            culledTargets.Add(targ);
                        }
                    }
                }
                else if (inCondition == SodaScriptCondition.IS_ORE)
                {
                    if (targ.isOre)
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.ISNT_ORE)
                {
                    if (!targ.isOre)
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.IS_JANITOR)
                {
                    if (targ.id == CharId.JANITOR)
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.ISNT_JANITOR)
                {
                    if (targ.id != CharId.JANITOR)
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.BACK_IS_TURNED)
                {
                    if (!targ.isOre && targ.BackIsTurnedTo(activeCharacter))
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.BACK_ISNT_TURNED)
                {
                    if (!targ.isOre && !targ.BackIsTurnedTo(activeCharacter))
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.HAS_ESSENCE)
                {
                    if (targ.hasEssence)
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.NO_ESSENCE)
                {
                    if (!targ.hasEssence)
                    {
                        culledTargets.Add(targ);
                    }
                }
                else if (inCondition == SodaScriptCondition.STATUS)
                {
                    StatusEffectCategory parsedCategory = (StatusEffectCategory)Enum.Parse(typeof(StatusEffectCategory), inCompareValue);
                    if (parsedCategory == StatusEffectCategory.POSITIVE)
                    {
                        bool hasPos = targ.HasPostiveStatusEffect();
                        if ((inComparison == SodaScriptComparison.EQUALS && hasPos) ||
                            (inComparison == SodaScriptComparison.NOT_EQUALS && !hasPos))
                        {
                            culledTargets.Add(targ);
                        }
                    }
                    else if (parsedCategory == StatusEffectCategory.NEGATIVE)
                    {
                        bool hasNeg = targ.HasNegativeStatusEffect();
                        if ((inComparison == SodaScriptComparison.EQUALS && hasNeg) ||
                            (inComparison == SodaScriptComparison.NOT_EQUALS && !hasNeg))
                        {
                            culledTargets.Add(targ);
                        }
                    }
                    else if (parsedCategory == StatusEffectCategory.NONE)
                    {
                        bool hasAny = targ.HasAnyStatusEffect();
                        if ((inComparison == SodaScriptComparison.EQUALS && !hasAny) ||
                            (inComparison == SodaScriptComparison.NOT_EQUALS && hasAny))
                        {
                            culledTargets.Add(targ);
                        }
                    }
                }
                else
                {
                    throw new Exception("Trigger condition " + inCondition + " is not supported as a condition");
                }
            }

            //do a final list sort based on the condition?
            if (inCondition == SodaScriptCondition.HP)
            {
                if (inComparison == SodaScriptComparison.GREATER_THAN)
                {
                    culledTargets = culledTargets.OrderByDescending(t => t.GetHpPercent()).ToList <CharacterData>();
                }
                else if (inComparison == SodaScriptComparison.LESS_THAN)
                {
                    culledTargets = culledTargets.OrderBy(t => t.GetHpPercent()).ToList <CharacterData>();
                }
            }
            else if (inCondition == SodaScriptCondition.MP)
            {
                if (inComparison == SodaScriptComparison.GREATER_THAN)
                {
                    culledTargets = culledTargets.OrderByDescending(t => t.GetMpPercent()).ToList <CharacterData>();
                }
                else if (inComparison == SodaScriptComparison.LESS_THAN)
                {
                    culledTargets = culledTargets.OrderBy(t => t.GetMpPercent()).ToList <CharacterData>();
                }
            }
        }

        potentialTargets.Clear();
        potentialTargets.AddRange(culledTargets);
    }