diff --git a/backend/textsouls/admin.py b/backend/textsouls/admin.py index 77c2f1a..d749f43 100644 --- a/backend/textsouls/admin.py +++ b/backend/textsouls/admin.py @@ -11,7 +11,7 @@ from textsouls.models import CharacterClass from textsouls.models import CharacterState from textsouls.models import Character -from textsouls.models import DuelParticipants +from textsouls.models import DuelParticipant from textsouls.models import Duel ts_admin = Blueprint("ts_admin", __name__) @@ -37,5 +37,5 @@ admin.add_view(CommonView(CharacterClass, db.session)) admin.add_view(CommonView(CharacterState, db.session)) admin.add_view(CommonView(Character, db.session)) -admin.add_view(CommonView(DuelParticipants, db.session)) +admin.add_view(CommonView(DuelParticipant, db.session)) admin.add_view(CommonView(Duel, db.session)) diff --git a/backend/textsouls/main.py b/backend/textsouls/main.py index ac00e27..ca46a3a 100644 --- a/backend/textsouls/main.py +++ b/backend/textsouls/main.py @@ -8,7 +8,7 @@ from textsouls.models import CharacterClass from textsouls.models import CharacterState from textsouls.models import Character -from textsouls.models import DuelParticipants +from textsouls.models import DuelParticipant from textsouls.models import Duel main = Blueprint("main", __name__) @@ -21,5 +21,5 @@ register_api(main, CharacterState, "character_states") register_api(main, Character, "characters", "owner") -register_api(main, DuelParticipants, "duels_participants") +register_api(main, DuelParticipant, "duels_participant") register_api(main, Duel, "duels") diff --git a/backend/textsouls/models.py b/backend/textsouls/models.py index abf16bd..956208e 100644 --- a/backend/textsouls/models.py +++ b/backend/textsouls/models.py @@ -117,6 +117,11 @@ class Character(db.Model, SerializerMixin): nullable=False, default=1, ) + duels_participation = db.relationship( + "DuelParticipant", + backref=("charachter"), + lazy="dynamic", + ) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -143,8 +148,8 @@ class Character(db.Model, SerializerMixin): @property def battle_stats(self): - char_race = CharacterRace.query.get(self.character_race) - char_class = CharacterClass.query.get(self.character_class) + char_race = CharacterRace.query.get(self.character_race_id) + char_class = CharacterClass.query.get(self.character_class_id) attack_power = ( self.strength_base @@ -171,7 +176,7 @@ class Character(db.Model, SerializerMixin): } -class DuelParticipants(db.Model, SerializerMixin): +class DuelParticipant(db.Model, SerializerMixin): __tablename__ = "duels_participants" @@ -187,7 +192,7 @@ class DuelParticipants(db.Model, SerializerMixin): ) def __str__(self): - return self.duel_id, self.participant_id + return f"{self.duel_id}: {self.participant_id}" class Duel(db.Model, SerializerMixin): @@ -199,37 +204,52 @@ class Duel(db.Model, SerializerMixin): db.DateTime, nullable=False, default=datetime.datetime.now() ) participants = db.relationship( - "DuelParticipants", - backref=backref("duel", order_by="DuelParticipants.turn_order.asc()"), + "DuelParticipant", + backref=backref("duel", order_by="DuelParticipant.turn_order.asc()"), lazy="dynamic", ) - def attack(attacked_character, defensive_character): + def attack(self, attacked_character, defensive_character): defensive_character_endurance = ( - attacked_character.attack_power - - defensive_character.endurance_base + defensive_character.endurance_base + - attacked_character.battle_stats["attack_power"] ) return defensive_character_endurance - def defence(defensive_character): + def defence(self, defensive_character): procced = False - if randint(1 * defensive_character.defence_chance, 50) == 50: + if ( + randint( + int(10 * defensive_character.battle_stats["defence_chance"]), + 50, + ) + == 50 + ): procced is True return procced - def dodge(defensive_character): + def dodge(self, defensive_character): procced = False - if randint(1 * defensive_character.dodge_chance, 50) == 50: + if ( + randint( + int(10 * defensive_character.battle_stats["dodge_chance"]), 50 + ) + == 50 + ): procced is True return procced def duel_one_to_one(self): - character_first = self.participants[0] - character_second = self.participants[1] + character_first = Character.query.get( + self.participants[0].participant_id + ) + character_second = Character.query.get( + self.participants[1].participant_id + ) while ( character_first.endurance_base > 0 @@ -238,14 +258,18 @@ class Duel(db.Model, SerializerMixin): if not self.defence(character_second) or not self.dodge( character_second ): - self.attack(character_first, character_second) + character_second.endurance_base = self.attack( + character_first, character_second + ) if not self.defence(character_first) or not self.dodge( - character_second + character_first ): - self.attack(character_second, character_first) + character_first.endurance_base = self.attack( + character_second, character_first + ) if character_first.endurance_base > 0: return character_first.name - elif character_second.character_second > 0: + elif character_second.endurance_base > 0: return character_second.name else: return "Ничья"