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_restx import Api, Resource
|
||||
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 mentattack import MentalAttackMatrix
|
||||
from mutations import Mutations
|
||||
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')
|
||||
ability = api.namespace('ability', description='Ability operations')
|
||||
hp = api.namespace('hp', description='HP operations')
|
||||
ma = api.namespace('ma', description='Mental Attack operations')
|
||||
character = api.namespace('character', description='Character operations')
|
||||
encounter = api.namespace('encounter', description='Encounter operations')
|
||||
|
||||
dice_model = dice.model('Dice', dice_model)
|
||||
ability_model = ability.model('Ability', ability_model)
|
||||
hp_model = hp.model('HP', hp_model)
|
||||
ma_model = ma.model('MA', ma_model)
|
||||
character_model = character.model('Character', character_model)
|
||||
encounter_model = encounter.model('Encounter', encounter_model)
|
||||
|
||||
@ -64,6 +68,28 @@ class EncounterSchema(Schema):
|
||||
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'])
|
||||
class RollDice(Resource):
|
||||
@dice.expect(dice_model)
|
||||
@ -128,6 +154,51 @@ class RollEncounter(Resource):
|
||||
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'])
|
||||
class RollToHit(Resource):
|
||||
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')
|
||||
}
|
||||
|
||||
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 = {
|
||||
'chartype': chartype_field,
|
||||
'emphasis': fields.String(
|
||||
|
Loading…
Reference in New Issue
Block a user