Fix digits serialization bug

main
Cameron Murphy Reikes 2 years ago
parent ac1928d2cd
commit 0752ac8989

@ -384,17 +384,13 @@ static void grid_correct_for_holes(GameState* gs, struct Entity* grid)
V2 cur_local_pos = entity_shape_pos(N); V2 cur_local_pos = entity_shape_pos(N);
const V2 dirs[] = { const V2 dirs[] = {
(V2){ (V2){
.x = -1.0f, .y = 0.0f .x = -1.0f, .y = 0.0f},
},
(V2){ (V2){
.x = 1.0f, .y = 0.0f .x = 1.0f, .y = 0.0f},
},
(V2){ (V2){
.x = 0.0f, .y = 1.0f .x = 0.0f, .y = 1.0f},
},
(V2){ (V2){
.x = 0.0f, .y = -1.0f .x = 0.0f, .y = -1.0f},
},
}; };
int num_dirs = sizeof(dirs) / sizeof(*dirs); int num_dirs = sizeof(dirs) / sizeof(*dirs);
@ -703,13 +699,35 @@ SerMaybeFailure ser_data(SerState* ser, char* data, size_t data_len, const char*
{ {
char read_name[512] = {0}; char read_name[512] = {0};
for (int i = 0; i < var_name_len; i++) size_t just_field_name = strlen(name);
int i = 0;
int nondigit_i = 0;
while (true)
{ {
read_name[i] = ser->bytes[ser->cursor]; read_name[i] = ser->bytes[ser->cursor];
if (nondigit_i == 0 && read_name[i] >= '0' && read_name[i] <= '9')
{
// still a digit
if (i >= 10)
{ // 10 is way too many digits for a line number...
return (SerMaybeFailure){
.expression = "Way too many digits as a line number before a field name",
.failed = true,
.line = __LINE__,
};
}
}
else
{
nondigit_i += 1;
}
i++;
ser->cursor += 1; ser->cursor += 1;
SER_ASSERT(ser->cursor <= ser->max_size); SER_ASSERT(ser->cursor <= ser->max_size);
if (nondigit_i >= just_field_name)
break;
} }
read_name[var_name_len] = '\0'; read_name[i + 1] = '\0';
// advance past digits // advance past digits
char *read = read_name; char *read = read_name;
char *var = var_name; char *var = var_name;
@ -742,6 +760,7 @@ enum GameVersion
VAddedTest, VAddedTest,
VAddedSerToDisk, VAddedSerToDisk,
VRemovedTest, VRemovedTest,
VChangedVectorSerializing,
VMax, // this minus one will be the version used VMax, // this minus one will be the version used
}; };
@ -770,7 +789,8 @@ SerMaybeFailure ser_entityid(SerState* ser, EntityID* id)
{ {
SER_VAR(&id->generation); SER_VAR(&id->generation);
SER_VAR(&id->index); SER_VAR(&id->index);
if (id->generation > 0) SER_ASSERT(id->index < ser->max_entity_index); if (id->generation > 0)
SER_ASSERT(id->index < ser->max_entity_index);
return ser_ok; return ser_ok;
} }
@ -846,7 +866,14 @@ SerMaybeFailure ser_entity(SerState* ser, GameState* gs, Entity* e)
V2 shape_pos; V2 shape_pos;
if (ser->serializing) if (ser->serializing)
shape_pos = entity_shape_pos(e); shape_pos = entity_shape_pos(e);
if (ser->version < VChangedVectorSerializing)
{
SER_VAR(&shape_pos);
}
else
{
SER_MAYBE_RETURN(ser_V2(ser, &shape_pos)); SER_MAYBE_RETURN(ser_V2(ser, &shape_pos));
}
float shape_mass; float shape_mass;
if (ser->serializing) if (ser->serializing)
@ -938,10 +965,12 @@ SerMaybeFailure ser_opus_packets(SerState* ser, OpusBuffer* mic_or_speaker_data)
while (true) while (true)
{ {
SER_VAR(&no_more_packets); SER_VAR(&no_more_packets);
if (no_more_packets) break; if (no_more_packets)
break;
OpusPacket *cur = push_packet(mic_or_speaker_data); OpusPacket *cur = push_packet(mic_or_speaker_data);
OpusPacket dummy; OpusPacket dummy;
if (cur == NULL) cur = &dummy; // throw away this packet if (cur == NULL)
cur = &dummy; // throw away this packet
bool isnull = false; bool isnull = false;
SER_VAR(&isnull); SER_VAR(&isnull);
if (!isnull) if (!isnull)

Loading…
Cancel
Save