Files
fc/dev/project/assets/Scripts/mod/acts/limitPray/cmp/cmp.act.limit.pray.js
T
2026-05-23 22:10:14 +08:00

536 lines
15 KiB
JavaScript

/******************************************************************
*
* 限定招募
*
******************************************************************/
const ActPage = require( "act.page.base" );
const NxSpine = require( "nx.fx.spine" );
const ItemLayout = require( "cmp.item.layout" );
const BridgeItemBinder = require( "bridge.binder.item.icon.count" );
const TipsController = require( "tips_controller" );
const FID = require( "bridge.function.ids" );
cc.Class( {
extends: ActPage,
properties: {
spRole: {default: null, type: NxSpine},
spMini: {default: null, type: NxSpine},
nodInfo: {default: null, type: cc.Node},
nodDate: {default: null, type: cc.Node},
tipTimes: {default: null, type: cc.Node},
nodCoin: {default: null, type: BridgeItemBinder},
nodScore: {default: null, type: BridgeItemBinder},
nodAvatars: {default: null, type: cc.Node},
nodOps: {default: null, type: cc.Node},
nodReward: {default: null, type: cc.Node},
nodTotal: {default: null, type: cc.Node},
tipCover: {default: null, type: cc.Node},
tipReward: {default: null, type: ItemLayout},
},
// 初始化
build: function( _data ) {
this._super( _data );
// 置空
if( !this.mod || nx.dt.objEmpty( this.data ) ) {
this.setEmpty();
return;
}
// 配置查询
this.configs = this.mod.queryConfigs();
if( !this.configs ) {
this.setEmpty();
return;
}
// 活动监听
this.mod.vbind( this, [
["LimitPrayFreshed", this.onFreshData.bind( this )],
] );
// 基本信息
this.freshBasic();
},
// 显示
onEnable: function() {
this.tipCover.active = false;
this.tipTimes.active = false;
// 刷新
if( this.mod ) {
this.mod.reqBaseData();
}
},
// 销毁
onDestroy: function() {
// 活动监听解除
if( this.mod ) {
this.mod.vunbind( this );
}
this._super();
},
// 置空
setEmpty: function() {
nx.gui.setActive( this, "right", false );
},
// 基本信息
freshBasic: function() {
// 置空
if( !this.mod || !this.configs || nx.dt.objEmpty( this.data ) ) {
this.setEmpty();
return;
}
// 背景刷新
let bg = cc.path.join( "resDB/bigs", this.configs.bg || "bg005" );
nx.gui.setSpriteFrame( this, "bg", bg );
nx.gui.setActive( this, "right", true );
// 标签刷新
let tags = cc.path.join( "locals/{lang}/images/prayer", this.configs.effect );
nx.gui.setSpriteFrame( this.nodInfo, "desc", nx.res.fmtPath( tags ) );
// 道具绑定
this.nodCoin.setID( this.configs.prop_id, () => {
this.freshOps();
} );
// 积分绑定
this.nodScore.setID( this.configs.point_id );
// 角色信息刷新
this.freshPartner( this.configs.partner_id );
// 配角信息刷新
this.freshOthers( this.configs.other_partner_id );
// 红点绑定
let tip1 = nx.gui.getComponent( this.nodOps, "once/tip", "nx.vb.visible" );
if( tip1 ) {
tip1.setTarget( nx.mTip, this.mod.getTipKey( "once" ) );
}
let tip2 = nx.gui.getComponent( this.nodOps, "ten/tip", "nx.vb.visible" );
if( tip2 ) {
tip2.setTarget( nx.mTip, this.mod.getTipKey( "ten" ) );
}
// 自选提示
let txt = nx.text.format( "自选提示", this.configs.min_num );
nx.gui.setString( this.nodTotal, "txt", txt );
// 剩余时间
let secs = this.mod.data.end_time - client.socket.getTime();
this.freshDate( secs );
},
// 刷新角色
freshPartner: function( _bid ) {
let dat = game.configs.partner_data.data_partner_base[_bid];
let scfgs = gdata( "partner_data", "data_partner_star", `${_bid}_${dat.init_star}` );
if( nx.dt.objEmpty( scfgs ) ) {
nx.error( "刷新角色失败,无效伙伴:", _bid );
return;
}
// 名字
nx.gui.setString( this.nodInfo, "base/name", nx.text.getKey( dat.name ) );
// 品质
let path = cc.path.join( "coms/images", "mk_partner_qa" + dat.quality );
nx.gui.setSpriteFrame( this.nodInfo, "qa", path );
// 阵营
path = cc.path.join( "prefab/partner/ui/camp" + dat.camp_type );
nx.gui.setSpriteFrame( this.nodInfo, "base/camp", path );
// 星级
path = cc.path.join( "coms/images/star" + dat.init_star );
nx.gui.setSpriteFrame( this.nodInfo, "stars", path );
// 角色动画
path = PathTool.getSpinePath( scfgs.res_id, "show", false );
this.spRole.load( path, ( _e ) => {
if( !_e ) {
this.spRole.action( "action1", true );
} else {
this.spRole.stop();
}
} );
// MINI动画
path = PathTool.getSpinePath( scfgs.res_id, scfgs.res_id, false );
this.spMini.load( path, ( _e ) => {
if( !_e ) {
this.spMini.action( "stand2", true );
} else {
this.spMini.stop();
}
} );
// 技能
let sknode = nx.gui.find( this.nodInfo, "skills" );
for( let i = 0; i < sknode.children.length; ++i ) {
// 技能数组[0]为普攻,直接忽略,最多4个技能
let item = sknode.children[i];
let sifo = scfgs.skills[i + 1];
if( !sifo ) {
item.active = false;
continue;
}
item.active = true;
let cmp = nx.gui.getComponent( item, "", "cmp.skill.base" );
if( cmp ) {
cmp.setData( sifo[1] );
}
}
},
// 配角信息刷新
freshOthers: function( _ids ) {
let ids = _ids || [];
for( let i = 0; i < this.nodAvatars.children.length; ++i ) {
let node = this.nodAvatars.children[i];
let id = ids[i] || 0;
if( id == 0 ) {
node.active = false;
continue;
}
let dat = game.configs.partner_data.data_partner_base[id];
if( nx.dt.objEmpty( dat ) ) {
nx.error( "刷新角色失败,无效伙伴:", id );
node.active = false;
continue;
}
node.pdata = dat;
node.active = true;
nx.bridge.setAvatarByFaceId( node, "mask/img", dat.item_id );
}
},
// 刷新活动日期
freshDate: function( _secs ) {
let time = nx.bridge.time.toNeedSeconds( _secs );
nx.gui.setString( this.nodDate, "txt", time );
},
// 信息刷新
onFreshData: function() {
// 累计
let times = this.mod.vget( "LimitPrayTimes" );
nx.gui.setString( this.nodTotal, "num", times );
// 自选剩余
if( times >= this.configs.max_num ) {
this.tipTimes.active = false;
} else {
this.tipTimes.active = true;
let loop = this.configs.min_num || 40;
let remains = loop - ( times % loop );
let txt = nx.text.format( "伙伴自选", remains );
nx.gui.setString( this.tipTimes, "txt", txt );
}
// 一轮结束的特殊判断
let prog = Math.floor( times % this.configs.min_num ) / this.configs.min_num;
if( times > 0 && ( times % this.configs.min_num ) == 0 ) {
if( this.mod.canReward() ) {
times -= 1;
prog = 1;
}
}
// 特殊:次数超过一轮并且有奖品
if( times >= this.configs.min_num && this.mod.canReward() ) {
prog = 1;
}
// 奖励统计
let items = this.mod.vget( "LimitPrayRewards" );
let limit1 = Math.floor( this.configs.max_num / this.configs.min_num ) - 1;
let limit2 = Math.floor( Math.max( 0, times ) / this.configs.min_num );
let limit = Math.min( limit1, limit2 );
let range = [limit * this.configs.min_num, ( limit + 1 ) * this.configs.min_num];
// let arr = [];
// items.forEach( _t => {
// if( _t.id > range[0] && _t.id <= range[1] ) {
// arr.push( _t );
// }
// } );
// arr.sort( ( _a, _b ) => {
// return _a.id - _b.id;
// } );
items.sort( ( _a, _b ) => {
return _a.id - _b.id;
} );
this.freshRewards( Math.min( 1, prog ), items );
},
// 刷新奖励
freshRewards: function( _progress, _list ) {
// 进度
let prog = nx.gui.getComponent( this.nodReward, "progress", cc.ProgressBar );
if( prog ) {
prog.progress = _progress;
}
let rewards = _list || [];
if( rewards.length != 5 ) {
nx.error( `限时祈愿奖励有误:${rewards.length}` );
return;
}
// 状态转动作
// status: 0-未完成,1-可领取,2-已领取
// action1 普通状态
// action2 可开启状态
// action3 开启过程,reword事件出获得道具
// action4 开完状态
let st2act = function( _st ) {
switch( _st ) {
case 0: return 'action1';
case 1: return 'action2';
case 2: return 'action4';
default: return 'action1';
}
};
// 单设
let self = this;
let single = function( _box, _time, _data ) {
// 次数
nx.gui.setString( _time, "num", _data.id );
// 宝箱
let cfgs = self.mod.queryReward( _data.id );
if( !cfgs ) {
return;
}
let act = st2act( _data.status );
let res = PathTool.getSpinePath( cfgs.res_id, "action", false );
let cmp = nx.gui.getComponent( _box, "", "nx.fx.spine" );
cmp.play( res, act, null, true );
_box.prayData = _data;
nx.gui.setActive( _box, "tip", _data.status == 1 );
}
for( let i = 0; i < rewards.length; ++i ) {
single(
nx.gui.find( this.nodReward, `boxes/b${i + 1}` ),
nx.gui.find( this.nodReward, `times/t${i + 1}` ),
rewards[i] );
}
},
// 变化信息
freshOps: function() {
// 置空
if( !this.mod || !this.configs || nx.dt.objEmpty( this.data ) ) {
return;
}
// 按钮设置
let autoOp = function( _node, _draw, _pt ) {
let tinfo = gitemdata( _draw[0] );
if( tinfo ) {
nx.bridge.setIcon( _node, "btn/list/icon", tinfo.icon );
nx.gui.setString( _node, "btn/list/num", _draw[1] );
}
let pinfo = gitemdata( _pt[0] );
if( pinfo ) {
nx.bridge.setIcon( _node, "score/infos/icon", pinfo.icon );
nx.gui.setString( _node, "score/infos/num", "x" + _pt[1] );
}
}
// 操作刷新
autoOp( nx.gui.find( this.nodOps, "once" ), this.configs.draw_one[0], this.configs.one_point_num[0] );
autoOp( nx.gui.find( this.nodOps, "ten" ), this.configs.draw_ten[0], this.configs.ten_point_num[0] );
},
// 点击单抽
onTouchOnce: function() {
if( !this.configs || !this.mod ) {
return;
}
this.mod.reqSummon( true, ( _ret, _msg, _code ) => {
// 道具不足
if( !_ret && _code == 101 ) {
nx.tbox( _msg );
this.onTouchCoin();
}
} );
},
// 点击十抽
onTouchTen: function() {
if( !this.configs || !this.mod ) {
return;
}
this.mod.reqSummon( false, ( _ret, _msg, _code ) => {
// 道具不足
if( !_ret && _code == 101 ) {
nx.tbox( _msg );
this.onTouchCoin();
}
} );
},
// 点击规则
onTouchRule: function() {
let rule = this.mod ? this.mod.queryRule() : "";
if( nx.dt.strNEmpty( rule ) ) {
const TC = TipsController.getInstance();
TC.showTextPanel( "tip", rule );
}
},
// 点击道具
onTouchCoin: function() {
if( this.actRoot && this.configs ) {
this.actRoot.jumpToMenu( this.configs.jump );
}
},
// 点击奖池
onTouchChi: function() {
let data = this.configs.award;
if( nx.dt.arrEmpty( data ) ) {
return;
}
let args = {
title: "奖池详情",
group:[],
};
let ids = [];
for( let i = 0; i < data[0].length; ++i ) {
ids.push( data[0][i][0] );
}
args.group.push( {
name:"限定奖池",
partners: ids
} );
let ids2 = [];
for( let i = 0; i < data[1].length; ++i ) {
ids2.push( data[1][i][0] );
}
args.group.push( {
name:"基础奖池",
partners: ids2
} );
nx.bridge.createPanel( "WndPartnerPool", args );
},
// 点击兑换
onTouchShop: function() {
nx.bridge.jumper.jump2Window( FID.PartnerPrayShops );
},
// 点击头像
onTouchAvatar: function( _btn ) {
let pdata = _btn ? _btn.pdata : null;
if( !pdata ) {
return;
}
let key = pdata.bid + "_" + pdata.init_star;
let propsData = gdata( "partner_data", "data_partner_show", key );
propsData.star = pdata.init_star;
propsData.break_lev = 0;
TipsController.getInstance().showPartnerTips( propsData );
},
// 点击宝箱
onTouchBox: function( _box ) {
let info = _box ? _box.prayData : null;
if( !info ) {
return;
}
// 详情
if( info.status != 1 ) {
let cfgs = this.mod.queryReward( info.id );
if( cfgs && nx.dt.arrNEmpty( cfgs.rewards ) ) {
this.tipCover.active = true;
this.tipReward.rebuild( cfgs.rewards );
let pos = _box.convertToWorldSpaceAR( cc.Vec2.ZERO );
pos = this.tipCover.convertToNodeSpaceAR( pos );
this.tipReward.node.y = pos.y;
}
return;
}
// 拆盒
// action3 开启过程,reword事件出获得道具
let cmp = nx.gui.getComponent( _box, "", "nx.fx.spine" );
if( cmp ) {
cmp.action( "action3", false, ( _event ) => {
// 音效
if( _event == 'reword' ) {
nx.audio.playSFX( "audios/effects/del", false );
}
// 完成
if( _event == 'complete' ) {
this.mod.reqReward();
}
} );
}
},
// 点击提示覆盖层
onTouchTipCover: function() {
this.tipCover.active = false;
},
} );