/****************************************************************** * * 僚机背包页 * ******************************************************************/ const MenuPage = require( "cmp.com.menu.page" ); const ItemExpand = require( "nx.fx.sv.expand" ); const ItemLayout = require( "cmp.common.itemlayout" ) const PathTool = require( "pathtool" ); const HallowsConst = require( "hallows_const" ); const HallowsEvent = require( "hallows_event" ); const HallowsController = require( "hallows_controller" ) const BackpackEvent = require( "backpack_event" ); const BackPackConst = require( "backpack_const" ) const PartnerCalculate = require( "partner_calculate" ); const FxTogs = require( "nx.fx.togs" ); const TipsController = require( "tips_controller" ) const NxSpine = require( "nx.fx.spine" ); cc.Class( { extends: MenuPage, properties: { hallow_sp: { default: null, type: NxSpine }, tag_ico:{ default:null, type:cc.Node }, hallow_empty: { default: null, type: cc.Node }, hallow_items: { default: null, type: ItemExpand }, info_list: { default: null, type: ItemLayout }, detail_list: { default: null, type: ItemLayout }, //任务界面相关 task_node: { default: null, type: cc.Node }, task_item_node: { default: null, type: cc.Node }, task_list: { default: null, type: ItemLayout }, task_attr_node: { default: null, type: cc.Node }, attr_skill_pre: { default: null, type: cc.Prefab }, skill_name: { default: null, type: cc.RichText }, skill_desc: { default: null, type: cc.RichText }, attr_labels: { default: [], type: [ cc.RichText ] }, task_complete_num: { default: null, type: cc.RichText }, //技能升级 use_node: { default: null, type: cc.Node }, use_togs: { default: null, type: FxTogs }, use_panel: { default: null, type: cc.Node }, pre_panels: { default: [], type: [ cc.Prefab ] }, //重铸 reset_btn: { default: null, type: cc.Node }, btn_gofight: { default: null, type: cc.Node }, no_task_tip: { default: null, type: cc.Node } }, onLoad: function() { this._super(); this.ctrl = HallowsController.getInstance(); this.model = this.ctrl.getModel(); // Tog监听 this.use_togs.posTog = this.onTogPanel.bind( this ); // 事件监听 //任务变化 this.bindGEvent( HallowsEvent.UpdateHallowsTaskEvent, this.updateHallowsTaskInfo.bind( this ) ); //数据更新 this.bindGEvent( HallowsEvent.HallowsUpdateEvent, this.updateHallow.bind( this ) ); //激活行星武器 this.bindGEvent( HallowsEvent.HallowsActivityEvent, this.actiHallows.bind( this ) ); this.bindGEvent( HallowsEvent.UpdateHallowsGet, this.refreshHallowsList.bind( this ) ); this.bindGEvent( HallowsEvent.UpdateHallowsDetailInfoList, this.updateHallowsItem.bind( this ) ) this.bindGEvent( BackpackEvent.ADD_GOODS, this.checkNeedUpdateItemNum.bind( this ) ); this.bindGEvent( BackpackEvent.MODIFY_GOODS_NUM, this.checkNeedUpdateItemNum.bind( this ) ); this.bindGEvent( BackpackEvent.DELETE_GOODS, this.checkNeedUpdateItemNum.bind( this ) ); }, //任务相关---------------------------- updateHallowsItem( hallows_id ) { this.updateHallowsList(); //初始化下部列表 this.hallow_items.rebuild( this.hallows_list ); this.hallow_items.addFocus( hallows_id - 1 ); this.setMain( this.hallows_id ); }, updateHallow( id, is_refine ) { if( this.is_in_use ) { this.handleUpdateEvent( id, is_refine ); } else { if( id == this.hallows_id ) { this.refreshView(); } } }, actiHallows() { var hallows_id = this.model.getCurActivityHallowsId(); if( hallows_id ) { if( hallows_id <= 5 ) { this.hallows_id = hallows_id; } else { this.refreshHallowsList(); } this.ctrl.requestHallowsInfo(); this.refreshView(); this.handleEffect(); } }, //任务相关---------------------------- updateHallowsList() { // 根据激活数和id重新排序, var config_list = game.configs.hallows_data.data_base; this.hallows_list = []; this.hallows_sum = game.configs.hallows_data.data_base_length; for( var i in config_list ) { var object = {}; object.id = config_list[ i ].id; object.name = config_list[ i ].name; object.effect = config_list[ i ].effect; object.item_id = config_list[ i ].item_id; object.open_desc = config_list[ i ].open_desc; var vo = this.model.getHallowsById( config_list[ i ].id ); object.vo = vo; this.hallows_list.push( object ); } // 显示列表重新排序 if( Utils.next( this.hallows_list ) ) { this.hallows_list.sort( function( a, b ) { return a.id - b.id; } ) } }, refreshHallowsList() { this.updateHallowsList(); //初始化下部列表 this.hallow_items.rebuild( this.hallows_list ); if( this.hallows_id != null ) { if( !this.model.checkIsHaveAllHallows() ) { this.is_in_use = false; this.hallows_id = this.model.getCurActivityHallowsId(); this.use_node.active = false; this.task_node.active = true; } else { var select_index = this.getDefaultHallowsIndex( this.hallows_id ); this.selectHallowsIndex( select_index ); this.is_in_use = true; // this.hallows_id = 1; this.use_node.active = true; this.task_node.active = false; this.use_togs.togTo( 0 ); this.use_togs.posTog( 0 ); } this.hallow_items.addFocus( this.hallows_id - 1 ); this.setMain( this.hallows_id ); } }, onDisable() { // 监听事件释放 this.unbindGEvents(); }, onEnable() { this.refreshHallowsList(); //检查是否解锁所有行星武器 if( this.model.checkIsHaveAllHallows() ) { this.is_in_use = true; var select_index = this.getDefaultHallowsIndex( null ); this.selectHallowsIndex( select_index ); this.hallows_id = this.hallows_list[ select_index ].id; this.use_node.active = true; this.use_togs.togTo( 0 ); this.use_togs.posTog( 0 ); } else { this.is_in_use = false; this.task_node.active = true; this.hallows_id = this.model.getCurActivityHallowsId(); this.refreshView(); } this.hallow_items.addFocus( this.hallows_id - 1 ); this.setMain( this.hallows_id ); }, onTogPanel( _index ) { if( _index == ( HallowsConst.Tab_Index.uplv - 1 ) ) { if( !this.step_panel ) { this.step_panel = cc.instantiate( this.pre_panels[ _index ] ); this.step_panel.parent = this.use_panel; } if( this.select_hallows ) { let cmp = this.step_panel.getComponent( "cmp.hallows.main.lvup" ); cmp.setData( this.select_hallows ); } } else if( _index == ( HallowsConst.Tab_Index.skill - 1 ) ) { if( !this.skill_panel ) { this.skill_panel = cc.instantiate( this.pre_panels[ _index ] ); this.skill_panel.parent = this.use_panel; } if( this.select_hallows ) { let cmp = this.skill_panel.getComponent( "cmp.hallows.main.skill" ); cmp.setData( this.select_hallows ); } } else if( _index == ( HallowsConst.Tab_Index.refine - 1 ) ) { if( !this.refine_panel ) { this.refine_panel = cc.instantiate( this.pre_panels[ _index ] ); this.refine_panel.parent = this.use_panel; } if( this.select_hallows ) { let cmp = this.refine_panel.getComponent( "cmp.hallows.main.refine" ); cmp.setData( this.select_hallows ); } } if( this.step_panel ) { this.step_panel.active = _index == ( HallowsConst.Tab_Index.uplv - 1 ); } if( this.skill_panel ) { this.skill_panel.active = _index == ( HallowsConst.Tab_Index.skill - 1 ); } if( this.refine_panel ) { this.refine_panel.active = _index == ( HallowsConst.Tab_Index.refine - 1 ); } }, handleEffect() { let cfg = null; for( let i in this.hallows_list ) { if( this.hallows_list[ i ].id == this.hallows_id ) { cfg = this.hallows_list[ i ]; } } if( cfg == null ) return; this.hallow_sp.stop(); if( this.model.getHallowsById( this.hallows_id ) ) { nx.gui.setActive( this.hallow_empty, "", false ); let effect_res = cfg.effect; let effect_path = PathTool.getSpinePath( effect_res, "action", false ); this.hallow_sp.load( effect_path, ( _e ) => { if( !_e ) { this.hallow_sp.action( "action", true ); } else { this.hallow_sp.stop(); } } ); nx.gui.setActive(this.tag_ico,"",true); nx.gui.setSpriteFrame(this.tag_ico,"",cc.js.formatStr("prefab/partner/hallows/ui/%s",this.hallows_id)); } else {//没有激活 nx.gui.setActive( this.hallow_empty, "", true ); nx.gui.setSpriteFrame( this.hallow_empty, "", cc.js.formatStr('resDB/empty/xj%s', this.hallows_id)); nx.gui.setActive(this.tag_ico,"",false); } }, setMain( id ) { let cfg = null; for( let i in this.hallows_list ) { if( this.hallows_list[ i ].id == id ) { cfg = this.hallows_list[ i ]; } } if( cfg == null ) return; this.handleEffect(); //初始化部分详细信息 let info_items = []; let vo = cfg.vo; if( vo ) { info_items.push( vo.step ); info_items.push( vo.skill_lev ); info_items.push( vo.refine_lev ); } else { info_items = [ 0, 0, 0 ] } this.info_list.rebuild( info_items ); let detail_items = []; for( let i = 0; i <= 2; i++ ) { detail_items.push( cfg ); } this.detail_list.rebuild( detail_items ); }, onFocusHallowsItem( _item ) { // 空 if( nx.dt.objEmpty( _item ) || nx.dt.objEmpty( _item.mdata ) ) { return; } // 聚焦 this.hallow_items.cleanFocus(); this.hallow_items.addFocus( _item.index ); this.hallows_id = this.hallows_list[ _item.index ].id || 1; //检查是否解锁所有行星武器 if( this.model.checkIsHaveAllHallows() ) { this.is_in_use = true; var select_index = this.getDefaultHallowsIndex( this.hallows_id ); this.selectHallowsIndex( select_index ); this.use_node.active = true; this.task_node.active = false; this.setPanel(); } else { this.is_in_use = false; this.use_node.active = false; this.task_node.active = true; this.refreshView(); } this.setMain( this.hallows_id ); }, setPanel() { if( this.use_togs.togIndex == 0 ) { if( this.select_hallows ) { let cmp = this.step_panel.getComponent( "cmp.hallows.main.lvup" ); cmp.setData( this.select_hallows ); } } else if( this.use_togs.togIndex == 1 ) { if( this.select_hallows ) { let cmp = this.skill_panel.getComponent( "cmp.hallows.main.skill" ); cmp.setData( this.select_hallows ); } } else if( this.use_togs.togIndex == 2 ) { if( this.select_hallows ) { let cmp = this.refine_panel.getComponent( "cmp.hallows.main.refine" ); cmp.setData( this.select_hallows ); } } }, // 选中某一神器 selectHallowsIndex: function( index, force, is_refine ) { // if(this.select_index == index && !force)return; this.select_index = index; this.select_hallows = this.hallows_list[ index ]; if( this.select_hallows == null ) return; this.reset_btn.active = this.checkIsShowResetBtn(); }, // 重载:关闭前 onPreClosed: function() { this.hallow_items.rebuild( [] ); this.info_list.rebuild( [] ); this.detail_list.rebuild( [] ); this.task_list.rebuild( [] ); }, // 规则说明 onTouchTip: function() { let TC = TipsController.getInstance(); if( TC ) { let txt = game.configs.hallows_data.data_const.game_rule; TC.showTextPanel( "tip", txt.desc ); } }, // 取出进入界面时默认选中的神器index getDefaultHallowsIndex: function( hallows_id ) { var temp_hallows_list = nx.dt.objClone( this.hallows_list ); var select_index = 0; if( hallows_id ) { select_index = this.getHallowsIndexById( hallows_id ); } else { //等级最高>进度最高>id越高 var temp_hallows = []; temp_hallows_list.sort( function( a, b ) { return b.vo.step - a.vo.step; } ) var max_step = 0; for( var i in temp_hallows_list ) { if( max_step <= temp_hallows_list[ i ].vo.step ) { max_step = temp_hallows_list[ i ].vo.step; temp_hallows.push( temp_hallows_list[ i ] ); } } if( temp_hallows.length == 1 ) { select_index = this.getHallowsIndexById( temp_hallows[ 0 ].id ); } else { var max_lucky = 0; temp_hallows.sort( function( a, b ) { return b.vo.lucky - a.vo.lucky; } ) var temp_hallows_2 = []; for( var j in temp_hallows ) { var hallows = temp_hallows[ j ]; if( hallows.vo.lucky >= max_lucky ) { max_lucky = hallows.vo.lucky temp_hallows_2.push( hallows ); } } if( temp_hallows_2.length == 1 ) { select_index = this.getHallowsIndexById( temp_hallows_2[ 0 ].id ); } else { temp_hallows_2.sort( function( a, b ) { return b.id - a.id; } ) select_index = this.getHallowsIndexById( temp_hallows_2[ 0 ].id ); } } } return select_index; }, // 根据神器id获取对应的index getHallowsIndexById: function( id ) { var index = 1; for( var i in this.hallows_list ) { if( this.hallows_list[ i ].id && this.hallows_list[ i ].id == id ) { index = i; } } return index; }, //---------------------任务界面 // 刷新界面 refreshView: function() { this.updateHallowsTaskInfo(); this.updateHallowsSkillInfo(); }, //设置已解锁和正在进行的神器数据 // initUnlockHallowsData:function(hallows_id){ // this.all_hallows_id = []; // var activity_id = this.model.getCurActivityHallowsId() // 正在进行中的神器id // for (var i in game.configs.hallows_data.data_base) { // var tempCfg = game.configs.hallows_data.data_base[i]; // if(this.model.getHallowsById(tempCfg.id) || tempCfg.id == activity_id){ // this.all_hallows_id.push(tempCfg.id); // if(hallows_id && tempCfg.id == hallows_id){ // this.cur_index = this.all_hallows_id.length-1; // } // } // } // // this.left_btn.active = this.all_hallows_id.length>1; // // this.right_btn.active = this.all_hallows_id.length>1; // }, updateHallowsTaskInfo: function() { if( !this.hallows_id ) return; //判断是否已获得 if( this.model.getHallowsById( this.hallows_id ) ) { this.task_attr_node.active = true; this.task_item_node.active = false; this.btn_gofight.active = true; this.no_task_tip.active = false; for( var i in this.base_attr_list ) { this.base_attr_list[ i ].active = false; } this.task_complete_num.string = nx.text.getKey( "HallowTaskComplete" ); var hallows_base = gdata( "hallows_data", "data_info", Utils.getNorKey( this.hallows_id, 1 ) ); if( hallows_base ) { for( var j in hallows_base.attr ) { if( j > 2 ) break;//UI只支持显示两个技能 var attr_key = hallows_base.attr[ j ][ 0 ]; var attr_val = hallows_base.attr[ j ][ 1 ] || 0; var attr_name = game.configs.attr_data.data_key_to_name[ attr_key ]; if( attr_name ) { var icon = cc.js.formatStr( "coms/images/ico_%s", attr_key ); var is_per = PartnerCalculate.isShowPerByStr( attr_key ) if( is_per ) { attr_val = ( attr_val / 10 ) + "%"; } this.attr_labels[ j ].string = nx.text.getKey( "lab_hallows_task_windoiw_tip2" ) + attr_name + ":" + attr_val.toString(); // cc.loader.loadRes( icon, cc.SpriteFrame, ( err, resObject ) => { // if( err ) { // return false; // } // this.attr_labels[ j ].addSpriteFrame( resObject ); // } ); } } } } else { this.task_attr_node.active = false; this.task_item_node.active = true; this.btn_gofight.active = false; this.no_task_tip.active = true; var task_list = this.model.getHallowsTaskList( this.hallows_id ); task_list.sort((a,b)=>{ return b.sort - a.sort; }); if( task_list ) { var max_num = task_list.length; var cur_num = 0; for( var k in task_list ) { if( task_list[ k ].finish == 2 ) { cur_num = cur_num + 1; } } this.task_complete_num.string = nx.text.getKey( "HallowTaskProg" ) + cur_num + "/" + max_num; } this.task_list.rebuild( task_list ); // 引导辅助 if( nx.bridge.plot && nx.bridge.plot.isDoing() ) { this.scheduleOnce( () => { this.positionGet(); }, 0.1 ); } } }, updateHallowsSkillInfo() { if( !this.hallows_id ) return; var hallows_skill = gdata( "hallows_data", "data_skill_up", Utils.getNorKey( this.hallows_id, 1 ) ) // 显示1级时的技能 if( hallows_skill && hallows_skill.skill_bid != 0 ) { var config = gskilldata( "data_get_skill", hallows_skill.skill_bid ) || {}; if( !this.skill_icon ) { this.skill_icon = cc.instantiate( this.attr_skill_pre ); this.skill_icon.parent = ( this.task_attr_node ); this.skill_icon.position = cc.v2( -175, 60 ) } let cmp = this.skill_icon.getComponent( "cmp.skill.base" ); cmp.rebind( 0, config.bid, "" ); this.skill_name.string = cc.js.formatStr( "%s [Lv.%s]", config.name, hallows_skill.lev_limit ); this.skill_desc.string = cc.js.formatStr( config.des, config.hallows_atk, 0 ); } }, //---------------------任务界面 checkNeedUpdateItemNum( bag_code, item_list ) { if( bag_code != BackPackConst.Bag_Code.BACKPACK ) return; if( item_list == null ) return; for( var i in item_list ) { var vo = item_list[ i ]; if( vo.config ) { var bid = vo.config.id; this.updateCostItemNumByBid( bid ) } } }, updateCostItemNumByBid: function( bid ) { if( !bid ) { return; } let cmp = null; if( this.step_panel ) { cmp = this.step_panel.getComponent( "cmp.hallows.main.lvup" ); } else if( this.skill_panel ) { cmp = this.skill_panel.getComponent( "cmp.hallows.main.skill" ); } else if( this.refine_panel ) { cmp = this.refine_panel.getComponent( "cmp.hallows.main.refine" ); } if( cmp == null ) return; cmp.getCostObj( bid ); // if (bid == this.hallows_uplv_cost_bid_1) { // this.setCostDataToNode(this.lvup_cost_res_1, this.lvup_cost_label_1, bid, this.hallows_uplv_cost_num_1) // } else if (bid == this.hallows_uplv_cost_bid_2) { // this.setCostDataToNode(this.lvup_cost_res_2, this.lvup_cost_label_2, bid, this.hallows_uplv_cost_num_2) // } else if (bid == this.skill_lvup_cost_bid_1) { // this.setCostDataToNode(this.skill_res_icon_1, this.skill_cost_label_1, bid, this.skill_lvup_cost_num_1) // } else if (bid == this.skill_lvup_cost_bid_2) { // this.setCostDataToNode(this.skill_res_icon_2, this.skill_cost_label_2, bid, this.skill_lvup_cost_num_2) // } // if (bid == this.refine_cost_bid_1) { // let is_full = this.setCostDataToNode(this.refine_res_icon_1, this.refine_cost_label_1, bid, this.refine_cost_num_1) // if (is_full) { // this.is_can_refine_2 = true // } else { // this.is_can_refine_2 = false // } // } // if (bid == this.refine_cost_bid_2) { // let is_full = this.setCostDataToNode(this.refine_res_icon_2, this.refine_cost_label_2, bid, this.refine_cost_num_2) // if (is_full) { // this.is_can_refine_3 = true // } else { // this.is_can_refine_3 = false // } // } }, // 是否显示重铸按钮 checkIsShowResetBtn: function() { var is_show = false; if( this.select_hallows == null ) { return is_show; } var vo = this.select_hallows.vo; if( vo == null ) { return is_show; } if( vo.step > 1 || vo.seal > 0 || vo.skill_lev > 1 || vo.refine_lev > 0 ) { is_show = true; } return is_show; }, //圣器更新处理 handleUpdateEvent: function( id, is_refine ) { if( id && this.select_hallows && id == this.select_hallows.id ) { this.selectHallowsIndex( this.select_index, true, is_refine ) this.updateHallowStatusInfo(); } }, //设置神器升级与技能状态显示 updateHallowStatusInfo: function() { if( this.select_hallows == null ) return; var vo = this.select_hallows.vo; if( vo == null ) { return; } else { //神器是否达到最大等级 var max_lev = game.configs.hallows_data.data_max_lev[ vo.id ] || 100; if( vo.step >= max_lev ) { this.is_max_hallows_lv = true; // this.uplv_layout.active = false; } else { this.is_max_hallows_lv = false; // this.uplv_layout.active = true; } //技能是否达到最大等级 var max_skill_lv = game.configs.hallows_data.data_skill_max_lev[ vo.id ] || 10; var skill_lv = vo.skill_lev; if( skill_lv >= max_skill_lv ) { this.is_max_skill_lv = true; // this.skill_layout.active = false; } else { this.is_max_skill_lv = false; // this.skill_layout.active = true; } //精炼是否达到最大等级 let max_refine_lv = game.configs.hallows_refine_data.data_max_lev[ vo.id ] || 9 if( vo.refine_lev >= max_refine_lv ) { this.is_max_refine_lv = true // this.refine_layout.active = false; // nx.gui.setActive(this.refine_max_lv,"",true); } else { this.is_max_refine_lv = false // this.refine_layout.active = true; // nx.gui.setActive(this.refine_max_lv,"",false); } //更新神器升级与技能显示 if( !this.is_max_hallows_lv ) { if( this.step_panel ) { let cmp = this.step_panel.getComponent( "cmp.hallows.main.lvup" ); cmp.setData( this.select_hallows ); } } if( !this.is_max_skill_lv ) { if( this.skill_panel ) { let cmp = this.skill_panel.getComponent( "cmp.hallows.main.skill" ); cmp.setData( this.select_hallows ); } } if( !this.is_max_refine_lv ) { if( this.refine_panel ) { let cmp = this.refine_panel.getComponent( "cmp.hallows.main.refine" ); cmp.setData( this.select_hallows ); } } let info_items = []; if( vo ) { info_items.push( vo.step ); info_items.push( vo.skill_lev ); info_items.push( vo.refine_lev ); } else { info_items = [ 0, 0, 0 ] } this.info_list.rebuild( info_items ); let detail_items = []; for( let i = 0; i <= 2; i++ ) { detail_items.push( this.select_hallows ); } this.detail_list.rebuild( detail_items ); // this.info_list.rebuild(this.hallows_list); // this.detail_list.rebuild(this.hallows_list); } }, clickHallowsDetail() { this.ctrl.send24140( this.hallows_id || this.select_hallows.id ); // this.ctrl.openHallowsTips(true,this.hallows_id||this.select_hallows); }, // 点击重铸 onClickResetBtn: function() { if( this.step_panel ) { let cmp = this.step_panel.getComponent( "cmp.hallows.main.lvup" ); let status = cmp.getLvupStatus(); if( status ) { return; } } var str = nx.text.getKey( "lab_hallows_main_window_tip13" ); nx.mbox( str, [ "cancel", "confirm" ], ( _key, _box ) => { _box.close(); if( _key == "confirm" ) { if( this.select_hallows ) { this.ctrl.requestHallowsReset( this.select_hallows.id ); } } } ); }, onClickTraceBtn() { if( this.select_hallows ) { if( !this.select_hallows.vo ) { nx.tbox( "lab_hallows_main_window_tip12" ) } else { var cost_config = game.configs.hallows_data.data_const.imprint_lowest; if( cost_config ) { if( this.select_hallows.vo.step < cost_config.val ) { nx.tbox( cost_config.desc ) } else { this.ctrl.openHallowsTraceWindow( true, this.select_hallows ); } } } } else { nx.tbox( "lab_hallows_main_window_tip12" ) } }, // ============================================ // 引导辅助 // ============================================ // 首次领奖定位 positionGet: function() { // 查找第一个能领取的任务 let node = null; let children = this.task_list.node.children; for( let i = 0; i < children.length; ++i ) { let temp = children[ i ]; if( temp && nx.gui.isActive( temp, "btn_get" ) ) { node = temp; break; } } if( !node ) { nx.error( "$HallowsPage:定位首次领奖失败!" ); node = children[ 0 ]; if( !node ) { return; } } let btn = nx.gui.find( node, "btn_get" ); let cell = nx.gui.find( this, "panel/plotCell" ); let pos = btn.convertToWorldSpaceAR( cc.Vec2.ZERO ); cell.position = cell.parent.convertToNodeSpaceAR( pos ); cell.width = btn.width; cell.height = btn.height; cell.cmp = nx.gui.getComponent( node, "", "cmp.hallows.item.task" ); }, // 点击首次领奖处理 onTouchFirstGet: function() { let cell = nx.gui.find( this, "panel/plotCell" ); if( cell && cell.cmp ) { cell.cmp.clickGetItem(); } }, } );