// ----------------------------------------------------------------------------
// main.c
// ============================================================================
// ----------------------------------------------------------------------------
// main.c
// ============================================================================
short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
int TimeFrames, TimePlayed, TimeLeft, TapeTime;
boolean network_player_action_received = FALSE;
int TimeFrames, TimePlayed, TimeLeft, TapeTime;
boolean network_player_action_received = FALSE;
struct LevelInfo level, level_template;
struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
struct HiScore highscore[MAX_SCORE_ENTRIES];
struct TapeInfo tape;
struct LevelInfo level, level_template;
struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
struct HiScore highscore[MAX_SCORE_ENTRIES];
struct TapeInfo tape;
-/* ------------------------------------------------------------------------- */
-/* element definitions */
-/* ------------------------------------------------------------------------- */
+// ----------------------------------------------------------------------------
+// element definitions
+// ----------------------------------------------------------------------------
- /* ----------------------------------------------------------------------- */
- /* "real" level file elements */
- /* ----------------------------------------------------------------------- */
+ // --------------------------------------------------------------------------
+ // "real" level file elements
+ // --------------------------------------------------------------------------
- "mm_polarisator_cross_1",
- "mm_polarisator_cross",
- "two-way polarisator (0\xb0)"
+ "mm_polarizer_cross_1",
+ "mm_polarizer_cross",
+ "two-way polarizer (0\xb0)"
- "mm_polarisator_cross_2",
- "mm_polarisator_cross",
- "two-way polarisator (22.5\xb0)"
+ "mm_polarizer_cross_2",
+ "mm_polarizer_cross",
+ "two-way polarizer (22.5\xb0)"
- "mm_polarisator_cross_3",
- "mm_polarisator_cross",
- "two-way polarisator (45\xb0)"
+ "mm_polarizer_cross_3",
+ "mm_polarizer_cross",
+ "two-way polarizer (45\xb0)"
- "mm_polarisator_cross_4",
- "mm_polarisator_cross",
- "two-way polarisator (67.5\xb0)"
+ "mm_polarizer_cross_4",
+ "mm_polarizer_cross",
+ "two-way polarizer (67.5\xb0)"
{
"df_wooden_grid_rotating_1",
"df_wooden_grid_rotating",
{
"df_wooden_grid_rotating_1",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_2",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_2",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_3",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_3",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_4",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_4",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_5",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_5",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_6",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_6",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_7",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_7",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_8",
"df_wooden_grid_rotating",
},
{
"df_wooden_grid_rotating_8",
"df_wooden_grid_rotating",
},
{
"df_steel_grid_rotating_1",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_1",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_2",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_2",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_3",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_3",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_4",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_4",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_5",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_5",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_6",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_6",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_7",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_7",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_8",
"df_steel_grid_rotating",
},
{
"df_steel_grid_rotating_8",
"df_steel_grid_rotating",
- /* ----------------------------------------------------------------------- */
- /* "real" (and therefore drawable) runtime elements */
- /* ----------------------------------------------------------------------- */
+ // --------------------------------------------------------------------------
+ // "real" (and therefore drawable) runtime elements
+ // --------------------------------------------------------------------------
- /* ----------------------------------------------------------------------- */
- /* "unreal" (and therefore not drawable) runtime elements */
- /* ----------------------------------------------------------------------- */
+ // --------------------------------------------------------------------------
+ // "unreal" (and therefore not drawable) runtime elements
+ // --------------------------------------------------------------------------
- /* ----------------------------------------------------------------------- */
- /* dummy elements (never used as game elements, only used as graphics) */
- /* ----------------------------------------------------------------------- */
+ // --------------------------------------------------------------------------
+ // dummy elements (never used as game elements, only used as graphics)
+ // --------------------------------------------------------------------------
-/* ------------------------------------------------------------------------- */
-/* element action and direction definitions */
-/* ------------------------------------------------------------------------- */
+// ----------------------------------------------------------------------------
+// element action and direction definitions
+// ----------------------------------------------------------------------------
{ ".part_32", ACTION_PART_32, FALSE },
{ ".other", ACTION_OTHER, FALSE },
{ ".part_32", ACTION_PART_32, FALSE },
{ ".other", ACTION_OTHER, FALSE },
{ "", ACTION_DEFAULT, TRUE },
{ NULL, 0, 0 }
{ "", ACTION_DEFAULT, TRUE },
{ NULL, 0, 0 }
{ ".TOONS", GFX_SPECIAL_ARG_TOONS, },
{ ".SCORESOLD", GFX_SPECIAL_ARG_SCORESOLD, },
{ ".SCORESNEW", GFX_SPECIAL_ARG_SCORESNEW, },
{ ".TOONS", GFX_SPECIAL_ARG_TOONS, },
{ ".SCORESOLD", GFX_SPECIAL_ARG_SCORESOLD, },
{ ".SCORESNEW", GFX_SPECIAL_ARG_SCORESNEW, },
{ ".FADING", GFX_SPECIAL_ARG_FADING, },
{ ".QUIT", GFX_SPECIAL_ARG_QUIT, },
{ ".FADING", GFX_SPECIAL_ARG_FADING, },
{ ".QUIT", GFX_SPECIAL_ARG_QUIT, },
{ "", GFX_SPECIAL_ARG_DEFAULT, },
{ NULL, 0, }
};
{ "", GFX_SPECIAL_ARG_DEFAULT, },
{ NULL, 0, }
};
-/* ------------------------------------------------------------------------- */
-/* font definitions */
-/* ------------------------------------------------------------------------- */
+// ----------------------------------------------------------------------------
+// font definitions
+// ----------------------------------------------------------------------------
-/* Important: When one entry is a prefix of another entry, the longer entry
- must come first, because the dynamic configuration does prefix matching!
- (These definitions must match the corresponding definitions in "main.h"!) */
+// Important: When one entry is a prefix of another entry, the longer entry
+// must come first, because the dynamic configuration does prefix matching!
+// (These definitions must match the corresponding definitions in "main.h"!)
{ "font.game_info" },
{ "font.info.elements" },
{ "font.info.levelset" },
{ "font.game_info" },
{ "font.info.elements" },
{ "font.info.levelset" },
{ "gfx.global.anim_1", },
{ "gfx.global.anim_2", },
{ "gfx.global.anim_3", },
{ "gfx.global.anim_1", },
{ "gfx.global.anim_2", },
{ "gfx.global.anim_3", },
{ "gfx.global.anim_31", },
{ "gfx.global.anim_32", },
{ "gfx.global.anim_31", },
{ "gfx.global.anim_32", },
-/* ------------------------------------------------------------------------- */
-/* music token prefix definitions */
-/* ------------------------------------------------------------------------- */
+
+// ----------------------------------------------------------------------------
+// music token prefix definitions
+// ----------------------------------------------------------------------------
-/* ========================================================================= */
-/* main() */
-/* ========================================================================= */
+// ============================================================================
+// main()
+// ============================================================================
" --serveronly only start network server\n"
" -v, --verbose verbose mode\n"
" -V, --version show program version\n"
" --serveronly only start network server\n"
" -v, --verbose verbose mode\n"
" -V, --version show program version\n"
" -e, --execute COMMAND execute batch COMMAND\n"
"\n"
"Valid commands for '--execute' option:\n"
" -e, --execute COMMAND execute batch COMMAND\n"
"\n"
"Valid commands for '--execute' option:\n"
" \"print helptext.conf\" print default helptext config\n"
" \"dump level FILE\" dump level data from FILE\n"
" \"dump tape FILE\" dump tape data from FILE\n"
" \"print helptext.conf\" print default helptext config\n"
" \"dump level FILE\" dump level data from FILE\n"
" \"dump tape FILE\" dump tape data from FILE\n"
" \"autoplay LEVELDIR [NR ...]\" play level tapes for LEVELDIR\n"
" \"autoffwd LEVELDIR [NR ...]\" ffwd level tapes for LEVELDIR\n"
" \"autowarp LEVELDIR [NR ...]\" warp level tapes for LEVELDIR\n"
" \"autoplay LEVELDIR [NR ...]\" play level tapes for LEVELDIR\n"
" \"autoffwd LEVELDIR [NR ...]\" ffwd level tapes for LEVELDIR\n"
" \"autowarp LEVELDIR [NR ...]\" warp level tapes for LEVELDIR\n"
" \"convert LEVELDIR [NR]\" convert levels in LEVELDIR\n"
" \"create images DIRECTORY\" write BMP images to DIRECTORY\n"
" \"create CE image DIRECTORY\" write BMP image to DIRECTORY\n"
" \"convert LEVELDIR [NR]\" convert levels in LEVELDIR\n"
" \"create images DIRECTORY\" write BMP images to DIRECTORY\n"
" \"create CE image DIRECTORY\" write BMP image to DIRECTORY\n"
char *config_filename = getProgramConfigFilename(command_filename);
char *userdata_basename = getBaseNameNoSuffix(command_filename);
char *userdata_subdir;
char *config_filename = getProgramConfigFilename(command_filename);
char *userdata_basename = getBaseNameNoSuffix(command_filename);
char *userdata_subdir;
// read default program config, if existing
if (fileExists(config_filename))
{
// if program config file exists, derive Unix user data directory from it
// read default program config, if existing
if (fileExists(config_filename))
{
// if program config file exists, derive Unix user data directory from it
- userdata_basename = getBaseName(config_filename);
+ // (but only if the program config file is not generic "setup.conf" file)
+ if (!strEqual(getBaseNamePtr(config_filename), SETUP_FILENAME))
+ {
+ userdata_basename = getBaseName(config_filename);
- if (strSuffix(userdata_basename, ".conf"))
- userdata_basename[strlen(userdata_basename) - 5] = '\0';
+ if (strSuffix(userdata_basename, ".conf"))
+ userdata_basename[strlen(userdata_basename) - 5] = '\0';
+ }
// set user data directory for Linux/Unix (but not Mac OS X)
userdata_subdir_unix = getStringCat2(".", userdata_basename);
// set user data directory for Linux/Unix (but not Mac OS X)
userdata_subdir_unix = getStringCat2(".", userdata_basename);
// set program title from potentially redefined program title
if (setup.internal.program_title != NULL &&
// set program title from potentially redefined program title
if (setup.internal.program_title != NULL &&