nmarshall commited on
Commit
5bef6de
·
0 Parent(s):

docs: roadmap

Browse files
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ /.cache/
docs/ASSET_PIPELINE_TODO.md ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Asset unpacking, recoding, and conversion TODO
2
+
3
+ Purpose: analyse **every file/member variant**, then produce reproducible assets for the Rust/Bevy/Solari runtime. The originals remain immutable research inputs. Archive overrides and case-insensitive lookup must be established before producing a runtime bundle. No conversion tools are implemented by this planning change.
4
+
5
+ ## Planned tool catalogue
6
+
7
+ Names and output formats below are proposals to refine after the relevant research gates. They may become Python scripts, Rust CLI subcommands, or both. Runtime-critical parsers and shared schemas should have one authoritative implementation; orchestration scripts must not diverge from it.
8
+
9
+ | Proposed command/tool | Input | Required output |
10
+ | --- | --- | --- |
11
+ | `inventory` | Entire installation, archives, embedded payloads | File/member hashes, occurrences, format detection, dependency/coverage records |
12
+ | `inspect-binary` | ELF, Mach-O, PE, shared libraries/DLLs | Sections, imports/exports, resources, symbols, disassembly indexes, provenance |
13
+ | `unpack` | PK3/ZIP | Archive-preserving extracted tree, validation report, cryptographic member manifest |
14
+ | `resolve-assets` | All archives, directories, reference loading rules | Final virtual filesystem and full override/case-resolution explanation |
15
+ | `inspect-qvm` | Three QVMs and discovered variants | Headers, decoded instructions, graphs, strings, syscall/ABI evidence |
16
+ | `inspect-bsp` | BSP46 and related `.map`/`.prt`/`.srf`/`.rad` | Structured maps, collision/entity/material/visibility data, feature census |
17
+ | `convert-map` | Validated BSP and resolved dependencies | Chunked visual scene plus authoritative collision/entities/visibility sidecars |
18
+ | `inspect-aas` / `convert-nav` | AAS5, map geometry, bot definitions | Navigation graph/metadata or reproducible regenerated navigation and correspondence report |
19
+ | `parse-shaders` | Every shader file/variant | Lossless-enough AST, directive/name/dependency index, runtime/compiler distinction |
20
+ | `convert-materials` | Shader AST, textures, lighting metadata | Legacy/Solari material definitions, approximation/unsupported report |
21
+ | `convert-textures` | TGA/JPEG/PNG/GIF and embedded images | Canonical images, color/alpha/sampling metadata, platform texture packages |
22
+ | `convert-models` | MD3/ASE and skins | Static meshes, animated clips/frame data, attachment tracks, skin bindings |
23
+ | `convert-animation` | Animation configs, `animdef.h`, models | Typed animation state/clip definitions with original frame/time correspondence |
24
+ | `convert-audio` | WAV/MP3, sound configs, voice/music | Supported audio, loop/gain/spatial metadata, frame/event sound tables |
25
+ | `convert-ui` | `.menu`, headers, icons, HUD graphics | Parsed UI definitions or authored Bevy UI equivalents with behavior mapping |
26
+ | `convert-fonts` | Font `.dat`/atlas pages and licenses | Font metric schema and atlases or measured replacement fonts |
27
+ | `convert-video` | RoQ/other discovered video | Decoded timing/audio/frames and chosen playback format |
28
+ | `convert-config` | CFG, arena, bot, game/team info, voice/crosshair definitions | Typed metadata/config with original names, IDs, and restrictions retained |
29
+ | `inspect-auxiliary` | Word document, readmes, icons, plists, databases, authoring/support files | Decoded contents, role/provenance, replacement or preservation policy |
30
+ | `asset-audit` | Original inventory and converted bundle | Complete dependency closure, coverage, semantic/image/audio/geometry validation |
31
+ | `package-assets` | Validated outputs and attribution | Versioned manifest/bundle and reproducible user-installation workflow |
32
+ | `pipeline` | Installation path and conversion profile | End-to-end orchestration, resumable cache, reports, versioned outputs |
33
+
34
+ ## 1. Inventory and extraction foundation
35
+
36
+ - [ ] AP-001 Implement the reusable inventory command for every standalone file, archive member occurrence, and discovered embedded payload.
37
+ - [ ] AP-002 Detect file types by magic/structure as well as extension; document conflicts, unrecognized files, hidden files, and zero-length members.
38
+ - [ ] AP-003 Assign stable identities using installation/archive hashes, member occurrence index, original path spelling, and member content hash.
39
+ - [ ] AP-004 Preserve all overridden versions and exact duplicate payloads as analysable records; deduplicate storage only after recording provenance.
40
+ - [ ] AP-005 Inspect ZIP entry flags, compression methods, CRCs, attributes, dates, comments, extras, duplicate entries, and malformed/pathological cases.
41
+ - [ ] AP-006 Specify extraction layout per archive so macOS case folding cannot overwrite distinct files; support metadata-only and selected-member operations.
42
+ - [ ] AP-007 Reject path escape/symlink escape, absolute paths, and decompression-size violations in extraction and runtime package readers.
43
+ - [ ] AP-008 Validate decompression/CRC and content hashes and report errors with archive/member identity.
44
+ - [ ] AP-009 Reproduce the measured original VFS, including pure-server order, home/base/game directories, loose files, case folding, extension fallback, and reloads.
45
+ - [ ] AP-010 Resolve every repeated/case-colliding path with explicit winner/loser explanations; test the three known FRF1 collision groups.
46
+ - [ ] AP-011 Build the complete asset dependency graph from maps, shaders, skins, models, menus, configurations, QVM literals, and observed file access.
47
+ - [ ] AP-012 Keep unresolved/dynamic references, missing assets, recursion, cycles, aliases, shader-name collisions, and implicit fallback rules in reports.
48
+ - [ ] AP-013 Produce separate all-content analysis and runtime-reachable asset sets; unused/overridden content remains covered by analysis.
49
+ - [ ] AP-014 Add source attribution/rights fields to manifests, with uncertain rights visibly recorded rather than guessed.
50
+ - [ ] AP-015 Estimate extracted/intermediate/output storage and memory requirements and define cache/pruning behavior without deleting originals.
51
+ - [ ] AP-016 Make all tools accept explicit input/output roots, run without modifying original content, and emit structured logs plus readable summaries.
52
+
53
+ ## 2. Intermediate and runtime schemas
54
+
55
+ - [ ] AP-017 Define versioned schemas for inventory, VFS, geometry, collision, entities, materials, textures, animation, sound, UI, navigation, and package metadata.
56
+ - [ ] AP-018 Choose which outputs use glTF/GLB, textures, audio, text configuration, and custom binary sidecars; document why each can express the source semantics.
57
+ - [ ] AP-019 Preserve source IDs, units, axes, transforms, names, frame indices, flags, bounds, references, and unknown fields in intermediate data.
58
+ - [ ] AP-020 Define the canonical Quake-to-Bevy transform and verify winding, normal/tangent, angle, UV, attachment, and collision conversions together.
59
+ - [ ] AP-021 Keep authoritative simulation/collision data in reference units or an exact reversible mapping; document any quantization introduced by conversion.
60
+ - [ ] AP-022 Define content/tool/schema versioning and dependency-aware cache keys from source hashes, tool version, settings, and platform profile.
61
+ - [ ] AP-023 Define deterministic output ordering, timestamps, floating-point serialization, compression settings, and atomic output writes.
62
+ - [ ] AP-024 Keep human-readable inspectable forms alongside efficient runtime packages for debugging and findings review.
63
+ - [ ] AP-025 Specify strict versus permissive conversion modes; permissive fallbacks must be enumerated and cannot silently pass release validation.
64
+
65
+ ## 3. Maps, geometry, collision, and navigation
66
+
67
+ - [ ] AP-026 Parse and validate all BSP variants, including the older Paris member, with exhaustive lump/index/bounds checking.
68
+ - [ ] AP-027 Parse planes, textures/flags, nodes/leaves, brushes/sides, draw vertices/indices/surfaces, models, fog/effects, lighting, and visibility.
69
+ - [ ] AP-028 Convert planar and triangle-soup surfaces while preserving materials, UVs, vertex colors, normals, bounds, and model origins.
70
+ - [ ] AP-029 Tessellate quadratic patches with shared-edge stitching and explicit error tolerances; preserve collision patch behavior independently.
71
+ - [ ] AP-030 Detect unsupported or degenerate face types, orphaned data, NaNs, unusual scales, and truncated records with per-map reports.
72
+ - [ ] AP-031 Preserve inline-model references and entity transforms for doors, trains, rotating structures, buttons, breakables, and walls.
73
+ - [ ] AP-032 Build visual chunks and material batches without changing authoritative brush collision, contents, or entity boundaries.
74
+ - [ ] AP-033 Export BSP/brush/patch collision structures, masks, surface flags, and point-content data for custom Rust traces.
75
+ - [ ] AP-034 Preserve PVS clusters, areas/areaportals, and model/chunk association; specify optional modern culling without losing legacy comparison data.
76
+ - [ ] AP-035 Extract entity text losslessly enough to preserve unknown keys; convert typed known keys with original values retained.
77
+ - [ ] AP-036 Export team/mode spawns, intermission, locations, objectives, target chains, timers, and every observed special entity.
78
+ - [ ] AP-037 Extract lightmaps, atlas layout, light-grid samples, fog, worldspawn settings, environment, and sky/cubemap references.
79
+ - [ ] AP-038 Recover light sources/compiler hints when available; document lighting information that cannot be uniquely recovered from baked output.
80
+ - [ ] AP-039 Produce legacy-baked and Solari lighting profiles, preventing accidental double application of baked illumination.
81
+ - [ ] AP-040 Preserve map names, aliases, long names, `.arena` mode declarations, levelshots, credits, and package versions.
82
+ - [ ] AP-041 Parse all AAS variants, navigation area/reachability/travel data, and map checksums; verify association with the selected BSP version.
83
+ - [ ] AP-042 Decide whether to import AAS semantics, regenerate navigation, or combine both; prove bot movement/objective reachability with reference fixtures.
84
+ - [ ] AP-043 Cover ladders, jump/wall-jump/ledge links, water, doors, lifts/trains, hazards, team restrictions, and dynamic obstacles in navigation output.
85
+ - [ ] AP-044 Parse and document `.map`, `.prt`, `.srf`, and `.rad` files, including references to map compiler/editor tooling and reproducible authoring use.
86
+ - [ ] AP-045 Validate the jump example against its source map and timer instructions as a fixture for entity conversion.
87
+ - [ ] AP-046 Generate per-map counts, bounds, collision probes, entity graphs, material dependencies, navigation diagnostics, and preview scenes.
88
+ - [ ] AP-047 Batch-convert every map and every variant, retaining candidate selection separately from analysis completeness.
89
+
90
+ ## 4. Every shader and the Solari material port
91
+
92
+ - [ ] AP-048 Parse every shader file and variant, not only shaders reachable in one selected map; preserve comments/source positions for evidence.
93
+ - [ ] AP-049 Implement lexer/parser handling for braces, stages, comments, includes if present, case, whitespace, duplicate names, unknown tokens, and implicit definitions.
94
+ - [ ] AP-050 Classify all directives as runtime visual behavior, collision/gameplay metadata, compiler/editor hint, ignored token, or unresolved extension.
95
+ - [ ] AP-051 Build an exhaustive directive/parameter/value matrix, including spelling variants found in the source and actual parser acceptance.
96
+ - [ ] AP-052 Resolve stage texture names, extension fallbacks, `$lightmap`/generated textures, animated maps, clamp/wrap, filtering, and mip controls.
97
+ - [ ] AP-053 Translate static compatible stages into Bevy materials with measured color-space, alpha, emissive, culling, and sampling semantics.
98
+ - [ ] AP-054 Preserve legacy multi-stage blend/depth/alpha behavior using custom materials/passes where a PBR material cannot express it.
99
+ - [ ] AP-055 Implement RGB/alpha generators, waveforms, time/entity/vertex modulation, lightmap modulation, and material parameter animation.
100
+ - [ ] AP-056 Implement UV generators and scroll/rotate/scale/transform/stretch/turbulence/entity translation at the correct time and precision.
101
+ - [ ] AP-057 Implement autosprite/autosprite2, wave/move/normal/projection/text deformations where used; document inactive/unsupported cases.
102
+ - [ ] AP-058 Implement skyboxes/sky motion, fog volumes, water, glass, portals, environment mapping, and associated camera behavior.
103
+ - [ ] AP-059 Extract surface/gameplay flags independently from render materials so invisibility/modern lighting cannot remove collision or damage semantics.
104
+ - [ ] AP-060 Design corresponding Solari materials and raytracing participation for opaque, masked, transparent, emissive, double-sided, and animated geometry.
105
+ - [ ] AP-061 Verify each converted material's visible, shadow, reflection, and emissive behavior against actual Solari capabilities in the pinned version.
106
+ - [ ] AP-062 Define hybrid raster/Solari passes for unsupported effects, their composition order, and any ray-visible proxy geometry; track visual differences explicitly.
107
+ - [ ] AP-063 Convert map emissive and sunlight/environment hints into calibrated Solari lighting, with energy/exposure tests and no guessed reconstruction claims.
108
+ - [ ] AP-064 Decide how baked texture shading, lightmap illumination, light-grid character lighting, and Solari GI coexist in each profile.
109
+ - [ ] AP-065 Address temporal-history resets for camera cuts, doors, breakables, animated textures/geometry, night vision, and muzzle flashes.
110
+ - [ ] AP-066 Create a shader/material gallery covering every unique operation and exceptional combination found in the installation.
111
+ - [ ] AP-067 Produce per-shader legacy-to-Bevy/Solari mapping records and classify every approximation, omission, fallback, and required custom-renderer extension.
112
+
113
+ ## 5. Textures, UI graphics, fonts, and icons
114
+
115
+ - [ ] AP-068 Inspect every image variant for dimensions, channels, origin, color-space assumptions, alpha conventions, compression, and unusual headers.
116
+ - [ ] AP-069 Implement TGA uncompressed/RLE variants, BGR ordering, origin flips, palette handling if present, and corrupted-file reporting.
117
+ - [ ] AP-070 Decode JPEG/JPEG-extension variants, PNG, GIF, embedded icons, and any discovered alternate image formats reproducibly.
118
+ - [ ] AP-071 Preserve alpha-mask thresholds, edge colors, premultiplication conventions, transparent border behavior, and texture animation frame order.
119
+ - [ ] AP-072 Generate mipmaps with tested color/alpha handling; prevent alpha-test coverage loss on foliage, fences, lettering, and HUD graphics.
120
+ - [ ] AP-073 Maintain repeat/clamp and legacy texture coordinate conventions; avoid texture atlasing that changes wrap or stage sampling.
121
+ - [ ] AP-074 Choose portable master images and platform GPU formats/compression profiles; measure support and quality on Metal/Vulkan targets.
122
+ - [ ] AP-075 Retain original diffuse art without claiming physically accurate PBR data; record any generated normal/roughness/metalness maps as derived enhancements.
123
+ - [ ] AP-076 Convert skybox face orientation, seams, cubemaps/probes, reflection inputs, and environment maps with calibrated intensity.
124
+ - [ ] AP-077 Convert HUD/icons/crosshairs/scopes/levelshots and retain pixel/UV metrics and scaling behavior.
125
+ - [ ] AP-078 Reverse engineer every font `.dat` field and atlas page association; preserve glyph mapping, advance, baseline, bounds, and color rendering.
126
+ - [ ] AP-079 Decide atlas-font import versus source/replacement fonts with measurable layout correspondence and license records.
127
+ - [ ] AP-080 Inspect/decode every ICNS chunk and any executable icon resources; define modern macOS/Linux icon outputs and attribution.
128
+ - [ ] AP-081 Produce image contact sheets, alpha visualizations, texture metadata, and reference render comparisons for all image families.
129
+
130
+ ## 6. Models, skins, animation, and attachments
131
+
132
+ - [ ] AP-082 Parse every MD3 variant with surface/frame/tag offsets, counts, bounds, triangles, UVs, shaders, compressed positions, and packed normals validated.
133
+ - [ ] AP-083 Decode positions/normals and preserve frame bounds, normals, interpolation, surface names, shader names, and attachment hierarchy.
134
+ - [ ] AP-084 Convert static MD3/ASE props to compatible meshes with material bindings, tangents, winding, transforms, and appropriate indices.
135
+ - [ ] AP-085 Parse all four ASE files and their material/submaterial/transform/normal/UV semantics; determine whether they are runtime or authoring inputs.
136
+ - [ ] AP-086 Choose an MD3 vertex-animation representation after memory/performance tests: frame buffers/custom deformation, morph targets, or a proven equivalent.
137
+ - [ ] AP-087 Avoid assuming MD3 can be faithfully converted to skeletal animation; retain exact frames and prove any fitted/reconstructed rig within defined tolerances.
138
+ - [ ] AP-088 Preserve per-frame tag matrices and implement rotation/translation interpolation with attachment position/orientation comparisons.
139
+ - [ ] AP-089 Parse every skin file, surface remapping, hidden surfaces, default fallback, name aliases, and material references.
140
+ - [ ] AP-090 Parse animation configs and preprocessor symbols from `models/animdef.h`; recover loops, reverse playback, speed, synchronization, and state mapping.
141
+ - [ ] AP-091 Separate segmented lower/upper/head player animation, gear/funstuff attachment, team/race skins, and independent animation clocks.
142
+ - [ ] AP-092 Convert view/world weapons, hands, muzzle/eject/laser parts, magazines, bolts, pins, scopes, and shell/debris assets.
143
+ - [ ] AP-093 Preserve sound/event frame synchronization and map runtime weapon states to original animation frames and timings.
144
+ - [ ] AP-094 Extract hitbox-relevant frame/tag data separately from visual meshes and verify against authoritative hit tests.
145
+ - [ ] AP-095 Preserve LOD variants, bounds, visibility flags, material overrides, and first-person/world scale conventions.
146
+ - [ ] AP-096 Implement Solari-compatible animated geometry/proxies with BLAS updates/refits/rebuilds or a documented renderer extension; test tag-attached parts too.
147
+ - [ ] AP-097 Measure animated-frame storage, upload bandwidth, interpolation cost, BLAS cost, and memory for a full match.
148
+ - [ ] AP-098 Generate model/animation/skin/attachment previews and compare fixed frames/intermediate times with reference captures.
149
+ - [ ] AP-099 Catalogue unsupported, unused, residual, overridden, and damaged models with analysis records and final dispositions.
150
+
151
+ ## 7. Sound, music, voice, and video
152
+
153
+ - [ ] AP-100 Inspect all WAV variants, RIFF chunks, sample format/rate/channels, loop points, cues, gain, clipping, duration, and inconsistent metadata.
154
+ - [ ] AP-101 Decode all MP3/video audio and confirm which files are runtime-reachable; retain unused files in analysis coverage.
155
+ - [ ] AP-102 Choose supported runtime audio formats and streaming policy with macOS/Linux decoder/licensing/dependency requirements recorded.
156
+ - [ ] AP-103 Convert unusual sample rates and 8-bit audio reproducibly, preserving pitch, duration, perceived loudness, loop joins, and spatial source behavior.
157
+ - [ ] AP-104 Keep mono spatial effects and stereo music intentional; document any downmix, channel change, or loudness normalization.
158
+ - [ ] AP-105 Parse every weapon `sound.cfg`, animation-frame event, environmental firing variant, and silenced override.
159
+ - [ ] AP-106 Parse `.voice` radio mappings, aliases, names, priorities, and text/audio synchronization.
160
+ - [ ] AP-107 Export ambient speakers/music, looping sounds, door/mover states, announcers/objectives, player footsteps/breathing/injury, and effects.
161
+ - [ ] AP-108 Decode RoQ container/codebooks/frames/audio and verify timing; choose original decoder integration versus conversion/playback format.
162
+ - [ ] AP-109 Determine startup/cinematic video reachability and define faithful playback or documented disposition without silently discarding it.
163
+ - [ ] AP-110 Create waveform/duration/loop/gain comparison reports and timed sound-event fixtures.
164
+
165
+ ## 8. UI, configuration, bots, and auxiliary files
166
+
167
+ - [ ] AP-111 Parse every `.menu` variant and `ui/menudef.h`, preserving widget layout, actions, scripts, focus, sounds, cvar bindings, and source positions.
168
+ - [ ] AP-112 Produce a menu/HUD transition and action matrix to drive Bevy UI reconstruction; identify QVM code outside declarative menus.
169
+ - [ ] AP-113 Parse `.cfg`, `.arena`, `.bot`, `.crosshair`, `.voice`, game/team info, mapcycles, and special metadata with format-specific validation.
170
+ - [ ] AP-114 Preserve command names, default values, quoting, comments, aliases, mode IDs, gear encodings, and cvar flag semantics in migrated data.
171
+ - [ ] AP-115 Parse all bot `.c`/`.h` definitions as their actual domain languages/preprocessor data, not automatically as buildable gameplay C source.
172
+ - [ ] AP-116 Export character, skill, item/weapon weighting, chat/teamplay, and navigation configuration with source correspondences.
173
+ - [ ] AP-117 Extract every readme/text/license and Word document, including map/model credits, and index their behavior/authoring/rights information.
174
+ - [ ] AP-118 Inspect `Thumbs.db`, Bridge metadata, and no-extension members for contents/provenance; mark their runtime role explicitly after analysis.
175
+ - [ ] AP-119 Inspect plist/PkgInfo/app resource metadata and native executable resources; define replacement platform metadata rather than copying blindly.
176
+ - [ ] AP-120 Preserve package/container manifests and library/executable analysis outputs alongside asset records; original binaries do not enter the finished Rust runtime bundle.
177
+ - [ ] AP-121 Add handling for every format discovered later, with an inspectable record even when no runtime conversion is needed.
178
+
179
+ ## 9. Orchestration, audit, and packaging
180
+
181
+ - [ ] AP-122 Implement incremental dependency-aware conversion with dry-run, filters, resume/retry, strict mode, force rebuild, and machine-readable summaries.
182
+ - [ ] AP-123 Run the same pipeline on macOS/Linux, including case-sensitive/case-insensitive filesystems, spaces/non-ASCII paths, and installation outside the checkout.
183
+ - [ ] AP-124 Add golden fixtures and fuzz/negative-input checks for binary/text parsers, offsets/counts, image/audio decoders, and archive extraction.
184
+ - [ ] AP-125 Validate all original file/member identities are linked to an analysis record, generated output or disposition, and source attribution.
185
+ - [ ] AP-126 Validate runtime dependency closure: every selected map/entity/material/model/menu/sound/font/bot reference resolves or has a recorded intentional fallback.
186
+ - [ ] AP-127 Validate geometry counts/bounds, normals/winding, UV/alpha, attachments/animation timing, collision probes, navigation, audio duration/loops, and UI layouts.
187
+ - [ ] AP-128 Run conversion twice and compare manifests/hashes; define exceptions where output reproducibility cannot be made exact.
188
+ - [ ] AP-129 Record converter versions/settings and permit schema migrations without silently accepting old incompatible bundles.
189
+ - [ ] AP-130 Package assets by dependencies/content version and platform profile; preserve source installation verification and update behavior.
190
+ - [ ] AP-131 Decide user-supplied-original import versus permitted bundled media/replacements, with every license/credit requirement recorded.
191
+ - [ ] AP-132 Write end-to-end installation/import/conversion/troubleshooting instructions and document source cache/output lifecycle.
192
+ - [ ] AP-133 Produce an exhaustive conversion report and resolve all required-content blockers before release.
docs/FILE_COVERAGE_TODO.md ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Every installation file TODO
2
+
3
+ This is the explicit baseline checklist for **every file** found beneath `.cache/UrbanTerror43/`. Initial hashes and sizes are in [the snapshot](inventory/snapshot.json). Initial inspection is described in [findings](FINDINGS.md); no file is marked fully reverse engineered.
4
+
5
+ For each file, completion requires its format/structure, contents and role, provenance, dependencies, behavior where applicable, analysis evidence, and Rust replacement/conversion/preservation disposition. A ZIP entry also requires a linked analysis record for **every member occurrence and variant**, including unused/overridden data. The [complete member manifest](inventory/archive-members.tsv) enumerates those 9,835 obligations; each member uses the corresponding format/subsystem TODOs. Add newly discovered embedded payloads and files to this checklist and the member register.
6
+
7
+ Executable/library completion includes code/data/resources, functions and native APIs, not just headers or strings. Ancillary metadata/documents/databases are decoded and documented even if the replacement runtime will not use them.
8
+
9
+ ## Baseline files
10
+
11
+ - [ ] FILE-001 `Quake3-UrT-Ded.exe` (1,082,800 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
12
+ - [ ] FILE-002 `Quake3-UrT-Ded.i386` (816,002 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
13
+ - [ ] FILE-003 `Quake3-UrT-Ded.x86_64` (961,958 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
14
+ - [ ] FILE-004 `Quake3-UrT.app/Contents/Info.plist` (1,051 bytes): Decode every bundle metadata field, executable identity/version/resource/class behavior, platform assumptions, and replacement app metadata.
15
+ - [ ] FILE-005 `Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64` (1,713,680 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
16
+ - [ ] FILE-006 `Quake3-UrT.app/Contents/MacOS/libSDL-1.2.0.dylib` (605,880 bytes): Reverse engineer the bundled x86_64 SDL library: code/data/resources, ABI, exports/imports, build/source correspondence, patches, all function coverage, game integration, and replacement of required services.
17
+ - [ ] FILE-007 `Quake3-UrT.app/Contents/PkgInfo` (10 bytes): Decode package/application identity bytes and platform role; specify replacement metadata and document any inconsistency with the plist.
18
+ - [ ] FILE-008 `Quake3-UrT.app/Contents/Resources/quake3-urt.icns` (167,703 bytes): Decode every icon chunk/image/mask, dimensions/encoding and bundle use; document source art and conversion into replacement platform icons.
19
+ - [ ] FILE-009 `Quake3-UrT.exe` (2,634,689 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
20
+ - [ ] FILE-010 `Quake3-UrT.i386` (1,702,624 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
21
+ - [ ] FILE-011 `Quake3-UrT.x86_64` (1,940,280 bytes): Reverse engineer this executable completely: code/data/resources, symbols/function coverage, library dependencies, engine/module interfaces, platform-specific behavior, rendering, sound, networking and Rust replacement mappings.
22
+ - [ ] FILE-012 `q3ut4/QIIIA_Game_Source_License.doc` (34,304 bytes): Extract and inspect the compound document streams, text/formatting/metadata and full supplied license; link applicable source/content obligations and provenance.
23
+ - [ ] FILE-013 `q3ut4/autoexec_example.cfg` (279 bytes): Parse startup scripting and documented bindings/cvars, establish exec/persistence semantics, and define replacement startup configuration.
24
+ - [ ] FILE-014 `q3ut4/mapcycle_example.txt` (406 bytes): Resolve every map name, mapcycle syntax/ordering/state and restart behavior; validate and migrate the rotation.
25
+ - [ ] FILE-015 `q3ut4/readme43.txt` (100,768 bytes): Analyse all version/history/install/license/credit/behavior statements; cross-reference every relevant change/quirk with native/QVM evidence and fixtures.
26
+ - [ ] FILE-016 `q3ut4/server_example.cfg` (26,071 bytes): Parse every command/cvar/value/comment and startup action; recover runtime defaults/flags/ranges/side effects/services and migrate server configuration.
27
+ - [ ] FILE-017 `q3ut4/ut4_jumpents.pk3` (128,107 bytes): Analyse the archive container and all 7 member occurrences (1,666,557 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
28
+ - [ ] FILE-018 `q3ut4/zUrT43_001.pk3` (77,799,633 bytes): Analyse the archive container and all 710 member occurrences (215,233,472 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
29
+ - [ ] FILE-019 `q3ut4/zUrT43_002.pk3` (73,378,053 bytes): Analyse the archive container and all 98 member occurrences (257,879,005 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
30
+ - [ ] FILE-020 `q3ut4/zUrT43_003.pk3` (67,657,413 bytes): Analyse the archive container and all 52 member occurrences (240,202,610 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
31
+ - [ ] FILE-021 `q3ut4/zUrT43_004.pk3` (79,753,661 bytes): Analyse the archive container and all 443 member occurrences (218,260,155 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
32
+ - [ ] FILE-022 `q3ut4/zUrT43_005.pk3` (81,670,979 bytes): Analyse the archive container and all 756 member occurrences (168,585,944 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
33
+ - [ ] FILE-023 `q3ut4/zUrT43_006.pk3` (66,957,810 bytes): Analyse the archive container and all 548 member occurrences (138,570,159 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
34
+ - [ ] FILE-024 `q3ut4/zUrT43_007.pk3` (79,245,011 bytes): Analyse the archive container and all 365 member occurrences (168,672,526 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
35
+ - [ ] FILE-025 `q3ut4/zUrT43_008.pk3` (70,888,281 bytes): Analyse the archive container and all 898 member occurrences (173,153,240 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
36
+ - [ ] FILE-026 `q3ut4/zUrT43_009.pk3` (79,055,075 bytes): Analyse the archive container and all 429 member occurrences (104,681,786 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
37
+ - [ ] FILE-027 `q3ut4/zUrT43_010.pk3` (78,055,708 bytes): Analyse the archive container and all 1,320 member occurrences (119,475,016 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
38
+ - [ ] FILE-028 `q3ut4/zUrT43_011.pk3` (83,375,098 bytes): Analyse the archive container and all 454 member occurrences (176,985,923 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
39
+ - [ ] FILE-029 `q3ut4/zUrT43_012.pk3` (81,522,127 bytes): Analyse the archive container and all 252 member occurrences (181,429,550 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
40
+ - [ ] FILE-030 `q3ut4/zUrT43_013.pk3` (77,745,672 bytes): Analyse the archive container and all 345 member occurrences (116,378,042 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
41
+ - [ ] FILE-031 `q3ut4/zUrT43_014.pk3` (87,697,729 bytes): Analyse the archive container and all 499 member occurrences (162,905,568 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
42
+ - [ ] FILE-032 `q3ut4/zUrT43_015.pk3` (79,575,542 bytes): Analyse the archive container and all 57 member occurrences (129,993,325 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
43
+ - [ ] FILE-033 `q3ut4/zUrT43_016.pk3` (95,695,538 bytes): Analyse the archive container and all 455 member occurrences (162,520,234 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
44
+ - [ ] FILE-034 `q3ut4/zUrT43_017.pk3` (81,088,755 bytes): Analyse the archive container and all 695 member occurrences (150,711,787 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
45
+ - [ ] FILE-035 `q3ut4/zUrT43_018.pk3` (76,060,663 bytes): Analyse the archive container and all 775 member occurrences (122,948,669 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
46
+ - [ ] FILE-036 `q3ut4/zUrT43_019.pk3` (46,012,128 bytes): Analyse the archive container and all 328 member occurrences (78,911,406 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
47
+ - [ ] FILE-037 `q3ut4/zUrT43_020.pk3` (4,587,832 bytes): Analyse the archive container and all 278 member occurrences (14,289,349 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
48
+ - [ ] FILE-038 `q3ut4/zUrT43_021.pk3` (7,506,845 bytes): Analyse the archive container and all 68 member occurrences (19,770,763 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
49
+ - [ ] FILE-039 `q3ut4/zUrT43_qvm.pk3` (565,005 bytes): Analyse the archive container and all 3 member occurrences (2,230,692 expanded bytes), documenting every variant and dependency, conversion and VFS disposition.
50
+
51
+ ## Coverage closure
52
+
53
+ Do not check a PK3 merely because it decompressed, a model because it displayed once, a binary because its symbols imported, or a library because its upstream name was identified. Link each checked item to the file/member/function/resource coverage ledger and completed evidence. Analysis and runtime reachability are separate decisions.
docs/FINDINGS.md ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Initial reverse engineering findings
2
+
3
+ Snapshot date: **2026-10-10**. Inspection was static. The detailed inventories live in [inventory/](inventory/README.md). “Observed” describes this installation; “inferred” and “upstream reference” explicitly require further confirmation.
4
+
5
+ ## Installation and executable identity
6
+
7
+ **F-001 — Observed: minimal repository.** Before this work the checkout contained `.git`, an untracked `.gitignore` excluding `/.cache/`, and the cached installation. There was no Rust workspace, source tree, build pipeline, existing documentation, or applicable `AGENTS.md` found in the repository/ancestor locations inspected. The supplied installation contains 39 files, including 23 archives. Existing `.gitignore` was left unchanged.
8
+
9
+ **F-002 — Observed: version 4.3.4.** Linux client/server executable strings and the macOS bundle identify `ioQ3 1.35 urt 4.3.4`. `q3ut4/readme43.txt` includes the 4.3.4 changelog dated 2018-06-21. The `qagame.qvm` literal region also contains `version: 4.3.4`. This pins the reference more precisely than the `UrbanTerror43` directory name.
10
+
11
+ **F-003 — Observed: multiple platform binaries.** The installation provides Linux ELF clients and dedicated servers for i386 and x86_64; Windows PE32 clients and dedicated servers; and a macOS x86_64 app. `file` identifies the Linux binaries as dynamically linked and **not stripped**. Printable symbol names include `VM_Call`, `VM_CallInterpreted`, `VM_CallCompiled`, `VM_Compile`, `CM_BoxTrace`, `SV_SendClientSnapshot`, and `MSG_WriteDeltaPlayerstate`. Symbols offer useful analysis anchors; debug type information and exact source correspondence have not been established.
12
+
13
+ **F-004 — Observed: legacy macOS dependency stack.** `otool -L` reports Cocoa, IOKit, OpenGL, and `@executable_path/libSDL-1.2.0.dylib` among the app's dependencies. The SDL dylib is bundled and x86_64. There is no native Apple Silicon binary in this cache. Availability of legacy execution through current macOS or translation has not been tested.
14
+
15
+ The other bundle files are `Info.plist`, `PkgInfo` (bytes `APPLIOURT` followed by a newline), and `Resources/quake3-urt.icns` (167,703 bytes, identified as ICNS with an `is32` type). No standalone or PK3 member path ending in `.dll` appears in the initial inventory. Windows imports, dynamically loaded external DLLs, and any embedded library payloads still require analysis. The bundled dylib is part of the exhaustive scope, as are all auxiliary files.
16
+
17
+ Direct import-table inspection identifies Linux client dependencies on SDL 1.2, pthread, X11, Xxf86vm, dl, math, and libc; Linux dedicated binaries directly import dl, math, and libc. Windows binaries directly import ADVAPI32, GDI32, KERNEL32, msvcrt, USER32, WINMM, and WSOCK32; the client additionally imports ole32. These are external dependencies, not bundled DLL files. [Native import metadata](inventory/native-imports.json) records exact names and inspected targets. Runtime dynamic loads, transitive dependencies, embedded implementations, and library behavior remain research tasks.
18
+
19
+ Executable sizes and full SHA-256 hashes are recorded in `inventory/snapshot.json`. The table below groups the executable targets; it excludes the SDL library and metadata.
20
+
21
+ | Path relative to installation | Bytes | Format / role |
22
+ | --- | ---: | --- |
23
+ | `Quake3-UrT-Ded.exe` | 1,082,800 | Windows PE32 dedicated server |
24
+ | `Quake3-UrT-Ded.i386` | 816,002 | Linux ELF i386 dedicated server |
25
+ | `Quake3-UrT-Ded.x86_64` | 961,958 | Linux ELF x86_64 dedicated server |
26
+ | `Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64` | 1,713,680 | macOS Mach-O x86_64 client |
27
+ | `Quake3-UrT.exe` | 2,634,689 | Windows PE32 client |
28
+ | `Quake3-UrT.i386` | 1,702,624 | Linux ELF i386 client |
29
+ | `Quake3-UrT.x86_64` | 1,940,280 | Linux ELF x86_64 client |
30
+
31
+ ## Archives, formats, and loading hazards
32
+
33
+ **F-005 — Observed: PK3 archives are readable ZIP containers.** All 23 archives opened successfully using Python `zipfile`, and CRC/decompression checks passed for every member. They contain **9,835 non-directory members**, totaling **3,125,455,778 uncompressed bytes** (about 2.91 GiB), in **1,476,022,665 bytes of archives** (about 1.37 GiB). Do not budget disk only for the compressed source: extracted, intermediate, converted, and reference captures need additional space.
34
+
35
+ | Archive | Members | Compressed bytes | Expanded bytes | BSP occurrences |
36
+ | --- | ---: | ---: | ---: | ---: |
37
+ | `ut4_jumpents.pk3` | 7 | 128,107 | 1,666,557 | 1 |
38
+ | `zUrT43_001.pk3` | 710 | 77,799,633 | 215,233,472 | 0 |
39
+ | `zUrT43_002.pk3` | 98 | 73,378,053 | 257,879,005 | 16 |
40
+ | `zUrT43_003.pk3` | 52 | 67,657,413 | 240,202,610 | 14 |
41
+ | `zUrT43_004.pk3` | 443 | 79,753,661 | 218,260,155 | 4 |
42
+ | `zUrT43_005.pk3` | 756 | 81,670,979 | 168,585,944 | 0 |
43
+ | `zUrT43_006.pk3` | 548 | 66,957,810 | 138,570,159 | 0 |
44
+ | `zUrT43_007.pk3` | 365 | 79,245,011 | 168,672,526 | 0 |
45
+ | `zUrT43_008.pk3` | 898 | 70,888,281 | 173,153,240 | 0 |
46
+ | `zUrT43_009.pk3` | 429 | 79,055,075 | 104,681,786 | 0 |
47
+ | `zUrT43_010.pk3` | 1,320 | 78,055,708 | 119,475,016 | 0 |
48
+ | `zUrT43_011.pk3` | 454 | 83,375,098 | 176,985,923 | 0 |
49
+ | `zUrT43_012.pk3` | 252 | 81,522,127 | 181,429,550 | 0 |
50
+ | `zUrT43_013.pk3` | 345 | 77,745,672 | 116,378,042 | 0 |
51
+ | `zUrT43_014.pk3` | 499 | 87,697,729 | 162,905,568 | 0 |
52
+ | `zUrT43_015.pk3` | 57 | 79,575,542 | 129,993,325 | 0 |
53
+ | `zUrT43_016.pk3` | 455 | 95,695,538 | 162,520,234 | 0 |
54
+ | `zUrT43_017.pk3` | 695 | 81,088,755 | 150,711,787 | 0 |
55
+ | `zUrT43_018.pk3` | 775 | 76,060,663 | 122,948,669 | 0 |
56
+ | `zUrT43_019.pk3` | 328 | 46,012,128 | 78,911,406 | 0 |
57
+ | `zUrT43_020.pk3` | 278 | 4,587,832 | 14,289,349 | 0 |
58
+ | `zUrT43_021.pk3` | 68 | 7,506,845 | 19,770,763 | 1 |
59
+ | `zUrT43_qvm.pk3` | 3 | 565,005 | 2,230,692 | 0 |
60
+
61
+ **F-006 — Observed: overrides and case collisions.** There are **9,721 distinct exact-case member paths**, **9,718 casefold-distinct paths**, and **114 exact-case repeat events** under ascending archive-name indexing. `zUrT43_021.pk3` contains another `maps/ut4_paris.bsp` and associated AAS, arena, and shader paths, following earlier versions. The newest-numbered archive is a patch candidate, but the exact supplied engine's search order still requires confirmation.
62
+
63
+ Three sound collision groups differ only by `FRF1` versus `frf1`: `frf1-inside.wav`, `frf1-outside.wav`, and `frf1-shelldrop.wav`. Inside/outside variants differ in size and CRC; shell-drop variants match size/CRC. A naive extraction onto default case-insensitive macOS storage can destroy provenance or select different sound data. Preserve archive/path identity until lookup behavior is specified.
64
+
65
+ **F-007 — Observed: full format census.** Counts below distinguish member occurrences from exact-case distinct paths under the provisional selection rule. There are 619 distinct MD3 paths, 208 shader files, 51 menu files, 437 skins, 870 WAV files, six binary font `.dat` files, and several authoring/support formats. Extensions alone are insufficient to decide what is loaded at runtime.
66
+
67
+ | Extension | Member occurrences | Distinct exact-case paths |
68
+ | --- | ---: | ---: |
69
+ | `(none)` | 2 | 2 |
70
+ | `.aas` | 36 | 34 |
71
+ | `.arena` | 66 | 33 |
72
+ | `.ase` | 4 | 4 |
73
+ | `.bot` | 14 | 14 |
74
+ | `.bsp` | 36 | 35 |
75
+ | `.c` | 166 | 132 |
76
+ | `.cfg` | 52 | 51 |
77
+ | `.crosshair` | 1 | 1 |
78
+ | `.dat` | 6 | 6 |
79
+ | `.db` | 4 | 4 |
80
+ | `.def` | 1 | 1 |
81
+ | `.gif` | 1 | 1 |
82
+ | `.h` | 9 | 8 |
83
+ | `.jpeg` | 1 | 1 |
84
+ | `.jpg` | 3,314 | 3,314 |
85
+ | `.map` | 1 | 1 |
86
+ | `.md3` | 619 | 619 |
87
+ | `.menu` | 51 | 51 |
88
+ | `.mp3` | 1 | 1 |
89
+ | `.png` | 14 | 14 |
90
+ | `.prt` | 1 | 1 |
91
+ | `.qvm` | 3 | 3 |
92
+ | `.rad` | 10 | 10 |
93
+ | `.roq` | 1 | 1 |
94
+ | `.shader` | 209 | 208 |
95
+ | `.skin` | 437 | 437 |
96
+ | `.srf` | 1 | 1 |
97
+ | `.tga` | 3,749 | 3,746 |
98
+ | `.txt` | 117 | 116 |
99
+ | `.voice` | 1 | 1 |
100
+ | `.wav` | 907 | 870 |
101
+
102
+ The `.c` and `.h` members largely comprise bot definitions and headers. Outside `botfiles/`, the selected C/header paths are `models/animdef.h` and `ui/menudef.h`. This installation does **not** contain a complete native or QVM gameplay source tree. Four ASE files describe grass models. There is one `.map`, `.prt`, and `.srf`, associated with the jump-entity example; they are not source material for every map. Auxiliary `Thumbs.db` and Adobe Bridge files also occur.
103
+
104
+ **F-008 — Observed: legacy material complexity.** A line-token survey of shader text sees stage textures/blends, RGB/alpha generation, scrolling/rotation/turbulence, environment/lightmap coordinates, autosprites, wave/move deformation, sky, fog, compiler lighting hints, and material/content markers such as ladder, slick, water, glass, playerclip, nodamage, and nodrop. This survey includes potentially commented or inactive directives and misspellings; it is not a validated shader grammar or proof that the renderer supports every token. Direct conversion to a single generic PBR material cannot be assumed to preserve these effects or gameplay flags.
105
+
106
+ ## Maps, geometry, and entities
107
+
108
+ **F-009 — Observed: BSP46 and AAS5.** All 36 BSP member occurrences have `IBSP` magic and version 46. There are **35 distinct BSP paths**, including the jump demonstration, and all 17 lump ranges in each selected candidate fit within its file. All 34 selected AAS files have `EAAS` magic and version 5. Every distinct BSP has a matching AAS path except `ut4_jumpents`.
109
+
110
+ Selected BSP face records contain **363,564 type-1**, **7,275 type-2**, and **18,814 type-3** surfaces; type 4 was not found in this snapshot. Standard Quake III definitions label these planar, patch, triangle-soup, and flare types respectively; that interpretation is an upstream reference to verify against the supplied engine. The inventory sees 131 surface-flag combinations and 20 contents combinations. See [id Software's format declarations](https://raw.githubusercontent.com/id-Software/Quake-III-Arena/master/code/qcommon/qfiles.h).
111
+
112
+ **F-010 — Observed: 47 entity class names.** A survey of the 35 selected BSP entity lumps finds **11,836 `classname` occurrences** across **47 class names**. Common classes include 4,506 `info_ut_spawn`, 2,175 `target_location`, 751 `target_speaker`, 427 `func_breakable`, 363 `func_wall`, 128 `func_rotating_door`, and 107 `func_door` occurrences. Also present are bomb sites, CTF flags, CAH points, ladders represented through materials/content rather than a presumed class, movers, buttons, portals, location triggers, jump timers/hints, `ut_mrsentry`, `func_ut_train`, `path_ut_stop`, `func_keyboard_interface`, and `cubemap_probe`. A class being present does not establish that it is spawned or active in every mode.
113
+
114
+ `scripts/urbanterror.def` documents 16 entity declarations, including keys and spawnflags for several UrT-specific entities. This is valuable evidence, but not complete documentation of all 47 classes. [The class matrix](inventory/entity-classes.tsv) and [per-map entity/lump data](inventory/maps.json) enumerate the actual scope.
115
+
116
+ **F-011 — Observed: a supplied map-authoring example.** `ut4_jumpents.pk3` has seven members, including a BSP, `.map`, `.prt`, `.srf`, `.rad`, image, and readme. Its readme explicitly describes it as a demonstration of Jump start/stop/cancel timers rather than a map designed for normal play. It is a useful compact test fixture. The example mapcycle contains 32 names, all of which resolve to distinct BSP paths in the inventory.
117
+
118
+ ## Models, animation, sound, and UI
119
+
120
+ **F-012 — Observed: vertex animation and attachments.** All 619 MD3 paths have `IDP3` version 15. Of these, 537 have one frame and 82 have multiple frames. Athena's `lower.md3` has 836 frames; `upper.md3` has 979. Tags surveyed in first frames include torso/head, weapon, muzzle, eject, laser, clip, bolt, pin, and camera attachments. Player directories are `athena`, `orion`, `gear`, and `funstuff`. They require vertex-frame and tag-transform semantics, not an assumed skeletal rig.
121
+
122
+ `models/animdef.h` names weapon and player animation states, including wall jump, ledge climb, death, climbing, and weapon-specific transitions. The AK103 animation file has named states with Start/Count/FPS/Loop fields; its sound file binds reload sounds to frame numbers and defines inside/outside/water/silenced shot sounds. These observed examples establish the need to inspect all corresponding configurations, not just mesh geometry.
123
+
124
+ The 29 subdirectories under `models/weapons2/` include weapons and supporting categories: `44magnum`, `ak103`, `benellim9`, `beretta`, `bombbag`, `colt1911`, `deserteagle`, `flash`, `frf1`, `g36`, `glock`, `grenade`, `handskins`, `hk69`, `knife`, `m4`, `mac11`, `machinegun`, `misc`, `mp5k`, `negev`, `p90`, `psg1`, `shells`, `spas12`, `sr8`, `tod50`, `ump45`, and `zm300`. A directory is not proof of an active selectable weapon. Bot inventory labels also mention LR, multiple grenade categories, and bomb; their constants are hints, not recovered authoritative weapon IDs.
125
+
126
+ **F-013 — Observed: audio variety.** All 870 selected WAV files inspected identify PCM codec 1 in their RIFF format chunk. They include 8/16-bit audio, mono/stereo, and numerous rates, from 8 kHz to 96 kHz, including unusual rates such as 10,989 and 16,574 Hz. There is also a single MP3 (`sound/weapons/FRF1/frf1-shot-outside.mp3`), menu music stored as WAV, and an RoQ video (`video/idlogo.roq`). File headers alone do not establish gain, looping, spatialization, or which files are actually used.
127
+
128
+ **F-014 — Observed: menus, fonts, and configuration.** The installation includes `.menu` definitions, `ui/menudef.h`, shaders/images for UI, six font metrics files with TGA atlas pages, `.crosshair`, `.voice`, `.arena`, `.bot`, and configuration data. `default.cfg` defines input bindings, gear-related commands, console, radio, demo recording, and presentation settings. Example/default values include `snaps 20`, `com_maxfps 125`, gravity 800, and a 16-client example server setting; these are configuration evidence, not measured timing or runtime limits. The readme says the 4.3.2 engine locked `sv_fps`/`snaps` back to 20; verify it experimentally before setting simulation contracts.
129
+
130
+ `gameinfo.txt` and `server_example.cfg` list 11 gametypes, plus modifiers such as Instagib. The latter exposes matchmode, auth, votes, restrictions, respawn/wave behavior, friendly fire, bomb timing, Jump settings, Freeze Tag timing, Gun Game ordering, and log settings. The example config sometimes assigns a value different from its comment's claimed default. Recover registered runtime defaults rather than trusting either blindly.
131
+
132
+ ## Rights and service dependencies
133
+
134
+ **F-015 — Observed: supplied reuse restrictions and attribution material.** `q3ut4/readme43.txt` says the game/mod files are copyrighted by FrozenSand and community contributors and asks anyone wishing to reuse official media to obtain permission. The installation includes `QIIIA_Game_Source_License.doc`, an old Word compound document that has not been fully extracted or interpreted in this pass. Numerous per-map/model readmes and `fonts/ROBOTO_LICENSE.txt` provide additional material to audit. Record rights per asset family and choose a distribution model before bundling original/converted media. This is evidence from supplied files, not a completed legal assessment or a reason to halt the requested documentation.
135
+
136
+ **F-016 — Observed: external services and integrity controls.** Example configuration refers to master servers, account/group/tag authentication, bans, content downloads, `sv_pure`, rcon, and historical PunkBuster use when hosted by Quake III. Executable strings include auth functions and pure/network error messages. Service availability, account interoperability, pure-checksum details, actual protocol numbers, and legacy anti-cheat compatibility have not been tested.
137
+
138
+ ## QVM modules and engine boundary
139
+
140
+ **F-017 — Observed: three original-format QVMs.** `zUrT43_qvm.pk3` contains `vm/cgame.qvm`, `vm/qagame.qvm`, and `vm/ui.qvm`. Their first 32 bytes decode to magic `0x12721444` and eight little-endian words matching the original Quake III VM header layout. The module split and field interpretation are supported by [upstream QVM declarations](https://raw.githubusercontent.com/ioquake/ioq3/main/code/qcommon/qfiles.h) and [VM loading code](https://raw.githubusercontent.com/ioquake/ioq3/main/code/qcommon/vm.c); exact syscall/ABI extensions remain research work.
141
+
142
+ | Module | File bytes | Instruction count | Code bytes | Data bytes | Literal bytes | BSS bytes |
143
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: |
144
+ | `vm/cgame.qvm` | 880,264 | 258,563 | 759,988 | 62,940 | 57,304 | 37,935,304 |
145
+ | `vm/qagame.qvm` | 983,300 | 298,900 | 885,716 | 33,364 | 64,188 | 36,445,748 |
146
+ | `vm/ui.qvm` | 367,128 | 101,585 | 303,832 | 31,072 | 32,192 | 9,099,016 |
147
+
148
+ All three headers have code offset 32; the declared code, data, and literal sections account for their file lengths. Declared zero-initialized/BSS lengths are much larger than file contents. Do not assume code length equals instruction count, native pointers match VM words, or the memory layout matches unmodified Quake III. Printable literal-region strings can anchor analysis, but no instruction decoding, call graph, data structure layout, or gameplay algorithm has been recovered yet.
149
+
150
+ **F-018 — Inferred: strong research route.** Start with unstripped Linux native engines for service/VM boundaries, QVMs for UrT game rules, and static configuration/entity/animation text for data-driven behavior. Use corresponding open engine code as a reference only after establishing version differences. Quake III source is available from [id Software](https://github.com/id-Software/Quake-III-Arena) and ioquake3 from [its upstream repository](https://github.com/ioquake/ioq3); availability does not prove the shipped fork matches it.
151
+
152
+ ## External primary-source checks
153
+
154
+ **F-019 — Upstream reference, checked 2026-10-10:** [Bevy 0.20 release notes](https://bevy.org/news/bevy-0-20/) report release on 2026-10-08 and Solari support on macOS through Metal. They also report no included macOS denoiser and lighting support limits. Treat 0.20 as a candidate to validate and pin, not an already selected dependency. Hardware and frame-quality results remain unknown.
155
+
156
+ **F-020 — Upstream reference:** the inspected [Solari plugin source](https://raw.githubusercontent.com/bevyengine/bevy/main/crates/bevy_solari/src/lib.rs) requests experimental ray queries, resource binding arrays, and nonuniform indexing. The [official example](https://raw.githubusercontent.com/bevyengine/bevy/main/examples/3d/solari.rs) configures raytracing meshes, StandardMaterial, camera storage usage, disabled MSAA, compatible mesh attributes/indices, and optional DLSS ray reconstruction. These are moving `main` references; capture an exact release/commit before implementation. They do not establish support for converted MD3 animation, legacy shader effects, or the user's GPU.
157
+
158
+ **F-021 — Upstream reference:** [ioquake3 filesystem code](https://raw.githubusercontent.com/ioquake/ioq3/main/code/qcommon/files.c) documents layered home/base/game search paths, patch archive precedence, and server-dependent pure handling. This motivates reproducing the supplied fork's resolver before selecting assets, rather than simply expanding all ZIPs into one directory.
159
+
160
+ ## Unanswered questions driving the plan
161
+
162
+ Exact native fork/source revision, runtime resource lookup, legacy launch environment, protocol and structure layouts, QVM linkage checks/extensions, movement constants, collision/hitboxes, weapon IDs and timings, gametype edge cases, bots, actual shader interpretation, animation behavior, remote service dependencies, denoising, GPU support, and release-content permissions remain open. The subsequent TODO documents cover each explicitly.
docs/GOALS.md ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Goals, scope, and definition of completion
2
+
3
+ ## Requested outcome
4
+
5
+ Reconstruct the complete behavior of the supplied Urban Terror installation, document the findings reproducibly, and implement a Rust replacement using Bevy with a working Solari rendering path on supported macOS and Linux hardware. Include a dedicated server and the scripts/tools needed to transform the original content into usable assets.
6
+
7
+ The supplied installation identifies itself as **ioQ3 1.35 urt 4.3.4**. That exact cache snapshot is the initial reference. Later versions, third-party maps, and fixes are separate changes with their own provenance; they must not silently alter the reference specification.
8
+
9
+ ## Goals
10
+
11
+ | Goal | Completion evidence |
12
+ | --- | --- |
13
+ | G1: Document the entire game | Engine/module architecture, file formats, rules, commands, configuration, networking, animation, audio, UI, bots, and platform behavior have indexed specifications and evidence. Every discovered subsystem is accounted for. |
14
+ | G2: Reproducible content pipeline | A fresh checkout plus a user-provided original installation produces a validated, versioned runtime asset bundle through documented commands. Overrides, original hashes, conversion settings, attribution, and unsupported content are reported. |
15
+ | G3: Rust runtime | Client and dedicated server gameplay run in Rust. Original executable/QVM code is useful as a research oracle, not a dependency required by the finished gameplay runtime. |
16
+ | G4: Bevy integration | Bevy provides client application/ECS integration, input, windowing, assets, audio integration, UI, and rendering. Shared authoritative simulation also runs headlessly. |
17
+ | G5: Solari | A tested Solari path renders converted maps and animated gameplay on the declared macOS and Linux GPU matrix, with measured image quality, latency, and performance. |
18
+ | G6: macOS and Linux | Installation, configuration, offline play, LAN/remote play, audio, input, rendering, persistence, and dedicated-server operation pass native platform tests. Declare minimum OS, CPU, GPU, and driver requirements from tests. |
19
+ | G7: Gameplay fidelity | Movement, collision, hit detection, weapon timing, health, stamina, objectives, scores, rounds, and team rules match documented reference measurements within explicit tolerances. |
20
+ | G8: Complete content and features | All supported modes, active weapons/items, playable supplied maps, players, skins, sounds, menus, bots, administrative functions, demos, and customization have a tested implementation or an explicitly approved disposition. |
21
+ | G9: Maintainability | Stable formats, clear crate boundaries, build documentation, provenance, regression fixtures, diagnostics, and continuous integration support future development. |
22
+
23
+ ## Meaning of “entire game”
24
+
25
+ The reverse engineering scope is **everything found in the game folder**: every standalone file, every archive and every member variant (including overridden versions), game logic, all shaders and rendering behavior, textures, maps, models, animation, sounds, fonts, icons, metadata, documents, authoring files, executables, bundled libraries/DLLs, and embedded resources or code discovered inside them. Inventory coverage is mandatory even for unused or obsolete material. The final runtime scope includes the engine services the game depends on, the server game module (`qagame.qvm`), client module (`cgame.qvm`), UI module (`ui.qvm`), active assets, and all reachable behaviors. A rendered map and a moving player are milestones, not completion.
26
+
27
+ Include all 11 gametypes listed in `gameinfo.txt`: Free For All (0), Last Man Standing (1), Team Deathmatch (3), Team Survivor (4), Follow the Leader (5), Capture and Hold (6), Capture the Flag (7), Bomb (8), Jump (9), Freeze Tag (10), and Gun Game (11). Instagib and other rule modifiers require their own coverage. ID 2 is absent from this list; determine its actual handling before defining it.
28
+
29
+ Include round and match administration, spectators, substitutes, ready/timeout states, votes, chat/radio, scoreboards, loadouts, gear restrictions, bot behavior, map interaction, recording/playback, content installation, configuration, and server operations. Services outside the installation—master servers, account authentication, moderation, downloads, and historical anti-cheat integrations—need documented protocols and a supported dependency or replacement strategy.
30
+
31
+ Every installation file and archive-member variant receives an analysis record and a disposition: used directly, converted, replaced, unused legacy content, editor/example material, auxiliary attribution, or unsupported with a tracked blocker. A disposition is not permission to omit analysis. Unused files do not automatically become playable features. `ut4_jumpents` is an entity demonstration map according to its included readme; validate it as a research fixture and document its final availability. Analyse platform-specific executables and bundled libraries even when they are not part of the macOS/Linux replacement; port their required behavior to Rust/Bevy/platform facilities rather than requiring the old binaries.
32
+
33
+ ## Fidelity policy
34
+
35
+ - Preserve measured gameplay and timing before introducing improvements. Retain simulation units and floating-point/quantization behavior where parity depends on them.
36
+ - Keep authoritative collision and movement semantics independent of visual mesh simplification and modern rendering.
37
+ - Give the renderer two documented visual targets: legacy appearance for comparison and Solari lighting for the requested modern presentation. Changes to scene brightness, visibility, and silhouettes need review against gameplay requirements.
38
+ - Catalogue original defects. Classify each as required compatibility behavior, corrected defect, or unresolved behavior; do not reproduce known vulnerabilities as a requirement.
39
+ - Specify tolerances before comparing traces. Never claim complete fidelity from visual similarity alone.
40
+ - Require traceability from behavior specification to asset dependencies, implementation, and validation evidence.
41
+
42
+ ## Platform contract to finalize in early research
43
+
44
+ macOS Apple Silicon is a primary target; evaluate Intel macOS as a separate hardware tier. Linux x86_64 is a primary target; Linux ARM64 is a decision to record, not an assumed release promise. Test macOS Metal and Linux Vulkan, with Linux X11 and Wayland window/input behavior covered. Headless server support must not depend on a GPU or a desktop session.
45
+
46
+ Solari is a required deliverable on the GPU/OS combinations proven to support it. Provide a tested raster rendering path for comparison and for hardware outside that matrix, with clear capability reporting. This fallback does not satisfy G5 by itself. Determine actual supported GPUs, denoising, animated geometry, material support, and minimum performance before promising broad Solari compatibility. See [initial platform findings](FINDINGS.md#external-primary-source-checks).
47
+
48
+ ## Compatibility decisions
49
+
50
+ The final rewrite must have working Rust-to-Rust multiplayer. Investigate original client/server interoperability and demo compatibility in full; they are separate exit gates because matching gameplay does not establish wire compatibility. Record whether releases require original-to-Rust interoperability, a compatibility adapter, or a documented new protocol. Do not claim parity with public original servers until verified against the reference implementation and authorized service access.
51
+
52
+ Account authentication and official anti-cheat cannot be reconstructed into a promise of access to operator-controlled services. Document their behavior and dependencies, implement offline/LAN play independently, and define the release policy for online identity and server discovery.
53
+
54
+ ## Deliverables
55
+
56
+ - Versioned reverse engineering handbook, evidence ledger, format specifications, recovered API/ABI tables, behavior tables, and open-question register.
57
+ - Reproducible inventories, content dependency graphs, extraction/conversion tools, intermediate schemas, runtime packages, and conversion QA reports.
58
+ - Rust client, shared simulation, dedicated server, networking, Bevy integrations, Solari/raster rendering, UI, audio, bots, demos, and administration.
59
+ - Differential reference fixtures, content-wide validation, cross-platform test reports, GPU benchmarks, and compatibility matrices.
60
+ - User, developer, server-operator, content-authoring, troubleshooting, build, installation, and release documentation.
61
+ - Explicit attribution/rights records for original assets and third-party material, and a release-content strategy. The supplied readme contains reuse restrictions; see F-015 in the findings. Planning and static research proceed while distribution requirements are recorded.
62
+
63
+ Completion requires the final milestone in [Validation and milestones](VALIDATION_AND_MILESTONES.md), not merely finishing an early playable slice.
docs/README.md ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Urban Terror Rust rewrite: research and implementation plan
2
+
3
+ Planning snapshot: **2026-10-10**. Reference installation: `.cache/UrbanTerror43/`.
4
+
5
+ The objective is to reverse engineer and document the supplied game, then rewrite its client and dedicated server in Rust with Bevy and Solari, running on macOS and Linux. This change contains documentation and static inventory evidence only. It does not implement the game, converters, or research tools, and the original binaries have not been launched.
6
+
7
+ ## Reading order
8
+
9
+ 1. [Goals and definition of completion](GOALS.md): scope, fidelity, platforms, and deliverables.
10
+ 2. [Initial findings](FINDINGS.md): verified local observations, external references, and remaining uncertainty.
11
+ 3. [Reverse engineering TODO](REVERSE_ENGINEERING_TODO.md): establish the original game's specification and executable reference tests.
12
+ 4. [Asset pipeline TODO](ASSET_PIPELINE_TODO.md): unpack, inspect, recode, convert, and validate all content.
13
+ 5. [Rust, Bevy, and Solari TODO](RUST_BEVY_SOLARI_TODO.md): build the replacement client, server, rendering, and supporting tools.
14
+ 6. [Validation and milestones](VALIDATION_AND_MILESTONES.md): dependencies, exit gates, risks, and release checks.
15
+ 7. [Research ledger](RESEARCH_LEDGER.md): evidence conventions and templates for documenting subsequent discoveries.
16
+ 8. [Inventory evidence](inventory/README.md): machine-readable manifests, hashes, formats, maps, overrides, and case collisions.
17
+ 9. [Every installation file checklist](FILE_COVERAGE_TODO.md): explicit coverage of all 39 files, including every archive-member variant beneath the PK3 entries.
18
+
19
+ ## How to use the checklist
20
+
21
+ Task prefixes are `RE` (research), `AP` (asset pipeline), `RW` (rewrite), `QA` (validation), `MAP` (map completion), and `FILE` (installation file coverage). IDs are stable references for issues and evidence. Tasks stay unchecked until their deliverables exist and their verification is recorded. A section applies to **every applicable item in the inventory**, rather than only a representative example. Newly discovered features receive new tasks and evidence records.
22
+
23
+ Research produces specifications and reference fixtures; conversion produces versioned assets and reports; implementation consumes both. Each subsystem follows that cycle. The milestones stage the work, but the full completion target includes every supported game mode and all supplied playable maps, with explicit treatment of unused, broken, or example content.
24
+
25
+ The initial inventory uses archive filename order to identify override **candidates**. That is not a proven runtime virtual filesystem. Do not treat its candidate-selection columns as the final asset resolver.
docs/RESEARCH_LEDGER.md ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Research ledger and documentation conventions
2
+
3
+ ## Evidence levels
4
+
5
+ | Status | Meaning |
6
+ | --- | --- |
7
+ | Observed | Directly established from identified local files, structural inspection, or a recorded experiment. |
8
+ | Upstream reference | Established for a cited source version; not automatically established for the supplied executable. |
9
+ | Inferred | Consistent with observations but not yet tested against competing explanations. |
10
+ | Hypothesis | A proposed behavior or mapping awaiting evidence. |
11
+ | Unknown | Explicit unanswered question; linked to a TODO or investigation. |
12
+
13
+ Initial static findings are in [FINDINGS.md](FINDINGS.md). Inventory files preserve the evidence identifiers needed to reproduce them. No original executable was launched in this planning pass; there are no runtime measurements, packet captures, recovered gameplay functions, or completed behavioral specifications yet.
14
+
15
+ ## Finding record template
16
+
17
+ ```text
18
+ Finding ID: F-XXX or subsystem-specific prefix
19
+ Title:
20
+ Status and confidence:
21
+ Reference version and input SHA-256:
22
+ File/archive/member, offset, instruction address, or captured event:
23
+ Question and competing hypotheses:
24
+ Method, tool version, and exact reproducible command:
25
+ Environment: OS, architecture, GPU, driver, cvars, map, gametype:
26
+ Observations: raw values, units, timestamps, screenshots/traces:
27
+ Conclusion and limitations:
28
+ Dependencies and related findings:
29
+ Specification/rule updated:
30
+ Implementation task IDs:
31
+ Validation fixture IDs and expected result/tolerance:
32
+ Remaining questions and next experiment:
33
+ ```
34
+
35
+ Keep raw evidence distinct from interpretation. A QVM address is module hash plus instruction index and byte offset, not a native executable address. A native address needs the binary hash, architecture, image-relative address, and any relocation/load base. Cross-reference both when a syscall connects them.
36
+
37
+ ## Specification template
38
+
39
+ ```text
40
+ Subsystem and reference version:
41
+ Inputs/outputs and units:
42
+ State and invariants:
43
+ Initialization and shutdown:
44
+ Update order, timing, ownership, and authority:
45
+ Algorithms, formulas, constants, and rounding:
46
+ Events and transitions:
47
+ Configuration/commands and permissions:
48
+ Asset/API/protocol dependencies:
49
+ Boundary cases, errors, original quirks:
50
+ Observed vs inferred statements and evidence IDs:
51
+ Conformance fixtures, acceptance tolerances, and platform matrix:
52
+ Approved intentional differences:
53
+ ```
54
+
55
+ ## Registers to grow during implementation
56
+
57
+ These are proposed future paths, not claims that the files already exist:
58
+
59
+ - `docs/research/architecture.md`, `engine-services.md`, `qvm-abi.md`, `movement.md`, `collision.md`, `weapons.md`, `damage.md`, `gametypes.md`, `entities.md`, `bots.md`, `network-protocol.md`, `demos.md`, `rendering.md`, `audio.md`, `ui.md`, `commands-and-cvars.md`, `platforms.md`, `services.md`.
60
+ - `docs/research/findings/` for individual evidence-backed findings and unresolved questions.
61
+ - `docs/decisions/` for architecture decisions: Bevy/Solari versions, unit transforms, asset schemas, animation strategy, physics, networking, rendering tiers, interoperability, services, rights/distribution, and supported hardware.
62
+ - `docs/coverage/` for subsystem, command/cvar, opcode/syscall, entity, material-directive, asset, weapon, gametype, map, and compatibility matrices.
63
+ - `docs/coverage/file-analysis.tsv` for every standalone file and every archive-member variant, including obsolete/overridden/auxiliary content; key by archive identity, original member path, occurrence index, and content hash.
64
+ - `docs/validation/` for reference traces, differential outcomes, reproduction instructions, platform results, and benchmarks. Store bulky captures outside Git and reference them by hash and retrieval location.
65
+
66
+ ## Task completion record
67
+
68
+ For each checked task, record task ID, produced file/tool/specification, associated finding IDs, verification command or experiment, result, and remaining limitations. Do not check a behavior task because a guessed constant was implemented. Do not check a conversion task while required assets have unreported fallbacks. New evidence that contradicts an existing finding reopens affected tasks and records the correction.
69
+
70
+ Document inspection tooling used in this pass: Python standard library (`pathlib`, `zipfile`, `struct`, `hashlib`, `csv`, `collections`, regex), including structural ELF/PE import-table reads, and macOS `file`, `strings`, and `otool -L`. One-off inspection generated the saved inventories; no reusable pipeline script is included yet. Implementing such scripts is part of AP/RE work.
docs/REVERSE_ENGINEERING_TODO.md ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Reverse engineering TODO
2
+
3
+ Purpose: turn the supplied installation into an evidence-backed specification of the **entire game**. See [findings](FINDINGS.md) for what is already observed. These tasks are future work; static inventory alone does not complete behavioral research. Each section's deliverable is a specification, coverage matrix, and reproducible evidence/fixtures following [the research ledger](RESEARCH_LEDGER.md).
4
+
5
+ ## 1. Establish the reference and research workspace
6
+
7
+ - [ ] RE-001 Pin the reference to the installation file hashes in `inventory/snapshot.json`; add a reusable inventory command that detects changed/missing/new files.
8
+ - [ ] RE-002 Record the archive member manifest and cryptographic hashes for every member, preserving original names, duplicate entries, and archive origin.
9
+ - [ ] RE-003 Record CPU/OS/GPU/driver and tool versions for each analysis and reference-execution environment.
10
+ - [ ] RE-004 Catalogue all bundled readmes, credits, font licenses, map/model permissions, and engine licenses; extract the old Word license into readable research text with source attribution.
11
+ - [ ] RE-005 Identify the shipped engine fork, candidate source repositories, release tags, patches, build flags, and external libraries; compare binary symbols/strings against source candidates.
12
+ - [ ] RE-006 Pin reviewed upstream sources/tool repositories by revision and distinguish their behavior from the shipped executable.
13
+ - [ ] RE-007 Prepare a Linux x86_64 reference client/server environment; determine whether i386 binaries offer useful comparison evidence.
14
+ - [ ] RE-008 Evaluate the supplied macOS app on suitable Intel/translated environments; record launch failures and dependency requirements without assuming modern OS support.
15
+ - [ ] RE-009 Set isolated reference home/config paths, known configs, maps, random seeds where controllable, and reproducible launch commands.
16
+ - [ ] RE-010 Create reference sessions for offline local play, bot matches, client/dedicated-server LAN play, demos, all modes, and administrative interactions.
17
+ - [ ] RE-011 Preserve console/server logs, screenshots, video/audio captures, user commands, and configuration snapshots by experiment and hash.
18
+ - [ ] RE-012 Record installation/startup/shutdown, filesystem reads, defaults, error recovery, and map-load sequence.
19
+ - [ ] RE-013 Build a high-level architecture diagram from actual executable/QVM/service boundaries and a subsystem ownership table.
20
+ - [ ] RE-014 Create an unanswered-question register with impact, evidence needed, and dependent tasks; revisit it after every milestone.
21
+
22
+ ## 2. Recover engine services and native boundaries
23
+
24
+ - [ ] RE-015 Create an analysis entry for every installation file and every archive member variant; track coverage of content, format, role, dependencies, behavior, and rewrite/conversion disposition.
25
+ - [ ] RE-016 Inspect every client and dedicated-server executable on Linux, Windows, and macOS; compare their code/features/embedded data rather than treating one platform as a substitute for all others.
26
+ - [ ] RE-017 Analyse the bundled SDL dylib: version/build identity, exported APIs, imports, platform code, patches, embedded resources, and the exact subset used by the game.
27
+ - [ ] RE-018 Enumerate DLLs/shared libraries packaged directly, inside archives, or embedded in executables; document absence where none exist and extend the inventory if analysis finds hidden payloads.
28
+ - [ ] RE-019 Recover dynamic loading paths, import tables, library search rules, ABI/calling conventions, and dependency versions for every executable/library; distinguish bundled from external OS/runtime dependencies.
29
+ - [ ] RE-020 Inspect native resources, icons, strings, manifests/plists, PkgInfo, application entry metadata, installer/launcher behavior if discovered, and their platform semantics.
30
+ - [ ] RE-021 Analyse executable/library sections and embedded tables/resources not exercised by normal play; document dead code, third-party provenance, and uncertain reachability.
31
+ - [ ] RE-022 Compare overridden assets and module/support-file variants to document patch changes and select the authoritative behavior without losing earlier findings.
32
+ - [ ] RE-023 Inventory ELF/Mach-O/PE sections, symbols, relocations, imports, exports, strings, and build metadata; record stripped/debug-information status accurately.
33
+ - [ ] RE-024 Import the native binaries into a selected analysis tool and maintain address maps keyed by binary SHA-256 and architecture.
34
+ - [ ] RE-025 Identify main loops, client/server frame functions, time sources, sleep/yield behavior, and map-restart/shutdown paths.
35
+ - [ ] RE-026 Recover engine-to-VM dispatch, VM entry calls, syscall dispatch, memory validation, error handling, and native/QVM linkage checks.
36
+ - [ ] RE-027 Map startup initialization order and the dependencies between console, cvars, filesystem, networking, collision, renderer, sound, UI, and bots.
37
+ - [ ] RE-028 Determine memory arenas, VM limits, resource handles, lifetime rules, string handling, and capacities relevant to compatibility.
38
+ - [ ] RE-029 Identify console command parsing, command-buffer ordering, aliases/macros, `exec`, `vstr`, and deferred/latching behavior.
39
+ - [ ] RE-030 Recover all cvar flags and registration semantics, including archive, userinfo, serverinfo, init/ROM, latch, and restrictions.
40
+ - [ ] RE-031 Recover filesystem search order across base/home/game paths, loose files, PK3s, downloads, restarts, pure server state, and archive naming.
41
+ - [ ] RE-032 Test path case folding, separators, extension fallback, duplicate members, conflicting directories, and exact archive override behavior.
42
+ - [ ] RE-033 Recover package checksum/pure-checksum algorithms, referenced-package tracking, version identifiers, and server/client content validation.
43
+ - [ ] RE-034 Recover collision entry points, renderer registrations, sound handles, client snapshot access, and botlib APIs exposed to QVMs.
44
+ - [ ] RE-035 Determine engine extensions unique to UrT, including authentication hooks, console tabs, demo features, and sound extensions.
45
+ - [ ] RE-036 Recover input processing, raw mouse/acceleration options, button bits, key events, focus behavior, and command generation.
46
+ - [ ] RE-037 Measure frame rate caps, command timestamps, server ticks, snapshot rate, and interpolation/prediction timing under controlled cvars.
47
+ - [ ] RE-038 Document platform-specific differences that affect paths, input, timer precision, audio, network byte order, and native launch behavior.
48
+ - [ ] RE-039 Produce a source-correspondence report: confirmed matching upstream functions, modified functions, and unknown proprietary behavior.
49
+
50
+ ## 3. Decode and analyse every QVM module
51
+
52
+ - [ ] RE-040 Specify original and any discovered extended QVM headers, endianness, section boundaries, memory masking, BSS, and stack layout.
53
+ - [ ] RE-041 Build/choose a QVM decoder that distinguishes byte offsets from instruction indices and validates all three module instruction counts.
54
+ - [ ] RE-042 Document every opcode encountered, operand size, stack effect, integer/float conversion, signedness, and branch semantics.
55
+ - [ ] RE-043 Validate instruction decoding against the engine interpreter/compiler and small known test modules where available.
56
+ - [ ] RE-044 Recover indirect branch targets, jump tables, computed calls, return conventions, and function boundaries without assuming complete static resolution.
57
+ - [ ] RE-045 Generate control-flow/call graphs, string cross-references, global-data references, and module entry-point maps.
58
+ - [ ] RE-046 Identify `vmMain` command enums and the return contract for `qagame`, `cgame`, and `ui` separately.
59
+ - [ ] RE-047 Recover every used trap/syscall number and argument ABI; distinguish engine additions and botlib calls from base Quake III.
60
+ - [ ] RE-048 Label shared helper functions, vector/math code, parsing, random generators, MD3 readers, collision helpers, and duplicated prediction code.
61
+ - [ ] RE-049 Recover playerstate, entitystate, usercmd, trajectory, trace, cvar, client, item, weapon, and UI structure layouts field by field.
62
+ - [ ] RE-050 Recover shared enums, event codes, flags, configstring indices, stat slots, persistent slots, and maximum array sizes.
63
+ - [ ] RE-051 Recover tables for weapons, gear letters, damages, animations, items, maps, gametypes, radio messages, and menus.
64
+ - [ ] RE-052 Identify initialization-time generated data, obfuscated/encoded strings or tables, and conditional feature paths; record decoding evidence.
65
+ - [ ] RE-053 Recover function behavior for server game initialization, entity spawning, client connection/begin/disconnect, frame updates, and commands.
66
+ - [ ] RE-054 Recover client module initialization, prediction, snapshot processing, event handling, view setup, sound dispatch, and frame rendering.
67
+ - [ ] RE-055 Recover UI initialization, menu parser/VM actions, server browser, local server creation, configuration, and authentication flows.
68
+ - [ ] RE-056 Trace linkage/version checks and shared ABI expectations between the modules and engine.
69
+ - [ ] RE-057 Compare module behavior between interpreted and compiled execution where possible, identifying differences that matter to parity.
70
+ - [ ] RE-058 Create an instrumented interpreter/engine harness for selected VM functions and syscalls with deterministic captured inputs/outputs.
71
+ - [ ] RE-059 Recover testable slices incrementally: constants and structures first, then movement, weapon logic, objectives, client presentation, and UI.
72
+ - [ ] RE-060 Track recovered functions, unresolved call sites, syscall coverage, reachable features, and confidence; do not use decompiled text as verified specification.
73
+ - [ ] RE-061 Produce module notebooks and pseudocode with evidence addresses and fixtures sufficient for an independent Rust implementation.
74
+
75
+ ## 4. Specify maps, collision, and entity behavior
76
+
77
+ - [ ] RE-062 Document every BSP46 lump, record layout, alignment, bounds, index relation, material linkage, and any UrT deviations.
78
+ - [ ] RE-063 Recover coordinate system, unit scale, handedness, angle conventions, texture/lightmap UVs, transforms, and origin/model associations.
79
+ - [ ] RE-064 Specify planar faces, triangle soups, quadratic patch tessellation, edge stitching, normals, and LOD behavior.
80
+ - [ ] RE-065 Recover BSP nodes/leaves, brushes/sides/planes, inline models, areas/areaportals, PVS, and visibility/collision separation.
81
+ - [ ] RE-066 Recover every surface/content flag and combination actually used; distinguish compiler hints from runtime flags.
82
+ - [ ] RE-067 Specify line/box/capsule traces, point contents, swept collision, startsolid/allsolid, epsilon, plane ordering, and trace masks.
83
+ - [ ] RE-068 Test world, patch, clip, player, corpse, trigger, mover, water, ladder, glass, sky, slick, and nodamage/nodrop interactions.
84
+ - [ ] RE-069 Recover entity-lump parsing, escapes, defaults, spawn filtering by mode/team, spawnflags, and unknown key behavior.
85
+ - [ ] RE-070 Build the complete entity dictionary from BSP instances, `.def`, QVM spawn tables, and upstream classes; discover supported classes absent from the cache maps.
86
+ - [ ] RE-071 Document all 47 observed entity classes individually, plus supported unobserved classes; record whether each is compiler-only, inert, client-only, or active server gameplay.
87
+ - [ ] RE-072 Recover spawn selection, team/mode filters, spawn weighting, occupied spawns, telefrags, and intermission positions.
88
+ - [ ] RE-073 Specify triggers, targets, targetname/team linkage, delayed events, relays, timers, counters, and activation ordering.
89
+ - [ ] RE-074 Specify sliding/rotating doors, team restrictions, idle closing, crushing, blocked movement, health activation, and sound transitions.
90
+ - [ ] RE-075 Specify buttons, rotating/bobbing/pendulum entities, trains, `path_ut_stop`, attachment/rider motion, and map restarts.
91
+ - [ ] RE-076 Specify `func_breakable`, `func_wall`, damage/material effects, fragments, reappearance, and mode-dependent lifecycle.
92
+ - [ ] RE-077 Specify sentries (`ut_mrsentry`), keyboard interfaces, portals, camera targets, cubemap probe handling, and other special entities.
93
+ - [ ] RE-078 Specify bomb sites, flags, CAH capture points, location volumes/messages, spectator targets, and objective entity activation per mode.
94
+ - [ ] RE-079 Specify Jump start/stop/cancel/goal/hint entities from both the example `.map` and runtime behavior, including route types and timers.
95
+ - [ ] RE-080 Recover worldspawn keys affecting gravity, music, ambient lighting, environment, map version, warnings, and gameplay.
96
+ - [ ] RE-081 Document map load/restart/change and entity reset behavior, including retained configuration and randomized state.
97
+ - [ ] RE-082 Record geometry/entity/visibility features per map, missing references, alias names, and special-case requirements.
98
+ - [ ] RE-083 Produce collision query fixtures and entity lifecycle traces covering every observed class and exceptional map feature.
99
+
100
+ ## 5. Measure and specify movement
101
+
102
+ - [ ] RE-084 Recover the simulation update step, usercmd slicing, command-time clamping, fixed/variable movement modes, and event ordering.
103
+ - [ ] RE-085 Recover player dimensions, stance bounds, view height, collision shape, grounding thresholds, and crouch/stand clearance behavior.
104
+ - [ ] RE-086 Measure walking, running, sprinting, crouch movement, strafe/diagonal normalization, backward movement, and gear-speed penalties.
105
+ - [ ] RE-087 Recover ground/air acceleration, friction, gravity, terminal behavior, jump impulses, and velocity clipping/rounding.
106
+ - [ ] RE-088 Recover multi-plane sliding, stair stepping, slope limits, slick surfaces, airborne transitions, and edge cases at corners.
107
+ - [ ] RE-089 Specify jump initiation/repeat suppression, bunny/strafe jumping, landing, fall damage, landing penalties, and minimum intervals.
108
+ - [ ] RE-090 Specify wall jumps: detection geometry, wall normals, permitted count, cooldown/reset conditions, momentum, and animation events.
109
+ - [ ] RE-091 Specify ledge detection/climbing, pull-up motion, timing, cancellation, stamina, and collision during transitions.
110
+ - [ ] RE-092 Specify ladder entry/exit, direction, speed, sprint/walk behavior, silent steps, and ladder jumping.
111
+ - [ ] RE-093 Specify water depth states, buoyancy/swim motion, water jump, underwater air/drowning, and water-surface transitions.
112
+ - [ ] RE-094 Recover stamina capacity, sprint/jump drain, regeneration/delays, exhaustion, gear/injury effects, and Jump-mode overrides.
113
+ - [ ] RE-095 Recover limb injuries, limping, healing/bandaging effects on movement, and changes while carrying objectives.
114
+ - [ ] RE-096 Recover knockback, explosions, kick/boot interaction, mover velocity transfer, teleport behavior, and push triggers.
115
+ - [ ] RE-097 Specify spectator/free camera, following, dead player movement restrictions, noclip/developer movement, and mode-specific constraints.
116
+ - [ ] RE-098 Recover first-person bob, lean if present, recoil/view kick, breathing, FOV/zoom and mouse scaling independently of authoritative movement.
117
+ - [ ] RE-099 Test movement across frame/tick/packet rates and native platforms, distinguishing intended behavior from legacy timing artifacts.
118
+ - [ ] RE-100 Produce golden usercmd-to-state traces for simple motions, complex jumps, corners, stairs, ladders, water, movers, injury, and latency scenarios.
119
+
120
+ ## 6. Recover weapons, inventory, and damage
121
+
122
+ - [ ] RE-101 Recover authoritative weapon/item IDs, names, active/inactive entries, category slots, aliases, gear letters, and allowed loadout combinations.
123
+ - [ ] RE-102 Cross-check bot inventory headers against QVM tables; document obsolete/conflicting constants rather than copying them blindly.
124
+ - [ ] RE-103 Document every active weapon individually: selection, draw/holster, fire modes, cadence, ammo, spread, recoil, reload, scopes, and attachments.
125
+ - [ ] RE-104 Cover candidate firearm families explicitly: Beretta, Desert Eagle, Glock, Colt 1911, Magnum, SPAS12, Benelli, MP5K, UMP45, MAC11, P90, LR300, M4, AK103, G36, Negev, PSG1, SR8, FR-F1, HK69, TOD50, plus any newly discovered active entries.
126
+ - [ ] RE-105 Determine whether `zm300`, `machinegun`, miscellaneous models, smoke/frag categories, and other residual assets represent reachable features or unused data.
127
+ - [ ] RE-106 Recover selection restrictions, equipment changes during rounds, no-primary loadouts, disabled gear, dropped weapons, pickups, and inventory persistence.
128
+ - [ ] RE-107 Specify magazines, reserve ammo, chambered rounds, interrupted reloads, empty-last-shot behavior, shotgun shell loading, bolts, and sound/event timing.
129
+ - [ ] RE-108 Recover semi/burst/automatic mode switching, saved fire modes, trigger buffering, attack locks, and weapon-switch transitions.
130
+ - [ ] RE-109 Recover spread/recoil formulas, random streams, stance/motion/stamina effects, scope behavior, and accuracy recovery.
131
+ - [ ] RE-110 Recover hitscan/projectile distinctions, origin/muzzle handling, range, penetration if present, pellet patterns, and impacts.
132
+ - [ ] RE-111 Specify knife slashes/throws, damage regions, recovery/pickup, boots/kicks, and melee animation/hit timing.
133
+ - [ ] RE-112 Specify HE/flash/smoke/other grenade availability, cooking, pin/pull/throw/drop rules, timers, bounce, water effects, and death/switch cases.
134
+ - [ ] RE-113 Specify HK69 modes/projectiles, explosion/radius damage, self damage, occlusion, and knockback.
135
+ - [ ] RE-114 Recover hitbox geometry, model/frame/tag dependence, body regions, stance transitions, orientation, and damage multipliers.
136
+ - [ ] RE-115 Recover lag compensation/rewind, interpolation-time inputs, shot timestamp limits, antiwarp interactions, and prediction differences.
137
+ - [ ] RE-116 Recover armor/helmet/kevlar reductions, durability if present, bleeding, wound stacking, fall/environment damage, and protection windows.
138
+ - [ ] RE-117 Specify self/team damage, friendly-fire variants, teamkill tracking/forgetting, assists, suicide, kill attribution, and scoring.
139
+ - [ ] RE-118 Specify bandaging self/allies, medkit, helmet, vest, silencer, laser, night vision, ammunition, and other discovered gear effects.
140
+ - [ ] RE-119 Specify death handling, corpses, gib/blood policy, weapon/item drops, respawn loadout, and objective drops.
141
+ - [ ] RE-120 Build a numerical weapon/damage table with evidence for every region, armor state, stance, mode, and timing transition.
142
+ - [ ] RE-121 Create deterministic hit/damage/weapon-state traces, including simultaneous events and the bug cases documented in the supplied changelog.
143
+
144
+ ## 7. Recover all gametypes and match states
145
+
146
+ - [ ] RE-122 Recover global states: warmup, countdown, live match, rounds, intermission, restart, timeout/pause, and map rotation.
147
+ - [ ] RE-123 Specify team assignment, autojoin/balance/shuffle, reconnect persistence, skins/team names, spectators, substitutes, and captains.
148
+ - [ ] RE-124 Specify Free For All scoring, limits, ties, respawns, protection, and intermission.
149
+ - [ ] RE-125 Specify Last Man Standing elimination, ties, round timeout, survivorrule, sudden death, and scoring.
150
+ - [ ] RE-126 Specify Team Deathmatch scores, deaths/assists/teamkills, limits, balancing, and respawns.
151
+ - [ ] RE-127 Specify Team Survivor strategy time, elimination, survivor counts, round wins, ties, and spectator restrictions.
152
+ - [ ] RE-128 Specify Follow the Leader leader selection/transfer, goal activation, leader death, team victory, and round transitions.
153
+ - [ ] RE-129 Specify Capture and Hold capture conditions, contested state, ownership, score cadence, limits, and respawn waves.
154
+ - [ ] RE-130 Specify Capture the Flag pickup/drop/return/capture, simultaneous flags, hot potato, carrier death/disconnect, and wave respawns.
155
+ - [ ] RE-131 Specify Bomb planting/defusing interactions, action cancellation, timer boundaries, explosion/win priority, round elimination, swaps, and scoring.
156
+ - [ ] RE-132 Specify Jump route timers, checkpoints if supported, attempts, saved positions, goto/allowgoto, persistence, stamina, no-vest, and nodamage rules.
157
+ - [ ] RE-133 Specify Freeze Tag freeze/thaw/meltdown, eligible thawers, timers, corpse/location handling, team victory, and round resets.
158
+ - [ ] RE-134 Specify Gun Game ordered/random/hardcore ladders, promotion/demotion, knife/boot cases, ties, final kill, winner, and scoreboards.
159
+ - [ ] RE-135 Specify Instagib weapon/ammo/gear restrictions and interactions with every supported mode.
160
+ - [ ] RE-136 Recover matchmode readiness, captain/referee roles, substitutions, timeouts, pause clocks, half/role swaps, and match-end behavior.
161
+ - [ ] RE-137 Recover round/map limits, zero/unlimited values, score reset/preservation, cvar latch behavior, and mapcycle overrides.
162
+ - [ ] RE-138 Test winner precedence for simultaneous kills, objective completion versus timer expiration, disconnects, empty teams, and simultaneous promotions.
163
+ - [ ] RE-139 Produce a per-mode state-transition diagram, cvar table, objective/entity requirements, and a complete scripted match fixture.
164
+
165
+ ## 8. Recover networking, demos, and remote services
166
+
167
+ - [ ] RE-140 Determine protocol/version numbers, extension negotiation, master-query formats, and demo suffix/version mapping from the reference runtime.
168
+ - [ ] RE-141 Specify connectionless query/status/challenge/connect, resend/retry/timeout, rejection, reconnect, and disconnect exchanges.
169
+ - [ ] RE-142 Recover packet framing, sequence/acknowledgment, fragmentation, bit packing, compression/Huffman, checksums, and any XOR/obfuscation rules.
170
+ - [ ] RE-143 Recover reliable command streams, overflow behavior, ordering, configuration/userinfo updates, and console/chat transport.
171
+ - [ ] RE-144 Recover gamestate, baselines, configstrings, entity/playerstate deltas, field bit widths, flags, omitted fields, and snapshot reconstruction.
172
+ - [ ] RE-145 Recover usercmd serialization, redundant commands, keying, command timestamps, input bitfields, movement quantization, and packet limits.
173
+ - [ ] RE-146 Specify client prediction, reconciliation, interpolation/extrapolation, event deduplication, snapshot loss, time nudging, and spectator views.
174
+ - [ ] RE-147 Specify lag compensation and antiwarp using captured timing evidence, including dropped/reordered/late packets and clock drift.
175
+ - [ ] RE-148 Recover server PVS/area filtering, relevancy, bandwidth/rate limits, client-slot limits, and private/reserved slots.
176
+ - [ ] RE-149 Recover pure package negotiation, server package ordering, downloads/redirects/resume, filesystem restart, and error states.
177
+ - [ ] RE-150 Specify server browser/favorites/filter/sort/status/refresh behavior and LAN/master discovery differences.
178
+ - [ ] RE-151 Document account/group/tag auth messages, service endpoints/configuration, secrets handling, failure/offline behavior, and permissions.
179
+ - [ ] RE-152 Document legacy anti-cheat touchpoints and external dependencies; decide supported equivalents without claiming proprietary service compatibility.
180
+ - [ ] RE-153 Recover rcon authentication, command handling, output framing, admin/referee roles, auth-rcon, bans/mutes, and flood protections.
181
+ - [ ] RE-154 Recover client and server demo containers, message streams, map/mod/package metadata, pause/seek/time behavior, and playback event rules.
182
+ - [ ] RE-155 Capture reference packets and demos for every mode, entity/event type, objective, weapon, map transition, and administrative flow.
183
+ - [ ] RE-156 Build byte-level packet decode/re-encode fixtures and state reconstruction fixtures using sanitized controlled-session data.
184
+ - [ ] RE-157 Document protocol/parser failure behavior and limits; classify historical malformed-input vulnerabilities as defects to correct.
185
+ - [ ] RE-158 Specify and record the release contract for original-client/server interoperability versus a new Rust protocol, including each migration cost.
186
+ - [ ] RE-159 Produce the service-dependency plan for offline/LAN play, private discovery, public discovery, identity, downloads, and moderation.
187
+
188
+ ## 9. Recover rendering and client presentation
189
+
190
+ - [ ] RE-160 Recover shader grammar, include/listing/load order, duplicate shader names, implicit shaders, texture lookup, and fallback behavior.
191
+ - [ ] RE-161 Distinguish runtime directives, editor/compiler directives, legacy misspellings, unsupported tokens, and comments through actual parser behavior.
192
+ - [ ] RE-162 Specify each used stage operation: texture/animation, blend factors, depth/alpha tests, color/alpha generation, UV transforms, and waveform functions.
193
+ - [ ] RE-163 Specify culling, sort, polygon offsets, fog, skyboxes, portals, billboards/autosprites, deforming geometry, and environment effects.
194
+ - [ ] RE-164 Recover lightmaps, light grids, vertex lighting, overbright/gamma/color space, dynamic lights, light styles, and material brightness.
195
+ - [ ] RE-165 Recover patch/MD3 LOD, PVS/area visibility, model culling, entity transforms, shadows, and render ordering.
196
+ - [ ] RE-166 Recover MD3 interpolation, tag interpolation, segmented player animation, skin remapping, hit-react/death sequences, gear/funstuff, and visibility rules.
197
+ - [ ] RE-167 Recover first-person weapons/hands, world weapons, FOV projection, clipping/depth layers, bob/zoom/recoil, laser, muzzle flash, and shell events.
198
+ - [ ] RE-168 Specify particles, marks/decals, trails, smoke, blood, glass/debris, water, weather, explosions, and fade/lifetime behavior.
199
+ - [ ] RE-169 Recover camera modes, spectators, portals, minimap/radar generation, map overlays, scopes, night vision, and flashblindness.
200
+ - [ ] RE-170 Capture fixed-camera reference images/video on representative maps/materials, retaining cvars, exposure/gamma, time, and animation state.
201
+ - [ ] RE-171 Separate visual fidelity requirements from deliberately modern Solari lighting; define competitive visibility constraints.
202
+
203
+ ## 10. Recover audio, UI, commands, and bots
204
+
205
+ - [ ] RE-172 Recover audio registration, channel ownership, attenuation/panning, listener transforms, occlusion/environment choice, and doppler.
206
+ - [ ] RE-173 Recover footsteps/material choice, landing, breathing, injury, underwater behavior, objective/announcer/radio cues, and spectator audio.
207
+ - [ ] RE-174 Recover loop/chunk semantics, animation-synchronized sounds, voice priority, ambient speakers/music, muting/focus, and mixer settings.
208
+ - [ ] RE-175 Capture timed reference audio for firing/reload/footsteps/doors/objectives and document acceptable conversion gain/latency.
209
+ - [ ] RE-176 Recover font metrics layout, glyph mapping, atlas UVs, kerning if used, color codes, chat rendering, and screen-space scaling.
210
+ - [ ] RE-177 Recover menu grammar/preprocessor/constants/actions, input focus, scrolling, popups, cvar bindings, and error behavior.
211
+ - [ ] RE-178 Inventory every UI/HUD screen and transition: startup, connection/download, browser, auth, teams, loadouts, settings, demos, console, scoreboard, pause, and credits.
212
+ - [ ] RE-179 Specify HUD data, health/stamina/ammo, weapon readiness, objectives, round/match clocks, assists, key overlay, lagometer, speed/acceleration, and messages.
213
+ - [ ] RE-180 Recover configurable crosshairs/scopes, weapon/gear menus, skins/races/funstuff, radio/message macros, ignore/mute, name colors, and saved preferences.
214
+ - [ ] RE-181 Enumerate every registered client/server/UI command and cvar, with type/range/default, flags, role/mode restrictions, persistence, side effects, and error text.
215
+ - [ ] RE-182 Cross-reference code/string-discovered commands against menu/config/readme references and test undocumented reachable commands.
216
+ - [ ] RE-183 Recover server log event schemas, score/stat exports, hit logs, rotations, and compatibility needs for admin tools.
217
+ - [ ] RE-184 Specify screenshot/video/demo commands, developer tooling, saved positions, favorites, and persistent files.
218
+ - [ ] RE-185 Document AAS5 navigation format, map checksum association, areas/reachabilities/travel flags, and botlib usage.
219
+ - [ ] RE-186 Recover bot definition/preprocessor semantics, character traits, weapon/item weights, chat/team files, skill levels, and shared headers.
220
+ - [ ] RE-187 Recover bot movement/aim/fire/gear/objective choices, team coordination, leader behavior, route planning, and navigation through ladders/jumps/movers/water.
221
+ - [ ] RE-188 Recover bot spawning/kicking/minplayers, team/slot constraints, command generation, failure recovery, and behavior in all 11 modes.
222
+ - [ ] RE-189 Produce bot/navigation fixtures per map and identify original navigation defects separately from rewrite requirements.
223
+
224
+ ## 11. Consolidate the specification
225
+
226
+ - [ ] RE-190 Complete subsystem, function, opcode, syscall, format, entity, weapon, gametype, material, command/cvar, asset, and service coverage matrices.
227
+ - [ ] RE-191 Audit specifications for unmarked assumptions and values derived only from comments rather than runtime evidence.
228
+ - [ ] RE-192 Link every recovered rule to source hash/address or controlled experiment and to an implementation/validation task.
229
+ - [ ] RE-193 Classify unused legacy assets, unsupported map-authoring features, obsolete services, original bugs, and intentional deviations.
230
+ - [ ] RE-194 Run representative research fixtures repeatedly to confirm reproducibility and eliminate environment/config contamination.
231
+ - [ ] RE-195 Review unresolved high-impact questions before freezing schemas, movement, protocol, collision, animation, and rendering contracts.
232
+ - [ ] RE-196 Publish a reference handbook with navigation, examples, diagrams, raw-evidence locations, and a reproducible research setup guide.
233
+
234
+ ## 12. Audit exhaustive binary and auxiliary analysis
235
+
236
+ - [ ] RE-197 Build a per-function/data/resource coverage index for every executable and bundled library, including statically linked third-party code and functions not reached by normal gameplay.
237
+ - [ ] RE-198 Recover native function boundaries, direct/indirect call graphs, global/data-table references, platform/compiler variations, and unresolved control flow for each binary; document limitations rather than equating symbol extraction with analysis.
238
+ - [ ] RE-199 Identify compressed, packed, appended, or embedded payloads inside native files, libraries, icons, documents and archives; recursively extend inventory/analysis coverage for anything discovered.
239
+ - [ ] RE-200 Compare bundled SDL and other identified embedded libraries against pinned upstream source/builds; document matching implementation, UrT-specific modifications, unknown regions, API/ABI behavior, and independent portability requirements.
240
+ - [ ] RE-201 Document each platform binary's renderer, sound, networking, OS services, resources, native-library linkage, dead/legacy paths, and required Rust replacement, with cross-platform differences recorded.
241
+ - [ ] RE-202 Decode all ICNS/native icon resources, plist/PkgInfo fields, Word document streams, thumbnail database entries, Bridge metadata, no-extension members, and remaining auxiliary data into documented structures and contents.
242
+ - [ ] RE-203 Analyse every image/audio/model/material/map/definition variant, including overwritten, unused, authoring, and example content; retained runtime reachability is a separate column from completed analysis.
243
+ - [ ] RE-204 Reconcile file/member/function/resource coverage against original byte ranges and structured sections, identify unclassified data, and resolve or explicitly explain every remaining region before claiming exhaustive findings.
docs/RUST_BEVY_SOLARI_TODO.md ADDED
@@ -0,0 +1,239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Rust, Bevy, and Solari rewrite TODO
2
+
3
+ Purpose: implement the complete replacement after the relevant research and conversion contracts are established. Individual subsystems can progress once their inputs are specified; there is no requirement to finish all disassembly before any prototype. Release completion still requires full folder analysis and complete required gameplay/content coverage.
4
+
5
+ ## Proposed architecture to validate
6
+
7
+ | Proposed crate/tool boundary | Responsibility |
8
+ | --- | --- |
9
+ | `urt_formats` | Original binary/text readers and validated intermediate schemas; reusable by research/conversion tools |
10
+ | `urt_assets` | VFS/content manifests, dependency resolution, converted asset loading and versions |
11
+ | `urt_sim` | Shared fixed-step movement, collision, weapon/item/damage rules, entities, match modes, and deterministic state/events |
12
+ | `urt_protocol` | Wire schemas/codecs, connection state, snapshot/delta logic, demos, and compatibility adapters |
13
+ | `urt_server` | Headless authoritative server, administration, bot scheduling, persistence, discovery/services integration |
14
+ | `urt_client` | Input, client state, prediction/interpolation, UI/audio and presentation coordination |
15
+ | `urt_render` | Bevy visual integration, Solari/raster paths, material effects, animation, camera and GPU resources |
16
+ | `urt_tools` / scripts | Inspection, conversion, packaging, conformance, and development/debugging utilities |
17
+
18
+ These are design candidates, not files already implemented. Share authoritative rules between server and client prediction; isolate visual ECS state, network IDs, and simulation IDs. Bevy ECS scheduling can support headless integration without requiring GPU/window/audio plugins. Keep the simulation testable with captured input/state rather than coupling it to presentation frame time.
19
+
20
+ ## 1. Pin dependencies and prove the platform path
21
+
22
+ - [ ] RW-001 Select/pin Rust toolchain, Bevy/Solari release or commit, wgpu, compatible plugins, MSRV, and lockfile after capability tests.
23
+ - [ ] RW-002 Build the official Solari example on representative macOS and Linux hardware; record OS/GPU/driver/adapter/features and failures.
24
+ - [ ] RW-003 Verify native Metal ray queries/resource limits on intended Apple GPUs and Vulkan features/drivers on intended Linux GPUs.
25
+ - [ ] RW-004 Measure denoising needs and options on macOS, Linux NVIDIA, Linux AMD, and other declared tiers; avoid assuming DLSS availability everywhere.
26
+ - [ ] RW-005 Test opaque/masked/transparent/double-sided/emissive materials, moving rigid objects, deforming vertices, animated textures, and multiple camera layers in the pinned Solari version.
27
+ - [ ] RW-006 Prove an imported map chunk and MD3 animation can render with Solari within a preliminary memory/frame budget.
28
+ - [ ] RW-007 Decide supported hardware tiers, minimum OS/driver versions, raster fallback, renderer selection, and unsupported-device behavior from evidence.
29
+ - [ ] RW-008 Record an architecture decision for any required Bevy/wgpu/Solari changes, maintenance cost, and upstream strategy.
30
+ - [ ] RW-009 Implement capability probing and renderer startup diagnostics; enable only supported features and report precise unmet requirements.
31
+ - [ ] RW-010 Prove headless server startup independently of graphical dependencies on macOS/Linux.
32
+
33
+ ## 2. Workspace, runtime lifecycle, and data contracts
34
+
35
+ - [ ] RW-011 Create the Rust workspace/crates/tools and shared schema/version constants according to approved boundaries.
36
+ - [ ] RW-012 Add build profiles/features for client, headless server, Solari, raster rendering, analysis tools, and optional SDK integrations.
37
+ - [ ] RW-013 Configure formatting/linting, targeted checks, CI, dependency/license review, and reproducible builds.
38
+ - [ ] RW-014 Implement explicit application states for startup/import, main menu, connecting/loading, local/remote play, intermission, errors, and shutdown.
39
+ - [ ] RW-015 Define simulation IDs, network IDs, stable asset IDs, Bevy entity mapping, generation/lifetime rules, and cleanup.
40
+ - [ ] RW-016 Define structured simulation state/events and serialization, including version checks and forward-compatible extension policy.
41
+ - [ ] RW-017 Define fixed-step update stages and ordering for commands, movement, collision, weapons, entity thinking, objectives, scoring, and snapshots.
42
+ - [ ] RW-018 Separate authoritative state, predicted local state, interpolated remote state, and visual/audio effects.
43
+ - [ ] RW-019 Establish time types/units, tick wrapping, command clocks, pause/warmup clocks, interpolation delay, and input/frame scheduling.
44
+ - [ ] RW-020 Preserve required numeric precision, random streams/seeds, quantization, and operation order; prove platform conformance instead of assuming bit determinism.
45
+ - [ ] RW-021 Implement error categories, recovery, diagnostics, asset/load failures, and clean lifecycle/resource release.
46
+ - [ ] RW-022 Implement content/schema handshake and configuration layering, retaining compatibility information in logs and bug reports.
47
+
48
+ ## 3. Original engine and bundled-library behavior replacement
49
+
50
+ - [ ] RW-023 Port all required engine services recovered at native/QVM boundaries into Rust interfaces with documented error/lifetime contracts.
51
+ - [ ] RW-024 Replace legacy SDL window/input/audio/platform functions with tested Bevy/winit/audio/platform implementations and mapping records.
52
+ - [ ] RW-025 Replace original native libraries/DLL dependencies required by gameplay or tools; document inactive/third-party functions and their final disposition.
53
+ - [ ] RW-026 Reproduce input focus, fullscreen/window switching, clipboard/text input, Unicode, cursor capture, mouse acceleration options, and platform event handling.
54
+ - [ ] RW-027 Reproduce console, command buffers, timing, filesystem, networking, registration/handles, and map restart behavior used by all three original modules.
55
+ - [ ] RW-028 Keep any original QVM interpreter/native bridges used for research behind tooling features; remove original executable/QVM runtime dependence from release gameplay.
56
+ - [ ] RW-029 Implement the replacement application metadata/icons and map each legacy launcher/resource function to the native macOS/Linux package.
57
+
58
+ ## 4. Assets and world loading
59
+
60
+ - [ ] RW-030 Load versioned converted bundles and manifests, validate hashes/schema, and expose original asset identity in diagnostics.
61
+ - [ ] RW-031 Implement final VFS/alias/override rules and original-package import where required for compatibility.
62
+ - [ ] RW-032 Implement asynchronous dependency-aware loading, progress, cancellation, missing asset handling, and shader/material fallback reporting.
63
+ - [ ] RW-033 Load visual chunks, authoritative collision, entities, inline models, PVS/areas, lighting, sky/environment, and navigation together.
64
+ - [ ] RW-034 Instantiate every supported entity class through a typed registry with mode/team filtering and original spawn keys retained.
65
+ - [ ] RW-035 Resolve target/team chains, mover origins, objective references, sound/material assets, and map metadata before match start.
66
+ - [ ] RW-036 Implement map load/restart/change/unload, complete resource cleanup, configuration preservation, and content updates.
67
+ - [ ] RW-037 Provide static/animated map previews, coordinate/collision/entity overlays, and asset provenance inspection for development.
68
+ - [ ] RW-038 Support every supplied map plus the jump example's documented role; track overridden variants for research/compatibility testing.
69
+
70
+ ## 5. Collision and character movement
71
+
72
+ - [ ] RW-039 Implement BSP/brush/patch tracing, point contents, masks, inline-model transforms, epsilon/startsolid/allsolid, and reference result semantics.
73
+ - [ ] RW-040 Implement dynamic player/corpse/mover/trigger collision and broadphase without altering trace ordering where it affects parity.
74
+ - [ ] RW-041 Implement authoritative player bounds, stance transitions, clearance, grounding, slide/step motion, and multi-plane clipping.
75
+ - [ ] RW-042 Implement walk/run/sprint/crouch/strafe movement, acceleration/friction/gravity, diagonal normalization, and measured gear penalties.
76
+ - [ ] RW-043 Implement jump/landing/fall damage, airborne acceleration, slick surfaces, and timing/rounding constraints.
77
+ - [ ] RW-044 Implement wall jumping, count/cooldown/reset, ledge climb, ladder/silent walking, water/swimming/drowning, and associated state events.
78
+ - [ ] RW-045 Implement stamina/injury/limping/healing effects and Jump-mode overrides.
79
+ - [ ] RW-046 Implement knockback, boots/kicks, explosions, push/teleport triggers, mover riding, and transition collision.
80
+ - [ ] RW-047 Implement spectators, following restrictions, dead/substitute states, noclip/developer paths, and mode-specific movement rules.
81
+ - [ ] RW-048 Integrate authoritative movement and client prediction using the same simulation code and input contract.
82
+ - [ ] RW-049 Evaluate a physics library only for effects/general dynamics where appropriate; do not replace measured Quake movement/collision with generic dynamics without proving parity.
83
+ - [ ] RW-050 Validate each movement feature against golden traces before tuning presentation or introducing improvements.
84
+
85
+ ## 6. Weapons, gear, hit detection, and health
86
+
87
+ - [ ] RW-051 Implement authoritative weapon/item/gear definitions from recovered tables with validation of IDs, aliases, slots, restrictions, and modes.
88
+ - [ ] RW-052 Implement loadout selection/change timing, no-primary cases, spawn loadouts, inventory/drop/pickup, and gear restrictions.
89
+ - [ ] RW-053 Implement per-weapon finite-state machines for draw/fire/reload/bolt/alternate/switch/ready/empty states and interruption rules.
90
+ - [ ] RW-054 Implement semi/burst/automatic firing, cadence, ammo/chamber/magazine/reserve, saved modes, scopes, and attack locks.
91
+ - [ ] RW-055 Implement measured spread/recoil/randomness with state/stance/motion/stamina effects and correct prediction/event behavior.
92
+ - [ ] RW-056 Implement all active firearms and discovered special weapons, including complete view/world animation/audio bindings.
93
+ - [ ] RW-057 Implement knife attacks/throws, boots/kicks, all active grenades, HK69/projectiles, cook/drop/switch/death rules, bounce/fuses, and radius effects.
94
+ - [ ] RW-058 Implement original hitbox geometry and animation/tag dependencies separately from rendering meshes.
95
+ - [ ] RW-059 Implement server hitscan/projectile collision, rewind history/limits, lag compensation, and reference damage regions/multipliers.
96
+ - [ ] RW-060 Implement helmet/vest armor, bleed/wounds, bandaging self/allies, medkits, protection windows, and environmental/fall damage.
97
+ - [ ] RW-061 Implement silencer, laser, night vision, extra ammo, objective carrying, and any recovered gear behavior.
98
+ - [ ] RW-062 Implement death/corpse/gib/drop/respawn state, assist/kill attribution, friendly fire/teamkills, knockback, and score events.
99
+ - [ ] RW-063 Validate every weapon state/timing/damage combination and simultaneous attack/death/objective edge case.
100
+
101
+ ## 7. Interactive map entities
102
+
103
+ - [ ] RW-064 Implement spawn/intermission/location entities and mode/team filtering with validated map key defaults.
104
+ - [ ] RW-065 Implement triggers/targets/relays/delays/timers and deterministic activation order with recursion/loop limits.
105
+ - [ ] RW-066 Implement doors/rotating doors/buttons/walls and team/health/trigger/idle/blocked/crushing behavior.
106
+ - [ ] RW-067 Implement rotating/bobbing/pendulum movers, trains/path stops, riders, sounds, and restart states.
107
+ - [ ] RW-068 Implement breakables/glass/debris, material-dependent sounds/effects, damage/collision changes, and respawn/reappearance rules.
108
+ - [ ] RW-069 Implement sentries, keyboard interfaces, portals/cameras, cubemap-probe disposition, and every remaining recovered special entity.
109
+ - [ ] RW-070 Implement bomb sites, CTF flags, CAH capture points, leader goals, and objective entity lifecycles.
110
+ - [ ] RW-071 Implement Jump timers/routes/hints/goals/cancel actions and source-example correspondence.
111
+ - [ ] RW-072 Account for every observed class and every supported unobserved class in the entity implementation/validation matrix.
112
+
113
+ ## 8. All gametypes and match control
114
+
115
+ - [ ] RW-073 Implement shared warmup/countdown/live/round/intermission/restart/pause/timeout clocks and winner-event ordering.
116
+ - [ ] RW-074 Implement team assignment, join restrictions, balancing/shuffle, spectator/substitute/captain states, reconnects, and persistence.
117
+ - [ ] RW-075 Implement Free For All and its complete score/limit/tie/respawn/protection rules.
118
+ - [ ] RW-076 Implement Last Man Standing and all round/elimination/time/tie/sudden-death rules.
119
+ - [ ] RW-077 Implement Team Deathmatch and score/assist/teamkill/balance/respawn rules.
120
+ - [ ] RW-078 Implement Team Survivor and strategy/elimination/survivor/round/spectator rules.
121
+ - [ ] RW-079 Implement Follow the Leader and leader/goal/death/transfer/round rules.
122
+ - [ ] RW-080 Implement Capture and Hold and capture/contest/ownership/scoring/respawn rules.
123
+ - [ ] RW-081 Implement Capture the Flag and take/drop/return/capture/hot-potato/wave/disconnect rules.
124
+ - [ ] RW-082 Implement Bomb and plant/defuse/cancel/explode/elimination/priority/swap/round rules.
125
+ - [ ] RW-083 Implement Jump and route timers, position saving/loading/persistence, goto, attempts, and movement/gear/damage overrides.
126
+ - [ ] RW-084 Implement Freeze Tag and freezing/thawing/meltdown/team victory/reset rules.
127
+ - [ ] RW-085 Implement Gun Game and ordered/random/hardcore ladders, promotions/demotions/ties/winners/scoreboard rules.
128
+ - [ ] RW-086 Implement Instagib and every other recovered modifier with supported gametype combinations.
129
+ - [ ] RW-087 Implement match readiness, captains/referees, substitutions, timeouts, pause, half/role swaps, and match-end handling.
130
+ - [ ] RW-088 Implement voting, call restrictions, cooldowns, vote outcomes, mapcycle, per-map configuration, and administrative restart/change commands.
131
+ - [ ] RW-089 Validate empty teams, reconnects, simultaneous objective/kill/timer events, zero/unlimited settings, and mode changes.
132
+
133
+ ## 9. Networking and client/server compatibility
134
+
135
+ - [ ] RW-090 Implement versioned Rust protocol or the approved legacy-compatible codec/adapter, with byte-level conformance fixtures.
136
+ - [ ] RW-091 Implement connect/challenge/query/status, reliability/acks/retries, disconnect/reconnect, timeout, and slot/password policy.
137
+ - [ ] RW-092 Implement packet framing/fragmentation/compression/checksums and original field packing where interoperability requires them.
138
+ - [ ] RW-093 Implement usercmd transport, redundancy, timestamp validation, input limits, and packet/rate controls.
139
+ - [ ] RW-094 Implement gamestate/baselines/configstrings/snapshot/entity/playerstate delta encoding and decoding.
140
+ - [ ] RW-095 Implement server client relevance/PVS filtering, bandwidth budgets, private slots, backlog/overflow handling, and replay-safe sequencing.
141
+ - [ ] RW-096 Implement authoritative simulation, local prediction, reconciliation, interpolation/extrapolation, snapshot buffering, and event deduplication.
142
+ - [ ] RW-097 Implement clock synchronization, command slicing, time nudging policy, antiwarp, and lag compensation integration.
143
+ - [ ] RW-098 Implement content/version/pure negotiation, required package handling, download progress/cancel/resume, and map changes.
144
+ - [ ] RW-099 Implement chat/teamchat/radio/console/reliable commands and userinfo/config updates with measured restrictions.
145
+ - [ ] RW-100 Implement original-to-Rust compatibility paths required by the release decision; keep explicit tested direction/version matrices.
146
+ - [ ] RW-101 Validate offline/listen-server, LAN, remote Rust-to-Rust, reference interoperability, packet loss/reordering/jitter, and late joins.
147
+ - [ ] RW-102 Bound all remote parser/state allocations, lengths, rates, and command permissions; correct original malformed-input defects.
148
+
149
+ ## 10. Dedicated server, administration, and external services
150
+
151
+ - [ ] RW-103 Build a headless authoritative server with CLI/configuration, startup/mapcycle, graceful shutdown, and crash diagnostics.
152
+ - [ ] RW-104 Implement server cvars/commands, log schemas, stats/hit logging, console/stdin, rcon, and operator/referee permissions.
153
+ - [ ] RW-105 Implement passwords/private slots, bans/mutes/ignores, flood limits, teamkill policy, votes, inactivity, reconnect/IP limits, and match controls.
154
+ - [ ] RW-106 Implement authenticated admin commands with the chosen identity policy; avoid storing credentials in configs/logs unnecessarily.
155
+ - [ ] RW-107 Implement LAN discovery, favorites/direct connect, approved master-server query/heartbeat or replacement discovery.
156
+ - [ ] RW-108 Integrate approved account/group/tag authentication services or documented replacement/offline behavior; test outages/timeouts.
157
+ - [ ] RW-109 Implement approved content-download service with allowed roots/versions/hash verification and user-facing failure handling.
158
+ - [ ] RW-110 Implement anti-cheat/integrity policy from server authority, content checks, movement/fire validation, and service decisions without implying official anti-cheat support.
159
+ - [ ] RW-111 Implement user-data/config/log/demo storage according to platform conventions and configurable server paths.
160
+ - [ ] RW-112 Provide server container/service examples if adopted, update/backup behavior, and operator documentation.
161
+ - [ ] RW-113 Load-test the declared client count, tick budget, bandwidth, bots, long matches, repeated map cycles, and service outages.
162
+
163
+ ## 11. Bots and navigation
164
+
165
+ - [ ] RW-114 Implement bot names/traits/skills/gear/preferences from converted definitions and the measured behavior specification.
166
+ - [ ] RW-115 Implement imported/regenerated navigation graph queries, local avoidance, path cost/travel rules, and dynamic obstacles.
167
+ - [ ] RW-116 Implement ladder/jump/wall-jump/ledge/water/door/train traversal and recovery from stuck/unreachable states.
168
+ - [ ] RW-117 Implement aim/visibility/reaction/accuracy, weapon/mode choice, ammo/reload, bandaging, pickups, and damage awareness.
169
+ - [ ] RW-118 Implement objective/team roles and coordination for every supported gametype, including leader, bomb, flag, thaw, Jump, and Gun Game behavior where supported.
170
+ - [ ] RW-119 Feed bots through the authoritative usercmd/movement/weapon path rather than a separate rules implementation.
171
+ - [ ] RW-120 Implement add/kick/minplayers, reserved slots, bot/human balancing, skill configuration, and predictable test seeds.
172
+ - [ ] RW-121 Budget bot thinking/navigation work without starving server ticks; profile and validate behavior on every map.
173
+
174
+ ## 12. Bevy rendering foundation and legacy comparison path
175
+
176
+ - [ ] RW-122 Implement camera/view transforms and world/render unit mapping with orientation/winding/UV/collision overlays verified.
177
+ - [ ] RW-123 Load visual BSP chunks/models and implement visibility/area/PVS/culling, LOD, batching, and streaming/reload behavior.
178
+ - [ ] RW-124 Implement legacy material operations, stage animation, lightmaps/light-grid/vertex lighting, gamma/overbright, sky/fog, and custom passes.
179
+ - [ ] RW-125 Render all source texture formats via converted outputs and maintain filtering/wrapping/mip/alpha conventions.
180
+ - [ ] RW-126 Implement MD3 frame interpolation and tag attachments, segmented players, skins/team/race colors, gear/funstuff, and death/corpse transitions.
181
+ - [ ] RW-127 Implement first-person weapon/hands/world-weapon layers, FOV/scopes/depth/near clipping, bob/recoil/zoom/breathing, and spectated presentation.
182
+ - [ ] RW-128 Implement particles/trails/muzzle flash/shells/decals/smoke/blood/weather/glass/debris/explosions/water and event-driven timing.
183
+ - [ ] RW-129 Implement mirrors/portals/cameras, minimap/radar/map overlay, night vision, flashblindness, and all recovered presentation effects.
184
+ - [ ] RW-130 Produce fixed-camera and timed-motion comparisons before tuning the Solari profile.
185
+
186
+ ## 13. Port the entire rendering system to Solari
187
+
188
+ - [ ] RW-131 Integrate the pinned Solari plugins/render graph and required mesh/material/camera/GPU feature contracts.
189
+ - [ ] RW-132 Convert every runtime shader's behavior to a tested Solari-compatible material or explicitly designed hybrid/custom-renderer path; keep per-shader coverage.
190
+ - [ ] RW-133 Register visible/raytraced geometry, instance transforms, masks, material buffers, emissive sampling, and object lifetimes consistently.
191
+ - [ ] RW-134 Implement/update acceleration structures for static map chunks, rigid movers, doors, breakables, attached equipment, and deformed MD3 vertices.
192
+ - [ ] RW-135 Ensure raytraced silhouettes/shadows/reflections match displayed animation and removed/broken geometry at the correct simulation/presentation time.
193
+ - [ ] RW-136 Implement supported sunlight/environment/emissive lighting and define equivalents/extensions for other recovered dynamic lights.
194
+ - [ ] RW-137 Handle masked foliage/fences, glass/water/transparency, two-sided surfaces, texture animation, fog, portals, and deforming shaders with explicit ray/raster semantics.
195
+ - [ ] RW-138 Keep first-person weapons, UI/HUD, minimaps/scopes, particles, decals, and post-effects composed correctly with Solari lighting and depth/history.
196
+ - [ ] RW-139 Calibrate exposure, emissive units, ambient/environment, roughness, and baked-light policy; preserve map readability and team/player visibility.
197
+ - [ ] RW-140 Integrate denoising/temporal accumulation/upscaling options appropriate to each GPU tier, including a tested macOS solution or accepted quality/performance mode.
198
+ - [ ] RW-141 Define renderer history invalidation for camera cuts, teleport/respawn, map changes, flashes/night vision, animation discontinuities, and materials/lights.
199
+ - [ ] RW-142 Tune sample counts, bounces, caches, acceleration structures, buffers, texture budgets, and upload/rebuild scheduling against measured frame-time distributions.
200
+ - [ ] RW-143 Test all renderer feature combinations on the supported matrix and document unresolved Solari limitations as blockers, not silently completed ports.
201
+ - [ ] RW-144 Compare legacy and Solari modes for gameplay visibility, material behavior, moving-scene noise/ghosting, reflection/shadow correctness, latency, and full-match performance.
202
+ - [ ] RW-145 Maintain renderer selection/capability/failure diagnostics and recovery without changing simulation outcomes.
203
+
204
+ ## 14. Audio and video runtime
205
+
206
+ - [ ] RW-146 Integrate supported decoders/output, device selection, latency, volume/music buses, focus muting, and platform hot-plug behavior.
207
+ - [ ] RW-147 Implement spatial sources/listener, attenuation/panning/doppler, channels/priorities, loops, occlusion/environment, and underwater behavior.
208
+ - [ ] RW-148 Synchronize weapon/frame/mover/player/objective/radio sounds with simulation/presentation events, preventing duplicates during correction/demo playback.
209
+ - [ ] RW-149 Implement environmental/silenced firing variants, footsteps, breathing/injury, ambient speakers, music, and announcements.
210
+ - [ ] RW-150 Implement RoQ/converted video playback, timing/audio sync, skip/pause behavior, and startup/cinematic reachability.
211
+ - [ ] RW-151 Validate audio duration/gain/loop/position/timing and resource cleanup on macOS/Linux.
212
+
213
+ ## 15. UI, HUD, console, and configuration
214
+
215
+ - [ ] RW-152 Rebuild every menu/HUD screen and transition using parsed metadata or authored equivalents with original behavior mappings.
216
+ - [ ] RW-153 Implement team/loadout/weapon/item selection, restrictions, previews, skins/races/funstuff, and initial player setup.
217
+ - [ ] RW-154 Implement health/stamina/ammo/readiness, objective state, clocks, scores/assists, kill feed, messages, radio, and spectator HUD.
218
+ - [ ] RW-155 Implement scoreboards and sort rules for all modes, miniboard, match/substitute/captain/referee state, and Gun Game levels.
219
+ - [ ] RW-156 Implement minimap/map overlay, scopes/crosshairs/night vision, speed/acceleration/key overlays, FPS/lag diagnostics, and customization.
220
+ - [ ] RW-157 Implement server browser/status/favorites/filter/sort/refresh/direct connect/LAN, loading/download, errors, and account flows.
221
+ - [ ] RW-158 Implement console tabs/history/completion/scroll/search as specified, colored names/text, Unicode, command macros, chat/teamchat/ignore/mute/radio.
222
+ - [ ] RW-159 Implement graphics/Solari/audio/input/network/gameplay settings, key rebinding, mouse acceleration/FOV sensitivity, persistence, and reset/defaults.
223
+ - [ ] RW-160 Implement all recovered command/cvar registrations, flags/ranges/restrictions/latching, help text, and configuration migration.
224
+ - [ ] RW-161 Render imported/replacement fonts with validated metrics, atlas/color behavior, layout/scaling, DPI, and supported resolutions.
225
+ - [ ] RW-162 Support keyboard/mouse focus, platform clipboard/text input, window resizing, safe display changes, and usable small/large screen layouts.
226
+ - [ ] RW-163 Include all credits/licenses/attribution screens and references with their final content strategy.
227
+
228
+ ## 16. Demos, persistence, developer tooling, and release
229
+
230
+ - [ ] RW-164 Implement recording/playback formats and original demo compatibility required by the release contract, including package/mod metadata.
231
+ - [ ] RW-165 Implement replay clocks, pause/seek if supported, camera/spectator controls, event deduplication, and rendering/audio during playback.
232
+ - [ ] RW-166 Implement screenshots and captured diagnostics, saved positions, favorites, match/stat persistence, and config migration.
233
+ - [ ] RW-167 Build map/material/model/animation/entity/navigation viewers and interactive collision/hitbox/network/prediction debug overlays.
234
+ - [ ] RW-168 Expose deterministic input replay and reference-trace comparison commands with task/finding/fixture correspondence.
235
+ - [ ] RW-169 Implement content import/validation and first-launch diagnostics with actionable asset/driver/service errors.
236
+ - [ ] RW-170 Package native macOS application resources and Linux client/server artifacts; test CPU architecture, runtime dependencies, and filesystem conventions.
237
+ - [ ] RW-171 Establish signing/notarization policy where applicable, reproducible release manifests, checksums, and permitted asset distribution.
238
+ - [ ] RW-172 Document installation, controls, conversion, development, server administration, compatibility, hardware, performance, and troubleshooting.
239
+ - [ ] RW-173 Complete the full final validation gate, close required-content/behavior/rendering blockers, and publish a versioned fidelity/compatibility report.
docs/VALIDATION_AND_MILESTONES.md ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Validation, milestones, decisions, and completion gates
2
+
3
+ The stages below are dependency gates rather than calendar estimates. One playable slice proves integration; it does not reduce the requested all-content/all-game scope. Use task IDs in the linked TODO documents to form implementation issues once the relevant research evidence exists.
4
+
5
+ ## Dependency order
6
+
7
+ ```mermaid
8
+ flowchart TD
9
+ A[Reference identity and all-file inventory] --> B[Original execution and evidence harness]
10
+ A --> C[VFS and original format specifications]
11
+ A --> D[Bevy and Solari hardware proof]
12
+ B --> E[Native and QVM ABI, rules and traces]
13
+ C --> F[Versioned conversion pipeline]
14
+ E --> G[Shared simulation and headless server]
15
+ F --> H[Bevy world, animation, audio and UI]
16
+ D --> I[Complete Solari material and rendering port]
17
+ H --> I
18
+ E --> J[Network and demo specification]
19
+ G --> K[Prediction, multiplayer and compatibility]
20
+ J --> K
21
+ G --> L[All modes, entities, gear and bots]
22
+ K --> M[Full content and platform conformance]
23
+ L --> M
24
+ I --> M
25
+ F --> M
26
+ M --> N[Packaging, documentation and release]
27
+ ```
28
+
29
+ Every subsystem also loops through specification → fixtures → implementation → comparison → corrected findings. Early evidence can change architecture; keep those changes recorded and rerun affected tests.
30
+
31
+ ## Milestones and exit criteria
32
+
33
+ | Gate | Required outputs | Exit evidence |
34
+ | --- | --- | --- |
35
+ | M0: Research baseline | Reusable inventory, all-file/member coverage register, pinned reference, research setup, rights/source/service registers | Inputs reproduce the static inventory; every item has an analysis task; reference client/server can be observed or an alternative execution environment is established. |
36
+ | M1: Platform feasibility | Pinned Bevy/Solari candidate and macOS/Linux prototype results, hardware/denoising/material/animation decisions | Actual representative machines render the test scene and imported/animated test content; blockers and required renderer extensions have a plan. Raster-only results do not pass the Solari requirement. |
37
+ | M2: Engine and content contracts | VFS, formats, native/library responsibilities, QVM decoder/ABI, units, schemas | Candidate resolution matches controlled reference tests; every format has a parser/analysis plan; QVM instructions and required syscalls are mapped sufficiently for tested slices. |
38
+ | M3: Complete initial asset pipeline | Unpacking and batch conversion, audit, dependency graph, reports | All archive variants can be inspected; required selected content converts with tracked gaps; known Paris and FRF1 overrides are resolved correctly. |
39
+ | M4: Movement/world slice | One representative map and jump fixture, collision, movement, client camera, headless simulation | Golden movement/collision traces pass; stairs/walls/ladders/water/movers and frame-rate independence have evidence; map reload cleans up. |
40
+ | M5: Combat/network slice | One complete firearm, melee/projectile examples, damage/health, Rust client/server, prediction | Two native-platform clients complete a controlled match; weapon/hit/damage traces and impaired-network tests pass. |
41
+ | M6: Complete rules and interactive world | All weapons/gear, 47 observed entity classes plus discovered supported classes, all 11 modes/modifiers, match/admin behavior | Every required rule/state transition has evidence and tests, including simultaneous/timer/disconnect edge cases. |
42
+ | M7: Full presentation port | Every shader's mapping, models/animation/attachments, Solari and legacy comparison rendering, audio, video, fonts/UI/HUD | Full material/effect coverage reports; tested raytraced animation and denoising; no silently omitted original rendering behavior. |
43
+ | M8: Bots, demos, services, compatibility | Navigation/bots, recording/playback, discovery/download/auth strategy, original compatibility decision/implementation | Per-map bot tests and controlled demos pass; required compatibility directions work; external-service behavior/failures documented. |
44
+ | M9: Exhaustive analysis/content coverage | Every installation file and member variant analysed, all maps/assets validated, handbook complete | All-file analysis matrix has no unaccounted rows; unused/obsolete/overridden content documented; required runtime assets have no unresolved blocker. |
45
+ | M10: Cross-platform release qualification | Native packages, CI/conformance, GPU performance reports, long-run/network/parser robustness, installation docs | Full declared macOS/Linux and GPU matrix passes; minimum hardware/OS/driver/performance promises have measured evidence. |
46
+ | M11: Entire-game completion | All required research, runtime, content, Solari, multiplayer, documentation and release deliverables | Goals G1–G9 satisfied; differences explicitly reviewed; no required task hidden behind a fallback or unapproved exclusion. |
47
+
48
+ M0–M3 are the recommended first work tranche. Investigate platform blockers early while research progresses; do not spend the entire asset conversion effort before proving required rendering behavior. Move through an integrated movement/combat slice before expanding every ruleset, while continuing exhaustive static analysis.
49
+
50
+ ## Decisions that must be recorded
51
+
52
+ | Decision | Evidence needed | Resolve before |
53
+ | --- | --- | --- |
54
+ | Reference source/fork match and implementation license | Binary/source comparison, bundled licenses, copied-code policy | Reusing upstream implementation |
55
+ | Asset use/distribution and replacement strategy | Supplied restrictions, contributor credits, permitted media model | Public asset packaging/release |
56
+ | Rust/Bevy/Solari versions and patches | Exact release/commit capability tests | Renderer interfaces and lockfile |
57
+ | GPU/OS/CPU matrix, Intel Mac/Linux ARM64 scope | Native runs and measured limits | Public platform promises |
58
+ | macOS/Linux denoising strategy | Moving-scene image quality and frame cost | Full Solari presentation gate |
59
+ | Legacy shader/hybrid rendering architecture | Every directive/material family, ray participation | Material schema freeze |
60
+ | MD3 animation and raytracing geometry strategy | Fidelity, memory, upload and acceleration-structure tests | Model/animation runtime format |
61
+ | Coordinates, units, collision and numeric behavior | Reference traces and format contracts | Authoritative simulation freeze |
62
+ | Shared fixed-step simulation and scheduling | Timing measurements and deterministic replay | Prediction/network architecture |
63
+ | Original-wire compatibility vs new protocol/adapter | Protocol recovery, services, pure checks, executable tests | Multiplayer release scope |
64
+ | Bot navigation import vs regeneration | AAS semantics, traversal/objective tests | Navigation format freeze |
65
+ | Official services vs supported replacements | Protocol, permission/access, availability, failure behavior | Online feature contract |
66
+ | Original defect compatibility vs correction | Trigger, impact, parity need and security implications | Related implementation/test expectations |
67
+ | Runtime formats and package/schema upgrades | Required fidelity, startup/storage/memory constraints | Converter/runtime package contracts |
68
+
69
+ These are future engineering decisions to resolve with evidence, not requests for permission to write this plan. Existing user scope includes researching every file and implementing the eventual Rust game; this current deliverable is documentation only.
70
+
71
+ ## Risks and concrete mitigations
72
+
73
+ | Risk | Mitigation and closure evidence |
74
+ | --- | --- |
75
+ | No complete gameplay source in the cache | QVM decoder, native ABI mapping, instrumented reference oracle, behavior fixtures; track unresolved reachability explicitly. |
76
+ | Legacy binaries difficult to run | Suitable Linux reference environment and alternate native architectures; record platform failures and retain static analysis paths. |
77
+ | Wrong asset version/case resolution | Preserve all variants; reproduce runtime VFS; regression cases for Paris and FRF1. |
78
+ | Solari platform/denoiser/material/animation gaps | Early real-GPU spike, renderer patch/hybrid plan, per-shader mapping, quality/performance acceptance tests. |
79
+ | MD3 animation data and BLAS cost | Exact-frame representation benchmarks, resource budgets and measured acceleration-structure strategy. |
80
+ | Modern physics changes movement | Custom reference-compatible traces/controller; differential usercmd replay. |
81
+ | Network/demo or service compatibility underestimated | Early packet/demo capture and explicit compatibility/service contract; interoperability exit gate. |
82
+ | Baked art/lightmaps change under Solari | Separate legacy comparison and calibrated Solari profile; no double lighting; readability/image tests. |
83
+ | Unused/overridden files silently omitted | Every file/member occurrence has an analysis record and audited final disposition. |
84
+ | Original media redistribution constraints | Per-asset provenance and permission/replacement/user-import distribution decision before release. |
85
+ | “Almost complete” after one map/mode | Explicit all-mode, all-map, all-shader, all-entity, command/cvar and all-file matrices and M11 closure. |
86
+
87
+ ## Validation TODO: evidence and conformance harness
88
+
89
+ - [ ] QA-001 Define fixture IDs, input hashes, environment/cvar/map/mode requirements, outputs, clocks, units, tolerances, and intentional differences.
90
+ - [ ] QA-002 Implement deterministic usercmd replay, state/event snapshots, golden trace comparison, and useful first-divergence reports.
91
+ - [ ] QA-003 Implement reference QVM/native function capture where practical and black-box session fixtures where internals remain inaccessible.
92
+ - [ ] QA-004 Compare integer/enums/IDs/events/packet bytes exactly where the contract requires it; measure float tolerances explicitly by subsystem.
93
+ - [ ] QA-005 Compare macOS/Linux simulation traces and seeded randomness; investigate scheduler/architecture differences instead of assuming determinism.
94
+ - [ ] QA-006 Add per-rule coverage linking research findings to converted data, implementation and tests.
95
+ - [ ] QA-007 Create reproducible captures for all modes/weapon types/objectives/entities and configuration boundaries.
96
+ - [ ] QA-008 Version fixtures and rebaseline only with documented evidence, preserving changed-reference provenance.
97
+
98
+ ## Validation TODO: complete folder and content coverage
99
+
100
+ - [ ] QA-009 Require every one of the 39 initial installation files and all 9,835 member occurrences to have analysis status, findings, dependencies, and disposition.
101
+ - [ ] QA-010 Require analysis of all executables/libraries/platform resources, embedded payloads, discarded patch versions, auxiliary databases and authoring files.
102
+ - [ ] QA-011 Detect newly discovered files/payloads and extend the all-file register rather than freezing scope at the initial counts.
103
+ - [ ] QA-012 Verify every format/variant and every shader directive/combination in the parsed inventory, including unused content and malformed cases.
104
+ - [ ] QA-013 Require every required asset's transitive dependencies to resolve in the final package with correct VFS selection/case semantics.
105
+ - [ ] QA-014 Compare source/converted geometry bounds/counts/winding/UVs, animation frames/tag transforms, skin mapping, fonts, and audio metadata.
106
+ - [ ] QA-015 Audit all image alpha/texture sampling/mipmap behavior and all shader legacy/Solari mappings.
107
+ - [ ] QA-016 Audit every observed/supported entity class and every active weapon/item/gear ID with evidence and fixtures.
108
+ - [ ] QA-017 Verify archive/converter/runtime parser negative tests and resource limits, with fuzzing targeted at complex binary/text inputs.
109
+ - [ ] QA-018 Rebuild bundles twice from clean outputs and compare manifests/hashes; test cache invalidation/version migrations.
110
+
111
+ ## Validation TODO: gameplay, modes, bots, and administration
112
+
113
+ - [ ] QA-019 Cover movement on flats/slopes/stairs/corners, wall jumps, ledges/ladders/water/movers, injuries/stamina/gear, and latency/frame-rate variations.
114
+ - [ ] QA-020 Cover every weapon's firing/reloading/modes/ammo/recoil/spread/scope/animation/audio/attachments and interruption/death cases.
115
+ - [ ] QA-021 Cover every damage region/armor state, melee/projectile/radius/fall/environment damage, bleeding/healing and friendly/self damage.
116
+ - [ ] QA-022 Complete scripted matches for all 11 modes and all supported modifiers, including warmup/round/match/intermission/mapcycle transitions.
117
+ - [ ] QA-023 Cover spawn/respawn/waves/protection/occupied spawns, reconnects/disconnects, spectators/substitutes and match readiness/timeouts/swaps.
118
+ - [ ] QA-024 Cover simultaneous kill/objective/timer events and every original changelog regression relevant to recovered behavior.
119
+ - [ ] QA-025 Test every supported command/cvar range/flag/permission/mode restriction, persistence/latching, aliases/macros, and error behavior.
120
+ - [ ] QA-026 Test rcon/referee/voting/bans/mutes/flood/teamkill/inactivity/log/stat/admin flows and service outage behavior.
121
+ - [ ] QA-027 Test bot navigation and objective behavior on every map and supported mode, including ladders/jumps/water/movers and stuck recovery.
122
+ - [ ] QA-028 Run long matches and repeated map changes/restarts to detect state leaks, missing resets, resource accumulation and clock wrap issues.
123
+
124
+ ## Validation TODO: networking and demos
125
+
126
+ - [ ] QA-029 Complete codec fixtures for framing/fragmentation/compression/baselines/deltas/usercmds/events/configstrings/content negotiation.
127
+ - [ ] QA-030 Test Rust client/server on both platforms with cross-platform peers and headless servers.
128
+ - [ ] QA-031 Test every required original client/server interoperability direction against the pinned reference; include pure/package checks and version rejection.
129
+ - [ ] QA-032 Test controlled packet loss/reordering/duplication/jitter/high latency/bandwidth limits, reconnect/timeouts, and reliable overflow handling.
130
+ - [ ] QA-033 Verify prediction/reconciliation/lag compensation and compare event/score/objective outcomes under impaired transport.
131
+ - [ ] QA-034 Test discovery/browser/favorites/status/download cancel/resume/package reload/auth failure modes without depending solely on public services.
132
+ - [ ] QA-035 Test original and new demos per the chosen contract, including metadata/version/map requirements, seek/pause/camera/audio and deterministic outcomes.
133
+ - [ ] QA-036 Test malformed/truncated/oversized network and demo input without crashes, unbounded allocation, or invalid state transitions.
134
+
135
+ ## Validation TODO: presentation and performance
136
+
137
+ - [ ] QA-037 Create visual comparison fixtures for each map/material/effect family, model/skin/animation state, UI/HUD layout and camera mode.
138
+ - [ ] QA-038 Separate structural visual comparisons from intentionally changed Solari illumination, with accepted brightness/visibility tolerances.
139
+ - [ ] QA-039 Test raytraced animated geometry/attachments, moving shadows/reflections, masked/transparent surfaces, fog/portals and hybrid composition.
140
+ - [ ] QA-040 Test moving-scene noise, denoising/ghosting, first-person weapons, camera cuts/teleports/respawns, emissive flashes and night vision.
141
+ - [ ] QA-041 Test every sound family/event/frame/loop, environmental/spatial output, music/radio priority and video synchronization.
142
+ - [ ] QA-042 Test supported resolutions/DPI/window modes, mouse/text focus, resizing, device hot-plug, X11/Wayland and macOS fullscreen/Retina behavior.
143
+ - [ ] QA-043 Establish explicit performance budgets on representative hardware: frame percentiles, input latency, server tick cost, bandwidth, CPU/GPU memory and startup/load times.
144
+ - [ ] QA-044 Measure Solari sample/denoising/BLAS/material/texture costs on largest maps and full matches, including view weapons, bots and effects.
145
+ - [ ] QA-045 Test headless server memory/CPU/network budgets separately from the graphical client.
146
+ - [ ] QA-046 Profile cold/warm loads, shader compilation, asset streaming, map reloads, GPU validation warnings and long-session stability.
147
+ - [ ] QA-047 Publish measured requirements and benchmark methods; the original `com_maxfps 125` setting is context, not an established rewrite performance guarantee.
148
+
149
+ ## Validation TODO: release and documentation
150
+
151
+ - [ ] QA-048 Test a clean checkout and user-supplied installation through import/conversion/build/launch without undeclared local dependencies.
152
+ - [ ] QA-049 Test native packages on clean macOS/Linux environments, including CPU architecture, drivers, shared libraries, permissions and data paths.
153
+ - [ ] QA-050 Verify first-launch asset/hardware/service diagnostics and graceful unsupported-device/content handling.
154
+ - [ ] QA-051 Review licenses/attribution/source notices and validate the agreed bundle/user-import/replacement-media policy.
155
+ - [ ] QA-052 Finish user, developer, research, server, content-authoring, build, installation and troubleshooting guides with working commands.
156
+ - [ ] QA-053 Publish per-platform/Solari/content/gameplay/interoperability matrices and the list of intentional differences and remaining unsupported optional tiers.
157
+ - [ ] QA-054 Audit every unchecked task against goals and resolve all required blockers; scope changes require explicit recorded agreement rather than silent omission.
158
+ - [ ] QA-055 Record final M11 acceptance evidence and release hashes; do not label the entire rewrite complete while required features or file analysis are missing.
159
+
160
+ ## Per-map completion checklist
161
+
162
+ Each entry requires analysis of all archived variants, dependencies, materials, geometry/collision/entities/navigation, conversion, native macOS/Linux loading, legacy and Solari presentation, a gameplay pass for every declared/supported compatible mode, and bots where applicable. Preserve unsupported-mode handling and special features in its coverage record. The jump demonstration has its explicit research/example role rather than an assumed full matchmaking role.
163
+
164
+ - [ ] MAP-001 Complete `ut4_abbey` and every archived variant (initial candidate: `zUrT43_002.pk3`; 93 entity records).
165
+ - [ ] MAP-002 Complete `ut4_algiers` and every archived variant (initial candidate: `zUrT43_002.pk3`; 156 entity records).
166
+ - [ ] MAP-003 Complete `ut4_austria` and every archived variant (initial candidate: `zUrT43_002.pk3`; 147 entity records).
167
+ - [ ] MAP-004 Complete `ut4_bohemia` and every archived variant (initial candidate: `zUrT43_002.pk3`; 377 entity records).
168
+ - [ ] MAP-005 Complete `ut4_casa` and every archived variant (initial candidate: `zUrT43_002.pk3`; 498 entity records).
169
+ - [ ] MAP-006 Complete `ut4_cascade` and every archived variant (initial candidate: `zUrT43_002.pk3`; 359 entity records).
170
+ - [ ] MAP-007 Complete `ut4_docks` and every archived variant (initial candidate: `zUrT43_002.pk3`; 604 entity records).
171
+ - [ ] MAP-008 Complete `ut4_dressingroom` and every archived variant (initial candidate: `zUrT43_002.pk3`; 83 entity records).
172
+ - [ ] MAP-009 Complete `ut4_eagle` and every archived variant (initial candidate: `zUrT43_002.pk3`; 359 entity records).
173
+ - [ ] MAP-010 Complete `ut4_elgin` and every archived variant (initial candidate: `zUrT43_002.pk3`; 532 entity records).
174
+ - [ ] MAP-011 Complete `ut4_firingrange` and every archived variant (initial candidate: `zUrT43_002.pk3`; 55 entity records).
175
+ - [ ] MAP-012 Complete `ut4_ghosttown` and every archived variant (initial candidate: `zUrT43_002.pk3`; 242 entity records).
176
+ - [ ] MAP-013 Complete `ut4_herring` and every archived variant (initial candidate: `zUrT43_002.pk3`; 431 entity records).
177
+ - [ ] MAP-014 Complete `ut4_jumpents` and every archived variant (initial candidate: `ut4_jumpents.pk3`; 20 entity records; example/timer fixture).
178
+ - [ ] MAP-015 Complete `ut4_killroom` and every archived variant (initial candidate: `zUrT43_002.pk3`; 25 entity records).
179
+ - [ ] MAP-016 Complete `ut4_kingdom` and every archived variant (initial candidate: `zUrT43_002.pk3`; 390 entity records).
180
+ - [ ] MAP-017 Complete `ut4_kingpin` and every archived variant (initial candidate: `zUrT43_002.pk3`; 302 entity records).
181
+ - [ ] MAP-018 Complete `ut4_mandolin` and every archived variant (initial candidate: `zUrT43_003.pk3`; 483 entity records).
182
+ - [ ] MAP-019 Complete `ut4_mykonos_a17` and every archived variant (initial candidate: `zUrT43_003.pk3`; 162 entity records).
183
+ - [ ] MAP-020 Complete `ut4_oildepot` and every archived variant (initial candidate: `zUrT43_003.pk3`; 227 entity records).
184
+ - [ ] MAP-021 Complete `ut4_paris` and every archived variant (initial candidate: `zUrT43_021.pk3`; 522 entity records).
185
+ - [ ] MAP-022 Complete `ut4_prague` and every archived variant (initial candidate: `zUrT43_003.pk3`; 268 entity records).
186
+ - [ ] MAP-023 Complete `ut4_prominence` and every archived variant (initial candidate: `zUrT43_003.pk3`; 135 entity records).
187
+ - [ ] MAP-024 Complete `ut4_raiders` and every archived variant (initial candidate: `zUrT43_003.pk3`; 319 entity records).
188
+ - [ ] MAP-025 Complete `ut4_ramelle` and every archived variant (initial candidate: `zUrT43_003.pk3`; 536 entity records).
189
+ - [ ] MAP-026 Complete `ut4_ricochet` and every archived variant (initial candidate: `zUrT43_003.pk3`; 387 entity records).
190
+ - [ ] MAP-027 Complete `ut4_riyadh` and every archived variant (initial candidate: `zUrT43_003.pk3`; 212 entity records).
191
+ - [ ] MAP-028 Complete `ut4_sanc` and every archived variant (initial candidate: `zUrT43_003.pk3`; 404 entity records).
192
+ - [ ] MAP-029 Complete `ut4_suburbs` and every archived variant (initial candidate: `zUrT43_003.pk3`; 664 entity records).
193
+ - [ ] MAP-030 Complete `ut4_subway` and every archived variant (initial candidate: `zUrT43_003.pk3`; 327 entity records).
194
+ - [ ] MAP-031 Complete `ut4_swim` and every archived variant (initial candidate: `zUrT43_003.pk3`; 538 entity records).
195
+ - [ ] MAP-032 Complete `ut4_thingley` and every archived variant (initial candidate: `zUrT43_004.pk3`; 416 entity records).
196
+ - [ ] MAP-033 Complete `ut4_tombs` and every archived variant (initial candidate: `zUrT43_004.pk3`; 668 entity records).
197
+ - [ ] MAP-034 Complete `ut4_turnpike` and every archived variant (initial candidate: `zUrT43_004.pk3`; 248 entity records).
198
+ - [ ] MAP-035 Complete `ut4_uptown` and every archived variant (initial candidate: `zUrT43_004.pk3`; 647 entity records).
199
+
200
+ ## Tracking completeness
201
+
202
+ Track separately: **analysed file/member occurrences**, **specified/recovered behaviors**, **converted content**, **implemented features**, and **passed conformance fixtures**. These percentages have different denominators and cannot substitute for one another. Report blockers by goal and milestone. Initial static inspection is evidence for inventory/headers; it is not a completion mark for any full subsystem.
docs/inventory/README.md ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Initial cache inventory
2
+
3
+ Generated from local static inspection on **2026-10-10**. Source root: `.cache/UrbanTerror43/`. These files contain metadata, not copied asset payloads or disassembly.
4
+
5
+ | File | Contents |
6
+ | --- | --- |
7
+ | [snapshot.json](snapshot.json) | SHA-256 and size for all 39 installation files; archive sizes, extensions, CRC-test results, map headers, and QVM headers/hashes. |
8
+ | [archive-members.tsv](archive-members.tsv) | All 9,835 non-directory ZIP members, archive origin, size, CRC-32, selected-candidate marker, and inspected format header where applicable. |
9
+ | [overrides.tsv](overrides.tsv) | 114 repeated exact-case path events encountered while indexing archives in ascending filename order. |
10
+ | [case-collisions.tsv](case-collisions.tsv) | Six paths in three casefold collision groups, including archives, sizes, and CRCs. |
11
+ | [maps.json](maps.json) | All 35 exact-case distinct BSP paths under the provisional selection rule, 17 lump bounds each, and entity-class instance counts. |
12
+ | [entity-classes.tsv](entity-classes.tsv) | All 47 class names seen in selected BSP entity text, total occurrences, and containing maps. |
13
+ | [format-summary.json](format-summary.json) | BSP surface types/flags, MD3 frame counts and first-frame tag names, WAV format census, and credit/readme paths. |
14
+ | [native-imports.json](native-imports.json) | Direct ELF `DT_NEEDED` and Windows PE import-descriptor libraries for all six standalone native binaries, with scope limitations. |
15
+
16
+ ## Interpretation limits
17
+
18
+ The index preserves original path spelling. The candidate rule is “last exact-case occurrence in ascending archive filename order.” It is intentionally described as provisional: actual game lookup may normalize paths, reorder archives for pure servers, and include other directories. All three case collisions need runtime resolution before extraction to a case-insensitive filesystem. A final engine-compatible index must supersede this rule.
19
+
20
+ Archive CRC checks read all non-directory members and passed for all 23 archives. This checks ZIP decompression and CRC consistency, not source authenticity or asset semantics. Installation files have SHA-256 hashes; individual members initially have ZIP CRC-32 rather than cryptographic content hashes.
21
+
22
+ BSP inventory checks `IBSP` version 46 and that all 17 lump ranges fit within the selected file. Entity counts use a regular-expression survey of `classname` pairs, not a full entity parser. Surface counts read fixed records under the version-46 layout. Full parser validation remains TODO.
23
+
24
+ MD3 header inspection found `IDP3` version 15 for all 619 model paths. Tag names are sampled from the first frame of every tagged model; this does not validate animation transforms across all frames. AAS header inspection found `EAAS` version 5 for all 34 selected paths. WAV inspection reads RIFF `fmt ` metadata; it does not test playback, loop chunks, or audio fidelity.
25
+
26
+ No hidden configuration, user home-path content, external downloaded maps, or live server state is included. The exact cache snapshot, not a claim about all Urban Terror installations, defines these counts.
docs/inventory/archive-members.tsv ADDED
The diff for this file is too large to render. See raw diff
 
docs/inventory/case-collisions.tsv ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ casefold_path original_path archive bytes crc32
2
+ sound/weapons/frf1/frf1-inside.wav sound/weapons/FRF1/frf1-inside.wav zUrT43_010.pk3 72124 d373fb31
3
+ sound/weapons/frf1/frf1-inside.wav sound/weapons/frf1/frf1-inside.wav zUrT43_021.pk3 50284 345f9ef1
4
+ sound/weapons/frf1/frf1-outside.wav sound/weapons/FRF1/frf1-outside.wav zUrT43_010.pk3 167864 0ca0df26
5
+ sound/weapons/frf1/frf1-outside.wav sound/weapons/frf1/frf1-outside.wav zUrT43_021.pk3 86642 b1344f1f
6
+ sound/weapons/frf1/frf1-shelldrop.wav sound/weapons/FRF1/frf1-shelldrop.wav zUrT43_010.pk3 33524 6403add3
7
+ sound/weapons/frf1/frf1-shelldrop.wav sound/weapons/frf1/frf1-shelldrop.wav zUrT43_021.pk3 33524 6403add3
docs/inventory/entity-classes.tsv ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ classname instances maps
2
+ cubemap_probe 324 ut4_bohemia,ut4_casa,ut4_cascade,ut4_kingdom,ut4_mandolin,ut4_raiders,ut4_ramelle,ut4_tombs,ut4_uptown
3
+ func_bobbing 5 ut4_docks
4
+ func_breakable 427 ut4_abbey,ut4_algiers,ut4_cascade,ut4_docks,ut4_eagle,ut4_firingrange,ut4_ghosttown,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_paris,ut4_ramelle,ut4_ricochet,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
5
+ func_button 22 ut4_cascade,ut4_ghosttown,ut4_herring,ut4_mandolin,ut4_oildepot,ut4_paris,ut4_sanc,ut4_swim
6
+ func_door 107 ut4_cascade,ut4_docks,ut4_ghosttown,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_paris,ut4_prague,ut4_ramelle,ut4_ricochet,ut4_sanc,ut4_suburbs,ut4_swim,ut4_turnpike,ut4_uptown
7
+ func_keyboard_interface 1 ut4_eagle
8
+ func_pendulum 19 ut4_docks,ut4_ghosttown,ut4_ricochet,ut4_riyadh,ut4_sanc
9
+ func_rotating 8 ut4_mandolin,ut4_mykonos_a17,ut4_subway,ut4_swim
10
+ func_rotating_door 128 ut4_casa,ut4_docks,ut4_eagle,ut4_oildepot,ut4_paris,ut4_ramelle,ut4_ricochet,ut4_suburbs,ut4_swim,ut4_turnpike
11
+ func_timer 5 ut4_subway
12
+ func_ut_train 1 ut4_eagle
13
+ func_wall 363 ut4_algiers,ut4_austria,ut4_bohemia,ut4_cascade,ut4_docks,ut4_eagle,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_paris,ut4_prague,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_sanc,ut4_suburbs,ut4_swim,ut4_thingley,ut4_tombs,ut4_uptown
14
+ info_notnull 122 ut4_bohemia,ut4_cascade,ut4_elgin,ut4_firingrange,ut4_mandolin,ut4_prague
15
+ info_null 635 ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_elgin,ut4_herring,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_ramelle,ut4_ricochet,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike
16
+ info_player_deathmatch 424 ut4_jumpents,ut4_abbey,ut4_austria,ut4_casa,ut4_docks,ut4_dressingroom,ut4_eagle,ut4_elgin,ut4_firingrange,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ricochet,ut4_riyadh,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
17
+ info_player_intermission 23 ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_eagle,ut4_ghosttown,ut4_herring,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_ramelle,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_tombs,ut4_uptown
18
+ info_player_start 102 ut4_algiers,ut4_bohemia,ut4_cascade,ut4_killroom,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_raiders,ut4_ramelle,ut4_sanc,ut4_subway
19
+ info_ut_bombsite 60 ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_eagle,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
20
+ info_ut_spawn 4506 ut4_jumpents,ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_dressingroom,ut4_eagle,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
21
+ item_botroam 32 ut4_casa,ut4_sanc,ut4_thingley
22
+ misc_portal_camera 10 ut4_firingrange
23
+ misc_portal_surface 13 ut4_dressingroom,ut4_firingrange,ut4_oildepot
24
+ path_ut_stop 3 ut4_eagle,ut4_turnpike
25
+ target_delay 3 ut4_cascade,ut4_paris
26
+ target_location 2175 ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_dressingroom,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
27
+ target_position 889 ut4_casa,ut4_docks,ut4_eagle,ut4_herring,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_sanc,ut4_suburbs,ut4_swim,ut4_tombs,ut4_turnpike,ut4_uptown
28
+ target_print 1 ut4_sanc
29
+ target_relay 4 ut4_eagle,ut4_paris
30
+ target_speaker 751 ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_eagle,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_killroom,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
31
+ team_CAH_capturepoint 114 ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_dressingroom,ut4_eagle,ut4_elgin,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_uptown
32
+ team_CTF_blueflag 32 ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_dressingroom,ut4_eagle,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
33
+ team_CTF_redflag 32 ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_dressingroom,ut4_eagle,ut4_elgin,ut4_ghosttown,ut4_herring,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
34
+ trigger_always 4 ut4_cascade,ut4_paris
35
+ trigger_hurt 61 ut4_cascade,ut4_docks,ut4_eagle,ut4_herring,ut4_killroom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_raiders,ut4_sanc,ut4_suburbs,ut4_thingley,ut4_tombs
36
+ trigger_location 161 ut4_bohemia,ut4_eagle,ut4_firingrange,ut4_herring,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_ricochet,ut4_riyadh,ut4_swim
37
+ trigger_multiple 145 ut4_jumpents,ut4_bohemia,ut4_cascade,ut4_docks,ut4_eagle,ut4_elgin,ut4_herring,ut4_killroom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_ramelle,ut4_ricochet,ut4_sanc,ut4_suburbs,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
38
+ ut_end_jumphint 3 ut4_uptown
39
+ ut_jumpcancel 1 ut4_jumpents
40
+ ut_jumpgoal 3 ut4_uptown
41
+ ut_jumpstart 2 ut4_jumpents
42
+ ut_jumpstop 2 ut4_jumpents
43
+ ut_mrsentry 65 ut4_casa,ut4_cascade,ut4_docks,ut4_elgin,ut4_mandolin,ut4_mykonos_a17,ut4_prague,ut4_ramelle,ut4_sanc,ut4_uptown
44
+ ut_purple_jumphint 5 ut4_uptown
45
+ ut_start_jumphint 3 ut4_uptown
46
+ ut_teal_jumphint 3 ut4_uptown
47
+ ut_yellow_jumphint 2 ut4_uptown
48
+ worldspawn 35 ut4_jumpents,ut4_abbey,ut4_algiers,ut4_austria,ut4_bohemia,ut4_casa,ut4_cascade,ut4_docks,ut4_dressingroom,ut4_eagle,ut4_elgin,ut4_firingrange,ut4_ghosttown,ut4_herring,ut4_killroom,ut4_kingdom,ut4_kingpin,ut4_mandolin,ut4_mykonos_a17,ut4_oildepot,ut4_paris,ut4_prague,ut4_prominence,ut4_raiders,ut4_ramelle,ut4_ricochet,ut4_riyadh,ut4_sanc,ut4_suburbs,ut4_subway,ut4_swim,ut4_thingley,ut4_tombs,ut4_turnpike,ut4_uptown
docs/inventory/format-summary.json ADDED
@@ -0,0 +1,375 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "surface_types": {
3
+ "1": 363564,
4
+ "2": 7275,
5
+ "3": 18814
6
+ },
7
+ "surface_flag_combinations": {
8
+ "0x0": 1399,
9
+ "0xca0": 68,
10
+ "0xc14": 17,
11
+ "0x80": 29,
12
+ "0x1d00000": 185,
13
+ "0x1b00000": 269,
14
+ "0x900000": 64,
15
+ "0x1f00000": 103,
16
+ "0x1400000": 64,
17
+ "0xe00000": 37,
18
+ "0x4ca0": 59,
19
+ "0x1600000": 29,
20
+ "0x4090": 29,
21
+ "0x4cb0": 45,
22
+ "0x14020": 101,
23
+ "0x4000": 187,
24
+ "0x20": 43,
25
+ "0x10000": 105,
26
+ "0x1a00000": 230,
27
+ "0xc00000": 313,
28
+ "0x1300000": 7,
29
+ "0xb00000": 65,
30
+ "0x15020": 17,
31
+ "0xc00": 49,
32
+ "0x4cb8": 25,
33
+ "0x500000": 385,
34
+ "0x1900000": 73,
35
+ "0x1700000": 217,
36
+ "0xc20": 31,
37
+ "0x800000": 323,
38
+ "0x1c00000": 56,
39
+ "0x20c14": 8,
40
+ "0x300000": 79,
41
+ "0xc00020": 2,
42
+ "0x1b04000": 1,
43
+ "0x4020": 95,
44
+ "0x4080": 31,
45
+ "0x24c20": 2,
46
+ "0x4190": 17,
47
+ "0x510000": 3,
48
+ "0x4c00": 8,
49
+ "0x1d10000": 2,
50
+ "0x14000": 7,
51
+ "0x24020": 940,
52
+ "0x4cb2": 5,
53
+ "0x501000": 5,
54
+ "0xf00000": 24,
55
+ "0x1d00c20": 5,
56
+ "0x1c020": 6,
57
+ "0x4c20": 62,
58
+ "0x10c00": 8,
59
+ "0xa00000": 19,
60
+ "0x1800000": 98,
61
+ "0x20c34": 8,
62
+ "0x600000": 49,
63
+ "0x200000": 89,
64
+ "0xca2": 5,
65
+ "0x1d08000": 1,
66
+ "0xc020": 1,
67
+ "0x10020": 2,
68
+ "0x1d08020": 1,
69
+ "0x1500000": 26,
70
+ "0x400000": 25,
71
+ "0x100000": 111,
72
+ "0x1d00020": 27,
73
+ "0x4c30": 12,
74
+ "0x14030": 14,
75
+ "0x1d00c00": 15,
76
+ "0x40a0": 1,
77
+ "0x4030": 10,
78
+ "0x4c10": 3,
79
+ "0xc34": 3,
80
+ "0x500c80": 2,
81
+ "0xc80": 8,
82
+ "0x1a00c80": 1,
83
+ "0xe10000": 1,
84
+ "0x4c80": 4,
85
+ "0x1d00001": 2,
86
+ "0x504030": 1,
87
+ "0x500080": 1,
88
+ "0x1b04030": 1,
89
+ "0xca1": 6,
90
+ "0x500030": 1,
91
+ "0x4": 1,
92
+ "0x24004": 1,
93
+ "0x1c10c00": 1,
94
+ "0x310000": 2,
95
+ "0x4010": 4,
96
+ "0xf00020": 1,
97
+ "0x101000": 1,
98
+ "0x14c20": 1,
99
+ "0xcb0": 2,
100
+ "0x30": 5,
101
+ "0x300020": 1,
102
+ "0x1b00c00": 1,
103
+ "0xc00c00": 1,
104
+ "0x1700c00": 1,
105
+ "0xb00c00": 1,
106
+ "0xa00c00": 1,
107
+ "0xe00c00": 1,
108
+ "0x900c00": 1,
109
+ "0x1cc00": 2,
110
+ "0x700000": 5,
111
+ "0x1610000": 2,
112
+ "0x16000a0": 1,
113
+ "0xe00008": 1,
114
+ "0x300c00": 1,
115
+ "0x4cb1": 2,
116
+ "0xca8": 2,
117
+ "0x1800c10": 1,
118
+ "0x404000": 1,
119
+ "0x40ca0": 1,
120
+ "0x8": 2,
121
+ "0x1000": 1,
122
+ "0xc10": 2,
123
+ "0x1e04000": 1,
124
+ "0x515020": 1,
125
+ "0x100020": 2,
126
+ "0x1200002": 1,
127
+ "0x1100000": 6,
128
+ "0x511020": 1,
129
+ "0x24c10": 80,
130
+ "0x1a10000": 5,
131
+ "0x500c20": 1,
132
+ "0x5cb0": 1,
133
+ "0x1710000": 1,
134
+ "0x1c000": 1,
135
+ "0x500020": 1,
136
+ "0x200020": 1,
137
+ "0xd00000": 2,
138
+ "0x1900c00": 1
139
+ },
140
+ "contents_combinations": {
141
+ "0x1": 4609,
142
+ "0x20000000": 318,
143
+ "0x30000000": 48,
144
+ "0x20010000": 94,
145
+ "0x20000001": 214,
146
+ "0x20000020": 38,
147
+ "0x10000": 21,
148
+ "0x28000001": 13,
149
+ "0x0": 179,
150
+ "0x20400000": 11,
151
+ "0x28000000": 1050,
152
+ "0xa0000000": 14,
153
+ "0x20100000": 5,
154
+ "0x8000001": 3,
155
+ "0x30008000": 5,
156
+ "0x20": 7,
157
+ "0x20200000": 1,
158
+ "0x20000040": 6,
159
+ "0x20000060": 1,
160
+ "0xa0000040": 2
161
+ },
162
+ "md3_frame_counts": {
163
+ "30": 30,
164
+ "1": 537,
165
+ "836": 8,
166
+ "979": 16,
167
+ "614": 2,
168
+ "130": 1,
169
+ "87": 1,
170
+ "101": 3,
171
+ "123": 3,
172
+ "120": 1,
173
+ "106": 3,
174
+ "76": 1,
175
+ "121": 1,
176
+ "82": 1,
177
+ "2": 1,
178
+ "176": 1,
179
+ "105": 1,
180
+ "96": 1,
181
+ "156": 1,
182
+ "77": 1,
183
+ "53": 1,
184
+ "102": 1,
185
+ "109": 1,
186
+ "86": 1,
187
+ "85": 1
188
+ },
189
+ "md3_first_frame_tags": {
190
+ "tag_head": 248,
191
+ "tag_funstuff": 4,
192
+ "tag_camera": 3,
193
+ "tag_sidearm": 6,
194
+ "tag_torso": 26,
195
+ "tag_weapon": 115,
196
+ "tag_flag": 12,
197
+ "tag_second": 12,
198
+ "tag_back": 12,
199
+ "tag_primary": 12,
200
+ "tag_fun": 6,
201
+ "tag_funback": 6,
202
+ "tag_flash": 88,
203
+ "tag_eject": 74,
204
+ "tag_unnamed01": 1,
205
+ "tag_mode": 25,
206
+ "tag_trigger": 39,
207
+ "tag_clip": 42,
208
+ "tag_ejector": 32,
209
+ "tag_main": 47,
210
+ "tag_bolt": 37,
211
+ "tag_flap": 9,
212
+ "tag_shell": 6,
213
+ "tag_laser": 53,
214
+ "tag_cock": 11,
215
+ "tag_sliderel": 5,
216
+ "tag_safety": 9,
217
+ "tag_slide": 9,
218
+ "tag_clip1": 2,
219
+ "tag_clip2": 2,
220
+ "tag_knob1": 2,
221
+ "tag_knob2": 2,
222
+ "tag_button": 2,
223
+ "tag_bullet": 7,
224
+ "tag_capbk": 7,
225
+ "tag_capfr": 7,
226
+ "tag_cliprel": 6,
227
+ "tag_null": 3,
228
+ "tag_ring": 2,
229
+ "tag_pin": 2,
230
+ "tag_grenade": 2,
231
+ "tag_barrel": 2,
232
+ "tag_butt": 2,
233
+ "tag_aim": 2,
234
+ "tag_handle": 2,
235
+ "tag_flap2": 2,
236
+ "tag_flap1": 2,
237
+ "tag_bul01": 1,
238
+ "tag_bul02": 1,
239
+ "tag_bul03": 1,
240
+ "tag_bul04": 1,
241
+ "tag_bul05": 1,
242
+ "tag_bul06": 1,
243
+ "tag_bul07": 1,
244
+ "tag_bul08": 1,
245
+ "tag_bul09": 1,
246
+ "tag_bul10": 1,
247
+ "tag_box": 2,
248
+ "tag_bulletbox": 8,
249
+ "tag_flash01": 1,
250
+ "tag_mag": 3
251
+ },
252
+ "wav_formats": {
253
+ "(1, 1, 22050, 16)": 527,
254
+ "(1, 2, 22050, 16)": 3,
255
+ "(1, 1, 11025, 8)": 186,
256
+ "(1, 1, 22050, 8)": 46,
257
+ "(1, 1, 11025, 16)": 37,
258
+ "(1, 1, 44100, 16)": 47,
259
+ "(1, 1, 16000, 8)": 1,
260
+ "(1, 1, 48000, 16)": 5,
261
+ "(1, 1, 16574, 8)": 1,
262
+ "(1, 1, 10989, 8)": 1,
263
+ "(1, 1, 8000, 16)": 4,
264
+ "(1, 1, 8000, 8)": 1,
265
+ "(1, 1, 22255, 8)": 1,
266
+ "(1, 1, 22000, 8)": 1,
267
+ "(1, 1, 11127, 8)": 1,
268
+ "(1, 1, 44100, 8)": 6,
269
+ "(1, 1, 22000, 16)": 1,
270
+ "(1, 1, 96000, 16)": 1
271
+ },
272
+ "credits_paths": [
273
+ "maps/ut4_jumpents.txt",
274
+ "env/sor_sea/readme.txt",
275
+ "fonts/ROBOTO_LICENSE.txt",
276
+ "maps/ut4_abbey.txt",
277
+ "maps/ut4_algiers.txt",
278
+ "maps/ut4_austria.txt",
279
+ "maps/ut4_casa.txt",
280
+ "maps/ut4_dressingroom.txt",
281
+ "maps/ut4_eagle.txt",
282
+ "maps/ut4_ghosttown.txt",
283
+ "maps/ut4_herring.txt",
284
+ "maps/ut4_killroom.txt",
285
+ "maps/ut4_kingdom.txt",
286
+ "maps/ut4_kingpin.txt",
287
+ "maps/ut4_mandolin.txt",
288
+ "maps/ut4_mykonos.txt",
289
+ "maps/ut4_oildepot.txt",
290
+ "maps/ut4_paris.txt",
291
+ "maps/ut4_raiders.txt",
292
+ "maps/ut4_riyadh.txt",
293
+ "maps/ut4_subway.txt",
294
+ "maps/ut4_tombs.txt",
295
+ "maps/ut4_turnpike.txt",
296
+ "models/mapobjects/ashtray/readme.txt",
297
+ "models/mapobjects/axe/readme.txt",
298
+ "models/mapobjects/barrell/readme.txt",
299
+ "models/mapobjects/baskets/readme.txt",
300
+ "models/mapobjects/bfp/chainlinks/BFP_Model Readme.txt",
301
+ "models/mapobjects/billboards/readme.txt",
302
+ "models/mapobjects/bk_couch/readme.txt",
303
+ "models/mapobjects/br_alcohol/readme.txt",
304
+ "models/mapobjects/br_apple/readme.txt",
305
+ "models/mapobjects/br_baskets/readme.txt",
306
+ "models/mapobjects/br_bath/readme.txt",
307
+ "models/mapobjects/br_briefcase/readme.txt",
308
+ "models/mapobjects/br_casa/readme.txt",
309
+ "models/mapobjects/br_cleaning/readme.txt",
310
+ "models/mapobjects/br_computers/readme.txt",
311
+ "models/mapobjects/br_couches/readme.txt",
312
+ "models/mapobjects/br_deliverytruck/readme.txt",
313
+ "models/mapobjects/br_dville/readme.txt",
314
+ "models/mapobjects/br_egypt/readme.txt",
315
+ "models/mapobjects/br_electricalboxes/readme.txt",
316
+ "models/mapobjects/br_flourlight/readme.txt",
317
+ "models/mapobjects/br_flowers/readme.txt",
318
+ "models/mapobjects/br_fountain/readme.txt",
319
+ "models/mapobjects/br_garbagecans/readme.txt",
320
+ "models/mapobjects/br_hometheatre/readme.txt",
321
+ "models/mapobjects/br_horror/readme.txt",
322
+ "models/mapobjects/br_industriallights/readme.txt",
323
+ "models/mapobjects/br_lighting1/readme.txt",
324
+ "models/mapobjects/br_officechair/readme.txt",
325
+ "models/mapobjects/br_palms/readme.txt",
326
+ "models/mapobjects/br_pcs1/readme.txt",
327
+ "models/mapobjects/br_pooltable/readme.txt",
328
+ "models/mapobjects/br_rubberduck/readme.txt",
329
+ "models/mapobjects/br_satdish/readme.txt",
330
+ "models/mapobjects/br_steeldrums/readme.txt",
331
+ "models/mapobjects/br_trash/readme.txt",
332
+ "models/mapobjects/br_washerdryer/readme.txt",
333
+ "models/mapobjects/br_weedpak/readme.txt",
334
+ "models/mapobjects/cart/readme.txt",
335
+ "models/mapobjects/cashregister/readme.txt",
336
+ "models/mapobjects/codey1/gmc_van/readme.txt",
337
+ "models/mapobjects/codey1/volvo_xc/readme.txt",
338
+ "models/mapobjects/computer_01/readme.txt",
339
+ "models/mapobjects/copymachine/readme.txt",
340
+ "models/mapobjects/crossing/kamaz_truck/readme.txt",
341
+ "models/mapobjects/crossing/tgb11_rus/readme.txt",
342
+ "models/mapobjects/diesel_generator_01/readme.txt",
343
+ "models/mapobjects/eagle/omita-readme.txt",
344
+ "models/mapobjects/firetruck/readme.txt",
345
+ "models/mapobjects/garbagecans/readme.txt",
346
+ "models/mapobjects/gmc_van/readme.txt",
347
+ "models/mapobjects/honda/readme.txt",
348
+ "models/mapobjects/imperium/drahd-readme.txt",
349
+ "models/mapobjects/junker/omita-readme.txt",
350
+ "models/mapobjects/kitchen/readme.txt",
351
+ "models/mapobjects/landscapelighting/readme.txt",
352
+ "models/mapobjects/lt1_computers/readme.txt",
353
+ "models/mapobjects/market/readme.txt",
354
+ "models/mapobjects/newspaper/readme.txt",
355
+ "models/mapobjects/nuclearfurniture/readme.txt",
356
+ "models/mapobjects/oak/oak_readme.txt",
357
+ "models/mapobjects/oldtruck/readme_oldtruckmodel.txt",
358
+ "models/mapobjects/Phones/ReadMe.txt",
359
+ "models/mapobjects/planters/readme.txt",
360
+ "models/mapobjects/playground/readme.txt",
361
+ "models/mapobjects/portopotty/readme.txt",
362
+ "models/mapobjects/roman_armor/oak-shiro-readme.txt",
363
+ "models/mapobjects/shminkylights/readme.txt",
364
+ "models/mapobjects/switcher/omita-readme.txt",
365
+ "models/mapobjects/swords/readme.txt",
366
+ "models/mapobjects/toxiclight/readme.txt",
367
+ "models/mapobjects/toxicprops/readme.txt",
368
+ "models/mapobjects/trash/readme.txt",
369
+ "models/mapobjects/tub_light/readme.txt",
370
+ "models/mapobjects/urbanterror/trees/readme.txt",
371
+ "models/mapobjects/woodencart/readme.txt",
372
+ "models/null_beach/tires/lt1_tires_readme.txt",
373
+ "models/br_readme.txt"
374
+ ]
375
+ }
docs/inventory/maps.json ADDED
@@ -0,0 +1,3820 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "path": "maps/ut4_jumpents.bsp",
4
+ "archive": "ut4_jumpents.pk3",
5
+ "entity_classes": {
6
+ "info_player_deathmatch": 1,
7
+ "info_ut_spawn": 8,
8
+ "trigger_multiple": 5,
9
+ "ut_jumpcancel": 1,
10
+ "ut_jumpstart": 2,
11
+ "ut_jumpstop": 2,
12
+ "worldspawn": 1
13
+ },
14
+ "entities": 20,
15
+ "lumps": [
16
+ {
17
+ "index": 0,
18
+ "offset": 155708,
19
+ "bytes": 1937
20
+ },
21
+ {
22
+ "index": 1,
23
+ "offset": 196,
24
+ "bytes": 720
25
+ },
26
+ {
27
+ "index": 2,
28
+ "offset": 916,
29
+ "bytes": 2080
30
+ },
31
+ {
32
+ "index": 3,
33
+ "offset": 11684,
34
+ "bytes": 6264
35
+ },
36
+ {
37
+ "index": 4,
38
+ "offset": 2996,
39
+ "bytes": 8688
40
+ },
41
+ {
42
+ "index": 5,
43
+ "offset": 20348,
44
+ "bytes": 1896
45
+ },
46
+ {
47
+ "index": 6,
48
+ "offset": 22244,
49
+ "bytes": 824
50
+ },
51
+ {
52
+ "index": 7,
53
+ "offset": 23068,
54
+ "bytes": 240
55
+ },
56
+ {
57
+ "index": 8,
58
+ "offset": 17948,
59
+ "bytes": 480
60
+ },
61
+ {
62
+ "index": 9,
63
+ "offset": 18428,
64
+ "bytes": 1920
65
+ },
66
+ {
67
+ "index": 10,
68
+ "offset": 23308,
69
+ "bytes": 17424
70
+ },
71
+ {
72
+ "index": 11,
73
+ "offset": 157648,
74
+ "bytes": 564
75
+ },
76
+ {
77
+ "index": 12,
78
+ "offset": 157648,
79
+ "bytes": 0
80
+ },
81
+ {
82
+ "index": 13,
83
+ "offset": 40732,
84
+ "bytes": 8840
85
+ },
86
+ {
87
+ "index": 14,
88
+ "offset": 50684,
89
+ "bytes": 98304
90
+ },
91
+ {
92
+ "index": 15,
93
+ "offset": 148988,
94
+ "bytes": 6720
95
+ },
96
+ {
97
+ "index": 16,
98
+ "offset": 49572,
99
+ "bytes": 1112
100
+ }
101
+ ]
102
+ },
103
+ {
104
+ "path": "maps/ut4_abbey.bsp",
105
+ "archive": "zUrT43_002.pk3",
106
+ "entity_classes": {
107
+ "func_breakable": 8,
108
+ "info_player_deathmatch": 17,
109
+ "info_ut_bombsite": 2,
110
+ "info_ut_spawn": 31,
111
+ "target_location": 18,
112
+ "target_speaker": 14,
113
+ "team_CTF_blueflag": 1,
114
+ "team_CTF_redflag": 1,
115
+ "worldspawn": 1
116
+ },
117
+ "entities": 93,
118
+ "lumps": [
119
+ {
120
+ "index": 0,
121
+ "offset": 6276156,
122
+ "bytes": 8658
123
+ },
124
+ {
125
+ "index": 1,
126
+ "offset": 200,
127
+ "bytes": 4104
128
+ },
129
+ {
130
+ "index": 2,
131
+ "offset": 4304,
132
+ "bytes": 110208
133
+ },
134
+ {
135
+ "index": 3,
136
+ "offset": 270464,
137
+ "bytes": 116604
138
+ },
139
+ {
140
+ "index": 4,
141
+ "offset": 114512,
142
+ "bytes": 155952
143
+ },
144
+ {
145
+ "index": 5,
146
+ "offset": 705716,
147
+ "bytes": 86832
148
+ },
149
+ {
150
+ "index": 6,
151
+ "offset": 792548,
152
+ "bytes": 52048
153
+ },
154
+ {
155
+ "index": 7,
156
+ "offset": 844596,
157
+ "bytes": 360
158
+ },
159
+ {
160
+ "index": 8,
161
+ "offset": 387068,
162
+ "bytes": 57456
163
+ },
164
+ {
165
+ "index": 9,
166
+ "offset": 444524,
167
+ "bytes": 261192
168
+ },
169
+ {
170
+ "index": 10,
171
+ "offset": 844956,
172
+ "bytes": 3158056
173
+ },
174
+ {
175
+ "index": 11,
176
+ "offset": 6284816,
177
+ "bytes": 169836
178
+ },
179
+ {
180
+ "index": 12,
181
+ "offset": 6284816,
182
+ "bytes": 0
183
+ },
184
+ {
185
+ "index": 13,
186
+ "offset": 4003012,
187
+ "bytes": 793936
188
+ },
189
+ {
190
+ "index": 14,
191
+ "offset": 5056764,
192
+ "bytes": 884736
193
+ },
194
+ {
195
+ "index": 15,
196
+ "offset": 5941500,
197
+ "bytes": 334656
198
+ },
199
+ {
200
+ "index": 16,
201
+ "offset": 4796948,
202
+ "bytes": 259816
203
+ }
204
+ ]
205
+ },
206
+ {
207
+ "path": "maps/ut4_algiers.bsp",
208
+ "archive": "zUrT43_002.pk3",
209
+ "entity_classes": {
210
+ "func_breakable": 9,
211
+ "func_wall": 21,
212
+ "info_player_start": 15,
213
+ "info_ut_bombsite": 2,
214
+ "info_ut_spawn": 76,
215
+ "target_location": 18,
216
+ "target_speaker": 12,
217
+ "team_CTF_blueflag": 1,
218
+ "team_CTF_redflag": 1,
219
+ "worldspawn": 1
220
+ },
221
+ "entities": 156,
222
+ "lumps": [
223
+ {
224
+ "index": 0,
225
+ "offset": 10075312,
226
+ "bytes": 14343
227
+ },
228
+ {
229
+ "index": 1,
230
+ "offset": 200,
231
+ "bytes": 5040
232
+ },
233
+ {
234
+ "index": 2,
235
+ "offset": 5240,
236
+ "bytes": 196384
237
+ },
238
+ {
239
+ "index": 3,
240
+ "offset": 459816,
241
+ "bytes": 192492
242
+ },
243
+ {
244
+ "index": 4,
245
+ "offset": 201624,
246
+ "bytes": 258192
247
+ },
248
+ {
249
+ "index": 5,
250
+ "offset": 1309048,
251
+ "bytes": 142832
252
+ },
253
+ {
254
+ "index": 6,
255
+ "offset": 1451880,
256
+ "bytes": 94636
257
+ },
258
+ {
259
+ "index": 7,
260
+ "offset": 1546516,
261
+ "bytes": 1240
262
+ },
263
+ {
264
+ "index": 8,
265
+ "offset": 652308,
266
+ "bytes": 116748
267
+ },
268
+ {
269
+ "index": 9,
270
+ "offset": 769056,
271
+ "bytes": 539992
272
+ },
273
+ {
274
+ "index": 10,
275
+ "offset": 1547756,
276
+ "bytes": 4470444
277
+ },
278
+ {
279
+ "index": 11,
280
+ "offset": 10089656,
281
+ "bytes": 246660
282
+ },
283
+ {
284
+ "index": 12,
285
+ "offset": 10089656,
286
+ "bytes": 0
287
+ },
288
+ {
289
+ "index": 13,
290
+ "offset": 6018200,
291
+ "bytes": 1277848
292
+ },
293
+ {
294
+ "index": 14,
295
+ "offset": 8233456,
296
+ "bytes": 1277952
297
+ },
298
+ {
299
+ "index": 15,
300
+ "offset": 9511408,
301
+ "bytes": 563904
302
+ },
303
+ {
304
+ "index": 16,
305
+ "offset": 7296048,
306
+ "bytes": 937408
307
+ }
308
+ ]
309
+ },
310
+ {
311
+ "path": "maps/ut4_austria.bsp",
312
+ "archive": "zUrT43_002.pk3",
313
+ "entity_classes": {
314
+ "func_wall": 7,
315
+ "info_player_deathmatch": 13,
316
+ "info_ut_bombsite": 2,
317
+ "info_ut_spawn": 96,
318
+ "target_location": 16,
319
+ "target_speaker": 10,
320
+ "team_CTF_blueflag": 1,
321
+ "team_CTF_redflag": 1,
322
+ "worldspawn": 1
323
+ },
324
+ "entities": 147,
325
+ "lumps": [
326
+ {
327
+ "index": 0,
328
+ "offset": 11916616,
329
+ "bytes": 14556
330
+ },
331
+ {
332
+ "index": 1,
333
+ "offset": 200,
334
+ "bytes": 7128
335
+ },
336
+ {
337
+ "index": 2,
338
+ "offset": 7328,
339
+ "bytes": 171360
340
+ },
341
+ {
342
+ "index": 3,
343
+ "offset": 532016,
344
+ "bytes": 264672
345
+ },
346
+ {
347
+ "index": 4,
348
+ "offset": 178688,
349
+ "bytes": 353328
350
+ },
351
+ {
352
+ "index": 5,
353
+ "offset": 1331640,
354
+ "bytes": 184784
355
+ },
356
+ {
357
+ "index": 6,
358
+ "offset": 1516424,
359
+ "bytes": 117216
360
+ },
361
+ {
362
+ "index": 7,
363
+ "offset": 1633640,
364
+ "bytes": 320
365
+ },
366
+ {
367
+ "index": 8,
368
+ "offset": 796688,
369
+ "bytes": 95592
370
+ },
371
+ {
372
+ "index": 9,
373
+ "offset": 892280,
374
+ "bytes": 439360
375
+ },
376
+ {
377
+ "index": 10,
378
+ "offset": 1633960,
379
+ "bytes": 4787024
380
+ },
381
+ {
382
+ "index": 11,
383
+ "offset": 11931172,
384
+ "bytes": 283596
385
+ },
386
+ {
387
+ "index": 12,
388
+ "offset": 11931172,
389
+ "bytes": 0
390
+ },
391
+ {
392
+ "index": 13,
393
+ "offset": 6420984,
394
+ "bytes": 1504464
395
+ },
396
+ {
397
+ "index": 14,
398
+ "offset": 9448296,
399
+ "bytes": 1966080
400
+ },
401
+ {
402
+ "index": 15,
403
+ "offset": 11414376,
404
+ "bytes": 502240
405
+ },
406
+ {
407
+ "index": 16,
408
+ "offset": 7925448,
409
+ "bytes": 1522848
410
+ }
411
+ ]
412
+ },
413
+ {
414
+ "path": "maps/ut4_bohemia.bsp",
415
+ "archive": "zUrT43_002.pk3",
416
+ "entity_classes": {
417
+ "cubemap_probe": 5,
418
+ "func_wall": 15,
419
+ "info_notnull": 1,
420
+ "info_null": 144,
421
+ "info_player_intermission": 1,
422
+ "info_player_start": 14,
423
+ "info_ut_bombsite": 2,
424
+ "info_ut_spawn": 128,
425
+ "target_location": 27,
426
+ "target_speaker": 16,
427
+ "team_CAH_capturepoint": 3,
428
+ "team_CTF_blueflag": 1,
429
+ "team_CTF_redflag": 1,
430
+ "trigger_location": 12,
431
+ "trigger_multiple": 6,
432
+ "worldspawn": 1
433
+ },
434
+ "entities": 377,
435
+ "lumps": [
436
+ {
437
+ "index": 0,
438
+ "offset": 10322544,
439
+ "bytes": 33070
440
+ },
441
+ {
442
+ "index": 1,
443
+ "offset": 196,
444
+ "bytes": 21240
445
+ },
446
+ {
447
+ "index": 2,
448
+ "offset": 21436,
449
+ "bytes": 363040
450
+ },
451
+ {
452
+ "index": 3,
453
+ "offset": 580220,
454
+ "bytes": 145548
455
+ },
456
+ {
457
+ "index": 4,
458
+ "offset": 384476,
459
+ "bytes": 195744
460
+ },
461
+ {
462
+ "index": 5,
463
+ "offset": 1329532,
464
+ "bytes": 109180
465
+ },
466
+ {
467
+ "index": 6,
468
+ "offset": 1438712,
469
+ "bytes": 121836
470
+ },
471
+ {
472
+ "index": 7,
473
+ "offset": 1560548,
474
+ "bytes": 1360
475
+ },
476
+ {
477
+ "index": 8,
478
+ "offset": 725768,
479
+ "bytes": 97980
480
+ },
481
+ {
482
+ "index": 9,
483
+ "offset": 823748,
484
+ "bytes": 505784
485
+ },
486
+ {
487
+ "index": 10,
488
+ "offset": 1561908,
489
+ "bytes": 4832476
490
+ },
491
+ {
492
+ "index": 11,
493
+ "offset": 10355616,
494
+ "bytes": 419040
495
+ },
496
+ {
497
+ "index": 12,
498
+ "offset": 10355616,
499
+ "bytes": 0
500
+ },
501
+ {
502
+ "index": 13,
503
+ "offset": 6394384,
504
+ "bytes": 1211496
505
+ },
506
+ {
507
+ "index": 14,
508
+ "offset": 7948464,
509
+ "bytes": 1966080
510
+ },
511
+ {
512
+ "index": 15,
513
+ "offset": 9914544,
514
+ "bytes": 408000
515
+ },
516
+ {
517
+ "index": 16,
518
+ "offset": 7605880,
519
+ "bytes": 342584
520
+ }
521
+ ]
522
+ },
523
+ {
524
+ "path": "maps/ut4_casa.bsp",
525
+ "archive": "zUrT43_002.pk3",
526
+ "entity_classes": {
527
+ "cubemap_probe": 31,
528
+ "func_rotating_door": 26,
529
+ "info_null": 24,
530
+ "info_player_deathmatch": 29,
531
+ "info_player_intermission": 1,
532
+ "info_ut_bombsite": 2,
533
+ "info_ut_spawn": 339,
534
+ "item_botroam": 3,
535
+ "target_location": 20,
536
+ "target_position": 1,
537
+ "target_speaker": 9,
538
+ "team_CAH_capturepoint": 3,
539
+ "team_CTF_blueflag": 1,
540
+ "team_CTF_redflag": 1,
541
+ "ut_mrsentry": 7,
542
+ "worldspawn": 1
543
+ },
544
+ "entities": 498,
545
+ "lumps": [
546
+ {
547
+ "index": 0,
548
+ "offset": 15075912,
549
+ "bytes": 51492
550
+ },
551
+ {
552
+ "index": 1,
553
+ "offset": 200,
554
+ "bytes": 11880
555
+ },
556
+ {
557
+ "index": 2,
558
+ "offset": 12080,
559
+ "bytes": 345504
560
+ },
561
+ {
562
+ "index": 3,
563
+ "offset": 786944,
564
+ "bytes": 321012
565
+ },
566
+ {
567
+ "index": 4,
568
+ "offset": 357584,
569
+ "bytes": 429360
570
+ },
571
+ {
572
+ "index": 5,
573
+ "offset": 1605340,
574
+ "bytes": 202704
575
+ },
576
+ {
577
+ "index": 6,
578
+ "offset": 1808044,
579
+ "bytes": 190388
580
+ },
581
+ {
582
+ "index": 7,
583
+ "offset": 1998432,
584
+ "bytes": 1080
585
+ },
586
+ {
587
+ "index": 8,
588
+ "offset": 1107956,
589
+ "bytes": 84960
590
+ },
591
+ {
592
+ "index": 9,
593
+ "offset": 1192916,
594
+ "bytes": 412424
595
+ },
596
+ {
597
+ "index": 10,
598
+ "offset": 1999512,
599
+ "bytes": 4671304
600
+ },
601
+ {
602
+ "index": 11,
603
+ "offset": 15127404,
604
+ "bytes": 93396
605
+ },
606
+ {
607
+ "index": 12,
608
+ "offset": 15127404,
609
+ "bytes": 0
610
+ },
611
+ {
612
+ "index": 13,
613
+ "offset": 6670816,
614
+ "bytes": 1711320
615
+ },
616
+ {
617
+ "index": 14,
618
+ "offset": 10275096,
619
+ "bytes": 4423680
620
+ },
621
+ {
622
+ "index": 15,
623
+ "offset": 14698776,
624
+ "bytes": 377136
625
+ },
626
+ {
627
+ "index": 16,
628
+ "offset": 8382136,
629
+ "bytes": 1892960
630
+ }
631
+ ]
632
+ },
633
+ {
634
+ "path": "maps/ut4_cascade.bsp",
635
+ "archive": "zUrT43_002.pk3",
636
+ "entity_classes": {
637
+ "cubemap_probe": 9,
638
+ "func_breakable": 9,
639
+ "func_button": 1,
640
+ "func_door": 10,
641
+ "func_wall": 21,
642
+ "info_notnull": 1,
643
+ "info_null": 64,
644
+ "info_player_intermission": 1,
645
+ "info_player_start": 10,
646
+ "info_ut_bombsite": 2,
647
+ "info_ut_spawn": 130,
648
+ "target_delay": 1,
649
+ "target_location": 31,
650
+ "target_speaker": 41,
651
+ "team_CAH_capturepoint": 3,
652
+ "team_CTF_blueflag": 1,
653
+ "team_CTF_redflag": 1,
654
+ "trigger_always": 1,
655
+ "trigger_hurt": 5,
656
+ "trigger_multiple": 9,
657
+ "ut_mrsentry": 7,
658
+ "worldspawn": 1
659
+ },
660
+ "entities": 359,
661
+ "lumps": [
662
+ {
663
+ "index": 0,
664
+ "offset": 14798600,
665
+ "bytes": 34630
666
+ },
667
+ {
668
+ "index": 1,
669
+ "offset": 196,
670
+ "bytes": 33552
671
+ },
672
+ {
673
+ "index": 2,
674
+ "offset": 33748,
675
+ "bytes": 1739840
676
+ },
677
+ {
678
+ "index": 3,
679
+ "offset": 2028468,
680
+ "bytes": 189108
681
+ },
682
+ {
683
+ "index": 4,
684
+ "offset": 1773588,
685
+ "bytes": 254880
686
+ },
687
+ {
688
+ "index": 5,
689
+ "offset": 3099860,
690
+ "bytes": 168904
691
+ },
692
+ {
693
+ "index": 6,
694
+ "offset": 3268764,
695
+ "bytes": 153036
696
+ },
697
+ {
698
+ "index": 7,
699
+ "offset": 3421800,
700
+ "bytes": 2240
701
+ },
702
+ {
703
+ "index": 8,
704
+ "offset": 2217576,
705
+ "bytes": 95148
706
+ },
707
+ {
708
+ "index": 9,
709
+ "offset": 2312724,
710
+ "bytes": 787136
711
+ },
712
+ {
713
+ "index": 10,
714
+ "offset": 3424040,
715
+ "bytes": 5368616
716
+ },
717
+ {
718
+ "index": 11,
719
+ "offset": 14833232,
720
+ "bytes": 286644
721
+ },
722
+ {
723
+ "index": 12,
724
+ "offset": 14833232,
725
+ "bytes": 0
726
+ },
727
+ {
728
+ "index": 13,
729
+ "offset": 8792656,
730
+ "bytes": 843024
731
+ },
732
+ {
733
+ "index": 14,
734
+ "offset": 10566896,
735
+ "bytes": 2555904
736
+ },
737
+ {
738
+ "index": 15,
739
+ "offset": 13122800,
740
+ "bytes": 1675800
741
+ },
742
+ {
743
+ "index": 16,
744
+ "offset": 9635680,
745
+ "bytes": 931216
746
+ }
747
+ ]
748
+ },
749
+ {
750
+ "path": "maps/ut4_docks.bsp",
751
+ "archive": "zUrT43_002.pk3",
752
+ "entity_classes": {
753
+ "func_bobbing": 5,
754
+ "func_breakable": 21,
755
+ "func_door": 10,
756
+ "func_pendulum": 1,
757
+ "func_rotating_door": 5,
758
+ "func_wall": 16,
759
+ "info_null": 1,
760
+ "info_player_deathmatch": 20,
761
+ "info_player_intermission": 1,
762
+ "info_ut_bombsite": 2,
763
+ "info_ut_spawn": 272,
764
+ "target_location": 152,
765
+ "target_position": 1,
766
+ "target_speaker": 66,
767
+ "team_CAH_capturepoint": 4,
768
+ "team_CTF_blueflag": 1,
769
+ "team_CTF_redflag": 1,
770
+ "trigger_hurt": 4,
771
+ "trigger_multiple": 8,
772
+ "ut_mrsentry": 12,
773
+ "worldspawn": 1
774
+ },
775
+ "entities": 604,
776
+ "lumps": [
777
+ {
778
+ "index": 0,
779
+ "offset": 8021036,
780
+ "bytes": 61715
781
+ },
782
+ {
783
+ "index": 1,
784
+ "offset": 200,
785
+ "bytes": 21672
786
+ },
787
+ {
788
+ "index": 2,
789
+ "offset": 21872,
790
+ "bytes": 201568
791
+ },
792
+ {
793
+ "index": 3,
794
+ "offset": 398304,
795
+ "bytes": 128556
796
+ },
797
+ {
798
+ "index": 4,
799
+ "offset": 223440,
800
+ "bytes": 174864
801
+ },
802
+ {
803
+ "index": 5,
804
+ "offset": 821924,
805
+ "bytes": 103588
806
+ },
807
+ {
808
+ "index": 6,
809
+ "offset": 925512,
810
+ "bytes": 47960
811
+ },
812
+ {
813
+ "index": 7,
814
+ "offset": 973472,
815
+ "bytes": 2840
816
+ },
817
+ {
818
+ "index": 8,
819
+ "offset": 526860,
820
+ "bytes": 51120
821
+ },
822
+ {
823
+ "index": 9,
824
+ "offset": 577980,
825
+ "bytes": 243944
826
+ },
827
+ {
828
+ "index": 10,
829
+ "offset": 976312,
830
+ "bytes": 2861012
831
+ },
832
+ {
833
+ "index": 11,
834
+ "offset": 8082824,
835
+ "bytes": 156528
836
+ },
837
+ {
838
+ "index": 12,
839
+ "offset": 8082752,
840
+ "bytes": 72
841
+ },
842
+ {
843
+ "index": 13,
844
+ "offset": 3837324,
845
+ "bytes": 1183832
846
+ },
847
+ {
848
+ "index": 14,
849
+ "offset": 5284652,
850
+ "bytes": 2064384
851
+ },
852
+ {
853
+ "index": 15,
854
+ "offset": 7349036,
855
+ "bytes": 672000
856
+ },
857
+ {
858
+ "index": 16,
859
+ "offset": 5021156,
860
+ "bytes": 263496
861
+ }
862
+ ]
863
+ },
864
+ {
865
+ "path": "maps/ut4_dressingroom.bsp",
866
+ "archive": "zUrT43_002.pk3",
867
+ "entity_classes": {
868
+ "info_player_deathmatch": 10,
869
+ "info_ut_spawn": 16,
870
+ "misc_portal_surface": 2,
871
+ "target_location": 51,
872
+ "team_CAH_capturepoint": 1,
873
+ "team_CTF_blueflag": 1,
874
+ "team_CTF_redflag": 1,
875
+ "worldspawn": 1
876
+ },
877
+ "entities": 83,
878
+ "lumps": [
879
+ {
880
+ "index": 0,
881
+ "offset": 783300,
882
+ "bytes": 6928
883
+ },
884
+ {
885
+ "index": 1,
886
+ "offset": 212,
887
+ "bytes": 2376
888
+ },
889
+ {
890
+ "index": 2,
891
+ "offset": 2588,
892
+ "bytes": 11776
893
+ },
894
+ {
895
+ "index": 3,
896
+ "offset": 33708,
897
+ "bytes": 14436
898
+ },
899
+ {
900
+ "index": 4,
901
+ "offset": 14364,
902
+ "bytes": 19344
903
+ },
904
+ {
905
+ "index": 5,
906
+ "offset": 68244,
907
+ "bytes": 9472
908
+ },
909
+ {
910
+ "index": 6,
911
+ "offset": 77716,
912
+ "bytes": 4036
913
+ },
914
+ {
915
+ "index": 7,
916
+ "offset": 81752,
917
+ "bytes": 40
918
+ },
919
+ {
920
+ "index": 8,
921
+ "offset": 48144,
922
+ "bytes": 3684
923
+ },
924
+ {
925
+ "index": 9,
926
+ "offset": 51828,
927
+ "bytes": 16416
928
+ },
929
+ {
930
+ "index": 10,
931
+ "offset": 81792,
932
+ "bytes": 324852
933
+ },
934
+ {
935
+ "index": 11,
936
+ "offset": 790228,
937
+ "bytes": 22536
938
+ },
939
+ {
940
+ "index": 12,
941
+ "offset": 790228,
942
+ "bytes": 0
943
+ },
944
+ {
945
+ "index": 13,
946
+ "offset": 406644,
947
+ "bytes": 57512
948
+ },
949
+ {
950
+ "index": 14,
951
+ "offset": 470436,
952
+ "bytes": 294912
953
+ },
954
+ {
955
+ "index": 15,
956
+ "offset": 765348,
957
+ "bytes": 17952
958
+ },
959
+ {
960
+ "index": 16,
961
+ "offset": 464156,
962
+ "bytes": 6280
963
+ }
964
+ ]
965
+ },
966
+ {
967
+ "path": "maps/ut4_eagle.bsp",
968
+ "archive": "zUrT43_002.pk3",
969
+ "entity_classes": {
970
+ "func_breakable": 24,
971
+ "func_keyboard_interface": 1,
972
+ "func_rotating_door": 24,
973
+ "func_ut_train": 1,
974
+ "func_wall": 9,
975
+ "info_player_deathmatch": 24,
976
+ "info_player_intermission": 1,
977
+ "info_ut_bombsite": 2,
978
+ "info_ut_spawn": 192,
979
+ "path_ut_stop": 2,
980
+ "target_position": 1,
981
+ "target_relay": 2,
982
+ "target_speaker": 31,
983
+ "team_CAH_capturepoint": 6,
984
+ "team_CTF_blueflag": 1,
985
+ "team_CTF_redflag": 1,
986
+ "trigger_hurt": 2,
987
+ "trigger_location": 31,
988
+ "trigger_multiple": 3,
989
+ "worldspawn": 1
990
+ },
991
+ "entities": 359,
992
+ "lumps": [
993
+ {
994
+ "index": 0,
995
+ "offset": 12277384,
996
+ "bytes": 35414
997
+ },
998
+ {
999
+ "index": 1,
1000
+ "offset": 200,
1001
+ "bytes": 11592
1002
+ },
1003
+ {
1004
+ "index": 2,
1005
+ "offset": 11792,
1006
+ "bytes": 496256
1007
+ },
1008
+ {
1009
+ "index": 3,
1010
+ "offset": 927520,
1011
+ "bytes": 311112
1012
+ },
1013
+ {
1014
+ "index": 4,
1015
+ "offset": 508048,
1016
+ "bytes": 419472
1017
+ },
1018
+ {
1019
+ "index": 5,
1020
+ "offset": 1738592,
1021
+ "bytes": 152048
1022
+ },
1023
+ {
1024
+ "index": 6,
1025
+ "offset": 1890640,
1026
+ "bytes": 99652
1027
+ },
1028
+ {
1029
+ "index": 7,
1030
+ "offset": 1990292,
1031
+ "bytes": 3840
1032
+ },
1033
+ {
1034
+ "index": 8,
1035
+ "offset": 1238632,
1036
+ "bytes": 76992
1037
+ },
1038
+ {
1039
+ "index": 9,
1040
+ "offset": 1315624,
1041
+ "bytes": 422968
1042
+ },
1043
+ {
1044
+ "index": 10,
1045
+ "offset": 1994132,
1046
+ "bytes": 4561084
1047
+ },
1048
+ {
1049
+ "index": 11,
1050
+ "offset": 12312944,
1051
+ "bytes": 252960
1052
+ },
1053
+ {
1054
+ "index": 12,
1055
+ "offset": 12312800,
1056
+ "bytes": 144
1057
+ },
1058
+ {
1059
+ "index": 13,
1060
+ "offset": 6555216,
1061
+ "bytes": 1553136
1062
+ },
1063
+ {
1064
+ "index": 14,
1065
+ "offset": 10126376,
1066
+ "bytes": 1376256
1067
+ },
1068
+ {
1069
+ "index": 15,
1070
+ "offset": 11502632,
1071
+ "bytes": 774752
1072
+ },
1073
+ {
1074
+ "index": 16,
1075
+ "offset": 8108352,
1076
+ "bytes": 2018024
1077
+ }
1078
+ ]
1079
+ },
1080
+ {
1081
+ "path": "maps/ut4_elgin.bsp",
1082
+ "archive": "zUrT43_002.pk3",
1083
+ "entity_classes": {
1084
+ "func_wall": 19,
1085
+ "info_notnull": 108,
1086
+ "info_null": 62,
1087
+ "info_player_deathmatch": 8,
1088
+ "info_ut_bombsite": 2,
1089
+ "info_ut_spawn": 228,
1090
+ "target_location": 78,
1091
+ "target_speaker": 9,
1092
+ "team_CAH_capturepoint": 5,
1093
+ "team_CTF_blueflag": 1,
1094
+ "team_CTF_redflag": 1,
1095
+ "trigger_multiple": 2,
1096
+ "ut_mrsentry": 8,
1097
+ "worldspawn": 1
1098
+ },
1099
+ "entities": 532,
1100
+ "lumps": [
1101
+ {
1102
+ "index": 0,
1103
+ "offset": 6669740,
1104
+ "bytes": 50399
1105
+ },
1106
+ {
1107
+ "index": 1,
1108
+ "offset": 212,
1109
+ "bytes": 16416
1110
+ },
1111
+ {
1112
+ "index": 2,
1113
+ "offset": 16628,
1114
+ "bytes": 132864
1115
+ },
1116
+ {
1117
+ "index": 3,
1118
+ "offset": 271460,
1119
+ "bytes": 90648
1120
+ },
1121
+ {
1122
+ "index": 4,
1123
+ "offset": 149492,
1124
+ "bytes": 121968
1125
+ },
1126
+ {
1127
+ "index": 5,
1128
+ "offset": 518144,
1129
+ "bytes": 63900
1130
+ },
1131
+ {
1132
+ "index": 6,
1133
+ "offset": 582044,
1134
+ "bytes": 35836
1135
+ },
1136
+ {
1137
+ "index": 7,
1138
+ "offset": 617880,
1139
+ "bytes": 880
1140
+ },
1141
+ {
1142
+ "index": 8,
1143
+ "offset": 362108,
1144
+ "bytes": 27540
1145
+ },
1146
+ {
1147
+ "index": 9,
1148
+ "offset": 389648,
1149
+ "bytes": 128496
1150
+ },
1151
+ {
1152
+ "index": 10,
1153
+ "offset": 618760,
1154
+ "bytes": 3259036
1155
+ },
1156
+ {
1157
+ "index": 11,
1158
+ "offset": 6720140,
1159
+ "bytes": 160872
1160
+ },
1161
+ {
1162
+ "index": 12,
1163
+ "offset": 6720140,
1164
+ "bytes": 0
1165
+ },
1166
+ {
1167
+ "index": 13,
1168
+ "offset": 3877796,
1169
+ "bytes": 919152
1170
+ },
1171
+ {
1172
+ "index": 14,
1173
+ "offset": 4956076,
1174
+ "bytes": 1277952
1175
+ },
1176
+ {
1177
+ "index": 15,
1178
+ "offset": 6234028,
1179
+ "bytes": 435712
1180
+ },
1181
+ {
1182
+ "index": 16,
1183
+ "offset": 4796948,
1184
+ "bytes": 159128
1185
+ }
1186
+ ]
1187
+ },
1188
+ {
1189
+ "path": "maps/ut4_firingrange.bsp",
1190
+ "archive": "zUrT43_002.pk3",
1191
+ "entity_classes": {
1192
+ "func_breakable": 2,
1193
+ "info_notnull": 10,
1194
+ "info_player_deathmatch": 16,
1195
+ "misc_portal_camera": 10,
1196
+ "misc_portal_surface": 10,
1197
+ "trigger_location": 6,
1198
+ "worldspawn": 1
1199
+ },
1200
+ "entities": 55,
1201
+ "lumps": [
1202
+ {
1203
+ "index": 0,
1204
+ "offset": 2298716,
1205
+ "bytes": 4743
1206
+ },
1207
+ {
1208
+ "index": 1,
1209
+ "offset": 212,
1210
+ "bytes": 3168
1211
+ },
1212
+ {
1213
+ "index": 2,
1214
+ "offset": 3380,
1215
+ "bytes": 11872
1216
+ },
1217
+ {
1218
+ "index": 3,
1219
+ "offset": 37284,
1220
+ "bytes": 16164
1221
+ },
1222
+ {
1223
+ "index": 4,
1224
+ "offset": 15252,
1225
+ "bytes": 22032
1226
+ },
1227
+ {
1228
+ "index": 5,
1229
+ "offset": 69080,
1230
+ "bytes": 9820
1231
+ },
1232
+ {
1233
+ "index": 6,
1234
+ "offset": 78900,
1235
+ "bytes": 4680
1236
+ },
1237
+ {
1238
+ "index": 7,
1239
+ "offset": 83580,
1240
+ "bytes": 360
1241
+ },
1242
+ {
1243
+ "index": 8,
1244
+ "offset": 53448,
1245
+ "bytes": 2976
1246
+ },
1247
+ {
1248
+ "index": 9,
1249
+ "offset": 56424,
1250
+ "bytes": 12656
1251
+ },
1252
+ {
1253
+ "index": 10,
1254
+ "offset": 83940,
1255
+ "bytes": 615032
1256
+ },
1257
+ {
1258
+ "index": 11,
1259
+ "offset": 2303460,
1260
+ "bytes": 38100
1261
+ },
1262
+ {
1263
+ "index": 12,
1264
+ "offset": 2303460,
1265
+ "bytes": 0
1266
+ },
1267
+ {
1268
+ "index": 13,
1269
+ "offset": 698972,
1270
+ "bytes": 143728
1271
+ },
1272
+ {
1273
+ "index": 14,
1274
+ "offset": 846860,
1275
+ "bytes": 1376256
1276
+ },
1277
+ {
1278
+ "index": 15,
1279
+ "offset": 2223116,
1280
+ "bytes": 75600
1281
+ },
1282
+ {
1283
+ "index": 16,
1284
+ "offset": 842700,
1285
+ "bytes": 4160
1286
+ }
1287
+ ]
1288
+ },
1289
+ {
1290
+ "path": "maps/ut4_ghosttown.bsp",
1291
+ "archive": "zUrT43_002.pk3",
1292
+ "entity_classes": {
1293
+ "func_breakable": 3,
1294
+ "func_button": 1,
1295
+ "func_door": 2,
1296
+ "func_pendulum": 2,
1297
+ "func_wall": 6,
1298
+ "info_player_deathmatch": 16,
1299
+ "info_player_intermission": 1,
1300
+ "info_ut_bombsite": 2,
1301
+ "info_ut_spawn": 72,
1302
+ "target_location": 107,
1303
+ "target_speaker": 27,
1304
+ "team_CTF_blueflag": 1,
1305
+ "team_CTF_redflag": 1,
1306
+ "worldspawn": 1
1307
+ },
1308
+ "entities": 242,
1309
+ "lumps": [
1310
+ {
1311
+ "index": 0,
1312
+ "offset": 13948452,
1313
+ "bytes": 24048
1314
+ },
1315
+ {
1316
+ "index": 1,
1317
+ "offset": 200,
1318
+ "bytes": 14328
1319
+ },
1320
+ {
1321
+ "index": 2,
1322
+ "offset": 14528,
1323
+ "bytes": 490784
1324
+ },
1325
+ {
1326
+ "index": 3,
1327
+ "offset": 705520,
1328
+ "bytes": 149544
1329
+ },
1330
+ {
1331
+ "index": 4,
1332
+ "offset": 505312,
1333
+ "bytes": 200208
1334
+ },
1335
+ {
1336
+ "index": 5,
1337
+ "offset": 1355412,
1338
+ "bytes": 184388
1339
+ },
1340
+ {
1341
+ "index": 6,
1342
+ "offset": 1539800,
1343
+ "bytes": 70960
1344
+ },
1345
+ {
1346
+ "index": 7,
1347
+ "offset": 1610760,
1348
+ "bytes": 640
1349
+ },
1350
+ {
1351
+ "index": 8,
1352
+ "offset": 855064,
1353
+ "bytes": 86124
1354
+ },
1355
+ {
1356
+ "index": 9,
1357
+ "offset": 941188,
1358
+ "bytes": 414224
1359
+ },
1360
+ {
1361
+ "index": 10,
1362
+ "offset": 1611400,
1363
+ "bytes": 6614740
1364
+ },
1365
+ {
1366
+ "index": 11,
1367
+ "offset": 13972500,
1368
+ "bytes": 199560
1369
+ },
1370
+ {
1371
+ "index": 12,
1372
+ "offset": 13972500,
1373
+ "bytes": 0
1374
+ },
1375
+ {
1376
+ "index": 13,
1377
+ "offset": 8226140,
1378
+ "bytes": 2235896
1379
+ },
1380
+ {
1381
+ "index": 14,
1382
+ "offset": 11009316,
1383
+ "bytes": 2654208
1384
+ },
1385
+ {
1386
+ "index": 15,
1387
+ "offset": 13663524,
1388
+ "bytes": 284928
1389
+ },
1390
+ {
1391
+ "index": 16,
1392
+ "offset": 10462036,
1393
+ "bytes": 547280
1394
+ }
1395
+ ]
1396
+ },
1397
+ {
1398
+ "path": "maps/ut4_herring.bsp",
1399
+ "archive": "zUrT43_002.pk3",
1400
+ "entity_classes": {
1401
+ "func_button": 2,
1402
+ "func_wall": 38,
1403
+ "info_null": 70,
1404
+ "info_player_deathmatch": 13,
1405
+ "info_player_intermission": 1,
1406
+ "info_ut_bombsite": 2,
1407
+ "info_ut_spawn": 127,
1408
+ "target_location": 71,
1409
+ "target_position": 1,
1410
+ "target_speaker": 22,
1411
+ "team_CAH_capturepoint": 8,
1412
+ "team_CTF_blueflag": 1,
1413
+ "team_CTF_redflag": 1,
1414
+ "trigger_hurt": 28,
1415
+ "trigger_location": 44,
1416
+ "trigger_multiple": 1,
1417
+ "worldspawn": 1
1418
+ },
1419
+ "entities": 431,
1420
+ "lumps": [
1421
+ {
1422
+ "index": 0,
1423
+ "offset": 8615728,
1424
+ "bytes": 40887
1425
+ },
1426
+ {
1427
+ "index": 1,
1428
+ "offset": 200,
1429
+ "bytes": 10440
1430
+ },
1431
+ {
1432
+ "index": 2,
1433
+ "offset": 10640,
1434
+ "bytes": 636608
1435
+ },
1436
+ {
1437
+ "index": 3,
1438
+ "offset": 721216,
1439
+ "bytes": 51336
1440
+ },
1441
+ {
1442
+ "index": 4,
1443
+ "offset": 647248,
1444
+ "bytes": 73968
1445
+ },
1446
+ {
1447
+ "index": 5,
1448
+ "offset": 1252128,
1449
+ "bytes": 304824
1450
+ },
1451
+ {
1452
+ "index": 6,
1453
+ "offset": 1556952,
1454
+ "bytes": 60488
1455
+ },
1456
+ {
1457
+ "index": 7,
1458
+ "offset": 1617440,
1459
+ "bytes": 4560
1460
+ },
1461
+ {
1462
+ "index": 8,
1463
+ "offset": 772552,
1464
+ "bytes": 63696
1465
+ },
1466
+ {
1467
+ "index": 9,
1468
+ "offset": 836248,
1469
+ "bytes": 415880
1470
+ },
1471
+ {
1472
+ "index": 10,
1473
+ "offset": 1622000,
1474
+ "bytes": 3011272
1475
+ },
1476
+ {
1477
+ "index": 11,
1478
+ "offset": 8656688,
1479
+ "bytes": 130764
1480
+ },
1481
+ {
1482
+ "index": 12,
1483
+ "offset": 8656616,
1484
+ "bytes": 72
1485
+ },
1486
+ {
1487
+ "index": 13,
1488
+ "offset": 4633272,
1489
+ "bytes": 1144832
1490
+ },
1491
+ {
1492
+ "index": 14,
1493
+ "offset": 5835312,
1494
+ "bytes": 1572864
1495
+ },
1496
+ {
1497
+ "index": 15,
1498
+ "offset": 7408176,
1499
+ "bytes": 1207552
1500
+ },
1501
+ {
1502
+ "index": 16,
1503
+ "offset": 5778104,
1504
+ "bytes": 57208
1505
+ }
1506
+ ]
1507
+ },
1508
+ {
1509
+ "path": "maps/ut4_killroom.bsp",
1510
+ "archive": "zUrT43_002.pk3",
1511
+ "entity_classes": {
1512
+ "info_player_start": 10,
1513
+ "target_speaker": 11,
1514
+ "trigger_hurt": 1,
1515
+ "trigger_multiple": 2,
1516
+ "worldspawn": 1
1517
+ },
1518
+ "entities": 25,
1519
+ "lumps": [
1520
+ {
1521
+ "index": 0,
1522
+ "offset": 6281620,
1523
+ "bytes": 2627
1524
+ },
1525
+ {
1526
+ "index": 1,
1527
+ "offset": 196,
1528
+ "bytes": 4032
1529
+ },
1530
+ {
1531
+ "index": 2,
1532
+ "offset": 4228,
1533
+ "bytes": 30656
1534
+ },
1535
+ {
1536
+ "index": 3,
1537
+ "offset": 55092,
1538
+ "bytes": 14976
1539
+ },
1540
+ {
1541
+ "index": 4,
1542
+ "offset": 34884,
1543
+ "bytes": 20208
1544
+ },
1545
+ {
1546
+ "index": 5,
1547
+ "offset": 87984,
1548
+ "bytes": 10268
1549
+ },
1550
+ {
1551
+ "index": 6,
1552
+ "offset": 98252,
1553
+ "bytes": 6308
1554
+ },
1555
+ {
1556
+ "index": 7,
1557
+ "offset": 104560,
1558
+ "bytes": 160
1559
+ },
1560
+ {
1561
+ "index": 8,
1562
+ "offset": 70068,
1563
+ "bytes": 2964
1564
+ },
1565
+ {
1566
+ "index": 9,
1567
+ "offset": 73032,
1568
+ "bytes": 14952
1569
+ },
1570
+ {
1571
+ "index": 10,
1572
+ "offset": 104720,
1573
+ "bytes": 5823532
1574
+ },
1575
+ {
1576
+ "index": 11,
1577
+ "offset": 6284248,
1578
+ "bytes": 21516
1579
+ },
1580
+ {
1581
+ "index": 12,
1582
+ "offset": 6284248,
1583
+ "bytes": 0
1584
+ },
1585
+ {
1586
+ "index": 13,
1587
+ "offset": 5928252,
1588
+ "bytes": 84240
1589
+ },
1590
+ {
1591
+ "index": 14,
1592
+ "offset": 6019636,
1593
+ "bytes": 98304
1594
+ },
1595
+ {
1596
+ "index": 15,
1597
+ "offset": 6117940,
1598
+ "bytes": 163680
1599
+ },
1600
+ {
1601
+ "index": 16,
1602
+ "offset": 6012492,
1603
+ "bytes": 7144
1604
+ }
1605
+ ]
1606
+ },
1607
+ {
1608
+ "path": "maps/ut4_kingdom.bsp",
1609
+ "archive": "zUrT43_002.pk3",
1610
+ "entity_classes": {
1611
+ "cubemap_probe": 63,
1612
+ "func_breakable": 5,
1613
+ "func_wall": 27,
1614
+ "info_player_deathmatch": 18,
1615
+ "info_player_start": 1,
1616
+ "info_ut_bombsite": 2,
1617
+ "info_ut_spawn": 64,
1618
+ "target_location": 197,
1619
+ "target_speaker": 5,
1620
+ "team_CAH_capturepoint": 5,
1621
+ "team_CTF_blueflag": 1,
1622
+ "team_CTF_redflag": 1,
1623
+ "worldspawn": 1
1624
+ },
1625
+ "entities": 390,
1626
+ "lumps": [
1627
+ {
1628
+ "index": 0,
1629
+ "offset": 7762464,
1630
+ "bytes": 31013
1631
+ },
1632
+ {
1633
+ "index": 1,
1634
+ "offset": 200,
1635
+ "bytes": 8568
1636
+ },
1637
+ {
1638
+ "index": 2,
1639
+ "offset": 8768,
1640
+ "bytes": 235808
1641
+ },
1642
+ {
1643
+ "index": 3,
1644
+ "offset": 483856,
1645
+ "bytes": 178236
1646
+ },
1647
+ {
1648
+ "index": 4,
1649
+ "offset": 244576,
1650
+ "bytes": 239280
1651
+ },
1652
+ {
1653
+ "index": 5,
1654
+ "offset": 965024,
1655
+ "bytes": 94704
1656
+ },
1657
+ {
1658
+ "index": 6,
1659
+ "offset": 1059728,
1660
+ "bytes": 48628
1661
+ },
1662
+ {
1663
+ "index": 7,
1664
+ "offset": 1108356,
1665
+ "bytes": 1320
1666
+ },
1667
+ {
1668
+ "index": 8,
1669
+ "offset": 662092,
1670
+ "bytes": 54156
1671
+ },
1672
+ {
1673
+ "index": 9,
1674
+ "offset": 716248,
1675
+ "bytes": 248776
1676
+ },
1677
+ {
1678
+ "index": 10,
1679
+ "offset": 1109676,
1680
+ "bytes": 3036396
1681
+ },
1682
+ {
1683
+ "index": 11,
1684
+ "offset": 7793480,
1685
+ "bytes": 170364
1686
+ },
1687
+ {
1688
+ "index": 12,
1689
+ "offset": 7793480,
1690
+ "bytes": 0
1691
+ },
1692
+ {
1693
+ "index": 13,
1694
+ "offset": 4146072,
1695
+ "bytes": 767416
1696
+ },
1697
+ {
1698
+ "index": 14,
1699
+ "offset": 5567544,
1700
+ "bytes": 1474560
1701
+ },
1702
+ {
1703
+ "index": 15,
1704
+ "offset": 7042104,
1705
+ "bytes": 720360
1706
+ },
1707
+ {
1708
+ "index": 16,
1709
+ "offset": 4913488,
1710
+ "bytes": 654056
1711
+ }
1712
+ ]
1713
+ },
1714
+ {
1715
+ "path": "maps/ut4_kingpin.bsp",
1716
+ "archive": "zUrT43_002.pk3",
1717
+ "entity_classes": {
1718
+ "func_breakable": 6,
1719
+ "func_door": 2,
1720
+ "func_wall": 11,
1721
+ "info_player_deathmatch": 16,
1722
+ "info_player_start": 1,
1723
+ "info_ut_bombsite": 2,
1724
+ "info_ut_spawn": 96,
1725
+ "target_location": 153,
1726
+ "target_speaker": 2,
1727
+ "team_CAH_capturepoint": 5,
1728
+ "team_CTF_blueflag": 1,
1729
+ "team_CTF_redflag": 1,
1730
+ "trigger_hurt": 3,
1731
+ "trigger_multiple": 2,
1732
+ "worldspawn": 1
1733
+ },
1734
+ "entities": 302,
1735
+ "lumps": [
1736
+ {
1737
+ "index": 0,
1738
+ "offset": 5860968,
1739
+ "bytes": 26102
1740
+ },
1741
+ {
1742
+ "index": 1,
1743
+ "offset": 200,
1744
+ "bytes": 12096
1745
+ },
1746
+ {
1747
+ "index": 2,
1748
+ "offset": 12296,
1749
+ "bytes": 184480
1750
+ },
1751
+ {
1752
+ "index": 3,
1753
+ "offset": 342216,
1754
+ "bytes": 108144
1755
+ },
1756
+ {
1757
+ "index": 4,
1758
+ "offset": 196776,
1759
+ "bytes": 145440
1760
+ },
1761
+ {
1762
+ "index": 5,
1763
+ "offset": 631464,
1764
+ "bytes": 44832
1765
+ },
1766
+ {
1767
+ "index": 6,
1768
+ "offset": 676296,
1769
+ "bytes": 30940
1770
+ },
1771
+ {
1772
+ "index": 7,
1773
+ "offset": 707236,
1774
+ "bytes": 1000
1775
+ },
1776
+ {
1777
+ "index": 8,
1778
+ "offset": 450360,
1779
+ "bytes": 32016
1780
+ },
1781
+ {
1782
+ "index": 9,
1783
+ "offset": 482376,
1784
+ "bytes": 149088
1785
+ },
1786
+ {
1787
+ "index": 10,
1788
+ "offset": 708236,
1789
+ "bytes": 2262084
1790
+ },
1791
+ {
1792
+ "index": 11,
1793
+ "offset": 5887072,
1794
+ "bytes": 137412
1795
+ },
1796
+ {
1797
+ "index": 12,
1798
+ "offset": 5887072,
1799
+ "bytes": 0
1800
+ },
1801
+ {
1802
+ "index": 13,
1803
+ "offset": 2970320,
1804
+ "bytes": 537992
1805
+ },
1806
+ {
1807
+ "index": 14,
1808
+ "offset": 3771624,
1809
+ "bytes": 1081344
1810
+ },
1811
+ {
1812
+ "index": 15,
1813
+ "offset": 4852968,
1814
+ "bytes": 1008000
1815
+ },
1816
+ {
1817
+ "index": 16,
1818
+ "offset": 3508312,
1819
+ "bytes": 263312
1820
+ }
1821
+ ]
1822
+ },
1823
+ {
1824
+ "path": "maps/ut4_mandolin.bsp",
1825
+ "archive": "zUrT43_003.pk3",
1826
+ "entity_classes": {
1827
+ "cubemap_probe": 11,
1828
+ "func_breakable": 29,
1829
+ "func_button": 6,
1830
+ "func_door": 7,
1831
+ "func_rotating": 3,
1832
+ "func_wall": 18,
1833
+ "info_notnull": 1,
1834
+ "info_null": 128,
1835
+ "info_player_intermission": 1,
1836
+ "info_player_start": 13,
1837
+ "info_ut_bombsite": 2,
1838
+ "info_ut_spawn": 160,
1839
+ "target_location": 47,
1840
+ "target_speaker": 14,
1841
+ "team_CAH_capturepoint": 3,
1842
+ "team_CTF_blueflag": 1,
1843
+ "team_CTF_redflag": 1,
1844
+ "trigger_hurt": 1,
1845
+ "trigger_location": 31,
1846
+ "trigger_multiple": 1,
1847
+ "ut_mrsentry": 4,
1848
+ "worldspawn": 1
1849
+ },
1850
+ "entities": 483,
1851
+ "lumps": [
1852
+ {
1853
+ "index": 0,
1854
+ "offset": 12950772,
1855
+ "bytes": 42349
1856
+ },
1857
+ {
1858
+ "index": 1,
1859
+ "offset": 196,
1860
+ "bytes": 26784
1861
+ },
1862
+ {
1863
+ "index": 2,
1864
+ "offset": 26980,
1865
+ "bytes": 489216
1866
+ },
1867
+ {
1868
+ "index": 3,
1869
+ "offset": 758788,
1870
+ "bytes": 178416
1871
+ },
1872
+ {
1873
+ "index": 4,
1874
+ "offset": 516196,
1875
+ "bytes": 242592
1876
+ },
1877
+ {
1878
+ "index": 5,
1879
+ "offset": 1594168,
1880
+ "bytes": 82116
1881
+ },
1882
+ {
1883
+ "index": 6,
1884
+ "offset": 1676284,
1885
+ "bytes": 148212
1886
+ },
1887
+ {
1888
+ "index": 7,
1889
+ "offset": 1824496,
1890
+ "bytes": 3880
1891
+ },
1892
+ {
1893
+ "index": 8,
1894
+ "offset": 937204,
1895
+ "bytes": 99756
1896
+ },
1897
+ {
1898
+ "index": 9,
1899
+ "offset": 1036960,
1900
+ "bytes": 557208
1901
+ },
1902
+ {
1903
+ "index": 10,
1904
+ "offset": 1828376,
1905
+ "bytes": 4167724
1906
+ },
1907
+ {
1908
+ "index": 11,
1909
+ "offset": 12993268,
1910
+ "bytes": 269304
1911
+ },
1912
+ {
1913
+ "index": 12,
1914
+ "offset": 12993124,
1915
+ "bytes": 144
1916
+ },
1917
+ {
1918
+ "index": 13,
1919
+ "offset": 5996100,
1920
+ "bytes": 810992
1921
+ },
1922
+ {
1923
+ "index": 14,
1924
+ "offset": 7494708,
1925
+ "bytes": 1769472
1926
+ },
1927
+ {
1928
+ "index": 15,
1929
+ "offset": 9264180,
1930
+ "bytes": 3686592
1931
+ },
1932
+ {
1933
+ "index": 16,
1934
+ "offset": 6807092,
1935
+ "bytes": 687616
1936
+ }
1937
+ ]
1938
+ },
1939
+ {
1940
+ "path": "maps/ut4_mykonos_a17.bsp",
1941
+ "archive": "zUrT43_003.pk3",
1942
+ "entity_classes": {
1943
+ "func_door": 6,
1944
+ "func_rotating": 1,
1945
+ "func_wall": 5,
1946
+ "info_null": 6,
1947
+ "info_player_intermission": 1,
1948
+ "info_player_start": 8,
1949
+ "info_ut_spawn": 81,
1950
+ "target_location": 17,
1951
+ "target_position": 1,
1952
+ "target_speaker": 10,
1953
+ "team_CAH_capturepoint": 3,
1954
+ "team_CTF_blueflag": 1,
1955
+ "team_CTF_redflag": 1,
1956
+ "trigger_hurt": 2,
1957
+ "trigger_location": 9,
1958
+ "trigger_multiple": 5,
1959
+ "ut_mrsentry": 4,
1960
+ "worldspawn": 1
1961
+ },
1962
+ "entities": 162,
1963
+ "lumps": [
1964
+ {
1965
+ "index": 0,
1966
+ "offset": 14827404,
1967
+ "bytes": 16152
1968
+ },
1969
+ {
1970
+ "index": 1,
1971
+ "offset": 212,
1972
+ "bytes": 5616
1973
+ },
1974
+ {
1975
+ "index": 2,
1976
+ "offset": 5828,
1977
+ "bytes": 76704
1978
+ },
1979
+ {
1980
+ "index": 3,
1981
+ "offset": 158756,
1982
+ "bytes": 56088
1983
+ },
1984
+ {
1985
+ "index": 4,
1986
+ "offset": 82532,
1987
+ "bytes": 76224
1988
+ },
1989
+ {
1990
+ "index": 5,
1991
+ "offset": 397536,
1992
+ "bytes": 87792
1993
+ },
1994
+ {
1995
+ "index": 6,
1996
+ "offset": 485328,
1997
+ "bytes": 27496
1998
+ },
1999
+ {
2000
+ "index": 7,
2001
+ "offset": 512824,
2002
+ "bytes": 1160
2003
+ },
2004
+ {
2005
+ "index": 8,
2006
+ "offset": 214844,
2007
+ "bytes": 34500
2008
+ },
2009
+ {
2010
+ "index": 9,
2011
+ "offset": 249344,
2012
+ "bytes": 148192
2013
+ },
2014
+ {
2015
+ "index": 10,
2016
+ "offset": 513984,
2017
+ "bytes": 2323244
2018
+ },
2019
+ {
2020
+ "index": 11,
2021
+ "offset": 14843556,
2022
+ "bytes": 135060
2023
+ },
2024
+ {
2025
+ "index": 12,
2026
+ "offset": 14843556,
2027
+ "bytes": 0
2028
+ },
2029
+ {
2030
+ "index": 13,
2031
+ "offset": 2837228,
2032
+ "bytes": 841880
2033
+ },
2034
+ {
2035
+ "index": 14,
2036
+ "offset": 3752556,
2037
+ "bytes": 10518528
2038
+ },
2039
+ {
2040
+ "index": 15,
2041
+ "offset": 14271084,
2042
+ "bytes": 556320
2043
+ },
2044
+ {
2045
+ "index": 16,
2046
+ "offset": 3679108,
2047
+ "bytes": 73448
2048
+ }
2049
+ ]
2050
+ },
2051
+ {
2052
+ "path": "maps/ut4_oildepot.bsp",
2053
+ "archive": "zUrT43_003.pk3",
2054
+ "entity_classes": {
2055
+ "func_button": 3,
2056
+ "func_rotating_door": 8,
2057
+ "info_null": 7,
2058
+ "info_player_deathmatch": 19,
2059
+ "info_player_intermission": 1,
2060
+ "info_ut_bombsite": 2,
2061
+ "info_ut_spawn": 112,
2062
+ "misc_portal_surface": 1,
2063
+ "target_location": 15,
2064
+ "target_position": 4,
2065
+ "target_speaker": 37,
2066
+ "team_CAH_capturepoint": 11,
2067
+ "team_CTF_blueflag": 1,
2068
+ "team_CTF_redflag": 1,
2069
+ "trigger_hurt": 1,
2070
+ "trigger_location": 2,
2071
+ "trigger_multiple": 1,
2072
+ "worldspawn": 1
2073
+ },
2074
+ "entities": 227,
2075
+ "lumps": [
2076
+ {
2077
+ "index": 0,
2078
+ "offset": 5650808,
2079
+ "bytes": 23880
2080
+ },
2081
+ {
2082
+ "index": 1,
2083
+ "offset": 200,
2084
+ "bytes": 17064
2085
+ },
2086
+ {
2087
+ "index": 2,
2088
+ "offset": 17264,
2089
+ "bytes": 498688
2090
+ },
2091
+ {
2092
+ "index": 3,
2093
+ "offset": 574368,
2094
+ "bytes": 43200
2095
+ },
2096
+ {
2097
+ "index": 4,
2098
+ "offset": 515952,
2099
+ "bytes": 58416
2100
+ },
2101
+ {
2102
+ "index": 5,
2103
+ "offset": 972780,
2104
+ "bytes": 77876
2105
+ },
2106
+ {
2107
+ "index": 6,
2108
+ "offset": 1050656,
2109
+ "bytes": 55448
2110
+ },
2111
+ {
2112
+ "index": 7,
2113
+ "offset": 1106104,
2114
+ "bytes": 640
2115
+ },
2116
+ {
2117
+ "index": 8,
2118
+ "offset": 617568,
2119
+ "bytes": 47628
2120
+ },
2121
+ {
2122
+ "index": 9,
2123
+ "offset": 665196,
2124
+ "bytes": 307584
2125
+ },
2126
+ {
2127
+ "index": 10,
2128
+ "offset": 1106744,
2129
+ "bytes": 2526216
2130
+ },
2131
+ {
2132
+ "index": 11,
2133
+ "offset": 5674688,
2134
+ "bytes": 137592
2135
+ },
2136
+ {
2137
+ "index": 12,
2138
+ "offset": 5674688,
2139
+ "bytes": 0
2140
+ },
2141
+ {
2142
+ "index": 13,
2143
+ "offset": 3632960,
2144
+ "bytes": 901888
2145
+ },
2146
+ {
2147
+ "index": 14,
2148
+ "offset": 4584536,
2149
+ "bytes": 786432
2150
+ },
2151
+ {
2152
+ "index": 15,
2153
+ "offset": 5370968,
2154
+ "bytes": 279840
2155
+ },
2156
+ {
2157
+ "index": 16,
2158
+ "offset": 4534848,
2159
+ "bytes": 49688
2160
+ }
2161
+ ]
2162
+ },
2163
+ {
2164
+ "path": "maps/ut4_paris.bsp",
2165
+ "archive": "zUrT43_021.pk3",
2166
+ "entity_classes": {
2167
+ "func_breakable": 59,
2168
+ "func_button": 4,
2169
+ "func_door": 14,
2170
+ "func_rotating_door": 5,
2171
+ "func_wall": 24,
2172
+ "info_null": 27,
2173
+ "info_player_deathmatch": 15,
2174
+ "info_player_intermission": 1,
2175
+ "info_ut_bombsite": 2,
2176
+ "info_ut_spawn": 160,
2177
+ "target_delay": 2,
2178
+ "target_location": 123,
2179
+ "target_position": 1,
2180
+ "target_relay": 2,
2181
+ "target_speaker": 62,
2182
+ "team_CTF_blueflag": 1,
2183
+ "team_CTF_redflag": 1,
2184
+ "trigger_always": 3,
2185
+ "trigger_hurt": 1,
2186
+ "trigger_multiple": 14,
2187
+ "worldspawn": 1
2188
+ },
2189
+ "entities": 522,
2190
+ "lumps": [
2191
+ {
2192
+ "index": 0,
2193
+ "offset": 10522464,
2194
+ "bytes": 50908
2195
+ },
2196
+ {
2197
+ "index": 1,
2198
+ "offset": 212,
2199
+ "bytes": 15192
2200
+ },
2201
+ {
2202
+ "index": 2,
2203
+ "offset": 15404,
2204
+ "bytes": 358688
2205
+ },
2206
+ {
2207
+ "index": 3,
2208
+ "offset": 691036,
2209
+ "bytes": 233280
2210
+ },
2211
+ {
2212
+ "index": 4,
2213
+ "offset": 374092,
2214
+ "bytes": 316944
2215
+ },
2216
+ {
2217
+ "index": 5,
2218
+ "offset": 1562496,
2219
+ "bytes": 144200
2220
+ },
2221
+ {
2222
+ "index": 6,
2223
+ "offset": 1706696,
2224
+ "bytes": 157020
2225
+ },
2226
+ {
2227
+ "index": 7,
2228
+ "offset": 1863716,
2229
+ "bytes": 4880
2230
+ },
2231
+ {
2232
+ "index": 8,
2233
+ "offset": 924316,
2234
+ "bytes": 108228
2235
+ },
2236
+ {
2237
+ "index": 9,
2238
+ "offset": 1032544,
2239
+ "bytes": 529952
2240
+ },
2241
+ {
2242
+ "index": 10,
2243
+ "offset": 1868596,
2244
+ "bytes": 3640252
2245
+ },
2246
+ {
2247
+ "index": 11,
2248
+ "offset": 10573372,
2249
+ "bytes": 220836
2250
+ },
2251
+ {
2252
+ "index": 12,
2253
+ "offset": 10573372,
2254
+ "bytes": 0
2255
+ },
2256
+ {
2257
+ "index": 13,
2258
+ "offset": 5508848,
2259
+ "bytes": 1343368
2260
+ },
2261
+ {
2262
+ "index": 14,
2263
+ "offset": 8024192,
2264
+ "bytes": 1867776
2265
+ },
2266
+ {
2267
+ "index": 15,
2268
+ "offset": 9891968,
2269
+ "bytes": 630496
2270
+ },
2271
+ {
2272
+ "index": 16,
2273
+ "offset": 6852216,
2274
+ "bytes": 1171976
2275
+ }
2276
+ ]
2277
+ },
2278
+ {
2279
+ "path": "maps/ut4_prague.bsp",
2280
+ "archive": "zUrT43_003.pk3",
2281
+ "entity_classes": {
2282
+ "func_door": 11,
2283
+ "func_wall": 3,
2284
+ "info_notnull": 1,
2285
+ "info_player_deathmatch": 10,
2286
+ "info_player_intermission": 1,
2287
+ "info_ut_bombsite": 2,
2288
+ "info_ut_spawn": 146,
2289
+ "target_location": 66,
2290
+ "target_speaker": 8,
2291
+ "team_CAH_capturepoint": 1,
2292
+ "team_CTF_blueflag": 1,
2293
+ "team_CTF_redflag": 1,
2294
+ "trigger_multiple": 10,
2295
+ "ut_mrsentry": 6,
2296
+ "worldspawn": 1
2297
+ },
2298
+ "entities": 268,
2299
+ "lumps": [
2300
+ {
2301
+ "index": 0,
2302
+ "offset": 8536668,
2303
+ "bytes": 27164
2304
+ },
2305
+ {
2306
+ "index": 1,
2307
+ "offset": 200,
2308
+ "bytes": 13032
2309
+ },
2310
+ {
2311
+ "index": 2,
2312
+ "offset": 13232,
2313
+ "bytes": 814912
2314
+ },
2315
+ {
2316
+ "index": 3,
2317
+ "offset": 1139136,
2318
+ "bytes": 232308
2319
+ },
2320
+ {
2321
+ "index": 4,
2322
+ "offset": 828144,
2323
+ "bytes": 310992
2324
+ },
2325
+ {
2326
+ "index": 5,
2327
+ "offset": 1978996,
2328
+ "bytes": 97380
2329
+ },
2330
+ {
2331
+ "index": 6,
2332
+ "offset": 2076376,
2333
+ "bytes": 124488
2334
+ },
2335
+ {
2336
+ "index": 7,
2337
+ "offset": 2200864,
2338
+ "bytes": 1000
2339
+ },
2340
+ {
2341
+ "index": 8,
2342
+ "offset": 1371444,
2343
+ "bytes": 83688
2344
+ },
2345
+ {
2346
+ "index": 9,
2347
+ "offset": 1455132,
2348
+ "bytes": 523864
2349
+ },
2350
+ {
2351
+ "index": 10,
2352
+ "offset": 2201864,
2353
+ "bytes": 2959572
2354
+ },
2355
+ {
2356
+ "index": 11,
2357
+ "offset": 8563832,
2358
+ "bytes": 227424
2359
+ },
2360
+ {
2361
+ "index": 12,
2362
+ "offset": 8563832,
2363
+ "bytes": 0
2364
+ },
2365
+ {
2366
+ "index": 13,
2367
+ "offset": 5161436,
2368
+ "bytes": 862680
2369
+ },
2370
+ {
2371
+ "index": 14,
2372
+ "offset": 7287324,
2373
+ "bytes": 983040
2374
+ },
2375
+ {
2376
+ "index": 15,
2377
+ "offset": 8270364,
2378
+ "bytes": 266304
2379
+ },
2380
+ {
2381
+ "index": 16,
2382
+ "offset": 6024116,
2383
+ "bytes": 1263208
2384
+ }
2385
+ ]
2386
+ },
2387
+ {
2388
+ "path": "maps/ut4_prominence.bsp",
2389
+ "archive": "zUrT43_003.pk3",
2390
+ "entity_classes": {
2391
+ "info_player_deathmatch": 12,
2392
+ "info_player_intermission": 3,
2393
+ "info_ut_bombsite": 2,
2394
+ "info_ut_spawn": 48,
2395
+ "target_location": 59,
2396
+ "target_speaker": 4,
2397
+ "team_CAH_capturepoint": 4,
2398
+ "team_CTF_blueflag": 1,
2399
+ "team_CTF_redflag": 1,
2400
+ "worldspawn": 1
2401
+ },
2402
+ "entities": 135,
2403
+ "lumps": [
2404
+ {
2405
+ "index": 0,
2406
+ "offset": 3199580,
2407
+ "bytes": 12039
2408
+ },
2409
+ {
2410
+ "index": 1,
2411
+ "offset": 196,
2412
+ "bytes": 15408
2413
+ },
2414
+ {
2415
+ "index": 2,
2416
+ "offset": 15604,
2417
+ "bytes": 160992
2418
+ },
2419
+ {
2420
+ "index": 3,
2421
+ "offset": 178516,
2422
+ "bytes": 1368
2423
+ },
2424
+ {
2425
+ "index": 4,
2426
+ "offset": 176596,
2427
+ "bytes": 1920
2428
+ },
2429
+ {
2430
+ "index": 5,
2431
+ "offset": 276668,
2432
+ "bytes": 7232
2433
+ },
2434
+ {
2435
+ "index": 6,
2436
+ "offset": 283900,
2437
+ "bytes": 4764
2438
+ },
2439
+ {
2440
+ "index": 7,
2441
+ "offset": 288664,
2442
+ "bytes": 40
2443
+ },
2444
+ {
2445
+ "index": 8,
2446
+ "offset": 179884,
2447
+ "bytes": 11856
2448
+ },
2449
+ {
2450
+ "index": 9,
2451
+ "offset": 191740,
2452
+ "bytes": 84928
2453
+ },
2454
+ {
2455
+ "index": 10,
2456
+ "offset": 288704,
2457
+ "bytes": 2765092
2458
+ },
2459
+ {
2460
+ "index": 11,
2461
+ "offset": 3211620,
2462
+ "bytes": 531120
2463
+ },
2464
+ {
2465
+ "index": 12,
2466
+ "offset": 3211620,
2467
+ "bytes": 0
2468
+ },
2469
+ {
2470
+ "index": 13,
2471
+ "offset": 3053796,
2472
+ "bytes": 112216
2473
+ },
2474
+ {
2475
+ "index": 14,
2476
+ "offset": 3166172,
2477
+ "bytes": 0
2478
+ },
2479
+ {
2480
+ "index": 15,
2481
+ "offset": 3166172,
2482
+ "bytes": 33408
2483
+ },
2484
+ {
2485
+ "index": 16,
2486
+ "offset": 3166012,
2487
+ "bytes": 160
2488
+ }
2489
+ ]
2490
+ },
2491
+ {
2492
+ "path": "maps/ut4_raiders.bsp",
2493
+ "archive": "zUrT43_003.pk3",
2494
+ "entity_classes": {
2495
+ "cubemap_probe": 97,
2496
+ "func_wall": 6,
2497
+ "info_player_deathmatch": 15,
2498
+ "info_player_start": 1,
2499
+ "info_ut_bombsite": 2,
2500
+ "info_ut_spawn": 64,
2501
+ "target_location": 115,
2502
+ "target_speaker": 9,
2503
+ "team_CAH_capturepoint": 5,
2504
+ "team_CTF_blueflag": 1,
2505
+ "team_CTF_redflag": 1,
2506
+ "trigger_hurt": 2,
2507
+ "worldspawn": 1
2508
+ },
2509
+ "entities": 319,
2510
+ "lumps": [
2511
+ {
2512
+ "index": 0,
2513
+ "offset": 10149204,
2514
+ "bytes": 25258
2515
+ },
2516
+ {
2517
+ "index": 1,
2518
+ "offset": 200,
2519
+ "bytes": 31320
2520
+ },
2521
+ {
2522
+ "index": 2,
2523
+ "offset": 31520,
2524
+ "bytes": 895936
2525
+ },
2526
+ {
2527
+ "index": 3,
2528
+ "offset": 1156848,
2529
+ "bytes": 171684
2530
+ },
2531
+ {
2532
+ "index": 4,
2533
+ "offset": 927456,
2534
+ "bytes": 229392
2535
+ },
2536
+ {
2537
+ "index": 5,
2538
+ "offset": 1985820,
2539
+ "bytes": 113000
2540
+ },
2541
+ {
2542
+ "index": 6,
2543
+ "offset": 2098820,
2544
+ "bytes": 89104
2545
+ },
2546
+ {
2547
+ "index": 7,
2548
+ "offset": 2187924,
2549
+ "bytes": 360
2550
+ },
2551
+ {
2552
+ "index": 8,
2553
+ "offset": 1328532,
2554
+ "bytes": 84888
2555
+ },
2556
+ {
2557
+ "index": 9,
2558
+ "offset": 1413420,
2559
+ "bytes": 572400
2560
+ },
2561
+ {
2562
+ "index": 10,
2563
+ "offset": 2188284,
2564
+ "bytes": 2571624
2565
+ },
2566
+ {
2567
+ "index": 11,
2568
+ "offset": 10174464,
2569
+ "bytes": 126744
2570
+ },
2571
+ {
2572
+ "index": 12,
2573
+ "offset": 10174464,
2574
+ "bytes": 0
2575
+ },
2576
+ {
2577
+ "index": 13,
2578
+ "offset": 4759908,
2579
+ "bytes": 748072
2580
+ },
2581
+ {
2582
+ "index": 14,
2583
+ "offset": 6310228,
2584
+ "bytes": 1867776
2585
+ },
2586
+ {
2587
+ "index": 15,
2588
+ "offset": 8178004,
2589
+ "bytes": 1971200
2590
+ },
2591
+ {
2592
+ "index": 16,
2593
+ "offset": 5507980,
2594
+ "bytes": 802248
2595
+ }
2596
+ ]
2597
+ },
2598
+ {
2599
+ "path": "maps/ut4_ramelle.bsp",
2600
+ "archive": "zUrT43_003.pk3",
2601
+ "entity_classes": {
2602
+ "cubemap_probe": 8,
2603
+ "func_breakable": 31,
2604
+ "func_door": 4,
2605
+ "func_rotating_door": 1,
2606
+ "func_wall": 22,
2607
+ "info_null": 49,
2608
+ "info_player_intermission": 1,
2609
+ "info_player_start": 24,
2610
+ "info_ut_bombsite": 2,
2611
+ "info_ut_spawn": 220,
2612
+ "target_location": 87,
2613
+ "target_speaker": 66,
2614
+ "team_CAH_capturepoint": 4,
2615
+ "team_CTF_blueflag": 1,
2616
+ "team_CTF_redflag": 1,
2617
+ "trigger_multiple": 10,
2618
+ "ut_mrsentry": 4,
2619
+ "worldspawn": 1
2620
+ },
2621
+ "entities": 536,
2622
+ "lumps": [
2623
+ {
2624
+ "index": 0,
2625
+ "offset": 18439376,
2626
+ "bytes": 53089
2627
+ },
2628
+ {
2629
+ "index": 1,
2630
+ "offset": 200,
2631
+ "bytes": 18360
2632
+ },
2633
+ {
2634
+ "index": 2,
2635
+ "offset": 18560,
2636
+ "bytes": 434208
2637
+ },
2638
+ {
2639
+ "index": 3,
2640
+ "offset": 757184,
2641
+ "bytes": 225792
2642
+ },
2643
+ {
2644
+ "index": 4,
2645
+ "offset": 452768,
2646
+ "bytes": 304416
2647
+ },
2648
+ {
2649
+ "index": 5,
2650
+ "offset": 1308676,
2651
+ "bytes": 139520
2652
+ },
2653
+ {
2654
+ "index": 6,
2655
+ "offset": 1448196,
2656
+ "bytes": 119324
2657
+ },
2658
+ {
2659
+ "index": 7,
2660
+ "offset": 1567520,
2661
+ "bytes": 2760
2662
+ },
2663
+ {
2664
+ "index": 8,
2665
+ "offset": 982976,
2666
+ "bytes": 49332
2667
+ },
2668
+ {
2669
+ "index": 9,
2670
+ "offset": 1032308,
2671
+ "bytes": 276368
2672
+ },
2673
+ {
2674
+ "index": 10,
2675
+ "offset": 1570280,
2676
+ "bytes": 3800896
2677
+ },
2678
+ {
2679
+ "index": 11,
2680
+ "offset": 18492540,
2681
+ "bytes": 83640
2682
+ },
2683
+ {
2684
+ "index": 12,
2685
+ "offset": 18492468,
2686
+ "bytes": 72
2687
+ },
2688
+ {
2689
+ "index": 13,
2690
+ "offset": 5371176,
2691
+ "bytes": 1669200
2692
+ },
2693
+ {
2694
+ "index": 14,
2695
+ "offset": 8070704,
2696
+ "bytes": 9093120
2697
+ },
2698
+ {
2699
+ "index": 15,
2700
+ "offset": 17163824,
2701
+ "bytes": 1275552
2702
+ },
2703
+ {
2704
+ "index": 16,
2705
+ "offset": 7040376,
2706
+ "bytes": 1030328
2707
+ }
2708
+ ]
2709
+ },
2710
+ {
2711
+ "path": "maps/ut4_ricochet.bsp",
2712
+ "archive": "zUrT43_003.pk3",
2713
+ "entity_classes": {
2714
+ "func_breakable": 63,
2715
+ "func_door": 6,
2716
+ "func_pendulum": 8,
2717
+ "func_rotating_door": 8,
2718
+ "func_wall": 7,
2719
+ "info_null": 7,
2720
+ "info_player_deathmatch": 15,
2721
+ "info_ut_bombsite": 2,
2722
+ "info_ut_spawn": 194,
2723
+ "target_location": 38,
2724
+ "target_speaker": 13,
2725
+ "team_CAH_capturepoint": 3,
2726
+ "team_CTF_blueflag": 1,
2727
+ "team_CTF_redflag": 1,
2728
+ "trigger_location": 14,
2729
+ "trigger_multiple": 6,
2730
+ "worldspawn": 1
2731
+ },
2732
+ "entities": 387,
2733
+ "lumps": [
2734
+ {
2735
+ "index": 0,
2736
+ "offset": 6736620,
2737
+ "bytes": 39596
2738
+ },
2739
+ {
2740
+ "index": 1,
2741
+ "offset": 200,
2742
+ "bytes": 13248
2743
+ },
2744
+ {
2745
+ "index": 2,
2746
+ "offset": 13448,
2747
+ "bytes": 226464
2748
+ },
2749
+ {
2750
+ "index": 3,
2751
+ "offset": 400856,
2752
+ "bytes": 116604
2753
+ },
2754
+ {
2755
+ "index": 4,
2756
+ "offset": 239912,
2757
+ "bytes": 160944
2758
+ },
2759
+ {
2760
+ "index": 5,
2761
+ "offset": 754012,
2762
+ "bytes": 90556
2763
+ },
2764
+ {
2765
+ "index": 6,
2766
+ "offset": 844568,
2767
+ "bytes": 37564
2768
+ },
2769
+ {
2770
+ "index": 7,
2771
+ "offset": 882132,
2772
+ "bytes": 4520
2773
+ },
2774
+ {
2775
+ "index": 8,
2776
+ "offset": 517460,
2777
+ "bytes": 39384
2778
+ },
2779
+ {
2780
+ "index": 9,
2781
+ "offset": 556844,
2782
+ "bytes": 197168
2783
+ },
2784
+ {
2785
+ "index": 10,
2786
+ "offset": 886652,
2787
+ "bytes": 2794440
2788
+ },
2789
+ {
2790
+ "index": 11,
2791
+ "offset": 6776216,
2792
+ "bytes": 138288
2793
+ },
2794
+ {
2795
+ "index": 12,
2796
+ "offset": 6776216,
2797
+ "bytes": 0
2798
+ },
2799
+ {
2800
+ "index": 13,
2801
+ "offset": 3681092,
2802
+ "bytes": 1105936
2803
+ },
2804
+ {
2805
+ "index": 14,
2806
+ "offset": 5005100,
2807
+ "bytes": 1474560
2808
+ },
2809
+ {
2810
+ "index": 15,
2811
+ "offset": 6479660,
2812
+ "bytes": 256960
2813
+ },
2814
+ {
2815
+ "index": 16,
2816
+ "offset": 4787028,
2817
+ "bytes": 218072
2818
+ }
2819
+ ]
2820
+ },
2821
+ {
2822
+ "path": "maps/ut4_riyadh.bsp",
2823
+ "archive": "zUrT43_003.pk3",
2824
+ "entity_classes": {
2825
+ "func_pendulum": 2,
2826
+ "info_player_deathmatch": 27,
2827
+ "info_player_intermission": 1,
2828
+ "info_ut_bombsite": 2,
2829
+ "info_ut_spawn": 128,
2830
+ "target_speaker": 38,
2831
+ "team_CTF_blueflag": 1,
2832
+ "team_CTF_redflag": 1,
2833
+ "trigger_location": 11,
2834
+ "worldspawn": 1
2835
+ },
2836
+ "entities": 212,
2837
+ "lumps": [
2838
+ {
2839
+ "index": 0,
2840
+ "offset": 6365772,
2841
+ "bytes": 23514
2842
+ },
2843
+ {
2844
+ "index": 1,
2845
+ "offset": 212,
2846
+ "bytes": 5904
2847
+ },
2848
+ {
2849
+ "index": 2,
2850
+ "offset": 6116,
2851
+ "bytes": 795040
2852
+ },
2853
+ {
2854
+ "index": 3,
2855
+ "offset": 905988,
2856
+ "bytes": 78084
2857
+ },
2858
+ {
2859
+ "index": 4,
2860
+ "offset": 801156,
2861
+ "bytes": 104832
2862
+ },
2863
+ {
2864
+ "index": 5,
2865
+ "offset": 1610888,
2866
+ "bytes": 46348
2867
+ },
2868
+ {
2869
+ "index": 6,
2870
+ "offset": 1657236,
2871
+ "bytes": 62320
2872
+ },
2873
+ {
2874
+ "index": 7,
2875
+ "offset": 1719556,
2876
+ "bytes": 560
2877
+ },
2878
+ {
2879
+ "index": 8,
2880
+ "offset": 984072,
2881
+ "bytes": 78168
2882
+ },
2883
+ {
2884
+ "index": 9,
2885
+ "offset": 1062240,
2886
+ "bytes": 548648
2887
+ },
2888
+ {
2889
+ "index": 10,
2890
+ "offset": 1720116,
2891
+ "bytes": 1747504
2892
+ },
2893
+ {
2894
+ "index": 11,
2895
+ "offset": 6389288,
2896
+ "bytes": 135384
2897
+ },
2898
+ {
2899
+ "index": 12,
2900
+ "offset": 6389288,
2901
+ "bytes": 0
2902
+ },
2903
+ {
2904
+ "index": 13,
2905
+ "offset": 3467620,
2906
+ "bytes": 488488
2907
+ },
2908
+ {
2909
+ "index": 14,
2910
+ "offset": 4098780,
2911
+ "bytes": 2260992
2912
+ },
2913
+ {
2914
+ "index": 15,
2915
+ "offset": 6359772,
2916
+ "bytes": 6000
2917
+ },
2918
+ {
2919
+ "index": 16,
2920
+ "offset": 3956108,
2921
+ "bytes": 142672
2922
+ }
2923
+ ]
2924
+ },
2925
+ {
2926
+ "path": "maps/ut4_sanc.bsp",
2927
+ "archive": "zUrT43_003.pk3",
2928
+ "entity_classes": {
2929
+ "func_breakable": 5,
2930
+ "func_button": 2,
2931
+ "func_door": 3,
2932
+ "func_pendulum": 6,
2933
+ "func_wall": 27,
2934
+ "info_player_intermission": 1,
2935
+ "info_player_start": 4,
2936
+ "info_ut_bombsite": 2,
2937
+ "info_ut_spawn": 166,
2938
+ "item_botroam": 17,
2939
+ "target_location": 122,
2940
+ "target_position": 1,
2941
+ "target_print": 1,
2942
+ "target_speaker": 22,
2943
+ "team_CAH_capturepoint": 7,
2944
+ "team_CTF_blueflag": 1,
2945
+ "team_CTF_redflag": 1,
2946
+ "trigger_hurt": 3,
2947
+ "trigger_multiple": 7,
2948
+ "ut_mrsentry": 5,
2949
+ "worldspawn": 1
2950
+ },
2951
+ "entities": 404,
2952
+ "lumps": [
2953
+ {
2954
+ "index": 0,
2955
+ "offset": 7400400,
2956
+ "bytes": 39988
2957
+ },
2958
+ {
2959
+ "index": 1,
2960
+ "offset": 212,
2961
+ "bytes": 11736
2962
+ },
2963
+ {
2964
+ "index": 2,
2965
+ "offset": 11948,
2966
+ "bytes": 506176
2967
+ },
2968
+ {
2969
+ "index": 3,
2970
+ "offset": 668028,
2971
+ "bytes": 110448
2972
+ },
2973
+ {
2974
+ "index": 4,
2975
+ "offset": 518124,
2976
+ "bytes": 149904
2977
+ },
2978
+ {
2979
+ "index": 5,
2980
+ "offset": 1106032,
2981
+ "bytes": 69832
2982
+ },
2983
+ {
2984
+ "index": 6,
2985
+ "offset": 1175864,
2986
+ "bytes": 32512
2987
+ },
2988
+ {
2989
+ "index": 7,
2990
+ "offset": 1208376,
2991
+ "bytes": 2160
2992
+ },
2993
+ {
2994
+ "index": 8,
2995
+ "offset": 778476,
2996
+ "bytes": 44028
2997
+ },
2998
+ {
2999
+ "index": 9,
3000
+ "offset": 822504,
3001
+ "bytes": 283528
3002
+ },
3003
+ {
3004
+ "index": 10,
3005
+ "offset": 1210536,
3006
+ "bytes": 2742168
3007
+ },
3008
+ {
3009
+ "index": 11,
3010
+ "offset": 7440460,
3011
+ "bytes": 135780
3012
+ },
3013
+ {
3014
+ "index": 12,
3015
+ "offset": 7440388,
3016
+ "bytes": 72
3017
+ },
3018
+ {
3019
+ "index": 13,
3020
+ "offset": 3952704,
3021
+ "bytes": 576784
3022
+ },
3023
+ {
3024
+ "index": 14,
3025
+ "offset": 4798320,
3026
+ "bytes": 1769472
3027
+ },
3028
+ {
3029
+ "index": 15,
3030
+ "offset": 6567792,
3031
+ "bytes": 832608
3032
+ },
3033
+ {
3034
+ "index": 16,
3035
+ "offset": 4529488,
3036
+ "bytes": 268832
3037
+ }
3038
+ ]
3039
+ },
3040
+ {
3041
+ "path": "maps/ut4_suburbs.bsp",
3042
+ "archive": "zUrT43_003.pk3",
3043
+ "entity_classes": {
3044
+ "func_breakable": 22,
3045
+ "func_door": 10,
3046
+ "func_rotating_door": 17,
3047
+ "func_wall": 12,
3048
+ "info_player_deathmatch": 7,
3049
+ "info_player_intermission": 1,
3050
+ "info_ut_bombsite": 2,
3051
+ "info_ut_spawn": 195,
3052
+ "target_location": 37,
3053
+ "target_position": 313,
3054
+ "target_speaker": 21,
3055
+ "team_CAH_capturepoint": 5,
3056
+ "team_CTF_blueflag": 1,
3057
+ "team_CTF_redflag": 1,
3058
+ "trigger_hurt": 6,
3059
+ "trigger_multiple": 13,
3060
+ "worldspawn": 1
3061
+ },
3062
+ "entities": 664,
3063
+ "lumps": [
3064
+ {
3065
+ "index": 0,
3066
+ "offset": 27555868,
3067
+ "bytes": 61021
3068
+ },
3069
+ {
3070
+ "index": 1,
3071
+ "offset": 212,
3072
+ "bytes": 21312
3073
+ },
3074
+ {
3075
+ "index": 2,
3076
+ "offset": 21524,
3077
+ "bytes": 285792
3078
+ },
3079
+ {
3080
+ "index": 3,
3081
+ "offset": 737780,
3082
+ "bytes": 319896
3083
+ },
3084
+ {
3085
+ "index": 4,
3086
+ "offset": 307316,
3087
+ "bytes": 430464
3088
+ },
3089
+ {
3090
+ "index": 5,
3091
+ "offset": 1614680,
3092
+ "bytes": 183060
3093
+ },
3094
+ {
3095
+ "index": 6,
3096
+ "offset": 1797740,
3097
+ "bytes": 176504
3098
+ },
3099
+ {
3100
+ "index": 7,
3101
+ "offset": 1974244,
3102
+ "bytes": 3240
3103
+ },
3104
+ {
3105
+ "index": 8,
3106
+ "offset": 1057676,
3107
+ "bytes": 101484
3108
+ },
3109
+ {
3110
+ "index": 9,
3111
+ "offset": 1159160,
3112
+ "bytes": 455520
3113
+ },
3114
+ {
3115
+ "index": 10,
3116
+ "offset": 1977484,
3117
+ "bytes": 9316824
3118
+ },
3119
+ {
3120
+ "index": 11,
3121
+ "offset": 27616892,
3122
+ "bytes": 487476
3123
+ },
3124
+ {
3125
+ "index": 12,
3126
+ "offset": 27616892,
3127
+ "bytes": 0
3128
+ },
3129
+ {
3130
+ "index": 13,
3131
+ "offset": 11294308,
3132
+ "bytes": 1997008
3133
+ },
3134
+ {
3135
+ "index": 14,
3136
+ "offset": 15116764,
3137
+ "bytes": 11894784
3138
+ },
3139
+ {
3140
+ "index": 15,
3141
+ "offset": 27011548,
3142
+ "bytes": 544320
3143
+ },
3144
+ {
3145
+ "index": 16,
3146
+ "offset": 13291316,
3147
+ "bytes": 1825448
3148
+ }
3149
+ ]
3150
+ },
3151
+ {
3152
+ "path": "maps/ut4_subway.bsp",
3153
+ "archive": "zUrT43_003.pk3",
3154
+ "entity_classes": {
3155
+ "func_breakable": 37,
3156
+ "func_rotating": 1,
3157
+ "func_timer": 5,
3158
+ "info_null": 12,
3159
+ "info_player_deathmatch": 22,
3160
+ "info_player_intermission": 1,
3161
+ "info_player_start": 1,
3162
+ "info_ut_bombsite": 2,
3163
+ "info_ut_spawn": 160,
3164
+ "target_location": 41,
3165
+ "target_speaker": 38,
3166
+ "team_CAH_capturepoint": 4,
3167
+ "team_CTF_blueflag": 1,
3168
+ "team_CTF_redflag": 1,
3169
+ "worldspawn": 1
3170
+ },
3171
+ "entities": 327,
3172
+ "lumps": [
3173
+ {
3174
+ "index": 0,
3175
+ "offset": 10092140,
3176
+ "bytes": 34586
3177
+ },
3178
+ {
3179
+ "index": 1,
3180
+ "offset": 212,
3181
+ "bytes": 10296
3182
+ },
3183
+ {
3184
+ "index": 2,
3185
+ "offset": 10508,
3186
+ "bytes": 311776
3187
+ },
3188
+ {
3189
+ "index": 3,
3190
+ "offset": 565596,
3191
+ "bytes": 181044
3192
+ },
3193
+ {
3194
+ "index": 4,
3195
+ "offset": 322284,
3196
+ "bytes": 243312
3197
+ },
3198
+ {
3199
+ "index": 5,
3200
+ "offset": 1289356,
3201
+ "bytes": 148800
3202
+ },
3203
+ {
3204
+ "index": 6,
3205
+ "offset": 1438156,
3206
+ "bytes": 98032
3207
+ },
3208
+ {
3209
+ "index": 7,
3210
+ "offset": 1536188,
3211
+ "bytes": 1560
3212
+ },
3213
+ {
3214
+ "index": 8,
3215
+ "offset": 746640,
3216
+ "bytes": 90852
3217
+ },
3218
+ {
3219
+ "index": 9,
3220
+ "offset": 837492,
3221
+ "bytes": 451864
3222
+ },
3223
+ {
3224
+ "index": 10,
3225
+ "offset": 1537748,
3226
+ "bytes": 4001800
3227
+ },
3228
+ {
3229
+ "index": 11,
3230
+ "offset": 10126728,
3231
+ "bytes": 134868
3232
+ },
3233
+ {
3234
+ "index": 12,
3235
+ "offset": 10126728,
3236
+ "bytes": 0
3237
+ },
3238
+ {
3239
+ "index": 13,
3240
+ "offset": 5539548,
3241
+ "bytes": 1684488
3242
+ },
3243
+ {
3244
+ "index": 14,
3245
+ "offset": 7946348,
3246
+ "bytes": 1769472
3247
+ },
3248
+ {
3249
+ "index": 15,
3250
+ "offset": 9715820,
3251
+ "bytes": 376320
3252
+ },
3253
+ {
3254
+ "index": 16,
3255
+ "offset": 7224036,
3256
+ "bytes": 722312
3257
+ }
3258
+ ]
3259
+ },
3260
+ {
3261
+ "path": "maps/ut4_swim.bsp",
3262
+ "archive": "zUrT43_003.pk3",
3263
+ "entity_classes": {
3264
+ "func_breakable": 39,
3265
+ "func_button": 3,
3266
+ "func_door": 2,
3267
+ "func_rotating": 3,
3268
+ "func_rotating_door": 30,
3269
+ "func_wall": 16,
3270
+ "info_null": 1,
3271
+ "info_player_deathmatch": 20,
3272
+ "info_player_intermission": 1,
3273
+ "info_ut_bombsite": 2,
3274
+ "info_ut_spawn": 219,
3275
+ "target_location": 134,
3276
+ "target_position": 4,
3277
+ "target_speaker": 39,
3278
+ "team_CAH_capturepoint": 5,
3279
+ "team_CTF_blueflag": 1,
3280
+ "team_CTF_redflag": 1,
3281
+ "trigger_location": 1,
3282
+ "trigger_multiple": 16,
3283
+ "worldspawn": 1
3284
+ },
3285
+ "entities": 538,
3286
+ "lumps": [
3287
+ {
3288
+ "index": 0,
3289
+ "offset": 7971268,
3290
+ "bytes": 56007
3291
+ },
3292
+ {
3293
+ "index": 1,
3294
+ "offset": 200,
3295
+ "bytes": 23976
3296
+ },
3297
+ {
3298
+ "index": 2,
3299
+ "offset": 24176,
3300
+ "bytes": 186688
3301
+ },
3302
+ {
3303
+ "index": 3,
3304
+ "offset": 342192,
3305
+ "bytes": 94464
3306
+ },
3307
+ {
3308
+ "index": 4,
3309
+ "offset": 210864,
3310
+ "bytes": 131328
3311
+ },
3312
+ {
3313
+ "index": 5,
3314
+ "offset": 712512,
3315
+ "bytes": 135860
3316
+ },
3317
+ {
3318
+ "index": 6,
3319
+ "offset": 848372,
3320
+ "bytes": 45412
3321
+ },
3322
+ {
3323
+ "index": 7,
3324
+ "offset": 893784,
3325
+ "bytes": 4440
3326
+ },
3327
+ {
3328
+ "index": 8,
3329
+ "offset": 436656,
3330
+ "bytes": 49584
3331
+ },
3332
+ {
3333
+ "index": 9,
3334
+ "offset": 486240,
3335
+ "bytes": 226272
3336
+ },
3337
+ {
3338
+ "index": 10,
3339
+ "offset": 898224,
3340
+ "bytes": 3920708
3341
+ },
3342
+ {
3343
+ "index": 11,
3344
+ "offset": 8027348,
3345
+ "bytes": 91632
3346
+ },
3347
+ {
3348
+ "index": 12,
3349
+ "offset": 8027276,
3350
+ "bytes": 72
3351
+ },
3352
+ {
3353
+ "index": 13,
3354
+ "offset": 4818932,
3355
+ "bytes": 1617096
3356
+ },
3357
+ {
3358
+ "index": 14,
3359
+ "offset": 6566852,
3360
+ "bytes": 1277952
3361
+ },
3362
+ {
3363
+ "index": 15,
3364
+ "offset": 7844804,
3365
+ "bytes": 126464
3366
+ },
3367
+ {
3368
+ "index": 16,
3369
+ "offset": 6436028,
3370
+ "bytes": 130824
3371
+ }
3372
+ ]
3373
+ },
3374
+ {
3375
+ "path": "maps/ut4_thingley.bsp",
3376
+ "archive": "zUrT43_004.pk3",
3377
+ "entity_classes": {
3378
+ "func_breakable": 2,
3379
+ "func_wall": 2,
3380
+ "info_null": 14,
3381
+ "info_player_deathmatch": 13,
3382
+ "info_ut_bombsite": 2,
3383
+ "info_ut_spawn": 264,
3384
+ "item_botroam": 12,
3385
+ "target_location": 78,
3386
+ "target_speaker": 17,
3387
+ "team_CAH_capturepoint": 6,
3388
+ "team_CTF_blueflag": 1,
3389
+ "team_CTF_redflag": 1,
3390
+ "trigger_hurt": 1,
3391
+ "trigger_multiple": 2,
3392
+ "worldspawn": 1
3393
+ },
3394
+ "entities": 416,
3395
+ "lumps": [
3396
+ {
3397
+ "index": 0,
3398
+ "offset": 22449140,
3399
+ "bytes": 43356
3400
+ },
3401
+ {
3402
+ "index": 1,
3403
+ "offset": 200,
3404
+ "bytes": 19440
3405
+ },
3406
+ {
3407
+ "index": 2,
3408
+ "offset": 19640,
3409
+ "bytes": 527840
3410
+ },
3411
+ {
3412
+ "index": 3,
3413
+ "offset": 752008,
3414
+ "bytes": 153072
3415
+ },
3416
+ {
3417
+ "index": 4,
3418
+ "offset": 547480,
3419
+ "bytes": 204528
3420
+ },
3421
+ {
3422
+ "index": 5,
3423
+ "offset": 1252756,
3424
+ "bytes": 176224
3425
+ },
3426
+ {
3427
+ "index": 6,
3428
+ "offset": 1428980,
3429
+ "bytes": 90320
3430
+ },
3431
+ {
3432
+ "index": 7,
3433
+ "offset": 1519300,
3434
+ "bytes": 320
3435
+ },
3436
+ {
3437
+ "index": 8,
3438
+ "offset": 905080,
3439
+ "bytes": 52404
3440
+ },
3441
+ {
3442
+ "index": 9,
3443
+ "offset": 957484,
3444
+ "bytes": 295272
3445
+ },
3446
+ {
3447
+ "index": 10,
3448
+ "offset": 1519620,
3449
+ "bytes": 6780400
3450
+ },
3451
+ {
3452
+ "index": 11,
3453
+ "offset": 22492496,
3454
+ "bytes": 147228
3455
+ },
3456
+ {
3457
+ "index": 12,
3458
+ "offset": 22492496,
3459
+ "bytes": 0
3460
+ },
3461
+ {
3462
+ "index": 13,
3463
+ "offset": 8300020,
3464
+ "bytes": 2351128
3465
+ },
3466
+ {
3467
+ "index": 14,
3468
+ "offset": 10937236,
3469
+ "bytes": 11059200
3470
+ },
3471
+ {
3472
+ "index": 15,
3473
+ "offset": 21996436,
3474
+ "bytes": 452704
3475
+ },
3476
+ {
3477
+ "index": 16,
3478
+ "offset": 10651148,
3479
+ "bytes": 286088
3480
+ }
3481
+ ]
3482
+ },
3483
+ {
3484
+ "path": "maps/ut4_tombs.bsp",
3485
+ "archive": "zUrT43_004.pk3",
3486
+ "entity_classes": {
3487
+ "cubemap_probe": 46,
3488
+ "func_breakable": 6,
3489
+ "func_wall": 17,
3490
+ "info_null": 18,
3491
+ "info_player_deathmatch": 16,
3492
+ "info_player_intermission": 1,
3493
+ "info_ut_bombsite": 2,
3494
+ "info_ut_spawn": 96,
3495
+ "target_location": 105,
3496
+ "target_position": 313,
3497
+ "target_speaker": 39,
3498
+ "team_CAH_capturepoint": 3,
3499
+ "team_CTF_blueflag": 1,
3500
+ "team_CTF_redflag": 1,
3501
+ "trigger_hurt": 1,
3502
+ "trigger_multiple": 2,
3503
+ "worldspawn": 1
3504
+ },
3505
+ "entities": 668,
3506
+ "lumps": [
3507
+ {
3508
+ "index": 0,
3509
+ "offset": 26907852,
3510
+ "bytes": 64145
3511
+ },
3512
+ {
3513
+ "index": 1,
3514
+ "offset": 196,
3515
+ "bytes": 13032
3516
+ },
3517
+ {
3518
+ "index": 2,
3519
+ "offset": 13228,
3520
+ "bytes": 1624096
3521
+ },
3522
+ {
3523
+ "index": 3,
3524
+ "offset": 1906844,
3525
+ "bytes": 201132
3526
+ },
3527
+ {
3528
+ "index": 4,
3529
+ "offset": 1637324,
3530
+ "bytes": 269520
3531
+ },
3532
+ {
3533
+ "index": 5,
3534
+ "offset": 2743260,
3535
+ "bytes": 291780
3536
+ },
3537
+ {
3538
+ "index": 6,
3539
+ "offset": 3035040,
3540
+ "bytes": 84744
3541
+ },
3542
+ {
3543
+ "index": 7,
3544
+ "offset": 3119784,
3545
+ "bytes": 1080
3546
+ },
3547
+ {
3548
+ "index": 8,
3549
+ "offset": 2107976,
3550
+ "bytes": 73284
3551
+ },
3552
+ {
3553
+ "index": 9,
3554
+ "offset": 2181260,
3555
+ "bytes": 562000
3556
+ },
3557
+ {
3558
+ "index": 10,
3559
+ "offset": 3120864,
3560
+ "bytes": 13621476
3561
+ },
3562
+ {
3563
+ "index": 11,
3564
+ "offset": 26972000,
3565
+ "bytes": 453120
3566
+ },
3567
+ {
3568
+ "index": 12,
3569
+ "offset": 26972000,
3570
+ "bytes": 0
3571
+ },
3572
+ {
3573
+ "index": 13,
3574
+ "offset": 16742340,
3575
+ "bytes": 4985968
3576
+ },
3577
+ {
3578
+ "index": 14,
3579
+ "offset": 22375740,
3580
+ "bytes": 4325376
3581
+ },
3582
+ {
3583
+ "index": 15,
3584
+ "offset": 26701116,
3585
+ "bytes": 206736
3586
+ },
3587
+ {
3588
+ "index": 16,
3589
+ "offset": 21728308,
3590
+ "bytes": 647432
3591
+ }
3592
+ ]
3593
+ },
3594
+ {
3595
+ "path": "maps/ut4_turnpike.bsp",
3596
+ "archive": "zUrT43_004.pk3",
3597
+ "entity_classes": {
3598
+ "func_breakable": 10,
3599
+ "func_door": 13,
3600
+ "func_rotating_door": 4,
3601
+ "info_null": 1,
3602
+ "info_player_deathmatch": 12,
3603
+ "info_ut_bombsite": 2,
3604
+ "info_ut_spawn": 74,
3605
+ "path_ut_stop": 1,
3606
+ "target_location": 35,
3607
+ "target_position": 65,
3608
+ "target_speaker": 22,
3609
+ "team_CTF_blueflag": 1,
3610
+ "team_CTF_redflag": 1,
3611
+ "trigger_multiple": 6,
3612
+ "worldspawn": 1
3613
+ },
3614
+ "entities": 248,
3615
+ "lumps": [
3616
+ {
3617
+ "index": 0,
3618
+ "offset": 8295236,
3619
+ "bytes": 22957
3620
+ },
3621
+ {
3622
+ "index": 1,
3623
+ "offset": 200,
3624
+ "bytes": 12600
3625
+ },
3626
+ {
3627
+ "index": 2,
3628
+ "offset": 12800,
3629
+ "bytes": 104736
3630
+ },
3631
+ {
3632
+ "index": 3,
3633
+ "offset": 374432,
3634
+ "bytes": 191412
3635
+ },
3636
+ {
3637
+ "index": 4,
3638
+ "offset": 117536,
3639
+ "bytes": 256896
3640
+ },
3641
+ {
3642
+ "index": 5,
3643
+ "offset": 831784,
3644
+ "bytes": 122656
3645
+ },
3646
+ {
3647
+ "index": 6,
3648
+ "offset": 954440,
3649
+ "bytes": 82296
3650
+ },
3651
+ {
3652
+ "index": 7,
3653
+ "offset": 1036736,
3654
+ "bytes": 1360
3655
+ },
3656
+ {
3657
+ "index": 8,
3658
+ "offset": 565844,
3659
+ "bytes": 50484
3660
+ },
3661
+ {
3662
+ "index": 9,
3663
+ "offset": 616328,
3664
+ "bytes": 215456
3665
+ },
3666
+ {
3667
+ "index": 10,
3668
+ "offset": 1038096,
3669
+ "bytes": 3242404
3670
+ },
3671
+ {
3672
+ "index": 11,
3673
+ "offset": 8318196,
3674
+ "bytes": 89556
3675
+ },
3676
+ {
3677
+ "index": 12,
3678
+ "offset": 8318196,
3679
+ "bytes": 0
3680
+ },
3681
+ {
3682
+ "index": 13,
3683
+ "offset": 4280500,
3684
+ "bytes": 1246440
3685
+ },
3686
+ {
3687
+ "index": 14,
3688
+ "offset": 6072900,
3689
+ "bytes": 1474560
3690
+ },
3691
+ {
3692
+ "index": 15,
3693
+ "offset": 7547460,
3694
+ "bytes": 747776
3695
+ },
3696
+ {
3697
+ "index": 16,
3698
+ "offset": 5526940,
3699
+ "bytes": 545960
3700
+ }
3701
+ ]
3702
+ },
3703
+ {
3704
+ "path": "maps/ut4_uptown.bsp",
3705
+ "archive": "zUrT43_004.pk3",
3706
+ "entity_classes": {
3707
+ "cubemap_probe": 54,
3708
+ "func_breakable": 37,
3709
+ "func_door": 7,
3710
+ "func_wall": 14,
3711
+ "info_player_deathmatch": 20,
3712
+ "info_player_intermission": 1,
3713
+ "info_ut_bombsite": 2,
3714
+ "info_ut_spawn": 144,
3715
+ "target_location": 117,
3716
+ "target_position": 183,
3717
+ "target_speaker": 17,
3718
+ "team_CAH_capturepoint": 7,
3719
+ "team_CTF_blueflag": 1,
3720
+ "team_CTF_redflag": 1,
3721
+ "trigger_multiple": 14,
3722
+ "ut_end_jumphint": 3,
3723
+ "ut_jumpgoal": 3,
3724
+ "ut_mrsentry": 8,
3725
+ "ut_purple_jumphint": 5,
3726
+ "ut_start_jumphint": 3,
3727
+ "ut_teal_jumphint": 3,
3728
+ "ut_yellow_jumphint": 2,
3729
+ "worldspawn": 1
3730
+ },
3731
+ "entities": 647,
3732
+ "lumps": [
3733
+ {
3734
+ "index": 0,
3735
+ "offset": 8330956,
3736
+ "bytes": 57723
3737
+ },
3738
+ {
3739
+ "index": 1,
3740
+ "offset": 200,
3741
+ "bytes": 15336
3742
+ },
3743
+ {
3744
+ "index": 2,
3745
+ "offset": 15536,
3746
+ "bytes": 138816
3747
+ },
3748
+ {
3749
+ "index": 3,
3750
+ "offset": 267680,
3751
+ "bytes": 82332
3752
+ },
3753
+ {
3754
+ "index": 4,
3755
+ "offset": 154352,
3756
+ "bytes": 113328
3757
+ },
3758
+ {
3759
+ "index": 5,
3760
+ "offset": 591496,
3761
+ "bytes": 99872
3762
+ },
3763
+ {
3764
+ "index": 6,
3765
+ "offset": 691368,
3766
+ "bytes": 34720
3767
+ },
3768
+ {
3769
+ "index": 7,
3770
+ "offset": 726088,
3771
+ "bytes": 2920
3772
+ },
3773
+ {
3774
+ "index": 8,
3775
+ "offset": 350012,
3776
+ "bytes": 42420
3777
+ },
3778
+ {
3779
+ "index": 9,
3780
+ "offset": 392432,
3781
+ "bytes": 199064
3782
+ },
3783
+ {
3784
+ "index": 10,
3785
+ "offset": 729008,
3786
+ "bytes": 3076612
3787
+ },
3788
+ {
3789
+ "index": 11,
3790
+ "offset": 8388680,
3791
+ "bytes": 118344
3792
+ },
3793
+ {
3794
+ "index": 12,
3795
+ "offset": 8388680,
3796
+ "bytes": 0
3797
+ },
3798
+ {
3799
+ "index": 13,
3800
+ "offset": 3805620,
3801
+ "bytes": 1201616
3802
+ },
3803
+ {
3804
+ "index": 14,
3805
+ "offset": 5165644,
3806
+ "bytes": 2998272
3807
+ },
3808
+ {
3809
+ "index": 15,
3810
+ "offset": 8163916,
3811
+ "bytes": 167040
3812
+ },
3813
+ {
3814
+ "index": 16,
3815
+ "offset": 5007236,
3816
+ "bytes": 158408
3817
+ }
3818
+ ]
3819
+ }
3820
+ ]
docs/inventory/native-imports.json ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "snapshot_date": "2026-10-10",
3
+ "scope": "Direct native import tables of standalone Linux/Windows binaries. Does not include dlopen/LoadLibrary runtime dependencies, transitive libraries, or embedded code. Mach-O dependencies were separately inspected with otool -L and described in FINDINGS.md.",
4
+ "binaries": [
5
+ {
6
+ "path": "Quake3-UrT-Ded.exe",
7
+ "method": "PE import descriptors",
8
+ "direct_imported_libraries": [
9
+ "ADVAPI32.dll",
10
+ "GDI32.dll",
11
+ "KERNEL32.dll",
12
+ "msvcrt.dll",
13
+ "USER32.dll",
14
+ "WINMM.DLL",
15
+ "WSOCK32.DLL"
16
+ ]
17
+ },
18
+ {
19
+ "path": "Quake3-UrT-Ded.i386",
20
+ "method": "ELF DT_NEEDED",
21
+ "direct_imported_libraries": [
22
+ "libdl.so.2",
23
+ "libm.so.6",
24
+ "libc.so.6"
25
+ ]
26
+ },
27
+ {
28
+ "path": "Quake3-UrT-Ded.x86_64",
29
+ "method": "ELF DT_NEEDED",
30
+ "direct_imported_libraries": [
31
+ "libdl.so.2",
32
+ "libm.so.6",
33
+ "libc.so.6"
34
+ ]
35
+ },
36
+ {
37
+ "path": "Quake3-UrT.exe",
38
+ "method": "PE import descriptors",
39
+ "direct_imported_libraries": [
40
+ "ADVAPI32.dll",
41
+ "GDI32.dll",
42
+ "KERNEL32.dll",
43
+ "msvcrt.dll",
44
+ "ole32.dll",
45
+ "USER32.dll",
46
+ "WINMM.DLL",
47
+ "WSOCK32.DLL"
48
+ ]
49
+ },
50
+ {
51
+ "path": "Quake3-UrT.i386",
52
+ "method": "ELF DT_NEEDED",
53
+ "direct_imported_libraries": [
54
+ "libSDL-1.2.so.0",
55
+ "libpthread.so.0",
56
+ "libX11.so.6",
57
+ "libXxf86vm.so.1",
58
+ "libdl.so.2",
59
+ "libm.so.6",
60
+ "libc.so.6"
61
+ ]
62
+ },
63
+ {
64
+ "path": "Quake3-UrT.x86_64",
65
+ "method": "ELF DT_NEEDED",
66
+ "direct_imported_libraries": [
67
+ "libSDL-1.2.so.0",
68
+ "libpthread.so.0",
69
+ "libX11.so.6",
70
+ "libXxf86vm.so.1",
71
+ "libdl.so.2",
72
+ "libm.so.6",
73
+ "libc.so.6"
74
+ ]
75
+ }
76
+ ]
77
+ }
docs/inventory/overrides.tsv ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ path earlier_archive later_archive
2
+ sound/ut4_mykonos/ut4_mykonos_music.wav zUrT43_009.pk3 zUrT43_010.pk3
3
+ sound/ut4_paris/accordeon.wav zUrT43_009.pk3 zUrT43_010.pk3
4
+ sound/ut4_paris/buisson_02.wav zUrT43_009.pk3 zUrT43_010.pk3
5
+ sound/ut4_paris/canal.wav zUrT43_009.pk3 zUrT43_010.pk3
6
+ sound/ut4_paris/flotte.wav zUrT43_009.pk3 zUrT43_010.pk3
7
+ sound/ut4_paris/grille_01.wav zUrT43_009.pk3 zUrT43_010.pk3
8
+ sound/ut4_paris/la-vie-en-rose.wav zUrT43_009.pk3 zUrT43_010.pk3
9
+ sound/ut4_paris/peniche.wav zUrT43_009.pk3 zUrT43_010.pk3
10
+ sound/ut4_paris/pigeon_01.wav zUrT43_009.pk3 zUrT43_010.pk3
11
+ sound/ut4_paris/pigeon_02.wav zUrT43_009.pk3 zUrT43_010.pk3
12
+ sound/ut4_paris/poubelle_chat.wav zUrT43_009.pk3 zUrT43_010.pk3
13
+ sound/ut4_paris/sirene.wav zUrT43_009.pk3 zUrT43_010.pk3
14
+ sound/ut4_paris/tonnerre.wav zUrT43_009.pk3 zUrT43_010.pk3
15
+ sound/ut4_paris/torche.wav zUrT43_009.pk3 zUrT43_010.pk3
16
+ sound/ut4_suburbs/acfan.wav zUrT43_009.pk3 zUrT43_010.pk3
17
+ sound/ut4_suburbs/cricket.wav zUrT43_009.pk3 zUrT43_010.pk3
18
+ sound/ut4_suburbs/frogs.wav zUrT43_009.pk3 zUrT43_010.pk3
19
+ sound/ut4_suburbs/quatrainsloop2a.wav zUrT43_009.pk3 zUrT43_010.pk3
20
+ sound/ut4_suburbs/shock2.wav zUrT43_009.pk3 zUrT43_010.pk3
21
+ sound/ut4_suburbs/thunder.wav zUrT43_009.pk3 zUrT43_010.pk3
22
+ sound/ut4_suburbs/thunder2.wav zUrT43_009.pk3 zUrT43_010.pk3
23
+ sound/ut4_suburbs/traffic.wav zUrT43_009.pk3 zUrT43_010.pk3
24
+ botfiles/bots/ut_boa_i.c zUrT43_001.pk3 zUrT43_020.pk3
25
+ botfiles/bots/ut_boa_w.c zUrT43_001.pk3 zUrT43_020.pk3
26
+ botfiles/bots/ut_cheetah_i.c zUrT43_001.pk3 zUrT43_020.pk3
27
+ botfiles/bots/ut_cheetah_w.c zUrT43_001.pk3 zUrT43_020.pk3
28
+ botfiles/bots/ut_chicken_i.c zUrT43_001.pk3 zUrT43_020.pk3
29
+ botfiles/bots/ut_chicken_w.c zUrT43_001.pk3 zUrT43_020.pk3
30
+ botfiles/bots/ut_cobra_i.c zUrT43_001.pk3 zUrT43_020.pk3
31
+ botfiles/bots/ut_cobra_w.c zUrT43_001.pk3 zUrT43_020.pk3
32
+ botfiles/bots/ut_cockroach_i.c zUrT43_001.pk3 zUrT43_020.pk3
33
+ botfiles/bots/ut_cockroach_w.c zUrT43_001.pk3 zUrT43_020.pk3
34
+ botfiles/bots/ut_cougar_i.c zUrT43_001.pk3 zUrT43_020.pk3
35
+ botfiles/bots/ut_cougar_w.c zUrT43_001.pk3 zUrT43_020.pk3
36
+ botfiles/bots/ut_goose_i.c zUrT43_001.pk3 zUrT43_020.pk3
37
+ botfiles/bots/ut_goose_w.c zUrT43_001.pk3 zUrT43_020.pk3
38
+ botfiles/bots/ut_mantis_i.c zUrT43_001.pk3 zUrT43_020.pk3
39
+ botfiles/bots/ut_mantis_w.c zUrT43_001.pk3 zUrT43_020.pk3
40
+ botfiles/bots/ut_penguin_i.c zUrT43_001.pk3 zUrT43_020.pk3
41
+ botfiles/bots/ut_penguin_w.c zUrT43_001.pk3 zUrT43_020.pk3
42
+ botfiles/bots/ut_puma_i.c zUrT43_001.pk3 zUrT43_020.pk3
43
+ botfiles/bots/ut_puma_w.c zUrT43_001.pk3 zUrT43_020.pk3
44
+ botfiles/bots/ut_python_i.c zUrT43_001.pk3 zUrT43_020.pk3
45
+ botfiles/bots/ut_python_w.c zUrT43_001.pk3 zUrT43_020.pk3
46
+ botfiles/bots/ut_raven_i.c zUrT43_001.pk3 zUrT43_020.pk3
47
+ botfiles/bots/ut_raven_w.c zUrT43_001.pk3 zUrT43_020.pk3
48
+ botfiles/bots/ut_scarab_i.c zUrT43_001.pk3 zUrT43_020.pk3
49
+ botfiles/bots/ut_scarab_w.c zUrT43_001.pk3 zUrT43_020.pk3
50
+ botfiles/bots/ut_scorpion_i.c zUrT43_001.pk3 zUrT43_020.pk3
51
+ botfiles/bots/ut_scorpion_w.c zUrT43_001.pk3 zUrT43_020.pk3
52
+ botfiles/bots/ut_tiger_i.c zUrT43_001.pk3 zUrT43_020.pk3
53
+ botfiles/bots/ut_tiger_w.c zUrT43_001.pk3 zUrT43_020.pk3
54
+ botfiles/bots/ut_widow_i.c zUrT43_001.pk3 zUrT43_020.pk3
55
+ botfiles/bots/ut_widow_w.c zUrT43_001.pk3 zUrT43_020.pk3
56
+ botfiles/inv.h zUrT43_001.pk3 zUrT43_020.pk3
57
+ botfiles/items.c zUrT43_001.pk3 zUrT43_020.pk3
58
+ botfiles/weapons.c zUrT43_001.pk3 zUrT43_020.pk3
59
+ icons/timer.tga zUrT43_001.pk3 zUrT43_020.pk3
60
+ maps/ut4_kingdom.aas zUrT43_002.pk3 zUrT43_020.pk3
61
+ models/weapons2/tod50/tod50-main.tga zUrT43_008.pk3 zUrT43_020.pk3
62
+ models/weapons2/tod50/tod50-scope.tga zUrT43_008.pk3 zUrT43_020.pk3
63
+ scripts/bots.txt zUrT43_008.pk3 zUrT43_020.pk3
64
+ maps/ut4_paris.aas zUrT43_003.pk3 zUrT43_021.pk3
65
+ maps/ut4_paris.bsp zUrT43_003.pk3 zUrT43_021.pk3
66
+ models/weapons2/glock/sound.cfg zUrT43_008.pk3 zUrT43_021.pk3
67
+ scripts/ut4_abbey.arena zUrT43_008.pk3 zUrT43_021.pk3
68
+ scripts/ut4_algiers.arena zUrT43_008.pk3 zUrT43_021.pk3
69
+ scripts/ut4_austria.arena zUrT43_008.pk3 zUrT43_021.pk3
70
+ scripts/ut4_bohemia.arena zUrT43_008.pk3 zUrT43_021.pk3
71
+ scripts/ut4_casa.arena zUrT43_008.pk3 zUrT43_021.pk3
72
+ scripts/ut4_cascade.arena zUrT43_008.pk3 zUrT43_021.pk3
73
+ scripts/ut4_docks.arena zUrT43_008.pk3 zUrT43_021.pk3
74
+ scripts/ut4_dressingroom.arena zUrT43_008.pk3 zUrT43_021.pk3
75
+ scripts/ut4_eagle.arena zUrT43_008.pk3 zUrT43_021.pk3
76
+ scripts/ut4_elgin.arena zUrT43_008.pk3 zUrT43_021.pk3
77
+ scripts/ut4_firingrange.arena zUrT43_008.pk3 zUrT43_021.pk3
78
+ scripts/ut4_ghosttown.arena zUrT43_008.pk3 zUrT43_021.pk3
79
+ scripts/ut4_herring.arena zUrT43_008.pk3 zUrT43_021.pk3
80
+ scripts/ut4_kingdom.arena zUrT43_008.pk3 zUrT43_021.pk3
81
+ scripts/ut4_kingpin.arena zUrT43_008.pk3 zUrT43_021.pk3
82
+ scripts/ut4_mandolin.arena zUrT43_008.pk3 zUrT43_021.pk3
83
+ scripts/ut4_mykonos_a16.arena zUrT43_008.pk3 zUrT43_021.pk3
84
+ scripts/ut4_oildepot.arena zUrT43_008.pk3 zUrT43_021.pk3
85
+ scripts/ut4_paris.arena zUrT43_008.pk3 zUrT43_021.pk3
86
+ scripts/ut4_paris.shader zUrT43_008.pk3 zUrT43_021.pk3
87
+ scripts/ut4_prague.arena zUrT43_008.pk3 zUrT43_021.pk3
88
+ scripts/ut4_prominence.arena zUrT43_008.pk3 zUrT43_021.pk3
89
+ scripts/ut4_raiders.arena zUrT43_008.pk3 zUrT43_021.pk3
90
+ scripts/ut4_ramelle.arena zUrT43_008.pk3 zUrT43_021.pk3
91
+ scripts/ut4_ricochet.arena zUrT43_008.pk3 zUrT43_021.pk3
92
+ scripts/ut4_riyadh.arena zUrT43_008.pk3 zUrT43_021.pk3
93
+ scripts/ut4_sanc.arena zUrT43_008.pk3 zUrT43_021.pk3
94
+ scripts/ut4_suburbs.arena zUrT43_008.pk3 zUrT43_021.pk3
95
+ scripts/ut4_subway.arena zUrT43_008.pk3 zUrT43_021.pk3
96
+ scripts/ut4_swim.arena zUrT43_008.pk3 zUrT43_021.pk3
97
+ scripts/ut4_thingley.arena zUrT43_008.pk3 zUrT43_021.pk3
98
+ scripts/ut4_tombs.arena zUrT43_008.pk3 zUrT43_021.pk3
99
+ scripts/ut4_turnpike.arena zUrT43_008.pk3 zUrT43_021.pk3
100
+ scripts/ut4_uptown.arena zUrT43_008.pk3 zUrT43_021.pk3
101
+ sound/weapons/44magnum/de.wav zUrT43_010.pk3 zUrT43_021.pk3
102
+ sound/weapons/44magnum/de_h2o.wav zUrT43_010.pk3 zUrT43_021.pk3
103
+ sound/weapons/44magnum/de_out.wav zUrT43_010.pk3 zUrT43_021.pk3
104
+ sound/weapons/beretta/beretta_sil.wav zUrT43_010.pk3 zUrT43_021.pk3
105
+ sound/weapons/colt1911/gunshot_inside.wav zUrT43_010.pk3 zUrT43_021.pk3
106
+ sound/weapons/colt1911/gunshot_outside.wav zUrT43_010.pk3 zUrT43_021.pk3
107
+ sound/weapons/colt1911/gunshot_sil.wav zUrT43_010.pk3 zUrT43_021.pk3
108
+ sound/weapons/glock/glock.wav zUrT43_010.pk3 zUrT43_021.pk3
109
+ sound/weapons/glock/glock_h20.wav zUrT43_010.pk3 zUrT43_021.pk3
110
+ sound/weapons/glock/glock_out.wav zUrT43_010.pk3 zUrT43_021.pk3
111
+ sound/weapons/glock/glock_sil.wav zUrT43_010.pk3 zUrT43_021.pk3
112
+ sound/weapons/p90/p90_inside.wav zUrT43_010.pk3 zUrT43_021.pk3
113
+ sound/weapons/p90/p90_out.wav zUrT43_010.pk3 zUrT43_021.pk3
114
+ sound/weapons/p90/p90_silenced.wav zUrT43_010.pk3 zUrT43_021.pk3
115
+ sound/weapons/psg1/psg1_sil.wav zUrT43_010.pk3 zUrT43_021.pk3
docs/inventory/snapshot.json ADDED
@@ -0,0 +1,831 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "snapshot_date": "2026-10-10",
3
+ "source_root": ".cache/UrbanTerror43",
4
+ "method": "Static inspection only; no cached executables launched. Exact-case paths indexed in ascending archive-name order, retaining last occurrence as an unverified override candidate. Runtime and case-insensitive lookup precedence not established.",
5
+ "file_count": 39,
6
+ "archive_count": 23,
7
+ "archive_bytes": 1476022665,
8
+ "uncompressed_member_bytes": 3125455778,
9
+ "archive_member_count": 9835,
10
+ "distinct_exact_case_paths": 9721,
11
+ "distinct_casefold_paths": 9718,
12
+ "exact_case_override_events": 114,
13
+ "archives": [
14
+ {
15
+ "name": "ut4_jumpents.pk3",
16
+ "bytes": 128107,
17
+ "sha256": "6c90530e6bf2564c748fbcfd1942d510dcfb461c38de743dd5df5b1bcf5ed17d",
18
+ "members": 7,
19
+ "uncompressed_bytes": 1666557,
20
+ "extensions": {
21
+ ".bsp": 1,
22
+ ".map": 1,
23
+ ".prt": 1,
24
+ ".rad": 1,
25
+ ".srf": 1,
26
+ ".tga": 1,
27
+ ".txt": 1
28
+ },
29
+ "maps": [
30
+ {
31
+ "path": "maps/ut4_jumpents.bsp",
32
+ "magic": "IBSP",
33
+ "version": 46
34
+ }
35
+ ],
36
+ "vm": [],
37
+ "crc_test": "passed"
38
+ },
39
+ {
40
+ "name": "zUrT43_001.pk3",
41
+ "bytes": 77799633,
42
+ "sha256": "6c094afe9effcfa55af6b950f9b4d764d350b85a40f39b73567ee08a7c737c91",
43
+ "members": 710,
44
+ "uncompressed_bytes": 215233472,
45
+ "extensions": {
46
+ ".c": 73,
47
+ ".dat": 6,
48
+ ".h": 6,
49
+ ".jpg": 139,
50
+ ".png": 14,
51
+ ".tga": 470,
52
+ ".txt": 2
53
+ },
54
+ "maps": [],
55
+ "vm": [],
56
+ "crc_test": "passed"
57
+ },
58
+ {
59
+ "name": "zUrT43_002.pk3",
60
+ "bytes": 73378053,
61
+ "sha256": "9270b41b6a7f011eb6ec61e7a9fcffcd21e05490419043f164347f7fec0688d4",
62
+ "members": 98,
63
+ "uncompressed_bytes": 257879005,
64
+ "extensions": {
65
+ ".aas": 15,
66
+ ".bsp": 16,
67
+ ".db": 1,
68
+ ".jpg": 17,
69
+ ".rad": 3,
70
+ ".tga": 35,
71
+ ".txt": 11
72
+ },
73
+ "maps": [
74
+ {
75
+ "path": "maps/ut4_abbey.bsp",
76
+ "magic": "IBSP",
77
+ "version": 46
78
+ },
79
+ {
80
+ "path": "maps/ut4_algiers.bsp",
81
+ "magic": "IBSP",
82
+ "version": 46
83
+ },
84
+ {
85
+ "path": "maps/ut4_austria.bsp",
86
+ "magic": "IBSP",
87
+ "version": 46
88
+ },
89
+ {
90
+ "path": "maps/ut4_bohemia.bsp",
91
+ "magic": "IBSP",
92
+ "version": 46
93
+ },
94
+ {
95
+ "path": "maps/ut4_casa.bsp",
96
+ "magic": "IBSP",
97
+ "version": 46
98
+ },
99
+ {
100
+ "path": "maps/ut4_cascade.bsp",
101
+ "magic": "IBSP",
102
+ "version": 46
103
+ },
104
+ {
105
+ "path": "maps/ut4_docks.bsp",
106
+ "magic": "IBSP",
107
+ "version": 46
108
+ },
109
+ {
110
+ "path": "maps/ut4_dressingroom.bsp",
111
+ "magic": "IBSP",
112
+ "version": 46
113
+ },
114
+ {
115
+ "path": "maps/ut4_eagle.bsp",
116
+ "magic": "IBSP",
117
+ "version": 46
118
+ },
119
+ {
120
+ "path": "maps/ut4_elgin.bsp",
121
+ "magic": "IBSP",
122
+ "version": 46
123
+ },
124
+ {
125
+ "path": "maps/ut4_firingrange.bsp",
126
+ "magic": "IBSP",
127
+ "version": 46
128
+ },
129
+ {
130
+ "path": "maps/ut4_ghosttown.bsp",
131
+ "magic": "IBSP",
132
+ "version": 46
133
+ },
134
+ {
135
+ "path": "maps/ut4_herring.bsp",
136
+ "magic": "IBSP",
137
+ "version": 46
138
+ },
139
+ {
140
+ "path": "maps/ut4_killroom.bsp",
141
+ "magic": "IBSP",
142
+ "version": 46
143
+ },
144
+ {
145
+ "path": "maps/ut4_kingdom.bsp",
146
+ "magic": "IBSP",
147
+ "version": 46
148
+ },
149
+ {
150
+ "path": "maps/ut4_kingpin.bsp",
151
+ "magic": "IBSP",
152
+ "version": 46
153
+ }
154
+ ],
155
+ "vm": [],
156
+ "crc_test": "passed"
157
+ },
158
+ {
159
+ "name": "zUrT43_003.pk3",
160
+ "bytes": 67657413,
161
+ "sha256": "300f0029c9f04fa3100efad69c7814f4d9c925d7e38bd2a2f703fc8504cfce40",
162
+ "members": 52,
163
+ "uncompressed_bytes": 240202610,
164
+ "extensions": {
165
+ ".aas": 14,
166
+ ".bsp": 14,
167
+ ".rad": 2,
168
+ ".tga": 14,
169
+ ".txt": 8
170
+ },
171
+ "maps": [
172
+ {
173
+ "path": "maps/ut4_mandolin.bsp",
174
+ "magic": "IBSP",
175
+ "version": 46
176
+ },
177
+ {
178
+ "path": "maps/ut4_mykonos_a17.bsp",
179
+ "magic": "IBSP",
180
+ "version": 46
181
+ },
182
+ {
183
+ "path": "maps/ut4_oildepot.bsp",
184
+ "magic": "IBSP",
185
+ "version": 46
186
+ },
187
+ {
188
+ "path": "maps/ut4_paris.bsp",
189
+ "magic": "IBSP",
190
+ "version": 46
191
+ },
192
+ {
193
+ "path": "maps/ut4_prague.bsp",
194
+ "magic": "IBSP",
195
+ "version": 46
196
+ },
197
+ {
198
+ "path": "maps/ut4_prominence.bsp",
199
+ "magic": "IBSP",
200
+ "version": 46
201
+ },
202
+ {
203
+ "path": "maps/ut4_raiders.bsp",
204
+ "magic": "IBSP",
205
+ "version": 46
206
+ },
207
+ {
208
+ "path": "maps/ut4_ramelle.bsp",
209
+ "magic": "IBSP",
210
+ "version": 46
211
+ },
212
+ {
213
+ "path": "maps/ut4_ricochet.bsp",
214
+ "magic": "IBSP",
215
+ "version": 46
216
+ },
217
+ {
218
+ "path": "maps/ut4_riyadh.bsp",
219
+ "magic": "IBSP",
220
+ "version": 46
221
+ },
222
+ {
223
+ "path": "maps/ut4_sanc.bsp",
224
+ "magic": "IBSP",
225
+ "version": 46
226
+ },
227
+ {
228
+ "path": "maps/ut4_suburbs.bsp",
229
+ "magic": "IBSP",
230
+ "version": 46
231
+ },
232
+ {
233
+ "path": "maps/ut4_subway.bsp",
234
+ "magic": "IBSP",
235
+ "version": 46
236
+ },
237
+ {
238
+ "path": "maps/ut4_swim.bsp",
239
+ "magic": "IBSP",
240
+ "version": 46
241
+ }
242
+ ],
243
+ "vm": [],
244
+ "crc_test": "passed"
245
+ },
246
+ {
247
+ "name": "zUrT43_004.pk3",
248
+ "bytes": 79753661,
249
+ "sha256": "7328ce8ec178147361681f0c0cebd6ee161f2a5930bf30535799414072c0ab0d",
250
+ "members": 443,
251
+ "uncompressed_bytes": 218260155,
252
+ "extensions": {
253
+ ".aas": 4,
254
+ ".bsp": 4,
255
+ ".jpeg": 1,
256
+ ".jpg": 229,
257
+ ".md3": 39,
258
+ ".rad": 4,
259
+ ".tga": 111,
260
+ ".txt": 51
261
+ },
262
+ "maps": [
263
+ {
264
+ "path": "maps/ut4_thingley.bsp",
265
+ "magic": "IBSP",
266
+ "version": 46
267
+ },
268
+ {
269
+ "path": "maps/ut4_tombs.bsp",
270
+ "magic": "IBSP",
271
+ "version": 46
272
+ },
273
+ {
274
+ "path": "maps/ut4_turnpike.bsp",
275
+ "magic": "IBSP",
276
+ "version": 46
277
+ },
278
+ {
279
+ "path": "maps/ut4_uptown.bsp",
280
+ "magic": "IBSP",
281
+ "version": 46
282
+ }
283
+ ],
284
+ "vm": [],
285
+ "crc_test": "passed"
286
+ },
287
+ {
288
+ "name": "zUrT43_005.pk3",
289
+ "bytes": 81670979,
290
+ "sha256": "0e6eea9ef827970ceebac5b29f1c7f3f8463bb590c77d381e79e3c96203adc96",
291
+ "members": 756,
292
+ "uncompressed_bytes": 168585944,
293
+ "extensions": {
294
+ ".cfg": 1,
295
+ ".db": 2,
296
+ ".jpg": 304,
297
+ ".md3": 20,
298
+ ".skin": 134,
299
+ ".tga": 261,
300
+ ".txt": 31,
301
+ ".wav": 3
302
+ },
303
+ "maps": [],
304
+ "vm": [],
305
+ "crc_test": "passed"
306
+ },
307
+ {
308
+ "name": "zUrT43_006.pk3",
309
+ "bytes": 66957810,
310
+ "sha256": "a23981396d329aea5cbd170451d27d7c577289912253e41d2b51ae62e926c497",
311
+ "members": 548,
312
+ "uncompressed_bytes": 138570159,
313
+ "extensions": {
314
+ ".jpg": 27,
315
+ ".md3": 277,
316
+ ".skin": 70,
317
+ ".tga": 174
318
+ },
319
+ "maps": [],
320
+ "vm": [],
321
+ "crc_test": "passed"
322
+ },
323
+ {
324
+ "name": "zUrT43_007.pk3",
325
+ "bytes": 79245011,
326
+ "sha256": "453ee8a8c1ce0020d859716d777828f758b3f48ed9933b7694cc05b042158bd2",
327
+ "members": 365,
328
+ "uncompressed_bytes": 168672526,
329
+ "extensions": {
330
+ ".cfg": 1,
331
+ ".jpg": 1,
332
+ ".md3": 22,
333
+ ".skin": 191,
334
+ ".tga": 150
335
+ },
336
+ "maps": [],
337
+ "vm": [],
338
+ "crc_test": "passed"
339
+ },
340
+ {
341
+ "name": "zUrT43_008.pk3",
342
+ "bytes": 70888281,
343
+ "sha256": "2a2b76fb725908a1924965a97878d4f7aa8529da1f5347a11441210c07331c40",
344
+ "members": 898,
345
+ "uncompressed_bytes": 173153240,
346
+ "extensions": {
347
+ ".arena": 33,
348
+ ".ase": 4,
349
+ ".cfg": 48,
350
+ ".crosshair": 1,
351
+ ".def": 1,
352
+ ".h": 1,
353
+ ".jpg": 81,
354
+ ".md3": 261,
355
+ ".shader": 207,
356
+ ".skin": 42,
357
+ ".tga": 94,
358
+ ".txt": 6,
359
+ ".voice": 1,
360
+ ".wav": 118
361
+ },
362
+ "maps": [],
363
+ "vm": [],
364
+ "crc_test": "passed"
365
+ },
366
+ {
367
+ "name": "zUrT43_009.pk3",
368
+ "bytes": 79055075,
369
+ "sha256": "86cb7d3a54818bd1b46ad340606c3863f4a8822129393b9e41b96c06cf85aaea",
370
+ "members": 429,
371
+ "uncompressed_bytes": 104681786,
372
+ "extensions": {
373
+ ".wav": 429
374
+ },
375
+ "maps": [],
376
+ "vm": [],
377
+ "crc_test": "passed"
378
+ },
379
+ {
380
+ "name": "zUrT43_010.pk3",
381
+ "bytes": 78055708,
382
+ "sha256": "c26465b66ac718eca1ca44b98bee7433d922c172ff1415cce3889a70fff7ffe2",
383
+ "members": 1320,
384
+ "uncompressed_bytes": 119475016,
385
+ "extensions": {
386
+ ".jpg": 728,
387
+ ".mp3": 1,
388
+ ".tga": 261,
389
+ ".wav": 330
390
+ },
391
+ "maps": [],
392
+ "vm": [],
393
+ "crc_test": "passed"
394
+ },
395
+ {
396
+ "name": "zUrT43_011.pk3",
397
+ "bytes": 83375098,
398
+ "sha256": "ab0e1309096868d62f670c0d912a84aba78e46b5b7f6bb1e1a85b9c2e2882798",
399
+ "members": 454,
400
+ "uncompressed_bytes": 176985923,
401
+ "extensions": {
402
+ ".jpg": 157,
403
+ ".tga": 297
404
+ },
405
+ "maps": [],
406
+ "vm": [],
407
+ "crc_test": "passed"
408
+ },
409
+ {
410
+ "name": "zUrT43_012.pk3",
411
+ "bytes": 81522127,
412
+ "sha256": "aa9f79397254391f3b527d200c0f9e5abbbd88534a7bbee885a600e1a16fd4c7",
413
+ "members": 252,
414
+ "uncompressed_bytes": 181429550,
415
+ "extensions": {
416
+ "(none)": 2,
417
+ ".jpg": 80,
418
+ ".tga": 170
419
+ },
420
+ "maps": [],
421
+ "vm": [],
422
+ "crc_test": "passed"
423
+ },
424
+ {
425
+ "name": "zUrT43_013.pk3",
426
+ "bytes": 77745672,
427
+ "sha256": "8a9cd13036253673604ee4611314e1cefb92b7a205ed05b2f3bac0a0365d56f9",
428
+ "members": 345,
429
+ "uncompressed_bytes": 116378042,
430
+ "extensions": {
431
+ ".jpg": 124,
432
+ ".tga": 221
433
+ },
434
+ "maps": [],
435
+ "vm": [],
436
+ "crc_test": "passed"
437
+ },
438
+ {
439
+ "name": "zUrT43_014.pk3",
440
+ "bytes": 87697729,
441
+ "sha256": "d77c7a5bfd0d907bb5c9e016c90c08dbf8a8a634d5b5af12d43e1950eb816b27",
442
+ "members": 499,
443
+ "uncompressed_bytes": 162905568,
444
+ "extensions": {
445
+ ".jpg": 168,
446
+ ".tga": 331
447
+ },
448
+ "maps": [],
449
+ "vm": [],
450
+ "crc_test": "passed"
451
+ },
452
+ {
453
+ "name": "zUrT43_015.pk3",
454
+ "bytes": 79575542,
455
+ "sha256": "1a367675b55f8a9606c51c89730181f33df66da66e4e2754f9d49ca2a286833c",
456
+ "members": 57,
457
+ "uncompressed_bytes": 129993325,
458
+ "extensions": {
459
+ ".tga": 57
460
+ },
461
+ "maps": [],
462
+ "vm": [],
463
+ "crc_test": "passed"
464
+ },
465
+ {
466
+ "name": "zUrT43_016.pk3",
467
+ "bytes": 95695538,
468
+ "sha256": "9e7bfab3bc2238c69a2830a409865e2ca1c38ef9bbe71d84d3d704047dd89c42",
469
+ "members": 455,
470
+ "uncompressed_bytes": 162520234,
471
+ "extensions": {
472
+ ".gif": 1,
473
+ ".jpg": 178,
474
+ ".tga": 276
475
+ },
476
+ "maps": [],
477
+ "vm": [],
478
+ "crc_test": "passed"
479
+ },
480
+ {
481
+ "name": "zUrT43_017.pk3",
482
+ "bytes": 81088755,
483
+ "sha256": "d5a65ce2c6e4baafbcf3bd3b01a61d1cc22968ccee8b4d2b0f98e78650718bb7",
484
+ "members": 695,
485
+ "uncompressed_bytes": 150711787,
486
+ "extensions": {
487
+ ".jpg": 427,
488
+ ".tga": 268
489
+ },
490
+ "maps": [],
491
+ "vm": [],
492
+ "crc_test": "passed"
493
+ },
494
+ {
495
+ "name": "zUrT43_018.pk3",
496
+ "bytes": 76060663,
497
+ "sha256": "bc33438109873ea64d71b03ef635af886b5085e29f5e98cf6094a8331070f97a",
498
+ "members": 775,
499
+ "uncompressed_bytes": 122948669,
500
+ "extensions": {
501
+ ".jpg": 479,
502
+ ".tga": 296
503
+ },
504
+ "maps": [],
505
+ "vm": [],
506
+ "crc_test": "passed"
507
+ },
508
+ {
509
+ "name": "zUrT43_019.pk3",
510
+ "bytes": 46012128,
511
+ "sha256": "3c114bb065aba7cd107b07ca70c0f48220105d08642be19f9972268f818b644e",
512
+ "members": 328,
513
+ "uncompressed_bytes": 78911406,
514
+ "extensions": {
515
+ ".db": 1,
516
+ ".jpg": 163,
517
+ ".roq": 1,
518
+ ".tga": 162,
519
+ ".txt": 1
520
+ },
521
+ "maps": [],
522
+ "vm": [],
523
+ "crc_test": "passed"
524
+ },
525
+ {
526
+ "name": "zUrT43_020.pk3",
527
+ "bytes": 4587832,
528
+ "sha256": "9ab73efd541ca2b6305cb5c16c663f689b74d42308633127e1f54e8e1839c1a8",
529
+ "members": 278,
530
+ "uncompressed_bytes": 14289349,
531
+ "extensions": {
532
+ ".aas": 2,
533
+ ".bot": 14,
534
+ ".c": 93,
535
+ ".cfg": 1,
536
+ ".h": 2,
537
+ ".jpg": 8,
538
+ ".menu": 51,
539
+ ".shader": 1,
540
+ ".tga": 98,
541
+ ".txt": 6,
542
+ ".wav": 2
543
+ },
544
+ "maps": [],
545
+ "vm": [],
546
+ "crc_test": "passed"
547
+ },
548
+ {
549
+ "name": "zUrT43_021.pk3",
550
+ "bytes": 7506845,
551
+ "sha256": "1b5fd056486b3844f6bc89fd805425fb0fc430d26742aa1bca5824a466ac106b",
552
+ "members": 68,
553
+ "uncompressed_bytes": 19770763,
554
+ "extensions": {
555
+ ".aas": 1,
556
+ ".arena": 33,
557
+ ".bsp": 1,
558
+ ".cfg": 1,
559
+ ".jpg": 4,
560
+ ".shader": 1,
561
+ ".tga": 2,
562
+ ".wav": 25
563
+ },
564
+ "maps": [
565
+ {
566
+ "path": "maps/ut4_paris.bsp",
567
+ "magic": "IBSP",
568
+ "version": 46
569
+ }
570
+ ],
571
+ "vm": [],
572
+ "crc_test": "passed"
573
+ },
574
+ {
575
+ "name": "zUrT43_qvm.pk3",
576
+ "bytes": 565005,
577
+ "sha256": "b59bf0c5bedf11d50e0edd220da7eade96de40601e98ae14c54c819047df0796",
578
+ "members": 3,
579
+ "uncompressed_bytes": 2230692,
580
+ "extensions": {
581
+ ".qvm": 3
582
+ },
583
+ "maps": [],
584
+ "vm": [
585
+ {
586
+ "path": "vm/cgame.qvm",
587
+ "header": [
588
+ 309466180,
589
+ 258563,
590
+ 32,
591
+ 759988,
592
+ 760020,
593
+ 62940,
594
+ 57304,
595
+ 37935304
596
+ ],
597
+ "size": 880264,
598
+ "sha256": "afb9f76b720b103232e39e0250a2af7977bd084de607ad3073db6de00a171583"
599
+ },
600
+ {
601
+ "path": "vm/qagame.qvm",
602
+ "header": [
603
+ 309466180,
604
+ 298900,
605
+ 32,
606
+ 885716,
607
+ 885748,
608
+ 33364,
609
+ 64188,
610
+ 36445748
611
+ ],
612
+ "size": 983300,
613
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d"
614
+ },
615
+ {
616
+ "path": "vm/ui.qvm",
617
+ "header": [
618
+ 309466180,
619
+ 101585,
620
+ 32,
621
+ 303832,
622
+ 303864,
623
+ 31072,
624
+ 32192,
625
+ 9099016
626
+ ],
627
+ "size": 367128,
628
+ "sha256": "111eba50fc52a7d26e7e04e019b8698c5a6fe7ba3d9d1a92487486f08fd4424b"
629
+ }
630
+ ],
631
+ "crc_test": "passed"
632
+ }
633
+ ],
634
+ "files": [
635
+ {
636
+ "path": "Quake3-UrT-Ded.exe",
637
+ "bytes": 1082800,
638
+ "sha256": "808369f9b16054e0408e91bdf15f56098fac78279e4a092c95a24d943381352b"
639
+ },
640
+ {
641
+ "path": "Quake3-UrT-Ded.i386",
642
+ "bytes": 816002,
643
+ "sha256": "1df65484c6b0563663ca84ba4dc86827dd58ab1477b01a2ee3d1097c95d498d1"
644
+ },
645
+ {
646
+ "path": "Quake3-UrT-Ded.x86_64",
647
+ "bytes": 961958,
648
+ "sha256": "5dc5f5fbf0f106af6df82cd6ce65987bc6ddff18400f1cd0cb8ac1126ee357cb"
649
+ },
650
+ {
651
+ "path": "Quake3-UrT.app/Contents/Info.plist",
652
+ "bytes": 1051,
653
+ "sha256": "59903448d513c40716be16e1a230a4b5259c7ac01d3f2a5d1bcf814cd8474d5c"
654
+ },
655
+ {
656
+ "path": "Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64",
657
+ "bytes": 1713680,
658
+ "sha256": "cb5e347d57124e317d3e15c0faebaabb98b314d2d3b7fa297f8639b6c69d182e"
659
+ },
660
+ {
661
+ "path": "Quake3-UrT.app/Contents/MacOS/libSDL-1.2.0.dylib",
662
+ "bytes": 605880,
663
+ "sha256": "3ac6586e95b5df202d8aa61689948b6fba9dc40e4cdc92269293dd6e77c2a5ef"
664
+ },
665
+ {
666
+ "path": "Quake3-UrT.app/Contents/PkgInfo",
667
+ "bytes": 10,
668
+ "sha256": "12f0527587ca71a1582a832c6503f705cc99a6c91b092d1b36562001547b89b0"
669
+ },
670
+ {
671
+ "path": "Quake3-UrT.app/Contents/Resources/quake3-urt.icns",
672
+ "bytes": 167703,
673
+ "sha256": "b4983991ca687b93e4aca8fdfa8a10e2d9a79fa40d1c33d45e63bd0de5a014e3"
674
+ },
675
+ {
676
+ "path": "Quake3-UrT.exe",
677
+ "bytes": 2634689,
678
+ "sha256": "94111a3091c7e70e534720585df58820f0481c0894ba7b29f4f7de09accbaf90"
679
+ },
680
+ {
681
+ "path": "Quake3-UrT.i386",
682
+ "bytes": 1702624,
683
+ "sha256": "fe5bfb198984a699d46e54203c18a48cd0b2cd042fb97cf79e89ae64c0aca1cf"
684
+ },
685
+ {
686
+ "path": "Quake3-UrT.x86_64",
687
+ "bytes": 1940280,
688
+ "sha256": "31a21e05251f4126b234dd5c4ce2612cd5332d502f35bab1dbde4cb288babd3a"
689
+ },
690
+ {
691
+ "path": "q3ut4/QIIIA_Game_Source_License.doc",
692
+ "bytes": 34304,
693
+ "sha256": "6b03b136e57580d8a7a796c2733a0172535c8e2047fba47fb4867040b9059282"
694
+ },
695
+ {
696
+ "path": "q3ut4/autoexec_example.cfg",
697
+ "bytes": 279,
698
+ "sha256": "4359bd566feefc293e15b8af2fa35a1520721be8612bc986ceaa97a7678bca6c"
699
+ },
700
+ {
701
+ "path": "q3ut4/mapcycle_example.txt",
702
+ "bytes": 406,
703
+ "sha256": "84e38063adb51faeb6d05fa12a9089aae0c76f8215b67f02eb4e75156a3ec36a"
704
+ },
705
+ {
706
+ "path": "q3ut4/readme43.txt",
707
+ "bytes": 100768,
708
+ "sha256": "fff86dd673a5479f35a87f7680218354fb7dd6b7092affb61eeac2435d77c398"
709
+ },
710
+ {
711
+ "path": "q3ut4/server_example.cfg",
712
+ "bytes": 26071,
713
+ "sha256": "608d9c858b2c3335a155cbb74b7cdfc510a2aacbbed09ffa5ee2d5650748a593"
714
+ },
715
+ {
716
+ "path": "q3ut4/ut4_jumpents.pk3",
717
+ "bytes": 128107,
718
+ "sha256": "6c90530e6bf2564c748fbcfd1942d510dcfb461c38de743dd5df5b1bcf5ed17d"
719
+ },
720
+ {
721
+ "path": "q3ut4/zUrT43_001.pk3",
722
+ "bytes": 77799633,
723
+ "sha256": "6c094afe9effcfa55af6b950f9b4d764d350b85a40f39b73567ee08a7c737c91"
724
+ },
725
+ {
726
+ "path": "q3ut4/zUrT43_002.pk3",
727
+ "bytes": 73378053,
728
+ "sha256": "9270b41b6a7f011eb6ec61e7a9fcffcd21e05490419043f164347f7fec0688d4"
729
+ },
730
+ {
731
+ "path": "q3ut4/zUrT43_003.pk3",
732
+ "bytes": 67657413,
733
+ "sha256": "300f0029c9f04fa3100efad69c7814f4d9c925d7e38bd2a2f703fc8504cfce40"
734
+ },
735
+ {
736
+ "path": "q3ut4/zUrT43_004.pk3",
737
+ "bytes": 79753661,
738
+ "sha256": "7328ce8ec178147361681f0c0cebd6ee161f2a5930bf30535799414072c0ab0d"
739
+ },
740
+ {
741
+ "path": "q3ut4/zUrT43_005.pk3",
742
+ "bytes": 81670979,
743
+ "sha256": "0e6eea9ef827970ceebac5b29f1c7f3f8463bb590c77d381e79e3c96203adc96"
744
+ },
745
+ {
746
+ "path": "q3ut4/zUrT43_006.pk3",
747
+ "bytes": 66957810,
748
+ "sha256": "a23981396d329aea5cbd170451d27d7c577289912253e41d2b51ae62e926c497"
749
+ },
750
+ {
751
+ "path": "q3ut4/zUrT43_007.pk3",
752
+ "bytes": 79245011,
753
+ "sha256": "453ee8a8c1ce0020d859716d777828f758b3f48ed9933b7694cc05b042158bd2"
754
+ },
755
+ {
756
+ "path": "q3ut4/zUrT43_008.pk3",
757
+ "bytes": 70888281,
758
+ "sha256": "2a2b76fb725908a1924965a97878d4f7aa8529da1f5347a11441210c07331c40"
759
+ },
760
+ {
761
+ "path": "q3ut4/zUrT43_009.pk3",
762
+ "bytes": 79055075,
763
+ "sha256": "86cb7d3a54818bd1b46ad340606c3863f4a8822129393b9e41b96c06cf85aaea"
764
+ },
765
+ {
766
+ "path": "q3ut4/zUrT43_010.pk3",
767
+ "bytes": 78055708,
768
+ "sha256": "c26465b66ac718eca1ca44b98bee7433d922c172ff1415cce3889a70fff7ffe2"
769
+ },
770
+ {
771
+ "path": "q3ut4/zUrT43_011.pk3",
772
+ "bytes": 83375098,
773
+ "sha256": "ab0e1309096868d62f670c0d912a84aba78e46b5b7f6bb1e1a85b9c2e2882798"
774
+ },
775
+ {
776
+ "path": "q3ut4/zUrT43_012.pk3",
777
+ "bytes": 81522127,
778
+ "sha256": "aa9f79397254391f3b527d200c0f9e5abbbd88534a7bbee885a600e1a16fd4c7"
779
+ },
780
+ {
781
+ "path": "q3ut4/zUrT43_013.pk3",
782
+ "bytes": 77745672,
783
+ "sha256": "8a9cd13036253673604ee4611314e1cefb92b7a205ed05b2f3bac0a0365d56f9"
784
+ },
785
+ {
786
+ "path": "q3ut4/zUrT43_014.pk3",
787
+ "bytes": 87697729,
788
+ "sha256": "d77c7a5bfd0d907bb5c9e016c90c08dbf8a8a634d5b5af12d43e1950eb816b27"
789
+ },
790
+ {
791
+ "path": "q3ut4/zUrT43_015.pk3",
792
+ "bytes": 79575542,
793
+ "sha256": "1a367675b55f8a9606c51c89730181f33df66da66e4e2754f9d49ca2a286833c"
794
+ },
795
+ {
796
+ "path": "q3ut4/zUrT43_016.pk3",
797
+ "bytes": 95695538,
798
+ "sha256": "9e7bfab3bc2238c69a2830a409865e2ca1c38ef9bbe71d84d3d704047dd89c42"
799
+ },
800
+ {
801
+ "path": "q3ut4/zUrT43_017.pk3",
802
+ "bytes": 81088755,
803
+ "sha256": "d5a65ce2c6e4baafbcf3bd3b01a61d1cc22968ccee8b4d2b0f98e78650718bb7"
804
+ },
805
+ {
806
+ "path": "q3ut4/zUrT43_018.pk3",
807
+ "bytes": 76060663,
808
+ "sha256": "bc33438109873ea64d71b03ef635af886b5085e29f5e98cf6094a8331070f97a"
809
+ },
810
+ {
811
+ "path": "q3ut4/zUrT43_019.pk3",
812
+ "bytes": 46012128,
813
+ "sha256": "3c114bb065aba7cd107b07ca70c0f48220105d08642be19f9972268f818b644e"
814
+ },
815
+ {
816
+ "path": "q3ut4/zUrT43_020.pk3",
817
+ "bytes": 4587832,
818
+ "sha256": "9ab73efd541ca2b6305cb5c16c663f689b74d42308633127e1f54e8e1839c1a8"
819
+ },
820
+ {
821
+ "path": "q3ut4/zUrT43_021.pk3",
822
+ "bytes": 7506845,
823
+ "sha256": "1b5fd056486b3844f6bc89fd805425fb0fc430d26742aa1bca5824a466ac106b"
824
+ },
825
+ {
826
+ "path": "q3ut4/zUrT43_qvm.pk3",
827
+ "bytes": 565005,
828
+ "sha256": "b59bf0c5bedf11d50e0edd220da7eade96de40601e98ae14c54c819047df0796"
829
+ }
830
+ ]
831
+ }