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

345 lines
9.3 KiB
JavaScript

/******************************************************************
*
* 图书馆模块
*
******************************************************************/
const BridgeController = require( "bridge.controller" );
const LibraryModel = cc.Class( {
extends: BridgeController,
// 注册协议接受事件
registerProtocals: function() {
this.RegisterProtocal( 11021, this.handle11021.bind( this ) ); // 图书馆信息
this.RegisterProtocal( 11022, this.handle11022.bind( this ) ); // 领取奖励
this.RegisterProtocal( 11023, this.handle11023.bind( this ) ); // 更新推送
},
// 从服务器初始化数据
reqBaseFromServer: function( _cb ) {
// 配置加载
let cfgs = [
"gallery_data",
];
this.loadConfigs( cfgs, ( _ret, _data ) => {
this.parseConfigs();
this.buildTipsView();
this.reqBaseData( _cb );
} );
},
// 请求图书馆信息
reqBaseData: function( _cb ) {
this.SendProtocal( 11021, {}, _cb );
},
// 图书馆信息
handle11021: function( _data ) {
if( !_data ||
nx.dt.arrEmpty( _data.partner_library ) ) {
return;
}
// 遍历更新奖励状态
for( let i = 0; i < _data.partner_library.length; ++i ) {
let data = _data.partner_library[i];
let group = this.groups[data.group];
if( !group ) {
nx.error( `图鉴组${data.group}缺失!` );
continue;
}
group.statu = data.statu;
for( let p = 0; p < group.partners.length; ++p ) {
let partner = group.partners[p];
let st = 0;
for( let idx in data.partner_collect ) {
let tp = data.partner_collect[idx];
if( tp.partner_bid == partner.id ) {
st = tp.statu;
break;
}
}
partner.statu = st;
}
}
// 刷新全提示
this.freshTipsView();
},
// 领取单收集奖励
reqPartnerReward: function( _pid, _cb ) {
this.SendProtocal( 11022, {
id: _pid,
type: 0,
}, _cb );
},
// 领取全收集奖励
reqGroupReward: function( _gid, _cb ) {
this.SendProtocal( 11022, {
id: _gid,
type: 1,
}, _cb );
},
// 领取奖励结果
handle11022: function( _data ) {
},
// 更新推送
handle11023: function( _data ) {
if( !_data ||
nx.dt.arrEmpty( _data.library_info ) ) {
return;
}
for( let i = 0; i < _data.library_info.length; ++i ) {
let ifo = _data.library_info[i];
let group = this.groups[ifo.group_id];
if( !group ) {
nx.error( `图鉴组更新推送:组${ifo.group_id}缺失!` );
continue;
}
let tag = "" + Math.floor( parseInt( ifo.group_id ) / 1000 );
let key = `home.library.tag${tag}.${ifo.group_id}`;
// 大奖更新
if( !nx.dt.numPositive( ifo.partner_bid, false ) ) {
group.statu = ifo.statu;
nx.mTip.openTip( `${key}.reward`, group.statu == 1 );
continue;
}
// 小奖更新
let ok = false;
for( let idx in group.partners ) {
let pt = group.partners[idx];
if( pt && pt.id == ifo.partner_bid ) {
pt.statu = ifo.statu;
nx.mTip.openTip( `${key}.${pt.id}`, pt.statu == 1 );
ok = true;
break;
}
}
if( !ok ) {
nx.error( `图鉴组更新推送:角色${ifo.partner_bid}缺失!` );
}
}
},
// 查询指定角色
queryPartner: function( _bid ) {
for( let id in this.groups ) {
let lst = this.groups[id].partners;
for( let i = 0; i < lst.length; ++i ) {
let pt = lst[i];
if( pt && pt.id == _bid ) {
return pt;
}
}
}
},
// 是否收集到指定角色
havePartner: function( _bid ) {
let partner = this.queryPartner( _bid );
return partner ? ( partner.statu != 0 ) : false;
},
// ============================================================
// 配置相关
// ============================================================
// 配置解析
parseConfigs: function() {
const DATA = game.configs.gallery_data;
if( nx.dt.objEmpty( DATA ) ) {
nx.error( "图书馆配置缺失!" );
return;
}
this.tags = {};
this.groups = {};
// 小组统计
let self = this;
let degroup = function( _tag, _data ) {
// 世界观
if( _tag == "6" ) {
const tmp = DATA.data_world_outlook_data[_data.id];
self.groups[ "" + _data.id] = {
tag: _tag,
id: _data.id,
name: _data.label_name,
content: tmp.content,
photo: tmp.pic,
};
return;
}
// 普通
const rew = DATA.data_group_reward_data[_data.id];
self.groups[ "" + _data.id] = {
tag: _tag,
id: _data.id,
name: _data.label_name,
reward: rew.reward,
reward_bg: rew.bg,
reward_desc: rew.desc,
partners: [],
statu: 0, // 0-未获得, 1-已获得, 2-已领取
};
};
// 大类统计
for( let id in DATA.data_label_data ) {
let ifo = DATA.data_label_data[id];
let tag = "" + Math.floor( parseInt( id ) / 1000 );
if( nx.dt.objEmpty( this.tags[tag] ) ) {
this.tags[tag] = {
name: ifo.big_label_name,
subs: [],
}
}
this.tags[tag].subs.push( {
tag: tag,
id: id,
name: ifo.label_name,
} );
degroup( tag, ifo );
}
// 角色归类
let partners = DATA.data_partner_data;
for( let id in partners ) {
let ifo = nx.dt.objClone( partners[id] );
ifo.statu = 0; // 0-未集齐, 1-已集齐, 2-已领取
this.groups[ifo.group].partners.push( ifo );
}
},
// 获取指定伙伴所在推荐阵容
queryRecommondForms: function( _bid ) {
const DATA = game.configs.gallery_data;
if( nx.dt.objEmpty( DATA ) ||
nx.dt.objEmpty( DATA.data_recommond ) ) {
nx.error( "推荐阵容配置缺失!" );
return [];
}
let forms = [];
for( let id in DATA.data_recommond ) {
let form = DATA.data_recommond[id];
if( form && nx.dt.arrMember( form.camp, _bid ) ) {
forms.push( form );
}
}
return forms;
},
// ============================================================
// 红点提示
// ============================================================
// 组建红点结构
buildTipsView: function() {
let self = this;
let tree = {
key: "home.library",
sub: {}
};
// 大类.小类.角色id
for( let tag in this.tags ) {
let tmp = {
key: `${tree.key}.${("tag" + tag)}`,
sub: {}
}
this.tags[tag].subs.forEach( _t => {
let stmp = {
key: `${tmp.key}.${_t.id}`,
sub: {
reward: { key: `${tmp.key}.${_t.id}.reward` }
}
}
let group = self.groups[_t.id];
if( group && nx.dt.arrNEmpty( group.partners ) ) {
group.partners.forEach( _p => {
stmp.sub[""+_p.id] = {
key: `${stmp.key}.${_p.id}`
}
} );
}
tmp.sub[_t.id] = stmp;
} );
tree.sub[("tag" + tag)] = tmp;
}
// 提示结构重构
nx.mTip.subAppend( "home", "library", tree );
return tree;
},
// 刷新全提示
freshTipsView: function() {
let fresh = function( _group ) {
// 总奖励
let key = `home.library.tag${_group.tag}.${_group.id}`;
nx.mTip.openTip( `${key}.reward`, _group.statu == 1 );
// 子奖励
if( nx.dt.arrNEmpty( _group.partners ) ) {
for( let i = 0; i < _group.partners.length; ++i ) {
let partner = _group.partners[i];
let k2 = `${key}.${partner.id}`;
nx.mTip.openTip( k2, partner.statu == 1 );
}
}
};
for( let id in this.groups ) {
fresh( this.groups[id] );
}
},
});
module.exports = LibraryModel;