def calculate_hit(attack: AttackAction, player_hit_bonus, hit_resistances: Dict[str, int]) -> str: matched_hit_resistance = hit_resistances.get(attack.dmg_type, 0) hit_roll = roll(1, 20, advantage=attack.hit_bonus + player_hit_bonus) miss_roll = roll(1, 20, advantage=matched_hit_resistance) # print(f"Rolled {hit_roll} vs {miss_roll} diff is {hit_roll-miss_roll}") if hit_roll <= miss_roll: return "miss" if (hit_roll - miss_roll) > 10: return "critical" return "hit"
def use_effect(self, game: Game, source_player: Character, params: list[Any]) -> None: from utils.Dice import roll raw_roll = roll(5, 20, source_player.luck) previous_stamina = source_player.stamina source_player.stamina = min(raw_roll + source_player.stamina, source_player.max_stamina) restored_amt = source_player.stamina - previous_stamina game.discord_connection.send_game_chat_sync(f"Restored {restored_amt} stamina.", [source_player.discord_user])
def calculate_damage(attack: AttackAction, player_dmg_bonus, dmg_resistances: Dict[str, int]) -> int: matched_dmg_resistance = dmg_resistances.get(attack.dmg_type, 0) damage_roll = roll(attack.dmg_roll[0], attack.dmg_roll[1], advantage=(attack.dmg_bonus + player_dmg_bonus - matched_dmg_resistance)) return damage_roll
def tick(self, source_entity: Optional[CombatEntity] = None, game: Optional[Game] = None, **kwargs) -> None: if source_entity != self.parent: return from utils.Dice import roll from utils.CombatHelpers import assign_damage resistances = source_entity.resistances fire_dmg_res = resistances["dmg"].get(DamageTypes.Fire, 0) fire_hit_res = resistances["hit"].get(DamageTypes.Fire, 0) dmg_roll = roll(self.data["level"], 6, fire_dmg_res) game.discord_connection.send_game_chat_sync( f"The fire on {source_entity.combat_name} rages. " + assign_damage(game, None, source_entity, dmg_roll)) extinguish_roll = roll(1, 20, source_entity.luck + fire_hit_res) # 1, 2, 3, 4, 5 -> fire grows # 16, 17, 18, 19, 20 -> fire shrinks if extinguish_roll <= 5: self.data["level"] = self.data["level"] + 1 game.discord_connection.send_game_chat_sync( f"The fire on {source_entity.combat_name} grows even stronger." ) elif extinguish_roll > 15: self.data["level"] = self.data["level"] - 1 if self.data["level"] <= 0: self.parent.status_effects.remove(self) self.parent = None self.detach_triggers(game) game.discord_connection.send_game_chat_sync( f"The fire on {source_entity.combat_name} goes out.") else: game.discord_connection.send_game_chat_sync( f"The fire on {source_entity.combat_name} appears to shrink." ) self.hit_resistances[ DamageTypes.Fire] = fire_hit_res + self.data["level"]
def initiative(self) -> int: return roll(1, 20, advantage=1)
def initiative(self) -> int: return roll(1, 20)