Reconcile Lane C with canonical house-rule audit

Integrate verified source and data progress; exclude unproven COMMON ownership, held UB/asm forms, and address-named data credit. Stable sweep: 23 exact functions gained, zero lost.
This commit is contained in:
Jonas Volman committed 2026-09-22 23:12:40 -07:00
1 parent a01115aaf5
commit 4f4c85021d
88 files changed
+14680 -1799

No files matched your search

+1 -1
View File
@@ -682,7 +682,7 @@
{ "name": "source/game/game_engine.c", "index": 307, "status": "NonMatching" },
{ "name": "source/game/game_allegiance.c", "index": 308, "status": "NonMatching" },
{ "name": "source/game/game.c", "index": 309, "status": "NonMatching" },
{ "name": "source/game/cheats.c", "index": 310, "status": "Matching" },
{ "name": "source/game/cheats.c", "index": 310, "status": "NonMatching" },
{ "name": "source/game/aim_assist.c", "index": 311, "status": "NonMatching" },
{ "name": "source/effects/weather_particle_systems.c", "index": 312, "status": "NonMatching" },
{ "name": "source/effects/weather_particle_definitions.c", "index": 313, "status": "Matching" },
+63 -267
View File
@@ -96,44 +96,6 @@
"objdiff_percent": 89.73429
}
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_RGBToColor",
"class": "unclassified",
"measurements": {
"target": {
"size": 96,
"relocation_count": 0,
"normalized_sha256": "ca5bedfcc8216c56321d66212d39b53e22e075af0592c03f107014ba342e40c7"
},
"base": {
"size": 96,
"relocation_count": 0,
"normalized_sha256": "b58eb7a340fc8ef25b0d47b5511c1a9049c3de291030487fe17957ecadedbc86"
},
"objdiff_percent": 56.35294
},
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Initialize the four-byte color before its aggregate copy; do not restore the original indeterminate alpha read to regain bytes. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning."
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_Quantize",
"class": "unclassified",
"measurements": {
"target": {
"size": 528,
"relocation_count": 30,
"normalized_sha256": "01a6d9b9fd4dd740422a1ced163db15fea206d97a106b0471381584fce23e591"
},
"base": {
"size": 528,
"relocation_count": 30,
"normalized_sha256": "d3d27024351f575d957242049f1c3624288bc5c621f2dbe23d67e47dcc40acf1"
},
"objdiff_percent": 70.2013
},
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Retain ordinary endpoint quantization and three/four-color ordering through the genuine safe RGB conversion helpers; remaining helper scheduling is non-exact. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning."
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_EncodeBlockRGBColorKey",
@@ -147,30 +109,11 @@
"base": {
"size": 2640,
"relocation_count": 36,
"normalized_sha256": "3b24c3325027dbfaff9a94ceb067ae1b7b08fd6f84575066fd893502f2b2b80e"
"normalized_sha256": "9c023d1e693b57e9d252de6c54706af89ad0ec572744dc511b366cd55f954eb3"
},
"objdiff_percent": 63.242176
"objdiff_percent": 63.561905
},
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Retain the real covariance/axis/endpoint/selector graph. Initialize axis and selector packing, and handle zero-length quantized endpoints for mixed-alpha blocks too, preventing NaN conversion and invalid palette indexing. The held Alpha3 encoder is not imported. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning."
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_DecodeBlockRGB",
"class": "unclassified",
"measurements": {
"target": {
"size": 448,
"relocation_count": 2,
"normalized_sha256": "fea1c6a895d8bbee78184c8fc8b615b008c32a49e61881ea0024c78e926b3529"
},
"base": {
"size": 384,
"relocation_count": 3,
"normalized_sha256": "ae13c5e75781b0f81749dbab99aeaacb6e603d038a75ff2b05d445c23bbb36e5"
},
"objdiff_percent": 77.32895
},
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Retain the complete ordinary three/four-color block decoder with typed color/RGB helpers; remaining instruction selection and scheduling are non-exact. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning."
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Retain the real covariance/axis/endpoint/selector graph. Initialize axis and selector packing, and handle zero-length quantized endpoints for mixed-alpha blocks too, preventing NaN conversion and invalid palette indexing. The held Alpha3 encoder is not imported. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning. On 2026-09-21 (Lane C) ColorToFcolor's byte-to-real conversion was bound to a named `real` local, which made _Quantize strict exact. This function shares the RGBToColor/ColorToFcolor inlines, so its bytes moved and the base measurement is refreshed here. Its own residual is unchanged in class: it is frame-structural (January sub esp,0x1a8 vs our 0x19c, a missing local). Separately, an EXACT body for it is measured and held at scratch/cand/s3tc_owner_gated.c, but it requires three constructs the reviewer refused and the owner has not admitted: an uninitialised `long best_axis`, deleting `block->bitmap = 0;`, and an `&& cOpaque == 16` conjunct that divides by zero and indexes mapRGB3 out of bounds when cOpaque != 16."
},
{
"unit": "source/bitmaps/s3tc/s3tc",
@@ -183,13 +126,13 @@
"normalized_sha256": "430094b19ae6b9e585f8c77b2c063824b45c98e3ceea58ac1dd4e2049730247b"
},
"base": {
"size": 432,
"relocation_count": 11,
"normalized_sha256": "cc11abaf66fdd2eace5c9a6382c31a681c628c8483ce2a4b615c93c391fa8c30"
"size": 496,
"relocation_count": 10,
"normalized_sha256": "fa5385c3372ba60d98ab2c82e91481d4182918f84e64cafc528ba1e666a67dfb"
},
"objdiff_percent": 79.449104
"objdiff_percent": 99.27545
},
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Repair the null-source clear to four output bytes rather than the original 64-byte overrun. Require coordinates 0..3, not the original inclusive 4 which permits an invalid selector shift. Preserve the actual three/four-color palette implementation. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning."
"evidence": "Best currently integrated house-rule-compliant reconstruction from the 2026-09-07 PlayerProfile/S3TC reconciliation batch. Repair the null-source clear to four output bytes rather than the original 64-byte overrun. Require coordinates 0..3, not the original inclusive 4 which permits an invalid selector shift. Preserve the actual three/four-color palette implementation. See docs/object_matching_logs/player_profile_s3tc_batch_reconciliation_20260907.md for donor provenance, raw-target limits, full-batch review and research pointers. Zero exact credit; retain for future evidence-driven work without source-pressure tuning. On 2026-09-21 (Lane C, graphics/UI) RGBToColor's body was restored to January's in-place channel form and its `= { 0 }` initialiser dropped, which made RGBToColor and DecodeBlockRGB strict exact. This function's bytes moved as a consequence and the base measurement is refreshed here: its size and relocation count now EQUAL January's (the tag went from [size 432!=496, relocs 11!=10, sha] to [sha] only), so the remaining residual is ordering or selection rather than structure. Its January assert text (`u>=0 && u<=4` / `v<=4` against our `< 4`) is a separate owner-held January defect and is unchanged."
},
{
"unit": "source/saved games/player_profile",
@@ -542,17 +485,6 @@
"objdiff_percent": 91.233765
}
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_DecodeBlockAlpha3__single_pixel",
"class": "unclassified",
"evidence": "The retained function is coherent DXT5 alpha-decoding C with the target's named block structures and sole relocation, rather than a byte-oriented construction. The local symbol atlas maps January's own RVA to an exact-equivalent typed original-Xbox symbol that demangles to a const input block plus signed short/short coordinates; several August/September 2001 Xbox builds independently carry the same types for both single-pixel helpers. HCEA agrees but is only LLM re-sourced corroboration. A bounded width grid tested long/long (432 bytes, 93.677635%), long/short (448 bytes, 94.13816%), short/long (432 bytes, 93.2829%), and short/short (448 bytes, 94.13816%); the source-backed short/short signature is retained instead of selecting a full-width spelling merely because it matches the target size envelope. The remaining tail differs in argument promotion, register use, and accumulator scheduling, while the fail-closed classifier reports UNKNOWN. Reopen only with authentic Microsoft/Bungie source or evidence that naturally explains the promotions and tail schedule; never use artificial widths, dead logic, barriers, volatile qualifiers, or compiler controls for byte credit.",
"measurements": {
"target": { "size": 432, "relocation_count": 1, "normalized_sha256": "b869ae2d8e5be4b6efe4fef80b120931dfc7da90d6d9c21a03a60b019f8e6ba5" },
"base": { "size": 448, "relocation_count": 1, "normalized_sha256": "db57324424c861cd2aa46b18de4452ba9f44e124138cbc496e7884d616d70c79" },
"objdiff_percent": 94.13816
}
},
{
"unit": "source/bungie_net/common/thread_win32",
"function": "_get_mutex_from_pool",
@@ -651,25 +583,6 @@
"objdiff_percent": 99.43569
}
},
{
"unit": "source/bitmaps/bitmap_utilities",
"function": "_bitmap_2d_alpha_bleed",
"class": "instruction-scheduling",
"evidence": "Fuzzy-parked under the current house rule after selectively reconciling the coherent typed donor body and authenticating bitmap_2d_alpha_bleed from HCEA commit 570c83fd9c365dad6f2a3e7041705d5b84c7847c. Target and candidate have the same 560-byte padded envelope, 196 aligned instructions, and all 24 relocation identities. The only normalized difference is the order of two independent stack reloads at +0x191/+0x194 after the neighborhood loop: January reloads ECX then EAX, while VC7 reloads EAX then ECX. The retained source uses the natural row/neighborhood loops and typed bitmap access. No volatile access, barrier, fake dependency, assembly, undefined behavior, manual byte forcing, or nonsensical source is retained. Reopen only for authoritative January source/local records or a natural same-compiler scheduling donor.",
"measurements": {
"target": {
"size": 560,
"relocation_count": 24,
"normalized_sha256": "cd45e448842f8046230b47dbafdb56d1c273af2d59757dde48c47f6c19208e94"
},
"base": {
"size": 560,
"relocation_count": 24,
"normalized_sha256": "6c6241f24b04a6ac891bc1c8f5eb5957c70ec09aa910ecc94ba41535b8bb264f"
},
"objdiff_percent": 99.934784
}
},
{
"unit": "source/render/render_particles",
"function": "_render_particles",
@@ -1026,7 +939,7 @@
"base": {
"size": 992,
"relocation_count": 59,
"normalized_sha256": "2e0bbd84c45f240758cc76a2d4df8c78be689cfe9bc21af6a52e017f218e7ca0"
"normalized_sha256": "0bd88e42b1b36f4e9df5a8bed007887a18a1443d6f895f15ea9d275f2f6526c4"
},
"objdiff_percent": 60.99099
}
@@ -1050,44 +963,6 @@
"objdiff_percent": 99.35952
}
},
{
"unit": "source/interface/hud",
"function": "_hud_show_action_response",
"class": "private-register-convention",
"evidence": "Fuzzy-parked under the current house rule after reconstructing the complete action-response dispatcher as ordinary typed C from January disassembly and relocation topology plus the later HCEA semantic recovery at commit 570c83fd9c365dad6f2a3e7041705d5b84c7847c. The retained function handles all named respawn failures and player action-result enums, typed object/unit/control/weapon access, weapon-HUD messaging icons, custom game-engine text, driver/gunner suppression, and the target-attested odd inventory loop. Its 1024-wide-character state buffer recovers January's 0x82c frame, and its instruction count is 626 against January's 631. The remaining boundary is January's private EAX argument convention and common-tail selection: the public C spelling compiles with a stack argument and one extra relocation, while an explicit __fastcall experiment used the stack plus ret 4 and materially worsened the function. Register hints, duplicated fallbacks, declaration/order variants, and alternate icon/seat access shapes did not close the residual. No forced convention shim, naked wrapper, assembly, volatile access, optimizer carrier, raw offset, fake dependency, undefined behavior, or nonsensical branch is retained. Reopen only for authoritative January source/local records or natural same-compiler evidence explaining the private EAX convention and fallback tail sharing. On September 14 (lane opus/150k-house-clean-20260914, wave w2, adversarially verified) the sibling _hud_draw_screen reopen re-reads player->action_object_index and player->unit_index at each use as January does, giving this parked callee its private EAX ABI; the body is now target-size and relocation-count exact (1744/120) and strictly closer, with an EBX/EDI callee-saved register mirror remaining. See docs/object_matching_logs/hud_obj_opus5_150k_w2_20260914.md.",
"measurements": {
"target": {
"size": 1744,
"relocation_count": 120,
"normalized_sha256": "bfe1022d2e8f59dc3220b33c497fed91681596b485f4cb2b9339454fe27ec317"
},
"base": {
"size": 1744,
"relocation_count": 120,
"normalized_sha256": "c3e389512e793e3f30c928b755506131ce5a2d1f95fbc4a547fb31eec929bdf1"
},
"objdiff_percent": 94.235954
}
},
{
"unit": "source/bitmaps/bitmap_utilities",
"function": "_bitmap_3d_smooth",
"class": "unclassified",
"evidence": "Fuzzy-parked under the current house rule after reconstructing the complete 3D separable smoothing algorithm in ordinary typed C from January disassembly, relocation and diagnostic evidence, cross-checked against the later HaloCEA implementation. The retained body verifies the 3D bitmap and filter, preserves the target's oversized-filter warning and unused newline vararg, allocates the full pixel-data scratch buffer, performs toroidally wrapped X, Y, and Z convolution passes over every channel, copies the full scratch buffer back as January does, reports allocation failure, and frees at source line 0x33E. January is 1,824 padded bytes and the candidate is 1,792; both have 28 relocations and the refreshed report records 78.04 percent similarity. The fail-closed classifier returns UNKNOWN; the remaining difference is broad C2 frame/register/address scheduling, not missing logic. No forced inline/noinline, barrier, volatile or register forcing, pragma, assembly, fake dependency, undefined behavior, invented helper, or nonsensical branch is retained. The September 8 S3TC owner-header addition did not edit this body and changed only its already-fuzzy translation-unit schedule; it still receives zero exact credit. Reopen only for authoritative January source/local records or a natural compatible-compiler donor that explains the remaining schedule. On September 14 (lane opus/150k-house-clean-20260914, wave w1, adversarially verified) the sibling bitmap_2d_shrink / bitmap_3d_shrink / bitmap_2d_uncompress_from_mipmap reopens restored January's definition order and helper ABIs; this unchanged parked body's schedule moves (same size and relocations), still fuzzy. See docs/object_matching_logs/bitmap_utilities_obj_opus5_150k_w1_20260914.md. Re-measured 2026-09-16 for the bitmap_utilities.h owner packet (color structs moved from the .c and six public prototypes added): this body's source is unchanged, but its normalized bytes shift with the file's declaration count (still 1792 bytes / 28 relocations, non-exact before and after); the packet makes _bitmap_2d_smooth strict exact with zero exact losses board-wide.",
"measurements": {
"target": {
"size": 1824,
"relocation_count": 28,
"normalized_sha256": "747a45c66bf64a1173294daa196597534368e72d120f3715e324e42c4fbd717a"
},
"base": {
"size": 1792,
"relocation_count": 28,
"normalized_sha256": "dbdbd0bafa0bb62473ea8f137a0d3075e194123bf8705d26834b8f27fea5a5e0"
},
"objdiff_percent": 78.04
}
},
{
"unit": "source/bitmaps/bitmap_utilities",
"function": "_bitmap_sharpen",
@@ -1107,44 +982,6 @@
"objdiff_percent": 100.0
}
},
{
"unit": "source/rasterizer/rasterizer_frame_statistics",
"function": "_eat_my_shorts",
"class": "unclassified",
"evidence": "Fuzzy-parked under the current house rule after retaining the ordinary unsigned-word comparator required by the exact dynamic-vertex counter. The semantic private name eat_my_shorts is authenticated by the imported January/Halo CE symbol evidence, and January's jbe branch proves the strict first > second predicate used by qsort_2byte. The source preserves that early-return structure directly: return TRUE when first is greater, otherwise return FALSE. VC7 collapses the natural source to seta and one return in 16 padded bytes, while January preserves two explicit returns in 32 padded bytes; the fail-closed classifier identifies only its R5 control-flow-return-shape signature and grants no match credit. A same-size result-variable spelling was rejected because it changes the source topology solely to steer code generation. No volatile/register forcing, barrier, pragma, assembly, undefined behavior, fake dependency, or nonsensical branch is retained. Reopen only for authoritative January source/local records or a natural same-compiler context that preserves both source-authentic early exits.",
"measurements": {
"target": {
"size": 32,
"relocation_count": 0,
"normalized_sha256": "272173574597a002350643c155ed196ad630c283059b477e0743dbf755f77f6e"
},
"base": {
"size": 16,
"relocation_count": 0,
"normalized_sha256": "824636ceaea1b9fd752c3bd2d2e627269d300d2dbc33b596caea74e2aeaa9d0c"
},
"objdiff_percent": 58.18182
}
},
{
"unit": "source/rasterizer/rasterizer_frame_statistics",
"function": "_rasterizer_frame_statistics_count_static_vertices",
"class": "unclassified",
"evidence": "Fuzzy-parked under the current house rule after restoring the complete ordinary typed static-vertex counter from January's instruction stream and the target-authenticated triangle_buffer and vertex_buffer layouts. It returns zero for either null buffer or an unsupported type, triangle_buffer->count + 2 for _triangle_buffer_type_precompiled_strip, and vertex_buffer->count for _triangle_buffer_type_triangles. January and the candidate share the 64-byte padded envelope, zero relocations, and the complete semantic branch/value topology; objdiff reports 87.8 percent similarity. The residual is a VC7 callee-save/epilogue schedule: January delays push esi until after the first null test and places an alignment nop between pop esi and pop ebp, while the natural typed source saves ESI before that branch. Combined and nested null guards compile to the same fixed point, and the fail-closed classifier returns UNKNOWN. No forced inline/noinline, volatile/register forcing, barrier, pragma, assembly, fake dependency, raw offset, undefined behavior, or nonsensical branch is retained. Reopen only for authoritative January source/local records or a natural compatible-compiler context that explains the delayed ESI save.",
"measurements": {
"target": {
"size": 64,
"relocation_count": 0,
"normalized_sha256": "abb0cdbbf190c800ba8155c28e0a784c40db9fd088fd6ff879704b736ecce18c"
},
"base": {
"size": 64,
"relocation_count": 0,
"normalized_sha256": "df987f2500b4f059b29f638e8a3c6bc588dbbaf1410573fbac13cff295c3a60d"
},
"objdiff_percent": 87.8
}
},
{
"unit": "source/interface/virtual_keyboard",
"function": "_virtual_keyboard_select",
@@ -2202,11 +2039,11 @@
"unit": "source/ai/ai",
"function": "_ai_test_ballistic_line_of_fire",
"class": "instruction-scheduling",
"evidence": "Complete typed ballistic trajectory, world-collision, friendly-pill, and debug-recording reconstruction from January code/relocations and HCEA semantics. Target and candidate are both 944 padded bytes with all 49 relocations. Remaining differences are compiler-local x87 and independent instruction scheduling. No fake dependency, raw offset, forced inline, or nonsensical logic is retained. Zero exact credit. See docs/object_matching_logs/ai_obj_large_visibility_spatial_packet_20260909.md. 2026-09-20 Lane A re-baseline (zero exact credit): the recorded 250K-lane w3c 'b5' shape is rebuilt from this baseline and landed. Three changes: block-scope segment_time to the coordinate statement; parenthesise the linear term of the z row as (segment_time * arc_velocity.k + point.z); spell the post-call velocity update as (segment_end_time - segment_start_time) * gravity + arc_velocity.k. Instruction counts become 296/296 (HEAD was 292/296) and objdiff rises 94.50 to 98.99645. It reproduces January's x87 structure for segment_time exactly: fsubr of the parameter home at +0x1e7, fst (store-and-keep) to a dead parameter home at +0x1f4, and a post-call fld from that same home at +0x2cc feeding fmul gravity / fadd / fstp. Surviving hunks: an ebx/edi reload transposition at +0x159, a collision_flags/segment_time parameter-home swap, one 3-versus-2 x87 hunk at +0x21a and a consequent 3-byte alignment pad. Reopen only with a spelling that materialises the second x87 copy the way January does; do not replay operand or declaration sweeps.",
"evidence": "Complete typed ballistic trajectory, world-collision, friendly-pill, and debug-recording reconstruction from January code/relocations and HCEA semantics. Target and candidate are both 944 padded bytes with all 49 relocations. Remaining differences are compiler-local x87 and independent instruction scheduling. No fake dependency, raw offset, forced inline, or nonsensical logic is retained. Zero exact credit. See docs/object_matching_logs/ai_obj_large_visibility_spatial_packet_20260909.md. 2026-09-20 Lane A re-baseline (zero exact credit): the recorded 250K-lane w3c 'b5' shape is rebuilt from this baseline and landed. Three changes: block-scope segment_time to the coordinate statement; parenthesise the linear term of the z row as (segment_time * arc_velocity.k + point.z); spell the post-call velocity update as (segment_end_time - segment_start_time) * gravity + arc_velocity.k. Instruction counts become 296/296 (HEAD was 292/296) and objdiff rises 94.50 to 98.99645. It reproduces January's x87 structure for segment_time exactly: fsubr of the parameter home at +0x1e7, fst (store-and-keep) to a dead parameter home at +0x1f4, and a post-call fld from that same home at +0x2cc feeding fmul gravity / fadd / fstp. Surviving hunks: an ebx/edi reload transposition at +0x159, a collision_flags/segment_time parameter-home swap, one 3-versus-2 x87 hunk at +0x21a and a consequent 3-byte alignment pad. Reopen only with a spelling that materialises the second x87 copy the way January does; do not replay operand or declaration sweeps. 2026-09-22 integration rebaseline: shared declaration context changed the normalized code hash while preserving the 944-byte envelope and all 49 relocations; similarity improves to 99.05674, with zero exact-row regressions. No new exact credit is claimed.",
"measurements": {
"target": { "size": 944, "relocation_count": 49, "normalized_sha256": "6c90076033e91f26356e42166cf4bb0a8d5a902ae35bc67db15aec19ee9982ac" },
"base": { "size": 944, "relocation_count": 49, "normalized_sha256": "5c03c751c19c33cde8c6645c5fd39d505e2bca6bf161beb6e6126101f3fbcaa8" },
"objdiff_percent": 98.99645
"base": { "size": 944, "relocation_count": 49, "normalized_sha256": "ea5eb3a40fbddb9d60f2bcbfeaf6a207f59a2bafe156cff1cc65aee0406692ae" },
"objdiff_percent": 99.05674
}
},
{
@@ -2253,17 +2090,6 @@
"objdiff_percent": 100.0
}
},
{
"unit": "source/structures/leaf_map",
"function": "_intersect_planes3d",
"class": "unclassified",
"evidence": "Best complete house-rule-compliant plane-intersection reconstruction retained from the interrupted Opus Leaf Map graph. Same-build symbols authenticate the private name and January's calls/constants/assertions authenticate the algorithm. The source uses typed point copies for projection instead of representation-pointer casts. Target is 368 padded bytes and canonical is 400; both have 15 relocations. Objdiff reports 83.8 percent and no precise natural source-level mechanism is proved. Zero exact credit. See docs/object_matching_logs/leaf_map_obj_private_graph_reconciliation_20260909.md.",
"measurements": {
"target": { "size": 368, "relocation_count": 15, "normalized_sha256": "a0b61bbc6c485e42fbef0dc01a08a7253c8482ba6e064301a7841894e54a0877" },
"base": { "size": 400, "relocation_count": 15, "normalized_sha256": "eab2397552382149e33587ca367acb312ca6a326f1d855f28cc7543813104c26" },
"objdiff_percent": 83.8
}
},
{
"unit": "source/structures/leaf_map",
"function": "_leaf_map_build_portals_from_leaf",
@@ -2319,17 +2145,6 @@
"objdiff_percent": 95.87124
}
},
{
"unit": "source/rasterizer/xbox/rasterizer_xbox_models",
"function": "__rasterizer_model_transparent_geometry_submit",
"class": "tu-context-optimization",
"evidence": "Best complete typed transparent-group submission reconstruction retained from the Opus rasterizer lane. January is 1,296 padded bytes/83 relocations and the combined canonical candidate is 1,344/93 at 89.129036 percent similarity. The extra relocations and code reflect unresolved January caller-specific real_math helper ownership, not missing branches. It preserves the full queue/immediate-group behavior under semantic private-global names and uses cseries SET_FLAG for its geometry policy. The complete private backend contract now lives in the narrow Xbox models owner header with the genuine non-const shader type; that ownership correction changes only compiler scheduling in this already-fuzzy owner and adds no exact credit. No forced inline, header-suppression trick, raw offset, fake dependency, undefined behavior, or nonsensical logic is retained. Zero exact credit. See docs/object_matching_logs/rasterizer_xbox_models_obj_opus_reconciliation_20260909.md. Re-measured 2026-09-16 for the shader_definitions.h radiosity/physics nesting packet: the struct layout and offsets are unchanged, but the header's added declarations shift this fuzzy body's normalized code (still 1344 bytes / 93 relocations, objdiff 89.129 -> 89.008); it was non-exact before and after, and the packet makes _rasterizer_transparent_geometry_group_draw strict exact with zero exact losses board-wide. Re-measured 2026-09-19 after restoring real_rgb_color_to_pixel32 to its authentic bitmaps inline/header ownership: the unchanged zero-credit body returns to the previously documented 1,344/93 hash and 89.129036 percent state, with no inherited exact-function regression.",
"measurements": {
"target": { "size": 1296, "relocation_count": 83, "normalized_sha256": "7b84b560459ad2dda9183d24997e2bf23d7d14ad1e19fa27ba689241819fbd5d" },
"base": { "size": 1344, "relocation_count": 93, "normalized_sha256": "8fb7c26befa120e17d2ce14b97c0683b37967cf4fc774a1387a90465155c86e0" },
"objdiff_percent": 89.129036
}
},
{
"unit": "source/rasterizer/xbox/rasterizer_xbox_models",
"function": "__rasterizer_model_draw",
@@ -2337,41 +2152,19 @@
"evidence": "Best complete typed model draw reconstruction retained from the Opus rasterizer lane after house-rule reconciliation. January and the candidate are both 5,168 padded bytes; January has 350 relocations and the candidate has 348 at 95.32371 percent similarity. The established REAL_MATH_EXTERNAL_POINT_FROM_LINE3D include schedule remains in force and this TU emits no point_from_line3d COMDAT. The shader-plasma access now uses its authentic enclosing definition instead of a raw byte offset, texture-animation outputs use true real_vector4d storage, self-illumination colors are interpolated component by component without incompatible point/vector/color casts, and the atmosphere-dominant test uses the named flag. These defined semantic choices account for part of the measured residual and are retained rather than restoring the closer prohibited representation-cast form. The correctly owned environment-fog backend declaration changes only compiler scheduling in this already-fuzzy owner and adds no exact credit. Semantic model-effect enums and render_lighting fields replace misleading donor placeholders. No forced inline, fake dependency, raw offset, representation pun, undefined behavior, or nonsensical branch is retained. Zero exact credit. See docs/object_matching_logs/rasterizer_xbox_models_obj_opus_reconciliation_20260909.md. On September 14 (lane opus/150k-house-clean-20260914, header packet P6) the real_math.h real_local_random_range named-result correction changed only this unchanged, already-fuzzy body's allocation hash at identical size and relocations (5168/348, sha 112b4321...), the same alternate hash measured under the P7, P8 and P9 real_math.h evaluations (header-inline definition effect). No source change. Re-measured 2026-09-19 after restoring real_rgb_color_to_pixel32 to its authentic bitmaps inline/header ownership: the unchanged zero-credit body returns to the previously documented 5,168/348 hash and 95.32371 percent state, with no inherited exact-function regression.",
"measurements": {
"target": { "size": 5168, "relocation_count": 350, "normalized_sha256": "99d8b95f1ce011781cedc3a123887065a0f8af4a54c842194fcd90c22fa2cc4e" },
"base": { "size": 5168, "relocation_count": 348, "normalized_sha256": "23ca80471861b904938ae52617a1931ea48279e746341e540d1874a7701dbd35" },
"objdiff_percent": 95.32371
}
},
{
"unit": "source/rasterizer/xbox/rasterizer_xbox_environment_fog",
"function": "_rasterizer_environment_fog_screen_active",
"class": "instruction-scheduling",
"evidence": "Best reviewed semantic reconstruction of the private screen-fog activity cache, retained from the Opus rasterizer lane. January and candidate are both 512 padded bytes, 42 relocations, and 138 instructions. Aligned disassembly confines the remaining mismatch to independent scheduling of the initial activity-byte clear against the frame-index comparison and the final activity-byte load against density stores. The retained body validates the current window and screen definition, caches the per-window activity flag by frame, and computes local_fog_eye_density with project types and named fields. No declaration permutation, compiler steering, duplicate shared layout, representation cast, raw address, fake dependency, undefined behavior, forced inline, or nonsensical branch is retained. Zero exact credit. See docs/object_matching_logs/rasterizer_xbox_environment_fog_obj_opus_screen_end_reconciliation_20260909.md.",
"measurements": {
"target": { "size": 512, "relocation_count": 42, "normalized_sha256": "ea96544f961a628945353c8e51d4b6f6d23d0a311d2822cb7180c1ced9d5da3d" },
"base": { "size": 512, "relocation_count": 42, "normalized_sha256": "19b4d27dcd140be10cbcea9e2eb0ba9d9238c5e10eedc7011f47c5af924ded7f" },
"objdiff_percent": 97.25564
}
},
{
"unit": "source/bitmaps/bitmaps",
"function": "_bitmap_2d_get_pixel",
"class": "unclassified",
"evidence": "Complete natural typed two-dimensional bitmap pixel reader retained from the 2026-09-09 bitmap packet. It follows the format-aware mipmap addressing and color conversion graph, but the current candidate is 1,200 padded bytes and 64 relocations versus January's 1,296 bytes and 67 relocations. The missing target schedule is not filled with guessed branches or byte-forcing source. Zero exact credit. See docs/object_matching_logs/bitmaps_obj_natural_reconstruction_packet_20260909.md.",
"measurements": {
"target": { "size": 1296, "relocation_count": 67, "normalized_sha256": "8d11e53e96af45f9a8b00f2daf6140159157cd09cfe9d79b4afa06acb787c215" },
"base": { "size": 1200, "relocation_count": 64, "normalized_sha256": "37e2a79e1edd171d28cbb715f9d525367b09cd0f22b1322837065e492f456741" },
"objdiff_percent": 74.77802
"base": { "size": 5168, "relocation_count": 348, "normalized_sha256": "89b0d7ea77a71d69d21eda1926e973006f54ed531bf346aaa87a18718e225c01" },
"objdiff_percent": 95.08453
}
},
{
"unit": "source/main/main",
"function": "_main_frame_rate_debug",
"class": "unclassified",
"evidence": "Complete natural frame-rate diagnostic state machine retained from the 2026-09-09 Main packet. It uses the authenticated Main state, project types, and ordinary file/time APIs. The candidate is 528 padded bytes with 51 relocations versus January's 544 bytes and 52 relocations; the remaining code-generation difference is explicitly fuzzy. No barrier, volatile carrier, fake dependency, raw address, or exact-only branch is retained. Zero exact credit. See docs/object_matching_logs/main_obj_natural_state_and_render_packet_20260909.md.",
"evidence": "Complete natural frame-rate diagnostic state machine retained from the 2026-09-09 Main packet. It uses the authenticated Main state, project types, and ordinary file/time APIs. The candidate is 528 padded bytes with 51 relocations versus January's 544 bytes and 52 relocations; the remaining code-generation difference is explicitly fuzzy. No barrier, volatile carrier, fake dependency, raw address, or exact-only branch is retained. Zero exact credit. See docs/object_matching_logs/main_obj_natural_state_and_render_packet_20260909.md. 2026-09-22: two January-attested corrections landed. The sample-index wrap is a SIGNED modulo in January (movsx/and 0x80000007/jns fixup), so NUMBEROF (size_t) was wrong and the divisor is a signed 8; this closed the whole 16-byte size gap and the candidate is now 544 padded bytes, exactly January's size. The slow-frame threshold literal is 0.036000000000000004 (__real@3fa26e978d4fdf3c), one ULP above the decimal 0.036 we had, so January's source folds an expression rather than writing the decimal; spelled 1.08/TICKS_PER_SECOND, which reproduces the constant exactly. The remaining residual is one duplicated framerate_sample_index load that January's jump-threading emits on the debug-true edge (51 vs 52 relocations) plus the register assignment that follows from it.",
"measurements": {
"target": { "size": 544, "relocation_count": 52, "normalized_sha256": "17546b1f02410f30e6fc728300d275c40d65bf6cb6a35a096a8d735f96512d83" },
"base": { "size": 528, "relocation_count": 51, "normalized_sha256": "5608160797d3d13d3bcb562329ef3ab715e43cf5b5add8d94035bc62893e71d3" },
"objdiff_percent": 94.67308
"base": { "size": 544, "relocation_count": 51, "normalized_sha256": "c2c8fd8f775a01fc893be42b6223733665e2bf7845312f06a1725aa626af419b" },
"objdiff_percent": 94.51923
}
},
{
@@ -2381,8 +2174,8 @@
"evidence": "Complete natural Main timing and vblank-throttle reconstruction retained from the 2026-09-09 packet. It uses named fields in the authenticated rasterizer/Main state and the genuine profiler APIs. Target and candidate are both 1,440 padded bytes, but January has 117 relocations and the candidate has 118 with different normalized code. The rejected compiler-barrier experiment is not retained. Zero exact credit. See docs/object_matching_logs/main_obj_natural_state_and_render_packet_20260909.md.",
"measurements": {
"target": { "size": 1440, "relocation_count": 117, "normalized_sha256": "b32677fb6c4cc6bcd664b98bfc5cc962b68bdf65228a31759b52574becdf200b" },
"base": { "size": 1440, "relocation_count": 118, "normalized_sha256": "5f8cfd1a03e2d4faddfd96d46f25ce9676ab650b4f12f4a8351bb5dc9f1bfba2" },
"objdiff_percent": 62.50114
"base": { "size": 1440, "relocation_count": 118, "normalized_sha256": "f4d7bb79a5351f50f1d0000d2b51234c1eb7d2abc44116032c537fd5f47cf3f1" },
"objdiff_percent": 62.637814
}
},
{
@@ -2404,25 +2197,6 @@
"objdiff_percent": 60.86127
}
},
{
"unit": "source/interface/motion_sensor",
"function": "_render_blip",
"class": "unclassified",
"evidence": "Best reviewed house-rule-compliant natural reconstruction retained from the 2026-09-09 reconciliation. Current canonical target/base COFF measurements remain non-identical; objdiff similarity is diagnostic only. This is a fuzzy research waypoint with zero exact-function and zero exact-byte credit. See docs/object_matching_logs/lane_reconciliation_batch5_fuzzy_ui_world_20260909.md.",
"measurements": {
"target": {
"size": 400,
"relocation_count": 18,
"normalized_sha256": "67347be9f029e06db7df599121540e3f2d416555d004f40e760cf1065dbbef09"
},
"base": {
"size": 384,
"relocation_count": 17,
"normalized_sha256": "8c61fb3da182c48052bc9bb1182738b3d42f0c40996ac5afb7932902c6b7d6e3"
},
"objdiff_percent": 78.8062
}
},
{
"unit": "source/interface/motion_sensor",
"function": "_render_motion_sensor",
@@ -2554,17 +2328,6 @@
"objdiff_percent": 93.48387
}
},
{
"unit": "source/rasterizer/rasterizer_lights",
"function": "_rasterizer_lens_flares_submit_occlusion_tests",
"class": "unclassified",
"evidence": "Complete natural lens-flare occlusion submission reconstructed from the January instruction/relocation topology and the Opus rasterizer donor packet. Target and candidate both occupy 400 bytes with all 22 relocation identities, but their normalized streams remain different. No control-flow fabrication or compiler steering is admitted; the fail-closed class claims no unsupported mechanism and the body receives zero credit. Donor provenance: commit 74e015673.",
"measurements": {
"target": { "size": 400, "relocation_count": 22, "normalized_sha256": "1c79f999dc13e23a8c403b87948660413ea7a09a495a32d890c3abc3a5086612" },
"base": { "size": 400, "relocation_count": 22, "normalized_sha256": "687bd511d2c7222074da7c9352197282f1337358ff1c8a506e4e98f6355cb948" },
"objdiff_percent": 96.3871
}
},
{
"unit": "source/math/geometry",
"function": "_convex_hull2d_perimeter",
@@ -2598,17 +2361,6 @@
"objdiff_percent": 80.76382
}
},
{
"unit": "source/render/render_cameras",
"function": "_render_frustum_sphere_visible",
"class": "unclassified",
"evidence": "Complete typed frustum-sphere visibility reconstruction retained from the reconciled Fable packet. January, HCEA, and preserved PC history authenticate the bounds and six-plane behavior; target and candidate share 432 bytes and six relocations, while the final classification/control-flow lowering remains different. Comparison/return-shape tuning is rejected and the body receives zero credit. See docs/object_matching_logs/render_cameras_obj_jonas_sphere_visibility_boundary_20260829.md.",
"measurements": {
"target": { "size": 432, "relocation_count": 6, "normalized_sha256": "2bdb31a0158b5a23314020bcccb8931e8bcc74c2b357d56305c687c16b91f949" },
"base": { "size": 432, "relocation_count": 6, "normalized_sha256": "8bded9be55c3f53ba980619ea443350230675ee9dd6337b7ec675c14950d905e" },
"objdiff_percent": 89.36364
}
},
{
"unit": "source/hs/hs_runtime",
"function": "_render_debug_trigger_volumes",
@@ -2649,6 +2401,50 @@
"base": { "size": 304, "relocation_count": 25, "normalized_sha256": "124019ea872d584781a0c8424c9fbce31bc491ba51226808716bc6e4335a2062" },
"objdiff_percent": 93.74227
}
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_player_profile_1wide_list_update",
"class": "csplit-relocation-alias",
"evidence": "Not a code-generation difference: an address-attribution alias in csplit's relocation naming, the same class as thread_win32::_get_mutex_from_pool. cached_player_profile holds three 52-byte entries at image address 5841376, so a natural bound of &cached_player_profile[NUMBER_OF_CACHED_PLAYER_PROFILES] resolves to 5841532, one byte past its extent. VC7 correctly emits that as _cached_player_profile+156; csplit attributes the address to the next image symbol and spells it _local_player_index_for_draw_string_and_hack_in_icons+0. Both resolve to 5841532, proven through config/symbols.json. Target and candidate have identical code bytes (the gate tag is [reloc-identity] with zero differing code regions), identical relocation count, and identical relocation offsets and types; only this one symbol spelling differs. No C source makes VC7 name the successor symbol, so there is no source lever. Zero credit. Reopen only if csplit's relocation attribution is changed to prefer the containing symbol for a one-past-the-end address, or if authentic January source shows a different bound.",
"measurements": {
"target": { "size": 1152, "relocation_count": 70, "normalized_sha256": "c33a03c5370763cce87d6439786cd14c4e6297ae1e4069d83eb4b451b770bdd8" },
"base": { "size": 1152, "relocation_count": 70, "normalized_sha256": "c33a03c5370763cce87d6439786cd14c4e6297ae1e4069d83eb4b451b770bdd8" },
"objdiff_percent": 100.0
}
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_player_profile_3wide_list_update",
"class": "csplit-relocation-alias",
"evidence": "Not a code-generation difference: an address-attribution alias in csplit's relocation naming, the same class as thread_win32::_get_mutex_from_pool. cached_player_profile holds three 52-byte entries at image address 5841376, so a natural bound of &cached_player_profile[NUMBER_OF_CACHED_PLAYER_PROFILES] resolves to 5841532, one byte past its extent. VC7 correctly emits that as _cached_player_profile+156; csplit attributes the address to the next image symbol and spells it _local_player_index_for_draw_string_and_hack_in_icons+0. Both resolve to 5841532, proven through config/symbols.json. Target and candidate have identical code bytes (the gate tag is [reloc-identity] with zero differing code regions), identical relocation count, and identical relocation offsets and types; only this one symbol spelling differs. No C source makes VC7 name the successor symbol, so there is no source lever. Zero credit. Reopen only if csplit's relocation attribution is changed to prefer the containing symbol for a one-past-the-end address, or if authentic January source shows a different bound.",
"measurements": {
"target": { "size": 1232, "relocation_count": 71, "normalized_sha256": "00c90368ad7f0a0ea918ef5d4425050b17bfd917eced2a27dbac0dab47d6a9a9" },
"base": { "size": 1232, "relocation_count": 71, "normalized_sha256": "00c90368ad7f0a0ea918ef5d4425050b17bfd917eced2a27dbac0dab47d6a9a9" },
"objdiff_percent": 100.0
}
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_player_profile_update_cache_for_nwide_list",
"class": "csplit-relocation-alias",
"evidence": "Not a code-generation difference: an address-attribution alias in csplit's relocation naming, the same class as thread_win32::_get_mutex_from_pool. cached_player_profile holds three 52-byte entries at image address 5841376, so a natural bound of &cached_player_profile[NUMBER_OF_CACHED_PLAYER_PROFILES] resolves to 5841532, one byte past its extent. VC7 correctly emits that as _cached_player_profile+156; csplit attributes the address to the next image symbol and spells it _local_player_index_for_draw_string_and_hack_in_icons+0. Both resolve to 5841532, proven through config/symbols.json. Target and candidate have identical code bytes (the gate tag is [reloc-identity] with zero differing code regions), identical relocation count, and identical relocation offsets and types; only this one symbol spelling differs. No C source makes VC7 name the successor symbol, so there is no source lever. Zero credit. Reopen only if csplit's relocation attribution is changed to prefer the containing symbol for a one-past-the-end address, or if authentic January source shows a different bound.",
"measurements": {
"target": { "size": 272, "relocation_count": 13, "normalized_sha256": "5e8de72bb4e994b875b98b2d0691d7e016b860063a20195dea1a5ff76480e8b3" },
"base": { "size": 272, "relocation_count": 13, "normalized_sha256": "5e8de72bb4e994b875b98b2d0691d7e016b860063a20195dea1a5ff76480e8b3" },
"objdiff_percent": 100.0
}
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_splitscreen_pregame_status_screen_update",
"class": "csplit-relocation-alias",
"evidence": "Not a code-generation difference: the same csplit address-attribution alias. local_player_controller_bitmap_frames occupies 24 bytes at image address 2584076 and the string literal 'invalid game_data_input_reference...' begins immediately after it at 2584100. Our natural expression resolves to 2584102, which VC7 emits as _local_player_controller_bitmap_frames+26 (two past the array's extent); csplit spells the same address as that string literal + 2. Both resolve to 2584102, proven through config/symbols.json. Code bytes, relocation count, offsets and types are identical; only this one symbol spelling differs. Zero credit. Reopen only on a change to csplit's relocation attribution or authentic January source for the expression.",
"measurements": {
"target": { "size": 1216, "relocation_count": 48, "normalized_sha256": "a494149278b8ee669720a11c0dc47b6415983d10252dbcd41b0c7a17581b8f12" },
"base": { "size": 1216, "relocation_count": 48, "normalized_sha256": "a494149278b8ee669720a11c0dc47b6415983d10252dbcd41b0c7a17581b8f12" },
"objdiff_percent": 100.0
}
}
]
}
+1 -21
View File
@@ -1,24 +1,4 @@
{
"version": 1,
"entries": [
{
"unit": "source/ai/path_obstacle_avoidance",
"function": "_render_debug_obstacle_path",
"code_bytes": 224,
"target": {
"normalized_sha256": "9dbeaee9e3fc7da77a427e8192dff7f2c6cf1419dce7f8c3baa9f4ef1d6094ce",
"padded_bytes": 224,
"relocations": 28,
"relocation_sha256": "6d5d0368d78f8beea954287abefbdc55bdcd0d2f8096f842c481e0ebf45bd52a"
},
"candidate": {
"normalized_sha256": "9dbeaee9e3fc7da77a427e8192dff7f2c6cf1419dce7f8c3baa9f4ef1d6094ce",
"padded_bytes": 224,
"relocations": 28,
"relocation_sha256": "4bd6c15596890d7a19f5da108d4045f74fcceba9e99206fa1d40f12c4d7fc6aa"
},
"reason": "The function has identical normalized instructions and relocation positions/types, but January owns the obstacle snapshot as _current_traverse_index+0x1538 and the coherent source owns it as debug_obstacles; January likewise labels the path storage _current_traverse_index while the source correctly owns debug_path. Renaming semantic globals to split artifacts or spelling raw BSS offsets would violate the source-authenticity and global-naming house rules, so relocation-shape equality cannot receive exact credit.",
"evidence": "docs/object_matching_logs/unwritten_leaf_transport_path_reconciliation_20260913.md#coherent-obstacle-path-reconstruction-zero-exact-credit"
}
]
"entries": []
}
-367
View File
@@ -1,308 +1,4 @@
[
{
"unit": "source/rasterizer/xbox/rasterizer_xbox_profile",
"symbol": "_rasterizer_profile_performance_counter_frequency",
"allow_incomplete_unit": true,
"reason": "The two natural static initialized owners occupy the exact complete 132-byte data section at offsets 0 and 8. Bytes, flags, linkage and all 29 resolved relocations agree; only the report's internal string-relocation attribution differs. This credits already-reconstructed data, not the candidate-only SDK tables or whole-object completion. See docs/object_matching_logs/rasterizer_xbox_profile_obj_data_accounting_audit_20260904.md.",
"measurements": {
"size": 132,
"relocation_count": 29,
"normalized_sha256": "b577924a924477a95be3c0a539812cce4cae4eaf93489d580a909a02169d0cf9"
}
},
{
"unit": "source/interface/hud",
"symbol": "_default_string",
"allow_incomplete_unit": true,
"reason": "The rebuilt object owns the exact default empty-wide-string pointer; January and candidate resolve the same single relocation destination. The separately restored public BSS is ordinarily matched, leaving this four-byte pointer as the complete reported data gap. See docs/object_matching_logs/hud_owner_devices_update_independent_audit_20260904.md.",
"measurements": {
"size": 4,
"relocation_count": 1,
"normalized_sha256": "df3f619804a92fdb4057192dc43dd748ea778adc52bc498ce80524c014b81119"
}
},
{
"unit": "source/ai/ai_profile",
"symbol": "_global_ai_meter_definitions",
"reason": "Natural separate 224-byte meter array and private 12-byte spray-name table share the exact 236-byte data section; both owner offsets/linkage, all bytes and all ten resolved relocations agree. Objdiff differs on string ownership. No aggregate facade or new target bytes; see docs/object_matching_logs/ai_profile_obj_complete_reconstruction_review_20260904.md.",
"measurements": {
"size": 236,
"relocation_count": 10,
"normalized_sha256": "3a69a8b8a83037c3277fa86c09c7aa4e9b9da8b480e3facb87275548ee4c88b8"
}
},
{
"unit": "source/physics/collision_bsp_definitions",
"symbol": "_global_collision_bsp_definition_data",
"reason": "csplit represents 22 internal pointers through the preceding external image symbol; resolved image destinations, normalized bytes, relocation addresses, and relocation types are exact",
"measurements": {
"size": 900,
"relocation_count": 68,
"normalized_sha256": "3ed97b7cf09b09837ca36461d74c21909d34106d563a7b914aaffd7c51cf3e56"
}
},
{
"unit": "source/hs/hs_globals_external",
"symbol": "_hs_external_global_definitions",
"reason": "csplit and the rebuilt object express internal table pointers through different symbols; resolved image destinations, normalized bytes, relocation addresses, and relocation types are exact",
"measurements": {
"size": 7076,
"relocation_count": 1322,
"normalized_sha256": "1e4346aef4491a55772f4f51a6989e06074dc5245a2c01aa1be97fb2e221ae8c"
}
},
{
"unit": "source/units/dialogue_definitions",
"symbol": "_dialogue_vocalization_type_name",
"reason": "the complete rebuilt object owns an exact pointer table, but objdiff attributes its internal string targets differently",
"measurements": {
"size": 1672,
"relocation_count": 418,
"normalized_sha256": "256984cb62bc879971463ff0ff7567042dc95d8b0fb2bc676f246c2293c77ae8"
}
},
{
"unit": "source/shaders/shader_definitions",
"symbol": "_global_shader_effect_additive",
"reason": "the complete rebuilt object has exact normalized data and resolved relocations despite symbol-ownership attribution differences",
"measurements": {
"size": 364,
"relocation_count": 2,
"normalized_sha256": "8bbb21a994d2ec5051de3ea76497f648469fe42d5f6aa7da85f3b598bf16bcd0"
}
},
{
"unit": "source/models/model_animation_definitions",
"symbol": "_weapon_type_animation_list_entries",
"reason": "the complete rebuilt object has exact normalized data and resolved relocations despite internal-symbol expression differences",
"measurements": {
"size": 1288,
"relocation_count": 170,
"normalized_sha256": "76f074030d3cb6940a74673504f664555bd5d02087282c01338c8b83fe3d1654"
}
},
{
"unit": "source/memory/byte_swapping",
"symbol": "_byte_bs_codes",
"reason": "the complete rebuilt object has exact normalized data and resolved relocations despite internal-symbol expression differences",
"measurements": {
"size": 144,
"relocation_count": 8,
"normalized_sha256": "fc892f5c359e0165aa8cdbd745b191928baac3213935c79d8699cdcba32468d0"
}
},
{
"unit": "source/memory/zlib/zutil",
"symbol": "_z_errmsg",
"reason": "the complete zlib 1.1.3 object owns an exact error-message pointer table that objdiff does not fully credit",
"measurements": {
"size": 44,
"relocation_count": 10,
"normalized_sha256": "966ef500de11387122d16ed112b63eb8562f81fc0e67d6f8f4d190766cf1e6ae"
}
},
{
"unit": "source/memory/zlib/deflate",
"symbol": "?my_version@?1??deflateInit2_@@9@9",
"reason": "the complete zlib 1.1.3 object owns an exact relocated data word that objdiff does not fully credit",
"measurements": {
"size": 4,
"relocation_count": 1,
"normalized_sha256": "df3f619804a92fdb4057192dc43dd748ea778adc52bc498ce80524c014b81119"
}
},
{
"unit": "source/items/projectile_definitions",
"symbol": "_default_projectile_material_response",
"reason": "the complete rebuilt object has exact normalized data and resolved relocations despite internal-symbol expression differences",
"measurements": {
"size": 160,
"relocation_count": 3,
"normalized_sha256": "b71e2246c2d39831ad65f2b9570fecb59a1a0d743278b63cc125b118c148f6b9"
}
},
{
"unit": "source/interface/hud_definitions",
"symbol": "_global_hud_anchor_names",
"reason": "the complete rebuilt object owns an exact pointer table whose string ownership is attributed differently by csplit",
"measurements": {
"size": 20,
"relocation_count": 5,
"normalized_sha256": "de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90"
}
},
{
"unit": "source/hs/hs_scenario_definitions",
"symbol": "_hs_script_types_enum",
"reason": "the complete rebuilt object owns an exact script-type definition table whose internal targets are expressed differently",
"measurements": {
"size": 628,
"relocation_count": 33,
"normalized_sha256": "a1add12fc2ddd7afb3935997f9e1532b27a3887f8e85e914db954d1665547c09"
}
},
{
"unit": "source/game/game_globals",
"symbol": "_global_material_type_strings",
"reason": "the complete rebuilt object owns an exact material-name pointer table whose string ownership is attributed differently by csplit",
"measurements": {
"size": 132,
"relocation_count": 33,
"normalized_sha256": "115bad14f1c9f2c027a84de21b107015722cb76be8d0abf3760ad8e00d6c24a5"
}
},
{
"unit": "source/cutscene/recorded_animation_definitions",
"symbol": "_recorded_animation_event_stream_data",
"reason": "the complete rebuilt object has exact normalized data and resolved relocations despite internal-symbol expression differences",
"measurements": {
"size": 180,
"relocation_count": 11,
"normalized_sha256": "c83e71991a0ac6309173102325bf6a194d27d5d80cdc9a395ed954c80bae3d5d"
}
},
{
"unit": "source/bitmaps/libtiff/tif_version",
"symbol": "_TIFFVersion",
"reason": "the complete RCS-pinned libtiff object owns an exact version payload that objdiff does not credit",
"measurements": {
"size": 129,
"relocation_count": 0,
"normalized_sha256": "785b9b7f7b7f20a532ad6e388e8dd29336d580d9721b046118cb426c5f2273f8"
}
},
{
"unit": "source/bitmaps/libtiff/tif_print",
"symbol": "_tif_print_rcsid",
"reason": "the complete RCS-pinned libtiff object owns an exact data section, including both pointer tables; objdiff leaves one word uncredited despite identical normalized bytes, relocation addresses and types, and independently resolved image destinations",
"measurements": {
"size": 164,
"relocation_count": 18,
"normalized_sha256": "a81bb4fa00f599a245c1e6b636a2a630629557f2c86f92e2960cf3e16ed94e23"
}
},
{
"unit": "source/ai/ai_scenario_definitions",
"symbol": "_global_ai_default_state_names",
"reason": "the complete rebuilt object owns an exact AI-state pointer table whose string ownership is attributed differently by csplit",
"measurements": {
"size": 48,
"relocation_count": 12,
"normalized_sha256": "17b0761f87b081d5cf10757ccc89f12be355c70e2e29df288b65b30710dcbcd1"
}
},
{
"unit": "source/ai/actor_types",
"symbol": "_data_002b6c68",
"reason": "the complete rebuilt object owns an exact actor-type pointer table whose targets are expressed differently by csplit",
"measurements": {
"size": 128,
"relocation_count": 32,
"normalized_sha256": "38723a2e5e8a17aa7950dc008209944e898f69a7bd10a23c839d341e935fd5ca"
}
},
{
"unit": "source/objects/object_types",
"symbol": "_object_data_definition",
"reason": "the complete rebuilt object owns the exact 16-record object-type hierarchy and registry; csplit expresses its 190 internal and external data relocations through different section-symbol ownership, while normalized bytes, relocation locations and types, and independently resolved destinations are exact",
"measurements": {
"size": 2608,
"relocation_count": 190,
"normalized_sha256": "205043014fcdf8e45147d168ae70e43cda7814dfc63f1c1dade93f2c0f9f4341"
}
},
{
"unit": "source/objects/objects",
"symbol": "?section@?1??objects_update@@9@9",
"allow_incomplete_unit": true,
"reason": "the compiler-generated objects_update profile static spans the entire remaining .data section; its static ownership is now explicit on both sides, while csplit and MSVC encode the relocation placeholder differently; normalized bytes, relocation address/type, and the independently resolved image destination are exact",
"measurements": {
"size": 1530,
"relocation_count": 1,
"normalized_sha256": "e94bb79478c95dce11c4a1f720a07ccbaa3a8d18b84acbe5605472d6f8635b74"
}
},
{
"unit": "source/game/cheats",
"symbol": "_bss_0043d808",
"reason": "the complete rebuilt object owns the exact 3201-byte zero-initialized cheat-command array plus trailing dead flag; the hardened comparator proves size, normalized payload, zero relocations, external owner spelling, storage class, and section-relative destination exact while objdiff does not credit the BSS section",
"measurements": {
"size": 3201,
"relocation_count": 0,
"normalized_sha256": "76d6c353527d212ec3799ea375f945e3ae3760257bd2ef5a75441090df0ddfac"
}
},
{
"unit": "source/interface/event_manager",
"symbol": "_event_manager_globals",
"reason": "the complete rebuilt object owns the exact 360-byte zero-initialized event-manager aggregate; csplit stores the zero payload physically while MSVC emits fileless BSS, but logical bytes, size, zero relocations, section flags and alignment, external owner spelling, storage class, and every section-relative code destination are exact",
"measurements": {
"size": 360,
"relocation_count": 0,
"normalized_sha256": "d3df611a0ed2e328b050d285287637c60643ba96ec09e4aaefaad7f2cd114b77"
}
},
{
"unit": "source/bungie_net/common/thread_win32",
"symbol": "_thread_globals",
"reason": "the complete rebuilt object owns the exact 1544-byte zero-initialized thread and mutex aggregate; csplit stores the zero payload physically while MSVC emits fileless BSS, but logical bytes, size, zero relocations, section flags and alignment, private owner spelling, static storage class, and every section-relative code destination are exact",
"measurements": {
"size": 1544,
"relocation_count": 0,
"normalized_sha256": "3bb37955629333a7bd053bf97693bcd51627120a57695a9cb0989e21ce9bc6c5"
}
},
{
"unit": "source/interface/ui_widget_event_handler_functions",
"symbol": "_event_handler_function_list",
"reason": "the complete rebuilt object owns the exact 934-byte event-handler table; normalized bytes, relocation addresses and types, and independently resolved destinations are exact despite objdiff's csplit symbol attribution",
"measurements": {
"size": 934,
"relocation_count": 228,
"normalized_sha256": "c1040d667c392fd772fab34335ade456dac49ae864a8200c4560df63cec186fd"
}
},
{
"unit": "source/sound/sound_classes",
"symbol": "_sound_classes",
"reason": "the complete rebuilt object owns the exact sound-class definition and name tables; all 2452 normalized bytes and all 51 relocation addresses, types, addends, and independently resolved image destinations are exact, while csplit records shared empty and ambient strings as undefined image symbols and the compiler emits their select-any COMDAT owners locally",
"measurements": {
"size": 2452,
"relocation_count": 51,
"normalized_sha256": "1ae64de7abb95c40952d3aacf88c68232070d4c19906bf32dfc8877bd6725abc"
}
},
{
"unit": "libs/libcmt/crt0msg",
"symbol": "_data_00319950",
"reason": "the complete authenticated CRT object owns an exact runtime-error pointer table; objdiff leaves the table uncredited even though the hardened comparator proves identical normalized bytes, all 18 relocation addresses/types/destinations/addends, and external owner spelling",
"measurements": {
"size": 144,
"relocation_count": 18,
"normalized_sha256": "25298d4d1ea85dfa6a4696577658216429876d7b7b59ed245667db872d9d79d2"
}
},
{
"unit": "source/render/render_particles",
"symbol": "_render_particles_section",
"allow_incomplete_unit": true,
"reason": "the incomplete rebuilt object owns the exact 1528-byte render-particles profile section; csplit names the string relocation as an undefined image symbol while MSVC emits the select-any string COMDAT locally, and the hardened comparator proves identical normalized bytes, relocation address/type/destination/addend, external owner spelling, and storage class",
"measurements": {
"size": 1528,
"relocation_count": 1,
"normalized_sha256": "806638334fff1341360b4dec7db0987871f376bc3999e26ff4bcd3a1755d2955"
}
},
{
"unit": "source/game/game_engine_slayer",
"symbol": "_slayer_engine",
"reason": "the complete rebuilt object owns the exact Slayer callback table; csplit names the slayer string relocation as an undefined image symbol while MSVC emits the identically named select-any string COMDAT locally, and the hardened comparator proves all normalized bytes plus every relocation address, type, destination, and addend",
"measurements": {
"size": 136,
"relocation_count": 24,
"normalized_sha256": "cd47b29508fea4e4c11451792c17f629a9ad240b3c3df5c889c0d416c378bc78"
}
},
{
"unit": "source/shell/shell_xbox",
"group": "aligned-rdata",
@@ -380,68 +76,5 @@
}
}
]
},
{
"unit": "source/game/game_engine_ctf",
"symbol": "_ctf_engine",
"allow_incomplete_unit": true,
"reason": "the source-complete but fuzzy-parked CTF object owns the exact callback table; csplit names the ctf string relocation as an undefined image symbol while MSVC emits the identically named select-any string COMDAT locally, and the hardened comparator proves all normalized bytes plus every relocation address, type, destination, and addend",
"measurements": {
"size": 136,
"relocation_count": 28,
"normalized_sha256": "45c41730d038fd3f985f7ccfd8a7e04aa02e2db549ac941386e7cd04c1e1d8c1"
}
},
{
"unit": "source/game/game_engine_oddball",
"symbol": "_oddball_engine",
"reason": "the complete rebuilt object owns the exact Oddball callback table; csplit names the oddball string relocation as an undefined image symbol while MSVC emits the identically named select-any string COMDAT locally, and the hardened comparator proves all normalized bytes plus every relocation address, type, destination, and addend",
"measurements": {
"size": 136,
"relocation_count": 27,
"normalized_sha256": "ffe1ef0aa827017276299f3a497655019d91f94374129c31634061500e5ae4b9"
}
},
{
"unit": "source/game/game_engine_race",
"symbol": "_race_engine",
"allow_incomplete_unit": true,
"reason": "the incomplete Race object owns the exact callback table; csplit names the race string relocation as an undefined image symbol while MSVC emits the identically named select-any string COMDAT locally, and the hardened comparator proves all normalized bytes plus every relocation address, type, destination, and addend",
"measurements": {
"size": 136,
"relocation_count": 25,
"normalized_sha256": "97a4c632a978acafd20933da4504d8ec3fdf3c5afd2f78934bced57dc8f746f4"
}
},
{
"unit": "source/networking/network_server_manager",
"group": "bss-local-static-alias",
"reason": "The complete January and rebuilt BSS sections contain the same external in-use byte at offset 0 and the same TU-private four-byte team flip-flop at offset 4. The supplied Bungie source independently authenticates function-local static storage; csplit gives that private owner its recovered source name while VC7 emits the compiler-decorated block-static name. Logical bytes, section size and flags, owner offset/type/storage, and every code relocation are exact. See docs/object_matching_logs/network_server_manager_obj_bss_owner_completion_20260913.md.",
"members": [
{
"symbol": "_network_game_server_next_team_index",
"base_symbol": "?network_game_server_next_team_index@?1??network_game_server_add_player_to_game@@9@9",
"measurements": {
"target": {
"section": ".bss",
"size": 8,
"padded_size": 8,
"flags": 3224371328,
"relocation_count": 0,
"normalized_sha256": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc",
"owner": { "value": 4, "type": 0, "storage": 3 }
},
"base": {
"section": ".bss",
"size": 8,
"padded_size": 8,
"flags": 3224371328,
"relocation_count": 0,
"normalized_sha256": "af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc",
"owner": { "value": 4, "type": 0, "storage": 3 }
}
}
}
]
}
]
+542 -11
View File
@@ -14087,6 +14087,12 @@
{ "file_offset": 2452572, "flags": 0, "name": "__real@37a4b5be" },
{ "file_offset": 2452576, "flags": 0, "name": "__real@b824b5be" },
{ "file_offset": 2452580, "flags": 0, "name": "_editor_camera_speed_steps" },
{ "file_offset": 2452600, "flags": 0, "name": "_orbiting_camera_field_of_view", "static": true },
{ "file_offset": 2452604, "flags": 0, "name": "_orbiting_camera_scale", "static": true },
{ "file_offset": 2452608, "flags": 0, "name": "_orbiting_camera_timer", "static": true },
{ "file_offset": 2452612, "flags": 0, "name": "_orbiting_camera_vertical_offset", "static": true },
{ "file_offset": 2452616, "flags": 0, "name": "_orbiting_camera_default_distance", "static": true },
{ "file_offset": 2452620, "flags": 0, "name": "_editor_camera_field_of_view", "static": true },
{ "file_offset": 2452628, "flags": 0, "name": "??_C@_07NACDKLFL@exiting?$AA@" },
{ "file_offset": 2452636, "flags": 0, "name": "??_C@_0BA@NDFANOEE@orbiting?5camera?$AA@" },
{ "file_offset": 2452652, "flags": 0, "name": "??_C@_0O@GNANFALA@flying?5camera?$AA@" },
@@ -14434,6 +14440,7 @@
{ "file_offset": 2463912, "flags": 0, "name": "??_C@_0BD@GHNECCAG@object_index?$CB?$DNNONE?$AA@" },
{ "file_offset": 2463936, "flags": 0, "name": "??_C@_0HA@NOKFPIOB@contrail?9?$DOcontrail_point_counts?$FL@" },
{ "file_offset": 2464048, "flags": 0, "name": "_decal_wrap_parameters" },
{ "file_offset": 2464112, "flags": 0, "name": "_seconds_per_tick", "static": true },
{ "file_offset": 2464116, "flags": 0, "name": "??_C@_0CE@PKGKLMN@?$CBlayer_check?5?$HM?$HM?5layer?$DN?$DNdecal?9?$DOla@" },
{ "file_offset": 2464152, "flags": 0, "name": "??_C@_0CE@PMCDPOFC@cluster_index?$DN?$DNdecal?9?$DOcluster_in@" },
{ "file_offset": 2464188, "flags": 0, "name": "??_C@_0CA@FFOMHEBD@c?3?2halo?2SOURCE?2effects?2decals?4c?$AA@" },
@@ -14777,6 +14784,7 @@
{ "file_offset": 2475540, "flags": 0, "name": "??_C@_0BG@KLOMMKO@player_control_update?$AA@" },
{ "file_offset": 2475564, "flags": 0, "name": "_MOUSE_YAW_SCALE" },
{ "file_offset": 2475568, "flags": 0, "name": "_MOUSE_PITCH_SCALE" },
{ "file_offset": 2475572, "flags": 0, "name": "_ANALOG_BUTTON_SCALE", "static": true },
{ "file_offset": 2475576, "flags": 0, "name": "??_C@_0CF@CDJDDDIC@c?3?2halo?2SOURCE?2game?2player_contr@" },
{ "file_offset": 2475616, "flags": 0, "name": "??_C@_0BH@GDMLDNGJ@player?5control?5globals?$AA@" },
{ "file_offset": 2475640, "flags": 0, "name": "??_C@_0EG@FFIEHMMD@function?5?$CG?$CG?5low_index?$DO?$DN0?5?$CG?$CG?5low_@" },
@@ -14913,6 +14921,427 @@
{ "file_offset": 2480220, "flags": 0, "name": "__hs_type_weapon_default" },
{ "file_offset": 2480224, "flags": 0, "name": "__hs_type_device_default" },
{ "file_offset": 2480228, "flags": 0, "name": "__hs_type_scenery_default" },
{ "file_offset": 2480232, "flags": 0, "name": "_hs_begin_definition" },
{ "file_offset": 2480260, "flags": 0, "name": "_hs_begin_random_definition" },
{ "file_offset": 2480288, "flags": 0, "name": "_hs_if_definition" },
{ "file_offset": 2480316, "flags": 0, "name": "_hs_cond_definition" },
{ "file_offset": 2480344, "flags": 0, "name": "_hs_set_definition" },
{ "file_offset": 2480372, "flags": 0, "name": "_hs_and_definition" },
{ "file_offset": 2480400, "flags": 0, "name": "_hs_or_definition" },
{ "file_offset": 2480428, "flags": 0, "name": "_hs_plus_definition" },
{ "file_offset": 2480456, "flags": 0, "name": "_hs_minus_definition" },
{ "file_offset": 2480484, "flags": 0, "name": "_hs_times_definition" },
{ "file_offset": 2480512, "flags": 0, "name": "_hs_divide_definition" },
{ "file_offset": 2480540, "flags": 0, "name": "_hs_min_definition" },
{ "file_offset": 2480568, "flags": 0, "name": "_hs_max_definition" },
{ "file_offset": 2480596, "flags": 0, "name": "_hs_equal_definition" },
{ "file_offset": 2480624, "flags": 0, "name": "_hs_not_equal_definition" },
{ "file_offset": 2480652, "flags": 0, "name": "_hs_gt_definition" },
{ "file_offset": 2480680, "flags": 0, "name": "_hs_lt_definition" },
{ "file_offset": 2480708, "flags": 0, "name": "_hs_gte_definition" },
{ "file_offset": 2480736, "flags": 0, "name": "_hs_lte_definition" },
{ "file_offset": 2480764, "flags": 0, "name": "_hs_sleep_definition" },
{ "file_offset": 2480792, "flags": 0, "name": "_hs_sleep_until_definition" },
{ "file_offset": 2480820, "flags": 0, "name": "_hs_wake_definition" },
{ "file_offset": 2480848, "flags": 0, "name": "_hs_inspect_definition" },
{ "file_offset": 2480876, "flags": 0, "name": "_hs_unit_definition" },
{ "file_offset": 2480904, "flags": 0, "name": "_hs_ai_debug_communication_suppress_definition" },
{ "file_offset": 2480932, "flags": 0, "name": "_hs_ai_debug_communication_ignore_definition" },
{ "file_offset": 2480960, "flags": 0, "name": "_hs_ai_debug_communication_focus_definition" },
{ "file_offset": 2480988, "flags": 0, "name": "_hs_not_definition" },
{ "file_offset": 2481020, "flags": 0, "name": "_hs_print_definition" },
{ "file_offset": 2481052, "flags": 0, "name": "_hs_players_definition" },
{ "file_offset": 2481080, "flags": 0, "name": "_hs_volume_teleport_players_not_inside_definition" },
{ "file_offset": 2481112, "flags": 0, "name": "_hs_volume_test_object_definition" },
{ "file_offset": 2481144, "flags": 0, "name": "_hs_volume_test_objects_definition" },
{ "file_offset": 2481176, "flags": 0, "name": "_hs_volume_test_objects_all_definition" },
{ "file_offset": 2481208, "flags": 0, "name": "_hs_object_create_definition" },
{ "file_offset": 2481240, "flags": 0, "name": "_hs_object_destroy_definition" },
{ "file_offset": 2481272, "flags": 0, "name": "_hs_object_create_anew_definition" },
{ "file_offset": 2481304, "flags": 0, "name": "_hs_object_create_containing_definition" },
{ "file_offset": 2481336, "flags": 0, "name": "_hs_object_create_anew_containing_definition" },
{ "file_offset": 2481368, "flags": 0, "name": "_hs_object_destroy_containing_definition" },
{ "file_offset": 2481400, "flags": 0, "name": "_hs_object_destroy_all_definition" },
{ "file_offset": 2481428, "flags": 0, "name": "_hs_object_teleport_definition" },
{ "file_offset": 2481460, "flags": 0, "name": "_hs_object_set_facing_definition" },
{ "file_offset": 2481492, "flags": 0, "name": "_hs_object_set_shield_definition" },
{ "file_offset": 2481524, "flags": 0, "name": "_hs_object_set_permutation_definition" },
{ "file_offset": 2481560, "flags": 0, "name": "_hs_list_get_definition" },
{ "file_offset": 2481592, "flags": 0, "name": "_hs_list_count_definition" },
{ "file_offset": 2481624, "flags": 0, "name": "_hs_effect_new_definition" },
{ "file_offset": 2481656, "flags": 0, "name": "_hs_effect_new_on_object_marker_definition" },
{ "file_offset": 2481692, "flags": 0, "name": "_hs_damage_new_definition" },
{ "file_offset": 2481724, "flags": 0, "name": "_hs_damage_object_definition" },
{ "file_offset": 2481756, "flags": 0, "name": "_hs_objects_can_see_object_definition" },
{ "file_offset": 2481792, "flags": 0, "name": "_hs_objects_can_see_flag_definition" },
{ "file_offset": 2481828, "flags": 0, "name": "_hs_objects_delete_by_definition_definition" },
{ "file_offset": 2481860, "flags": 0, "name": "_hs_sound_set_gain_definition" },
{ "file_offset": 2481892, "flags": 0, "name": "_hs_sound_get_gain_definition" },
{ "file_offset": 2481924, "flags": 0, "name": "_hs_script_recompile_definition" },
{ "file_offset": 2481952, "flags": 0, "name": "_hs_script_doc_definition" },
{ "file_offset": 2481980, "flags": 0, "name": "_hs_help_definition" },
{ "file_offset": 2482012, "flags": 0, "name": "_hs_random_range_definition" },
{ "file_offset": 2482044, "flags": 0, "name": "_hs_real_random_range_definition" },
{ "file_offset": 2482076, "flags": 0, "name": "_hs_numeric_countdown_timer_set_definition" },
{ "file_offset": 2482108, "flags": 0, "name": "_hs_numeric_countdown_timer_get_definition" },
{ "file_offset": 2482140, "flags": 0, "name": "_hs_numeric_countdown_timer_stop_definition" },
{ "file_offset": 2482168, "flags": 0, "name": "_hs_numeric_countdown_timer_restart_definition" },
{ "file_offset": 2482196, "flags": 0, "name": "_hs_breakable_surfaces_enable_definition" },
{ "file_offset": 2482228, "flags": 0, "name": "_hs_recording_play_definition" },
{ "file_offset": 2482260, "flags": 0, "name": "_hs_recording_play_and_delete_definition" },
{ "file_offset": 2482292, "flags": 0, "name": "_hs_recording_play_and_hover_definition" },
{ "file_offset": 2482324, "flags": 0, "name": "_hs_recording_kill_definition" },
{ "file_offset": 2482356, "flags": 0, "name": "_hs_recording_time_definition" },
{ "file_offset": 2482388, "flags": 0, "name": "_hs_object_set_ranged_attack_inhibited_definition" },
{ "file_offset": 2482420, "flags": 0, "name": "_hs_object_set_melee_attack_inhibited_definition" },
{ "file_offset": 2482452, "flags": 0, "name": "_hs_objects_dump_memory_definition" },
{ "file_offset": 2482480, "flags": 0, "name": "_hs_object_set_collideable_definition" },
{ "file_offset": 2482512, "flags": 0, "name": "_hs_object_set_scale_definition" },
{ "file_offset": 2482548, "flags": 0, "name": "_hs_objects_attach_definition" },
{ "file_offset": 2482584, "flags": 0, "name": "_hs_objects_detach_definition" },
{ "file_offset": 2482616, "flags": 0, "name": "_hs_garbage_collect_now_definition" },
{ "file_offset": 2482644, "flags": 0, "name": "_hs_object_cannot_take_damage_definition" },
{ "file_offset": 2482676, "flags": 0, "name": "_hs_object_can_take_damage_definition" },
{ "file_offset": 2482708, "flags": 0, "name": "_hs_object_beautify_definition" },
{ "file_offset": 2482740, "flags": 0, "name": "_hs_objects_predict_definition" },
{ "file_offset": 2482772, "flags": 0, "name": "_hs_object_type_predict_definition" },
{ "file_offset": 2482804, "flags": 0, "name": "_hs_object_pvs_set_object_definition" },
{ "file_offset": 2482836, "flags": 0, "name": "_hs_object_pvs_set_camera_definition" },
{ "file_offset": 2482868, "flags": 0, "name": "_hs_object_pvs_clear_definition" },
{ "file_offset": 2482896, "flags": 0, "name": "_hs_object_pvs_activate_definition" },
{ "file_offset": 2482928, "flags": 0, "name": "_hs_render_lights_definition" },
{ "file_offset": 2482960, "flags": 0, "name": "_hs_scenery_get_animation_time_definition" },
{ "file_offset": 2482992, "flags": 0, "name": "_hs_scenery_animation_start_definition" },
{ "file_offset": 2483028, "flags": 0, "name": "_hs_scenery_animation_start_at_frame_definition" },
{ "file_offset": 2483064, "flags": 0, "name": "_hs_render_effects_definition" },
{ "file_offset": 2483096, "flags": 0, "name": "_hs_unit_can_blink_definition" },
{ "file_offset": 2483128, "flags": 0, "name": "_hs_unit_open_definition" },
{ "file_offset": 2483160, "flags": 0, "name": "_hs_unit_close_definition" },
{ "file_offset": 2483192, "flags": 0, "name": "_hs_unit_kill_definition" },
{ "file_offset": 2483224, "flags": 0, "name": "_hs_unit_kill_silent_definition" },
{ "file_offset": 2483256, "flags": 0, "name": "_hs_unit_get_custom_animation_time_definition" },
{ "file_offset": 2483288, "flags": 0, "name": "_hs_unit_stop_custom_animation_definition" },
{ "file_offset": 2483320, "flags": 0, "name": "_hs_custom_animation_definition" },
{ "file_offset": 2483356, "flags": 0, "name": "_hs_custom_animation_list_definition" },
{ "file_offset": 2483392, "flags": 0, "name": "_hs_unit_custom_animation_at_frame_definition" },
{ "file_offset": 2483432, "flags": 0, "name": "_hs_unit_is_playing_custom_animation_definition" },
{ "file_offset": 2483464, "flags": 0, "name": "_hs_unit_aim_without_turning_definition" },
{ "file_offset": 2483496, "flags": 0, "name": "_hs_unit_set_emotion_definition" },
{ "file_offset": 2483528, "flags": 0, "name": "_hs_unit_set_enterable_by_player_definition" },
{ "file_offset": 2483560, "flags": 0, "name": "_hs_unit_enter_vehicle_definition" },
{ "file_offset": 2483596, "flags": 0, "name": "_hs_vehicle_test_seat_list_definition" },
{ "file_offset": 2483632, "flags": 0, "name": "_hs_vehicle_test_seat_definition" },
{ "file_offset": 2483668, "flags": 0, "name": "_hs_unit_set_emotion_animation_definition" },
{ "file_offset": 2483700, "flags": 0, "name": "_hs_unit_exit_vehicle_definition" },
{ "file_offset": 2483732, "flags": 0, "name": "_hs_unit_set_maximum_vitality_definition" },
{ "file_offset": 2483768, "flags": 0, "name": "_hs_units_set_maximum_vitality_definition" },
{ "file_offset": 2483804, "flags": 0, "name": "_hs_unit_set_current_vitality_definition" },
{ "file_offset": 2483840, "flags": 0, "name": "_hs_units_set_current_vitality_definition" },
{ "file_offset": 2483876, "flags": 0, "name": "_hs_vehicle_load_magic_definition" },
{ "file_offset": 2483912, "flags": 0, "name": "_hs_vehicle_unload_definition" },
{ "file_offset": 2483944, "flags": 0, "name": "_hs_magic_seat_name_definition" },
{ "file_offset": 2483976, "flags": 0, "name": "_hs_unit_set_seat_definition" },
{ "file_offset": 2484008, "flags": 0, "name": "_hs_magic_melee_attack_definition" },
{ "file_offset": 2484036, "flags": 0, "name": "_hs_vehicle_riders_definition" },
{ "file_offset": 2484068, "flags": 0, "name": "_hs_vehicle_driver_definition" },
{ "file_offset": 2484100, "flags": 0, "name": "_hs_vehicle_gunner_definition" },
{ "file_offset": 2484132, "flags": 0, "name": "_hs_unit_get_health_definition" },
{ "file_offset": 2484164, "flags": 0, "name": "_hs_unit_get_shield_definition" },
{ "file_offset": 2484196, "flags": 0, "name": "_hs_unit_get_total_grenade_count_definition" },
{ "file_offset": 2484228, "flags": 0, "name": "_hs_unit_has_weapon_definition" },
{ "file_offset": 2484260, "flags": 0, "name": "_hs_unit_has_weapon_readied_definition" },
{ "file_offset": 2484292, "flags": 0, "name": "_hs_unit_doesnt_drop_items_definition" },
{ "file_offset": 2484324, "flags": 0, "name": "_hs_unit_impervious_definition" },
{ "file_offset": 2484356, "flags": 0, "name": "_hs_unit_suspended_definition" },
{ "file_offset": 2484388, "flags": 0, "name": "_hs_unit_solo_player_integrated_night_vision_is_active_definition" },
{ "file_offset": 2484416, "flags": 0, "name": "_hs_units_set_desired_flashlight_state_definition" },
{ "file_offset": 2484448, "flags": 0, "name": "_hs_unit_set_desired_flashlight_state_definition" },
{ "file_offset": 2484480, "flags": 0, "name": "_hs_unit_get_current_flashlight_state_definition" },
{ "file_offset": 2484512, "flags": 0, "name": "_hs_device_set_never_appears_locked_definition" },
{ "file_offset": 2484544, "flags": 0, "name": "_hs_device_set_power_definition" },
{ "file_offset": 2484576, "flags": 0, "name": "_hs_device_get_power_definition" },
{ "file_offset": 2484608, "flags": 0, "name": "_hs_device_set_position_definition" },
{ "file_offset": 2484640, "flags": 0, "name": "_hs_device_get_position_definition" },
{ "file_offset": 2484672, "flags": 0, "name": "_hs_device_set_position_immediate_definition" },
{ "file_offset": 2484704, "flags": 0, "name": "_hs_device_group_get_definition" },
{ "file_offset": 2484736, "flags": 0, "name": "_hs_device_group_set_definition" },
{ "file_offset": 2484768, "flags": 0, "name": "_hs_device_group_set_immediate_definition" },
{ "file_offset": 2484800, "flags": 0, "name": "_hs_device_one_sided_set_definition" },
{ "file_offset": 2484832, "flags": 0, "name": "_hs_device_operates_automatically_set_definition" },
{ "file_offset": 2484864, "flags": 0, "name": "_hs_device_group_change_only_once_more_set_definition" },
{ "file_offset": 2484896, "flags": 0, "name": "_hs_breakable_surfaces_reset_definition" },
{ "file_offset": 2484924, "flags": 0, "name": "_hs_cheat_all_powerups_definition" },
{ "file_offset": 2484952, "flags": 0, "name": "_hs_cheat_all_weapons_definition" },
{ "file_offset": 2484980, "flags": 0, "name": "_hs_cheat_all_vehicles_definition" },
{ "file_offset": 2485008, "flags": 0, "name": "_hs_cheat_teleport_to_camera_definition" },
{ "file_offset": 2485036, "flags": 0, "name": "_hs_cheat_active_camouflage_definition" },
{ "file_offset": 2485064, "flags": 0, "name": "_hs_cheat_active_camouflage_local_player_definition" },
{ "file_offset": 2485096, "flags": 0, "name": "_hs_cheats_load_definition" },
{ "file_offset": 2485124, "flags": 0, "name": "_hs_ai_definition" },
{ "file_offset": 2485156, "flags": 0, "name": "_hs_ai_dialogue_triggers_definition" },
{ "file_offset": 2485188, "flags": 0, "name": "_hs_ai_grenades_definition" },
{ "file_offset": 2485220, "flags": 0, "name": "_hs_ai_free_definition" },
{ "file_offset": 2485252, "flags": 0, "name": "_hs_ai_free_units_definition" },
{ "file_offset": 2485284, "flags": 0, "name": "_hs_ai_attach_definition" },
{ "file_offset": 2485316, "flags": 0, "name": "_hs_ai_attach_units_definition" },
{ "file_offset": 2485348, "flags": 0, "name": "_hs_ai_attach_free_definition" },
{ "file_offset": 2485380, "flags": 0, "name": "_hs_ai_detach_definition" },
{ "file_offset": 2485412, "flags": 0, "name": "_hs_ai_detach_units_definition" },
{ "file_offset": 2485444, "flags": 0, "name": "_hs_ai_place_definition" },
{ "file_offset": 2485476, "flags": 0, "name": "_hs_ai_kill_definition" },
{ "file_offset": 2485508, "flags": 0, "name": "_hs_ai_kill_silent_definition" },
{ "file_offset": 2485540, "flags": 0, "name": "_hs_ai_erase_definition" },
{ "file_offset": 2485572, "flags": 0, "name": "_hs_ai_erase_all_definition" },
{ "file_offset": 2485600, "flags": 0, "name": "_hs_ai_select_definition" },
{ "file_offset": 2485632, "flags": 0, "name": "_hs_ai_deselect_definition" },
{ "file_offset": 2485660, "flags": 0, "name": "_hs_ai_spawn_actor_definition" },
{ "file_offset": 2485692, "flags": 0, "name": "_hs_ai_set_respawn_definition" },
{ "file_offset": 2485724, "flags": 0, "name": "_hs_ai_set_deaf_definition" },
{ "file_offset": 2485756, "flags": 0, "name": "_hs_ai_set_blind_definition" },
{ "file_offset": 2485788, "flags": 0, "name": "_hs_ai_magically_see_encounter_definition" },
{ "file_offset": 2485820, "flags": 0, "name": "_hs_ai_magically_see_players_definition" },
{ "file_offset": 2485852, "flags": 0, "name": "_hs_ai_magically_see_unit_definition" },
{ "file_offset": 2485884, "flags": 0, "name": "_hs_ai_magically_see_units_definition" },
{ "file_offset": 2485916, "flags": 0, "name": "_hs_ai_timer_start_definition" },
{ "file_offset": 2485948, "flags": 0, "name": "_hs_ai_timer_expire_definition" },
{ "file_offset": 2485980, "flags": 0, "name": "_hs_ai_attack_definition" },
{ "file_offset": 2486012, "flags": 0, "name": "_hs_ai_defend_definition" },
{ "file_offset": 2486044, "flags": 0, "name": "_hs_ai_retreat_definition" },
{ "file_offset": 2486076, "flags": 0, "name": "_hs_ai_maneuver_definition" },
{ "file_offset": 2486108, "flags": 0, "name": "_hs_ai_maneuver_enable_definition" },
{ "file_offset": 2486140, "flags": 0, "name": "_hs_ai_migrate_definition" },
{ "file_offset": 2486172, "flags": 0, "name": "_hs_ai_migrate_and_speak_definition" },
{ "file_offset": 2486208, "flags": 0, "name": "_hs_ai_migrate_by_unit_definition" },
{ "file_offset": 2486240, "flags": 0, "name": "_hs_ai_allegiance_definition" },
{ "file_offset": 2486272, "flags": 0, "name": "_hs_ai_allegiance_remove_definition" },
{ "file_offset": 2486304, "flags": 0, "name": "_hs_ai_go_to_vehicle_definition" },
{ "file_offset": 2486340, "flags": 0, "name": "_hs_ai_go_to_vehicle_override_definition" },
{ "file_offset": 2486376, "flags": 0, "name": "_hs_ai_exit_vehicle_definition" },
{ "file_offset": 2486408, "flags": 0, "name": "_hs_ai_braindead_definition" },
{ "file_offset": 2486440, "flags": 0, "name": "_hs_ai_braindead_by_unit_definition" },
{ "file_offset": 2486472, "flags": 0, "name": "_hs_ai_disregard_definition" },
{ "file_offset": 2486504, "flags": 0, "name": "_hs_ai_prefer_target_definition" },
{ "file_offset": 2486536, "flags": 0, "name": "_hs_ai_teleport_to_starting_location_definition" },
{ "file_offset": 2486568, "flags": 0, "name": "_hs_ai_teleport_to_starting_location_if_unsupported_definition" },
{ "file_offset": 2486600, "flags": 0, "name": "_hs_ai_renew_definition" },
{ "file_offset": 2486632, "flags": 0, "name": "_hs_ai_try_to_fight_nothing_definition" },
{ "file_offset": 2486664, "flags": 0, "name": "_hs_ai_try_to_fight_definition" },
{ "file_offset": 2486696, "flags": 0, "name": "_hs_ai_try_to_fight_player_definition" },
{ "file_offset": 2486728, "flags": 0, "name": "_hs_ai_command_list_definition" },
{ "file_offset": 2486760, "flags": 0, "name": "_hs_ai_command_list_by_unit_definition" },
{ "file_offset": 2486792, "flags": 0, "name": "_hs_ai_command_list_advance_definition" },
{ "file_offset": 2486824, "flags": 0, "name": "_hs_ai_command_list_advance_by_unit_definition" },
{ "file_offset": 2486856, "flags": 0, "name": "_hs_ai_force_active_definition" },
{ "file_offset": 2486888, "flags": 0, "name": "_hs_ai_force_active_by_unit_definition" },
{ "file_offset": 2486920, "flags": 0, "name": "_hs_ai_set_return_state_definition" },
{ "file_offset": 2486952, "flags": 0, "name": "_hs_ai_set_current_state_definition" },
{ "file_offset": 2486984, "flags": 0, "name": "_hs_ai_playfight_definition" },
{ "file_offset": 2487016, "flags": 0, "name": "_hs_ai_reconnect_definition" },
{ "file_offset": 2487044, "flags": 0, "name": "_hs_ai_vehicle_encounter_definition" },
{ "file_offset": 2487076, "flags": 0, "name": "_hs_ai_vehicle_enterable_distance_definition" },
{ "file_offset": 2487108, "flags": 0, "name": "_hs_ai_vehicle_enterable_team_definition" },
{ "file_offset": 2487140, "flags": 0, "name": "_hs_ai_vehicle_enterable_actor_type_definition" },
{ "file_offset": 2487172, "flags": 0, "name": "_hs_ai_vehicle_enterable_actors_definition" },
{ "file_offset": 2487204, "flags": 0, "name": "_hs_ai_vehicle_enterable_disable_definition" },
{ "file_offset": 2487236, "flags": 0, "name": "_hs_ai_look_at_object_definition" },
{ "file_offset": 2487268, "flags": 0, "name": "_hs_ai_stop_looking_definition" },
{ "file_offset": 2487300, "flags": 0, "name": "_hs_ai_automatic_migration_target_definition" },
{ "file_offset": 2487332, "flags": 0, "name": "_hs_ai_follow_target_disable_definition" },
{ "file_offset": 2487364, "flags": 0, "name": "_hs_ai_follow_target_players_definition" },
{ "file_offset": 2487396, "flags": 0, "name": "_hs_ai_follow_target_unit_definition" },
{ "file_offset": 2487428, "flags": 0, "name": "_hs_ai_follow_target_ai_definition" },
{ "file_offset": 2487460, "flags": 0, "name": "_hs_ai_follow_distance_definition" },
{ "file_offset": 2487492, "flags": 0, "name": "_hs_ai_conversation_stop_definition" },
{ "file_offset": 2487524, "flags": 0, "name": "_hs_ai_conversation_advance_definition" },
{ "file_offset": 2487556, "flags": 0, "name": "_hs_ai_link_activation_definition" },
{ "file_offset": 2487588, "flags": 0, "name": "_hs_ai_berserk_definition" },
{ "file_offset": 2487620, "flags": 0, "name": "_hs_ai_set_team_definition" },
{ "file_offset": 2487652, "flags": 0, "name": "_hs_ai_allow_charge_definition" },
{ "file_offset": 2487684, "flags": 0, "name": "_hs_ai_allow_dormant_definition" },
{ "file_offset": 2487716, "flags": 0, "name": "_hs_ai_is_attacking_definition" },
{ "file_offset": 2487748, "flags": 0, "name": "_hs_ai_command_list_status_definition" },
{ "file_offset": 2487780, "flags": 0, "name": "_hs_ai_going_to_vehicle_definition" },
{ "file_offset": 2487812, "flags": 0, "name": "_hs_ai_living_count_definition" },
{ "file_offset": 2487844, "flags": 0, "name": "_hs_ai_living_fraction_definition" },
{ "file_offset": 2487876, "flags": 0, "name": "_hs_ai_strength_definition" },
{ "file_offset": 2487908, "flags": 0, "name": "_hs_ai_swarm_count_definition" },
{ "file_offset": 2487940, "flags": 0, "name": "_hs_ai_nonswarm_count_definition" },
{ "file_offset": 2487972, "flags": 0, "name": "_hs_ai_actors_definition" },
{ "file_offset": 2488004, "flags": 0, "name": "_hs_ai_status_definition" },
{ "file_offset": 2488036, "flags": 0, "name": "_hs_ai_conversation_definition" },
{ "file_offset": 2488068, "flags": 0, "name": "_hs_ai_conversation_line_definition" },
{ "file_offset": 2488100, "flags": 0, "name": "_hs_ai_conversation_status_definition" },
{ "file_offset": 2488132, "flags": 0, "name": "_hs_ai_allegiance_broken_definition" },
{ "file_offset": 2488164, "flags": 0, "name": "_hs_camera_control_definition" },
{ "file_offset": 2488196, "flags": 0, "name": "_hs_camera_set_definition" },
{ "file_offset": 2488228, "flags": 0, "name": "_hs_camera_set_relative_definition" },
{ "file_offset": 2488264, "flags": 0, "name": "_hs_camera_set_animation_definition" },
{ "file_offset": 2488296, "flags": 0, "name": "_hs_camera_set_first_person_definition" },
{ "file_offset": 2488328, "flags": 0, "name": "_hs_camera_set_dead_definition" },
{ "file_offset": 2488360, "flags": 0, "name": "_hs_camera_time_definition" },
{ "file_offset": 2488388, "flags": 0, "name": "_hs_debug_camera_save_definition" },
{ "file_offset": 2488416, "flags": 0, "name": "_hs_debug_camera_load_definition" },
{ "file_offset": 2488444, "flags": 0, "name": "_hs_game_speed_definition" },
{ "file_offset": 2488476, "flags": 0, "name": "_hs_game_variant_definition" },
{ "file_offset": 2488508, "flags": 0, "name": "_hs_game_time_definition" },
{ "file_offset": 2488536, "flags": 0, "name": "_hs_game_difficulty_get_definition" },
{ "file_offset": 2488564, "flags": 0, "name": "_hs_game_difficulty_get_real_definition" },
{ "file_offset": 2488592, "flags": 0, "name": "_hs_players_unzoom_all_definition" },
{ "file_offset": 2488620, "flags": 0, "name": "_hs_player_enable_input_definition" },
{ "file_offset": 2488652, "flags": 0, "name": "_hs_player_camera_control_definition" },
{ "file_offset": 2488684, "flags": 0, "name": "_hs_player_action_test_reset_definition" },
{ "file_offset": 2488712, "flags": 0, "name": "_hs_player_action_test_jump_definition" },
{ "file_offset": 2488740, "flags": 0, "name": "_hs_player_action_test_primary_trigger_definition" },
{ "file_offset": 2488768, "flags": 0, "name": "_hs_player_action_test_grenade_trigger_definition" },
{ "file_offset": 2488796, "flags": 0, "name": "_hs_player_action_test_zoom_definition" },
{ "file_offset": 2488824, "flags": 0, "name": "_hs_player_action_test_action_definition" },
{ "file_offset": 2488852, "flags": 0, "name": "_hs_player_action_test_accept_definition" },
{ "file_offset": 2488880, "flags": 0, "name": "_hs_player_action_test_back_definition" },
{ "file_offset": 2488908, "flags": 0, "name": "_hs_player_action_test_look_relative_up_definition" },
{ "file_offset": 2488936, "flags": 0, "name": "_hs_player_action_test_look_relative_down_definition" },
{ "file_offset": 2488964, "flags": 0, "name": "_hs_player_action_test_look_relative_left_definition" },
{ "file_offset": 2488992, "flags": 0, "name": "_hs_player_action_test_look_relative_right_definition" },
{ "file_offset": 2489020, "flags": 0, "name": "_hs_player_action_test_look_relative_all_directions_definition" },
{ "file_offset": 2489048, "flags": 0, "name": "_hs_player_action_test_move_relative_all_directions_definition" },
{ "file_offset": 2489076, "flags": 0, "name": "_hs_player_add_equipment_definition" },
{ "file_offset": 2489112, "flags": 0, "name": "_hs_debug_teleport_player_definition" },
{ "file_offset": 2489144, "flags": 0, "name": "_hs_map_reset_definition" },
{ "file_offset": 2489172, "flags": 0, "name": "_hs_map_name_definition" },
{ "file_offset": 2489204, "flags": 0, "name": "_hs_multiplayer_map_name_definition" },
{ "file_offset": 2489236, "flags": 0, "name": "_hs_game_difficulty_set_definition" },
{ "file_offset": 2489268, "flags": 0, "name": "_hs_crash_definition" },
{ "file_offset": 2489300, "flags": 0, "name": "_hs_switch_bsp_definition" },
{ "file_offset": 2489332, "flags": 0, "name": "_hs_structure_bsp_index_definition" },
{ "file_offset": 2489360, "flags": 0, "name": "_hs_version_definition" },
{ "file_offset": 2489388, "flags": 0, "name": "_hs_playback_definition" },
{ "file_offset": 2489416, "flags": 0, "name": "_hs_texture_cache_flush_definition" },
{ "file_offset": 2489444, "flags": 0, "name": "_hs_sound_cache_flush_definition" },
{ "file_offset": 2489472, "flags": 0, "name": "_hs_debug_memory_definition" },
{ "file_offset": 2489500, "flags": 0, "name": "_hs_debug_memory_by_file_definition" },
{ "file_offset": 2489528, "flags": 0, "name": "_hs_debug_memory_for_file_definition" },
{ "file_offset": 2489560, "flags": 0, "name": "_hs_debug_tags_definition" },
{ "file_offset": 2489588, "flags": 0, "name": "_hs_profile_reset_definition" },
{ "file_offset": 2489616, "flags": 0, "name": "_hs_profile_dump_definition" },
{ "file_offset": 2489648, "flags": 0, "name": "_hs_profile_activate_definition" },
{ "file_offset": 2489680, "flags": 0, "name": "_hs_profile_deactivate_definition" },
{ "file_offset": 2489712, "flags": 0, "name": "_hs_profile_graph_toggle_definition" },
{ "file_offset": 2489744, "flags": 0, "name": "_hs_debug_pvs_definition" },
{ "file_offset": 2489776, "flags": 0, "name": "_hs_radiosity_start_definition" },
{ "file_offset": 2489804, "flags": 0, "name": "_hs_radiosity_save_definition" },
{ "file_offset": 2489832, "flags": 0, "name": "_hs_radiosity_debug_point_definition" },
{ "file_offset": 2489860, "flags": 0, "name": "_hs_ai_lines_definition" },
{ "file_offset": 2489888, "flags": 0, "name": "_hs_ai_debug_sound_point_set_definition" },
{ "file_offset": 2489916, "flags": 0, "name": "_hs_ai_debug_vocalize_definition" },
{ "file_offset": 2489948, "flags": 0, "name": "_hs_ai_debug_teleport_to_definition" },
{ "file_offset": 2489980, "flags": 0, "name": "_hs_ai_debug_speak_definition" },
{ "file_offset": 2490012, "flags": 0, "name": "_hs_ai_debug_speak_list_definition" },
{ "file_offset": 2490044, "flags": 0, "name": "_hs_fade_in_definition" },
{ "file_offset": 2490080, "flags": 0, "name": "_hs_fade_out_definition" },
{ "file_offset": 2490116, "flags": 0, "name": "_hs_cinematic_start_definition" },
{ "file_offset": 2490144, "flags": 0, "name": "_hs_cinematic_stop_definition" },
{ "file_offset": 2490172, "flags": 0, "name": "_hs_cinematic_skip_start_internal_definition" },
{ "file_offset": 2490200, "flags": 0, "name": "_hs_cinematic_skip_stop_internal_definition" },
{ "file_offset": 2490228, "flags": 0, "name": "_hs_cinematic_show_letterbox_definition" },
{ "file_offset": 2490260, "flags": 0, "name": "_hs_cinematic_set_title_definition" },
{ "file_offset": 2490292, "flags": 0, "name": "_hs_cinematic_set_title_delayed_definition" },
{ "file_offset": 2490324, "flags": 0, "name": "_hs_cinematic_suppress_bsp_object_creation_definition" },
{ "file_offset": 2490356, "flags": 0, "name": "_hs_attract_mode_start_definition" },
{ "file_offset": 2490384, "flags": 0, "name": "_hs_game_won_definition" },
{ "file_offset": 2490412, "flags": 0, "name": "_hs_game_lost_definition" },
{ "file_offset": 2490440, "flags": 0, "name": "_hs_game_safe_to_save_definition" },
{ "file_offset": 2490468, "flags": 0, "name": "_hs_game_all_quiet_definition" },
{ "file_offset": 2490496, "flags": 0, "name": "_hs_game_safe_to_speak_definition" },
{ "file_offset": 2490524, "flags": 0, "name": "_hs_game_is_cooperative_definition" },
{ "file_offset": 2490552, "flags": 0, "name": "_hs_game_save_definition" },
{ "file_offset": 2490580, "flags": 0, "name": "_hs_game_save_cancel_definition" },
{ "file_offset": 2490608, "flags": 0, "name": "_hs_game_save_no_timeout_definition" },
{ "file_offset": 2490636, "flags": 0, "name": "_hs_game_save_totally_unsafe_definition" },
{ "file_offset": 2490664, "flags": 0, "name": "_hs_game_saving_definition" },
{ "file_offset": 2490692, "flags": 0, "name": "_hs_game_revert_definition" },
{ "file_offset": 2490720, "flags": 0, "name": "_hs_core_load_definition" },
{ "file_offset": 2490748, "flags": 0, "name": "_hs_core_load_at_startup_definition" },
{ "file_offset": 2490776, "flags": 0, "name": "_hs_core_load_name_definition" },
{ "file_offset": 2490808, "flags": 0, "name": "_hs_core_load_name_at_startup_definition" },
{ "file_offset": 2490840, "flags": 0, "name": "_hs_core_save_definition" },
{ "file_offset": 2490868, "flags": 0, "name": "_hs_core_save_name_definition" },
{ "file_offset": 2490900, "flags": 0, "name": "_hs_game_skip_ticks_definition" },
{ "file_offset": 2490932, "flags": 0, "name": "_hs_game_reverted_definition" },
{ "file_offset": 2490960, "flags": 0, "name": "_hs_sound_impulse_start_definition" },
{ "file_offset": 2490996, "flags": 0, "name": "_hs_sound_impulse_time_definition" },
{ "file_offset": 2491028, "flags": 0, "name": "_hs_sound_impulse_stop_definition" },
{ "file_offset": 2491060, "flags": 0, "name": "_hs_sound_looping_predict_definition" },
{ "file_offset": 2491092, "flags": 0, "name": "_hs_sound_looping_start_definition" },
{ "file_offset": 2491128, "flags": 0, "name": "_hs_sound_looping_stop_definition" },
{ "file_offset": 2491160, "flags": 0, "name": "_hs_sound_looping_set_scale_definition" },
{ "file_offset": 2491192, "flags": 0, "name": "_hs_sound_looping_set_alternate_definition" },
{ "file_offset": 2491224, "flags": 0, "name": "_hs_debug_sounds_enable_definition" },
{ "file_offset": 2491256, "flags": 0, "name": "_hs_debug_sounds_distances_definition" },
{ "file_offset": 2491292, "flags": 0, "name": "_hs_debug_sounds_wet_definition" },
{ "file_offset": 2491324, "flags": 0, "name": "_hs_sound_class_set_gain_definition" },
{ "file_offset": 2491360, "flags": 0, "name": "_hs_sound_enable_definition" },
{ "file_offset": 2491392, "flags": 0, "name": "_hs_vehicle_hover_definition" },
{ "file_offset": 2491424, "flags": 0, "name": "_hs_show_hud_definition" },
{ "file_offset": 2491456, "flags": 0, "name": "_hs_show_hud_help_text_definition" },
{ "file_offset": 2491488, "flags": 0, "name": "_hs_enable_hud_help_flash_definition" },
{ "file_offset": 2491520, "flags": 0, "name": "_hs_hud_help_flash_restart_definition" },
{ "file_offset": 2491548, "flags": 0, "name": "_hs_activate_nav_point_flag_definition" },
{ "file_offset": 2491584, "flags": 0, "name": "_hs_activate_nav_point_object_definition" },
{ "file_offset": 2491620, "flags": 0, "name": "_hs_activate_team_nav_point_flag_definition" },
{ "file_offset": 2491656, "flags": 0, "name": "_hs_activate_team_nav_point_object_definition" },
{ "file_offset": 2491692, "flags": 0, "name": "_hs_deactivate_nav_point_flag_definition" },
{ "file_offset": 2491724, "flags": 0, "name": "_hs_deactivate_nav_point_object_definition" },
{ "file_offset": 2491756, "flags": 0, "name": "_hs_deactivate_team_nav_point_flag_definition" },
{ "file_offset": 2491788, "flags": 0, "name": "_hs_deactivate_team_nav_point_object_definition" },
{ "file_offset": 2491820, "flags": 0, "name": "_hs_cls_definition" },
{ "file_offset": 2491848, "flags": 0, "name": "_hs_error_overflow_suppression_definition" },
{ "file_offset": 2491880, "flags": 0, "name": "_hs_structure_lens_flares_place_definition" },
{ "file_offset": 2491908, "flags": 0, "name": "_hs_player_effect_set_max_translation_definition" },
{ "file_offset": 2491944, "flags": 0, "name": "_hs_player_effect_set_max_rotation_definition" },
{ "file_offset": 2491980, "flags": 0, "name": "_hs_player_effect_set_max_rumble_definition" },
{ "file_offset": 2492012, "flags": 0, "name": "_hs_player_effect_start_definition" },
{ "file_offset": 2492044, "flags": 0, "name": "_hs_player_effect_stop_definition" },
{ "file_offset": 2492076, "flags": 0, "name": "_hs_hud_show_health_definition" },
{ "file_offset": 2492108, "flags": 0, "name": "_hs_hud_blink_health_definition" },
{ "file_offset": 2492140, "flags": 0, "name": "_hs_hud_show_shield_definition" },
{ "file_offset": 2492172, "flags": 0, "name": "_hs_hud_blink_shield_definition" },
{ "file_offset": 2492204, "flags": 0, "name": "_hs_hud_show_motion_sensor_definition" },
{ "file_offset": 2492236, "flags": 0, "name": "_hs_hud_blink_motion_sensor_definition" },
{ "file_offset": 2492268, "flags": 0, "name": "_hs_hud_show_crosshair_definition" },
{ "file_offset": 2492300, "flags": 0, "name": "_hs_hud_clear_messages_definition" },
{ "file_offset": 2492328, "flags": 0, "name": "_hs_hud_set_help_text_definition" },
{ "file_offset": 2492360, "flags": 0, "name": "_hs_hud_set_objective_text_definition" },
{ "file_offset": 2492392, "flags": 0, "name": "_hs_hud_set_timer_time_definition" },
{ "file_offset": 2492424, "flags": 0, "name": "_hs_hud_set_timer_warning_time_definition" },
{ "file_offset": 2492456, "flags": 0, "name": "_hs_hud_set_timer_position_definition" },
{ "file_offset": 2492492, "flags": 0, "name": "_hs_show_hud_timer_definition" },
{ "file_offset": 2492524, "flags": 0, "name": "_hs_pause_hud_timer_definition" },
{ "file_offset": 2492556, "flags": 0, "name": "_hs_hud_get_timer_ticks_definition" },
{ "file_offset": 2492584, "flags": 0, "name": "_hs_time_code_show_definition" },
{ "file_offset": 2492616, "flags": 0, "name": "_hs_time_code_start_definition" },
{ "file_offset": 2492648, "flags": 0, "name": "_hs_time_code_reset_definition" },
{ "file_offset": 2492676, "flags": 0, "name": "_hs_rasterizer_decals_flush_definition" },
{ "file_offset": 2492704, "flags": 0, "name": "_hs_rasterizer_fps_accumulate_definition" },
{ "file_offset": 2492732, "flags": 0, "name": "_hs_rasterizer_model_ambient_reflection_tint_definition" },
{ "file_offset": 2492768, "flags": 0, "name": "_hs_rasterizer_lights_reset_for_new_map_definition" },
{ "file_offset": 2492796, "flags": 0, "name": "_hs_script_screen_effect_set_value_definition" },
{ "file_offset": 2492828, "flags": 0, "name": "_hs_cinematic_screen_effect_start_definition" },
{ "file_offset": 2492860, "flags": 0, "name": "_hs_cinematic_screen_effect_set_convolution_definition" },
{ "file_offset": 2492900, "flags": 0, "name": "_hs_cinematic_screen_effect_set_filter_definition" },
{ "file_offset": 2492940, "flags": 0, "name": "_hs_cinematic_screen_effect_set_filter_desaturation_tint_definition" },
{ "file_offset": 2492976, "flags": 0, "name": "_hs_cinematic_screen_effect_set_video_definition" },
{ "file_offset": 2493008, "flags": 0, "name": "_hs_cinematic_screen_effect_stop_definition" },
{ "file_offset": 2493036, "flags": 0, "name": "_hs_cinematic_set_near_clip_distance_definition" },
{ "file_offset": 2493068, "flags": 0, "name": "_hs_enumerate_memory_units_definition" },
{ "file_offset": 2493096, "flags": 0, "name": "_hs_delete_save_game_files_definition" },
{ "file_offset": 2493124, "flags": 0, "name": "_hs_fast_setup_network_server_definition" },
{ "file_offset": 2493152, "flags": 0, "name": "_hs_profile_unlock_solo_levels_definition" },
{ "file_offset": 2493180, "flags": 0, "name": "_hs_player0_look_invert_pitch_definition" },
{ "file_offset": 2493212, "flags": 0, "name": "_hs_player0_look_pitch_is_inverted_definition" },
{ "file_offset": 2493240, "flags": 0, "name": "_hs_player0_joystick_set_is_normal_definition" },
{ "file_offset": 2493268, "flags": 0, "name": "_hs_ui_widget_show_path_definition" },
{ "file_offset": 2493300, "flags": 0, "name": "_hs_display_scenario_help_definition" },
{ "file_offset": 2493332, "flags": 0, "name": "_hs_network_game_start_now_definition" },
{ "file_offset": 2493360, "flags": 0, "name": "_hs_xbox_set_machine_name_definition" },
{ "file_offset": 2493392, "flags": 0, "name": "_hs_function_table_count" },
{ "file_offset": 2493396, "flags": 0, "name": "_hs_enum_table" },
{ "file_offset": 2493436, "flags": 0, "name": "??_C@_07CEEMMIOB@YAHSFFZ?$AA@" },
@@ -18931,6 +19360,8 @@
{ "file_offset": 2659944, "flags": 0, "name": "??_C@_0FD@MEFHNJOJ@region_index?$DN?$DNNONE?5?$HM?$HM?5?$CIregion_in@" },
{ "file_offset": 2660028, "flags": 0, "name": "__real@3a422e45" },
{ "file_offset": 2660032, "flags": 0, "name": "_default_object_lighting" },
{ "file_offset": 2660148, "flags": 0, "name": "_lightmap_sample_raycast_down", "static": true },
{ "file_offset": 2660160, "flags": 0, "name": "_lightmap_sample_raycast_sideways", "static": true },
{ "file_offset": 2660208, "flags": 0, "name": "??_C@_0CB@NDAECIIM@c?3?2halo?2source?2objects?2objects?4h@" },
{ "file_offset": 2660248, "flags": 0, "name": "??_C@_0LJ@HECDDFBP@material?9?$DOlightmap_vertices?4type@" },
{ "file_offset": 2660436, "flags": 0, "name": "??_C@_0CH@GHJLLMCD@c?3?2halo?2SOURCE?2objects?2object_li@" },
@@ -21967,10 +22398,38 @@
{ "file_offset": 2998440, "flags": 0, "name": "_bitmap_bevel_translation_flags", "static": true },
{ "file_offset": 2998480, "flags": 0, "name": "_global_bitmap_reference" },
{ "file_offset": 2998492, "flags": 0, "name": "_global_bitmap_reference_optional" },
{ "file_offset": 2998504, "flags": 0, "name": "_bitmap_types_strings", "static": true },
{ "file_offset": 2998516, "flags": 0, "name": "_bitmap_types", "static": true },
{ "file_offset": 2998528, "flags": 0, "name": "_bitmap_formats_strings", "static": true },
{ "file_offset": 2998600, "flags": 0, "name": "_bitmap_formats", "static": true },
{ "file_offset": 2998612, "flags": 0, "name": "_bitmap_flags_strings", "static": true },
{ "file_offset": 2998636, "flags": 0, "name": "_bitmap_flags", "static": true },
{ "file_offset": 2998648, "flags": 0, "name": "_bitmap_data_block_fields", "static": true },
{ "file_offset": 2998840, "flags": 0, "name": "_bitmap_data_block", "static": true },
{ "file_offset": 2998888, "flags": 0, "name": "_bitmap_group_sprite_block_fields", "static": true },
{ "file_offset": 2998996, "flags": 0, "name": "_bitmap_group_sprite_block", "static": true },
{ "file_offset": 2999040, "flags": 0, "name": "_bitmap_group_sequence_block_fields", "static": true },
{ "file_offset": 2999112, "flags": 0, "name": "_bitmap_group_sequence_block", "static": true },
{ "file_offset": 2999156, "flags": 0, "name": "_bitmap_group_flags_strings", "static": true },
{ "file_offset": 2999172, "flags": 0, "name": "_bitmap_group_flags", "static": true },
{ "file_offset": 2999180, "flags": 0, "name": "_bitmap_group_types_strings", "static": true },
{ "file_offset": 2999200, "flags": 0, "name": "_bitmap_group_types", "static": true },
{ "file_offset": 2999212, "flags": 0, "name": "_bitmap_group_usages_strings", "static": true },
{ "file_offset": 2999236, "flags": 0, "name": "_bitmap_group_usages", "static": true },
{ "file_offset": 2999248, "flags": 0, "name": "_bitmap_group_formats_strings", "static": true },
{ "file_offset": 2999272, "flags": 0, "name": "_bitmap_group_formats", "static": true },
{ "file_offset": 2999284, "flags": 0, "name": "_bitmap_group_sprite_budgets_strings", "static": true },
{ "file_offset": 2999304, "flags": 0, "name": "_bitmap_group_sprite_budgets", "static": true },
{ "file_offset": 2999316, "flags": 0, "name": "_bitmap_group_sprite_usages_strings", "static": true },
{ "file_offset": 2999328, "flags": 0, "name": "_bitmap_group_sprite_usages", "static": true },
{ "file_offset": 2999340, "flags": 0, "name": "_bitmap_pixel_data" },
{ "file_offset": 2999356, "flags": 0, "name": "_color_plate_data" },
{ "file_offset": 2999376, "flags": 0, "name": "_bitmap_fields", "static": true },
{ "file_offset": 2999760, "flags": 0, "name": "_bitmap_block", "static": true },
{ "file_offset": 2999808, "flags": 0, "name": "_bitmap_group" },
{ "file_offset": 2999904, "flags": 0, "name": "_global_vector_palette" },
{ "file_offset": 3000928, "flags": 0, "name": "_bitmap_type_string_table", "static": true },
{ "file_offset": 3000944, "flags": 0, "name": "_bitmap_format_string_table", "static": true },
{ "file_offset": 3001020, "flags": 0, "name": "_bits_per_channel_r5g6b5" },
{ "file_offset": 3001028, "flags": 0, "name": "_bits_per_channel_a1r5g5b5" },
{ "file_offset": 3001036, "flags": 0, "name": "_bits_per_channel_a4r4g4b4" },
@@ -22028,6 +22487,7 @@
{ "file_offset": 3002144, "flags": 0, "name": "_data_002dcf20" },
{ "file_offset": 3002416, "flags": 0, "name": "_data_002dd030" },
{ "file_offset": 3002720, "flags": 0, "name": "_current_playback" },
{ "file_offset": 3002728, "flags": 0, "name": "_v1_playback", "static": true },
{ "file_offset": 3002752, "flags": 0, "name": "_debug_recording_newlines" },
{ "file_offset": 3002756, "flags": 0, "name": "_global_contrail_reference" },
{ "file_offset": 3002768, "flags": 0, "name": "_decals_enabled" },
@@ -22093,6 +22553,8 @@
{ "file_offset": 3134896, "flags": 0, "name": "_compressed_monk_tone" },
{ "file_offset": 3153292, "flags": 0, "name": "_delta_z" },
{ "file_offset": 3153296, "flags": 0, "name": "_num_layers" },
{ "file_offset": 3153300, "flags": 0, "name": "_blur_offset", "static": true },
{ "file_offset": 3153304, "flags": 0, "name": "_progress_bar_restart", "static": true },
{ "file_offset": 3153305, "flags": 0, "name": "_terminal_render_enable" },
{ "file_offset": 3153312, "flags": 0, "name": "___medium_widget_memory_pool", "static": true },
{ "file_offset": 3169748, "flags": 0, "name": "_widget_memory_pool" },
@@ -22131,6 +22593,7 @@
{ "file_offset": 3176716, "flags": 0, "name": "_data_0030790c" },
{ "file_offset": 3176732, "flags": 0, "name": "_global_periodic_functions_enum_strings", "static": true },
{ "file_offset": 3176780, "flags": 0, "name": "_global_periodic_functions_enum" },
{ "file_offset": 3176792, "flags": 0, "name": "_global_transition_functions_enum_strings", "static": true },
{ "file_offset": 3176816, "flags": 0, "name": "_global_transition_functions_enum" },
{ "file_offset": 3176828, "flags": 0, "name": "_global_origin2d" },
{ "file_offset": 3176832, "flags": 0, "name": "_global_x_axis2d" },
@@ -22176,8 +22639,11 @@
{ "file_offset": 3181504, "flags": 0, "name": "_data_00308bc0" },
{ "file_offset": 3186088, "flags": 0, "name": "_byte_bs_codes", "static": true },
{ "file_offset": 3186104, "flags": 0, "name": "_byte_bs_definition" },
{ "file_offset": 3186124, "flags": 0, "name": "_word_bs_codes", "static": true },
{ "file_offset": 3186140, "flags": 0, "name": "_word_bs_definition" },
{ "file_offset": 3186160, "flags": 0, "name": "_long_bs_codes", "static": true },
{ "file_offset": 3186176, "flags": 0, "name": "_long_bs_definition" },
{ "file_offset": 3186196, "flags": 0, "name": "_int64_bs_codes", "static": true },
{ "file_offset": 3186212, "flags": 0, "name": "_int64_bs_definition" },
{ "file_offset": 3186232, "flags": 0, "name": "_packet_header_bs" },
{ "file_offset": 3186268, "flags": 0, "name": "_default_hash_polynomial" },
@@ -22230,9 +22696,9 @@
{ "file_offset": 3195792, "flags": 0, "name": "_object_type_definitions" },
{ "file_offset": 3195840, "flags": 0, "name": "?section@?1??objects_update@@9@9", "static": true },
{ "file_offset": 3197368, "flags": 0, "name": "_debug_objects_bounding_spheres" },
{ "file_offset": 3197376, "flags": 0, "name": "_global_collision_bsp_definition_data" },
{ "file_offset": 3197369, "flags": 0, "name": "_debug_objects_collision_models" },
{ "file_offset": 3197370, "flags": 0, "name": "_breakable_surface_effect_enabled" },
{ "file_offset": 3197376, "flags": 0, "name": "_global_collision_bsp_definition_data" },
{ "file_offset": 3198168, "flags": 0, "name": "_global_collision_bsp_fields" },
{ "file_offset": 3198276, "flags": 0, "name": "_collision_debug_flag_front_facing_surfaces" },
{ "file_offset": 3198277, "flags": 0, "name": "_collision_debug_flag_ignore_invisible_surfaces" },
@@ -22283,7 +22749,17 @@
{ "file_offset": 3205304, "flags": 0, "name": "_global_shader_effect_alpha_blended" },
{ "file_offset": 3205488, "flags": 0, "name": "_leaf_map_initialize_section", "static": true },
{ "file_offset": 3207016, "flags": 0, "name": "_global_leaf_face_polygon", "static": true },
{ "file_offset": 3207532, "flags": 0, "name": "_map_leaf_face_vertex_block_fields", "static": true },
{ "file_offset": 3207556, "flags": 0, "name": "_map_leaf_face_vertex_block", "static": true },
{ "file_offset": 3207600, "flags": 0, "name": "_map_leaf_portal_index_block_fields", "static": true },
{ "file_offset": 3207624, "flags": 0, "name": "_map_leaf_portal_index_block", "static": true },
{ "file_offset": 3207668, "flags": 0, "name": "_map_leaf_face_block_fields", "static": true },
{ "file_offset": 3207704, "flags": 0, "name": "_map_leaf_face_block", "static": true },
{ "file_offset": 3207748, "flags": 0, "name": "_global_map_leaf_block_fields", "static": true },
{ "file_offset": 3207784, "flags": 0, "name": "_global_map_leaf_block" },
{ "file_offset": 3207828, "flags": 0, "name": "_leaf_portal_vertex_block_fields", "static": true },
{ "file_offset": 3207852, "flags": 0, "name": "_leaf_portal_vertex_block", "static": true },
{ "file_offset": 3207896, "flags": 0, "name": "_global_leaf_portal_block_fields", "static": true },
{ "file_offset": 3207956, "flags": 0, "name": "_global_leaf_portal_block" },
{ "file_offset": 3208000, "flags": 0, "name": "_debug_leaf_index" },
{ "file_offset": 3208004, "flags": 0, "name": "_debug_leaf_portal_index" },
@@ -22291,7 +22767,7 @@
{ "file_offset": 3227880, "flags": 0, "name": "_render_structure_visibility_subcluster_traversal", "static": true },
{ "file_offset": 3229408, "flags": 0, "name": "_render_structure_visibility_surface_traversal", "static": true },
{ "file_offset": 3230936, "flags": 0, "name": "_structure_sphere_threshold" },
{ "file_offset": 3230944, "flags": 0, "name": "_data_00314ce0" },
{ "file_offset": 3230944, "flags": 0, "name": "_drive_path", "static": true },
{ "file_offset": 3230952, "flags": 0, "name": "_find_files_globals", "static": true },
{ "file_offset": 3231568, "flags": 0, "name": "_rider_ejection" },
{ "file_offset": 3233104, "flags": 0, "name": "_dialogue_vocalization_type_name" },
@@ -22311,7 +22787,8 @@
{ "file_offset": 3238088, "flags": 0, "name": "_playlist_profile_default_data" },
{ "file_offset": 3238196, "flags": 0, "name": "_memory_unit_root_path", "static": true },
{ "file_offset": 3238200, "flags": 0, "name": "_memory_unit_mapfile_path", "static": true },
{ "file_offset": 3238204, "flags": 0, "name": "_bink_saved_state" },
{ "file_offset": 3238204, "flags": 0, "name": "_bink_available_memory_kilobytes", "static": true },
{ "file_offset": 3238208, "flags": 0, "name": "_bink_saved_frame_rate_throttle", "static": true },
{ "file_offset": 3238212, "flags": 0, "name": "_aiff_byte_swap_globals" },
{ "file_offset": 3238348, "flags": 0, "name": "_riff_bs" },
{ "file_offset": 3238524, "flags": 0, "name": "_bungie_ima_adpcm_header_bs" },
@@ -22421,7 +22898,9 @@
{ "file_offset": 3251384, "flags": 0, "name": "_global_ai_debug_activation_cluster_bit_vector" },
{ "file_offset": 3251448, "flags": 0, "name": "_actor_debug_array" },
{ "file_offset": 3251452, "flags": 0, "name": "_actor_path_debug_array" },
{ "file_offset": 3251464, "flags": 0, "name": "_current_traverse_index" },
{ "file_offset": 3251456, "flags": 0, "name": "_global_ai_debug_path_render_id", "static": true },
{ "file_offset": 3251464, "flags": 0, "name": "_debug_path", "static": true },
{ "file_offset": 3256896, "flags": 0, "name": "_debug_obstacles", "static": true },
{ "file_offset": 3259976, "flags": 0, "name": "_debug_obstacle_path_on_failure" },
{ "file_offset": 3259977, "flags": 0, "name": "_debug_obstacle_path" },
{ "file_offset": 3259980, "flags": 0, "name": "_last", "static": true },
@@ -22462,6 +22941,7 @@
{ "file_offset": 3264056, "flags": 0, "name": "_transport_endpoint_globals" },
{ "file_offset": 3264584, "flags": 0, "name": "_director_globals" },
{ "file_offset": 3265584, "flags": 0, "name": "_director_camera_switch_fast" },
{ "file_offset": 3265585, "flags": 0, "name": "_hyper_key_down", "static": true },
{ "file_offset": 3265592, "flags": 0, "name": "_editor_camera_globals" },
{ "file_offset": 3265720, "flags": 0, "name": "_observer_globals", "static": true },
{ "file_offset": 3268396, "flags": 0, "name": "_bss_0031df2c" },
@@ -22479,8 +22959,7 @@
{ "file_offset": 4414628, "flags": 0, "name": "_animation_threads", "static": true },
{ "file_offset": 4414632, "flags": 0, "name": "_debug_recording" },
{ "file_offset": 4414636, "flags": 0, "name": "_animation_threads_debug", "static": true },
{ "file_offset": 4414640, "flags": 0, "name": "_bss_00435cb0" },
{ "file_offset": 4414816, "flags": 0, "name": "_debug_decals" },
{ "file_offset": 4414640, "flags": 0, "name": "_decal_points2d_temp", "static": true },
{ "file_offset": 4414832, "flags": 0, "name": "_decal_globals", "static": true },
{ "file_offset": 4414840, "flags": 0, "name": "_decal_geometry", "static": true },
{ "file_offset": 4445564, "flags": 0, "name": "_decal_locked_count_reported", "static": true },
@@ -22500,10 +22979,14 @@
{ "file_offset": 4449432, "flags": 0, "name": "_global_goal" },
{ "file_offset": 4450456, "flags": 0, "name": "_global_variant" },
{ "file_offset": 4450560, "flags": 0, "name": "_game_engine" },
{ "file_offset": 4450564, "flags": 0, "name": "_game_engine_teleport_message_ticks", "static": true },
{ "file_offset": 4450568, "flags": 0, "name": "_game_engine_teleport_flash_fade_function", "static": true },
{ "file_offset": 4450572, "flags": 0, "name": "_global_autogenerate_list" },
{ "file_offset": 4450576, "flags": 0, "name": "_global_autogenerate_count" },
{ "file_offset": 4450580, "flags": 0, "name": "_ctf_globals", "static": true },
{ "file_offset": 4450632, "flags": 0, "name": "_king_globals" },
{ "file_offset": 4451060, "flags": 0, "name": "_king_engine_hill_count", "static": true },
{ "file_offset": 4451064, "flags": 0, "name": "_king_engine_hills", "static": true },
{ "file_offset": 4451192, "flags": 0, "name": "_mp_sound_queue_count" },
{ "file_offset": 4451196, "flags": 0, "name": "_mp_sound_queue" },
{ "file_offset": 4451240, "flags": 0, "name": "_oddball_globals", "static": true },
@@ -22523,6 +23006,13 @@
{ "file_offset": 4468592, "flags": 0, "name": "_update_client_globals", "static": true },
{ "file_offset": 4535300, "flags": 0, "name": "_rumble_globals", "static": true },
{ "file_offset": 4535304, "flags": 0, "name": "_machine_to_player_table" },
{ "file_offset": 4535368, "flags": 0, "name": "_players_lost_map_started", "static": true },
{ "file_offset": 4535372, "flags": 0, "name": "_over_shield_screen_flash_fade_function", "static": true },
{ "file_offset": 4535376, "flags": 0, "name": "_over_shield_screen_flash_alpha", "static": true },
{ "file_offset": 4535380, "flags": 0, "name": "_over_shield_screen_flash_green", "static": true },
{ "file_offset": 4535384, "flags": 0, "name": "_active_camo_screen_flash_fade_function", "static": true },
{ "file_offset": 4535388, "flags": 0, "name": "_active_camo_screen_flash_alpha", "static": true },
{ "file_offset": 4535392, "flags": 0, "name": "_active_camo_screen_flash_blue", "static": true },
{ "file_offset": 4535396, "flags": 0, "name": "_debug_render_player_teleport" },
{ "file_offset": 4535400, "flags": 0, "name": "_hs_enumeration_result_count", "static": true },
{ "file_offset": 4535404, "flags": 0, "name": "_hs_enumeration_maximum_count", "static": true },
@@ -22557,8 +23047,9 @@
{ "file_offset": 4538416, "flags": 0, "name": "_progress_bar_globals", "static": true },
{ "file_offset": 4538888, "flags": 0, "name": "_progress_bar_mode" },
{ "file_offset": 4538908, "flags": 0, "name": "_last_t" },
{ "file_offset": 4538912, "flags": 0, "name": "_wobble_phase", "static": true },
{ "file_offset": 4538916, "flags": 0, "name": "_terminal_globals" },
{ "file_offset": 4538944, "flags": 0, "name": "_ui_widget_globals_storage" },
{ "file_offset": 4538944, "flags": 0, "name": "_ui_widget_globals_storage", "static": true },
{ "file_offset": 4541168, "flags": 0, "name": "_new_campaign_profile_name", "static": true },
{ "file_offset": 4541192, "flags": 0, "name": "_single_player_level_data" },
{ "file_offset": 4541272, "flags": 0, "name": "_persistant_game_data_info" },
@@ -22655,10 +23146,47 @@
{ "file_offset": 4581634, "flags": 0, "name": "_local_filthy_decal_fog_hack_enabled" },
{ "file_offset": 4581636, "flags": 0, "name": "_bss_0045e904" },
{ "file_offset": 4581640, "flags": 0, "name": "_dynamic_vertices" },
{ "file_offset": 4598272, "flags": 0, "name": "_dynamic_triangles", "static": true },
{ "file_offset": 4610576, "flags": 0, "name": "_aux_dynamic_unlit_vb", "static": true },
{ "file_offset": 4610580, "flags": 0, "name": "_dynamic_triangles_overflow_warning", "static": true },
{ "file_offset": 4610581, "flags": 0, "name": "_dynamic_vertices_overflow_warning", "static": true },
{ "file_offset": 4610582, "flags": 0, "name": "_reported_too_many_transparent_geometry_groups" },
{ "file_offset": 4610584, "flags": 0, "name": "_rasterizer_environment_globals", "static": true },
{ "file_offset": 4610768, "flags": 0, "name": "_rasterizer_environment_fog_screen_globals", "static": true },
{ "file_offset": 4611432, "flags": 0, "name": "_rasterizer_models_globals", "static": true },
{ "file_offset": 4610764, "flags": 0, "name": "_warned", "static": true },
{ "file_offset": 4610768, "flags": 0, "name": "_cached_node_matrix_count", "static": true },
{ "file_offset": 4610772, "flags": 0, "name": "_cached_node_matrices", "static": true },
{ "file_offset": 4610776, "flags": 0, "name": "_previous_camera_matrix", "static": true },
{ "file_offset": 4610984, "flags": 0, "name": "_local_environment_fog_screen_model_flag", "static": true },
{ "file_offset": 4610985, "flags": 0, "name": "_local_environment_fog_screen_flag", "static": true },
{ "file_offset": 4610988, "flags": 0, "name": "_local_fog_screen_layer_bitmap_indices", "static": true },
{ "file_offset": 4610996, "flags": 0, "name": "_local_fog_screen_layer_colors", "static": true },
{ "file_offset": 4611044, "flags": 0, "name": "_local_fog_eye_density", "static": true },
{ "file_offset": 4611048, "flags": 0, "name": "_local_fog_pass", "static": true },
{ "file_offset": 4611056, "flags": 0, "name": "_windows", "static": true },
{ "file_offset": 4611360, "flags": 0, "name": "_opaque_model_submit_parameters", "static": true },
{ "file_offset": 4611364, "flags": 0, "name": "_opaque_model_count", "static": true },
{ "file_offset": 4611368, "flags": 0, "name": "_fog_screen_active", "static": true },
{ "file_offset": 4611376, "flags": 0, "name": "_last_frame_index", "static": true },
{ "file_offset": 4611408, "flags": 0, "name": "_atmosphere_dominant_warning_count", "static": true },
{ "file_offset": 4611410, "flags": 0, "name": "_reported_bad_animation_index", "static": true },
{ "file_offset": 4611412, "flags": 0, "name": "_model", "static": true },
{ "file_offset": 4611416, "flags": 0, "name": "_model_parameters_cached", "static": true },
{ "file_offset": 4611420, "flags": 0, "name": "_cached_lighting", "static": true },
{ "file_offset": 4611424, "flags": 0, "name": "_cached_animation", "static": true },
{ "file_offset": 4611428, "flags": 0, "name": "_reported_too_many_opaque_models", "static": true },
{ "file_offset": 4611432, "flags": 0, "name": "_transparent_geometry_cached_animation", "static": true },
{ "file_offset": 4611436, "flags": 0, "name": "_transparent_geometry_cached_lighting", "static": true },
{ "file_offset": 4611440, "flags": 0, "name": "_transparent_geometry_cached_node_matrix_count", "static": true },
{ "file_offset": 4611444, "flags": 0, "name": "_transparent_geometry_cached_node_matrices", "static": true },
{ "file_offset": 4611448, "flags": 0, "name": "_immediate_transparent_geometry_group", "static": true },
{ "file_offset": 4611608, "flags": 0, "name": "_local_parameters", "static": true },
{ "file_offset": 4611612, "flags": 0, "name": "_local_parameters_queued_flag", "static": true },
{ "file_offset": 4611616, "flags": 0, "name": "_local_model_effect_type", "static": true },
{ "file_offset": 4611618, "flags": 0, "name": "_local_sky_flag", "static": true },
{ "file_offset": 4611619, "flags": 0, "name": "_local_planar_fog_flag", "static": true },
{ "file_offset": 4611620, "flags": 0, "name": "_local_environment_fog_screen_flag", "static": true },
{ "file_offset": 4611621, "flags": 0, "name": "_local_do_not_change_z_stencil_states", "static": true },
{ "file_offset": 4611622, "flags": 0, "name": "_local_reported_too_many_transparent_geometry_groups", "static": true },
{ "file_offset": 4611623, "flags": 0, "name": "_bss_00465e27" },
{ "file_offset": 4611624, "flags": 0, "name": "_rasterizer_profile_callback_elapsed_times", "static": true },
{ "file_offset": 4611752, "flags": 0, "name": "_rasterizer_profile_callback_end_times", "static": true },
@@ -22669,6 +23197,8 @@
{ "file_offset": 4612732, "flags": 0, "name": "_rasterizer_profile_state", "static": true },
{ "file_offset": 4612744, "flags": 0, "name": "_rasterizer_profile_error_count", "static": true },
{ "file_offset": 4612748, "flags": 0, "name": "_rasterizer_environment_shadows_globals", "static": true },
{ "file_offset": 4612820, "flags": 0, "name": "_shadow_setup", "static": true },
{ "file_offset": 4612821, "flags": 0, "name": "_shadow_used", "static": true },
{ "file_offset": 4612824, "flags": 0, "name": "_rasterizer_xbox_transparent_geometry_globals", "static": true },
{ "file_offset": 4612840, "flags": 0, "name": "_water_needs_update_flag" },
{ "file_offset": 4612841, "flags": 0, "name": "_water_visible_for_window_flag" },
@@ -22712,9 +23242,9 @@
{ "file_offset": 4951104, "flags": 0, "name": "_render_debug_globals", "static": true },
{ "file_offset": 4980812, "flags": 0, "name": "_bss_004c004c" },
{ "file_offset": 4980856, "flags": 0, "name": "_lighting_storage" },
{ "file_offset": 4980972, "flags": 0, "name": "_render_object_globals", "static": true },
{ "file_offset": 4982000, "flags": 0, "name": "_reported_rendered_object_overflow", "static": true },
{ "file_offset": 4980976, "flags": 0, "name": "_render_object_globals", "static": true },
{ "file_offset": 4982004, "flags": 0, "name": "_debug_inactive_objects" },
{ "file_offset": 4982005, "flags": 0, "name": "_reported_rendered_object_overflow", "static": true },
{ "file_offset": 4982008, "flags": 0, "name": "_render_sky_globals", "static": true },
{ "file_offset": 4982040, "flags": 0, "name": "_build_sprite_vertex_allocation_failure_reported", "static": true },
{ "file_offset": 4982048, "flags": 0, "name": "_bss_004c0520" },
@@ -22723,6 +23253,7 @@
{ "file_offset": 4982948, "flags": 0, "name": "_application_paused", "static": true },
{ "file_offset": 4982952, "flags": 0, "name": "_faked_xbox_command_line", "static": true },
{ "file_offset": 4982960, "flags": 0, "name": "_leaf_map_globals", "static": true },
{ "file_offset": 4983992, "flags": 0, "name": "_portal_count", "static": true },
{ "file_offset": 4983996, "flags": 0, "name": "_debug_detail_objects" },
{ "file_offset": 4984016, "flags": 0, "name": "_structure_render_globals", "static": true },
{ "file_offset": 4984040, "flags": 0, "name": "_structure_decals_globals" },
+1 -1
View File
@@ -117,7 +117,7 @@ if not is_windows():
sln.wrapper = args.wrapper
# Tool versions
sln.objdiff_tag = "v3.3.1"
sln.objdiff_tag = "v3.6.0"
sln.csplit_tag = "v0.0.2"
sln.wibo_tag = "1.0.0"
+30
View File
@@ -0,0 +1,30 @@
# January COMMON pool: ordering hypothesis and ownership limits
Lane C research, 2026-09-22; corrected during canonical reconciliation.
`linker_common.obj` is a synthetic split of tentative COMMON definitions.
Several independently attributed records appear in contiguous clusters whose
positions correlate with module order. This is useful as a **negative
constraint**, but it does not prove the owner of an individual symbol.
Every pooled record in `config/contribs.json` resolves to synthetic module 847.
The HCEX PDB lists these globals without a compiland. Declaration order and
first-reference order do not reliably reproduce the pool order, either.
Consequently, do not create a tentative definition merely because the symbol
falls between two apparently owned records.
The original Lane C packet applied that inference too strongly. Canonical
reconciliation excluded its 116-definition COMMON wave. An existing owner test
proved that `rasterizer_frame_statistics.c` **imports** its eponymous global,
despite the pool-order hypothesis assigning it to that TU. The same lack of
independent proof affects `hs_syntax_data`, `ai_globals`, and
`rasterizer_model_cortana_hack`; their Lane C moves were also not integrated.
These are unresolved ownership questions, not credited reconstructions.
The useful, narrower rule remains: a genuine tentative definition must be
uninitialised in source (`struct foo bar;`), while `= 0` or `= NULL` gives the
symbol different COFF ownership. Compare both the January object and the
rebuilt object's symbol class before accepting a declaration. The read-only
`tools/campaign/linker_common_base.py` can inspect the known pool records, but
its partial base earns **zero** matching credit under the all-or-nothing data
metric. Its output must not be used as an ownership oracle.
@@ -0,0 +1,63 @@
# source/linker_common: what a comparison base can and cannot earn
*2026-09-22, Lane C. Built at the owner's direction, from January's verified
COMMON records only, and scored separately from the board.*
## What the unit is
`source/linker_common` is not a translation unit. It is csplit's name for the
pooled COMMON block of January's image: 242 records totalling 1,272,664 bytes,
gathered by the linker from tentative definitions across the whole program
(`_render` 643,732, `_ai_debug` 547,628, `_dsound_globals` 30,924, and ~200
smaller ones, down to single-byte debug toggles). `objdiff.json` gives it a
`target_path` and **no `base_path`**, because our build produces no such object -
our COMMON symbols live in their owning objects' symbol tables with section 0.
So it reports 0.000% structurally, not because anything is wrong.
## The base, and its score
`tools/campaign/linker_common_base.py` builds a comparison base containing ONLY
verified records: a symbol January pools that our tree independently emits as a
COMMON symbol of the identical size. Nothing is invented, and nothing
initialised is copied - a `.bss` record carries no bytes, only a name and a
size, and the size used is the one our own objects request. Records we do not
emit, emit at a different size, or emit in a real section are dropped.
kept 58 records 1,214,903 bytes
dropped 184 records 56,787 bytes
Scored on its own (`objdiff-cli report generate` over a one-unit config):
.bss 1,272,568 95.541%
.rdata 96 0.000%
credited 0
**It earns nothing.** Data is credited per section only at 100%, so 95.541% is
worth exactly as much as 0%. The number's value is diagnostic: it says 95.5% of
the pooled block is already correct in our tree, and names precisely what is not.
## What the remaining 4.5% is
181 records, 56,187 bytes, absent from our tree entirely. Only 27 of them
(1,125 bytes) are CRT/XDK/dsound runtime symbols. The rest are genuine Halo
globals no TU of ours declares: `_dsound_globals` 30,924, `_rasterizer_lights`
7,172, `_sound_channels` 6,144, `_wind_globals` 3,340, `_error_globals` 2,056,
`_global_window_parameters` 600, and so on. Plus two pooled `.rdata` records
(96 bytes) that are not COMMON at all and so are outside this base by
construction, and one size mismatch, `_file_location_volume_names`, which is the
out-of-bounds array bug recorded separately.
Closing the section therefore needs those 181 globals declared as tentative
definitions in the right units - spread across many TUs, several of which are
not reconstructed - and it pays nothing until every one of them is present.
## Rules this establishes
* A symbol in `linker_common` was a TENTATIVE DEFINITION in January: declared
with no initialiser. **Never add `= {0}` to such a global** - that moves it out
of the pool. Check `linker_common` before touching any global's initialiser.
This is how the `actors.c` `= NULL` defect was found and fixed.
* Conversely, a global January keeps in its OWN object's `.bss` (director,
render_objects) was initialised in source, and must keep its initialiser.
* Do not wire this base into `objdiff.json`. It would fold a structurally
uncreditable section into the board number without closing anything.
@@ -0,0 +1,113 @@
# objdiff v3.3.1 mis-scores MSVC data relocations
*2026-09-22, Lane C. Established independently three ways: by reading objdiff's
source at tag v3.3.1, by black-box perturbation of January's own object files,
and by auditing this project's own adjudication ledger. All three agree.*
## The defect
A data section's objdiff score is decided by its **relocations**. Two
relocations are compared by `reloc_eq` in `objdiff-core/src/diff/data.rs`, which
first tries `symbol_name_matches()`. That helper assumes a `$` in a symbol name
is the Metrowerks `symbol$1234` unique-ID separator:
```rust
if let Some((prefix, suffix)) = left_name.split_once('$') {
if !suffix.chars().all(char::is_numeric) { return false; }
...
}
```
Every MSVC mangled string literal contains `?$AA` — the encoded NUL. For example
`??_C@_0P@LFOALBOL@objects_update?$AA@`. The suffix after the first `$` is
`AA@`, which is not numeric, so **the helper returns false for two
character-for-character identical names**.
`reloc_eq` then falls through to `address_eq`, which requires the target literal
to sit at the same offset inside the *synthetic combined* `.rdata` that
`report generate` builds (it forces `combine_data_sections: true`, and
`do_combine_sections` concatenates every same-named section in COFF
section-table order, padding each to `max(align, 4)`). csplit lists January's
`.rdata` COMDATs in image order; CL emits ours in its own order. So the address
test fails too, and a byte-perfect relocation is scored as a mismatch.
That costs the section twice. Relocated bytes are counted twice in
`diff_data_symbol`
match_ratio = (bytes_ratio*len + relocs_ratio*reloc_bytes) / (len + reloc_bytes)
and, worse, the whole-section byte fallback in `diff_data_section` is gated
behind `if all_left_relocs_match`, so it never runs. Since `report.rs` credits
data all-or-nothing per section, one mis-compared relocation forfeits the
entire section.
The code path is immune: `diff/code.rs::reloc_eq` compares names with plain `==`.
Fixed upstream in **objdiff v3.6.0** (2026-01-25), which added
`get_normalized_symbol_name` in `obj/read.rs`; it returns `None` for
`??_C@...?$AA@` so `symbol_name_matches` falls back to exact equality.
## Reproduction
Copy January's `objects.obj`, swap only the two `.rdata` COMDAT section headers
for `_object_memory_release_procs` (24 B) and the `objects_update` literal
(15 B), fixing symbol section numbers; change nothing else. January against
itself scores `.data` 100.0; January against that header-swapped copy scores
`.data` 99.739235 — the exact production number. Swapping two COFF *symbol
table* entries instead leaves it at 100.0, so symbol-table order is inert.
## Scale, measured at HEAD
40 data sections / **32,262 bytes** have identical size, identical raw bytes and
an identical relocation multiset, and would score exactly 100.000000 under an
exact-name rule. Of those:
* **37 sections / 29,582 bytes are already credited** by
`config/semantic_data_matches.json`. No progress bytes are being lost there —
but they are credited as *adjudications*, and the standing rule is that
adjudicated does not count as closed.
* **3 sections / 2,680 bytes are genuinely uncredited**:
`source/ai/actions .rdata` (2,388), `source/ai/ai_communication .data` (276),
`source/ai/actions .data` (16).
## Recommendation
Upgrading the differ to >= v3.6.0 is the root-cause fix. It would recover the
2,680 uncredited bytes and let roughly 37 adjudications be retired, converting
29,582 bytes from adjudicated to genuinely exact. That is a shared build-tool
change and needs an owner decision, and it must be measured board-wide first,
because a differ upgrade re-scores everything.
Do **not** chase these sections with source edits. The only source-side lever is
which `.rdata` COMDATs a TU emits and in what order, so that a literal lands at
January's combined offset — and the target order is csplit's, i.e. the linked
image's layout, which is a link-time property. Reordering or inventing literals
to shift an offset fails the strip test.
Do **not** add new adjudications for them either; that papers over the
instrument. Two entries were retired on 2026-09-22 for the opposite reason —
`cheats .bss` and `tif_version .data` became genuine matches, so their
adjudications were deleted at no cost to credited progress.
## Triage rule this establishes
Run the January-against-January self-diff **before** spending any wave on data,
and **regenerate it whenever the differ changes**. Rewrite `objdiff.json` with
`base_path = target_path` and absolute paths, drop `custom_make`/`build_target`,
then `objdiff-cli report generate`; it takes 0.12 s over all 833 units.
Under v3.3.1 it capped 47 sections / 87,889 bytes. **Under v3.6.0 it caps
nothing at all** - 0 sections, 0 bytes. Every one of those "permanent" ceilings
was this same defect: a January-side string COMDAT comparing unequal to itself,
so even a byte-identical copy could not reach 100. The campaign treated 87,889
bytes as unreachable on the strength of a number produced by the broken
comparator. Do not quote the old figure, and do not kill a target with a stale
ceiling report.
## Resolution
Landed 2026-09-22: `sln.objdiff_tag` pinned to v3.6.0, and the 40 adjudications
the fix makes redundant retired in the same commit. Board effect, measured on
identical objects: raw data +34,886, raw code and functions unchanged, zero
units losing anything, credited data +5,296, adjudications 43 -> 3. v3.8.1 was
measured and rejected - same data gain, but it loses 6 bytes of code.
@@ -0,0 +1,55 @@
# Lane C canonical reconciliation (2026-09-22)
Canonical base: `a01115aaf586e6e7386d873ce935e27c41e84e85` on
`jonas/exact-pilots`. Donor: `claude/lane-c-graphics-ui-20260920` at
`a5fd4a51aa76ad418c322c1d94d19b5d0c76f884` (60 local commits). This is
an audited net integration, **not** admission of all 60 donor commits.
## Verified result
- Stable function sweep versus `scratch/post-lanes-ab.json`: 8,245 functions,
7,470 -> 7,493 exact; 23 gained, **zero lost**; 17,056 newly exact padded
code bytes. `tools/campaign/stable_verdicts.py` identified every row.
- Halo meaningful code ledger: 1,479,452 -> 1,498,567 / 1,770,166.
This ledger also reflects the comparator upgrade, so its 19,115-byte delta
must not be represented as 19,115 newly reconstructed function bytes.
- Halo credited data: 2,378,791 -> 2,642,490 / 3,923,451. The large delta
includes the objdiff v3.3.1 -> v3.6.0 accounting correction, not just new
source. `hs` adds a separately verified 54,780-byte data closure.
- Full 833-unit build passed. Pytest: 1,152 passed, 5 skipped, 26 subtests.
Parks: 151 active, zero stale/invalid. Admission: zero contradicted or
revoked. `linker_common` remains partial and receives **zero** credit.
- The explicitly allowed `_point_from_line3d` copy in
`rasterizer_lights.obj` is byte-identical to January's folded survivor in
`action_charge.obj`; January's rasterizer-lights object imports it. The
runtime test checks both conditions.
## Reconciliation exclusions and corrections
- Excluded the 116 tentative COMMON definitions: pool adjacency cannot prove
individual TU ownership. An existing owner test refuted the claimed
`rasterizer_frame_statistics.c` owner. The later `hs_syntax_data`,
`ai_globals`, and `rasterizer_model_cortana_hack` moves were likewise not
carried forward. The pool-ordering document now states this limitation;
partial-base diagnostics remain research only.
- Excluded held `main_crash` null-write source, `_fast_ftol_C` pragma/asm,
the two-pass `_real_argb_color_to_pixel32` asm, and the lens-flare reset's
34-byte overrun. The latter was unsafe in the rebuilt object: COFF places a
different array immediately after the overwritten one, so the donor's
claimed adjacency assertion did not pin its actual consequence.
- Excluded the address-named, unreferenced cheats global from symbol credit;
marked `cheats.obj` nonmatching instead of presenting 3,201 unproven data
bytes as complete. Removed an invented bitmap-drawing global that regressed
the already-exact 2,784-byte `_bitmap_copy`.
- Removed a duplicate `king_engine` definition introduced by the merge.
Preserved the canonical AI communication and infection bodies where they
were already better. Moved consumer-local declarations for
`pin_normal_to_cone3d` and `object_list_from_ai_reference` to their owning
headers. Disclosed the January-attested interface locals and unrecovered
numeric stall labels in source.
- Rebased `_ai_test_ballistic_line_of_fire` as a **fuzzy** park after shared
declaration context changed its hash. No exact credit was assigned.
The donor's earlier handoff and admission manifest remain available only as
archival, lane-local evidence; they were incomplete at the final 60-commit
tip. The source/build/stable-sweep result above is the canonical claim.
@@ -0,0 +1,399 @@
# Lane C (graphics/UI) handoff - 2026-09-21
> Archival lane-local handoff, not a canonical admission report. This document
> was written before the final 60-commit tip and records only an interim
> tranche. See `claude_lane_c_canonical_reconciliation_20260922.md` for the
> audited net integration, rejected changes, and current metrics.
Brief: `docs/campaign_prompts/CLAUDE_REMAINING_LANE_C_GRAPHICS_UI_20260920.md`
(30 units: bitmaps, interface, rasterizer, rasterizer/xbox, render).
| | |
|---|---|
| frozen base | `6130661c9585fdb2785b3ff6bdb2ad0cfef0520c` |
| branch | `claude/lane-c-graphics-ui-20260920` |
| worktree | `C:\halo-worktrees\claude-lane-c-graphics-ui-20260920` |
| bare repo it was cut from | `...\2026-09-20\files-pasted-by-the-user-halo\work\halo-campaign.git` |
| pushed | **nothing** |
| canonical checkout | **untouched** |
Machine-readable per-function evidence:
`claude_lane_c_graphics_ui_admission_manifest_20260920.json`.
---
## 1. What this lane found that changes how the campaign works
Three inherited beliefs were wrong, and correcting them is worth more than the
bytes landed. All three are measured, not argued.
### 1.1 January's split objects cannot evidence COMDAT emission
A census over all 833 January split objects and all 833 of ours
(`scratch/orch/helper_census.py`):
| symbol | JAN definers | JAN referencers | OUR definers |
|---|---:|---:|---:|
| `_point_from_line3d` | 1 | 17 | 7 |
| `_normalize3d` | 1 | 54 | 60 |
| `_magnitude_squared3d` | 1 | 10 | 91 |
| `_scale_vector3d` | 1 | 5 | 61 |
| `_plane3d_distance_to_point` | 1 | 5 | 19 |
January shows **exactly one definer board-wide for every real_math header
inline** while dozens of objects reference each out of line. Identical COMDATs
folded to a single image copy and csplit attributed it to one object.
Consequence: `scratch/orch/newsyms.py` reporting *"January does not define it -
VIOLATION"* for a header inline is **structurally unreachable**, a false
positive by construction. It nearly cost this lane its first closure. The only
January-observable fact is out-of-line **reference**, which is exactly what the
owner's ruling keys on.
### 1.2 The inline-boundary census was unsound
`inline_boundary.py` compares only UNDEFINED external references, so any object
that emits a COMDAT itself never appears in the referencer list, and a symbol we
both define and call looks like a divergence. That produced phantom leads in
seven Lane C objects. Replacement: `scratch/orch/boundary2.py`, which classifies
every symbol DEF / REF / BOTH on both sides.
### 1.3 `_D3DSIMPLERENDERSTATEENCODE` is not a defect
The handoff flagged it as "one cause across six objects; find it once". Found,
and it is nothing. The relocation lives inside the XDK COMDAT
`_D3DDevice_SetRenderState`, at `mov ecx,[esi*4 + _D3DSIMPLERENDERSTATEENCODE]`
guarded by `cmp esi,0x52` (`State < D3DRS_SIMPLE_MAX`) - the scaled index proves
`State` is a variable, so `D3D8.h`'s `D3DINLINE` went out of line exactly as its
own comment describes. **Our build emits that COMDAT in precisely the same 19
objects as January.** The array itself is `extern CONST DECLSPEC_SELECTANY`;
ours has 106 definers and 0 referencers, January 1 and 20. Pure attribution.
No Halo source change exists or is needed.
---
## 2. New compiler laws, proven here
### LAW A - VC7 inline gating, decoded
VC7 /O2 decides inlining **per call site**, comparing one scalar callee cost
against a budget set by that site's statically estimated block weight.
Measured **inert**: caller size (callers to 2,384 bytes), number of call sites
(1/2/4/8 - strictly all-or-nothing at the boundary), argument shape, declaration
order of the callee's locals, statement order inside the callee, and all ten
optimisation-flag sets tried.
Movers:
- an aggregate local's `= { 0 }` initialiser is one whole cost STEP;
- an early-return guard lowers the budget of the rest of the function by a step
(the same `if` without a return is inert);
- a call site inside a loop gets about +3 steps, +1 per nesting level;
- storage class is inert (`__inline` == `static` == `static __inline`); only
`__forceinline` overrides;
- `__asm` in a body does not block inlining; a `match_assert` in the body is
what pushes a small helper over.
**A site's budget is measurable**: insert a static probe helper of tunable
statement count and bisect. Lab and probes: `scratch/research/inline-gating/`.
It paid: `s3tc::RGBToColor` cost 12 against a budget of 11 at both
`DecodeBlockRGB` sites; dropping its `= { 0 }` closed two functions.
**Forbidden**: `do { } while (FALSE)` or a one-trip `for` to buy the loop bonus.
It works, and it is fake matching. It is called out in the worker brief.
### LAW B - block/label selection IS source-reachable
This **refutes** the standing law that cross-jump selection is a scratch-register
consequence. VC7 merges returns that provably yield the same VALUE; the survivor
is canonical and alone carries a `$L` label, and a conditional branch targets it.
Changing only the VALUE of a second return flips which identical tail is
targeted, all other instructions unchanged. Returns merge on value, not spelling.
**Instrument: `CL /FAsc`.**
### LAW C - loop landing-pad reload order
Follows the order the loop body's values were **defined**, not declared.
**Caveat, measured**: sixteen definition-order shapes were byte-inert in
`_bitmap_2d_alpha_bleed`, so this is not the operative rule everywhere.
### LAW D - shrink-wrap
VC7 sinks a callee-saved push below a guard test only when the guard's false path
has its **own** return statement.
### LAW E - assert predicate strings
An assert predicate's `.rdata` string records the **preprocessed** source text
exactly: every space is a space and a line continuation becomes one space. Its
byte length therefore pins January's spacing *and* line layout of the predicate.
### LAW F - inner-block scoping
A scratch out-parameter aggregate declared at function top gets its own frame
slot; declared in the innermost block that uses it, VC7 coalesces it with a dead
local. This closed the frame blocker that `_rasterizer_sun_glow_draw`'s park had
recorded as donor-only.
### LAW G - global aggregate stores
VC7 hoists and sinks stores to distinct non-overlapping members of one global
aggregate freely. Their emitted order is **not** a source-statement-order readout.
---
## 3. Measured dead - do not respend
- **Adding a `REAL_MATH_EXTERNAL_*` switch**: nine trials across six units, every
one inert or a regression; two *broke* exact functions
(`_render_frustum_build_point_flags`, `_build_sprite_compute_vertex_fade`).
An all-or-nothing switch cannot express a per-site inline decision.
- **The `first_person_weapons` switch lattice**: all fifteen PAIRS probed on top
of the singles and the all-six case. Best is size-equal at 61 relocations
against January's 59; the count never goes below 60.
- **`_rasterizer_bitmap_new`'s early-return guard**: `[size 384!=400]`, sixteen
bytes worse. January really does place the guard block at the end.
- **The `interface` profile stall enumeration**: unrecoverable, not merely hard.
`_profile_rasterizer_stalls` has **zero referencers in January too**, so the
bit meanings are not in the image by construction; the Xbox 1 XDK headers carry
no stall enum; and a full `DIA2Dump -t` of HCEA's `HCEX.pdb` (78 MB) contains
no `stall_index`, `stall_count`, `profile_frame_info` or
`profile_frame_iterator` at all - the 2011 build had removed the debug profile
code. Every "stall" hit there is an Xbox 360 GPU register bitfield.
- **Declaring `local_lens_flare_occlusion_test_results` with one more entry** to
avoid January's overrun: invents a bound January did not have *and* moves the
`.bss` layout. Rejected; the overrun is real (see 5.4).
---
## 4. The relocation-alias class - 3,872 bytes disposed, no credit
Four `ui_widget_game_data_input_functions` rows differ from January in exactly
one relocation's **symbol spelling** and nothing else: identical code bytes,
identical relocation count, offsets and types, identical normalized hash on both
sides, objdiff 100.0. Resolved through `config/symbols.json`, both spellings name
the same image address:
| ours | January | address |
|---|---|---|
| `_cached_player_profile+156` | `_local_player_index_for_draw_string_and_hack_in_icons` | 5841532 |
| `_local_player_controller_bitmap_frames+26` | `"invalid game_data_input_referenc..."+2` | 2584102 |
`cached_player_profile` is three 52-byte entries at 5841376, so `+156` is one
past its extent and csplit attributes it to the next image symbol. The array in
the second case is 24 bytes at 2584076 and the literal begins right after it.
Parked as `csplit-relocation-alias` in commit `5f7ca192`. `_bitmap_sharpen`
(352 B) is the same class, already parked, and verified here the same way:
`_bitmap_sharpen_positive_table-2` and `_bitmap_sharpen_negative_table+510` both
resolve to 3260670; `_bitmap_sharpen_negative_table-2` and `_extract_data+42`
both to 3260158.
No C source makes VC7 name the successor symbol, so there is no source lever.
These rows finish in category 4 of the brief, not "unexamined".
---
## 5. Owner rulings obtained, and their effect
Full text: `scratch/lane_c/owner_rulings.md`.
### 5.1 Granted
- **Real_math inline COMDATs may be emitted** wherever January's same object
references the helper out of line, **extended to all such helpers**, on five
conditions (byte-identical COMDAT, strict-exact caller, authentic header use,
full ownership sweep, zero regressions). Applied in `a224e887`.
- The all-inlined header-inline COMDAT class binds, no per-symbol approval.
- `_eat_my_shorts`' duplicated equivalent branch: admitted as **recovered control
flow**, not steering.
- `_rasterizer_lights_reset_for_new_map`'s 34-byte overrun: admitted **on proof**
that the clobbered bytes are reinitialised before any read (5.4).
- `s3tc::RGBToColor`'s unwritten alpha byte: admitted as target-proven and
harmless, after the premise of an earlier hold changed (5.5).
### 5.2 Held, with ready candidates
- **`hud_draw::_fast_ftol_C`** - EXACT at 56 B, but only with
`#pragma optimize("",off)`. Held; rule 8 stands. The 56 code bytes are
byte-identical either way - the pragma changes only 8 tail nops and the inline
decision. Stripping it also regresses `_hud_draw_meter` from EXACT 1312.
`__declspec(noinline)` and `naked` both give 64. January's image genuinely
holds an unpadded 56-byte COMDAT (followed by `cc` fill), and only 2 of 7,561
January code sections are non-multiples of 16.
**Separate owner action requested**: `source/ai/ai.c:2888` already ships
`#pragma optimize("", off)` in production and contradicts the rule.
- **The `interface` packet** - `_render_debug_profile_stall_tick` EXACT 272 plus
`_render_debug_profile` fuzzy 2,272. Held pending four corrections outside the
allowlist; the proposal and consumer census are in
`scratch/lane_c/interface_prerequisite_proposal.md`. Note `profile.h` has **52
consumers**, so whoever lands it must run the full-tree diff - Lane C did not,
deliberately, because wave workers were compiling against those headers at the
time and a mid-wave shared-header change would have corrupted eight units'
measurements.
- **`render_sprite`'s 304 B** - reachable only by passing `&transformed_origin`
(a `real_point3d **`, a 4-byte object) where a `real_vector3d *` is expected
and letting the callee write 12 bytes through it, leaving `*transformed_origin`
unwritten in screen-space mode and read uninitialised at three call sites. Held
under rules 8 and 10. The clean part of the unit landed separately.
- **`rasterizer_xbox_environment_fog`'s five `*(long *)&real` punning casts** -
held; zero exact credit.
- **The `interface` stall switch's raw labels** - held; enum unrecoverable (3).
### 5.3 The data-lane prerequisite
Ruling: **take none**. Lane C is a pure cut of `6130661c` and must be rebased
after `claude/data-section-credit-20260920` merges. The seven prerequisite
commits are listed in the Lanes A/B handoff; three change relocation identity
Lane C code will need (assert respellings in `rasterizer_lights` and
`rasterizer_xbox_shadows`, the `bitmap_group` field rename in
`rasterizer_xbox_environment_fog`). **Reopen criterion**: after that merge,
re-measure those three units first.
### 5.4 The proof behind the lights overrun
January memsets 0x7722 = 897x34 bytes over an array whose own `.bss` extent in
January is exactly 30,464 = 896x34 (from `config/symbols.json`: the array starts
at 4877216, `_local_lens_flare_parameters` at 4907680). It genuinely clobbers 34
bytes of the next global. Admitted because:
1. the memset and `local_lens_flare_count = 0` are in the same function with no
read between them;
2. every read of `local_lens_flare_parameters` is guarded by that count - the
accessor asserts `lens_flare_index<local_lens_flare_count` and all four
consumer loops bound on it;
3. the count only grows at the site immediately followed by
`memcpy(lens_flare_parameters, parameters, sizeof(*lens_flare_parameters))`,
a full-struct write.
So after the reset no element is readable, and an element becomes readable only
once wholly overwritten. The argument is independent of the struct's size.
### 5.5 The s3tc alpha byte
`RGBToColor` leaves `rgba[S3TC_ALPHA]` unwritten and copies it out indeterminate,
as January does (January stores only three bytes of the local and copies four).
Both callers assign the alpha of every colour on the line immediately after, so
it is never read, and `byte` is unsigned char so there is no trap representation.
**It is not avoidable**: `= { 0 }`, an explicit alpha store before the channels,
and one after the channels were each measured and each returns both functions to
residual.
---
## 6. Data sections - three have ZERO differing bytes
| unit | section | size | objdiff | differing bytes |
|---|---|---:|---:|---:|
| render_particles | .data | 1528 | 99.739% | **0** |
| bitmaps | .data | 1116 | 89.002% | **0** |
| hud | .data | 4 | 50.000% | **0** |
Not content defects - **symbol coverage**. `bitmaps .data` shows it plainly: the
bytes at +1024..+1115 are identical, but ours names `_bitmap_type_string_table`
and `_bitmap_format_string_table` there while January's object names nothing,
because they are `static` and therefore absent from `cachebeta.pdb`'s publics.
objdiff cannot pair them and withholds the section. This is the naming-gap class.
Not pursued: it needs `config/symbols.json` surgery plus a re-split, the file is
the riskiest artifact in the campaign, the evidence a static needs cannot come
from the PDB by construction, and the data lane owns this area. Full diagnosis
and reopen criteria: `scratch/lane_c/data_section_diagnosis.md`.
`interface .rdata` (328 B, 56.8%) is a different case and is **code** work: the
three sections we lack are the two unwritten functions' string literals.
---
## 7. Method notes for the next lane
- **Re-measure every agent claim.** Across four waves, reviewers and the
orchestrator caught: a gain bought by a `#pragma`; a gain bought by a 12-byte
write through a 4-byte object; a candidate that privately redefined another
TU's struct with different signedness and declared a six-argument prototype for
a one-argument function; three unrelated UB changes shipped alongside one real
gain; and roughly a dozen "GAIN" labels on rows that never reached EXACT.
Every one was caught by re-running the gate, not by reading the report.
- **Make the reviewer build the minimal landing.** The single most useful
reviewer output was `revF_minimal.c` - production plus only the one hunk that
mattered - which turned a rejectable candidate into a clean 544-byte landing.
- **A parked sibling whose bytes move must be refreshed in the same commit.**
The s3tc landing staled `_Quantize` and `_DecodeBlockRGB__single_pixel` and
failed ninja's PROGRESS gate until `refresh_parks.py --apply` re-measured them
(they improved to 88.31% and 99.28%).
- **Do not touch shared headers while a wave is running.** Workers compile
against them; a mid-wave change silently corrupts every unit's measurements.
- **`castcheck.py` has a blind spot**: its regex matches only `real_*` view casts
and cannot see `(long *)&`. A PASS from it does not clear punning.
- Agent economics here: ~165-210K tokens per agent; a wave of 8 units
(8 workers + 8 reviewers) cost ~3.3-3.4M tokens and ~57 minutes at 8 concurrent.
---
## 8. Tools written for this lane (`scratch/orch/`)
| tool | purpose |
|---|---|
| `helper_census.py` | board-wide definer/referencer census for any symbol set |
| `boundary2.py` | sound DEF/REF/BOTH boundary census (replaces `inline_boundary.py`) |
| `find_reloc.py` | which function holds a relocation, with disassembly context |
| `callers_of.py` | which functions in an object call a symbol |
| `alias_resolve.py` | resolve two relocation spellings to image addresses |
| `comdat_bytes.py` | compare a COMDAT's body bytes across objects |
| `folding_probe.py` | test the COMDAT-folding hypothesis for a symbol |
| `switch_add_probe.py` | boundary-driven probe that ADDS a `REAL_MATH_EXTERNAL_*` switch |
| `park_add.py` | append parked.json entries by line surgery, measured live |
| `make_manifest.py` | build the admission manifest |
| `WORKER_BRIEF.md` | the binding worker contract, incl. the wave-1/2 lessons |
Evidence lives in `scratch/lane_c/` (research notes, rulings, data diagnosis,
the interface proposal) and `scratch/research/` (the inline-gating lab).
---
## 9. Results as of 2026-09-21 (interim - the lane is still running)
| | baseline | now | delta |
|---|---:|---:|---:|
| strict exact functions | 697 | 705 | **+8** |
| meaningful code bytes | 156,512 | 160,175 | **+3,663** |
| padded code bytes | 157,680 | 161,408 | **+3,728** |
| lane data bytes | 458,655 | 459,507 | **+852** |
| exact regressions | - | - | **0** |
Eleven commits on `claude/lane-c-graphics-ui-20260920` from `6130661c`. Nothing
pushed; the canonical checkout was never touched. Per-function before/after
evidence is in the admission manifest beside this file.
The eight closures: `_rasterizer_lens_flares_submit_occlusion_tests` (400),
`_DecodeBlockAlpha3__single_pixel` (432), `_eat_my_shorts` (32),
`_hud_show_action_response` (1,744), `_rasterizer_lights_reset_for_new_map` (48),
`_RGBToColor` (96), `_DecodeBlockRGB` (448), `_Quantize` (528).
`source/interface/hud` reached FUNCTION-COMPLETE at 22/22.
Two commits deliberately bank zero credit and are landed for correctness:
the `ColorToFcolor` loop form (preserves a measured 2,192-byte option that the
unrolled spelling silently foreclosed) and `_render_blip`'s initialiser move
(frame closed to January's exactly, relocation mismatch resolved).
### Measured, verified, and waiting on owner decisions - about 6,900 bytes
| item | bytes | blocked by |
|---|---:|---|
| `_EncodeBlockRGBColorKey` | 2,192 | needs the `&& cOpaque == 16` conjunct (HELD: reachable 0/0 and `mapRGB3[(long)NaN]`) |
| `_render_debug_profile_stall_tick` + fuzzy caller | 272 (+2,272) | cseries/effects header corrections outside the allowlist |
| `_DecodeBlockRGB__single_pixel` | 496 | needs a 60-byte write past a single-pixel caller object (HELD) |
| `_render_sprite` transform | 304 | needs a 12-byte write through a 4-byte object (HELD) |
| `_fast_ftol_C` | 56 | needs `#pragma optimize` (HELD) |
s3tc would reach 18/18 function-complete on the first and third together; the
all-safe variant was measured and gains nothing, so there is no safe path.
### What remains, by kind
- ~27,800 B frame-structural, now addressable by the decoded frame-slot rule
(section 2) - wave 6 is the first wave to use it.
- ~7,400 B in functions that are ALREADY SOURCE-CORRECT and blocked by
translation-unit state with no byte signature. Packet P3 of
`scratch/lane_c/breakthrough_proposal.md` instruments the compiler to name that
state. **These must not be parked as ties**: January's bytes came from
human-written C, so the state is a consequence of TU content and is
recoverable.
- 4,224 B in the csplit relocation-alias class - the one class where "not source
reachable" is a true statement, proven at the address level. It needs a
splitter or comparator decision, not source work.
@@ -0,0 +1,379 @@
{
"status": "archival-interim-only; see claude_lane_c_canonical_reconciliation_20260922.md",
"lane": "C (graphics/UI)",
"branch": "claude/lane-c-graphics-ui-20260920",
"frozen_base": "6130661c9585fdb2785b3ff6bdb2ad0cfef0520c",
"units": [
"source/bitmaps/bitmap_group",
"source/bitmaps/bitmap_utilities",
"source/bitmaps/bitmaps",
"source/bitmaps/s3tc/s3tc",
"source/interface/first_person_weapons",
"source/interface/hud",
"source/interface/hud_draw",
"source/interface/hud_messaging",
"source/interface/hud_nav_points",
"source/interface/hud_weapon",
"source/interface/interface",
"source/interface/motion_sensor",
"source/interface/progress_bar",
"source/interface/ui_widget",
"source/interface/ui_widget_game_data_input_functions",
"source/interface/virtual_keyboard",
"source/rasterizer/rasterizer_frame_statistics",
"source/rasterizer/rasterizer_geometry",
"source/rasterizer/rasterizer_lights",
"source/rasterizer/xbox/rasterizer_xbox_active_camouflage",
"source/rasterizer/xbox/rasterizer_xbox_environment",
"source/rasterizer/xbox/rasterizer_xbox_environment_fog",
"source/rasterizer/xbox/rasterizer_xbox_hardware_bitmaps",
"source/rasterizer/xbox/rasterizer_xbox_hardware_geometry",
"source/rasterizer/xbox/rasterizer_xbox_lights",
"source/rasterizer/xbox/rasterizer_xbox_models",
"source/rasterizer/xbox/rasterizer_xbox_shadows",
"source/render/render_cameras",
"source/render/render_particles",
"source/render/render_sprite"
],
"totals": {
"baseline_strict_functions": 697,
"final_strict_functions": 705,
"strict_function_gain": 8,
"baseline_meaningful_bytes": 156512,
"final_meaningful_bytes": 160175,
"new_meaningful_bytes": 3663,
"baseline_padded_bytes": 157680,
"final_padded_bytes": 161408,
"new_padded_bytes": 3728,
"exact_regressions": 0
},
"functions": [
{
"unit": "source/bitmaps/bitmap_utilities",
"function": "_bitmap_sharpen",
"before": {
"status": "residual",
"padded_bytes": 352,
"tag": "[reloc-identity]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 352,
"meaningful_bytes": 344,
"relocations": null,
"normalized_sha256": null,
"tag": "[reloc-identity]"
},
"newly_exact": true,
"lost_exact": false,
"commits": []
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_DecodeBlockAlpha3__single_pixel",
"before": {
"status": "residual",
"padded_bytes": 432,
"tag": "[size 448!=432, sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 432,
"meaningful_bytes": 432,
"relocations": 1,
"normalized_sha256": "b869ae2d8e5be4b6efe4fef80b120931dfc7da90d6d9c21a03a60b019f8e6ba5",
"tag": "[size 448!=432, sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"b2fe8e80 Use January's loop form in ColorToFcolor",
"71d6e77a Bind ColorToFcolor's byte-to-real conversion to a named local",
"9450f2f1 Restore RGBToColor's in-place channel expansion",
"fed1f953 Close DecodeBlockAlpha3__single_pixel by dropping the shared shift local"
]
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_DecodeBlockRGB",
"before": {
"status": "residual",
"padded_bytes": 448,
"tag": "[size 384!=448, relocs 3!=2, sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 448,
"meaningful_bytes": 435,
"relocations": 2,
"normalized_sha256": "fea1c6a895d8bbee78184c8fc8b615b008c32a49e61881ea0024c78e926b3529",
"tag": "[size 384!=448, relocs 3!=2, sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"b2fe8e80 Use January's loop form in ColorToFcolor",
"71d6e77a Bind ColorToFcolor's byte-to-real conversion to a named local",
"9450f2f1 Restore RGBToColor's in-place channel expansion",
"fed1f953 Close DecodeBlockAlpha3__single_pixel by dropping the shared shift local"
]
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_Quantize",
"before": {
"status": "residual",
"padded_bytes": 528,
"tag": "[sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 528,
"meaningful_bytes": 517,
"relocations": 30,
"normalized_sha256": "01a6d9b9fd4dd740422a1ced163db15fea206d97a106b0471381584fce23e591",
"tag": "[sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"b2fe8e80 Use January's loop form in ColorToFcolor",
"71d6e77a Bind ColorToFcolor's byte-to-real conversion to a named local",
"9450f2f1 Restore RGBToColor's in-place channel expansion",
"fed1f953 Close DecodeBlockAlpha3__single_pixel by dropping the shared shift local"
]
},
{
"unit": "source/bitmaps/s3tc/s3tc",
"function": "_RGBToColor",
"before": {
"status": "residual",
"padded_bytes": 96,
"tag": "[sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 96,
"meaningful_bytes": 81,
"relocations": 0,
"normalized_sha256": "ca5bedfcc8216c56321d66212d39b53e22e075af0592c03f107014ba342e40c7",
"tag": "[sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"b2fe8e80 Use January's loop form in ColorToFcolor",
"71d6e77a Bind ColorToFcolor's byte-to-real conversion to a named local",
"9450f2f1 Restore RGBToColor's in-place channel expansion",
"fed1f953 Close DecodeBlockAlpha3__single_pixel by dropping the shared shift local"
]
},
{
"unit": "source/interface/hud",
"function": "_hud_show_action_response",
"before": {
"status": "residual",
"padded_bytes": 1744,
"tag": "[sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 1744,
"meaningful_bytes": 1744,
"relocations": 120,
"normalized_sha256": "bfe1022d2e8f59dc3220b33c497fed91681596b485f4cb2b9339454fe27ec317",
"tag": "[sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"35637582 Bind the weapon and parent-unit lookups in hud_show_action_response"
]
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_player_profile_1wide_list_update",
"before": {
"status": "residual",
"padded_bytes": 1152,
"tag": "[reloc-identity]",
"parked": false
},
"after": {
"status": "EXACT",
"padded_bytes": 1152,
"meaningful_bytes": 1142,
"relocations": null,
"normalized_sha256": null,
"tag": "[reloc-identity]"
},
"newly_exact": true,
"lost_exact": false,
"commits": []
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_player_profile_3wide_list_update",
"before": {
"status": "residual",
"padded_bytes": 1232,
"tag": "[reloc-identity]",
"parked": false
},
"after": {
"status": "EXACT",
"padded_bytes": 1232,
"meaningful_bytes": 1222,
"relocations": null,
"normalized_sha256": null,
"tag": "[reloc-identity]"
},
"newly_exact": true,
"lost_exact": false,
"commits": []
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_player_profile_update_cache_for_nwide_list",
"before": {
"status": "residual",
"padded_bytes": 272,
"tag": "[reloc-identity]",
"parked": false
},
"after": {
"status": "EXACT",
"padded_bytes": 272,
"meaningful_bytes": 268,
"relocations": null,
"normalized_sha256": null,
"tag": "[reloc-identity]"
},
"newly_exact": true,
"lost_exact": false,
"commits": []
},
{
"unit": "source/interface/ui_widget_game_data_input_functions",
"function": "_splitscreen_pregame_status_screen_update",
"before": {
"status": "residual",
"padded_bytes": 1216,
"tag": "[reloc-identity]",
"parked": false
},
"after": {
"status": "EXACT",
"padded_bytes": 1216,
"meaningful_bytes": 1208,
"relocations": null,
"normalized_sha256": null,
"tag": "[reloc-identity]"
},
"newly_exact": true,
"lost_exact": false,
"commits": []
},
{
"unit": "source/rasterizer/rasterizer_frame_statistics",
"function": "_eat_my_shorts",
"before": {
"status": "residual",
"padded_bytes": 32,
"tag": "[size 16!=32, sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 32,
"meaningful_bytes": 21,
"relocations": 0,
"normalized_sha256": "272173574597a002350643c155ed196ad630c283059b477e0743dbf755f77f6e",
"tag": "[size 16!=32, sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"13315d5b Restore eat_my_shorts' three-way comparator shape"
]
},
{
"unit": "source/rasterizer/rasterizer_lights",
"function": "_rasterizer_lens_flares_submit_occlusion_tests",
"before": {
"status": "residual",
"padded_bytes": 400,
"tag": "[sha]",
"parked": true
},
"after": {
"status": "EXACT",
"padded_bytes": 400,
"meaningful_bytes": 385,
"relocations": 22,
"normalized_sha256": "1c79f999dc13e23a8c403b87948660413ea7a09a495a32d890c3abc3a5086612",
"tag": "[sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"4dcb1b96 Restore January's one-entry overrun in rasterizer_lights_reset_for_new_map",
"a224e887 Restore the natural point_from_line3d inline schedule in rasterizer_lights"
]
},
{
"unit": "source/rasterizer/rasterizer_lights",
"function": "_rasterizer_lights_reset_for_new_map",
"before": {
"status": "residual",
"padded_bytes": 48,
"tag": "[sha]",
"parked": false
},
"after": {
"status": "EXACT",
"padded_bytes": 48,
"meaningful_bytes": 48,
"relocations": 5,
"normalized_sha256": "4f9cb4ce3bec8de638c72949310c64a671911c460348728ddc088c7d9377e290",
"tag": "[sha]"
},
"newly_exact": true,
"lost_exact": false,
"commits": [
"4dcb1b96 Restore January's one-entry overrun in rasterizer_lights_reset_for_new_map",
"a224e887 Restore the natural point_from_line3d inline schedule in rasterizer_lights"
]
}
],
"commits": {
"source/bitmaps/s3tc/s3tc": [
"b2fe8e80 Use January's loop form in ColorToFcolor",
"71d6e77a Bind ColorToFcolor's byte-to-real conversion to a named local",
"9450f2f1 Restore RGBToColor's in-place channel expansion",
"fed1f953 Close DecodeBlockAlpha3__single_pixel by dropping the shared shift local"
],
"source/interface/hud": [
"35637582 Bind the weapon and parent-unit lookups in hud_show_action_response"
],
"source/interface/motion_sensor": [
"013d2892 Start render_blip's pulse_scale at the branch, not the declaration"
],
"source/rasterizer/rasterizer_frame_statistics": [
"13315d5b Restore eat_my_shorts' three-way comparator shape"
],
"source/rasterizer/rasterizer_lights": [
"4dcb1b96 Restore January's one-entry overrun in rasterizer_lights_reset_for_new_map",
"a224e887 Restore the natural point_from_line3d inline schedule in rasterizer_lights"
],
"source/render/render_sprite": [
"c33ce296 Restore render_sprite's orientation enum, linkage and quarter-circle constant"
]
}
}
+11 -18
View File
@@ -297,12 +297,6 @@ struct bink_playback_globals
long memory_pool_size;
};
struct bink_playback_saved_state
{
unsigned long available_memory_kilobytes;
boolean frame_rate_throttle;
};
typedef void *(__stdcall *rad_memory_allocate_proc)(
unsigned long size);
typedef void (__stdcall *rad_memory_free_proc)(
@@ -326,8 +320,6 @@ typedef char bink_playback_globals_screen_geometry_offset_assert[
offsetof(struct bink_playback_globals, screen_geometry) == 0x40 ? 1 : -1];
typedef char bink_playback_globals_memory_pool_base_offset_assert[
offsetof(struct bink_playback_globals, memory_pool_base) == 0xCC ? 1 : -1];
typedef char bink_playback_saved_state_frame_rate_throttle_offset_assert[
offsetof(struct bink_playback_saved_state, frame_rate_throttle) == 4 ? 1 : -1];
typedef char bink_summary_size_assert[
sizeof(BINKSUMMARY) == 0x7C ? 1 : -1];
typedef char bink_summary_skipped_frames_offset_assert[
@@ -405,18 +397,19 @@ static void bink_playback_idle(
/* ---------- globals */
extern struct bink_playback_globals bink_globals;
extern struct bink_playback_saved_state bink_saved_state;
extern boolean debug_bink;
static unsigned long bink_available_memory_kilobytes= NONE;
static boolean bink_saved_frame_rate_throttle= TRUE;
/* January .bss +0x00: the allocation table handed to bink */
extern void *bink_pointer_blocks[MAXIMUM_NUMBER_OF_BINK_POINTER_BLOCKS];
void *bink_pointer_blocks[MAXIMUM_NUMBER_OF_BINK_POINTER_BLOCKS] = { 0 };
/* January .bss +0x40: the bitmap the rasterizer draws the movie frame from */
extern struct bitmap_data bink_bitmap;
struct bitmap_data bink_bitmap = { 0 };
/* January .bss +0x70: the hand-built linear texture over the frame buffer */
extern D3DBaseTexture bink_texture;
D3DBaseTexture bink_texture = { 0 };
boolean debug_bink = FALSE;
struct bink_playback_globals bink_globals = { 0 };
/* January .bss +0x160: entries used in bink_pointer_blocks */
extern long bink_pointer_block_count;
long bink_pointer_block_count = 0;
/* ---------- public code */
@@ -471,7 +464,7 @@ void bink_playback_stop(
if (TEST_FLAG(bink_globals.flags, _bink_playback_return_to_main_menu_when_finished_bit))
main_menu_load();
saved_frame_rate_throttle = bink_saved_state.frame_rate_throttle;
saved_frame_rate_throttle = bink_saved_frame_rate_throttle;
bink_globals.flags = 0;
global_frame_rate_throttle = saved_frame_rate_throttle;
attract_mode_reset_timer();
@@ -637,7 +630,7 @@ void bink_playback_start(
bink_decompress_video_frame();
bink_saved_state.frame_rate_throttle= global_frame_rate_throttle;
bink_saved_frame_rate_throttle= global_frame_rate_throttle;
bink_globals.total_skipped_frames= 0;
bink_globals.total_skipped_blits= 0;
bink_globals.frame_count_at_last_summary= 0;
@@ -819,7 +812,7 @@ static void bink_get_memory_available(
csmemset(&status, 0, sizeof(status));
status.dwLength= sizeof(status);
GlobalMemoryStatus(&status);
bink_saved_state.available_memory_kilobytes= status.dwAvailPhys/1024;
bink_available_memory_kilobytes= status.dwAvailPhys/1024;
return;
}
+2 -2
View File
@@ -470,7 +470,7 @@ boolean bitmaps_extract(
}
if (!result ||
!tag_block_resize(&group->bitmap_data, 0) ||
!tag_block_resize(&group->bitmaps, 0) ||
!tag_block_resize(&group->sequences, 0) ||
!tag_data_resize(&group->pixel_data, 0))
{
@@ -1780,7 +1780,7 @@ static short extract_add_bitmap(
{
working_bitmap = bitmap_clone(bitmap);
destination_bitmap = TAG_BLOCK_GET_ELEMENT(
&extract_data.group->bitmap_data,
&extract_data.group->bitmaps,
bitmap_index,
struct bitmap_data);
+404 -28
View File
@@ -328,6 +328,53 @@ enum
/* ---------- structures */
/* ---------- declarations that belong in tag_files/tag_groups.h
These are shared tag-system types, not bitmap_group's own: seven
tag_field_type constants January's bitmap_fields uses, and struct
tag_flags_definition and struct tag_group (member lists attested by
HCEX.pdb). They are held here because this lane may not commit shared
cross-lane headers; moving them to tag_groups.h is an owner action and is
data-inert (VC7 lays .data out by declaration order, not name count).
---------- */
enum
{
_tag_field_tag = 5,
_tag_field_point2d = 10,
_tag_field_real = 14,
_tag_field_real_fraction = 15,
_tag_field_real_point2d = 16,
_tag_field_explanation = 42,
_tag_field_custom = 43,
};
typedef boolean (*postprocess_tag_proc)(
long tag_index,
boolean editing);
struct tag_flags_definition
{
long count;
char **names;
};
struct tag_group
{
char *name;
unsigned long flags;
unsigned long group_tag;
unsigned long parent_group_tag;
short version;
postprocess_tag_proc postprocess_tag;
struct tag_block_definition *header_block_definition;
unsigned long child_group_tags[16];
short child_count;
};
typedef char tag_group_size_assert[sizeof(struct tag_group) == 0x60 ? 1 : -1];
/* ---------- END OWNER HEADER PREREQUISITE */
/* ---------- prototypes */
boolean postprocess_bitmap(
@@ -336,7 +383,7 @@ boolean postprocess_bitmap(
void delete_bitmap(
struct tag_block *block,
long element_index);
boolean postprocess_bitmap_group(
static boolean postprocess_bitmap_group(
long bitmap_group_index,
boolean editing);
@@ -344,6 +391,339 @@ boolean postprocess_bitmap_group(
extern boolean find_all_fucked_up_shit;
struct tag_reference_definition global_bitmap_reference =
{
0,
BITMAP_GROUP_TAG,
NULL,
};
struct tag_reference_definition global_bitmap_reference_optional =
{
0,
BITMAP_GROUP_TAG,
NULL,
};
static char *bitmap_types_strings[3] =
{
"2D texture",
"3D texture",
"cube map",
};
static struct tag_enum_definition bitmap_types =
{
3,
bitmap_types_strings,
NULL,
};
static char *bitmap_formats_strings[18] =
{
"a8",
"y8",
"ay8",
"a8y8",
"unused1",
"unused2",
"r5g6b5",
"unused3",
"a1r5g5b5",
"a4r4g4b4",
"x8r8g8b8",
"a8r8g8b8",
"unused4",
"unused5",
"dxt1",
"dxt3",
"dxt5",
"p8-bump",
};
static struct tag_enum_definition bitmap_formats =
{
18,
bitmap_formats_strings,
NULL,
};
static char *bitmap_flags_strings[6] =
{
"power of two dimensions",
"compressed",
"palettized",
"swizzled",
"linear",
"v16u16",
};
static struct tag_flags_definition bitmap_flags =
{
6,
bitmap_flags_strings,
};
static struct tag_field bitmap_data_block_fields[16] =
{
{ _tag_field_tag, 0, "signature*", NULL },
{ _tag_field_short_integer, 0, "width*:pixels", NULL },
{ _tag_field_short_integer, 0, "height*:pixels", NULL },
{ _tag_field_short_integer, 0, "depth*:pixels#depth is 1 for 2D textures and cube maps", NULL },
{ _tag_field_enum, 0, "type*#determines bitmap 'geometry'", &bitmap_types },
{ _tag_field_enum, 0, "format*#determines how pixels are represented internally", &bitmap_formats },
{ _tag_field_word_flags, 0, "flags*", &bitmap_flags },
{ _tag_field_point2d, 0, "registration point*", NULL },
{ _tag_field_short_integer, 0, "mipmap count*", NULL },
{ _tag_field_pad, 0, NULL, (void *)2 },
{ _tag_field_long_integer, 0, "pixels offset*", NULL },
{ _tag_field_pad, 0, NULL, (void *)4 },
{ _tag_field_pad, 0, NULL, (void *)4 },
{ _tag_field_pad, 0, NULL, (void *)4 },
{ _tag_field_pad, 0, NULL, (void *)8 },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition bitmap_data_block =
{
"bitmap_data_block",
0,
2048,
sizeof(struct bitmap_data),
NULL,
bitmap_data_block_fields,
NULL,
postprocess_bitmap,
NULL,
delete_bitmap,
NULL,
};
static struct tag_field bitmap_group_sprite_block_fields[9] =
{
{ _tag_field_short_integer, 0, "bitmap index*", NULL },
{ _tag_field_pad, 0, NULL, (void *)2 },
{ _tag_field_pad, 0, NULL, (void *)4 },
{ _tag_field_real, 0, "left*", NULL },
{ _tag_field_real, 0, "right*", NULL },
{ _tag_field_real, 0, "top*", NULL },
{ _tag_field_real, 0, "bottom*", NULL },
{ _tag_field_real_point2d, 0, "registration point*", NULL },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition bitmap_group_sprite_block =
{
"bitmap_group_sprite_block",
0,
64,
sizeof(struct bitmap_group_sprite),
NULL,
bitmap_group_sprite_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct tag_field bitmap_group_sequence_block_fields[6] =
{
{ _tag_field_string, 0, "name^", NULL },
{ _tag_field_short_integer, 0, "first bitmap index*", NULL },
{ _tag_field_short_integer, 0, "bitmap count*", NULL },
{ _tag_field_pad, 0, NULL, (void *)16 },
{ _tag_field_block, 0, "sprites*", &bitmap_group_sprite_block },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition bitmap_group_sequence_block =
{
"bitmap_group_sequence_block",
0,
256,
sizeof(struct bitmap_group_sequence),
NULL,
bitmap_group_sequence_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static char *bitmap_group_flags_strings[4] =
{
"enable diffusion dithering",
"disable height map compression",
"uniform sprite sequences",
"filthy sprite bug fix",
};
static struct tag_flags_definition bitmap_group_flags =
{
4,
bitmap_group_flags_strings,
};
static char *bitmap_group_types_strings[5] =
{
"2D textures",
"3D textures",
"cube maps",
"sprites",
"interface bitmaps",
};
static struct tag_enum_definition bitmap_group_types =
{
5,
bitmap_group_types_strings,
NULL,
};
static char *bitmap_group_usages_strings[6] =
{
"alpha-blend",
"default",
"height map",
"detail map",
"light map",
"vector map",
};
static struct tag_enum_definition bitmap_group_usages =
{
6,
bitmap_group_usages_strings,
NULL,
};
static char *bitmap_group_formats_strings[6] =
{
"compressed with color-key transparency",
"compressed with explicit alpha",
"compressed with interpolated alpha",
"16-bit color",
"32-bit color",
"monochrome",
};
static struct tag_enum_definition bitmap_group_formats =
{
6,
bitmap_group_formats_strings,
NULL,
};
static char *bitmap_group_sprite_budgets_strings[5] =
{
"32x32",
"64x64",
"128x128",
"256x256",
"512x512",
};
static struct tag_enum_definition bitmap_group_sprite_budgets =
{
5,
bitmap_group_sprite_budgets_strings,
NULL,
};
static char *bitmap_group_sprite_usages_strings[3] =
{
"blend/add/subtract/max",
"multiply/min",
"double multiply",
};
static struct tag_enum_definition bitmap_group_sprite_usages =
{
3,
bitmap_group_sprite_usages_strings,
NULL,
};
struct tag_data_definition bitmap_pixel_data =
{
"bitmap_pixel_data",
1,
0x1000000,
NULL,
};
struct tag_data_definition color_plate_data =
{
"color_plate_data",
1,
0x1000000,
NULL,
};
static struct tag_field bitmap_fields[32] =
{
{ _tag_field_custom, 0, NULL, (void *)'bshw' },
{ _tag_field_explanation, 0, "type", "Type controls bitmap 'geometry'. All dimensions must be a power of two except for SPRITES and INTERFACE BITMAPS:\n\n* 2D TEXTURES: Ordinary, 2D textures will be generated.\n* 3D TEXTURES: Volume textures will be generated from each sequence of 2D texture 'slices'.\n* CUBE MAPS: Cube maps will be generated from each consecutive set of six 2D textures in each sequence, all faces of a cube map must be square and the same size.\n* SPRITES: Sprite texture pages will be generated.\n* INTERFACE BITMAPS: Similar to 2D TEXTURES, but without mipmaps and without the power of two restriction." },
{ _tag_field_enum, 0, "type", &bitmap_group_types },
{ _tag_field_explanation, 0, "format", "Format controls how pixels will be stored internally:\n\n* COMPRESSED WITH COLOR-KEY TRANSPARENCY: DXT1 compression, uses 4 bits per pixel. 4x4 blocks of pixels are reduced to 2 colors and interpolated, alpha channel uses color-key transparency instead of alpha from the plate (all zero-alpha pixels also have zero-color).\n* COMPRESSED WITH EXPLICIT ALPHA: DXT2/3 compression, uses 8 bits per pixel. Same as DXT1 without the color key transparency, alpha channel uses alpha from plate quantized down to 4 bits per pixel.\n* COMPRESSED WITH INTERPOLATED ALPHA: DXT4/5 compression, uses 8 bits per pixel. Same as DXT2/3, except alpha is smoother. Better for smooth alpha gradients, worse for noisy alpha.\n* 16-BIT COLOR: Uses 16 bits per pixel. Depending on the alpha channel, bitmaps are quantized to either r5g6b5 (no alpha), a1r5g5b5 (1-bit alpha), or a4r4g4b4 (>1-bit alpha).\n* 32-BIT COLOR: Uses 32 bits per pixel. Very high quality, can have alpha at no added cost. This format takes up the most memory, however. Bitmap formats are x8r8g8b8 and a8r8g8b.\n* MONOCHROME: Uses either 8 or 16 bits per pixel. Bitmap formats are a8 (alpha), y8 (intensity), ay8 (combined alpha-intensity) and a8y8 (separate alpha-intensity).\n\nNote: Height maps (a.k.a. bump maps) should use 32-bit color; this is internally converted to a palettized format which takes less memory." },
{ _tag_field_enum, 0, "format", &bitmap_group_formats },
{ _tag_field_explanation, 0, "usage", "Usage controls how mipmaps are generated:\n\n* ALPHA BLEND: Pixels with zero alpha are ignored in mipmaps, to prevent bleeding the transparent color.\n* DEFAULT: Downsampling works normally, as in Photoshop.\n* HEIGHT MAP: The bitmap (normally grayscale) is a height map which gets converted to a bump map. Uses <bump height> below. Alpha is passed through unmodified.\n* DETAIL MAP: Mipmap color fades to gray, controlled by <detail fade factor> below. Alpha fades to white.\n* LIGHT MAP: Generates no mipmaps. Do not use!\n* VECTOR MAP: Used mostly for special effects; pixels are treated as XYZ vectors and normalized after downsampling. Alpha is passed through unmodified." },
{ _tag_field_enum, 0, "usage", &bitmap_group_usages },
{ _tag_field_word_flags, 0, "flags", &bitmap_group_flags },
{ _tag_field_explanation, 0, "post-processing", "These properties control how mipmaps are post-processed." },
{ _tag_field_real_fraction, 0, "detail fade factor:[0,1]#0 means fade to gray by last mipmap, 1 means fade to gray by first mipmap", NULL },
{ _tag_field_real_fraction, 0, "sharpen amount:[0,1]#sharpens mipmap after downsampling", NULL },
{ _tag_field_real_fraction, 0, "bump height:repeats#the apparent height of the bump map above the triangle it is textured onto, in texture repeats (i.e., 1.0 would be as high as the texture is wide)", NULL },
{ _tag_field_explanation, 0, "sprite processing", "When creating a sprite group, specify the number and size of textures that the group is allowed to occupy. During importing, you'll receive feedback about how well the alloted space was used." },
{ _tag_field_enum, 0, "sprite budget size", &bitmap_group_sprite_budgets },
{ _tag_field_short_integer, 0, "sprite budget count", NULL },
{ _tag_field_explanation, 0, "color plate", "The original TIFF file used to import the bitmap group." },
{ _tag_field_short_integer, 0, "color plate width*:pixels", NULL },
{ _tag_field_short_integer, 0, "color plate height*:pixels", NULL },
{ _tag_field_data, 0, "compressed color plate data*", &color_plate_data },
{ _tag_field_explanation, 0, "processed pixel data", "Pixel data after being processed by the tool." },
{ _tag_field_data, 0, "processed pixel data*", &bitmap_pixel_data },
{ _tag_field_explanation, 0, "miscellaneous", "" },
{ _tag_field_real, 0, "blur filter size:[0,10] pixels#blurs the bitmap before generating mipmaps", NULL },
{ _tag_field_real, 0, "alpha bias:[-1,1]#affects alpha mipmap generation", NULL },
{ _tag_field_short_integer, 0, "mipmap count:levels#0 defaults to all levels", NULL },
{ _tag_field_explanation, 0, "...more sprite processing", "Sprite usage controls the background color of sprite plates." },
{ _tag_field_enum, 0, "sprite usage", &bitmap_group_sprite_usages },
{ _tag_field_short_integer, 0, "sprite spacing*", NULL },
{ _tag_field_pad, 0, NULL, (void *)2 },
{ _tag_field_block, 0, "sequences*", &bitmap_group_sequence_block },
{ _tag_field_block, 0, "bitmaps*", &bitmap_data_block },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition bitmap_block =
{
"bitmap",
0,
1,
sizeof(struct bitmap_group),
NULL,
bitmap_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
struct tag_group bitmap_group =
{
"bitmap",
8,
BITMAP_GROUP_TAG,
NONE,
7,
postprocess_bitmap_group,
&bitmap_block,
};
/* ---------- public code */
struct bitmap_data *bitmap_group_try_and_get_bitmap(
@@ -353,10 +733,10 @@ struct bitmap_data *bitmap_group_try_and_get_bitmap(
struct bitmap_group *group = bitmap_group_get(bitmap_group_index);
struct bitmap_data *result = NULL;
if (group && bitmap_index >= 0 && bitmap_index < group->bitmap_data.count)
if (group && bitmap_index >= 0 && bitmap_index < group->bitmaps.count)
{
result = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data,
&group->bitmaps,
bitmap_index,
struct bitmap_data);
}
@@ -408,10 +788,10 @@ struct bitmap_data *bitmap_group_get_bitmap_from_sequence(
if (bitmap_index == NONE)
bitmap_index = frame_index;
if (bitmap_index >= 0 && bitmap_index < group->bitmap_data.count)
if (bitmap_index >= 0 && bitmap_index < group->bitmaps.count)
{
result = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data,
&group->bitmaps,
bitmap_index,
struct bitmap_data);
}
@@ -520,20 +900,20 @@ short bitmap_group_add_bitmap(
return NONE;
}
previous_count = group->bitmap_data.count;
previous_count = group->bitmaps.count;
pixel_data_size = bitmap_get_pixel_data_size(&new_bitmap_data);
if (tag_block_resize(&group->bitmap_data, group->bitmap_data.count + 1) &&
if (tag_block_resize(&group->bitmaps, group->bitmaps.count + 1) &&
tag_data_resize(&group->pixel_data, group->pixel_data.size + pixel_data_size))
{
struct bitmap_data *previous_bitmap = NULL;
short bitmap_index = 0;
for (;
bitmap_index < group->bitmap_data.count;
bitmap_index < group->bitmaps.count;
bitmap_index = (short)(bitmap_index + 1))
{
struct bitmap_data *bitmap = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data,
&group->bitmaps,
bitmap_index,
struct bitmap_data);
@@ -550,15 +930,11 @@ short bitmap_group_add_bitmap(
match_assert(
"c:\\halo\\SOURCE\\bitmaps\\bitmap_group.c",
0x352,
(byte *)bitmap->base_address >=
(byte *)group->pixel_data.address);
(byte*)bitmap->base_address>=(byte*)group->pixel_data.address);
match_assert(
"c:\\halo\\SOURCE\\bitmaps\\bitmap_group.c",
0x354,
(byte *)bitmap->base_address +
bitmap_get_pixel_data_size(bitmap) <=
(byte *)group->pixel_data.address +
group->pixel_data.size);
(byte*)bitmap->base_address + bitmap_get_pixel_data_size(bitmap) <= (byte*)group->pixel_data.address + group->pixel_data.size);
if (previous_bitmap)
{
@@ -568,7 +944,7 @@ short bitmap_group_add_bitmap(
match_assert(
"c:\\halo\\SOURCE\\bitmaps\\bitmap_group.c",
0x35B,
space_between >= 0);
space_between>=0);
if (space_between != 0)
{
error(
@@ -585,7 +961,7 @@ short bitmap_group_add_bitmap(
{
struct bitmap_data *new_bitmap = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data,
&group->bitmaps,
previous_count,
struct bitmap_data);
@@ -605,7 +981,7 @@ short bitmap_group_add_bitmap(
error(
_error_silent,
"### ERROR failed to add bitmap to group (tag resize failed)");
tag_block_resize(&group->bitmap_data, previous_count);
tag_block_resize(&group->bitmaps, previous_count);
return NONE;
}
@@ -626,7 +1002,7 @@ void delete_bitmap(
return;
}
boolean postprocess_bitmap_group(
static boolean postprocess_bitmap_group(
long bitmap_group_index,
boolean editing)
{
@@ -636,11 +1012,11 @@ boolean postprocess_bitmap_group(
short sequence_index;
for (bitmap_index = 0;
bitmap_index < group->bitmap_data.count;
bitmap_index < group->bitmaps.count;
bitmap_index = (short)(bitmap_index + 1))
{
struct bitmap_data *bitmap = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data,
&group->bitmaps,
bitmap_index,
struct bitmap_data);
@@ -705,11 +1081,11 @@ boolean postprocess_bitmap_group(
if (find_all_fucked_up_shit)
{
for (bitmap_index = 0;
bitmap_index < group->bitmap_data.count;
bitmap_index < group->bitmaps.count;
bitmap_index = (short)(bitmap_index + 1))
{
struct bitmap_data *bitmap = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data,
&group->bitmaps,
bitmap_index,
struct bitmap_data);
@@ -733,14 +1109,14 @@ boolean postprocess_bitmap_group(
}
}
if (group->bitmap_data.count < 1)
if (group->bitmaps.count < 1)
{
error(
_error_silent,
"!!MUST BE FIXED: ",
"bitmap group '%s' has %d bitmaps",
tag_get_name(bitmap_group_index),
group->bitmap_data.count);
group->bitmaps.count);
}
if (group->sequences.count < 1)
{
@@ -788,9 +1164,9 @@ boolean postprocess_bitmap_group(
}
}
else if (sequence->first_bitmap_index < 0 ||
sequence->first_bitmap_index >= group->bitmap_data.count ||
sequence->first_bitmap_index >= group->bitmaps.count ||
sequence->bitmap_count < 1 ||
sequence->first_bitmap_index + sequence->bitmap_count > group->bitmap_data.count ||
sequence->first_bitmap_index + sequence->bitmap_count > group->bitmaps.count ||
(sequence_index == 0 && sequence->first_bitmap_index != 0) ||
(next_sequence && next_sequence->first_bitmap_index !=
sequence->first_bitmap_index + sequence->bitmap_count))
@@ -828,7 +1204,7 @@ boolean postprocess_bitmap_group(
struct bitmap_group_sprite)->bitmap_index;
if (sprite_bitmap_index < 0 ||
sprite_bitmap_index >= group->bitmap_data.count)
sprite_bitmap_index >= group->bitmaps.count)
{
error(
_error_silent,
+1 -1
View File
@@ -91,7 +91,7 @@ struct bitmap_group
short sprite_spacing;
unsigned short unused;
struct tag_block sequences;
struct tag_block bitmap_data;
struct tag_block bitmaps;
};
/* ---------- prototypes/BITMAP_GROUP.C */
+63 -62
View File
@@ -238,22 +238,49 @@ symbols in this file:
enum
{
_bitmap_type_2d = 0,
_bitmap_type_2d,
_bitmap_type_3d,
_bitmap_type_cube_map,
NUMBER_OF_BITMAP_TYPES,
};
enum
{
_bitmap_format_a8r8g8b8 = 11,
_bitmap_format_dxt1 = 14,
_bitmap_format_a8,
_bitmap_format_y8,
_bitmap_format_ay8,
_bitmap_format_a8y8,
_bitmap_format_unused1,
_bitmap_format_unused2,
_bitmap_format_r5g6b5,
_bitmap_format_unused3,
_bitmap_format_a1r5g5b5,
_bitmap_format_a4r4g4b4,
_bitmap_format_x8r8g8b8,
_bitmap_format_a8r8g8b8,
_bitmap_format_unused4,
_bitmap_format_unused5,
_bitmap_format_dxt1,
_bitmap_format_dxt3,
_bitmap_format_dxt5,
_bitmap_format_p8_bump,
NUMBER_OF_BITMAP_FORMATS,
FIRST_COMPRESSED_BITMAP_FORMAT = _bitmap_format_dxt1,
LAST_COMPRESSED_BITMAP_FORMAT = _bitmap_format_dxt5,
};
enum
{
_bitmap_compressed_bit = 1,
_bitmap_has_power_of_two_dimensions_bit,
_bitmap_compressed_bit,
_bitmap_palettized_bit,
_bitmap_swizzled_bit,
_bitmap_linear_bit,
_bitmap_v16u16_bit,
_bitmap_allocated_bit,
_bitmap_cached_bit,
NUMBER_OF_BITMAP_FLAGS,
};
enum
@@ -300,10 +327,6 @@ static struct bitmap_data *bitmap_cm_shrink(
short scale,
short alpha_bias,
boolean ignore_transparent_pixels);
static void bitmap_2d_smooth(
struct bitmap_data *bitmap,
short filter_size,
short const *filter_coefficients);
static void bitmap_3d_smooth(
struct bitmap_data *bitmap,
short filter_size,
@@ -383,9 +406,9 @@ static void bitmap_cm_vector_map(
/* ---------- globals */
real const oo_unsigned_short_max = 1.0f / UNSIGNED_SHORT_MAX;
short bitmap_sharpen_negative_table[256];
short bitmap_sharpen_positive_table[256];
short bitmap_smooth_filter_coefficients[MAXIMUM_FILTER_SIZE];
short bitmap_sharpen_negative_table[256]= {0};
short bitmap_sharpen_positive_table[256]= {0};
short bitmap_smooth_filter_coefficients[MAXIMUM_FILTER_SIZE]= {0};
/* ---------- public code */
@@ -791,6 +814,11 @@ void bitmap_fade(
return;
}
static void bitmap_2d_smooth(
struct bitmap_data *bitmap,
short filter_size,
short const *filter_coefficients);
void bitmap_smooth(
struct bitmap_data *bitmap,
real filter_size)
@@ -994,9 +1022,9 @@ static void bitmap_3d_smooth(
if (bitmap->width >= filter_size &&
bitmap->height >= filter_size &&
(short)bitmap->depth >= filter_size)
bitmap->depth >= filter_size)
{
short z;
short x, y, z;
pixel_data_size = bitmap_get_pixel_data_size(bitmap);
source_pixels = bitmap_mipmap_address(bitmap, 0);
@@ -1006,14 +1034,10 @@ static void bitmap_3d_smooth(
pixel_data_size);
if (temporary_pixels)
{
for (z = 0; z < (short)bitmap->depth; z++)
for (z = 0; z < bitmap->depth; z++)
{
short y;
for (y = 0; y < bitmap->height; y++)
{
short x;
for (x = 0; x < bitmap->width; x++)
{
long alpha = 0;
@@ -1028,9 +1052,9 @@ static void bitmap_3d_smooth(
{
short source_x =
(short)((bitmap->width + filter_index + x) % bitmap->width);
short coefficient = filter_coefficients[filter_index + filter_size];
pixel32 pixel = source_pixels[
(bitmap->height * z + y) * bitmap->width + source_x];
short coefficient = filter_coefficients[filter_index + filter_size];
alpha += (pixel >> 24) * coefficient;
red += ((pixel >> 16) & 0xFF) * coefficient;
@@ -1038,28 +1062,19 @@ static void bitmap_3d_smooth(
blue += (pixel & 0xFF) * coefficient;
}
{
long rounding = 1 << (2 * filter_size - 1);
short shift = 2 * filter_size;
temporary_pixels[(bitmap->height * z + y) * bitmap->width + x] =
((((rounding + alpha) >> shift) << 24) |
(((rounding + red) >> shift) << 16) |
(((rounding + green) >> shift) << 8) |
((rounding + blue) >> shift));
}
temporary_pixels[(bitmap->height * z + y) * bitmap->width + x] =
((((alpha + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 24) |
(((red + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 16) |
(((green + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 8) |
((blue + (1 << (2 * filter_size - 1))) >> (2 * filter_size)));
}
}
}
for (z = 0; z < (short)bitmap->depth; z++)
for (z = 0; z < bitmap->depth; z++)
{
short y;
for (y = 0; y < bitmap->height; y++)
{
short x;
for (x = 0; x < bitmap->width; x++)
{
long alpha = 0;
@@ -1074,9 +1089,9 @@ static void bitmap_3d_smooth(
{
short source_y =
(short)((bitmap->height + filter_index + y) % bitmap->height);
short coefficient = filter_coefficients[filter_index + filter_size];
pixel32 pixel = temporary_pixels[
(bitmap->height * z + source_y) * bitmap->width + x];
short coefficient = filter_coefficients[filter_index + filter_size];
alpha += (pixel >> 24) * coefficient;
red += ((pixel >> 16) & 0xFF) * coefficient;
@@ -1084,28 +1099,19 @@ static void bitmap_3d_smooth(
blue += (pixel & 0xFF) * coefficient;
}
{
long rounding = 1 << (2 * filter_size - 1);
short shift = 2 * filter_size;
source_pixels[(bitmap->height * z + y) * bitmap->width + x] =
((((rounding + alpha) >> shift) << 24) |
(((rounding + red) >> shift) << 16) |
(((rounding + green) >> shift) << 8) |
((rounding + blue) >> shift));
}
source_pixels[(bitmap->height * z + y) * bitmap->width + x] =
((((alpha + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 24) |
(((red + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 16) |
(((green + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 8) |
((blue + (1 << (2 * filter_size - 1))) >> (2 * filter_size)));
}
}
}
for (z = 0; z < (short)bitmap->depth; z++)
for (z = 0; z < bitmap->depth; z++)
{
short y;
for (y = 0; y < bitmap->height; y++)
{
short x;
for (x = 0; x < bitmap->width; x++)
{
long alpha = 0;
@@ -1119,10 +1125,10 @@ static void bitmap_3d_smooth(
filter_index++)
{
short source_z =
(short)(((short)bitmap->depth + filter_index + z) % (short)bitmap->depth);
short coefficient = filter_coefficients[filter_index + filter_size];
(short)((bitmap->depth + filter_index + z) % bitmap->depth);
pixel32 pixel = source_pixels[
(bitmap->height * source_z + y) * bitmap->width + x];
short coefficient = filter_coefficients[filter_index + filter_size];
alpha += (pixel >> 24) * coefficient;
red += ((pixel >> 16) & 0xFF) * coefficient;
@@ -1130,16 +1136,11 @@ static void bitmap_3d_smooth(
blue += (pixel & 0xFF) * coefficient;
}
{
long rounding = 1 << (2 * filter_size - 1);
short shift = 2 * filter_size;
temporary_pixels[(bitmap->height * z + y) * bitmap->width + x] =
((((rounding + alpha) >> shift) << 24) |
(((rounding + red) >> shift) << 16) |
(((rounding + green) >> shift) << 8) |
((rounding + blue) >> shift));
}
temporary_pixels[(bitmap->height * z + y) * bitmap->width + x] =
((((alpha + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 24) |
(((red + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 16) |
(((green + (1 << (2 * filter_size - 1))) >> (2 * filter_size)) << 8) |
((blue + (1 << (2 * filter_size - 1))) >> (2 * filter_size)));
}
}
}
+124 -118
View File
@@ -1079,11 +1079,11 @@ pixel32 bitmap_2d_get_pixel(
short mipmap_index;
short width;
short height;
long unwrapped_x;
long unwrapped_y;
short x;
short y;
void *mipmap_address;
long offset;
pixel32 pixel;
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x261, bitmap);
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x262, bitmap->type==_bitmap_type_2d);
@@ -1091,128 +1091,134 @@ pixel32 bitmap_2d_get_pixel(
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x264, point);
match_vassert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x265, lod>=0.0f && lod<=1.0f, "lod>=0.0f && lod<=1.0f");
if (!bitmap->base_address)
if (bitmap->base_address)
{
return (pixel32)NONE;
}
if (lod < 1.0f && (short)bitmap->mipmap_count > 0)
{
mipmap_index = (short)fast_ftol((1.0f - lod) * (short)bitmap->mipmap_count);
match_vassert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x26F, mipmap_index>=0 && mipmap_index<=(short)bitmap->mipmap_count, "mipmap_index>=0 && mipmap_index<=bitmap->mipmap_count");
}
else
{
mipmap_index = 0;
}
width = bitmap_mipmap_get_width(bitmap, mipmap_index);
height = bitmap_mipmap_get_height(bitmap, mipmap_index);
unwrapped_x = fast_ftol((real)width * point->x - 0.5f);
if ((width & (width - 1)) == 0)
{
x = (short)(unwrapped_x & (width - 1));
}
else
{
x = (short)(((unwrapped_x % width) + width) % width);
}
unwrapped_y = fast_ftol((real)height * point->y - 0.5f);
if ((height & (height - 1)) == 0)
{
y = (short)(unwrapped_y & (height - 1));
}
else
{
y = (short)(((unwrapped_y % height) + height) % height);
}
mipmap_address = bitmap_mipmap_address(bitmap, mipmap_index);
if (TEST_FLAG(bitmap->flags, _bitmap_compressed_bit))
{
short bytes_per_block = (short)(S3TC_BLOCK_PIXELS * bitmap_format_get_bits_per_pixel(bitmap->format) / CHAR_BITS);
byte *block_address = (byte *)mipmap_address + (y / 4 * width / 4 + x / 4) * bytes_per_block;
pixel32 pixel;
match_vassert(
"c:\\halo\\SOURCE\\bitmaps\\bitmaps.c",
0x2A0,
block_address >= (byte *)bitmap->base_address,
csprintf(
temporary,
"bitmap_2d_get_pixel tried to access compressed block @ -%d bytes from address start (w=%d, h=%d, m=%d, x=%d, y=%d, lod=%f)",
(byte *)bitmap->base_address - block_address,
bitmap->width,
bitmap->height,
(short)bitmap->mipmap_count,
unwrapped_x % width,
unwrapped_y % height,
mipmap_index));
match_vassert(
"c:\\halo\\SOURCE\\bitmaps\\bitmaps.c",
0x2A9,
block_address < (byte *)bitmap->base_address + bitmap->pixel_data_size,
csprintf(
temporary,
"bitmap_2d_get_pixel tried to access compressed block @ -%d bytes from address end (w=%d, h=%d, m=%d, x=%d, y=%d, lod=%f)",
block_address - ((byte *)bitmap->base_address + bitmap->pixel_data_size),
bitmap->width,
bitmap->height,
(short)bitmap->mipmap_count,
unwrapped_x % width,
unwrapped_y % height,
mipmap_index));
switch (bitmap->format)
if (lod < 1.0f && (short)bitmap->mipmap_count > 0)
{
case _bitmap_format_dxt1:
DecodeBlockRGB__single_pixel(
(struct s3tc_block_rgb const *)block_address,
(struct s3tc_color *)&pixel,
x & 3,
y & 3);
break;
case _bitmap_format_dxt3:
DecodeBlockAlpha4__single_pixel(
(struct s3tc_block_alpha4 const *)block_address,
(struct s3tc_color *)&pixel,
x & 3,
y & 3);
break;
case _bitmap_format_dxt5:
DecodeBlockAlpha3__single_pixel(
(struct s3tc_block_alpha3 const *)block_address,
(struct s3tc_color *)&pixel,
x & 3,
y & 3);
break;
default:
match_vassert(
"c:\\halo\\SOURCE\\bitmaps\\bitmaps.c",
0x2B7,
FALSE,
"### ERROR unsupported bitmap format");
break;
mipmap_index = (short)fast_ftol((1.0f - lod) * (short)bitmap->mipmap_count);
match_vassert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x26F, mipmap_index>=0 && mipmap_index<=(short)bitmap->mipmap_count, "mipmap_index>=0 && mipmap_index<=bitmap->mipmap_count");
}
else
{
mipmap_index = 0;
}
return pixel;
width = bitmap_mipmap_get_width(bitmap, mipmap_index);
height = bitmap_mipmap_get_height(bitmap, mipmap_index);
if ((width & (width - 1)) == 0)
{
x = (short)(fast_ftol((real)width * point->x - 0.5f) & (width - 1));
}
else
{
x = (short)(((fast_ftol((real)width * point->x - 0.5f) % width) + width) % width);
}
if ((height & (height - 1)) == 0)
{
y = (short)(fast_ftol((real)height * point->y - 0.5f) & (height - 1));
}
else
{
y = (short)(((fast_ftol((real)height * point->y - 0.5f) % height) + height) % height);
}
mipmap_address = bitmap_mipmap_address(bitmap, mipmap_index);
if (TEST_FLAG(bitmap->flags, _bitmap_compressed_bit))
{
short bytes_per_block = S3TC_BLOCK_PIXELS * bitmap_format_get_bits_per_pixel(bitmap->format) / CHAR_BITS;
short block_x = x / 4;
short block_y = y / 4;
byte *block_address = (byte *)mipmap_address + (block_y * width / 4 + block_x) * bytes_per_block;
x &= 3;
y &= 3;
match_vassert(
"c:\\halo\\SOURCE\\bitmaps\\bitmaps.c",
0x2A0,
block_address >= (byte *)bitmap->base_address,
csprintf(
temporary,
"bitmap_2d_get_pixel tried to access compressed block @ -%d bytes from address start (w=%d, h=%d, m=%d, x=%d, y=%d, lod=%f)",
(byte *)bitmap->base_address - block_address,
bitmap->width,
bitmap->height,
(short)bitmap->mipmap_count,
fast_ftol((real)width * point->x - 0.5f) % width,
fast_ftol((real)height * point->y - 0.5f) % height,
mipmap_index));
match_vassert(
"c:\\halo\\SOURCE\\bitmaps\\bitmaps.c",
0x2A9,
block_address < (byte *)bitmap->base_address + bitmap->pixel_data_size,
csprintf(
temporary,
"bitmap_2d_get_pixel tried to access compressed block @ -%d bytes from address end (w=%d, h=%d, m=%d, x=%d, y=%d, lod=%f)",
block_address - ((byte *)bitmap->base_address + bitmap->pixel_data_size),
bitmap->width,
bitmap->height,
(short)bitmap->mipmap_count,
fast_ftol((real)width * point->x - 0.5f) % width,
fast_ftol((real)height * point->y - 0.5f) % height,
mipmap_index));
switch (bitmap->format)
{
case _bitmap_format_dxt1:
DecodeBlockRGB__single_pixel(
(struct s3tc_block_rgb const *)block_address,
(struct s3tc_color *)&pixel,
x,
y);
break;
case _bitmap_format_dxt3:
DecodeBlockAlpha4__single_pixel(
(struct s3tc_block_alpha4 const *)block_address,
(struct s3tc_color *)&pixel,
x,
y);
break;
case _bitmap_format_dxt5:
DecodeBlockAlpha3__single_pixel(
(struct s3tc_block_alpha3 const *)block_address,
(struct s3tc_color *)&pixel,
x,
y);
break;
default:
match_vassert(
"c:\\halo\\SOURCE\\bitmaps\\bitmaps.c",
0x2B7,
FALSE,
"### ERROR unsupported bitmap format");
break;
}
return pixel;
}
if (TEST_FLAG(bitmap->flags, _bitmap_swizzled_bit))
{
long result[2];
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x2C1, x>=0 && x<4096);
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x2C2, y>=0 && y<4096);
bitmap_swizzle_vector2d(width, height, x, y, result);
offset = result[0] | result[1];
}
else
{
offset = y * width + x;
}
return bitmap_format_to_a8r8g8b8(bitmap->format, mipmap_address, offset);
}
if (TEST_FLAG(bitmap->flags, _bitmap_swizzled_bit))
{
long result[2];
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x2C1, x>=0 && x<4096);
match_assert("c:\\halo\\SOURCE\\bitmaps\\bitmaps.c", 0x2C2, y>=0 && y<4096);
bitmap_swizzle_vector2d(width, height, x, y, result);
return bitmap_format_to_a8r8g8b8(bitmap->format, mipmap_address, result[0] | result[1]);
}
return bitmap_format_to_a8r8g8b8(bitmap->format, mipmap_address, y * width + x);
return (pixel32)NONE;
}
boolean bitmap_verify(
+1 -1
View File
@@ -23,7 +23,7 @@
*/
#include "tiffcompat.h"
const char TIFFVersion[] = "\
char TIFFVersion[] = "\
LIBTIFF, Version 3.0 BETA\n\
Copyright (c) 1988, 1989, 1990, 1991, 1992 Sam Leffler\n\
Copyright (c) 1991, 1992 Silicon Graphics, Inc.\
+29 -19
View File
@@ -114,9 +114,14 @@ static void ColorToFcolor(
struct s3tc_color *pcolor,
struct s3tc_fcolor *pfcolor)
{
pfcolor->rgba[0] = pcolor->rgba[0] * wtPrimary[0] * (1.0f / 255.0f);
pfcolor->rgba[1] = pcolor->rgba[1] * wtPrimary[1] * (1.0f / 255.0f);
pfcolor->rgba[2] = pcolor->rgba[2] * wtPrimary[2] * (1.0f / 255.0f);
real value;
long channel;
for (channel = 0; channel < 3; ++channel)
{
value = pcolor->rgba[channel];
pfcolor->rgba[channel] = value * wtPrimary[channel] * (1.0f / 255.0f);
}
return;
}
@@ -151,20 +156,26 @@ static void RGBToColor(
struct s3tc_color *pcolor)
{
word rgb = *prgb;
byte c;
struct s3tc_color color = { 0 };
/* color.rgba[S3TC_ALPHA] is deliberately left unwritten, as January leaves
it: January stores only three bytes of this local and copies all four out.
Both callers, DecodeBlockRGB and DecodeBlockRGB__single_pixel, assign the
alpha of every colour on the line immediately after calling this, so the
indeterminate byte is never read. Initialising it - either with = { 0 } or
with an explicit store before or after the channels - returns both this
function and DecodeBlockRGB to residual. */
struct s3tc_color color;
c = (byte)(rgb << 3);
c |= c >> 5;
color.rgba[0] = c;
color.rgba[0] = (byte)rgb;
rgb >>= 5;
c = (byte)(rgb << 2);
c |= c >> 6;
color.rgba[1] = c;
color.rgba[1] = (byte)rgb;
rgb >>= 6;
c = (byte)(rgb << 3);
c |= c >> 5;
color.rgba[2] = c;
color.rgba[2] = (byte)rgb;
color.rgba[0] <<= 3;
color.rgba[1] <<= 2;
color.rgba[2] <<= 3;
color.rgba[0] |= color.rgba[0] >> 5;
color.rgba[1] |= color.rgba[1] >> 6;
color.rgba[2] |= color.rgba[2] >> 5;
*pcolor = color;
return;
@@ -799,7 +810,6 @@ void DecodeBlockAlpha3__single_pixel(
{
word alpha[8];
unsigned long bitmap;
long shift;
DecodeBlockRGB__single_pixel(&source->rgb, color, u, v);
@@ -832,7 +842,8 @@ void DecodeBlockAlpha3__single_pixel(
bitmap |= source->alpha_bitmap[1];
bitmap <<= 8;
bitmap |= source->alpha_bitmap[0];
shift = 3 * (4 * v + u);
bitmap >>= 3 * (4 * v + u);
color->rgba[S3TC_ALPHA] = (byte)alpha[bitmap & 7];
}
else
{
@@ -841,11 +852,10 @@ void DecodeBlockAlpha3__single_pixel(
bitmap |= source->alpha_bitmap[4];
bitmap <<= 8;
bitmap |= source->alpha_bitmap[3];
shift = 3 * (4 * (v - 2) + u);
bitmap >>= 3 * (4 * (v - 2) + u);
color->rgba[S3TC_ALPHA] = (byte)alpha[bitmap & 7];
}
color->rgba[S3TC_ALPHA] = (byte)alpha[(bitmap >> shift) & 7];
return;
}
+1 -1
View File
@@ -56,7 +56,7 @@ void predicted_resources_precache(
case _predicted_resource_bitmap:
_texture_cache_bitmap_get_hardware_format(
TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(predicted_resource->tag_index)->bitmap_data,
&bitmap_group_get(predicted_resource->tag_index)->bitmaps,
predicted_resource->resource_index,
struct bitmap_data),
FALSE,
+1 -1
View File
@@ -192,7 +192,7 @@ void sound_cache_delete_block_proc(
extern short assertion_count;
extern boolean debug_sound_cache;
extern boolean debug_sound_reference_counts;
extern struct xbox_sound_cache_globals xbox_sound_cache_globals;
struct xbox_sound_cache_globals xbox_sound_cache_globals = { 0 };
/* ---------- public code */
+3 -3
View File
@@ -384,9 +384,9 @@ static const long bitmap_d3d_format_tables
* listing's cached bitmaps */
static struct bitmap_data *texture_cache_debug_bitmaps[XBOX_TEXTURE_CACHE_PAGE_COUNT];
static struct xbox_texture_cache_globals xbox_texture_cache_globals;
struct texture_cache_debug_options texture_cache_debug_options;
boolean debug_texture_cache;
static unsigned long texture_cache_last_failure_time;
struct texture_cache_debug_options texture_cache_debug_options = {0};
boolean debug_texture_cache = FALSE;
static unsigned long texture_cache_last_failure_time = 0;
extern D3DDevice global_d3d_device;
/* ---------- public code */
+12 -11
View File
@@ -185,6 +185,15 @@ static boolean director_update_controls(
/* ---------- globals */
char const *director_camera_mode_names[NUMBER_OF_DIRECTOR_CAMERA_MODES] =
{
"following",
"orbiting",
"flying",
"editor",
"first person"
};
short const director_game_camera_modes[3] =
{
_camera_first_person,
@@ -205,15 +214,6 @@ real const friction = 5.f;
real const acceleration_scale = 25.f;
real const genius_boy = 1.3f;
char const *director_camera_mode_names[NUMBER_OF_DIRECTOR_CAMERA_MODES] =
{
"following",
"orbiting",
"flying",
"editor",
"first person"
};
struct director_variable_definition variables[NUMBER_OF_DIRECTOR_VARIABLES] =
{
{ 5, 4, NONE, { 0, 0 }, 0.15f, 0.f, -REAL_MAX, REAL_MAX, TRUE, { 0, 0, 0 } },
@@ -222,8 +222,9 @@ struct director_variable_definition variables[NUMBER_OF_DIRECTOR_VARIABLES] =
{ 3, 2, NONE, { 0, 0 }, 0.075f, 0.f, -REAL_MAX, REAL_MAX, TRUE, { 0, 0, 0 } }
};
struct director_globals director_globals;
boolean director_camera_switch_fast;
struct director_globals director_globals = {0};
boolean director_camera_switch_fast = FALSE;
static boolean hyper_key_down = FALSE;
/* ---------- public code */
+5 -4
View File
@@ -289,13 +289,14 @@ static void observer_pass_time(
/* ---------- globals */
static real const observer_maximum_accelerations[NUMBER_OF_OBSERVER_COMMAND_PARAMETERS] =
static real const observer_maximum_accelerations[] =
{
1500.f,
1500.f,
100000.f,
100000.f,
100000.f
100000.f,
1.f/30.f
};
static real const sine_region_angle = 0.174f;
@@ -876,12 +877,12 @@ static void observer_update_positions(
short value_index;
short parameter_index;
for (value_index = 0; value_index < NUMBER_OF_OBSERVER_VELOCITIES; value_index++)
for (parameter_index = 0; parameter_index < NUMBER_OF_OBSERVER_VELOCITIES; parameter_index++)
{
match_assert_valid_real(
"c:\\halo\\SOURCE\\camera\\observer.c",
0x2F4,
observer->velocities.n[value_index]);
observer->velocities.n[parameter_index]);
}
csmemset(displacement, 0, sizeof(displacement));
+2 -2
View File
@@ -98,8 +98,8 @@ symbols in this file:
struct system_memory_information
{
unsigned long available_physical_memory;
unsigned long total_physical_memory;
long available_physical_memory;
long total_physical_memory;
};
/* ---------- globals */
+6 -12
View File
@@ -373,17 +373,6 @@ struct profile_frame
byte __unknown1124[4];
};
struct profile_frame_iterator
{
short current_buffer_index;
short next_buffer_index;
};
struct profile_frame_info
{
__int64 vertical_blank_index;
};
struct profile_globals
{
__int64 timebase_frequency;
@@ -625,7 +614,12 @@ void profile_rasterizer_stalls(
}
void profile_frame_get_messages(
struct profile_frame_iterator *iterator)
struct profile_frame_iterator *iterator,
short *message_count,
short maximum_message_count,
char **messages,
union point2d *locations,
union real_argb_color const **colors)
{
match_assert("c:\\halo\\SOURCE\\cseries\\profile.c", 1463, iterator);
match_assert("c:\\halo\\SOURCE\\cseries\\profile.c", 1464, (iterator->current_buffer_index >= 0) && (iterator->current_buffer_index < profile_globals.current_frame_history_count));
+31 -1
View File
@@ -46,7 +46,19 @@ if (profile_global_enable && section.active) \
/* ---------- structures */
struct profile_frame_iterator;
union point2d;
union real_argb_color;
struct profile_frame_iterator
{
short current_buffer_index;
short next_buffer_index;
};
struct profile_frame_info
{
__int64 vertical_blank_index;
};
struct profile_section
{
@@ -138,6 +150,22 @@ void profile_lapsed_frames(
char const *reason);
void profile_lapsed_msec(
long msec);
void profile_frame_iterator_new(
struct profile_frame_iterator *iterator);
boolean profile_frame_iterator_next(
struct profile_frame_iterator *iterator,
struct profile_frame_info *info);
void profile_frame_get_messages(
struct profile_frame_iterator *iterator,
short *message_count,
short maximum_message_count,
char **messages,
union point2d *locations,
union real_argb_color const **colors);
long profile_frame_get_stalls(
struct profile_frame_iterator *iterator,
short *stall_index,
real *stall_msec);
short profile_find_frame_value(
const char *name,
short *section_index_reference);
@@ -166,6 +194,8 @@ extern boolean profile_timebase_ticks;
extern boolean profile_global_enable;
extern boolean profile_dump_frames;
extern boolean profile_dump_lost_frames;
extern boolean profile_display;
extern boolean profile_graph;
/* ---------- public code */
+2 -2
View File
@@ -133,7 +133,7 @@ void draw_quad(
/* ---------- globals */
extern struct hud_global_data *hud_globals;
struct cinematic_global_data *cinematic_globals;
struct cinematic_global_data *cinematic_globals = NULL;
/* ---------- public code */
@@ -532,7 +532,7 @@ void draw_quad(
struct game_globals_rasterizer_data)
: NULL;
map = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(rasterizer_data->default_textures[0].index)->bitmap_data,
&bitmap_group_get(rasterizer_data->default_textures[0].index)->bitmaps,
1,
struct bitmap_data);
+10 -10
View File
@@ -481,14 +481,14 @@ extern struct data_array *global_decal_data;
boolean decals_enabled= TRUE;
static real_point2d decal_points2d_temp[2][12];
static boolean decal_locked_count_reported;
static boolean decal_insert_locked_count_reported;
static struct decal_globals *decal_globals;
static struct decal_geometry decal_geometry;
static boolean decals_unlock_locked_count_reported;
static boolean decals_unlock_permanent_count_reported;
static boolean decal_delete_locked_reported;
static boolean decal_delete_permanent_reported;
static struct decal_geometry decal_geometry = {0};
static boolean decal_locked_count_reported = FALSE;
static boolean decal_insert_locked_count_reported = FALSE;
static boolean decals_unlock_locked_count_reported = FALSE;
static boolean decals_unlock_permanent_count_reported = FALSE;
static boolean decal_delete_locked_reported = FALSE;
static boolean decal_delete_permanent_reported = FALSE;
struct decal_wrap_parameters const decal_wrap_parameters[NUMBER_OF_DECAL_TYPES] =
{
@@ -796,7 +796,7 @@ static void decal_sprite_get_bounds(
sprite_index,
struct bitmap_group_sprite);
bitmap = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_definition->bitmap_data,
&bitmap_group_definition->bitmaps,
sprite->bitmap_index,
struct bitmap_data);
@@ -1900,7 +1900,7 @@ void decal_new_from_collision(
if (TEST_FLAG(definition->flags, _decal_definition_preserve_aspect_bit))
{
struct bitmap_data *bitmap = TAG_BLOCK_GET_ELEMENT(
&bitmap_group->bitmap_data,
&bitmap_group->bitmaps,
0,
struct bitmap_data);
@@ -1918,7 +1918,7 @@ void decal_new_from_collision(
if (!permanent)
{
if (!_texture_cache_bitmap_get_hardware_format(
TAG_BLOCK_GET_ELEMENT(&bitmap_group->bitmap_data, bitmap_index, struct bitmap_data),
TAG_BLOCK_GET_ELEMENT(&bitmap_group->bitmaps, bitmap_index, struct bitmap_data),
FALSE,
TRUE))
{
+1 -8
View File
@@ -321,13 +321,6 @@ struct effect_datum_header
word flags;
};
struct effects_information
{
short effect_count;
short location_count;
short active_effect_count;
};
struct effect_vector_field
{
void *user_data;
@@ -664,7 +657,7 @@ extern struct data_array *effect_location_data;
boolean effects_corpse_nonviolent = TRUE;
boolean debug_effects_nonviolent;
boolean debug_effects_nonviolent = FALSE;
/* the effect marker list the effect_new_*_from_markers entry points hand to
effect_marker_list_get_markers_by_name (January's own name for this static is unrecovered) */
+6 -1
View File
@@ -20,7 +20,12 @@ header included in hcex build.
/* ---------- structures */
struct effect_vector_field;
struct effects_information;
struct effects_information
{
short effect_count;
short location_count;
short active_effect_count;
};
/* ---------- prototypes/EFFECTS.C */
+3 -1
View File
@@ -306,9 +306,11 @@ static void weather_particle_system_render(
/* ---------- globals */
static real const one_over_char_max = 1.f/255.f;
boolean weather = TRUE;
struct weather_particle_system_globals weather_particle_system_globals;
struct weather_particle_system_globals weather_particle_system_globals = { 0 };
/* ---------- public code */
+90
View File
@@ -52,6 +52,7 @@ symbols in this file:
#include "game/game_globals.h"
#include "game/player_control.h"
#include "game/players.h"
#include "math/real_math_cones.h"
#include "items/weapon_definitions.h"
#include "items/weapons.h"
#include "objects/objects.h"
@@ -552,6 +553,95 @@ boolean aim_assist(
return FALSE;
}
long player_aim_projectile(
long player_index,
real_point3d const *position,
real_vector3d *direction)
{
long target_object_index= NONE;
struct player_datum *player= player_get(player_index);
long aiming_unit_index= unit_get_aiming_unit_index(player->unit_index);
struct aim_assist_parameters parameters;
match_assert_valid_real_normal3d(
"c:\\halo\\SOURCE\\game\\aim_assist.c",
77,
direction);
match_assert(
"c:\\halo\\SOURCE\\game\\aim_assist.c",
79,
global_current_collision_user_depth < MAXIMUM_COLLISION_USER_STACK_DEPTH);
global_current_collision_users[global_current_collision_user_depth++]= _collision_user_aim_assist;
if (unit_get_aim_assist_parameters(aiming_unit_index, unit_get_zoom_level(aiming_unit_index), &parameters))
{
real_point3d camera_position;
real_vector3d camera_forward;
real_vector3d autoaim_vector;
real autoaim_level;
real_vector3d aim_vector;
real_vector3d vector;
director_camera_deterministic(player->unit_index, &camera_position, &camera_forward);
autoaim_vector= *direction;
autoaim_level= 0.f;
{
struct aim_assist_target target;
if (aim_assist(&parameters, &camera_position, &camera_forward, player->unit_index,
player->team_index, &target))
{
vector_from_points3d(position, &target.position, &autoaim_vector);
if (normalize3d(&autoaim_vector)==0.f)
{
autoaim_vector= *direction;
}
autoaim_level= target.autoaim_level;
target_object_index= target.object_index;
}
}
{
real distance= distance3d(&unit_get(aiming_unit_index)->object.position, &camera_position);
real_vector3d camera_direction= camera_forward;
normalize3d(&camera_direction);
scale_vector3d(&camera_direction, distance, &camera_direction);
add_vectors3d(&camera_position, &camera_direction, &camera_position);
}
{
struct collision_result collision;
scale_vector3d(&camera_forward, 128.f, &vector);
collision_test_vector(_collision_test_for_projectiles_flags, &camera_position, &vector,
player->unit_index, &collision);
vector_from_points3d(position, &collision.point, &aim_vector);
if (normalize3d(&aim_vector)==0.f)
{
aim_vector= *direction;
}
}
fast_normals_interpolate(&aim_vector, &autoaim_vector, autoaim_level, &vector);
pin_normal_to_cone3d(&vector, direction, sine(parameters.deviation_angle),
cosine(parameters.deviation_angle), direction);
}
match_assert(
"c:\\halo\\SOURCE\\game\\aim_assist.c",
140,
global_current_collision_user_depth > 1);
--global_current_collision_user_depth;
player->aim_assist_unit_index= target_object_index;
player->aim_assist_timestamp= game_time_get();
return target_object_index;
}
long local_player_aim_assist(
short local_player_index,
real *autoaim_level,
+40 -39
View File
@@ -847,45 +847,6 @@ void king_engine_update(
return;
}
/* ---------- engine table */
struct game_engine king_engine =
{
"king",
game_engine_king,
king_engine_dispose,
king_engine_initialize_for_new_map,
king_engine_dispose_from_old_map,
king_engine_player_added,
king_engine_game_ending,
king_engine_game_starting,
king_engine_statistics_append,
king_engine_handle_client_message,
king_engine_handle_server_message,
king_engine_pregame_post_rasterize,
king_engine_post_rasterize,
king_engine_player_update,
NULL,
NULL,
NULL,
king_engine_update,
king_get_score,
king_get_score_string,
king_get_score_header_string,
king_get_team_score_string,
NULL,
king_engine_player_damaged_player,
king_engine_player_killed_player,
king_engine_display_score,
NULL,
king_engine_prespawn_player_update,
NULL,
NULL,
king_engine_goal_matches_player,
NULL,
NULL,
NULL,
};
/* ---------- private code */
@@ -1149,3 +1110,43 @@ static long find_next_hill(
* undefined. The caller expects maps to provide at least two hill ids. */
return next_hill_id;
}
/* ---------- engine table */
struct game_engine king_engine =
{
"king",
game_engine_king,
king_engine_dispose,
king_engine_initialize_for_new_map,
king_engine_dispose_from_old_map,
king_engine_player_added,
king_engine_game_ending,
king_engine_game_starting,
king_engine_statistics_append,
king_engine_handle_client_message,
king_engine_handle_server_message,
king_engine_pregame_post_rasterize,
king_engine_post_rasterize,
king_engine_player_update,
NULL,
NULL,
NULL,
king_engine_update,
king_get_score,
king_get_score_string,
king_get_score_header_string,
king_get_team_score_string,
NULL,
king_engine_player_damaged_player,
king_engine_player_killed_player,
king_engine_display_score,
NULL,
king_engine_prespawn_player_update,
NULL,
NULL,
king_engine_goal_matches_player,
NULL,
NULL,
NULL,
};
+8447 -2
View File
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -237,9 +237,9 @@ void hs_compile(
/* ---------- globals */
extern word hs_object_type_masks[NUMBER_OF_HS_OBJECT_TYPES];
extern tag hs_tag_reference_type_group_tags[];
extern struct hs_enum_definition hs_enum_table[NUMBER_OF_HS_TYPES];
extern word const hs_object_type_masks[NUMBER_OF_HS_OBJECT_TYPES];
extern tag const hs_tag_reference_type_group_tags[];
extern struct hs_enum_definition const hs_enum_table[];
extern char const *hs_type_names[NUMBER_OF_HS_TYPES];
extern char const *hs_script_type_names[];
extern boolean debug_trigger_volumes;
+6 -6
View File
@@ -672,18 +672,18 @@ static hs_primitive_parser const hs_type_primitive_parsers[NUMBER_OF_HS_TYPES] =
hs_parse_enum,
hs_parse_enum,
hs_parse_enum,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object,
hs_parse_object,
hs_parse_object,
hs_parse_object,
hs_parse_object,
hs_parse_object,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
hs_parse_object_name,
};
/* ---------- private code */
+88 -1
View File
@@ -263,6 +263,7 @@ symbols in this file:
#include "cseries/cseries.h"
#include "ai/ai_debug_scripting.h"
#include "ai/ai_script.h"
#include "hs/hs.h"
#include "hs/hs_library_internal_runtime.h"
#include "hs/object_lists.h"
@@ -543,7 +544,6 @@ static void hs_global_reconcile_write(
/* ---------- globals */
extern hs_typecasting_procedure typecasting_procedures[NUMBER_OF_HS_TYPES][NUMBER_OF_HS_TYPES];
extern struct data_array *hs_global_data;
extern struct data_array *hs_thread_data;
extern struct data_array *hs_syntax_data;
@@ -603,6 +603,93 @@ static hs_inspection_procedure hs_type_inspectors[NUMBER_OF_HS_TYPES] =
NULL,
NULL,
};
hs_typecasting_procedure typecasting_procedures[NUMBER_OF_HS_TYPES][NUMBER_OF_HS_TYPES] =
{
{ NULL }, /* unparsed */
{ NULL }, /* special_form */
{ NULL }, /* function_name */
{ NULL }, /* passthrough */
{ /* void */
NULL, NULL, NULL, NULL,
NULL,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
hs_data_to_void, hs_data_to_void, hs_data_to_void, hs_data_to_void,
},
{ /* boolean */
NULL, NULL, NULL, NULL,
NULL, NULL,
hs_long_to_boolean,
hs_short_to_boolean,
hs_long_to_boolean,
hs_string_to_boolean,
},
{ /* real */
NULL, NULL, NULL, NULL,
NULL, NULL, NULL,
hs_short_to_real,
hs_long_to_real,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL,
hs_enum_to_real, hs_enum_to_real, hs_enum_to_real, hs_enum_to_real,
},
{ /* short_integer */
NULL, NULL, NULL, NULL,
NULL, NULL,
hs_real_to_short,
NULL,
hs_long_to_short,
},
{ /* long_integer */
NULL, NULL, NULL, NULL,
NULL, NULL,
hs_real_to_long,
NULL,
hs_long_to_short,
},
{ NULL }, /* string */
{ NULL }, /* script */
{ NULL }, /* trigger_volume */
{ NULL }, /* cutscene_flag */
{ NULL }, /* cutscene_camera_point */
{ NULL }, /* cutscene_title */
{ NULL }, /* cutscene_recording */
{ NULL }, /* device_group */
{ NULL }, /* ai */
{ NULL }, /* ai_command_list */
{ NULL }, /* starting_profile */
{ NULL }, /* conversation */
{ NULL }, /* navpoint */
{ NULL }, /* hud_message */
{ /* object_list */
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
object_list_from_ai_reference,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL,
hs_object_to_object_list, hs_object_to_object_list, hs_object_to_object_list, hs_object_to_object_list,
hs_object_to_object_list,
hs_object_name_to_object_list, hs_object_name_to_object_list, hs_object_name_to_object_list, hs_object_name_to_object_list,
hs_object_name_to_object_list, hs_object_name_to_object_list,
},
};
static struct hs_runtime_globals hs_runtime_globals;
/* per-type fallbacks used when an external global has no backing address */
+11 -5
View File
@@ -499,8 +499,10 @@ static void hud_show_action_response(
if (weapon != NULL)
{
struct icon_hud_element_definition const *icon = NULL;
long hud_interface_index = weapon_definition_get(
weapon->definition_index)->weapon.interface_definition.hud_interface.index;
struct weapon_definition *weapon_definition = weapon_definition_get(
weapon->definition_index);
long hud_interface_index =
weapon_definition->weapon.interface_definition.hud_interface.index;
if (hud_interface_index != NONE)
{
@@ -540,8 +542,10 @@ static void hud_show_action_response(
if (weapon != NULL)
{
struct icon_hud_element_definition const *icon = NULL;
long hud_interface_index = weapon_definition_get(
weapon->definition_index)->weapon.interface_definition.hud_interface.index;
struct weapon_definition *weapon_definition = weapon_definition_get(
weapon->definition_index);
long hud_interface_index =
weapon_definition->weapon.interface_definition.hud_interface.index;
if (hud_interface_index != NONE)
{
@@ -638,9 +642,11 @@ static void hud_show_action_response(
if (unit->object.parent_object_index != NONE &&
unit->unit.parent_seat_index != NONE)
{
struct unit_datum *parent_unit = unit_get(
unit->object.parent_object_index);
struct unit_seat *seat = TAG_BLOCK_GET_ELEMENT(
&unit_definition_get(
unit_get(unit->object.parent_object_index)->definition_index)->unit.seats,
parent_unit->definition_index)->unit.seats,
unit->unit.parent_seat_index,
struct unit_seat);
+1 -1
View File
@@ -490,7 +490,7 @@ void hud_retrieve_bitmap_and_bounding_rect(
&sequence->sprites, frame_index%sprite_count, struct bitmap_group_sprite);
*bitmap = TAG_BLOCK_GET_ELEMENT(
&group->bitmap_data, sprite->bitmap_index, struct bitmap_data);
&group->bitmaps, sprite->bitmap_index, struct bitmap_data);
}
else
{
+292 -303
View File
@@ -723,14 +723,8 @@ static void hud_update_weapon_local_player(
long stack_buffer[HUD_WEAPON_STACK_BUFFER_LENGTH];
struct player_datum *player;
struct unit_datum *unit;
short player_local_index;
struct crosshair_hud_state *crosshair;
struct weapon_hud_interface_definition *definitions[MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH];
struct weapon_hud_interface_definition *root_definition;
unsigned long valid_crosshair_types;
short definition_count;
short crosshair_index;
unsigned long render_flags = 0;
csmemset(
stack_buffer,
@@ -741,8 +735,7 @@ static void hud_update_weapon_local_player(
if (!unit)
goto finished;
player_local_index = player->local_player_index;
crosshair = get_crosshair_state(player_local_index);
crosshair = get_crosshair_state(player->local_player_index);
root_definition = weapon_hud_interface_definition_get(hud_index);
if (weapon_index != NONE)
{
@@ -750,265 +743,268 @@ static void hud_update_weapon_local_player(
(void)weapon_definition_get(weapon->definition_index);
}
definitions[0] = root_definition;
csmemset(
&definitions[1],
0,
(MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH - 1) * sizeof(*definitions));
valid_crosshair_types = root_definition->valid_crosshair_types_flags;
if (weapon_index != get_hud_state(local_player_index)->last_weapon_index &&
weapon_index == NONE)
{
csmemset(crosshair, 0, sizeof(*crosshair));
}
struct weapon_hud_interface_definition *weapon_hud_hierarchy[MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH] =
{ root_definition };
long weapon_hud_indices[MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH] = { hud_index };
unsigned long valid_crosshair_types = weapon_hud_hierarchy[0]->valid_crosshair_types_flags;
unsigned long render_flags = 0;
short definition_count = 1;
short crosshair_index;
definition_count = 1;
do
{
long child_index = definitions[definition_count - 1]->parent_hud.index;
if (child_index == NONE)
break;
definitions[definition_count] = weapon_hud_interface_definition_get(child_index);
valid_crosshair_types |= definitions[definition_count]->valid_crosshair_types_flags;
definition_count++;
}
while (definition_count < MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH);
if (definition_count == MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH)
{
error(
_error_silent,
"too many levels in current weapon HUD hierarchy");
}
for (crosshair_index = 0;
crosshair_index < NUMBER_OF_CROSSHAIR_STATES;
crosshair_index++)
{
unsigned long crosshair_flag = FLAG(crosshair_index);
short result;
if (!TEST_FLAG(valid_crosshair_types, crosshair_index))
continue;
switch (crosshair_index)
if (weapon_index != get_hud_state(local_player_index)->last_weapon_index &&
weapon_index == NONE)
{
case _crosshair_state_aim:
result = weapon_index == NONE ?
FALSE :
player_control_get_autoaim_level(player_local_index) == 1.0f;
break;
csmemset(crosshair, 0, sizeof(*crosshair));
}
case _crosshair_state_zoom:
result = player_control_get_zoom_level(player_local_index) == NONE ?
1 :
player_control_get_zoom_level(player_local_index) + 2;
break;
do
{
if (weapon_hud_hierarchy[definition_count - 1]->parent_hud.index == NONE)
break;
weapon_hud_indices[definition_count] =
weapon_hud_hierarchy[definition_count - 1]->parent_hud.index;
weapon_hud_hierarchy[definition_count] = weapon_hud_interface_definition_get(
weapon_hud_indices[definition_count]);
valid_crosshair_types |= weapon_hud_hierarchy[definition_count]->valid_crosshair_types_flags;
definition_count++;
}
while (definition_count < MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH);
case _crosshair_state_charge:
result = FALSE;
break;
if (definition_count == MAXIMUM_WEAPON_HUD_DEFINITION_DEPTH)
{
error(
_error_silent,
"too many levels in current weapon hud hierarchy");
}
case _crosshair_state_flash_ammo:
if (weapon_state->magazines[0].rounds_remaining)
{
result = weapon_state->magazines[0].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
}
else
for (crosshair_index = 0;
crosshair_index < NUMBER_OF_CROSSHAIR_STATES;
crosshair_index++)
{
short result;
if (!TEST_FLAG(valid_crosshair_types, crosshair_index))
continue;
switch (crosshair_index)
{
case _crosshair_state_aim:
result = weapon_index == NONE ?
FALSE :
player_control_get_autoaim_level(player->local_player_index) == 1.0f;
break;
case _crosshair_state_zoom:
result = player_control_get_zoom_level(player->local_player_index) == NONE ?
1 :
player_control_get_zoom_level(player->local_player_index) + 2;
break;
case _crosshair_state_charge:
result = FALSE;
}
break;
break;
case _crosshair_state_flash_heat:
result = weapon_state->heat * 100.0f >=
(real)root_definition->flash_cutoffs.heat;
break;
case _crosshair_state_flash_ammo:
if (weapon_state->magazines[0].rounds_remaining)
{
result = weapon_state->magazines[0].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
}
else
{
result = FALSE;
}
break;
case _crosshair_state_flash_total_ammo:
result = weapon_state->magazines[0].rounds_remaining <=
root_definition->flash_cutoffs.total_ammo &&
!weapon_state->magazines[0].reloading;
break;
case _crosshair_state_flash_heat:
result = weapon_state->heat * 100.0f >=
(real)root_definition->flash_cutoffs.heat;
break;
case _crosshair_state_flash_total_battery:
result = weapon_state->age < 1.0f &&
(1.0f - weapon_state->age) * 100.0f <=
(real)root_definition->flash_cutoffs.age;
break;
case _crosshair_state_flash_total_ammo:
result = weapon_state->magazines[0].rounds_remaining <=
root_definition->flash_cutoffs.total_ammo &&
!weapon_state->magazines[0].reloading;
break;
case _crosshair_state_reload:
result = weapon_state->magazines[0].reloading;
break;
case _crosshair_state_flash_total_battery:
result = weapon_state->age < 1.0f &&
(1.0f - weapon_state->age) * 100.0f <=
(real)root_definition->flash_cutoffs.age;
break;
case _crosshair_state_fired_with_no_ammo:
if (!weapon_state->magazines[0].rounds_loaded &&
!weapon_state->magazines[0].rounds_remaining &&
TEST_FLAG(unit->unit.control_flags, _unit_control_weapon_primary_trigger_bit))
case _crosshair_state_reload:
result = weapon_state->magazines[0].reloading;
break;
case _crosshair_state_fired_with_no_ammo:
if (!weapon_state->magazines[0].rounds_loaded &&
!weapon_state->magazines[0].rounds_remaining &&
TEST_FLAG(unit->unit.control_flags, _unit_control_weapon_primary_trigger_bit))
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
case _crosshair_state_threw_with_no_grenade:
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
boolean no_grenades = TRUE;
short grenade_type;
case _crosshair_state_threw_with_no_grenade:
{
boolean no_grenades = TRUE;
short grenade_type;
for (grenade_type = 0; grenade_type < NUMBER_OF_UNIT_GRENADE_TYPES; grenade_type++)
{
if (unit->unit.grenade_counts[grenade_type])
no_grenades = FALSE;
}
if (no_grenades &&
!unit->unit.grenade_throw_state &&
TEST_FLAG(unit->unit.control_flags, _unit_control_throw_grenade_bit))
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
}
for (grenade_type = 0; grenade_type < NUMBER_OF_UNIT_GRENADE_TYPES; grenade_type++)
{
if (unit->unit.grenade_counts[grenade_type])
no_grenades = FALSE;
}
if (no_grenades &&
!unit->unit.grenade_throw_state &&
TEST_FLAG(unit->unit.control_flags, _unit_control_throw_grenade_bit))
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
}
case _crosshair_state_flash_ammo_none_for_reload:
result = !weapon_state->magazines[0].rounds_remaining &&
weapon_state->magazines[0].rounds_loaded &&
weapon_state->magazines[0].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
break;
case _crosshair_state_flash_ammo_none_for_reload:
result = !weapon_state->magazines[0].rounds_remaining &&
weapon_state->magazines[0].rounds_loaded &&
weapon_state->magazines[0].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
break;
case _crosshair_state_flash_secondary_ammo:
if (weapon_state->magazines[1].rounds_remaining)
{
result = weapon_state->magazines[1].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
}
else
{
result = FALSE;
}
break;
case _crosshair_state_flash_secondary_ammo:
if (weapon_state->magazines[1].rounds_remaining)
{
result = weapon_state->magazines[1].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
}
else
{
case _crosshair_state_flash_secondary_total_ammo:
result = weapon_state->magazines[1].rounds_remaining <=
root_definition->flash_cutoffs.total_ammo &&
!weapon_state->magazines[1].reloading;
break;
case _crosshair_state_secondary_reload:
result = weapon_state->magazines[1].reloading;
break;
case _crosshair_state_fired_secondary_with_no_ammo:
if (!weapon_state->magazines[1].rounds_loaded &&
!weapon_state->magazines[1].rounds_remaining &&
TEST_FLAG(unit->unit.control_flags, _unit_control_weapon_secondary_trigger_bit))
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
case _crosshair_state_flash_secondary_ammo_none_for_reload:
result = !weapon_state->magazines[1].rounds_remaining &&
weapon_state->magazines[1].rounds_loaded &&
weapon_state->magazines[1].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
break;
case _crosshair_state_primary_trigger_ready:
result = weapon_state->magazines[0].can_fire;
break;
case _crosshair_state_secondary_trigger_ready:
result = weapon_state->magazines[1].can_fire;
break;
case _crosshair_state_flash_fired_battery_depleted:
if (weapon_state->age == 1.0f &&
TEST_FLAG(unit->unit.control_flags, _unit_control_weapon_primary_trigger_bit))
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
default:
match_assert(
"c:\\halo\\SOURCE\\interface\\hud_weapon.c",
0x16E,
!"unreachable");
result = FALSE;
break;
}
break;
case _crosshair_state_flash_secondary_total_ammo:
result = weapon_state->magazines[1].rounds_remaining <=
root_definition->flash_cutoffs.total_ammo &&
!weapon_state->magazines[1].reloading;
break;
case _crosshair_state_secondary_reload:
result = weapon_state->magazines[1].reloading;
break;
case _crosshair_state_fired_secondary_with_no_ammo:
if (!weapon_state->magazines[1].rounds_loaded &&
!weapon_state->magazines[1].rounds_remaining &&
TEST_FLAG(unit->unit.control_flags, _unit_control_weapon_secondary_trigger_bit))
SET_FLAG(
render_flags,
crosshair_index,
result > 0 || crosshair_index == _crosshair_state_aim);
switch (crosshair_index)
{
result = TRUE;
case _crosshair_state_aim:
crosshair->states[crosshair_index].value.reference_data = result;
break;
case _crosshair_state_zoom:
crosshair->states[crosshair_index].value.reference_data = result - 1;
break;
case _crosshair_state_charge:
case _crosshair_state_flash_ammo:
case _crosshair_state_flash_heat:
case _crosshair_state_flash_total_ammo:
case _crosshair_state_flash_total_battery:
case _crosshair_state_reload:
case _crosshair_state_fired_with_no_ammo:
case _crosshair_state_threw_with_no_grenade:
case _crosshair_state_flash_ammo_none_for_reload:
case _crosshair_state_flash_secondary_ammo:
case _crosshair_state_flash_secondary_total_ammo:
case _crosshair_state_secondary_reload:
case _crosshair_state_fired_secondary_with_no_ammo:
case _crosshair_state_flash_secondary_ammo_none_for_reload:
case _crosshair_state_primary_trigger_ready:
case _crosshair_state_secondary_trigger_ready:
case _crosshair_state_flash_fired_battery_depleted:
if (!result)
{
crosshair->states[crosshair_index].value.reference_data = NONE;
}
else if (crosshair->states[crosshair_index].value.reference_data == NONE)
{
crosshair->states[crosshair_index].value.reference_data = game_time_get();
}
break;
default:
match_assert(
"c:\\halo\\SOURCE\\interface\\hud_weapon.c",
0x197,
!"unreachable");
break;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
case _crosshair_state_flash_secondary_ammo_none_for_reload:
result = !weapon_state->magazines[1].rounds_remaining &&
weapon_state->magazines[1].rounds_loaded &&
weapon_state->magazines[1].rounds_loaded <=
root_definition->flash_cutoffs.loaded_ammo;
break;
case _crosshair_state_primary_trigger_ready:
result = weapon_state->magazines[0].can_fire;
break;
case _crosshair_state_secondary_trigger_ready:
result = weapon_state->magazines[1].can_fire;
break;
case _crosshair_state_flash_fired_battery_depleted:
if (weapon_state->age == 1.0f &&
TEST_FLAG(unit->unit.control_flags, _unit_control_weapon_primary_trigger_bit))
{
result = TRUE;
}
else
{
result = crosshair->states[crosshair_index].value.reference_data != NONE;
}
break;
default:
match_assert(
"c:\\halo\\SOURCE\\interface\\hud_weapon.c",
0x16E,
!"unreachable");
result = FALSE;
break;
}
SET_FLAG(
render_flags,
crosshair_index,
result > 0 || crosshair_index == _crosshair_state_aim);
switch (crosshair_index)
{
case _crosshair_state_aim:
crosshair->states[crosshair_index].value.reference_data = result;
break;
case _crosshair_state_zoom:
crosshair->states[crosshair_index].value.reference_data = result - 1;
break;
case _crosshair_state_charge:
case _crosshair_state_flash_ammo:
case _crosshair_state_flash_heat:
case _crosshair_state_flash_total_ammo:
case _crosshair_state_flash_total_battery:
case _crosshair_state_reload:
case _crosshair_state_fired_with_no_ammo:
case _crosshair_state_threw_with_no_grenade:
case _crosshair_state_flash_ammo_none_for_reload:
case _crosshair_state_flash_secondary_ammo:
case _crosshair_state_flash_secondary_total_ammo:
case _crosshair_state_secondary_reload:
case _crosshair_state_fired_secondary_with_no_ammo:
case _crosshair_state_flash_secondary_ammo_none_for_reload:
case _crosshair_state_primary_trigger_ready:
case _crosshair_state_secondary_trigger_ready:
case _crosshair_state_flash_fired_battery_depleted:
if (!result)
{
crosshair->states[crosshair_index].value.reference_data = NONE;
}
else if (crosshair->states[crosshair_index].value.reference_data == NONE)
{
crosshair->states[crosshair_index].value.reference_data = game_time_get();
}
break;
default:
match_assert(
"c:\\halo\\SOURCE\\interface\\hud_weapon.c",
0x197,
!"unreachable");
break;
}
crosshair->render_flags = render_flags;
}
crosshair->render_flags = render_flags;
finished:
hud_weapon_stack_buffer_check(0x19E);
return;
@@ -1250,7 +1246,7 @@ static void crosshairs_draw(
{
struct bitmap_group *bitmap_group = bitmap_group_get(verify_tag_reference(&element->crosshairs.bitmap));
struct bitmap_data *bitmap = TAG_BLOCK_GET_ELEMENT(
&bitmap_group->bitmap_data,
&bitmap_group->bitmaps,
sequence ?
TAG_BLOCK_GET_ELEMENT(&sequence->sprites, frame_index, struct bitmap_group_sprite)->bitmap_index :
item->sequence_index,
@@ -1870,86 +1866,79 @@ void hud_update_weapon(
local_player_index != NONE;
local_player_index = local_player_get_next(local_player_index))
{
long player_index = local_player_get_player_index(local_player_index);
long unit_index = local_player_get_player_index(local_player_index) == NONE ?
NONE :
player_get(local_player_get_player_index(local_player_index))->unit_index;
if (player_index != NONE)
if (unit_index != NONE)
{
struct player_datum *player = player_get(
local_player_get_player_index(local_player_index));
long unit_index = player->unit_index;
long weapon_index = unit_inventory_get_weapon(
unit_index,
unit_get(unit_index)->unit.current_weapon_index);
boolean clear_to_default = FALSE;
if (unit_index != NONE)
if (weapon_index == NONE)
{
struct unit_datum *unit = unit_get(unit_index);
long weapon_index = unit_inventory_get_weapon(
unit_index,
unit->unit.current_weapon_index);
boolean clear_to_default = FALSE;
if (weapon_index == NONE)
if (unit->object.parent_object_index != NONE &&
unit->unit.parent_seat_index != NONE)
{
unit = unit_get(unit_index);
if (unit->object.parent_object_index != NONE &&
unit->unit.parent_seat_index != NONE)
{
struct unit_datum *parent = unit_get(
unit->object.parent_object_index);
struct unit_seat *seat = TAG_BLOCK_GET_ELEMENT(
&unit_definition_get(parent->definition_index)->unit.seats,
unit->unit.parent_seat_index,
struct unit_seat);
struct unit_datum *parent = unit_get(
unit->object.parent_object_index);
struct unit_seat *seat = TAG_BLOCK_GET_ELEMENT(
&unit_definition_get(parent->definition_index)->unit.seats,
unit->unit.parent_seat_index,
struct unit_seat);
if (TEST_FLAG(seat->flags, _unit_seat_gunner_bit))
{
weapon_index = unit_inventory_get_weapon(
unit->object.parent_object_index,
parent->unit.current_weapon_index);
}
else
{
clear_to_default = TRUE;
}
if (TEST_FLAG(seat->flags, _unit_seat_gunner_bit))
{
weapon_index = unit_inventory_get_weapon(
unit->object.parent_object_index,
unit_get(unit->object.parent_object_index)->unit.current_weapon_index);
}
else
{
clear_to_default = TRUE;
}
}
}
if (weapon_index != NONE)
if (weapon_index != NONE)
{
struct weapon_datum *weapon = weapon_get(weapon_index);
struct weapon_definition *definition = weapon_definition_get(
weapon->definition_index);
struct weapon_interface_state weapon_state;
weapon_build_weapon_interface_state(
weapon_index,
&weapon_state);
if (definition->weapon.interface_definition.hud_interface.index != NONE)
{
struct weapon_datum *weapon = weapon_get(weapon_index);
struct weapon_definition *definition = weapon_definition_get(
weapon->definition_index);
struct weapon_interface_state weapon_state;
long hud_index;
long hud_index =
definition->weapon.interface_definition.hud_interface.index;
weapon_build_weapon_interface_state(
weapon_index,
&weapon_state);
hud_index = definition->weapon.interface_definition.hud_interface.index;
if (hud_index != NONE)
{
hud_update_weapon_local_player(
local_player_index,
weapon_index,
hud_index,
&weapon_state);
}
}
else if (!clear_to_default && !unit_get_weapon_count(unit_index))
{
struct weapon_interface_state weapon_state;
csmemset(
&weapon_state,
0,
sizeof(weapon_state));
hud_update_weapon_local_player(
local_player_index,
NONE,
hud_globals->defaults.default_weapon_hud.index,
weapon_index,
hud_index,
&weapon_state);
}
get_hud_state(local_player_index)->last_weapon_index = weapon_index;
}
else if (!clear_to_default && !unit_get_weapon_count(unit_index))
{
struct weapon_interface_state weapon_state = { 0 };
long hud_index = hud_globals->defaults.default_weapon_hud.index;
hud_update_weapon_local_player(
local_player_index,
NONE,
hud_index,
&weapon_state);
}
get_hud_state(local_player_index)->last_weapon_index = weapon_index;
}
}
+443 -1
View File
@@ -70,10 +70,15 @@ symbols in this file:
/* ---------- headers */
#include "cseries/cseries.h"
#include "cseries/cseries_windows.h"
#include "ai/ai_profile.h"
#include "bitmaps/bitmap_group.h"
#include "bitmaps/color_table_group.h"
#include "camera/director.h"
#include "cseries/profile.h"
#include "cutscene/cinematics.h"
#include "effects/effects.h"
#include "effects/particles.h"
#include "game/game_globals.h"
#include "game/game_engine.h"
#include "game/player_control.h"
@@ -86,11 +91,14 @@ symbols in this file:
#include "main/main.h"
#include "main/main_runtime.h"
#include "math/real_math.h"
#include "objects/objects.h"
#include "physics/collision_usage.h"
#include "items/weapon_definitions.h"
#include "items/weapons.h"
#include "rasterizer/rasterizer.h"
#include "rasterizer/rasterizer_cinematics.h"
#include "render/render.h"
#include "render/render_cameras_internal.h"
#include "scenario/scenario.h"
#include "text/draw_string.h"
#include "units/unit_definitions.h"
@@ -262,6 +270,12 @@ typedef char hud_screen_effect_definition_desaturation_flags_offset_assert[
typedef char rasterizer_cinematic_screen_effect_parameters_tint_offset_assert[
offsetof(struct rasterizer_cinematic_screen_effect_parameters, filter_desaturation_tint) == 0x14 ? 1 : -1];
struct system_memory_information
{
long available_physical_memory;
long total_physical_memory;
};
struct profile_value
{
char name[256];
@@ -303,6 +317,12 @@ void interface_splitscreen_render(
void);
void render_debug_profile(
void);
static void render_debug_profile_stall_tick(
short stall_type,
real_rectangle2d const *bounds,
real *below_position,
real x,
real scale);
/* ---------- globals */
extern struct interface_hud_globals_definition *hud_globals;
@@ -690,7 +710,7 @@ void interface_draw_screen(
if (mask_tag_index != NONE)
{
parameters.convolution_mask = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(mask_tag_index)->bitmap_data,
&bitmap_group_get(mask_tag_index)->bitmaps,
0,
struct bitmap_data);
parameters.filter_light_enhancement_uses_convolution_mask =
@@ -882,6 +902,428 @@ void profile_graph_toggle(
/* ---------- private code */
static void render_debug_profile_stall_tick(
short stall_type,
real_rectangle2d const *bounds,
real *below_position,
real x,
real scale)
{
real_argb_color const *color;
real_point3d point0;
real_point3d point1;
/* January's stall labels are preserved numerically: the original enum names
* are not recoverable from the available profile producer or symbols. */
switch (stall_type)
{
case 1:
color = global_real_argb_blue;
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
color = global_real_argb_yellow;
break;
case 21:
color = global_real_argb_green;
break;
case 26:
color = global_real_argb_pink;
break;
default:
color = global_real_argb_white;
break;
}
point0.x = x*scale;
point0.y = (bounds->y0 - (bounds->y1 - bounds->y0)*(*below_position))*scale;
point0.z = -scale;
*below_position += 0.03f;
point1.x = x*scale;
point1.y = (bounds->y0 - (bounds->y1 - bounds->y0)*(*below_position))*scale;
point1.z = -scale;
*below_position += 0.01f;
matrix4x3_transform_point(&render.frustum.view_to_world, &point0, &point0);
matrix4x3_transform_point(&render.frustum.view_to_world, &point1, &point1);
rasterizer_debug_immediate_line(&point0, &point1, &color->rgb, NULL);
return;
}
void render_debug_profile(
void)
{
if (profile_display)
{
char buffer[8192];
interface_set_bitmap_text_draw_mode(
_interface_font_terminal,
NONE,
0,
0,
_interface_color_table_dialog,
0);
{
struct objects_information objects_information;
struct effects_information effects_information;
struct system_memory_information memory_information;
objects_information_get(&objects_information);
system_memory_information_get(&memory_information);
effects_information_get(&effects_information);
csstrcpy(buffer, "");
sprintf(buffer+csstrlen(buffer), "% 6.1fk free of % 6.1fk total|n",
memory_information.available_physical_memory/1024.0f,
memory_information.total_physical_memory/1024.0f);
sprintf(buffer+csstrlen(buffer), "% 5d active of % 5d objects (% 3.1f%% used)|n",
objects_information.active_object_count,
objects_information.object_count,
objects_information.used_memory*100.0f);
sprintf(buffer+csstrlen(buffer), "% 5d active of % 5d effects (%5d locations)|n",
effects_information.active_effect_count,
effects_information.effect_count,
effects_information.location_count);
sprintf(buffer+csstrlen(buffer), "% 5d particles|n",
particle_data->actual_count);
ai_profile_display(buffer);
collision_log_display(buffer);
rasterizer_draw_string(NULL, NULL, NULL, 0, buffer);
}
{
short tab_stops[4];
tab_stops[0] = 300;
tab_stops[1] = 380;
tab_stops[2] = 460;
tab_stops[3] = 540;
sprintf(buffer, "|n|n|n|n|n|n");
profile_dump(
NULL,
_profile_sort_mode_total_time,
_profile_dump_format_mode_screen,
10,
buffer+csstrlen(buffer));
draw_string_set_tab_stops(tab_stops, 4);
rasterizer_draw_string(NULL, NULL, NULL, 0, buffer);
draw_string_set_tab_stops(tab_stops, 0);
}
}
if (profile_graph)
{
real_rectangle2d screen_clip_bounds;
real_rectangle2d graph_bounds;
real_rectangle2d graph_screen_bounds;
render_frustum_get_projection_bounds(&render.frustum, &screen_clip_bounds);
graph_bounds.x0 = screen_clip_bounds.x0 - 0.1f;
graph_bounds.x1 = screen_clip_bounds.x1 + 0.1f;
graph_bounds.y0 = screen_clip_bounds.y1 + 0.1f;
graph_bounds.y1 = screen_clip_bounds.y0 - 0.1f;
graph_screen_bounds.x0 = rasterizer_globals.reserved04.screen_bounds.x1 -
(rasterizer_globals.reserved04.screen_bounds.x1 -
rasterizer_globals.reserved04.screen_bounds.x0)*0.1f;
graph_screen_bounds.x1 = rasterizer_globals.reserved04.screen_bounds.x0 +
(rasterizer_globals.reserved04.screen_bounds.x1 -
rasterizer_globals.reserved04.screen_bounds.x0)*0.1f;
graph_screen_bounds.y0 = rasterizer_globals.reserved04.screen_bounds.y1 -
(rasterizer_globals.reserved04.screen_bounds.y1 -
rasterizer_globals.reserved04.screen_bounds.y0)*0.1f;
graph_screen_bounds.y1 = rasterizer_globals.reserved04.screen_bounds.y0 +
(rasterizer_globals.reserved04.screen_bounds.y1 -
rasterizer_globals.reserved04.screen_bounds.y0)*0.1f;
if (profile_graph)
{
short graph_value_index;
for (graph_value_index = 0;
graph_value_index < profile_graph_value_count;
graph_value_index++)
{
struct profile_value *graph_value =
&profile_graph_values[graph_value_index];
graph_value->frame_value = profile_find_frame_value(
graph_value->name,
&graph_value->section_index);
}
}
if (profile_graph)
{
struct profile_frame_iterator iterator;
struct profile_frame_info frame_info;
__int64 base_vertical_blank_index =
rasterizer_globals.vertical_blank_index;
{
point2d drawingbuf[MAXIMUM_PROFILE_VALUES][512];
short drawingbuf_counts[MAXIMUM_PROFILE_VALUES];
real current_values[MAXIMUM_PROFILE_VALUES];
real last_values[MAXIMUM_PROFILE_VALUES];
point2d current_screen_points[MAXIMUM_PROFILE_VALUES];
point2d last_screen_points[MAXIMUM_PROFILE_VALUES];
/* The /Od RTC descriptors attest both January locals. Their values
* are retained and copied, although no later graph path reads them. */
real_point3d current_world_points[MAXIMUM_PROFILE_VALUES];
real_point3d last_world_points[MAXIMUM_PROFILE_VALUES];
boolean first_frame = TRUE;
{
real_point3d point0;
real_point3d point1;
point0.x = graph_bounds.x0*0.1f;
point0.y = graph_bounds.y0*0.1f;
point0.z = -0.1f;
point1.x = graph_bounds.x1*0.1f;
point1.y = graph_bounds.y0*0.1f;
point1.z = -0.1f;
rasterizer_debug_immediate_line(
&point0,
&point1,
&global_real_argb_white->rgb,
NULL);
}
csmemset(drawingbuf_counts, 0, sizeof(drawingbuf_counts));
rasterizer_debug_immediate_begin_screenspace();
profile_frame_iterator_new(&iterator);
while (profile_frame_iterator_next(&iterator, &frame_info))
{
real frame_seconds = (real)(base_vertical_blank_index -
frame_info.vertical_blank_index)*(1.0f/60.0f);
if (frame_seconds < 10.0f)
{
real graph_screen_x = graph_screen_bounds.x0 +
(graph_screen_bounds.x1 - graph_screen_bounds.x0)*
frame_seconds*0.1f;
real graph_x = graph_bounds.x0 +
(graph_bounds.x1 - graph_bounds.x0)*frame_seconds*0.1f;
short index;
for (index = 0; index < profile_graph_value_count; index++)
{
struct profile_value *graph_value =
&profile_graph_values[index];
boolean overlapping;
real value;
point2d screenspace_point;
real_point3d view_point;
real_point3d world_point;
if (graph_value->frame_value == NONE)
continue;
value = profile_frame_get_value(
&iterator,
graph_value->frame_value,
graph_value->section_index);
overlapping = FALSE;
if (value < 0.0f)
value = 0.0f;
else if (value > 100.0f)
value = 100.0f;
if (graph_value->subtract_previous &&
index > 0 &&
profile_graph_values[index-1].enabled &&
profile_graph_values[index-1].frame_value != NONE &&
!first_frame)
{
if (fabs(value - current_values[index-1]) < 0.1f &&
fabs(last_values[index] - last_values[index-1]) < 0.1f)
{
overlapping = TRUE;
}
}
screenspace_point.x = (short)graph_screen_x;
screenspace_point.y = (short)(graph_screen_bounds.y0 +
(graph_screen_bounds.y1 - graph_screen_bounds.y0)*
(value*0.01f));
view_point.x = graph_x*0.1f;
view_point.y = (graph_bounds.y0 +
(graph_bounds.y1 - graph_bounds.y0)*(value*0.01f))*0.1f;
view_point.z = -0.1f;
matrix4x3_transform_point(
&render.frustum.view_to_world,
&view_point,
&world_point);
if (graph_value->enabled && !first_frame && !overlapping)
{
if (!drawingbuf_counts[index])
{
drawingbuf[index][0] = last_screen_points[index];
drawingbuf_counts[index] = 1;
}
match_assert(
"c:\\halo\\SOURCE\\interface\\interface.c",
704,
drawingbuf_counts[index] < 512);
drawingbuf[index][drawingbuf_counts[index]++] =
screenspace_point;
}
else if (drawingbuf_counts[index] > 0)
{
rasterizer_debug_immediate_linestrip_screenspace(
drawingbuf[index],
drawingbuf_counts[index],
&(*graph_value->color)->rgb);
drawingbuf_counts[index] = 0;
}
current_values[index] = value;
current_screen_points[index] = screenspace_point;
current_world_points[index] = world_point;
}
}
csmemcpy(last_values, current_values, sizeof(last_values));
csmemcpy(last_screen_points, current_screen_points,
sizeof(last_screen_points));
csmemcpy(last_world_points, current_world_points,
sizeof(last_world_points));
first_frame = FALSE;
}
{
short index;
for (index = 0; index < profile_graph_value_count; index++)
{
if (drawingbuf_counts[index] > 0)
{
rasterizer_debug_immediate_linestrip_screenspace(
drawingbuf[index],
drawingbuf_counts[index],
&(*profile_graph_values[index].color)->rgb);
drawingbuf_counts[index] = 0;
}
}
}
rasterizer_debug_immediate_end_screenspace();
}
rasterizer_debug_immediate_begin();
profile_frame_iterator_new(&iterator);
while (profile_frame_iterator_next(&iterator, &frame_info))
{
real frame_seconds = (real)(base_vertical_blank_index -
frame_info.vertical_blank_index)*(1.0f/60.0f);
if (frame_seconds < 10.0f)
{
char message_strings[48][256];
char *message_stringptrs[48];
point2d message_locations[48];
real_argb_color const *message_colors[48];
short message_count;
short largest_stall_type;
real largest_stall_msec;
long stall_count;
short message_index;
real graph_x = graph_bounds.x0 +
(graph_bounds.x1 - graph_bounds.x0)*frame_seconds*0.1f;
for (message_index = 0; message_index < 48; message_index++)
{
message_stringptrs[message_index] =
message_strings[message_index];
}
message_count = 0;
profile_frame_get_messages(
&iterator,
&message_count,
48,
message_stringptrs,
message_locations,
message_colors);
largest_stall_type = 0;
largest_stall_msec = 0.0f;
stall_count = profile_frame_get_stalls(
&iterator,
&largest_stall_type,
&largest_stall_msec);
if (stall_count)
{
real below_position = 0.01f;
short stall_type;
if (TEST_FLAG(stall_count, largest_stall_type))
{
render_debug_profile_stall_tick(
largest_stall_type,
&graph_bounds,
&below_position,
graph_x,
0.1f);
stall_count &= ~FLAG(largest_stall_type);
}
for (stall_type = 0; stall_type < 27; stall_type++)
{
if (TEST_FLAG(stall_count, stall_type))
{
render_debug_profile_stall_tick(
stall_type,
&graph_bounds,
&below_position,
graph_x,
0.1f);
}
}
}
}
}
rasterizer_debug_immediate_end();
}
}
return;
}
void interface_splitscreen_render(
void)
{
+45 -42
View File
@@ -275,10 +275,10 @@ real scale[] =
1.1f
};
long next_vertex_index;
long next_vertex_index= {0};
static struct motion_sensor_globals_definition *motion_sensor_globals;
static real sweep_theta;
boolean debug_motion_sensor_draw_all_units;
boolean debug_motion_sensor_draw_all_units= {0};
extern struct motion_sensor_hud_globals *hud_globals;
extern short blip_player_index;
@@ -1063,12 +1063,12 @@ static void render_blip(
real radius)
{
real_point2d blip_position = *point;
real sine_yaw;
real cosine_yaw;
real_rgb_color const *blip_color;
real distance_squared;
real distance;
real mapped_distance;
real pulse_scale = 1.0f;
real distance_scale;
real pulse_scale;
real blip_draw_size;
match_assert(
@@ -1076,56 +1076,59 @@ static void render_blip(
410,
_blip_type_none != blip_type);
sine_yaw = sine(-sensor->yaw);
cosine_yaw = cosine(-sensor->yaw);
rotate_vector2d(
(real_vector2d const *)&blip_position,
sine_yaw,
cosine_yaw,
sine(-sensor->yaw),
cosine(-sensor->yaw),
(real_vector2d *)&blip_position);
distance_squared = magnitude_squared2d((real_vector2d const *)&blip_position);
if (distance_squared >=
if (distance_squared <
hud_globals->defaults.motion_sensor_range *
hud_globals->defaults.motion_sensor_range)
{
return;
}
distance = square_root(distance_squared);
if (distance < 0.015625f)
distance = 0.015625f;
distance = square_root(distance_squared);
if (distance < 0.015625f)
distance = 0.015625f;
scale_vector2d(
(real_vector2d const *)&blip_position,
1.0f / distance,
(real_vector2d *)&blip_position);
mapped_distance =
hud_globals->defaults.motion_sensor_range *
power(
scale_vector2d(
(real_vector2d const *)&blip_position,
1.0f / distance,
(real_vector2d *)&blip_position);
distance_scale = (real)pow(
distance / hud_globals->defaults.motion_sensor_range,
0.7f);
scale_vector2d(
(real_vector2d const *)&blip_position,
mapped_distance * relative_scale,
(real_vector2d *)&blip_position);
0.7);
mapped_distance =
hud_globals->defaults.motion_sensor_range * distance_scale;
scale_vector2d(
(real_vector2d const *)&blip_position,
mapped_distance,
(real_vector2d *)&blip_position);
scale_vector2d(
(real_vector2d const *)&blip_position,
relative_scale,
(real_vector2d *)&blip_position);
if (blip_type == _blip_type_custom)
{
pulse_scale = (real)(
(sin((real)game_time_get() * 0.10471976f) + 1.0) *
(1.0 / 3.0) +
1.0);
blip_color = &blip_colors[blip_type];
pulse_scale = 1.0f;
blip_draw_size = blip_size_get(blip_size_type);
if (blip_type == _blip_type_custom)
{
pulse_scale = (real)(
(sin((real)game_time_get() * 0.104719733f) + 1.0) *
(1.0 / 3.0) +
1.0);
}
blip_draw_size += pulse_scale * radius;
rasterizer_hud_motion_sensor_blip_draw(
&blip_position,
fade,
blip_draw_size,
blip_color,
(boolean)(blip_type == _blip_type_custom));
}
blip_draw_size = blip_size_get(blip_size_type) + pulse_scale * radius;
rasterizer_hud_motion_sensor_blip_draw(
&blip_position,
fade,
blip_draw_size,
&blip_colors[blip_type],
(boolean)(blip_type == _blip_type_custom));
return;
}
File diff suppressed because it is too large. Load diff
+6 -4
View File
@@ -1452,7 +1452,7 @@ static boolean ui_check_for_pause_game(
/* ---------- globals */
extern struct ui_widget_bss_prefix ui_widget_globals_storage;
static struct ui_widget_bss_prefix ui_widget_globals_storage;
#define string_data ui_widget_globals_storage.string_data
#define widget_globals ui_widget_globals_storage.widget_globals
@@ -1462,6 +1462,10 @@ extern real_argb_color ui_plasma_effect_color;
extern struct hud_globals_definition *hud_globals;
extern short local_player_index_for_draw_string_and_hack_in_icons;
/* January defines this and never references it, as we do not */
real const _one_over_255 = 1.0f / 255.0f;
real const SECONDS_PER_MILLISECOND = 0.001f;
static struct stack_memory_pool_medium __medium_widget_memory_pool =
{
{
@@ -1580,8 +1584,6 @@ static char button_mappings[_icon_custom_1 - _icon_action] =
_icon_right_stick /* look */
};
real const SECONDS_PER_MILLISECOND = 0.001f;
real global_ui_white_red = 0.8f;
real global_ui_white_green = 0.8f;
real global_ui_white_blue = 0.8f;
@@ -1753,7 +1755,7 @@ void draw_bitmap_in_rect(
{
struct bitmap_data *plasma_bitmap = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(
interface_get_tag_index(_interface_bitmap_iface_map3))->bitmap_data,
interface_get_tag_index(_interface_bitmap_iface_map3))->bitmaps,
0,
struct bitmap_data);
long time = system_milliseconds();
+2 -2
View File
@@ -342,7 +342,7 @@ static rectangle2d keyboard_rect[NUMBER_OF_VIRTUAL_KEYS] =
{ 286, 208, 318, 400 }, /* space */
};
struct virtual_keyboard_globals virtual_keyboard_globals;
struct virtual_keyboard_globals virtual_keyboard_globals= {0};
/* ---------- public code */
@@ -1143,7 +1143,7 @@ static boolean virtual_keyboard_select(
static void virtual_keyboard_process_internal(
void)
{
static unsigned long time_of_last_tab;
static unsigned long time_of_last_tab= {0};
unsigned long time = system_milliseconds();
struct event_record event;
long action = NONE;
+1 -1
View File
@@ -153,8 +153,8 @@ real_point3d *point_from_line3d(
/* ---------- globals */
real const item_maximum_impact_velocity = 0.1f;
struct profile_section item_update_section = { "item_update", NONE, TRUE };
real const item_maximum_impact_velocity = 0.1f;
/* ---------- public code */
+2
View File
@@ -278,6 +278,8 @@ boolean weapon_can_be_fired(long weapon_index);
short weapon_get_first_person_animation_time(long weapon_index, short mode, short animation_type, short shotgun_reload_type);
void weapon_stop_reload(
long weapon_index);
boolean weapon_prevents_grenade_throwing(
long weapon_index);
boolean weapon_prevents_melee_attack(
long weapon_index);
+2 -2
View File
@@ -2034,10 +2034,10 @@ static void main_frame_rate_debug(
SET_FLAG(
global_screenshot_count.framerate_flags,
sample_index,
main_globals.seconds_elapsed > 0.036);
main_globals.seconds_elapsed > 1.08/TICKS_PER_SECOND);
sample_index = (char)(
(sample_index + 1) % NUMBEROF(global_screenshot_count.framerate_samples));
(sample_index + 1) % (long)NUMBEROF(global_screenshot_count.framerate_samples));
global_screenshot_count.framerate_sample_index = sample_index;
global_screenshot_count.framerate_reset = TRUE;
+10 -6
View File
@@ -15,7 +15,7 @@ file has inline function assertions.
/* ---------- constants */
#define _real_epsilon 0.0001f
#define _pi ((real)M_PI)
#define _pi ((real)3.14159265358979323846f)
#define REAL_MIN -3.4028235e38f
#define REAL_MAX 3.4028235e38f
@@ -23,8 +23,8 @@ file has inline function assertions.
/* ---------- macros */
#define DEGREES_TO_RADIANS(angle) ((real)(((real)angle) * _pi / 180.f))
#define RADIANS_TO_DEGREES(angle) ((real)(((real)angle) * 180.f / _pi))
#define DEGREES_TO_RADIANS(angle) ((real)(((real)angle) * ((real)M_PI) / 180.f))
#define RADIANS_TO_DEGREES(angle) ((real)(((real)angle) * 180.f / ((real)M_PI)))
#define assert_valid_real(v) \
vassert( \
@@ -973,13 +973,17 @@ __inline short projection_from_vector3d(
real j = fabs(n->j);
real k = fabs(n->k);
if (k < j || k < i)
if (k >= j && k >= i)
{
return j < i;
return _z;
}
else if (j >= i)
{
return _y;
}
else
{
return _z;
return _x;
}
}
+14
View File
@@ -0,0 +1,14 @@
#ifndef __REAL_MATH_CONES_H
#define __REAL_MATH_CONES_H
#pragma once
#include "math/real_math.h"
boolean pin_normal_to_cone3d(
real_vector3d const *normal,
real_vector3d const *direction,
real sine,
real cosine,
real_vector3d *result);
#endif /* __REAL_MATH_CONES_H */
+1 -1
View File
@@ -77,7 +77,7 @@ void _byte_swap_data(
/* ---------- globals */
byte_swap_code byte_bs_codes[] = { _begin_bs_array, 1, 1, _end_bs_array };
static byte_swap_code byte_bs_codes[] = { _begin_bs_array, 1, 1, _end_bs_array };
struct byte_swap_definition byte_bs_definition =
{
"byte",
+6
View File
@@ -311,6 +311,12 @@ static void animation_get_keyframe_scale(
/* ---------- globals */
boolean hs_model_animation_compression_enabled = TRUE;
long hs_model_animation_data_compressed_size = 0;
long hs_model_animation_data_uncompressed_size = 0;
long hs_model_animation_data_compression_savings_in_bytes = 0;
long hs_model_animation_data_compression_savings_in_bytes_at_import = 0;
real hs_model_animation_data_compression_savings_in_percent = 0.f;
long hs_model_animation_bullshit[4] = { 0 };
/* ---------- public code */
+2 -2
View File
@@ -1337,7 +1337,7 @@ boolean network_server_close_client_connection(
match_assert(
"c:\\halo\\SOURCE\\networking\\network_connection.c",
0x1F9,
server_connection->flags&FLAG(_connection_create_server_bit));
server_connection->flags & FLAG(_connection_create_server_bit));
match_assert(
"c:\\halo\\SOURCE\\networking\\network_connection.c",
0x1FA,
@@ -1359,7 +1359,7 @@ boolean network_server_close_client_connection(
{
error(
_error_silent,
"failed to remove a client endpoint from the server's endpoint set");
"failed to remove a client endpoint from the server's endpoint set (maybe it was already removed)");
}
network_connection_delete(server->client_list[client_index]);
+1 -1
View File
@@ -365,7 +365,7 @@ static void object_destroy_region(
extern boolean debug_damage;
struct damage_globals damage_globals;
struct damage_globals damage_globals = { 0 };
/* ---------- public code */
+5 -5
View File
@@ -489,7 +489,7 @@ static real_vector3d const lightmap_sample_raycast_sideways[NUMBER_OF_LIGHTMAP_S
{ 0.0f, 10.0f, 0.0f },
};
static struct profile_section lights_section = { "lights", NONE, TRUE };
static struct profile_section lights_section = { "render_lights", NONE, TRUE };
real object_light_ambient_base = 0.03f;
real object_light_ambient_scale = 0.4f;
@@ -500,9 +500,9 @@ extern boolean debug_lights;
extern boolean debug_object_lights;
extern struct data_array *light_data;
extern struct cluster_partition light_cluster_partition;
extern struct lights_game_globals *lights_game_globals;
struct lights_game_globals *lights_game_globals = NULL;
extern short debug_rasterizer_light_count;
static struct lights_globals lights_globals;
struct lights_globals lights_globals;
/* ---------- public code */
@@ -1270,7 +1270,7 @@ void light_particle(
struct bitmap_data *diffuse_bitmap = bitmap_group_try_and_get_bitmap(
shader_environment->base_map.index,
(short)(material->permutation_index
% bitmap_group_get(shader_environment->base_map.index)->bitmap_data.count));
% bitmap_group_get(shader_environment->base_map.index)->bitmaps.count));
struct structure_surface const *surface = NULL;
if (lightmap_bitmap
@@ -2168,7 +2168,7 @@ boolean lights_distant_lighting_at_point(
struct bitmap_data *diffuse_bitmap = bitmap_group_try_and_get_bitmap(
shader_environment->base_map.index,
(short)(material->permutation_index
% bitmap_group_get(shader_environment->base_map.index)->bitmap_data.count));
% bitmap_group_get(shader_environment->base_map.index)->bitmaps.count));
if (lightmap_bitmap != NULL
&& diffuse_bitmap != NULL
+2 -2
View File
@@ -489,8 +489,8 @@ __inline void object_get_bounding_sphere(
{
struct object_datum *object = object_get(object_index);
match_assert("..\\objects\\objects.h", 535, center);
match_assert("..\\objects\\objects.h", 536, radius);
match_assert("c:\\halo\\source\\objects\\objects.h", 535, center);
match_assert("c:\\halo\\source\\objects\\objects.h", 536, radius);
*center = object->object.bounding_sphere_center;
*radius = object->object.bounding_sphere_radius;
+1 -1
View File
@@ -280,7 +280,7 @@ void lightning_submit(
1) > 0)
{
struct bitmap_data *bitmap = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(definition->map.index)->bitmap_data,
&bitmap_group_get(definition->map.index)->bitmaps,
0,
struct bitmap_data);
+10 -5
View File
@@ -136,11 +136,16 @@ typedef char collision_bsp_definition_data_size_assert[
/* ---------- globals */
/* NonMatching: the complete 0x384-byte data layout, normalized byte hash,
* relocation addresses/types, and external string relocations match. The
* split target encodes its 22 internal pointers relative to the unrelated
* breakable_surface_effect_enabled symbol at a uniform +6 displacement;
* correct source-level pointers relocate against data_0030c9c0 instead. */
/* This object's .data is byte-exact against January once csplit resolves the
* 22 internal pointers correctly. config/symbols.json lists
* _global_collision_bsp_definition_data (file_offset 3197376) ahead of
* _debug_objects_collision_models (3197369) and
* _breakable_surface_effect_enabled (3197370) -- the file's only descending
* step in 23,407 entries. csplit builds its address->symbol map from that
* order, so the whole blob falls inside breakable_surface_effect_enabled and
* every internal pointer is emitted as that symbol + 6 + offset. Restoring
* ascending order makes the regenerated split .data byte-identical to ours
* with all 68 relocations equal, and changes no other split object. */
struct collision_bsp_definition_data global_collision_bsp_definition_data =
{
{
+2 -2
View File
@@ -438,14 +438,14 @@ void rasterizer_screen_effect_set_video(
cinematic_screen_effect_globals->parameters.video_overbright_mode = video_overbright_mode;
cinematic_screen_effect_globals->parameters.video_scanline_map = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(
global_rasterizer_data->screen_effect_video_scanline_map.index)->bitmap_data,
global_rasterizer_data->screen_effect_video_scanline_map.index)->bitmaps,
0,
struct bitmap_data);
cinematic_screen_effect_globals->parameters.video_noise_intensity = video_noise_intensity;
cinematic_screen_effect_globals->parameters.video_noise_map_scale = 1.0f;
cinematic_screen_effect_globals->parameters.video_noise_map = TAG_BLOCK_GET_ELEMENT(
&bitmap_group_get(
global_rasterizer_data->screen_effect_video_noise_map.index)->bitmap_data,
global_rasterizer_data->screen_effect_video_noise_map.index)->bitmaps,
0,
struct bitmap_data);
}
+83 -51
View File
@@ -184,7 +184,6 @@ struct rasterizer_frame_statistics_private_globals_definition
{
real profile_times[NUMBER_OF_RASTERIZER_PROFILES][MAXIMUM_PROFILE_ACCUMULATION_COUNT];
word *temp_buffer;
byte reserved744[4];
unsigned __int64 fps_accumulation_time;
unsigned __int64 fps_accumulation_frame_index;
FILE *profile_log_file;
@@ -223,7 +222,7 @@ static boolean eat_my_shorts(
/* ---------- globals */
extern struct rasterizer_frame_statistics_private_globals_definition rasterizer_frame_statistics_private_globals;
struct rasterizer_frame_statistics_private_globals_definition rasterizer_frame_statistics_private_globals= {0};
/* the FPS sample count and the profile-log accumulators are separate file-scope statics, not
members of the private record: get_fps reloads fps_sample_count from memory after the
@@ -342,6 +341,10 @@ static boolean eat_my_shorts(
{
return TRUE;
}
else if (first < second)
{
return FALSE;
}
return FALSE;
}
@@ -360,7 +363,32 @@ long rasterizer_frame_statistics_count_static_vertices(
}
else if (triangle_buffer->type == _triangle_buffer_type_triangles)
{
vertex_count = vertex_buffer->count;
if (vertex_buffer)
{
vertex_count = vertex_buffer->count;
}
else
{
long index_count = triangle_buffer->count * NUMBER_OF_VERTICES_PER_TRIANGLE;
long index;
word last_vertex_index = (word)NONE;
memcpy(
rasterizer_frame_statistics_temp_buffer,
triangle_buffer->base_address,
sizeof(word) * triangle_buffer->count * NUMBER_OF_VERTICES_PER_TRIANGLE);
qsort_2byte(rasterizer_frame_statistics_temp_buffer, index_count, eat_my_shorts);
for (index = 0; index < index_count; index++)
{
word vertex_index = rasterizer_frame_statistics_temp_buffer[index];
if (last_vertex_index != vertex_index)
{
last_vertex_index = vertex_index;
vertex_count++;
}
}
}
}
}
@@ -399,9 +427,11 @@ long rasterizer_frame_statistics_count_dynamic_vertices(
qsort_2byte(rasterizer_frame_statistics_temp_buffer, index_count, eat_my_shorts);
for (index = 0; index < index_count; index++)
{
if (last_vertex_index != rasterizer_frame_statistics_temp_buffer[index])
word vertex_index = rasterizer_frame_statistics_temp_buffer[index];
if (last_vertex_index != vertex_index)
{
last_vertex_index = rasterizer_frame_statistics_temp_buffer[index];
last_vertex_index = vertex_index;
vertex_count++;
}
}
@@ -433,6 +463,8 @@ void rasterizer_frame_statistics_draw(
{
char string[STATISTICS_TEXT_BUFFER_SIZE];
point2d cursor = { 0, 0 };
short height_adjust = -4;
short line_advance = -1;
short left = rasterizer_globals.reserved04.frame_bounds.x0;
short tab_stops[NUMBER_OF_STATISTICS_TAB_STOPS] = { 100, 200, 300, 400, 500, 600 };
real_argb_color data_color = { 1.0f, 0.66f, 1.0f, 0.66f };
@@ -506,8 +538,8 @@ void rasterizer_frame_statistics_draw(
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
draw_string_set_color(&header_color);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
if (rasterizer_debug_options.fps_accumulation)
{
@@ -537,8 +569,8 @@ void rasterizer_frame_statistics_draw(
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
draw_string_set_color(&data_color);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
if (rasterizer_debug_options.stats == _rasterizer_statistics_mode_objects)
{
@@ -551,21 +583,21 @@ void rasterizer_frame_statistics_draw(
rasterizer_frame_statistics.normal_object_count,
rasterizer_frame_statistics.fast_object_count,
rasterizer_frame_statistics.scenery_object_count);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tskinning|t%d|n|tlighting|t%d|n|tvertex shaders|t%d|n",
rasterizer_frame_statistics.model_skinning_constant_bytes,
rasterizer_frame_statistics.model_lighting_constant_bytes,
rasterizer_frame_statistics.model_vertex_shader_work_accumulated);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tlocal_player_count|t%d|n|tmain_get_window_count|t%d|n",
local_player_count(),
main_get_window_count());
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
}
else if (rasterizer_debug_options.stats == _rasterizer_statistics_mode_geometry)
{
@@ -573,8 +605,8 @@ void rasterizer_frame_statistics_draw(
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
draw_string_set_color(&header_color);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|ttotal|t%d|t%d|t%d|n",
total_vertices,
@@ -583,8 +615,8 @@ void rasterizer_frame_statistics_draw(
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
draw_string_set_color(&data_color);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tenvironment|t%d|t%d|t%d",
environment_vertices,
@@ -592,8 +624,8 @@ void rasterizer_frame_statistics_draw(
environment_primitives);
tab_stops[0] = left + 25;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tlightmaps|t%d|t%d|t%d|n|tshadows (%d)|t%d|t%d|t%d|n|tlights|t%d|t%d|t%d|n|ttextures|t%d|t%d|t%d|n|tlights specular|t%d|t%d|t%d|n|tlightmaps specular|t%d|t%d|t%d|n|tlightmaps ref.mask|t%d|t%d|t%d|n|treflections|t%d|t%d|t%d|n|ttransparent|t%d|t%d/%d|t%d|n|tfog|t%d|t%d|t%d|n",
rasterizer_frame_statistics.lightmap_dynamic_vertex_count,
@@ -630,8 +662,8 @@ void rasterizer_frame_statistics_draw(
rasterizer_frame_statistics.environment_fog_dynamic_draw_count);
tab_stops[0] = left + 50;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tmodel shadows (%d)|t%d|t%d|t%d",
rasterizer_frame_statistics.model_shadow_count,
@@ -640,8 +672,8 @@ void rasterizer_frame_statistics_draw(
rasterizer_frame_statistics.model_shadow_draw_count);
tab_stops[0] = left + 25;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tmodels (%d)|t%d|t%d|t%d",
rasterizer_frame_statistics.model_count,
@@ -650,8 +682,8 @@ void rasterizer_frame_statistics_draw(
model_primitives);
tab_stops[0] = left + 25;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tsolid|t%d|t%d|t%d|n|ttransparent|t%d|t%d/%d|t%d|n",
rasterizer_frame_statistics.model_vertex_count,
@@ -663,8 +695,8 @@ void rasterizer_frame_statistics_draw(
rasterizer_frame_statistics.transparent_model_submit_count);
tab_stops[0] = left + 50;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tdecals|t%d|t%d|t%d|n",
rasterizer_frame_statistics.decal_vertex_count,
@@ -672,8 +704,8 @@ void rasterizer_frame_statistics_draw(
rasterizer_frame_statistics.decal_draw_count);
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tdynamic geometry|t%d/%d|t%d/%d|n",
rasterizer_frame_statistics.dynamic_vertex_count,
@@ -682,16 +714,16 @@ void rasterizer_frame_statistics_draw(
rasterizer_frame_statistics.dynamic_triangle_buffer_count);
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|t%d dynamic lights|n|t%d lens flares|n",
rasterizer_frame_statistics.dynamic_light_count,
rasterizer_frame_statistics.lens_flare_count);
tab_stops[0] = left;
draw_string_set_tab_stops(tab_stops, NUMBER_OF_STATISTICS_TAB_STOPS);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
}
else if (rasterizer_debug_options.stats == _rasterizer_statistics_mode_profile)
{
@@ -706,8 +738,8 @@ void rasterizer_frame_statistics_draw(
draw_string_set_tab_stops(tab_stops, 4);
draw_string_set_color(&header_color);
cursor.y -= 30;
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
draw_string_set_color(&data_color);
for (profile = 0; profile < NUMBER_OF_RASTERIZER_PROFILES; profile++)
@@ -727,8 +759,8 @@ void rasterizer_frame_statistics_draw(
rasterizer_profile_get_string(profile));
}
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
}
sprintf(string, "|ttotal|t%.2f|t%d|n",
@@ -736,8 +768,8 @@ void rasterizer_frame_statistics_draw(
rasterizer_profile_query_pushbuffer(NUMBER_OF_RASTERIZER_PROFILES));
draw_string_set_color(global_real_argb_yellow);
bounds.y0 += 4;
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
}
else if (rasterizer_debug_options.stats == _rasterizer_statistics_mode_memory)
{
@@ -773,8 +805,8 @@ void rasterizer_frame_statistics_draw(
sprintf(string, "|tallocation|tmemory usage (bytes)");
draw_string_set_tab_stops(tab_stops, 3);
draw_string_set_color(&header_color);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
draw_string_set_color(&data_color);
for (report_index = 0; report_index < NUMBER_OF_MEMORY_USAGE_REPORTS; report_index++)
@@ -782,27 +814,27 @@ void rasterizer_frame_statistics_draw(
sprintf(string, "|t%s|t%d",
memory_usage[report_index].name,
memory_usage[report_index].allocation);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
total_allocation += memory_usage[report_index].allocation;
total_unique_allocation +=
memory_usage[report_index].allocation - memory_usage[report_index].shared;
}
sprintf(string, "|n|ttotal|t%d (%d)", total_allocation, total_unique_allocation);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
GlobalMemoryStatus(&memory_status);
draw_string_set_color(&header_color);
sprintf(string, "|n|tsystem total|t%dKb", memory_status.dwTotalPhys >> 10);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
sprintf(string, "|tsystem available|t%dKb", memory_status.dwAvailPhys >> 10);
rasterizer_draw_string(&bounds, NULL, &cursor, -4, string);
bounds.y0 = cursor.y - 1;
rasterizer_draw_string(&bounds, NULL, &cursor, height_adjust, string);
bounds.y0 = cursor.y + line_advance;
draw_string_set_color(&data_color);
}
+2 -1
View File
@@ -161,7 +161,7 @@ struct model_vertex_compressed
/* ---------- globals */
static short const rasterizer_vertex_type_sizes[NUMBER_OF_RASTERIZER_VERTEX_TYPES]=
static short const rasterizer_vertex_type_sizes[]=
{
56,
32,
@@ -175,6 +175,7 @@ static short const rasterizer_vertex_type_sizes[NUMBER_OF_RASTERIZER_VERTEX_TYPE
16,
16,
8,
0,
};
/* ---------- public code */
+6 -8
View File
@@ -80,7 +80,6 @@ symbols in this file:
/* ---------- headers */
#define REAL_MATH_EXTERNAL_POINT_FROM_LINE3D
#include "rasterizer/rasterizer_frame_statistics.h"
#include "cseries.h"
#include "errors.h"
@@ -100,7 +99,6 @@ symbols in this file:
#include "objects/widgets/widget_types.h"
#include <xtl.h>
#include "rasterizer/xbox/rasterizer_xbox.h"
#undef REAL_MATH_EXTERNAL_POINT_FROM_LINE3D
/* ---------- constants */
@@ -956,7 +954,7 @@ void rasterizer_lens_flares_draw(
lens_flare_parameters)*definition->corona_rotation_function_scale;
screen_rotation = (real)atan2(
dot_product3d(&global_window_parameters.view_to_world.forward, &camera_offset),
dot_product3d(&global_window_parameters.view_to_world.left, &camera_offset))*(180.0f/_pi);
dot_product3d(&global_window_parameters.view_to_world.left, &camera_offset))*(180.0f/((real)M_PI));
cosine_scale = 1.0f/
(definition->runtime_cosine_falloff_angle-definition->runtime_cosine_cutoff_angle);
@@ -1031,7 +1029,7 @@ void rasterizer_lens_flares_draw(
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\rasterizer_lights.c",
651,
reflection->animation_period != 0.0f);
reflection->animation_period!=0.0f);
animation_time = periodic_function_evaluate(
reflection->animation_function,
@@ -1055,19 +1053,19 @@ void rasterizer_lens_flares_draw(
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\rasterizer_lights.c",
667,
animation_color.alpha >= 0.0f && animation_color.alpha <= 1.0f);
animation_color.alpha>=0.0f && animation_color.alpha<=1.0f);
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\rasterizer_lights.c",
668,
animation_color.red >= 0.0f && animation_color.red <= 1.0f);
animation_color.red >=0.0f && animation_color.red <=1.0f);
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\rasterizer_lights.c",
669,
animation_color.green >= 0.0f && animation_color.green <= 1.0f);
animation_color.green>=0.0f && animation_color.green<=1.0f);
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\rasterizer_lights.c",
670,
animation_color.blue >= 0.0f && animation_color.blue <= 1.0f);
animation_color.blue >=0.0f && animation_color.blue <=1.0f);
color.alpha *= animation_color.alpha;
color.red *= animation_color.red;
+2 -2
View File
@@ -202,8 +202,8 @@ extern byte rasterizer_debug_options[];
extern struct rasterizer_window_begin_parameters global_window_parameters;
static struct hardware_character_cache hardware_character_cache;
static pixel32 global_shadow_color;
static short rasterizer_text_unused;
static pixel32 global_shadow_color = 0;
static short rasterizer_text_unused = 0;
static short magic_number= 12;
/* ---------- public code */
@@ -180,15 +180,15 @@ void rasterizer_set_frustum_z(
/* ---------- globals */
static short transparent_geometry_group_index;
static short transparent_geometry_group_index = 0;
static unsigned long transparent_geometry_group_pending_flags[
BIT_VECTOR_SIZE_IN_LONGS(RASTERIZER_MAXIMUM_TRANSPARENT_GEOMETRY_GROUPS)];
static struct transparent_geometry_group *transparent_geometry_groups;
static struct transparent_geometry_group *transparent_geometry_groups2;
static long transparent_geometry_group_count;
static long transparent_geometry_group_count2;
static short *transparent_geometry_group_sorted_indices;
static short transparent_geometry_next_group_sorted_index;
BIT_VECTOR_SIZE_IN_LONGS(RASTERIZER_MAXIMUM_TRANSPARENT_GEOMETRY_GROUPS)] = { 0 };
static struct transparent_geometry_group *transparent_geometry_groups = NULL;
static struct transparent_geometry_group *transparent_geometry_groups2 = NULL;
static long transparent_geometry_group_count = 0;
static long transparent_geometry_group_count2 = 0;
static short *transparent_geometry_group_sorted_indices = NULL;
static short transparent_geometry_next_group_sorted_index = 0;
extern struct rasterizer_transparent_geometry_debug_options rasterizer_debug_options;
extern struct rasterizer_transparent_geometry_window_parameters global_window_parameters;
+9 -9
View File
@@ -827,7 +827,7 @@ struct rasterizer_xbox_d3d_globals
D3DSurface *global_d3d_surface_render_primary_copy; /* +2212 */
};
struct rasterizer_xbox_d3d_globals rasterizer_xbox_d3d_globals;
struct rasterizer_xbox_d3d_globals rasterizer_xbox_d3d_globals = { 0 };
#define node_matrix_constants rasterizer_xbox_d3d_globals.node_matrix_constants
#define d3d rasterizer_xbox_d3d_globals.d3d
@@ -853,13 +853,13 @@ struct rasterizer_xbox_d3d_globals rasterizer_xbox_d3d_globals;
#define global_d3d_texture_render_primary_copy rasterizer_xbox_d3d_globals.global_d3d_texture_render_primary_copy
#define global_d3d_surface_render_primary_copy rasterizer_xbox_d3d_globals.global_d3d_surface_render_primary_copy
D3DDevice *global_d3d_device;
D3DDevice *global_d3d_device = NULL;
/* the shared 256-entry palette; January's own
* IDirect3DDevice8_CreatePalette(global_d3d_device, D3DPALETTE_256,
* &d3d_palette) error string names it, and csplit anchors it on
* _global_d3d_device + 4. */
D3DPalette *d3d_palette;
D3DPalette *d3d_palette = NULL;
/* owned by another object; named by this object's own
* D3DDevice_GetDeviceCaps() call site. */
@@ -869,8 +869,8 @@ extern D3DCAPS8 global_d3d_caps;
* is the only symbol csplit knows there, so the split still anchors their
* relocations on `_global_d3d_device + 8` / `+ 12` (image 0x0045E8D8 and
* 0x0045E8DC). symbols.json names for those two addresses close the gap. */
static boolean suppress_window_begin_end;
static short previous_window_index;
static boolean suppress_window_begin_end = FALSE;
static short previous_window_index = 0;
struct rasterizer_hardware_state_cache rasterizer_state_cache =
{
@@ -1413,7 +1413,7 @@ boolean rasterizer_set_texture_non_blocking(
usage != _bitmap_usage_bump_map) &&
bitmap_definition_index != NONE)
{
long bitmap_count = bitmap_group_get(bitmap_definition_index)->bitmap_data.count;
long bitmap_count = bitmap_group_get(bitmap_definition_index)->bitmaps.count;
if (bitmap_count > 0)
{
@@ -2044,7 +2044,7 @@ boolean rasterizer_set_texture_direct(
stage>=0 && stage<RASTERIZER_MAXIMUM_TEXTURE_STAGES);
if (bitmap_group_index != NONE)
{
long bitmap_count = bitmap_group_get(bitmap_group_index)->bitmap_data.count;
long bitmap_count = bitmap_group_get(bitmap_group_index)->bitmaps.count;
if (bitmap_count > 0)
{
@@ -2085,7 +2085,7 @@ boolean rasterizer_set_texture_direct_non_blocking(
stage>=0 && stage<RASTERIZER_MAXIMUM_TEXTURE_STAGES);
if (bitmap_group_index != NONE)
{
long bitmap_count = bitmap_group_get(bitmap_group_index)->bitmap_data.count;
long bitmap_count = bitmap_group_get(bitmap_group_index)->bitmaps.count;
if (bitmap_count > 0)
bitmap = bitmap_group_try_and_get_bitmap(
@@ -2137,7 +2137,7 @@ union point2d *rasterizer_set_texture(
usage != _bitmap_usage_bump_map) &&
bitmap_definition_index != NONE)
{
long bitmap_count = bitmap_group_get(bitmap_definition_index)->bitmap_data.count;
long bitmap_count = bitmap_group_get(bitmap_definition_index)->bitmaps.count;
if (bitmap_count > 0)
{
@@ -742,7 +742,7 @@ void _rasterizer_detail_objects_draw(
type_definition->sequence_index,
struct detail_object_bitmap_group_sequence);
bitmap_data = TAG_BLOCK_GET_ELEMENT(
&state.bitmap->bitmap_data,
&state.bitmap->bitmaps,
type_sequence->first_bitmap_index,
struct bitmap_data);
range = type_definition->far_fade_distance -
@@ -787,7 +787,7 @@ void _rasterizer_detail_objects_draw(
(short)sprite_index,
struct detail_object_bitmap_group_sprite);
TAG_BLOCK_GET_ELEMENT(
&state.bitmap->bitmap_data,
&state.bitmap->bitmaps,
sprite->bitmap_index,
struct bitmap_data);
constants = frame_data[(short)frame_count];
@@ -363,7 +363,6 @@ struct rasterizer_environment_globals
boolean lightmap_missing;
byte reservedAD[0x3];
real specular_light_brightness;
boolean warned;
};
struct pixel_shader_definition
@@ -571,10 +570,11 @@ static void rasterizer_environment_specular_spot_light_begin(
extern struct rasterizer_environment_debug_options rasterizer_debug_options;
static struct rasterizer_environment_globals rasterizer_environment_globals;
static boolean warned = FALSE;
extern struct pixel_shader_definition pixel_shader;
extern struct rasterizer_lights_globals rasterizer_lights;
extern struct rasterizer_window_begin_parameters global_window_parameters;
extern short specular_light_vertex_shader_permutation_index;
short specular_light_vertex_shader_permutation_index= NONE;
/* ---------- public code */
@@ -3292,10 +3292,10 @@ void _rasterizer_environment_transparent_geometry_submit(
triangle_count);
}
}
else if (!rasterizer_environment_globals.warned)
else if (!warned)
{
error(_error_silent, "### ERROR too many transparent geometry groups");
rasterizer_environment_globals.warned = TRUE;
warned = TRUE;
}
}
(void)offset;
@@ -396,43 +396,6 @@ struct transparent_geometry_group
byte pad9E[2];
};
struct rasterizer_environment_fog_screen_globals
{
short cached_node_matrix_count;
word pad002;
real_matrix4x3 const *cached_node_matrices;
real_matrix4x3 previous_camera_matrix[MAXIMUM_WINDOWS];
boolean local_environment_fog_screen_model_flag;
boolean local_environment_fog_screen_flag;
byte reserved0DA[2];
word local_fog_screen_layer_bitmap_indices[MAXIMUM_ENVIRONMENT_FOG_SCREEN_LAYERS];
real_rgb_color local_fog_screen_layer_colors[MAXIMUM_ENVIRONMENT_FOG_SCREEN_LAYERS];
real local_fog_eye_density;
short local_fog_pass;
byte reserved11A[6];
struct rasterizer_environment_fog_screen_window windows[MAXIMUM_WINDOWS];
struct transparent_geometry_group *opaque_model_submit_parameters;
long opaque_model_count;
boolean fog_screen_active[MAXIMUM_WINDOWS];
byte reserved25C[4];
unsigned __int64 last_frame_index[MAXIMUM_WINDOWS];
short atmosphere_dominant_warning_count;
boolean reported_bad_animation_index;
byte pad283;
struct rasterizer_model_begin_parameters const *model;
boolean model_parameters_cached;
byte pad289[3];
struct render_lighting const *cached_lighting;
struct render_animation const *cached_animation;
boolean reported_too_many_opaque_models;
};
typedef char rasterizer_environment_fog_screen_globals_windows_offset_assert[
offsetof(struct rasterizer_environment_fog_screen_globals, windows) == 0x120 ? 1 : -1];
typedef char rasterizer_environment_fog_screen_globals_warning_offset_assert[
offsetof(
struct rasterizer_environment_fog_screen_globals,
atmosphere_dominant_warning_count) == 0x280 ? 1 : -1];
typedef char rasterizer_environment_fog_window_parameters_fog_offset_assert[
offsetof(struct rasterizer_window_begin_parameters, fog) == 0x1E8 ? 1 : -1];
typedef char rasterizer_environment_fog_window_parameters_field_of_view_offset_assert[
@@ -459,33 +422,30 @@ typedef char rasterizer_environment_fog_transparent_group_size_assert[
sizeof(struct transparent_geometry_group) == 0xA0 ? 1 : -1];
typedef char rasterizer_environment_fog_transparent_group_map_scale_offset_assert[
offsetof(struct transparent_geometry_group, model_base_map_scale) == 0x3C ? 1 : -1];
typedef char rasterizer_environment_fog_screen_globals_model_offset_assert[
offsetof(struct rasterizer_environment_fog_screen_globals, model) == 0x284 ? 1 : -1];
typedef char rasterizer_environment_fog_screen_globals_previous_camera_offset_assert[
offsetof(
struct rasterizer_environment_fog_screen_globals,
previous_camera_matrix) == 0x8 ? 1 : -1];
typedef char rasterizer_environment_fog_screen_globals_bad_animation_offset_assert[
offsetof(
struct rasterizer_environment_fog_screen_globals,
reported_bad_animation_index) == 0x282 ? 1 : -1];
typedef char rasterizer_environment_fog_screen_globals_end_offset_assert[
offsetof(
struct rasterizer_environment_fog_screen_globals,
reported_too_many_opaque_models) == 0x294 ? 1 : -1];
/* January's assertions name these file-scope values. They occupy fields in
* the single private BSS owner recovered for this translation unit. */
#define local_fog_eye_density rasterizer_environment_fog_screen_globals.local_fog_eye_density
#define local_fog_pass rasterizer_environment_fog_screen_globals.local_fog_pass
#define local_environment_fog_screen_flag rasterizer_environment_fog_screen_globals.local_environment_fog_screen_flag
#define local_environment_fog_screen_model_flag rasterizer_environment_fog_screen_globals.local_environment_fog_screen_model_flag
#define local_fog_screen_layer_bitmap_indices rasterizer_environment_fog_screen_globals.local_fog_screen_layer_bitmap_indices
#define local_fog_screen_layer_colors rasterizer_environment_fog_screen_globals.local_fog_screen_layer_colors
/* ---------- globals */
static struct rasterizer_environment_fog_screen_globals rasterizer_environment_fog_screen_globals = { 0 };
static short cached_node_matrix_count = 0;
static real_matrix4x3 const *cached_node_matrices = NULL;
static real_matrix4x3 previous_camera_matrix[MAXIMUM_WINDOWS] = {0};
static boolean local_environment_fog_screen_model_flag = FALSE;
static boolean local_environment_fog_screen_flag = FALSE;
static word local_fog_screen_layer_bitmap_indices[MAXIMUM_ENVIRONMENT_FOG_SCREEN_LAYERS] = {0};
static real_rgb_color local_fog_screen_layer_colors[MAXIMUM_ENVIRONMENT_FOG_SCREEN_LAYERS] = {0};
static real local_fog_eye_density = 0.0f;
static short local_fog_pass = 0;
static struct rasterizer_environment_fog_screen_window windows[MAXIMUM_WINDOWS] = {0};
static struct transparent_geometry_group *opaque_model_submit_parameters = NULL;
static long opaque_model_count = 0;
static boolean fog_screen_active[MAXIMUM_WINDOWS] = {0};
static unsigned __int64 last_frame_index[MAXIMUM_WINDOWS] = {0};
static short atmosphere_dominant_warning_count = 0;
static boolean reported_bad_animation_index = FALSE;
static struct rasterizer_model_begin_parameters const *model = NULL;
static boolean model_parameters_cached = FALSE;
static struct render_lighting const *cached_lighting = NULL;
static struct render_animation const *cached_animation = NULL;
static boolean reported_too_many_opaque_models = FALSE;
static boolean local_fog_screen_first_time = TRUE;
extern struct rasterizer_environment_fog_debug_options rasterizer_debug_options;
@@ -504,14 +464,14 @@ boolean rasterizer_environment_fog_screen_initialize(
{
boolean result = TRUE;
rasterizer_environment_fog_screen_globals.opaque_model_submit_parameters =
opaque_model_submit_parameters =
debug_malloc(
0x5000,
FALSE,
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_environment_fog.c",
0xF8);
rasterizer_environment_fog_screen_globals.opaque_model_count = 0;
if (!rasterizer_environment_fog_screen_globals.opaque_model_submit_parameters)
opaque_model_count = 0;
if (!opaque_model_submit_parameters)
{
error(
_error_silent,
@@ -531,7 +491,7 @@ void rasterizer_environment_fog_screen_window_end(
void rasterizer_environment_fog_screen_window_begin(
void)
{
rasterizer_environment_fog_screen_globals.opaque_model_count = 0;
opaque_model_count = 0;
return;
}
@@ -539,10 +499,10 @@ void rasterizer_environment_fog_screen_window_begin(
void rasterizer_environment_fog_screen_dispose(
void)
{
if (rasterizer_environment_fog_screen_globals.opaque_model_submit_parameters)
if (opaque_model_submit_parameters)
{
debug_free(
rasterizer_environment_fog_screen_globals.opaque_model_submit_parameters,
opaque_model_submit_parameters,
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_environment_fog.c",
0x117);
}
@@ -580,8 +540,8 @@ boolean rasterizer_environment_fog_screen_model_begin(
&camera_relative),
&global_window_parameters.camera.forward) < screen->far_distance)
{
rasterizer_environment_fog_screen_globals.model = parameters;
rasterizer_environment_fog_screen_globals.model_parameters_cached = FALSE;
model = parameters;
model_parameters_cached = FALSE;
result = TRUE;
if (rasterizer_debug_options.statistics_mode ==
_rasterizer_statistics_mode_enabled)
@@ -607,48 +567,44 @@ void rasterizer_environment_fog_screen_model_submit(
if (rasterizer_debug_options.draw_environment_fog_screen &&
rasterizer_debug_options.drawing_mode == _rasterizer_drawing_mode_normal)
{
if (rasterizer_environment_fog_screen_globals.opaque_model_count <
if (opaque_model_count <
MAXIMUM_ENVIRONMENT_FOG_SCREEN_OPAQUE_MODELS)
{
struct transparent_geometry_group *group =
&rasterizer_environment_fog_screen_globals.opaque_model_submit_parameters[
rasterizer_environment_fog_screen_globals.opaque_model_count++];
&opaque_model_submit_parameters[
opaque_model_count++];
group->shader = shader;
group->triangle_buffer = triangle_buffer;
group->shader_permutation_index = shader_permutation_index;
group->dynamic_triangle_buffer_index = dynamic_triangle_buffer_index;
group->vertex_buffer = vertex_buffer;
group->triangle_buffer = triangle_buffer;
group->triangle_count = triangle_count;
group->first_triangle_index = 0;
group->dynamic_vertex_buffer_index = dynamic_vertex_buffer_index;
group->vertex_buffer = vertex_buffer;
group->model_base_map_scale = model->base_map_scale;
if (!model_parameters_cached)
{
struct rasterizer_model_begin_parameters const *model =
rasterizer_environment_fog_screen_globals.model;
group->model_base_map_scale = model->base_map_scale;
if (!rasterizer_environment_fog_screen_globals.model_parameters_cached)
{
rasterizer_environment_fog_screen_globals.cached_node_matrices =
rasterizer_memory_alloc_const(
model->skinning.node_matrices,
model->skinning.node_matrix_count * sizeof(real_matrix4x3));
rasterizer_environment_fog_screen_globals.cached_node_matrix_count =
rasterizer_environment_fog_screen_globals.model->skinning.node_matrix_count;
rasterizer_environment_fog_screen_globals.model_parameters_cached = TRUE;
}
cached_node_matrices =
rasterizer_memory_alloc_const(
model->skinning.node_matrices,
model->skinning.node_matrix_count * sizeof(real_matrix4x3));
cached_node_matrix_count =
model->skinning.node_matrix_count;
model_parameters_cached = TRUE;
}
group->node_matrices = rasterizer_environment_fog_screen_globals.cached_node_matrices;
group->node_matrix_count = rasterizer_environment_fog_screen_globals.cached_node_matrix_count;
group->lighting = rasterizer_environment_fog_screen_globals.cached_lighting;
group->animation = rasterizer_environment_fog_screen_globals.cached_animation;
group->node_matrices = cached_node_matrices;
group->node_matrix_count = cached_node_matrix_count;
group->lighting = cached_lighting;
group->animation = cached_animation;
}
else if (!rasterizer_environment_fog_screen_globals.reported_too_many_opaque_models)
else if (!reported_too_many_opaque_models)
{
error(
_error_silent,
"### ERROR too many opaque model groups obscuring fog screen (max=#%d)",
MAXIMUM_ENVIRONMENT_FOG_SCREEN_OPAQUE_MODELS);
rasterizer_environment_fog_screen_globals.reported_too_many_opaque_models = TRUE;
reported_too_many_opaque_models = TRUE;
}
}
@@ -658,7 +614,7 @@ void rasterizer_environment_fog_screen_model_submit(
void rasterizer_environment_fog_screen_model_end(
void)
{
rasterizer_environment_fog_screen_globals.model = 0;
model = 0;
return;
}
@@ -710,13 +666,13 @@ void _rasterizer_environment_fog_begin(
{
atmospheric_eye_density = 1.0f;
if (distance < -0.3f &&
rasterizer_environment_fog_screen_globals.atmosphere_dominant_warning_count <
atmosphere_dominant_warning_count <
MAXIMUM_ATMOSPHERE_DOMINANT_WARNINGS)
{
error(
_error_silent,
"### WARNING camera went below atmosphere-dominant fog plane");
rasterizer_environment_fog_screen_globals.atmosphere_dominant_warning_count++;
atmosphere_dominant_warning_count++;
}
}
@@ -871,9 +827,9 @@ static boolean rasterizer_environment_fog_screen_active(
{
struct fog_screen const *screen;
rasterizer_environment_fog_screen_globals.fog_screen_active[window_index] = FALSE;
fog_screen_active[window_index] = FALSE;
if (rasterizer_globals.fps_accumulation_frame_index !=
rasterizer_environment_fog_screen_globals.last_frame_index[window_index])
last_frame_index[window_index])
{
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_environment_fog.c",
@@ -912,10 +868,10 @@ static boolean rasterizer_environment_fog_screen_active(
? global_window_parameters.fog.screen_external_intensity
: PIN((distance - z) / (base_z - z), 0.0f, 1.0f);
if (local_fog_eye_density > 0.0f)
rasterizer_environment_fog_screen_globals.fog_screen_active[window_index] = TRUE;
fog_screen_active[window_index] = TRUE;
}
}
active = rasterizer_environment_fog_screen_globals.fog_screen_active[window_index];
active = fog_screen_active[window_index];
}
else
{
@@ -931,7 +887,7 @@ void _rasterizer_environment_fog_screen_wind_get_vector(
real_vector3d *wind_vector)
{
struct rasterizer_environment_fog_screen_wind *wind =
&rasterizer_environment_fog_screen_globals.windows[window_index].wind;
&windows[window_index].wind;
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_environment_fog.c",
@@ -1037,7 +993,7 @@ void _rasterizer_environment_fog_screen_begin(
if (rasterizer_environment_fog_screen_active())
{
struct rasterizer_environment_fog_screen_window *window =
&rasterizer_environment_fog_screen_globals.windows[
&windows[
global_window_parameters.window_index];
struct fog_screen const *screen = global_window_parameters.fog.screen;
@@ -1049,7 +1005,7 @@ void _rasterizer_environment_fog_screen_begin(
if (pass == 0)
{
real_matrix4x3 *previous_camera_matrix =
&rasterizer_environment_fog_screen_globals.previous_camera_matrix[
&previous_camera_matrix[
global_window_parameters.window_index];
real_matrix4x3 wind_matrix = *global_identity4x3;
real screen_constants[5][4];
@@ -1073,13 +1029,13 @@ void _rasterizer_environment_fog_screen_begin(
for (window_index = 0; window_index < MAXIMUM_WINDOWS; window_index++)
{
csmemset(
&rasterizer_environment_fog_screen_globals.windows[window_index],
&windows[window_index],
0,
sizeof(struct rasterizer_environment_fog_screen_window));
for (layer = 0; layer < screen->layer_count; layer++)
{
struct rasterizer_environment_fog_screen_layer *layer_state =
&rasterizer_environment_fog_screen_globals.windows[window_index].
&windows[window_index].
layers[layer];
layer_state->v = real_local_random();
@@ -1087,10 +1043,10 @@ void _rasterizer_environment_fog_screen_begin(
}
/* January copies the first matrix-sized camera bytes here verbatim. */
csmemcpy(
&rasterizer_environment_fog_screen_globals.previous_camera_matrix[
&previous_camera_matrix[
window_index],
&global_window_parameters.camera,
sizeof(rasterizer_environment_fog_screen_globals.previous_camera_matrix[
sizeof(previous_camera_matrix[
window_index]));
}
local_fog_screen_first_time = FALSE;
@@ -1107,7 +1063,7 @@ void _rasterizer_environment_fog_screen_begin(
matrix4x3_multiply(&wind_matrix, &matrix, &matrix);
matrix4x3_multiply(&global_window_parameters.frustum.world_to_view, &matrix, &matrix);
csmemcpy(
&rasterizer_environment_fog_screen_globals.previous_camera_matrix[
&previous_camera_matrix[
global_window_parameters.window_index],
&global_window_parameters.frustum.world_to_view,
sizeof(real_matrix4x3));
@@ -1213,21 +1169,20 @@ void _rasterizer_environment_fog_screen_begin(
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_environment_fog.c",
653,
bitmap_group && bitmap_group->bitmap_data.count>0);
bitmap_group && bitmap_group->bitmaps.count>0);
if (screen->animation_period != 0.0f)
{
short animation_index;
real t = bitmap_group->bitmap_data.count * phase[layer] +
real t = bitmap_group->bitmaps.count * phase[layer] +
global_frame_parameters.game_time_sec / screen->animation_period;
real animation_time = (real)PIN(t - floor(t), 0.0, 1.0);
animation_times[layer] = animation_time;
animation_index = (short)(fast_ftol((real)floor(t)) % bitmap_group->bitmap_data.count);
animation_index = (short)(fast_ftol((real)floor(t)) % bitmap_group->bitmaps.count);
if (animation_index < 0)
{
if (!rasterizer_environment_fog_screen_globals.
reported_bad_animation_index)
if (!reported_bad_animation_index)
{
long game_time_bits;
long animation_period_bits;
@@ -1287,22 +1242,21 @@ void _rasterizer_environment_fog_screen_begin(
"\tanimation_time=%f[%x]",
animation_time,
animation_time_bits);
rasterizer_environment_fog_screen_globals.
reported_bad_animation_index = TRUE;
reported_bad_animation_index = TRUE;
}
animation_index = 0;
}
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_environment_fog.c",
682,
animation_index>=0 && animation_index<bitmap_group->bitmap_data.count);
animation_index>=0 && animation_index<bitmap_group->bitmaps.count);
local_fog_screen_layer_bitmap_indices[layer] = animation_index;
}
else
{
animation_times[layer] = 0.0f;
local_fog_screen_layer_bitmap_indices[layer] =
(short)(layer % bitmap_group->bitmap_data.count);
(short)(layer % bitmap_group->bitmaps.count);
}
}
@@ -1375,7 +1329,7 @@ void _rasterizer_environment_fog_screen_begin(
local_environment_fog_screen_model_flag = !TEST_FLAG(
global_window_parameters.fog.screen->flags,
_fog_screen_no_model_multipass_bit) &&
rasterizer_environment_fog_screen_globals.opaque_model_count > 0;
opaque_model_count > 0;
}
if (local_environment_fog_screen_flag || local_environment_fog_screen_model_flag)
{
@@ -1396,7 +1350,7 @@ void _rasterizer_environment_fog_screen_begin(
clear_z_buffer = (TEST_FLAG(
screen->flags,
_fog_screen_no_model_multipass_bit) &&
rasterizer_environment_fog_screen_globals.opaque_model_count > 0) ||
opaque_model_count > 0) ||
(rasterizer_water_get_visibility_for_window() &&
rasterizer_debug_options.draw_water);
}
@@ -1498,12 +1452,11 @@ void _rasterizer_environment_fog_screen_begin(
short group_index;
for (group_index = 0;
group_index < rasterizer_environment_fog_screen_globals.opaque_model_count;
group_index < opaque_model_count;
group_index++)
{
struct transparent_geometry_group *group =
&rasterizer_environment_fog_screen_globals.
opaque_model_submit_parameters[group_index];
&opaque_model_submit_parameters[group_index];
struct rasterizer_model_skinning_parameters skinning;
if (group->shader->base.type == _shader_type_transparent_chicago &&
@@ -1679,7 +1632,7 @@ void _rasterizer_environment_fog_screen_end(
{
struct fog_screen const *screen = global_window_parameters.fog.screen;
struct rasterizer_environment_fog_screen_window *window =
&rasterizer_environment_fog_screen_globals.windows[
&windows[
global_window_parameters.window_index];
boolean fog_screen_drawn = local_environment_fog_screen_flag ||
local_environment_fog_screen_model_flag;
+54 -91
View File
@@ -206,11 +206,6 @@ enum
NUMBER_OF_MODEL_VERTEX_SHADER_PERMUTATIONS
};
/* ---------- macros */
#define local_parameters rasterizer_models_globals.parameters
#define local_model_effect_type rasterizer_models_globals.model_effect_type
/* ---------- structures */
struct rasterizer_debug_options
@@ -357,25 +352,6 @@ struct transparent_geometry_group
byte pad9E[2];
};
struct rasterizer_models_globals
{
struct render_animation const *transparent_geometry_cached_animation;
struct render_lighting const *transparent_geometry_cached_lighting;
short transparent_geometry_cached_node_matrix_count;
word pad0A;
real_matrix4x3 const *transparent_geometry_cached_node_matrices;
struct transparent_geometry_group immediate_transparent_geometry_group;
struct rasterizer_model_begin_parameters const *parameters;
boolean local_parameters_queued_flag;
byte reservedB5[3];
short model_effect_type;
boolean local_sky_flag;
boolean local_planar_fog_flag;
boolean local_environment_fog_screen_flag;
boolean local_do_not_change_z_stencil_states;
boolean local_reported_too_many_transparent_geometry_groups;
};
struct rasterizer_models_frame_statistics
{
byte reserved000[0x14];
@@ -499,24 +475,6 @@ typedef char verify_rasterizer_model_parameters_lighting_offset[
typedef char verify_rasterizer_model_parameters_effect_offset[
offsetof(struct rasterizer_model_begin_parameters, effect) == 0x8C
? 1 : -1];
typedef char verify_rasterizer_models_sky_offset[
offsetof(struct rasterizer_models_globals, local_sky_flag) == 0xBA
? 1 : -1];
typedef char verify_rasterizer_models_parameters_offset[
offsetof(struct rasterizer_models_globals, parameters) == 0xB0
? 1 : -1];
typedef char verify_rasterizer_models_effect_type_offset[
offsetof(
struct rasterizer_models_globals,
model_effect_type) == 0xB8 ? 1 : -1];
typedef char verify_rasterizer_models_environment_fog_screen_offset[
offsetof(
struct rasterizer_models_globals,
local_environment_fog_screen_flag) == 0xBC ? 1 : -1];
typedef char verify_rasterizer_models_do_not_change_states_offset[
offsetof(
struct rasterizer_models_globals,
local_do_not_change_z_stencil_states) == 0xBD ? 1 : -1];
typedef char verify_rasterizer_models_window_fog_offset[
offsetof(struct rasterizer_window_begin_parameters, fog) == 0x1E8
? 1 : -1];
@@ -554,10 +512,6 @@ typedef char verify_transparent_geometry_group_plane_offset[
typedef char verify_transparent_geometry_group_cortana_hack_offset[
offsetof(struct transparent_geometry_group, cortana_hack) == 0x9D
? 1 : -1];
typedef char verify_rasterizer_models_immediate_group_offset[
offsetof(
struct rasterizer_models_globals,
immediate_transparent_geometry_group) == 0x10 ? 1 : -1];
typedef char verify_rasterizer_models_statistics_transparent_offset[
offsetof(
struct rasterizer_models_frame_statistics,
@@ -669,7 +623,19 @@ typedef char verify_shader_model_reflection_cube_map_offset[
/* ---------- globals */
extern struct rasterizer_debug_options rasterizer_debug_options;
static struct rasterizer_models_globals rasterizer_models_globals;
static struct render_animation const *transparent_geometry_cached_animation = NULL;
static struct render_lighting const *transparent_geometry_cached_lighting = NULL;
static short transparent_geometry_cached_node_matrix_count = 0;
static real_matrix4x3 const *transparent_geometry_cached_node_matrices = NULL;
static struct transparent_geometry_group immediate_transparent_geometry_group = {0};
static struct rasterizer_model_begin_parameters const *local_parameters = NULL;
static boolean local_parameters_queued_flag = FALSE;
static short local_model_effect_type = 0;
static boolean local_sky_flag = FALSE;
static boolean local_planar_fog_flag = FALSE;
static boolean local_environment_fog_screen_flag = FALSE;
static boolean local_do_not_change_z_stencil_states = FALSE;
static boolean local_reported_too_many_transparent_geometry_groups = FALSE;
static boolean local_pixel_shader_dirty_flag = TRUE;
extern boolean rasterizer_model_cortana_hack;
extern struct rasterizer_window_begin_parameters global_window_parameters;
@@ -702,7 +668,7 @@ void _rasterizer_models_begin(
if (rasterizer_debug_options.draw_models)
{
local_pixel_shader_dirty_flag = TRUE;
rasterizer_models_globals.local_sky_flag = sky;
local_sky_flag = sky;
if (sky)
{
rasterizer_profile_begin(_rasterizer_profile_model_sky);
@@ -721,7 +687,7 @@ void _rasterizer_models_end(
{
if (rasterizer_debug_options.draw_models)
{
if (rasterizer_models_globals.local_sky_flag)
if (local_sky_flag)
{
rasterizer_profile_end(_rasterizer_profile_model_sky);
}
@@ -743,14 +709,14 @@ void _rasterizer_model_end(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_models.c",
1491,
local_parameters);
if (rasterizer_models_globals.local_environment_fog_screen_flag)
if (local_environment_fog_screen_flag)
{
rasterizer_environment_fog_screen_model_end();
}
if (TEST_FLAG(
local_parameters->geometry_flags,
_rasterizer_geometry_first_person_bit) &&
!rasterizer_models_globals.local_do_not_change_z_stencil_states)
!local_do_not_change_z_stencil_states)
{
rasterizer_set_stencil_mode(RASTERIZER_STENCIL_MODE_REJECT);
rasterizer_set_frustum_z(0.0f, 0.0f);
@@ -787,8 +753,8 @@ void _rasterizer_model_begin(
}
local_parameters = parameters;
rasterizer_models_globals.local_parameters_queued_flag = FALSE;
rasterizer_models_globals.local_do_not_change_z_stencil_states =
local_parameters_queued_flag = FALSE;
local_do_not_change_z_stencil_states =
do_not_change_z_stencil_states;
if (rasterizer_debug_options.active_camouflage &&
@@ -796,13 +762,13 @@ void _rasterizer_model_begin(
parameters->effect.type == _render_model_effect_type_active_camouflage &&
parameters->effect.intensity > 0.0f)
{
rasterizer_models_globals.model_effect_type =
local_model_effect_type =
_render_model_effect_type_active_camouflage;
}
else if (parameters->effect.type ==
_render_model_effect_type_modifier)
{
rasterizer_models_globals.model_effect_type =
local_model_effect_type =
_render_model_effect_type_modifier;
}
else
@@ -817,7 +783,7 @@ void _rasterizer_model_begin(
skinning_work;
rasterizer_frame_statistics.lighting_work_accumulated +=
rasterizer_frame_statistics.lighting_work - lighting_work;
rasterizer_models_globals.model_effect_type = _render_model_effect_type_none;
local_model_effect_type = _render_model_effect_type_none;
}
camera_plane_distance =
@@ -828,7 +794,7 @@ void _rasterizer_model_begin(
global_window_parameters.camera.position.z *
global_window_parameters.fog.plane.n.k -
global_window_parameters.fog.plane.d;
rasterizer_models_globals.local_planar_fog_flag =
local_planar_fog_flag =
global_window_parameters.fog.planar_mode &&
!TEST_FLAG(
parameters->geometry_flags,
@@ -838,14 +804,14 @@ void _rasterizer_model_begin(
_rasterizer_geometry_atmospheric_fog_but_no_planar_fog_bit) ||
camera_plane_distance < 0.0f);
if (!rasterizer_models_globals.local_sky_flag &&
if (!local_sky_flag &&
rasterizer_environment_fog_screen_model_begin(parameters))
{
rasterizer_models_globals.local_environment_fog_screen_flag = TRUE;
local_environment_fog_screen_flag = TRUE;
}
else
{
rasterizer_models_globals.local_environment_fog_screen_flag = FALSE;
local_environment_fog_screen_flag = FALSE;
}
if (rasterizer_debug_options.statistics_mode ==
@@ -1389,7 +1355,7 @@ void rasterizer_model_draw_environment_shader(
shader_environment->environment.flags,
_shader_environment_true_atmospheric_fog_bit))
{
if (rasterizer_models_globals.local_planar_fog_flag)
if (local_planar_fog_flag)
{
vertex_shader_permutation =
_model_vertex_shader_permutation_planar_fog;
@@ -2151,7 +2117,7 @@ void _rasterizer_model_draw(
shader_model->model.flags,
_shader_model_true_atmospheric_fog_bit))
{
if (rasterizer_models_globals.local_planar_fog_flag)
if (local_planar_fog_flag)
{
vertex_shader_permutation =
_model_vertex_shader_permutation_planar_fog;
@@ -2549,7 +2515,7 @@ void _rasterizer_model_draw(
}
}
if (rasterizer_models_globals.local_environment_fog_screen_flag)
if (local_environment_fog_screen_flag)
{
rasterizer_environment_fog_screen_model_submit(
shader,
@@ -2604,7 +2570,7 @@ struct transparent_geometry_group *_rasterizer_model_transparent_geometry_submit
_shader_type_model))->model.flags,
_shader_model_alpha_blended_decal_bit);
if (rasterizer_models_globals.model_effect_type!=_render_model_effect_type_active_camouflage ||
if (local_model_effect_type!=_render_model_effect_type_active_camouflage ||
(shader &&
shader->base.type==_shader_type_model &&
((struct shader_model_definition *)shader_get_and_verify_type(
@@ -2637,8 +2603,8 @@ struct transparent_geometry_group *_rasterizer_model_transparent_geometry_submit
1304,
local_parameters);
geometry_flags = local_parameters->geometry_flags;
group = NULL;
geometry_flags = local_parameters->geometry_flags;
if (submit_decals)
{
@@ -2658,14 +2624,14 @@ struct transparent_geometry_group *_rasterizer_model_transparent_geometry_submit
geometry_flags,
_rasterizer_geometry_no_queue_bit))
{
group = &rasterizer_models_globals.immediate_transparent_geometry_group;
group = &immediate_transparent_geometry_group;
group->sorted_index = NONE;
}
}
if (!group)
{
if (rasterizer_models_globals.model_effect_type==
if (local_model_effect_type==
_render_model_effect_type_active_camouflage &&
shader->base.type!=_shader_type_model)
{
@@ -2724,22 +2690,19 @@ struct transparent_geometry_group *_rasterizer_model_transparent_geometry_submit
group->dynamic_vertex_buffer_index = dynamic_vertex_buffer_index;
group->vertex_buffer = vertex_buffer;
group->lightmap = NULL;
relative_centroid.i = group->centroid.x -
global_window_parameters.camera.position.x;
relative_centroid.j = group->centroid.y -
global_window_parameters.camera.position.y;
relative_centroid.k = group->centroid.z -
global_window_parameters.camera.position.z;
group->z_sort = -(
global_window_parameters.camera.forward.k*relative_centroid.k +
global_window_parameters.camera.forward.j*relative_centroid.j +
global_window_parameters.camera.forward.i*relative_centroid.i);
vector_from_points3d(
&global_window_parameters.camera.position,
&group->centroid,
&relative_centroid);
group->z_sort = -dot_product3d(
&global_window_parameters.camera.forward,
&relative_centroid);
group->plane = plane;
group->model_base_map_scale.i = local_parameters->base_map_scale.i;
group->model_base_map_scale.j = local_parameters->base_map_scale.j;
group->previous_group_presorted_index = NONE;
group->next_group_presorted_index = NONE;
if (rasterizer_models_globals.model_effect_type==
if (local_model_effect_type==
_render_model_effect_type_active_camouflage &&
shader->base.type!=_shader_type_model)
{
@@ -2774,31 +2737,31 @@ struct transparent_geometry_group *_rasterizer_model_transparent_geometry_submit
}
else
{
if (!rasterizer_models_globals.local_parameters_queued_flag)
if (!local_parameters_queued_flag)
{
rasterizer_models_globals.transparent_geometry_cached_node_matrices =
transparent_geometry_cached_node_matrices =
rasterizer_memory_alloc_const(
local_parameters->skinning.node_matrices,
local_parameters->skinning.node_matrix_count*
sizeof(real_matrix4x3));
rasterizer_models_globals.transparent_geometry_cached_node_matrix_count =
transparent_geometry_cached_node_matrix_count =
local_parameters->skinning.node_matrix_count;
rasterizer_models_globals.transparent_geometry_cached_lighting =
transparent_geometry_cached_lighting =
rasterizer_memory_alloc_const(
&local_parameters->lighting,
sizeof(struct render_lighting));
rasterizer_models_globals.transparent_geometry_cached_animation =
transparent_geometry_cached_animation =
rasterizer_memory_alloc_const(
&local_parameters->animation,
sizeof(struct render_animation));
rasterizer_models_globals.local_parameters_queued_flag = TRUE;
local_parameters_queued_flag = TRUE;
}
group->node_matrices = rasterizer_models_globals.transparent_geometry_cached_node_matrices;
group->node_matrices = transparent_geometry_cached_node_matrices;
group->node_matrix_count =
rasterizer_models_globals.transparent_geometry_cached_node_matrix_count;
group->lighting = rasterizer_models_globals.transparent_geometry_cached_lighting;
group->animation = rasterizer_models_globals.transparent_geometry_cached_animation;
transparent_geometry_cached_node_matrix_count;
group->lighting = transparent_geometry_cached_lighting;
group->animation = transparent_geometry_cached_animation;
}
if (rasterizer_debug_options.statistics_mode==
@@ -2819,19 +2782,19 @@ struct transparent_geometry_group *_rasterizer_model_transparent_geometry_submit
vertex_buffer);
}
}
else if (!rasterizer_models_globals.local_reported_too_many_transparent_geometry_groups)
else if (!local_reported_too_many_transparent_geometry_groups)
{
error(
_error_silent,
"### ERROR too many transparent geometry groups");
rasterizer_models_globals.local_reported_too_many_transparent_geometry_groups = TRUE;
local_reported_too_many_transparent_geometry_groups = TRUE;
}
}
else if (sort_filth)
{
sort_filth->group_index = NONE;
sort_filth->previous_group_presorted_index_reference = NULL;
sort_filth->next_group_presorted_index_reference = NULL;
sort_filth->group_index = NONE;
}
}
@@ -228,8 +228,6 @@ struct rasterizer_environment_shadows_globals
real object_bounding_radius;
real_matrix4x3 shadow_matrix;
struct rasterizer_model_begin_parameters const *local_parameters;
boolean shadow_setup;
boolean shadow_used;
};
typedef char verify_rasterizer_shadows_draw_shadows_offset[
@@ -244,9 +242,6 @@ typedef char verify_rasterizer_shadows_local_parameters_offset[
offsetof(
struct rasterizer_environment_shadows_globals,
local_parameters) == 0x44 ? 1 : -1];
typedef char verify_rasterizer_shadows_shadow_used_offset[
offsetof(struct rasterizer_environment_shadows_globals, shadow_used) == 0x49
? 1 : -1];
typedef char verify_rasterizer_shadows_model_parameters_size[
sizeof(struct rasterizer_model_begin_parameters) == 0xCC ? 1 : -1];
typedef char verify_rasterizer_shadows_model_base_map_scale_offset[
@@ -284,6 +279,9 @@ static boolean shadow_restored = TRUE;
static struct rasterizer_environment_shadows_globals
rasterizer_environment_shadows_globals = { 0 };
static boolean shadow_setup = FALSE;
static boolean shadow_used = FALSE;
#define local_parameters rasterizer_environment_shadows_globals.local_parameters
/* ---------- public code */
@@ -326,11 +324,11 @@ boolean _rasterizer_environment_shadow_begin(
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_shadows.c",
155,
shadow_color->red >= 0.0f && shadow_color->red <= 1.0f);
shadow_color->red >=0.0f && shadow_color->red <=1.0f);
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_shadows.c",
156,
shadow_color->green >= 0.0f && shadow_color->green <= 1.0f);
shadow_color->green>=0.0f && shadow_color->green<=1.0f);
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_shadows.c",
157,
@@ -338,7 +336,7 @@ boolean _rasterizer_environment_shadow_begin(
match_assert(
"c:\\halo\\SOURCE\\rasterizer\\xbox\\rasterizer_xbox_shadows.c",
158,
object_bounding_radius > 0.0f);
object_bounding_radius>0.0f);
IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_CULLMODE, D3DCULL_CCW);
IDirect3DDevice8_SetRenderState(
@@ -414,8 +412,8 @@ boolean _rasterizer_environment_shadow_begin(
}
local_parameters = 0;
rasterizer_environment_shadows_globals.shadow_setup = FALSE;
rasterizer_environment_shadows_globals.shadow_used = FALSE;
shadow_setup = FALSE;
shadow_used = FALSE;
shadow_restored = FALSE;
if (rasterizer_debug_options.statistics_mode ==
@@ -448,7 +446,7 @@ void _rasterizer_environment_shadow_model_begin(
rasterizer_set_model_skinning(&parameters->skinning);
local_parameters = parameters;
rasterizer_environment_shadows_globals.shadow_used = TRUE;
shadow_used = TRUE;
if (rasterizer_debug_options.statistics_mode ==
_rasterizer_statistics_mode_enabled)
@@ -628,7 +626,7 @@ void _rasterizer_environment_shadow_end(
_rasterizer_target_render_primary &&
rasterizer_debug_options.draw_environment_shadows)
{
if (!rasterizer_environment_shadows_globals.shadow_used)
if (!shadow_used)
{
error(
_error_silent,
@@ -673,7 +671,7 @@ void _rasterizer_environment_shadow_draw(
_rasterizer_target_render_primary &&
rasterizer_debug_options.draw_environment_shadows)
{
if (!rasterizer_environment_shadows_globals.shadow_setup)
if (!shadow_setup)
{
if (rasterizer_debug_options.shadows_convolution)
{
@@ -941,7 +939,7 @@ void _rasterizer_environment_shadow_draw(
shadow_restored = TRUE;
}
rasterizer_environment_shadows_globals.shadow_setup = TRUE;
shadow_setup = TRUE;
}
rasterizer_set_stencil_mode(RASTERIZER_STENCIL_MODE_REJECT);
@@ -1935,7 +1935,7 @@ void rasterizer_transparent_geometry_group_draw(
&shader_transparent_generic->generic.maps,
0,
struct shader_transparent_generic_map)->map.index);
short frame_count = (short)bitmap_group->bitmap_data.count;
short frame_count = (short)bitmap_group->bitmaps.count;
short function_index = frame_count == 8 ? 3 : 0;
short counter_limit = shader_transparent_generic->generic.numeric_counter_limit;
short counter_value = PIN(fast_ftol(floor(counter_limit*
@@ -2424,7 +2424,7 @@ void rasterizer_transparent_geometry_group_draw(
struct shader_transparent_chicago_map);
struct bitmap_group const *bitmap_group =
bitmap_group_get(map->map.index);
short frame_count = (short)bitmap_group->bitmap_data.count;
short frame_count = (short)bitmap_group->bitmaps.count;
if (TEST_FLAG(shader_transparent_chicago->chicago.extra_flags,
_shader_transparent_chicago_extra_flag_numeric_countdown_timer_bit))
@@ -221,8 +221,8 @@ typedef char verify_pixel_shader_definition_size[
/* ---------- globals */
boolean water_needs_update_flag;
boolean water_visible_for_window_flag;
boolean water_needs_update_flag = FALSE;
boolean water_visible_for_window_flag = FALSE;
extern struct rasterizer_water_debug_options rasterizer_debug_options;
extern struct rasterizer_window_begin_parameters global_window_parameters;
+33 -39
View File
@@ -201,11 +201,11 @@ enum
/* ---------- globals */
boolean debug_no_frustum_clip;
boolean render_camera_debug_this_fucking_frustum;
real previous_projection_coefficients[4];
static real render_camera_warning_values[MAXIMUM_RENDER_CAMERA_WARNING_CONDITIONS];
static boolean render_camera_warnings_initialized;
real previous_projection_coefficients[4]= {0};
static real render_camera_warning_values[MAXIMUM_RENDER_CAMERA_WARNING_CONDITIONS]= {0};
static boolean render_camera_warnings_initialized= {0};
boolean debug_no_frustum_clip= {0};
boolean render_camera_debug_this_fucking_frustum= {0};
/* ---------- private prototypes */
@@ -894,15 +894,18 @@ short render_frustum_sphere_visible(
real distance5;
real negative_radius;
if (frustum->world_bounds.x1 < point->x - radius ||
frustum->world_bounds.y1 < point->y - radius ||
frustum->world_bounds.z1 < point->z - radius ||
frustum->world_bounds.x0 > point->x + radius ||
frustum->world_bounds.y0 > point->y + radius ||
frustum->world_bounds.z0 > point->z + radius)
{
if (frustum->world_bounds.x1 < point->x - radius)
return 0;
if (frustum->world_bounds.y1 < point->y - radius)
return 0;
if (frustum->world_bounds.z1 < point->z - radius)
return 0;
if (frustum->world_bounds.x0 > point->x + radius)
return 0;
if (frustum->world_bounds.y0 > point->y + radius)
return 0;
if (frustum->world_bounds.z0 > point->z + radius)
return 0;
}
distance0 = plane3d_distance_to_point(&frustum->world_planes[0], point);
if (distance0 > radius)
@@ -920,29 +923,19 @@ short render_frustum_sphere_visible(
return 0;
distance5 = plane3d_distance_to_point(&frustum->world_planes[5], point);
if (distance5 > radius)
{
return 0;
}
else
negative_radius = -radius;
if (distance0 < negative_radius &&
distance1 < negative_radius &&
distance2 < negative_radius &&
distance3 < negative_radius &&
distance5 < negative_radius)
{
short result;
negative_radius = -radius;
if (distance0 < negative_radius &&
distance1 < negative_radius &&
distance2 < negative_radius &&
distance3 < negative_radius &&
distance5 < negative_radius)
{
result = 2;
}
else
{
result = 1;
}
return result;
return 2;
}
return 1;
}
void render_camera_debug_frustum(
@@ -1019,16 +1012,17 @@ void render_camera_mirror(
if (fabs(dot_product3d(&plane.n, &camera->forward)) < 0.0125f)
{
real_point3d point_on_plane;
real_vector3d const *normal = &plane.n;
real_vector3d const *forward = &camera->forward;
real distance_to_plane =
-plane3d_distance_to_point(&plane, &camera->position);
point_on_plane.x = plane.n.i * distance_to_plane + camera->position.x;
point_on_plane.y = plane.n.j * distance_to_plane + camera->position.y;
point_on_plane.z = plane.n.k * distance_to_plane + camera->position.z;
adjusted_normal.i = plane.n.i + forward->i * 0.005859375f;
adjusted_normal.j = plane.n.j + forward->j * 0.005859375f;
adjusted_normal.k = plane.n.k + forward->k * 0.005859375f;
point_on_plane.x = normal->i * distance_to_plane + camera->position.x;
point_on_plane.y = normal->j * distance_to_plane + camera->position.y;
point_on_plane.z = normal->k * distance_to_plane + camera->position.z;
adjusted_normal.i = normal->i + forward->i * 0.005859375f;
adjusted_normal.j = normal->j + forward->j * 0.005859375f;
adjusted_normal.k = normal->k + forward->k * 0.005859375f;
normalize3d(&adjusted_normal);
plane3d_from_point_and_normal(
&adjusted_plane,
+19 -4
View File
@@ -186,7 +186,21 @@ static void build_sprite_compute_basis(
extern boolean debug_sprites;
extern struct build_sprite_globals_data build_sprite_globals;
static real const one_over_full_circle = 1.f / (2.f*_pi);
static char *sprite_render_orientation_names[NUMBER_OF_BUILD_SPRITE_ORIENTATIONS] =
{
"screen facing",
"parallel to direction",
"perpendicular to direction",
};
struct tag_enum_definition global_sprite_render_orientations_enum =
{
NUMBER_OF_BUILD_SPRITE_ORIENTATIONS,
sprite_render_orientation_names,
NULL,
};
real const one_over_full_circle = 1.f / (2.f*_pi);
static boolean build_sprite_vertex_allocation_failure_reported;
@@ -380,7 +394,7 @@ void build_sprite(
sprite_index));
bitmap = TAG_BLOCK_GET_ELEMENT(
&bitmap_group->bitmap_data,
&bitmap_group->bitmaps,
sprite->bitmap_index,
struct bitmap_data);
group_index = build_sprite_get_group(data, bitmap);
@@ -582,6 +596,7 @@ void build_sprite_rotational(
{
real_point3d transformed_origin;
real_vector3d transformed_axis_of_rotation;
real const quarter_circle = _pi/2;
real fraction;
real angle;
real sprite_rotation;
@@ -606,8 +621,8 @@ void build_sprite_rotational(
angle = angle_between_vectors3d(
(real_vector3d const *)&transformed_origin,
&transformed_axis_of_rotation) - _pi/2;
fraction = angle*angle/((_pi/2)*(_pi/2));
&transformed_axis_of_rotation) - quarter_circle;
fraction = angle*angle/(quarter_circle*quarter_circle);
fraction = PIN(fraction, 0.f, 1.f);
if (fraction>0.05f)
+1 -1
View File
@@ -142,7 +142,7 @@ static HANDLE game_state_open_persistent_storage(
/* ---------- globals */
extern struct xbox_game_state_globals_prefix xbox_game_state_globals;
struct xbox_game_state_globals_prefix xbox_game_state_globals = { 0 };
/* ---------- public code */
+1 -1
View File
@@ -219,7 +219,7 @@ long player_profile_primary_colors[NUMBER_OF_AVAILABLE_PRIMARY_COLORS] =
0x00F5999E,
};
extern struct player_profile_runtime_globals player_profile_globals;
struct player_profile_runtime_globals player_profile_globals = { 0 };
/* ---------- public code */
+1 -1
View File
@@ -936,7 +936,7 @@ void compute_sound_obstruction(
match_assert(
"c:\\halo\\SOURCE\\sound\\game_sound.c",
887,
source->spatialization_mode == _sound_spatialization_mode_absolute);
source->spatialization_mode==_sound_spatialization_mode_absolute);
source->obstruction = 0.6f;
source->occlusion = 1.0f;
+937 -1
View File
@@ -281,7 +281,943 @@ extern struct dsound_globals dsound_globals;
extern unsigned long const sound_sample_rate_samples_per_second[NUMBER_OF_SOUND_SAMPLE_RATES];
extern HRESULT interrupt_result;
extern boolean debug_sound_channels;
extern byte const dsound_effects_image[0x3A5C];
byte const dsound_effects_image[0x3A5C]=
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x50, 0x1d, 0x00, 0x00, 0x23, 0x07, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x44, 0x23, 0xef, 0xaf, 0x6a, 0xa8, 0x9f,
0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc, 0xd7, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95,
0xb7, 0xcc, 0xd2, 0x75, 0xec, 0x7c, 0x17, 0xb6, 0xd6, 0x01, 0xf8, 0x0b, 0x45, 0x87, 0x47, 0x3d,
0xaf, 0x27, 0x25, 0x12, 0xc1, 0xf3, 0xa5, 0x8d, 0xb7, 0x7a, 0xd4, 0x75, 0x6c, 0xd9, 0xda, 0x86,
0xd4, 0xf7, 0xa6, 0x46, 0x63, 0x92, 0x84, 0x21, 0x91, 0x99, 0x44, 0x2c, 0x50, 0x52, 0x3c, 0xc3,
0x26, 0x89, 0xbc, 0x6a, 0x6f, 0x8d, 0xb9, 0x27, 0x0a, 0x05, 0xe3, 0x7c, 0xe8, 0xff, 0x56, 0x56,
0x9c, 0xa9, 0x6c, 0xb1, 0x12, 0x7a, 0x91, 0x0b, 0xfa, 0x52, 0x2d, 0x4d, 0x60, 0x1e, 0x00, 0xa1,
0xb4, 0x3c, 0x92, 0x54, 0xdc, 0x3a, 0x3d, 0x50, 0x9d, 0x28, 0xac, 0x51, 0x62, 0xc3, 0xdd, 0x81,
0x55, 0xa0, 0x52, 0xd6, 0x73, 0x33, 0x2d, 0x38, 0xf1, 0x5e, 0xc9, 0x92, 0x01, 0xef, 0x58, 0x55,
0xb9, 0xa9, 0xa1, 0xc1, 0x0a, 0x9f, 0x6e, 0xda, 0x22, 0x9a, 0x55, 0x58, 0xb6, 0x92, 0x5d, 0x50,
0x5d, 0x90, 0xa8, 0x41, 0x4a, 0xab, 0xbe, 0x02, 0xf6, 0x3f, 0xdf, 0x6e, 0x6f, 0x52, 0x34, 0x47,
0x74, 0xf1, 0xaa, 0x42, 0x7b, 0x21, 0x46, 0x12, 0xfe, 0xe0, 0x80, 0x2d, 0x50, 0x26, 0xfc, 0xa3,
0xae, 0xbc, 0x52, 0x34, 0x4c, 0xf2, 0xa1, 0xa2, 0x06, 0xfc, 0x92, 0x44, 0xe4, 0x84, 0x7c, 0x31,
0xed, 0x34, 0x0c, 0x73, 0x99, 0x88, 0x5a, 0x57, 0x5c, 0x91, 0xa8, 0x41, 0xca, 0x6b, 0x1e, 0x32,
0x39, 0x9b, 0x6c, 0x43, 0xc9, 0xff, 0x1e, 0xb2, 0xae, 0xd4, 0x3c, 0xcb, 0xed, 0x6e, 0xcf, 0x89,
0xb9, 0xc2, 0x6f, 0xa5, 0x94, 0x08, 0xcd, 0x8b, 0xd9, 0xa7, 0xe4, 0x75, 0x6c, 0x50, 0xb7, 0x06,
0x94, 0x01, 0x22, 0x7e, 0x37, 0x9d, 0xbd, 0x66, 0xe4, 0x55, 0x46, 0xd0, 0xa2, 0x63, 0x29, 0xd9,
0xc7, 0x8f, 0xb9, 0xe8, 0xc2, 0x78, 0xab, 0x9f, 0x42, 0x3b, 0xb5, 0x64, 0xf2, 0xcc, 0x99, 0x97,
0xfe, 0x3d, 0xba, 0x65, 0xf0, 0x19, 0x7b, 0x47, 0xf4, 0x55, 0x21, 0x22, 0x15, 0x5e, 0xa6, 0x1c,
0xff, 0xef, 0x66, 0x3c, 0x9e, 0xd7, 0x22, 0x52, 0x1e, 0x18, 0x7f, 0x51, 0xbc, 0xcf, 0x1c, 0xd1,
0xad, 0xb8, 0x56, 0x39, 0x4b, 0x19, 0x83, 0xc2, 0xb6, 0xbc, 0x3a, 0xca, 0x25, 0xac, 0x71, 0x59,
0xdd, 0xae, 0x49, 0x30, 0xe2, 0x8b, 0xbe, 0xa3, 0xc2, 0x7c, 0xb2, 0x64, 0xf4, 0x6c, 0x14, 0x37,
0x0c, 0xe1, 0xc8, 0x83, 0x69, 0x4f, 0xa4, 0x86, 0xc8, 0xf5, 0xee, 0x06, 0xb3, 0x74, 0x2b, 0x5d,
0x64, 0x6f, 0x29, 0x20, 0x3a, 0xb7, 0x2b, 0xbc, 0x2f, 0x26, 0xab, 0x3a, 0xec, 0x19, 0x63, 0xc2,
0xb6, 0x3d, 0xcc, 0x8a, 0xf9, 0xc5, 0x95, 0x95, 0x4b, 0x09, 0x6e, 0xc5, 0x9f, 0xb4, 0x0d, 0x49,
0xd9, 0xd2, 0x47, 0xd1, 0xa2, 0x92, 0x22, 0x29, 0x29, 0x62, 0x07, 0xa3, 0xf9, 0x96, 0xc8, 0x14,
0xff, 0x19, 0x84, 0x4d, 0xd0, 0x02, 0x02, 0x01, 0x12, 0x14, 0xfe, 0x8e, 0x7f, 0x5a, 0x78, 0x65,
0x63, 0x14, 0x18, 0x00, 0x6a, 0x67, 0x8a, 0x1e, 0x80, 0xa5, 0x8f, 0xbc, 0x14, 0xf6, 0x72, 0xba,
0x22, 0xf6, 0x7b, 0xca, 0x21, 0x75, 0x2d, 0x59, 0x61, 0x8e, 0xd7, 0xa0, 0xc2, 0xdd, 0xa2, 0x14,
0x7b, 0x21, 0x4e, 0x5d, 0xe4, 0xce, 0x1e, 0x50, 0x6d, 0x18, 0x86, 0xd1, 0xa4, 0xb3, 0x0c, 0xc9,
0x19, 0x72, 0xd6, 0x19, 0x3e, 0x40, 0x79, 0x5c, 0xa2, 0x6f, 0x09, 0x20, 0x06, 0x3d, 0x52, 0xac,
0xa7, 0xba, 0x89, 0x2b, 0xc9, 0x5d, 0xe1, 0x73, 0xce, 0x40, 0x1b, 0x17, 0x40, 0xe0, 0x67, 0x3c,
0x6b, 0xe7, 0xe5, 0x82, 0x69, 0x87, 0x1c, 0x66, 0x5a, 0x38, 0x84, 0xd0, 0x9c, 0x35, 0x4c, 0xa9,
0x33, 0x57, 0xed, 0x0b, 0xc8, 0xe4, 0x65, 0xbd, 0xaf, 0x53, 0x8b, 0xaa, 0x96, 0xbd, 0x11, 0xcb,
0x24, 0x5f, 0xf1, 0x89, 0x88, 0x84, 0x35, 0x65, 0x57, 0x6d, 0x2a, 0x20, 0xba, 0x13, 0x58, 0xcc,
0x16, 0x94, 0xbe, 0x59, 0x60, 0xe4, 0x55, 0xb0, 0xaf, 0x02, 0x78, 0x4b, 0x65, 0x15, 0x5b, 0xc1,
0xa7, 0x91, 0x50, 0x3a, 0xc0, 0x18, 0x83, 0xc2, 0x28, 0xd1, 0xb0, 0xea, 0x57, 0xac, 0x89, 0x0f,
0x04, 0x1b, 0x83, 0x4d, 0x60, 0xc2, 0x19, 0xd1, 0x5e, 0x08, 0xfc, 0x89, 0x06, 0x95, 0xc0, 0x25,
0x86, 0x5d, 0x22, 0x1c, 0xc4, 0x1e, 0xc6, 0x6c, 0x95, 0xe6, 0xb5, 0x67, 0x99, 0x0d, 0xf9, 0x87,
0x4f, 0x35, 0x6d, 0xc6, 0xdd, 0xa4, 0x88, 0x89, 0x1e, 0x3a, 0x13, 0x95, 0x42, 0xf5, 0x5d, 0xb4,
0x82, 0x00, 0xf8, 0x8b, 0x82, 0x85, 0x14, 0x55, 0xa5, 0x19, 0x7f, 0x51, 0x81, 0x13, 0xfc, 0x01,
0x52, 0x54, 0xfd, 0x0e, 0x3f, 0x22, 0x44, 0xad, 0xf1, 0x73, 0x34, 0xab, 0xa6, 0x7d, 0xb1, 0x9b,
0x85, 0xbe, 0x32, 0xa4, 0x14, 0xfd, 0x71, 0x3b, 0x28, 0xd6, 0xe2, 0x02, 0x08, 0xa7, 0x0a, 0x4e,
0xa8, 0xfe, 0x21, 0x21, 0x38, 0xe1, 0x66, 0xbc, 0xdf, 0x97, 0x4f, 0xba, 0x8c, 0xb9, 0x93, 0x0a,
0xc3, 0x8f, 0xe9, 0xfd, 0x27, 0xe8, 0x6a, 0xbe, 0xf6, 0x12, 0x0f, 0x1a, 0x3d, 0x5f, 0x27, 0x5c,
0x6f, 0x9f, 0x47, 0x30, 0x54, 0x1b, 0x00, 0x03, 0x96, 0x71, 0x7d, 0x5e, 0x57, 0x2e, 0x02, 0x20,
0xe5, 0x5c, 0x02, 0x1c, 0xb8, 0x76, 0xd8, 0x0c, 0x4f, 0xdb, 0xc3, 0x7d, 0x75, 0xfb, 0xe0, 0x76,
0xcb, 0xf3, 0x70, 0x47, 0x19, 0xe1, 0x57, 0xb1, 0x00, 0xc1, 0x58, 0x3b, 0xcd, 0xc9, 0x42, 0xe2,
0x18, 0xd9, 0xb4, 0xe8, 0xd7, 0x6c, 0x29, 0xdf, 0x9c, 0x0f, 0xf9, 0x88, 0xc2, 0x30, 0xff, 0x85,
0xd9, 0xb4, 0x4e, 0x36, 0x6b, 0x1c, 0x97, 0x12, 0x96, 0x58, 0xa4, 0xdd, 0xbb, 0x32, 0xaa, 0x98,
0xa6, 0x7e, 0xb1, 0xe4, 0x07, 0x68, 0xcd, 0xef, 0xba, 0x93, 0x3f, 0x2f, 0x80, 0x16, 0x14, 0x53,
0x13, 0x28, 0x8c, 0xd1, 0x2f, 0x6f, 0x48, 0xa9, 0x04, 0x02, 0x77, 0x4b, 0x17, 0xe0, 0xd7, 0x71,
0x4b, 0x32, 0x10, 0x97, 0x7b, 0x03, 0x56, 0xb4, 0x31, 0xd4, 0xae, 0xeb, 0xb3, 0x2b, 0xc9, 0xef,
0xd6, 0x06, 0x25, 0x9f, 0x7a, 0x80, 0xb6, 0x24, 0x3f, 0x48, 0x8c, 0x4c, 0x64, 0x94, 0xbc, 0xa1,
0x85, 0xbc, 0x32, 0xb4, 0x12, 0x0d, 0x49, 0x2a, 0xe7, 0xa0, 0x47, 0x33, 0x11, 0xcb, 0x95, 0x13,
0x4a, 0x58, 0xa4, 0x5d, 0x58, 0x7c, 0x5c, 0x40, 0x35, 0x64, 0x85, 0x52, 0xa3, 0x53, 0x5c, 0xb1,
0xaf, 0x95, 0x4e, 0xbb, 0x8a, 0xb7, 0x13, 0x4a, 0x1a, 0x6a, 0x0c, 0x91, 0x13, 0x03, 0x74, 0x45,
0x69, 0xb0, 0x40, 0xb2, 0x10, 0xfd, 0xf0, 0xfb, 0x52, 0xd6, 0xbe, 0x6e, 0x11, 0x0a, 0xf8, 0x07,
0x8a, 0x40, 0x88, 0x4e, 0xe1, 0x54, 0xdc, 0x71, 0x0d, 0x40, 0x1b, 0x97, 0x3d, 0x80, 0xb7, 0x24,
0x83, 0xb3, 0x04, 0x9c, 0xb8, 0xbe, 0xb7, 0x24, 0x68, 0x1d, 0x82, 0xcc, 0x1e, 0xff, 0x46, 0xa9,
0x28, 0xc0, 0x57, 0xbb, 0xcd, 0x39, 0x72, 0x3a, 0xf5, 0x66, 0xa5, 0xe2, 0x23, 0x02, 0xc4, 0x68,
0xc7, 0x70, 0x2f, 0xa7, 0xd3, 0xbc, 0xb0, 0x1b, 0x51, 0x01, 0x78, 0xfc, 0x28, 0x36, 0x0b, 0xde,
0xe4, 0x9a, 0xd3, 0xf8, 0x73, 0x69, 0xab, 0x1e, 0x40, 0xdf, 0x42, 0xac, 0x81, 0x7b, 0xb0, 0x9b,
0x42, 0x8f, 0xf2, 0x94, 0x82, 0x75, 0x1d, 0xd4, 0x98, 0x8b, 0xbc, 0xe9, 0x46, 0x25, 0x47, 0xaf,
0x2c, 0x43, 0x17, 0x1b, 0xbd, 0xf9, 0x59, 0xcc, 0x57, 0x4b, 0x7b, 0xd9, 0x1e, 0x28, 0x41, 0xb8,
0x71, 0x76, 0xb2, 0xea, 0x0d, 0x6d, 0x29, 0xdf, 0xa0, 0x21, 0x5b, 0xa8, 0xd6, 0x3d, 0x70, 0x3b,
0x61, 0x67, 0x25, 0x22, 0xc3, 0x52, 0x6c, 0x3c, 0x72, 0x65, 0xa5, 0x62, 0x99, 0x4f, 0x7f, 0xc0,
0xde, 0xc4, 0xd6, 0xfa, 0x2f, 0x1c, 0xd1, 0x6e, 0x4a, 0xb1, 0x4f, 0x37, 0xcb, 0xc4, 0x42, 0xe2,
0xa6, 0x3c, 0xd9, 0x68, 0xe8, 0x38, 0x03, 0x87, 0x4f, 0xb7, 0x4e, 0x36, 0x11, 0x6d, 0x19, 0x52,
0xb6, 0xa8, 0x4c, 0xb1, 0x12, 0xa3, 0x7e, 0xdb, 0xa2, 0xee, 0x87, 0x28, 0x56, 0xa9, 0xaf, 0x83,
0xcf, 0xf4, 0x6e, 0x46, 0xa3, 0x04, 0xf8, 0x01, 0x81, 0x54, 0x1e, 0x9e, 0xf7, 0xac, 0x74, 0x34,
0xab, 0xa1, 0x67, 0xc3, 0x5d, 0x77, 0x32, 0xda, 0x1c, 0x5b, 0x73, 0x48, 0xe1, 0x53, 0xdd, 0x71,
0x8d, 0x30, 0x6f, 0x47, 0xe0, 0x94, 0x3d, 0xe1, 0x17, 0xd9, 0x34, 0x28, 0xd3, 0xdb, 0x21, 0x53,
0x9e, 0x28, 0xab, 0xe1, 0xd1, 0x6f, 0x2e, 0xd8, 0x9b, 0x9b, 0x53, 0x38, 0x4c, 0x17, 0x03, 0x82,
0x56, 0xa0, 0xe4, 0x16, 0x3a, 0xe0, 0x67, 0x3c, 0x2f, 0x17, 0x02, 0x92, 0x00, 0xc3, 0x94, 0x95,
0x4e, 0x39, 0x74, 0xd5, 0xa2, 0xc5, 0xa5, 0x98, 0x45, 0xbc, 0xd1, 0xf4, 0x2c, 0xdc, 0xb5, 0x7e,
0x50, 0x37, 0xcc, 0x56, 0x61, 0xe5, 0xd5, 0xf0, 0x0d, 0x92, 0x40, 0x2f, 0xcf, 0xe1, 0xf6, 0xf3,
0x90, 0x45, 0x86, 0xcf, 0x20, 0xf4, 0x6c, 0xb9, 0x63, 0x08, 0xfa, 0x0a, 0x75, 0x10, 0x4f, 0xad,
0xac, 0x01, 0x77, 0x4b, 0x65, 0x4d, 0xf3, 0xa1, 0x55, 0x69, 0x7c, 0xc4, 0x1f, 0xf2, 0x6d, 0x39,
0x35, 0x66, 0x86, 0x52, 0x21, 0x13, 0xfc, 0x81, 0x52, 0xb4, 0xad, 0x66, 0x86, 0x65, 0x99, 0xa7,
0xc4, 0xb8, 0x91, 0x44, 0x94, 0xa1, 0xb7, 0xa1, 0x44, 0x3e, 0x92, 0x54, 0x8b, 0xa5, 0x35, 0xe0,
0xa3, 0x0e, 0xfa, 0x08, 0xc6, 0xf5, 0x70, 0xbd, 0x41, 0x44, 0x15, 0x1a, 0xbd, 0x15, 0xd9, 0x8c,
0x37, 0x3b, 0x94, 0xd5, 0x22, 0x05, 0xc5, 0x68, 0xc9, 0xf0, 0xef, 0x07, 0x84, 0x26, 0x48, 0xad,
0x66, 0x49, 0x1c, 0x1b, 0xbd, 0xa1, 0xb1, 0x8c, 0x45, 0x6e, 0xf9, 0x85, 0x89, 0x85, 0x35, 0x65,
0x19, 0xb8, 0xc4, 0x70, 0x9c, 0x0a, 0x78, 0x47, 0x86, 0x65, 0x86, 0x62, 0x63, 0xe2, 0x54, 0xb0,
0xff, 0xc1, 0xd8, 0xfb, 0xf2, 0x63, 0x26, 0xde, 0x5e, 0xda, 0xb3, 0xe8, 0x28, 0xeb, 0x69, 0x3f,
0x73, 0xe7, 0xc6, 0x72, 0xaa, 0xdb, 0x1d, 0xd7, 0x36, 0x49, 0x1c, 0x19, 0xbe, 0xca, 0xe5, 0xec,
0xcf, 0x13, 0xa0, 0x5f, 0xba, 0x4e, 0xde, 0xf0, 0x8d, 0x80, 0xff, 0x1f, 0x7f, 0x5e, 0x07, 0xcc,
0x2c, 0x0a, 0x7b, 0xc9, 0xa6, 0x04, 0x2c, 0xc9, 0x5e, 0x4a, 0x7c, 0xc9, 0xd6, 0x34, 0x4d, 0x29,
0x2f, 0x52, 0x24, 0xa3, 0xe9, 0x3f, 0xd6, 0x74, 0xcb, 0xf0, 0x8f, 0x57, 0xe1, 0xa5, 0x35, 0xe0,
0x97, 0x8e, 0xba, 0xe8, 0x46, 0xa7, 0x07, 0xcf, 0x9f, 0x8b, 0x3b, 0xa9, 0x96, 0x1c, 0xdf, 0x0b,
0x7a, 0x22, 0x0e, 0xfd, 0xbc, 0xa6, 0xaa, 0x8e, 0xb8, 0x3d, 0xd4, 0x65, 0xc4, 0xcd, 0xb8, 0xa7,
0x2e, 0xb4, 0xa6, 0xa4, 0x9c, 0x3c, 0x71, 0x2b, 0x6a, 0x1b, 0x5a, 0x63, 0xe5, 0xcf, 0x1e, 0x50,
0x6d, 0x2e, 0x06, 0x11, 0x3f, 0x63, 0xa4, 0x9d, 0xbf, 0x47, 0xed, 0xe4, 0x34, 0xb5, 0x65, 0x5f,
0xe0, 0xbb, 0x37, 0xd0, 0x6b, 0x88, 0x3b, 0xe9, 0x13, 0x87, 0x65, 0x3f, 0x55, 0x98, 0x42, 0xe2,
0x6f, 0x03, 0x75, 0x48, 0x66, 0x45, 0x58, 0x31, 0x61, 0xe0, 0x68, 0xc3, 0x09, 0x27, 0x47, 0xaa,
0xb4, 0x02, 0x77, 0x4b, 0x65, 0xc5, 0x18, 0xd1, 0x92, 0xd6, 0x5d, 0x09, 0xc6, 0xf5, 0x70, 0x3d,
0xf4, 0x25, 0x05, 0x12, 0xbd, 0x23, 0x44, 0x2d, 0x67, 0x93, 0x44, 0xb3, 0xa0, 0xbb, 0x90, 0x0b,
0xfa, 0x6a, 0xa8, 0xdd, 0x6f, 0x0c, 0xf9, 0x48, 0xd9, 0xda, 0xe0, 0x01, 0x9f, 0x69, 0xaa, 0x9e,
0x3c, 0xbf, 0xd1, 0x74, 0xec, 0x22, 0xb9, 0x96, 0xfc, 0x79, 0xd3, 0xf5, 0x64, 0xa9, 0x8b, 0x8e,
0x38, 0x0b, 0x34, 0x35, 0x8c, 0xd8, 0xc2, 0x22, 0x9b, 0xc2, 0xd7, 0x4c, 0x60, 0x43, 0x9d, 0xa1,
0xd5, 0x3a, 0x10, 0x14, 0x3d, 0x60, 0x27, 0x5c, 0x5f, 0x16, 0xa5, 0x40, 0x4a, 0xbf, 0xfe, 0x22,
0xfa, 0x9c, 0x42, 0xac, 0x10, 0x10, 0x92, 0x1b, 0x02, 0x15, 0x22, 0x1c, 0xb8, 0xee, 0x27, 0x4c,
0xd7, 0x4b, 0xf5, 0x71, 0x82, 0xd0, 0x16, 0x57, 0x5d, 0xe9, 0xec, 0x01, 0x2a, 0x2f, 0xb4, 0xfe,
0x10, 0xa7, 0xde, 0x7e, 0xf3, 0xc6, 0x1a, 0xd6, 0x9c, 0x39, 0x8f, 0xd9, 0x12, 0xb0, 0x8f, 0x08,
0x59, 0x0e, 0x60, 0xbd, 0x85, 0x85, 0xb5, 0x2a, 0x0a, 0x83, 0xeb, 0x83, 0x49, 0x69, 0x96, 0x96,
0x1c, 0xda, 0xb0, 0xe5, 0x94, 0xc8, 0xa5, 0x9f, 0x20, 0xda, 0xad, 0x64, 0xf4, 0x8c, 0x35, 0xd7,
0x6c, 0xdc, 0xb2, 0xe9, 0x31, 0x6d, 0xa9, 0x1f, 0x00, 0x6f, 0xa6, 0xdc, 0xbd, 0xcc, 0x19, 0xf8,
0x91, 0xa6, 0xca, 0xee, 0x14, 0x10, 0xff, 0x4f, 0x28, 0xbe, 0x41, 0x31, 0x55, 0x9b, 0x40, 0x63,
0xe6, 0x82, 0xac, 0x50, 0x22, 0x93, 0x9d, 0x11, 0xa3, 0x98, 0xc4, 0x6d, 0xf0, 0x9b, 0x79, 0x37,
0x6c, 0x91, 0x43, 0x33, 0xdf, 0x9a, 0xc0, 0xa3, 0x46, 0x8c, 0xb5, 0xe4, 0x44, 0x2d, 0xc9, 0x6f,
0xf8, 0x26, 0x15, 0x17, 0x38, 0x60, 0xa7, 0x1c, 0xff, 0x71, 0x23, 0x8c, 0x40, 0x02, 0x55, 0xb5,
0xa2, 0xc1, 0xd8, 0x7b, 0xed, 0x18, 0x3a, 0x56, 0x5c, 0x19, 0x7f, 0x51, 0xcc, 0x12, 0x7c, 0xc1,
0xe5, 0x91, 0x50, 0xba, 0x8a, 0xb9, 0x93, 0x0a, 0x7a, 0x6b, 0x01, 0x9d, 0xf8, 0x40, 0xee, 0x74,
0xbb, 0xc1, 0xd2, 0x77, 0x6e, 0x88, 0xbb, 0xa6, 0x44, 0xf5, 0x8e, 0xb4, 0x0c, 0xa1, 0xef, 0x1a,
0x02, 0xee, 0x66, 0x3c, 0x26, 0xd8, 0x22, 0x52, 0xde, 0xd8, 0x5f, 0xc1, 0x4b, 0x85, 0xb5, 0x2a,
0x19, 0xb7, 0xbd, 0xf3, 0x2d, 0xeb, 0x68, 0xbf, 0xa0, 0x43, 0x1b, 0x9a, 0xf7, 0x41, 0x57, 0xb4,
0xdb, 0x94, 0x4e, 0x3b, 0x54, 0x99, 0xc3, 0xa2, 0xc6, 0xcc, 0x55, 0x34, 0x50, 0x62, 0x24, 0x72,
0x4e, 0x5e, 0x2e, 0xb7, 0x5b, 0x8d, 0x09, 0xca, 0x3a, 0x4a, 0x9b, 0x59, 0x0d, 0xe4, 0xd5, 0x70,
0xd1, 0x70, 0x30, 0x27, 0xd3, 0xae, 0x83, 0x33, 0x2e, 0x60, 0x87, 0x53, 0x5c, 0x53, 0xdc, 0xf1,
0x0d, 0x62, 0xdf, 0xef, 0xbf, 0x66, 0x26, 0xdf, 0x23, 0xcf, 0x59, 0xb8, 0x8e, 0x5f, 0x0f, 0xaa,
0x2a, 0xf2, 0x74, 0xcb, 0xf0, 0x07, 0xfa, 0xc9, 0x99, 0x24, 0xd9, 0xe9, 0xf6, 0xad, 0x28, 0xdf,
0x67, 0xcf, 0x59, 0xb8, 0x8e, 0xe6, 0x32, 0x4a, 0xaa, 0x7f, 0xe1, 0x01, 0x3a, 0xe7, 0x6a, 0xbe,
0xe2, 0x12, 0x8f, 0xda, 0x39, 0x71, 0xaf, 0x18, 0x01, 0x2e, 0x9b, 0x4c, 0xd0, 0x8e, 0xc2, 0x21,
0xfe, 0x9c, 0x42, 0xac, 0xa0, 0xfc, 0x6e, 0xbb, 0x34, 0xc6, 0xd5, 0xfa, 0xad, 0x78, 0xa9, 0x8e,
0xb8, 0x40, 0x6f, 0xa5, 0x14, 0x2c, 0xc4, 0x6b, 0x6c, 0xac, 0x4a, 0x97, 0xfb, 0xc0, 0x97, 0x14,
0xfb, 0xd3, 0xc0, 0x8d, 0x30, 0xef, 0x5e, 0xb5, 0xa4, 0x81, 0xb8, 0xeb, 0x06, 0xd8, 0x33, 0x5f,
0xea, 0x2f, 0x89, 0x50, 0x10, 0x5e, 0x16, 0xd1, 0x29, 0x48, 0x9c, 0xd9, 0x9e, 0xe1, 0x6a, 0x38,
0x47, 0x78, 0x34, 0x22, 0xe9, 0xd2, 0xac, 0x9c, 0xc7, 0xff, 0x71, 0x44, 0x64, 0x44, 0x58, 0xb1,
0x07, 0xde, 0xe1, 0xcb, 0xd5, 0xc0, 0xa7, 0x19, 0x0d, 0x1e, 0x81, 0xcc, 0x4f, 0x7f, 0x06, 0x49,
0x6d, 0xea, 0x6b, 0xc1, 0x0a, 0xa7, 0x07, 0x4a, 0xb1, 0x34, 0x0e, 0xb1, 0x12, 0xab, 0x85, 0x0b,
0xcb, 0xc4, 0x56, 0x0d, 0x70, 0x8f, 0x0e, 0x4d, 0xf6, 0x2b, 0x0b, 0x11, 0x71, 0x8e, 0x0e, 0x4d,
0x6b, 0xeb, 0x6b, 0x41, 0xca, 0x87, 0x37, 0x62, 0xb5, 0xb2, 0xcf, 0xd0, 0x52, 0x7e, 0x86, 0x89,
0xd3, 0xfa, 0x73, 0x45, 0x64, 0xc4, 0x18, 0xd1, 0xe2, 0x56, 0x1d, 0xa9, 0xe6, 0xc8, 0xab, 0x9b,
0x56, 0xbe, 0x51, 0xb4, 0xdb, 0x4d, 0xe9, 0x7a, 0xc5, 0xf6, 0xed, 0x06, 0x75, 0x91, 0x0f, 0x4d,
0xed, 0xab, 0xcb, 0x71, 0x72, 0xdb, 0x9d, 0x97, 0x80, 0xa7, 0xc5, 0xd5, 0xcc, 0xc5, 0xa5, 0x98,
0xd3, 0xfe, 0x71, 0x44, 0xa0, 0x21, 0x77, 0xc1, 0x13, 0x84, 0x36, 0x2a, 0x55, 0x4d, 0xd4, 0x73,
0x1c, 0x2e, 0x09, 0x37, 0x9b, 0xad, 0x39, 0xe2, 0xb2, 0x8c, 0xba, 0xe8, 0x72, 0x98, 0x13, 0xcf,
0x77, 0x4b, 0x1b, 0x99, 0xfe, 0x11, 0x02, 0x04, 0xe7, 0x4b, 0x9b, 0x6e, 0x6f, 0xda, 0x1d, 0xd7,
0xc6, 0x57, 0x9d, 0x69, 0x46, 0x78, 0xa3, 0x97, 0x24, 0xb9, 0xd4, 0xf5, 0x7b, 0x1d, 0xd1, 0x6e,
0x3c, 0x33, 0x0f, 0x97, 0x7b, 0xd0, 0x22, 0xd4, 0x4c, 0x97, 0xbd, 0x59, 0x5e, 0x41, 0xda, 0xf0,
0x70, 0x0e, 0x79, 0xff, 0xf7, 0xdb, 0x30, 0x5e, 0xf4, 0x2f, 0x89, 0xd0, 0x51, 0x7e, 0x06, 0xc9,
0x41, 0x4a, 0x9b, 0x59, 0x5e, 0x41, 0x5a, 0xb0, 0x98, 0x5e, 0xa1, 0xeb, 0x35, 0x3d, 0xcc, 0x6f,
0xbb, 0x6d, 0xaa, 0x67, 0x43, 0x79, 0x23, 0x57, 0x68, 0xe9, 0x6c, 0xc1, 0x0a, 0x15, 0x90, 0x1a,
0x42, 0x5e, 0x82, 0x4c, 0xe2, 0x12, 0xfc, 0x81, 0xd5, 0xc5, 0x8d, 0x46, 0xe3, 0x04, 0xf8, 0x01,
0x90, 0x55, 0x1e, 0x9e, 0x77, 0x6c, 0x54, 0xc4, 0x73, 0xc5, 0x35, 0xaa, 0x12, 0xbd, 0x11, 0x4b,
0x5a, 0x1b, 0xcc, 0x81, 0xea, 0x17, 0xff, 0x86, 0x53, 0xb4, 0x4e, 0xb6, 0xdb, 0x4d, 0x69, 0x3a,
0x59, 0x66, 0xa5, 0x62, 0xd9, 0xbd, 0x7c, 0x30, 0x2d, 0xe0, 0xc7, 0xf3, 0x4e, 0xeb, 0xe8, 0xff,
0x10, 0x66, 0x5e, 0x2e, 0x4f, 0x0a, 0xc8, 0x83, 0x56, 0x37, 0x05, 0x16, 0xab, 0xdf, 0x69, 0x3c,
0xf4, 0xa7, 0xc5, 0x72, 0x71, 0xdb, 0x1d, 0xd7, 0x87, 0x09, 0xfc, 0x89, 0x06, 0x8d, 0x19, 0xb5,
0x2b, 0x08, 0x1c, 0xfb, 0x79, 0x1c, 0xd1, 0xee, 0xf8, 0x93, 0x3f, 0x2f, 0x4f, 0x70, 0xe2, 0x03,
0xd6, 0x94, 0xdd, 0x7e, 0x72, 0x46, 0xda, 0xf6, 0x0c, 0x62, 0xdf, 0x6f, 0xef, 0x5a, 0x70, 0x37,
0x5c, 0x25, 0x0a, 0x13, 0xb1, 0x23, 0x44, 0xad, 0x58, 0x56, 0x6d, 0x4b, 0x81, 0x95, 0x3d, 0xe1,
0x35, 0x7c, 0xb8, 0xe8, 0xab, 0x2d, 0x49, 0xaf, 0xa8, 0x13, 0x15, 0x8b, 0x85, 0xb3, 0x97, 0xa5,
0xd6, 0xfd, 0x12, 0x84, 0xf4, 0x80, 0xbb, 0xa5, 0x3f, 0xbd, 0x52, 0x34, 0xcc, 0x10, 0x5f, 0xd2,
0x1e, 0x72, 0xd7, 0x19, 0x1b, 0x21, 0x67, 0xac, 0xa7, 0xbf, 0x89, 0xab, 0x15, 0x24, 0xed, 0x9b,
0x42, 0x8d, 0xcd, 0x14, 0x6b, 0x95, 0x8d, 0x8c, 0x47, 0x3b, 0x93, 0x55, 0x4c, 0x54, 0xe1, 0x70,
0x47, 0xb0, 0x50, 0x37, 0x9b, 0x2d, 0x79, 0xc2, 0xa0, 0x84, 0x36, 0xaa, 0x15, 0x2d, 0xc4, 0xeb,
0xaf, 0x8f, 0x3a, 0x9f, 0x77, 0x6c, 0xd4, 0x04, 0x93, 0x56, 0xf7, 0x1e, 0x67, 0x93, 0x0c, 0xcc,
0xa7, 0x8b, 0x3b, 0x29, 0x96, 0x5d, 0x00, 0x03, 0x20, 0x54, 0x9e, 0x5e, 0x57, 0xc1, 0x5f, 0xc0,
0x25, 0x80, 0xbc, 0xea, 0x32, 0xed, 0x69, 0x3f, 0x70, 0x76, 0xc7, 0x02, 0xa9, 0x77, 0x2f, 0xde,
0x65, 0x0f, 0xf9, 0x88, 0x06, 0x0a, 0x59, 0xd5, 0x6b, 0x5c, 0x72, 0xc9, 0xa1, 0xb5, 0x8d, 0x89,
0x0a, 0x2f, 0x99, 0x55, 0xe5, 0xd0, 0x9f, 0x90, 0x3d, 0x88, 0xb7, 0x65, 0xb2, 0x31, 0xce, 0xe7,
0xf3, 0x98, 0x54, 0x38, 0xd2, 0xd9, 0xa3, 0x12, 0xcc, 0x0d, 0x2a, 0x9d, 0xdc, 0xbe, 0x16, 0x54,
0x2e, 0xbc, 0xc2, 0xf1, 0x8a, 0xab, 0x88, 0x0f, 0xcc, 0x0e, 0x29, 0x9d, 0xd8, 0x3e, 0x56, 0xb4,
0xab, 0xaf, 0x96, 0x4b, 0xa5, 0xd5, 0xbc, 0xa1, 0x6d, 0x7d, 0x32, 0x24, 0xd4, 0x0c, 0xc0, 0x93,
0x78, 0x6d, 0xfa, 0x85, 0x08, 0x45, 0x55, 0x35, 0xaa, 0x74, 0x5e, 0x43, 0x46, 0xd6, 0xa2, 0x12,
0xc0, 0x0d, 0x2a, 0x9d, 0x1f, 0x7e, 0xb6, 0xa4, 0xc0, 0x79, 0xd1, 0xf4, 0x76, 0xf8, 0xee, 0xfe,
0x08, 0x17, 0x7d, 0x4e, 0xdf, 0x82, 0xb9, 0xa1, 0x57, 0xbc, 0x52, 0xb4, 0x58, 0x8d, 0x89, 0x8a,
0x19, 0x3a, 0x93, 0xd5, 0x5c, 0x20, 0x4a, 0xa8, 0x2b, 0x42, 0x17, 0x9b, 0x7d, 0x51, 0xe2, 0xf4,
0x1f, 0xd1, 0x60, 0xbf, 0xdb, 0x4b, 0x68, 0x3a, 0x90, 0x66, 0x25, 0xa2, 0xaa, 0xb2, 0xbc, 0xa4,
0x39, 0x3d, 0x12, 0x94, 0xae, 0x35, 0xfd, 0x84, 0xb1, 0x75, 0xae, 0x66, 0x46, 0xf9, 0xe3, 0xf7,
0xf3, 0x91, 0xc0, 0x6f, 0x6f, 0x60, 0xda, 0x07, 0x54, 0x55, 0xfd, 0x0e, 0xc9, 0xe3, 0x64, 0x3d,
0xef, 0x57, 0xe6, 0xf2, 0x73, 0x16, 0xd2, 0xef, 0x24, 0x12, 0xff, 0x0f, 0x86, 0x8f, 0x0e, 0x4d,
0x54, 0xaa, 0x4b, 0x31, 0x8c, 0x26, 0xfa, 0x83, 0x6d, 0x34, 0x0e, 0x96, 0xf8, 0x44, 0x76, 0xc4,
0x6d, 0x35, 0x91, 0x5a, 0x57, 0x11, 0x7f, 0x40, 0xf5, 0x54, 0x21, 0x22, 0xea, 0x1f, 0x46, 0xac,
0x67, 0xf3, 0x74, 0x4b, 0xfd, 0x55, 0xdd, 0x71, 0xcd, 0xc0, 0xdb, 0xf7, 0xcc, 0x28, 0xcb, 0xee,
0x38, 0x46, 0x05, 0x8f, 0x61, 0x82, 0x34, 0x65, 0x34, 0xb8, 0xc4, 0x70, 0xd4, 0xcb, 0x18, 0x57,
0xdc, 0x87, 0x2a, 0x11, 0x82, 0xe3, 0x45, 0xad, 0xd2, 0x43, 0x97, 0xdb, 0x1d, 0x1f, 0x0e, 0x58,
0xe1, 0x5e, 0x1e, 0xa0, 0x01, 0xff, 0xf6, 0x84, 0x83, 0xe0, 0x38, 0x26, 0x71, 0x1c, 0x81, 0x43,
0x25, 0x31, 0x80, 0x52, 0xda, 0x53, 0xdc, 0x71, 0x4d, 0x00, 0xfb, 0x87, 0xf3, 0x39, 0xd2, 0x65,
0xe3, 0x5d, 0x1d, 0x20, 0x44, 0x1a, 0x01, 0xcc, 0x67, 0xde, 0xb1, 0xe9, 0x13, 0xed, 0x69, 0x3f,
0x1f, 0xb2, 0x3f, 0x32, 0x73, 0x9b, 0x40, 0x63, 0xe6, 0x82, 0xac, 0xd0, 0x62, 0xf3, 0xcd, 0x69,
0xb4, 0x32, 0x8f, 0x57, 0x5b, 0xbe, 0x5e, 0xc0, 0xb5, 0xb4, 0x51, 0xba, 0xf8, 0x39, 0x53, 0xaa,
0xda, 0x97, 0xcd, 0xfb, 0x07, 0xe9, 0xeb, 0xfe, 0xbf, 0x02, 0x27, 0x1e, 0xc1, 0x1e, 0xc6, 0x6c,
0x47, 0x83, 0xbc, 0x67, 0x19, 0x31, 0xce, 0x67, 0x64, 0x9d, 0xbd, 0xf0, 0xde, 0x8e, 0x3f, 0x6f,
0xf8, 0xa6, 0xd5, 0xf7, 0x8b, 0xa8, 0x8b, 0x0e, 0xc7, 0x0e, 0xa9, 0xdd, 0x3e, 0x6e, 0xae, 0x98,
0xc1, 0x10, 0x53, 0xa4, 0xd4, 0xbc, 0xb0, 0x1b, 0x5f, 0x1e, 0x81, 0x4c, 0x60, 0x44, 0x9d, 0xa1,
0x45, 0x8c, 0xb5, 0x64, 0x8f, 0xcc, 0x99, 0x97, 0x8c, 0xec, 0x3a, 0xa5, 0x32, 0xfc, 0x71, 0x3b,
0xa1, 0x73, 0x5f, 0x42, 0x4c, 0x17, 0x02, 0x02, 0x96, 0x24, 0x09, 0x8e, 0x9b, 0x77, 0x33, 0x75,
0x4b, 0x01, 0x7b, 0x47, 0x3d, 0x29, 0x4a, 0x21, 0x55, 0x49, 0x8c, 0x4c, 0x7f, 0x92, 0xbc, 0x21,
0xd6, 0x09, 0xac, 0x5c, 0xfe, 0xce, 0x1e, 0xd0, 0x1d, 0xe6, 0x7a, 0xd9, 0x5e, 0xf1, 0x4e, 0x28,
0x0c, 0x62, 0xa7, 0xe3, 0x19, 0x21, 0x8f, 0x18, 0x01, 0x6e, 0x26, 0x1c, 0xe9, 0x9e, 0x86, 0x8c,
0x87, 0x6e, 0xf9, 0x05, 0x22, 0x64, 0x25, 0x5d, 0xb0, 0x7a, 0x63, 0x40, 0xd2, 0xd7, 0x22, 0x52,
0x5e, 0x98, 0xbf, 0x71, 0xb8, 0xee, 0xef, 0xd7, 0x9c, 0x39, 0x8f, 0xd9, 0x56, 0x4c, 0x58, 0x18,
0x01, 0xee, 0x66, 0x3c, 0x80, 0x16, 0x02, 0x82, 0x4a, 0x34, 0x8e, 0x56, 0xdb, 0xc0, 0x26, 0xd0,
0x1d, 0xb8, 0xc2, 0xf9, 0x2e, 0x31, 0xe7, 0x9e, 0x50, 0x8f, 0xaf, 0xe4, 0x29, 0x6c, 0x29, 0xdf,
0x20, 0x26, 0x96, 0xb8, 0x8e, 0x69, 0x0f, 0x2a, 0x0a, 0x62, 0x07, 0x23, 0x39, 0xb6, 0xab, 0xfc,
0x8f, 0xaf, 0x61, 0x5e, 0xfa, 0x0e, 0xde, 0x80, 0x55, 0x1e, 0x11, 0xf6, 0xce, 0x68, 0x0b, 0x5e,
0x60, 0x15, 0xa6, 0x40, 0xa7, 0x97, 0xa2, 0xa2, 0xc6, 0xc7, 0xad, 0x04, 0x55, 0xa4, 0xa5, 0x8d,
0xc5, 0x86, 0x37, 0x25, 0x54, 0xc0, 0xef, 0xa3, 0x3a, 0x3c, 0x12, 0x94, 0xfc, 0xd0, 0xb3, 0x14,
0xfb, 0x29, 0x9a, 0x4d, 0xe0, 0xc2, 0x25, 0x51, 0x5d, 0x10, 0x28, 0x81, 0xea, 0xe5, 0xba, 0x16,
0x5e, 0x59, 0x04, 0x1d, 0xb8, 0x65, 0xe7, 0x6c, 0x37, 0x83, 0x31, 0xa7, 0xa5, 0x3c, 0x51, 0x2b,
0x6a, 0x0b, 0x2c, 0x83, 0x69, 0x57, 0x76, 0xe6, 0xbc, 0x4d, 0x7a, 0x58, 0xde, 0x88, 0x22, 0xb0,
0x2d, 0xf8, 0x1c, 0x7b, 0xcd, 0x09, 0x5b, 0xc6, 0x34, 0x2f, 0x19, 0x7a, 0x94, 0x09, 0xdb, 0x06,
0x14, 0xef, 0xc1, 0x0e, 0xe2, 0x62, 0x84, 0x1d, 0xff, 0x64, 0xfe, 0x6c, 0x99, 0x8a, 0x98, 0xa7,
0x75, 0x7d, 0x52, 0xa4, 0x89, 0xe1, 0x65, 0xbb, 0xac, 0xfb, 0x71, 0x4a, 0xe5, 0x79, 0xd2, 0x11,
0xfd, 0x64, 0xae, 0x0d, 0x3c, 0xe2, 0xe4, 0x7d, 0xcf, 0x99, 0x8f, 0xc6, 0x63, 0xf4, 0x4c, 0x29,
0xe4, 0x23, 0x87, 0xd3, 0xa1, 0x63, 0xa9, 0x99, 0x76, 0xbf, 0xd1, 0xf4, 0x30, 0x68, 0x2b, 0x5e,
0xe0, 0x81, 0x2b, 0x10, 0x02, 0x23, 0x65, 0xbd, 0x3c, 0x07, 0xf5, 0x8a, 0x05, 0x95, 0xc0, 0x25,
0x1b, 0x5c, 0x22, 0x1c, 0x44, 0xde, 0x66, 0x3c, 0x25, 0x26, 0x07, 0x92, 0xf4, 0x0a, 0xf6, 0x85,
0xc3, 0xc5, 0xd4, 0x76, 0x6a, 0x08, 0xfb, 0x86, 0x40, 0x74, 0xb0, 0xe6, 0x03, 0x6c, 0x89, 0x1f,
0x80, 0xff, 0x1e, 0xfc, 0x5a, 0xa6, 0x2a, 0x4e, 0xe6, 0x6a, 0x29, 0xa1, 0x7a, 0x57, 0x28, 0x44,
0xe7, 0x25, 0x86, 0x52, 0xe1, 0xa4, 0xbe, 0x11, 0x0d, 0x68, 0x1e, 0x9d, 0xfc, 0x3e, 0x56, 0x34,
0x6b, 0x19, 0x2c, 0x03, 0xa9, 0xee, 0x06, 0x2e, 0x68, 0x1a, 0x6b, 0x63, 0x59, 0x9f, 0x1c, 0x60,
0xe5, 0x5d, 0xac, 0x50, 0xe2, 0x03, 0x79, 0x41, 0xf4, 0xa4, 0x46, 0x32, 0xcd, 0x5b, 0xe0, 0xf3,
0x92, 0xd0, 0xe0, 0x7f, 0xe7, 0x59, 0xf8, 0x76, 0x4c, 0xdf, 0x6e, 0xd7, 0x5b, 0xf0, 0x4e, 0xa8,
0xb8, 0xc2, 0x57, 0xbb, 0x8d, 0x67, 0x72, 0x2a, 0x6a, 0x12, 0x04, 0x93, 0xfd, 0xc3, 0x94, 0x15,
0x7b, 0x89, 0x42, 0x3d, 0xc8, 0xff, 0x5e, 0xd2, 0x9e, 0x31, 0xf8, 0xe9, 0xb6, 0x3f, 0xab, 0x0f,
0x38, 0xdb, 0x44, 0xad, 0x38, 0x3a, 0xd0, 0x6b, 0x4a, 0x80, 0x70, 0x57, 0xdb, 0x00, 0xfa, 0x00,
0x14, 0x94, 0x3e, 0x2e, 0xcb, 0x5a, 0x60, 0x33, 0x58, 0xa1, 0xc6, 0xf3, 0x84, 0x2a, 0x4a, 0xaf,
0x98, 0xe3, 0xd9, 0xfb, 0x3d, 0x69, 0xab, 0x9e, 0x54, 0xf5, 0x73, 0xc4, 0x0f, 0x22, 0xcf, 0x69,
0x89, 0x72, 0x4f, 0x27, 0xbb, 0x9c, 0x21, 0x63, 0x32, 0x2e, 0x8c, 0x50, 0x95, 0x1d, 0x7e, 0x41,
0x75, 0x23, 0xc6, 0x82, 0x37, 0x47, 0x7a, 0x36, 0xd6, 0x61, 0x08, 0x23, 0x39, 0x3f, 0xea, 0x9c,
0x77, 0x3f, 0x71, 0xd4, 0x87, 0x6e, 0x2d, 0xd8, 0x21, 0x28, 0x3a, 0x38, 0xac, 0x99, 0xa3, 0xa2,
0xc6, 0xc4, 0x80, 0x24, 0xd2, 0x9d, 0x43, 0x63, 0x9f, 0x6d, 0xac, 0xe0, 0x26, 0xef, 0x6e, 0xb8,
0x31, 0x68, 0xb7, 0xfa, 0x6d, 0x69, 0x8a, 0x0e, 0x73, 0x9b, 0x43, 0xad, 0x90, 0xea, 0xb1, 0x0b,
0xfa, 0x9d, 0x5b, 0xad, 0x10, 0xfa, 0xc8, 0x7b, 0xd2, 0x06, 0x19, 0x06, 0xc3, 0x10, 0xc9, 0x8d,
0x09, 0x70, 0xd3, 0x75, 0xec, 0xfc, 0xd5, 0x16, 0x82, 0xd9, 0xe4, 0x7d, 0xe8, 0x96, 0xbf, 0x26,
0xce, 0x1d, 0x82, 0x4c, 0x60, 0x1e, 0x80, 0xe1, 0xf5, 0x87, 0x5a, 0x38, 0xce, 0x6d, 0x1d, 0x32,
0x5f, 0xe0, 0xe8, 0x03, 0x29, 0xb7, 0x8f, 0x8e, 0x0c, 0xfb, 0xf3, 0x05, 0xa4, 0x10, 0x88, 0x8d,
0x76, 0x64, 0x26, 0xa5, 0x94, 0xb7, 0x39, 0xcb, 0x1a, 0xe4, 0x79, 0x59, 0x1e, 0x91, 0x1e, 0x50,
0x1d, 0xa8, 0xcc, 0x71, 0x72, 0x5b, 0x19, 0xe7, 0xea, 0xe0, 0x5c, 0xb8, 0x0e, 0x31, 0xbd, 0xfa,
0x3c, 0xb3, 0xbf, 0xee, 0xbf, 0xed, 0x66, 0xbf, 0xb1, 0x87, 0xb5, 0x6a, 0xf5, 0x85, 0xc7, 0x17,
0xfc, 0x79, 0xe3, 0xfd, 0xc6, 0x9b, 0x28, 0xde, 0xb0, 0x47, 0x97, 0x58, 0xdb, 0x51, 0x5f, 0xb0,
0xad, 0x48, 0xca, 0x8b, 0x05, 0x55, 0xf4, 0x85, 0x39, 0x40, 0xf0, 0x06, 0xb3, 0xe2, 0xeb, 0xfd,
0x92, 0xd7, 0x5d, 0x3e, 0xc7, 0x8e, 0xcc, 0x12, 0x7e, 0xe8, 0x43, 0xad, 0x10, 0x10, 0x92, 0x1b,
0x42, 0xde, 0xc2, 0xec, 0x12, 0xeb, 0xe8, 0x7f, 0xd0, 0x47, 0xce, 0x66, 0x73, 0x87, 0x11, 0xe7,
0x6a, 0xa0, 0x3c, 0xa8, 0xa6, 0xde, 0xef, 0x7b, 0xcf, 0xf6, 0x6d, 0xc6, 0xa3, 0x7c, 0xe3, 0x09,
0xf9, 0x2a, 0xa4, 0x5d, 0x58, 0x7c, 0xdc, 0x00, 0x55, 0x54, 0x7d, 0xce, 0x0e, 0xf3, 0xec, 0x79,
0xd1, 0x46, 0x4e, 0xa6, 0x93, 0x4e, 0xb3, 0x8b, 0x3a, 0xd0, 0xb4, 0xe5, 0x34, 0xbd, 0x48, 0xbf,
0x30, 0xa6, 0x59, 0xda, 0x4a, 0xb0, 0x8d, 0x88, 0x49, 0xf7, 0xed, 0x05, 0x40, 0x64, 0x25, 0xdd,
0x63, 0x7f, 0x3b, 0xa8, 0x11, 0xa5, 0x13, 0x4b, 0x5a, 0xa2, 0xd7, 0x21, 0x2a, 0x23, 0x48, 0xac,
0xb0, 0x83, 0x37, 0x2b, 0xd5, 0x84, 0x9d, 0xf3, 0x8e, 0x29, 0xa3, 0xbf, 0x17, 0xb8, 0x8c, 0x0a,
0x7e, 0xda, 0x63, 0x3d, 0x0c, 0x46, 0x60, 0x32, 0x69, 0x98, 0xc6, 0xf3, 0x31, 0x23, 0x74, 0x5f,
0xe0, 0xaf, 0x49, 0x30, 0x62, 0x55, 0xde, 0xf3, 0x08, 0x10, 0x00, 0x8f, 0xff, 0x9b, 0x98, 0xf5,
0xc7, 0xe1, 0x5e, 0xbf, 0x07, 0x1f, 0x6f, 0x5a, 0xe5, 0x56, 0x2b, 0x20, 0xba, 0xe7, 0x5a, 0xcc,
0x17, 0xe5, 0x79, 0x59, 0x9e, 0x51, 0xfe, 0x80, 0x9a, 0xb4, 0x4e, 0x36, 0x4b, 0x48, 0x22, 0x62,
0x66, 0xc2, 0x8c, 0xe0, 0x9a, 0xd9, 0x2f, 0xd8, 0x21, 0x7f, 0xfa, 0x98, 0xee, 0x0b, 0xf9, 0x84,
0x51, 0x35, 0x8e, 0x56, 0x5b, 0x49, 0x83, 0x60, 0xa1, 0xdc, 0x6c, 0x40, 0x4a, 0xbe, 0xbf, 0x82,
0xd1, 0x4c, 0x90, 0xd6, 0x9b, 0x78, 0xa3, 0x68, 0x49, 0x82, 0xbc, 0x67, 0x84, 0x0c, 0xf9, 0x87,
0xc8, 0x75, 0x2e, 0x26, 0x53, 0x8d, 0x23, 0xe3, 0xb6, 0xca, 0x78, 0x48, 0x5e, 0x95, 0x3d, 0xe1,
0xb5, 0x9d, 0xd4, 0x78, 0xee, 0xc9, 0x1b, 0xd6, 0xd8, 0x49, 0x9a, 0x59, 0xe2, 0x99, 0xbd, 0xa0,
0x3d, 0x8c, 0xb4, 0xe4, 0xb4, 0x3d, 0x6b, 0x2f, 0x68, 0x2b, 0xac, 0x43, 0x49, 0x2b, 0xfe, 0xa2,
0x46, 0xfc, 0x92, 0xd4, 0x1c, 0x51, 0x33, 0x38, 0x6d, 0xe6, 0xe5, 0x02, 0x29, 0xb7, 0x8f, 0x0e,
0xfb, 0x1b, 0x83, 0x4d, 0x60, 0x42, 0x59, 0x31, 0xb5, 0xa0, 0xc8, 0xf3, 0x2d, 0xeb, 0x68, 0x3f,
0xf0, 0x09, 0xe7, 0xf2, 0x71, 0x6b, 0x09, 0x4f, 0x1e, 0x6b, 0xab, 0xe1, 0x9a, 0x61, 0x6f, 0x28,
0x29, 0x62, 0x08, 0x13, 0x54, 0xe3, 0x64, 0x3d, 0x6f, 0x17, 0xc6, 0x82, 0xa9, 0x47, 0x7b, 0x46,
0xd6, 0x25, 0x06, 0x12, 0xc1, 0xf2, 0xa5, 0x0d, 0x77, 0xdb, 0xbd, 0xfd, 0xa8, 0x1a, 0x45, 0xce,
0x1b, 0xcb, 0xdb, 0x79, 0x6e, 0x59, 0xde, 0xf6, 0xac, 0x91, 0xc0, 0xef, 0xaf, 0xc0, 0xea, 0xef,
0x48, 0x53, 0x80, 0xcf, 0x92, 0x72, 0x2c, 0xd9, 0x21, 0x7c, 0x7a, 0x58, 0xde, 0xbb, 0x7d, 0x30,
0x2d, 0x60, 0x87, 0x53, 0xee, 0x13, 0x7c, 0xc1, 0x35, 0xf4, 0xb5, 0x7a, 0xad, 0xc9, 0xba, 0xa6,
0xbf, 0x3d, 0x92, 0x54, 0x5c, 0x41, 0x1e, 0xe0, 0x5f, 0x59, 0x74, 0xc8, 0xdb, 0xb5, 0x8d, 0x89,
0x39, 0xae, 0xce, 0x15, 0xc4, 0x20, 0x47, 0xac, 0xa7, 0xb3, 0x54, 0xbb, 0xd0, 0x39, 0xd3, 0xea,
0x8a, 0x3c, 0xbd, 0x7f, 0x27, 0x86, 0x1b, 0x56, 0x28, 0xe9, 0xec, 0x81, 0xea, 0x99, 0x7b, 0xb6,
0xec, 0x01, 0x17, 0x9b, 0x7a, 0x41, 0x57, 0x34, 0xeb, 0xd1, 0x27, 0x93, 0xc1, 0x43, 0x75, 0x45,
0x9c, 0x65, 0xa6, 0x62, 0xd9, 0x7e, 0x7f, 0x30, 0x6d, 0x67, 0xf0, 0x23, 0x39, 0xe4, 0x5f, 0xbc,
0x1f, 0x83, 0x3b, 0x2a, 0x4f, 0x9d, 0xc1, 0x23, 0x06, 0xe6, 0x3d, 0xcc, 0x20, 0xa2, 0x09, 0xc9,
0x61, 0x4a, 0x9b, 0x59, 0xde, 0x99, 0x23, 0xb0, 0x2d, 0x89, 0xdc, 0x9b, 0x7d, 0xeb, 0x15, 0xe4,
0xe3, 0x8d, 0x59, 0xb8, 0x1d, 0x78, 0xb3, 0x9a, 0xc2, 0x4e, 0xd2, 0x64, 0xb4, 0x4c, 0xf8, 0x07,
0xbb, 0xd5, 0xde, 0x7e, 0xe7, 0x17, 0x3b, 0x56, 0x5c, 0xee, 0xb4, 0x01, 0x2a, 0xec, 0xe3, 0xfe,
0x80, 0x15, 0x83, 0xce, 0x26, 0xf2, 0xec, 0xf9, 0xd6, 0x03, 0x27, 0x9e, 0x2f, 0xfe, 0xf6, 0x84,
0x53, 0x05, 0x79, 0xc6, 0xb2, 0x34, 0xcd, 0xe9, 0x09, 0x5a, 0x83, 0x2f, 0xcf, 0x13, 0xdc, 0x13,
0x02, 0x98, 0xc4, 0xed, 0xb0, 0xc0, 0x6a, 0x2f, 0xa8, 0xa3, 0xe8, 0x03, 0x75, 0xe7, 0xea, 0xfe,
0x10, 0x65, 0xde, 0xee, 0xef, 0xaa, 0xa9, 0x1f, 0x2f, 0x5f, 0xa1, 0xdc, 0x18, 0x1e, 0x0f, 0xd8,
0x61, 0x4e, 0xfa, 0x88, 0x49, 0xc5, 0x95, 0x95, 0x3b, 0x88, 0x73, 0x55, 0x5c, 0x13, 0xc7, 0x80,
0x45, 0x70, 0xb4, 0x66, 0x72, 0x8c, 0xb9, 0xa7, 0x44, 0x3d, 0xf0, 0x94, 0x7c, 0xb4, 0x38, 0xc4,
0x35, 0xc5, 0x56, 0x3a, 0x4d, 0xc9, 0x96, 0x12, 0x96, 0x58, 0xa4, 0xdd, 0x18, 0x36, 0xf2, 0x18,
0x01, 0xf0, 0x63, 0x2c, 0x10, 0x1a, 0x61, 0xb3, 0xf9, 0xc0, 0xd8, 0x7b, 0xed, 0x99, 0x7a, 0xb6,
0x6c, 0x41, 0x77, 0xcb, 0xce, 0xf5, 0x6d, 0x39, 0x71, 0x97, 0x06, 0x22, 0xb9, 0x4d, 0xa4, 0x8c,
0x77, 0x3b, 0xf4, 0x85, 0xed, 0x04, 0x75, 0xc5, 0x33, 0x77, 0x75, 0xda, 0x1d, 0x72, 0x97, 0x18,
0x81, 0x59, 0xfa, 0x9c, 0xe8, 0x82, 0xb8, 0x24, 0x01, 0x1d, 0x82, 0x4c, 0xe0, 0x0c, 0xe1, 0x91,
0xbd, 0x48, 0x97, 0xd5, 0xa1, 0x30, 0x4f, 0x28, 0xe9, 0x6a, 0x8b, 0xb3, 0x91, 0xf2, 0xcc, 0x8b,
0xc6, 0xfa, 0xf3, 0x05, 0xc4, 0x9f, 0x3c, 0x4d, 0x67, 0xac, 0xa5, 0x61, 0xdb, 0x4f, 0xde, 0xf0,
0x8d, 0xaa, 0x52, 0xdf, 0x47, 0x6e, 0x0e, 0x58, 0xe1, 0xeb, 0xaa, 0x50, 0x62, 0x43, 0x59, 0x31,
0xe9, 0xa0, 0x48, 0xb3, 0x11, 0xb2, 0xac, 0xfb, 0x0e, 0x16, 0xfd, 0x8e, 0x6e, 0xd2, 0x96, 0x95,
0x5f, 0x39, 0x74, 0x55, 0x22, 0x10, 0xde, 0x70, 0x5d, 0xef, 0x69, 0x07, 0xb8, 0xa4, 0x24, 0xdd,
0x60, 0x3f, 0x8e, 0xd8, 0x18, 0x71, 0x2f, 0xd8, 0x35, 0xf6, 0x7b, 0x48, 0x1e, 0x15, 0x5d, 0xc1,
0xad, 0x85, 0xd5, 0x7a, 0xc3, 0x02, 0x76, 0xc6, 0xa9, 0xb4, 0xd8, 0x7a, 0xf1, 0x49, 0xdb, 0x76,
0x3a, 0x65, 0x38, 0xa7, 0x14, 0x7c, 0x31, 0x5b, 0x66, 0x18, 0xdd, 0x80, 0xea, 0xc7, 0x9a, 0x96,
0xc0, 0xf9, 0x74, 0x45, 0x52, 0xe0, 0x15, 0xd1, 0x1b, 0xc8, 0x5c, 0xb9, 0x2a, 0xab, 0xe7, 0x7a,
0x52, 0xb6, 0xcd, 0x76, 0xef, 0x48, 0x5b, 0x36, 0x5a, 0x35, 0x40, 0xb3, 0x10, 0x7b, 0xb0, 0x9b,
0x3f, 0x08, 0xd5, 0x74, 0xec, 0x48, 0x5b, 0x36, 0xf0, 0xa1, 0x48, 0x33, 0x63, 0xe7, 0x98, 0x13,
0x7c, 0x58, 0xa4, 0xdd, 0xbc, 0x64, 0x4a, 0xa8, 0x29, 0x42, 0x97, 0xdb, 0x87, 0x45, 0x27, 0x58,
0xe0, 0x2e, 0x09, 0x10, 0xbf, 0xf1, 0x90, 0x0d, 0xf7, 0x9b, 0x43, 0xad, 0x8c, 0x3a, 0xd0, 0x6b,
0xbc, 0xa6, 0x17, 0x97, 0xf7, 0x40, 0xd7, 0x74, 0xae, 0x47, 0xbc, 0xe7, 0xb3, 0xac, 0x09, 0x4f,
0xe4, 0xab, 0x4b, 0xb1, 0xa4, 0x47, 0x28, 0x5b, 0xe6, 0xae, 0x49, 0xb0, 0xaf, 0x69, 0x44, 0xab,
0x2a, 0x42, 0x97, 0x5b, 0xc7, 0x25, 0x37, 0x60, 0xe6, 0x2c, 0x8a, 0xd0, 0xa6, 0xe1, 0x88, 0x89,
0x39, 0x3a, 0x93, 0x55, 0x60, 0x10, 0x7f, 0x40, 0x70, 0x21, 0xe2, 0x82, 0xe9, 0x47, 0x5a, 0xb6,
0xa7, 0x15, 0x50, 0x3b, 0x4d, 0xd9, 0xa3, 0x92, 0x42, 0xb8, 0xd4, 0x75, 0x28, 0xbf, 0x16, 0x56,
0x9a, 0x29, 0xab, 0xe1, 0x73, 0xec, 0xf9, 0x48, 0x6d, 0x24, 0xe3, 0x01, 0x74, 0x20, 0xc7, 0x6e,
0x7e, 0x78, 0xb4, 0xe7, 0xa7, 0xac, 0x89, 0x0f, 0x13, 0x50, 0x20, 0x1d, 0xfe, 0x1e, 0x67, 0x3c,
0xbe, 0x98, 0x34, 0xa2, 0x6d, 0xcd, 0x7e, 0xc4, 0xf2, 0x4e, 0x19, 0x9a, 0x81, 0x81, 0xb7, 0x24,
0x83, 0x5d, 0x22, 0x9c, 0x0d, 0x44, 0x23, 0xef, 0x89, 0x6c, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14,
0x1c, 0xe4, 0x13, 0xcc, 0xa2, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75,
0xec, 0x7c, 0x17, 0xb6, 0x4b, 0x44, 0xea, 0x0b, 0x01, 0xd8, 0x67, 0x3d, 0xef, 0xb3, 0xc9, 0x12,
0xb0, 0x24, 0x7c, 0x8d, 0xbb, 0xae, 0xd9, 0x75, 0x2c, 0x08, 0xfb, 0x86, 0x54, 0x05, 0x79, 0x46,
0x5d, 0x94, 0xbd, 0x21, 0x8c, 0xc9, 0x4c, 0x2c, 0x73, 0x1a, 0x80, 0xc3, 0x36, 0x74, 0xb1, 0x6a,
0x7b, 0x8d, 0xb9, 0x27, 0x0d, 0x88, 0xec, 0x7c, 0xe6, 0xc6, 0x1a, 0x56, 0x1c, 0x99, 0x3f, 0xb1,
0xe6, 0xbb, 0x90, 0x0b, 0x49, 0x4f, 0x89, 0x4d, 0x63, 0x92, 0xbc, 0xa1, 0x13, 0x29, 0x9c, 0x54,
0xda, 0xd0, 0x1f, 0x50, 0x27, 0x3d, 0x82, 0x51, 0x59, 0x13, 0xfc, 0x81, 0x00, 0x21, 0x98, 0xd6,
0x25, 0xf0, 0x6f, 0x38, 0xf1, 0x88, 0x27, 0x92, 0x81, 0x86, 0x15, 0x55, 0x5b, 0x1a, 0x4b, 0xc1,
0x0a, 0x15, 0x10, 0xda, 0xa2, 0xf7, 0x9a, 0x58, 0xde, 0x05, 0x3e, 0x50, 0xb4, 0x7d, 0x62, 0x41,
0x6d, 0x17, 0x02, 0x02, 0x16, 0xc8, 0xdf, 0x6e, 0xef, 0xff, 0x74, 0x47, 0xb4, 0xd5, 0x61, 0x42,
0xdd, 0xd7, 0xa2, 0x12, 0x4d, 0xcd, 0x4a, 0x2d, 0x55, 0x9a, 0xc0, 0xa3, 0x14, 0xa9, 0x5c, 0x34,
0x54, 0x98, 0xc3, 0xa2, 0x90, 0x69, 0x7c, 0x44, 0xdd, 0x54, 0x5d, 0x31, 0x18, 0xb5, 0xbe, 0x73,
0xed, 0xcb, 0x18, 0x57, 0x5c, 0x47, 0x4a, 0x41, 0x4a, 0xfd, 0x63, 0x32, 0x6e, 0x13, 0x47, 0x43,
0xc9, 0xb5, 0x80, 0xb2, 0x2e, 0x52, 0x77, 0xcb, 0xa5, 0xe1, 0xac, 0x89, 0x90, 0xef, 0x39, 0xa5,
0xba, 0xbc, 0x91, 0x8b, 0x3a, 0xa6, 0xb2, 0x75, 0x7c, 0x15, 0xf7, 0x06, 0xc2, 0x08, 0xe0, 0x7e,
0xae, 0xbb, 0x40, 0x66, 0xa4, 0x2d, 0x8a, 0xd0, 0x92, 0x93, 0x32, 0xd9, 0xc3, 0x8e, 0xb9, 0xe8,
0x36, 0x4d, 0xe5, 0x9f, 0x88, 0x7f, 0xd1, 0x64, 0xf4, 0xe3, 0xd4, 0x97, 0x76, 0x79, 0xd4, 0x65,
0x74, 0x2c, 0x26, 0x47, 0xe0, 0x35, 0x28, 0x22, 0xe9, 0x5f, 0x86, 0x1c, 0x7f, 0xf3, 0x9e, 0x3c,
0x3a, 0xd6, 0x42, 0x52, 0x60, 0xf8, 0x8a, 0x51, 0xe2, 0x0a, 0x60, 0xd1, 0x1d, 0xf2, 0x97, 0x39,
0x0e, 0x19, 0x63, 0xc2, 0x0e, 0x04, 0x96, 0xca, 0x25, 0xda, 0x83, 0x59, 0xe1, 0xc2, 0x78, 0x30,
0xe4, 0x86, 0xc2, 0xa3, 0x25, 0x3a, 0xb6, 0x64, 0xf2, 0x4c, 0x59, 0x37, 0x5d, 0xe1, 0xc8, 0x83,
0x80, 0x07, 0xda, 0x86, 0xd4, 0x7b, 0x0e, 0x06, 0x43, 0x07, 0x05, 0x5d, 0x5f, 0x89, 0xe5, 0x20,
0x3a, 0xc4, 0x2b, 0xbc, 0x6f, 0xc7, 0x35, 0x3a, 0x35, 0x19, 0x63, 0xc2, 0xb6, 0x3a, 0xcc, 0x8a,
0x05, 0x96, 0xca, 0x95, 0xbb, 0x57, 0x91, 0xc5, 0x24, 0x75, 0x0c, 0x49, 0x5e, 0x61, 0x8c, 0xd1,
0xd9, 0x23, 0x49, 0x29, 0x68, 0x62, 0x27, 0xa3, 0xe8, 0xbf, 0xb6, 0x14, 0xfb, 0xe2, 0xa3, 0x4d,
0x60, 0xc6, 0xdd, 0x01, 0x15, 0x14, 0xfe, 0x8e, 0x7b, 0x82, 0x34, 0x65, 0x63, 0xed, 0xea, 0x00,
0x0d, 0x44, 0x23, 0xef, 0x36, 0x6d, 0xa8, 0x9f, 0xd4, 0x4a, 0x13, 0x14, 0x1c, 0xe4, 0x13, 0xcc,
0x9b, 0x0b, 0xfb, 0x89, 0xa6, 0x01, 0x9f, 0x95, 0xb7, 0xcc, 0xd2, 0x75, 0x6c, 0x58, 0x5e, 0xb6,
0xa8, 0x01, 0xf8, 0x0b, 0x05, 0xf5, 0x70, 0x3d, 0xdc, 0x27, 0x05, 0x12, 0x0a, 0x5f, 0x88, 0x8d,
0x6b, 0xff, 0xd9, 0x75, 0xe3, 0xcc, 0xf7, 0x86, 0x84, 0x60, 0x78, 0x46, 0x60, 0x94, 0xbd, 0x21,
0x56, 0xc9, 0x4c, 0x2c, 0x56, 0x1a, 0x80, 0xc3, 0x64, 0xd1, 0xb0, 0x6a, 0x70, 0x8d, 0xb9, 0x27,
0x95, 0xdd, 0xc2, 0x7c, 0x78, 0xa6, 0x14, 0x56, 0xe5, 0xa9, 0x4c, 0xb1, 0x92, 0x1d, 0xdf, 0x0b,
0xfa, 0xe2, 0x3f, 0x4d, 0x96, 0x6f, 0xbe, 0xa1, 0x15, 0x3c, 0x72, 0x54, 0xd4, 0xd0, 0x3f, 0x50,
0xdd, 0xd1, 0x48, 0x51, 0x94, 0xee, 0xfe, 0x81, 0x05, 0x34, 0x6e, 0xd6, 0x13, 0xf0, 0x4f, 0x38,
0xf1, 0x5c, 0xbc, 0x92, 0x4a, 0x7f, 0x18, 0x55, 0x27, 0x2d, 0x62, 0xc1, 0xc1, 0x3b, 0x2e, 0xda,
0x22, 0x4e, 0x99, 0x58, 0xe2, 0xd1, 0x1f, 0x50, 0x5d, 0xe8, 0x6c, 0x41, 0x0c, 0x00, 0x00, 0x00,
0x00, 0xc0, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00,
0xe0, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00,
0x43, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00,
0xc3, 0x03, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00,
0x43, 0x04, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0xa3, 0x04, 0x00, 0x00,
0xc3, 0x04, 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x23, 0x05, 0x00, 0x00,
0x43, 0x05, 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00,
0xc3, 0x05, 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00,
0x43, 0x06, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0xa3, 0x06, 0x00, 0x00,
0xc3, 0x06, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xbf, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x0a, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x15, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x4f, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x1f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xaf, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x76, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0x76, 0x01, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00,
0xe0, 0x02, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0xb0, 0x06, 0x00, 0x00,
0x90, 0x0e, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xa0, 0x46, 0x00, 0x00, 0xc0, 0x5d, 0x00, 0x00,
0x20, 0x53, 0x00, 0x00, 0x50, 0x5a, 0x00, 0x00, 0x20, 0x53, 0x00, 0x00, 0x60, 0x31, 0x00, 0x00,
0x60, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00,
0xf0, 0x6b, 0x01, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x01, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00,
0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x01, 0x00, 0x80, 0x00,
0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x19, 0x00, 0x4e, 0x02, 0x00, 0x00,
0x1a, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0xea, 0x65, 0x00, 0x00,
0xea, 0x65, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xdb, 0x10, 0x00,
0xa6, 0x24, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfc, 0xc0, 0x1d, 0x00, 0xde, 0xe6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xc1, 0x08, 0x00,
0xc9, 0x2f, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0x0a, 0x00, 0x38, 0xfd, 0x54, 0x00,
0x00, 0x00, 0x00, 0x00, 0x42, 0x7d, 0x0c, 0x00, 0x4b, 0xea, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0xa4, 0x0e, 0x00, 0xcf, 0x4c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xea, 0x4b, 0x00,
0x3c, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xea, 0x4b, 0x00, 0x3c, 0x94, 0x00, 0x00,
0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xcd, 0xcc, 0xcc, 0x00,
0x33, 0x33, 0x33, 0x00, 0xcd, 0xcc, 0xcc, 0x00, 0xcd, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00,
0xe8, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xe8, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00,
0x50, 0x1a, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xb0, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x8c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x14, 0x00, 0x00,
0xe0, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
0x20, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x8c, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x60, 0x15, 0x00, 0x00, 0x80, 0x15, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0xd0, 0xfe, 0x3f, 0x00,
0xd0, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0xd0, 0x05, 0x00, 0x18, 0x08, 0x00, 0x00, 0xec, 0x12, 0x00, 0x00, 0x50, 0x1d, 0x00, 0x00,
0xa8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
0x60, 0xcc, 0x05, 0x00, 0x04, 0x1b, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xf8, 0x25, 0x00, 0x00,
0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x8c, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0xb0, 0x1c, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x6c, 0x27, 0x00, 0x00,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x8c, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x78, 0xd2, 0x61, 0x28, 0x96, 0x43, 0x23, 0xc8, 0xc9, 0xbd, 0x98, 0xed,
0xf9, 0x7d, 0xc4, 0x15, 0x62, 0x69, 0xbe, 0x7a, 0x43, 0x5a, 0x36, 0xce
};
struct sound_platform_definition platform_sound_dsound =
{
+1 -1
View File
@@ -733,7 +733,7 @@ struct sound_platform_definition *platform_definitions[2] =
static struct profile_section sound_render_section =
{"sound_render", NONE, TRUE};
real sound_fade_exponent = 2.5f;
struct sound_manager_globals sound_manager_globals;
struct sound_manager_globals sound_manager_globals = { 0 };
/* ---------- public code */
+146 -10
View File
@@ -151,6 +151,17 @@ enum
MAXIMUM_PORTAL_VERTICES = 64
};
/* ---------- declaration that belongs in tag_files/tag_groups.h
_tag_field_real_point2d is a shared tag-system constant, not leaf_map's own;
it is held here because this lane may not edit shared headers. Same
precedent as bitmaps/bitmap_group.c.
---------- */
enum
{
_tag_field_real_point2d = 16,
};
enum projected_plane_result
{
_projected_plane_empty,
@@ -260,6 +271,137 @@ static struct leaf_map_polygon global_leaf_face_polygon =
}
};
static struct tag_field map_leaf_face_vertex_block_fields[2] =
{
{ _tag_field_real_point2d, 0, "vertex*", NULL },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition map_leaf_face_vertex_block =
{
"map_leaf_face_vertex_block",
0,
MAXIMUM_LEAF_FACE_VERTICES,
sizeof(real_point2d),
NULL,
map_leaf_face_vertex_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct tag_field map_leaf_portal_index_block_fields[2] =
{
{ _tag_field_long_integer, 0, "portal index*", NULL },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition map_leaf_portal_index_block =
{
"map_leaf_portal_index_block",
0,
256,
sizeof(long),
NULL,
map_leaf_portal_index_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct tag_field map_leaf_face_block_fields[3] =
{
{ _tag_field_long_integer, 0, "node index*", NULL },
{ _tag_field_block, 0, "vertices*", &map_leaf_face_vertex_block },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition map_leaf_face_block =
{
"map_leaf_face_block",
0,
256,
sizeof(struct map_leaf_face),
NULL,
map_leaf_face_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct tag_field global_map_leaf_block_fields[3] =
{
{ _tag_field_block, 0, "faces*", &map_leaf_face_block },
{ _tag_field_block, 0, "portal indices*", &map_leaf_portal_index_block },
{ _tag_field_terminator, 0, NULL, NULL },
};
struct tag_block_definition global_map_leaf_block =
{
"global_map_leaf_block",
0,
0x10000,
sizeof(struct map_leaf),
NULL,
global_map_leaf_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct tag_field leaf_portal_vertex_block_fields[2] =
{
{ _tag_field_real_point3d, 0, "point*", NULL },
{ _tag_field_terminator, 0, NULL, NULL },
};
static struct tag_block_definition leaf_portal_vertex_block =
{
"leaf_portal_vertex_block",
0,
MAXIMUM_PORTAL_VERTICES,
sizeof(real_point3d),
NULL,
leaf_portal_vertex_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct tag_field global_leaf_portal_block_fields[5] =
{
{ _tag_field_long_integer, 0, "plane index*", NULL },
{ _tag_field_long_integer, 0, "back leaf index*", NULL },
{ _tag_field_long_integer, 0, "front leaf index*", NULL },
{ _tag_field_block, 0, "vertices*", &leaf_portal_vertex_block },
{ _tag_field_terminator, 0, NULL, NULL },
};
struct tag_block_definition global_leaf_portal_block =
{
"global_leaf_portal_block",
0,
0x80000,
sizeof(struct leaf_portal),
NULL,
global_leaf_portal_block_fields,
NULL,
NULL,
NULL,
NULL,
NULL,
};
static struct
{
long node_stack[MAXIMUM_NODE_STACK_COUNT];
@@ -267,6 +409,8 @@ static struct
char const *error;
} leaf_map_globals;
static short portal_count = 0;
/* ---------- public code */
boolean leaf_map_initialize_from_bsp(
@@ -836,19 +980,11 @@ static short intersect_planes3d(
if (length != 0.f)
{
real_point3d projected_normal = {{
projected_plane.n.i,
projected_plane.n.j,
projected_plane.n.k}};
real_point2d projected_result;
project_point3d(
&projected_normal,
(real_point3d const *)&projected_plane.n,
projection,
projection_sign_from_vector3d(&reference_plane->n, projection),
&projected_result);
result->n.i = projected_result.x;
result->n.j = projected_result.y;
(real_point2d *)&result->n);
result->d = projected_plane.d / length;
return _projected_plane_valid;
+5 -5
View File
@@ -901,7 +901,7 @@ static short portal_hull_from_points(
match_assert(
"c:\\halo\\SOURCE\\structures\\structure_visibility.c",
0x485,
result->vertex_count != NONE);
result->vertex_count!=NONE);
if (winding == 1)
{
@@ -917,14 +917,14 @@ static short portal_hull_from_points(
output_index = 0;
while (source_index != terminator)
{
real one_over_z = -1.0f / view_space[source_index].z;
real ooz = -1.0f / view_space[source_index].z;
match_assert(
"c:\\halo\\SOURCE\\structures\\structure_visibility.c",
0x497,
one_over_z > 0.0f);
result->vertices[output_index].x = view_space[source_index].x * one_over_z;
result->vertices[output_index].y = view_space[source_index].y * one_over_z;
ooz>0.f);
result->vertices[output_index].x = view_space[source_index].x * ooz;
result->vertices[output_index].y = view_space[source_index].y * ooz;
output_index++;
source_index += winding;
}
+2
View File
@@ -160,6 +160,8 @@ static void file_error(
/* ---------- globals */
static char drive_path[]= "?:\\";
static struct find_files_state find_files_globals =
{
0,
-2
View File
@@ -979,8 +979,6 @@ void first_person_weapon_message_from_unit(
short message_type);
void weapon_stop_reload(
long weapon_index);
boolean weapon_prevents_grenade_throwing(
long weapon_index);
static short unit_weapon_next_index(long unit_index, short current_index, short delta);
static void unit_ready_desired_weapon(
+140
View File
@@ -0,0 +1,140 @@
"""Minimal full-fidelity COFF (i386 obj) reader/writer for probe experiments."""
import struct
SEC_HDR = 40
SYM = 18
NUL = bytes([0])
def cstr(b, off):
e = b.index(NUL, off)
return b[off:e].decode("ascii", "replace")
class Coff:
pass
def load(path):
data = open(path, "rb").read()
o = Coff()
o.machine, nsec, o.timestamp, symoff, nsym, optsize, o.flags = struct.unpack_from("<HHLLLHH", data, 0)
stroff = symoff + nsym * SYM
strlen = struct.unpack_from("<L", data, stroff)[0] if stroff < len(data) else 4
strtab = data[stroff:stroff + strlen]
o.sections = []
off = 20
for i in range(nsec):
(raw_name, vsize, vaddr, size, praw, preloc, plnum, nreloc, nln, chars) = \
struct.unpack_from("<8sLLLLLLHHL", data, off)
nm = raw_name.rstrip(NUL).decode("ascii", "replace")
if nm.startswith("/"):
nm = cstr(strtab, int(nm[1:]))
s = dict(index=i + 1, name=nm, vsize=vsize, vaddr=vaddr, size=size,
chars=chars, nln=nln, plnum=plnum)
s["data"] = b"" if praw == 0 else data[praw:praw + size]
relocs = []
for r in range(nreloc):
va, symidx, typ = struct.unpack_from("<LLH", data, preloc + r * 10)
relocs.append([va, symidx, typ])
s["relocs"] = relocs
s["linenums"] = data[plnum:plnum + nln * 6] if plnum else b""
o.sections.append(s)
off += SEC_HDR
o.symbols = []
i = 0
while i < nsym:
eo = symoff + i * SYM
zeroes, name_off = struct.unpack_from("<LL", data, eo)
if zeroes == 0:
name = cstr(strtab, name_off)
else:
name = data[eo:eo + 8].rstrip(NUL).decode("ascii", "replace")
value, secno, typ, storage, naux = struct.unpack_from("<LhHBB", data, eo + 8)
aux = data[eo + SYM: eo + SYM + naux * SYM]
o.symbols.append(dict(index=i, name=name, value=value, sec=secno, type=typ,
storage=storage, naux=naux, aux=aux))
i += 1 + naux
return o
def build(o):
nsec = len(o.sections)
strparts = []
strmap = {}
def add_str(s):
if s in strmap:
return strmap[s]
off = 4 + sum(len(x) for x in strparts)
strparts.append(s.encode("ascii") + NUL)
strmap[s] = off
return off
sec_name_field = []
for s in o.sections:
if len(s["name"]) <= 8:
sec_name_field.append(s["name"].encode("ascii").ljust(8, NUL))
else:
sec_name_field.append(None)
symbytes = []
for sy in o.symbols:
if len(sy["name"]) <= 8:
nf = sy["name"].encode("ascii").ljust(8, NUL)
else:
nf = struct.pack("<LL", 0, add_str(sy["name"]))
aux = sy["aux"]
need = sy["naux"] * SYM
if len(aux) < need:
aux = aux + NUL * (need - len(aux))
elif len(aux) > need:
aux = aux[:need]
symbytes.append(struct.pack("<8sLhHBB", nf, sy["value"], sy["sec"], sy["type"],
sy["storage"], sy["naux"]) + aux)
for i, s in enumerate(o.sections):
if sec_name_field[i] is None:
sec_name_field[i] = ("/%d" % add_str(s["name"])).encode("ascii").ljust(8, NUL)
nsym = sum(1 + sy["naux"] for sy in o.symbols)
hdr_end = 20 + nsec * SEC_HDR
cur = hdr_end
payload = bytearray()
for s in o.sections:
uninit = bool(s["chars"] & 0x00000080)
if uninit or s["size"] == 0 or not s["data"]:
praw = 0
else:
praw = cur + len(payload)
payload += s["data"]
s["_praw"] = praw
for s in o.sections:
if s["relocs"]:
s["_preloc"] = cur + len(payload)
for (va, si, ty) in s["relocs"]:
payload += struct.pack("<LLH", va, si, ty)
else:
s["_preloc"] = 0
if s["linenums"]:
s["_plnum"] = cur + len(payload)
payload += s["linenums"]
else:
s["_plnum"] = 0
symoff = cur + len(payload)
strtab = b"".join(strparts)
strlen = 4 + len(strtab)
out = bytearray()
out += struct.pack("<HHLLLHH", o.machine, nsec, o.timestamp, symoff, nsym, 0, o.flags)
for i, s in enumerate(o.sections):
out += struct.pack("<8sLLLLLLHHL", sec_name_field[i], s["vsize"], s["vaddr"],
s["size"], s["_praw"], s["_preloc"], s["_plnum"],
len(s["relocs"]), s["nln"], s["chars"])
assert len(out) == hdr_end
out += payload
assert len(out) == symoff
for sb in symbytes:
out += sb
out += struct.pack("<L", strlen) + strtab
return bytes(out)
def save(o, path):
open(path, "wb").write(build(o))
+63
View File
@@ -0,0 +1,63 @@
"""Build a comparison base for source/linker_common containing ONLY verified
COMMON records: symbols January pools into its COMMON block that OUR tree
independently emits as a COMMON symbol of the identical size.
Nothing is invented and nothing initialised is copied - a .bss record carries no
bytes, only a name and a size, and the size is the one our own objects request.
Sections whose symbol we do not emit, emit at a different size, or emit in a
real section rather than COMMON are DROPPED, so the result is an honest subset.
"""
import glob, sys
sys.path.insert(0, 'tools'); sys.path.insert(0, "tools/campaign")
import coff_compare as cc
import coffio
JAN = 'build/split/source/linker_common.obj'
OUT = sys.argv[1] if len(sys.argv) > 1 else 'scratch/probe/linker_common_base.obj'
# 1. our tree's COMMON symbols: name -> size
ours = {}
for p in glob.glob('build/base/**/*.obj', recursive=True):
try: b = cc.load(open(p, 'rb').read())
except Exception: continue
for x in b['symbols']:
if x.get('section') == 0 and x.get('value', 0) > 0:
ours.setdefault(x['name'], x['value'])
o = coffio.load(JAN)
owner = {}
for sy in o.symbols:
if sy['sec'] > 0 and not sy['name'].startswith('.'):
owner.setdefault(sy['sec'], sy['name'])
keep, dropped = set(), []
for s in o.sections:
i = s['index']
n = owner.get(i)
if s['name'] != '.bss' or n is None:
dropped.append((n or s['name'], s['size'], 'not a named .bss record')); continue
if n not in ours:
dropped.append((n, s['size'], 'absent from our tree')); continue
if ours[n] != s['size']:
dropped.append((n, s['size'], 'our COMMON size %d' % ours[n])); continue
keep.add(i)
remap, newsecs = {}, []
for s in o.sections:
if s['index'] in keep:
remap[s['index']] = len(newsecs) + 1
t = dict(s); t['index'] = remap[s['index']]; newsecs.append(t)
newsyms = []
for sy in o.symbols:
if sy['sec'] in remap:
t = dict(sy); t['sec'] = remap[sy['sec']]; t['index'] = len(newsyms); newsyms.append(t)
o.sections, o.symbols = newsecs, newsyms
open(OUT, 'wb').write(coffio.build(o))
kept_bytes = sum(s['size'] for s in newsecs)
print("kept %3d records %9d bytes" % (len(newsecs), kept_bytes))
print("dropped %3d records %9d bytes" % (len(dropped), sum(d[1] for d in dropped)))
from collections import Counter
for reason, c in Counter(d[2].split(' ')[0] + ' ' + d[2].split(' ')[1] for d in dropped).most_common():
print(" %-28s %d" % (reason, c))
print("wrote", OUT)
+14 -3
View File
@@ -24,6 +24,7 @@ ROOT = Path(__file__).resolve().parents[1]
UNIT = "source/rasterizer/rasterizer_lights"
FUNCTION = "_rasterizer_lights_begin_for_new_frame"
TARGET = ROOT / ("build/split/" + UNIT + ".obj")
JANUARY_HELPER_OWNER = ROOT / "build/split/source/ai/action_charge.obj"
COMPILER = ROOT / "xbox/bin/vc7/CL.Exe"
EXACT_SHA = "ba6000638ca4648f9c8be2129eb56614787733165ab716dc580fa0647dc7bfe0"
@@ -94,19 +95,29 @@ def prepare_body(obj):
@pytest.fixture(scope="module")
def bodies(tmp_path_factory):
pytest.importorskip("unicorn")
if not TARGET.is_file() or not COMPILER.is_file():
if not TARGET.is_file() or not JANUARY_HELPER_OWNER.is_file() or not COMPILER.is_file():
pytest.skip("locally supplied January object/VC7 compiler is unavailable")
source = ROOT / (UNIT + ".c")
before = source.read_bytes()
output = tmp_path_factory.mktemp("lights-frame") / "rebuilt.obj"
result = subprocess.run(
[sys.executable, "-B", "tools/campaign/gate.py", UNIT,
"--fn", FUNCTION, "--forbid-emitted-symbol", "_point_from_line3d",
"--out", str(output)], cwd=ROOT, capture_output=True, text=True,
# The emitted-symbol guard is not applied here: this object is
# owner-cleared to emit the _point_from_line3d COMDAT, because
# January's own rasterizer_lights.obj references it out of line.
"--fn", FUNCTION, "--out", str(output)], cwd=ROOT, capture_output=True, text=True,
env=dict(os.environ, HALO_CL=str(COMPILER), PYTHONDONTWRITEBYTECODE="1"))
assert result.returncode == 0, result.stdout + result.stderr
assert source.read_bytes() == before
target, rebuilt = cc.load(TARGET), cc.load(output)
january_helper_owner = cc.load(JANUARY_HELPER_OWNER)
january_reference = [symbol for symbol in target["symbols"]
if symbol["name"] == "_point_from_line3d"]
assert len(january_reference) == 1 and january_reference[0]["section"] == 0
assert cc.section_infos_equal(
cc.section_info(january_helper_owner, "_point_from_line3d"),
cc.section_info(rebuilt, "_point_from_line3d")), (
"newly emitted inline helper differs from January's folded copy")
assert cc.section_infos_equal(
cc.section_info(target, FUNCTION), cc.section_info(rebuilt, FUNCTION)), (
"January frame body or ordered relocation identities differ")