/****************************************************************** * * 伙伴信息页 --- 升阶 * ******************************************************************/ const BridgeComponent = require( "bridge.component" ); const TipsController = require( "tips_controller" ); const HeroConst = require( "hero_const" ); const HeroEvent = require( "hero_event" ); const HeroControl = require( "hero_controller" ); const HeroCalculate = require( "hero_calculate" ); const RoleController = require( "role_controller" ); const BackPackConst = require( "backpack_const" ); const BackpackController = require( "backpack_controller" ); const FID = require( "bridge.function.ids" ); const BIT = BackPackConst.item_type; const HEQP = HeroConst.EquipPosList; cc.Class( { extends: BridgeComponent, properties: { }, // 显示 onEnable: function() { // 视图监听 this.vbind( [ [ "ShowPartner", this.onPartnerChanged.bind( this ) ] ] ); // 事件监听 this.bindGEvent( HeroEvent.Hero_Data_Update, this.onPartnerUpdate.bind( this ) ); this.bindGEvent( HeroEvent.Equip_Update_Event, this.onPartnerUpdate.bind( this ) ); }, // 隐藏 onDisable: function() { // 视图监听解除 this.vunbind(); // 事件监听解除 this.unbindGEvents(); }, // 有伙伴数据更新 onPartnerUpdate: function( _vo ) { if( _vo && this.partner && _vo.partner_id == this.partner.partner_id ) { this.onPartnerChanged( _vo ); } }, // 伙伴更新 onPartnerChanged: function( _partner ) { this.partner = _partner; // 置空 if( !this.dataAnalyst() ) { this.setEmpty(); return; } // this.dealUpLevOnceToHundred(); nx.gui.setActive( this, "uplevelmax", false ); // 全刷新 this.freshLevel(); this.freshOps(); }, // 置空 setEmpty: function() { nx.gui.setString( this, "lv/txt", "" ); nx.gui.setString( this, "bp/txt", "" ); nx.gui.setActive( this, "uplevel", false ); nx.gui.setActive( this, "upgrade", false ); nx.gui.setActive( this, "max", false ); let stars = nx.gui.find( this, "stars/list" ); if( stars ) { stars.children.forEach( ch => { nx.gui.setActive( ch, "on", false ); nx.gui.setActive( ch, "off", true ); } ); } let need = nx.gui.find( this, "need/list" ); if( need ) { need.children.forEach( ch => { nx.gui.setSpriteFrame( ch, "icon", "" ); nx.gui.setString( ch, "txt", "" ); } ); } }, dealUpLevOnceToHundred: function(){ let ucfg = game.configs.partner_data.data_partner_lev; let mcfg = gdata( "partner_data", "data_partner_star" ); let ccfg = game.configs.partner_data.data_partner_const; let key = this.partner.bid + "_" + this.partner.star; let k1c = this.partner.type + "_" + this.partner.break_id + "_" + 1; let cbc = game.configs.partner_data.data_partner_brach; let needexp = 0; let needcoin = 0; let needmat = 0; for (let i in ucfg ) { let cfg = ucfg[i]; let needs = cfg.expend; if( cfg.lev >= this.partner.lev && cfg.lev < ccfg.born_limit_lev.val ){ needexp += needs[0][1]; needcoin += needs[1][1]; } } let havepartexp = BackpackController.getInstance().getModel().getItemNumByBid( ucfg[1].expend[0][0] ); let havecoin = BackpackController.getInstance().getModel().getItemNumByBid( ucfg[1].expend[1][0] ); let havemat = BackpackController.getInstance().getModel().getItemNumByBid( cbc[k1c].expend[1][0] ); if( havecoin >= needcoin && havepartexp >= needexp ){ for (let b = 0; b < ccfg.ascend_stairs.val; b++) { if( b >= this.partner.break_lev ){ let k1 = this.partner.type + "_" + this.partner.break_id + "_" + b; let cbccc = cbc[ k1 ]; needmat += cbccc.expend[1][1]; needcoin += cbccc.expend[0][1]; } } } return needcoin <= havecoin && havemat >= needmat && havepartexp >= needexp; }, // 数据统计 dataAnalyst: function() { // 空目标 if( nx.dt.objEmpty( this.partner ) ) { return false; } let key = this.partner.bid + "_" + this.partner.star; let scfg = gdata( "partner_data", "data_partner_star", key ); if( nx.dt.objEmpty( scfg ) ) { nx.error( "升级刷新失败,当前配置无效!", key ); return false; } let k1 = this.partner.type + "_" + this.partner.break_id + "_" + this.partner.break_lev; let cbc = game.configs.partner_data.data_partner_brach[ k1 ]; if( nx.dt.objEmpty( cbc ) ) { nx.error( "升级刷新失败,当前配置无效!", k1 ); return false; } let k2 = this.partner.type + "_" + this.partner.break_id + "_" + ( this.partner.break_lev + 1 ); let nbc = game.configs.partner_data.data_partner_brach[ k2 ]; this.data = { scfg: scfg, // 当前配置 cbc: cbc, // 当前阶段配置 nbc: nbc, // 下个阶段配置 }; return true; }, // 阶段刷新 freshLevel: function() { // 战力 nx.gui.setString( this, "bp/txt", this.partner.power ); // 等级 let key = this.partner.bid + "_" + this.partner.star; let scfg = gdata( "partner_data", "data_partner_star", key ); if( nx.dt.objEmpty( scfg ) ) { nx.error( "升级刷新失败,当前配置无效!", key ); return false; } let k1 = this.partner.type + "_" + this.partner.break_id + "_" + this.partner.break_lev; let cbc = game.configs.partner_data.data_partner_brach[ k1 ]; if( nx.dt.objEmpty( cbc ) ) { nx.error( "升级刷新失败,当前配置无效!", k1 ); return false; } let maxlv = Math.max( cbc.lev_max, scfg.lev_max ); // let txt = `${this.partner.lev}/${maxlv}`; nx.gui.setString( this, "lv/levs/lev", this.partner.lev ); nx.gui.setString( this, "lv/levs/max", maxlv ); // 当前阶 let model = HeroControl.getInstance().getModel(); let cur = this.partner.break_lev; // let max = model.getHeroMaxBreakCountByInitStar( this.partner.star ); let lst = nx.gui.find( this, "stars/list" ); for( let i = 1; i <= lst.children.length; ++i ) { let node = lst.children[ i - 1 ]; nx.gui.setActive( node, "on", i <= cur ); nx.gui.setActive( node, "off", i > cur ); } }, // 操作刷新 freshOps: function() { nx.gui.setActive( this, "upstar", false ); // 尚未当阶段满级,更新升级花费 // 最大等级按照当前阶段的最高等级/如果是顶阶那么按照最大等级 let maxLv = this.data.cbc.lev_max; if( nx.dt.objEmpty( this.data.nbc ) ) { maxLv = Math.max( maxLv, this.data.scfg.lev_max ); } if( this.partner.lev < maxLv ) { this.updateNeeds(); return; } // 当前满级,需要升阶判断 // 已经顶阶 if( nx.dt.objEmpty( this.data.nbc ) ) { nx.gui.setActive( this, "max", true ); nx.gui.setActive( this, "need/list", false ); nx.gui.setActive( this, "uplevel", false ); nx.gui.setActive( this, "upgrade", false ); nx.gui.setActive( this, "upstar", this.partner.star >= 4 ); return; } // 可以继续进阶 // 进阶有要求,需要升星 let HC = HeroCalculate.getInstance(); let limit = this.data.nbc.limit || []; let enough = HC.isEnoughCondition( limit, this.partner ); if( enough ) { nx.gui.setActive( this, "max", true ); nx.gui.setActive( this, "need/list", false ); nx.gui.setActive( this, "uplevel", false ); nx.gui.setActive( this, "upgrade", true ); } else { nx.gui.setActive( this, "max", true ); nx.gui.setActive( this, "need/list", false ); nx.gui.setActive( this, "uplevel", false ); nx.gui.setActive( this, "upgrade", false ); nx.gui.setActive( this, "upstar", this.partner.star >= 4 ); } // 红点提示 let tip = HC.checkSingleHeroLevelUpRedPoint( this.partner ); nx.gui.setActive( this, "uplevel/tip", tip ); }, // 更新升级花费 updateNeeds: function() { let lev = this.partner.lev; let max = lev; let step = ( lev < 60 ) ? 5 : 5; let k1 = this.partner.type + "_" + this.partner.break_id + "_" + this.partner.break_lev; let upgrade = game.configs.partner_data.data_partner_brach[k1].lev_max; let needs = {}; let cur = {}; let model = BackpackController.getInstance().getModel(); let check = function( _costs ) { let need = []; let enough = true; for( let i = 0; i < _costs.length; ++i ) { let cost = _costs[ i ]; let id = cost[ 0 ]; if( cur[ id ] == null ) { cur[ id ] = 0; } cur[ id ] = cur[ id ] + cost[ 1 ]; need.push( { id : id, need : cost[1] } ) let count = model.getItemNumByBid( id ); if( count < cur[ id ] ) { enough = false; } } if( !enough ){ for (let n = 0; n < need.length; n++) { let ned = need[n]; cur[ned.id] = cur[ned.id] - ned.need; cur[ned.id] = cur[ned.id] == 0 ? ned.need : cur[ned.id] ; } } return { is_enough: enough, cur_cost_list: cur } }; // 资源统计 let maxLv = Math.max( this.data.cbc.lev_max, this.data.scfg.lev_max ); for( let i = 1; i <= step; ++i ) { let next = this.partner.lev + i ; if( next > maxLv ) { break; } let cfg = game.configs.partner_data.data_partner_lev[ next ]; if( cfg ) { let up_cost = cfg.expend || []; let ret = check( up_cost ); let is_enough = ret.is_enough; // console.log( "当前的升级相关数据" + JSON.stringify( ret ) ); this.needs = ret; let cost_list = ret.cur_cost_list; if( is_enough ) { needs = cost_list; max = next; } else { if( i == 1 ) { needs = cost_list; } break } } } // 消耗刷新 nx.gui.setActive( this, "max", false ); let list = nx.gui.setActive( this, "need/list", true ); let cfg = game.configs.partner_data.data_partner_lev[ this.partner.lev ]; let expend = cfg ? ( cfg.expend || [] ) : []; for( let k = 0; k < expend.length; ++k ) { let ifo = expend[ k ]; let node = list.children[ k ]; if( nx.dt.arrEmpty( ifo ) ) { node.active = false; continue; } node.active = true; let item = gdata( "item_data", "data_unit1", ifo[ 0 ], false ); nx.bridge.setIconS( node, "icon", item.icon ); let count = needs[ ifo[ 0 ] ]//ifo[1]; // let have_count = model.getItemNumByBid( ifo[ 0 ] ); nx.gui.setString( node, "txt", count ); }; // 操作刷新 nx.gui.setActive( this, "upgrade", false ); let btn = nx.gui.setActive( this, "uplevel", true ); let lv = max - this.partner.lev ; if( this.partner.break_lev < 6 ){ lv = lv + this.partner.lev >= upgrade ? upgrade - this.partner.lev : lv; }else{ lv = lv + this.partner.lev > maxLv ? maxLv - this.partner.lev : lv; } nx.gui.setActive( this, "uplevel/tip", lv > 0 ); let cmp = nx.gui.getComponent( this, "uplevel", cc.Button ); if( cmp ){ cmp.interactable = true; let material = lv > 0 ? cc.Material.getBuiltinMaterial( '2d-sprite' ) : cc.Material.getBuiltinMaterial( '2d-gray-sprite' ); let sp = nx.gui.getComponent( this, "uplevel/on", cc.Sprite ); sp.setMaterial( 0,material ); let color = lv > 0 ? new cc.color( "#B85833" ) : cc.Color.BLACK; nx.gui.setOutlineColor( this, "uplevel/on/txt", color ); } this.canUpLev = lv > 0; let txt = lv > 0 ? nx.text.format( "UpLevelX", lv ) : nx.text.getKey( "UpLevel" ); btn.level = lv; nx.gui.setString( btn, "on/txt", txt ); }, // 点击升级 onTouchUpLevel: function() { if( !this.canUpLev ){ /** * {"is_enough":false,"cur_cost_list":{"1":123274,"22":77552}} */ let needs = this.needs; let model = BackpackController.getInstance().getModel(); let lev = RoleController.getInstance().getRoleVo().lev; let cfg = game.configs.source_data.data_source_data; let needgo = 0; let matshow = 0; let coin = 0; if( nx.dt.objNEmpty( needs ) ){ let list = needs.cur_cost_list; for (let i in list ) { let mat = parseInt( i ); let have = model.getItemNumByBid( mat ); if( have < list[i] && mat != 1 ){ needgo++; matshow = mat; }else{ if( mat == 1 ){ coin = mat; } } } const TC = TipsController.getInstance(); if( needgo > 0 ){ let expend_item_cfg = gdata( "item_data", "data_unit1", matshow, false ); if( nx.bridge.acts ){ let data = nx.bridge.acts.queryThemeByType( 13 ); if( data && lev >= cfg[data.source].lev_limit[1] ){ nx.mbox( nx.text.format( "BuyReward", expend_item_cfg.name ), [ 'cancel', 'Goto' ], ( _key, _box ) => { _box.close(); if( _key == "Goto" ) { nx.bridge.jumper.jump2Window( FID.ActMySteryGift, matshow ); } } ); }else{ if ( TC ) { TC.showItemTips( matshow ); } } }else{ if ( TC ) { TC.showItemTips( matshow ); } } }else{ if ( TC ) { TC.showItemTips( coin ); } } } return; } let nod = nx.gui.find( this, "uplevelmax" ); let HC = HeroControl.getInstance(); if( this.partner.star >= 5 ){ if( this.dealUpLevOnceToHundred() && !nod.active && this.partner.lev < 100 ){ nx.gui.setActive( nod, "", true ); }else{ // 暂时只升级一次 if( HC && nx.dt.objNEmpty( this.partner ) ) { HC.sender11003( this.partner.id ); } } }else{ if( HC && nx.dt.objNEmpty( this.partner ) ) { HC.sender11003( this.partner.id ); } } }, // 点击升阶 onTouchUpGrade: function() { let HC = HeroControl.getInstance(); if( !HC || nx.dt.objEmpty( this.partner ) ) { return; } HC.openHeroBreakPanel( true, this.partner ); }, // 去往升星 onTouchGoUpStar: function() { let cmp = nx.gui.getComponent( this.node.parent.parent.parent.parent, "", "cmp.partner.info.wnd" ); if( cmp ){ cmp.onTouchSingleUpStar( "star" ); } }, onTouchMax: function(){ let self = this; // 暂时只升级一次 let HC = HeroControl.getInstance(); if( HC && nx.dt.objNEmpty( this.partner ) ) { HC.sender11013( this.partner.id, ( _ret, _data ) =>{ if( !_ret ){ nx.tbox( _data ); return; } if( _data.result == 0 ){ if( nx.dt.strNEmpty( _data.msg ) ){ nx.tbox( _data.msg ); } } nx.gui.setActive( self, "uplevelmax", _data.result == 0 ); } ); } }, } );