#include "files.h"
#include "init.h"
+#include "screens.h"
#include "tools.h"
#include "tape.h"
#include "config.h"
#define TAPE_CHUNK_VERS_SIZE 8 /* size of file version chunk */
#define TAPE_CHUNK_HEAD_SIZE 20 /* size of tape file header */
-#define TAPE_CHUNK_HEAD_UNUSED 3 /* unused tape header bytes */
+#define TAPE_CHUNK_HEAD_UNUSED 2 /* unused tape header bytes */
#define LEVEL_CHUNK_CNT3_SIZE(x) (LEVEL_CHUNK_CNT3_HEADER + (x))
#define LEVEL_CHUNK_CUS3_SIZE(x) (2 + (x) * LEVEL_CPART_CUS3_SIZE)
},
{
- EL_MM_FUSE, -1,
+ EL_MM_FUSE_ACTIVE, -1,
TYPE_INTEGER, CONF_VALUE_16_BIT(1),
- &li.mm_time_fuse, 0
+ &li.mm_time_fuse, 25
+ },
+ {
+ EL_MM_BOMB, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(1),
+ &li.mm_time_bomb, 75
+ },
+ {
+ EL_MM_GRAY_BALL, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(1),
+ &li.mm_time_ball, 75
+ },
+ {
+ EL_MM_STEEL_BLOCK, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(1),
+ &li.mm_time_block, 75
+ },
+ {
+ EL_MM_LIGHTBALL, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(1),
+ &li.score[SC_ELEM_BONUS], 10
},
/* ---------- unused values ----------------------------------------------- */
{
EL_UNKNOWN, SAVE_CONF_NEVER,
TYPE_INTEGER, CONF_VALUE_16_BIT(1),
- &li.score[SC_UNKNOWN_14], 10
- },
- {
- EL_UNKNOWN, SAVE_CONF_NEVER,
- TYPE_INTEGER, CONF_VALUE_16_BIT(2),
&li.score[SC_UNKNOWN_15], 10
},
struct LevelInfo_MM *level_mm = level->native_mm_level;
int x, y;
- level_mm->file_version = level->file_version;
- level_mm->game_version = level->game_version;
- level_mm->encoding_16bit_field = level->encoding_16bit_field;
-
level_mm->fieldx = MIN(level->fieldx, MM_MAX_PLAYFIELD_WIDTH);
level_mm->fieldy = MIN(level->fieldy, MM_MAX_PLAYFIELD_HEIGHT);
strcpy(level_mm->name, level->name);
strcpy(level_mm->author, level->author);
+ level_mm->score[SC_EMERALD] = level->score[SC_EMERALD];
level_mm->score[SC_PACMAN] = level->score[SC_PACMAN];
- level_mm->score[SC_KEY] = level->score[SC_PACMAN];
+ level_mm->score[SC_KEY] = level->score[SC_KEY];
level_mm->score[SC_TIME_BONUS] = level->score[SC_TIME_BONUS];
+ level_mm->score[SC_ELEM_BONUS] = level->score[SC_ELEM_BONUS];
level_mm->amoeba_speed = level->amoeba_speed;
- level_mm->time_fuse = level->mm_time_fuse;
+ level_mm->time_fuse = level->mm_time_fuse;
+ level_mm->time_bomb = level->mm_time_bomb;
+ level_mm->time_ball = level->mm_time_ball;
+ level_mm->time_block = level->mm_time_block;
for (x = 0; x < level->fieldx; x++)
for (y = 0; y < level->fieldy; y++)
struct LevelInfo_MM *level_mm = level->native_mm_level;
int x, y;
- level->file_version = level_mm->file_version;
- level->game_version = level_mm->game_version;
- level->encoding_16bit_field = level_mm->encoding_16bit_field;
-
level->fieldx = MIN(level_mm->fieldx, MAX_LEV_FIELDX);
level->fieldy = MIN(level_mm->fieldy, MAX_LEV_FIELDY);
if (!strEqual(level_mm->author, ANONYMOUS_NAME))
strcpy(level->author, level_mm->author);
+ level->score[SC_EMERALD] = level_mm->score[SC_EMERALD];
level->score[SC_PACMAN] = level_mm->score[SC_PACMAN];
- level->score[SC_KEY] = level_mm->score[SC_PACMAN];
+ level->score[SC_KEY] = level_mm->score[SC_KEY];
level->score[SC_TIME_BONUS] = level_mm->score[SC_TIME_BONUS];
+ level->score[SC_ELEM_BONUS] = level_mm->score[SC_ELEM_BONUS];
- level->amoeba_speed = level_mm->amoeba_speed;
- level->mm_time_fuse = level_mm->time_fuse;
+ level->amoeba_speed = level_mm->amoeba_speed;
+ level->mm_time_fuse = level_mm->time_fuse;
+ level->mm_time_bomb = level_mm->time_bomb;
+ level->mm_time_ball = level_mm->time_ball;
+ level->mm_time_block = level_mm->time_block;
for (x = 0; x < level->fieldx; x++)
for (y = 0; y < level->fieldy; y++)
}
}
+ tape->use_mouse = (getFile8Bit(file) == 1 ? TRUE : FALSE);
+
ReadUnusedBytesFromFile(file, TAPE_CHUNK_HEAD_UNUSED);
engine_version = getFileVersion(file);
static int LoadTape_BODY(File *file, int chunk_size, struct TapeInfo *tape)
{
int i, j;
- int chunk_size_expected =
- (tape->num_participating_players + 1) * tape->length;
+ int tape_pos_size =
+ (tape->use_mouse ? 3 : tape->num_participating_players) + 1;
+ int chunk_size_expected = tape_pos_size * tape->length;
if (chunk_size_expected != chunk_size)
{
break;
}
- for (j = 0; j < MAX_PLAYERS; j++)
+ if (tape->use_mouse)
{
- tape->pos[i].action[j] = MV_NONE;
+ tape->pos[i].action[TAPE_ACTION_LX] = getFile8Bit(file);
+ tape->pos[i].action[TAPE_ACTION_LY] = getFile8Bit(file);
+ tape->pos[i].action[TAPE_ACTION_BUTTON] = getFile8Bit(file);
- if (tape->player_participates[j])
- tape->pos[i].action[j] = getFile8Bit(file);
+ tape->pos[i].action[TAPE_ACTION_UNUSED] = 0;
+ }
+ else
+ {
+ for (j = 0; j < MAX_PLAYERS; j++)
+ {
+ tape->pos[i].action[j] = MV_NONE;
+
+ if (tape->player_participates[j])
+ tape->pos[i].action[j] = getFile8Bit(file);
+ }
}
tape->pos[i].delay = getFile8Bit(file);
}
if (i != tape->length)
- chunk_size = (tape->num_participating_players + 1) * i;
+ chunk_size = tape_pos_size * i;
return chunk_size;
}
putFile8Bit(file, store_participating_players);
+ putFile8Bit(file, (tape->use_mouse ? 1 : 0));
+
/* unused bytes not at the end here for 4-byte alignment of engine_version */
WriteUnusedBytesToFile(file, TAPE_CHUNK_HEAD_UNUSED);
for (i = 0; i < tape->length; i++)
{
- for (j = 0; j < MAX_PLAYERS; j++)
- if (tape->player_participates[j])
- putFile8Bit(file, tape->pos[i].action[j]);
+ if (tape->use_mouse)
+ {
+ putFile8Bit(file, tape->pos[i].action[TAPE_ACTION_LX]);
+ putFile8Bit(file, tape->pos[i].action[TAPE_ACTION_LY]);
+ putFile8Bit(file, tape->pos[i].action[TAPE_ACTION_BUTTON]);
+ }
+ else
+ {
+ for (j = 0; j < MAX_PLAYERS; j++)
+ if (tape->player_participates[j])
+ putFile8Bit(file, tape->pos[i].action[j]);
+ }
putFile8Bit(file, tape->pos[i].delay);
}
char *filename = getTapeFilename(nr);
FILE *file;
int num_participating_players = 0;
+ int tape_pos_size;
int info_chunk_size;
int body_chunk_size;
int i;
if (tape.player_participates[i])
num_participating_players++;
+ tape_pos_size = (tape.use_mouse ? 3 : num_participating_players) + 1;
+
info_chunk_size = 2 + (strlen(tape.level_identifier) + 1) + 2;
- body_chunk_size = (num_participating_players + 1) * tape.length;
+ body_chunk_size = tape_pos_size * tape.length;
putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED);
putFileChunkBE(file, "TAPE", CHUNK_SIZE_NONE);
tape.changed = FALSE;
}
-boolean SaveTapeChecked(int nr)
+static boolean SaveTapeCheckedExt(int nr, char *msg_replace, char *msg_saved)
{
char *filename = getTapeFilename(nr);
boolean new_tape = !fileExists(filename);
boolean tape_saved = FALSE;
- if (new_tape || Request("Replace old tape?", REQ_ASK))
+ if (new_tape || Request(msg_replace, REQ_ASK))
{
SaveTape(nr);
if (new_tape)
- Request("Tape saved!", REQ_CONFIRM);
+ Request(msg_saved, REQ_CONFIRM);
tape_saved = TRUE;
}
return tape_saved;
}
+boolean SaveTapeChecked(int nr)
+{
+ return SaveTapeCheckedExt(nr, "Replace old tape?", "Tape saved!");
+}
+
+boolean SaveTapeChecked_LevelSolved(int nr)
+{
+ return SaveTapeCheckedExt(nr, "Level solved! Replace old tape?",
+ "Level solved! Tape saved!");
+}
+
void DumpTape(struct TapeInfo *tape)
{
int tape_frame_counter;
#define TOKEN_STR_PLAYER_PREFIX "player_"
/* global setup */
-#define SETUP_TOKEN_PLAYER_NAME 0
-#define SETUP_TOKEN_SOUND 1
-#define SETUP_TOKEN_SOUND_LOOPS 2
-#define SETUP_TOKEN_SOUND_MUSIC 3
-#define SETUP_TOKEN_SOUND_SIMPLE 4
-#define SETUP_TOKEN_TOONS 5
-#define SETUP_TOKEN_SCROLL_DELAY 6
-#define SETUP_TOKEN_SCROLL_DELAY_VALUE 7
-#define SETUP_TOKEN_ENGINE_SNAPSHOT_MODE 8
-#define SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY 9
-#define SETUP_TOKEN_FADE_SCREENS 10
-#define SETUP_TOKEN_AUTORECORD 11
-#define SETUP_TOKEN_SHOW_TITLESCREEN 12
-#define SETUP_TOKEN_QUICK_DOORS 13
-#define SETUP_TOKEN_TEAM_MODE 14
-#define SETUP_TOKEN_HANDICAP 15
-#define SETUP_TOKEN_SKIP_LEVELS 16
-#define SETUP_TOKEN_INCREMENT_LEVELS 17
-#define SETUP_TOKEN_TIME_LIMIT 18
-#define SETUP_TOKEN_FULLSCREEN 19
-#define SETUP_TOKEN_WINDOW_SCALING_PERCENT 20
-#define SETUP_TOKEN_WINDOW_SCALING_QUALITY 21
-#define SETUP_TOKEN_SCREEN_RENDERING_MODE 22
-#define SETUP_TOKEN_ASK_ON_ESCAPE 23
-#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 24
-#define SETUP_TOKEN_QUICK_SWITCH 25
-#define SETUP_TOKEN_INPUT_ON_FOCUS 26
-#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 27
-#define SETUP_TOKEN_GAME_FRAME_DELAY 28
-#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS 29
-#define SETUP_TOKEN_SMALL_GAME_GRAPHICS 30
-#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS 31
-#define SETUP_TOKEN_GRAPHICS_SET 32
-#define SETUP_TOKEN_SOUNDS_SET 33
-#define SETUP_TOKEN_MUSIC_SET 34
-#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 35
-#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 36
-#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 37
-#define SETUP_TOKEN_VOLUME_SIMPLE 38
-#define SETUP_TOKEN_VOLUME_LOOPS 39
-#define SETUP_TOKEN_VOLUME_MUSIC 40
-#define SETUP_TOKEN_TOUCH_CONTROL_TYPE 41
-#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 42
-#define SETUP_TOKEN_TOUCH_DROP_DISTANCE 43
-
-#define NUM_GLOBAL_SETUP_TOKENS 44
+enum
+{
+ SETUP_TOKEN_PLAYER_NAME = 0,
+ SETUP_TOKEN_SOUND,
+ SETUP_TOKEN_SOUND_LOOPS,
+ SETUP_TOKEN_SOUND_MUSIC,
+ SETUP_TOKEN_SOUND_SIMPLE,
+ SETUP_TOKEN_TOONS,
+ SETUP_TOKEN_SCROLL_DELAY,
+ SETUP_TOKEN_SCROLL_DELAY_VALUE,
+ SETUP_TOKEN_ENGINE_SNAPSHOT_MODE,
+ SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY,
+ SETUP_TOKEN_FADE_SCREENS,
+ SETUP_TOKEN_AUTORECORD,
+ SETUP_TOKEN_SHOW_TITLESCREEN,
+ SETUP_TOKEN_QUICK_DOORS,
+ SETUP_TOKEN_TEAM_MODE,
+ SETUP_TOKEN_HANDICAP,
+ SETUP_TOKEN_SKIP_LEVELS,
+ SETUP_TOKEN_INCREMENT_LEVELS,
+ SETUP_TOKEN_AUTO_PLAY_NEXT_LEVEL,
+ SETUP_TOKEN_SKIP_SCORES_AFTER_GAME,
+ SETUP_TOKEN_TIME_LIMIT,
+ SETUP_TOKEN_FULLSCREEN,
+ SETUP_TOKEN_WINDOW_SCALING_PERCENT,
+ SETUP_TOKEN_WINDOW_SCALING_QUALITY,
+ SETUP_TOKEN_SCREEN_RENDERING_MODE,
+ SETUP_TOKEN_ASK_ON_ESCAPE,
+ SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR,
+ SETUP_TOKEN_QUICK_SWITCH,
+ SETUP_TOKEN_INPUT_ON_FOCUS,
+ SETUP_TOKEN_PREFER_AGA_GRAPHICS,
+ SETUP_TOKEN_GAME_FRAME_DELAY,
+ SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS,
+ SETUP_TOKEN_SMALL_GAME_GRAPHICS,
+ SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS,
+ SETUP_TOKEN_GRAPHICS_SET,
+ SETUP_TOKEN_SOUNDS_SET,
+ SETUP_TOKEN_MUSIC_SET,
+ SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS,
+ SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS,
+ SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC,
+ SETUP_TOKEN_VOLUME_SIMPLE,
+ SETUP_TOKEN_VOLUME_LOOPS,
+ SETUP_TOKEN_VOLUME_MUSIC,
+ SETUP_TOKEN_NETWORK_MODE,
+ SETUP_TOKEN_NETWORK_PLAYER_NR,
+ SETUP_TOKEN_TOUCH_CONTROL_TYPE,
+ SETUP_TOKEN_TOUCH_MOVE_DISTANCE,
+ SETUP_TOKEN_TOUCH_DROP_DISTANCE,
+ SETUP_TOKEN_TOUCH_TRANSPARENCY,
+ SETUP_TOKEN_TOUCH_DRAW_OUTLINED,
+ SETUP_TOKEN_TOUCH_DRAW_PRESSED,
+ SETUP_TOKEN_TOUCH_GRID_XSIZE_0,
+ SETUP_TOKEN_TOUCH_GRID_YSIZE_0,
+ SETUP_TOKEN_TOUCH_GRID_XSIZE_1,
+ SETUP_TOKEN_TOUCH_GRID_YSIZE_1,
+
+ NUM_GLOBAL_SETUP_TOKENS
+};
+
+/* auto setup */
+enum
+{
+ SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE = 0,
+
+ NUM_AUTO_SETUP_TOKENS
+};
/* editor setup */
-#define SETUP_TOKEN_EDITOR_EL_CLASSIC 0
-#define SETUP_TOKEN_EDITOR_EL_CUSTOM 1
-#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED 2
-#define SETUP_TOKEN_EDITOR_EL_DYNAMIC 3
-#define SETUP_TOKEN_EDITOR_EL_HEADLINES 4
-#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN 5
+enum
+{
+ SETUP_TOKEN_EDITOR_EL_CLASSIC = 0,
+ SETUP_TOKEN_EDITOR_EL_CUSTOM,
+ SETUP_TOKEN_EDITOR_EL_USER_DEFINED,
+ SETUP_TOKEN_EDITOR_EL_DYNAMIC,
+ SETUP_TOKEN_EDITOR_EL_HEADLINES,
+ SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN,
-#define NUM_EDITOR_SETUP_TOKENS 6
+ NUM_EDITOR_SETUP_TOKENS
+};
/* editor cascade setup */
-#define SETUP_TOKEN_EDITOR_CASCADE_BD 0
-#define SETUP_TOKEN_EDITOR_CASCADE_EM 1
-#define SETUP_TOKEN_EDITOR_CASCADE_EMC 2
-#define SETUP_TOKEN_EDITOR_CASCADE_RND 3
-#define SETUP_TOKEN_EDITOR_CASCADE_SB 4
-#define SETUP_TOKEN_EDITOR_CASCADE_SP 5
-#define SETUP_TOKEN_EDITOR_CASCADE_DC 6
-#define SETUP_TOKEN_EDITOR_CASCADE_DX 7
-#define SETUP_TOKEN_EDITOR_CASCADE_TEXT 8
-#define SETUP_TOKEN_EDITOR_CASCADE_STEELTEXT 9
-#define SETUP_TOKEN_EDITOR_CASCADE_CE 10
-#define SETUP_TOKEN_EDITOR_CASCADE_GE 11
-#define SETUP_TOKEN_EDITOR_CASCADE_REF 12
-#define SETUP_TOKEN_EDITOR_CASCADE_USER 13
-#define SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC 14
-
-#define NUM_EDITOR_CASCADE_SETUP_TOKENS 15
+enum
+{
+ SETUP_TOKEN_EDITOR_CASCADE_BD = 0,
+ SETUP_TOKEN_EDITOR_CASCADE_EM,
+ SETUP_TOKEN_EDITOR_CASCADE_EMC,
+ SETUP_TOKEN_EDITOR_CASCADE_RND,
+ SETUP_TOKEN_EDITOR_CASCADE_SB,
+ SETUP_TOKEN_EDITOR_CASCADE_SP,
+ SETUP_TOKEN_EDITOR_CASCADE_DC,
+ SETUP_TOKEN_EDITOR_CASCADE_DX,
+ SETUP_TOKEN_EDITOR_CASCADE_TEXT,
+ SETUP_TOKEN_EDITOR_CASCADE_STEELTEXT,
+ SETUP_TOKEN_EDITOR_CASCADE_CE,
+ SETUP_TOKEN_EDITOR_CASCADE_GE,
+ SETUP_TOKEN_EDITOR_CASCADE_REF,
+ SETUP_TOKEN_EDITOR_CASCADE_USER,
+ SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC,
+
+ NUM_EDITOR_CASCADE_SETUP_TOKENS
+};
/* shortcut setup */
-#define SETUP_TOKEN_SHORTCUT_SAVE_GAME 0
-#define SETUP_TOKEN_SHORTCUT_LOAD_GAME 1
-#define SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE 2
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_1 3
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_2 4
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_3 5
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4 6
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL 7
-#define SETUP_TOKEN_SHORTCUT_TAPE_EJECT 8
-#define SETUP_TOKEN_SHORTCUT_TAPE_EXTRA 9
-#define SETUP_TOKEN_SHORTCUT_TAPE_STOP 10
-#define SETUP_TOKEN_SHORTCUT_TAPE_PAUSE 11
-#define SETUP_TOKEN_SHORTCUT_TAPE_RECORD 12
-#define SETUP_TOKEN_SHORTCUT_TAPE_PLAY 13
-#define SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE 14
-#define SETUP_TOKEN_SHORTCUT_SOUND_LOOPS 15
-#define SETUP_TOKEN_SHORTCUT_SOUND_MUSIC 16
-#define SETUP_TOKEN_SHORTCUT_SNAP_LEFT 17
-#define SETUP_TOKEN_SHORTCUT_SNAP_RIGHT 18
-#define SETUP_TOKEN_SHORTCUT_SNAP_UP 19
-#define SETUP_TOKEN_SHORTCUT_SNAP_DOWN 20
-
-#define NUM_SHORTCUT_SETUP_TOKENS 21
+enum
+{
+ SETUP_TOKEN_SHORTCUT_SAVE_GAME = 0,
+ SETUP_TOKEN_SHORTCUT_LOAD_GAME,
+ SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE,
+ SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_1,
+ SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_2,
+ SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_3,
+ SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4,
+ SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL,
+ SETUP_TOKEN_SHORTCUT_TAPE_EJECT,
+ SETUP_TOKEN_SHORTCUT_TAPE_EXTRA,
+ SETUP_TOKEN_SHORTCUT_TAPE_STOP,
+ SETUP_TOKEN_SHORTCUT_TAPE_PAUSE,
+ SETUP_TOKEN_SHORTCUT_TAPE_RECORD,
+ SETUP_TOKEN_SHORTCUT_TAPE_PLAY,
+ SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE,
+ SETUP_TOKEN_SHORTCUT_SOUND_LOOPS,
+ SETUP_TOKEN_SHORTCUT_SOUND_MUSIC,
+ SETUP_TOKEN_SHORTCUT_SNAP_LEFT,
+ SETUP_TOKEN_SHORTCUT_SNAP_RIGHT,
+ SETUP_TOKEN_SHORTCUT_SNAP_UP,
+ SETUP_TOKEN_SHORTCUT_SNAP_DOWN,
+
+ NUM_SHORTCUT_SETUP_TOKENS
+};
/* player setup */
-#define SETUP_TOKEN_PLAYER_USE_JOYSTICK 0
-#define SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME 1
-#define SETUP_TOKEN_PLAYER_JOY_XLEFT 2
-#define SETUP_TOKEN_PLAYER_JOY_XMIDDLE 3
-#define SETUP_TOKEN_PLAYER_JOY_XRIGHT 4
-#define SETUP_TOKEN_PLAYER_JOY_YUPPER 5
-#define SETUP_TOKEN_PLAYER_JOY_YMIDDLE 6
-#define SETUP_TOKEN_PLAYER_JOY_YLOWER 7
-#define SETUP_TOKEN_PLAYER_JOY_SNAP 8
-#define SETUP_TOKEN_PLAYER_JOY_DROP 9
-#define SETUP_TOKEN_PLAYER_KEY_LEFT 10
-#define SETUP_TOKEN_PLAYER_KEY_RIGHT 11
-#define SETUP_TOKEN_PLAYER_KEY_UP 12
-#define SETUP_TOKEN_PLAYER_KEY_DOWN 13
-#define SETUP_TOKEN_PLAYER_KEY_SNAP 14
-#define SETUP_TOKEN_PLAYER_KEY_DROP 15
-
-#define NUM_PLAYER_SETUP_TOKENS 16
+enum
+{
+ SETUP_TOKEN_PLAYER_USE_JOYSTICK = 0,
+ SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME,
+ SETUP_TOKEN_PLAYER_JOY_XLEFT,
+ SETUP_TOKEN_PLAYER_JOY_XMIDDLE,
+ SETUP_TOKEN_PLAYER_JOY_XRIGHT,
+ SETUP_TOKEN_PLAYER_JOY_YUPPER,
+ SETUP_TOKEN_PLAYER_JOY_YMIDDLE,
+ SETUP_TOKEN_PLAYER_JOY_YLOWER,
+ SETUP_TOKEN_PLAYER_JOY_SNAP,
+ SETUP_TOKEN_PLAYER_JOY_DROP,
+ SETUP_TOKEN_PLAYER_KEY_LEFT,
+ SETUP_TOKEN_PLAYER_KEY_RIGHT,
+ SETUP_TOKEN_PLAYER_KEY_UP,
+ SETUP_TOKEN_PLAYER_KEY_DOWN,
+ SETUP_TOKEN_PLAYER_KEY_SNAP,
+ SETUP_TOKEN_PLAYER_KEY_DROP,
+
+ NUM_PLAYER_SETUP_TOKENS
+};
/* system setup */
-#define SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER 0
-#define SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER 1
-#define SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE 2
+enum
+{
+ SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER = 0,
+ SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER,
+ SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE,
-#define NUM_SYSTEM_SETUP_TOKENS 3
+ NUM_SYSTEM_SETUP_TOKENS
+};
/* internal setup */
-#define SETUP_TOKEN_INT_PROGRAM_TITLE 0
-#define SETUP_TOKEN_INT_PROGRAM_VERSION 1
-#define SETUP_TOKEN_INT_PROGRAM_AUTHOR 2
-#define SETUP_TOKEN_INT_PROGRAM_EMAIL 3
-#define SETUP_TOKEN_INT_PROGRAM_WEBSITE 4
-#define SETUP_TOKEN_INT_PROGRAM_COPYRIGHT 5
-#define SETUP_TOKEN_INT_PROGRAM_COMPANY 6
-#define SETUP_TOKEN_INT_PROGRAM_ICON_FILE 7
-#define SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET 8
-#define SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET 9
-#define SETUP_TOKEN_INT_DEFAULT_MUSIC_SET 10
-#define SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE 11
-#define SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE 12
-#define SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE 13
-#define SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES 14
-#define SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR 15
-#define SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE 16
-#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH 17
-#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT 18
-
-#define NUM_INTERNAL_SETUP_TOKENS 19
+enum
+{
+ SETUP_TOKEN_INT_PROGRAM_TITLE = 0,
+ SETUP_TOKEN_INT_PROGRAM_VERSION,
+ SETUP_TOKEN_INT_PROGRAM_AUTHOR,
+ SETUP_TOKEN_INT_PROGRAM_EMAIL,
+ SETUP_TOKEN_INT_PROGRAM_WEBSITE,
+ SETUP_TOKEN_INT_PROGRAM_COPYRIGHT,
+ SETUP_TOKEN_INT_PROGRAM_COMPANY,
+ SETUP_TOKEN_INT_PROGRAM_ICON_FILE,
+ SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET,
+ SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET,
+ SETUP_TOKEN_INT_DEFAULT_MUSIC_SET,
+ SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE,
+ SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE,
+ SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE,
+ SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES,
+ SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR,
+ SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE,
+ SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH,
+ SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT,
+
+ NUM_INTERNAL_SETUP_TOKENS
+};
/* debug setup */
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_0 0
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_1 1
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_2 2
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_3 3
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_4 4
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_5 5
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_6 6
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_7 7
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_8 8
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_9 9
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_0 10
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_1 11
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_2 12
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_3 13
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_4 14
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_5 15
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_6 16
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_7 17
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_8 18
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_9 19
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_USE_MOD_KEY 20
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_GAME_ONLY 21
-#define SETUP_TOKEN_DEBUG_SHOW_FRAMES_PER_SECOND 22
-
-#define NUM_DEBUG_SETUP_TOKENS 23
+enum
+{
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_0 = 0,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_1,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_2,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_3,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_4,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_5,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_6,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_7,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_8,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_9,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_0,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_1,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_2,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_3,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_4,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_5,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_6,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_7,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_8,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_9,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_USE_MOD_KEY,
+ SETUP_TOKEN_DEBUG_FRAME_DELAY_GAME_ONLY,
+ SETUP_TOKEN_DEBUG_SHOW_FRAMES_PER_SECOND,
+
+ NUM_DEBUG_SETUP_TOKENS
+};
/* options setup */
-#define SETUP_TOKEN_OPTIONS_VERBOSE 0
+enum
+{
+ SETUP_TOKEN_OPTIONS_VERBOSE = 0,
-#define NUM_OPTIONS_SETUP_TOKENS 1
+ NUM_OPTIONS_SETUP_TOKENS
+};
static struct SetupInfo si;
+static struct SetupAutoSetupInfo sasi;
static struct SetupEditorInfo sei;
static struct SetupEditorCascadeInfo seci;
static struct SetupShortcutInfo ssi;
{ TYPE_SWITCH, &si.handicap, "handicap" },
{ TYPE_SWITCH, &si.skip_levels, "skip_levels" },
{ TYPE_SWITCH, &si.increment_levels, "increment_levels" },
+ { TYPE_SWITCH, &si.auto_play_next_level, "auto_play_next_level" },
+ { TYPE_SWITCH, &si.skip_scores_after_game, "skip_scores_after_game" },
{ TYPE_SWITCH, &si.time_limit, "time_limit" },
{ TYPE_SWITCH, &si.fullscreen, "fullscreen" },
{ TYPE_INTEGER,&si.window_scaling_percent, "window_scaling_percent" },
{ TYPE_INTEGER,&si.volume_simple, "volume_simple" },
{ TYPE_INTEGER,&si.volume_loops, "volume_loops" },
{ TYPE_INTEGER,&si.volume_music, "volume_music" },
+ { TYPE_SWITCH, &si.network_mode, "network_mode" },
+ { TYPE_PLAYER, &si.network_player_nr, "network_player" },
{ TYPE_STRING, &si.touch.control_type, "touch.control_type" },
{ TYPE_INTEGER,&si.touch.move_distance, "touch.move_distance" },
{ TYPE_INTEGER,&si.touch.drop_distance, "touch.drop_distance" },
+ { TYPE_INTEGER,&si.touch.transparency, "touch.transparency" },
+ { TYPE_INTEGER,&si.touch.draw_outlined, "touch.draw_outlined" },
+ { TYPE_INTEGER,&si.touch.draw_pressed, "touch.draw_pressed" },
+ { TYPE_INTEGER,&si.touch.grid_xsize[0], "touch.virtual_buttons.0.xsize" },
+ { TYPE_INTEGER,&si.touch.grid_ysize[0], "touch.virtual_buttons.0.ysize" },
+ { TYPE_INTEGER,&si.touch.grid_xsize[1], "touch.virtual_buttons.1.xsize" },
+ { TYPE_INTEGER,&si.touch.grid_ysize[1], "touch.virtual_buttons.1.ysize" },
+};
+
+static struct TokenInfo auto_setup_tokens[] =
+{
+ { TYPE_INTEGER,&sasi.editor_zoom_tilesize, "editor.zoom_tilesize" },
};
static struct TokenInfo editor_setup_tokens[] =
si->handicap = TRUE;
si->skip_levels = TRUE;
si->increment_levels = TRUE;
+ si->auto_play_next_level = TRUE;
+ si->skip_scores_after_game = FALSE;
si->time_limit = TRUE;
si->fullscreen = FALSE;
si->window_scaling_percent = STD_WINDOW_SCALING_PERCENT;
si->volume_loops = 100; /* percent */
si->volume_music = 100; /* percent */
+ si->network_mode = FALSE;
+ si->network_player_nr = 0; /* first player */
+
si->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT);
si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT; /* percent */
si->touch.drop_distance = TOUCH_DROP_DISTANCE_DEFAULT; /* percent */
+ si->touch.transparency = TOUCH_TRANSPARENCY_DEFAULT; /* percent */
+ si->touch.draw_outlined = TRUE;
+ si->touch.draw_pressed = TRUE;
+
+ for (i = 0; i < 2; i++)
+ {
+ char *default_grid_button[6][2] =
+ {
+ { " ", " ^^ " },
+ { " ", " ^^ " },
+ { " ", "<< >>" },
+ { " ", "<< >>" },
+ { "111222", " vv " },
+ { "111222", " vv " }
+ };
+ int grid_xsize = DEFAULT_GRID_XSIZE(i);
+ int grid_ysize = DEFAULT_GRID_YSIZE(i);
+ int min_xsize = MIN(6, grid_xsize);
+ int min_ysize = MIN(6, grid_ysize);
+ int startx = grid_xsize - min_xsize;
+ int starty = grid_ysize - min_ysize;
+ int x, y;
+
+ // virtual buttons grid can only be set to defaults if video is initialized
+ // (this will be repeated if virtual buttons are not loaded from setup file)
+ if (video.initialized)
+ {
+ si->touch.grid_xsize[i] = grid_xsize;
+ si->touch.grid_ysize[i] = grid_ysize;
+ }
+ else
+ {
+ si->touch.grid_xsize[i] = -1;
+ si->touch.grid_ysize[i] = -1;
+ }
+
+ for (x = 0; x < MAX_GRID_XSIZE; x++)
+ for (y = 0; y < MAX_GRID_YSIZE; y++)
+ si->touch.grid_button[i][x][y] = CHAR_GRID_BUTTON_NONE;
+
+ for (x = 0; x < min_xsize; x++)
+ for (y = 0; y < min_ysize; y++)
+ si->touch.grid_button[i][x][starty + y] =
+ default_grid_button[y][0][x];
+
+ for (x = 0; x < min_xsize; x++)
+ for (y = 0; y < min_ysize; y++)
+ si->touch.grid_button[i][startx + x][starty + y] =
+ default_grid_button[y][1][x];
+ }
+
+ si->touch.grid_initialized = video.initialized;
si->editor.el_boulderdash = TRUE;
si->editor.el_emerald_mine = TRUE;
#endif
}
+static void setSetupInfoToDefaults_AutoSetup(struct SetupInfo *si)
+{
+ si->auto_setup.editor_zoom_tilesize = MINI_TILESIZE;
+}
+
static void setSetupInfoToDefaults_EditorCascade(struct SetupInfo *si)
{
si->editor_cascade.el_bd = TRUE;
return hide_setup_token;
}
-static void setHideSetupEntry(void *setup_value_raw)
+void setHideSetupEntry(void *setup_value)
{
- /* !!! DIRTY WORKAROUND; TO BE FIXED AFTER THE MM ENGINE RELEASE !!! */
- void *setup_value = setup_value_raw - (void *)&si + (void *)&setup;
-
char *hide_setup_token = getHideSetupToken(setup_value);
if (setup_value != NULL)
setHashEntry(hide_setup_hash, hide_setup_token, "");
}
+static void setHideSetupEntryRaw(char *token_text, void *setup_value_raw)
+{
+ /* !!! DIRTY WORKAROUND; TO BE FIXED AFTER THE MM ENGINE RELEASE !!! */
+ void *setup_value = setup_value_raw - (void *)&si + (void *)&setup;
+
+ setHideSetupEntry(setup_value);
+}
+
boolean hideSetupEntry(void *setup_value)
{
char *hide_setup_token = getHideSetupToken(setup_value);
/* check if this setup option should be hidden in the setup menu */
if (token_hide_value != NULL && get_boolean_from_string(token_hide_value))
- setHideSetupEntry(token_info[token_nr].value);
+ setHideSetupEntryRaw(token_text, token_info[token_nr].value);
}
static void setSetupInfoFromTokenInfo(SetupFileHash *setup_file_hash,
setSetupInfoFromTokenInfo(setup_file_hash, global_setup_tokens, i);
setup = si;
+ /* virtual buttons setup */
+ setup.touch.grid_initialized = TRUE;
+ for (i = 0; i < 2; i++)
+ {
+ int grid_xsize = setup.touch.grid_xsize[i];
+ int grid_ysize = setup.touch.grid_ysize[i];
+ int x, y;
+
+ // if virtual buttons are not loaded from setup file, repeat initializing
+ // virtual buttons grid with default values later when video is initialized
+ if (grid_xsize == -1 ||
+ grid_ysize == -1)
+ {
+ setup.touch.grid_initialized = FALSE;
+
+ continue;
+ }
+
+ for (y = 0; y < grid_ysize; y++)
+ {
+ char token_string[MAX_LINE_LEN];
+
+ sprintf(token_string, "touch.virtual_buttons.%d.%02d", i, y);
+
+ char *value_string = getHashEntry(setup_file_hash, token_string);
+
+ if (value_string == NULL)
+ continue;
+
+ for (x = 0; x < grid_xsize; x++)
+ {
+ char c = value_string[x];
+
+ setup.touch.grid_button[i][x][y] =
+ (c == '.' ? CHAR_GRID_BUTTON_NONE : c);
+ }
+ }
+ }
+
/* editor setup */
sei = setup.editor;
for (i = 0; i < NUM_EDITOR_SETUP_TOKENS; i++)
for (i = 0; i < NUM_OPTIONS_SETUP_TOKENS; i++)
setSetupInfoFromTokenInfo(setup_file_hash, options_setup_tokens, i);
setup.options = soi;
+
+ setHideRelatedSetupEntries();
+}
+
+static void decodeSetupFileHash_AutoSetup(SetupFileHash *setup_file_hash)
+{
+ int i;
+
+ if (!setup_file_hash)
+ return;
+
+ /* auto setup */
+ sasi = setup.auto_setup;
+ for (i = 0; i < NUM_AUTO_SETUP_TOKENS; i++)
+ setSetupInfo(auto_setup_tokens, i,
+ getHashEntry(setup_file_hash,
+ auto_setup_tokens[i].text));
+ setup.auto_setup = sasi;
}
static void decodeSetupFileHash_EditorCascade(SetupFileHash *setup_file_hash)
LoadSetup_SpecialPostProcessing();
}
+void LoadSetup_AutoSetup()
+{
+ char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME);
+ SetupFileHash *setup_file_hash = NULL;
+
+ /* always start with reliable default values */
+ setSetupInfoToDefaults_AutoSetup(&setup);
+
+ setup_file_hash = loadSetupFileHash(filename);
+
+ if (setup_file_hash)
+ {
+ decodeSetupFileHash_AutoSetup(setup_file_hash);
+
+ freeSetupFileHash(setup_file_hash);
+ }
+
+ free(filename);
+}
+
void LoadSetup_EditorCascade()
{
char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
if (i == SETUP_TOKEN_PLAYER_NAME + 1 ||
i == SETUP_TOKEN_GRAPHICS_SET ||
i == SETUP_TOKEN_VOLUME_SIMPLE ||
- i == SETUP_TOKEN_TOUCH_CONTROL_TYPE)
+ i == SETUP_TOKEN_NETWORK_MODE ||
+ i == SETUP_TOKEN_TOUCH_CONTROL_TYPE ||
+ i == SETUP_TOKEN_TOUCH_GRID_XSIZE_0 ||
+ i == SETUP_TOKEN_TOUCH_GRID_XSIZE_1)
fprintf(file, "\n");
fprintf(file, "%s\n", getSetupLine(global_setup_tokens, "", i));
}
+ /* virtual buttons setup */
+ for (i = 0; i < 2; i++)
+ {
+ int grid_xsize = setup.touch.grid_xsize[i];
+ int grid_ysize = setup.touch.grid_ysize[i];
+ int x, y;
+
+ fprintf(file, "\n");
+
+ for (y = 0; y < grid_ysize; y++)
+ {
+ char token_string[MAX_LINE_LEN];
+ char value_string[MAX_LINE_LEN];
+
+ sprintf(token_string, "touch.virtual_buttons.%d.%02d", i, y);
+
+ for (x = 0; x < grid_xsize; x++)
+ {
+ char c = setup.touch.grid_button[i][x][y];
+
+ value_string[x] = (c == CHAR_GRID_BUTTON_NONE ? '.' : c);
+ }
+
+ value_string[grid_xsize] = '\0';
+
+ fprintf(file, "%s\n", getFormattedSetupEntry(token_string, value_string));
+ }
+ }
+
/* editor setup */
sei = setup.editor;
fprintf(file, "\n");
SetFilePermissions(filename, PERMS_PRIVATE);
}
+void SaveSetup_AutoSetup()
+{
+ char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME);
+ FILE *file;
+ int i;
+
+ InitUserDataDirectory();
+
+ if (!(file = fopen(filename, MODE_WRITE)))
+ {
+ Error(ERR_WARN, "cannot write auto setup file '%s'", filename);
+ free(filename);
+ return;
+ }
+
+ fprintFileHeader(file, AUTOSETUP_FILENAME);
+
+ sasi = setup.auto_setup;
+ for (i = 0; i < NUM_AUTO_SETUP_TOKENS; i++)
+ fprintf(file, "%s\n", getSetupLine(auto_setup_tokens, "", i));
+
+ fclose(file);
+
+ SetFilePermissions(filename, PERMS_PRIVATE);
+
+ free(filename);
+}
+
void SaveSetup_EditorCascade()
{
char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
menu.draw_yoffset_setup[i] = get_integer_from_string(value_2);
}
+ /* special case: initialize with default values that may be overwritten */
+ /* (eg, init "menu.line_spacing.INFO[XXX]" from "menu.line_spacing.INFO") */
+ for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++)
+ {
+ char *value_1 = getHashEntry(setup_file_hash,"menu.left_spacing.INFO");
+ char *value_2 = getHashEntry(setup_file_hash,"menu.right_spacing.INFO");
+ char *value_3 = getHashEntry(setup_file_hash,"menu.top_spacing.INFO");
+ char *value_4 = getHashEntry(setup_file_hash,"menu.bottom_spacing.INFO");
+ char *value_5 = getHashEntry(setup_file_hash,"menu.paragraph_spacing.INFO");
+ char *value_6 = getHashEntry(setup_file_hash,"menu.headline1_spacing.INFO");
+ char *value_7 = getHashEntry(setup_file_hash,"menu.headline2_spacing.INFO");
+ char *value_8 = getHashEntry(setup_file_hash,"menu.line_spacing.INFO");
+ char *value_9 = getHashEntry(setup_file_hash,"menu.extra_spacing.INFO");
+
+ if (value_1 != NULL)
+ menu.left_spacing_info[i] = get_integer_from_string(value_1);
+ if (value_2 != NULL)
+ menu.right_spacing_info[i] = get_integer_from_string(value_2);
+ if (value_3 != NULL)
+ menu.top_spacing_info[i] = get_integer_from_string(value_3);
+ if (value_4 != NULL)
+ menu.bottom_spacing_info[i] = get_integer_from_string(value_4);
+ if (value_5 != NULL)
+ menu.paragraph_spacing_info[i] = get_integer_from_string(value_5);
+ if (value_6 != NULL)
+ menu.headline1_spacing_info[i] = get_integer_from_string(value_6);
+ if (value_7 != NULL)
+ menu.headline2_spacing_info[i] = get_integer_from_string(value_7);
+ if (value_8 != NULL)
+ menu.line_spacing_info[i] = get_integer_from_string(value_8);
+ if (value_9 != NULL)
+ menu.extra_spacing_info[i] = get_integer_from_string(value_9);
+ }
+
/* special case: initialize with default values that may be overwritten */
/* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */
for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++)