Files
fc/dev/project/assets/Scripts/mod/personal/cmps/cmp.personal.figure.wnd.js
T
2026-05-23 22:10:14 +08:00

290 lines
7.7 KiB
JavaScript

/******************************************************************
*
* 形象设置
*
******************************************************************/
const BridgeWindow = require( "bridge.window" );
const RoleController = require( "role_controller" );
const FxTogs = require( "nx.fx.togs" );
const FxSVC = require( "nx.fx.sv.expand" );
// 菜单标签
const MenuTags = {
Partner: 0,
Skin: 1,
};
cc.Class( {
extends: BridgeWindow,
properties: {
togMenu: { default: null, type: FxTogs },
nodShow: { default: null, type: cc.Node },
lstPartners: { default: null, type: FxSVC },
},
// 重载:参数打开
onOpenConfigs: function( _params ) {
// 当前拥有
this.library = [];
this.idxPartner = -1;
this.use_id = _params.use_id || 0;
this.figures = _params.list || [];
// Tog监听
this.togMenu.posTog = this.onTogMenu.bind( this );
this.togMenu.togTo( MenuTags.Partner );
this.onTogMenu( MenuTags.Partner );
},
// 重载:关闭前
onPreClosed: function() {
this.lstPartners.rebuild( [] );
},
// 等级切换
onTogMenu: function( _index ) {
this.tagMenu = _index;
// 重置
this.idxPartner = -1;
this.partners = this.queryFigureList( this.tagMenu );
this.lstPartners.rebuild( this.partners );
// 聚焦
this.lstPartners.cleanFocus();
this.scheduleOnce( () => {
this.setUsedPartner( this.use_id );
this.onPartnerChanged( {
index: 0,
mdata: this.partners[ 0 ],
} );
}, 0.1 );
},
// 设置展示角色
setCurrent: function( _info ) {
// 置空
if( nx.dt.objEmpty( _info ) ) {
nx.gui.setActive( this.nodShow, "show", false );
nx.gui.setActive( this.nodShow, "cond", false );
nx.gui.setActive( this.nodShow, "props", false );
return;
}
// 模型
nx.gui.setActive( this.nodShow, "show", true );
let model = nx.gui.getComponent( this.nodShow, "show", "nx.fx.spine" );
if( model ) {
let path = PathTool.getSpinePath( _info.model, _info.model, false );
model.load( path, ( _e ) => {
if( !_e ) {
model.action( "stand2", true );
} else {
model.stop();
}
} );
}
// 属性
let text = "FigureNoProps";
nx.gui.setActive( this.nodShow, "props", true );
if( nx.dt.arrNEmpty( _info.attr ) ) {
text = nx.bridge.attrs.strAttributes( _info.attr );
}
nx.gui.setString( this.nodShow, "props/txt", nx.text.getKey( text ) );
// 解锁
text = "FigureUnlocked";
nx.gui.setActive( this.nodShow, "cond", true );
if( !_info.unlock ) {
text = _info.tip;
}
nx.gui.setString( this.nodShow, "cond/txt", nx.text.getKey( text ) );
},
// ================================================================
// 伙伴相关
// ================================================================
// 设置当前使用的伙伴形象
setUsedPartner: function( _id ) {
this.use_id = _id;
let chds = this.lstPartners.bindSCV.content.children;
for( let i = 0; i < chds.length; ++i ) {
let node = chds[ i ];
if( node && node.svItem ) {
nx.gui.setActive( node.svItem, "used", node.svItem.mdata.id == _id );
}
}
},
// 选中切换
onPartnerChanged: function( _item ) {
// 空 / 当前使用中
if( !_item || !_item.mdata || ( _item.index == this.idxPartner ) ) {
return;
}
// 聚焦
this.lstPartners.cleanFocus();
this.lstPartners.addFocus( _item.index );
// 展示信息
this.idxPartner = _item.index;
this.setCurrent( _item.mdata );
// 操作刷新
let ok = _item.mdata.unlock && ( _item.mdata.id != this.use_id );
nx.gui.setLocked( this, "panel/confirm", !ok );
},
// 点击确认
onTouchConfirm: function() {
let partner = this.partners[ this.idxPartner ];
if( !partner ) {
return;
}
let RC = RoleController.getInstance();
RC.reqUseFigure( partner.id, ( _ret, _data ) => {
if( !_ret ) {
nx.tbox( _data );
return;
}
this.setUsedPartner( partner.id );
nx.gui.setLocked( this, "panel/confirm", true );
} );
},
// 获取形象列表
queryFigureList: function( _type ) {
// 统计全形象
if( nx.dt.arrEmpty( this.library ) ) {
this.library = [];
let LOOKS = game.configs.looks_data.data_data;
let SKINS = game.configs.partner_skin_data.data_skin_info;
for( let id in LOOKS ) {
let ifo = LOOKS[ id ];
let cfgs = game.configs.partner_data.data_partner_base[ ifo.partner_id ];
if( nx.dt.objEmpty( cfgs ) ) {
nx.error( "无效形象配置:", id );
continue;
}
let item = {
id: ifo.id,
icon: 0,
skin: ifo.skin_id,
name: ifo.name,
model: ifo.model,
partner: ifo.partner_id,
unlock: false,
tip: ifo.unlock_tip,
attr: ifo.attr,
};
// 如果是皮肤
if( nx.dt.numPositive( ifo.skin_id, false ) ) {
let sfo = SKINS[ ifo.skin_id ];
if( nx.dt.objNEmpty( sfo ) ) {
item.name = sfo.skin_name;
item.attr = sfo.skin_attr;
item.model = sfo.res_id;
item.icon = sfo.head_id;
item.tip = sfo.source_tip;
}
}
else {
let tf = gitemdata( cfgs.item_id );
if( tf ) {
item.icon = tf.icon;
}
}
this.library.push( item );
}
}
// 是否解锁
let self = this;
let isUnlocked = function( _id ) {
for( let i in self.figures ) {
let tm = self.figures[ i ];
if( tm && tm.id == _id ) {
return true;
}
}
return false;
};
// 重建
let partners = [];
for( let i = 0; i < this.library.length; ++i ) {
let partner = this.library[ i ];
partner.unlock = isUnlocked( partner.id );
// 有效皮肤列表
if( _type == MenuTags.Skin && partner.skin > 0 ) {
partners.push( partner );
continue;
}
// 有效伙伴列表
if( _type == MenuTags.Partner && partner.skin == 0 ) {
partners.push( partner );
continue;
}
}
// 排序
partners.sort( ( _p1, _p2 ) => {
// 聚焦首位
if( _p1.id == self.use_id || _p2.id == self.use_id ) {
return ( _p1.id == self.use_id ) ? -1 : 1;
}
// 解锁优先
if( _p1.unlock || _p2.unlock ) {
return _p1.unlock ? -1 : 1;
}
// ID排序
return _p1.id - _p2.id;
} );
return partners;
},
} );