add mental attack rolls
This commit is contained in:
		
							parent
							
								
									8671ae5262
								
							
						
					
					
						commit
						0a546a0f78
					
				
							
								
								
									
										73
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								app.py
									
									
									
									
									
								
							@ -2,9 +2,11 @@ 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 marshmallow import Schema, fields, validate
 | 
					from marshmallow import Schema, fields, validate
 | 
				
			||||||
from models import dice_model, ability_model, hp_model, character_model, encounter_model
 | 
					
 | 
				
			||||||
 | 
					from models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from encounters import EncounterTable
 | 
					from encounters import EncounterTable
 | 
				
			||||||
 | 
					from mentattack import MentalAttackMatrix
 | 
				
			||||||
from mutations import Mutations
 | 
					from mutations import Mutations
 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -18,12 +20,14 @@ 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')
 | 
				
			||||||
 | 
					ma = api.namespace('ma', description='Mental Attack 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')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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)
 | 
				
			||||||
 | 
					ma_model = ma.model('MA', ma_model)
 | 
				
			||||||
character_model = character.model('Character', character_model)
 | 
					character_model = character.model('Character', character_model)
 | 
				
			||||||
encounter_model = encounter.model('Encounter', encounter_model)
 | 
					encounter_model = encounter.model('Encounter', encounter_model)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -64,6 +68,28 @@ class EncounterSchema(Schema):
 | 
				
			|||||||
encounter_schema = EncounterSchema()
 | 
					encounter_schema = EncounterSchema()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MentalAttackSchema(Schema):
 | 
				
			||||||
 | 
					    ams = fields.Integer(
 | 
				
			||||||
 | 
					        required=True,
 | 
				
			||||||
 | 
					        validate=validate.Range(min=3, max=18),
 | 
				
			||||||
 | 
					        description='The Attackers Mental Strength'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    dms = fields.Integer(
 | 
				
			||||||
 | 
					        required=True,
 | 
				
			||||||
 | 
					        validate=validate.Range(min=3, max=18),
 | 
				
			||||||
 | 
					        description='The Defenders Mental Strength'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    modifier = fields.Integer(
 | 
				
			||||||
 | 
					        required=False,
 | 
				
			||||||
 | 
					        default=0,
 | 
				
			||||||
 | 
					        validate=validate.Range(min=-100, max=100),
 | 
				
			||||||
 | 
					        description='Roll modifier for mental attack'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ma_schema = MentalAttackSchema()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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)
 | 
				
			||||||
@ -128,6 +154,51 @@ class RollEncounter(Resource):
 | 
				
			|||||||
        return {"encounter": creature}, 200
 | 
					        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/tohit', methods=['GET'])
 | 
					@api.route('/roll/tohit', methods=['GET'])
 | 
				
			||||||
class RollToHit(Resource):
 | 
					class RollToHit(Resource):
 | 
				
			||||||
    def get(self):
 | 
					    def get(self):
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										30
									
								
								mentattack.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								mentattack.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					import pandas as pd
 | 
				
			||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MentalAttackMatrix:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        ams = np.linspace(3, 18, 16).astype(int)
 | 
				
			||||||
 | 
					        dms = np.linspace(3, 18, 16).astype(int)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.df = pd.DataFrame(index=dms, columns=ams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        initval = 10
 | 
				
			||||||
 | 
					        for col in ams:
 | 
				
			||||||
 | 
					            for row in dms:
 | 
				
			||||||
 | 
					                if col == row:
 | 
				
			||||||
 | 
					                    self.df.loc[col, row] = initval
 | 
				
			||||||
 | 
					                elif col < row:
 | 
				
			||||||
 | 
					                    self.df.loc[col, row] = initval - (row - col)
 | 
				
			||||||
 | 
					                elif col > row:
 | 
				
			||||||
 | 
					                    self.df.loc[col, row] = initval + (col - row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_attack_score(self, ams, dms):
 | 
				
			||||||
 | 
					        return int(self.df.loc[dms, ams])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_matrix(self):
 | 
				
			||||||
 | 
					        return self.df
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def dump_matrix(self):
 | 
				
			||||||
 | 
					        print(self.df)
 | 
				
			||||||
@ -23,6 +23,12 @@ hp_model = {
 | 
				
			|||||||
    'conscore': fields.Integer(required=True, description='Conscore')
 | 
					    'conscore': fields.Integer(required=True, description='Conscore')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ma_model = {
 | 
				
			||||||
 | 
					    'ams': fields.Integer(required=True, description='Attacker Mental Strength'),
 | 
				
			||||||
 | 
					    'dms': fields.Integer(required=True, description='Defender Mental Strength'),
 | 
				
			||||||
 | 
					    'modifier': fields.Integer(required=True, description='Modifier For Mental Strength'),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
character_model = {
 | 
					character_model = {
 | 
				
			||||||
    'chartype': chartype_field,
 | 
					    'chartype': chartype_field,
 | 
				
			||||||
    'emphasis': fields.String(
 | 
					    'emphasis': fields.String(
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user