|
7 | 7 | # from PyQt5.QtWidgets import QApplication, QFileDialog, QWidget |
8 | 8 | import gameDefinedParameter |
9 | 9 | from plugin_sdk.server_bridge import GameServerBridge |
10 | | -from shared_types.events import VideoSaveEvent |
| 10 | +from shared_types.events import VideoSaveEvent, BoardUpdateEvent, GameStatusChangeEvent |
11 | 11 | import superGUI |
12 | 12 | import gameAbout |
13 | 13 | import gameSettings |
|
37 | 37 |
|
38 | 38 |
|
39 | 39 | class MineSweeperGUI(MineSweeperVideoPlayer): |
| 40 | + |
40 | 41 | def __init__(self, MainWindow: MainWindow, args): |
41 | 42 | self.mainWindow = MainWindow |
42 | 43 | self.checksum_guard = metaminesweeper_checksum.ChecksumGuard() |
@@ -219,6 +220,8 @@ def game_state(self): |
219 | 220 | @game_state.setter |
220 | 221 | def game_state(self, game_state: str): |
221 | 222 | # print(self._game_state, " -> " ,game_state) |
| 223 | + last_state = self._game_state |
| 224 | + |
222 | 225 | match self._game_state: |
223 | 226 | case "playing": |
224 | 227 | self.try_append_evfs(game_state) |
@@ -252,8 +255,31 @@ def game_state(self, game_state: str): |
252 | 255 | self.label.paint_cursor = False |
253 | 256 | self.label.paintProbability = False |
254 | 257 | self.num_bar_ui.QWidget.close() |
| 258 | + |
255 | 259 | self._game_state = game_state |
256 | 260 |
|
| 261 | + # 发送游戏状态变化事件 |
| 262 | + state_map = { |
| 263 | + "ready": 1, |
| 264 | + "playing": 2, |
| 265 | + "win": 3, |
| 266 | + "fail": 4, |
| 267 | + "joking": 2, # joking 也视为游戏中 |
| 268 | + "jowin": 3, |
| 269 | + "jofail": 4, |
| 270 | + "show": 5, |
| 271 | + "study": 6, |
| 272 | + "display": 7, |
| 273 | + "showdisplay": 8, |
| 274 | + } |
| 275 | + if last_state != game_state: |
| 276 | + event = GameStatusChangeEvent( |
| 277 | + last_status=state_map.get(last_state, 0), |
| 278 | + current_status=state_map.get(game_state, 0), |
| 279 | + ) |
| 280 | + GameServerBridge.instance().send_event(event) |
| 281 | + self._send_board_update_event() |
| 282 | + |
257 | 283 | @property |
258 | 284 | def row(self): |
259 | 285 | return self._row |
@@ -477,6 +503,54 @@ def mineNumWheel(self, i): |
477 | 503 | # self.timer_mine_num.setSingleShot(True) |
478 | 504 | # self.timer_mine_num.start(3000) |
479 | 505 |
|
| 506 | + def _send_board_update_event(self): |
| 507 | + """发送棋盘更新事件给插件""" |
| 508 | + try: |
| 509 | + ms_board = self.label.ms_board |
| 510 | + # 将 game_board 转换为列表格式 |
| 511 | + game_board_list = [] |
| 512 | + for row in ms_board.game_board: |
| 513 | + game_board_list.append(list(row)) |
| 514 | + |
| 515 | + event = BoardUpdateEvent( |
| 516 | + rows=self.row, |
| 517 | + cols=self.column, |
| 518 | + game_board=game_board_list, |
| 519 | + mines_remaining=self.mineUnFlagedNum, |
| 520 | + game_time=ms_board.time if hasattr(ms_board, 'time') else 0.0, |
| 521 | + ) |
| 522 | + GameServerBridge.instance().send_event(event) |
| 523 | + except Exception: |
| 524 | + pass # 忽略发送失败 |
| 525 | + |
| 526 | + def execute_cell_click(self, row: int, col: int, button: int): |
| 527 | + """ |
| 528 | + 执行格子点击(供外部命令调用) |
| 529 | +
|
| 530 | + Args: |
| 531 | + row: 行索引(从 0 开始) |
| 532 | + col: 列索引(从 0 开始) |
| 533 | + button: 鼠标按钮(0=左键, 1=中键, 2=右键) |
| 534 | + """ |
| 535 | + if row < 0 or row >= self.row or col < 0 or col >= self.column: |
| 536 | + return False |
| 537 | + x = row * self.pixSize |
| 538 | + y = col * self.pixSize |
| 539 | + if button == 0: |
| 540 | + self.mineAreaLeftPressed(x, y) |
| 541 | + self.mineAreaLeftRelease(x, y) |
| 542 | + elif button == 1: |
| 543 | + self.mineAreaLeftPressed(x, y) |
| 544 | + self.mineAreaLeftAndRightPressed(x, y) |
| 545 | + self.mineAreaRightRelease(x, y) |
| 546 | + self.mineAreaLeftRelease(x, y) |
| 547 | + else: |
| 548 | + self.mineAreaRightPressed(x, y) |
| 549 | + self.mineAreaRightRelease(x, y) |
| 550 | + |
| 551 | + self._send_board_update_event() |
| 552 | + return True |
| 553 | + |
480 | 554 | def gameStart(self): |
481 | 555 | # 画界面,但是不埋雷。等价于点脸、f2、设置确定后的效果 |
482 | 556 | self.mineUnFlagedNum = self.minenum # 没有标出的雷,显示在左上角 |
@@ -571,6 +645,9 @@ def gameFinished(self): |
571 | 645 | event = VideoSaveEvent(**data) |
572 | 646 | GameServerBridge.instance().send_event(event) |
573 | 647 |
|
| 648 | + # 发送棋盘更新事件,让插件知道最终状态 |
| 649 | + self._send_board_update_event() |
| 650 | + |
574 | 651 | def gameWin(self): # 成功后改脸和状态变量,停时间 |
575 | 652 | self.timer_10ms.stop() |
576 | 653 | self.score_board_manager.editing_row = -1 |
|
0 commit comments