public bool RollAttack(int opponentAC) { RedisManager redis = new RedisManager(); int roll = RollDie(20); if (roll >= opponentAC) { redis.AddToCombatLog(Character.Name + " rolled a " + roll + " and hit the opponent!"); return(true); } else { redis.AddToCombatLog(Character.Name + " rolled a " + roll + " and missed the opponent."); return(false); } }
public bool RollSpellSave(int casterStat, int saveStat, CharacterClass opponent) { RedisManager redis = new RedisManager(); int spellSaveDC = 10 + ConvertToMod(Character.stats[casterStat]); int opponentSave = RollDie(20) + ConvertToMod(opponent.Character.stats[saveStat]); if (opponentSave > spellSaveDC) { redis.AddToCombatLog(opponent.Character.Name + " rolled a " + opponentSave + ", succeeding the saving throw."); return(true); } else { redis.AddToCombatLog(opponent.Character.Name + " rolled a " + opponentSave + ", failing the saving throw!"); return(false); } }
public int RollDamage(int amountOfDice, int die, int stat, int bonus) { int damage = 0; for (int i = 0; i < amountOfDice; i++) { damage += RollDie(die); } if (stat >= 0) { damage += ConvertToMod(Character.stats[stat]) + bonus; } else { damage += bonus; } RedisManager redis = new RedisManager(); return(damage); }
public bool SecondaryAttack(bool isPlayer1, CharacterClass opponent) // returns true if killing blow { RedisManager redis = new RedisManager(); int damage = 0; switch (ClassName) { case "Barbarian": if (redis.HasResource(isPlayer1)) { redis.ApplyEffect(isPlayer1, "Raging"); redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + " goes into a rage, doing 2 extra damage on a successful hit!"); } break; case "Bard": if (redis.HasResource(isPlayer1) && redis.HasAction()) { redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + " used Hideous Laughter."); if (!RollSpellSave((int)Stat.Cha, (int)Stat.Wis, opponent)) { //redis.ApplyEffect(!isPlayer1, "Restrained"); redis.ApplyEffect(!isPlayer1, "Incapacitated"); redis.AddToCombatLog(opponent.Character.Name + " is incapacitated."); } redis.DecrementAction(); } break; case "Cleric": if (redis.HasResource(isPlayer1)) { redis.DecrementResource(isPlayer1); redis.HealDamage(isPlayer1, RollDamage(1, 4, (int)Stat.Wis, 3), this); } break; case "Druid": if (redis.HasResource(isPlayer1) && redis.HasAction()) { redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + " used Entangle."); if (!RollSpellSave((int)Stat.Wis, (int)Stat.Str, opponent)) { redis.ApplyEffect(!isPlayer1, "Incapacitated"); redis.AddToCombatLog(opponent.Character.Name + " is incapacitated!"); } else { redis.AddToCombatLog(opponent.Character.Name + " breaks through the vines, not being incapacitated!"); } redis.DecrementAction(); } break; case "Fighter": if (redis.HasResource(isPlayer1)) { redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + " gathers their resolve, pushing past their injuries!"); redis.HealDamage(isPlayer1, RollDamage(1, 10, -1, 5), this); } break; case "Monk": if (redis.HasResource(isPlayer1)) { redis.AddToCombatLog(Character.Name + " focuses their Chi, striking with great speed!"); for (int i = 0; i < 2; i++) { if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(1, 4, (int)Stat.Dex, 0); // 1d4 + DEX } } redis.DecrementResource(isPlayer1); } break; case "Paladin": if (redis.HasResource(isPlayer1)) { redis.ApplyEffect(isPlayer1, "Smiting"); redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + "'s weapon glows with radiant energy! (Smite)"); } break; case "Ranger": if (redis.HasResource(isPlayer1)) { redis.ApplyEffect(isPlayer1, "Marking"); redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + " applies a Hunter's Mark on the opponent! Their attacks deal extra damage."); } break; case "Rogue": if (RollAttack(opponent.ArmorClass)) { int sneakAttack; if (redis.HasResource(isPlayer1)) { sneakAttack = RollDie(6); redis.AddToCombatLog(Character.Name + " has the advantage of stealth, dealing extra damage with this attack!"); } else { sneakAttack = 0; } damage = RollDamage(1, 4, (int)Stat.Dex, sneakAttack); // 1d4 + DEX + 1d6(Sneak Attack) redis.DecrementResource(isPlayer1); } break; case "Sorcerer": if (redis.HasResource(isPlayer1)) { redis.AddToCombatLog(Character.Name + " conjures up a bolt of chaotic energy!"); if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(2, 8, -1, RollDie(6)); // 2d8 + 1d6 } redis.DecrementResource(isPlayer1); } break; case "Warlock": if (redis.HasResource(isPlayer1)) { redis.ApplyEffect(isPlayer1, "Hexing"); redis.DecrementResource(isPlayer1); redis.AddToCombatLog(Character.Name + " hexes the opponent! Their attacks deal extra damage."); } break; case "Wizard": if (redis.HasResource(isPlayer1)) { redis.AddToCombatLog(Character.Name + " fires three magic missiles guaranteed to hit!"); damage = RollDamage(3, 4, -1, 3); // 3d4 + 3 redis.DecrementAction(); redis.DecrementResource(isPlayer1); } break; default: break; } bool over; if (damage != 0) { over = redis.ApplyDamage(isPlayer1, damage, Character.Name); if (over) { //redis.MatchOver(); // Probably pass isPlayer return(true); } } return(false); }
public bool PrimaryAttack(bool isPlayer1, CharacterClass opponent) // returns true if killing blow { RedisManager redis = new RedisManager(); int damage = 0; switch (ClassName) { case "Barbarian": if (RollAttack(opponent.ArmorClass)) { int rage = 0; if (redis.CheckIfEffectActive(isPlayer1, "Raging")) { rage = 2; } damage = RollDamage(1, 12, (int)Stat.Str, rage); // 1d12 + STR + 2(Rage damage if active) } break; case "Bard": if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(1, 8, (int)Stat.Dex, 0); // 1d8 + DEX } break; case "Cleric": if (!RollSpellSave((int)Stat.Wis, (int)Stat.Dex, opponent)) // 1d8(DEX Save) { damage = RollDie(8); } break; case "Druid": if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(1, 8, (int)Stat.Wis, 0); // 1d8 + WIS } break; case "Fighter": if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(2, 6, (int)Stat.Str, 0); // 2d6 + STR } break; case "Monk": if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(1, 4, (int)Stat.Dex, 0); // 1d4 + DEX } break; case "Paladin": if (RollAttack(opponent.ArmorClass)) { int smite = 0; if (redis.CheckIfEffectActive(isPlayer1, "Smiting")) { smite = RollDie(8); //redis.DecrementResource(isPlayer1); redis.RemoveEffect(isPlayer1, "Smiting"); } damage = RollDamage(1, 8, (int)Stat.Str, smite); // 1d8 + STR } break; case "Ranger": if (RollAttack(opponent.ArmorClass)) { int mark = 0; if (redis.CheckIfEffectActive(isPlayer1, "Marking")) { mark = RollDie(6); } damage = RollDamage(1, 8, (int)Stat.Dex, mark); // 1d8 + DEX } break; case "Rogue": if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(1, 4, (int)Stat.Dex, RollDie(6)); // 1d4 + DEX + 1d6(Sneak Attack) redis.DecrementResource(isPlayer1); } break; case "Sorcerer": if (!RollSpellSave((int)Stat.Cha, (int)Stat.Con, opponent)) // 1d6(CON Save) { damage = RollDie(6); } break; case "Warlock": if (RollAttack(opponent.ArmorClass)) { int hex = 0; if (redis.CheckIfEffectActive(isPlayer1, "Hexing")) { hex = RollDie(6); } damage = RollDamage(1, 10, (int)Stat.Cha, hex); // 1d10 + CHA } break; case "Wizard": if (RollAttack(opponent.ArmorClass)) { damage = RollDamage(1, 10, (int)Stat.Int, 0); // 1d10 + INT } break; default: break; } redis.DecrementAction(); bool over; if (damage != 0) { over = redis.ApplyDamage(isPlayer1, damage, Character.Name); if (over) { //redis.MatchOver(); // Probably pass isPlayer return(true); } } return(false); }
public Arena(Character player1, Character player2) { InitializeComponent(); redis = new RedisManager(); redis.MatchOver(); // Flushing DB in case of leftover values // Names lblPlayer1.Text = player1.Title; lblPlayer2.Text = player2.Title; // Pictures picPlayer1.Image = player1.Picture; picPlayer2.Image = player2.Picture; // Characters this.player1 = player1; this.player2 = player2; // Character Classes player1Class = new CharacterClass(player1); player2Class = new CharacterClass(player2); // Max Health lblMaxHP1.Text = player1Class.MaxHealth.ToString(); lblMaxHP2.Text = player2Class.MaxHealth.ToString(); // Max Resources lblMaxResource1.Text = player1Class.MaxResource.ToString(); lblMaxResource2.Text = player2Class.MaxResource.ToString(); // Armor Class lblAC1.Text = player1Class.ArmorClass.ToString(); lblAC2.Text = player2Class.ArmorClass.ToString(); // Ability Names btnPrimary1.Text = player1Class.PrimaryName; btnPrimary2.Text = player2Class.PrimaryName; btnSecondary1.Text = player1Class.SecondaryName; btnSecondary2.Text = player2Class.SecondaryName; // Match Start redis.MatchStart(player1Class, player2Class); // Roll Initiative if (player1Class.RollDie(20) >= player2Class.RollDie(20)) { redis.SetTurn(true); redis.AddToCombatLog("Player 1 plays first."); lblTurn.Text = "<< Player 1's turn."; //btnPrimary1.Enabled = true; //btnSecondary1.Enabled = true; btnPrimary2.Enabled = false; btnSecondary2.Enabled = false; } else { redis.SetTurn(false); redis.AddToCombatLog("Player 2 plays first."); lblTurn.Text = "Player 2's turn. >>"; btnPrimary1.Enabled = false; btnSecondary1.Enabled = false; //btnPrimary2.Enabled = true; //btnSecondary2.Enabled = true; } // Combat Log txtCombatLog.Text = redis.GetCombatLog(); // Action lblAction.Text = redis.GetAction().ToString(); // Current Health lblCurrentHP1.Text = redis.GetHP(true).ToString(); lblCurrentHP2.Text = redis.GetHP(false).ToString(); // Current Resource lblCurrentResource1.Text = redis.GetResource(true).ToString(); lblCurrentResource2.Text = redis.GetResource(false).ToString(); }