#define LEVEL_CHUNK_CNT3_UNUSED 10 /* unused CNT3 chunk bytes */
#define LEVEL_CPART_CUS3_SIZE 134 /* size of CUS3 chunk part */
#define LEVEL_CPART_CUS3_UNUSED 15 /* unused CUS3 bytes / part */
-#define LEVEL_CPART_CUS4_SIZE ??? /* size of CUS4 chunk part */
-#define LEVEL_CPART_CUS4_UNUSED ??? /* unused CUS4 bytes / part */
#define TAPE_HEADER_SIZE 20 /* size of tape file header */
#define TAPE_HEADER_UNUSED 3 /* unused tape header bytes */
change->can_change = FALSE;
change->events = CE_BITMASK_DEFAULT;
+ change->sides = CH_SIDE_ANY;
+
change->target_element = EL_EMPTY_SPACE;
change->delay_fixed = 0;
change->delay_random = 0;
- change->delay_frames = -1; /* later set to reliable default value */
+ change->delay_frames = 1;
change->trigger_element = EL_EMPTY_SPACE;
change->use_content = FALSE;
change->only_complete = FALSE;
change->use_random_change = FALSE;
- change->random = 0;
+ change->random = 100;
change->power = CP_NON_DESTRUCTIVE;
for(x=0; x<3; x++)
strcpy(level->name, NAMELESS_LEVEL_NAME);
strcpy(level->author, ANONYMOUS_NAME);
- level->envelope[0] = '\0';
- level->envelope_xsize = MAX_ENVELOPE_XSIZE;
- level->envelope_ysize = MAX_ENVELOPE_YSIZE;
+ for (i=0; i<4; i++)
+ {
+ level->envelope_text[i][0] = '\0';
+ level->envelope_xsize[i] = MAX_ENVELOPE_XSIZE;
+ level->envelope_ysize[i] = MAX_ENVELOPE_YSIZE;
+ }
for(i=0; i<LEVEL_SCORE_ELEMENTS; i++)
level->score[i] = 10;
static int checkLevelElement(int element)
{
+ /* map some (historic, now obsolete) elements */
+
+#if 1
+ switch (element)
+ {
+ case EL_PLAYER_OBSOLETE:
+ element = EL_PLAYER_1;
+ break;
+
+ case EL_KEY_OBSOLETE:
+ element = EL_KEY_1;
+
+ case EL_EM_KEY_1_FILE_OBSOLETE:
+ element = EL_EM_KEY_1;
+ break;
+
+ case EL_EM_KEY_2_FILE_OBSOLETE:
+ element = EL_EM_KEY_2;
+ break;
+
+ case EL_EM_KEY_3_FILE_OBSOLETE:
+ element = EL_EM_KEY_3;
+ break;
+
+ case EL_EM_KEY_4_FILE_OBSOLETE:
+ element = EL_EM_KEY_4;
+ break;
+
+ case EL_ENVELOPE_OBSOLETE:
+ element = EL_ENVELOPE_1;
+ break;
+
+ case EL_SP_EMPTY:
+ element = EL_EMPTY;
+ break;
+
+ default:
+ if (element >= NUM_FILE_ELEMENTS)
+ {
+ Error(ERR_WARN, "invalid level element %d", element);
+
+ element = EL_CHAR_QUESTION;
+ }
+ break;
+ }
+#else
if (element >= NUM_FILE_ELEMENTS)
{
Error(ERR_WARN, "invalid level element %d", element);
+
element = EL_CHAR_QUESTION;
}
else if (element == EL_PLAYER_OBSOLETE)
element = EL_PLAYER_1;
else if (element == EL_KEY_OBSOLETE)
element = EL_KEY_1;
+#endif
return element;
}
{
int i;
int element;
+ int envelope_nr;
int envelope_len;
int chunk_size_expected;
element = checkLevelElement(getFile16BitBE(file));
+ if (!IS_ENVELOPE(element))
+ element = EL_ENVELOPE_1;
+
+ envelope_nr = element - EL_ENVELOPE_1;
+
envelope_len = getFile16BitBE(file);
- level->envelope_xsize = getFile8Bit(file);
- level->envelope_ysize = getFile8Bit(file);
+
+ level->envelope_xsize[envelope_nr] = getFile8Bit(file);
+ level->envelope_ysize[envelope_nr] = getFile8Bit(file);
ReadUnusedBytesFromFile(file, LEVEL_CHUNK_CNT3_UNUSED);
}
for(i=0; i < envelope_len; i++)
- level->envelope[i] = getFile8Bit(file);
+ level->envelope_text[envelope_nr][i] = getFile8Bit(file);
return chunk_size;
}
{
struct ElementChangeInfo *change = &ei->change_page[i];
+ /* always start with reliable default values */
+ setElementChangeInfoToDefaults(change);
+
change->events = getFile32BitBE(file);
change->target_element = checkLevelElement(getFile16BitBE(file));
change->can_change = getFile8Bit(file);
+ change->sides = getFile8Bit(file);
+
+ if (change->sides == CH_SIDE_NONE) /* correct empty sides field */
+ change->sides = CH_SIDE_ANY;
+
/* some free bytes for future change property values and padding */
- ReadUnusedBytesFromFile(file, 9);
+ ReadUnusedBytesFromFile(file, 8);
}
/* mark this custom element as modified */
static void SaveLevel_CNT3(FILE *file, struct LevelInfo *level, int element)
{
int i;
- int envelope_len = strlen(level->envelope) + 1;
+ int envelope_nr = element - EL_ENVELOPE_1;
+ int envelope_len = strlen(level->envelope_text[envelope_nr]) + 1;
putFile16BitBE(file, element);
putFile16BitBE(file, envelope_len);
- putFile8Bit(file, level->envelope_xsize);
- putFile8Bit(file, level->envelope_ysize);
+ putFile8Bit(file, level->envelope_xsize[envelope_nr]);
+ putFile8Bit(file, level->envelope_ysize[envelope_nr]);
WriteUnusedBytesToFile(file, LEVEL_CHUNK_CNT3_UNUSED);
for(i=0; i < envelope_len; i++)
- putFile8Bit(file, level->envelope[i]);
+ putFile8Bit(file, level->envelope_text[envelope_nr][i]);
}
#if 0
putFile8Bit(file, change->can_change);
+ putFile8Bit(file, change->sides);
+
/* some free bytes for future change property values and padding */
- WriteUnusedBytesToFile(file, 9);
+ WriteUnusedBytesToFile(file, 8);
}
}
}
/* check for envelope content */
- if (strlen(level->envelope) > 0)
+ for (i=0; i<4; i++)
{
- int envelope_len = strlen(level->envelope) + 1;
+ if (strlen(level->envelope_text[i]) > 0)
+ {
+ int envelope_len = strlen(level->envelope_text[i]) + 1;
- putFileChunkBE(file, "CNT3", LEVEL_CHUNK_CNT3_HEADER + envelope_len);
- SaveLevel_CNT3(file, level, EL_ENVELOPE);
+ putFileChunkBE(file, "CNT3", LEVEL_CHUNK_CNT3_HEADER + envelope_len);
+ SaveLevel_CNT3(file, level, EL_ENVELOPE_1 + i);
+ }
}
/* check for non-default custom elements (unless using template level) */
for (j=0; image_config[j].token != NULL; j++)
if (strcmp(image_config_vars[i].token, image_config[j].token) == 0)
*image_config_vars[i].value =
- get_integer_from_string(image_config[j].value);
+ get_auto_parameter_value(image_config_vars[i].token,
+ image_config[j].value);
if ((setup_file_hash = loadSetupFileHash(filename)) == NULL)
return;
char *value = getHashEntry(setup_file_hash, image_config_vars[i].token);
if (value != NULL)
- *image_config_vars[i].value = get_integer_from_string(value);
+ *image_config_vars[i].value =
+ get_auto_parameter_value(image_config_vars[i].token, value);
}
freeSetupFileHash(setup_file_hash);