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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -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
+