Skip to content

Commit 5ba54f9

Browse files
committed
feat:游戏结束事件施工中
1 parent cf609f4 commit 5ba54f9

3 files changed

Lines changed: 96 additions & 4 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,4 @@ src/plugins/*/*.db
172172
data/*
173173
.iflow/
174174
.claude/settings.local.json
175+
src/stats.dat

src/mineSweeperGUI.py

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import ctypes
2929
import hashlib
3030
import uuid
31+
from Crypto.Cipher import AES
32+
from Crypto.Util.Padding import pad, unpad
3133
# from PyQt5.QtWidgets import QApplication
3234
from country_name import country_name
3335
import metaminesweeper_checksum
@@ -321,6 +323,7 @@ def onGameEnd(self, new_game_state):
321323
# 不论如何都必然生成数据
322324
self.dump_evf_file_data()
323325
# 发信号给插件,游戏结束了
326+
board = self.label.ms_board.board
324327
event = GameEndEvent(
325328
game_state = ['ready', 'study', 'show', 'playing', 'joking', 'fail',
326329
'win', 'jofail', 'jowin', 'display', 'showdisplay'].index(new_game_state),
@@ -356,14 +359,61 @@ def onGameEnd(self, new_game_state):
356359
op = self.label.ms_board.op,
357360
isl = self.label.ms_board.isl,
358361
pluck = self.label.ms_board.pluck,
359-
board = self.label.ms_board.board,
362+
board = board if isinstance(board, list) else board.into_vec_vec(),
360363
raw_data = self.label.ms_board.raw_data
361364
)
362365
GameServerBridge.instance().send_event(event)
363366

364-
# 强制保存Metasweeper.dat文件
365-
...
366-
367+
# 强制保存stats.dat文件
368+
record = utils.StatsRecord(
369+
game_state=event.game_state,
370+
nf=event.nf,
371+
row=event.row,
372+
column=event.column,
373+
mine_num=event.mine_num,
374+
rtime=event.rtime,
375+
left=event.left,
376+
right=event.right,
377+
double=event.double,
378+
level=event.level,
379+
cl=event.cl,
380+
ce=event.ce,
381+
rce=event.rce,
382+
lce=event.lce,
383+
dce=event.dce,
384+
bbbv=event.bbbv,
385+
bbbv_solved=event.bbbv_solved,
386+
zini=event.zini,
387+
flag=event.flag,
388+
path=event.path,
389+
start_time=event.start_time,
390+
end_time=event.end_time,
391+
mode=event.mode,
392+
software=event.software,
393+
player_identifier=event.player_identifier,
394+
race_identifier=event.race_identifier,
395+
uniqueness_identifier=event.uniqueness_identifier,
396+
is_official=event.is_official,
397+
is_fair=event.is_fair,
398+
op=event.op,
399+
isl=event.isl,
400+
pluck=event.pluck,
401+
board=event.board
402+
)
403+
binary_data = msgspec.msgpack.encode(record)
404+
# 简单的AES加密
405+
key = bytes([2,135,180,102,125,204,245,102,253,59,217,7,114,61,231,62]) # 16字节的密钥
406+
cipher = AES.new(key, AES.MODE_ECB)
407+
padded_data = pad(binary_data, AES.block_size)
408+
encrypted_data = cipher.encrypt(padded_data)
409+
dat_file_path = self.setting_path / 'stats.dat'
410+
# 把二进制加密数据 编码成 base64 字符串(bytes)
411+
b64_data = base64.b64encode(encrypted_data)
412+
is_empty = not os.path.exists(dat_file_path) or os.path.getsize(dat_file_path) == 0
413+
with open(dat_file_path, 'ab') as f:
414+
if not is_empty:
415+
f.write(b"\n")
416+
f.write(b64_data)
367417

368418

369419
# 根据策略保存录像文件到磁盘

src/utils.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import sys
77
import sys
88
from typing import List, Tuple, Union
9+
10+
import msgspec
911
# import time
1012
from safe_eval import safe_eval
1113
import configparser
@@ -462,6 +464,45 @@ def __getitem__(self, inner_key):
462464
game_board_poss = AlwaysZero()
463465

464466

467+
468+
# stats.dat文件的记录结构
469+
class StatsRecord(msgspec.Struct, tag=False):
470+
game_state: int
471+
nf: bool
472+
row: int
473+
column: int
474+
mine_num: int
475+
rtime: float
476+
left: int
477+
right: int
478+
double: int
479+
level: int
480+
cl: int
481+
ce: int
482+
rce: int
483+
lce: int
484+
dce: int
485+
bbbv: int
486+
bbbv_solved: int
487+
zini: int
488+
flag: int
489+
path: float
490+
start_time: int
491+
end_time: int
492+
mode: int
493+
software: str
494+
player_identifier: str
495+
race_identifier: str
496+
uniqueness_identifier: str
497+
is_official: bool
498+
is_fair: bool
499+
op: int
500+
isl: int
501+
pluck: float
502+
board: list
503+
504+
505+
465506
# unsolvableStructure = ms_toollib.py_unsolvableStructure
466507
# unsolvableStructure2(BoardCheck)
467508
# 用几种模板,检测局面中是否有明显的死猜的结构

0 commit comments

Comments
 (0)