/****************************************************************** * * 闺房剧情场景 * ******************************************************************/ const BridgeWindow = require( "bridge.window" ); const HomeModel = require( "home.mod" ); const FxBGM = require( "nx.fx.BGM" ); const FxSpine = require( "nx.fx.spine" ); const START_ID = "start"; const AUTO_INTERVAL = 3; cc.Class( { extends: BridgeWindow, properties: { spBG: { default: null, type: FxSpine }, nodHead: { default: null, type: cc.Node }, nodTime: { default: null, type: cc.Node }, nodTitle: { default: null, type: cc.Node }, nodContent: { default: null, type: cc.Node }, nodChoices: { default: null, type: cc.Node }, cmpBGM: { default: null, type: FxBGM }, }, // 关闭 onDisable: function() { this.unscheduleAllCallbacks(); }, // 重载:参数打开 onOpenConfigs: function( _params ) { // 设置自动 this.setAutoPlay( false ); this.setEnd( false ); this.partner_id = _params.partner_id; this.profile_id = _params.profile_id; // 配置获取 this.partner = game.configs.partner_data.data_partner_base[ this.partner_id ]; this.profile = game.configs.favor_data.data_interface[ this.profile_id ]; this.talks = game.configs.favor_data.data_content[ this.profile_id ]; if( nx.dt.objEmpty( this.partner ) || nx.dt.objEmpty( this.talks ) || nx.dt.objEmpty( this.profile ) ) { this.scheduleOnce( () => { this.close(); }, 0.1 ); nx.error( "无效闺蜜剧情章节:" + this.profile_id ); return; } // 标题 let txt = nx.text.getKey( this.profile.name || "Archives" ); nx.gui.setString( this.nodHead, "txt", txt ); // 背景动画 let path = cc.path.join( "prefab/home/bedroom/roles", this.profile.bg_res, "spines/model" ); if( this.spBG.key != path ) { this.spBG.play( path, "action", null, true ); } // 角色名 nx.gui.setString( this.nodTitle, "txt", nx.text.getKey( this.partner.name ) ); // 背景音乐 if( nx.dt.strNEmpty( this.profile.bgm ) ) { path = cc.path.join( "prefab/home/bedroom/bgm", this.profile.bgm ); this.cmpBGM.bgmRK = path; this.cmpBGM.reActive(); } // 设置当前对话 let step = _params.step || -1; if( step <= 0 ) { step = 1; } let talkId = "start"; for( let tid in this.talks ) { let t = this.talks[tid]; if( t && t.rank == step ) { talkId = tid; break; } } this.resetTalk( talkId ); }, // 设置当前对话 resetTalk: function( _talk_id ) { this.talk_id = _talk_id || START_ID; let data = this.talks[ this.talk_id ]; if( nx.dt.objEmpty( data ) ) { this.curtalk = null; nx.error( "无效的对话:", this.profile_id, _talk_id ); return; } this.cur = { index: -1, tid: data.number, content: data.content, selects: [], }; for( let i in data.next_content_id ) { let id = data.next_content_id[ i ]; this.cur.selects.push( this.talks[ id ] ); } this.setEnd( false ); this.onTouchNext(); }, // 点击下一步 onTouchNext: function() { // 下一句 this.cur.index += 1; // 对话已经完成 if( this.cur.index >= this.cur.content.length ) { // 如果单选项 if( this.cur.selects.length == 1 ) { let ifo = this.cur.selects[ i ]; if( ifo ) { this.resetTalk( ifo.next_content_id[ 0 ] ); } } // 如果已经完结 if( this.cur.selects.length == 0 ) { this.setAutoPlay( false ); this.setEnd( true ); } return; } // 文本 let txt = nx.text.getKey( this.cur.content[ this.cur.index ] ); nx.gui.setString( this.nodContent, "txt", txt ); // 选项更新 let end = ( this.cur.index == ( this.cur.content.length - 1 ) ); let ops = ( this.cur.selects.length == 2 ); let root = nx.gui.setActive( this.nodContent.parent, "choices", end && ops ); if( root && end && ops ) { let choice = function( _btn, _info ) { let path = cc.path.join( "prefab/home/bedroom/ui", "icon" + _info.icon ); nx.gui.setSpriteFrame( _btn, "icon", path ); nx.gui.setString( _btn, "txt", nx.text.getKey( _info.content[ 0 ] ) ); }; choice( nx.gui.find( root, "c1/btn" ), this.cur.selects[ 0 ] ); choice( nx.gui.find( root, "c2/btn" ), this.cur.selects[ 1 ] ); } }, // 点击选项 onTouchChoice: function( _key ) { let index = parseInt( _key ) || 1; let cfgs = this.cur.selects[ index - 1 ]; if( nx.dt.objEmpty( cfgs ) ) { return; } let HC = HomeModel.getInstance(); let tid = cfgs.next_content_id[ 0 ]; HC.commitStoryOp( this.profile_id, cfgs.number, ( _ret, _data ) => { if( !_ret ) { nx.tbox( _data ); return; } // 下段 this.resetTalk( tid ); } ); }, // 点击自动 onTouchAuto: function() { this.setAutoPlay( true ); }, // 点击取消自动 onTouchAutoCancel: function() { this.setAutoPlay( false ); }, // 设置结束标记 setEnd: function( _end ) { nx.gui.setActive( this.nodContent, "end", _end ); }, // 设置自动 setAutoPlay: function( _open ) { this.unscheduleAllCallbacks(); this.autoPlaying = _open; nx.gui.setActive( this.nodContent, "flag", _open ); nx.gui.setActive( this.nodContent, "ops/auto", !_open ); nx.gui.setActive( this.nodContent, "ops/auto_cancel", _open ); let flag = nx.gui.find( this.nodContent, "flag" ); if( !_open ) { cc.Tween.stopAllByTarget( flag ); return; } // 闪烁 cc.tween( flag ) .repeatForever( cc.tween() .to( 0.5, { opacity: 100 } ) .to( 0.5, { opacity: 200 } ) ) .start(); // 心跳 this.schedule( () => { if( this.cur.selects.length == 2 ) { this.onTouchChoice( this.profile.default ); } else { this.onTouchNext(); } }, AUTO_INTERVAL, cc.macro.repeatForever ); }, // 点击跳过 onTouchSkip: function() { if( this.cur && this.cur.selects.length == 2 ) { this.onTouchChoice( this.profile.default ); } }, // 点击剧本集 onTouchGraphic: function() { let home = HomeModel.getInstance(); home.reqArchiveInfo( this.profile_id, ( _ret, _data ) => { if( !_ret ) { nx.tbox( _data ); return; } nx.bridge.createPanel( "WndBedroomDocument", { partner_id: this.partner_id, profile_id: this.profile_id, talks: _data.historical_dialogue, results: _data.personal_profile_result, story: this, }); } ); }, } );