def use(uid, item_sku_or_id, is_consume=False): s = current_session() if isinstance(item_sku_or_id, int): item = s.query(Item).filter(Item.owner_id == uid, Item.id == item_sku_or_id) else: item = s.query(Item).filter(Item.owner_id == uid, Item.sku == item_sku_or_id) item = item.first() if not item: raise exceptions.ItemNotFound s.add(ItemActivity( uid=uid, action='use', item_id=item.id, created=datetime.datetime.now(), )) if not is_consume: itemobj = GameItem.from_sku(item.sku) if not itemobj.usable: raise exceptions.ItemNotUsable itemobj.use(s, item.owner) item.status = 'used' item.owner_id = None
def should_usable_in_game(self, uid, mgr): g = mgr.game from thb.thbidentity import THBattleIdentity if not isinstance(g, THBattleIdentity): raise exceptions.IncorrectGameMode threshold = { 'attacker': 4, 'boss': 1, 'accomplice': 2, 'curtain': 1, } if mgr.game_params['double_curtain']: threshold['curtain'] += 1 threshold['attacker'] -= 1 threshold[self.id] -= 1 for _uid, l in mgr.game_items.items(): for i in l: i = GameItem.from_sku(i) if not isinstance(i, self.__class__): continue if _uid == uid: raise exceptions.IdentityAlreadyChosen assert i.id in threshold threshold[i.id] -= 1 if any(i < 0 for i in threshold.values()): raise exceptions.ChooseIdentityConflict
def use(uid, item_sku_or_id, is_consume=False): s = current_session() if isinstance(item_sku_or_id, int): item = s.query(Item).filter(Item.owner_id == uid, Item.id == item_sku_or_id) else: item = s.query(Item).filter(Item.owner_id == uid, Item.sku == item_sku_or_id) item = item.first() if not item: raise exceptions.ItemNotFound s.add( ItemActivity( uid=uid, action='use', item_id=item.id, created=datetime.datetime.now(), )) if not is_consume: itemobj = GameItem.from_sku(item.sku) if not itemobj.usable: raise exceptions.ItemNotUsable itemobj.use(s, item.owner) item.status = 'used' item.owner_id = None
def use_item(self, user, sku): try: uid = user.account.userid item.backpack.should_have(uid, sku) i = GameItem.from_sku(sku) i.should_usable_in_game(uid, self) self.game_items[uid].add(sku) user.write(['message_info', 'use_item_success']) except BusinessException as e: log.info('User %s failed to use item %s', user.account.userid, sku, exc_info=sys.exc_info()) user.write(['message_err', e.snake_case])
def get_chosen(cls, items, pl): chosen = [] for p in pl: uid = p.account.userid if uid not in items: continue for i in items[uid]: i = GameItem.from_sku(i) if not isinstance(i, cls): continue chosen.append((p, i.char_cls)) break return chosen
def get_chosen(cls, items, pl): from thb.thbidentity import Identity mapping = { 'boss': Identity.TYPE.BOSS, 'attacker': Identity.TYPE.ATTACKER, 'accomplice': Identity.TYPE.ACCOMPLICE, 'curtain': Identity.TYPE.CURTAIN, } rst = [] for p in pl: uid = p.account.userid if uid not in items: continue for i in items[uid]: i = GameItem.from_sku(i) if not isinstance(i, cls): continue rst.append((p, mapping[i.id])) return rst