{
struct LevelInfo_SP *level_sp = level->native_sp_level;
LevelInfoType *header = &level_sp->header;
- int i, x, y;
+ boolean num_invalid_elements = 0;
+ int i, j, x, y;
level->fieldx = level_sp->width;
level->fieldy = level_sp->height;
int element_new = getMappedElement(map_element_SP_to_RND(element_old));
if (element_new == EL_UNKNOWN)
- Error(ERR_WARN, "invalid element %d at position %d, %d",
+ {
+ num_invalid_elements++;
+
+ Error(ERR_DEBUG, "invalid element %d at position %d, %d",
element_old, x, y);
+ }
level->field[x][y] = element_new;
}
}
+ if (num_invalid_elements > 0)
+ Error(ERR_WARN, "found %d invalid elements%s", num_invalid_elements,
+ (!options.debug ? " (use '--debug' for more details)" : ""));
+
for (i = 0; i < MAX_PLAYERS; i++)
level->initial_player_gravity[i] =
(header->InitialGravity == 1 ? TRUE : FALSE);
+ /* skip leading spaces */
for (i = 0; i < SP_LEVEL_NAME_LEN; i++)
- level->name[i] = header->LevelTitle[i];
- level->name[SP_LEVEL_NAME_LEN] = '\0';
+ if (header->LevelTitle[i] != ' ')
+ break;
+
+ /* copy level title */
+ for (j = 0; i < SP_LEVEL_NAME_LEN; i++, j++)
+ level->name[j] = header->LevelTitle[i];
+ level->name[j] = '\0';
+
+ /* cut trailing spaces */
+ for (; j > 0; j--)
+ if (level->name[j - 1] == ' ' && level->name[j] == '\0')
+ level->name[j - 1] = '\0';
level->gems_needed = header->InfotronsNeeded;
TapeSetDateFromEpochSeconds(getFileTimestampEpochSeconds(filename));
- tape.length = 0;
- tape.pos[tape.length].delay = 0;
+ tape.counter = 0;
+ tape.pos[tape.counter].delay = 0;
for (i = 0; i < demo->length; i++)
{
int demo_repeat = (demo->data[i] & 0xf0) >> 4;
int tape_action = map_key_SP_to_RND(demo_action);
int tape_repeat = demo_repeat + 1;
- int tape_entries = 1; // one new tape entry may be added
+ byte action[MAX_PLAYERS] = { tape_action, 0, 0, 0 };
+ boolean success = 0;
+ int j;
+
+ for (j = 0; j < tape_repeat; j++)
+ success = TapeAddAction(action);
- if (tape.length + tape_entries >= MAX_TAPE_LEN)
+ if (!success)
{
Error(ERR_WARN, "SP demo truncated: size exceeds maximum tape size %d",
MAX_TAPE_LEN);
break;
}
-
- if (tape.pos[tape.length].delay > 0) /* already stored action */
- {
- if (tape.pos[tape.length].action[0] != tape_action ||
- tape.pos[tape.length].delay + tape_repeat >= 256)
- {
- tape.length++;
- tape.pos[tape.length].delay = 0;
- }
- else
- {
- tape.pos[tape.length].delay += tape_repeat;
- }
- }
-
- if (tape.pos[tape.length].delay == 0) /* store new action */
- {
- tape.pos[tape.length].action[0] = tape_action;
- tape.pos[tape.length].delay = tape_repeat;
- }
}
- tape.length++;
-
- tape.length_frames = GetTapeLengthFrames();
- tape.length_seconds = GetTapeLengthSeconds();
+ TapeHaltRecording();
}
for (i = 0; i < tape->length; i++)
{
if (i >= MAX_TAPE_LEN)
+ {
+ Error(ERR_WARN, "tape truncated -- size exceeds maximum tape size %d",
+ MAX_TAPE_LEN);
+
+ // tape too large; read and ignore remaining tape data from this chunk
+ for (;i < tape->length; i++)
+ ReadUnusedBytesFromFile(file, tape->num_participating_players + 1);
+
break;
+ }
for (j = 0; j < MAX_PLAYERS; j++)
{