// @author: xxx@syg.com(必填, 创建模块的人员)
// --------------------------------------------------------------------
// @description:
// 战斗控制器
//
Create: 2018-11-28 19:19:19
// --------------------------------------------------------------------
var BattleEvent = require("battle_event");
var BattleConst = require("battle_const");
var MainuiController = require("mainui_controller");
var LevupgradeController = require("levupgrade_controller")
var MainuiEvent = require("mainui_event");
var BattleController = cc.Class({
extends: BaseController,
ctor: function () {
},
// 初始化配置数据
initConfig: function () {
// var BattleModel = require("battle_model");
this.model = Utils.createClass("battle_model")
// var BattleHookModel = require("battle_hook_model");
this.hook_model = Utils.createClass("battle_hook_model");
this.model.initConfig();
this.hook_model.initConfig()
this.is_watch_replay = false; // 是否属于观战状态
this.is_unlock_chapter = false // 是否解锁章节中
this.is_normal_battle = false; // 是否是真战斗
this.finish_result_view_list = {}; // 胜利面板列表
this.finish_fail_view_list = {}; // 失败面板列表;
this.cache_list = []; //缓存界面列表
},
// 返回当前的model
getModel: function () {
return this.model;
},
// 假战斗数据
getHookModel: function () {
return this.hook_model;
},
// 注册监听事件
registerEvents: function () {
if (this.loading_enter_scene == null) {
this.loading_enter_scene = gcore.GlobalEvent.bind(MainuiEvent.LOADING_ENTER_SCENE, (function () {
this.showCachePanel();
}).bind(this))
}
},
// 注册协议接受事件
registerProtocals: function () {
this.RegisterProtocal(20027, this.scInitFightStart); // 战斗真正初始化数据,从0到1的战斗
this.RegisterProtocal(20002, this.scRoundFightStart); // 回合开始的播报 -- 包含回合开始的buff
this.RegisterProtocal(20004, this.scRoundFightOn); // 回合中的播报 -- 包含回合结束buff和效果播报的buff
this.RegisterProtocal(20006, this.scFightEnd); // 战斗结算的,也就是真是战斗结束的
this.RegisterProtocal(20008, this.scFightExit); // 退出战斗
this.RegisterProtocal(20009, this.scSkipFirstTeam); // 跳过一队
this.RegisterProtocal(20013, this.scReBattleFight); // 战斗重连,切进战斗或者短线重连的战斗
this.RegisterProtocal(20014, this.scBattlePk); // 战斗切磋请求
this.RegisterProtocal(20015, this.scBattlePkRe); // 战斗切磋返回
this.RegisterProtocal(20016, this.scBattlePkTwice); // 战斗切磋同意
this.RegisterProtocal(20020, this.scRoundNextFight); // 下一波怪物
this.RegisterProtocal(20022, this.scFightSpeed); // 改变播放速度
this.RegisterProtocal(20029, this.scRecordBattle); // 看录像
this.RegisterProtocal(20033, this.handle20033); // 切磋结算
this.RegisterProtocal(20034, this.handle20034); // 切磋视频分享
this.RegisterProtocal(20036, this.handle20036); // 观看跨服录像,最后应该29协议全部转到这一条
this.RegisterProtocal(20060, this.handle20060); // 请求战斗类型返回,这个时候只需要做对应ui操作的
this.RegisterProtocal(20061, this.handle20061); // 假战斗初始化的,如果触发这个数据但是实际上是在真战斗中的时候,不做处理
this.RegisterProtocal(20062, this.handle20062); // 跳过战斗
},
// 是否在战斗中
isInFight: function () {
return this.model.getFightStatus()
},
// 是否有战斗场景
hadBattleScene:function(){
return (this.model.getBattleScene() != null)
},
// 设置战斗场景的状态
handleBattleSceneStatus: function (status) {
this.model.handleBattleSceneStatus(status)
},
// 根据战斗类型请求数据,r如果是切出战斗的话 则 combat_type:BattleConst.Fight_Type.Nil
send20060: function (combat_type) {
cc.log("请求切出战斗");
var protocal = {
combat_type: combat_type
}
this.SendProtocal(20060, protocal);
},
// 返回战斗状态,
handle20060: function (data) {
// data.combat_type, data.type(0:不存在战斗 1:存在战斗 2:假战斗)
if (data.combat_type == 0) { // 这个就是切出战斗,
this.clearBattleScene();
} else {
}
gcore.GlobalEvent.fire(BattleEvent.COMBAT_TYPE_BACK, data.combat_type, data.type);
},
// 战斗结算的,也有可能不需要出结算面板
scFightEnd: function (data) {
cc.log("战斗结算的,也有可能不需要出结算面板---",data)
var is_replay = false;
if (data.combat_type > 1000){
data.combat_type = data.combat_type - 1000;
is_replay = true;
}
if(data.combat_type == BattleConst.Fight_Type.Endless){
var PromptController = require("prompt_controller")
var PromptTypeConst = require("prompt_type_const")
PromptController.getInstance().getModel().removePromptDataByTpye(PromptTypeConst.Endless_trail)
}
this.model.showWin(data, is_replay);
},
// 清理战斗场景,在退出战斗或者战斗结算之后,如果个战斗是剧情副本的战斗,那么就不需要清理掉场景,而是直接切换到假战斗
clearBattleScene: function () {
this.model.clearBattleScene();
},
// 请求切出战斗
requestCutOutBattle: function () {
var BattleConst = require("battle_const");
this.send20060(BattleConst.Fight_Type.Nil);
},
// 战斗初始化数据
scInitFightStart: function (data) {
var BattleConst = require("battle_const");
if (BattleConst.canDoBattle(data.combat_type)) {
this.model.updateCurBattleData(data, true);
this.prepareLoaderBattleScene(data.combat_type, 2);
}
},
// 切进战斗
scReBattleFight: function (data) {
var BattleConst = require("battle_const");
if (BattleConst.canDoBattle(data.combat_type)) {
this.model.updateCurBattleData(data, false);
this.prepareLoaderBattleScene(data.combat_type, 2);
}
},
// 回合开始的播报
scRoundFightStart: function (data) {
Log.info("回合开始播报");
// cc.log(data);
this.model.playRoundStart(data);
},
// 回合中的播报
scRoundFightOn: function (data) {
Log.info("回合播报");
// cc.log(data);
this.model.playRoundIn(data);
},
// 回合播报结束通知服务端,对应的是20004
csSkillPlayEnd: function () {
Log.info("20004 播报完成");
this.SendProtocal(20005, {});
},
// 回合开始播报完成之后,通知服务端,对应的是20002
csRoundFightEnd: function () {
Log.info("20002 播报完成");
this.SendProtocal(20019, {});
},
// 战斗初始化完成之后
csReadyFightStart: function () {
Log.info("战斗初始化完成,通知服务端可以开始播报了");
this.SendProtocal(20001, {});
},
// 请求跳过战斗
send20062:function(){
this.SendProtocal(20062, {});
},
handle20062:function(data){
message(data.msg);
},
// 假战斗数据
handle20061: function (data) {
cc.log("假战斗数据");
cc.log(data);
this.hook_model.updateUnrealBattleData(data);
this.prepareLoaderBattleScene(data.combat_type, 1);
},
csRecordBattle: function (replay_id) {
var protocal = {};
protocal.replay_id = replay_id;
this.SendProtocal(20029, protocal);
},
// 战斗录像,这里只是记录战斗录像状态
scRecordBattle: function (data) {
message(data.msg);
if (data.code == 1) {
// ChatController:getInstance():closeChatUseAction()
this.setWatchReplayStatus(true);
}
},
// 切磋结果返回
handle20033:function(data){
if (data.combat_type == null){
data.combat_type = BattleConst.Fight_Type.PK;
}
if (data.show_panel_type == null){
data.show_panel_type = 1
}
this.model.showWin(data);
},
// 分享切磋视频
on20034:function(replay_id,channel,target_name,share_type){
var protocal = {}
protocal.replay_id = replay_id
protocal.channel = channel
protocal.target_name = target_name
protocal.share_type = share_type
this.SendProtocal(20034,protocal)
},
handle20034:function(data){
message(data.msg);
},
/**
* 切换进战斗的唯一接口
* @param {*} combat_type
* @param {*} in_fight_type 0:没有战斗 1:假战斗 2:真战斗
*/
prepareLoaderBattleScene: function (combat_type, in_fight_type) {
this.model.createBattleScene(in_fight_type, combat_type);
// 进入战斗,抛出事件
if (in_fight_type == 2) {
gcore.GlobalEvent.fire(EventId.ENTER_FIGHT, combat_type, in_fight_type);
}
},
/**
* 下一波怪物的入口
* @param {*} data
*/
scRoundNextFight:function(data){
if (data){
this.model.upDateNextMon(data);
}
},
// 战斗每一帧更新
update: function (dt) {
this.model.mapMovescheduleUpdate();
},
// 切换战斗背景移动状态,主要是用于真假剧情战斗切换
changeMoveMapStatus: function (status) {
this.model.changeMoveMapStatus()
},
// 查看录像返回
sender_20036: function (replay_id, replay_srv_id) {
var protocal = {
replay_id: replay_id,
replay_srv_id: replay_srv_id,
}
this.SendProtocal(20036, protocal);
},
handle20036: function (data) {
if (data.code == 1) {
this.setWatchReplayStatus(true)
}
},
// 退出战斗
csFightExit: function () {
this.SendProtocal(20008, {});
},
scFightExit: function (data) {
message(data.msg);
},
// 跳过一队
csSkipFirstTeam:function(){
this.SendProtocal(20009, {});
},
scSkipFirstTeam:function(data){
message(data.msg);
},
// 是否是观战状态
getWatchReplayStatus: function () {
return this.is_watch_replay;
},
// 设置观战状态
setWatchReplayStatus: function (status) {
this.is_watch_replay = status;
},
// 是否是观战或者切磋状态
getIsClickStatus: function () {
var combat_type = this.model.getCombatType();
return this.getWatchReplayStatus() || (combat_type == BattleConst.Fight_Type.PK) || (combat_type == BattleConst.Fight_Type.HeroTestWar);
},
setUnlockChapterStatus:function(status){
this.is_unlock_chapter = status;
},
getUnlockChapterStatus:function(){
return this.is_unlock_chapter;
},
//进入主场景后显示缓存的界面
showCachePanel:function(){
if(this.cache_list == null || this.cache_list.length<=0)return;
for(var i in this.cache_list){
if(this.cache_list[i].function){
this.cache_list[i].function();
}
}
this.cache_list = [];
},
// 战斗结算界面
openFinishView: function (status, combat_type, data) {
if (status == true) {
if(IS_LOADING == true){
this.cache_list.push({function:function(status, combat_type, data){
this.openFinishView(status, combat_type, data);
}.bind(this,status, combat_type, data)});
return;
}
if (this.finish_result_view_list[combat_type]) {
this.finish_result_view_list[combat_type].close();
this.finish_result_view_list[combat_type] = null;
}
if (!this.is_unlock_chapter) {
if (combat_type == BattleConst.Fight_Type.StarTower) {//试炼塔
var StartowerController = require("startower_controller");
StartowerController.getInstance().openResultWindow(true, data);
} else if (combat_type == BattleConst.Fight_Type.Arena) {
var ArenaController = require("arena_controller");
ArenaController.getInstance().openLoopResultWindow(true, data);
} else if (combat_type == BattleConst.Fight_Type.Darma && data && data.result == 1) { //剧情副本战斗胜利时
//设置不要马上显示升级
LevupgradeController.getInstance().waitForOpenLevUpgrade(true)
var BattleMvpWindow = require("battle_mvp_window");
this.finish_result_view_list[combat_type] = new BattleMvpWindow(data);
this.finish_result_view_list[combat_type].open();
}else if (combat_type == BattleConst.Fight_Type.GuildDun ) { //公会副本
require("guildboss_controller").getInstance().openGuildbossResultWindow(true,data);
}else if (combat_type == BattleConst.Fight_Type.PK){ // PK
this.finish_result_view_list[combat_type] = Utils.createClass("battle_pk_result_window");
this.finish_result_view_list[combat_type].open(data)
}else {
if (!this.finish_result_view_list[combat_type]) {
if (data.result == 1) {
//设置不要马上显示升级
LevupgradeController.getInstance().waitForOpenLevUpgrade(true)
var BattleResultView = require("battle_result_window");
this.finish_result_view_list[combat_type] = new BattleResultView(data.result, combat_type);
this.finish_result_view_list[combat_type].open({data:data,fight_type: combat_type});
} else {
cc.log("打开失败界面")
this.openFailFinishView(true, combat_type, data.result, data);
}
}
}
}
} else {
if (this.finish_result_view_list[combat_type]) {
this.finish_result_view_list[combat_type].close();
this.finish_result_view_list[combat_type] = null;
}
}
},
getFinishView: function(combat_type) {
if (this.finish_result_view_list) {
return this.finish_result_view_list[combat_type]
}
},
//打开战斗伤害统计界面
openBattleHarmInfoView: function (status, data) {
if (status == true) {
if (this.harm_info_view == null) {
this.harm_info_view = Utils.createClass("battle_harm_info_window");
}
this.harm_info_view.open(data);
} else {
if (this.harm_info_view) {
this.harm_info_view.close();
this.harm_info_view = null;
}
}
},
//失败结算界面
openFailFinishView: function (status, combat_type, result, data) {
if (status == true) {
//如果是在剧情中,则不需要弹出这些
// if(require("guide_controller").getInstance().isInGuide())return
if (!this.is_unlock_chapter) {
if (!this.finish_fail_view_list[combat_type]) {
//设置不要马上显示升级
LevupgradeController.getInstance().waitForOpenLevUpgrade(true)
var BattleFailView = require("battle_fail_window");
var finish_view = new BattleFailView(combat_type, result, data);
if (finish_view) {
finish_view.open();
}
this.finish_fail_view_list[combat_type] = finish_view;
}
} else {
if (MainuiController.getInstance().checkIsInDramaUIFight()) {
this.battle_controller.send20060(BattleConst.Fight_Type.Darma);
}
}
} else {
if (this.finish_fail_view_list[combat_type]) {
this.finish_fail_view_list[combat_type].close();
this.finish_fail_view_list[combat_type] = null;
}
}
},
//获取是否相同的战斗类型
getIsSameBattleType: function (combat_type) {
return combat_type == this.model.getCombatType();
},
// -- 打开阵营详细面板
openBattleCampView( status, form_id ){
if(status == true ){
if(!this.battle_camp_view){
let BattleCampView = require("battle_camp_window")
this.battle_camp_view = new BattleCampView()
}
if(this.battle_camp_view.isOpen() == false){
this.battle_camp_view.open(form_id)
}
}else{
if(this.battle_camp_view){
this.battle_camp_view.close()
this.battle_camp_view = null
}
}
},
// 记录是否为假战斗的战斗
setIsNormaBattle: function(status) {
this.is_normal_battle = status;
},
// 是否是假战斗....
getIsNoramalBattle: function() {
return this.is_normal_battle;
},
// 改变战斗速度
csFightSpeed:function(speed){
var protocal = {}
protocal.speed = speed;
this.SendProtocal(20022, protocal);
},
scFightSpeed:function(data){
message(data.msg);
},
getCtrlBattleScene: function(cal_back) {
var battle_scen = this.model.getBattleScene();
cal_back(battle_scen);
},
getDramaFightUI: function(finish_cb) {
if (finish_cb) {
finish_cb(this.model.getDramaFightUI());
} else {
if (this.model)
return this.model.getDramaFightUI();
}
},
// ---------------------切磋请求
csBattlePk: function (target_id, target_srv_id, is_province) {
var protocal = {};
protocal.target_id = target_id;
protocal.target_srv_id = target_srv_id;
protocal.is_province = is_province;
this.SendProtocal(20014, protocal);
},
scBattlePk:function(data){
message(data.msg);
require("chat_controller").getInstance().closeChatPanel(false);
require("friend_controller").getInstance().openFriendCheckPanel(false);
},
// 被切磋对象,在18600收到提示之后,调用这个接口同意或者取消掉
confirmBattlePk:function(promptVo){
},
// 被切磋对象,同意切磋或者拒绝切磋
csBattlePkRe:function(bool,data){
var protocal = {};
protocal.target_id = data.target_id;
protocal.target_srv_id = data.target_srv_id;
protocal.is_agree = bool ? 1 : 0;
this.SendProtocal(20015, protocal);
},
scBattlePkRe:function(data){
message(data.msg);
},
// 目标这统一了自己发起的请求.这时候自己的二次确认
scBattlePkTwice:function(data){
if(data){
if( ! this.isInFight()){
var accept_fun = function(){
this.csBattlePkTwiceConfirm(true, {target_srv_id: data.target_srv_id, target_id: data.target_id});
}.bind(this);
var refuse_fun = function(){
this.csBattlePkTwiceConfirm(false, {target_srv_id: data.target_srv_id, target_id: data.target_id});
}.bind(this);
var desc = cc.js.formatStr(Utils.TI18N("玩家%s同意了你的切磋请求,点击”立即切磋“立即进入切磋战斗?"), data.target_name || "");
require("commonalert").show(desc, Utils.TI18N("立即切磋"), accept_fun, Utils.TI18N("取消"), refuse_fun);
}
}
},
// 发起者同意进战斗或者拒绝
csBattlePkTwiceConfirm: function (bool, data) {
var protocal = {};
protocal.target_id = data.target_id;
protocal.target_srv_id = data.target_srv_id;
protocal.is_agree = bool ? 1 : 0;;
this.SendProtocal(20016, protocal);
},
// 打开buff总览界面
openBattleBuffInfoView(status, left_name, right_name){
if(status == true){
if(this.buff_info_view == null){
var BattleBuffInfoView = require("battle_buff_info_window")
this.buff_info_view = new BattleBuffInfoView()
}
if(this.buff_info_view.isOpen() == false){
this.buff_info_view.open({left_name:left_name,right_name:right_name})
}
}else{
if(this.buff_info_view){
this.buff_info_view.close()
this.buff_info_view = null
}
}
},
// - 更新buff列表界面数据
updateBattleBuffListView( data, group, partner_bid ){
if(this.buff_list_view && this.buff_list_view.checkIsChosedBuffList(group, partner_bid)){
this.buff_list_view.setData(data)
}
},
// -- 打开buff列表界面
openBattleBuffListView( status, data, group, partner_bid ){
if(status == true){
if(this.buff_list_view == null){
var BattleBuffListView = require("battle_buff_list_window")
this.buff_list_view = new BattleBuffListView()
}
if(this.buff_list_view.isOpen() == false){
this.buff_list_view.open({data:data, group:group, partner_bid:partner_bid})
}
}else{
if(this.buff_list_view){
this.buff_list_view.close()
this.buff_list_view = null
}
}
}
});
module.exports = BattleController;