Earthsiege 1 research - working record
Current status: audio and documentation checkpoint complete; ready for the Earthsiege 2 fork. See ANALYSIS_STATUS.md for the consolidated remaining work. Historical progress entries below are not a completion checklist.
This analysis tree is deliberately uncommitted pending manual review. Resource extraction and the inspectable browsers were established first; the native game in ../earthsiege-cpp now has complete-recording and component comparisons, with findings added back to this research. Work pauses at the user-requested audio/documentation checkpoint for the Earthsiege 2 fork. Further Earthsiege 1 gameplay coverage resumes afterwards. The parallel TFX projects remain separate.
Original installation and source
The supplied install media/Earthsiege.iso contains Metaltech: Earthsiege 1.0, dated 1994-10-25. Later INN material indicates reauthoring; this is not proof of a pristine first pressing. The original Sierra installer completed a full installation in installs/cd_1994_10/SIERRA/MTECH. Run ./run_earthsiege_dosbox.sh; SB16 digital and FM audio are configured. The launcher changes no system-wide DOSBox settings.
Original payloads and metadata are in extracted/cd_1994_10, analysis/media-manifest.json and analysis/volumes.json. Private reference sessions use virtual displays, never the user's desktop input. The screenshot named dosbox-original-instant-action.png shows the pause panel in the cockpit, not a mission briefing.
Current inspection coverage
Open analysis/index.html directly, or serve analysis using the README command. Both direct-file and HTTP loading are tested. Classic-script transports carry canonical JSON and original indexed pixels, avoiding local-file fetch restrictions and tainted palette canvases. All fourteen browser pages pass tools/browser_check.py --file; HTTP is also checked. Fonts have editable native-colour samples, original sheets, and TTF/WOFF2 exports.
- Seven VOLs, 2,484 retained resources, hashes and directory metadata.
- 44 model files, 401 roots and 47,575 nested objects. Geometry, material slots, BSP nodes, animation tables and 140 collision heightfields match original readers. Every retained tagged object consumes its declared body.
- Original model math now feeds the viewer: 2,141 Euler/point/vector/plane cases, 2,048 composition/interpolation cases and 116 default articulated instances agree with original code. Cosine data preserves four one-unit deviations from rounded mathematical cosine.
- Cell instances start at zero, as the original resource reader and constructor require; stored cell-frame counts describe cycle lengths. Modulo cell selection is respected. The viewer exposes individual cell sequences and pose blending. Billboards use original bitmaps, radius and anchor offsets. Depth-buffer inspection and gameplay-driven playback rates remain distinct from native rendering; light setup and integer intensity calculation now have original-code checks. Starting mission loadouts are assembled for all eight player chassis, replacing flat mount placeholders with original weapon models. All 32 external weapon constructions and 6,439 translated vertex references agree with original code; 45 total mount records also include empty/internal slots. Bare-chassis mode remains available. Both MECHWPNS and MECHWPN2 use the weapon texture bank. Torso/elevation aim layers now have original comparisons; damaged attachment states and weapon discharge now have original-code captures and native C++ consumers, as described below.
- 407 artwork resources / 4,578 frames, 55 palettes, 30 fonts. Export paths retain extensions: earlier same-stem DBM/DBA paths could overwrite one another's frame zero; regenerated exports fix this collision.
- 377 digital clips as maximum-compression FLAC, default 11,025 Hz confirmed in native sound code. Effects may vary pitch.
- 20 HMP songs, three AdLib banks, 19 native percussion patches and 185 archived hardware drivers. Auditions now include the original OPL2/OPL3 drivers and PCM MIDI commands as well as the earlier GM soundfont version. Host chip/sample mixing remains explicitly bounded; see MUSIC.md.
- 123 complete TTM programs, 718 portrait timelines, 1,471 DFL frames. All 885 custom video deltas match PLAYFLIC. Cinematic sound offsets and the launcher's 83 ms frame timing are accounted for.
- 77 source missions, 75 accepted by the current original reader. Source variants, late binding, merges and all nine compiled tables have 300 original captures under four explicit campaign/RNG fixtures, including final generator state. Zero flags are an inspection fixture, not an assumed initial campaign.
- All 79 ENG files decode completely; 2,223 briefing/debrief results match the original interpreter before font-dependent wrapping. The mission browser exposes selected text and every conditional alternative.
- 106 scenery placement files / 5,129 instances, 24 world descriptors; mission header controls terrain/palette selection. Mission sources, compiled starting states and scenery remain distinct.
- Chassis, weapons, projectile tail, damage, collision and mounts have inspectors. 195 interface metadata files and 155 additional tables are catalogued, with partial field semantics labelled.
- Four original TAP recordings / 9,300 frames match native playback, including every recorded mouse event. Embedded files are SCRIPT, PLAYER, MISSION.VAR, PREFS, RESTORE, OBJECT.STR, KEYJOY; KEYJOY is empty. Nominal replay timing is characterized; full simulation replay determinism remains to be established.
Analysis status and remaining work
The extraction inventory and browsers cover every identified resource family. All 2,484 VOL members are classified: 2,298 decoded layouts, 182 with provisional/legacy semantics, three layout exceptions and one unclassified 58-byte TEST.DAT. Unknown semantics remain labelled; they are not treated as blockers or filled with guesses.
The previously listed model lighting, ordinary queued transitions/reverse playback, starting weapon assembly, cockpit artwork, executable survey and actor placement are now complete at their documented comparison boundaries. Fourteen browser pages pass direct-file and HTTP checks. All 300 compiled mission variants construct successfully: 8,048 actors and 4,315 groups. Four recorded starting worlds add 128 actors. Eighty-nine compiled-fixture positions involve the original unchecked negative formation index and are explicitly annotated as allocation-dependent.
Remaining research and integration concern running behavior: individual combat/navigation controller bodies and full effect integration; complete moving-projectile interaction; interactive shell debrief presentation; live widgets and full input/UI integration. Original native model/scenery rasterization and lighting now have complete-frame comparisons, documented below. Component damage, salvage, campaign branches and save formats now have comparisons below. Spatial activation and objective decisions now have separate original-code comparisons (MISSION_RUNTIME.md). Full TAP replay is not yet established. These are concrete remaining consumers, not evidence that resource extraction has stopped or that a user review is required.
At this historical checkpoint, C++ work was paused for the analysis completion audit. Its inspection window renders original starting worlds with moving, articulated HERCs; already verified combat subsystems are partly connected. It is not yet a playable full game. The historical entries below record the sequence of discoveries; later entries supersede their earlier implementation boundaries.
Layout exceptions remain preserved: B0_C1_20.MSN, B0_C1_30.MSN and HOVTANK.DMG. They mismatch the current original readers. The two missions are absent from supplied campaign/single-mission filename tables; HOVTANK appears in FLYERS.NAM but lacks a chassis DAT. These facts do not alone prove that every possible runtime path is unreachable.
Lower-detail HERC roots share the full-detail animation instance. The original remaps their node indices through profile part IDs (0x19ba0 / 0x19ac4). All 16 binding sets agree with original execution. The raw stored roots remain separately inspectable. BULLDOG root 5's unwritten isolated transform slots are resolved by this runtime sharing/remapping, rather than invented hierarchy relations.
Original-code tooling
.venv supplies Unicorn, Capstone and pycdlib. tools/native_reference.py executes isolated original routines with explicit host heap/file/input boundaries; it is not a proposed game implementation. GO/DBSIM flat images start at file offset 0x48fd, PLAYFLIC at 0x47f2, ESCD at 0x4831.
Ghidra 12.2 is under /tmp/lost-engines-tools/ghidra_12.2_PUBLIC; project work/research/executable/ghidra/earthsiege. Both GO and DBSIM have ENTER-function recovery. Heuristic function counts are not verified real function totals. RepairAllocationFlow removes false allocator CALL_RETURN overrides. Virtual entries may point to alignment NOPs or intentional no-op render methods. Verify disassembly when decompiled stacks or computed switches are wrong.
Packed-2 C++ classes/vtables and C++ source paths are established. Exact compiler/version remains provisional. The internal -eggplant launch flag is not established as a gameplay cheat. Earthsiege 2 is background evidence only; its vtable slots, tape layout and rendering details differ.
Historical checkpoint: native implementation deferred for analysis
At this checkpoint, ../earthsiege-cpp had incremental, tested commits through 38d37f8 (VOL/artwork/menu, RNG, source/compiled missions, mission text, typed models, fixed math and BSP/detail/cell selection). Eight comparison suites pass. It currently displays the original main menu; gameplay actions are not integrated. This is not a playable reconstruction.
The animation-instance work was preserved in the C++ stash named Park animation instance work while completing analysis first. It has since been restored, corrected and superseded by committed implementation. Do not reapply that historical stash. Research changes remain uncommitted.
Latest viewer validation
The model browser now supports direct file opening, original starting loadouts, full-detail selection, authored-duration playback and exact fixed-point pose blending. tools/check_model_geometry.js checks all 401 roots and 2,137 pose samples, including authored lines, points and billboard nodes. tools/check_model_math.js also checks 16,850 original forward channel updates. Both HTTP and direct-file browser checks now include the coverage index and fonts. The executable survey adds source-path and direct-reference browsing (work/research/executable/).
Viewer corrections and verified bindings
The original resource reader 0x65d04 reads the stored cell frame counts into shape+0x20 and separately zeroes shape+0x1c. Instance constructors 0x63080 / 0x61224 copy that zero array. Earlier exports called the counts sequence_indices and briefly treated them as initial defaults; these are now cell_frame_counts, and default-state checks compare captured native cells as well as matrices. All 401 resource roots' 1,259 default cell slots are independently checked. The then-parked C++ field named initial_cell_frames subsequently received the same correction when implementation resumed.
Texture bindings now cover every model resource explicitly, with unbound resources clearing stale textures. Explosion roots use EXPLO0–EXPLO8 according to EXPLOS.DAT; smoke, bullets, weapons, scenery and SKIMMER have their native banks. Original effect/bullet loaders execute against the read-only multi-stream VFS in tools/native_files.py; all 34 explosion/bullet/smoke root bindings agree. Host boundaries are file I/O, allocation arenas and the unrelated object-pool bootstrap, not model readers or binding logic.
Internal weapon mounts (orientation >= 4) do not replace chassis geometry. Original 0xbefc exports -1 for those IDs. All eight starting loadouts are checked against that filter, in addition to 32 external templates/offsets. Incorrectly hiding every mount ID removed parts of the head/body and left weapons apparently floating. The corrected viewer preserves those internal chassis parts. Cropped model screenshots are work/research/models/model.png and file-model.png; full pages are browser.png and file-browser.png.
Compiled mission inspection now selects any of the four captured fixtures and overlays typed HERC/flyer/ground-object reference positions, routes, groups and area anchors. The compiler-reference overlay remains available; the constructed-actor overlay added later uses original formation placement, before activation or movement. tools/build_mission_views.py retains original indices and neutral fields for unproven semantics.
Additional native runtime inspection
tools/check_world_handoff.py now executes DBSIM 0x1d850 through preload planning for all 300 compiled mission fixtures and the four recorded demos. The independent reader agrees on variable player rosters, all condition arrays, 17 flags, 100 counters, points and heading conversion. The original resets counter 7 after loading MISSION.VAR. Source HERC/flyer/ground rosters are compacted to live slots according to group references; group zero is reserved for the player's separately appended roster. These are resource-reference maps, not activation masks. Native preload requests and all slot maps match independently derived plans. No actor constructors or movement/formation updates are claimed by these probes. Compiled fixtures explicitly use the DEMO1 player/counter state; recorded tapes use their own state.
The demo browser exposes complete PLAYER.MEC, RESTORE.DAT paths, preferences, counters and objective strings. PLAYER records are variable length on disk and expand to 126-byte in-memory records. RESTORE is mixed shorts and counted paths, not a 21-short table. Preference field meanings remain under investigation.
Weapon construction now uses GL byte 23 to select the equipment slot. Mount-table order is generally a permutation and must not be zipped directly with the roster. tools/check_assemblies.py executes native weapon loaders and constructors for every starting loadout, then checks template selection, shifted drawable vertices, cell initialization, external-only replacement IDs and skeletal node binding. All 32 external weapons and 6,439 vertex references agree. This supersedes the earlier offset-only checks.
work/research/cockpits/ reconstructs original static forward/lower/side panels and their combined layout, with optional scene masks and weapon-display bounds. All 24 unique cockpit bitmaps match original decoded pixels byte-for-byte. Native controller selection confirms the shared side panel and mirror flag for the left view. Panel origins come from VUE records; the lower panel begins at the authored offset (often y=197), rather than an assumed y=200. Live widgets, palette animation and transitions remain separate work.
Model inspectors now link to definitions and source actors referenced by compiled mission groups under all four fixtures. Constant player-roster additions are excluded from mission-use associations. Browser navigation uses explicit index.html paths so links work when opened from disk. Model roots and compiled fixtures support direct links.
Palette shading and native audio follow-up
The direct-file model bug and same-name bitmap-export collisions are fixed. All fourteen pages pass both direct-file and HTTP checks. Errors now appear visibly rather than leaving an unexplained empty canvas.
Original flat-shaded ramp selection uses floor(intensity * ramp_length / 256), rather than scaling by ramp_length - 1. The material checks execute 32,256 original ramp lookups across 18 palettes and retain 144 original texture-lighting maps. The preview applies those maps to textures, and authored Gouraud polygons now interpolate palette indices from their stored vertex normals. The invented inspection light has since been replaced by verified original light setup and intensity rules (see LIGHTING.md). Depth-buffer triangle rasterization and the lack of exact native line outlines remain preview differences; this does not establish a pixel-perfect game renderer.
Cockpit palette assembly patches two 16-colour ranges from COCKPIT.DPL (32–47 and 64–79) into the world palette, then applies the chassis highlight at index 64. Native helpers verify this; browser canvas hashes match all four native-derived HERCULES reference views. Primary effect timing has 126 original traces / 3,046 matched updates, with selected nominal simulation steps exposed in the model viewer.
Music checks cover all 103,958 event deltas, 80 initialization/routing fixtures and 169,947 original scheduler packets. The timer field is 120 Hz, not an established BPM. A003 is the built-in callback bridge; A005 is digital percussion. New FM auditions run unchanged channel/gain allocation, the archived OPL2/OPL3 driver and built-in PCM MIDI voice rules, with maximum-compression FLACs for every resource. Hardware/sample boundaries and remaining mix approximations are documented in MUSIC.md. Nuked OPL3 is separately attributed and licensed. At that historical checkpoint, game implementation had not yet resumed; the later resumption and integration entries supersede this status.
Runtime entry points and frame ordering are mapped in RUNTIME.md. Native time-helper checks now cover 71 frame-ratio cases and 290 signed scale cases, with all 9,300 recorded ratios characterized. The tape browser shows nominal simulation duration rather than leaving its delta unit unexplained. Full replay determinism and per-controller ordering remain research.
Continued analysis after the browser correction
The browser fix was not an analysis completion checkpoint. At that stage C++ was deliberately deferred while analysis continued; it has since resumed, as recorded below. Native lighting probes now cover 16,896 intensity results (model, terrain and unoriented consumers), 512 object-space light transforms, and original capacity/duplicate/removal rules. The viewer uses the original default directional light [-1099, -984, -1421], intensity 256, rather than a guessed light vector or brightness curve. Front/back faces evaluate their own normals; back-face intensity is not assumed to be 1 - front. The full-bright selector is explicitly an inspection aid.
Queued articulated transitions and reverse playback now have 98,505 matched original channel/root-motion states. Another 5,120 captured poses and hierarchical transforms match the viewer. The browser exposes transition requests and stop-on-arrival alongside direct sequence inspection; ANIMATION.md records the tested scope and remaining gameplay rate/selection work.
Original world loading now runs through actor construction and group assignment. The four recorded demos' 128 actors match independent formation, heading and equipment reconstruction. All phase-2 subsystem initializers run, including effects needed by initially damaged actors. All 300 compiled mission constructions now agree with the same independent reader at the defined boundary. ACTORS.md records this boundary and two discovered original edge cases: overlapping group references and negative formation indices that read before their table. Constructed positions and native demo actor tables are now inspectable in the browsers.
Normal locomotion and aiming
All eight playable starting loadouts now have independent original-controller comparisons for unobstructed movement: 11,520 updates across four input sequences and three frame ratios. Position, heading and animation state match, including root-motion rebasing and per-update steering/rate acceleration. The model browser exposes these four examples.
Torso yaw and weapon elevation add 13,440 acceleration/limit cases across all sixteen chassis profiles, plus 800 original combined walking/aiming poses and matrices. The viewer uses the original phase mapping, stable channel priority order and constructor-modified start/stop priorities. The definitions browser names the verified profile fields with disk offsets. LOCOMOTION.md records the precise boundary; collision, damage, weapon convergence and full replay remain distinct work.
Damage and projectile collision primitives
DAMAGE.md connects the stored definitions to original component damage and hit volumes. Across eight playable loadouts, 5,106 updates match independent armor/internal damage, detachment cascades, model cells, actor consequence flags and disabled weapons. Another 180 short-width accumulator cases and 6,608 ray-volume/shield checks pass. The browser exposes captured post-impact states with correctly removed weapons. Effect code runs unchanged; recorded component-choice draws delimit the independent comparison because visual effects also consume the shared generator. Moving-actor collision and full projectile/AI updates remain separate work.
Dynamic lighting selection now also has 456 original comparisons, covering object-dependent directional/point choice, attenuation, cutoff, allocation reuse and the twenty-source/ten-active-light limits. The original renderer itself approximates sufficiently distant effect lights as directional for an individual object; LIGHTING.md distinguishes that native behavior from remaining preview rasterization differences.
Campaign and return-state verification
CAMPAIGN.md now separates the simulation HUD outcome from the exported result grade. The original campaign graph and all stored mission ordering are inspectable in the mission browser. Comparisons cover 16,000 result decisions, 396 transitions/selections, 140 branch thresholds, 5,114 return-condition/salvage states, four complete career save/read fixtures (164 state blocks and inventories), and both real starting hangars. NativeShell confines every write/delete/rename to memory.
Two original details require preservation or an explicit safe boundary: the armory's stack loader reverses inventory order, and return-condition export processes an unused tenth equipment slot beyond the nine allocated slots. The last return word is allocation-dependent; probes label their neighboring-memory canaries rather than inventing game data. The subsequent whole shell return, repair and replacement checks are recorded below. Interactive screen presentation remains separate. No C++ work has resumed yet.
Weapon controls and power allocation
WEAPONS.md records 8,177 readiness/control cases, 5,186 shield/capacitor allocation cases and 192 projectile flight traces with 12,141 independently matched updates. Charging, shield transfer, projectile age and some animation clocks are per-update operations; movement/refire use the recorded frame ratio. Manual missile guidance release changes subtype and clears the target. The dormant grenade spawn method is a no-op; data presence alone must not imply a working weapon. Full moving collisions and combat dispatch remain separate work.
Initialized runtime, perception and native scene captures
A private paused DOSBox mission now supplies a correctly unpaged application snapshot and separately verified VGA backing memory. Code signatures alone do not provide a valid constant base for globals: DOSX page tables are now reconstructed and checked against 156 executable pages. REFERENCE_CAPTURE.md records the complete boundary and provenance.
Whole-frame ordering has 7,200 matched native frames across idle, movement, pause, activated-enemy, firing and collision fixtures. Original phase-5 callbacks are essential: they remove deferred projectile/effect deletions before the next update. The comparison independently assembles the dispatch order while retaining original controllers; it does not claim independent AI/physics. PERCEPTION.md records another 1,110 independent recognition/contact-sharing/cache cases, including the original asymmetric cache timer ownership.
The original renderer and cockpit presentation now execute against a bounded VGA adapter. Video-memory recovery matches the paused DOSBox screenshot at every pixel. A newly presented scene matches 63,976 of the previous complete frame's 64,000 pixels, with all 24 cursor/live-readout differences retained in the report. This supersedes an initial misleading comparison with an unchanged video page. It is a reference capture, not a completed C++ renderer or an assertion of same-instant replay.
Scenery queries, contact and named controllers
All 140 scenery fields now have 38,080 independently matched point queries and 8,960 stepped segment intersections. Another 1,400 HERC contact cases verify strict radius checks, activation gates and relative-motion ramming dispatch, including 91 damaging impacts. COLLISION.md records the different occupancy/height paths and fixed-point inverse-matrix requirement. Scenery models expose their collision fields in the browser.
Twenty HERC and seven flyer controller records are exported with their original names and three callback phases. Their initializer output agrees with the DOSBox snapshot. CONTROLLERS.md records 162 entry traces, 62 order selections and 480 status cases. The mission browser includes this table. Individual avoidance/target-scoring algorithms remain separate from these verified scheduling and selection rules.
Target eligibility and scoring now have 3,000 independent whole-call comparisons, including complete RNG state. PERCEPTION.md documents objective priority, bearing/range, retaliation, assigned attackers and the original bitmask-based strength perturbation.
Whole campaign return and hangar service
The complete original GO mission-return transaction now runs against in-memory saves, real starting rosters and original artwork construction. Ninety-six independently matched scenarios include 192 pilot deaths and 144 wingmate replacements; crew bytes, armory order, counters, budget, technology and complete RNG state all agree. The memory transport now correctly preserves files opened read/write rather than incorrectly truncating them.
Another 6,400 repair quotes, 1,280 repair transactions, 25 construction steps and three automatic-repair policies agree. CAMPAIGN.md records equipment rewards/replenishment order, pilot health, replacement rotation, technology thresholds, construction durations, strict affordability and the original repair setter's ability to lower healthier components. These are original behavior findings, not changes to a game implementation.
Music selection
All shell sound IDs and simulation sound records are mapped. The music browser labels their verified uses, including theme pairs and terrain/campaign overview choices. Another 1,200 original-code comparisons match encounter music decisions, fades, playback events and complete RNG state. MUSIC.md records the original far-flyer condition and the difference between engine update timing and HMP timer timing. Audio auditions remain bounded renders rather than captures of those interactive transitions.
Controls and instrument data exchange
INPUT.md records command precedence, original modifier bits, KEYJOY choices and nonlinear mouse aiming. There are 4,096 independently matched held-direction combinations and 3,000 key transitions, including taps released before a frame consumes them. Another 768 original player/cockpit exchanges agree on reactor reserve, shields, throttle, angles and target ownership counts. All eight complete GAU blocks and their coordinate rebasing agree with the original loader. The cockpit browser labels instrument bounds, and the earlier ten-rectangle export is corrected to the original nine weapon rectangles.
Positional audio
MUSIC.md records 6,144 independently matched positional source calculations and 6,000 queued submissions. The original coalescer compares a saved distance with itself, so it keeps the first nonzero-distance source rather than selecting the nearest. Listener refresh uses an identity rotation every ten enabled flushes. These original behaviors are documented, not silently repaired.
Complete scenery rays and projectile hit ordering
The complete scenery candidate loop now has 3,360 independent comparisons across all 140 fields, including 1,218 hits. Projectile dispatch adds 1,200 actor-list cases and 200 ground intersections with exact effect choices/RNG. Its ordering permits multiple actor damage calls as the ray is shortened. Thirty-two further cases retain real HERC hit-volume and shield instructions and confirm that an aligned farther actor can be damaged before a nearer actor; reversing their list order damages only the nearer actor. COLLISION.md and WEAPONS.md record these boundaries and the original behavior.
Navigation and engagement decisions
CONTROLLERS.md now records 1,800 route, 2,400 formation and 3,000 obstacle-avoidance comparisons, followed by 3,600 patrol/search engagement decisions and 256 coordinated flyer attack entries. The original negative/positive leader-speed threshold differs by one unit. Route loops depend on shared point identity, not equal coordinates. Ramming bypasses avoidance and has additional movement calls during its burst phase. A consumer map identifies the remaining combat-controller and flyer implementation boundaries without claiming that the table/decision tests reproduce all their behavior.
Native implementation resumed
With the resource browsers, subsystem maps and original-executable fixtures established, C++ implementation has resumed. The parked cell-field interpretation is corrected to cycle counts; live cells begin at zero. Native model instances now match 116 default and 5,120 blended pose/hierarchy references. Original lower-detail arrays can contain unwritten transform slots: allocation poisoning with 0x55 and 0xaa confirms BULLDOG root 5 nodes 7, 8, 11 and 12 retain allocator contents. Those unused slots are excluded from meaningful comparisons; native C++ initializes them safely. Exact combat/renderer integration and full recorded replay remain checks during implementation, not claims of a finished game.
The C++ animation-channel port now matches all 8,955 queued-transition traces, 98,505 post-request states and 5,120 interpolated root-motion transforms. These are native implementations reading retained fixtures; the executable oracle is not linked into the C++ game or tests.
Native projection and raster ports
C++ lighting matches 16,896 intensities and 512 transformed lights; palette shading matches all 144 remap tables and 32,256 verified ramp lookups. Projection/near clipping adds 3,200 original polygon references. Viewport clipping adds 6,000 comparisons and native edge coverage another 5,999. Complete flat-polygon VGA output agrees in 360 cases; affine textures agree in 600 cases covering both scan directions and both transparency paths. These changes are committed incrementally in earthsiege-cpp. The analysis tree remains uncommitted.
RENDERING.md records the strict/inclusive near-plane difference, the near/focal assumption, edge coverage, clipping rounding and texture sampling. The model/mission browser shader now retains translated-zero texels, matching the original lighting path; both browsers pass direct-from-disk checks. Gouraud analysis confirms that the original rasterizes palette-coloured bands, with every emitted primitive matching in 6,000 triangles. Full renderer integration remains work in progress, rather than evidence of a playable C++ game.
Complete native model rendering
The C++ renderer now reproduces all 401 supplied model roots from eight angles (3,208 complete frames), plus 512 animated channel states, at every VGA pixel. It combines original transforms, painter traversal, lighting, material sides, projection, flat/Gouraud/textured coverage and effect billboards. Separate checks cover 6,000 clipped line rasters and 500 bitmap scalings. All 19 C++ tests pass. These components are committed; terrain, cockpit masking and complete actor/mission integration remain implementation work.
The inspection browser still uses WebGL depth-buffer triangles. Its remaining raster differences are now explicitly distinguished from verified original software drawing, and stale wording about deferred C++ work has been updated. The original native model capture runs no substitute renderer and has no live DOSBox/desktop dependency. The analysis tree remains uncommitted.
Native C++ movement integration
The original normal-player movement controller now passes all 11,520 retained locomotion states in C++, including animation transitions, rebased root motion and world heading. Another 4,104 original direction-angle cases cover the integer lookup and low-word rounding quirk. Shared transform/channel checks and all 3,720 complete model frames still pass. Physical aiming passes 13,440 cases across sixteen chassis; animation priority composition passes 800 combined poses. These are implemented consumers, while the executable shell remains menu-only pending world/mission integration.
Complete scenery rendering
Committed native C++ static-world rendering after all 288 full-frame and draw-order comparisons passed across 24 environments. Distance palette/culling has 4,800 additional original comparisons. Sky/ground gradient research follows as a distinct path; the executable is still menu-only until mission integration is connected. Analysis files remain uncommitted.
Sky/ground gradient integration
The low-detail gradient path is now native C++ and committed: 2,111 defined original command sequences and 503 complete frames pass. Another 289 cases document the original near-vertical zero-cosine fault. Original panorama and textured-ground switches isolate this layer; those features remain separate work. The first eight WLD fields now have verified names. No analysis files were committed.
Native starting actor construction
Player roster, GL equipment mapping and formation/group placement are committed in C++. All 304 original starting states match (8,176 actors / 4,368 groups); 89 allocator-dependent positions remain explicitly undefined. All 30 native regression tests pass, including full model, scenery and background frames. The application shell still awaits mission/controller integration; this is not a claim of a playable game.
Native armed HERC rendering
Combat definitions now pass 36 original-reader resource checks. Weapon assembly adds all 32 starting external weapons (808 nodes / 10,513 complete points), and 384 full VGA renders agree for armed/unarmed chassis and animated poses. These are native C++ consumers; original execution remains in the research tools only. The analysis remains uncommitted.
Live native scene and collision response
The C++ window now exposes the four original demo starting worlds via --inspect-demo 1–4, with owned roster HERCs, original mounted geometry, held walking/aiming and free/orbit/attached cameras. The full 38-test suite passed before collision integration; original scene comparisons cover all 64 mixed roster/scenery frames. This is an inspection path, not full tape replay or a playable mission. Original collision response now agrees across 1,920 sequential updates, plus 1,400 body contacts and 5,600 terrain occupancy queries. Analysis remains uncommitted; C++ work is proceeding in local commits.
Native combat consumers and damage integration
C++ now reproduces weapon charging/ELF/cooldown and shield allocation (14,583 cases), bullet/rocket guidance and flight (14,895 updates), primitive hit/shield volumes (6,608 cases), full articulated component selection (8,192 queries), and component damage (5,106 updates plus 180 accumulator boundaries). Original-backed loadout assembly supplies the damage capacities, weapon-dependent sections, collision volumes and initial state. Damaged movement adds 2,880 complete skeletal states and collapse events. Newly captured manual/AI guidance and damage transitions are retained in the analysis; the analysis remains uncommitted. Full firing, world hit dispatch, effects, AI and mission/campaign integration still need to be connected in the native application.
Owned weapon discharge and projectile instances
Native C++ now owns mixed weapon banks, matches 1,160 firing calls / 1,272 spawn requests, and carries those requests into bullet/rocket instances and immediate beams. Impact packets match 270 original flight updates and 576 beam calls. This integration exposed a flaw in the early flight capture: bullet slots 3–5 have models but no bullet definition, because their weapon definitions use beams. The invalid 27 traces / 1,377 updates are removed; valid flight coverage is 216 traces / 14,895 updates, with null-definition guards in both capture tools. Original hit effects, world reactions and complete mission integration remain in progress. Analysis remains uncommitted.
Ordered world impact dispatch
Native C++ now combines ground/scenery collision with ordered actor-hit calls, post-hit reactions, triggers, friendly warnings and obstruction reporting. The 1,400 existing outer-loop/ground references pass, and 3,360 new combined captures across all 140 scenery collision fields pass with exact events and RNG. Actor damage/effects and AI reactions remain explicit boundaries; their full integration is still work in progress.
HERC interception and status correction
The stale opening paragraphs claiming C++ was parked/deferred are corrected; native implementation has been active since the earlier resumption entry. Current and historical status are now explicitly distinguished. Another 1,152 complete incoming-ray captures retain original damage and effects. Native owned HERC interception agrees on all shield/sensor state, 445 hit depths and 178 body-damage requests; applying the later damage-grade effects and salvage remains integration work.
Effect factories and combined animation
All 1,152 explosion creations and 256 debris bursts now have independent original-code checks, including model choices, launch vectors and exact shared RNG. Another 126 traces / 3,046 updates cover primary and secondary cells together with light changes. Native C++ matches all of them. EFFECTS.md records the original final-frame light overlap in definitions 16/17: frame 12 aliases the following distance field and yields intensity 32. Pool lifetime/motion and world effect integration remain separate work.
Combined HERC damage and effect integration
The incoming-ray suite now covers 2,304 original calls, retaining the original 1,152-case subset and adding targeted weapon loss and player-immunity cases. Native C++ matches all component/armour/presence/cell state, shield/sensor changes, ordered effects, 80 ejections, 48 salvage records and complete primary random state. Explosion/debris creation actually runs between component choices; its random draws are not replayed from expectations. DAMAGE.md records the section lookup, damage-band, knock-off and salvage rules, including the separate secondary generator used by attached smoke. Persistent smoke, physical ejected weapons and world scheduling remain integration work; there is no external blocker.
Live effect ownership
Native debris movement now matches 41,576 original updates, and object ownership matches 2,400 allocation/deferred-release operations. Separate oldest-first simulation traversal is established, rather than accidentally using the pool's newest-first list. A combined C++ effect owner matches 1,620 original mixed live frames, including geometry cells, lifetime, slot reuse and shared random state. Those captures exposed the original three-effect-light controller limit, now retained independently of the lighting manager's twenty-source capacity. EFFECTS.md records the boundaries and the safe handling of original unchecked particle-pool exhaustion. Rendering these effects inside the mission, audio, persistent smoke and physical ejected-weapon construction remain integration work.
Integrated dynamic lighting and effect drawing
Resumed implementation after the user's reminder that status replies must not end ongoing authorized work. Native light ownership now matches 456 isolated original selections plus 3,250 live operations. Added complete effect drawing verification: 72 original VGA frames match every pixel, including all eighteen explosion definitions, texture banks, debris, ground flashes and lit scenery. Confirmed the game's 2000/10 attenuation setup and separate flat-effect prepass. Mission firing, projectile/effect scheduling and impact dispatch are the next integration work; there is no external blocker and native work remains active.
Native inspection combat integration
The native inspection session now connects firing to the shared projectile pool, terrain/scenery/HERC impacts and owned visual effects. Four demo starting missions exercise ammunition/charge consumption, impacts, rendering and final reclamation. Beam rendering matches 52 complete original frames and shared projectile ownership matches 540 original mixed frames, including the missile animation clock retained across slot reuse. These are defined component and integration comparisons, not a completed game or TAP replay. Target selection, full controller scheduling, persistent smoke, cockpit/campaign and audio integration continue.
Recognition, target ranking and controller phases
Native C++ matches 3,000 original target selections with full RNG state, including player-led wingmate restrictions; 1,110 perception cases; 1,200 controller dispatches; 3,600 patrol/search decisions and 256 flyer group attack entries. The 27 named controller definitions, entry staggering, statuses and supported order selectors are ported as well. Analysis captures now retain complete inputs for regeneration. This advances controller integration; full mission AI/cockpit/audio remain work.
HERC session construction now includes authored NPCs, saved condition percentages,
group sides and activation gates. capture_starting_damage.py verifies 1,792 NPC
condition calls (all sixteen chassis) and the supported 384 shell restores;
capture_mission_hercs.py verifies all 56 HERC starts in the four recorded missions.
Salvage exclusion and the separate collapse latch are named from their consumers.
The Spider has optional absent aim channels and fixed live damage storage despite
its shorter capacity resource. Unsupported shell restoration exposes original
bounds errors, retained in research but not copied into native memory accesses.
Ground actors now own side-specific static/animated models and wreck selection in the native mission session. Verified 72 starts, 288 original frames, 1,332 lifecycle operations and 1,728 collision rays; attached effects and mission notifications remain explicit subsequent consumers. Found seven out-of-bounds distant-radar BSP transform references in each side's export, documented the original allocation read, and checked 16 reference views with an explicit safe local-plane repair. Analysis remains uncommitted as requested.
Gun turret tracking and firing consumers now match 1,536 articulated aim updates and 3,072 complete firing-policy ticks. Added the ordinary base/flyer strength assessment callback to targeting coverage: 4,500 original selections total. All 75 native checks pass. Active mission target/perception scheduling remains the next integration boundary; analysis changes remain uncommitted.
Added mission-owned skimmers with original ENEMY textures, single-section damage, removal, impact ordering and shared effect callbacks. Verified 32 full VGA frames, 768 rays, ten cumulative damage steps and all 18 recorded mission starts. Reconstructed pitch/bank/yaw/altitude control and forward obstacle probes; 2,304 steps and 4,608 query boundaries match the original, including its zero-distance obstacle-comparison quirk. Flyer controller scheduling is next.
Flyer route/formation policy matches 1,200 original cases; leader attack policy matches 3,072 updates, 78 ordered projectile requests and complete random state. Added inherited launch speed to native rockets after six original spawn-wrapper probes; existing HERC launch behavior is unchanged. Continuing into the shared perception/controller scheduling needed to run these policies in live missions.
World perception is now independently ported and verified against 2,304 original world passes, including 14,824 ordered callback events, counter/trigger effects and complete RNG. Live scheduling and handoff settings are the next consumers.
Resumed after technical interruption: completed and committed native live flyer/turret integration, then verified HERC attack movement and damage-based combat assessment. 3,200 tactical decisions, 1,848 ratings/component choices and 2,048 retreat decisions agree; all 87 native checks pass. Analysis remains uncommitted. Full HERC scheduling/weapon decisions and shell/cockpit integration are still active work, not a completion claim.
Continued through AI weapon choice, target aim-point selection, articulated aiming/convergence and fire policy. All 91 existing native checks pass after splitting physical advancement from control preparation; a new composed 512-frame/eight-chassis check additionally matches 453 projectile launches. Strategy transitions and full HERC mission dispatch remain active work.
Added original-backed HERC strategy, travel, fleeing, skirting, ramming, guard and drive-off policies: 2,560 strategy entries, 3,072 auxiliary decisions and 2,048 guard decisions. Shared target-selection regression also passes. Documented the original fleeing timer/direction overlap explicitly. Continuing into live HERC scheduling, contact responses and combat-state ownership.
Complete HERC navigation integration
All four recorded missions now have native whole-frame comparisons: 960 frames, 17,760 HERC/flyer observations, exact random state. Verified modules are connected in original phase order, including autonomous controllers, physical collision, post-frame power and sensors. The old flyer-only frame test is superseded because its deliberate HERC boundary omitted shared entry staggering. Continuing with hostile combat and mission/cockpit integration; analysis remains uncommitted.
Hostile frames and retaliation
Connected HERC hit reactions, friendly-fire warning timers, obstruction ownership and turret-facing queries. The native game matches 4,096 original retaliation cases and 640 hostile frames / 12,160 HERC and flyer observations. No player input is supplied in these composed captures; player objectives and cockpit/shell integration continue. Analysis remains uncommitted.
Live mission objectives
Ported mission completion, status timing, player route/recon/rescue events and debrief grades. Added 4,096 player updates and 2,048 mixed objective worlds to the existing 5,122 outcome and 16,000 grading captures. Corrected the whole-frame harness's missing moving-projectile phase; the native simulation now matches 880 seeded hostile frames including objectives and live projectile hits. Continuing with player weapon/target input and cockpit/shell integration.
Player controls: original weapon-bank captures now cover 34 loadouts, 11,594 updates and 609 discharges; native player input routing matches 4,096 original calls. Corrected the earlier interpretation of Alt+1–9 (group membership) and Enter (forward target cycle). Mission/cockpit integration continues. No analysis changes committed.
Continued after interruption: integrated player input, groups, linked firing, missile input consumption, target cycling and HUD target ownership. Three new 720-frame original mission comparisons pass, including explicit target/track requests and manual missiles. Native live view now uses those controls; cockpit rasterization/instrument widgets and the game shell are the next consumers. Analysis files remain uncommitted.
Cockpit integration resumed: original-code checks now cover all 32 window masks with 96 complete model rasters, all 425 GAU words for each chassis, 32 static artwork/mirror selections and every projection centre. Added 64 masked scenery frames. C++ commits 1d2afa4 and the subsequent live cockpit integration implement these paths; 109 native tests pass. No analysis files were committed. Reactor instrument raster captures now exist for all chassis; remaining instrument, shell, campaign and audio integration continues.
Resumed instrument integration: reactor gauge committed as f6bbefb after 110 native tests. Throttle now matches 864 original frames; shield numerals/buttons match 480 frames, and shield DAC animation matches all 1,025 charge levels. These displays use the live player's energy, movement and shielding. Continuing with the remaining cockpit controls/displays and shell/campaign consumers. Analysis changes remain uncommitted.
Cockpit interaction: 1,248 original pointer cycles now match the C++ control container, including drags, out-of-window movement and both mouse buttons. Live throttle and shield allocation controls are connected; keyboard throttle commands retain their original precedence. All 113 native tests pass. Continuing weapon readouts, other cockpit consumers, and complete shell/campaign integration.
Weapon instruments: all 116 native checks pass, including 1,152 weapon row rasters, 768 weapon/UI exchanges, 72 group rasters and 144 group exchanges. Integrated live numbered selection, charge sliders, ammunition countdown, ECM, weapon groups, LINK and TRACK with original update ownership and timing. Analysis remains uncommitted; remaining cockpit/HUD, shell/campaign and audio integration continues.
HUD integration: 120 native tests pass. Heading/torso/pitch/crosshair and tracking label match 1,024 original frames, target brackets match 512 projected rasters, and waypoint arrows/labels match 512 frames including retained heading on a disabled HERC. Actual target inputs match 128 actors across all four demo starts. Live cockpit screenshots inspected. Remaining MFD, cockpit timing/presentation, shell/campaign and audio integration continues; analysis remains uncommitted.
Cockpit timing: 4,250 original clock frames and 2,560 complete TTM animation updates now match the native state/raster. All 123 presentation programs have matching decoded bytecode and labels. Connected the live clock and decorative lamps; continuing MFDs and shell presentation consumers. Analysis uncommitted. All 122 native checks pass after clock and cockpit animation integration.
Model-browser review: added manual/in-game names, human chassis progression and semantic categories, including Rhino/PANTHER and the otherwise unlisted Cybrid status names. Generated thumbnails for all 401 roots, rotated 90° right following user feedback, and distinguished HERC LODs from scenery/object variants. Added 125 loadout presets and per-hardpoint editing for all sixteen chassis. Original code verifies 810 compatibility lookups and 891 arrangements/1,191 weapons/953 external offsets. Bare chassis now removes external mount placeholders. Fixed shader interpolation of discrete material values, the cause of extra stippling; a single-colour probe now has no wrong palette pixels. Analysis remains uncommitted. Full native UI/game/audio integration is still ongoing.
Matched the main model viewer’s initial angle to the rotated thumbnails following further user feedback. Both now use the same named default camera angle.
Cockpit damage display: 1,200 original STATUS/TARGET frames now match native C++ for all eight player chassis, per-section damage, health boundaries and world targets. Added the PDG reader and original palette-region remaps. The unused original tenth weapon metric is padded in the capture harness, with actual component counts retained; this boundary is documented in MULTIFUNCTION_DISPLAYS. Continuing the parent MFD controls, remaining pages and live integration.
Completed scanner (480 frames), MFD button/range controls (472 frames/72 cycles), communications (240 frames), and overhead navigation map (288 frames across all 24 world variants) against original executable captures. Native renderers retain original projection, ramps, page geometry and text. The navigation harness now initializes the real default child-context source and map-angle constructor. Continuing missile-camera and parent MFD scheduling/live integration; analysis changes remain uncommitted.
Missile-camera pixels and retained tracking now match 94 original cases, and the healthy parent MFD controller matches 600 state/dispatch transitions. Captures cover impact flashes, retired projectile poses, EO automatic page switching, manual overrides, refresh deadlines and real button callbacks. High-detail backgrounds, damage flicker and live display bindings remain integration work.
Analysis-first correction and animation camera
Paused native integration at committed checkpoint 9f9b422, preserving unfinished MFD edits. Created ANALYSIS_STATUS.md to separate decoded bytes, verified consumers, inspection previews and unresolved runtime questions. Remaining research must be completed or bounded explicitly before native work resumes.
The model viewer used to derive camera centre and distance from every animated frame's bounds. Pitbull sequence 4 changed that fitted radius from 2092.48 to 3177.50 units. All 40 sampled frames/blends now retain the same projection matrix; articulated geometry continues moving. The camera fits the intact default pose once per selected root. See work/research/models/animation-camera.json.
Build/language findings are now consolidated in BUILD_EVIDENCE.md and linked from the README and research index. It distinguishes direct C++/vtable/source path and HMI SOS evidence from the still-unproven compiler/version, RTTI and exception questions. Existing MUSIC.md contains the detailed original-driver and scheduler analysis.
COMMAND_LINE.md and CHEATS_AND_DEVELOPMENT.md now explain the original options and direct repositioning keys. Retained original execution covers 34 parser cases and 216 movement/turn commands. The uppercase EGGPLANT string is misleading: the case-sensitive DBSIM dispatch table accepts only lowercase e, so only -eggplant reaches the successful check. ESCD's -B1000000 belongs to PLAYFLIC's movie preload buffer, not the simulator debugger flag. The movie player's READFLIC/Jim Kent credits are also recorded in BUILD_EVIDENCE.md.
Buildings, environment ramps and constructed scenery inspection
Buildings now lists each of its 42 stored roots individually, with named thumbnails and direct root selection. Terrain material 14 was still using the DPL singleton placeholder [255]; the shared preview now binds original WLD near-distance ramps per actor class. The exporter agrees with 144 original class/world captures. Regenerated all 147 building/terrain thumbnails.
The mission browser defaults to a labelled compiled 3D fixture. It combines zone terrain with constructed buildings, HERCs and flyers, including captured HERC loadouts, and projects routes/waypoints/markers through the actual camera. Added pan, top view and building/player focus controls. Whole-map framing stays fixed when overlays or actors are hidden. Source alternatives remain separate. All 75 decoded mission scenes pass browser checks without script errors.
The B0_C1_61 north-edge pattern is eighteen shape-5 placements in the original ZONE1161.DAT. Preserved their coordinates, a browser focus shortcut and an unmodified-original-renderer capture. Its exact reading and authorship remain unproven. SCENERY_BROWSER.md records scene scope and the environment binding correction; native work remains paused pending the wider analysis audit.
Mission list, source visibility and camera preservation
B0_C3_2A confirmed the missing-buildings report was source-alternatives mode: that view did not construct actors. It now states this above the scene and has a button to open the compiled mission without moving the camera. The thirteen buildings include eight enemy objective installations (two listening posts and six radar towers); focus labels now distinguish allegiance and objective membership.
Compilation, terrain/scenery changes and visibility controls preserve the exact view-projection matrix, including zoom and orbit. Reset/Focus remain explicit; selecting a different mission still establishes its initial framing. The list now uses campaign family, original role labels and objective excerpts, with two small source-layout warning badges replacing the redundant success column.
SM_ESC50 is retained text-system test/template material: original Case-range strings and temporary objectives are preserved, with 27 existing original interpreter comparisons. It is absent from supplied normal selection tables. The north-edge geometry's visual reading is recorded as “Jö”; authorship remains unknown. SCENERY_BROWSER.md explains all compilation presets and these findings.
Ground-constrained scenery panning
RMB and Shift-drag now translate the orbit pivot across the X/Y ground plane with Z fixed at zero. The former screen-plane translation accumulated height, which made later orbiting rotate around a point above or below the scenery. Pan movement remains finite at the horizon and in top view. Verified both gestures with actual browser pointer events at four headings/elevations, repeated dragging followed by orbiting, and compilation/visibility preservation.
Mission-launch state versus compiler test presets
Traced the omitted GO launcher preparation and post-compilation overrides. Campaign launches supply node/step and preserve historical event counters; single missions clear them and set marker 99. Both fill the time/palette option and three bounded random values. The real RNG starts from original nonzero seed words, even with warm-up zero. Terrain and menu overrides follow compilation. Seventy-two original preparation comparisons and eight original compiler/override examples pass; the 75-mission fixture comparison quantifies route, actor and environment variation. MISSION_LAUNCH.md records the evidence and the remaining need for contextual browser launch states. No C++ files or installed saves changed.
Coherent mission launches and the October browser corrections
The mission viewer now defaults to captures from complete GO 0x35873 execution, followed by original DBSIM loading and actor/group construction. There are 674 verified cases, including seeds 17/42, every supported occurrence in the three normal battle sets, single-mission templates and four original TAP handoffs. Campaign examples explicitly retain fresh history and the original new-career roster; save/hangar and raw handoff imports provide actual user states. Labels, briefing alternatives and counters refer to the same capture. The six C6 SM_SCT50 chassis -1 cases revealed an original type-map under-read alias, now independently reproduced and documented instead of Python negative indexing.
The original campaign terrain overrides now appear in scenes: C1/C2 use ICE, C3/C4 DESERT and C5/C6/C7 URBAN. Urban variant 5 has 19 placements in ZONE1500; variant focus options and an original raster make it directly inspectable. The two incompatible source layouts now clear pending/previous geometry and show their original-reader failure. This fixes selection-dependent terrain on B0_C1_20. Context/random/display changes preserve the camera. All 75 supported mission scenes and the reported transition cases pass the browser regression.
All 77 mission descriptions are reviewed short summaries of full original briefings/objectives. The old first-action-verb heuristic could choose only “DESTROY THEM.”; that extraction is removed, and labels identify the summaries as inspection prose rather than authored mission titles.
Original building renders confirm that stripe kinks and the hangar decal flicker came from the analysis viewer. The shared renderer now maps whole polygons in screen columns and gives textured overlays a small depth priority. The native renderer is unchanged. Model regressions pass, including 108 decal samples at twelve views; thumbnails are refreshed. Static playback/frame/speed controls and redundant single-sequence selectors are hidden.
All changes remain in this uncommitted analysis tree. No installed saves or C++ sources were modified.
Mission lighting in the model inspector
Added day, dusk and night presets, all four environments, normal/low visibility and explicit shading distance. The original fixed directional light remains; the selected DPL, WLD distance tables, material bindings and native texture remaps supply the differences. Camera position, zoom, animation and LOD stay unchanged. Models beyond the original distance cutoff remain inspectable with a note. Manual palette overrides remain available and clearly indicated.
Corrected the previous description of adjacent WLD files: these are visibility partners, not day/night partners. The manual names the settings; the loader's index expression and original perception ranges agree. The model browser uses verified HERC/flyer/building/terrain classes and leaves unknown standalone resource bindings explicit. All 2,390 retained non-highlight-split distance captures match the JavaScript consumer; all 24 UI combinations pass local-file and HTTP checks, including rendered brightness and camera preservation. Existing model regression checks pass. Day/dusk/night hangar screenshots are retained. Analysis remains uncommitted; no C++ files or installed saves were changed.
Original texture and distance-haze distinction
Investigated the report that model-viewer textures stay unchanged as untextured
faces fade with shading distance. This is original behaviour: 0x25d44 updates
polygon material ramps, whereas textured polygon 0x5410c selects a separate
palette/light-intensity translation. The unchanged executable reproduces the
mismatch on the HERC hangar, listening post and Samson. Across five shade bands,
all visible textured pixels and all eight texture tables remain identical while
untextured pixels change; 15 comparison frames and six PNGs are retained under
work/research/models/distance-textures. LIGHTING.md documents the original addresses,
controlled-render scope and results. The distance control now explains the
original distinction. No additional texture fog or C++ changes were introduced.
Complete background layers and palette consumers
Added the original environment capture harness and an environment gallery for all 24 WLD combinations. The captures retain panorama scrolling, cloud drift, ground marks, textured-ground distance translation and original raster coverage. Verified 65,536-unit texture periodicity and independently checked pitch/impact palette interpolation and optional cycle scheduling. No supplied cycle resources exist. Detailed consumers and capture boundaries are in ENVIRONMENT.md. C++ remains paused while the remaining analysis audit is addressed.
Exact animation requests and visible world motion
Added 6,144 original exact-frame request traces and matched 61,400 states in the independent browser controller; retained eight invalid native reverse-during- blend searches separately. Added a guarded exact-frame UI, accumulated motion, a fixed reference grid and explicit path framing. The default remains in place.
Persistent smoke, detached weapons and retained templates
Verified 18 original smoke lifecycles and 113,400 independently calculated puff updates, plus 64 weapon detachments and 808 debris updates. Retained 60 composed original actor/environment/effect frames and an inspection animation. Traced the low-memory weapon families to startup's available-memory threshold. All four families now have model-browser role labels; only root 6 lacks any supplied weapon-definition reference. C++ remains paused and this tree uncommitted.
Live shell constants versus retained simulator BNDs
Executed all eight original GO BND loads, retaining exact destinations and field reference instructions. Identified their input deadzones, queue capacity, memory thresholds and map controls. DBSIM has no BND extension-pointer consumer and uses compiled constants; its 63 parameter snapshots remain inspectable with that scope. Added explicit endpoints for TEST/CONFIG/CAREER1/old WORLD resources and corrected NAMES.LOG's stale partial-format label. Command-line fields with only writes are distinguished from demonstrated game options.
Calibrated input and cockpit behavior
Added 3,840 independently matched calibrated joystick outputs, 2,304 application routes, complete device/pedal selection and 800 preference transactions. Checked 257 damage bands and 14,400 failure/RNG updates, with 450 composed original cockpit frames. Traced 80 wingmate command deliveries into real radio queues and retained 80 original radio presentations with SNC timing. No scanner history producer was observed across 4,500 full simulation frames; documented that bounded endpoint instead of inventing one. Added 105 view-request checks and 130 hardware-panned side-view frames. Resource-backed snapshots support on-demand files without writing an install. C++ remains paused.
2026-10-29 - analysis-first completion boundary
Closed the remaining resource/consumer audit, original input/cockpit and effects references, audio endpoint audit, complete four-tape DOSBox replay and shell state/presentation investigation. All 9,300 input packets match, with 1,938 repeatable DEMO1 states under the retained configuration. Added shell dispatch and replay browsers, 73 original interaction captures, 56 presentation-selection cases and a real preference accept/cancel/restart sequence. Updated direct-file browsers pass Chromium checks. ANALYSIS_STATUS.md records the remaining neutral legacy fields and exact limits; extraction totals are not presented as proof of complete gameplay. C++ integration resumes from its preserved checkpoint. The analysis directory remains uncommitted as requested.
2026-10-29 - native cockpit integration
Connected the six MFD pages to live mission data and original mouse/keyboard controls. Added 128 actor-binding comparisons, 1,536 command branches, 256 group dispatch sequences and 48 complete original mission-command transitions. The latter includes actual targeting, strategy and RNG. Documented the original uninitialized FORM UP priority and untouched aimed-component scratch. C++ uses neutral group priority; analysis remains uncommitted. Radio presentation, damaged instruments and the rest of the live application continue next.
2026-10-29 - Instrument damage and radio integration
Connected native MFD failure flicker and OFFLINE labels after 1,200 combined original parent/failure transitions, alongside 14,400 isolated timer cases. Added 1,152 original radio queue operations, 880 resource resolutions and 1,920 active-message transitions. Discovered and recorded the original short insertion shift, double-indexed eviction and misplaced commander descriptor writes. All new evidence is in the cockpit analysis and MULTIFUNCTION_DISPLAYS.md. Native radio text/portrait/speech presentation is the next integration step.
2026-10-29 - Native radio portraits and text
Connected live mission acknowledgements to native text and animated pilot portraits. Added original captures for all 556 SNC resources (37,280 states), 2,400 radio portrait phase transitions, 600 talking/death portrait rasters, 1,620 idle/static rasters and 32 banners. Retained the original prepared-page boundary, exact 16-bit mouth argument and original UI RNG arithmetic. Documented the unloaded death-frame offset explicitly instead of assigning it asset-backed meaning. Native tests consume captured fixtures; original analysis remains uncommitted. Live speech filenames are resolved, with audio output still pending.
PCM integration added original-object, HMI allocator and archived generated-mixer fixtures: 2,560 sound states, 1,024 kernels and 9,600 DMA-buffer states now agree with native C++. The normal pitch field is ignored because SoundManager does not enable the required mixer flag; loop 255 is finite. MUSIC.md records these refinements, original active-pan behavior, and explicit defensive boundaries.
- Verified
0x144dcfootstep/collapse latches (1,800 cases) and real articulated footsteps for all eight player chassis (2,560 updates, 279 sounds). Connected native PCM, speech, world sound requests and SDL output; all 150 C++ checks and a dummy-device mission run pass. Analysis files remain uncommitted.
2026-10-29 - Live native music and persistent effects
Integrated original combat-track selection, FM register drivers and shared HMI PCM percussion. The loop-callback correction is documented in MUSIC.md. Live SDL output and all 159 native tests passed before the effects integration.
Persistent attached smoke and physically ejected weapons now consume real mission damage events. Retained additional original pool/attachment traces for 12,906 smoke frames / 113,400 puff states and 28 detachments / 808 updates. All 160 native regression tests pass. Analysis remains uncommitted; continuing with cockpit and application integration.
Lower HDD map renderer: 160 original indexed rasters now agree with the C++ implementation. Retained distinctions include schematic terrain cells, original negative-grid rounding, bitmap-height scaling and hostile visibility gates. Full lower-panel controls and damage reporting are the next integration work.
Lower HDD integration: captured and checked 908 original map-control states and 592 complete damage-panel frames (all eight playable chassis). Native resource- driven weapon diagram assembly and complete damage pages match; original pending versus committed order destinations and retained packet fields are preserved. The map/contact adapter now reads actual mission point bounds, routes and actors; individual wingmate delivery shares the already verified AI order receiver.
Native lower cockpit integration
Connected F7 MAP/F8 DAMAGE, map picking/Tab targets, individual wingmate orders, mouse double-click transmission, three damage pages, pilot subject names and cursor warping. Added fourteen assembled original pixel comparisons, 1,024 original target cycles, expanded the 160 map frames with group activation and independent blinking, and extended all 1,248 mouse packets with timed release latches. Found and preserved the original stale empty-slot weapon-label table with bounded native storage. Analysis notes are in MULTIFUNCTION_DISPLAYS.md and INPUT.md; no analysis-tree commit was made.
Portable campaign transaction verification
- Retained the actual original writer/reader bytes in
work/research/missions/career-fixtures.json, covering all 41 career/history states for four selected history slots.tools/capture_career_fixtures.pyuses the existing original execution checks; the C++ importer preserves the original inventory reversal rules. tools/capture_hangar_fixtures.pyretains full before/after conditions, quotes, credits and construction state for the existing 1,280 repairs and 25 construction steps.tools/capture_shell_return_fixtures.pyretains coherent input career/hangar/result files and the complete original saves after 96 return transactions. The C++ implementation matches every saved byte, crew statistics and RNG word, including 144 replacement pilots. These checks add save-after-return coverage to the earlier in-memory state checks.- These are shell state/serializer comparisons. They do not claim the interactive menus or a complete native input replay are finished.
Complete portable launch comparison
The C++ constructor/preparation/export path matches all 670 coherent original
compiled launches and their final RNG words; four complete career constructors
and 32 altered-crew exports also match. Retained captures are in
work/research/missions/new-career.json and launch-roster.json. The latter exposed
the selected-pilot-health propagation rule and confirms roster portrait/rank
fields. Full launch comparison also required original missile-type normalization
in the hangar builder. Details and the initial-history inventory distinction
are recorded in MISSION_LAUNCH.md. Analysis files remain uncommitted.
Ported the original preference transaction manager; all 800 native operation, callback and persistence comparisons pass. Continued shell integration.
Connected live mission salvage, defeat statistics and return-condition export. Verified 5,114 original damage/salvage states and four assembled world returns. Safely initializes the original unallocated tenth equipment word.
Integrated shell launch, persistence and return
Connected ordinary menu selection, single missions, career registration/resume, preferences, original-format saves, manual backups, mission launch and debrief return in the native application. Added 33 original preparation comparisons, eighteen consecutive campaign cycles and nineteen exact alert rasters. Found and preserved the live-counter/stored-counter distinction across chapter changes, explicit inventory reload order and shell RNG restart on flight return. Corrected the registration harness's missing name-record allocation and audited all 670 existing launch captures; the meaningful handoffs and RNG states are unchanged. Specialized shell artwork and service controls remain integration work; no analysis-tree commit was made.
Browser inspection improvements
Added screenshot availability/counts to every shell-screen row. Exported all thirty fonts as TTF and WOFF2 with original colour layers, editable samples and 6,690 independently checked glyph rasters/advances. Original bitmap sheets and samples remain available; analysis files are uncommitted.
Added the complete native horizon strip and main-view cloud animations for all 24 environments. Native first/last comparisons and saved-atlas checks retain the boundary between original perspective captures and unwrapped background inspection. Portable C++ integration is committed through a578959; specialized shell services and the remaining full-game integration continue separately.
Arming integration and original comparison
The native C++ shell now selects equipment through original mount hotspots and compatibility tables, preserves inventory conditions, changes missile types, and cycles single/career HERCs with the original assignment rules. The static bay body, equipment and selection artwork uses original coordinates and painter order. All 177 CTest checks pass, including 1,650 equipment exchanges, 360 menus, 270 missile selections and 128 HERC cycles from unchanged original routines. See ARMAMENT.md for boundaries and the missing Samson GL image indices. The corrected arming capture is ../earthsiege-cpp/build/arming-test.png.
Crew assignment integration
C++ now exposes the crew screen with original artwork and its dedicated palette. All 96 native sequences / 3,360 events agree, including preview swaps and Cancel. The input test verifies accepted assignments survive into mission launch. Arming was committed as 167cbd2. Analysis remains uncommitted.
Repair-screen transactions and native defects
Added complete component-repair event captures (128 sequences / 5,323 events) and eight construction plus 128 scrap/cancel transactions. Original quotes use mount-index weapon prices; Proceed can apply an extra condition band for free. Confirmed the unassigned-HERC share write over the crew-count/cursor header. These findings and the faithful-port safety boundary are in HANGAR_SERVICE.md. The C++ repair/policy/scrap UI is connected; all 180 tests passed before the subsequent caption/alignment-only correction. Construction screen ownership and remaining presentation integration continue. No analysis changes committed.
Construction control integration
The original MENU2000 handler now has 96 sequence captures / 1,424 events, including partial builds, cancellation, technology gates and unsigned material checks. C++ agrees on all states. The original blueprint and specification artwork is connected. UI verification covers building, cancellation, disabled cycling and save/reload. Empty reserved bays now remain inert on mission return. Recorded the original post-cancellation affordability omission and clarified that the normal build click stays in screen 2000, not registered layout 2010. Remaining work continues with launch validation and shell presentation.
Original shell launch validation
Captured 2,048 bay/map handler dispatches across 512 rosters and documented the stage-specific warnings, 50% leg/engine threshold, retained-cursor scan quirk and eight-bay construction guard in SHELL.md. C++ eligibility matches all captures; menu integration and original-format save scenarios are being verified.
The warning UI tests now pass all five original save-based scenarios; all 182 native CTest checks pass. Visual inspection found and corrected shared MENU999 panels and root-specific static fonts, also recorded in SHELL.md. The shell catalogue now exposes the briefing-map event handler and shared artwork IDs.
2026-10-29: Reconstructed separate GO shell TTM scheduler and compositor. 84 programs / 12,064 states / 19,820 requests match original execution; 4,662 full visible/background page pairs match original VGA raster output. Explicit scope excludes unsupported cinematic families and R4000A08's missing ROSEY5. Analysis remains uncommitted; native implementation is committed separately.
2026-10-29: Verified GO ambient sound script against 2,048 updates including 573 loads / 328 plays and shared RNG. Added original body damage layers to C++ bay views; 384 visible/background frame pairs match. Corrected analysis DMG1 record coordinates to signed 32-bit X/Y. All five affected native checks pass.
2026-10-29: Connected resident service-bay animations in C++. Verified 640 original ownership/elevator cases and 1,984 assembled VGA frame pairs, including all 17 partial-build stages. All 25 interpreter states and shared RNG agree. Confirmed the ordinary shared 120 Hz timer / period-two TTM callback in both startup code and the original snapshot. Seven affected native checks pass; remaining shell audio/presentation work continues. Analysis remains uncommitted.
2026-10-29: Connected original shell music transitions, workshop samples and one-turn weapon previews. Captured 16 music replacements / 848 events through GO's dispatcher and fade loop. All 189 native tests pass, including audible shell output and live preview movement. Blocking presentation/input boundaries remain explicit work; analysis changes remain uncommitted.
2026-10-29: Connected GO briefing maps and guided tours. Original comparisons cover 90 map frames across all campaign chapters/single categories, 3,069 tour updates with 62 frames, 39 opening frames, 79 hover labels and 500 shell-scaled bitmaps. All 674 contextual launches construct their maps. Found and documented GO's earlier cosine/scaler behavior and B0_C6_7A's uninitialized formation offsets. Analysis remains uncommitted; full native validation follows.
Briefing increment committed in the native tree as 2420e8f. All 194 native checks pass (20.27 seconds). Continuing with full environment presentation.
2026-10-29: Connected original horizon panoramas in native missions. All 576 background frames/placements and 96 cockpit-masked frames match original code. All 196 native checks pass (20.84 seconds); live cockpit screenshot inspected. Continuing with ground detail and clouds. Analysis remains uncommitted.
2026-10-29: Recovered native panorama integration after the service interruption and verified all 196 tests again. Connected original clouds/ground marks with 224 mark frames and 144 cloud frames / 501 draws, exact field and RNG comparisons. All 198 native checks pass (20.74 seconds). Continuing high-detail ground and combined environment checks. Analysis remains uncommitted.
2026-10-29: Recovered tracked integrations removed by an external bulk git reset, confirmed in the native reflog; no additional unreachable commits were found. Native high-detail ground matches 480 original frames and scratch bitmaps. Complete environment composition matches 288 original frames, all visual RNG state and reflective colours, plus 144 separate original palette cases. All 201 native tests pass (30.02 seconds); live cockpit screenshot inspected. Analysis remains uncommitted. Continuing original shell presentation ownership.
Shell dialogue integration: original selection, captions, SNC and portrait compositions now have independent native comparisons (209 entries, 45,319 mouth states, 164 texts, 621 caption frames, 629 selections and 159 complete portrait frames). Live single-mission/career speech flow and voice preferences pass. Capture scripts and reports are retained under tools/capture_shell_speech*.py and work/research/shell; device audio and explicit clock/page ownership remain stated boundaries. Native speech work is being committed; no analysis commit.
Cinematic operations: 820 updates / 18 programs and 2,096 original palette submissions agree, including both VGA pages. Original fade-in has a demonstrated uninitialized stack read; bounds and scratch-stack experiments are recorded in SHELL.md. Cinematic owner integration continues.
Live cinematic and campaign-return owners
Opening logos/story, chapter travel, pilot death, victory and defeat now run in the native shell with their original scripts and music choices. Input skips a segment; skipping Dynamix also suppresses LEAD_IN, while IINTRO and EARTH_W still run. --skip-intro matches the original -a boundary: opening and pilot death only. The terminal Earth loop waits for input. Next Mission uses commander briefing within a chapter, or mechanic/general/travel at the next chapter boundary.
Campaign return selects the mechanic's chain before automatic repairs, using HERC condition, new technology, recovery and crew deaths. All 648 original selections match the complete RNG state, including the one-choice technology random draw. Zero-condition primary entry -1 is safely omitted. The new live flow check covers natural opening completion, skip boundaries, ordinary return, death, both campaign endings and a chapter transition. Original-format saves remain isolated in the test's temporary directory.
The current host presents intermediate palette submissions at nominal 60 Hz. Original VGA routine 0x70130 only waits until already inside retrace, allowing multiple submissions per refresh depending on CPU speed. No wall-clock fade parity is claimed yet. Bay residents during speech, general monitor transitions, main-menu ANM playback and full owner scheduling remain separate work.
Full rebuild: all 209 CTest checks pass (20.06 seconds). Opening, chapter-travel and damaged-HERC mechanic-return screenshots were inspected.
Workshop animation during mechanic dialogue
Mechanic portraits now share the bay's actual visible and retained pages. Only resident programs 3 and 6 pause, as in GO; other workers, elevators and welding continue with the same RNG stream. Portrait cleanup returns both drawing pages to the bay before its two programs resume. No guessed overlay masks are used.
The original capture runs eight chassis/speaker/clip combinations and compares 104 complete frames, including post-dialogue cleanup, both page CRCs and every RNG word. All match. Existing bay, portrait, live speech and cinematic-flow checks also pass. Original sound-device timing remains an explicit boundary.
LPF menu doors
The two ANM resources are the closing (ESIEGE2) and opening (ESIEGE3) menu-door transitions, not a looping main-menu background. GO 0x13aa8/0x13d9e/0x13c46 loads, locates and decodes their LPF pages. Its native counterpart now matches all 60 captured complete frames, over both resources, two background patterns and opaque/saved-screen modes. The final ring delta is excluded. Written zero pixels restore the saved screen in transition mode; skip spans retain the prior frame. ESIEGE3's page directory is not in frame order.
Normal standalone playback uses the header's 15 fps. Menu calls at 0x3c2a4 and 0x3c734 instead select background restoration and omit that clock wait; their speed depends on decoding and VGA writes. Exact transition scheduling is separate from the verified decoder. The two call sites request digital sounds 10/11.
G0_ON/OFF/STAT are retained monitor assets, but no caller has yet been found: they are absent from GO's literal TTM names, the resident TM_FILES table and the general's G0_FILES speech list. Do not assume the original plays these assets merely because they exist. G0_SYNC is the verified general portrait program.
Live menu doors and credits
The shell now plays the original closing/opening ANMs at menu-region changes, including their digital sounds and saved-screen zero-pixel restoration. Input is consumed during the transition; speech waits until the doors open. Skipping the introductory movies still retains the closing doors. Warning dialogs retain their parent's region and cannot accidentally start a blocked transition.
Options / Credits now runs CREDIT_A and CREDIT_B and returns through the doors. Both original scripts match 12 captured updates and 310 palette writes. Their unused GETTEXTSTART producer metadata is ignored as in GO. A single-mission pilot death returns directly to mission selection, without a career death movie or spoken debrief.
The host presents each door frame at nominal 60 Hz. The original menu calls use saved-screen mode and omit the ANM header's 15 fps wait, so their wall-clock speed depends on CPU/VGA throughput. No original wall-clock pacing is claimed.
All 213 CTest checks pass. Closing, opening and credit screens were inspected.
Cockpit impact flash and displacement
Player torso/head damage that changes its condition band calls DBSIM 0x2e17c. This is a cockpit effect, not a general world-camera rotation: the outside projection stays fixed while the retained panel, clipping spans and widgets move vertically. Initial displacement stays within five pixels (upward on the forward and side views, downward on the lower panel). Forward/lower views expose adjacent artwork in the shared VGA surface; side views clear the exposed strip to index 63. Original frames for all four views are in analysis/cockpits/impact/index.html.
The effect owns a 60-unit UI-clock deadline. Repeated damage extends it without restarting the random sequence. Each active update chooses an unsigned 16-bit secondary-RNG value modulo five for motion. A strict clock > next-toggle test swaps palettes and draws a new modulo-ten interval. Expiry is cleared first; restoration happens on the next update. Mode 4 suppresses the effect. The authored IMPACT1.DPL is loaded unchanged; reflection entries 64–79 still use the separately cached base/impact endpoint, and shield indicator colours continue to update.
Original 0x243d4/0x24564/0x24750 move the two VGA page origins, subtract displacement from both rectangular and span-list scene clips, and translate the widget owner. View changes restore the old view (0x222c0), then resume with a ten-pixel range (0x242f6); external view cancels that resumption. Palette ownership and a pending view transition have separate gates.
capture_cockpit_impact.py records 5,005 original calls over 50 scenarios. The native owner agrees on both clocks, palette identities/flags, page origins, clip regions, widget translation and every secondary-RNG word, including repeated hits, view changes, suppressed effects, zero-clock sentinels and unsigned wrap. Graphical page save/copy and widget translation are explicit capture boundaries; original clip mutation executes unchanged. Separate initialized-original captures show complete images in each view. Whole-game frame scheduling remains a separate comparison from these controlled impact updates.
Career and debrief statistics
The career/history and mission return panels now use the original two CSTATS fonts, WATEXT labels and pixel positions. History inspection reads its selected backup without restoring it. The original MISC career field remains zero. Return panels retain personal and squad totals, casualties, recovered salvage and weapon count, and the final newly unlocked technology (or NONE).
Single missions now consume their original result records too: player chassis conditions, all participating crew health/current/lifetime kills/ranks, and squad totals. Temporary wingmate chassis disappear when the shell returns; there is no campaign restocking, crew replacement or technology progression. The unchanged launch MEC is distinct from the live post-return roster.
All 96 original complete panel rasters match. Twenty-four whole original single-mission returns match the complete crew block, live serialized roster, mission counters, casualties and squad totals. The full suite passed 215 checks; the initial fixture-file mistake was corrected, and all three affected checks (including the 216th check and live menu/history assertions) subsequently pass. Original capture scripts and browseable panels are in earthsiege-reverse.
2026-10-31 - sampled-image differences traced and closed
Traced original texture extent rejection, ATT draw order, retained idle captions, message/weapon overlap and OFFLINE label expansion, clock startup/page retention, the missing HDD subject light, slider saved backing and external-return planar copy order. The native corrections and independent original-code fixtures pass 260 tests. Four unchanged original replays retain all gameplay/camera/RNG, return-file and ordered non-engine audio agreement.
The timing-controlled whole-image audit has 114 exact images out of 120. All 230 pixels in the other six images are demonstrated consequences of the existing invalid radar partition repair; applying only that repair to the original renderer reproduces the native pixels with no extra changes. Original allocation-pointer perturbation proves the unmodified output depends on DOS heap contents. This remains an explicit departure, not an unexplained renderer error or a blanket whole-game pixel-perfect claim.
Full evidence and reproduction commands: PIXEL_FIDELITY.md. The analysis tree remains uncommitted; only native implementation work is committed.
2026-10-31 - authored missions and terminal campaign journeys
Prioritized mission content and gameplay over frame-scale audio retries. All 75 supported authored sources match 256 consecutive original/native frames, with their original activation and sides. Ten actual later-career handoffs add 2,560 frames; total new world comparison coverage is 21,760 frames. Six complete controlled-result campaign journeys match 121 original return/repair/save/next transactions through victory and defeat in all three battle sets.
Corrected native starting-damage/controller ordering, group-free construction notifications, ground updates during activation waits, zero-map objective resolution and BST random-mission-list selection. Live negative formation IDs have an explicit formation-zero fallback; inspection still marks them undefined. C5_70 demonstrates original deferred-queue corruption after 20 retirements; a controlled storage repair explains its later allocation/RNG difference. The original probe also now collects smoke emitters and puffs at phase five.
The existing 260 native tests and three new suites pass. Fixtures/provenance, instruction addresses, raw failed probes, corrected full captures and exact scope are recorded in MISSION_FIDELITY.md. This analysis tree remains uncommitted. No new audio timing work was needed.
Audio and documentation checkpoint for Earthsiege 2
Native commit 073d80a adds saved music-device selection, Munt,
SC-55/SCC-1A, SoundFont playback and verified ROM-fetch helpers. Forty original
MPU/MT-32 song cases match every output byte and sampled-percussion event. The
supplied data has no MT-32 melody route; original selection and the optional
MPU-401 experiment are documented separately. The final 272-test native suite
and six ASan/UBSan audio suites pass, including missing-ROM recovery before the
first song starts. Private window checks verify selection, restart and Cancel.
The public research update 7d61021 is pushed and its Pages deployment succeeded. Topic documents now distinguish completed native integration from inspection-browser choices. work/research/music/native-checkpoint.json` collects
the results and references. Analysis changes remain uncommitted. The user asked
to pause here for the Earthsiege 2 fork, then resume Earthsiege 1 gameplay testing.
Supplied-media audit resumed after the ES2 fork
The 1.0 completion notes omitted the supplied expansion archives. The media audit now records file/VOL hashes, both CD representations, original UNCHUNK extraction and distinct simulator builds. The 1996 reissue repeats all 178 original files; its 402 extras include the existing PDF and three demos. The expansion ISO matches all 65,872 MDF user-data sectors.
Twenty expansion CD volumes and seven matching floppy volumes are expanded. All 37 missions, 23 model files, 13 additional HMPs, 26 palettes and 148 bitmap resources decode without errors. work/research/releases publishes the inventory and original briefings. The expansion manual now has an OCR reference.
Separate DOSBox installs and a default edition selector are being verified. INSTALL_MEDIA.md records installer provenance and outstanding expansion work. The 1.0 regression results do not establish expansion runtime fidelity. Analysis remains uncommitted.
All three expansion builds now have successful original DOSBox Battleset 2 mission-launch captures. The CD ran B1_C0_0A; floppy and patched CD ran S2_RCN02. Their launch files and executable hashes are under work/research/releases/dosbox. All four launcher choices pass mount/selection checks. The browser passes Chromium checks, and the base source parser retains its 75-pass/two-legacy boundary after extraction into a shared module. No private DOSBox sessions from this audit remain running. Native documentation scope correction is committed as 17c5214; native runtime code and original 1.0 installs are unchanged.
2026-11-02: executable editions and graphics exposition
Copied the complete 31-file ES2DEMO installer tree to the sequel analysis media directory, verifying hashes and preserving its existing provenance. No install was generated. Found the original ESXPANPT ZIP and matched its executable to the bundled April patch. Retained its README beside the patch.
Compared all four ES1 simulators, generated a separate expansion decompilation, and accounted for every initialized application byte outside the changed expansion-revision routines. Original-code probes confirm scanner transform isolation, damage-exit flat-effect collection, radio latch reset, EMP2 double shots and ratio-scaled bullet lifetime. All 3,200 default projection fixtures and 512 Euler matrices match base versus expansion. Archive priority and new counted weapon/projectile formats are documented in SIMULATOR_VERSIONS.md. Isolated DOSBox captures establish the retained 320x400 layouts.
The public graphics walkthrough now has original-code progressive Samson drawing, environment layers, Gouraud band geometry, whole-polygon texture examples and planar-VGA diagrams. Sources are tools/build_graphics_article.py and analysis/graphics-engine/provenance.json; publication lives in the sibling earthsiege-exhumed repository. No original executable or installer is included in the public assets.
Published as earthsiege-exhumed commit bd8f0cd. GitHub Pages run 41371514136 completed successfully; the live graphics article returned HTTP 200 with its title and interactive script. Static validation covered 25 HTML documents and 945 files. Browser validation covered article controls, five viewport widths, dark mode and JavaScript-disabled fallback, plus all existing model, mission, sky and audio exhibits. Analysis changes remain uncommitted.
2026-11-06: separate publication from working research
Moved the former analysis/ tree intact to work/research/, checking all 65,679
files against their original sizes, inodes and modification times. Extraction,
capture and fixture tools now write to that ignored working tree. The C++ fixture
importers and public article import scripts use the relocated inputs.
analysis/ is now a curated publication, selected by
tools/analysis_publication.json and copied by tools/publish_analysis.py.
It retains the browsers, their decoded data, music auditions, finished figures
and linked reports. Raw replay streams, memory dumps, test matrices, temporary
DOSBox installs and disassembly projects remain local. The publication has its
own hash inventory and independent files; the publisher refuses to overwrite
manual edits or unmanaged files. See the layout guide.
Validation: all 16 main browser checks pass using direct file access. HTTP checks cover all 75 readable mission scenes, compilation alternatives and camera/overlay controls, plus model variants and 16 chassis loadouts, with no missing asset requests. The relocated original-code checks match 9,300 tape inputs and 2,390 world shading cases. Reimporting 16,896 lighting intensities, 512 light transforms and 169,947 music scheduler packets leaves the committed C++ fixture bytes unchanged. Python source files parse successfully after the path updates.
2026-11-06: full web archive staging
Added publish.sh and tools/publish/, following the Darker/TFX static archive
layout. The wrapper builds and verifies web-stage/, supports local build-only
and rsync dry-run modes, and targets the Earthsiege directory on lostengines.com.
Markdown reports have rendered headings, contents lists and source downloads;
the report directory is searchable. Staging uses the curated analysis inventory
and an explicit report/asset list. Original media, working captures and temporary
installs stay outside the stage. Unpublished working references have an
explanation page; links to the C++ project open on GitHub.
Checks cover local links and heading targets, file hashes, unexpected staging
files, protected output directories and upload failure handling. Chromium checks
use the /earthsiege/ prefix. This exposed the cockpit startup preview's dynamic
frame dependency; its 116 presentation PNGs are now in the curated inventory.
Small finished figures and reports cited by the prose were also retained.
The top-level ESXPANPT.ZIP has been moved to
install media/expansion_patch_1995_04/. All three archive members match the
previously extracted patch bytes. The executable is the April 10, 1995 expansion
revision already characterized and used by the patched comparison installation.
Expansion catalogue and native integration
The March CD expansion now appears throughout the main inspection browsers. The file-by-file catalogue accounts for all 4,274 members of its twenty volumes: 4,042 fully decoded records, 228 with partial semantic identification, two retained layout exceptions and two unchanged copies of CFG/TEST.DAT. The detailed resource and viewer counts are in EXPANSION_INTEGRATION.md. New assets keep their archive provenance; identical base resources reuse existing exports.
Independent original-code checks cover expansion model bindings, cockpit palettes, mission launches and starting worlds, fonts, films, recorded-input packets and the new campaign/technology paths. The C++ edition now includes Battleset 2 and career transfer, Apocalypse and the two new Cybrid HERCs, upgraded weapons, landing-craft combat, deployment pods, craters, speech/music overrides and both CD movies.
Runtime comparisons add 32 complete mission-return transactions, 192 deployment searches, 1,772 pod updates and 432 whole environment rasters. The last raster corrections were persistent ground scratch pixels and the expansion's crossed final sky quadrilateral. Each was traced to its original instructions, including side-cockpit and smaller viewport cases. No expected pixels or actor states feed the C++ implementation.
All 294 tests pass with the local optional music assets. Eleven expansion suites pass address/undefined-behaviour sanitizers and leak checking. Four complete demo integration runs consume all 11,421 recorded packets; they are not yet original whole-world state comparisons. Full expansion campaign playthroughs and broader consecutive comparisons remain useful additional validation.
The analysis publication contains only the curated catalogue, viewer resources and finished findings. New native captures remain under work/research and compact regression fixtures live in earthsiege-cpp. Analysis remains uncommitted.