massive, madman refactoring. What was I thinking?
This commit is contained in:
parent
0e97185ce8
commit
4d92acf3ee
455
app.py
455
app.py
@ -1,455 +0,0 @@
|
|||||||
from flask import Flask
|
|
||||||
from flask_cors import CORS
|
|
||||||
from flask_restx import Api, Resource
|
|
||||||
|
|
||||||
from models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model, mutation_model, \
|
|
||||||
check_model
|
|
||||||
from schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema, HPSchema, \
|
|
||||||
MutationSchema, CheckSchema
|
|
||||||
|
|
||||||
from encounters import EncounterTable
|
|
||||||
from mentattack import MentalAttackMatrix
|
|
||||||
from mutations import Mutations
|
|
||||||
from cybermods import CyberMods
|
|
||||||
|
|
||||||
import random
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
|
||||||
CORS(app)
|
|
||||||
|
|
||||||
app.config.SWAGGER_UI_JSONEDITOR = True
|
|
||||||
app.config['SWAGGER_UI_JSONEDITOR'] = True
|
|
||||||
api = Api(app, version='1.0', title='Gamma World Dice', description='Rolled Dice As A Service')
|
|
||||||
|
|
||||||
dice = api.namespace('dice', description='Dice operations')
|
|
||||||
ability = api.namespace('ability', description='Ability operations')
|
|
||||||
hp = api.namespace('hp', description='HP operations')
|
|
||||||
ma = api.namespace('ma', description='Mental Attack operations')
|
|
||||||
mut = api.namespace('mut', description='Mutation operations')
|
|
||||||
character = api.namespace('character', description='Character operations')
|
|
||||||
encounter = api.namespace('encounter', description='Encounter operations')
|
|
||||||
check = api.namespace('check', description='Check operations')
|
|
||||||
|
|
||||||
check_model = check.model('Check', check_model )
|
|
||||||
check_schema = CheckSchema()
|
|
||||||
|
|
||||||
ability_model = ability.model('Ability', ability_model)
|
|
||||||
ability_schema = AbilitySchema()
|
|
||||||
|
|
||||||
mutation_model = mut.model('Mutation', mutation_model)
|
|
||||||
mutation_schema = MutationSchema()
|
|
||||||
|
|
||||||
hp_model = hp.model('HP', hp_model)
|
|
||||||
hp_schema = HPSchema()
|
|
||||||
|
|
||||||
dice_model = dice.model('Dice', dice_model)
|
|
||||||
dice_schema = DiceSchema()
|
|
||||||
|
|
||||||
ma_model = ma.model('MA', ma_model)
|
|
||||||
ma_schema = MentalAttackSchema()
|
|
||||||
|
|
||||||
character_model = character.model('Character', character_model)
|
|
||||||
character_schema = CharacterSchema()
|
|
||||||
|
|
||||||
encounter_model = encounter.model('Encounter', encounter_model)
|
|
||||||
encounter_schema = EncounterSchema()
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/dice', methods=['POST'])
|
|
||||||
class RollDice(Resource):
|
|
||||||
@dice.expect(dice_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = dice_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
quantity = data.get('quantity')
|
|
||||||
geometry = data.get('geometry')
|
|
||||||
discard_lowest = data.get('discard_lowest')
|
|
||||||
if quantity is None or geometry is None:
|
|
||||||
return {"message": "Required dice data not provided"}, 400
|
|
||||||
return roll_dices(quantity, geometry, discard_lowest), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/ability', methods=['POST'])
|
|
||||||
class RollAbility(Resource):
|
|
||||||
@ability.expect(ability_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = ability_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
|
|
||||||
chartype = data.get('chartype')
|
|
||||||
attribute = data.get('ability')
|
|
||||||
|
|
||||||
return roll_ability_scores(chartype, attribute), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/hp', methods=['POST'])
|
|
||||||
class RollHP(Resource):
|
|
||||||
@hp.expect(hp_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = hp_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
chartype = data.get('chartype')
|
|
||||||
conscore = data.get('conscore')
|
|
||||||
if conscore is None:
|
|
||||||
return {"message": "A constitution score is required"}, 400
|
|
||||||
if chartype == 'human':
|
|
||||||
geometry = 8
|
|
||||||
else:
|
|
||||||
geometry = 6
|
|
||||||
return roll_dices(conscore, geometry, False), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/encounter', methods=['POST'])
|
|
||||||
class RollEncounter(Resource):
|
|
||||||
@encounter.expect(encounter_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = encounter_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
|
|
||||||
terrain = data.get('terrain').lower()
|
|
||||||
roll = roll_dices(1, 20, False).get('result')
|
|
||||||
et = EncounterTable()
|
|
||||||
creature = et.get_encounter(roll, terrain)
|
|
||||||
if creature is None:
|
|
||||||
creature = "All clear!"
|
|
||||||
|
|
||||||
return {"encounter": creature}, 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/attack/mental', methods=['POST'])
|
|
||||||
class RollMentalAttack(Resource):
|
|
||||||
@ma.expect(ma_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = ma_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
|
|
||||||
ams = data.get('ams')
|
|
||||||
dms = data.get('dms')
|
|
||||||
modifier = data.get('modifier')
|
|
||||||
|
|
||||||
result = {}
|
|
||||||
mam = MentalAttackMatrix()
|
|
||||||
needed = mam.get_attack_score(ams, dms)
|
|
||||||
result["needed"] = needed
|
|
||||||
outcome = None
|
|
||||||
if needed < 2:
|
|
||||||
outcome = "Automatic Success!"
|
|
||||||
elif needed > 20:
|
|
||||||
outcome = "Absolutely No Chance!"
|
|
||||||
else:
|
|
||||||
raw_roll = roll_dices(1, 20, False).get('result')
|
|
||||||
if modifier != 0:
|
|
||||||
result["original-roll"] = raw_roll
|
|
||||||
result["modifier"] = modifier
|
|
||||||
rolled = raw_roll + modifier # negative modifiers will subtract themselves naturally
|
|
||||||
result["adjusted-roll"] = rolled
|
|
||||||
else:
|
|
||||||
rolled = raw_roll
|
|
||||||
result["original-roll"] = rolled
|
|
||||||
|
|
||||||
if (rolled >= 20) and (needed <= 16):
|
|
||||||
outcome = "Devastating Success!"
|
|
||||||
elif needed <= rolled:
|
|
||||||
outcome = "Attack Successful!"
|
|
||||||
elif needed > rolled:
|
|
||||||
outcome = "Attack Failed!"
|
|
||||||
|
|
||||||
result["outcome"] = outcome
|
|
||||||
|
|
||||||
return result, 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/check', methods=['POST'])
|
|
||||||
class RollCheck(Resource):
|
|
||||||
@check.expect(check_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = check_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
|
|
||||||
ability_score = data.get('ability_score')
|
|
||||||
multiplier = data.get('multiplier')
|
|
||||||
|
|
||||||
threshold = ability_score * multiplier
|
|
||||||
rolled = roll_dices(1, 100, False).get('result')
|
|
||||||
if rolled < threshold:
|
|
||||||
return {'threshold': threshold, 'rolled': rolled, 'success': True}, 200
|
|
||||||
else:
|
|
||||||
return {'threshold': threshold, 'rolled': rolled, 'success': False}, 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/tohit', methods=['GET'])
|
|
||||||
class RollToHit(Resource):
|
|
||||||
@staticmethod
|
|
||||||
def get():
|
|
||||||
return roll_dices(1, 20, False), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/chance', methods=['GET'])
|
|
||||||
class RollChance(Resource):
|
|
||||||
@staticmethod
|
|
||||||
def get():
|
|
||||||
return roll_dices(1, 100, False), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/coinflip', methods=['GET'])
|
|
||||||
class RollCoinflip(Resource):
|
|
||||||
@staticmethod
|
|
||||||
def get():
|
|
||||||
return random.choice(['Heads', 'Tails']), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/mutations', methods=['POST'])
|
|
||||||
class RollMutations(Resource):
|
|
||||||
@mut.expect(mutation_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = mutation_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
|
|
||||||
conscore = data.get('conscore')
|
|
||||||
intscore = data.get('intscore')
|
|
||||||
|
|
||||||
return roll_mutations(conscore, intscore), 200
|
|
||||||
|
|
||||||
|
|
||||||
@api.route('/character/generate', methods=['POST'])
|
|
||||||
class GenerateCharacter(Resource):
|
|
||||||
@character.expect(character_model)
|
|
||||||
def post(self):
|
|
||||||
data = api.payload
|
|
||||||
errors = character_schema.validate(data)
|
|
||||||
if errors:
|
|
||||||
return errors, 400
|
|
||||||
chartype = data.get('chartype')
|
|
||||||
|
|
||||||
character_sheet = {}
|
|
||||||
if chartype == 'mutant':
|
|
||||||
character_sheet['animal-stock'] = (roll_mutant_animal())
|
|
||||||
ability_scores = roll_ability_scores(chartype)
|
|
||||||
character_sheet['abilities'] = ability_scores
|
|
||||||
character_sheet['hp'] = roll_hp(chartype, ability_scores['constitution'])
|
|
||||||
character_sheet['gold'] = roll_dices(4, 4, False).get('result') * 10
|
|
||||||
character_sheet['domar'] = roll_dices(2, 4, False).get('result') * 5
|
|
||||||
|
|
||||||
if chartype == 'humanoid' or chartype == 'mutant':
|
|
||||||
character_sheet['mutations'] = (
|
|
||||||
roll_mutations(ability_scores['constitution'], ability_scores['intelligence'])
|
|
||||||
)
|
|
||||||
|
|
||||||
if chartype == 'cyborg':
|
|
||||||
character_sheet['cybermods'] = (
|
|
||||||
roll_cybermods()
|
|
||||||
)
|
|
||||||
|
|
||||||
return character_sheet, 200
|
|
||||||
|
|
||||||
|
|
||||||
def roll_dices(dice_count, dice_sides, discard_lowest):
|
|
||||||
roll_results = []
|
|
||||||
discarded = []
|
|
||||||
for _ in range(dice_count):
|
|
||||||
roll_results.append(random.randint(1, dice_sides))
|
|
||||||
if discard_lowest and len(roll_results) > 0:
|
|
||||||
discarded.append(min(roll_results))
|
|
||||||
roll_results.remove(min(roll_results))
|
|
||||||
|
|
||||||
if discarded:
|
|
||||||
net_dice_count = dice_count - 1
|
|
||||||
mnemonic = str(dice_count) + "(-1)d" + str(dice_sides)
|
|
||||||
else:
|
|
||||||
mnemonic = str(dice_count) + 'd' + str(dice_sides)
|
|
||||||
net_dice_count = dice_count
|
|
||||||
|
|
||||||
result = {
|
|
||||||
'dice-set': {
|
|
||||||
'mnemonic': mnemonic,
|
|
||||||
'min-roll': net_dice_count,
|
|
||||||
'max-roll': dice_sides * net_dice_count
|
|
||||||
},
|
|
||||||
'rolls': roll_results,
|
|
||||||
'result': sum(roll_results)
|
|
||||||
}
|
|
||||||
if discarded:
|
|
||||||
result['discarded'] = discarded
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
def roll_ability_scores(chartype, attribute=None):
|
|
||||||
if attribute is None or attribute == "all":
|
|
||||||
ability_list = ['p-strength', 'm-strength', 'constitution', 'dexterity', 'charisma', 'intelligence']
|
|
||||||
else:
|
|
||||||
ability_list = [attribute]
|
|
||||||
|
|
||||||
ability_scores = {}
|
|
||||||
|
|
||||||
for abil in ability_list:
|
|
||||||
if ((chartype == 'human') and
|
|
||||||
((abil == 'intelligence') or
|
|
||||||
(abil == 'charisma') or
|
|
||||||
(abil == 'constitution'))):
|
|
||||||
roll = roll_dices(4, 6, False) # humans are special
|
|
||||||
if (abil == 'constitution') and roll["result"] > 18:
|
|
||||||
roll["capped"] = True
|
|
||||||
roll["result"] = 18
|
|
||||||
if (abil == 'intelligence' or abil == 'charisma') and roll["result"] > 21:
|
|
||||||
roll["capped"] = True
|
|
||||||
roll["result"] = 21
|
|
||||||
ability_scores[abil] = roll["result"]
|
|
||||||
else:
|
|
||||||
roll = roll_dices(4, 6, True) # nothing else is special
|
|
||||||
ability_scores[abil] = roll["result"]
|
|
||||||
|
|
||||||
return ability_scores
|
|
||||||
|
|
||||||
|
|
||||||
def roll_hp(chartype, conscore):
|
|
||||||
if chartype == 'human':
|
|
||||||
geometry = 8
|
|
||||||
else:
|
|
||||||
geometry = 6
|
|
||||||
return roll_dices(conscore, geometry, False).get('result')
|
|
||||||
|
|
||||||
|
|
||||||
def roll_cybermods():
|
|
||||||
"""
|
|
||||||
Cybermods are similar to mutations, except that they are artificial changes to the body,
|
|
||||||
where mutations are 'natural' changes to the body. Fewer cybermods are possible than with
|
|
||||||
mutations. So, you make one roll of 1d4, and then parse up the score between the two
|
|
||||||
types of mods, as you see fit. If no emphasis is specified, the score will be split as evenly
|
|
||||||
as possible. If the score is 1, then a physical mod will be the default.
|
|
||||||
:return: table of cybermods (in json format)
|
|
||||||
"""
|
|
||||||
cybermods_table = {}
|
|
||||||
|
|
||||||
cybermods_count = roll_dices(1, 4, False)["result"]
|
|
||||||
phys_cnt = split_number(cybermods_count)[1] # This ends up being the higher of the two numbers
|
|
||||||
ment_cnt = split_number(cybermods_count)[0]
|
|
||||||
cybermods_table['count'] = {'mental': ment_cnt, 'physical': phys_cnt}
|
|
||||||
|
|
||||||
mental_cybermods_scores = []
|
|
||||||
physical_cybermods_scores = []
|
|
||||||
|
|
||||||
for _ in range(ment_cnt):
|
|
||||||
mscore = roll_dices(1, 10, False).get('result')
|
|
||||||
if mscore in mental_cybermods_scores:
|
|
||||||
mscore = roll_dices(1, 10, False).get('result')
|
|
||||||
mental_cybermods_scores.append(mscore)
|
|
||||||
|
|
||||||
for _ in range(phys_cnt):
|
|
||||||
pscore = roll_dices(1, 10, False).get('result')
|
|
||||||
if pscore in physical_cybermods_scores:
|
|
||||||
pscore = roll_dices(1, 10, False).get('result')
|
|
||||||
physical_cybermods_scores.append(pscore)
|
|
||||||
|
|
||||||
cyb = CyberMods()
|
|
||||||
mcyb = []
|
|
||||||
pcyb = []
|
|
||||||
|
|
||||||
for score in mental_cybermods_scores:
|
|
||||||
modification = cyb.get_mental_cybermod(score)
|
|
||||||
mcyb.append(modification)
|
|
||||||
|
|
||||||
if len(mcyb) != 0:
|
|
||||||
cybermods_table['mental'] = mcyb
|
|
||||||
|
|
||||||
for score in physical_cybermods_scores:
|
|
||||||
modification = cyb.get_physical_cybermod(score)
|
|
||||||
pcyb.append(modification)
|
|
||||||
|
|
||||||
if len(pcyb) != 0:
|
|
||||||
cybermods_table['physical'] = pcyb
|
|
||||||
|
|
||||||
return cybermods_table
|
|
||||||
|
|
||||||
|
|
||||||
def roll_mutations(conscore, intscore):
|
|
||||||
"""
|
|
||||||
:param conscore: modifier for physical mutation determination
|
|
||||||
:param intscore: modifier for mental mutation determination
|
|
||||||
:return: table of mutations (in json form)
|
|
||||||
"""
|
|
||||||
mutations_table = {}
|
|
||||||
|
|
||||||
mental_mutations_cnt = roll_dices(1, 4, False).get('result')
|
|
||||||
physical_mutations_cnt = roll_dices(1, 4, False).get('result')
|
|
||||||
mutations_table['count'] = {'mental': mental_mutations_cnt, 'physical': physical_mutations_cnt}
|
|
||||||
|
|
||||||
mental_mutations_scores = get_score_list(mental_mutations_cnt, intscore)
|
|
||||||
mutations_table['mental'] = get_mutations(mental_mutations_scores)
|
|
||||||
|
|
||||||
physical_mutations_scores = get_score_list(physical_mutations_cnt, conscore)
|
|
||||||
mutations_table['physical'] = get_mutations(physical_mutations_scores)
|
|
||||||
|
|
||||||
return mutations_table
|
|
||||||
|
|
||||||
|
|
||||||
def get_mutations(scorelist):
|
|
||||||
mut_table = Mutations()
|
|
||||||
mut_list = []
|
|
||||||
for score in scorelist:
|
|
||||||
mutation = mut_table.get_mental_mutation(score)
|
|
||||||
mut_list.append(mutation)
|
|
||||||
return mut_list
|
|
||||||
|
|
||||||
|
|
||||||
def get_score_list(count, modifier):
|
|
||||||
tmp_scores = []
|
|
||||||
for _ in range(count):
|
|
||||||
roll = roll_dices(1, 100, False).get('result') + modifier
|
|
||||||
if roll in tmp_scores:
|
|
||||||
roll = roll_dices(1, 100, False).get('result') + modifier
|
|
||||||
if roll > 100:
|
|
||||||
roll = 100
|
|
||||||
tmp_scores.append(roll)
|
|
||||||
|
|
||||||
return tmp_scores
|
|
||||||
|
|
||||||
|
|
||||||
def roll_mutant_animal():
|
|
||||||
creature = dict()
|
|
||||||
|
|
||||||
animal_stock = ['badger', 'racoon', 'hound', 'wolf', 'big-cat', 'fox',
|
|
||||||
'spider', 'lizard', 'ant', 'hornet', 'hawk', 'ostrich', 'emu', 'crocodile',
|
|
||||||
'snake', 'rabbit', 'rat', 'bear', 'elephant', 'platypus', 'bull', 'horse', 'goat', 'bat',
|
|
||||||
'silverfish', 'cockroach', 'turtle', 'gibbon', 'penguin', 'orangutan', 'chimpanzee',
|
|
||||||
'housefly', 'lobster', 'crab', 'prawn', 'pig', 'chicken', 'duck', 'parrot', 'mouse',
|
|
||||||
'heron', 'weasel', 'squirrel', 'pigeon', 'crow', 'house-cat', 'shark', 'dolphin', 'narwhal',
|
|
||||||
'buffalo']
|
|
||||||
|
|
||||||
posture = ['upright', 'prone', 'mixed']
|
|
||||||
|
|
||||||
creature['stock'] = random.choice(animal_stock)
|
|
||||||
creature['posture'] = random.choice(posture)
|
|
||||||
|
|
||||||
if creature['posture'] == 'upright' or creature['posture'] == 'mixed':
|
|
||||||
creature['arms'] = random.choice(list(range(2, 4, 2))) # if you're upright 4 is the limit
|
|
||||||
creature['legs'] = random.choice(list(range(2, 6, 2))) # same with legs
|
|
||||||
|
|
||||||
if creature['posture'] == 'prone':
|
|
||||||
creature['legs'] = random.choice(list(range(4, 8, 2))) # if you're prone, you only get legs
|
|
||||||
|
|
||||||
return creature
|
|
||||||
|
|
||||||
|
|
||||||
def split_number(n):
|
|
||||||
first_split = n // 2 # this will split the number in two equal parts, if it is even
|
|
||||||
second_split = n % 2 + first_split # this will add one to one part if the number is odd
|
|
||||||
return first_split, second_split
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
app.run()
|
|
0
app/__init__.py
Normal file
0
app/__init__.py
Normal file
205
app/app.py
Normal file
205
app/app.py
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
import random
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
from flask_cors import CORS
|
||||||
|
from flask_restx import Api, Resource
|
||||||
|
|
||||||
|
from app.functions.build_character_sheet import build_character_sheet
|
||||||
|
from app.functions.roll_ability_scores import roll_ability_scores
|
||||||
|
from app.functions.roll_ability_check import roll_ability_check
|
||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
from app.functions.roll_encounter import roll_encounter
|
||||||
|
from app.functions.roll_mental_attack import roll_mental_attack
|
||||||
|
from app.functions.roll_mutations import roll_mutations
|
||||||
|
from app.models.models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model, \
|
||||||
|
mutation_model, \
|
||||||
|
check_model
|
||||||
|
from app.schemas.schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema, \
|
||||||
|
HPSchema, \
|
||||||
|
MutationSchema, CheckSchema
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
CORS(app)
|
||||||
|
|
||||||
|
app.config.SWAGGER_UI_JSONEDITOR = True
|
||||||
|
app.config['SWAGGER_UI_JSONEDITOR'] = True
|
||||||
|
api = Api(app, version='1.0', title='Gamma World Dice', description='Rolled Dice As A Service')
|
||||||
|
|
||||||
|
dice = api.namespace('dice', description='Dice operations')
|
||||||
|
ability = api.namespace('ability', description='Ability operations')
|
||||||
|
hp = api.namespace('hp', description='HP operations')
|
||||||
|
ma = api.namespace('ma', description='Mental Attack operations')
|
||||||
|
mut = api.namespace('mut', description='Mutation operations')
|
||||||
|
character = api.namespace('character', description='Character operations')
|
||||||
|
encounter = api.namespace('encounter', description='Encounter operations')
|
||||||
|
check = api.namespace('check', description='Check operations')
|
||||||
|
|
||||||
|
check_model = check.model('Check', check_model)
|
||||||
|
check_schema = CheckSchema()
|
||||||
|
|
||||||
|
ability_model = ability.model('Ability', ability_model)
|
||||||
|
ability_schema = AbilitySchema()
|
||||||
|
|
||||||
|
mutation_model = mut.model('Mutation', mutation_model)
|
||||||
|
mutation_schema = MutationSchema()
|
||||||
|
|
||||||
|
hp_model = hp.model('HP', hp_model)
|
||||||
|
hp_schema = HPSchema()
|
||||||
|
|
||||||
|
dice_model = dice.model('Dice', dice_model)
|
||||||
|
dice_schema = DiceSchema()
|
||||||
|
|
||||||
|
ma_model = ma.model('MA', ma_model)
|
||||||
|
ma_schema = MentalAttackSchema()
|
||||||
|
|
||||||
|
character_model = character.model('Character', character_model)
|
||||||
|
character_schema = CharacterSchema()
|
||||||
|
|
||||||
|
encounter_model = encounter.model('Encounter', encounter_model)
|
||||||
|
encounter_schema = EncounterSchema()
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/dice', methods=['POST'])
|
||||||
|
class RollDice(Resource):
|
||||||
|
@dice.expect(dice_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = dice_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
quantity = data.get('quantity')
|
||||||
|
geometry = data.get('geometry')
|
||||||
|
discard_lowest = data.get('discard_lowest')
|
||||||
|
if quantity is None or geometry is None:
|
||||||
|
return {"message": "Required dice data not provided"}, 400
|
||||||
|
return roll_dices(quantity, geometry, discard_lowest), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/ability', methods=['POST'])
|
||||||
|
class RollAbility(Resource):
|
||||||
|
@ability.expect(ability_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = ability_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
|
||||||
|
chartype = data.get('chartype')
|
||||||
|
attribute = data.get('ability')
|
||||||
|
|
||||||
|
return roll_ability_scores(chartype, attribute), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/hp', methods=['POST'])
|
||||||
|
class RollHP(Resource):
|
||||||
|
@hp.expect(hp_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = hp_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
chartype = data.get('chartype')
|
||||||
|
conscore = data.get('conscore')
|
||||||
|
if conscore is None:
|
||||||
|
return {"message": "A constitution score is required"}, 400
|
||||||
|
if chartype == 'human':
|
||||||
|
geometry = 8
|
||||||
|
else:
|
||||||
|
geometry = 6
|
||||||
|
return roll_dices(conscore, geometry, False), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/encounter', methods=['POST'])
|
||||||
|
class RollEncounter(Resource):
|
||||||
|
@encounter.expect(encounter_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = encounter_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
|
||||||
|
terrain = data.get('terrain').lower()
|
||||||
|
return roll_encounter(terrain), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/attack/mental', methods=['POST'])
|
||||||
|
class RollMentalAttack(Resource):
|
||||||
|
@ma.expect(ma_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = ma_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
|
||||||
|
ams = data.get('ams')
|
||||||
|
dms = data.get('dms')
|
||||||
|
modifier = data.get('modifier')
|
||||||
|
|
||||||
|
return roll_mental_attack(ams, dms, modifier), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/check', methods=['POST'])
|
||||||
|
class RollCheck(Resource):
|
||||||
|
@check.expect(check_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = check_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
|
||||||
|
ability_score = data.get('ability_score')
|
||||||
|
multiplier = data.get('multiplier')
|
||||||
|
|
||||||
|
return roll_ability_check(ability_score, multiplier), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/tohit', methods=['GET'])
|
||||||
|
class RollToHit(Resource):
|
||||||
|
@staticmethod
|
||||||
|
def get():
|
||||||
|
return roll_dices(1, 20, False), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/chance', methods=['GET'])
|
||||||
|
class RollChance(Resource):
|
||||||
|
@staticmethod
|
||||||
|
def get():
|
||||||
|
return roll_dices(1, 100, False), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/coinflip', methods=['GET'])
|
||||||
|
class RollCoinflip(Resource):
|
||||||
|
@staticmethod
|
||||||
|
def get():
|
||||||
|
return random.choice(['Heads', 'Tails']), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/mutations', methods=['POST'])
|
||||||
|
class RollMutations(Resource):
|
||||||
|
@mut.expect(mutation_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = mutation_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
|
||||||
|
conscore = data.get('conscore')
|
||||||
|
intscore = data.get('intscore')
|
||||||
|
|
||||||
|
return roll_mutations(conscore, intscore), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/character/generate', methods=['POST'])
|
||||||
|
class GenerateCharacter(Resource):
|
||||||
|
@character.expect(character_model)
|
||||||
|
def post(self):
|
||||||
|
data = api.payload
|
||||||
|
errors = character_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
|
chartype = data.get('chartype')
|
||||||
|
return build_character_sheet(chartype), 200
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
0
app/functions/__init__.py
Normal file
0
app/functions/__init__.py
Normal file
36
app/functions/build_character_sheet.py
Normal file
36
app/functions/build_character_sheet.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
from app.functions.roll_ability_scores import roll_ability_scores
|
||||||
|
from app.functions.roll_cybermods import roll_cybermods
|
||||||
|
from app.functions.roll_mutations import roll_mutations
|
||||||
|
|
||||||
|
from app.functions.roll_hp import roll_hp
|
||||||
|
from app.functions.generate_profile import generate_profile
|
||||||
|
from app.functions.roll_mutant_animal import roll_mutant_animal
|
||||||
|
|
||||||
|
|
||||||
|
def build_character_sheet(chartype):
|
||||||
|
character_sheet = dict()
|
||||||
|
|
||||||
|
character_sheet['profile'] = generate_profile(chartype)
|
||||||
|
|
||||||
|
if chartype == 'mutant':
|
||||||
|
character_sheet['animal-stock'] = (roll_mutant_animal())
|
||||||
|
|
||||||
|
ability_scores = roll_ability_scores(chartype)
|
||||||
|
character_sheet['abilities'] = ability_scores
|
||||||
|
character_sheet['hp'] = roll_hp(chartype, ability_scores['constitution'])
|
||||||
|
|
||||||
|
character_sheet['gold'] = roll_dices(4, 4, False).get('result') * 10
|
||||||
|
character_sheet['domar'] = roll_dices(2, 4, False).get('result') * 5
|
||||||
|
|
||||||
|
if chartype == 'humanoid' or chartype == 'mutant':
|
||||||
|
character_sheet['mutations'] = (
|
||||||
|
roll_mutations(ability_scores['constitution'], ability_scores['intelligence'])
|
||||||
|
)
|
||||||
|
|
||||||
|
if chartype == 'cyborg':
|
||||||
|
character_sheet['cybermods'] = (
|
||||||
|
roll_cybermods()
|
||||||
|
)
|
||||||
|
|
||||||
|
return character_sheet
|
16
app/functions/generate_profile.py
Normal file
16
app/functions/generate_profile.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import random
|
||||||
|
from app.functions.get_character_age import get_age
|
||||||
|
|
||||||
|
|
||||||
|
def generate_profile(chartype):
|
||||||
|
profile = {
|
||||||
|
'name': "Anon",
|
||||||
|
'sex': random.choice(['male', 'female', 'male', 'female', 'male', 'female']),
|
||||||
|
'age': get_age(chartype)
|
||||||
|
}
|
||||||
|
if chartype == 'human':
|
||||||
|
profile['hair'] = random.choice(['black', 'brown', 'auburn', 'blonde', 'copper', 'brass', 'blue', 'bald'])
|
||||||
|
profile['eyes'] = random.choice(['blue', 'brown', 'green', 'hazel', 'gray'])
|
||||||
|
profile['skintone'] = random.choice(['dark', 'olive', 'medium', 'light', 'pale'])
|
||||||
|
|
||||||
|
return profile
|
36
app/functions/get_character_age.py
Normal file
36
app/functions/get_character_age.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
def get_age(chartype):
|
||||||
|
ages = {
|
||||||
|
"human": {
|
||||||
|
'youth': (14, 18),
|
||||||
|
'young': (19, 38),
|
||||||
|
'midage': (39, 58),
|
||||||
|
'veteran': (59, 72)
|
||||||
|
},
|
||||||
|
"humanoid": {
|
||||||
|
'youth': (8, 19),
|
||||||
|
'young': (20, 48),
|
||||||
|
'midage': (49, 68),
|
||||||
|
'veteran': (69, 82)
|
||||||
|
},
|
||||||
|
"mutant": {
|
||||||
|
'youth': (8, 13),
|
||||||
|
'young': (14, 28),
|
||||||
|
'midage': (29, 48),
|
||||||
|
'veteran': (49, 62)
|
||||||
|
},
|
||||||
|
"cyborg": {
|
||||||
|
'youth': (14, 18),
|
||||||
|
'young': (19, 38),
|
||||||
|
'midage': (39, 58),
|
||||||
|
'veteran': (59, 72)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char_range = ages[chartype]
|
||||||
|
age_group = random.choice(list(char_range.keys()))
|
||||||
|
age_range = char_range[age_group]
|
||||||
|
|
||||||
|
return random.choice(age_range)
|
10
app/functions/get_mutations.py
Normal file
10
app/functions/get_mutations.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from app.tables.mutations import Mutations
|
||||||
|
|
||||||
|
|
||||||
|
def get_mutations(scorelist):
|
||||||
|
mut_table = Mutations()
|
||||||
|
mut_list = []
|
||||||
|
for score in scorelist:
|
||||||
|
mutation = mut_table.get_mental_mutation(score)
|
||||||
|
mut_list.append(mutation)
|
||||||
|
return mut_list
|
14
app/functions/get_score_list.py
Normal file
14
app/functions/get_score_list.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
|
||||||
|
|
||||||
|
def get_score_list(count, modifier):
|
||||||
|
tmp_scores = []
|
||||||
|
for _ in range(count):
|
||||||
|
roll = roll_dices(1, 100, False).get('result') + modifier
|
||||||
|
if roll in tmp_scores:
|
||||||
|
roll = roll_dices(1, 100, False).get('result') + modifier
|
||||||
|
if roll > 100:
|
||||||
|
roll = 100
|
||||||
|
tmp_scores.append(roll)
|
||||||
|
|
||||||
|
return tmp_scores
|
10
app/functions/roll_ability_check.py
Normal file
10
app/functions/roll_ability_check.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
|
||||||
|
|
||||||
|
def roll_ability_check(score, multiplier):
|
||||||
|
threshold = score * multiplier
|
||||||
|
rolled = roll_dices(1, 100, False).get('result')
|
||||||
|
if rolled < threshold:
|
||||||
|
return {'threshold': threshold, 'rolled': rolled, 'success': True}, 200
|
||||||
|
else:
|
||||||
|
return {'threshold': threshold, 'rolled': rolled, 'success': False}, 200
|
29
app/functions/roll_ability_scores.py
Normal file
29
app/functions/roll_ability_scores.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
|
||||||
|
|
||||||
|
def roll_ability_scores(chartype, attribute=None):
|
||||||
|
if attribute is None or attribute == "all":
|
||||||
|
ability_list = ['p-strength', 'm-strength', 'constitution', 'dexterity', 'charisma', 'intelligence']
|
||||||
|
else:
|
||||||
|
ability_list = [attribute]
|
||||||
|
|
||||||
|
ability_scores = {}
|
||||||
|
|
||||||
|
for abil in ability_list:
|
||||||
|
if ((chartype == 'human') and
|
||||||
|
((abil == 'intelligence') or
|
||||||
|
(abil == 'charisma') or
|
||||||
|
(abil == 'constitution'))):
|
||||||
|
roll = roll_dices(4, 6, False) # humans are special
|
||||||
|
if (abil == 'constitution') and roll["result"] > 18:
|
||||||
|
roll["capped"] = True
|
||||||
|
roll["result"] = 18
|
||||||
|
if (abil == 'intelligence' or abil == 'charisma') and roll["result"] > 21:
|
||||||
|
roll["capped"] = True
|
||||||
|
roll["result"] = 21
|
||||||
|
ability_scores[abil] = roll["result"]
|
||||||
|
else:
|
||||||
|
roll = roll_dices(4, 6, True) # nothing else is special
|
||||||
|
ability_scores[abil] = roll["result"]
|
||||||
|
|
||||||
|
return ability_scores
|
55
app/functions/roll_cybermods.py
Normal file
55
app/functions/roll_cybermods.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
from app.tables.cybermods import CyberMods
|
||||||
|
from app.functions.split_number import split_number
|
||||||
|
|
||||||
|
|
||||||
|
def roll_cybermods():
|
||||||
|
"""
|
||||||
|
Cybermods are similar to mutations, except that they are artificial changes to the body,
|
||||||
|
where mutations are 'natural' changes to the body. Fewer cybermods are possible than with
|
||||||
|
mutations. So, you make one roll of 1d4, and then parse up the score between the two
|
||||||
|
types of mods, as you see fit. If no emphasis is specified, the score will be split as evenly
|
||||||
|
as possible. If the score is 1, then a physical mod will be the default.
|
||||||
|
:return: table of cybermods (in json format)
|
||||||
|
"""
|
||||||
|
cybermods_table = {}
|
||||||
|
|
||||||
|
cybermods_count = roll_dices(1, 4, False)["result"]
|
||||||
|
phys_cnt = split_number(cybermods_count)[1] # This ends up being the higher of the two numbers
|
||||||
|
ment_cnt = split_number(cybermods_count)[0]
|
||||||
|
cybermods_table['count'] = {'mental': ment_cnt, 'physical': phys_cnt}
|
||||||
|
|
||||||
|
mental_cybermods_scores = []
|
||||||
|
physical_cybermods_scores = []
|
||||||
|
|
||||||
|
for _ in range(ment_cnt):
|
||||||
|
mscore = roll_dices(1, 10, False).get('result')
|
||||||
|
if mscore in mental_cybermods_scores:
|
||||||
|
mscore = roll_dices(1, 10, False).get('result')
|
||||||
|
mental_cybermods_scores.append(mscore)
|
||||||
|
|
||||||
|
for _ in range(phys_cnt):
|
||||||
|
pscore = roll_dices(1, 10, False).get('result')
|
||||||
|
if pscore in physical_cybermods_scores:
|
||||||
|
pscore = roll_dices(1, 10, False).get('result')
|
||||||
|
physical_cybermods_scores.append(pscore)
|
||||||
|
|
||||||
|
cyb = CyberMods()
|
||||||
|
mcyb = []
|
||||||
|
pcyb = []
|
||||||
|
|
||||||
|
for score in mental_cybermods_scores:
|
||||||
|
modification = cyb.get_mental_cybermod(score)
|
||||||
|
mcyb.append(modification)
|
||||||
|
|
||||||
|
if len(mcyb) != 0:
|
||||||
|
cybermods_table['mental'] = mcyb
|
||||||
|
|
||||||
|
for score in physical_cybermods_scores:
|
||||||
|
modification = cyb.get_physical_cybermod(score)
|
||||||
|
pcyb.append(modification)
|
||||||
|
|
||||||
|
if len(pcyb) != 0:
|
||||||
|
cybermods_table['physical'] = pcyb
|
||||||
|
|
||||||
|
return cybermods_table
|
32
app/functions/roll_dices.py
Normal file
32
app/functions/roll_dices.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
def roll_dices(dice_count, dice_sides, discard_lowest):
|
||||||
|
roll_results = []
|
||||||
|
discarded = []
|
||||||
|
for _ in range(dice_count):
|
||||||
|
roll_results.append(random.randint(1, dice_sides))
|
||||||
|
if discard_lowest and len(roll_results) > 0:
|
||||||
|
discarded.append(min(roll_results))
|
||||||
|
roll_results.remove(min(roll_results))
|
||||||
|
|
||||||
|
if discarded:
|
||||||
|
net_dice_count = dice_count - 1
|
||||||
|
mnemonic = str(dice_count) + "(-1)d" + str(dice_sides)
|
||||||
|
else:
|
||||||
|
mnemonic = str(dice_count) + 'd' + str(dice_sides)
|
||||||
|
net_dice_count = dice_count
|
||||||
|
|
||||||
|
result = {
|
||||||
|
'dice-set': {
|
||||||
|
'mnemonic': mnemonic,
|
||||||
|
'min-roll': net_dice_count,
|
||||||
|
'max-roll': dice_sides * net_dice_count
|
||||||
|
},
|
||||||
|
'rolls': roll_results,
|
||||||
|
'result': sum(roll_results)
|
||||||
|
}
|
||||||
|
if discarded:
|
||||||
|
result['discarded'] = discarded
|
||||||
|
|
||||||
|
return result
|
9
app/functions/roll_encounter.py
Normal file
9
app/functions/roll_encounter.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
from app.tables.encounters import EncounterTable
|
||||||
|
|
||||||
|
|
||||||
|
def roll_encounter(terrain):
|
||||||
|
roll = roll_dices(1, 20, False).get('result')
|
||||||
|
et = EncounterTable()
|
||||||
|
creature = et.get_encounter(roll, terrain)
|
||||||
|
return {"encounter": creature}
|
9
app/functions/roll_hp.py
Normal file
9
app/functions/roll_hp.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
|
||||||
|
|
||||||
|
def roll_hp(chartype, conscore):
|
||||||
|
if chartype == 'human':
|
||||||
|
geometry = 8
|
||||||
|
else:
|
||||||
|
geometry = 6
|
||||||
|
return roll_dices(conscore, geometry, False).get('result')
|
35
app/functions/roll_mental_attack.py
Normal file
35
app/functions/roll_mental_attack.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
from app.tables.mentattack import MentalAttackMatrix
|
||||||
|
|
||||||
|
|
||||||
|
def roll_mental_attack(ams, dms, modifier):
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
mam = MentalAttackMatrix()
|
||||||
|
needed = mam.get_attack_score(ams, dms)
|
||||||
|
result["needed"] = needed
|
||||||
|
outcome = None
|
||||||
|
if needed < 2:
|
||||||
|
outcome = "Automatic Success!"
|
||||||
|
elif needed > 20:
|
||||||
|
outcome = "Absolutely No Chance!"
|
||||||
|
else:
|
||||||
|
raw_roll = roll_dices(1, 20, False).get('result')
|
||||||
|
if modifier != 0:
|
||||||
|
result["original-roll"] = raw_roll
|
||||||
|
result["modifier"] = modifier
|
||||||
|
rolled = raw_roll + modifier # negative modifiers will subtract themselves naturally
|
||||||
|
result["adjusted-roll"] = rolled
|
||||||
|
else:
|
||||||
|
rolled = raw_roll
|
||||||
|
result["original-roll"] = rolled
|
||||||
|
|
||||||
|
if (rolled >= 20) and (needed <= 16):
|
||||||
|
outcome = "Devastating Success!"
|
||||||
|
elif needed <= rolled:
|
||||||
|
outcome = "Attack Successful!"
|
||||||
|
elif needed > rolled:
|
||||||
|
outcome = "Attack Failed!"
|
||||||
|
|
||||||
|
result["outcome"] = outcome
|
||||||
|
return result
|
27
app/functions/roll_mutant_animal.py
Normal file
27
app/functions/roll_mutant_animal.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
def roll_mutant_animal():
|
||||||
|
creature = dict()
|
||||||
|
|
||||||
|
animal_stock = ['badger', 'racoon', 'hound', 'wolf', 'big-cat', 'fox',
|
||||||
|
'spider', 'lizard', 'ant', 'hornet', 'hawk', 'ostrich', 'emu', 'crocodile',
|
||||||
|
'snake', 'rabbit', 'rat', 'bear', 'elephant', 'platypus', 'bull', 'horse', 'goat', 'bat',
|
||||||
|
'silverfish', 'cockroach', 'turtle', 'gibbon', 'penguin', 'orangutan', 'chimpanzee',
|
||||||
|
'housefly', 'lobster', 'crab', 'prawn', 'pig', 'chicken', 'duck', 'parrot', 'mouse',
|
||||||
|
'heron', 'weasel', 'squirrel', 'pigeon', 'crow', 'house-cat', 'shark', 'dolphin', 'narwhal',
|
||||||
|
'buffalo']
|
||||||
|
|
||||||
|
posture = ['upright', 'prone', 'mixed']
|
||||||
|
|
||||||
|
creature['stock'] = random.choice(animal_stock)
|
||||||
|
creature['posture'] = random.choice(posture)
|
||||||
|
|
||||||
|
if creature['posture'] == 'upright' or creature['posture'] == 'mixed':
|
||||||
|
creature['arms'] = random.choice(list(range(2, 4, 2))) # if you're upright 4 is the limit
|
||||||
|
creature['legs'] = random.choice(list(range(2, 6, 2))) # same with legs
|
||||||
|
|
||||||
|
if creature['posture'] == 'prone':
|
||||||
|
creature['legs'] = random.choice(list(range(4, 8, 2))) # if you're prone, you only get legs
|
||||||
|
|
||||||
|
return creature
|
24
app/functions/roll_mutations.py
Normal file
24
app/functions/roll_mutations.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
from app.functions.get_mutations import get_mutations
|
||||||
|
from app.functions.get_score_list import get_score_list
|
||||||
|
from app.functions.roll_dices import roll_dices
|
||||||
|
|
||||||
|
|
||||||
|
def roll_mutations(conscore, intscore):
|
||||||
|
"""
|
||||||
|
:param conscore: modifier for physical mutation determination
|
||||||
|
:param intscore: modifier for mental mutation determination
|
||||||
|
:return: table of mutations (in json form)
|
||||||
|
"""
|
||||||
|
mutations_table = {}
|
||||||
|
|
||||||
|
mental_mutations_cnt = roll_dices(1, 4, False).get('result')
|
||||||
|
physical_mutations_cnt = roll_dices(1, 4, False).get('result')
|
||||||
|
mutations_table['count'] = {'mental': mental_mutations_cnt, 'physical': physical_mutations_cnt}
|
||||||
|
|
||||||
|
mental_mutations_scores = get_score_list(mental_mutations_cnt, intscore)
|
||||||
|
mutations_table['mental'] = get_mutations(mental_mutations_scores)
|
||||||
|
|
||||||
|
physical_mutations_scores = get_score_list(physical_mutations_cnt, conscore)
|
||||||
|
mutations_table['physical'] = get_mutations(physical_mutations_scores)
|
||||||
|
|
||||||
|
return mutations_table
|
4
app/functions/split_number.py
Normal file
4
app/functions/split_number.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
def split_number(n):
|
||||||
|
first_split = n // 2 # this will split the number in two equal parts, if it is even
|
||||||
|
second_split = n % 2 + first_split # this will add one to one part if the number is odd
|
||||||
|
return first_split, second_split
|
0
app/models/__init__.py
Normal file
0
app/models/__init__.py
Normal file
@ -67,9 +67,26 @@ hp_model = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ma_model = {
|
ma_model = {
|
||||||
'ams': fields.Integer(required=True, description='Attacker Mental Strength'),
|
'ams': fields.Integer(
|
||||||
'dms': fields.Integer(required=True, description='Defender Mental Strength'),
|
required=True,
|
||||||
'modifier': fields.Integer(required=True, description='Modifier For Mental Attack Roll'),
|
min=3,
|
||||||
|
max=18,
|
||||||
|
default=10,
|
||||||
|
description='Attacker Mental Strength'
|
||||||
|
),
|
||||||
|
'dms': fields.Integer(
|
||||||
|
required=True,
|
||||||
|
min=3,
|
||||||
|
max=18,
|
||||||
|
default=10,
|
||||||
|
description='Defender Mental Strength'
|
||||||
|
),
|
||||||
|
'modifier': fields.Integer(
|
||||||
|
required=False,
|
||||||
|
min=-100,
|
||||||
|
max=100,
|
||||||
|
default=0,
|
||||||
|
description='Modifier For Mental Attack Roll'),
|
||||||
}
|
}
|
||||||
|
|
||||||
character_model = {
|
character_model = {
|
0
app/schemas/__init__.py
Normal file
0
app/schemas/__init__.py
Normal file
0
app/tables/__init__.py
Normal file
0
app/tables/__init__.py
Normal file
Loading…
Reference in New Issue
Block a user