def toHit(self, creatureAttack): item = creatureAttack.attack weaponFocus = 1 if (self.base.Feats.filter(name='Weapon Focus (%s)'%item.name).count() \ or (item.baseName and self.base.Feats.filter(name='Weapon Focus (%s)'%item.baseName).count())) else 0 if item.name == 'Rock' and self.base.Special.filter( name__startswith='Rock Throwing (Ex)').count(): weaponFocus += 1 weaponFocus += item.bonusToHit if item.attackType == pfss.models.MELEE: if (not creatureAttack.makePrimary and (item.attackClass == pfss.models.SECONDARY or creatureAttack.makeSecondary) and (self.melee.count() > 1 or (self.melee.count() == 1 and self.melee.get().count > 1))): if self.base.Feats.filter(name='Multiattack').count(): return formatNumber(self.meleeBonus - 2 + weaponFocus) else: return formatNumber(self.meleeBonus - 5 + weaponFocus) else: returnText = "%s" % formatNumber(self.meleeBonus + weaponFocus) if creatureAttack.noIterative == False and item.attackClass in ( pfss.models.LIGHT, pfss.models.ONE_HANDED, pfss.models.TWO_HANDED): iterative = self.BAB - 5 while iterative > 0: returnText = "%s/+%s" % (returnText, (self.meleeBonus + weaponFocus + (iterative - self.BAB))) iterative -= 5 if creatureAttack.extraAttackAtFullBAB: returnText = "+%s/%s" % (self.meleeBonus + weaponFocus, returnText) return returnText elif item.attackType == pfss.models.RANGED: if creatureAttack.extraAttackAtFullBAB and self.base.Feats.filter( name='Rapid Shot').count(): rapidShot = -2 else: rapidShot = 0 returnText = "%s" % formatNumber(self.rangedBonus + weaponFocus + rapidShot) if creatureAttack.noIterative == False: iterative = self.BAB - 5 while iterative > 0: returnText = "%s/+%s" % (returnText, (self.rangedBonus + weaponFocus + rapidShot + (iterative - self.BAB))) iterative -= 5 if creatureAttack.extraAttackAtFullBAB: returnText = "+%s/%s" % (self.rangedBonus + weaponFocus + rapidShot, returnText) return returnText else: return 'Not yet implemented'
def firstMeleeAttackDmg(self, AsSole=False, baseOnly=False): try: item = self.melee[0] if baseOnly: return u'%s' % item.attack.dmg extraDmg = self.meleeDmgBonus(item, AsSole) return u'%s%s' % (item.attack.dmg , formatNumber(extraDmg, noZero=True)) except IndexError: return '?x? +?'
def firstMeleeAttackDmg(self, AsSole=False, baseOnly=False): try: item = self.melee[0] if baseOnly: return u'%s' % item.attack.dmg extraDmg = self.meleeDmgBonus(item, AsSole) return u'%s%s' % (item.attack.dmg, formatNumber(extraDmg, noZero=True)) except IndexError: return '?x? +?'
def toHit(self,creatureAttack): item = creatureAttack.attack weaponFocus = 1 if (self.base.Feats.filter(name='Weapon Focus (%s)'%item.name).count() \ or (item.baseName and self.base.Feats.filter(name='Weapon Focus (%s)'%item.baseName).count())) else 0 if item.name == 'Rock' and self.base.Special.filter(name__startswith='Rock Throwing (Ex)').count(): weaponFocus += 1 weaponFocus += item.bonusToHit if item.attackType == pfss.models.MELEE: if (not creatureAttack.makePrimary and (item.attackClass == pfss.models.SECONDARY or creatureAttack.makeSecondary) and (self.melee.count() > 1 or (self.melee.count()==1 and self.melee.get().count>1))): if self.base.Feats.filter(name='Multiattack').count(): return formatNumber(self.meleeBonus-2+weaponFocus) else: return formatNumber(self.meleeBonus-5+weaponFocus) else: returnText = "%s" % formatNumber(self.meleeBonus+weaponFocus) if creatureAttack.noIterative == False and item.attackClass in (pfss.models.LIGHT, pfss.models.ONE_HANDED, pfss.models.TWO_HANDED): iterative = self.BAB - 5 while iterative > 0: returnText= "%s/+%s" % (returnText, (self.meleeBonus+weaponFocus+(iterative-self.BAB))) iterative -= 5 if creatureAttack.extraAttackAtFullBAB: returnText = "+%s/%s" % (self.meleeBonus+weaponFocus,returnText) return returnText elif item.attackType == pfss.models.RANGED: if creatureAttack.extraAttackAtFullBAB and self.base.Feats.filter(name='Rapid Shot').count(): rapidShot = -2 else: rapidShot = 0 returnText = "%s" % formatNumber(self.rangedBonus+weaponFocus+rapidShot) if creatureAttack.noIterative == False: iterative = self.BAB - 5 while iterative > 0: returnText= "%s/+%s" % (returnText, (self.rangedBonus+weaponFocus+rapidShot+(iterative-self.BAB))) iterative -= 5 if creatureAttack.extraAttackAtFullBAB: returnText = "+%s/%s" % (self.rangedBonus+weaponFocus+rapidShot,returnText) return returnText else: return 'Not yet implemented'
def renderAttack(self, existingText, first, item, extraDmg, exclusive=False): attack = item.attack output = "%s%s%s%s %s%s (%s%s%s%s)" % ( existingText, ", " if (not first and item.exclusive == exclusive) else " or " if (not first and item.exclusive != exclusive) else "", "%s x " % item.count if item.count > 1 else "", attack.name, self.toHit(item), ' touch' if item.touchAttack else '', attack.dmg if item.attack.dCount else '', formatNumber(extraDmg, noZero=True) if item.attack.dCount else '', "/%s" % attack.crit if attack.crit else '', "%s" % ("%s%s" % (' ' if item.attack.dCount else '', item.extraText)) if item.extraText else '') return output
def ACcomponents(self): if self.base.armourAC or self.DexMod or self.base.naturalAC or self.base.deflectAC or self.base.shieldAC or self.dodgeAC or self.base.Size.ACbonus or self.base.extraACText: return "(%s%s%s%s%s%s%s%s)" % ( \ ("%s armor " % formatNumber(self.base.armourAC)) if self.base.armourAC else "", \ ("%s deflection " % formatNumber(self.base.deflectAC)) if self.base.deflectAC else "", \ ("%s Dex " % formatNumber(self.DexMod)) if self.DexMod else "", \ ("+1 dodge " if self.dodgeAC else ""), \ ("%s natural " % formatNumber(self.base.naturalAC)) if self.base.naturalAC else "", \ ("%s shield " % formatNumber(self.base.shieldAC)) if self.base.shieldAC else "", \ ("%s size " % formatNumber(self.base.Size.ACbonus)) if self.base.Size.ACbonus else "", \ self.base.extraACText if self.base.extraACText else '' ) else: return ''
def renderAttack(self, existingText, first, item, extraDmg, exclusive=False): attack = item.attack output = "%s%s%s%s %s%s (%s%s%s%s)" % (existingText,", " if (not first and item.exclusive==exclusive) else " or " if (not first and item.exclusive != exclusive) else "", "%s x " % item.count if item.count > 1 else "", attack.name, self.toHit(item), ' touch' if item.touchAttack else '', attack.dmg if item.attack.dCount else '', formatNumber(extraDmg, noZero=True) if item.attack.dCount else '', "/%s" % attack.crit if attack.crit else '', "%s" % ("%s%s" %(' ' if item.attack.dCount else '', item.extraText)) if item.extraText else '') return output
def CMB(self): return formatNumber(self.CMBValue)
def Ref(self): return formatNumber(self.DexMod+self.base.baseRefSave+self.MiscMod + (self.WisMod if self.base.Special.filter(name='Prescience (Su)').count() else 0))
def initiativeText(self): return formatNumber(self.initiative)
def Will(self): return formatNumber(self.WisMod + self.base.baseWillSave + self.MiscMod)
def HPcomponents(self): return "(%s%s%s)" % (self.HD, self.base.HDtype, formatNumber( (self.ConMod * self.HD) + self.toughness, noZero=True))
def Ref(self): return formatNumber(self.DexMod + self.base.baseRefSave + self.MiscMod + (self.WisMod if self.base.Special.filter( name='Prescience (Su)').count() else 0))
def HPcomponents(self): return "(%s%s%s)" % (self.HD,self.base.HDtype, formatNumber((self.ConMod*self.HD)+self.toughness, noZero=True))
def Fort(self): return formatNumber(self.ConMod + self.base.baseFortSave + self.MiscMod)
def Will(self): return formatNumber(self.WisMod+self.base.baseWillSave+self.MiscMod)
def BABtext(self): return formatNumber(self.BAB)
def Fort(self): return formatNumber(self.ConMod+self.base.baseFortSave+self.MiscMod)