add final schemas;refactor mutation generation;minor fixes
This commit is contained in:
parent
63aa245cf3
commit
5499f1f4df
100
app.py
100
app.py
@ -2,8 +2,9 @@ from flask import Flask
|
|||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from flask_restx import Api, Resource
|
from flask_restx import Api, Resource
|
||||||
|
|
||||||
from models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model
|
from models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model, mutation_model
|
||||||
from schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema
|
from schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema, HPSchema, \
|
||||||
|
MutationSchema
|
||||||
|
|
||||||
from encounters import EncounterTable
|
from encounters import EncounterTable
|
||||||
from mentattack import MentalAttackMatrix
|
from mentattack import MentalAttackMatrix
|
||||||
@ -23,14 +24,18 @@ dice = api.namespace('dice', description='Dice operations')
|
|||||||
ability = api.namespace('ability', description='Ability operations')
|
ability = api.namespace('ability', description='Ability operations')
|
||||||
hp = api.namespace('hp', description='HP operations')
|
hp = api.namespace('hp', description='HP operations')
|
||||||
ma = api.namespace('ma', description='Mental Attack operations')
|
ma = api.namespace('ma', description='Mental Attack operations')
|
||||||
|
mut = api.namespace('mut', description='Mutation operations')
|
||||||
character = api.namespace('character', description='Character operations')
|
character = api.namespace('character', description='Character operations')
|
||||||
encounter = api.namespace('encounter', description='Encounter operations')
|
encounter = api.namespace('encounter', description='Encounter operations')
|
||||||
|
|
||||||
ability_model = ability.model('Ability', ability_model)
|
ability_model = ability.model('Ability', ability_model)
|
||||||
ability_schema = AbilitySchema()
|
ability_schema = AbilitySchema()
|
||||||
|
|
||||||
|
mutation_model = mut.model('Mutation', mutation_model)
|
||||||
|
mutation_schema = MutationSchema()
|
||||||
|
|
||||||
hp_model = hp.model('HP', hp_model)
|
hp_model = hp.model('HP', hp_model)
|
||||||
# TODO: Add hitpoint schema
|
hp_schema = HPSchema()
|
||||||
|
|
||||||
dice_model = dice.model('Dice', dice_model)
|
dice_model = dice.model('Dice', dice_model)
|
||||||
dice_schema = DiceSchema()
|
dice_schema = DiceSchema()
|
||||||
@ -81,6 +86,9 @@ class RollHP(Resource):
|
|||||||
@hp.expect(hp_model)
|
@hp.expect(hp_model)
|
||||||
def post(self):
|
def post(self):
|
||||||
data = api.payload
|
data = api.payload
|
||||||
|
errors = ability_schema.validate(data)
|
||||||
|
if errors:
|
||||||
|
return errors, 400
|
||||||
chartype = data.get('chartype')
|
chartype = data.get('chartype')
|
||||||
conscore = data.get('conscore')
|
conscore = data.get('conscore')
|
||||||
if conscore is None:
|
if conscore is None:
|
||||||
@ -158,23 +166,41 @@ class RollMentalAttack(Resource):
|
|||||||
|
|
||||||
@api.route('/roll/tohit', methods=['GET'])
|
@api.route('/roll/tohit', methods=['GET'])
|
||||||
class RollToHit(Resource):
|
class RollToHit(Resource):
|
||||||
def get(self):
|
@staticmethod
|
||||||
|
def get():
|
||||||
return roll_dices(1, 20, False), 200
|
return roll_dices(1, 20, False), 200
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/chance', methods=['GET'])
|
@api.route('/roll/chance', methods=['GET'])
|
||||||
class RollChance(Resource):
|
class RollChance(Resource):
|
||||||
def get(self):
|
@staticmethod
|
||||||
|
def get():
|
||||||
return roll_dices(1, 100, False), 200
|
return roll_dices(1, 100, False), 200
|
||||||
|
|
||||||
|
|
||||||
@api.route('/coinflip', methods=['GET'])
|
@api.route('/coinflip', methods=['GET'])
|
||||||
class RollCoinflip(Resource):
|
class RollCoinflip(Resource):
|
||||||
def get(self):
|
@staticmethod
|
||||||
|
def get():
|
||||||
return random.choice(['Heads', 'Tails']), 200
|
return random.choice(['Heads', 'Tails']), 200
|
||||||
|
|
||||||
|
|
||||||
@api.route('/character/generate')
|
@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):
|
class GenerateCharacter(Resource):
|
||||||
@character.expect(character_model)
|
@character.expect(character_model)
|
||||||
def post(self):
|
def post(self):
|
||||||
@ -337,44 +363,37 @@ def roll_mutations(conscore, intscore):
|
|||||||
physical_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}
|
mutations_table['count'] = {'mental': mental_mutations_cnt, 'physical': physical_mutations_cnt}
|
||||||
|
|
||||||
mental_mutations_scores = []
|
mental_mutations_scores = get_score_list(mental_mutations_cnt, intscore)
|
||||||
physical_mutations_scores = []
|
mutations_table['mental'] = get_mutations(mental_mutations_scores)
|
||||||
|
|
||||||
for _ in range(mental_mutations_cnt):
|
physical_mutations_scores = get_score_list(physical_mutations_cnt, conscore)
|
||||||
mscore = roll_dices(1, 100, False).get('result') + intscore
|
mutations_table['physical'] = get_mutations(physical_mutations_scores)
|
||||||
if mscore in mental_mutations_scores:
|
|
||||||
mscore = roll_dices(1, 100, False).get('result') + intscore
|
|
||||||
if mscore > 100:
|
|
||||||
mscore = 100
|
|
||||||
mental_mutations_scores.append(mscore)
|
|
||||||
|
|
||||||
for _ in range(physical_mutations_cnt):
|
|
||||||
pscore = roll_dices(1, 100, False).get('result') + conscore
|
|
||||||
if pscore in physical_mutations_scores:
|
|
||||||
pscore = roll_dices(1, 100, False).get('result') + conscore
|
|
||||||
if pscore > 100:
|
|
||||||
pscore = 100
|
|
||||||
physical_mutations_scores.append(pscore)
|
|
||||||
|
|
||||||
mut = Mutations()
|
|
||||||
mmut = []
|
|
||||||
pmut = []
|
|
||||||
|
|
||||||
for score in mental_mutations_scores:
|
|
||||||
mutation = mut.get_mental_mutation(score)
|
|
||||||
mmut.append(mutation)
|
|
||||||
|
|
||||||
mutations_table['mental'] = mmut
|
|
||||||
|
|
||||||
for score in physical_mutations_scores:
|
|
||||||
mutation = mut.get_physical_mutation(score)
|
|
||||||
pmut.append(mutation)
|
|
||||||
|
|
||||||
mutations_table['physical'] = pmut
|
|
||||||
|
|
||||||
return mutations_table
|
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():
|
def roll_mutant_animal():
|
||||||
creature = dict()
|
creature = dict()
|
||||||
|
|
||||||
@ -398,7 +417,6 @@ def roll_mutant_animal():
|
|||||||
if creature['posture'] == 'prone':
|
if creature['posture'] == 'prone':
|
||||||
creature['legs'] = random.choice(list(range(4, 8, 2))) # if you're prone, you only get legs
|
creature['legs'] = random.choice(list(range(4, 8, 2))) # if you're prone, you only get legs
|
||||||
|
|
||||||
|
|
||||||
return creature
|
return creature
|
||||||
|
|
||||||
|
|
||||||
|
19
models.py
19
models.py
@ -2,10 +2,27 @@ from flask_restx import fields
|
|||||||
|
|
||||||
# Common fields
|
# Common fields
|
||||||
chartype_field = fields.String(
|
chartype_field = fields.String(
|
||||||
required=False,
|
required=True,
|
||||||
default="human",
|
default="human",
|
||||||
description='Character type. Allowed values: "human", "humanoid", "mutant", "cyborg"')
|
description='Character type. Allowed values: "human", "humanoid", "mutant", "cyborg"')
|
||||||
|
|
||||||
|
# Mutations Model
|
||||||
|
mutation_model = {
|
||||||
|
'conscore': fields.Integer(
|
||||||
|
required=True,
|
||||||
|
default=3,
|
||||||
|
min=3,
|
||||||
|
max=18,
|
||||||
|
description='The characters constitution score'
|
||||||
|
),
|
||||||
|
'intscore': fields.Integer(
|
||||||
|
required=True,
|
||||||
|
default=3,
|
||||||
|
min=3,
|
||||||
|
max=21,
|
||||||
|
description='The characters intelligence score'
|
||||||
|
)
|
||||||
|
}
|
||||||
# Dice model
|
# Dice model
|
||||||
dice_model = {
|
dice_model = {
|
||||||
'quantity': fields.Integer(required=True, description='The number of dice to roll'),
|
'quantity': fields.Integer(required=True, description='The number of dice to roll'),
|
||||||
|
39
schemas.py
39
schemas.py
@ -7,10 +7,43 @@ chartype_field = fields.String(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class MutationSchema(Schema):
|
||||||
|
conscore = fields.Integer(
|
||||||
|
required=True,
|
||||||
|
validate=validate.Range(min=3, max=18),
|
||||||
|
description='The characters constitution score'
|
||||||
|
)
|
||||||
|
intscore = fields.Integer(
|
||||||
|
required=True,
|
||||||
|
validate=validate.Range(min=3, max=21),
|
||||||
|
description='The characters intelligence score'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class HPSchema(Schema):
|
||||||
|
chartype = chartype_field
|
||||||
|
conscore = fields.Integer(
|
||||||
|
required=True,
|
||||||
|
default=10,
|
||||||
|
validate=validate.Range(min=3, max=24),
|
||||||
|
description='The constitution score of the character'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DiceSchema(Schema):
|
class DiceSchema(Schema):
|
||||||
quantity = fields.Int(required=True, validate=validate.Range(min=1), description='The number of dice to roll')
|
quantity = fields.Int(
|
||||||
geometry = fields.Int(required=True, validate=validate.Range(min=2), description='The number of sides on each die')
|
required=True,
|
||||||
discard_lowest = fields.Bool(default=False, description='Drop the lowest score')
|
default=1,
|
||||||
|
validate=validate.Range(min=1),
|
||||||
|
description='The number of dice to roll'
|
||||||
|
)
|
||||||
|
geometry = fields.Int(
|
||||||
|
required=True,
|
||||||
|
default=2,
|
||||||
|
validate=validate.Range(min=2),
|
||||||
|
description='The number of sides on each die'
|
||||||
|
)
|
||||||
|
discard_lowest = fields.Bool(required=True, default=False, description='Drop the lowest score')
|
||||||
|
|
||||||
|
|
||||||
class CharacterSchema(Schema):
|
class CharacterSchema(Schema):
|
||||||
|
Loading…
Reference in New Issue
Block a user