From 98eaeac2f7d3f64a72dabf211a66338b5d8d2c49 Mon Sep 17 00:00:00 2001 From: Jason Deacutis Date: Fri, 24 Sep 2021 00:02:05 -0700 Subject: [PATCH] MVAR: labeled unknown data --- html/src/raw/map_variant_mvar.js | 101 +++++++++++++++++-------------- 1 file changed, 55 insertions(+), 46 deletions(-) diff --git a/html/src/raw/map_variant_mvar.js b/html/src/raw/map_variant_mvar.js index c85715a0..bd1d2fec 100644 --- a/html/src/raw/map_variant_mvar.js +++ b/html/src/raw/map_variant_mvar.js @@ -149,10 +149,10 @@ function _sub4DC8E0(bitcount, mapBounds, out) { } } -class LFOUnk30 { // sizeof >= 0x1C +class ObjectData { // sizeof >= 0x1C sub6078F0(stream) { let sw = stream.readBits(2); - this.unk10 = sw; + this.shape = sw; let xmm3 = 0.0977517142892; let xmm0 = 0; let xmm4 = 0.0488758571446; @@ -162,15 +162,15 @@ class LFOUnk30 { // sizeof >= 0x1C case 1: { let a = stream.readBits(0xB); if (!a) { - this.unk00 = 0; + this.shapeWidth = 0; } else { if (a == 0x7FF) { - this.unk00 = 200; // float + this.shapeWidth = 200; // float } else { --a; a *= 0.0977517142892; a += 0.0488758571446; - this.unk00 = a; + this.shapeWidth = a; } } }; return; @@ -184,17 +184,17 @@ class LFOUnk30 { // sizeof >= 0x1C } else { xmm1 = (eax - 1) * xmm3 + xmm4; } - this.unk00 = xmm1; + this.shapeWidth = xmm1; eax = stream.readBits(0xB); if (eax == 0) { xmm1 = xmm0; - this.unk04 = xmm1; + this.shapeLength = xmm1; } else if (eax == 0x7FF) { xmm1 = xmm2; - this.unk04 = xmm1; + this.shapeLength = xmm1; } else { xmm1 = (eax - 1) * xmm3 + xmm4; - this.unk04 = xmm1; + this.shapeLength = xmm1; } }; break; // @@ -207,7 +207,7 @@ class LFOUnk30 { // sizeof >= 0x1C } else { xmm1 = (eax - 1) * xmm3 + xmm4; } - this.unk00 = xmm1; + this.shapeWidth = xmm1; }; break; // default: @@ -221,7 +221,7 @@ class LFOUnk30 { // sizeof >= 0x1C } else { xmm1 = (eax - 1) * xmm3 + xmm4; } - this.unk08 = xmm1; + this.shapeTop = xmm1; eax = stream.readBits(0xB); if (!eax) { xmm1 = xmm0; @@ -230,23 +230,32 @@ class LFOUnk30 { // sizeof >= 0x1C } else { xmm1 = (eax - 1) * xmm3 + xmm4; } - this.unk0C = xmm1; + this.shapeBottom = xmm1; } constructor(stream) { - this.unk00 = 0; // float (shape dimension 0? width or length; radius for cylinder) - this.unk04 = 0; // float (shape dimension 1? width or length) - this.unk08 = 0; // float (shape dimension 2? top or bottom; top for cylinder) - this.unk0C = 0; // float (shape dimension 3? top or bottom; bottom for cylinder) - this.unk10 = 0; // byte (shape type) + this.shapeWidth = 0; // float (shape dimension 0? box width; radius for cylinder) + this.shapeLength = 0; // float (shape dimension 1? box length) + this.shapeTop = 0; // float (shape dimension 2? top) + this.shapeBottom = 0; // float (shape dimension 3? bottom) + this.shape = 0; // byte (shape type; 2:cylinder, 3:box) this.spawnSequence = 0; // 11 // byte; UI clamps this to [-100, 100] this.respawnTime = 0; // 12 // byte - this.unk13 = 0; // byte - this.forgeLabelIndex = -1; // 14 // word - this.unk16 = 0; // byte // flags? maybe? - this.unk17 = 0; // byte - this.unk18 = 0; // qword - this.team = -1; // 1A // byte - this.unk17 = 8; // byte + this.cachedType = 0; // byte; cached object type; not always reliable? + this.forgeLabelIndex = -1; // 14 // word; gametype label index + this.flags = 0; // byte // flags: physics, game specifc, symmetry, hide + /*public enum Flags : byte { + PhysicsNormal = 0b00000000, + PhysicsFixed = 0b01000000, + PhysicsPhased = 0b11000000, + GameSpecific = 0b00100000, + Asymmetric = 0b00001000, + Symmetric = 0b00000100, + HideAtStart = 0b00000010 + }*/ + this.team = 0; // byte { 0:Red, 1:Blue, 2:Green, 3:Orange, 4:Purple, 5:Yellow, 6:Brown, 7:Pink, 8:Neutral, TeamColor = -1 or 255 } + //this.otherInfoA = 0; // byte; spareClips, teleporterChannel, locationNameIndex + //this.otherInfoB = 0; // byte; teleporterPassability + this.color = -1; // 1A // byte { 0:Red, 1:Blue, 2:Green, 3:Orange, 4:Purple, 5:Yellow, 6:Brown, 7:Pink, 8:Neutral, TeamColor = -1 or 255 } if (!stream) return; this.sub6078F0(stream); // read shape @@ -257,30 +266,30 @@ class LFOUnk30 { // sizeof >= 0x1C this.spawnSequence = eax & 0xFF; // this.respawnTime = stream.readBits(8); - this.unk13 = stream.readBits(5); // teleporter channel? 's got the right number of bits + this.cachedType = stream.readBits(5); if (stream.readBits(1)) { // absence bit this.forgeLabelIndex = -1; // word } else { this.forgeLabelIndex = stream.readBits(8); // word } - this.unk16 = stream.readBits(8); // byte - this.unk17 = stream.readBits(4) - 1; // object color? + this.flags = stream.readBits(8); // byte + this.team = stream.readBits(4) - 1; if (!stream.readBits(1)) { - this.team = stream.readBits(3); // byte + this.color = stream.readBits(3); // byte } else { - this.team = -1; // byte + this.color = -1; // byte } // - if (this.unk13 == 1) { - this.unk18 = stream.readBits(8); // byte + if (this.cachedType == 1) {// weapon + this.spareClips = stream.readBits(8); // byte return; - } else if (this.unk13 <= 0xB) { + } else if (this.cachedType <= 0xB) { return; - } else if (this.unk13 <= 0xE) { - this.unk18 = stream.readBits(5); // byte - this.unk19 = stream.readBits(5); // byte - } else if (this.unk13 == 0x13) { - this.unk18 = stream.readBits(8) - 1; // byte + } else if (this.cachedType <= 0xE) {// teleporter + this.teleporterChannel = stream.readBits(5); // byte + this.teleporterPassability = stream.readBits(5); // byte + } else if (this.cachedType == 0x13) { + this.locationNameIndex = stream.readBits(8) - 1; // byte } } } @@ -580,11 +589,11 @@ class LoadedForgeObject { // this.objectSubcat = 0xFFFF; // 02 // - this.unk04 = -1; // dword + this.unk04 = -1; // dword, unused/padding? this.position = new MVVector(); // 08, 0C, 10 this.rotation = new MVVector(); // 14, 18, 1C // possibly local-forward unit vector this.axisAngleAxis = new MVVector(); // 20, 24, 28 // most likely local-up unit vector - this.unk2C = -1; // word + this.unk2C = -1; // word, spawnRelativeToMapIndex? // // objectSubtype // Index of an object within a subcategory. @@ -594,10 +603,10 @@ class LoadedForgeObject { // this.objectType = 0; // 2E // - this.unk2F = 0; // padding? - this.unk30 = null; // struct; all remaining fields are its members + this.pad1 = 0; // padding + this.objectData = null; // struct; all remaining fields are its members /*// - this.unk30 = 0; // int64? + this.objectData = 0; // int64? this.unk38 = 0; // int64? this.unk40 = 0; this.unk41 = 0; // padding? @@ -638,15 +647,15 @@ class LoadedForgeObject { } let a = stream.readBits(14, false); // TODO: processing this.loadAxisAngleAngle(a); - this.unk2C = stream.readBits(10, false) - 1; - this.unk30 = new LFOUnk30(stream); + this.unk2C = stream.readBits(10, false) - 1;// spawnRelativeToMapIndex? + this.objectData = new ObjectData(stream); } get forgeLabel() { if (!this.owner) return void 0; - if (!this.unk30) + if (!this.objectData) return null; - let index = this.unk30.forgeLabelIndex; + let index = this.objectData.forgeLabelIndex; if (index < 0) return null; let entry = this.owner.forgeLabels.strings[index];