added Aasimar, updated background languages, and corrected a few other issues

This commit is contained in:
Ben Cook
2018-12-17 16:47:58 -05:00
parent bb09b9dacb
commit 274f34fe88
8 changed files with 89 additions and 48 deletions
+2
View File
@@ -1 +1,3 @@
from . import weapons, character from . import weapons, character
__VERSION__ = "0.6.1"
+1 -1
View File
@@ -51,7 +51,7 @@ class GuildMerchant(GuildArtisan):
class Hermit(Background): class Hermit(Background):
name = "Hermit" name = "Hermit"
skill_proficiencies = ("medicine", "religion") skill_proficiencies = ("medicine", "religion")
languages = ("[choose one]") languages = ("[choose one]", )
class Noble(Background): class Noble(Background):
+1
View File
@@ -54,6 +54,7 @@ races = {
'Half-Elf': race.HalfElf, 'Half-Elf': race.HalfElf,
'Half-Orc': race.HalfOrc, 'Half-Orc': race.HalfOrc,
'Tiefling': race.Tiefling, 'Tiefling': race.Tiefling,
'Fallen Aasimar': race.FallenAasimar,
} }
+9 -5
View File
@@ -55,12 +55,15 @@ CHECKBOX_ON = 'Yes'
CHECKBOX_OFF = 'Off' CHECKBOX_OFF = 'Off'
PDFTK_CMD = 'pdftk' PDFTK_CMD = 'pdftk'
def text_box(string): def text_box(string):
"""Format a string for displaying in a text box.""" """Format a string for displaying in a text box."""
# Remove line breaks # Remove line breaks
new_string = string.replace('\n', ' ').replace('\r', ' ') # new_string = string.replace('\n', ' ').replace('\r', ' ')
new_string = string
# Remove multiple whitespace # Remove multiple whitespace
new_string = ' '.join(new_string.split()) # new_string = ' '.join(new_string.split())
new_string = new_string
return new_string return new_string
@@ -328,8 +331,8 @@ def create_character_pdf(character, basename, flatten=False):
for _fields, weapon in zip(weapon_fields, character.weapons): for _fields, weapon in zip(weapon_fields, character.weapons):
name_field, atk_field, dmg_field = _fields name_field, atk_field, dmg_field = _fields
fields[name_field] = weapon.name fields[name_field] = weapon.name
fields[atk_field] = str(weapon.attack_bonus) fields[atk_field] = '{:+d}'.format(weapon.attack_bonus)
fields[dmg_field] = f'{weapon.damage} {weapon.damage_type}' fields[dmg_field] = f'{weapon.damage}/{weapon.damage_type}'
# Other attack information # Other attack information
attack_str = f'Armor: {character.armor}' attack_str = f'Armor: {character.armor}'
attack_str += '\n\r' attack_str += '\n\r'
@@ -460,7 +463,8 @@ def make_sheet(character_file, flatten=False):
char_base = os.path.splitext(character_file)[0] + '_char' char_base = os.path.splitext(character_file)[0] + '_char'
sheets = [char_base + '.pdf'] sheets = [char_base + '.pdf']
pages = [] pages = []
char_pdf = create_character_pdf(character=char, basename=char_base, flatten=flatten) char_pdf = create_character_pdf(character=char, basename=char_base,
flatten=flatten)
pages.append(char_pdf) pages.append(char_pdf)
if char.is_spellcaster: if char.is_spellcaster:
# Create spell sheet # Create spell sheet
+17 -1
View File
@@ -4,7 +4,8 @@ from . import weapons
__all__ = ('Dwarf', 'HillDwarf', 'MountainDwarf', 'Elf', 'HighElf', __all__ = ('Dwarf', 'HillDwarf', 'MountainDwarf', 'Elf', 'HighElf',
'WoodElf', 'DarkElf', 'Halfling', 'LightfootHalfling', 'WoodElf', 'DarkElf', 'Halfling', 'LightfootHalfling',
'StoutHalfling', 'Human', 'Dragonborn', 'Gnome', 'ForestGnome', 'StoutHalfling', 'Human', 'Dragonborn', 'Gnome', 'ForestGnome',
'RockGnome', 'HalfElf', 'HalfOrc', 'Tiefling') 'RockGnome', 'HalfElf', 'HalfOrc', 'Tiefling', 'Aasimar',
'FallenAasimar')
class Race(): class Race():
@@ -176,3 +177,18 @@ class Tiefling(Race):
intelligence_bonus = 1 intelligence_bonus = 1
charisma_bonus = 2 charisma_bonus = 2
languages = ("Common", "Infernal") languages = ("Common", "Infernal")
# Aassimar
class Aasimar(Race):
name = 'Aasimar'
size = 'medium'
speed = 30
charisma_bonus = 2
languages = ("Common", "Celestial")
# Fallen Aasimar
class FallenAasimar(Aasimar):
name = "Fallen Aasimar"
strength_bonus = 1
+2 -1
View File
@@ -17,6 +17,7 @@ def create_spell(**params):
NewSpell = type('UnknownSpell', (Spell,), params) NewSpell = type('UnknownSpell', (Spell,), params)
return NewSpell return NewSpell
class Spell(): class Spell():
"""A magical spell castable by a player character.""" """A magical spell castable by a player character."""
level = 0 level = 0
@@ -2078,7 +2079,7 @@ class EldritchBlast(Spell):
""" """
name = 'Eldritch Blast' name = 'Eldritch Blast'
level = 3 level = 0
casting_time = "1 action" casting_time = "1 action"
casting_range = "120 feet" casting_range = "120 feet"
components = ('V', 'S') components = ('V', 'S')
+55 -39
View File
@@ -5,7 +5,7 @@ class Weapon():
cost = "0 gp" cost = "0 gp"
base_damage = "1d4" base_damage = "1d4"
bonus_damage = 0 bonus_damage = 0
damage_type = "piercing" damage_type = "p"
attack_bonus = 0 attack_bonus = 0
weight = 1 # In lbs weight = 1 # In lbs
properties = "Light" properties = "Light"
@@ -16,7 +16,7 @@ class Weapon():
def damage(self): def damage(self):
dam_str = str(self.base_damage) dam_str = str(self.base_damage)
if self.bonus_damage != 0: if self.bonus_damage != 0:
dam_str += ' ' + mod_str(self.bonus_damage) dam_str += '' + mod_str(self.bonus_damage)
return dam_str return dam_str
@@ -24,7 +24,7 @@ class Club(Weapon):
name = "Club" name = "Club"
cost = "1 sp" cost = "1 sp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "bludgeoning" damage_type = "b"
weight = 2 weight = 2
properties = "Light" properties = "Light"
ability = 'strength' ability = 'strength'
@@ -34,7 +34,7 @@ class Dagger(Weapon):
name = "Dagger" name = "Dagger"
cost = "2 gp" cost = "2 gp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "piercing" damage_type = "p"
weight = 1 weight = 1
properties = "Finesse, light, thrown (range 20/60)" properties = "Finesse, light, thrown (range 20/60)"
is_finesse = True is_finesse = True
@@ -45,7 +45,7 @@ class Greatclub(Weapon):
name = "Greatclub" name = "Greatclub"
cost = "2 sp" cost = "2 sp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "bludgeoning" damage_type = "b"
weight = 10 weight = 10
properties = "Two-handed" properties = "Two-handed"
ability = 'strength' ability = 'strength'
@@ -55,7 +55,7 @@ class Handaxe(Weapon):
name = "Handaxe" name = "Handaxe"
cost = "5 gp" cost = "5 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "slashing" damage_type = "s"
weight = 2 weight = 2
properties = "Light, thrown (range 20/60)" properties = "Light, thrown (range 20/60)"
ability = 'strength' ability = 'strength'
@@ -65,7 +65,7 @@ class Javelin(Weapon):
name = "Javelin" name = "Javelin"
cost = "5 sp" cost = "5 sp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "piercing" damage_type = "p"
weight = 2 weight = 2
properties = "Thrown (range 30/120)" properties = "Thrown (range 30/120)"
ability = 'strength' ability = 'strength'
@@ -75,7 +75,7 @@ class LightHammer(Weapon):
name = "Light hammer" name = "Light hammer"
cost = "2 gp" cost = "2 gp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "bludgeoning" damage_type = "b"
weight = 2 weight = 2
properties = "Light, thrown (range 20/60)" properties = "Light, thrown (range 20/60)"
ability = 'strength' ability = 'strength'
@@ -85,7 +85,7 @@ class Mace(Weapon):
name = "Mace" name = "Mace"
cost = "5 gp" cost = "5 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "bludgeoning" damage_type = "b"
weight = 4 weight = 4
properties = "" properties = ""
ability = 'strength' ability = 'strength'
@@ -95,7 +95,7 @@ class Quarterstaff(Weapon):
name = "Quarterstaff" name = "Quarterstaff"
cost = "2 sp" cost = "2 sp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "bludgeoning" damage_type = "b"
weight = 4 weight = 4
properties = "Versatile (1d8)" properties = "Versatile (1d8)"
ability = 'strength' ability = 'strength'
@@ -105,7 +105,7 @@ class Sickle(Weapon):
name = "Sickle" name = "Sickle"
cost = "1 gp" cost = "1 gp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "slashing" damage_type = "s"
weight = 2 weight = 2
properties = "Light" properties = "Light"
ability = 'strength' ability = 'strength'
@@ -115,7 +115,7 @@ class Spear(Weapon):
name = "Spear" name = "Spear"
cost = "1 gp" cost = "1 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "piercing" damage_type = "p"
weight = 3 weight = 3
properties = "Thrown (range 20/60), versatile (1d8)" properties = "Thrown (range 20/60), versatile (1d8)"
ability = 'strength' ability = 'strength'
@@ -125,7 +125,7 @@ class LightCrossbow(Weapon):
name = "Light crossbow" name = "Light crossbow"
cost = "25 gp" cost = "25 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "piercing" damage_type = "p"
weight = 5 weight = 5
properties = "Ammunition (range 80/320, loading, two-handed" properties = "Ammunition (range 80/320, loading, two-handed"
ability = 'dexterity' ability = 'dexterity'
@@ -135,7 +135,7 @@ class Dart(Weapon):
name = "Dart" name = "Dart"
cost = "5 cp" cost = "5 cp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "piercing" damage_type = "p"
weight = 0.25 weight = 0.25
properties = "Finesse, thrown (range 20/60)" properties = "Finesse, thrown (range 20/60)"
is_finesse = True is_finesse = True
@@ -146,7 +146,7 @@ class Shortbow(Weapon):
name = "Shortbow" name = "Shortbow"
cost = "25 gp" cost = "25 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "piercing" damage_type = "p"
weight = 2 weight = 2
properties = "Ammunition (range 80/320), two-handed" properties = "Ammunition (range 80/320), two-handed"
ability = 'dexterity' ability = 'dexterity'
@@ -156,7 +156,7 @@ class Sling(Weapon):
name = "Sling" name = "Sling"
cost = "1 sp" cost = "1 sp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "bludgeoning" damage_type = "b"
weight = 0 weight = 0
properties = "Ammunition (range 30/120)" properties = "Ammunition (range 30/120)"
ability = 'dexterity' ability = 'dexterity'
@@ -166,7 +166,7 @@ class Battleaxe(Weapon):
name = "Battleaxe" name = "Battleaxe"
cost = "10 gp" cost = "10 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "slashing" damage_type = "s"
weight = 4 weight = 4
properties = "Versatile (1d10)" properties = "Versatile (1d10)"
ability = 'strength' ability = 'strength'
@@ -176,7 +176,7 @@ class Flail(Weapon):
name = "Flail" name = "Flail"
cost = "10gp" cost = "10gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "bludgeoning" damage_type = "b"
weight = 2 weight = 2
properties = "" properties = ""
ability = 'strength' ability = 'strength'
@@ -186,7 +186,7 @@ class Glaive(Weapon):
name = "Glaive" name = "Glaive"
cost = "20 gp" cost = "20 gp"
base_damage = "1d10" base_damage = "1d10"
damage_type = "slashing" damage_type = "s"
weight = 6 weight = 6
properties = "Heavy, reach, two-handed" properties = "Heavy, reach, two-handed"
ability = 'strength' ability = 'strength'
@@ -196,7 +196,7 @@ class Greataxe(Weapon):
name = "Greataxe" name = "Greataxe"
cost = "30 gp" cost = "30 gp"
base_damage = "1d12" base_damage = "1d12"
damage_type = "slashing" damage_type = "s"
weight = 7 weight = 7
properties = "Heavy, two-handed" properties = "Heavy, two-handed"
ability = 'strength' ability = 'strength'
@@ -206,7 +206,7 @@ class Greatsword(Weapon):
name = "Greatsword" name = "Greatsword"
cost = "50 gp" cost = "50 gp"
base_damage = "2d6" base_damage = "2d6"
damage_type = "slashing" damage_type = "s"
weight = 6 weight = 6
properties = "Heavy, two-handed" properties = "Heavy, two-handed"
ability = 'strength' ability = 'strength'
@@ -216,7 +216,7 @@ class Halberd(Weapon):
name = "Halberd" name = "Halberd"
cost = "20 gp" cost = "20 gp"
base_damage = "1d10" base_damage = "1d10"
damage_type = "slashing" damage_type = "s"
weight = 6 weight = 6
properties = "Heavy, reach, two-handed" properties = "Heavy, reach, two-handed"
ability = 'strength' ability = 'strength'
@@ -226,7 +226,7 @@ class Lance(Weapon):
name = "Lance" name = "Lance"
cost = "10gp" cost = "10gp"
base_damage = "1d12" base_damage = "1d12"
damage_type = "piercing" damage_type = "p"
weight = 6 weight = 6
properties = "Reach, special" properties = "Reach, special"
ability = 'strength' ability = 'strength'
@@ -236,7 +236,7 @@ class Longsword(Weapon):
name = "Longsword" name = "Longsword"
cost = "15 gp" cost = "15 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "slashing" damage_type = "s"
weight = 3 weight = 3
properties = "Versatile (1d10)" properties = "Versatile (1d10)"
ability = 'strength' ability = 'strength'
@@ -246,7 +246,7 @@ class Maul(Weapon):
name = "Maul" name = "Maul"
cost = "10 gp" cost = "10 gp"
base_damage = "2d6" base_damage = "2d6"
damage_type = "bludgeoning" damage_type = "b"
weight = 10 weight = 10
properties = "Heavy, two-handed" properties = "Heavy, two-handed"
ability = 'strength' ability = 'strength'
@@ -256,7 +256,7 @@ class Morningstar(Weapon):
name = "Morningstar" name = "Morningstar"
cost = "15 gp" cost = "15 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "piercing" damage_type = "p"
weight = 4 weight = 4
properties = "" properties = ""
ability = 'strength' ability = 'strength'
@@ -266,7 +266,7 @@ class Pike(Weapon):
name = "Pike" name = "Pike"
cost = "5 gp" cost = "5 gp"
base_damage = "1d10" base_damage = "1d10"
damage_type = "piercing" damage_type = "p"
weight = 18 weight = 18
properties = "Heavy, reach, two-handed" properties = "Heavy, reach, two-handed"
ability = 'strength' ability = 'strength'
@@ -276,7 +276,7 @@ class Rapier(Weapon):
name = "Rapier" name = "Rapier"
cost = "25 gp" cost = "25 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "piercing" damage_type = "p"
weight = 2 weight = 2
properties = "Finesse" properties = "Finesse"
is_finesse = True is_finesse = True
@@ -287,7 +287,7 @@ class Scimitar(Weapon):
name = "Scimitar" name = "Scimitar"
cost = "25 gp" cost = "25 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "slashing" damage_type = "s"
weight = 3 weight = 3
properties = "Finesse, light" properties = "Finesse, light"
is_finesse = True is_finesse = True
@@ -298,7 +298,7 @@ class Shortsword(Weapon):
name = "Shortsword" name = "Shortsword"
cost = "10 gp" cost = "10 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "piercing" damage_type = "p"
weight = 0 weight = 0
properties = "Finesse, light" properties = "Finesse, light"
is_finesse = True is_finesse = True
@@ -309,7 +309,7 @@ class ThrowingHammer(Weapon):
name = "Throwing Hammer" name = "Throwing Hammer"
cost = "15 gp" cost = "15 gp"
base_damage = '1d6' base_damage = '1d6'
damage_type = "bludgeoning" damage_type = "b"
weight = 4 weight = 4
properties = "Thrown (range 60/120)" properties = "Thrown (range 60/120)"
ability = "strength" ability = "strength"
@@ -319,7 +319,7 @@ class Trident(Weapon):
name = "Trident" name = "Trident"
cost = "5 gp" cost = "5 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "piercing" damage_type = "p"
weight = 4 weight = 4
properties = "Thrown (range 20/60), versatile (1d8)" properties = "Thrown (range 20/60), versatile (1d8)"
ability = 'strength' ability = 'strength'
@@ -329,7 +329,7 @@ class WarPick(Weapon):
name = "War pick" name = "War pick"
cost = "5 gp" cost = "5 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "piercing" damage_type = "p"
weight = 2 weight = 2
properties = "" properties = ""
ability = 'strength' ability = 'strength'
@@ -339,7 +339,7 @@ class Warhammer(Weapon):
name = "Warhammer" name = "Warhammer"
cost = "15 gp" cost = "15 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "bludgeoning" damage_type = "b"
weight = 2 weight = 2
properties = "Versatile (1d10)" properties = "Versatile (1d10)"
ability = 'strength' ability = 'strength'
@@ -349,7 +349,7 @@ class Whip(Weapon):
name = "Whip" name = "Whip"
cost = "2 gp" cost = "2 gp"
base_damage = "1d4" base_damage = "1d4"
damage_type = "slashing" damage_type = "s"
weight = 3 weight = 3
properties = "Finesse, reach" properties = "Finesse, reach"
is_finesse = True is_finesse = True
@@ -360,7 +360,7 @@ class Blowgun(Weapon):
name = "Blowgun" name = "Blowgun"
cost = "10 gp" cost = "10 gp"
base_damage = "1" base_damage = "1"
damage_type = "piercing" damage_type = "p"
weight = 1 weight = 1
properties = "Ammunition (range 25/100), loading" properties = "Ammunition (range 25/100), loading"
ability = 'dexterity' ability = 'dexterity'
@@ -370,7 +370,7 @@ class HandCrossbow(Weapon):
name = "Crossbow, hand" name = "Crossbow, hand"
cost = "75 gp" cost = "75 gp"
base_damage = "1d6" base_damage = "1d6"
damage_type = "piercing" damage_type = "p"
weight = 3 weight = 3
properties = "Ammunition (range 30/120), light, loading" properties = "Ammunition (range 30/120), light, loading"
ability = 'dexterity' ability = 'dexterity'
@@ -380,7 +380,7 @@ class HeavyCrossbow(Weapon):
name = "Crossbow, heavy" name = "Crossbow, heavy"
cost = "50 gp" cost = "50 gp"
base_damage = "1d10" base_damage = "1d10"
damage_type = "piercing" damage_type = "p"
weight = 18 weight = 18
properties = "Ammunition (range 100/400), heaving, loading, two-handed" properties = "Ammunition (range 100/400), heaving, loading, two-handed"
ability = 'strength' ability = 'strength'
@@ -390,7 +390,7 @@ class Longbow(Weapon):
name = "Longbow" name = "Longbow"
cost = "50 gp" cost = "50 gp"
base_damage = "1d8" base_damage = "1d8"
damage_type = "piercing" damage_type = "p"
weight = 2 weight = 2
properties = "Ammunition (range 150/600), heavy, two-handed" properties = "Ammunition (range 150/600), heavy, two-handed"
ability = 'strength' ability = 'strength'
@@ -405,6 +405,22 @@ class Net(Weapon):
properties = "Special, thrown (range 5/15)" properties = "Special, thrown (range 5/15)"
ability = 'strength' ability = 'strength'
class Unarmed(Weapon):
name = "Unarmed"
cost = "0 gp"
base_damage = "1"
damage_type = "b"
weight = 0
properties = ""
ability = "strength"
class SotaFist(Unarmed):
name = "Sota Fist"
base_damage = "1d4"
bonus_damage = 2
# Some lists of weapons for easy proficiency resolution # Some lists of weapons for easy proficiency resolution
simple_melee_weapons = (Club, Dagger, Greatclub, Handaxe, Javelin, simple_melee_weapons = (Club, Dagger, Greatclub, Handaxe, Javelin,
+2 -1
View File
@@ -21,7 +21,8 @@ setup(name='dungeonsheets',
packages=['dungeonsheets'], packages=['dungeonsheets'],
package_data={ package_data={
'dungeonsheets': ['blank-character-sheet-default.pdf', 'blank-spell-sheet-default.pdf', 'dungeonsheets': ['blank-character-sheet-default.pdf', 'blank-spell-sheet-default.pdf',
'spellbook_template.tex'] 'spellbook_template.tex', '../VERSION',
'character_template.txt']
}, },
install_requires=[ install_requires=[
'fdfgen', 'npyscreen', 'jinja2', 'pdfrw', 'fdfgen', 'npyscreen', 'jinja2', 'pdfrw',