From 894f25f03e49c6fb48c84cd0a0e491c9be0ad822 Mon Sep 17 00:00:00 2001 From: tcaxle Date: Sat, 11 Apr 2020 19:58:07 +0100 Subject: [PATCH] methods for calulating modifiers fucking everywhere --- app/__pycache__/models.cpython-38.pyc | Bin 20373 -> 28654 bytes app/migrations/0011_rollconfiguration_name.py | 20 + .../0012_rollconfiguration_successesauto.py | 19 + app/migrations/0013_auto_20200411_1727.py | 40 ++ app/migrations/0014_auto_20200411_1800.py | 43 ++ app/migrations/0015_auto_20200411_1844.py | 169 ++++++++ app/migrations/0016_auto_20200411_1851.py | 189 +++++++++ ...0011_rollconfiguration_name.cpython-38.pyc | Bin 0 -> 663 bytes ...configuration_successesauto.cpython-38.pyc | Bin 0 -> 678 bytes .../0013_auto_20200411_1727.cpython-38.pyc | Bin 0 -> 1986 bytes .../0014_auto_20200411_1800.cpython-38.pyc | Bin 0 -> 1069 bytes .../0015_auto_20200411_1844.cpython-38.pyc | Bin 0 -> 2154 bytes .../0016_auto_20200411_1851.cpython-38.pyc | Bin 0 -> 2519 bytes app/models.py | 371 +++++++++++++----- 14 files changed, 749 insertions(+), 102 deletions(-) create mode 100644 app/migrations/0011_rollconfiguration_name.py create mode 100644 app/migrations/0012_rollconfiguration_successesauto.py create mode 100644 app/migrations/0013_auto_20200411_1727.py create mode 100644 app/migrations/0014_auto_20200411_1800.py create mode 100644 app/migrations/0015_auto_20200411_1844.py create mode 100644 app/migrations/0016_auto_20200411_1851.py create mode 100644 app/migrations/__pycache__/0011_rollconfiguration_name.cpython-38.pyc create mode 100644 app/migrations/__pycache__/0012_rollconfiguration_successesauto.cpython-38.pyc create mode 100644 app/migrations/__pycache__/0013_auto_20200411_1727.cpython-38.pyc create mode 100644 app/migrations/__pycache__/0014_auto_20200411_1800.cpython-38.pyc create mode 100644 app/migrations/__pycache__/0015_auto_20200411_1844.cpython-38.pyc create mode 100644 app/migrations/__pycache__/0016_auto_20200411_1851.cpython-38.pyc diff --git a/app/__pycache__/models.cpython-38.pyc b/app/__pycache__/models.cpython-38.pyc index 0d97864d93d2459c465798e39f6f911f8c555e92..c013a72307721f41e1b20aed806e63e5d386dd21 100644 GIT binary patch literal 28654 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 literal 0 HcmV?d00001 diff --git a/app/migrations/__pycache__/0012_rollconfiguration_successesauto.cpython-38.pyc b/app/migrations/__pycache__/0012_rollconfiguration_successesauto.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ab4904b52ca57ebff80f2dbbfce3b68dc4eedd7 GIT binary patch literal 678 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 literal 0 HcmV?d00001 diff --git a/app/migrations/__pycache__/0016_auto_20200411_1851.cpython-38.pyc b/app/migrations/__pycache__/0016_auto_20200411_1851.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6da66e2cfc29f49761b52b8ecc7a1b1226c602d5 GIT binary patch literal 2519 zcmeH|OOx9~5XU7;vL)FLgjXQE2`>lmW7!P>LbBdn5*F4W6+@-URH2&HjOB6ZVMg+9 zmJ?NQ&4tgvg^$7q;4)WEdK8P430OEdrOUwcYD(=+pByX_nB{Br)suUi)l z<2Pk&J~kM;@aC7Hp$0W$V`4&Ii))EBu}tHZK`mkn$Q@nA(< zB%VfmBu$O9khC>&4#^`Lc@)WcjXZ|rag98I)#Vyrz-Yk-VXiH<5HSav8~68hIPZI~wUC>1m{oWT25PB=2fu z8_AAFt{{0&BUh2UuaOUse5jFYNIufYbtE@5vWsM>kv$~)8aY7nu|{qpxuua$kQ{2{ zQzW0QNOWo9(IeQ`Bk7G+`?*t-7FjIhg?@jq6Od(*1zY{Cet&x~2nJWTw`Dt=5kbO& ziDQy8=|eCBM;bC=!mgLz5FDiqLp3Oyl4V@T)(OOCISW#fu#N=>NJd#)TGCcN=}b9` zscaAt&X_opjp0M#kzy9Jf`>Vby_V#Z2$r&3c~LsYf}FOnWOHxB za8(jKPl$B)SIU97X(65cvhygr4>|JUOnL_>9h%VyzV)E&Jf0RTs$vdNwv;!HdBk8& zWJ>|G+B`jBdBLOd?3C@pf0&IJl4mL8e)Lc@W1dD!4*!7cn@1al9cO|``$)B|grt12 zjH^LgqfM)s5K(Xv4@ChZj5Z86VU&kFWzrq3l#{TSL4KpMt7l=T7O(z!)%&opAzP?p zU;1~}x(WViCg3X|;U)ky+=XCyIS=lgmGVJAMrE*ncdc!~DP(lFY;(e6X^&Ow`tn1OBu!8c11t14C&Web*4NSd=;)YO)6 zhm_t_)h*P`E9+(L=h8jMiqb9p3}&#pPJcGU1cJ)ukKNuZOIWYSl3q9BMUUNw1R3qY zp6jh|;2vz%EC1T6JA>}xOu!XvG~msrusL0;_LuG0W(|Jl{`_D42XpY9@oPEf9cQ9W r#%{IL)w+9hPSPmr(&Mr$%DDAnSL!QOAnvuQwyvwy%T>*|X3P2;c0;g$ literal 0 HcmV?d00001 diff --git a/app/models.py b/app/models.py index f4f896d..f6f6daf 100644 --- a/app/models.py +++ b/app/models.py @@ -9,7 +9,7 @@ from math import ceil ATTRIBUTES = [ ( "Physical", ( - ("STR", "Srength"), + ("STR", "Strength"), ("DEX", "Dexterity"), ("STA", "Stamina"), ), @@ -263,6 +263,10 @@ class NamedOneToOneField(models.OneToOneField): #-------------------------------- DICE ROLLING --------------------------------# #==============================================================================# class rollConfiguration(models.Model): + def __str__(self): + return self.name + name = NameField() + successesAuto = NamedIntegerField("Auto-Successes") r01 = DieField("1s", 1, ["NONE"]) r02 = DieField("2s", 2, ["NONE"]) r03 = DieField("3s", 3, ["NONE"]) @@ -274,7 +278,7 @@ class rollConfiguration(models.Model): r09 = DieField("9s", 9, ["SUCCESS"]) r10 = DieField("10s", 10, ["SUCCESS", "DOUBLE"]) - def roll(self, pool=1): + def roll(self, pool=1, successesStunt=0): listDice = [ self.r01, self.r02, @@ -297,7 +301,7 @@ class rollConfiguration(models.Model): listExplodingDisappearing.append(die.number) if "SUBTRACTING" in die: listSubtracting.append(die.number) - successes = 0 + successes = self.successesAuto + successesStunt listExploded, listDisappeared = [], [] listRoll = [0 for die in range(pool)] while 0 in listRoll: @@ -355,47 +359,158 @@ class characterBase(models.Model): def __str__(self): return self.name + #======== MODIFIER METHODS ========# + def modifierCharm(self, keyword): + charms = None + modifier = 0 + try: + charms = self.charmLunar_set.filter(active=True) + except: + pass + try: + charms = self.charmSolar_set.filter(active=True) + except: + pass + if charms: + for charm in charms: + modifier += charm.modifier(keyword) + return modifier + def modifierMerit(self, keyword): + merits = None + modifier = 0 + try: + merits = self.merit_set.filter(active=True) + except: + pass + if merits: + for merit in merits: + modifier += merit.modifier(keyword) + return modifier + def modifierSpeciality(self, keyword): + specialities = None + modifier = 0 + try: + specialities = self.speciality_set.filter(active=True) + except: + pass + if specialities: + for speciality in specialities: + modifier += speciality.modifier(keyword) + return modifier + def modifierTotal(self, keyword): + return self.modifierCharm(keyword) + self.modifierMerit(keyword) + self.modifierSpeciality(keyword) + #============ GENERAL =============# name = NameField() #=========== ATTRIBUTES ===========# - strength = DotField("Strength") - dexterity = DotField("Dexterity") - stamina = DotField("Stamina") - charisma = DotField("Charisma") - manipulation = DotField("Manipulation") - appearance = DotField("Apperance") - perception = DotField("Perception") - intelligence = DotField("Intelligence") - wits = DotField("Wits") + strength = DotField("Strength") + def attributeStrength(self): + return self.strength + self.modifierTotal("STRENGTH") + dexterity = DotField("Dexterity") + def attributeDexterity(self): + return self.dexterity + self.modifierTotal("DEXTERITY") + stamina = DotField("Stamina") + def attributeStamina(self): + return self.stamina + self.modifierTotal("STAMINA") + charisma = DotField("Charisma") + def attributeCharisma(self): + return self.charisma + self.modifierTotal("CHARISMA") + manipulation = DotField("Manipulation") + def attributeManipulation(self): + return self.manipulation + self.modifierTotal("MANIPULATION") + appearance = DotField("Apperance") + def attributeAppearance(self): + return self.appearance + self.modifierTotal("APPEARANCE") + perception = DotField("Perception") + def attributePerception(self): + return self.perception + self.modifierTotal("PERCEPTION") + intelligence = DotField("Intelligence") + def attributeIntelligence(self): + return self.intelligence + self.modifierTotal("INTELLIGENCE") + wits = DotField("Wits") + def attributeWits(self): + return self.wits + self.modifierTotal("WITS") #=========== ABILITIES ============# - archery = DotField("Archery") - athletics = DotField("Athletics") - awareness = DotField("Awareness") - brawl = DotField("Brawl") - bureaucracy = DotField("Bureaucracy") - craft = DotField("Craft") - dodge = DotField("Dodge") - integrity = DotField("Integrity") + archery = DotField("Archery") + def abilityArchery(self): + return self.archery + self.modifierTotal("ARCHERY") + athletics = DotField("Athletics") + def abilityAthletics(self): + return self.athletics + self.modifierTotal("ATHLETICS") + awareness = DotField("Awareness") + def abilityAwareness(self): + return self.awareness + self.modifierTotal("AWARENESS") + brawl = DotField("Brawl") + def abilityBrawl(self): + return self.brawl + self.modifierTotal("BRAWL") + bureaucracy = DotField("Bureaucracy") + def abilityBureaucracy(self): + return self.bureaucracy + self.modifierTotal("BUREAUCRACY") + craft = DotField("Craft") + def abilityCraft(self): + return self.craft + self.modifierTotal("CRAFT") + dodge = DotField("Dodge") + def abilityDodge(self): + return self.dodge + self.modifierTotal("DODGE") + integrity = DotField("Integrity") + def abilityIntegrity(self): + return self.integrity + self.modifierTotal("INTEGRITY") investigation = DotField("Investigation") - larceny = DotField("Larceny") - linguistics = DotField("Linguistics") - lore = DotField("Lore") - martialArts = DotField("MartialArts") - medicine = DotField("Medicine") - melee = DotField("Melee") - occult = DotField("Occult") - performance = DotField("Performance") - presence = DotField("Presence") - resistance = DotField("Resistance") - ride = DotField("Ride") - sail = DotField("Sail") - socialize = DotField("Socialize") - stealth = DotField("Stealth") - survival = DotField("Survival") - thrown = DotField("Thrown") - war = DotField("War") + def abilityInvestigation(self): + return self.investigation + self.modifierTotal("INVESTIGATION") + larceny = DotField("Larceny") + def abilityLarceny(self): + return self.larceny + self.modifierTotal("LARCENY") + linguistics = DotField("Linguistics") + def abilityLinguistics(self): + return self.linguistics + self.modifierTotal("LINGUISTICS") + lore = DotField("Lore") + def abilityLore(self): + return self.lore + self.modifierTotal("LORE") + martialArts = DotField("MartialArts") + def abilityMartialArts(self): + return self.martialArts + self.modifierTotal("MARTIAL ARTS") + medicine = DotField("Medicine") + def abilityMedicine(self): + return self.medicine + self.modifierTotal("MEDICINE") + melee = DotField("Melee") + def abilityMelee(self): + return self.melee + self.modifierTotal("MELEE") + occult = DotField("Occult") + def abilityOccult(self): + return self.occult + self.modifierTotal("OCCULT") + performance = DotField("Performance") + def abilityPerformance(self): + return self.performance + self.modifierTotal("PERFORMANCE") + presence = DotField("Presence") + def abilityPresence(self): + return self.presence + self.modifierTotal("PRESENCE") + resistance = DotField("Resistance") + def abilityResistance(self): + return self.resistance + self.modifierTotal("RESISTANCE") + ride = DotField("Ride") + def abilityRide(self): + return self.ride + self.modifierTotal("RIDE") + sail = DotField("Sail") + def abilitySail(self): + return self.sail + self.modifierTotal("SAIL") + socialize = DotField("Socialize") + def abilitySocialize(self): + return self.socialize + self.modifierTotal("SOCIALIZE") + stealth = DotField("Stealth") + def abilityStealth(self): + return self.stealth + self.modifierTotal("STEALTH") + survival = DotField("Survival") + def abilitySurvival(self): + return self.survival + self.modifierTotal("SURVIVAL") + thrown = DotField("Thrown") + def abilityThrown(self): + return self.thrown + self.modifierTotal("THROWN") + war = DotField("War") + def abilityWar(self): + return self.war + self.modifierTotal("WAR") #============= MERITS =============# # Reverse relation @@ -418,11 +533,47 @@ class characterBase(models.Model): #============= ARMOR ==============# # Reverse relation # .itemArmor_set.all() + def armorSoak(self): + armor = None + modifier = 0 + try: + armor = self.itemArmor_set.filter(equipped=True) + except: + pass + if armor: + for item in armor: + modifier += item.soak + return modifier + def armorHardness(self): + armor = None + modifier = 0 + try: + armor = self.itemArmor_set.filter(equipped=True) + except: + pass + if armor: + for item in armor: + modifier += item.hardness + return modifier + def armorMobilityPenalty(self): + armor = None + modifier = 0 + try: + armor = self.itemArmor_set.filter(equipped=True) + except: + pass + if armor: + for item in armor: + modifier += item.mobilityPenalty + return modifier #============= ITEMS ==============# # Reverse relation # .item_set.all() + #============ ESSENCE =============# + essence = NamedIntegerField("Essence") + #============= HEALTH =============# health0 = NamedIntegerField("'-0' Health Levels") health1 = NamedIntegerField("'-1' Health Levels") @@ -435,75 +586,67 @@ class characterBase(models.Model): #============ STATICS =============# def resolve(self, speciality=None, mod=0): - if self.charmsActive(): - mod += sum([]) - if speciality: - mod += specility.modifier - return mod + ceil((self.wits + self.integrity) / 2) + return mod + ceil((self.attributeWits() + self.abilityIntegrity()) / 2) + self.modifierTotal("RESOLVE") + def guile(self, speciality=None, mod=0): - if self.charmsActive(): - mod += sum([]) - if speciality: - mod += specility.modifier - return mod + ceil((self.manipulation + self.socialize) / 2) + return mod + ceil((self.attributeManipulation() + self.abilitySocialize()) / 2) + self.modifierTotal("GUILE") + def soakNatural(self, mod=0): - if self.charmsActive(): - mod += sum([]) - return mod + self.stamina + return mod + self.attributeStamina() + self.modifierTotal("SOAK NATURAL") + def soakArmored(self, mod=0): - if self.armorEquipped.all(): - mod += sum([]) - return mod + return mod + self.armorSoak() + def soakTotal(self, mod=0): return mod + self.soakNatural() + self.soakArmored() + def hardness(self, mod=0): - if self.armorEquipped.all(): - mod += sum([]) - if self.charmsActive(): - mod += sum([]) - return mod + return mod + self.armorHardness() + self.modifierTotal("HARDNESS") + def joinBattle(self, mod=0): - if self.charmsActive(): - mod += sum([]) - return mod + self.wits + self.awareness + 3 + return mod + self.attributeWits() + self.abilityAwareness() + 3 + self.modifierTotal("JOIN BATTLE") + def evasion(self, mod=0): - if self.charmsActive(): - mod += sum([]) - return mod + ceil((self.dexterity + self.dodge) / 2) - sum([]) + return mod + ceil((self.attributeDexterity() + self.abilityDodge()) / 2) - self.armorMobilityPenalty() + self.modifierTotal("EVASION") + def rush(self, mod=0): - if self.charmsActive(): - mod += sum([]) - return mod + self.dexterity + self.athletics + return mod + self.attributeDexterity() + self.abilityAthletics() + self.modifierTotal("RUSH") + def disengage(self, mod=0): - if self.charmsActive(): - mod += sum([]) - return mod + self.dexterity + self.dodge + return mod + self.attributeDexterity() + self.abilityDodge() + self.modifierTotal("DISENGAGE") class characterExaltBase(characterBase): class Meta: abstract = True - #============ ESSENCE =============# + #============= MOTES ==============# #============= LIMIT ==============# #======= EXALTED EXPERIENCE =======# - #============= CHARMS =============# - pass class characterExaltSolar(characterExaltBase): - #============ SUPERNAL ============# + #======= SUPERNAL & FAVORED =======# + abilitySupernal = SingleChoiceField("Supernal Ability", ABILITIES) + abilityFavored = MultiChoiceField("Favoured Abilities", ABILITIES) - pass + #============= CHARMS =============# + # Reverse relation + # .charmSolar_set.all() class characterExaltLunar(characterExaltBase): + #============ FAVORED =============# + attributeFavored = MultiChoiceField("Favoured Attributes", ATTRIBUTES) + #========= SHAPESHIFTING ==========# - pass + #============= CHARMS =============# + # Reverse relation + # .charmLunar_set.all() #==============================================================================# #----------------------------------- ITEMS ------------------------------------# @@ -600,6 +743,42 @@ class charmBase(models.Model): description = DescriptionField() levelEssence = NamedIntegerField("Essence Level") levelKey = NamedIntegerField("Key Level") + active = NamedBooleanField("Active?") + rollConfiguration = NamedManyToManyField("Roll Configurations", rollConfiguration) + modifierAttribute = NamedManyToManyField("Attribute Modifiers", modifierAttribute) + modifierAbility = NamedManyToManyField("Abilities Modifiers", modifierAbility) + modifierStatic = NamedManyToManyField("Statics Modifiers", modifierStatic) + def modifier(self, keyword): + output = 0 + for modifierAttribute in self.modifierAttribute.all(): + if keyword == modifierAttribute.attribute: + output += modifierAttribute.value + for modifierAbility in self.modifierAbility.all(): + if keyword == modifierAbility.ability: + output += modifierAbility.value + for modifierStatic in self.modifierStatic.all(): + if keyword == modifierStatic.static: + output += modifierStatic.value + return output + +class charmSolar(charmBase): + ability = SingleChoiceField("Key Ability", ABILITIES) + character = NamedForeignKeyField("Character", characterExaltSolar) + +class charmLunar(charmBase): + attribute = SingleChoiceField("Key Attribute", ATTRIBUTES) + character = NamedForeignKeyField("Character", characterExaltLunar) + +#==============================================================================# +#----------------------------------- MERITS -----------------------------------# +#==============================================================================# +class merit(models.Model): + def __str__(self): + return self.name + + name = NameField() + description = DescriptionField() + dots = DotField("Dots") character = NamedForeignKeyField("Character", characterBase) active = NamedBooleanField("Active?") rollConfiguration = NamedManyToManyField("Roll Configurations", rollConfiguration) @@ -617,41 +796,29 @@ class charmBase(models.Model): for modifierStatic in self.modifierStatic.all(): if keyword == modifierStatic.static: output += modifierStatic.value - return - -class charmSolar(charmBase): - ability = SingleChoiceField("Key Ability", ABILITIES) - -class charmLunar(charmBase): - attribute = SingleChoiceField("Key Attribute", ATTRIBUTES) - -#==============================================================================# -#----------------------------------- MERITS -----------------------------------# -#==============================================================================# -class merit(models.Model): - def __str__(self): - return self.name - - name = NameField() - description = DescriptionField() - dots = DotField("Dots") - character = NamedForeignKeyField("Character", characterBase) - rollConfiguration = NamedManyToManyField("Roll Configurations", rollConfiguration) - modifierAttribute = NamedManyToManyField("Attribute Modifiers", modifierAttribute) - modifierAbility = NamedManyToManyField("Abilities Modifiers", modifierAbility) - modifierStatic = NamedManyToManyField("Statics Modifiers", modifierStatic) + return output #==============================================================================# #-------------------------------- SPECIALITIES --------------------------------# #==============================================================================# class speciality(models.Model): def __str__(self): - return "[{}] {}".format(self.ability, self.name) + return self.name - modifier = 2 name = NameField() - ability = SingleChoiceField("Ability", ABILITIES) character = NamedForeignKeyField("Character", characterBase) + active = NamedBooleanField("Active?") + modifierAbility = NamedManyToManyField("Abilities Modifiers", modifierAbility) + modifierStatic = NamedManyToManyField("Statics Modifiers", modifierStatic) + def modifier(self, keyword): + output = 0 + for modifierAbility in self.modifierAbility.all(): + if keyword == modifierAbility.ability: + output += modifierAbility.value + for modifierStatic in self.modifierStatic.all(): + if keyword == modifierStatic.static: + output += modifierStatic.value + return output #==============================================================================# #--------------------------------- INTIMACIES ---------------------------------#