taskServce.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. import { _decorator, Component, Node } from 'cc';
  2. import { da_guai_item_data, event_active_event_item, event_collect_event_item, event_item, event_start_event_item, task_data, zhao_xi_jie_data, zhao_xi_jie_item_data } from '../../../data/data';
  3. import { config } from '../../config';
  4. import { tools } from '../../tools';
  5. import { ClientEvent } from '../../clientEvent';
  6. import { gameManager } from '../gameManager';
  7. const { ccclass, property } = _decorator;
  8. @ccclass('taskServce')
  9. export class taskServce {
  10. private static mTaskData:task_data = null;
  11. private static exeWidgeTaskDic:Map<number,event_item> = new Map;
  12. private static taskZhaoXiJie:Map<number,zhao_xi_jie_item_data> = new Map;
  13. private static taskDaGuai:Map<number,da_guai_item_data> = new Map;
  14. private static finishZhaoXiJie:Map<number,boolean> = new Map;
  15. private static finishDaGuai:Map<number,boolean> = new Map;
  16. private static cur_collect_event:event_item = null;
  17. public static guo_ju_qing_binding_event_id:number = -1;
  18. private static isFinishZhaoXiJieTask:boolean = false;
  19. private static finishZhaoXiJieLastEventId:number = -1;
  20. //子场景
  21. private static mChildSceneData:task_data = null;
  22. private static childSceneZhaoXiJie:Map<number,zhao_xi_jie_item_data> = new Map;
  23. private static childSceneGuoJuQingBidingEventId:number = -1;
  24. public static initTask(data:task_data){
  25. taskServce.clearTask()
  26. taskServce.mTaskData = data;
  27. if(taskServce.mTaskData==null){
  28. // tools.showToast("当前场景没有任务")
  29. return
  30. }
  31. this.initAllBeEventListen()
  32. // this.initAllHideWidgetListen()
  33. switch (taskServce.mTaskData.type) {
  34. case config.task_type.zhao_xi_jie:
  35. taskServce.initZhaoXiJieTask()
  36. break;
  37. case config.task_type.guo_ju_qing:
  38. taskServce.guo_ju_qing_binding_event_id = taskServce.mTaskData._guo_ju_qing.binding_event_id;
  39. break;
  40. case config.task_type.guo_ju_qing_not_rule:
  41. break;
  42. case config.task_type.da_guai:
  43. taskServce.initDaBoss()
  44. break;
  45. }
  46. }
  47. public static clearTask(){
  48. taskServce.mTaskData = null;
  49. taskServce.exeWidgeTaskDic.clear();
  50. // taskServce.exeHideWidgeTaskDic.clear();
  51. taskServce.taskZhaoXiJie.clear()
  52. taskServce.taskDaGuai.clear()
  53. taskServce.finishDaGuai.clear()
  54. taskServce.finishZhaoXiJie.clear();
  55. taskServce.cur_collect_event = null;
  56. taskServce.guo_ju_qing_binding_event_id = -1;
  57. taskServce.isFinishZhaoXiJieTask = false;
  58. taskServce.finishZhaoXiJieLastEventId = -1;
  59. }
  60. public static initZhaoXiJieTask(){
  61. if(taskServce.mTaskData.type==config.task_type.zhao_xi_jie){
  62. if(taskServce.mTaskData._zhao_xi_jie_data===null){
  63. return tools.showToast("找细节配置错误")
  64. }
  65. }
  66. for (let index = 0; index < taskServce.mTaskData._zhao_xi_jie_data.widget_id_list.length; index++) {
  67. const widget = taskServce.mTaskData._zhao_xi_jie_data.widget_id_list[index];
  68. taskServce.taskZhaoXiJie.set(widget.widget_id,widget);
  69. }
  70. }
  71. public static initDaBoss(){
  72. if(taskServce.mTaskData.type==config.task_type.da_guai){
  73. if(taskServce.mTaskData._da_guai===null){
  74. return tools.showToast("打boss 配置错误")
  75. }
  76. }
  77. for (let index = 0; index < taskServce.mTaskData._da_guai.widget_id_list.length; index++) {
  78. const widget = taskServce.mTaskData._da_guai.widget_id_list[index];
  79. taskServce.taskDaGuai.set(widget.widget_id,widget);
  80. }
  81. }
  82. public static initChildSceneZhaoXiJieTask(){
  83. if(taskServce.mChildSceneData.type==config.task_type.zhao_xi_jie){
  84. if(taskServce.mChildSceneData._zhao_xi_jie_data===null){
  85. return tools.showToast("找细节配置错误")
  86. }
  87. }
  88. for (let index = 0; index < taskServce.mChildSceneData._zhao_xi_jie_data.widget_id_list.length; index++) {
  89. const widget = taskServce.mChildSceneData._zhao_xi_jie_data.widget_id_list[index];
  90. taskServce.childSceneZhaoXiJie.set(widget.widget_id,widget);
  91. }
  92. }
  93. public static startFirstEvent(){
  94. if(taskServce.mTaskData==null){
  95. // return tools.showToast("当前场景没有任务")
  96. }
  97. let startEvent:event_start_event_item = this.getStartEvent()
  98. if(startEvent==null){
  99. return tools.showToast("第一个任务不可以为空,编辑错误!")
  100. }
  101. let event:event_item = this.getEventById(startEvent.binding_event_id)
  102. taskServce.DistributedEvent(event)
  103. }
  104. public static StartChildSceneTask(data:task_data){
  105. taskServce.mChildSceneData = data;
  106. switch (taskServce.mChildSceneData.type) {
  107. case config.task_type.zhao_xi_jie:
  108. taskServce.initChildSceneZhaoXiJieTask()
  109. break;
  110. case config.task_type.guo_ju_qing:
  111. taskServce.childSceneGuoJuQingBidingEventId = taskServce.mChildSceneData._guo_ju_qing.binding_event_id;
  112. break;
  113. case config.task_type.guo_ju_qing_not_rule:
  114. break;
  115. case config.task_type.da_guai:
  116. break;
  117. }
  118. }
  119. public static DistributedEvent(event:event_item){
  120. // console.log("event",event)
  121. if(event==null){
  122. return
  123. }
  124. if(event.event_id===taskServce.guo_ju_qing_binding_event_id){
  125. taskServce.guo_ju_qing_binding_event_id = -1;
  126. ClientEvent.dispatchEvent(config.EventRun.ON_SHOW_RULE_BTN)
  127. }
  128. switch(event.type){
  129. case config.event_type.play_ani:
  130. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_play_ani_data.binding_widget_id,event)
  131. break;
  132. case config.event_type.top_view:
  133. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_top_view_data.binding_ui_id,event)
  134. break;
  135. case config.event_type.top_view_hide:
  136. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_top_view_hide_data.binding_ui_id,event)
  137. break;
  138. case config.event_type.text_sound:
  139. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_text_sound_data.binding_widget_id,event)
  140. break;
  141. case config.event_type.change_one_item_status:
  142. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_change_one_item_status_data.binding_widget_id,event)
  143. break;
  144. case config.event_type.show_new_item:
  145. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_show_new_item_data.binding_widget_id,event)
  146. break;
  147. case config.event_type.show_question_select:
  148. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_show_question_select_data.binding_widget_id,event)
  149. break;
  150. case config.event_type.collect_event:
  151. taskServce.cur_collect_event = new event_item;
  152. taskServce.cur_collect_event.event_id = event.event_id;
  153. taskServce.cur_collect_event.type = event.type;
  154. taskServce.cur_collect_event.event_item_collect_event_data = new event_collect_event_item
  155. for (let index = 0; index < event.event_item_collect_event_data.event_id_list.length; index++) {
  156. const element = event.event_item_collect_event_data.event_id_list[index];
  157. taskServce.cur_collect_event.event_item_collect_event_data.event_id_list.push(element)
  158. }
  159. // console.log("collect_event--",taskServce.cur_collect_event)
  160. // for (let index = 0; index < taskServce.cur_collect_event.event_item_collect_event_data.event_id_list.length; index++) {
  161. // const element = taskServce.cur_collect_event.event_item_collect_event_data.event_id_list[index];
  162. // let widget_id = taskServce.getEventById(element).event_item_be_event_data.binding_widget_id
  163. // let event_data = new event_item
  164. // //激活控件
  165. // let active_event = new event_active_event_item
  166. // active_event.binding_widget_id = widget_id
  167. // event_data.type = config.event_type.active_event
  168. // event_data.event_item_active_event_data = active_event
  169. // // 事件
  170. // taskServce.DistributedEvent(event_data)
  171. // console.log("event_data--",event_data)
  172. // }
  173. break;
  174. // case config.event_type.start_event:
  175. // break;
  176. case config.event_type.active_event:
  177. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_active_event_data.binding_widget_id,event)
  178. break;
  179. case config.event_type.stop_active_event:
  180. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_stop_active_event_data.binding_widget_id,event)
  181. break;
  182. case config.event_type.countdown_over:
  183. break;
  184. case config.event_type.be_event:
  185. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_be_event_data.binding_widget_id,event)
  186. break;
  187. case config.event_type.hide:
  188. if(event.event_item_hide_data==null){
  189. return tools.showToast("隐藏事件配置错误~")
  190. }
  191. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,event.event_item_hide_data.binding_widget_id,event)
  192. break;
  193. case config.event_type.delay_exe_event:
  194. console.log("delay_exe_event")
  195. if(event.event_item_delay_exe_data==null){
  196. return tools.showToast("延迟执行事件配置错误")
  197. }
  198. let delay_time = event.event_item_delay_exe_data.delay_time;
  199. let event_id = event.event_item_delay_exe_data.binding_event_id;
  200. gameManager.Singleton.scheduleOnce(()=>{
  201. let event:event_item = this.getEventById(event_id)
  202. taskServce.DistributedEvent(event)
  203. },delay_time)
  204. break;
  205. case config.event_type.fail_event:
  206. console.log("play_sound --- 1")
  207. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  208. break;
  209. case config.event_type.play_sound:
  210. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  211. break;
  212. case config.event_type.show_scene_title:
  213. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  214. break;
  215. case config.event_type.scene_ani:
  216. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  217. break;
  218. case config.event_type.delete_drag_other_data:
  219. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  220. break;
  221. case config.event_type.stop_play_loop_sound:
  222. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  223. break;
  224. case config.event_type.switch_scene_event:
  225. break;
  226. case config.event_type.more_scene_is_show_arrow_event:
  227. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  228. break;
  229. case config.event_type.more_scene_jump_assigned_page_event:
  230. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  231. break;
  232. case config.event_type.event_group:
  233. ClientEvent.dispatchEvent(config.EventRun.NOTICE_EVENT,-11,event)
  234. break;
  235. }
  236. taskServce.exeNextDelayEvent(event)
  237. }
  238. /**
  239. *
  240. * @zh 根据id 获取事件
  241. *
  242. */
  243. public static getEventById(event_id:number):event_item{
  244. for (let index = 0; index < taskServce.mTaskData.event_list.length; index++) {
  245. const event = taskServce.mTaskData.event_list[index];
  246. if(event.event_id===event_id){
  247. return event;
  248. }
  249. }
  250. return null;
  251. }
  252. public static initAllBeEventListen(){ //把所有被动事件加进来
  253. for (let index = 0; index < taskServce.mTaskData.event_list.length; index++) {
  254. const element = taskServce.mTaskData.event_list[index];
  255. if(element.type===config.event_type.be_event){
  256. this.pushWidgetEvent(element.event_item_be_event_data.binding_widget_id,element)
  257. }
  258. }
  259. }
  260. // public static initAllHideWidgetListen(){ //把所有被动事件加进来
  261. // for (let index = 0; index < taskServce.mTaskData.event_list.length; index++) {
  262. // const element = taskServce.mTaskData.event_list[index];
  263. // if(element.type===config.event_type.hide){
  264. // this.pushHideWidgetEvent(element.event_item_hide_data.binding_widget_id,element)
  265. // }
  266. // }
  267. // }
  268. /**
  269. *
  270. * @zh 获取开始任务
  271. *
  272. */
  273. public static getStartEvent():event_start_event_item{
  274. if(taskServce.mTaskData==null){
  275. return null;
  276. }
  277. for (let index = 0; index < taskServce.mTaskData.event_list.length; index++) {
  278. const event = taskServce.mTaskData.event_list[index];
  279. if(event.type===config.event_type.start_event){
  280. return event.event_item_start_event_data;
  281. }
  282. }
  283. return null;
  284. }
  285. public static pushWidgetEvent(widget:number,event:event_item){
  286. this.exeWidgeTaskDic.set(widget,event)
  287. }
  288. // public static pushHideWidgetEvent(widget:number,event:event_item){
  289. // this.exeHideWidgeTaskDic.set(widget,event)
  290. // }
  291. public static onWidgetFailEvent(widget_id:number){ //监听被动控件失败了自己的任务
  292. let event = this.exeWidgeTaskDic.get(widget_id)
  293. if(event!=null){
  294. if(event.fail.is_restart){
  295. return gameManager.Singleton.reStartGame()
  296. }else{
  297. if(event.fail.is_relife){
  298. return gameManager.Singleton.reLife()
  299. }
  300. }
  301. let id = event.success.trigger_event_id;
  302. if(id!=-1){
  303. let event:event_item = this.getEventById(id)
  304. taskServce.DistributedEvent(event)
  305. }
  306. }
  307. }
  308. public static onWidgetFinishEvent(widget_id:number, finish_event_item:event_item){ //监听被动控件完成了自己的任务
  309. if(taskServce.mTaskData==null){
  310. return
  311. }
  312. let event = this.exeWidgeTaskDic.get(widget_id)
  313. if(taskServce.cur_collect_event!=null){
  314. if(event!=null){
  315. let e_index = taskServce.cur_collect_event.event_item_collect_event_data.event_id_list.indexOf(event.event_id)
  316. if(e_index!=-1){
  317. taskServce.cur_collect_event.event_item_collect_event_data.event_id_list.splice(e_index,1)
  318. }
  319. if(taskServce.cur_collect_event.event_item_collect_event_data.event_id_list.length<=0){
  320. ClientEvent.dispatchEvent(config.EventRun.ON_WIDGET_FINISH_COLLECT_EVENT,taskServce.cur_collect_event.event_id)
  321. let collect_event = taskServce.getEventById(taskServce.cur_collect_event.event_id)
  322. if(collect_event.success.trigger_event_id!=-1){
  323. taskServce.extEventByEventId(collect_event.success.trigger_event_id)
  324. }
  325. console.log("ON_WIDGET_FINISH_COLLECT_EVENT event",collect_event)
  326. }
  327. }
  328. // console.log("event", taskServce.cur_collect_event.event_item_collect_event_data.event_id_list)
  329. }
  330. let id = taskServce.exeNextEvent(event)
  331. switch (taskServce.mTaskData.type) {
  332. case config.task_type.zhao_xi_jie:
  333. let d = taskServce.taskZhaoXiJie.get(widget_id);
  334. this.checkFinishZhaoXiJieEventItem(finish_event_item)
  335. if(d===null||d===undefined){
  336. return
  337. }
  338. taskServce.finishZhaoXiJie.set(widget_id,true)
  339. ClientEvent.dispatchEvent(config.EventRun.SHOW_ZHAO_BU_TONG_FINISH_STATUS,d)
  340. taskServce.checkFinishZhaoXiJieTask(widget_id)
  341. break;
  342. case config.task_type.guo_ju_qing:
  343. break;
  344. case config.task_type.guo_ju_qing_not_rule:
  345. break;
  346. case config.task_type.da_guai:
  347. let d_1 = taskServce.taskDaGuai.get(widget_id);
  348. if(d_1===null||d_1===undefined){
  349. return
  350. }
  351. taskServce.finishDaGuai.set(widget_id,true)
  352. ClientEvent.dispatchEvent(config.EventRun.ON_BOSS_HURT,d_1.hurt)
  353. taskServce.checkFinishDaBossTask()
  354. break;
  355. }
  356. }
  357. public static checkFinishDaBossTask(){
  358. let isFinish = true;
  359. if(!taskServce.mTaskData._da_guai){
  360. return isFinish
  361. }
  362. for (let index = 0; index < taskServce.mTaskData._da_guai.widget_id_list.length; index++) {
  363. const element = taskServce.mTaskData._da_guai.widget_id_list[index];
  364. let isShow = gameManager.Singleton.isCurScenePageCheckWidgetShow(element.widget_id)
  365. // if(!taskServce.finishDaGuai.get(element.widget_id)){
  366. // isFinish = false
  367. // break;
  368. // }
  369. if(isShow){
  370. isFinish = false;
  371. break;
  372. }
  373. }
  374. if(isFinish){
  375. ClientEvent.dispatchEvent(config.EventRun.ON_BOSS_HURT,0)
  376. }
  377. }
  378. public static checkFinishZhaoXiJieEventItem(finish_event_item:event_item) {
  379. if(!finish_event_item) { return }
  380. if(taskServce.isFinishZhaoXiJieTask) {
  381. if(finish_event_item.event_id == taskServce.finishZhaoXiJieLastEventId) {
  382. // console.log('事件完成 事件完成 事件完成 执行')
  383. gameManager.Singleton.unscheduleAllCallbacks()
  384. let zhaoxijie_data = taskServce.mTaskData._zhao_xi_jie_data
  385. ClientEvent.dispatchEvent(config.EventRun.ON_ZHAO_BU_TONG_ALL_FINISH, zhaoxijie_data)
  386. let id = zhaoxijie_data.finish_event_id
  387. taskServce.DistributedEvent(taskServce.getEventById(id))
  388. }
  389. }
  390. }
  391. public static checkFinishZhaoXiJieTask(widget_id:number){
  392. let isFinish = true;
  393. taskServce.finishZhaoXiJieLastEventId = -1
  394. for (let index = 0; index < taskServce.mTaskData._zhao_xi_jie_data.widget_id_list.length; index++) {
  395. const element = taskServce.mTaskData._zhao_xi_jie_data.widget_id_list[index];
  396. if(!taskServce.finishZhaoXiJie.get(element.widget_id)){
  397. isFinish = false
  398. break;
  399. } else {
  400. if(element.widget_id==widget_id) { //找到最后一个
  401. if(element.finish_event_id) { // if(element.finish_event_id!=undefined)
  402. taskServce.finishZhaoXiJieLastEventId = element.finish_event_id
  403. }
  404. }
  405. }
  406. }
  407. taskServce.isFinishZhaoXiJieTask = isFinish
  408. if(isFinish){
  409. let zhaoxijie_data = taskServce.mTaskData._zhao_xi_jie_data
  410. let id = zhaoxijie_data.finish_event_id
  411. let dalay_time = zhao_xi_jie_data.defaultFinishAllHideAnswerDalayTime()
  412. if( zhaoxijie_data.finish_all_hide_answer_dalay_time!=undefined) {
  413. dalay_time = zhaoxijie_data.finish_all_hide_answer_dalay_time
  414. }
  415. gameManager.Singleton.scheduleOnce(()=>{
  416. ClientEvent.dispatchEvent(config.EventRun.ON_ZHAO_BU_TONG_ALL_FINISH, zhaoxijie_data)
  417. },dalay_time)
  418. if(id==-1){
  419. taskServce.isFinishZhaoXiJieTask = false
  420. taskServce.finishZhaoXiJieLastEventId = -1
  421. return tools.showToast("未设置全部找完任务的下一个事件!")
  422. }else{
  423. if(taskServce.finishZhaoXiJieLastEventId==-1) {
  424. // console.log('直接执行了 直接执行了 直接执行了')
  425. taskServce.DistributedEvent(taskServce.getEventById(id))
  426. }
  427. }
  428. }
  429. }
  430. // public static onWidgetHideEvent(widget_id:number){
  431. // let event = this.exeHideWidgeTaskDic.get(widget_id)
  432. // if(!event){
  433. // return tools.showToast("隐藏事件没有找到!")
  434. // }
  435. // ClientEvent.dispatchEvent(config.EventRun.WIDGET_HIDE,event.event_item_hide_data.binding_widget_id,event)
  436. // taskServce.exeNextEvent(event)
  437. // }
  438. public static exeNextEvent(event:event_item){
  439. let id = -1;
  440. if(event!=null){
  441. if(event.success.is_finish_game){
  442. tools.showToast("调用了游戏结束")
  443. return gameManager.Singleton.gameOver()
  444. }else{
  445. if(event.success.is_next_scene){
  446. return gameManager.Singleton.nextScene()
  447. }
  448. }
  449. id = event.success.trigger_event_id;
  450. if(id!=-1){
  451. let _event:event_item = this.getEventById(id)
  452. taskServce.DistributedEvent(_event)
  453. }
  454. }
  455. return id;
  456. }
  457. public static extEventByEventId(event_id:number){
  458. if(event_id===-1){
  459. return
  460. }
  461. let event = taskServce.getEventById(event_id)
  462. if(event==null){
  463. return tools.showToast(`事件错误${event_id}`)
  464. }
  465. taskServce.DistributedEvent(event)
  466. }
  467. public static exeNextDelayEvent(event:event_item){
  468. if(event!=null){
  469. if(event.success.is_finish_game){
  470. return gameManager.Singleton.gameOver()
  471. }else{
  472. if(event.success.is_next_scene){
  473. return gameManager.Singleton.nextScene()
  474. }
  475. }
  476. let id = event.success.trigger_event_id;
  477. if(id!=-1){
  478. let _event:event_item = this.getEventById(id)
  479. if(_event===null){
  480. return tools.showToast(`配置延迟调用错误-${id}`)
  481. }
  482. if(_event.type == config.event_type.delay_exe_event){
  483. taskServce.DistributedEvent(_event)
  484. }
  485. }
  486. }
  487. }
  488. public static exeSuccessTriggerEvent(trigger_event_id: number) {
  489. if(trigger_event_id == -1) {
  490. return
  491. }
  492. let event = this.getEventById(trigger_event_id)
  493. if(event == null) {
  494. return
  495. }
  496. taskServce.extEventByEventId(event.event_id)
  497. }
  498. }