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()
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
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, }
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