import db import dice import items class Weapon(items.Item): def hashitem(self): prefix = '' if self.bonus: prefix += '+' + self.bonus + ' ' elif self.masterwork: prefix += 'masterwork ' return prefix + self.size.name + ' ' + self.name @staticmethod def byid(weaponid): return Weapon.byrow(db.weaponqry(weaponid)) @staticmethod def weaponsubtable(ammunition=False): def generate(w): weapon_id = (dice.tableroll(db.typeqry('ammunition')) if ammunition else w['item'])['weapon_id'] weapon = Weapon.byid(weapon_id) if 'str_bonus' in w['item']: weapon.str_bonus = w['item']['str_bonus'] weapon.masterwork = True if ammunition: weapon.count *= 50 return weapon return generate @staticmethod def typesubtable(type): def generate(count): weapons = db.xtypes(type, count, lambda w: w['id']) gens = {'weapon': False, 'ammunition': True} subweapons = dict((k, Weapon.weaponsubtable(v)) for k, v in gens.iteritems()) weaponslist = ((subweapons[v['item']['type']](v) if 'type' in v['item'] else subweapons['weapon'](v)) for v in weapons.values() for _ in range(v['count'])) return weaponslist return generate @staticmethod def mundane(): def generate(count): rolls = db.xtypes('mundane_weapons', count, lambda w: w['type']) types = {'common melee': 'common_melee_weapons', 'uncommon': 'uncommon_weapons', 'common ranged': 'common_ranged_weapons'} weaponlists = tuple(Weapon.typesubtable(v)(rolls[k]['count']) for k, v in types.iteritems() if k in rolls) weapons = (w for wl in weaponlists for w in wl) return items.Item.mergeitems(weapons) return generate