Skip to content

Commit

Permalink
初版 App 完成
Browse files Browse the repository at this point in the history
  • Loading branch information
XcantloadX committed Jul 20, 2024
1 parent a8b5c57 commit 7786a0b
Show file tree
Hide file tree
Showing 24 changed files with 2,662 additions and 19 deletions.
7 changes: 7 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,12 @@
"request": "launch",
"module": "app.editor.save_editor"
},
{
"name": "Entry (Debug Mode)",
"type": "debugpy",
"request": "launch",
"module": "app.entry",
"args": [ "--debug" ]
},
]
}
Empty file added app/__init__.py
Empty file.
59 changes: 41 additions & 18 deletions app/editor/save_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,32 +20,44 @@ class SaveSlot:
scenario: str

class SaveEditor:
def __init__(self, language: Language = 'en') -> None:
game_path = find_game_path()
save_path = find_save_path()
def __init__(
self,
game_path: str|None = None,
language: Language = 'en'
) -> None:
game_path = game_path or find_game_path()
if not game_path:
raise FileNotFoundError('Could not find game path')
if not save_path:
raise FileNotFoundError('Could not find save path')
self.game_path = game_path
self.save_path = save_path
default_save_path = find_save_path()
if not default_save_path:
raise FileNotFoundError('Could not find default save path')
self.default_save_path = default_save_path

self.__save_path: str|None = None

self.__system_data: SystemData|None = None
self.__text_unpacker = TextUnpacker(game_path, language)

def get_save_path(self) -> str|None:
return self.__save_path

def load(self, save_file_path: str|None = None):
if not save_file_path:
save_file_path = os.path.join(self.save_path, 'systemdata')
with open(save_file_path, 'rb') as f:
"""
加载存档数据
:param save_file_path: 存档文件路径,默认为系统存档。
"""
self.__save_path = save_file_path or os.path.join(self.default_save_path, 'systemdata')
with open(self.__save_path, 'rb') as f:
self.__system_data = SystemData.from_bytes(f.read())

def save(self, save_file_path: str|None = None):
assert self.__system_data is not None, 'No data loaded'
if not save_file_path:
save_file_path = os.path.join(self.save_path, 'systemdata')
save_file_path = os.path.join(self.default_save_path, 'systemdata')
with open(save_file_path, 'wb') as f:
f.write(self.__system_data.to_bytes())

def set_account_id(self, account_id: int):
"""
设置存档数据中保存的 Steam 账号 ID
Expand All @@ -59,13 +71,24 @@ def get_account_id(self) -> int:
"""
assert self.__system_data is not None, 'No data loaded'
return self.__system_data.reserve_work_.reserve[1]

def set_account_id_from_system(self):
"""
从系统存档中获取 Steam 账号 ID 并设置到当前存档中
"""
assert self.__system_data is not None, 'No data loaded'
se = SaveEditor()
se.load()
self.set_account_id(se.get_account_id())


def get_slots(self) -> list[SaveSlot]:
"""
获取所有存档槽位的信息
"""
assert self.__system_data is not None, 'No data loaded'
slots = []
# TODO 存档槽位的开始位置似乎与游戏语言有关
for i in range(50, 60):
slot = self.__system_data.slot_data_.save_data_[i]
time = str(slot.time)
Expand All @@ -77,15 +100,15 @@ def get_slots(self) -> list[SaveSlot]:
title = self.__text_unpacker.get_text(TitleTextID.TITLE_NAME, slot.title)

# scenario
if title == TitleId.GS2 and scenario >= 4:
if slot.title == TitleId.GS2 and slot.scenario >= 4:
scenario = ''
else:
if title == TitleId.GS1:
scenario = self.__text_unpacker.get_text(TitleTextID.GS1_SCENARIO_NAME, scenario)
elif title == TitleId.GS2:
scenario = self.__text_unpacker.get_text(TitleTextID.GS2_SCENARIO_NAME, scenario)
elif title == TitleId.GS3:
scenario = self.__text_unpacker.get_text(TitleTextID.GS3_SCENARIO_NAME, scenario)
if slot.title == TitleId.GS1:
scenario = self.__text_unpacker.get_text(TitleTextID.GS1_SCENARIO_NAME, slot.scenario)
elif slot.title == TitleId.GS2:
scenario = self.__text_unpacker.get_text(TitleTextID.GS2_SCENARIO_NAME, slot.scenario)
elif slot.title == TitleId.GS3:
scenario = self.__text_unpacker.get_text(TitleTextID.GS3_SCENARIO_NAME, slot.scenario)
else:
scenario = ''
episode = self.__text_unpacker.get_text(TitleTextID.EPISODE_NUMBER, slot.scenario)
Expand Down
56 changes: 56 additions & 0 deletions app/entry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import os
import sys
from dataclasses import asdict

from app.editor.save_editor import SaveEditor

import webview


debug_mode = '--debug' in sys.argv

class JsApi:
def __init__(self) -> None:
self.editor = SaveEditor(language='hans')
self.__window = None

def set_window(self, window: webview.Window):
self.__window = window

def get_slots(self):
return [asdict(e) for e in self.editor.get_slots()]

def open_file_dialog(self):
assert self.__window
return self.__window.create_file_dialog(
webview.OPEN_DIALOG,
)

def save_file_dialog(self):
assert self.__window
return self.__window.create_file_dialog(
webview.SAVE_DIALOG,
)


if __name__ == '__main__':
if debug_mode:
url = 'http://localhost:5173/'
else:
paths = [
'./_internal/ui/index.html',
sys._MEIPASS + '/ui/index.html' # type: ignore
]
url = next(filter(os.path.exists, paths))
js_api = JsApi()
window = webview.create_window(
'逆转裁判 123 存档修改器',
'http://localhost:5173/',
js_api=js_api,
# frameless=True,
# easy_drag=True,
)
js_api.set_window(window)
webview.start(
debug=debug_mode,
)
5 changes: 4 additions & 1 deletion app/structs/structs.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ class SystemData(Struct):
@dataclass(init=False)
class SaveSlotData(Struct):
save_data_: FixedArray['SaveData', Literal[100]]
"""存档数据"""
"""
存档数据
TODO 100 个存档位。游戏内可见存档槽位的开始位置似乎与游戏语言有关。
"""

@dataclass(init=False)
class SaveData(Struct):
Expand Down
16 changes: 16 additions & 0 deletions make.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
.\.venv\Scripts\activate

if (Test-Path output) {
rm -fo -r output
}
mkdir output

cd .\ui
npm run build
cd ..

&pyinstaller `
--add-data "ui/dist;ui" `
--noconfirm `
--name "PWAAT Save Editor" `
app\entry.py
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pywebview==5.1
pycryptodome==3.20.0
pyinstaller==6.9.0
30 changes: 30 additions & 0 deletions ui/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
.DS_Store
dist
dist-ssr
coverage
*.local

/cypress/videos/
/cypress/screenshots/

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

*.tsbuildinfo
3 changes: 3 additions & 0 deletions ui/.vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}
29 changes: 29 additions & 0 deletions ui/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# vue-project

This template should help get you started developing with Vue 3 in Vite.

## Recommended IDE Setup

[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).

## Customize configuration

See [Vite Configuration Reference](https://vitejs.dev/config/).

## Project Setup

```sh
npm install
```

### Compile and Hot-Reload for Development

```sh
npm run dev
```

### Compile and Minify for Production

```sh
npm run build
```
13 changes: 13 additions & 0 deletions ui/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
8 changes: 8 additions & 0 deletions ui/jsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
},
"exclude": ["node_modules", "dist"]
}
Loading

0 comments on commit 7786a0b

Please sign in to comment.