Skip to content

Commit 0822754

Browse files
authored
Merge pull request #251 from dpogue/mqo-reading
MQO reading
2 parents 083742b + 6ba51da commit 0822754

19 files changed

+236
-19
lines changed

core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ set(PRP_MOD_SOURCES
395395
PRP/Modifier/plAliasModifier.cpp
396396
PRP/Modifier/plAnimEventModifier.cpp
397397
PRP/Modifier/plAxisAnimModifier.cpp
398+
PRP/Modifier/plCloneSpawnModifier.cpp
398399
PRP/Modifier/plExcludeRegionModifier.cpp
399400
PRP/Modifier/plFollowMod.cpp
400401
PRP/Modifier/plGameMarkerModifier.cpp
@@ -417,6 +418,7 @@ set(PRP_MOD_HEADERS
417418
PRP/Modifier/plAliasModifier.h
418419
PRP/Modifier/plAnimEventModifier.h
419420
PRP/Modifier/plAxisAnimModifier.h
421+
PRP/Modifier/plCloneSpawnModifier.h
420422
PRP/Modifier/plExcludeRegionModifier.h
421423
PRP/Modifier/plFollowMod.h
422424
PRP/Modifier/plGameMarkerModifier.h

core/Math/hsGeometry3.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,21 @@ void hsVector3::read(hsStream* S)
2828
X = S->readFloat();
2929
Y = S->readFloat();
3030
Z = S->readFloat();
31+
32+
if (S->getVer() < MAKE_VERSION(2, 0, 62, 0)) {
33+
S->readFloat();
34+
}
3135
}
3236

3337
void hsVector3::write(hsStream* S)
3438
{
3539
S->writeFloat(X);
3640
S->writeFloat(Y);
3741
S->writeFloat(Z);
42+
43+
if (S->getVer() < MAKE_VERSION(2, 0, 62, 0)) {
44+
S->writeFloat(0.f);
45+
}
3846
}
3947

4048
void hsVector3::prcWrite(pfPrcHelper* prc)

core/PRP/Avatar/plAGAnim.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ void plAGAnim::read(hsStream* S, plResManager* mgr)
3131
fStart = S->readFloat();
3232
fEnd = S->readFloat();
3333

34+
// MQO data
35+
if (S->getVer().isMoul() && pdUnifiedTypeMap::CurrentVersion(this->ClassIndex()) >= 5) {
36+
fUnknownMQO1 = S->readFloat();
37+
fUnknownMQO2 = S->readFloat();
38+
}
39+
3440
clearApplicators();
3541
fApps.resize(S->readInt());
3642
for (size_t i=0; i<fApps.size(); i++) {
@@ -52,6 +58,12 @@ void plAGAnim::write(hsStream* S, plResManager* mgr)
5258
S->writeFloat(fStart);
5359
S->writeFloat(fEnd);
5460

61+
// MQO data
62+
if (S->getVer().isMoul() && pdUnifiedTypeMap::CurrentVersion(this->ClassIndex()) >= 5) {
63+
S->writeFloat(fUnknownMQO1);
64+
S->writeFloat(fUnknownMQO2);
65+
}
66+
5567
S->writeInt(fApps.size());
5668
for (size_t i=0; i<fApps.size(); i++) {
5769
mgr->WriteCreatable(S, fApps[i]);
@@ -70,6 +82,8 @@ void plAGAnim::IPrcWrite(pfPrcHelper* prc)
7082
prc->writeParam("Name", fName);
7183
prc->writeParam("Start", fStart);
7284
prc->writeParam("End", fEnd);
85+
prc->writeParam("UnknownMQO1", fUnknownMQO1);
86+
prc->writeParam("UnknownMQO2", fUnknownMQO2);
7387
prc->writeParam("EoaFlag", fEoaFlag);
7488
prc->endTag(true);
7589

@@ -93,6 +107,8 @@ void plAGAnim::IPrcParse(const pfPrcTag* tag, plResManager* mgr)
93107
fName = tag->getParam("Name", "");
94108
fStart = tag->getParam("Start", "0").to_float();
95109
fEnd = tag->getParam("End", "0").to_float();
110+
fUnknownMQO1 = tag->getParam("UnknownMQO1", "0").to_float();
111+
fUnknownMQO2 = tag->getParam("UnknownMQO2", "0").to_float();
96112
fEoaFlag = tag->getParam("EoaFlag", "0").to_uint();
97113
} else if (tag->getName() == "Applicators") {
98114
clearApplicators();

core/PRP/Avatar/plAGAnim.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ class HSPLASMA_EXPORT plAGAnim : public plSynchedObject
3333
protected:
3434
std::vector<plAGApplicator*> fApps;
3535
float fBlend, fStart, fEnd;
36+
float fUnknownMQO1, fUnknownMQO2;
3637
ST::string fName;
3738
unsigned char fEoaFlag;
3839

3940
public:
40-
plAGAnim() : fBlend(), fStart(), fEnd(), fEoaFlag() { }
41+
plAGAnim() : fBlend(), fStart(), fEnd(), fUnknownMQO1(), fUnknownMQO2(), fEoaFlag() { }
4142
~plAGAnim();
4243

4344
void read(hsStream* S, plResManager* mgr) HS_OVERRIDE;

core/PRP/Avatar/plMultistageBehMod.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ void plMultistageBehMod::read(hsStream* S, plResManager* mgr)
2828

2929
fFreezePhys = S->readBool();
3030
fSmartSeek = S->readBool();
31-
fReverseFBControlsOnRelease = S->readBool();
31+
32+
if (S->getVer() >= MAKE_VERSION(2, 0, 62, 12)) {
33+
fReverseFBControlsOnRelease = S->readBool();
34+
}
3235

3336
clearStages();
3437
fStages.resize(S->readInt());
@@ -48,7 +51,10 @@ void plMultistageBehMod::write(hsStream* S, plResManager* mgr)
4851

4952
S->writeBool(fFreezePhys);
5053
S->writeBool(fSmartSeek);
51-
S->writeBool(fReverseFBControlsOnRelease);
54+
55+
if (S->getVer() >= MAKE_VERSION(2, 0, 62, 12)) {
56+
S->writeBool(fReverseFBControlsOnRelease);
57+
}
5258

5359
S->writeInt(fStages.size());
5460
for (size_t i=0; i<fStages.size(); i++)

core/PRP/KeyedObject/plLoadMask.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,25 @@
1818

1919
void plLoadMask::read(hsStream* S)
2020
{
21-
unsigned char m = S->readByte();
22-
fQuality[0] = (m >> 4) | 0xF0;
23-
fQuality[1] = m | 0xF0;
21+
if (S->getVer() < MAKE_VERSION(2, 0, 63, 0) && S->getVer().isValid()) {
22+
fQuality[0] = (unsigned char)S->readShort();
23+
fQuality[1] = (unsigned char)S->readShort();
24+
} else {
25+
unsigned char m = S->readByte();
26+
fQuality[0] = (m >> 4) | 0xF0;
27+
fQuality[1] = m | 0xF0;
28+
}
2429
}
2530

2631
void plLoadMask::write(hsStream* S)
2732
{
28-
unsigned char m = (fQuality[1] & 0x0F) | (fQuality[0] << 4);
29-
S->writeByte(m);
33+
if (S->getVer() < MAKE_VERSION(2, 0, 63, 0) && S->getVer().isValid()) {
34+
S->writeShort((unsigned short)fQuality[0]);
35+
S->writeShort((unsigned short)fQuality[1]);
36+
} else {
37+
unsigned char m = (fQuality[1] & 0x0F) | (fQuality[0] << 4);
38+
S->writeByte(m);
39+
}
3040
}
3141

3242
void plLoadMask::prcWrite(pfPrcHelper* prc)

core/PRP/KeyedObject/plUoid.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ void plUoid::read(hsStream* S)
4949
unsigned char contents = 0;
5050
if (S->getVer() < MAKE_VERSION(2, 0, 63, 0) && S->getVer().isValid()) {
5151
contents = kHasCloneIDs;
52+
53+
if (S->getVer() > MAKE_VERSION(2, 0, 62, 0)) {
54+
contents |= kHasLoadMask;
55+
}
5256
} else {
5357
contents = S->readByte();
5458
}

core/PRP/Message/plCameraMsg.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ void plCameraMsg::read(hsStream* S, plResManager* mgr)
154154
fNewCam = mgr->readKey(S);
155155
fTriggerer = mgr->readKey(S);
156156
fConfig.read(S);
157+
158+
if (S->getVer().isMqo()) {
159+
fUnknownMQO.read(S);
160+
}
157161
}
158162

159163
void plCameraMsg::write(hsStream* S, plResManager* mgr)
@@ -166,6 +170,10 @@ void plCameraMsg::write(hsStream* S, plResManager* mgr)
166170
mgr->writeKey(S, fNewCam);
167171
mgr->writeKey(S, fTriggerer);
168172
fConfig.write(S);
173+
174+
if (S->getVer().isMqo()) {
175+
fUnknownMQO.write(S);
176+
}
169177
}
170178

171179
void plCameraMsg::IPrcWrite(pfPrcHelper* prc)
@@ -189,6 +197,10 @@ void plCameraMsg::IPrcWrite(pfPrcHelper* prc)
189197
prc->closeTag();
190198

191199
fConfig.prcWrite(prc);
200+
201+
prc->writeSimpleTag("UnknownMQO");
202+
fUnknownMQO.prcWrite(prc);
203+
prc->closeTag();
192204
}
193205

194206
void plCameraMsg::IPrcParse(const pfPrcTag* tag, plResManager* mgr)
@@ -207,6 +219,9 @@ void plCameraMsg::IPrcParse(const pfPrcTag* tag, plResManager* mgr)
207219
fTriggerer = mgr->prcParseKey(tag->getFirstChild());
208220
} else if (tag->getName() == "plCameraConfig") {
209221
fConfig.prcParse(tag);
222+
} else if (tag->getName() == "UnknownMQO") {
223+
if (tag->hasChildren())
224+
fUnknownMQO.prcParse(tag->getFirstChild());
210225
} else {
211226
plMessage::IPrcParse(tag, mgr);
212227
}

core/PRP/Message/plCameraMsg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class HSPLASMA_EXPORT plCameraMsg : public plMessage
9898
plCameraConfig fConfig;
9999
bool fActivated;
100100
hsBitVector fCmd;
101+
hsVector3 fUnknownMQO;
101102

102103
public:
103104
plCameraMsg();
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/* This file is part of HSPlasma.
2+
*
3+
* HSPlasma is free software: you can redistribute it and/or modify
4+
* it under the terms of the GNU General Public License as published by
5+
* the Free Software Foundation, either version 3 of the License, or
6+
* (at your option) any later version.
7+
*
8+
* HSPlasma is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License
14+
* along with HSPlasma. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
#include "plCloneSpawnModifier.h"
18+
19+
void plCloneSpawnModifier::read(hsStream* S, plResManager* mgr)
20+
{
21+
if (S->getVer().isMoul()) {
22+
plSingleModifier::read(S, mgr);
23+
fTemplateName = S->readSafeStr();
24+
fUserData = S->readInt();
25+
} else {
26+
// This is bad, but also never used in earlier Plasma versions
27+
fTemplateName = S->readSafeStr();
28+
plSingleModifier::read(S, mgr);
29+
}
30+
}
31+
32+
void plCloneSpawnModifier::write(hsStream* S, plResManager* mgr)
33+
{
34+
if (S->getVer().isMoul()) {
35+
plSingleModifier::write(S, mgr);
36+
S->writeSafeStr(fTemplateName);
37+
S->writeInt(fUserData);
38+
} else {
39+
// This is bad, but also never used in earlier Plasma versions
40+
S->writeSafeStr(fTemplateName);
41+
plSingleModifier::write(S, mgr);
42+
}
43+
}
44+
45+
void plCloneSpawnModifier::IPrcWrite(pfPrcHelper* prc)
46+
{
47+
plSingleModifier::IPrcWrite(prc);
48+
49+
prc->startTag("SpawnParams");
50+
prc->writeParam("TemplateName", fTemplateName);
51+
prc->writeParam("UserData", fUserData);
52+
prc->endTag(true);
53+
}
54+
55+
void plCloneSpawnModifier::IPrcParse(const pfPrcTag* tag, plResManager* mgr)
56+
{
57+
if (tag->getName() == "SpawnParams") {
58+
fTemplateName = tag->getParam("TemplateName", "");
59+
fUserData = tag->getParam("UserData", "0").to_uint();
60+
} else {
61+
plSingleModifier::IPrcParse(tag, mgr);
62+
}
63+
}
64+

0 commit comments

Comments
 (0)