- fixed: object pointers as array members may not be skipped if they are null.

- changed S_GetMusic to return a const pointer to the actual music name instead of a copy. The only thing this is used for is the savegame code and it has no use for a copy, it can work far more efficiently with a const pointer.
This commit is contained in:
Christoph Oelckers 2016-09-23 21:24:56 +02:00
parent 02b3884dff
commit 36bf099d54
4 changed files with 31 additions and 18 deletions

View file

@ -528,7 +528,7 @@ void P_SerializeSounds(FSerializer &arc)
if (arc.isWriting()) if (arc.isWriting())
{ {
order = S_GetMusic((char **)&name); order = S_GetMusic(&name);
} }
arc.StringPtr("musicname", name) arc.StringPtr("musicname", name)
("musicorder", order); ("musicorder", order);
@ -539,7 +539,6 @@ void P_SerializeSounds(FSerializer &arc)
if (level.cdtrack == 0 || !S_ChangeCDMusic(level.cdtrack, level.cdid)) if (level.cdtrack == 0 || !S_ChangeCDMusic(level.cdtrack, level.cdid))
S_ChangeMusic(level.Music, level.musicorder); S_ChangeMusic(level.Music, level.musicorder);
} }
delete[] name;
} }
//========================================================================== //==========================================================================

View file

@ -2608,13 +2608,13 @@ void S_MIDIDeviceChanged()
// //
//========================================================================== //==========================================================================
int S_GetMusic (char **name) int S_GetMusic (const char **name)
{ {
int order; int order;
if (mus_playing.name.IsNotEmpty()) if (mus_playing.name.IsNotEmpty())
{ {
*name = copystring (mus_playing.name); *name = mus_playing.name;
order = mus_playing.baseorder; order = mus_playing.baseorder;
} }
else else

View file

@ -334,7 +334,7 @@ void S_RestartMusic ();
void S_MIDIDeviceChanged(); void S_MIDIDeviceChanged();
int S_GetMusic (char **name); int S_GetMusic (const char **name);
// Stops the music for sure. // Stops the music for sure.
void S_StopMusic (bool force); void S_StopMusic (bool force);

View file

@ -1514,6 +1514,10 @@ FSerializer &Serialize(FSerializer &arc, const char *key, DObject *&value, DObje
} }
Serialize(arc, key, ndx, nullptr); Serialize(arc, key, ndx, nullptr);
} }
else if (!arc.w->inObject())
{
arc.w->Null();
}
} }
else else
{ {
@ -1524,30 +1528,40 @@ FSerializer &Serialize(FSerializer &arc, const char *key, DObject *&value, DObje
I_Error("Attempt to read object reference without calling ReadObjects first"); I_Error("Attempt to read object reference without calling ReadObjects first");
} }
auto val = arc.r->FindKey(key); auto val = arc.r->FindKey(key);
if (val != nullptr && val->IsInt()) if (val != nullptr)
{ {
int index = val->GetInt(); if (val->IsNull())
if (index == -1)
{ {
value = WP_NOCHANGE; value = nullptr;
return arc;
} }
else else if (val->IsInt())
{ {
assert(index >= 0 && index < (int)arc.r->mDObjects.Size()); int index = val->GetInt();
if (index >= 0 && index < (int)arc.r->mDObjects.Size()) if (index == -1)
{ {
value = arc.r->mDObjects[index]; value = WP_NOCHANGE;
} }
else else
{ {
assert(false && "invalid object reference"); assert(index >= 0 && index < (int)arc.r->mDObjects.Size());
Printf(TEXTCOLOR_RED "Invalid object reference for '%s'", key); if (index >= 0 && index < (int)arc.r->mDObjects.Size())
value = nullptr; {
arc.mErrors++; value = arc.r->mDObjects[index];
}
else
{
assert(false && "invalid object reference");
Printf(TEXTCOLOR_RED "Invalid object reference for '%s'", key);
value = nullptr;
arc.mErrors++;
if (retcode) *retcode = false;
}
} }
return arc;
} }
} }
else if (!retcode) if (!retcode)
{ {
value = nullptr; value = nullptr;
} }