Files
fc/dev/project/assets/Scripts/mod/home/achievement/cmp.achievement.wnd.js
T

368 lines
9.8 KiB
JavaScript
Raw Normal View History

2026-05-23 22:10:14 +08:00
/******************************************************************
*
* 成就界面
*
******************************************************************/
const BridgeWindow = require( "bridge.window" );
const FxSVC = require( "nx.fx.sv.expand" );
const TaskConst = require( "task_const" );
const TaskEvent = require( "task_event" );
const TaskController = require( "task.mod" );
// 任务状态
const TST = TaskConst.task_status;
cc.Class( {
extends: BridgeWindow,
properties: {
nodMenu: { default: null, type: cc.Node },
nodOverview: { default: null, type: cc.Node },
svcList: { default: null, type: FxSVC },
},
// 显示
onEnable: function() {
// 模板初始化
this.menuT = nx.gui.find( this, "templates/menuT" );
if( this.menuT ) {
nx.gui.setActive( this.menuT, "list", false );
nx.gui.setActive( this.menuT, "head/on", false );
nx.gui.setActive( this.menuT, "head/off", true );
nx.gui.setActive( this.menuT, "head/off/tip", false );
nx.gui.setActive( this.menuT, "list/sub/on", false );
nx.gui.setActive( this.menuT, "list/sub/off", true );
}
// 字典重建
this.buildDict();
// 事件监听
this.bindGEvent( TaskEvent.UpdateFeatList, this.onUpdateAchievements.bind( this ) );
// 积分更新
this.updateScore();
},
// 关闭
onDisable: function() {
// 事件监听释放
this.unbindGEvents();
},
// 重载:关闭前
onPreClosed: function() {
this.svcList.rebuild( [] );
},
// 字典重建
buildDict: function() {
const TC = TaskController.getInstance();
this.dict = TC.getModel().getAchievementDict();
if( nx.dt.arrEmpty( this.dict ) ) {
this.nodMenu.removeAllChildren();
this.svcList.rebuild( [] );
nx.gui.setActive( this.svcList, "empty", true );
return;
}
// 一级菜单列表重建
this.buildMenu( this.nodMenu, this.dict );
// 默认选择
this.onTouchMenu( { data: this.dict[ 0 ] } );
},
// 创建一级菜单
buildMenu: function( _menu, _data ) {
nx.gui.gocChildren( _menu, "", _data.length, this.menuT );
for( let i = 0; i < _data.length; ++i ) {
let node = _menu.children[ i ];
let data = _data[ i ];
let name = nx.text.getKey( data.name );
nx.gui.setString( node, "head/on/txt", name );
nx.gui.setString( node, "head/off/txt", name );
data.ui = { node: node };
node.data = data;
}
},
// 创建二级菜单
buildSubMenu: function( _menu, _data ) {
let root = nx.gui.find( _menu, "list" );
let chds = root.children;
if( chds.length != _data.elements.length ) {
nx.gui.gocChildren( root, "", _data.elements.length, chds[ 0 ] );
}
for( let i = 0; i < chds.length; ++i ) {
let sub = chds[ i ];
let ifo = _data.elements[ i ];
ifo.ui = { node: root, sub: sub };
sub.data = ifo;
sub.root = root;
nx.gui.setActive( sub, "on", false );
nx.gui.setActive( sub, "off", true );
let name = nx.text.getKey( ifo.name );
nx.gui.setString( sub, "on/txt", name );
nx.gui.setString( sub, "off/txt", name );
}
// 红点更新
this.updateRedDots();
},
// 点击一级菜单
onTouchMenu: function( _item ) {
// 无效菜单
let data = _item.data || _item.parent.parent.data;
if( !data ) {
return;
}
this.mainKey = data.name;
this.subKey = "";
// 菜单选择
let self = this;
let focus = function( _menu, _on, _data ) {
nx.gui.setActive( _menu, "head/on", _on );
nx.gui.setActive( _menu, "head/off", !_on );
nx.gui.setActive( _menu, "list", _on );
if( !_on ) {
return;
}
// 子菜单展开
self.buildSubMenu( _menu, _data );
// 刷新成就列表
self.freshList( _data )
};
let chds = this.nodMenu.children;
for( let i = 0; i < chds.length; ++i ) {
let node = chds[ i ];
focus( node, ( node.data.name == data.name ), data );
}
},
// 点击二级菜单
onTouchSubMenu: function( _item ) {
// 无效菜单
let subMenu = _item ? _item.parent : null;
let root = subMenu ? subMenu.root : null;
let data = subMenu ? subMenu.data : null;
if( !root || !data ) {
return;
}
// 菜单选择
let focus = function( _node, _on ) {
nx.gui.setActive( _node, "on", _on );
nx.gui.setActive( _node, "off", !_on );
};
let chds = root.children;
for( let i = 0; i < chds.length; ++i ) {
let node = chds[ i ];
focus( node, ( node.data.name == data.name ), data );
}
this.subKey = data.name;
this.freshList( data );
},
// 刷新成就列表
freshList: function( _data ) {
// 空
if( nx.dt.objEmpty( _data ) ) {
this.data = [];
this.svcList.rebuild( [] );
nx.gui.setActive( this.svcList, "empty", true );
return;
}
// 成就统计
let records = [];
let concat = function( _item ) {
if( _item.deep == 1 ) {
for( let i = 0; i < _item.elements.length; ++i ) {
concat( _item.elements[ i ] );
}
} else {
records = records.concat( _item.elements );
}
};
concat( _data );
// 筛选
// let TM = TaskController.getInstance().getModel();
// for( let i in records ) {
// let rec = records[ i ];
// let task = TM.getAchievementById( rec.id );
// rec.task = task;
// rec.sortRP = task ? task.finish_sort : 999;
// }
// records.sort( Utils.tableLowerSorter( [ "sortRP", "id" ] ) );
// 筛选
this.data = [];
let TM = TaskController.getInstance().getModel();
for( let i in records ) {
let rec = records[ i ];
let task = TM.getAchievementById( rec.id );
if( !task ) { continue; }
rec.task = task;
rec.sortRP = task.finish_sort;
this.data.push( rec );
}
this.data.sort( Utils.tableLowerSorter( [ "sortRP", "id" ] ) );
this.svcList.rebuild( this.data );
nx.gui.setActive( this.svcList, "empty", nx.dt.arrEmpty( this.data ) );
},
// 更新成就的事件
onUpdateAchievements: function( _data ) {
// 积分更新
this.updateScore();
// 红点更新
this.updateRedDots();
// 成就会新增,这里直接刷新
let current = null;
for( let i in this.dict ) {
let dt = this.dict[ i ];
if( !dt || dt.name != this.mainKey ) {
continue;
}
current = dt;
if( nx.dt.strEmpty( this.subKey ) ) {
break;
}
for( let k in dt.elements ) {
let dt2 = dt.elements[ k ];
if( !dt2 || dt2.name != this.subKey ) {
continue;
}
current = dt2;
}
}
if( current ) {
this.freshList( current );
}
},
// 积分更新
updateScore: function() {
let TM = TaskController.getInstance().getModel();
let cur = TM.achievement_score || 0;
let tar = TM.achievement_score_tar || 100;
// 点数
nx.gui.setString( this.nodOverview, "point/cur", cur );
nx.gui.setString( this.nodOverview, "point/tar", nx.text.format( "AchivevePoint", tar ) );
// 进度
let prog = nx.gui.getComponent( this.nodOverview, "prog/progress", cc.ProgressBar );
prog.progress = Math.min( 1, cur / tar );
// 操作
nx.gui.setActive( this.nodOverview, "ops/once", cur >= tar );
},
// 总览奖励领取
onTouchOverviewReward: function() {
let TC = TaskController.getInstance();
TC.reqOverviewReward( ( _ret, _data ) => {
if( !_ret ) {
nx.tbox( _data );
return;
}
this.updateScore();
} );
},
// 红点更新
updateRedDots: function() {
let FLAGS = {};
let TM = TaskController.getInstance().getModel();
let list = TM.getAchievements();
for( let i = 0; i < list.length; ++i ) {
let tk = list[ i ];
if( tk && tk.finish == TST.finish && tk.config ) {
let k1 = tk.config.first_label;
let k2 = tk.config.name;
FLAGS[ k1 ] = 1;
FLAGS[ k1 + k2 ] = 1;
}
}
for( let i = 0; i < this.dict.length; ++i ) {
let menu = this.dict[ i ];
if( !menu ) {
continue;
}
nx.gui.setActive( menu.ui.node, "head/off/tip", !!FLAGS[ menu.name ] );
for( let k = 0; k < menu.elements.length; ++k ) {
let submenu = menu.elements[ k ];
if( submenu.ui && submenu.ui.sub ) {
nx.gui.setActive( submenu.ui.sub, "off/tip", !!FLAGS[ menu.name + submenu.name ] );
}
}
}
},
// 点击打开奖励预览
onTouchOpenRewardPreviewWindow: function() {
nx.bridge.createPanel( "WndAchievementRewards" );
},
} );