exp-runtime 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: exp-runtime
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: A compatible EXP engine for Surviving High School and Cause of Death using player-supplied game files
|
|
5
|
+
License: MIT License
|
|
6
|
+
|
|
7
|
+
Copyright (c) 2025 Josh Mcdaniel
|
|
8
|
+
|
|
9
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
11
|
+
in the Software without restriction, including without limitation the rights
|
|
12
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
13
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
14
|
+
furnished to do so, subject to the following conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be included in all
|
|
17
|
+
copies or substantial portions of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
22
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
23
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
|
+
SOFTWARE.
|
|
26
|
+
|
|
27
|
+
Keywords: shs,surviving-high-school,cause-of-death,kiwi,exp,game-engine,shs-runtime,cod-runtime
|
|
28
|
+
Classifier: Development Status :: 3 - Alpha
|
|
29
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
30
|
+
Classifier: Programming Language :: Python :: 3
|
|
31
|
+
Classifier: Topic :: Games/Entertainment
|
|
32
|
+
Requires-Python: >=3.10
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
License-File: LICENSE
|
|
35
|
+
Requires-Dist: exp-runtime-formats==0.5.0
|
|
36
|
+
Provides-Extra: tools
|
|
37
|
+
Requires-Dist: exp-runtime-formats==0.5.0; extra == "tools"
|
|
38
|
+
Provides-Extra: engine
|
|
39
|
+
Requires-Dist: exp-runtime-engine==0.5.0; extra == "engine"
|
|
40
|
+
Provides-Extra: shs
|
|
41
|
+
Requires-Dist: exp-runtime-shs==0.5.0; extra == "shs"
|
|
42
|
+
Provides-Extra: cod
|
|
43
|
+
Requires-Dist: exp-runtime-cod==0.5.0; extra == "cod"
|
|
44
|
+
Provides-Extra: player
|
|
45
|
+
Requires-Dist: exp-runtime-player[desktop]==0.5.0; extra == "player"
|
|
46
|
+
Requires-Dist: exp-runtime-shs==0.5.0; extra == "player"
|
|
47
|
+
Requires-Dist: exp-runtime-cod==0.5.0; extra == "player"
|
|
48
|
+
Provides-Extra: desktop
|
|
49
|
+
Requires-Dist: exp-runtime-player[desktop]==0.5.0; extra == "desktop"
|
|
50
|
+
Requires-Dist: exp-runtime-shs==0.5.0; extra == "desktop"
|
|
51
|
+
Requires-Dist: exp-runtime-cod==0.5.0; extra == "desktop"
|
|
52
|
+
Provides-Extra: build
|
|
53
|
+
Requires-Dist: exp-runtime-player[desktop]==0.5.0; extra == "build"
|
|
54
|
+
Requires-Dist: exp-runtime-shs==0.5.0; extra == "build"
|
|
55
|
+
Requires-Dist: exp-runtime-cod==0.5.0; extra == "build"
|
|
56
|
+
Requires-Dist: pyinstaller<7,>=6.16; extra == "build"
|
|
57
|
+
Dynamic: license-file
|
|
58
|
+
|
|
59
|
+
# EXP Runtime
|
|
60
|
+
|
|
61
|
+
An experimental compatible engine for **Surviving High School** and **Cause of Death**, aiming to
|
|
62
|
+
reproduce the original interface and gameplay. It executes the original KiWi
|
|
63
|
+
scripts and reads graphics, fonts, audio and episode data from files supplied
|
|
64
|
+
by each player.
|
|
65
|
+
|
|
66
|
+
Choose a game in the launcher, then supply its assets: an **SHS Android 1.0.9 APK**,
|
|
67
|
+
**SHS IPA**, or **Cause of Death IPA**, plus any additional **EXP episodes**
|
|
68
|
+
for that game. The importer reads those
|
|
69
|
+
files locally. Game content is not included in this project or downloaded by it.
|
|
70
|
+
IPA import checks the game's bundle identifier and required assets; its version
|
|
71
|
+
number is informational. See [SHS IPA support](docs/IPA.md) and
|
|
72
|
+
[Cause of Death support](docs/COD.md) for details.
|
|
73
|
+
|
|
74
|
+
## Download an app
|
|
75
|
+
|
|
76
|
+
Open this repository's **Releases** page and download the archive for your
|
|
77
|
+
system: `windows-x64`, `linux-x64`, `macos-arm64` (Apple Silicon), or
|
|
78
|
+
`macos-x64` (Intel). Extract it and open the app inside. Keep the complete app
|
|
79
|
+
or executable folder together. Python and the runtime dependencies are bundled.
|
|
80
|
+
|
|
81
|
+
For development builds, open **Actions → Builds**, choose a successful
|
|
82
|
+
run, and download its platform artifact. Extract the artifact ZIP, then the
|
|
83
|
+
app archive inside it.
|
|
84
|
+
|
|
85
|
+
Builds include a SHA-256 checksum. macOS builds use ad-hoc signing and are not
|
|
86
|
+
notarized; Windows builds are unsigned. See [distribution](docs/DISTRIBUTION.md)
|
|
87
|
+
for CI triggers, packaging and the first-launch requirements.
|
|
88
|
+
|
|
89
|
+
The [iPhone/iPad app](docs/IOS_APP.md) shares the Python engine, menus and
|
|
90
|
+
renderers with desktop, using native iOS drawing, audio and Files access.
|
|
91
|
+
Download `exp-runtime-<tag>-ios-arm64-unsigned.ipa` and its checksum from the
|
|
92
|
+
release files, then sign and install the IPA. Development runs provide the same
|
|
93
|
+
format in the `ios-arm64-unsigned` Actions artifact. The Xcode project also
|
|
94
|
+
supports running directly on your device.
|
|
95
|
+
|
|
96
|
+
## Build your own app
|
|
97
|
+
|
|
98
|
+
Install Git and uv, clone this project, then run from the project's directory:
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
uv sync --locked --extra build
|
|
102
|
+
uv run --locked --extra build python tools/build_desktop.py
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
No game files are needed during the build. Python 3.10 or newer is required;
|
|
106
|
+
uv prepares the local environment and installs the locked dependencies.
|
|
107
|
+
|
|
108
|
+
| Platform | App to open |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| macOS | `dist/desktop/EXP Runtime.app` |
|
|
111
|
+
| Windows | `dist/desktop/EXP Runtime/EXP Runtime.exe` |
|
|
112
|
+
| Linux | `dist/desktop/EXP Runtime/EXP Runtime` |
|
|
113
|
+
|
|
114
|
+
Build on the operating system where you will play. Keep the whole app or
|
|
115
|
+
executable directory together: it includes Python and its dependencies.
|
|
116
|
+
CI builds and checks all four targets. Local verification has covered macOS
|
|
117
|
+
on Apple Silicon; a successful CI run checks the other platforms' startup,
|
|
118
|
+
but full gameplay still needs testing on each system.
|
|
119
|
+
|
|
120
|
+
You can also run directly from source:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
uv run --locked --extra desktop exp-runtime
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Add your game files
|
|
127
|
+
|
|
128
|
+
1. Launch the app, select **Surviving High School** or **Cause of Death**, then
|
|
129
|
+
choose that game's APK/IPA or open its existing library.
|
|
130
|
+
2. Add EXP files, ZIP/RAR collections or a folder through Options, or drag them onto the
|
|
131
|
+
menu. SHS's bundled stories, including Football Star, or CoD's Volume One
|
|
132
|
+
are imported automatically.
|
|
133
|
+
3. Select an episode in Play/Resume. Imported episodes and progress persist
|
|
134
|
+
when you close the app.
|
|
135
|
+
|
|
136
|
+
Use **Switch Game** to open the other installed game, or the chooser when it
|
|
137
|
+
has not been imported. Each game has its own
|
|
138
|
+
library, preferences and saves. Shared asset IDs never pull artwork from the
|
|
139
|
+
other game. EXP files do not reliably identify their game, so add them to the
|
|
140
|
+
correct selected library.
|
|
141
|
+
|
|
142
|
+
For an SHS IPA, you can optionally supply your Android 1.0.9 APK through **Options →
|
|
143
|
+
Content Library → Add APK Music** to restore music the iOS app downloaded
|
|
144
|
+
separately. IPA artwork and installed original fonts keep priority, and your
|
|
145
|
+
IPA saves remain compatible. See [IPA import](docs/IPA.md#optional-apk-music)
|
|
146
|
+
for command-line options and supported assets.
|
|
147
|
+
|
|
148
|
+
**Options → Episode title language** selects English, French, Italian, German
|
|
149
|
+
or Spanish names where the EXP includes them. Story text remains in the
|
|
150
|
+
language supplied by each episode; the inspected APK/IPA contain English
|
|
151
|
+
stories, not five dialogue translations. Existing progress stays compatible.
|
|
152
|
+
|
|
153
|
+
**Options → Cheats → Choice hints** optionally marks recognized near-term
|
|
154
|
+
score/relationship gains or correct quiz answers green, losses/wrong answers
|
|
155
|
+
or no-gain alternatives red, and mixed effects amber. Unknown or later
|
|
156
|
+
consequences stay unmarked. It is off by default.
|
|
157
|
+
|
|
158
|
+
EXP Runtime checks GitHub for a newer release once per launch. **Options →
|
|
159
|
+
Update checks** turns this off for both games; Options is also available on
|
|
160
|
+
the game chooser. When “Update available. Download here.” appears, **Yes**
|
|
161
|
+
opens the release page in your browser and **No** dismisses it for this launch.
|
|
162
|
+
The check runs in the background and does not interrupt a story. Downloads
|
|
163
|
+
and installation remain manual, including signing an iOS IPA.
|
|
164
|
+
|
|
165
|
+
ZIP and RAR collections can be imported directly, including EXPs in subfolders and
|
|
166
|
+
the selected game's catalog. Imported episodes remain in the app's library;
|
|
167
|
+
the archive is not needed afterward. RAR imports use the OS decoder on Apple
|
|
168
|
+
platforms and a bundled decoder in Windows/Linux downloads. Source users need
|
|
169
|
+
libarchive; see [archive import](docs/RUNTIME.md#episode-archives).
|
|
170
|
+
You can also import an extracted folder:
|
|
171
|
+
|
|
172
|
+
> Store the episodes within a folder
|
|
173
|
+
>
|
|
174
|
+
> Example:
|
|
175
|
+
>
|
|
176
|
+
> ```
|
|
177
|
+
> Episodes/
|
|
178
|
+
> Episode1.exp
|
|
179
|
+
> Episode2.exp
|
|
180
|
+
> ...
|
|
181
|
+
> ```
|
|
182
|
+
|
|
183
|
+
If your episode folder includes the original `shs_options.sav` (SHS) or
|
|
184
|
+
`cod_options.sav` (CoD), its catalog supplies the original season, volume and
|
|
185
|
+
story groups. You can also add that file separately through **Add Episodes**
|
|
186
|
+
or drag-and-drop. Reimporting the folder updates these names without adding
|
|
187
|
+
duplicate copies of identical EXPs or resetting progress. Episodes absent from
|
|
188
|
+
the supplied catalog keep numeric pack names.
|
|
189
|
+
This works for existing libraries too, including SHS libraries imported from
|
|
190
|
+
either an APK or an IPA; both use the same `shs_options.sav` catalog.
|
|
191
|
+
|
|
192
|
+
Existing libraries from `exp-decoder-python` still work: choose **Open Library**
|
|
193
|
+
and select the existing library directory. It can stay outside this project.
|
|
194
|
+
Existing Android content identities and saves are preserved. IPA libraries
|
|
195
|
+
use a separate source profile and installed fonts, falling back to the system
|
|
196
|
+
default when an original face is absent. See [runtime setup](docs/RUNTIME.md)
|
|
197
|
+
for paths, controls, formats and command-line import.
|
|
198
|
+
|
|
199
|
+
The Python package is now `exp_runtime`; the primary commands are `exp-runtime`
|
|
200
|
+
and `exp-tool`. The `shs` and `shs-tool` commands remain as compatibility aliases.
|
|
201
|
+
The launcher discovers old SHS library locations without moving player files.
|
|
202
|
+
|
|
203
|
+
For example, import CoD into a separate library and open it directly:
|
|
204
|
+
|
|
205
|
+
```sh
|
|
206
|
+
uv run --locked exp-tool import --game cod --ipa /path/to/CoD.ipa --episodes /path/to/CoD-Episodes --library /path/to/cod-library
|
|
207
|
+
uv run --locked --extra desktop exp-runtime --game cod --library /path/to/cod-library
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Current state
|
|
211
|
+
|
|
212
|
+
The runtime implements the main menu, persistent episode library, grouped
|
|
213
|
+
episode browser, dialogue animation, portrait masks, choices, character
|
|
214
|
+
selection, relationship indicators, episode/week intros, loading screens, word/grid/football mini
|
|
215
|
+
games and save/load. F5 saves, F9 loads, and returning to the menu creates an
|
|
216
|
+
automatic checkpoint. Tap once to reveal dialogue, then again to advance it.
|
|
217
|
+
|
|
218
|
+
The New Girl opening and Football Star opening through its first football
|
|
219
|
+
game have been exercised. Complete episode playback and full 1:1 visual/timing
|
|
220
|
+
equivalence are still being verified. Unsupported services stop explicitly
|
|
221
|
+
with their scene, service and program counter. Current limits are recorded in
|
|
222
|
+
[RUNTIME.md](docs/RUNTIME.md) and [ENGINE_ABI.md](docs/ENGINE_ABI.md).
|
|
223
|
+
|
|
224
|
+
CoD's Volume One opening has been exercised through ordinary/timed choices,
|
|
225
|
+
named dialogue and save restoration. Its nine bundled music sources play
|
|
226
|
+
directly. This is initial support, not a claim that every CoD episode finishes;
|
|
227
|
+
unverified services and presentation differences are tracked in [COD.md](docs/COD.md).
|
|
228
|
+
|
|
229
|
+
Game-specific import, UI/audio bindings and services live in
|
|
230
|
+
`packages/shs/src/exp_runtime/shs/` and `packages/cod/src/exp_runtime/cod/`. The EXP parser, KiWi VM,
|
|
231
|
+
session/save system, common panels and launcher remain shared.
|
|
232
|
+
|
|
233
|
+
## Utilize the SDK
|
|
234
|
+
|
|
235
|
+
```sh
|
|
236
|
+
# EXP readers, bytecode decoders and the inspect/extract CLI
|
|
237
|
+
python -m pip install "exp-runtime[tools]>=0.5.0"
|
|
238
|
+
|
|
239
|
+
# Headless VM and engine without game adapters or a player UI
|
|
240
|
+
python -m pip install "exp-runtime[engine]>=0.5.0"
|
|
241
|
+
|
|
242
|
+
# Headless engine with one game, for a custom player UI
|
|
243
|
+
python -m pip install "exp-runtime[engine,shs]>=0.5.0"
|
|
244
|
+
python -m pip install "exp-runtime[engine,cod]>=0.5.0"
|
|
245
|
+
|
|
246
|
+
# Headless engine with both games
|
|
247
|
+
python -m pip install "exp-runtime[engine,shs,cod]>=0.5.0"
|
|
248
|
+
|
|
249
|
+
# Full desktop player with both games
|
|
250
|
+
python -m pip install "exp-runtime[player]>=0.5.0"
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
The bare `exp-runtime` install supplies file tools; `[desktop]` is an alias
|
|
254
|
+
for `[player]`. All components use the `exp_runtime` namespace and share one
|
|
255
|
+
version, including `exp_runtime.shs` and `exp_runtime.cod` when installed.
|
|
256
|
+
Pip installs do not require uv. The tools provide `exp-tool`; launch the full
|
|
257
|
+
player with `exp-runtime` after installation.
|
|
258
|
+
|
|
259
|
+
## Specifications and development
|
|
260
|
+
|
|
261
|
+
To contribute code, tests, documentation or compatibility reports, start with
|
|
262
|
+
[MAINTAINERS.md](MAINTAINERS.md).
|
|
263
|
+
|
|
264
|
+
- [EXP format](docs/SCHEMA.md): container, index, compression, metadata and payloads.
|
|
265
|
+
- [KiWi VM](docs/VM_SPEC.md): bytecode, all core opcodes, memory, calls and yields.
|
|
266
|
+
- [Engine services](docs/ENGINE_ABI.md): native service contracts and coverage.
|
|
267
|
+
- [UI assets](docs/UI_ASSETS.md) and [UI fidelity](docs/UI_FIDELITY.md).
|
|
268
|
+
- [IPA import and system fonts](docs/IPA.md).
|
|
269
|
+
- [Main menu](docs/MAIN_MENU.md) and [episode catalog](docs/EPISODE_CATALOG.md).
|
|
270
|
+
- [Episode introductions and week cards](docs/TITLE_SCREENS.md).
|
|
271
|
+
- [Mini games](docs/MINIGAMES.md) and [story services](docs/STORY_SERVICES.md).
|
|
272
|
+
- [Development and tests](docs/DEVELOPMENT.md), [distribution](docs/DISTRIBUTION.md)
|
|
273
|
+
and [project provenance](docs/PROVENANCE.md).
|
|
274
|
+
- [Python components and custom UIs](docs/SDK.md).
|
|
275
|
+
- [Release notes](RELEASE.md) and [changelog](CHANGELOG.md).
|
|
276
|
+
|
|
277
|
+
Run the full test suite from the repository root with the command below.
|
|
278
|
+
See [Running unit tests](MAINTAINERS.md#running-unit-tests) for dependency
|
|
279
|
+
setup, running individual tests and interpreting optional skips.
|
|
280
|
+
For checks against your APK and episodes, follow
|
|
281
|
+
[Testing with your own game files](MAINTAINERS.md#testing-with-your-own-game-files)
|
|
282
|
+
to place the inputs and create the local test library.
|
|
283
|
+
|
|
284
|
+
```sh
|
|
285
|
+
uv run --locked --extra desktop python -m unittest discover -s tests
|
|
286
|
+
uv run --locked shs-tool --help
|
|
287
|
+
```
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
exp_runtime-0.5.0.dist-info/licenses/LICENSE,sha256=y2xxdaMMD9iKqLFR2Lp8sM_0b3qZWxU4_vW0zgufh2k,1070
|
|
2
|
+
exp_runtime-0.5.0.dist-info/METADATA,sha256=tHvjGLN5ekJm-234cz1UljW34c3yGnvMfnqWom7OTxc,13811
|
|
3
|
+
exp_runtime-0.5.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
4
|
+
exp_runtime-0.5.0.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
5
|
+
exp_runtime-0.5.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Josh Mcdaniel
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|