It Builds Character
Yet another app for the Pathfinder Roleplaying Game to manage characters and combat. http://jsexauer.github.io/ItBuildsCharacter
Overview
Some features that make ItBuildsCharacter unique over others:
Andorid App
Android app built using kivy framework. It allows you to see all the basics statistics of your character, equip different weapons (which automatically updates the attacks), apply buffs to your character (see Buffs), and roll attacks. See pictures below.
Python Model
An extensive model has been created to allow the definition of characters as python objects. An example is presented below and is the character used in the following examples. I'll be honest, documentation is lacking, it's on the to-do list. While we're being honest, the model greatly favors melee characters right now. Spells lists aren't supported. Another thing for the to-do list...
Auditing
This is my favorite feature. Have you ever been looking at your charcter sheet and wondering "How exactly did I get a +7 reflex save? +5 from the class, +1 from my cloak, but I must be forgetting something... maybe some trait or something?" Wonder no longer! I support full auditing of all statistics to show how they were derived.
For example, here is how the sample character's hit point pool is calculated:
>>> with c.audit_context:
... print c.HP
...
hit_die + (level-1)*hp_per_level + con*level + favored_class + feats:
con: +1
level: +5
favored_class: +5
hit_die: +10
feats:
Toughness (HP: +5)
hp_per_level: +6
= +49
and here's how the attack and damage modifiers were calculated:
>>> with c.audit_context:
... print c.attacks[0]
...
Attack of...:
attack: <Attack Bonus at iterative + weapon:
weapon: +2
AB: <Sum of:
BAB: +5
str: +4
= +9>
= +11>
damage: <Sum of:
str: +4
weapon: 2d6+2
two_handed_str_bonus: +2
= 2d6+8>
= +11 for 2d6+8 damage
Buffs
Toggle on buffs and conditions like flanking, rage, Bless, Inspire Courage, etc...
Statistics and attacks automatically update.
For example, let's say our example Cavalier is blessed and challenges his target. First let's build the buffs and apply them to the character
>>> challenge = Buff('Challenge', dmg_mod=5)
>>> challenge.AC = 1
>>> c.buffs.append(challenge)
>>> c.buffs.append(Buff('Bless', atk_mod=1))
Now let's sett how that's affected his attack:
>>> with c.audit_context:
... print c.attacks[0]
Attack of...:
attack: <Attack Bonus at iterative + weapon:
weapon: +2
AB: <Sum of:
BAB: +5
str: +4
buffs:
Bless (+1)
= +10>
= +12>
damage: <Sum of:
str: +4
buffs:
Challenge (+5)
weapon: 2d6+2
two_handed_str_bonus: +2
= 2d6+13>
= +12 for 2d6+13 damage
Counters
Track things like HP, gold, XP, ki pool, etc. You can add/subtract one at a time (the + and - buttons), add arbitrary value (+n), or set to arbitrary value (n). Counter values are automatically saved to the sever, which brings us to...
Website Integration
The character definition and counter statuses are automatically synced between the phone app and the website. This means you can view your character online, on different phones/devices, etc and you'll always be looking at the same character. Ultimately, I hope to build off of the web-ui of MythWeavers, which is based on the open-source project 3EProfiler.
Android App Screenshots
Statistics Screen
Attacks/Buffs Screen
Counters
Audits
A long-press on any darker-background numbers in the stats or attacks screen will show an "audit" of how that value was calculated. Attacks are among the most interesting:
Example Character Definition
The code below will create a level 5 human Cavalier named Henri.
from model import (Character, RPGClass, Equipment, Weapon, Attack,
Buff, Feat, auditable)
class Cavalier(RPGClass):
def __init__(self):
super(Cavalier, self).__init__()
self.hit_die = 10
self.fort = 4 # TODO: Scale will level
self.ref = 1
self.will = 1
c = Character()
c.name = 'Henri'
c.lvl = 5
c.BAB = 5
c.rpg_class = Cavalier()
# Ability Scores
c.base.str_score = 19
c.base.dex_score = 12
c.base.con_score = 13
c.base.cha_score = 14
# All the others are the default value of 10
Let's now give him a Masterwork Breastplate +2 and a Cloak of Resistance +1.
# Armor
breastplate = Equipment("Masterwork Breastplate +2")
breastplate.AC = 8
breastplate.ACP = -3
c.equipment.append(breastplate)
cr = Equipment("Cloak of Resistance +1")
cr.fort = 1
cr.ref = 1
cr.will = 1
c.equipment.append(cr)
To defend himself against the evils of Golarion, he needs a +2 Feybane Greatsword and a Composite long bow (in case he has to fight at range).
# Weapons
feybane_greatsword = Weapon("+2 Feybane Greatsword",
Attack(2, "2d6+2", [19,20], two_handed=True))
c.equipment.main_hand = feybane_greatsword
cmpst_lng_bow = Weapon("+2 Cmpst Lng Bow", Attack(2, "1d8", ranged=True))
c.equipment.append(cmpst_lng_bow)
Finally, Henri took Toughness, which will scale as he levels. Notice that we can define a custom formula which show up during when we audit how his hit points were calculated.
# Feats
class Toughness(Feat):
def on_apply(self, character):
self.character = character
@auditable
def HP(self):
_formula = "3 + max(lvl-3, 0)"
lvl = self.character.lvl
return 3 + max(lvl-3,0)
toughness = Toughness("Toughness")
c.feats.append(toughness)
Installing and Using
ItBuildsCharacter is alpha-quality software. I develop it as I have time and think of
new features I'd like to have. However, I am interested in releasing it to a
larger user base (eventually the general Android App Store) if other find it useful.
You can get the latest test build as an Android APK here. Make sure you are allowing installation from unknown sources.
If you want the latest and greatest dev version:- Download the Kivy Launcher
- Copy the contents of the master branch
into a subdirectory of
/sdcard/kivy
. - Launch the Kivy Launcher and select "ItBuildsCharacter"
- Very basic web support (editing the character definition) can be done at: http://genericlifeform.pythonanywhere.com/IBC/characters/0 (Replace 0 with any character id)
- There is no user autentication on the website half yet, so play nice :-)
- Please feel free to contact me for additional help. These insturctions are very general and I've probably left out important details.
Development
Right now I am the sole developer. But pull-requests
are welcome! Any bugs should be submitted through the issue tracker.
Developed for Python 2.7 and Android 4.1.2.