add simple character stats generator
This commit is contained in:
parent
366a340b1d
commit
796aac4d80
107
app.py
107
app.py
@ -1,7 +1,7 @@
|
|||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_restx import Api, Resource, fields
|
from flask_restx import Api, Resource
|
||||||
from marshmallow import Schema, fields, validate
|
from marshmallow import Schema, fields, validate
|
||||||
from models import dice_model, ability_model, hp_model
|
from models import dice_model, ability_model, hp_model, character_model
|
||||||
import random
|
import random
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@ -12,10 +12,12 @@ api = Api(app, version='1.0', title='Gamma World Dice', description='Rolled Dice
|
|||||||
dice = api.namespace('dice', description='Dice operations')
|
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')
|
||||||
|
character = api.namespace('character', description='Character operations')
|
||||||
|
|
||||||
dice_model = dice.model('Dice', dice_model)
|
dice_model = dice.model('Dice', dice_model)
|
||||||
ability_model = ability.model('Ability', ability_model)
|
ability_model = ability.model('Ability', ability_model)
|
||||||
hp_model = hp.model('HP', hp_model)
|
hp_model = hp.model('HP', hp_model)
|
||||||
|
character_model = character.model('Character', character_model)
|
||||||
|
|
||||||
|
|
||||||
class DiceSchema(Schema):
|
class DiceSchema(Schema):
|
||||||
@ -27,6 +29,22 @@ class DiceSchema(Schema):
|
|||||||
dice_schema = DiceSchema()
|
dice_schema = DiceSchema()
|
||||||
|
|
||||||
|
|
||||||
|
class CharacterSchema(Schema):
|
||||||
|
chartype = fields.String(
|
||||||
|
required=True,
|
||||||
|
validate=validate.OneOf(["human", "mutant", "android", "robot"]),
|
||||||
|
description='The characters type of being'
|
||||||
|
)
|
||||||
|
emphasis = fields.String(
|
||||||
|
required=True,
|
||||||
|
validate=validate.OneOf(["physical", "mental", "random"]),
|
||||||
|
description='Valid inputs: physical, mental, random'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
character_schema = CharacterSchema()
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/dice', methods=['POST'])
|
@api.route('/roll/dice', methods=['POST'])
|
||||||
class RollDice(Resource):
|
class RollDice(Resource):
|
||||||
@dice.expect(dice_model)
|
@dice.expect(dice_model)
|
||||||
@ -72,16 +90,48 @@ class RollHP(Resource):
|
|||||||
return roll_dices(conscore, geometry, False), 200
|
return roll_dices(conscore, geometry, False), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/roll/tohit', methods=['GET'])
|
||||||
|
class RollToHit(Resource):
|
||||||
|
def get(self):
|
||||||
|
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):
|
def get(self):
|
||||||
return roll_dices(1, 100, False), 200
|
return roll_dices(1, 100, False), 200
|
||||||
|
|
||||||
|
|
||||||
@api.route('/roll/tohit', methods=['GET'])
|
@api.route('/coinflip', methods=['GET'])
|
||||||
class RollToHit(Resource):
|
class RollCoinflip(Resource):
|
||||||
def get(self):
|
def get(self):
|
||||||
return roll_dices(1, 20, False), 200
|
return random.choice(['Heads', 'Tails']), 200
|
||||||
|
|
||||||
|
|
||||||
|
@api.route('/character/generate')
|
||||||
|
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')
|
||||||
|
char_emphasis = data.get('emphasis')
|
||||||
|
|
||||||
|
character_sheet = {}
|
||||||
|
|
||||||
|
if chartype == 'human':
|
||||||
|
geometry = 8
|
||||||
|
else:
|
||||||
|
geometry = 6
|
||||||
|
scores = roll_ability_scores(chartype)
|
||||||
|
assigned_abilities = assign_ability_scores(scores, char_emphasis)
|
||||||
|
character_sheet['abilities'] = assigned_abilities
|
||||||
|
character_sheet['hp'] = roll_hp(chartype, assigned_abilities['constitution'])
|
||||||
|
character_sheet['gold'] = roll_dices(4, 4, False).get('result')
|
||||||
|
character_sheet['domar'] = roll_dices(2, 4, False).get('result')
|
||||||
|
return character_sheet, 200
|
||||||
|
|
||||||
|
|
||||||
def roll_dices(dice_count, dice_sides, discard_lowest):
|
def roll_dices(dice_count, dice_sides, discard_lowest):
|
||||||
@ -115,5 +165,52 @@ def roll_dices(dice_count, dice_sides, discard_lowest):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def roll_ability_scores(chartype):
|
||||||
|
if chartype == 'human':
|
||||||
|
geometry = 8
|
||||||
|
else:
|
||||||
|
geometry = 6
|
||||||
|
|
||||||
|
scores = []
|
||||||
|
for _ in range(6):
|
||||||
|
scores.append(roll_dices(4, geometry, True)['result'])
|
||||||
|
|
||||||
|
return scores
|
||||||
|
|
||||||
|
|
||||||
|
def assign_ability_scores(scores, char_emphasis):
|
||||||
|
ability_scores = {}
|
||||||
|
if char_emphasis == 'physical':
|
||||||
|
ability_list = ['p-strength', 'constitution', 'dexterity',
|
||||||
|
'charisma', 'intelligence', 'm-strength']
|
||||||
|
for ab in ability_list:
|
||||||
|
max_score = max(scores)
|
||||||
|
ability_scores[ab] = max_score
|
||||||
|
scores.remove(max_score)
|
||||||
|
|
||||||
|
elif char_emphasis == 'mental':
|
||||||
|
ability_list = ['m-strength', 'intelligence', 'charisma',
|
||||||
|
'constitution', 'dexterity', 'p-strength']
|
||||||
|
for ab in ability_list:
|
||||||
|
max_score = max(scores)
|
||||||
|
ability_scores[ab] = max_score
|
||||||
|
scores.remove(max_score)
|
||||||
|
|
||||||
|
else:
|
||||||
|
ability_list = ['p-strength', 'constitution', 'dexterity',
|
||||||
|
'charisma', 'intelligence', 'm-strength']
|
||||||
|
random.shuffle(scores)
|
||||||
|
for ab, score in zip(ability_list, scores):
|
||||||
|
ability_scores[ab] = score
|
||||||
|
|
||||||
|
return ability_scores
|
||||||
|
|
||||||
|
def roll_hp(chartype, conscore):
|
||||||
|
if chartype == 'human':
|
||||||
|
geometry = 8
|
||||||
|
else:
|
||||||
|
geometry = 6
|
||||||
|
return roll_dices(conscore, geometry, False).get('result')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run()
|
app.run()
|
||||||
|
13
models.py
13
models.py
@ -1,8 +1,9 @@
|
|||||||
from flask_restx import fields
|
from flask_restx import fields
|
||||||
|
|
||||||
# Common fields
|
# Common fields
|
||||||
chartype_field = fields.String(required=False, default="human", description='Character type. Allowed values: "human", '
|
chartype_field = fields.String(
|
||||||
'"mutant", "android", "robot"')
|
required=False, default="human",
|
||||||
|
description='Character type. Allowed values: "human", "mutant", "android", "robot"')
|
||||||
|
|
||||||
# Dice model
|
# Dice model
|
||||||
dice_model = {
|
dice_model = {
|
||||||
@ -21,3 +22,11 @@ hp_model = {
|
|||||||
'chartype': chartype_field,
|
'chartype': chartype_field,
|
||||||
'conscore': fields.Integer(required=True, description='Conscore')
|
'conscore': fields.Integer(required=True, description='Conscore')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
character_model = {
|
||||||
|
'chartype': chartype_field,
|
||||||
|
'emphasis': fields.String(
|
||||||
|
required=False,
|
||||||
|
default="random",
|
||||||
|
description='The attribute emphasis of your character. Choices: "physical", "mental", "random"')
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user