Beispiel #1
0
 def setUp(self):
     # DMMID.
     self.__player = self.makePlayer(1000)
     self.__o_player = self.makePlayer(10)
     self.__o_player.getModel(PlayerGold).save()
     
     # 報酬.
     prize = self.create_dummy(DummyType.PRIZE_MASTER, gold=100)
     
     # ランク.
     prizes = [{'prizes':[prize.id], 'rate':10}]
     self.__rankmaster = self.create_dummy(DummyType.BATTLE_RANK_MASTER, win=10, times=10, winprizes=prizes)
     # 最大ランクを作っておく.
     self.create_dummy(DummyType.BATTLE_RANK_MASTER, win=10, times=10, winprizes=prizes)
     
     # 対戦相手設定.
     self.__battleplayer = self.create_dummy(DummyType.BATTLE_PLAYER, self.__player.id, self.__rankmaster.id, oid=self.__o_player.id, win=0, times=self.__rankmaster.times - 1)
     
     model_mgr = ModelRequestMgr()
     v_deck = BackendApi.get_deck(self.__player.id, model_mgr)
     o_deck = BackendApi.get_deck(self.__o_player.id, model_mgr)
     v_deck_cardlist = BackendApi.get_cards(v_deck.to_array(), model_mgr)
     o_deck_cardlist = BackendApi.get_cards(o_deck.to_array(), model_mgr)
     data = BackendApi.battle(self.__player, v_deck_cardlist, self.__o_player, o_deck_cardlist, AppRandom())
     BackendApi.tr_battle(model_mgr, self.__player, self.__o_player, v_deck.to_array(), o_deck.to_array(), data, self.__battleplayer.result)
     model_mgr.write_all()
     model_mgr.write_end()
    def battle(self, player, o_player):

        BattleEventOppList.create(player.id, [o_player.id]).save()

        model_mgr = ModelRequestMgr()
        v_deck = BackendApi.get_deck(player.id, model_mgr)
        o_deck = BackendApi.get_deck(o_player.id, model_mgr)
        v_deck_cardlist = BackendApi.get_cards(v_deck.to_array(), model_mgr)
        o_deck_cardlist = BackendApi.get_cards(o_deck.to_array(), model_mgr)
        data = BackendApi.battle(player,
                                 v_deck_cardlist, o_player, o_deck_cardlist,
                                 AppRandom(), self.__eventmaster)
        BackendApi.tr_battleevent_battle(model_mgr,
                                         self.__eventmaster,
                                         self.__eventrankmaster,
                                         self.__eventrankmaster,
                                         player,
                                         o_player,
                                         v_deck.to_array(),
                                         o_deck.to_array(),
                                         data,
                                         1,
                                         None,
                                         False,
                                         player.req_confirmkey,
                                         now=OSAUtil.get_now())
        model_mgr.write_all()
        model_mgr.write_end()

        self.__player0.setModel(
            BackendApi.get_model(model_mgr, PlayerRequest, self.__player0.id))
    def setUp2(self):
        model_mgr = ModelRequestMgr()

        # Player.
        self.__player0 = self.makePlayer(1000)

        # イベントマスター.
        eventmaster = self.setUpEvent(model_mgr=model_mgr)
        self.__eventmaster = eventmaster

        # ランクのマスター.
        prize = self.create_dummy(DummyType.PRIZE_MASTER, gold=1000)
        params = {
            'winprizes': [{
                'prizes': [prize.id],
                'rate': 100,
            }],
            'battlepoint_w': 100,
            'battlepoint_lv': 10,
        }
        eventrankmaster = self.createRankMaster(params=params)
        self.__eventrankmaster = eventrankmaster

        # オープニングを閲覧済みに.
        self.setOpeningViewTime(self.__player0.id)

        # 参加させておく.
        self.joinRank(self.__player0.id)

        # 参加させておく.
        self.setLoginBonusReceived(self.__player0.id)

        # 対戦相手を設定.
        player = self.makePlayer(10)
        self.joinRank(player.id)
        BattleEventOppList.create(self.__player0.id, [player.id]).save()
        self.__player1 = player

        # 対戦書き込み.
        model_mgr = ModelRequestMgr()
        v_deck = BackendApi.get_deck(self.__player0.id, model_mgr)
        o_deck = BackendApi.get_deck(self.__player1.id, model_mgr)
        v_deck_cardlist = BackendApi.get_cards(v_deck.to_array(), model_mgr)
        o_deck_cardlist = BackendApi.get_cards(o_deck.to_array(), model_mgr)
        data = BackendApi.battle(self.__player0, v_deck_cardlist,
                                 self.__player1, o_deck_cardlist, AppRandom(),
                                 self.__eventmaster)
        BackendApi.tr_battleevent_battle(model_mgr,
                                         eventmaster,
                                         eventrankmaster,
                                         eventrankmaster,
                                         self.__player0,
                                         self.__player1,
                                         v_deck.to_array(),
                                         o_deck.to_array(),
                                         data,
                                         1,
                                         None,
                                         False,
                                         self.__player0.req_confirmkey,
                                         now=OSAUtil.get_now())
        model_mgr.write_all()
        model_mgr.write_end()
Beispiel #4
0
    def process(self):
        
        eventmaster = self.getCurrentBattleEvent()
        if not self.checkBattleEventUser():
            return
        
        args = self.getUrlArgs('/battleeventbattledo/')
        confirmkey = urllib.unquote(args.get(0) or '')
        oid = args.getInt(1)

        rival_index = BackendApi._check_is_rival_strings(oid, eventmaster.id, args)
        rival_key = BackendApi.get_rival_key(oid, eventmaster.id, args)

        if rival_key and rival_index == 3:
            revengeid = args.getInt(2)
        elif not rival_key:
            revengeid = args.getInt(2)
        else:
            revengeid = None

        rival_key = BackendApi.get_rival_key(oid, eventmaster.id, args)

        now = OSAUtil.get_now()
        v_player = self.getViewerPlayer()
        uid = v_player.id
        
        o_player = None
        if oid:
            o_player = BackendApi.get_player(self, oid, [PlayerFriend, PlayerExp], using=settings.DB_READONLY)
        
        if not o_player:
            url = UrlMaker.battleevent_opplist()
            self.appRedirect(self.makeAppLinkUrlRedirect(url))
            return
        elif not self.checkOpponentId(oid, revengeid, args=args):
            # 対戦できない相手.
            return
        
        model_mgr = self.getModelMgr()
        #piecedata = None
        if v_player.req_confirmkey == confirmkey:
            self.addloginfo(u'req_confirmkey==confirmkey')
            
            # 正しいリクエスト.
            
            # お互いのカード.
            v_deck = BackendApi.get_deck(v_player.id, model_mgr, using=settings.DB_READONLY)
            o_deck = BackendApi.get_deck(o_player.id, model_mgr, using=settings.DB_READONLY)
            v_deck_cardlist = BackendApi.get_cards(v_deck.to_array(), model_mgr, using=settings.DB_READONLY)
            o_deck_cardlist = BackendApi.get_cards(o_deck.to_array(), model_mgr, using=settings.DB_READONLY)
            self.addloginfo(u'get deck')
            
            # 現在の称号.
            titlemaster = BackendApi.get_current_title_master(model_mgr, v_player.id, now, using=settings.DB_READONLY)
            battleevent_power_up = titlemaster.battleevent_power_up if titlemaster else 0
            
            # 計算.
            rand = AppRandom()
            data = BackendApi.battle(v_player, v_deck_cardlist, o_player, o_deck_cardlist, rand, eventmaster=eventmaster, title_effect=battleevent_power_up)
            self.addloginfo(u'battle')

            v_deck_cardidlist = v_deck.to_array()
            o_deck_cardidlist = o_deck.to_array()
            
            eventrankmaster = self.getCurrentBattleRankMaster()
            v_rankrecord = self.getCurrentBattleRankRecord()
            
            o_rankrecord = BackendApi.get_battleevent_rankrecord(model_mgr, eventmaster.id, oid, using=settings.DB_READONLY)
            o_eventrankmaster = None
            if o_rankrecord:
                config = BackendApi.get_current_battleeventconfig(model_mgr, using=settings.DB_READONLY)
                o_eventrankmaster = BackendApi.get_battleevent_rankmaster(model_mgr, eventmaster.id, o_rankrecord.getRank(config), using=settings.DB_READONLY)
            self.addloginfo(u'get rankrecord')
            
            # グループ内順位.
            group = self.getCurrentBattleGroup()
            grouprankdata = BackendApi.make_battleevent_grouprankingdata(self, group, v_rankrecord.uid, now, using=settings.DB_READONLY, do_get_name=False)
            grouprank = grouprankdata['rank'] if grouprankdata else -1
            is_worst = grouprankdata['worst'] if grouprankdata else False
            self.addloginfo(u'make rankdata')

#             piecedata = self.present_piece(model_mgr, uid, eventmaster.id, data[0]['is_win'], rival_key)
            try:
                model_mgr = db_util.run_in_transaction(self.tr_write, eventmaster, eventrankmaster, o_eventrankmaster, uid, oid, v_deck_cardidlist, o_deck_cardidlist, data, grouprank, is_worst, revengeid, confirmkey, now, rival_key)
                self.addloginfo(u'write')
                model_mgr.write_end()
                self.addloginfo(u'write end')
            except CabaretError, err:
                if err.code == CabaretError.Code.ALREADY_RECEIVED:
                    pass
                elif settings_sub.IS_LOCAL:
                    raise err
                else:
                    url = self.makeAppLinkUrlRedirect(UrlMaker.battleevent_opplist())
                    self.appRedirect(url)
                    return
Beispiel #5
0
    def battle(self):
        """対戦する.
        """
        continuity = 0
        if self.__continuity and self.__continuity.isdigit():
            continuity = int(self.__continuity)
        continuity = min(1000, max(1, continuity))

        v_carddict = dict([(cardset.id, cardset) for cardset in self.__v_deck])
        o_carddict = dict([(cardset.id, cardset) for cardset in self.__o_deck])

        def skillinfoToText(skillinfo):
            if skillinfo.playerFlag:
                cardset = v_carddict[skillinfo.skillUseCardId]
            else:
                cardset = o_carddict[skillinfo.skillUseCardId]
            return u'{skillname} Lv{skilllevel}'.format(
                skillname=skillinfo.skillName,
                skilllevel=cardset.card.skilllevel)

        # カードごとにどれだけスキルを発動していて発動した時のどれだけ勝っているか.
        v_cardSkillCounts = {}
        o_cardSkillCounts = {}

        def addSkillCount(skillinfo, is_win):
            if skillinfo.playerFlag:
                cardSkillCounts = v_cardSkillCounts
            else:
                cardSkillCounts = o_cardSkillCounts
                is_win = not is_win
            cardid = skillinfo.skillUseCardId
            data = cardSkillCounts[cardid] = cardSkillCounts.get(
                cardid, {
                    'win': 0,
                    'count': 0
                })
            data['count'] += 1
            if is_win:
                data['win'] += 1

        win = 0
        feverWin = 0
        feverCnt = 0
        results = []
        for i in xrange(continuity):
            resultdata, animdata = BackendApi.battle(None, self.__v_deck,
                                                     None, self.__o_deck,
                                                     AppRandom())

            is_win = resultdata['is_win']

            pSkill = []
            eSkill = []
            for skillinfolist, skilltextlist in ((animdata.pSkill, pSkill),
                                                 (animdata.eSkill, eSkill)):
                for skillinfo in skillinfolist:
                    skilltextlist.append(skillinfoToText(skillinfo))
                    addSkillCount(skillinfo, is_win)

            if i < 100:
                resultdata.update({
                    'fever': animdata.feverFlag,
                    'pSale': animdata.pSale,
                    'eSale': animdata.eSale,
                    'pSkill': pSkill,
                    'eSkill': eSkill,
                })
                results.append(resultdata)

            if is_win:
                win += 1
            if animdata.feverFlag:
                if is_win:
                    feverWin += 1
                feverCnt += 1

        self.html_param['battleresult'] = {
            'win': win,
            'feverCnt': feverCnt,
            'feverWin': feverWin,
            'continuity': continuity,
            'resultlist': results,
            'v_cardSkillCounts': v_cardSkillCounts,
            'o_cardSkillCounts': o_cardSkillCounts,
        }
Beispiel #6
0
    def process(self):

        try:
            args = self.getUrlArgs('/battledo/')
            battleid = int(args.get(0, 0))
        except:
            if settings_sub.IS_LOCAL:
                raise CabaretError(u'引数が正しくありません',
                                   CabaretError.Code.ILLEGAL_ARGS)
            url = UrlMaker.battle()
            self.appRedirect(self.makeAppLinkUrlRedirect(url))
            return

        # バトル情報.
        battleplayer = self.getBattlePlayer(using=settings.DB_DEFAULT)
        if battleplayer is None:
            if settings_sub.IS_LOCAL:
                raise CabaretError(u'対戦相手が見つかりませんでした',
                                   CabaretError.Code.NOT_DATA)
            self.redirectToOppSelect()
            return
        elif battleplayer.result and battleid != battleplayer.result:
            url = self.makeAppLinkUrlRedirect(UrlMaker.battleanim())
            self.appRedirect(url)
            return

        model_mgr = self.getModelMgr()
        v_player = self.getViewerPlayer()

        # 対戦相手.
        oid = battleplayer.opponent
        o_player = None
        if oid and v_player.id != oid:
            arr = BackendApi.get_players(self, [oid], [PlayerExp],
                                         using=settings.DB_READONLY)
            if arr:
                o_player = arr[0]
        if o_player is None:
            if settings_sub.IS_LOCAL:
                raise CabaretError(u'対戦相手が見つかりませんでした',
                                   CabaretError.Code.NOT_DATA)
            self.redirectToOppSelect()
            return

        if battleid == battleplayer.result:
            # お互いのカード.
            v_deck = BackendApi.get_deck(v_player.id,
                                         model_mgr,
                                         using=settings.DB_READONLY)
            o_deck = BackendApi.get_deck(o_player.id,
                                         model_mgr,
                                         using=settings.DB_READONLY)
            v_deck_cardlist = BackendApi.get_cards(v_deck.to_array(),
                                                   model_mgr,
                                                   using=settings.DB_READONLY)
            o_deck_cardlist = BackendApi.get_cards(o_deck.to_array(),
                                                   model_mgr,
                                                   using=settings.DB_READONLY)

            # 計算.
            rand = AppRandom()
            data = BackendApi.battle(v_player, v_deck_cardlist, o_player,
                                     o_deck_cardlist, rand)

            v_deck_cardidlist = v_deck.to_array()
            o_deck_cardidlist = o_deck.to_array()
            try:
                model_mgr, _ = db_util.run_in_transaction(
                    self.tr_write, v_player.id, oid, v_deck_cardidlist,
                    o_deck_cardidlist, data, battleid)
                model_mgr.write_end()
            except CabaretError, err:
                if err.code == CabaretError.Code.ALREADY_RECEIVED:
                    pass
                elif settings_sub.IS_LOCAL:
                    raise err
                else:
                    url = self.makeAppLinkUrlRedirect(UrlMaker.battlepre())
                    self.appRedirect(url)
                    return