|
|
from random import randint, choice
from .models import ( CharacterClass, EquipmentArmour, EquipmentRangedWeapon, EquipmentMeleeWeapon, CharacterNPC )
def number_encountered(): return (randint(1, 4) + 2)
def npc_class(): classes = [c for cls in CharacterClass.query.all() for c in ([cls] * cls.frequency_modifier)] return choice(classes)
def npc_alignment(): roll = randint(1, 6) if roll == 1 or roll == 2: return 'Lawful' elif roll == 3 or roll == 4 or roll == 5: return 'Neutral' elif roll == 6: return 'Chaotic'
def npc_baselevel(base_level): roll = randint(1, 6) mod = 0 if roll == 1: mod = -2 elif roll == 2: mod = -1 elif roll == 3 or roll == 4: mod = 0 elif roll == 5: mod = 1 elif roll == 6: mod = 2
base_level += mod if base_level < 1: base_level = 1
return base_level
def npc_abilities(): ability_list = ['str', 'int', 'wis', 'dex', 'con', 'chr'] abilities = [(randint(1, 6) + randint(1, 6) + randint(1, 6)) for x in range(0,6)] return zip(ability_list, abilities)
def attribute_mod(atr): mod = 0
if atr <= 3: mod = -3 if atr >= 4 and atr <= 5: mod = -2 if atr >= 6 and atr <= 8: mod = -1 if atr >= 9 and atr <= 12: mod = 0 if atr >= 13 and atr <= 15: mod = 1 if atr >= 16 and atr <= 17: mod = 2 if atr >= 18: mod = 3
return mod
def select_melee_weapon(guild, data): weapons = [] for x in range(0, guild.melee_heavy): weapons.extend(data['melee']['heavy']) for x in range(0, guild.melee_medium): weapons.extend(data['melee']['medium']) for x in range(0, guild.melee_light): weapons.extend(data['melee']['light'])
selection = randint(0, len(weapons) - 1) return weapons[selection]
def select_ranged_weapon(guild, data): weapons = [] for x in range(0, guild.ranged_light): weapons.extend(data['ranged']['light']) for x in range(0, guild.ranged_heavy): weapons.extend(data['ranged']['heavy'])
if not weapons: return None
selection = randint(0, len(weapons) - 1) return weapons[selection]
def generate_npc(base_level, data): guild = npc_class()
npc = {} npc['guild'] = guild.name
npc['level'] = npc_baselevel(base_level) npc.update(npc_abilities())
npc['hp'] = 0 conmod = attribute_mod(npc['con']) hitdice = [randint(1, guild.hit_die_size) for x in range(0, npc['level'])] for die in hitdice: die += conmod if die < 1: die = 1 npc['hp'] += die
armourval = randint(0, len(data['armours']) - 1) + guild.armour_modifier if armourval < 0: armourval = 0 if armourval > len(data['armours']) - 1: armourval = len(data['armours']) - 1 armour = data['armours'][armourval] npc['armour'] = [armour.name, armour.gp_value, armour.ac_mod] melee = select_melee_weapon(guild, data) npc['melee'] = [melee.name, melee.gp_value, melee.damage_die] if melee else None ranged = select_ranged_weapon(guild, data) npc['ranged'] = [ranged.name, ranged.gp_value, ranged.damage_die] if ranged else None
return npc
def create_party(base_level): data = { 'armours': EquipmentArmour.query.all(), 'ranged': { 'light': EquipmentRangedWeapon.query.filter_by(bucket='Light').all(), 'heavy': EquipmentRangedWeapon.query.filter_by(bucket='Heavy').all() }, 'melee': { 'light': EquipmentMeleeWeapon.query.filter_by(bucket='Light').all(), 'medium': EquipmentMeleeWeapon.query.filter_by(bucket='Medium').all(), 'heavy': EquipmentMeleeWeapon.query.filter_by(bucket='Heavy').all() }, } party_size = number_encountered() return [generate_npc(base_level, data) for x in range(0, party_size)]
def print_party(party): def print_npc(npc): print('Level {0} NPC, {1}, {2} HP'.format(npc['level'], npc['guild'], npc['hp'])) print('{0} Str, {1} Int, {2} Wis, {3} Dex, {4} Con, {5} Chr'.format( npc['str'], npc['int'], npc['wis'], npc['dex'], npc['con'], npc['chr'] )) print('Armour Class: {0} - {1}, {2}gp'.format(npc['armour'][2], npc['armour'][0], npc['armour'][1])) print('{:^16} - {:^10} - {:^10} - {:^10}'.format('Weapon', 'Gold', 'Throw Mod', 'Damage')) print('-------------------------------------------------------') print('{:^16} | {:^10} | {:^10} | {:^10}'.format(npc['melee'][0], npc['melee'][1], 0, npc['melee'][2])) if npc['ranged']: print('{:^16} | {:^10} | {:^10} | {:^10}'.format(npc['ranged'][0], npc['ranged'][1], 0, npc['ranged'][2])) print('\n')
for npc in party: print_npc(npc)
if __name__ == '__main__': party = create_party(2) print_party(party)
|