Files
2026-05-23 22:10:14 +08:00

543 lines
18 KiB
JavaScript

/******************************************************************
*
* 伙伴信息页 --- 升阶
*
******************************************************************/
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 );
} );
}
},
} );