def __init__(self, name, race, attrs=None): super(D20Character, self).__init__(name, attrs) self.levels = LevelBox() self.race = race self.FEATS = {} self.unarmed = D20Weapon('1d3', ['MELEE', 'UNARMED', 'CORPORIAL'], 'Unarmed', 0, { 'SIZE': 0, 'WEIGHT': 0 }, 'A barroom tradition', {}) self.grapple = D20Weapon('1d8', ['MELEE', 'GRAPPLE', 'CORPORIAL'], 'Grappling', 0, { 'SIZE': 0, 'WEIGHT': 0 }, 'A barroom tradition', {}) self.weapon = None
def __init__( self, name, race, attrs=None ): super( D20Character, self ).__init__( name, attrs ) self.levels = LevelBox( ) self.race = race self.FEATS = { } self.unarmed = D20Weapon( '1d3', [ 'MELEE', 'UNARMED', 'CORPORIAL' ], 'Unarmed', 0, { 'SIZE':0 , 'WEIGHT': 0 }, 'A barroom tradition', { } ) self.grapple = D20Weapon( '1d8', [ 'MELEE', 'GRAPPLE', 'CORPORIAL' ], 'Grappling', 0, { 'SIZE':0, 'WEIGHT': 0 }, 'A barroom tradition', { } ) self.weapon = None
class D20Character( Character ): def __init__( self, name, race, attrs=None ): super( D20Character, self ).__init__( name, attrs ) self.levels = LevelBox( ) self.race = race self.FEATS = { } self.unarmed = D20Weapon( '1d3', [ 'MELEE', 'UNARMED', 'CORPORIAL' ], 'Unarmed', 0, { 'SIZE':0 , 'WEIGHT': 0 }, 'A barroom tradition', { } ) self.grapple = D20Weapon( '1d8', [ 'MELEE', 'GRAPPLE', 'CORPORIAL' ], 'Grappling', 0, { 'SIZE':0, 'WEIGHT': 0 }, 'A barroom tradition', { } ) self.weapon = None def addLevel( self, characterclass ): try: numlevels = int( self.levels[ characterclass.name ] ) except KeyError: numlevels = 0 classlevel = characterclass.getLevel( self, numlevels ) racelevel = self.race.getLevel( self, numlevels, characterclass ) self.levels.addLevel( classlevel ) self.levels.addLevel( racelevel ) classlevel.enable( ) racelevel.enable( ) def beginCombat( self ): self.DEX.mod.addTarget( self.AC, 'ATTRIBUTE', ( ) ) def endCombat( self ): self.DEX.mod.removeTarget( self.AC ) def attack( self, foe, weapon=None ): #This will need fixing. It's just for testing purposes. FIXME if weapon: self.unreadyWeapon( ) self.readyWeapon( weapon ) weapon = self.weapon return D20Attack( None, self, foe ) def readyWeapon( self, weapon ): weapon.ready( self ) self.weapon = weapon def unreadyWeapon( self ): #This will need fixing. It's just for testing purposes. FIXME try: try: self.weapon.unready( self ) except TypeError: pass if self.weapon != self.unarmed: self.readyWeapon( self.unarmed ) else: self.weapon = None except AttributeError: pass #Properties def setAbilityScore( self, tag, name, number, modsprovided=None ): try: self.attrs[ tag ].number = number except: self.attrs[ tag ] = D20AbilityScore( name, number ) def setAttribute( self, tag, name, number ): try: self.attrs[ tag ].number = number except: self.attrs[ tag ] = D20Attribute( name, number ) def setStat( self, tag, name, number ): try: self.attrs[ tag ].number = number except: self.attrs[ tag ] = D20Stat( name, number ) def setSize( self, tag, name, letter, modsprovided=None ): try: self.attrs[ tag ].letter = letter except: self.attrs[ tag ] = D20Size( letter ) def getATT( self ): try: return self.weapon.ATT except AttributeError: return self.BAB ATT = property( fget=getATT, doc="This character's Attack bonus" ) def getLevel( self ): charlevelnum = 1 try: for level in self.levels[ 'RACE' ].values( ): if level.enabled: charlevelnum += 1 except KeyError: pass return charlevelnum level = property( fget=getLevel, doc="This character's level" ) attTypes = { #Basic Attributes 'STR' : ( setAbilityScore, 'Strength', ( ), 0 ), 'DEX' : ( setAbilityScore, 'Dexterity', ( ), 0 ), 'CON' : ( setAbilityScore, 'Constitution', ( ), 0 ), 'INT' : ( setAbilityScore, 'Intelligence', ( ), 0 ), 'WIS' : ( setAbilityScore, 'Wisdom', ( ), 0 ), 'CHA' : ( setAbilityScore, 'Charisma', ( ), 0 ), #END Basic Attributes #Calculated Attributes 'AC' : ( setAttribute, 'Armor Class', ( ( 'SIZE', '-1 SIZE', ( ) ), ), 10 ), 'BAB' : ( setStat, 'Base Attack Bonus', ( ), 0 ), 'WILL' : ( setAttribute, 'Will Save', ( ( 'ABILITY', 'WIS', ( ) ), ), 0 ), 'FORT' : ( setAttribute, 'Fortitude Save', ( ( 'ABILITY', 'CON', ( ) ), ), 0 ), 'REF' : ( setAttribute, 'Reflex Save', ( ( 'ABILITY', 'DEX', ( ) ), ), 0 ), 'INIT' : ( setAttribute, 'Initiative', ( ), 0 ), 'EL' : ( setAttribute, 'Effective Level', ( ), 0 ), 'HP' : ( setAttribute, 'Hit Points', ( ), 0 ), 'WOUNDS' : ( setAttribute, 'Wounds', ( ), 0 ), 'SPEED' : ( setAttribute, 'Movement Speed', ( ), 30 ), 'SIZE' : ( setSize, 'Size Category', ( ), 'M' ) }
class D20Character(Character): def __init__(self, name, race, attrs=None): super(D20Character, self).__init__(name, attrs) self.levels = LevelBox() self.race = race self.FEATS = {} self.unarmed = D20Weapon('1d3', ['MELEE', 'UNARMED', 'CORPORIAL'], 'Unarmed', 0, { 'SIZE': 0, 'WEIGHT': 0 }, 'A barroom tradition', {}) self.grapple = D20Weapon('1d8', ['MELEE', 'GRAPPLE', 'CORPORIAL'], 'Grappling', 0, { 'SIZE': 0, 'WEIGHT': 0 }, 'A barroom tradition', {}) self.weapon = None def addLevel(self, characterclass): try: numlevels = int(self.levels[characterclass.name]) except KeyError: numlevels = 0 classlevel = characterclass.getLevel(self, numlevels) racelevel = self.race.getLevel(self, numlevels, characterclass) self.levels.addLevel(classlevel) self.levels.addLevel(racelevel) classlevel.enable() racelevel.enable() def beginCombat(self): self.DEX.mod.addTarget(self.AC, 'ATTRIBUTE', ()) def endCombat(self): self.DEX.mod.removeTarget(self.AC) def attack(self, foe, weapon=None): #This will need fixing. It's just for testing purposes. FIXME if weapon: self.unreadyWeapon() self.readyWeapon(weapon) weapon = self.weapon return D20Attack(None, self, foe) def readyWeapon(self, weapon): weapon.ready(self) self.weapon = weapon def unreadyWeapon(self): #This will need fixing. It's just for testing purposes. FIXME try: try: self.weapon.unready(self) except TypeError: pass if self.weapon != self.unarmed: self.readyWeapon(self.unarmed) else: self.weapon = None except AttributeError: pass #Properties def setAbilityScore(self, tag, name, number, modsprovided=None): try: self.attrs[tag].number = number except: self.attrs[tag] = D20AbilityScore(name, number) def setAttribute(self, tag, name, number): try: self.attrs[tag].number = number except: self.attrs[tag] = D20Attribute(name, number) def setStat(self, tag, name, number): try: self.attrs[tag].number = number except: self.attrs[tag] = D20Stat(name, number) def setSize(self, tag, name, letter, modsprovided=None): try: self.attrs[tag].letter = letter except: self.attrs[tag] = D20Size(letter) def getATT(self): try: return self.weapon.ATT except AttributeError: return self.BAB ATT = property(fget=getATT, doc="This character's Attack bonus") def getLevel(self): charlevelnum = 1 try: for level in self.levels['RACE'].values(): if level.enabled: charlevelnum += 1 except KeyError: pass return charlevelnum level = property(fget=getLevel, doc="This character's level") attTypes = { #Basic Attributes 'STR': (setAbilityScore, 'Strength', (), 0), 'DEX': (setAbilityScore, 'Dexterity', (), 0), 'CON': (setAbilityScore, 'Constitution', (), 0), 'INT': (setAbilityScore, 'Intelligence', (), 0), 'WIS': (setAbilityScore, 'Wisdom', (), 0), 'CHA': (setAbilityScore, 'Charisma', (), 0), #END Basic Attributes #Calculated Attributes 'AC': (setAttribute, 'Armor Class', (('SIZE', '-1 SIZE', ()), ), 10), 'BAB': (setStat, 'Base Attack Bonus', (), 0), 'WILL': (setAttribute, 'Will Save', (('ABILITY', 'WIS', ()), ), 0), 'FORT': (setAttribute, 'Fortitude Save', (('ABILITY', 'CON', ()), ), 0), 'REF': (setAttribute, 'Reflex Save', (('ABILITY', 'DEX', ()), ), 0), 'INIT': (setAttribute, 'Initiative', (), 0), 'EL': (setAttribute, 'Effective Level', (), 0), 'HP': (setAttribute, 'Hit Points', (), 0), 'WOUNDS': (setAttribute, 'Wounds', (), 0), 'SPEED': (setAttribute, 'Movement Speed', (), 30), 'SIZE': (setSize, 'Size Category', (), 'M') }