/****************************************************************** * * 图书馆模块 * ******************************************************************/ 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;