Changeset 747

Show
Ignore:
Timestamp:
02/23/04 19:21:55 (5 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBPrivate/WheelOfTime/WheelOfTime.py

    r746 r747  
    3636#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3737 
     38class Stat(object): 
     39    TraitDependencyTable = { 
     40        'compelling-defense':('strong-willed', 'iron-willed'), 
     41        'initiative':('agile', 'alert', 'quick'), 
     42        'soak':('energetic', 'high-pain-threshold', 'tough'), 
     43        'social-defense':('commanding', 'presence', 'strong-willed'), 
     44 
     45        #TODO: 
     46        # 'mental-defense' stat == 'sense-deception' skill 
     47        # 'passive-defense' stat == 0.5 * weapon skill in use 
     48        } 
     49 
     50    def __init__(self, statkey): 
     51        self.statkey = statkey.replace(' ', '-').lower() 
     52        self.getTraits() 
     53 
     54    def getEffectiveLevel(self, traits): 
     55        return self.getLevel() 
     56 
     57    def getLevel(self): 
     58        return sum(filter(None, map(traits.get, self.getTraits()))) 
     59 
     60    def getTraits(self): 
     61        return self.TraitDependencyTable[self.statkey] 
     62 
     63#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     64 
    3865class Skill(object): 
    39     TraitDependecyTable = { 
     66    TraitDependencyTable = { 
    4067        # Dreamwalker Skills 
    4168        'control-self':('discerning', 'precise', 'strong-willed'), 
     
    166193        self.skillkey = skillkey.replace(' ', '-').lower() 
    167194        self.points = points 
    168         self.GetTraits() 
     195        self.getTraits() 
    169196 
    170197    def __repr__(self): 
    171         return "<%s: %r %s %d (%1.1f%s)>" % (self.__class__.__name__, self.skillkey, self.GetTitle(), self.GetLevel(), self.points, self.naturaltalent and ' natural tallent' or '') 
    172  
    173     def GetEffectiveLevel(self, traits): 
    174         return self.GetLevel() + sum(filter(None, map(traits.get, self.GetTraits()))) 
    175  
    176     def GetLevel(self): 
     198        return "<%s: %r %s (%d | %1.1f%s)>" % (self.__class__.__name__, self.skillkey, self.getTitle(), self.getLevel(), self.points, self.naturaltalent and ' natural tallent' or '') 
     199 
     200    def getEffectiveLevel(self, traits): 
     201        return self.getLevel() + sum(filter(None, map(traits.get, self.getTraits()))) 
     202 
     203    def getLevel(self): 
    177204        pts = self.points * (1 + self.naturaltalent) 
    178205        return bisect.bisect_right(self.SkillLevel, (pts, ())) - 1 
    179206 
    180     def GetTitle(self): 
    181         return self.SkillLevel[self.GetLevel()][1] 
    182  
    183     def GetLevelAndTitle(self): 
    184         level = self.GetLevel() 
     207    def getTitle(self): 
     208        return self.SkillLevel[self.getLevel()][1] 
     209 
     210    def getLevelAndTitle(self): 
     211        level = self.getLevel() 
    185212        return level, self.SkillLevel[level][1] 
    186213 
    187     def GetTraits(self): 
    188         return self.TraitDependecyTable[self.skillkey] 
    189  
    190     def IncrementBy(self, skill): 
     214    def getTraits(self): 
     215        return self.TraitDependencyTable[self.skillkey] 
     216 
     217    def incrementBy(self, skill): 
    191218        assert self.skillkey == skill.skillkey 
    192219        self.points += skill.points 
    193220 
    194     def SkillTraitReferenceCounts(self, counts=None, weighted=False): 
     221    def skillTraitReferenceCounts(self, counts=None, weighted=False): 
    195222        if counts is None: counts = {} 
    196         for trait in self.GetTraits(): 
     223        for trait in self.getTraits(): 
    197224            if weighted: 
    198225                r = counts.setdefault(trait, [0]) 
    199                 r[0] += self.points**2 #self.GetLevel()**2 
     226                r[0] += self.points**2 #self.getLevel()**2 
    200227                r.append(self.skillkey) 
    201228                counts[trait] = r 
     
    221248        self.skills = {} 
    222249        self.traits = {} 
    223         self.attributes = {} 
     250        self.attributes = [] 
     251        self.equipment = [] 
     252        self.money = 0 # in silver shillings 
     253        self.age = 13 
     254 
     255    def addEquipment(self, equipment, cost, description=''): 
     256        assert cost <= self.money 
     257        self.money -= cost 
     258        self.equipment.append((cost, equipment, description)) 
    224259 
    225260    def addTrait(self, trait, value=1): 
     
    233268 
    234269    def addAttribute(self, attr): 
    235         self.attributes[attr] = attr 
     270        attr = attr.replace(' ', '-').lower() 
     271        self.attributes.append(attr) 
    236272        return attr 
    237273    def addAttributes(self, attrs): 
    238274        map(self.addAttribute, attrs) 
     275 
     276    def getStat(self, statkey): 
     277        return Stat(statkey) 
    239278 
    240279    def getSkill(self, skillkey): 
     
    246285    def addSkill(self, skill): 
    247286        if skill.skillkey in self.skills: 
    248             self.skills[skill.skillkey].IncrementBy(skill) 
     287            self.skills[skill.skillkey].incrementBy(skill) 
    249288        else: 
    250289            self.skills[skill.skillkey] = skill 
     
    254293        map(self.addSkill, skills) 
    255294 
    256     def SkillTraitReferenceCounts(self, counts=None, weighted=False): 
     295    def addYear(self, occupation, income, skills): 
     296        self.age += 1 
     297        self.money += income 
     298        # TODO: go through skills to make sure that they are "within budget" 
     299        self.addSkills(skills) 
     300 
     301    def skillTraitReferenceCounts(self, counts=None, weighted=False): 
    257302        if counts is None: counts = {} 
    258303        for skill in self.skills.values():  
    259             skill.SkillTraitReferenceCounts(counts, weighted) 
     304            skill.skillTraitReferenceCounts(counts, weighted) 
    260305        return counts 
     306 
     307    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     308    #~ Debug printing 
     309    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     310 
     311    def printSkills(self): 
     312        skillformat = '%22s %d (base:%d %s)' 
     313        items = [(s.getEffectiveLevel(self.traits), s.getLevel(), s.points, n, s) for n, s in self.skills.items()] 
     314        items.sort() 
     315        items.reverse() 
     316        print "Skills" 
     317        for skill in items: 
     318            skill = skill[-1] 
     319            print skillformat%( 
     320                    skill.skillkey,  
     321                    skill.getEffectiveLevel(self.traits), 
     322                    skill.getLevel(),  
     323                    ' '.join(['%s:%d'%(t, self.traits[t]) for t in skill.getTraits() if t in self.traits]), 
     324                    ) 
     325        print 
     326 
     327    def printUsedTraits(self, filter=False): 
     328        traitformat = '%-8s %d %3d %-16s %s' 
     329        usedtraits = self.skillTraitReferenceCounts(weighted=True) 
     330        items = [(Traits.Table[t], t in self.traits, c[0], repr(t), ','.join(c[1:])) for t, c in usedtraits.items() if not filter or t not in char.traits] 
     331        items.sort() 
     332        items.reverse() 
     333        print "Traits weighted by use:" 
     334        for each in items: 
     335            print traitformat%each 
     336        print 
     337 
     338    def printUnusedTraits(self): 
     339        traitformat = '%-8s %d %3d %-16s %s' 
     340        usedtraits = self.skillTraitReferenceCounts(weighted=True) 
     341        unusedtraits = [] 
     342        for trait in Traits.Table.keys(): 
     343            c = usedtraits.get(trait, [0]) 
     344            item = (Traits.Table[trait], trait in self.traits, c[0], repr(trait), ','.join(c[1:])) 
     345            if c[0] < 10: 
     346                unusedtraits.append(item) 
     347        unusedtraits.sort() 
     348        unusedtraits.reverse() 
     349        print "Unused traits:" 
     350        for item in unusedtraits: 
     351            print traitformat%item 
     352        print 
     353 
  • trunk/RBPrivate/WheelOfTime/alLarin.py

    r745 r747  
    1010 
    1111def alLarin(): 
    12     # TODO: Add yearly experience model 
    13     # TODO: Calculate earnings automatically -- 280 SS? 
    14     # TODO: Collect weapons, chailmail, horse from service as a guard and soldier 
    15     # TODO: Choose supplies 
    1612    char = Character() 
    1713 
     
    2622        'Golden-Eyes', # 6pts, Note: Allocated below 
    2723        ])  
     24    char.getSkill('tactics').naturaltalent = 1 # Accounts for "Natural Tallent" 
     25    #char.getSkill('sword').naturaltalent = 1 # Accounts for "Natural Tallent" 
    2826 
    2927    #~ Traits ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    3331 
    3432    # Primary Traits: Mental -- 6 points 
    35     char.addTraits([ 
    36         'empathetic', 'analytical', 'insightful', 'knowlegeable', 'experienced', 'alert',  
    37         ]) 
    38     char.addTrait('mechanically-inclined', -1) 
    39     char.addTrait('discerning', 1) 
     33    char.addTraits(['empathetic', 'analytical', 'insightful', 'knowlegeable', 'experienced', 'alert']) 
    4034 
    4135    # Secondary Traits: Physical -- 4 points 
    42     char.addTraits([ 
    43         'agile', 'brawny', 'quick', 'tough', ##'athletic', 'targeteer', 'broadshouldered',  
    44         ]) 
    45     char.addTraits(['robust'], -1) 
     36    char.addTraits(['agile', 'brawny', 'quick', 'tough']) 
    4637 
    4738    # Tertiary Traits: Social -- 2 points 
    48     char.addTraits([  
    49         'commanding', 'charismatic', ##'eloquent',  
    50         ]) 
    51     char.addTraits(['witty'], -1) 
    52     char.addTraits(['enigmatic', 'strong-willed'], 1) 
     39    char.addTraits(['commanding', 'charismatic']) 
     40 
     41    # Exchanged traits 
     42    char.addTraits(['robust', 'witty', 'mechanically-inclined'], -1) 
     43    char.addTraits(['discerning', 'enigmatic', 'strong-willed'], 1) 
    5344 
    5445    #~ Skills ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    5950 
    6051    # Child-year skills --  
     52    char.money = 20 # SS -- starting money for a commoner 
    6153    char.addSkills([ 
    6254        Skill('Carouse', 1), Skill('Consume-Alcohol', 1), Skill('Gambling', 1), Skill('Ride-Animal', 1), 
     
    7062        ]) 
    7163 
    72     # Guard - 5 SS 
    73     char.addSkills([ 
    74         # 14th year 
    75         Skill('Sword', 1), Skill('Shortbow', 2), Skill('Hear-Noise', .5), Skill('Notice', .5), HobbySkill('Ride-Animal', 1), 
    76         # 15th year 
    77         Skill('Sword', 1), Skill('Shortbow', 2), Skill('Hear-Noise', .5), Skill('Notice', .5), HobbySkill('Ride-Animal', .5), HobbySkill('Consume-Alcohol', .5), 
    78         # 16th year 
    79         Skill('Sword', 1.5), Skill('Shortbow', 1.5), Skill('Leadership', .5), Skill('Interrogate', .5), HobbySkill('Ride-Animal', .5), HobbySkill('Consume-Alcohol', .5), 
    80         # 17th year -- decides to become a soldier -- starts training by running and jumping 
    81         Skill('Sword', 1), Skill('Shortbow', 1), Skill('Leadership', 1), Skill('Persuade', .5), Skill('Interrogate', .5), HobbySkill('Run', .5), HobbySkill('Jump', .5), 
    82         # 18th year 
    83         Skill('Sword', 1), Skill('Shortbow', 1), Skill('Leadership', 1.5), Skill('Persuade', .5), HobbySkill('Run', .5), HobbySkill('Jump', .5), 
    84         ]) 
     64    char.addEquipment('Large belt pouch', 0.1) 
     65    char.addEquipment('Wool Cloak', 6.7) 
     66    char.addEquipment('Wool Shirt', 4.4) 
     67    char.addEquipment('Wool Pants', 4.5) 
     68    char.addEquipment('Fish Hook (2)', 0.1) 
     69    char.addEquipment('Flint', 0.05) 
     70    char.addEquipment('Whetstone', 0.02) 
     71    char.addEquipment('Wineskin', 0.8) 
     72    char.addEquipment('Blanket', .5) 
    8573 
    86     # Soldier:Grunt - 5 SS 
    87     char.addSkills([ 
    88         # 19th year -- Sets sights on becoming a seargent, so he takes an interest in Tactics, and starts training on Lance 
    89         Skill('Sword', 1.5), Skill('Lance', 2), Skill('Dagger', .5), HobbySkill('Tactics', .5), HobbySkill('Ride-Animal', .5),  
    90         # 20th year 
    91         Skill('Sword', 1), Skill('Lance', 2), Skill('Shortbow', .5), Skill('Dagger', .5), HobbySkill('Tactics', 0.5), HobbySkill('First-Impression', 0.5), 
    92         # 21th year 
    93         Skill('Sword', 1), Skill('Lance', 2), Skill('Shortbow', 1), HobbySkill('Tactics', 0.5), HobbySkill('First-Impression', 0.5), 
    94         ]) 
     74    # 14th-16th year -- starts life as a guard 
     75    char.addYear('Guard', 5, [Skill('Sword', 1), Skill('Shortbow', 2), Skill('Hear-Noise', .5), Skill('Notice', .5), HobbySkill('Ride-Animal', 1)]) 
     76    char.addEquipment('Shortbow', 2, 'First weapon!') 
     77    char.addEquipment('Arrows (36)', 1.2) 
     78    char.addEquipment('Quiver', 0.8) 
     79    char.addYear('Guard', 5, [Skill('Sword', 1), Skill('Shortbow', 2), Skill('Hear-Noise', .5), Skill('Notice', .5), HobbySkill('Ride-Animal', .5), HobbySkill('Consume-Alcohol', .5)]) 
     80    char.addEquipment('Leather Armor', 5.0) 
     81    char.addYear('Guard', 5, [Skill('Sword', 1.5), Skill('Shortbow', 1.5), Skill('Leadership', .5), Skill('Interrogate', .5), HobbySkill('Ride-Animal', .5), HobbySkill('Consume-Alcohol', .5)]) 
     82    char.addEquipment('High Hard Boots', 6.0) 
     83    # 17th year -- decides to become a soldier and starts training by running and jumping 
     84    char.addYear('Guard', 5, [Skill('Sword', 1), Skill('Shortbow', 1), Skill('Leadership', 1), Skill('Persuade', .5), Skill('Interrogate', .5), HobbySkill('Run', .5), HobbySkill('Jump', .5)]) 
     85    char.addYear('Guard', 5, [Skill('Sword', 1), Skill('Shortbow', 1), Skill('Leadership', 1.5), Skill('Persuade', .5), HobbySkill('Run', .5), HobbySkill('Jump', .5)]) 
    9586 
    96     # Soldier:Seargent - 10 SS 
    97     char.addSkills([ 
    98         # 22nd year -- Sets sights immediately on becoming an officer, and the path to get there 
    99         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Sword', 1), Skill('Lance', 1.5), HobbySkill('Ride-Animal', .5), DreamSkill('Dream Travel', .5), 
    100         # 23rd year 
    101         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Sword', 1), Skill('Lance', 1.5), DreamSkill('Control Self', 0.5), DreamSkill('Dream Travel', .5), 
    102         # 24th year 
    103         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Sword', 1.5), Skill('Lance', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Dream Travel', .5), 
    104         # 25th year 
    105         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Intimidate', .5), Skill('Interrogate', .5), Skill('Sword', 1), DreamSkill('Control Self', 0.5), DreamSkill('Dream Travel', .5), 
    106         # 26th year 
    107         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Intimidate', .5), Skill('Interrogate', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Control Self', .5), 
    108         # 27th year 
    109         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Persuade', .5), Skill('Etiquette', .5), Skill('Sword', 1), DreamSkill('Control Self', 0.5), DreamSkill('Manipulate Environment', .5), 
    110         ]) 
     87    char.addEquipment('Shortsword', 0, 'Free from service as a guard') 
     88    char.addEquipment('Dagger', 2) 
    11189 
    112     # Soldier:Officer - 20 SS 
    113     char.addSkills([ 
    114         # 28th year 
    115         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', 1), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    116         # 29th year 
    117         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', 1), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5), 
    118         # 30th year 
    119         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', 1), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5), 
    120         # 31st year 
    121         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', .5), Skill('Persuade', .5), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5), 
    122         # 32nd year 
    123         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', .5), Skill('Persuade', 1), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5), 
    124         # 33rd year 
    125         Skill('Leadership', 1), Skill('Tactics', .5), Skill('Persuade', 1), Skill('Sword', 1.5), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5), 
    126         # 34th year 
    127         Skill('Leadership', 2), Skill('Tactics', .5), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5), 
    128         # 35th year 
    129         Skill('Leadership', 2), Skill('Tactics', .5), Skill('Sword', 1.5), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
     90    # 19th-21st year -- Becomes a soldier, and sets sights on becoming a seargent. Takes an interest in Tactics, and starts training on Lance to accomplish goals. 
     91    char.addYear('Soldier:Grunt', 5, [Skill('Sword', 1.5), Skill('Lance', 2), Skill('Dagger', .5), HobbySkill('Tactics', .5), HobbySkill('Ride-Animal', .5)]) 
     92    char.addYear('Soldier:Grunt', 5, [Skill('Sword', 1), Skill('Lance', 2), Skill('Shortbow', .5), Skill('Dagger', .5), HobbySkill('Tactics', 0.5), HobbySkill('First-Impression', 0.5)]) 
     93    char.addYear('Soldier:Grunt', 5, [Skill('Sword', 1), Skill('Lance', 2), Skill('Shortbow', 1), HobbySkill('Tactics', 0.5), HobbySkill('First-Impression', 0.5)]) 
    13094 
    131         # 36th - 40th 
    132         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    133         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    134         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    135         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    136         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
     95    # 22nd-27th year -- Becomes a Seargent, and immediately sets out on the path to becoming an officer 
     96    char.addEquipment('Smoking pipe', 0.2) 
     97    char.addEquipment('Tabac', 0.5) 
     98    char.addYear('Soldier:Seargent', 10, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Sword', 1), Skill('Lance', 1.5), HobbySkill('Ride-Animal', .5), DreamSkill('Dream Travel', .5)]) 
     99    char.addYear('Soldier:Seargent', 10, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Sword', 1), Skill('Lance', 1.5), DreamSkill('Control Self', 0.5), DreamSkill('Dream Travel', .5)]) 
     100    char.addYear('Soldier:Seargent', 10, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Sword', 1.5), Skill('Lance', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Dream Travel', .5)]) 
     101    char.addYear('Soldier:Seargent', 10, [Skill('Leadership', 1), Skill('Tactics', 1), Skill('Intimidate', .5), Skill('Interrogate', .5), Skill('Sword', 1), DreamSkill('Control Self', 0.5), DreamSkill('Dream Travel', .5)]) 
     102    char.addYear('Soldier:Seargent', 10, [Skill('Leadership', 1), Skill('Tactics', 1), Skill('Intimidate', .5), Skill('Interrogate', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Control Self', .5)]) 
     103    char.addYear('Soldier:Seargent', 10, [Skill('Leadership', 1), Skill('Tactics', 1), Skill('Persuade', .5), Skill('Etiquette', .5), Skill('Sword', 1), DreamSkill('Control Self', 0.5), DreamSkill('Manipulate Environment', .5)]) 
     104    char.addEquipment('Lance', 0, 'Free from service as a seargent') 
     105    char.addEquipment('Chainmail', 0, 'Free from service as a seargent') 
    137106 
    138         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    139         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    140         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    141         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    142         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    143         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    144         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    145         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    146         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    147         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    148         Skill('Leadership', 1), Skill('Tactics', 1), Skill('Sword', 2), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5), 
    149         ]) 
    150  
    151     # 280 SS total? 
    152  
    153     char.skills['tactics'].naturaltalent = 1 # Accounts for "Natural Tallent" 
    154     #char.skills['sword'].naturaltalent = 1 # Accounts for "Natural Tallent" 
     107    # 28th-35th year -- Becomes an officer 
     108    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', 1), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5)]) 
     109    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', 1), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5)]) 
     110    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', 1), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5)]) 
     111    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', .5), Skill('Persuade', .5), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5)]) 
     112    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Oratory', .5), Skill('Persuade', 1), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5)]) 
     113    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 1), Skill('Tactics', .5), Skill('Persuade', 1), Skill('Sword', 1.5), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5)]) 
     114    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 2), Skill('Tactics', .5), Skill('Etiquette', .5), Skill('Sword', 1), HobbySkill('Ride-Animal', .5), DreamSkill('Enter Dreams', .5)]) 
     115    char.addYear('Soldier:Officer', 20, [Skill('Leadership', 2), Skill('Tactics', .5), Skill('Sword', 1.5), HobbySkill('Ride-Animal', .5), DreamSkill('Manipulate Environment', .5)]) 
     116    char.addEquipment('Longsword', 0, 'Free from service as a officer') 
     117    char.addEquipment('Chainmail', 0, 'Free from service as a officer') 
     118    char.addEquipment('Medium War Horse', 250 - 100, '100 SS credit from service as an officer') 
    155119 
    156120    return char 
     
    162126    char = alLarin() 
    163127 
    164     usedtraits = char.SkillTraitReferenceCounts(weighted=True) 
     128    #pprint(char.attributes) 
     129    #pprint(char.traits) 
     130    #char.printUsedTraits() 
     131    #char.printUnusedTraits() 
     132    char.printSkills() 
     133    pprint(char.equipment) 
    165134 
    166     if not True: 
    167         traitformat = '%-8s %d %3d %-16s %s' 
    168         items = [(Traits.Table[t], t in char.traits, c[0], repr(t), ','.join(c[1:])) for t, c in usedtraits.items() if t not in char.traits] 
    169         items.sort() 
    170         items.reverse() 
    171         print 
    172         print "Traits weighted by use:" 
    173         for each in items: 
    174             print traitformat%each 
    175         print 
    176         print 
    177  
    178     if not True: 
    179         unusedtraits = [] 
    180         for trait in Traits.Table.keys(): 
    181             c = usedtraits.get(trait, [0]) 
    182             item = (Traits.Table[trait], trait in char.traits, c[0], repr(trait), ','.join(c[1:])) 
    183             if c[0] < 10: 
    184                 unusedtraits.append(item) 
    185         unusedtraits.sort() 
    186         unusedtraits.reverse() 
    187         print 
    188         print "Unused traits:" 
    189         for item in unusedtraits: 
    190             print traitformat%item 
    191         print 
    192         print 
    193  
    194     if True: 
    195         print 
    196         pprint(char.attributes) 
    197         print 
    198  
    199     if True: 
    200         print 
    201         pprint(char.traits) 
    202         print 
    203  
    204     if True: 
    205         items = [(s.points, n, s) for n, s in char.skills.items()] 
    206         items.sort() 
    207         items.reverse() 
    208         print 
    209         print "Skills" 
    210         for skill in items: 
    211             print skill[-1], skill[-1].GetEffectiveLevel(char.traits) 
    212         print 
    213         print