+#define VSYNC_MODE_STR_TO_INT(s) \
+ (strEqual((s), STR_VSYNC_MODE_NORMAL) ? VSYNC_MODE_NORMAL : \
+ strEqual((s), STR_VSYNC_MODE_ADAPTIVE) ? VSYNC_MODE_ADAPTIVE : \
+ VSYNC_MODE_OFF)
+
+#define VSYNC_MODE_INT_TO_STR(i) \
+ ((i) == VSYNC_MODE_NORMAL ? STR_VSYNC_MODE_NORMAL : \
+ (i) == VSYNC_MODE_ADAPTIVE ? STR_VSYNC_MODE_ADAPTIVE : \
+ STR_VSYNC_MODE_OFF)
+
+// values for network server settings
+#define STR_NETWORK_AUTO_DETECT "auto_detect_network_server"
+#define STR_NETWORK_AUTO_DETECT_SETUP "(auto detect network server)"
+
+// values for touch control
+#define TOUCH_CONTROL_OFF "off"
+#define TOUCH_CONTROL_VIRTUAL_BUTTONS "virtual_buttons"
+#define TOUCH_CONTROL_WIPE_GESTURES "wipe_gestures"
+#define TOUCH_CONTROL_FOLLOW_FINGER "follow_finger"
+
+#if defined(PLATFORM_ANDROID)
+#define TOUCH_CONTROL_DEFAULT TOUCH_CONTROL_VIRTUAL_BUTTONS
+#else
+#define TOUCH_CONTROL_DEFAULT TOUCH_CONTROL_OFF
+#endif
+
+#define TOUCH_MOVE_DISTANCE_DEFAULT 2
+#define TOUCH_DROP_DISTANCE_DEFAULT 5
+#define TOUCH_TRANSPARENCY_DEFAULT 50
+
+#define ALPHA_FROM_TRANSPARENCY(x) ((100 - x) * SDL_ALPHA_OPAQUE / 100)
+#define ALPHA_FADING_STEPSIZE(x) ((x) / 25)
+
+// values for special settings for mobile devices
+#if defined(PLATFORM_ANDROID)
+#define HAS_TOUCH_DEVICE
+#define USE_TOUCH_INPUT_OVERLAY
+#define USE_COMPLETE_DISPLAY
+#define HAS_SCREEN_KEYBOARD
+#define SCREEN_KEYBOARD_POS(h) ((h) / 2)
+#endif
+
+// values for drag-and-drop support (some parts not added before SDL 2.0.5)
+#if !SDL_VERSION_ATLEAST(2,0,5)
+#define SDL_DROPTEXT (SDL_DROPFILE + 1)
+#define SDL_DROPBEGIN (SDL_DROPFILE + 2)
+#define SDL_DROPCOMPLETE (SDL_DROPFILE + 3)
+#endif
+
+// default input keys
+#define DEFAULT_KEY_LEFT KSYM_Left
+#define DEFAULT_KEY_RIGHT KSYM_Right
+#define DEFAULT_KEY_UP KSYM_Up
+#define DEFAULT_KEY_DOWN KSYM_Down
+#if defined(PLATFORM_MACOSX)
+#define DEFAULT_KEY_SNAP KSYM_Control_L
+#define DEFAULT_KEY_DROP KSYM_KP_Enter
+#else
+#define DEFAULT_KEY_SNAP KSYM_Control_L
+#define DEFAULT_KEY_DROP KSYM_Control_R
+#endif
+#define DEFAULT_KEY_OKAY KSYM_Return
+#define DEFAULT_KEY_CANCEL KSYM_Escape
+
+// default shortcut keys
+#define DEFAULT_KEY_SAVE_GAME KSYM_F1
+#define DEFAULT_KEY_LOAD_GAME KSYM_F2
+#define DEFAULT_KEY_TOGGLE_PAUSE KSYM_space
+#define DEFAULT_KEY_FOCUS_PLAYER_1 KSYM_F5
+#define DEFAULT_KEY_FOCUS_PLAYER_2 KSYM_F6
+#define DEFAULT_KEY_FOCUS_PLAYER_3 KSYM_F7
+#define DEFAULT_KEY_FOCUS_PLAYER_4 KSYM_F8
+#define DEFAULT_KEY_FOCUS_PLAYER_ALL KSYM_F9
+#define DEFAULT_KEY_TAPE_EJECT KSYM_UNDEFINED
+#define DEFAULT_KEY_TAPE_EXTRA KSYM_UNDEFINED
+#define DEFAULT_KEY_TAPE_STOP KSYM_UNDEFINED
+#define DEFAULT_KEY_TAPE_PAUSE KSYM_UNDEFINED
+#define DEFAULT_KEY_TAPE_RECORD KSYM_UNDEFINED
+#define DEFAULT_KEY_TAPE_PLAY KSYM_UNDEFINED
+#define DEFAULT_KEY_SOUND_SIMPLE KSYM_UNDEFINED
+#define DEFAULT_KEY_SOUND_LOOPS KSYM_UNDEFINED
+#define DEFAULT_KEY_SOUND_MUSIC KSYM_UNDEFINED
+#define DEFAULT_KEY_SNAP_LEFT KSYM_UNDEFINED
+#define DEFAULT_KEY_SNAP_RIGHT KSYM_UNDEFINED
+#define DEFAULT_KEY_SNAP_UP KSYM_UNDEFINED
+#define DEFAULT_KEY_SNAP_DOWN KSYM_UNDEFINED
+
+// default debug setup keys and values
+#define DEFAULT_FRAME_DELAY_0 20 // 100 % speed
+#define DEFAULT_FRAME_DELAY_1 500 // 4 % speed
+#define DEFAULT_FRAME_DELAY_2 250 // 8 % speed
+#define DEFAULT_FRAME_DELAY_3 125 // 16 % speed
+#define DEFAULT_FRAME_DELAY_4 60 // 33 % speed
+#define DEFAULT_FRAME_DELAY_5 40 // 50 % speed
+#define DEFAULT_FRAME_DELAY_6 30 // 66 % speed
+#define DEFAULT_FRAME_DELAY_7 10 // 200 % speed
+#define DEFAULT_FRAME_DELAY_8 5 // 400 % speed
+#define DEFAULT_FRAME_DELAY_9 0 // maximum speed
+
+#define DEFAULT_KEY_FRAME_DELAY_0 KSYM_0
+#define DEFAULT_KEY_FRAME_DELAY_1 KSYM_1
+#define DEFAULT_KEY_FRAME_DELAY_2 KSYM_2
+#define DEFAULT_KEY_FRAME_DELAY_3 KSYM_3
+#define DEFAULT_KEY_FRAME_DELAY_4 KSYM_4
+#define DEFAULT_KEY_FRAME_DELAY_5 KSYM_5
+#define DEFAULT_KEY_FRAME_DELAY_6 KSYM_6
+#define DEFAULT_KEY_FRAME_DELAY_7 KSYM_7
+#define DEFAULT_KEY_FRAME_DELAY_8 KSYM_8
+#define DEFAULT_KEY_FRAME_DELAY_9 KSYM_9
+
+#define NUM_DEBUG_FRAME_DELAY_KEYS 10
+
+#define DEFAULT_FRAME_DELAY_USE_MOD_KEY FALSE
+#define DEFAULT_FRAME_DELAY_GAME_ONLY TRUE
+
+// values for key_status
+#define KEY_NOT_PRESSED FALSE
+#define KEY_RELEASED FALSE
+#define KEY_PRESSED TRUE
+
+// values for button status
+#define MB_NOT_PRESSED FALSE
+#define MB_NOT_RELEASED TRUE
+#define MB_RELEASED FALSE
+#define MB_PRESSED TRUE
+#define MB_MENU_CHOICE FALSE
+#define MB_MENU_MARK TRUE
+#define MB_MENU_INITIALIZE (-1)
+#define MB_MENU_LEAVE (-2)
+#define MB_LEFTBUTTON 1
+#define MB_MIDDLEBUTTON 2
+#define MB_RIGHTBUTTON 3
+#define MB_WHEEL_UP 4
+#define MB_WHEEL_DOWN 5
+#define MB_WHEEL_LEFT 6
+#define MB_WHEEL_RIGHT 7
+#define IS_WHEEL_BUTTON_VERTICAL(b) ((b) == MB_WHEEL_UP || \
+ (b) == MB_WHEEL_DOWN)
+#define IS_WHEEL_BUTTON_HORIZONTAL(b) ((b) == MB_WHEEL_LEFT || \
+ (b) == MB_WHEEL_RIGHT)
+#define IS_WHEEL_BUTTON(b) (IS_WHEEL_BUTTON_VERTICAL(b) || \
+ IS_WHEEL_BUTTON_HORIZONTAL(b))
+#define DEFAULT_WHEEL_STEPS 3
+
+#define BUTTON_STEPSIZE(b) ((b) == MB_LEFTBUTTON ? 1 : \
+ (b) == MB_MIDDLEBUTTON ? 5 : \
+ (b) == MB_RIGHTBUTTON ? 10 : 1)
+
+// values for move directions
+#define MV_BIT_LEFT 0
+#define MV_BIT_RIGHT 1
+#define MV_BIT_UP 2
+#define MV_BIT_DOWN 3
+
+#define NUM_DIRECTIONS 4
+
+// diagonal movement directions are used in a different contect than buttons
+#define MV_BIT_UPLEFT 4
+#define MV_BIT_UPRIGHT 5
+#define MV_BIT_DOWNLEFT 6
+#define MV_BIT_DOWNRIGHT 7
+
+#define NUM_DIRECTIONS_FULL 8
+
+// values for special "button" bitmasks
+#define BUTTON_1 4
+#define BUTTON_2 5
+
+#define NUM_PLAYER_ACTIONS 6
+
+// values for special "focus player" bitmasks
+#define BIT_SET_FOCUS 6
+
+// values for drawing stages for global animations
+#define DRAW_GLOBAL_ANIM_STAGE_1 1
+#define DRAW_GLOBAL_ANIM_STAGE_2 2
+
+// values for drawing target (various functions)
+#define DRAW_TO_BACKBUFFER 0
+#define DRAW_TO_FIELDBUFFER 1
+#define DRAW_TO_SCREEN 2
+#define DRAW_TO_FADE_SOURCE 3
+#define DRAW_TO_FADE_TARGET 4
+
+// values for move directions and special "button" key bitmasks
+#define MV_NONE 0
+#define MV_LEFT (1 << MV_BIT_LEFT)
+#define MV_RIGHT (1 << MV_BIT_RIGHT)
+#define MV_UP (1 << MV_BIT_UP)
+#define MV_DOWN (1 << MV_BIT_DOWN)
+
+#define MV_UPLEFT (MV_UP | MV_LEFT)
+#define MV_UPRIGHT (MV_UP | MV_RIGHT)
+#define MV_DOWNLEFT (MV_DOWN | MV_LEFT)
+#define MV_DOWNRIGHT (MV_DOWN | MV_RIGHT)
+
+#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT)
+#define MV_VERTICAL (MV_UP | MV_DOWN)
+#define MV_ALL_DIRECTIONS (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
+#define MV_ANY_DIRECTION (MV_ALL_DIRECTIONS)
+#define MV_NO_DIRECTION (MV_NONE)
+
+#define KEY_BUTTON_1 (1 << BUTTON_1)
+#define KEY_BUTTON_2 (1 << BUTTON_2)
+#define KEY_BUTTON_SNAP KEY_BUTTON_1
+#define KEY_BUTTON_DROP KEY_BUTTON_2
+#define KEY_MOTION (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
+#define KEY_BUTTON (KEY_BUTTON_1 | KEY_BUTTON_2)
+#define KEY_ACTION (KEY_MOTION | KEY_BUTTON)
+
+#define KEY_SET_FOCUS (1 << BIT_SET_FOCUS)
+
+#define MV_DIR_FROM_BIT(x) ((x) < NUM_DIRECTIONS ? 1 << (x) : \
+ (x) == MV_BIT_UPLEFT ? MV_UPLEFT : \
+ (x) == MV_BIT_UPRIGHT ? MV_UPRIGHT : \
+ (x) == MV_BIT_DOWNLEFT ? MV_DOWNLEFT : \
+ (x) == MV_BIT_DOWNRIGHT ? MV_DOWNRIGHT : \
+ MV_NONE)
+
+#define MV_DIR_TO_BIT(x) ((x) == MV_LEFT ? MV_BIT_LEFT : \
+ (x) == MV_RIGHT ? MV_BIT_RIGHT : \
+ (x) == MV_UP ? MV_BIT_UP : \
+ (x) == MV_DOWN ? MV_BIT_DOWN : \
+ (x) == MV_UPLEFT ? MV_BIT_UPLEFT : \
+ (x) == MV_UPRIGHT ? MV_BIT_UPRIGHT : \
+ (x) == MV_DOWNLEFT ? MV_BIT_DOWNLEFT : \
+ (x) == MV_DOWNRIGHT ? MV_BIT_DOWNRIGHT : \
+ MV_BIT_DOWN)
+
+#define MV_DIR_OPPOSITE(x) ((x) == MV_LEFT ? MV_RIGHT : \
+ (x) == MV_RIGHT ? MV_LEFT : \
+ (x) == MV_UP ? MV_DOWN : \
+ (x) == MV_DOWN ? MV_UP : \
+ (x) == MV_UPLEFT ? MV_DOWNRIGHT : \
+ (x) == MV_UPRIGHT ? MV_DOWNLEFT : \
+ (x) == MV_DOWNLEFT ? MV_UPRIGHT : \
+ (x) == MV_DOWNRIGHT ? MV_UPLEFT : \
+ MV_NONE)
+
+// values for animation mode (frame order and direction)
+// (stored in level files -- never change existing values)
+#define ANIM_NONE 0
+#define ANIM_LOOP (1 << 0)
+#define ANIM_LINEAR (1 << 1)
+#define ANIM_PINGPONG (1 << 2)
+#define ANIM_PINGPONG2 (1 << 3)
+#define ANIM_RANDOM (1 << 4)
+#define ANIM_CE_VALUE (1 << 5)
+#define ANIM_CE_SCORE (1 << 6)
+#define ANIM_CE_DELAY (1 << 7)
+#define ANIM_REVERSE (1 << 8)
+#define ANIM_OPAQUE_PLAYER (1 << 9)
+
+// values for special (non game element) animation modes
+// (not stored in level files -- can be changed, if needed)
+#define ANIM_HORIZONTAL (1 << 10)
+#define ANIM_VERTICAL (1 << 11)
+#define ANIM_CENTERED (1 << 12)
+#define ANIM_STATIC_PANEL (1 << 13)
+#define ANIM_ALL (1 << 14)
+#define ANIM_ONCE (1 << 15)
+
+#define ANIM_DEFAULT ANIM_LOOP
+
+// values for special drawing styles and event handling
+#define STYLE_NONE 0
+
+// values used for crumbled graphics
+#define STYLE_ACCURATE_BORDERS (1 << 0)
+#define STYLE_INNER_CORNERS (1 << 1)
+
+// values used for game panel graphics
+#define STYLE_REVERSE (1 << 2)
+#define STYLE_LEFTMOST_POSITION (1 << 3)
+
+// values used for global animations
+#define STYLE_BLOCK (1 << 4)
+#define STYLE_PASSTHROUGH (1 << 5)
+#define STYLE_MULTIPLE_ACTIONS (1 << 6)
+
+#define STYLE_DEFAULT STYLE_NONE
+
+// values for special global animation delay types
+#define ANIM_DELAY_UNDEFINED -1
+#define ANIM_DELAY_NONE 0
+#define ANIM_DELAY_INIT 1
+#define ANIM_DELAY_ANIM 2
+#define ANIM_DELAY_POST 3
+
+// values for special global animation delay actions
+#define ANIM_DELAY_ACTION_NONE -1
+
+// values for special global animation events
+#define ANIM_EVENT_UNDEFINED -1
+#define ANIM_EVENT_NONE 0
+#define ANIM_EVENT_SELF (1 << 16)
+#define ANIM_EVENT_ANY (1 << 17)
+#define ANIM_EVENT_CLICK (1 << 18)
+#define ANIM_EVENT_INIT (1 << 19)
+#define ANIM_EVENT_START (1 << 20)
+#define ANIM_EVENT_END (1 << 21)
+#define ANIM_EVENT_POST (1 << 22)
+#define ANIM_EVENT_UNCLICK_ANY (1 << 23)
+
+// anim number: bits 0-7
+// part number: bits 8-15
+#define ANIM_EVENT_ANIM_BIT 0
+#define ANIM_EVENT_PART_BIT 8
+
+#define ANIM_EVENT_ANIM_MASK (0xff << ANIM_EVENT_ANIM_BIT)
+#define ANIM_EVENT_PART_MASK (0xff << ANIM_EVENT_PART_BIT)
+
+#define ANIM_EVENT_DEFAULT ANIM_EVENT_NONE
+
+// values for special global animation event actions
+#define ANIM_EVENT_ACTION_NONE -1
+
+// values for fade mode
+#define FADE_TYPE_NONE 0
+#define FADE_TYPE_FADE_IN (1 << 0)
+#define FADE_TYPE_FADE_OUT (1 << 1)
+#define FADE_TYPE_TRANSFORM (1 << 2)
+#define FADE_TYPE_CROSSFADE (1 << 3)
+#define FADE_TYPE_MELT (1 << 4)
+#define FADE_TYPE_CURTAIN (1 << 5)
+#define FADE_TYPE_SKIP (1 << 6)
+
+#define FADE_MODE_NONE (FADE_TYPE_NONE)
+#define FADE_MODE_FADE_IN (FADE_TYPE_FADE_IN)
+#define FADE_MODE_FADE_OUT (FADE_TYPE_FADE_OUT)
+#define FADE_MODE_FADE (FADE_TYPE_FADE_IN | FADE_TYPE_FADE_OUT)
+#define FADE_MODE_TRANSFORM (FADE_TYPE_TRANSFORM | FADE_TYPE_FADE_IN)
+#define FADE_MODE_CROSSFADE (FADE_MODE_TRANSFORM | FADE_TYPE_CROSSFADE)
+#define FADE_MODE_MELT (FADE_MODE_TRANSFORM | FADE_TYPE_MELT)
+#define FADE_MODE_CURTAIN (FADE_MODE_TRANSFORM | FADE_TYPE_CURTAIN)
+#define FADE_MODE_SKIP_FADE_IN (FADE_TYPE_SKIP | FADE_TYPE_FADE_IN)
+#define FADE_MODE_SKIP_FADE_OUT (FADE_TYPE_SKIP | FADE_TYPE_FADE_OUT)
+
+#define FADE_MODE_DEFAULT FADE_MODE_FADE
+
+#define AUTO_DELAY_UNIT_MS 0
+#define AUTO_DELAY_UNIT_FRAMES 1
+
+#define AUTO_DELAY_UNIT_DEFAULT AUTO_DELAY_UNIT_MS
+
+// values for toon positions
+#define POS_UNDEFINED -1
+#define POS_LEFT 0
+#define POS_RIGHT 1
+#define POS_TOP 2
+#define POS_UPPER 3
+#define POS_MIDDLE 4
+#define POS_LOWER 5
+#define POS_BOTTOM 6
+#define POS_ANY 7
+#define POS_LAST 8
+
+// values for text alignment
+#define ALIGN_LEFT (1 << 0)
+#define ALIGN_RIGHT (1 << 1)
+#define ALIGN_CENTER (1 << 2)
+#define ALIGN_DEFAULT ALIGN_LEFT
+
+#define VALIGN_TOP (1 << 0)
+#define VALIGN_BOTTOM (1 << 1)
+#define VALIGN_MIDDLE (1 << 2)
+#define VALIGN_DEFAULT VALIGN_TOP
+
+#define ALIGNED_XPOS(x,w,a) ((a) == ALIGN_CENTER ? (x) - (w) / 2 : \
+ (a) == ALIGN_RIGHT ? (x) - (w) : (x))
+#define ALIGNED_YPOS(y,h,v) ((v) == VALIGN_MIDDLE ? (y) - (h) / 2 : \
+ (v) == VALIGN_BOTTOM ? (y) - (h) : (y))
+#define ALIGNED_TEXT_XPOS(p) ALIGNED_XPOS((p)->x, (p)->width, (p)->align)
+#define ALIGNED_TEXT_YPOS(p) ALIGNED_YPOS((p)->y, (p)->height, (p)->valign)
+#define ALIGNED_VP_XPOS(p) ALIGNED_TEXT_XPOS(p)
+#define ALIGNED_VP_YPOS(p) ALIGNED_TEXT_YPOS(p)
+
+// values for redraw_mask