#include "libgame/libgame.h"
#include "files.h"
+#include "init.h"
#include "tools.h"
#include "tape.h"
Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_EXIT_CLOSED;
for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
- Properties1[EL_CUSTOM_START + i] = EP_BITMASK_DEFAULT;
+ {
+ level.custom_element_successor[i] = EL_EMPTY_SPACE;
+ Properties[EL_CUSTOM_START + i][EP_BITFIELD_BASE] = EP_BITMASK_DEFAULT;
+ }
BorderElement = EL_STEELWALL;
int properties = getFile32BitBE(file);
if (IS_CUSTOM_ELEMENT(element))
- Properties1[element] = properties;
+ Properties[element][EP_BITFIELD_BASE] = properties;
+ else
+ Error(ERR_WARN, "invalid custom element number %d", element);
+ }
+
+ return chunk_size;
+}
+
+static int LoadLevel_CUS2(FILE *file, int chunk_size, struct LevelInfo *level)
+{
+ int num_changed_custom_elements = getFile16BitBE(file);
+ int chunk_size_expected = 2 + num_changed_custom_elements * 4;
+ int i;
+
+ if (chunk_size_expected != chunk_size)
+ {
+ ReadUnusedBytesFromFile(file, chunk_size - 2);
+ return chunk_size_expected;
+ }
+
+ for (i=0; i < num_changed_custom_elements; i++)
+ {
+ int element = getFile16BitBE(file);
+ int custom_element_successor = getFile16BitBE(file);
+ int i = element - EL_CUSTOM_START;
+
+ if (IS_CUSTOM_ELEMENT(element))
+ level->custom_element_successor[i] = custom_element_successor;
else
Error(ERR_WARN, "invalid custom element number %d", element);
}
{ "CONT", -1, LoadLevel_CONT },
{ "CNT2", LEVEL_CHUNK_CNT2_SIZE, LoadLevel_CNT2 },
{ "CUS1", -1, LoadLevel_CUS1 },
+ { "CUS2", -1, LoadLevel_CUS2 },
{ NULL, 0, NULL }
};
char *filename = getLevelFilename(level_nr);
LoadLevelFromFilename(filename);
+ InitElementPropertiesEngine(level.game_version);
}
static void SaveLevel_VERS(FILE *file, struct LevelInfo *level)
putFile16BitBE(file, content_array[i][x][y]);
}
-static void SaveLevel_CUS1(FILE *file, int num_changed_custom_elements)
+static void SaveLevel_CUS1(FILE *file, struct LevelInfo *level,
+ int num_changed_custom_elements)
{
int i, check = 0;
{
int element = EL_CUSTOM_START + i;
- if (Properties1[element] != EP_BITMASK_DEFAULT)
+ if (Properties[element][EP_BITFIELD_BASE] != EP_BITMASK_DEFAULT)
{
if (check < num_changed_custom_elements)
{
putFile16BitBE(file, element);
- putFile32BitBE(file, Properties1[element]);
+ putFile32BitBE(file, Properties[element][EP_BITFIELD_BASE]);
}
check++;
Error(ERR_WARN, "inconsistent number of custom element properties");
}
+static void SaveLevel_CUS2(FILE *file, struct LevelInfo *level,
+ int num_changed_custom_elements)
+{
+ int i, check = 0;
+
+ putFile16BitBE(file, num_changed_custom_elements);
+
+ for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
+ {
+ int element = EL_CUSTOM_START + i;
+
+ if (level->custom_element_successor[i] != EL_EMPTY_SPACE)
+ {
+ if (check < num_changed_custom_elements)
+ {
+ putFile16BitBE(file, element);
+ putFile16BitBE(file, level->custom_element_successor[i]);
+ }
+
+ check++;
+ }
+ }
+
+ if (check != num_changed_custom_elements) /* should not happen */
+ Error(ERR_WARN, "inconsistent number of custom element successors");
+}
+
void SaveLevel(int level_nr)
{
char *filename = getLevelFilename(level_nr);
int body_chunk_size;
- int num_changed_custom_elements = 0;
+ int num_changed_custom_elements1 = 0;
+ int num_changed_custom_elements2 = 0;
int i, x, y;
FILE *file;
/* check for non-standard custom elements and calculate "CUS1" chunk size */
for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
- if (Properties1[EL_CUSTOM_START + i] != EP_BITMASK_DEFAULT)
- num_changed_custom_elements++;
+ if (Properties[EL_CUSTOM_START +i][EP_BITFIELD_BASE] != EP_BITMASK_DEFAULT)
+ num_changed_custom_elements1++;
+
+ /* check for non-standard custom elements and calculate "CUS2" chunk size */
+ for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
+ if (level.custom_element_successor[i] != EL_EMPTY_SPACE)
+ num_changed_custom_elements2++;
putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED);
putFileChunkBE(file, "CAVE", CHUNK_SIZE_NONE);
SaveLevel_CNT2(file, &level, EL_BD_AMOEBA);
}
- if (num_changed_custom_elements > 0)
+ if (num_changed_custom_elements1 > 0)
+ {
+ putFileChunkBE(file, "CUS1", 2 + num_changed_custom_elements1 * 6);
+ SaveLevel_CUS1(file, &level, num_changed_custom_elements1);
+ }
+
+ if (num_changed_custom_elements2 > 0)
{
- putFileChunkBE(file, "CUS1", 2 + num_changed_custom_elements * 6);
- SaveLevel_CUS1(file, num_changed_custom_elements);
+ putFileChunkBE(file, "CUS2", 2 + num_changed_custom_elements2 * 4);
+ SaveLevel_CUS2(file, &level, num_changed_custom_elements2);
}
fclose(file);
si->options.verbose = FALSE;
}
-static void decodeSetupFileList(struct SetupFileList *setup_file_list)
+static void decodeSetupFileHash(SetupFileHash *setup_file_hash)
{
int i, pnr;
- if (!setup_file_list)
+ if (!setup_file_hash)
return;
/* global setup */
si = setup;
for (i=0; i<NUM_GLOBAL_SETUP_TOKENS; i++)
setSetupInfo(global_setup_tokens, i,
- getTokenValue(setup_file_list, global_setup_tokens[i].text));
+ getHashEntry(setup_file_hash, global_setup_tokens[i].text));
setup = si;
/* editor setup */
sei = setup.editor;
for (i=0; i<NUM_EDITOR_SETUP_TOKENS; i++)
setSetupInfo(editor_setup_tokens, i,
- getTokenValue(setup_file_list,editor_setup_tokens[i].text));
+ getHashEntry(setup_file_hash,editor_setup_tokens[i].text));
setup.editor = sei;
/* shortcut setup */
ssi = setup.shortcut;
for (i=0; i<NUM_SHORTCUT_SETUP_TOKENS; i++)
setSetupInfo(shortcut_setup_tokens, i,
- getTokenValue(setup_file_list,shortcut_setup_tokens[i].text));
+ getHashEntry(setup_file_hash,shortcut_setup_tokens[i].text));
setup.shortcut = ssi;
/* player setup */
sprintf(full_token, "%s%s", prefix, player_setup_tokens[i].text);
setSetupInfo(player_setup_tokens, i,
- getTokenValue(setup_file_list, full_token));
+ getHashEntry(setup_file_hash, full_token));
}
setup.input[pnr] = sii;
}
syi = setup.system;
for (i=0; i<NUM_SYSTEM_SETUP_TOKENS; i++)
setSetupInfo(system_setup_tokens, i,
- getTokenValue(setup_file_list, system_setup_tokens[i].text));
+ getHashEntry(setup_file_hash, system_setup_tokens[i].text));
setup.system = syi;
/* options setup */
soi = setup.options;
for (i=0; i<NUM_OPTIONS_SETUP_TOKENS; i++)
setSetupInfo(options_setup_tokens, i,
- getTokenValue(setup_file_list, options_setup_tokens[i].text));
+ getHashEntry(setup_file_hash, options_setup_tokens[i].text));
setup.options = soi;
}
void LoadSetup()
{
char *filename = getSetupFilename();
- struct SetupFileList *setup_file_list = NULL;
+ SetupFileHash *setup_file_hash = NULL;
/* always start with reliable default values */
setSetupInfoToDefaults(&setup);
- setup_file_list = loadSetupFileList(filename);
+ setup_file_hash = loadSetupFileHash(filename);
- if (setup_file_list)
+ if (setup_file_hash)
{
char *player_name_new;
- checkSetupFileListIdentifier(setup_file_list, getCookie("SETUP"));
- decodeSetupFileList(setup_file_list);
+ checkSetupFileHashIdentifier(setup_file_hash, getCookie("SETUP"));
+ decodeSetupFileHash(setup_file_hash);
setup.direct_draw = !setup.double_buffering;
- freeSetupFileList(setup_file_list);
+ freeSetupFileHash(setup_file_hash);
/* needed to work around problems with fixed length strings */
player_name_new = get_corrected_login_name(setup.player_name);
void LoadCustomElementDescriptions()
{
char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);
- struct SetupFileList *setup_file_list;
+ SetupFileHash *setup_file_hash;
int i;
for (i=0; i<NUM_FILE_ELEMENTS; i++)
}
}
- if ((setup_file_list = loadSetupFileList(filename)) == NULL)
+ if ((setup_file_hash = loadSetupFileHash(filename)) == NULL)
return;
for (i=0; i<NUM_FILE_ELEMENTS; i++)
{
char *token = getStringCat2(element_info[i].token_name, ".name");
- char *value = getTokenValue(setup_file_list, token);
+ char *value = getHashEntry(setup_file_hash, token);
if (value != NULL)
element_info[i].custom_description = getStringCopy(value);
free(token);
}
- freeSetupFileList(setup_file_list);
+ freeSetupFileHash(setup_file_hash);
}
void LoadSpecialMenuDesignSettings()
{
char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);
- struct SetupFileList *setup_file_list;
+ SetupFileHash *setup_file_hash;
char *value;
/* !!! CHANGE THIS !!! (redundant initialization) !!! */
global.door_step_offset = 2;
global.door_step_delay = 10;
- if ((setup_file_list = loadSetupFileList(filename)) == NULL)
+ if ((setup_file_hash = loadSetupFileHash(filename)) == NULL)
return;
- value = getTokenValue(setup_file_list, "global.num_toons");
+ value = getHashEntry(setup_file_hash, "global.num_toons");
if (value != NULL)
global.num_toons = get_integer_from_string(value);
- value = getTokenValue(setup_file_list, "menu.draw_xoffset");
+ value = getHashEntry(setup_file_hash, "menu.draw_xoffset");
if (value != NULL)
global.menu_draw_xoffset = get_integer_from_string(value);
- value = getTokenValue(setup_file_list, "menu.draw_yoffset");
+ value = getHashEntry(setup_file_hash, "menu.draw_yoffset");
if (value != NULL)
global.menu_draw_yoffset = get_integer_from_string(value);
- value = getTokenValue(setup_file_list, "menu.draw_xoffset.MAIN");
+ value = getHashEntry(setup_file_hash, "menu.draw_xoffset.MAIN");
if (value != NULL)
global.menu_draw_xoffset_MAIN = get_integer_from_string(value);
- value = getTokenValue(setup_file_list, "menu.draw_yoffset.MAIN");
+ value = getHashEntry(setup_file_hash, "menu.draw_yoffset.MAIN");
if (value != NULL)
global.menu_draw_yoffset_MAIN = get_integer_from_string(value);
- value = getTokenValue(setup_file_list, "door.step_offset");
+ value = getHashEntry(setup_file_hash, "door.step_offset");
if (value != NULL)
global.door_step_offset = get_integer_from_string(value);
- value = getTokenValue(setup_file_list, "door.step_delay");
+ value = getHashEntry(setup_file_hash, "door.step_delay");
if (value != NULL)
global.door_step_delay = get_integer_from_string(value);
- freeSetupFileList(setup_file_list);
+ freeSetupFileHash(setup_file_hash);
}