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++; } }
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; }