536 lines
15 KiB
JavaScript
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, [
|
|
["LimitPrayFreshed3", 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( "LimitPrayTimes3" );
|
|
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( "LimitPrayRewards3" );
|
|
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;
|
|
},
|
|
|
|
} ); |