Files

882 lines
29 KiB
JavaScript
Raw Permalink Normal View History

2026-05-23 22:10:14 +08:00
/******************************************************************
*
* 僚机装配
*
******************************************************************/
const BridgeWindow = require( "bridge.window" );
const HeroController = require( "hero_controller" );
const BackpackController = require( "backpack_controller" );
const BackPackConst = require( "backpack_const" );
const FxSVC = require( "nx.fx.sv.expand" );
const ElfinEvent = require( "elfin_event" );
const ElfinController = require( "elfin_controller" );
const ItemBase = require( "cmp.item.base" );
cc.Class( {
extends: BridgeWindow,
properties: {
defaultScheme : {
default: [],
type : cc.Node,
displayName: "默认",
},
svcschemeList : {
default: null,
type : FxSVC,
displayName: "方案列表",
},
svcwingsList : {
default: null,
type : FxSVC,
displayName: "僚机列表",
},
skill: {
default: null,
type : cc.Node,
displayName: "技能展示",
},
buy : {
default: null,
type : cc.Node,
displayName: "解锁按钮",
}
},
onLoad: function() {
this.bindGEvent( ElfinEvent.Elfin_Plan_Info_Event, this.freshSchemeList.bind( this) );
this.bindGEvent( ElfinEvent.Elfin_Plan_Update_Event, this.freshSchemeItem.bind( this) );
this.bindGEvent( ElfinEvent.Elfin_Plan_From_Info_Event, this.freshDefaultSchemeInfo.bind( this) );
this.type = 100;
this.team = 1;
this.select_wing = -1;
this.sid = -1;
this.defaultLst = [];
},
onEnable: function(){
// 视图监听
this.vbind( [
[ "ShowWingPos", this.onFocusSchemeChanged.bind( this ) ]
] );
},
// 重载:参数打开
onOpenConfigs: function( _params ) {
// this.schemes = [];
// 当前选择的僚机序号
this.select_pos = 0;
this.team = _params.team;
this.type = _params.type >= 0 ? _params.type : this.type ;
// console.log( _params.type + "当前的类型-------" + this.type );
if( _params.setting ){
this.default = _params.setting.cur_plan_data || this.default;
}
let Elfin = ElfinController.getInstance();
Elfin.send26556();
if( this.type != 100 ){
Elfin.send26555( this.type );
}
// 操作方案的当前所选的位置
// this.freshSchemeList();
},
// 重载:关闭前
onPreClosed: function() {
nx.bridge.vset( "ShowWingPos", null );
this.svcschemeList.rebuild( [] );
this.svcwingsList.rebuild( [] );
},
// 刷新所有的方案列表
freshSchemeList : function( _scheme ){
let ElfinCtl = ElfinController.getInstance();
let model = ElfinCtl.getModel();
// if( _scheme && _scheme.plan_list ){
// _scheme.plan_list.sort( Utils.tableLowerSorter( [ "id" ] ) )
// }
this.schemes = model.getAllPlanData() ;
// let formLst = model.getFormOn();
// console.log( "当前的上阵或者方案信息" + JSON.stringify( formLst ) );
this.defaultLst = [];
this.svcschemeList.rebuild( this.schemes );
// console.log( "当前的选择是" + this.select_pos );
// 处理默认方案
let defaultSchemeInfo = [];
if( this.default ){
defaultSchemeInfo = this.default.sprites;
}else{
defaultSchemeInfo = model.getDedefaultElfinInfo();
}
// console.log( JSON.stringify( _scheme ) + "当前的默认方案数据model" + JSON.stringify( defaultSchemeInfo ) );
let chd = this.defaultScheme;
for (let i = 0; i < defaultSchemeInfo.length; i++) {
let cmp = chd[i].getComponent( ItemBase );
if( cmp ){
if( i == 0 ){
cmp.onFocus();
}
cmp.setLocked( false );
cmp.setData( defaultSchemeInfo[i].item_bid );
if( defaultSchemeInfo[i].item_bid == 0 ){
this.defaultLst.push( defaultSchemeInfo[i].item_bid );
}else {
if( !nx.dt.arrMember( this.defaultLst, defaultSchemeInfo[i].item_bid) ){
this.defaultLst.push( defaultSchemeInfo[i].item_bid );
}
}
this.onFocusNod( 0 );
}
}
// 获取所有的僚机信息
let BC = BackpackController.getInstance();
let BCModel = BC.getModel();
let allElfins = BCModel.getAllBackPackArray(BackPackConst.item_sub_type.ELFIN);
allElfins.forEach( _elfin => {
if( nx.dt.arrMember( this.defaultLst, _elfin.base_id ) ){
_elfin.sortid = 1;
}else{
_elfin.sortid = 0;
}
} )
allElfins.sort( ( a, b ) =>{
return b.sortid - a.sortid ;
} )
// console.log( "当前的上阵僚机数据初始" + JSON.stringify( allElfins ) );
nx.gui.setActive( this.svcwingsList, "empty", nx.dt.arrEmpty( allElfins ) );
this.svcwingsList.rebuild( allElfins );
this.svcwingsList.cleanFocus();
// 引导辅助
if( nx.bridge.plot && nx.bridge.plot.isDoing() ) {
this.positionDoPlot();
}
// this.scheduleOnce( ()=>{
this.onFreshFocus();
// }, 0.1 );
// this.freshBuy();
},
onFreshFocus: function(){
let nodes = nx.gui.find( this.svcwingsList.bindSCV, "view/content" ).children;
// console.log( "当前的方案处理www" + JSON.stringify( this.defaultLst ) );
for (let i = 0; i < nodes.length; i++) {
let sitem = nodes[i];
if( sitem ){
let cmp = sitem.svItem;
// console.log( defaultSchemeInfo[0].item_bid + "当前的方案处理www" + Object.keys( sitem ) );
if( cmp ){
if( nx.dt.arrMember( this.defaultLst, cmp.mdata.base_id ) ){
this.svcwingsList.addFocus( i );
}else{
this.svcwingsList.removeFocus( i );
}
}
}
}
},
// 选中切换 僚机机库
onFocusChanged: function( _item ) {
let defaultSelect = this.defaultScheme[this.select_pos];
let cmp = defaultSelect.getComponent( ItemBase );
let fun = [];
if( cmp ){
if( _item.mdata.base_id == cmp.mdata ){
this.svcwingsList.removeFocus( _item.index );
let idx = this.defaultLst.indexOf( _item.mdata.base_id );
this.defaultLst[idx] = 0;
let data = nx.dt.objClone( _item.mdata ) || {};
data.base_id = 0;
this.freshWingInScheme( data );
}else{
this.unscheduleAllCallbacks();
if( nx.dt.arrMember( this.defaultLst, _item.mdata.base_id ) ){
let nodes = nx.gui.find( this.svcwingsList.bindSCV, "view/content" ).children;
// console.log( "当前的方案处理www" );
for (let i = 0; i < nodes.length; i++) {
let sitem = nodes[i];
if( sitem ){
let cmp = sitem.svItem;
// console.log( defaultSchemeInfo[0].item_bid + "当前的方案处理www" + Object.keys( sitem ) );
if( cmp ){
if( cmp.mdata.base_id == _item.mdata.base_id ){
// if( nx.dt.arrMember( this.defaultLst, cmp.mdata.base_id ) ){
// this.svcwingsList.removeFocus( i );
for (let d = 0; d < this.defaultScheme.length; d++) {
let nod = this.defaultScheme[d];
let dcmp = nod.getComponent( ItemBase );
if( dcmp ){
if( dcmp.mdata == _item.mdata.base_id ){
dcmp.setData( 0 );
let idx = this.defaultLst.indexOf( _item.mdata.base_id );
this.defaultLst[idx] = 0;
this.svcwingsList.removeFocus( _item.index );
this.onFocusNod( d );
// this.freshSkillDesc( _item.index ,_item.mdata );
// this.defaultLst = this.svcwingsList.focusList;
return;
}
}
}
// }
}
}
}
}
}
this.svcwingsList.addFocus( _item.index );
this.defaultLst[this.select_pos] = _item.mdata.base_id;
// this.freshSkillDesc( _item.index ,_item.mdata );
this.freshWingInScheme( _item.mdata );
for (let d = 0; d < this.defaultScheme.length; d++) {
let nod = this.defaultScheme[d];
let dcmp = nod.getComponent( ItemBase );
if( dcmp ){
if( dcmp.mdata && typeof( dcmp.mdata ) != "number" ){
fun.push( ()=>{
this.onFocusNod( d );
} )
break;
}
}
}
if( nx.dt.arrNEmpty( fun ) ){
this.scheduleOnce( fun[0], 0.3 );
}
}
}
},
// 选中切择pos 默认操作方案 取消可以下阵僚机的操作
onFocusNod: function( _index ) {
this.sid = -1;
this.freshOtherSchemeFocus();
for (let i = 0; i < this.defaultScheme.length; i++) {
let selectNode = this.defaultScheme[i];
let cmp = selectNode.getComponent( ItemBase );
if( cmp ){
if( _index == i ){
if( !cmp.mdata ){
nx.tbox( nx.text.format( "FortressLevel_Unlocked", i ) );
this.defaultScheme[this.select_pos].getComponent( ItemBase ).onFocus();
return;
}else{
cmp.onFocus();
this.select_pos = _index;
// console.log( this.select_pos + "当前的数据节点" + JSON.stringify( cmp.mdata ) );
if( !nx.dt.objGood( cmp.mdata ) ){
this.freshSkillDesc( cmp.mdata );
// this.onFocusChanged( data );
}else{
this.freshSkillDesc( 0 );
}
}
}else{
cmp.outFocus();
}
}
}
},
// 选中切换 僚机方案
onFocusSchemeChanged: function( _item ) {
this.unscheduleAllCallbacks();
if( !_item ){
return;
}
let snode = nx.gui.find( this.svcschemeList, "view/content" );
// console.log( JSON.stringify( _item ) + "当前的默认方案配置" + snode );
if( snode ){
let nodes = snode.children;
// console.log( JSON.stringify( schemes ) + "当前的默认方案配置" + JSON.stringify( defaultSchemeInfo ) );
let dealui = function( _index, _node ){
let ElfinCtl = ElfinController.getInstance();
let model = ElfinCtl.getModel();
let defaultSchemeInfo = model.getDedefaultElfinInfo();
let schemes = model.getAllPlanData() ;
if( schemes[_index] ){
schemes[_index].plan_sprites = defaultSchemeInfo;
_node.rebind( _index, schemes[_index] );
self.scheduleOnce( () =>{
_node.onTouchSave( self.type, self.team );
}, 0.3 );
}
}
let self = this;
let selectNode = nodes[_item.index];
// console.log( JSON.stringify( this.defaultLst ) +"当前预设方案的数据" + JSON.stringify( _item ) );
if( selectNode ){
if( nx.dt.arrCompare( this.defaultLst,_item.lst ) ){
if( selectNode.svItem ){
selectNode.svItem.onTouchSave( self.type, self.team );
}
}else{
nx.mbox( "ASSAskConfirm", ['yes'], ( _key, _box ) => {
_box.close();
if( _key == 'yes' ) {
self.onTouchSave();
self.scheduleOnce( ()=>{
dealui( _item.index, selectNode.svItem );
}, 0.6 );
}
} );
}
}
}
},
// 处理 点击方案列表,点击选择僚机,僚机放置到对应的方案中
freshWingInScheme: function( _wing ){
let EC = ElfinController.getInstance();
let model = EC.getModel();
let schemes = model.getAllPlanData();
if( this.sid < 0 ){
let defaultSchemeInfo = model.getDedefaultElfinInfo();
let scheme = nx.dt.objClone( defaultSchemeInfo );
if( scheme ){
if( scheme[this.select_pos] ){
scheme[this.select_pos].item_bid = _wing.base_id;
this.freshDefaultScheme( scheme );
}else{
nx.tbox( "locked" );
let cmp = this.defaultScheme[this.select_pos].getComponent( ItemBase );
if( cmp )
{
cmp.onFocus();
return;
}
}
}
}else{
// console.log( "当前的方案处理" );
return;
}
},
// 刷新默认方案
freshDefaultSchemeInfo : function( _schemeitem ){
/*****
* [26555]:{"type":0,"team_list":[{"team":1,"sprites":[{"pos":3,"item_bid":113005},{"pos":2,"item_bid":113007},{"pos":1,"item_bid":113008}],"plan_id":0}]}
*/
this.unscheduleAllCallbacks();
if( ! nx.dt.arrEmpty( _schemeitem.team_list ) ){
_schemeitem.team_list.sort( Utils.tableLowerSorter( [ "team" ] ) )
let self = this;
// this.defaultLst = [];
let team = _schemeitem.team_list[0];
let sprites = team.sprites;
sprites.sort( Utils.tableLowerSorter( [ "pos" ] ) );
if( team.plan_id == 0 ){
for (let i = 0; i < sprites.length; i++) {
let selectNode = this.defaultScheme[i];
let cmp = selectNode.getComponent( ItemBase );
if( cmp ){
cmp.setData( sprites[i].item_bid );
this.defaultLst[i] = sprites[i].item_bid;
if( i == this.select_pos ){
cmp.onFocus();
// this.freshSkillDesc( cmp.mdata.item_bid );
}else{
cmp.outFocus();
}
}
}
this.scheduleOnce( () => {
self.onFreshFocus();
}, 0.1 );
}
}
},
// 刷新单个方案只可以操作默认的方案
freshDefaultScheme : function( _schemeitem ){
this.unscheduleAllCallbacks();
this.freshDefaultSchemeFocus();
let selectNode = this.defaultScheme[this.select_pos];
let cmp = selectNode.getComponent( ItemBase );
if( cmp ){
// this.defaultLst[this.select_pos] = _schemeitem[this.select_pos].item_bid ;
cmp.setData( _schemeitem[this.select_pos].item_bid );
cmp.onFocus();
// 切换节点 控制技能说明
this.onFocusNod( this.select_pos );
}
this.scheduleOnce( () => {
this.onFreshFocus();
}, 0.1 );
// console.log( JSON.stringify( _schemeitem ) + "当前的上阵僚机数据" + JSON.stringify( this.defaultLst ) );
},
// 取消默认的聚焦
freshDefaultSchemeFocus : function( ){
for (let i = 0; i < this.defaultScheme.length; i++) {
let item = this.defaultScheme[i];
if( item ){
let cmp = item.getComponent( ItemBase );
if( cmp ){
cmp.outFocus();
}
}
}
},
// 取消生成的动态显示的方案的聚焦
freshOtherSchemeFocus : function( ){
let nodes = nx.gui.find( this.svcschemeList, "view/content" ).children;
// console.log( "当前的方案处理www" );
for (let i = 0; i < nodes.length; i++) {
if( nodes[i].svItem ){
let chd = nodes[i].svItem.sinfo;
for (let j = 0; j < chd.length; j++) {
let sitem = chd[j];
let cmp = sitem.getComponent( ItemBase );
if( cmp ){
cmp.outFocus();
}
}
}
}
},
// 刷新单个方案
freshSchemeItem : function( _schemeitem ){
let index = _schemeitem.id;
let i = index - 1;
let ElfinCtl = ElfinController.getInstance();
let model = ElfinCtl.getModel();
// let formLst = model.getFormOn();
// console.log( "当前的上阵或者方案信息" + JSON.stringify( formLst ) );
let defaultSchemeInfo = model.getDedefaultElfinInfo();
let dsprites = nx.dt.objClone( defaultSchemeInfo );
// "plan_sprites":[{"pos":1,"item_bid":113008},{"pos":2,"item_bid":113007}]}
dsprites.forEach( _sprite => {
if( _sprite.item_bid > 0 ){
_sprite.item_bid = 0;
}
} )
let plan_sprites = _schemeitem.plan_sprites;
_schemeitem.plan_sprites = nx.dt.arrEmpty( _schemeitem.plan_sprites ) ? dsprites : _schemeitem.plan_sprites;
let node = nx.gui.find( this.svcschemeList, "view/content" );
let item = node.children[i];
if( item.svItem ){
item.svItem.rebind( i, _schemeitem );
}
// 在新增方案的时候刷新列表显示,目的是刷新可以新增的相关
if( nx.dt.arrEmpty( plan_sprites ) ) {
this.freshSchemeList();
}
// this.freshSchemeList();
},
// 刷新技能介绍
freshSkillDesc : function( _mdata ){
if( _mdata == 0 ){
let cmp = this.skill.getComponent( "cmp.skill.base" );
if( cmp ){
cmp.setData( {} );
}
nx.gui.setActive( this.skill, "type/title", false );
nx.gui.setActive( this.skill, "type/txt", false );
nx.gui.setStringRich( this.skill, "skill/desc/cd", "" );
return;
}
let key = _mdata;
let sfg = gdata( "sprite_data","data_elfin_data", key );
let sfgc = game.configs.sprite_data.data_elfin_data[key];
let cmp = this.skill.getComponent( "cmp.skill.base" );
let ifg = gdata( "item_data","data_unit9", key );
nx.gui.setString( this.skill, "type/txt", nx.text.getKey( ifg.use_desc ) );
if ( sfgc ) {
let sfgs = gskilldata( 'data_get_skill', sfg.skill );
// let txt = nx.text.format( "SkillCD2", sfgs.cd );
let desc = nx.text.format( "CD", sfgs.cd, ( parseInt(this.select_pos ) + 1) );
// console.log( "des说明" + desc );
nx.gui.setStringRich( this.skill, "skill/desc/cd", desc );
nx.gui.setActive( this.skill, "type/txt", true );
nx.gui.setActive( this.skill, "type/title", true );
if( cmp ){
cmp.setData( sfg.skill );
}
}else{
if( cmp ){
cmp.setData( {} );
nx.gui.setStringRich( this.skill, "skill/desc/cd", "" );
}
}
},
// 刷新购买按钮
freshBuy :function(){
// if( )
let allIds = [];
this.schemes.forEach( _sch => {
if( _sch.id != 9 ){
allIds.push( _sch );
}
} )
let key = this.schemes.length;
let key2 = allIds.length;
let maxCount = game.configs.sprite_data.data_elfin_plan_length;
let need = gdata( "sprite_data","data_elfin_plan", key );
nx.gui.setString( this.buy, "txt", key2 < maxCount ? need.expend[0][1] : 0 );
nx.gui.setActive( this.buy, "", key2 < maxCount );
},
// 购买方案
onTouchAdd : function(){
let key = this.schemes.length;
let EC = ElfinController.getInstance();
let pfg = game.configs.sprite_data.data_elfin_plan[ key ];
let have = BackpackController.getInstance().getModel().getItemNumByBid( pfg.expend[0][0] );
let need = pfg.expend[0][1];
// 不足弹出提示
if( have < need ){
nx.tbox( nx.text.getKey( "elfin_hatch_unlock_5" ) );
return;
}
let mat0 = pfg.expend[0][0];
let txt = nx.text.format( "lab_heaven_msg_tips_19n", need, key );
EC.openElfUseTipsWindow( true , txt, [mat0], [ need ], ( _deal =>{
EC.send26562( key );
EC.openElfUseTipsWindow( false );
} ) );
},
// 保存当前的方案
onTouchSave : function(){
let show = [];
let cfg = gdata( "item_data", "data_unit9" );
let cfgs = game.configs.item_data.data_unit9;
let have = 0;
for (let i = 0; i < this.defaultLst.length; i++) {
let c = this.defaultLst[i];
let icon = gdata( "item_data", "data_unit9", c ).icon;
// console.log( "圖標顯示" + JSON.stringify( ) );
if( c > 0 && nx.dt.arrMember( show, icon ) ){
have++;
}else{
show.push( icon );
}
}
if( have > 0 ){
nx.tbox( "AssembleTip" );
return;
}
let ElfinCtl = ElfinController.getInstance();
let choice = [];
// console.log( "当前的类型wwwww-------" + this.type );
for (let i = 0; i < this.defaultScheme.length; i++) {
let selectNode = this.defaultScheme[i];
let cmp = selectNode.getComponent( ItemBase );
if( cmp ){
if( !nx.dt.objGood( cmp.mdata ) ){
let data = {};
data.pos = i + 1;
data.item_bid = nx.dt.objClone( cmp.mdata || -1 );
choice.push( data );
}else{
let data = {};
data.pos = i + 1;
data.item_bid = 0;
// console.log( "当前的pos2" + JSON.stringify( data ) );
choice.push( data );
}
}
}
for (let i = 0; i < choice.length; i++) {
if ( choice[i].item_bid < 0 ) {
choice.splice(i, 1); // 将使后面的元素依次前移,数组长度减1
i--; // 如果不减,将漏掉一个元素
}
}
// {"sprites":[{"pos":1,"item_bid":112002}]}
// {"sprites":[{"pos":1,"item_bid":112001}]}
// console.log( "当前方案信息" + JSON.stringify( choice ) );
if( this.type == 100 || this.type == 0 ){
ElfinCtl.sender26514( choice, this.type == 100 );
}else{
/********_type, sprites, team, flag, only_save */
ElfinCtl.send26560( this.type, choice, this.team );
}
},
dealSame : function( _lst ){
let lst = _lst;
let same = false;
let count = 0;
for (let i = 0; i < lst.length; i++) {
let it = lst[i];
let itd = this.defaultLst[i];
if( it == itd ){
count++;
}
}
same = count >= lst.length;
return same;
},
// 返回主场景
onBackToMain: function(){
this.unscheduleAllCallbacks();
let HR = HeroController.getInstance();
let EC = ElfinController.getInstance();
let lst = this.dealResult();
const BC = BackpackController.getInstance();
// if( BC ) {
// }
if( this.type == 100 ){
// console.log( this.type + "类型" + JSON.stringify( lst ) + "当前的默认方案数据" + JSON.stringify( this.defaultLst ) );
if( !this.dealSame( lst ) ){
nx.mbox( "ASSAskConfirmBack", ['yes'], ( _key, _box ) => {
_box.close();
if( _key == 'yes' ) {
this.onTouchSave();
this.scheduleOnce( () =>{
BC.openMainWindow( false );
HR.openHeroMainInfoWindow( false );
HR.openHeroBagWindow( false );
EC.openElfinAdjustWindow( false );
}, 0.6 );
}
} );
}else{
BC.openMainWindow( false );
HR.openHeroMainInfoWindow( false );
HR.openHeroBagWindow( false );
EC.openElfinAdjustWindow( false );
}
}else{
BC.openMainWindow( false );
HR.openHeroMainInfoWindow( false );
HR.openHeroBagWindow( false );
EC.openElfinAdjustWindow( false );
}
},
dealResult: function(){
let ElfinCtl = ElfinController.getInstance();
let model = ElfinCtl.getModel();
let defaultSchemeInfo = model.getDedefaultElfinInfo();
let lst = [];
for (let i = 0; i < defaultSchemeInfo.length; i++) {
lst.push( defaultSchemeInfo[i].item_bid );
}
return lst;
},
closeSelf: function(){
this.unscheduleAllCallbacks();
let lst = this.dealResult();
if( this.type == 100 ){
if( !this.dealSame( lst ) ){
nx.mbox( "ASSAskConfirmBack", ['yes'], ( _key, _box ) => {
_box.close();
if( _key == 'yes' ) {
this.onTouchSave();
this.scheduleOnce( () =>{
this.close();
}, 0.3 );
}
} );
}else{
this.close();
}
}else{
this.close();
}
},
// ============================================
// 引导辅助
// ============================================
// 定位可以操作的
positionDoPlot: function() {
let node = null;
let chd = nx.gui.find( this.svcwingsList.bindSCV, "view/content" ).children;
node = chd[ 0 ];
// let node = null;
// let children = this.svcList.bindSCV.content.children;
// for( let i = 0; i < children.length; ++i ) {
// let temp = children[ i ];
// if( temp.svItem && temp.svItem.mdata && temp.svItem.mdata.bid == 20401 ) {
// node = temp;
// break;
// }
// }
if( !node ) {
nx.error( "$ParterPage:定位特定英雄失败!" );
node = chd[ 0 ];
if( !node ) {
return;
}
}
let cell = nx.gui.find( this, "plot" );
let pos = node.convertToWorldSpaceAR( cc.Vec2.ZERO );
cell.position = cell.parent.convertToNodeSpaceAR( pos );
cell.width = node.width;
cell.height = node.height;
cell.mdata = node.svItem.mdata;
},
} );