public void GenerateBotPlan()
    {
        int turn = 1;
        var tempStamina = bot.Stamina;
        var tempMana = bot.Mana;
        csAttackType attackType = csAttackType.Power;

        while (tempStamina > 0 || tempMana > 0)
        {
            Array values = Enum.GetValues(typeof(csAttackType));
            if(tempStamina > 0 && tempMana > 0)
                attackType = (csAttackType)values.GetValue(UnityEngine.Random.Range(0, values.Length));
            else if(tempStamina > 0 && tempMana <= 0)
                attackType = csAttackType.MartialArts;
            else if(tempStamina <= 0 && tempMana > 0)
                attackType = csAttackType.Power;

            var planElement = new csFightPlanElement();
            planElement.Turn = turn;

            if (attackType == csAttackType.Power)
            {
                var powerIdx = UnityEngine.Random.Range(0, bot.Powers.Count - 1);
                planElement.MagicalPower = bot.Powers[powerIdx];
                tempMana -= Mathf.RoundToInt(planElement.MagicalPower.Mana);
                if (tempMana < 0)
                    tempMana = 0;
            }

            if (attackType == csAttackType.MartialArts)
            {
                var physicalPowerIdx = UnityEngine.Random.Range(0, bot.Attacks.Count - 1);
                planElement.PhysicalPower = bot.Attacks[physicalPowerIdx];
                tempStamina -= Mathf.RoundToInt(planElement.PhysicalPower.Stamina);
                if (tempStamina < 0)
                    tempStamina = 0;
            }

            var magicalDefenceIdx = UnityEngine.Random.Range(0, bot.MagicalDefense.Count - 1);
            planElement.MagicalDefense = bot.MagicalDefense[magicalDefenceIdx];
            var physicalDefenceIdx = UnityEngine.Random.Range(0, bot.PhysicalDefense.Count - 1);
            planElement.PhysicalDefense = bot.PhysicalDefense[physicalDefenceIdx];

            botFightPlan.Add(planElement);

            turn++;
        }
    }
Ejemplo n.º 2
0
    public void Fight()
    {
        bool valid = true;

        foreach(var turn in Turns)
        {
            if (turn.AttackType == "Martial Arts" && ( turn.MagicalDefense == null || turn.PhysicalPower == null || turn.PhysicalDefense == null))
                valid = false;
            if (turn.AttackType == "Power" && (turn.MagicalDefense == null || turn.MagicalPower == null || turn.PhysicalDefense == null))
                valid = false;
        }

        if(valid)
        {
            List<csFightPlanElement> fightPlan = new List<csFightPlanElement>();
            foreach(var turn in Turns)
            {
                var fightPlanElem = new csFightPlanElement();
                fightPlanElem.AttackType = turn.AttackType;
                fightPlanElem.MagicalDefense = turn.MagicalDefense;
                fightPlanElem.MagicalPower = turn.MagicalPower;
                fightPlanElem.PhysicalDefense = turn.PhysicalDefense;
                fightPlanElem.PhysicalPower = turn.PhysicalPower;
                fightPlanElem.Turn = turn.Turn;
                fightPlan.Add(fightPlanElem);
            }
            csGameController.control.FightPlan = fightPlan;
        }
            
    }
    private csTurn ProcessAttack(csFightPlanElement attackerPlan, csFightPlanElement defenderPlan, csIFighter attacker, csIFighter defender, int idx, csTurn turn)
    {
        float damage = 0.0f;

        if (attackerPlan.MagicalPower != null)
        {
            var meditation = attacker.PassivePower.First(s => s.Name == "Meditation");
            if (attacker.Mana < 0 || attacker.Mana < attackerPlan.MagicalPower.Mana)
                meditation.IsInUse = true;

            if (meditation.IsInUse == true)
            {
                var meditationValue = meditation.Use();
                if (meditationValue < 1.0f)
                    meditationValue = 1.0f;

                turn.Description += attacker.Name + " used " + meditation.Name + System.Environment.NewLine;

                if(meditation.Increase())
                {
                    turn.Description += attacker.Name + "'s " + meditation.Name + " increased by " + meditation.Factor + " it's now " + meditation.Value + System.Environment.NewLine;
                }

                attacker.Mana += Mathf.RoundToInt(meditationValue);

                if (attacker.Mana > attacker.Intelligence)
                    attacker.Mana = attacker.Intelligence;

                if (attacker.Mana >= attacker.Intelligence)
                    meditation.IsInUse = false;

                if (attacker is csKagotchi)
                {
                    if (idx == kagotchiFightPlan.Count - 1)
                        idx = 0;
                    else
                        idx++;

                    var kagotchiStats = new csFighterStatsText();
                    kagotchiStats.Hitpoints = attacker.Hitpoints.ToString();
                    kagotchiStats.Stamina = attacker.Stamina.ToString();
                    kagotchiStats.Mana = attacker.Mana.ToString();

                    var botStats = new csFighterStatsText();
                    botStats.Hitpoints = defender.Hitpoints.ToString();
                    botStats.Stamina = defender.Stamina.ToString();
                    botStats.Mana = defender.Mana.ToString();

                    turn.Kagotchi = kagotchiStats;
                    turn.Bot = botStats;
                }
                else if (attacker is csBot)
                {
                    if (idx == botFightPlan.Count - 1)
                        idx = 0;
                    else
                        idx++;

                    var kagotchiStats = new csFighterStatsText();
                    kagotchiStats.Hitpoints = defender.Hitpoints.ToString();
                    kagotchiStats.Stamina = defender.Stamina.ToString();
                    kagotchiStats.Mana = defender.Mana.ToString();

                    var botStats = new csFighterStatsText();
                    botStats.Hitpoints = attacker.Hitpoints.ToString();
                    botStats.Stamina = attacker.Stamina.ToString();
                    botStats.Mana = attacker.Mana.ToString();

                    turn.Kagotchi = kagotchiStats;
                    turn.Bot = botStats;
                }

                turn.Idx = idx;

                return turn;
            }

            foreach (var weakness in defender.Weaknesses)
            {
                if (attackerPlan.MagicalPower.Core == weakness.Weakness)
                {
                    attackerPlan.MagicalPower.IsStrongAgainst = true;
                    attackerPlan.MagicalPower.WeaknessMultiplier = weakness.Multiplier;
                    turn.Description += defender.Name + " has a weakness against " + attackerPlan.MagicalPower.Name + " x" + weakness.Multiplier + System.Environment.NewLine;
                }
                    
            }

            if(attacker.Mana >= attackerPlan.MagicalPower.Mana)
            {
                if (attackerPlan.MagicalPower.Core == defenderPlan.MagicalDefense.DefenseType && defender.Mana > 0)
                {
                    damage = attackerPlan.MagicalPower.CastSpell() * DEFENSE_FACTOR;
                    turn.Description += attacker.Name + " used " + attackerPlan.MagicalPower.Name + " and only gave " + damage.ToString() + " damage points." + System.Environment.NewLine;
                    turn.Description += defender.Name + " blocked your " + attackerPlan.MagicalPower.Name + " attack." + System.Environment.NewLine;
                }
                else
                {
                    damage = attackerPlan.MagicalPower.CastSpell();
                    turn.Description += attacker.Name + " used " + attackerPlan.MagicalPower.Name + " and gave " + damage.ToString() + " damage points." + System.Environment.NewLine;

                    if(defender is csKagotchi)
                    {
                        if (!defender.MagicalDefense.Any(s => s.DefenseType == attackerPlan.MagicalPower.Core) && !knowledgeList.Any(s => s.DefenseType == attackerPlan.MagicalPower.Core))
                        {
                            var defense = defender.AllMagicalDefenses.FirstOrDefault(s => s.DefenseType == attackerPlan.MagicalPower.Core);
                            knowledgeList.Add(defense);
                            txtNewKnowledge.text += "-" + defense.Name + " Level:" + defense.Level + System.Environment.NewLine;
                        }
                        else
                        {
                            var defense = defender.MagicalDefense.FirstOrDefault(s => s.DefenseType == attackerPlan.MagicalPower.Core);
                            if(defense != null && defense.Level < attackerPlan.MagicalPower.Level)
                            {
                                defense.Level++;
                                knowledgeList.Add(defense);
                                txtNewKnowledge.text += "-" + defense.Name + " Level:" + defense.Level + System.Environment.NewLine;
                            }
                            var defenseKnowledge = knowledgeList.FirstOrDefault(s => s.DefenseType == attackerPlan.MagicalPower.Core);
                            if (defenseKnowledge != null && defenseKnowledge.Level < attackerPlan.MagicalPower.Level)
                            {
                                defense.Level++;
                                knowledgeList.Add(defense);
                                txtNewKnowledge.text += "-" + defense.Name + " Level:" + defense.Level + System.Environment.NewLine;
                            }
                        }
                    }
                }


                if (attackerPlan.MagicalPower.Increase())
                {
                    turn.Description += attacker.Name + "'s " + attackerPlan.MagicalPower.Name + " increased by " + attackerPlan.MagicalPower.Factor + " it's now " + attackerPlan.MagicalPower.Value + System.Environment.NewLine;
                }

                defender.Hitpoints -= Mathf.RoundToInt(damage);
                if (defender.Hitpoints < 0)
                    defender.Hitpoints = 0;
                attacker.Mana -= Mathf.RoundToInt(attackerPlan.MagicalPower.Mana);
            }

            if (attacker is csKagotchi)
            {
                if (idx == kagotchiFightPlan.Count - 1)
                    idx = 0;
                else
                    idx++;

                var kagotchiStats = new csFighterStatsText();
                kagotchiStats.Hitpoints = attacker.Hitpoints.ToString();
                kagotchiStats.Stamina = attacker.Stamina.ToString();
                kagotchiStats.Mana = attacker.Mana.ToString();

                var botStats = new csFighterStatsText();
                botStats.Hitpoints = defender.Hitpoints.ToString();
                botStats.Stamina = defender.Stamina.ToString();
                botStats.Mana = defender.Mana.ToString();

                turn.Kagotchi = kagotchiStats;
                turn.Bot = botStats;
            }
            else if (attacker is csBot)
            {
                if (idx == botFightPlan.Count - 1)
                    idx = 0;
                else
                    idx++;

                var kagotchiStats = new csFighterStatsText();
                kagotchiStats.Hitpoints = defender.Hitpoints.ToString();
                kagotchiStats.Stamina = defender.Stamina.ToString();
                kagotchiStats.Mana = defender.Mana.ToString();

                var botStats = new csFighterStatsText();
                botStats.Hitpoints = attacker.Hitpoints.ToString();
                botStats.Stamina = attacker.Stamina.ToString();
                botStats.Mana = attacker.Mana.ToString();

                turn.Kagotchi = kagotchiStats;
                turn.Bot = botStats;
            }
        }

        if (attackerPlan.PhysicalPower != null)
        {
            var meditation = attacker.PassivePower.First(s => s.Name == "Meditation");
            if (attacker.Stamina < 0 || attacker.Stamina < attackerPlan.PhysicalPower.Stamina)
                meditation.IsInUse = true;

            if (meditation.IsInUse == true)
            {
                var meditationValue = meditation.Use();
                if (meditationValue < 1.0f)
                    meditationValue = 1.0f;

                if (meditation.Increase())
                {
                    turn.Description += attacker.Name + "'s " + meditation.Name + " increased by " + meditation.Factor + " it's now " + meditation.Value + System.Environment.NewLine;
                }

                attacker.Stamina += Mathf.RoundToInt(meditationValue);

                if (attacker.Stamina > attacker.Dexterity)
                    attacker.Stamina = attacker.Dexterity;

                if (attacker.Stamina >= attacker.Dexterity)
                    meditation.IsInUse = false;

                if(attacker is csKagotchi)
                {
                    if (idx == kagotchiFightPlan.Count - 1)
                        idx = 0;
                    else
                        idx++;

                    var kagotchiStats = new csFighterStatsText();
                    kagotchiStats.Hitpoints = attacker.Hitpoints.ToString();
                    kagotchiStats.Stamina = attacker.Stamina.ToString();
                    kagotchiStats.Mana = attacker.Mana.ToString();

                    var botStats = new csFighterStatsText();
                    botStats.Hitpoints = defender.Hitpoints.ToString();
                    botStats.Stamina = defender.Stamina.ToString();
                    botStats.Mana = defender.Mana.ToString();

                    turn.Kagotchi = kagotchiStats;
                    turn.Bot = botStats;
                }
                else if(attacker is csBot)
                {
                    if (idx == botFightPlan.Count - 1)
                        idx = 0;
                    else
                        idx++;

                    var kagotchiStats = new csFighterStatsText();
                    kagotchiStats.Hitpoints = defender.Hitpoints.ToString();
                    kagotchiStats.Stamina = defender.Stamina.ToString();
                    kagotchiStats.Mana = defender.Mana.ToString();

                    var botStats = new csFighterStatsText();
                    botStats.Hitpoints = attacker.Hitpoints.ToString();
                    botStats.Stamina = attacker.Stamina.ToString();
                    botStats.Mana = attacker.Mana.ToString();

                    turn.Kagotchi = kagotchiStats;
                    turn.Bot = botStats;
                }

                turn.Idx = idx;
                return turn;
            }

            if (attacker.Stamina >= attackerPlan.PhysicalPower.Stamina)
            {
                if (attackerPlan.PhysicalPower.AttackType == defenderPlan.PhysicalDefense.DefenseType && defender.Stamina > 0)
                {
                    damage = attackerPlan.PhysicalPower.Attack() * DEFENSE_FACTOR;
                    turn.Description += attacker.Name + " used " + attackerPlan.PhysicalPower.Name + " and only gave " + damage.ToString() + " damage points." + System.Environment.NewLine;
                    turn.Description += defender.Name + " blocked your " + attackerPlan.PhysicalPower.Name + " attack." + System.Environment.NewLine;
                }
                else
                {
                    damage = attackerPlan.PhysicalPower.Attack();
                    turn.Description += attacker.Name + " used " + attackerPlan.PhysicalPower.Name + " and gave " + damage.ToString() + " damage points." + System.Environment.NewLine;
                }

                if (attackerPlan.PhysicalPower.Increase())
                {
                    turn.Description += attacker.Name + "'s " + attackerPlan.PhysicalPower.Name + " increased by " + attackerPlan.PhysicalPower.Factor + " it's now " + attackerPlan.PhysicalPower.Value + System.Environment.NewLine;
                }

                defender.Hitpoints -= Mathf.RoundToInt(damage);
                if (defender.Hitpoints < 0)
                    defender.Hitpoints = 0;
                attacker.Stamina -= Mathf.RoundToInt(attackerPlan.PhysicalPower.Stamina);
            }

            if(attacker is csKagotchi)
            {
                if (idx == kagotchiFightPlan.Count - 1)
                    idx = 0;
                else
                    idx++;

                var kagotchiStats = new csFighterStatsText();
                kagotchiStats.Hitpoints = attacker.Hitpoints.ToString();
                kagotchiStats.Stamina = attacker.Stamina.ToString();
                kagotchiStats.Mana = attacker.Mana.ToString();

                var botStats = new csFighterStatsText();
                botStats.Hitpoints = defender.Hitpoints.ToString();
                botStats.Stamina = defender.Stamina.ToString();
                botStats.Mana = defender.Mana.ToString();

                turn.Kagotchi = kagotchiStats;
                turn.Bot = botStats;
            }
            else if(attacker is csBot)
            {
                if (idx == botFightPlan.Count - 1)
                    idx = 0;
                else
                    idx++;

                var kagotchiStats = new csFighterStatsText();
                kagotchiStats.Hitpoints = defender.Hitpoints.ToString();
                kagotchiStats.Stamina = defender.Stamina.ToString();
                kagotchiStats.Mana = defender.Mana.ToString();

                var botStats = new csFighterStatsText();
                botStats.Hitpoints = attacker.Hitpoints.ToString();
                botStats.Stamina = attacker.Stamina.ToString();
                botStats.Mana = attacker.Mana.ToString();

                turn.Kagotchi = kagotchiStats;
                turn.Bot = botStats;
            }
            
        }

        turn.Idx = idx;
        return turn;
    }