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_restx import Api, Resource | ||||
| 
 | ||||
| from models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model | ||||
| from schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema | ||||
| 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, HPSchema, \ | ||||
|     MutationSchema | ||||
| 
 | ||||
| from encounters import EncounterTable | ||||
| from mentattack import MentalAttackMatrix | ||||
| @ -23,14 +24,18 @@ 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') | ||||
| 
 | ||||
| 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) | ||||
| # TODO: Add hitpoint schema | ||||
| hp_schema = HPSchema() | ||||
| 
 | ||||
| dice_model = dice.model('Dice', dice_model) | ||||
| dice_schema = DiceSchema() | ||||
| @ -81,6 +86,9 @@ class RollHP(Resource): | ||||
|     @hp.expect(hp_model) | ||||
|     def post(self): | ||||
|         data = api.payload | ||||
|         errors = ability_schema.validate(data) | ||||
|         if errors: | ||||
|             return errors, 400 | ||||
|         chartype = data.get('chartype') | ||||
|         conscore = data.get('conscore') | ||||
|         if conscore is None: | ||||
| @ -158,23 +166,41 @@ class RollMentalAttack(Resource): | ||||
| 
 | ||||
| @api.route('/roll/tohit', methods=['GET']) | ||||
| class RollToHit(Resource): | ||||
|     def get(self): | ||||
|     @staticmethod | ||||
|     def get(): | ||||
|         return roll_dices(1, 20, False), 200 | ||||
| 
 | ||||
| 
 | ||||
| @api.route('/roll/chance', methods=['GET']) | ||||
| class RollChance(Resource): | ||||
|     def get(self): | ||||
|     @staticmethod | ||||
|     def get(): | ||||
|         return roll_dices(1, 100, False), 200 | ||||
| 
 | ||||
| 
 | ||||
| @api.route('/coinflip', methods=['GET']) | ||||
| class RollCoinflip(Resource): | ||||
|     def get(self): | ||||
|     @staticmethod | ||||
|     def get(): | ||||
|         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): | ||||
|     @character.expect(character_model) | ||||
|     def post(self): | ||||
| @ -337,44 +363,37 @@ def roll_mutations(conscore, intscore): | ||||
|     physical_mutations_cnt = roll_dices(1, 4, False).get('result') | ||||
|     mutations_table['count'] = {'mental': mental_mutations_cnt, 'physical': physical_mutations_cnt} | ||||
| 
 | ||||
|     mental_mutations_scores = [] | ||||
|     physical_mutations_scores = [] | ||||
|     mental_mutations_scores = get_score_list(mental_mutations_cnt, intscore) | ||||
|     mutations_table['mental'] = get_mutations(mental_mutations_scores) | ||||
| 
 | ||||
|     for _ in range(mental_mutations_cnt): | ||||
|         mscore = roll_dices(1, 100, False).get('result') + intscore | ||||
|         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 | ||||
|     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() | ||||
| 
 | ||||
| @ -398,7 +417,6 @@ def roll_mutant_animal(): | ||||
|     if creature['posture'] == 'prone': | ||||
|         creature['legs'] = random.choice(list(range(4, 8, 2)))  # if you're prone, you only get legs | ||||
| 
 | ||||
| 
 | ||||
|     return creature | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										19
									
								
								models.py
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								models.py
									
									
									
									
									
								
							| @ -2,10 +2,27 @@ from flask_restx import fields | ||||
| 
 | ||||
| # Common fields | ||||
| chartype_field = fields.String( | ||||
|     required=False, | ||||
|     required=True, | ||||
|     default="human", | ||||
|     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 = { | ||||
|     '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): | ||||
|     quantity = fields.Int(required=True, validate=validate.Range(min=1), description='The number of dice to roll') | ||||
|     geometry = fields.Int(required=True, validate=validate.Range(min=2), description='The number of sides on each die') | ||||
|     discard_lowest = fields.Bool(default=False, description='Drop the lowest score') | ||||
|     quantity = fields.Int( | ||||
|         required=True, | ||||
|         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): | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user