void applyArmEffect(Arm arm, ArmAspect armAspect) { switch (arm) { case Arm.NORMAL: // No effect break; case Arm.HOOK: // Increases chances of dice attack possibleAttacks.Add(Attack.DICE_ATTACK); if (armAspect == ArmAspect.SILVER) { diceAttackLv = Mathf.Max(0.5f, diceAttackLv); } else if (armAspect == ArmAspect.GOLD) { diceAttackLv = Mathf.Max(1f, diceAttackLv); } break; case Arm.POWER_GLOW: // +20% damage double extraAttack = 1; if (armAspect == ArmAspect.NORMAL) { extraAttack = 1.2; } else if (armAspect == ArmAspect.SILVER) { extraAttack = 1.5; } else if (armAspect == ArmAspect.GOLD) { extraAttack = 2.5; } damageAgainstHealth = System.Math.Round(damageAgainstHealth * extraAttack); break; case Arm.BLADE: // Increases chances of normal attack possibleAttacks.Add(Attack.NORMAL_ATTACK); extraAttack = 1; if (armAspect == ArmAspect.NORMAL) { extraAttack = 1; } else if (armAspect == ArmAspect.SILVER) { extraAttack = 1.2; } else if (armAspect == ArmAspect.GOLD) { extraAttack = 1.5; } damageAgainstHealth = System.Math.Round(damageAgainstHealth * extraAttack); break; case Arm.BUZZSAW: // Allows milling attacks possibleAttacks.Add(Attack.MILL); if (armAspect == ArmAspect.SILVER) { buzzsawAttackLv = Mathf.Max(0.5f, buzzsawAttackLv); } else if (armAspect == ArmAspect.GOLD) { buzzsawAttackLv = Mathf.Max(0.75f, buzzsawAttackLv); } break; case Arm.SHIELD: // +20% health float extraHealth = 1; if (armAspect == ArmAspect.NORMAL) { extraHealth = 1.2f; } else if (armAspect == ArmAspect.SILVER) { extraHealth = 2f; } else if (armAspect == ArmAspect.GOLD) { extraHealth = 4f; } multiplyMaxHealth(extraHealth); break; case Arm.FAN: // Allows discarding attacks possibleAttacks.Add(Attack.DISCARD); if (armAspect == ArmAspect.SILVER) { fanAttackLv = Mathf.Max(0.5f, fanAttackLv); } else if (armAspect == ArmAspect.GOLD) { fanAttackLv = Mathf.Max(0.75f, fanAttackLv); } break; case Arm.GRAPNEL: // Increases dice damage (default is min .4, max .8) if (armAspect == ArmAspect.NORMAL) { damageAgainstDiceMin += 0.05f; } else if (armAspect == ArmAspect.SILVER) { damageAgainstDiceMin += 0.10f; } else if (armAspect == ArmAspect.GOLD) { damageAgainstDiceMin += 0.20f; } damageAgainstDiceMax += 0.2f; damageAgainstDiceMin = Mathf.Min(0.99f, damageAgainstDiceMin); damageAgainstDiceMax = Mathf.Min(1, damageAgainstDiceMax); break; case Arm.SALVE: // Allows healing possibleAttacks.Add(Attack.HEAL); if (armAspect == ArmAspect.NORMAL) { healLv = Mathf.Max(0.33f, healLv); } else if (armAspect == ArmAspect.SILVER) { healLv = Mathf.Max(0.4f, healLv); } else if (armAspect == ArmAspect.GOLD) { healLv = Mathf.Max(0.75f, healLv); } break; case Arm.FORBIDDEN_RELIC: // Deal high damage by paying health possibleAttacks.Add(Attack.RECOIL_ATTACK); if (armAspect == ArmAspect.NORMAL) { recoilAttackLv = Mathf.Max(2, recoilAttackLv); recoilAttackCost = System.Math.Max(0.2, recoilAttackCost); } else if (armAspect == ArmAspect.SILVER) { recoilAttackLv = Mathf.Max(4, recoilAttackLv); recoilAttackCost = System.Math.Max(0.25, recoilAttackCost); } else if (armAspect == ArmAspect.GOLD) { recoilAttackLv = Mathf.Max(8, recoilAttackLv); recoilAttackCost = System.Math.Max(0.3, recoilAttackCost); } break; case Arm.SIPHON: // Drain health possibleAttacks.Add(Attack.DRAIN); if (armAspect == ArmAspect.NORMAL) { drainLv = System.Math.Max(0.33, drainLv); } else if (armAspect == ArmAspect.SILVER) { drainLv = System.Math.Max(0.8, drainLv); } else if (armAspect == ArmAspect.GOLD) { drainLv = System.Math.Max(1.5, drainLv); } break; case Arm.BATTERY: // Allows boosting attack possibleAttacks.Add(Attack.CHARGE); if (armAspect == ArmAspect.NORMAL) { chargeLv = Mathf.Max(1.2f, chargeLv); } else if (armAspect == ArmAspect.SILVER) { chargeLv = Mathf.Max(2f, chargeLv); } else if (armAspect == ArmAspect.GOLD) { chargeLv = Mathf.Max(3.5f, chargeLv); } break; case Arm.MIASMA: // Halve all health gains float healMod = 1; if (armAspect == ArmAspect.NORMAL) { healMod = 0.5f; } else if (armAspect == ArmAspect.SILVER) { healMod = 0.25f; } else if (armAspect == ArmAspect.GOLD) { healMod = 0.1f; } Player.healingModifier *= healMod; break; case Arm.AEGIS: // Lower damage of attack rolls float damageReduction = 1; if (armAspect == ArmAspect.NORMAL) { damageReduction = 0.8f; } else if (armAspect == ArmAspect.SILVER) { damageReduction = 0.5f; } else if (armAspect == ArmAspect.GOLD) { damageReduction = 0.25f; } protectionShields = 1 - ((1 - protectionShields) * damageReduction); break; case Arm.CARTILAGE: // Can curse (x0.5 dice for one turn) possibleAttacks.Add(Attack.CURSE); if (armAspect == ArmAspect.NORMAL) { curseLv = System.Math.Min(0.5, curseLv); } else if (armAspect == ArmAspect.SILVER) { curseLv = System.Math.Min(0.25, curseLv); } else if (armAspect == ArmAspect.GOLD) { curseLv = System.Math.Min(0.1, curseLv); } break; case Arm.FLOE: // Weaken cards in hand possibleAttacks.Add(Attack.WEAKEN_CARDS); if (armAspect == ArmAspect.NORMAL) { floeAttackLv = Mathf.Min(0.85f, floeAttackLv); } else if (armAspect == ArmAspect.SILVER) { floeAttackLv = Mathf.Min(0.7f, floeAttackLv); } else if (armAspect == ArmAspect.GOLD) { floeAttackLv = Mathf.Min(0.5f, floeAttackLv); } break; case Arm.ILLUSIONIST: // Swap cards in hand for random ones possibleAttacks.Add(Attack.SWAP_CARDS); if (armAspect == ArmAspect.SILVER) { magicianAttackLv = Mathf.Min(0.85f, magicianAttackLv); } else if (armAspect == ArmAspect.GOLD) { magicianAttackLv = Mathf.Min(0.7f, magicianAttackLv); } break; } }
public void TestSpecialEnemyDict() { Enemy.initializeSpecialEnemyDict(); Arm firstArm = Arm.NORMAL; Arm lastArm = Arm.FAN; // Nº special enemies (11 arms * 6 variants (6N, 8N, 6S, 8S, 6G, 8G)) Assert.AreEqual(12 * 6, Enemy.specialEnemyDict.Keys.Count); // Ranks of first and last 6-armed enemy int first6Rank = 110; int last6Rank = 220; Assert.AreEqual(firstArm, Enemy.specialEnemyDict[first6Rank - 1].arm); Assert.AreEqual(6, Enemy.specialEnemyDict[first6Rank - 1].nArms); Assert.AreEqual(ArmAspect.NORMAL, Enemy.specialEnemyDict[first6Rank - 1].aspect); Assert.AreEqual(lastArm, Enemy.specialEnemyDict[last6Rank - 1].arm); Assert.AreEqual(6, Enemy.specialEnemyDict[last6Rank - 1].nArms); Assert.AreEqual(ArmAspect.NORMAL, Enemy.specialEnemyDict[last6Rank - 1].aspect); // Ranks of first and last 8-armed enemy int first8Rank = 230; int last8Rank = 340; Assert.AreEqual(firstArm, Enemy.specialEnemyDict[first8Rank - 1].arm); Assert.AreEqual(8, Enemy.specialEnemyDict[first8Rank - 1].nArms); Assert.AreEqual(ArmAspect.NORMAL, Enemy.specialEnemyDict[first8Rank - 1].aspect); Assert.AreEqual(lastArm, Enemy.specialEnemyDict[last8Rank - 1].arm); Assert.AreEqual(8, Enemy.specialEnemyDict[last8Rank - 1].nArms); Assert.AreEqual(ArmAspect.NORMAL, Enemy.specialEnemyDict[last8Rank - 1].aspect); // Ranks of first and last silver 6-armed enemy int first6SRank = 350; int last6SRank = 460; Assert.AreEqual(firstArm, Enemy.specialEnemyDict[first6SRank - 1].arm); Assert.AreEqual(6, Enemy.specialEnemyDict[first6SRank - 1].nArms); Assert.AreEqual(ArmAspect.SILVER, Enemy.specialEnemyDict[first6SRank - 1].aspect); Assert.AreEqual(lastArm, Enemy.specialEnemyDict[last6SRank - 1].arm); Assert.AreEqual(6, Enemy.specialEnemyDict[last6SRank - 1].nArms); Assert.AreEqual(ArmAspect.SILVER, Enemy.specialEnemyDict[last6SRank - 1].aspect); // Ranks of first and last silver 8-armed enemy int first8SRank = 470; int last8SRank = 580; Assert.AreEqual(firstArm, Enemy.specialEnemyDict[first8SRank - 1].arm); Assert.AreEqual(8, Enemy.specialEnemyDict[first8SRank - 1].nArms); Assert.AreEqual(ArmAspect.SILVER, Enemy.specialEnemyDict[first8SRank - 1].aspect); Assert.AreEqual(lastArm, Enemy.specialEnemyDict[last8SRank - 1].arm); Assert.AreEqual(8, Enemy.specialEnemyDict[last8SRank - 1].nArms); Assert.AreEqual(ArmAspect.SILVER, Enemy.specialEnemyDict[last8SRank - 1].aspect); // Ranks of first and last gold 6-armed enemy int first6GRank = 590; int last6GRank = 700; Assert.AreEqual(firstArm, Enemy.specialEnemyDict[first6GRank - 1].arm); Assert.AreEqual(6, Enemy.specialEnemyDict[first6GRank - 1].nArms); Assert.AreEqual(ArmAspect.GOLD, Enemy.specialEnemyDict[first6GRank - 1].aspect); Assert.AreEqual(lastArm, Enemy.specialEnemyDict[last6GRank - 1].arm); Assert.AreEqual(6, Enemy.specialEnemyDict[last6GRank - 1].nArms); Assert.AreEqual(ArmAspect.GOLD, Enemy.specialEnemyDict[last6GRank - 1].aspect); // Ranks of first and last gold 8-armed enemy int first8GRank = 710; int last8GRank = 820; Assert.AreEqual(firstArm, Enemy.specialEnemyDict[first8GRank - 1].arm); Assert.AreEqual(8, Enemy.specialEnemyDict[first8GRank - 1].nArms); Assert.AreEqual(ArmAspect.GOLD, Enemy.specialEnemyDict[first8GRank - 1].aspect); Assert.AreEqual(lastArm, Enemy.specialEnemyDict[last8GRank - 1].arm); Assert.AreEqual(8, Enemy.specialEnemyDict[last8GRank - 1].nArms); Assert.AreEqual(ArmAspect.GOLD, Enemy.specialEnemyDict[last8GRank - 1].aspect); }
public SpecialEnemyInfo(int nArms, Arm arm, ArmAspect aspect) { this.nArms = nArms; this.arm = arm; this.aspect = aspect; }