def process(self): eventmaster = self.getCurrentBattleEvent() if not self.checkBattleEventUser(): return args = self.getUrlArgs('/battleeventopplist/') target = args.get(0) table = { 'revenge': self.procRevenge, } func = table.get(target, None) if func is None: func = self.procLevel target = 'lv' func(eventmaster, args) if self.response.isEnd: return v_player = self.getViewerPlayer() # バトルイベント. self.html_param['battleevent'] = Objects.battleevent(self, eventmaster) # 選択中の項目. self.html_param['cur_topic'] = target # 連勝数の表示. model_mgr = self.getModelMgr() user_cvictory_count = BackendApi.get_battleevent_continue_victory( model_mgr, v_player.id, eventmaster.id, using=settings.DB_READONLY).count self.put_user_continue_victory_data(user_cvictory_count) # リンク. self.html_param['url_battleevent_opplist_lv'] = self.makeAppLinkUrl( UrlMaker.battleevent_opplist('lv')) self.html_param[ 'url_battleevent_opplist_revenge'] = self.makeAppLinkUrl( UrlMaker.battleevent_opplist('revenge')) self.html_param[ 'url_battleevent_opplist_update'] = self.makeAppLinkUrl( UrlMaker.battleevent_opplist(target, True)) if eventmaster.is_goukon: self.writeAppHtml('gcevent/battletop') else: self.writeAppHtml('btevent/battletop')
def checkOpponentId(self, oid, revengeid=None, do_redirect=True, args=None): """対戦出来る相手なのかチェック. """ model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() uid = v_player.id eventid = self.getCurrentBattleEvent().id oidlist = None if revengeid: revenge = BackendApi.get_battleevent_revenge(model_mgr, revengeid, using=settings.DB_READONLY) if revenge and uid == revenge.uid: oidlist = [revenge.oid] else: eventmaster = self.getCurrentBattleEvent() oidlist = BackendApi.get_battleevent_opponentidlist(model_mgr, eventmaster.id, uid, using=settings.DB_READONLY) if BackendApi._check_is_rival_strings(oid, eventid, args): if oid in oidlist: oidlist.remove(oid) oidlist.insert(0, oid) elif oid: oidlist[0] = oid oidlist = BackendApi.filter_battleevent_opplist_by_battletime(model_mgr, uid, oidlist, using=settings.DB_READONLY) if oidlist and oid in oidlist: return True else: if do_redirect: target = 'revenge' if revengeid else 'lv' url = UrlMaker.battleevent_opplist(target) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False
def procLevel(self, eventmaster, args): """近いレベル. """ model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() uid = v_player.id eventid = eventmaster.id do_update = args.get(1) == '1' if do_update: # 更新. rankrecord = BackendApi.get_battleevent_rankrecord( model_mgr, eventid, uid, using=settings.DB_READONLY) BackendApi.update_battleevent_opponent(model_mgr, rankrecord, v_player.level, using=settings.DB_READONLY) url = UrlMaker.battleevent_opplist('lv') self.appRedirect(self.makeAppLinkUrlRedirect(url)) return uidlist = BackendApi.get_battleevent_opponentidlist( model_mgr, eventid, uid, using=settings.DB_READONLY) func = self.putPlayerList(eventid, uidlist) self.execute_api() if func: func()
def __makeBackLinkUrlBattleEvent(self, args): if args and 0 < len(args) and str(args[0]).isdigit(): revengeid = None if 1 < len(args) and str(args[1]).isdigit(): revengeid = args[1] rival_key = None if 2 < len(args): rival_key = args[2] url = UrlMaker.battleevent_battlepre(args[0], revengeid, rival_key=rival_key) else: url = UrlMaker.battleevent_opplist() return { 'url': self.makeAppLinkUrl(url, add_frompage=False), 'text': u'イベントへ戻る' }
def process(self): model_mgr = self.getModelMgr() args = self.getUrlArgs('/battleeventbattleresult/') eventid = args.getInt(0) eventmaster = None if eventid: eventmaster = BackendApi.get_battleevent_master( model_mgr, eventid, using=settings.DB_READONLY) if eventmaster is None: if settings_sub.IS_LOCAL: raise CabaretError(u'引数がおかしい') self.redirectToTop() return v_player = self.getViewerPlayer() uid = v_player.id # 結果データ. battleresult = BackendApi.get_battleevent_battleresult( model_mgr, eventid, uid, using=settings.DB_READONLY) if battleresult is None: # 結果が存在しない. if settings_sub.IS_LOCAL: raise CabaretError(u'結果がない') url = UrlMaker.battleevent_top(eventid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return self.setFromPage(Defines.FromPages.BATTLEEVENTPRE) data = battleresult.data # 対戦相手. oid = battleresult.oid arr = BackendApi.get_players(self, [oid], [PlayerExp], using=settings.DB_READONLY) o_player = arr[0] if arr else None if o_player is None: # 相手が存在しない. if settings_sub.IS_LOCAL: raise CabaretError(u'相手が存在しない') url = UrlMaker.battleevent_top(eventid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return obj_v_player, obj_o_player = self.getObjPlayerList( [v_player, o_player]) rival_key = BackendApi.get_rival_key(oid, eventid, args) self.html_param['resultdata'] = data obj_v_player['power_total'] = data['v_power'] obj_o_player['power_total'] = data['o_power'] obj_v_player['sp_powup'] = (data.get('v_sp_powup') or 0) * data['fever_powerup_rate'] / 100 obj_o_player['sp_powup'] = data.get('o_sp_powup') or 0 obj_v_player['spt_powup'] = (data.get('v_spt_powup') or 0) * data['fever_powerup_rate'] / 100 obj_o_player['spt_powup'] = data.get('o_spt_powup') or 0 obj_v_player['skilllist'] = battleresult.anim.make_html_skilllist(True) obj_o_player['skilllist'] = battleresult.anim.make_html_skilllist( False) self.html_param['player'] = obj_v_player self.html_param['o_player'] = obj_o_player if BackendApi.check_friend(uid, oid, arg_model_mgr=model_mgr, using=settings.DB_READONLY): pass elif BackendApi.check_friendrequest_receive( uid, oid, arg_model_mgr=model_mgr, using=settings.DB_READONLY): pass elif BackendApi.check_friendrequest_send(uid, oid, arg_model_mgr=model_mgr, using=settings.DB_READONLY): pass else: self.html_param['is_friendrequest_ok'] = True # 獲得したアイテム. prizes = data.get('prizes') if prizes: prizelist = BackendApi.get_prizelist(model_mgr, prizes, using=settings.DB_READONLY) self.html_param['prize'] = BackendApi.make_prizeinfo( self, prizelist, using=settings.DB_READONLY) battle_ticket_num = self.get_base_battle_ticket_num(data) self.html_param['battle_ticket_num'] = battle_ticket_num self.html_param[ 'battle_ticket_bonus'] = self.get_player_battle_ticket_bonus( model_mgr, uid, battle_ticket_num, eventmaster) # レベルアップしたカード. obj_lebelupcardlist = [] levelupcardlist = BackendApi.get_cards(battleresult.levelupcard.keys(), model_mgr, using=settings.DB_READONLY) for levelupcard in levelupcardlist: obj_card = Objects.card(self, levelupcard) obj_card['level_add'] = battleresult.levelupcard.get( levelupcard.id, 0) obj_lebelupcardlist.append(obj_card) self.html_param['levelupcardlist'] = obj_lebelupcardlist # 回復アイテム. BackendApi.put_bprecover_uselead_info(self) # 獲得したポイント. scorerecord = BackendApi.get_battleevent_scorerecord( model_mgr, eventid, uid, using=settings.DB_READONLY) self.html_param['battleevent_score'] = self.makeScoreRecordObj( scorerecord, battleresult) # 特効キャスト分のポイント. effect_percent = data.get('effp', 0) if 0 < effect_percent: point_add = data['eventpoint'] point_base = int(point_add * 100 / (effect_percent + 100)) self.html_param['effect_point'] = point_add - point_base # 現在の贈り物情報を確認. presentdata = BackendApi.get_battleeventpresent_pointdata( model_mgr, uid, eventid, using=settings.DB_READONLY) if presentdata: cur_data = presentdata.getData() presentmaster = BackendApi.get_battleeventpresent_master( model_mgr, eventid, cur_data['number'], using=settings.DB_READONLY) self.html_param[ 'is_present_open'] = presentmaster.point <= presentdata.point else: self.html_param['is_present_open'] = False # トピック. self.putEventTopic(eventid) # 続けて競う. target = 'revenge' if data.get('revenge') else 'lv' self.html_param['url_battlecontinue'] = self.makeAppLinkUrl( UrlMaker.battleevent_opplist(target, do_update=True)) # グループ詳細. self.html_param['url_battleevent_group'] = self.makeAppLinkUrl( UrlMaker.battleevent_group()) self.html_param["battleevent"] = Objects.battleevent( self, eventmaster) if data['is_win']: piecedata = battleresult.data.get('piecedata') if piecedata: if piecedata.get('is_item'): # キャスト名. _, cardmaster = self.get_dirname_and_castname( eventid, piecedata['rarity']) # アイテム獲得. prizelist = BackendApi.get_prizelist( model_mgr, piecedata.get('item_prizeids') or [], using=settings.DB_READONLY) self.html_param['piece_dropiteminfo'] = dict( cardmaster=Objects.cardmaster(self, cardmaster), prize=BackendApi.make_prizeinfo( self, prizelist, using=settings.DB_READONLY)) else: self.put_drop_castname(model_mgr, eventid, piecedata['rarity'], piecedata['piece']) self.writeAppHtml( '%s/battlewin' % ('gcevent' if eventmaster.is_goukon else 'btevent')) else: self.writeAppHtml( '%s/battlelose' % ('gcevent' if eventmaster.is_goukon else 'btevent'))
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 process(self): eventmaster = self.getCurrentBattleEvent() if not self.checkBattleEventUser(): return args = self.getUrlArgs('/battleeventbattlepre/') oid = args.getInt(0) 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 == 2: revengeid = args.getInt(1) elif not rival_key: revengeid = args.getInt(1) else: revengeid = None v_player = self.getViewerPlayer() uid = v_player.id obj_v_player = None obj_o_player = None if oid: o_player = BackendApi.get_player(self, oid, [PlayerFriend, PlayerExp], using=settings.DB_READONLY) if o_player: tmp = self.getObjPlayerList([o_player, v_player]) for obj_player in tmp: if obj_player['id'] == oid: obj_o_player = obj_player elif obj_player['id'] == uid: obj_v_player = obj_player if tmp: obj_o_player = tmp[0] is_battle_ok = True if not obj_o_player: url = UrlMaker.battleevent_opplist() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return elif not self.checkOpponentId( oid, revengeid, do_redirect=revengeid, args=args): # 対戦できない相手. if revengeid: return is_battle_ok = False obj_o_player['is_battle_ok'] = is_battle_ok self.setFromPage(Defines.FromPages.BATTLEEVENTPRE, [oid, revengeid, rival_key]) # バトルイベント. self.html_param['battleevent'] = Objects.battleevent(self, eventmaster) # 各プレイヤーの情報. self.html_param['player'] = obj_v_player self.html_param['o_player'] = obj_o_player # ランク情報. rankrecord = self.getCurrentBattleRankRecord() obj_rankrecord = self.makeRankRecordObj(rankrecord) self.html_param['battleevent_rank'] = obj_rankrecord # 回復への導線. BackendApi.put_bprecover_uselead_info(self) # バトル開始URL. url = UrlMaker.battleevent_battledo(v_player.req_confirmkey, oid, revengeid, rival_key=rival_key) self.html_param['url_battle_do'] = self.makeAppLinkUrl(url) # 相手変更URL. target = 'revenge' if revengeid else 'lv' url = UrlMaker.battleevent_opplist(target) self.html_param['url_battle_oppselect'] = self.makeAppLinkUrl(url) # 書き込み. if eventmaster.is_goukon: self.writeAppHtml('gcevent/battleselect') else: self.writeAppHtml('btevent/battleselect')
def process(self): now = OSAUtil.get_now() model_mgr = self.getModelMgr() config = BackendApi.get_current_battleeventconfig( model_mgr, using=settings.DB_READONLY) cur_eventmaster = None if config.mid and config.starttime <= now < config.epilogue_endtime: cur_eventmaster = BackendApi.get_battleevent_master( model_mgr, config.mid, using=settings.DB_READONLY) if cur_eventmaster is None: self.appRedirect(self.makeAppLinkUrlRedirect(UrlMaker.mypage())) return elif config.starttime <= now < config.endtime: self.checkBattleEventUser(do_check_battle_open=False, do_check_regist=False) if self.response.isEnd: return v_player = self.getViewerPlayer() uid = v_player.id view_result = self.request.get(Defines.URLQUERY_FLAG) == '1' # 現在の贈り物情報を確認. presentdata = BackendApi.get_battleeventpresent_pointdata( model_mgr, uid, cur_eventmaster.id, using=(settings.DB_DEFAULT if view_result else settings.DB_READONLY)) if presentdata is None: raise CabaretError(u'このイベントでは閲覧できません') cur_data = presentdata.getData() presentmaster = BackendApi.get_battleeventpresent_master( model_mgr, cur_eventmaster.id, cur_data['number'], using=settings.DB_READONLY) if presentmaster.point <= presentdata.point: # 達成済み. playerrequest = BackendApi.get_playerrequest(model_mgr, uid) url = UrlMaker.battleevent_presentreceive( playerrequest.req_confirmkey) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return # 結果表示フラグ. if view_result and presentdata.precontent: contentmaster = BackendApi.get_battleeventpresent_content_master( model_mgr, presentdata.precontent, using=settings.DB_READONLY) prizelist = BackendApi.get_prizelist(model_mgr, contentmaster.prizes, using=settings.DB_READONLY) self.html_param['prize'] = BackendApi.make_prizeinfo( self, prizelist, using=settings.DB_READONLY) # 現在の贈り物情報. self.html_param['battleeventpresent'] = Objects.battleevent_present( self, presentmaster, presentdata) # イベント情報. self.html_param['battleevent'] = Objects.battleevent( self, cur_eventmaster, now) # 対戦相手一覧のリンク. url = UrlMaker.battleevent_opplist() self.html_param['url_battleevent_opplist'] = self.makeAppLinkUrl(url) # 報酬一覧のリンク. url = UrlMaker.battleevent_presentlist() self.html_param['url_battleevent_presentlist'] = self.makeAppLinkUrl( url) # HTML書き出し. self.writeAppHtml( '%s/present' % ('gcevent' if cur_eventmaster.is_goukon else 'btevent'))
def procOpened(self): """開催中. """ # ユーザの状態チェック. if not self.checkBattleEventUser(do_check_battle_open=False, do_check_emergency=False): return model_mgr = self.getModelMgr() eventid = self.__eventmaster.id v_player = self.getViewerPlayer() uid = v_player.id if BackendApi.check_battleevent_lead_scenario( model_mgr, uid, eventid, using=settings.DB_READONLY): # 中押し演出を見ていない. url = UrlMaker.battleevent_scenario() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False # ランク情報. rankrecord = BackendApi.get_battleevent_rankrecord( model_mgr, eventid, uid, using=settings.DB_READONLY) func_rankinfo = self.makeRankRecordObj(rankrecord, player_num=2, do_execute=False) # スコア情報. scorerecord = BackendApi.get_battleevent_scorerecord( model_mgr, eventid, uid, using=settings.DB_READONLY) rank_beginer = BackendApi.get_battleevent_rank(eventid, uid, is_beginer=True) obj_scorerecord = self.makeScoreRecordObj(scorerecord, rank_beginer=rank_beginer) self.html_param['battleevent_score'] = obj_scorerecord if func_rankinfo: def put_rankinfo(): obj_rankinfo = func_rankinfo() self.html_param['battleevent_rank'] = obj_rankinfo # グループ内ランキング報酬. prizeinfo = None if 0 < obj_scorerecord['point']: grouprank = obj_rankinfo['grouprankingdata']['rank'] rankmaster = BackendApi.get_battleevent_rankmaster( model_mgr, eventid, obj_rankinfo['rank'], using=settings.DB_READONLY) if rankmaster: prizeidlist = [] for data in rankmaster.group_rankingprizes: if not data.get('prize') or not (data['rank_min'] <= grouprank <= data['rank_max']): continue prizeidlist.extend(data.get('prize')) prizelist = BackendApi.get_prizelist( model_mgr, prizeidlist, using=settings.DB_READONLY) prizeinfo = BackendApi.make_prizeinfo( self, prizelist, using=settings.DB_READONLY) self.html_param['prize'] = prizeinfo self.addExecuteApiWork(put_rankinfo) # グループの詳細へ. self.html_param['url_battleevent_group'] = self.makeAppLinkUrl( UrlMaker.battleevent_group()) url = UrlMaker.battleevent_explain(eventid, 'prizes') self.html_param['url_prizes_group_ranking'] = self.makeAppLinkUrl( OSAUtil.addQuery(url, Defines.URLQUERY_CTYPE, 'group_ranking')) # バトルTOPへ. self.html_param['url_battleevent_opplist'] = self.makeAppLinkUrl( UrlMaker.battleevent_opplist())