#define CONFIG_TOKEN_FONT_INITIAL "font.initial"
-struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
+static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
+static int copy_properties[][5] =
+{
+ {
+ EL_BUG,
+ EL_BUG_LEFT, EL_BUG_RIGHT,
+ EL_BUG_UP, EL_BUG_DOWN
+ },
+ {
+ EL_SPACESHIP,
+ EL_SPACESHIP_LEFT, EL_SPACESHIP_RIGHT,
+ EL_SPACESHIP_UP, EL_SPACESHIP_DOWN
+ },
+ {
+ EL_BD_BUTTERFLY,
+ EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_RIGHT,
+ EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY_DOWN
+ },
+ {
+ EL_BD_FIREFLY,
+ EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_RIGHT,
+ EL_BD_FIREFLY_UP, EL_BD_FIREFLY_DOWN
+ },
+ {
+ EL_PACMAN,
+ EL_PACMAN_LEFT, EL_PACMAN_RIGHT,
+ EL_PACMAN_UP, EL_PACMAN_DOWN
+ },
+ {
+ EL_MOLE,
+ EL_MOLE_LEFT, EL_MOLE_RIGHT,
+ EL_MOLE_UP, EL_MOLE_DOWN
+ },
+ {
+ -1,
+ -1, -1, -1, -1
+ }
+};
static void InitTileClipmasks()
{
int anim_frames_per_line = 1;
int i;
+#if 1
+#if 1
+
+ /* !!! NEW ARTWORK FALLBACK CODE !!! NEARLY UNTESTED !!! */
+ /* if fallback to default artwork is done, also use the default parameters */
+ if (image->fallback_to_default)
+ {
+#if 0
+ printf("::: FALLBACK for %d\n", graphic_copy_from);
+#endif
+
+ parameter_raw = image->default_parameter;
+ }
+
+#else
+
+ /* !!! ARTWORK FALLBACK CODE !!! NEARLY UNTESTED !!! */
+ /* (better try to set a "fallback -> use default parameters" flag) */
+ if (src_bitmap)
+ {
+ int len_source_filename = strlen(src_bitmap->source_filename);
+ int len_default_filename = strlen(image->default_filename);
+ int pos_basename = len_source_filename - len_default_filename;
+ char *source_basename = &src_bitmap->source_filename[pos_basename];
+
+#if 0
+ printf("::: src_bitmap->source_filename -> '%s'\n",
+ src_bitmap->source_filename);
+ printf("::: image->default_filename -> '%s'\n",
+ image->default_filename);
+ printf("::: image->filename -> '%s'\n",
+ image->filename);
+#endif
+
+ /* check if there was a fallback to the default artwork file */
+ if (strcmp(image->filename, image->default_filename) != 0 &&
+ pos_basename >= 0 &&
+ strcmp(source_basename, image->default_filename) == 0)
+ parameter_raw = image->default_parameter;
+ }
+#endif
+#endif
+
/* get integer values from string parameters */
for (i = 0; i < NUM_GFX_ARGS; i++)
{
element_info[i].sound[act] = default_action_sound;
}
}
+
+#if 1
+ /* copy sound settings to some elements that are only stored in level file
+ in native R'n'D levels, but are used by game engine in native EM levels */
+ for (i = 0; copy_properties[i][0] != -1; i++)
+ for (j = 1; j <= 4; j++)
+ for (act = 0; act < NUM_ACTIONS; act++)
+ element_info[copy_properties[i][j]].sound[act] =
+ element_info[copy_properties[i][0]].sound[act];
+#endif
}
static void InitGameModeSoundInfo()
free(sound_effect_properties);
+#if 0
+ /* !!! MOVED TO "InitElementSoundInfo()" !!! */
+ /* !!! everything defined here gets overwritten there !!! */
+
+ /* copy sound settings to some elements that are only stored in level file
+ in native R'n'D levels, but are used by game engine in native EM levels */
+ for (i = 0; i < NUM_ACTIONS; i++)
+ for (j = 0; copy_properties[j][0] != -1; j++)
+ for (k = 1; k <= 4; k++)
+ element_info[copy_properties[j][k]].sound[i] =
+ element_info[copy_properties[j][0]].sound[i];
+
+ printf("::: bug -> %d\n", element_info[EL_BUG].sound[ACTION_MOVING]);
+ printf("::: bug_r -> %d\n", element_info[EL_BUG_RIGHT].sound[ACTION_MOVING]);
+#endif
+
#if 0
/* !!! now handled in InitElementSoundInfo() !!! */
/* initialize element/sound mapping from dynamic configuration */
EL_EM_KEY_2,
EL_EM_KEY_3,
EL_EM_KEY_4,
- EL_EM_KEY_5,
- EL_EM_KEY_6,
- EL_EM_KEY_7,
- EL_EM_KEY_8,
+ EL_EMC_KEY_5,
+ EL_EMC_KEY_6,
+ EL_EMC_KEY_7,
+ EL_EMC_KEY_8,
EL_DYNAMITE,
EL_DYNABOMB_INCREASE_NUMBER,
EL_DYNABOMB_INCREASE_SIZE,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
+ EL_EMC_GATE_5,
+ EL_EMC_GATE_6,
+ EL_EMC_GATE_7,
+ EL_EMC_GATE_8,
+ EL_EMC_GATE_5_GRAY,
+ EL_EMC_GATE_6_GRAY,
+ EL_EMC_GATE_7_GRAY,
+ EL_EMC_GATE_8_GRAY,
EL_SWITCHGATE_OPEN,
EL_SWITCHGATE_OPENING,
EL_SWITCHGATE_CLOSED,
EL_PENGUIN,
EL_PIG,
EL_DRAGON,
+
+#if 0 /* USE_GRAVITY_BUGFIX_OLD */
+ EL_PLAYER_IS_LEAVING, /* needed for gravity + "block last field" */
+#endif
+
-1
};
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
- EL_EM_GATE_5,
- EL_EM_GATE_6,
- EL_EM_GATE_7,
- EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
- EL_EM_GATE_5_GRAY,
- EL_EM_GATE_6_GRAY,
- EL_EM_GATE_7_GRAY,
- EL_EM_GATE_8_GRAY,
+ EL_EMC_GATE_5,
+ EL_EMC_GATE_6,
+ EL_EMC_GATE_7,
+ EL_EMC_GATE_8,
+ EL_EMC_GATE_5_GRAY,
+ EL_EMC_GATE_6_GRAY,
+ EL_EMC_GATE_7_GRAY,
+ EL_EMC_GATE_8_GRAY,
EL_SWITCHGATE_OPEN,
EL_TIMEGATE_OPEN,
-1
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
- EL_EM_GATE_5,
- EL_EM_GATE_6,
- EL_EM_GATE_7,
- EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
- EL_EM_GATE_5_GRAY,
- EL_EM_GATE_6_GRAY,
- EL_EM_GATE_7_GRAY,
- EL_EM_GATE_8_GRAY,
+ EL_EMC_GATE_5,
+ EL_EMC_GATE_6,
+ EL_EMC_GATE_7,
+ EL_EMC_GATE_8,
+ EL_EMC_GATE_5_GRAY,
+ EL_EMC_GATE_6_GRAY,
+ EL_EMC_GATE_7_GRAY,
+ EL_EMC_GATE_8_GRAY,
EL_SWITCHGATE_OPEN,
EL_TIMEGATE_OPEN,
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
- EL_EM_GATE_5,
- EL_EM_GATE_6,
- EL_EM_GATE_7,
- EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
- EL_EM_GATE_5_GRAY,
- EL_EM_GATE_6_GRAY,
- EL_EM_GATE_7_GRAY,
- EL_EM_GATE_8_GRAY,
+ EL_EMC_GATE_5,
+ EL_EMC_GATE_6,
+ EL_EMC_GATE_7,
+ EL_EMC_GATE_8,
+ EL_EMC_GATE_5_GRAY,
+ EL_EMC_GATE_6_GRAY,
+ EL_EMC_GATE_7_GRAY,
+ EL_EMC_GATE_8_GRAY,
-1
};
EL_EM_KEY_2,
EL_EM_KEY_3,
EL_EM_KEY_4,
- EL_EM_KEY_5,
- EL_EM_KEY_6,
- EL_EM_KEY_7,
- EL_EM_KEY_8,
+ EL_EMC_KEY_5,
+ EL_EMC_KEY_6,
+ EL_EMC_KEY_7,
+ EL_EMC_KEY_8,
EL_GATE_1,
EL_GATE_2,
EL_GATE_3,
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
- EL_EM_GATE_5,
- EL_EM_GATE_6,
- EL_EM_GATE_7,
- EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
- EL_EM_GATE_5_GRAY,
- EL_EM_GATE_6_GRAY,
- EL_EM_GATE_7_GRAY,
- EL_EM_GATE_8_GRAY,
+ EL_EMC_GATE_5,
+ EL_EMC_GATE_6,
+ EL_EMC_GATE_7,
+ EL_EMC_GATE_8,
+ EL_EMC_GATE_5_GRAY,
+ EL_EMC_GATE_6_GRAY,
+ EL_EMC_GATE_7_GRAY,
+ EL_EMC_GATE_8_GRAY,
EL_DYNAMITE,
EL_INVISIBLE_STEELWALL,
EL_INVISIBLE_WALL,
{ NULL, -1 }
};
- static int copy_properties[][5] =
- {
- {
- EL_BUG,
- EL_BUG_LEFT, EL_BUG_RIGHT,
- EL_BUG_UP, EL_BUG_DOWN
- },
- {
- EL_SPACESHIP,
- EL_SPACESHIP_LEFT, EL_SPACESHIP_RIGHT,
- EL_SPACESHIP_UP, EL_SPACESHIP_DOWN
- },
- {
- EL_BD_BUTTERFLY,
- EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_RIGHT,
- EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY_DOWN
- },
- {
- EL_BD_FIREFLY,
- EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_RIGHT,
- EL_BD_FIREFLY_UP, EL_BD_FIREFLY_DOWN
- },
- {
- EL_PACMAN,
- EL_PACMAN_LEFT, EL_PACMAN_RIGHT,
- EL_PACMAN_UP, EL_PACMAN_DOWN
- },
- {
- EL_MOLE,
- EL_MOLE_LEFT, EL_MOLE_RIGHT,
- EL_MOLE_UP, EL_MOLE_DOWN
- },
- {
- -1,
- -1, -1, -1, -1
- }
- };
-
int i, j, k;
/* always start with reliable default values (element has no properties) */
{
char *filename = &command[11];
- if (access(filename, F_OK) != 0)
+ if (!fileExists(filename))
Error(ERR_EXIT, "cannot open file '%s'", filename);
LoadLevelFromFilename(&level, filename);
{
char *filename = &command[10];
- if (access(filename, F_OK) != 0)
+ if (!fileExists(filename))
Error(ERR_EXIT, "cannot open file '%s'", filename);
LoadTapeFromFilename(filename);
}
else if (strncmp(command, "autoplay ", 9) == 0)
{
- char *str_copy = getStringCopy(&command[9]);
- char *str_ptr = strchr(str_copy, ' ');
+ char *str_ptr = getStringCopy(&command[9]); /* read command parameters */
- global.autoplay_leveldir = str_copy;
- global.autoplay_level_nr = -1;
+ while (*str_ptr != '\0') /* continue parsing string */
+ {
+ /* cut leading whitespace from string, replace it by string terminator */
+ while (*str_ptr == ' ' || *str_ptr == '\t')
+ *str_ptr++ = '\0';
- if (str_ptr != NULL)
+ if (*str_ptr == '\0') /* end of string reached */
+ break;
+
+ if (global.autoplay_leveldir == NULL) /* read level set string */
+ {
+ global.autoplay_leveldir = str_ptr;
+ global.autoplay_all = TRUE; /* default: play all tapes */
+
+ for (i = 0; i < MAX_TAPES_PER_SET; i++)
+ global.autoplay_level[i] = FALSE;
+ }
+ else /* read level number string */
+ {
+ int level_nr = atoi(str_ptr); /* get level_nr value */
+
+ if (level_nr >= 0 && level_nr < MAX_TAPES_PER_SET)
+ global.autoplay_level[level_nr] = TRUE;
+
+ global.autoplay_all = FALSE;
+ }
+
+ /* advance string pointer to the next whitespace (or end of string) */
+ while (*str_ptr != ' ' && *str_ptr != '\t' && *str_ptr != '\0')
+ str_ptr++;
+ }
+
+#if 0
+ printf("level set == '%s'\n", global.autoplay_leveldir);
+
+ if (global.autoplay_all)
+ printf("play all levels\n");
+ else
{
- *str_ptr++ = '\0'; /* terminate leveldir string */
- global.autoplay_level_nr = atoi(str_ptr); /* get level_nr value */
+ printf("play the following levels:");
+
+ for (i = 0; i < MAX_TAPES_PER_SET; i++)
+ if (global.autoplay_level[i])
+ printf(" %03d", i);
+
+ printf("\n");
}
+#endif
+
}
else if (strncmp(command, "convert ", 8) == 0)
{
global.convert_leveldir = str_copy;
global.convert_level_nr = -1;
- if (str_ptr != NULL)
+ if (str_ptr != NULL) /* level number follows */
{
*str_ptr++ = '\0'; /* terminate leveldir string */
global.convert_level_nr = atoi(str_ptr); /* get level_nr value */
artwork_current_identifier) != 0)
artwork_new_identifier = artwork_current_identifier;
+#if 1
+ *(ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type))= artwork_current_identifier;
+#else
+ /* newer versions of gcc do not like this anymore :-/ */
*(&(ARTWORK_CURRENT_IDENTIFIER(artwork, type))) = artwork_current_identifier;
+#endif
#if 0
if (type == ARTWORK_TYPE_GRAPHICS)
void OpenAll()
{
- InitGlobal(); /* initialize some global variables */
+ InitGlobal(); /* initialize some global variables */
if (options.execute_command)
Execute_Command(options.execute_command);
#else
Error(ERR_WARN, "networking only supported in Unix version");
#endif
- exit(0); /* never reached */
+
+ exit(0); /* never reached, server loops forever */
}
InitSetup();