Example #1
0
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
Example #2
0
    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
Example #3
0
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
Example #4
0
    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
Example #5
0
 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])
Example #6
0
 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])
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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
Example #10
0
    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