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

657 lines
25 KiB
JavaScript

/******************************************************************
*
* 联盟天赋
*
******************************************************************/
const Toggle = require( "nx.fx.togs" );
const BridgeWindow = require( "bridge.window" );
const GuildskillController = require( "guildskill_controller" );
const GuildskillEvent = require( "guildskill_event" );
const GuildConst = require( "guild_const" );
const BackpackController = require( "backpack_controller" );
const SkillBase = require( "cmp.skill.base" );
const paths = {
40002 : "res_p2",
40001 : "res_p1",
30002 : "res_p2",
30001 : "res_p1",
20002 : "dam2",
20001 : "dam1",
10002 : "dam2",
10001 : "dam1",
}
cc.Class( {
extends: BridgeWindow,
properties: {
nodMenu: { default: null, type: Toggle },
nodModel: { default: null, type: Toggle },
nodInfo: { default: null, type: cc.Node },
nodShow: { default: null, type: cc.Node },
nodLock: { default: null, type: cc.Node },
nodPvpAttr: { default: [], type: cc.Node },
},
onLoad: function(){
this.bindGEvent( GuildskillEvent.UpdateSkilUpgradeEvent, this.freshSkill.bind( this ));
this.bindGEvent( GuildskillEvent.UpdateGuildSkillEvent, this.freshSkill.bind( this ));
this.bindGEvent( GuildskillEvent.UpdateSkillStatusEvent, this.freshSkill.bind( this ));
this.bindGEvent( GuildskillEvent.Guild_Pvp_Career_Info_Event, this.freshUpGrade.bind( this ));
// this.bindGEvent( GuildskillEvent.Guild_Pvp_Career_Info_Event, this.freshSkill.bind( this ) );
this.nodMenu.posTog = this.onTogMenu.bind( this );
this.nodModel.posTog = this.onTogModel.bind( this );
},
// 重载:参数打开
onOpenConfigs: function( _params ) {
this.nodMenu.togTo( 0 );
// this.nodModel.togTo( 1 );
this.activeMenu( 2 );
// this.activeModel( GuildConst.guildAttrType.PVE );
},
// 商城切换
onTogMenu: function( _index ) {
this.activeMenu( parseInt( _index ) + 2 );
},
// 模式切换
onTogModel: function( _index ) {
this.activeModel( parseInt( _index ) + 1 );
},
// 模式切換 pve pvp 需要刷新數據
activeModel: function( _index ) {
let model = _index;
nx.gui.setActive( this.nodLock, "", nx.dt.arrEmpty( this.PVPSkills.attr_formation ) );
nx.gui.setActive( this.nodShow, "pvp", model == GuildConst.guildAttrType.PVP );
nx.gui.setActive( this.nodShow, "pve", model == GuildConst.guildAttrType.PVE );
model == GuildConst.guildAttrType.PVP ? this.freshPvpAttr() : this.freshProps();
},
// 激活菜单 职业选择 切換職業 刷數據
activeMenu: function( _index ) {
this.career = _index;
let GS = GuildskillController.getInstance();
let model = GS.getModel();
this.select = 0;
this.PVPSkills = model.getPvpskillInfoByCareer( this.career );
// 默認顯示控制 pve ? pvp
if( nx.dt.arrEmpty( this.PVPSkills.attr_formation ) ){
this.nodModel.togTo( 1 );
this.activeModel( GuildConst.guildAttrType.PVE );
}else{
this.nodModel.togTo( 0 );
this.activeModel( GuildConst.guildAttrType.PVP );
}
let skills = model.getCareerSkillInfo( this.career );
if( nx.dt.objEmpty( skills ) ){
GS.requestCareerSkillInfo( this.career );
return;
}
// this.skills = skills;
this.freshSkill();
},
// 刷新属性相关 pve相關
freshProps: function( ){
if( !this.skills ){
return;
}
nx.gui.setActive( this.nodInfo, "cnt/pvp_tip", false );
nx.gui.setActive( this.nodInfo, "cnt/ops/reset", false );
let results = [];
let val = this.skills.group_ids;
let cfgs = game.configs.guild_skill_data;
if( nx.dt.arrEmpty( val ) ){
val = [0,0,0,0,0,0];
this.base = cfgs.data_info_group[this.skills.group_id];
}else{
// 處理需要叠加計算的數據相關
let lst = [];
let attrs = [];
results = [];
let seq = [0,0,0,0,0,0];
// 获取所有的 需要处理的属性总
let dealVal = function( _data ){
let attr_list = "";
let dealResult = function( _itemd ){
attr_list = cfgs.data_info[_itemd.id].attr_list[0][0];
seq[_itemd.seq -1] += cfgs.data_info[_itemd.id].attr_list[0][1];
results[_itemd.seq -1 ] = [attr_list,seq[_itemd.seq -1], _itemd.id ];
};
lst.forEach( _item => {
if( _item.seq == 1 ){
dealResult( _item );
}
if( _item.seq == 2 ){
dealResult( _item );
}
if( _item.seq == 3 ){
dealResult( _item );
}
if( _item.seq == 4 ){
dealResult( _item );
}
if( _item.seq == 5 ){
dealResult( _item );
}
if( _item.seq == 6 ){
dealResult( _item );
}
} );
}
// 获取所有的 需要处理的属性总
let deal = function( _data ){
let gs = cfgs.data_info_group[_data];
attrs = nx.dt.objClone( gs[0] );
for (let j = 0; j < gs.length; j++) {
let g = gs[j];
lst.push( g );
}
}
for (let i = 0; i < this.skills.group_ids.length; i++) {
let d = this.skills.group_ids[i].group_id;
deal( d );
}
dealVal( lst );
}
let group_id = this.skills.group_id;
/**
* [23700]:{"career":2,"group_id":2001,"skill_ids":[{"skill_id":20011}],"group_ids":[]}
*/
let afg = game.configs.guild_skill_data.data_const;
let sfg = game.configs.guild_skill_data.data_group;
let dfg = game.configs.guild_skill_data.data_info;
let key = this.career + "_" + group_id;
// 显示的属性 读取相关配置信息
let attrs = afg["attr_show_" + ( this.career - 1 ) ].val;
// 非手动聚焦显示下一个要升级的技能
let next = 0;
this.skills.skill_ids.forEach( skill => {
if( skill.status > 0 ){
next++;
}
});
// 右上 显示相关的技能信息
let max = afg.max_lv;
// 操作及雜項顯示
this.freshOp( sfg, max, key, next );
if( next == this.skills.skill_ids.length ){
next = 0;
}
// 屬性相關
let cnode = nx.gui.find( this.nodShow, "pve/nod" ).children;
let chd = nx.gui.find( this.nodInfo, "cnt/props" ).children;
let nod_s = nx.gui.find( this.nodInfo, "top" );
// let cfg = game.configs.attr_data;
for (let i = 0; i < chd.length; i++) {
let clr = "";
// 右边属性 相关
let item = chd[i];
let nod = cnode[i];
if( nx.dt.arrEmpty( this.skills.group_ids ) ){
nx.bridge.attrs.setAttribute( item, [ attrs[i], val[i] ] );
nx.gui.setSpriteFrame( item, "iconsp", cc.path.join( "prefab/guild/icon/" + attrs[i] ) );
}else{
// 当升级了 天赋后显示
nx.bridge.attrs.setAttribute( item, [ results[i][0], results[i][1] ] );
nx.gui.setSpriteFrame( item, "iconsp", cc.path.join( "prefab/guild/icon/" + results[i][0] ) );
}
nx.gui.setString( nod, "level", dfg[this.skills.skill_ids[i].id].lev + "/" + afg.max_lv.val );
nx.gui.setActive( nod, "abg", next > i );
nx.gui.setActive( nod, "focus", next == i );
if( next == i ){
clr = new cc.Color().fromHEX( "#EAEDF2" );
if( nx.dt.arrEmpty( this.skills.group_ids ) ){
if( nx.dt.arrEmpty( this.PVPSkills.attr_formation ) ){
this.freshMat( nx.gui.find( this.nodInfo, "cnt/mat" ), dfg[this.base[i].id].loss );
}
nx.bridge.attrs.setAttribute( nod, [ attrs[i], val[i] ] );
nx.gui.setSpriteFrame( nod, "iconsp", ( "prefab/guild/icon/w" + attrs[i] ) );
nx.bridge.attrs.setAttribute( nod_s, [ attrs[i], val[i] ] );
nx.gui.setSpriteFrame( nod_s, "iconsp", ( "prefab/guild/icon/" + attrs[i] ) );
}else{
if( nx.dt.arrEmpty( this.PVPSkills.attr_formation ) ){
this.freshMat( nx.gui.find( this.nodInfo, "cnt/mat" ), dfg[this.skills.skill_ids[i].id].loss );
}
nx.bridge.attrs.setAttribute( nod, [ results[i][0], results[i][1] ] );
nx.gui.setSpriteFrame( nod, "iconsp", ( "prefab/guild/icon/w" + results[i][0] ) );
nx.bridge.attrs.setAttribute( nod_s, [ attrs[i], cfgs.data_info[results[i][2]].attr_list[0][1] ]);
nx.gui.setSpriteFrame( nod_s, "iconsp", ( "prefab/guild/icon/" + attrs[i] ) );
}
nx.gui.setString( nod_s, "add/lev", nx.text.format( "LvNumber", dfg[this.skills.skill_ids[i].id].lev ) );
nx.gui.setString( nod_s, "add/txt", dfg[this.skills.skill_ids[i].id].lev + 1 );
}else{
if( i < next ){
clr = new cc.Color().fromHEX( "#030303" );
nx.bridge.attrs.setAttribute( nod, [ attrs[i], val[i], i + 1 ] );
nx.gui.setSpriteFrame( nod, "iconsp", ( "prefab/guild/icon/" + attrs[i] ) );
}else{
clr = new cc.Color().fromHEX( "#EAEDF2" );
nx.bridge.attrs.setAttribute( nod, [ attrs[i], val[i], i + 1 ] );
nx.gui.setSpriteFrame( nod, "iconsp", ( "prefab/guild/icon/w" + attrs[i] ) );
}
}
nx.gui.setColor( nod, "level", clr );
nx.gui.setActive( item, "", true );
}
nx.gui.setActive( this.nodInfo, "cnt/mat", nx.dt.arrEmpty( this.PVPSkills.attr_formation ) );
nx.gui.setActive( this.nodInfo, "cnt/pve_tip", !nx.dt.arrEmpty( this.PVPSkills.attr_formation ) );
},
freshOp: function( _sfg, _max, _key, _next ){
let next = _next;
let key = _key;
let sfg = _sfg;
let max = _max;
let show_name = "";
if( sfg[key] ){
show_name = sfg[key].group_name;
// 操作刷新----
this.cb = ()=>{
let GS = GuildskillController.getInstance();
let sfg = game.configs.guild_skill_data.data_info_group;
// 取相应职业的属性升级序列
let skills = sfg[this.skills.group_id];
let count = 0;
this.skills.skill_ids.forEach( skill => {
if( skill.status > 0 ){
count++;
}
});
GS.requestActivitySkill( skills[count].id );
}
nx.gui.setActive( this.nodInfo, "cnt/ops/other/uplevel", sfg[key].group_seq < max.val || ( sfg[key].group_seq == max.val && next < this.skills.skill_ids.length ) );
nx.gui.setActive( this.nodInfo, "cnt/ops/other/upgrade", next == this.skills.skill_ids.length && sfg[key].group_seq == max.val && nx.dt.arrEmpty( this.PVPSkills.attr_formation ) );
}
// nx.gui.setActive( this.nodInfo, "cnt/ops", true );
nx.gui.setString( this.nodInfo, "top/name", show_name );
},
freshPvpAttr:function(){
//
/******
* {"career":4,"attr_formation":[
* {"id":30001,"lev":0},
* {"id":30002,"lev":0},
* {"id":30003,"lev":0},
* {"id":30004,"lev":0}
* ],"skill_id":0,"skill_lev":0}
*/
nx.gui.setActive( this.nodInfo, "cnt/pve_tip", false );
nx.gui.setActive( this.nodInfo, "cnt/pvp_tip", true );
this.unscheduleAllCallbacks();
let attr_form = this.PVPSkills.attr_formation;
let afg = game.configs.guild_skill_data.data_const;
let skills = [];
let chd = nx.gui.find( this.nodInfo, "cnt/props" ).children;
for (let i = 0; i < chd.length; i++) {
let dat = attr_form[i];
let item = chd[i];
if( !dat ){
nx.gui.setActive( item, "", false );
continue;
}
if( dat.lev > 0 ){
skills.push( dat );
}
let key = dat.id + "_" + dat.lev;
let cfg = gdata( "guild_skill_data", "data_pvp_attr_info", key );
let resspn = "";
if( dat.lev > 0 ){
resspn = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/" + cfg.client_attr[0][0] );
}else{
resspn = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/w" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/w" + cfg.client_attr[0][0] );
}
let ressp = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/" + cfg.client_attr[0][0] );
if( cfg ){
nx.bridge.attrs.setAttribute( this.nodPvpAttr[i], [ cfg.client_attr[0][0], cfg.client_attr[0][1], i +1 ] );
nx.gui.setSpriteFrame( this.nodPvpAttr[i], "iconsp", resspn );
nx.bridge.attrs.setAttribute( item, cfg.client_attr[0] );
nx.gui.setSpriteFrame( item, "iconsp", ressp );
}
nx.gui.setActive( item, "", true );
nx.gui.setActive( this.nodPvpAttr[i], "abg", dat.lev > 0 );
nx.gui.setString( this.nodPvpAttr[i], "level", dat.lev + "/" + afg.max_lv.val );
}
nx.gui.setActive( this.nodInfo, "cnt/ops/reset", !nx.dt.arrEmpty( skills ) );
nx.gui.setActive( this.nodInfo, "cnt/ops/other/uplevel", true );
nx.gui.setActive( this.nodInfo, "cnt/ops/other/upgrade", false );
let skill_nod = nx.gui.find( this.nodShow, "pvp/skill" );
let cmp = skill_nod.getComponent( SkillBase );
if( cmp ){
cmp.setData( this.PVPSkills.skill_id );
nx.gui.setActive( skill_nod, "lock", this.PVPSkills.skill_id == 0 );
nx.gui.setString( skill_nod, "lev/lev", nx.text.format( "LvNumber",this.PVPSkills.skill_lev ) );
nx.gui.setActive( skill_nod, "lev", this.PVPSkills.skill_id != 0 );
}
this.scheduleOnce( ()=>{
this.onTouchPVPAttr( this.select );
}, 0.01 );
},
freshMat: function( _nod, _mat ){
nx.gui.setActive( this.nodInfo, "cnt/mat", true );
// 刷新材料显示
let nod = _nod;
let mats = _mat;
if( mats ){
let chd = nod.children;
let model = BackpackController.getInstance().getModel();
for (let i = 0; i < chd.length; i++) {
let item = chd[i];
let mat = mats[i];
if( !mat || nx.dt.arrEmpty( mat ) ){
nx.gui.setActive( item, "", false );
continue;
}
nx.gui.setActive( item, "", true );
nx.bridge.setIconS( item, "icon", mat[0] );
let have = model.getItemNumByBid( mat[0] );
let str = mat[1];
let clr = ( have >= mat[1] ) ? cc.Color.WHITE : cc.Color.WHITE;
nx.gui.setString( item, "txt", str );
nx.gui.setColor( item, "txt", clr );
}
}
},
freshSkill: function(){
let GS = GuildskillController.getInstance();
let model = GS.getModel();
this.skills = model.getCareerSkillInfo( this.career );
this.PVPSkills = model.getPvpskillInfoByCareer( this.career );
nx.dt.arrEmpty( this.PVPSkills.attr_formation) ? this.freshProps() : this.freshPvpAttr();
},
// 突破后顯示變化 取消pvp的鎖定狀態
freshUpGrade: function(){
let GS = GuildskillController.getInstance();
let model = GS.getModel();
this.PVPSkills = model.getPvpskillInfoByCareer( this.career );
nx.gui.setActive( this.nodInfo, "cnt/mat", false );
nx.gui.setActive( this.nodLock, "", false );
nx.gui.setActive( this.nodInfo, "cnt/ops/other/upgrade", false );
this.nodModel.togTo( 0 );
this.activeModel( GuildConst.guildAttrType.PVP );
},
onTouchLock: function(){
let afg = game.configs.guild_skill_data.data_const;
let max = afg.max_lv.val;
nx.tbox( nx.text.format( "GuildSkillPvpTip", max ) );
return;
},
// 点击升级
onTouchUpLev: function(){
nx.dt.fnInvoke( this.cb );
},
// 突破
onTouchBreak: function(){
let GS = GuildskillController.getInstance();
if( GS ){
GS.send23706( this.career );
}
},
// 重置 天赋属性
onTouchReset: function(){
let total_lev = 0;
let GS = GuildskillController.getInstance();
let model = GS.getModel();
let is_first = model.isPvpFisrtReset();
let ress = [];
let attr = this.PVPSkills.attr_formation[0];
let ak = attr.id + "_" + attr.lev;
let sg = gdata( "guild_skill_data", "data_pvp_attr_info", ak );
for (let i = 0; i < sg.return_res.length; i++) {
const it = nx.dt.objClone( sg.return_res[i] );
it[1] = 0;
ress.push( it );
}
this.PVPSkills.attr_formation.forEach( item => {
if( item.lev > 0 ){
total_lev += item.lev;
let key = item.id + "_" + item.lev;
let sfg = gdata( "guild_skill_data", "data_pvp_attr_info", key );
let res = sfg.return_res;
// console.log( item.id + "处理的属性数据" + JSON.stringify( sfg.return_res ) );
for (let i = 0; i < res.length; i++) {
let item = res[i];
let ritem = ress[i];
if( item[0] == ritem[0] ){
ritem[1] += item[1];
// console.log(item[1] + "当前所有的属性数值相关累加sssss" + JSON.stringify( item[0] ) + "SSS" + ritem[1] );
}
}
}
} )
// console.log( "当前所有的属性数值相关---->>>>" + JSON.stringify( ress ) );
let count = 0
if (is_first) {
count = 300
let config = game.configs.guild_skill_data.data_const.pvp_first_reset_consume
if (config) {
count = config.val
}
}else{
let reset_consume_var1 = 500
let config = game.configs.guild_skill_data.data_const.reset_consume_var1
if (config) {
reset_consume_var1 = config.val
}
let reset_consume_var2 = 15
let config2 = game.configs.guild_skill_data.data_const.reset_consume_var2
if (config2) {
reset_consume_var2 = config.val
}
// --本系技能總等級 * 係數2
let cost_count = total_lev * reset_consume_var2
count = Math.max(reset_consume_var1, cost_count)
}
let key = this.career + "_" + this.PVPSkills.skill_lev;
let sfg = gdata( "guild_skill_data", "data_pvp_skill_info", key );
let mfg = game.configs.guild_skill_data.data_const.first_reset_consume;
for (let j = 0; j < sfg.return_res.length; j++) {
let ss = sfg.return_res[j];
let ritem = ress[j];
if( ss[0] == ritem[0] ){
ritem[1] += ss[1];
}
}
let info = {
first : is_first,
tip: is_first ? nx.text.format( "tip_guildTalent_reset", mfg.val ) : nx.text.format( "tip_guildTalent_resetn", count ),
res: ress,
career: this.career,
cb : ()=>{
let GS = GuildskillController.getInstance();
if( GS ){
GS.send23709( this.career );
}
}
}
nx.bridge.createPanel( "WndGuildTalentReset", info );
},
// 點擊 pvp技能 彈出彈窗
onTouchSkillIcon: function(){
let info = {
career : this.career,
lev : this.PVPSkills,
}
nx.bridge.createPanel( "WndGuildTalentSkillUplev", info );
},
// 點擊 pvp天賦
onTouchPVPAttr: function( _index ){
let gsd = game.configs.guild_skill_data.data_const.pvp_max_lv;
let max = gsd.val / 4;
let attr_form = this.PVPSkills.attr_formation;
let nod_s = nx.gui.find( this.nodInfo, "top" );
for (let i = 0; i < this.nodPvpAttr.length; i++) {
nx.gui.setActive( this.nodPvpAttr[i], "focus", i == _index );
let dat = attr_form[i];
let key = dat.id + "_" + dat.lev;
let cfg = gdata( "guild_skill_data", "data_pvp_attr_info", key );
let ressp = "";
let clr = "";
if( cfg ){
if( i == _index ){
this.select = _index;
// clr = new cc.Color().fromHEX( "#030303" );
nx.bridge.attrs.setAttribute( this.nodPvpAttr[i], cfg.client_attr[0] );
if( dat.lev > 0 ){
clr = new cc.Color().fromHEX( "#030303" );
ressp = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/" + cfg.client_attr[0][0] );
}else{
clr = new cc.Color().fromHEX( "EAEDF2" );
ressp = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/w" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/w" + cfg.client_attr[0][0] );
}
let ressps = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/" + cfg.client_attr[0][0] );
nx.bridge.attrs.setAttribute( nod_s, cfg.client_attr[0] );
nx.gui.setSpriteFrame( this.nodPvpAttr[i], "iconsp", ressp );
nx.gui.setSpriteFrame( nod_s, "iconsp", ressps );
nx.gui.setString( this.nodInfo, "top/name", cfg.desc + nx.text.format( "SLevel", cfg.lev ) );
nx.gui.setString( nod_s, "add/lev", nx.text.format( "LvNumber", cfg.lev ) );
nx.gui.setString( nod_s, "add/txt", cfg.lev + 1 );
nx.gui.setActive( this.nodInfo, "cnt/ops/other/uplevel", dat.lev != max );
this.freshMat( nx.gui.find( this.nodInfo, "cnt/mat" ), cfg.loss );
}else{
// clr = new cc.Color().fromHEX( "#EAEDF2" );
// let ressp = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/w" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/w" + cfg.client_attr[0][0] );
if( dat.lev > 0 ){
clr = new cc.Color().fromHEX( "#030303" );
ressp = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/" + cfg.client_attr[0][0] );
}else{
clr = new cc.Color().fromHEX( "EAEDF2" );
ressp = ( paths[dat.id] ) ? cc.path.join( "prefab/guild/icon/w" + paths[dat.id] ) : cc.path.join( "prefab/guild/icon/w" + cfg.client_attr[0][0] );
}
nx.bridge.attrs.setAttribute( this.nodPvpAttr[i], [ cfg.client_attr[0][0], cfg.client_attr[0][1], i+1 ] );
nx.gui.setSpriteFrame( this.nodPvpAttr[i], "iconsp", ressp );
}
nx.gui.setColor( this.nodPvpAttr[i], "level", clr );
}
}
this.cb = ()=>{
let GS = GuildskillController.getInstance();
GS.send23707( this.career, attr_form[_index].id );
}
},
} );