77# from PyQt5.QtWidgets import QApplication, QFileDialog, QWidget
88import gameDefinedParameter
99from plugin_sdk .server_bridge import GameServerBridge
10- from shared_types .events import VideoSaveEvent , BoardUpdateEvent , GameStatusChangeEvent
10+ from shared_types .events import GameEndEvent , BoardUpdateEvent , GameStatusChangeEvent
1111import superGUI
1212import gameAbout
1313import gameSettings
@@ -224,7 +224,7 @@ def game_state(self, game_state: str):
224224
225225 match self ._game_state :
226226 case "playing" :
227- self .try_append_evfs (game_state )
227+ self .onGameEnd (game_state )
228228 if game_state not in ("playing" , "show" , "joking" ):
229229 self .timer_10ms .stop ()
230230 self .unlimit_cursor ()
@@ -280,6 +280,7 @@ def game_state(self, game_state: str):
280280 GameServerBridge .instance ().send_event (event )
281281 self ._send_board_update_event ()
282282
283+
283284 @property
284285 def row (self ):
285286 return self ._row
@@ -313,6 +314,65 @@ def minenum(self, minenum):
313314 })
314315 self ._minenum = minenum
315316
317+
318+ # 生命周期函数,正式的游戏结束时调用。由游戏状态的变更触发,当且仅当由playing变为其他状态
319+ # 处理数据相关。不处理前端显示
320+ def onGameEnd (self , new_game_state ):
321+ # 不论如何都必然生成数据
322+ self .dump_evf_file_data ()
323+ # 发信号给插件,游戏结束了
324+ event = GameEndEvent (
325+ game_state = ['ready' , 'study' , 'show' , 'playing' , 'joking' , 'fail' ,
326+ 'win' , 'jofail' , 'jowin' , 'display' , 'showdisplay' ].index (new_game_state ),
327+ nf = self .label .ms_board .rce == 0 ,
328+ row = self .label .ms_board .row ,
329+ column = self .label .ms_board .column ,
330+ mine_num = self .label .ms_board .mine_num ,
331+ rtime = self .label .ms_board .rtime ,
332+ left = self .label .ms_board .left ,
333+ right = self .label .ms_board .right ,
334+ double = self .label .ms_board .double ,
335+ # 游戏难度(级别)。3是初级;4是中级;5是高级;6是自定义。
336+ level = self .label .ms_board .level ,
337+ cl = self .label .ms_board .cl ,
338+ ce = self .label .ms_board .ce ,
339+ rce = self .label .ms_board .rce ,
340+ lce = self .label .ms_board .lce ,
341+ dce = self .label .ms_board .dce ,
342+ bbbv = self .label .ms_board .bbbv ,
343+ bbbv_solved = self .label .ms_board .bbbv_solved ,
344+ zini = self .label .ms_board .zini ,
345+ flag = self .label .ms_board .flag ,
346+ path = self .label .ms_board .path ,
347+ start_time = self .label .ms_board .start_time ,
348+ end_time = self .label .ms_board .end_time ,
349+ mode = self .label .ms_board .mode ,
350+ software = self .label .ms_board .software ,
351+ player_identifier = self .label .ms_board .player_identifier ,
352+ race_identifier = self .label .ms_board .race_identifier ,
353+ uniqueness_identifier = self .label .ms_board .uniqueness_identifier ,
354+ is_official = self .label .ms_board .is_official ,
355+ is_fair = self .label .ms_board .is_fair ,
356+ op = self .label .ms_board .op ,
357+ isl = self .label .ms_board .isl ,
358+ pluck = self .label .ms_board .pluck ,
359+ board = self .label .ms_board .board ,
360+ raw_data = self .label .ms_board .raw_data
361+ )
362+ GameServerBridge .instance ().send_event (event )
363+
364+ # 强制保存Metasweeper.dat文件
365+ ...
366+
367+
368+
369+ # 根据策略保存录像文件到磁盘
370+ if self .autosave_video and self .checksum_module_ok () and \
371+ new_game_state in "win" :
372+ self .save_evf_file ()
373+ self .try_append_evfs (new_game_state )
374+
375+
316376 def layMine (self , i , j ):
317377
318378 xx = self .row
@@ -629,24 +689,24 @@ def gameFinished(self):
629689 self .score_board_manager .show (self .label .ms_board , index_type = 2 )
630690 self .enable_screenshot ()
631691 self .unlimit_cursor ()
632- ms_board = self .label .ms_board
633- status = utils .GameBoardState (ms_board .game_board_state )
634- if status == utils .GameBoardState .Win :
635- self .dump_evf_file_data ()
636- event = VideoSaveEvent ()
637- data = msgspec .structs .asdict (event )
638- for key in data :
639- if hasattr (ms_board , key ):
640- if key == "raw_data" :
641- data [key ] = base64 .b64encode (
642- ms_board .raw_data ).decode ("utf-8" )
643- continue
644- data [key ] = getattr (ms_board , key )
645- event = VideoSaveEvent (** data )
646- GameServerBridge .instance ().send_event (event )
692+ # ms_board = self.label.ms_board
693+ # status = utils.GameBoardState(ms_board.game_board_state)
694+ # if status == utils.GameBoardState.Win:
695+ # self.dump_evf_file_data()
696+ # event = VideoSaveEvent()
697+ # data = msgspec.structs.asdict(event)
698+ # for key in data:
699+ # if hasattr(ms_board, key):
700+ # if key == "raw_data":
701+ # data[key] = base64.b64encode(
702+ # ms_board.raw_data).decode("utf-8")
703+ # continue
704+ # data[key] = getattr(ms_board, key)
705+ # event = VideoSaveEvent(**data)
706+ # GameServerBridge.instance().send_event(event)
647707
648708 # 发送棋盘更新事件,让插件知道最终状态
649- self ._send_board_update_event ()
709+ # self._send_board_update_event()
650710
651711 def gameWin (self ): # 成功后改脸和状态变量,停时间
652712 self .timer_10ms .stop ()
@@ -660,9 +720,9 @@ def gameWin(self): # 成功后改脸和状态变量,停时间
660720 raise RuntimeError
661721 self .set_face (17 )
662722
663- if self .autosave_video and self .checksum_module_ok ():
664- self .dump_evf_file_data ()
665- self .save_evf_file ()
723+ # if self.autosave_video and self.checksum_module_ok():
724+ # self.dump_evf_file_data()
725+ # self.save_evf_file()
666726
667727 self .gameFinished ()
668728
@@ -736,11 +796,17 @@ def dump_evf_file_data(self):
736796 # 将evf数据存成evf文件
737797 # 调试的时候不会自动存录像,见checksum_module_ok
738798 # 菜单保存的回调。以及游戏结束自动保存。
739- def save_evf_file (self ):
799+ # 返回保存的文件绝对路径
800+ def save_evf_file (self ) -> str :
740801 if not os .path .exists (self .replay_path ):
741802 os .mkdir (self .replay_path )
742803
743- self .label .ms_board .save_to_evf_file (self .cal_evf_filename ())
804+ file_name = self .cal_evf_filename ()
805+ # 加上后缀和重复标识数字
806+ real_file_name = self .label .ms_board .save_to_evf_file (file_name )
807+ absolute_path = os .path .abspath (os .path .join (self .replay_path , real_file_name ))
808+ return absolute_path
809+
744810
745811 # 拼接evf录像的文件名,无后缀
746812 def cal_evf_filename (self , absolute = True ) -> str :
0 commit comments