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

583 lines
16 KiB
JavaScript

/*******************************************************************************
*
* 活动管理
*
*
*
* 2023.06.25
******************************************************************************/
const BridgeController = require( "bridge.controller" );
const ActDefine = require( "acts.define" );
const ActManager = cc.Class( {
extends: BridgeController,
// 初始化配置数据
initConfig: function() {
// 插件
nx.plugin.add( this, [ "view" ] );
// 视图创建
this.vbuild( ActDefine.ViewActs );
// 全局支持
nx.bridge.acts = this;
},
// 注册监听事件
registerEvents: function() {
},
// 注册协议接受事件
registerProtocals: function() {
// 前端准备完毕
this.RegisterProtocal( 16600, this.onBaseData.bind( this ) );
// 活动基础信息
this.RegisterProtocal( 16603, this.handle16603.bind( this ) );
// 整点更新
this.RegisterProtocal( 16607, this.onFreshActs.bind( this ) );
// 奖励更新
this.RegisterProtocal( 16602, this.onFreshActsRewards.bind( this ) );
this.RegisterProtocal( 16606, this.onUpdateActsRewards.bind( this ) );
// 推送弹窗
this.RegisterProtocal( 16621, this.onPushPopup.bind( this ) );
this.RegisterProtocal( 16622, this.onPushPopupClose.bind( this ) );
// 活动引导
this.RegisterProtocal( 16623, this.onActGuide.bind( this ) );
this.RegisterProtocal( 16624, this.onActGuideDone.bind( this ) );
// 活动抽奖
this.RegisterProtocal( 31111, this.handle31111.bind( this ) );
},
// 从服务器初始化数据
reqBaseFromServer: function( _cb ) {
// 配置加载
let cfgs = [
"ad_show",
"login_popup_data"
];
this.vreset();
this.loadConfigs( cfgs, ( _ret, _data ) => {
this.reqBaseData( _cb );
} );
},
// ============================================================
// 基本数据
// ============================================================
// 请求基本数据
reqBaseData: function( _cb ) {
this.SendProtocal( 16600, {}, _cb );
},
// 基本数据
onBaseData: function( _data ) {
if( !this.isGoodData( _data ) ) {
return;
}
let themes = _data.holiday_theme_list;
themes.sort( ( _a, _b ) => {
return _a.sort - _b.sort;
} );
this.vset( "themes", themes, false );
// 活动模块更新
this.buildActMods();
// 重构提示链
this.buildTipsView();
// 奖励信息
this.reqActsRewards();
// 通知
this.vnotify( "themes" );
this.freshForeshow();
},
// 活动模块更新
buildActMods: function() {
let self = this;
let MODS = ActDefine.ActsMods;
let themes = this.vget( "themes" );
// 子活动统计
let ids = [];
let temp = {};
for( let i = 0; i < themes.length; ++i ) {
let theme = themes[ i ];
theme.theme_holiday_list.forEach( _t => {
ids.push( _t.camp_id );
temp[ _t.camp_id ] = nx.dt.objClone( _t );
} );
}
// 活动列表是否改变
if( nx.dt.objNEmpty( this.acts ) ) {
let ids2 = [];
for( let id in this.acts ) {
ids.push( parseInt( id ) );
}
// 如果活动发生了变化,则需要重建列表
ids.sort( ( _a, _b ) => { return _a - _b; } );
ids2.sort( ( _a, _b ) => { return _a - _b; } );
if( ids.toString() != ids2.toString() ) {
this.acts = {};
nx.debug( "$Acts:活动列表发生改变:" );
nx.debug( "$Acts:老:", ids2.toString() );
nx.debug( "$Acts:新:", ids.toString() );
}
}
// 列表重建
if( nx.dt.objEmpty( this.acts ) ) {
let push = function( _data ) {
let cfg = MODS[ _data.source ];
if( nx.dt.objEmpty( cfg ) ) {
nx.warn( "$Acts:无效活动:", _data.source );
return;
}
if( nx.dt.strNEmpty( cfg.mod ) ) {
let ref = require( cfg.mod );
let mod = ref.getInstance( _data.source, cfg.mod, true );
if( mod ) {
nx.debug( "$ActMods:" + cfg.mod );
mod.bindData( self, _data );
self.acts[ _data.camp_id ] = mod;
}
}
}
this.acts = {};
for( let i = 0; i < themes.length; ++i ) {
let theme = themes[ i ];
theme.theme_holiday_list.forEach( _t => {
_t.theme_id = theme.theme_id;
try {
push( _t );
} catch( e ) {
nx.error( "[异常]:" + ( e ? e.message + "\n" + e.stack : "未知错误!" ) );
if( e && cc.sys.isNative && window && window.__errorHandler ) {
window.__errorHandler( e.message, "", "", e.stack );
}
}
} );
}
nx.debug( "$Acts:创建子活动%s个", nx.dt.objLen( this.acts ) );
}
for( let id in this.acts ) {
let at = this.acts[ id ];
if( at ) {
at.reqBaseFromServer();
}
}
},
// 获取指定主题信息
queryTheme: function( _theme ) {
let themes = this.vget( "themes" );
for( let i in themes ) {
let tm = themes[ i ];
if( tm && tm.theme_id == _theme ) {
return tm;
}
}
},
// 获得指定source的主题信息
queryThemeBySource: function( _source ) {
let themes = this.vget( "themes" );
for( let i in themes ) {
let tm = themes[ i ];
if( tm && tm.source == _source ) {
return tm;
}
}
},
// 查询活动信息
searchAct: function( _camp_id ) {
let themes = this.vget( "themes" );
for( let i in themes ) {
let theme = themes[ i ];
if( !theme ||
nx.dt.arrEmpty( theme.theme_holiday_list ) ) {
continue;
}
for( let k in theme.theme_holiday_list ) {
let act = theme.theme_holiday_list[ k ];
if( act && act.camp_id == _camp_id ) {
return {
theme: theme,
infos: act,
};
}
}
}
nx.error( "$Acts:子活动信息不存在:", _camp_id );
return null;
},
// 获取指定主题信息
queryThemeByType: function( _type ) {
let themes = this.vget( "themes" );
for( let i in themes ) {
let tm = themes[ i ];
if( tm && tm.type == _type ) {
return tm;
}
}
},
// 查询子活动
queryAct: function( _camp_id, _warn = true ) {
if( !this.acts ) {
return;
}
let act = this.acts[ _camp_id ];
if( !act && _warn ) {
nx.error( "$Acts:子活动不存在:", _camp_id );
return null;
}
return act;
},
// ============================================================
// 活动信息
// ============================================================
// 获取活动基础信息
reqActData: function( _camp_id, _cb ) {
this.SendProtocal( 16603, { bid: _camp_id }, ( _ret, _data ) => {
if( _ret && _data.bid == _camp_id ) {
nx.dt.fnInvoke( _cb, true, _data );
}
} );
},
// 请求基本信息返回
handle16603: function( _data ) {
if( !this.isGoodData( _data ) ) {
return;
}
},
// ============================================================
// "主题卡池-招募(抽奖)
// type1: 1-道具抽
// type2: 1-单抽,2-+连抽
// ============================================================
// 卡池抽取
reqDrawFromPool: function( _gid, _type1, _type2, _cb ) {
this.SendProtocal( 31111, {
group_id: _gid,
type1: _type1,
type2: _type2,
}, _cb );
},
// 卡池抽取返回
handle31111: function( _data ) {
if( !this.isGoodData( _data ) ) {
return;
}
},
// ============================================================
// 活动奖励
// ============================================================
// 请求所有活动未领取奖励
reqActsRewards: function( _cb ) {
this.SendProtocal( 16602, {}, _cb );
},
// 请求所有活动未领取奖励
onFreshActsRewards: function( _data ) {
if( this.isGoodData( _data ) ) {
this.onUpdateActsRewards( _data.holiday_list );
}
},
// 领取奖励返回结果
onUpdateActsRewards: function( _data ) {
if( nx.dt.objGood( _data ) ) {
let act = this.queryAct( _data.bid );
if( act ) {
act.openTip( "reward", _data.can_get_num != 0 );
}
return;
}
if( nx.dt.arrEmpty( _data ) ) {
return;
}
for( let i = 0; i < _data.length; ++i ) {
let ifo = _data[ i ];
let act = this.queryAct( ifo.bid );
if( !act ) {
nx.warn( "$Acts:无效活动 ", ifo.bid );
continue;
}
act.openTip( "reward", ifo.can_get_num != 0 );
}
},
// ============================================================
// 活动预告
// ============================================================
// 刷新
freshForeshow: function() {
let themes = this.vget( "themes" );
let DATA = game.configs.ad_show;
if( nx.dt.arrEmpty( themes ) || nx.dt.objEmpty( DATA ) ) {
this.vset( "foreshow", [] );
return;
}
let ads = [];
let find = function( _theme, _camp ) {
// 0为常驻
if( _theme == 0 ) {
return true;
}
// 999为不显示
if( _theme == 999 ) {
return false;
}
for( let i in themes ) {
let tm = themes[ i ];
if( !tm || tm.theme_id != _theme ) {
continue;
}
for( let k in tm.theme_holiday_list ) {
let at = tm.theme_holiday_list[ k ];
if( at && at.camp_id == _camp ) {
return true;
}
}
}
return false;
};
for( let id in DATA.data_adshow_roll ) {
let roll = DATA.data_adshow_roll[ id ];
let func = DATA.data_adshow_func[ id ];
if( !roll || !func || !find( func.total_id, func.camp_id ) ) {
continue;
}
let actitem = this.queryAct( func.camp_id );
let ret = nx.bridge.jumper.checkSource( actitem.data.source );
if( nx.dt.objEmpty( ret ) ){
ads.push( {
id: id,
sc: roll.img,
sk: roll.link,
name: func.name,
img: func.img,
link: func.link,
is_new: func.is_new,
theme_id: func.total_id,
camp_id: func.camp_id,
ico: func.cli_icon
} );
}
}
this.vset( "foreshow", ads );
},
// ============================================================
// 推送弹窗
// ============================================================
// 今日推送
reqPushPopup: function() {
this.SendProtocal( 16621, {} );
},
// 今日推送
onPushPopup: function( _data ) {
if( !this.isGoodData( _data ) ) {
this.vset( "pushPopup", 0 );
this.vset( "pushToday", false );
return;
}
this.vset( "pushPopup", _data.id );
this.vset( "pushToday", true );
},
// 关闭推送
reqClosePushPopup: function( _cb ) {
this.SendProtocal( 16622, {}, _cb );
},
// 关闭推送回复
onPushPopupClose: function( _data ) {
if( !this.isGoodData( _data ) ) {
return;
}
this.vset( "pushToday", false );
},
// ============================================================
// 活动更新通知
// ============================================================
// 固定时间更新
onFreshActs: function() {
for( let id in this.acts ) {
let act = this.acts[ id ];
if( act ) {
act.reqBaseFromServer();
}
}
},
// ============================================================
// 活动红点提示
// ============================================================
// 组建红点结构
buildTipsView: function() {
let themes = this.vget( "themes" );
let tree = {
key: "acts",
sub: {}
};
// 全主题遍历
for( let i in themes ) {
let tm = themes[ i ];
let tk = `acts.${ tm.theme_id }`;
let ifo = { key: tk, sub: {} };
// 全活动遍历
let arr = tm.theme_holiday_list || [];
for( let k in arr ) {
let temp = arr[ k ];
let cateId = `${ temp.cate }`;
let campId = `${ temp.camp_id }`;
let act = this.queryAct( campId, false );
if( !act ) {
continue;
}
// 活动前缀格式: acts.{主题编号}.{Cate类别}.{活动编号}
if( !ifo.sub[ cateId ] ) {
ifo.sub[ cateId ] = { key: `${ tk }.${ cateId }`, sub: {} };
}
if( !ifo.sub[ cateId ].sub[ campId ] ) {
ifo.sub[ cateId ].sub[ campId ] = { key: `${ tk }.${ cateId }.${ campId }`, sub: {} };
}
let keys = act.tipKeys();
keys = [ "reward" ].concat( keys );
keys.forEach( _key => {
ifo.sub[ cateId ].sub[ campId ].sub[ _key ] = { key: `${ tk }.${ cateId }.${ campId }.${ _key }` };
} );
}
tree.sub[ `${ tm.theme_id }` ] = ifo;
}
nx.mTip.append( tree );
return tree;
},
// 获取主题提示键
getThemeTipKey: function( _theme_id ) {
return "acts." + _theme_id;
},
// ============================================================
// 活动引导
// ============================================================
// 活动引导
needGuide: function( _camp_id, _cb ) {
this.SendProtocal( 16623, {
camp_id: _camp_id
}, _cb );
},
// 活动引导
onActGuide: function() { },
// 引导完成上传
reqDoneGuide: function( _camp_id, _cb ) {
this.SendProtocal( 16624, {
camp_id: _camp_id
}, _cb );
},
// 引导上传
onActGuideDone: function() { },
} );
// 模块导出
module.exports = ActManager;