projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed crash bug when accessing invalid change page for broken level files
[rocksndiamonds.git]
/
src
/
tools.c
diff --git
a/src/tools.c
b/src/tools.c
index 79cf0885135681310694fdc4dc562fd40dfa5cf0..6660e1206556b6cc19b2112eb2dfba0eec0a9604 100644
(file)
--- a/
src/tools.c
+++ b/
src/tools.c
@@
-165,6
+165,14
@@
static struct DoorPartControlInfo door_part_controls[] =
}
};
}
};
+static struct XY xy_topdown[] =
+{
+ { 0, -1 },
+ { -1, 0 },
+ { +1, 0 },
+ { 0, +1 }
+};
+
// forward declaration for internal use
static void UnmapToolButtons(void);
// forward declaration for internal use
static void UnmapToolButtons(void);
@@
-1102,7
+1110,7
@@
static int getGlobalGameStatus(int status)
status);
}
status);
}
-
static
Bitmap *getBitmapFromGraphicOrDefault(int graphic, int default_graphic)
+Bitmap *getBitmapFromGraphicOrDefault(int graphic, int default_graphic)
{
if (graphic == IMG_UNDEFINED)
return NULL;
{
if (graphic == IMG_UNDEFINED)
return NULL;
@@
-1433,7
+1441,7
@@
void FloodFillLevelExt(int start_x, int start_y, int fill_element,
int max_fieldx, int max_fieldy)
{
static struct XY stack_buffer[MAX_LEV_FIELDX * MAX_LEV_FIELDY];
int max_fieldx, int max_fieldy)
{
static struct XY stack_buffer[MAX_LEV_FIELDX * MAX_LEV_FIELDY];
- st
atic struct XY check[4] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } }
;
+ st
ruct XY *check = xy_topdown
;
int old_element = field[start_x][start_y];
int stack_pos = 0;
int old_element = field[start_x][start_y];
int stack_pos = 0;
@@
-2293,13
+2301,7
@@
static void DrawLevelFieldCrumbledExt(int x, int y, int graphic, int frame)
int sx = SCREENX(x), sy = SCREENY(y);
int element;
int i;
int sx = SCREENX(x), sy = SCREENY(y);
int element;
int i;
- static int xy[4][2] =
- {
- { 0, -1 },
- { -1, 0 },
- { +1, 0 },
- { 0, +1 }
- };
+ struct XY *xy = xy_topdown;
if (!IN_LEV_FIELD(x, y))
return;
if (!IN_LEV_FIELD(x, y))
return;
@@
-2314,8
+2316,8
@@
static void DrawLevelFieldCrumbledExt(int x, int y, int graphic, int frame)
// crumble field borders towards direct neighbour fields
for (i = 0; i < 4; i++)
{
// crumble field borders towards direct neighbour fields
for (i = 0; i < 4; i++)
{
- int xx = x + xy[i]
[0]
;
- int yy = y + xy[i]
[1]
;
+ int xx = x + xy[i]
.x
;
+ int yy = y + xy[i]
.y
;
element = (IN_LEV_FIELD(xx, yy) ? TILE_GFX_ELEMENT(xx, yy) :
BorderElement);
element = (IN_LEV_FIELD(xx, yy) ? TILE_GFX_ELEMENT(xx, yy) :
BorderElement);
@@
-2349,10
+2351,10
@@
static void DrawLevelFieldCrumbledExt(int x, int y, int graphic, int frame)
// crumble field borders of direct neighbour fields
for (i = 0; i < 4; i++)
{
// crumble field borders of direct neighbour fields
for (i = 0; i < 4; i++)
{
- int xx = x + xy[i]
[0]
;
- int yy = y + xy[i]
[1]
;
- int sxx = sx + xy[i]
[0]
;
- int syy = sy + xy[i]
[1]
;
+ int xx = x + xy[i]
.x
;
+ int yy = y + xy[i]
.y
;
+ int sxx = sx + xy[i]
.x
;
+ int syy = sy + xy[i]
.y
;
if (!IN_LEV_FIELD(xx, yy) ||
!IN_SCR_FIELD(sxx, syy))
if (!IN_LEV_FIELD(xx, yy) ||
!IN_SCR_FIELD(sxx, syy))
@@
-2445,22
+2447,16
@@
void DrawLevelFieldCrumbledDigging(int x, int y, int direction,
void DrawLevelFieldCrumbledNeighbours(int x, int y)
{
int sx = SCREENX(x), sy = SCREENY(y);
void DrawLevelFieldCrumbledNeighbours(int x, int y)
{
int sx = SCREENX(x), sy = SCREENY(y);
- static int xy[4][2] =
- {
- { 0, -1 },
- { -1, 0 },
- { +1, 0 },
- { 0, +1 }
- };
+ struct XY *xy = xy_topdown;
int i;
// crumble direct neighbour fields (required for field borders)
for (i = 0; i < 4; i++)
{
int i;
// crumble direct neighbour fields (required for field borders)
for (i = 0; i < 4; i++)
{
- int xx = x + xy[i]
[0]
;
- int yy = y + xy[i]
[1]
;
- int sxx = sx + xy[i]
[0]
;
- int syy = sy + xy[i]
[1]
;
+ int xx = x + xy[i]
.x
;
+ int yy = y + xy[i]
.y
;
+ int sxx = sx + xy[i]
.x
;
+ int syy = sy + xy[i]
.y
;
if (!IN_LEV_FIELD(xx, yy) ||
!IN_SCR_FIELD(sxx, syy) ||
if (!IN_LEV_FIELD(xx, yy) ||
!IN_SCR_FIELD(sxx, syy) ||
@@
-2886,9
+2882,9
@@
static void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND);
boolean ffwd_delay = (tape.playing && tape.fast_forward);
boolean no_delay = (tape.warp_forward);
int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND);
boolean ffwd_delay = (tape.playing && tape.fast_forward);
boolean no_delay = (tape.warp_forward);
- unsigned int anim_delay = 0;
int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
int anim_delay_value = MAX(1, (no_delay ? 0 : frame_delay_value) / 2);
int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
int anim_delay_value = MAX(1, (no_delay ? 0 : frame_delay_value) / 2);
+ DelayCounter anim_delay = { anim_delay_value };
int font_nr = FONT_ENVELOPE_1 + envelope_nr;
int font_width = getFontWidth(font_nr);
int font_height = getFontHeight(font_nr);
int font_nr = FONT_ENVELOPE_1 + envelope_nr;
int font_width = getFontWidth(font_nr);
int font_height = getFontHeight(font_nr);
@@
-2934,7
+2930,7
@@
static void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
redraw_mask |= REDRAW_FIELD;
BackToFront();
redraw_mask |= REDRAW_FIELD;
BackToFront();
- SkipUntilDelayReached(&anim_delay,
anim_delay_value,
&i, last_frame);
+ SkipUntilDelayReached(&anim_delay, &i, last_frame);
}
ClearAutoRepeatKeyEvents();
}
ClearAutoRepeatKeyEvents();
@@
-3204,7
+3200,7
@@
static void AnimateEnvelopeRequest(int anim_mode, int action)
boolean no_delay = (tape.warp_forward);
int delay_value = (ffwd_delay ? delay_value_fast : delay_value_normal);
int anim_delay_value = MAX(1, (no_delay ? 0 : delay_value + 500 * 0) / 2);
boolean no_delay = (tape.warp_forward);
int delay_value = (ffwd_delay ? delay_value_fast : delay_value_normal);
int anim_delay_value = MAX(1, (no_delay ? 0 : delay_value + 500 * 0) / 2);
-
unsigned int anim_delay = 0
;
+
DelayCounter anim_delay = { anim_delay_value }
;
int tile_size = MAX(request.step_offset, 1);
int max_xsize = request.width / tile_size;
int tile_size = MAX(request.step_offset, 1);
int max_xsize = request.width / tile_size;
@@
-3277,7
+3273,7
@@
static void AnimateEnvelopeRequest(int anim_mode, int action)
BackToFront();
BackToFront();
- SkipUntilDelayReached(&anim_delay,
anim_delay_value,
&i, last_frame);
+ SkipUntilDelayReached(&anim_delay, &i, last_frame);
}
ClearAutoRepeatKeyEvents();
}
ClearAutoRepeatKeyEvents();
@@
-3548,15
+3544,17
@@
static void DrawPreviewLevelInfo(int mode)
static void DrawPreviewLevelExt(boolean restart)
{
static void DrawPreviewLevelExt(boolean restart)
{
- static
unsigned int scroll_delay = 0
;
- static
unsigned int label_delay = 0
;
+ static
DelayCounter scroll_delay = { 0 }
;
+ static
DelayCounter label_delay = { 0 }
;
static int from_x, from_y, scroll_direction;
static int label_state, label_counter;
static int from_x, from_y, scroll_direction;
static int label_state, label_counter;
- unsigned int scroll_delay_value = preview.step_delay;
boolean show_level_border = (BorderElement != EL_EMPTY);
int level_xsize = lev_fieldx + (show_level_border ? 2 : 0);
int level_ysize = lev_fieldy + (show_level_border ? 2 : 0);
boolean show_level_border = (BorderElement != EL_EMPTY);
int level_xsize = lev_fieldx + (show_level_border ? 2 : 0);
int level_ysize = lev_fieldy + (show_level_border ? 2 : 0);
+ scroll_delay.value = preview.step_delay;
+ label_delay.value = MICROLEVEL_LABEL_DELAY;
+
if (restart)
{
from_x = 0;
if (restart)
{
from_x = 0;
@@
-3610,7
+3608,7
@@
static void DrawPreviewLevelExt(boolean restart)
// scroll preview level, if needed
if (preview.anim_mode != ANIM_NONE &&
(level_xsize > preview.xsize || level_ysize > preview.ysize) &&
// scroll preview level, if needed
if (preview.anim_mode != ANIM_NONE &&
(level_xsize > preview.xsize || level_ysize > preview.ysize) &&
- DelayReached(&scroll_delay
, scroll_delay_value
))
+ DelayReached(&scroll_delay))
{
switch (scroll_direction)
{
{
switch (scroll_direction)
{
@@
-3668,7
+3666,7
@@
static void DrawPreviewLevelExt(boolean restart)
if (!strEqual(level.name, NAMELESS_LEVEL_NAME) &&
!strEqual(level.author, ANONYMOUS_NAME) &&
!strEqual(level.author, leveldir_current->name) &&
if (!strEqual(level.name, NAMELESS_LEVEL_NAME) &&
!strEqual(level.author, ANONYMOUS_NAME) &&
!strEqual(level.author, leveldir_current->name) &&
- DelayReached(&label_delay
, MICROLEVEL_LABEL_DELAY
))
+ DelayReached(&label_delay))
{
int max_label_counter = 23;
{
int max_label_counter = 23;
@@
-5352,8
+5350,7
@@
unsigned int MoveDoor(unsigned int door_state)
};
static int door1 = DOOR_CLOSE_1;
static int door2 = DOOR_CLOSE_2;
};
static int door1 = DOOR_CLOSE_1;
static int door2 = DOOR_CLOSE_2;
- unsigned int door_delay = 0;
- unsigned int door_delay_value;
+ DelayCounter door_delay = { 0 };
int i;
if (door_state == DOOR_GET_STATE)
int i;
if (door_state == DOOR_GET_STATE)
@@
-5468,7
+5465,7
@@
unsigned int MoveDoor(unsigned int door_state)
num_move_steps = max_move_delay / max_step_delay;
num_move_steps_doors_only = max_move_delay_doors_only / max_step_delay;
num_move_steps = max_move_delay / max_step_delay;
num_move_steps_doors_only = max_move_delay_doors_only / max_step_delay;
- door_delay
_
value = max_step_delay;
+ door_delay
.
value = max_step_delay;
if ((door_state & DOOR_NO_DELAY) || setup.quick_doors)
{
if ((door_state & DOOR_NO_DELAY) || setup.quick_doors)
{
@@
-5551,7
+5548,7
@@
unsigned int MoveDoor(unsigned int door_state)
{
int k2_door = (door_opening ? k : num_move_steps_doors_only - k - 1);
int kk_door = MAX(0, k2_door);
{
int k2_door = (door_opening ? k : num_move_steps_doors_only - k - 1);
int kk_door = MAX(0, k2_door);
- int sync_frame = kk_door * door_delay
_
value;
+ int sync_frame = kk_door * door_delay
.
value;
int frame = getGraphicAnimationFrame(dpc->graphic, sync_frame);
getFixedGraphicSource(dpc->graphic, frame, &bitmap,
int frame = getGraphicAnimationFrame(dpc->graphic, sync_frame);
getFixedGraphicSource(dpc->graphic, frame, &bitmap,
@@
-5660,7
+5657,7
@@
unsigned int MoveDoor(unsigned int door_state)
{
BackToFront();
{
BackToFront();
- SkipUntilDelayReached(&door_delay,
door_delay_value,
&k, last_frame);
+ SkipUntilDelayReached(&door_delay, &k, last_frame);
// prevent OS (Windows) from complaining about program not responding
CheckQuitEvent();
// prevent OS (Windows) from complaining about program not responding
CheckQuitEvent();
@@
-5674,13
+5671,13
@@
unsigned int MoveDoor(unsigned int door_state)
{
// wait for specified door action post delay
if (door_state & DOOR_ACTION_1 && door_state & DOOR_ACTION_2)
{
// wait for specified door action post delay
if (door_state & DOOR_ACTION_1 && door_state & DOOR_ACTION_2)
- door_delay
_
value = MAX(door_1.post_delay, door_2.post_delay);
+ door_delay
.
value = MAX(door_1.post_delay, door_2.post_delay);
else if (door_state & DOOR_ACTION_1)
else if (door_state & DOOR_ACTION_1)
- door_delay
_
value = door_1.post_delay;
+ door_delay
.
value = door_1.post_delay;
else if (door_state & DOOR_ACTION_2)
else if (door_state & DOOR_ACTION_2)
- door_delay
_
value = door_2.post_delay;
+ door_delay
.
value = door_2.post_delay;
- while (!DelayReached(&door_delay
, door_delay_value
))
+ while (!DelayReached(&door_delay))
BackToFront();
}
}
BackToFront();
}
}
@@
-9967,7
+9964,13
@@
void ChangeViewportPropertiesIfNeeded(void)
void OpenURL(char *url)
{
void OpenURL(char *url)
{
+#if SDL_VERSION_ATLEAST(2,0,14)
SDL_OpenURL(url);
SDL_OpenURL(url);
+#else
+ Warn("SDL_OpenURL(\"%s\") not supported by SDL %d.%d.%d!",
+ url, SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL);
+ Warn("Please upgrade to at least SDL 2.0.14 for URL support!");
+#endif
}
void OpenURLFromHash(SetupFileHash *hash, int hash_key)
}
void OpenURLFromHash(SetupFileHash *hash, int hash_key)