X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=866870a29d10e2ba5b09daa57836bc5ba06e8139;hp=f7a3011e0e1b4a71882de655a283fa444bf46e41;hb=db796e071bbe21db45ac516e55eaf2ea7cee33d5;hpb=55ea36f783098df4472f62634644131a8058e39b diff --git a/src/tools.c b/src/tools.c index f7a3011e..866870a2 100644 --- a/src/tools.c +++ b/src/tools.c @@ -44,8 +44,6 @@ static int el_act2crm(int, int); static struct GadgetInfo *tool_gadget[NUM_TOOL_BUTTONS]; static int request_gadget_id = -1; -static int preview_tilesize = TILEX / 4; - static char *print_if_not_empty(int element) { static char *s = NULL; @@ -1482,19 +1480,6 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } -void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) -{ - Bitmap *src_bitmap = graphic_info[graphic].bitmap; - int mini_startx = src_bitmap->width * 3 / 4; - int mini_starty = src_bitmap->height * 2 / 3; - int src_x = mini_startx + graphic_info[graphic].src_x / 8; - int src_y = mini_starty + graphic_info[graphic].src_y / 8; - - *bitmap = src_bitmap; - *x = src_x; - *y = src_y; -} - void getPreviewGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y, int tilesize) { @@ -1526,25 +1511,14 @@ void getPreviewGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y, *y = src_y; } -void DrawMicroElement(int xpos, int ypos, int element) -{ - Bitmap *src_bitmap; - int src_x, src_y; - int graphic = el2preimg(element); - - getMicroGraphicSource(graphic, &src_bitmap, &src_x, &src_y); - BlitBitmap(src_bitmap, drawto, src_x, src_y, MICRO_TILEX, MICRO_TILEY, - xpos, ypos); -} - -void DrawPreviewElement(int xpos, int ypos, int element, int tilesize) +void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize) { Bitmap *src_bitmap; int src_x, src_y; int graphic = el2preimg(element); getPreviewGraphicSource(graphic, &src_bitmap, &src_x, &src_y, tilesize); - BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize, xpos, ypos); + BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize, dst_x,dst_y); } void DrawLevel() @@ -1572,34 +1546,36 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) redraw_mask |= REDRAW_FIELD; } -static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y) +static void DrawPreviewLevelExt(int from_x, int from_y) { boolean show_level_border = (BorderElement != EL_EMPTY); - int level_size_x = lev_fieldx + (show_level_border ? 2 : 0); - int level_size_y = lev_fieldy + (show_level_border ? 2 : 0); - int preview_size_x = MICROLEVEL_XSIZE / preview_tilesize; - int preview_size_y = MICROLEVEL_YSIZE / preview_tilesize; - int real_preview_size_x = MIN(level_size_x, preview_size_x); - int real_preview_size_y = MIN(level_size_y, preview_size_y); + int dst_x = preview.x; + int dst_y = preview.y; + int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); + int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); + int tile_size = preview.tile_size; + int preview_width = preview.xsize * tile_size; + int preview_height = preview.ysize * tile_size; + int real_preview_xsize = MIN(level_xsize, preview.xsize); + int real_preview_ysize = MIN(level_ysize, preview.ysize); int x, y; - DrawBackground(xpos, ypos, MICROLEVEL_XSIZE, MICROLEVEL_YSIZE); + DrawBackground(dst_x, dst_y, preview_width, preview_height); - xpos += (MICROLEVEL_XSIZE - real_preview_size_x * preview_tilesize) / 2; - ypos += (MICROLEVEL_YSIZE - real_preview_size_y * preview_tilesize) / 2; + dst_x += (preview_width - real_preview_xsize * tile_size) / 2; + dst_y += (preview_height - real_preview_ysize * tile_size) / 2; - for (x = 0; x < real_preview_size_x; x++) + for (x = 0; x < real_preview_xsize; x++) { - for (y = 0; y < real_preview_size_y; y++) + for (y = 0; y < real_preview_ysize; y++) { int lx = from_x + x + (show_level_border ? -1 : 0); int ly = from_y + y + (show_level_border ? -1 : 0); int element = (IN_LEV_FIELD(lx, ly) ? level.field[lx][ly] : getBorderElement(lx, ly)); - DrawPreviewElement(xpos + x * preview_tilesize, - ypos + y * preview_tilesize, - element, preview_tilesize); + DrawPreviewElement(dst_x + x * tile_size, dst_y + y * tile_size, + element, tile_size); } } @@ -1615,7 +1591,7 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y) #define MICROLABEL_IMPORTED_BY_HEAD 6 #define MICROLABEL_IMPORTED_BY 7 -static void DrawMicroLevelLabelExt(int mode) +static void DrawPreviewLevelLabelExt(int mode) { char label_text[MAX_OUTPUT_LINESIZE + 1]; int max_len_label_text; @@ -1663,20 +1639,17 @@ static void DrawMicroLevelLabelExt(int mode) redraw_mask |= REDRAW_MICROLEVEL; } -void DrawMicroLevel(int xpos, int ypos, boolean restart) +void DrawPreviewLevel(boolean restart) { static unsigned long scroll_delay = 0; static unsigned long label_delay = 0; static int from_x, from_y, scroll_direction; static int label_state, label_counter; - int delay_factor = preview_tilesize / MICRO_TILESIZE; - unsigned long scroll_delay_value = MICROLEVEL_SCROLL_DELAY * delay_factor; + unsigned long scroll_delay_value = preview.step_delay; boolean show_level_border = (BorderElement != EL_EMPTY); - int level_size_x = lev_fieldx + (show_level_border ? 2 : 0); - int level_size_y = lev_fieldy + (show_level_border ? 2 : 0); - int preview_size_x = MICROLEVEL_XSIZE / preview_tilesize; - int preview_size_y = MICROLEVEL_YSIZE / preview_tilesize; - int last_game_status = game_status; /* save current game status */ + int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); + int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); + int last_game_status = game_status; /* save current game status */ /* force PREVIEW font on preview level */ game_status = GAME_MODE_PSEUDO_PREVIEW; @@ -1688,8 +1661,8 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) label_state = 1; label_counter = 0; - DrawMicroLevelExt(xpos, ypos, from_x, from_y); - DrawMicroLevelLabelExt(label_state); + DrawPreviewLevelExt(from_x, from_y); + DrawPreviewLevelLabelExt(label_state); /* initialize delay counters */ DelayReached(&scroll_delay, 0); @@ -1716,36 +1689,50 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) return; } - /* scroll micro level, if needed */ - if ((level_size_x > preview_size_x || level_size_y > preview_size_y) && + /* scroll preview level, if needed */ + if ((level_xsize > preview.xsize || level_ysize > preview.ysize) && DelayReached(&scroll_delay, scroll_delay_value)) { switch (scroll_direction) { case MV_LEFT: if (from_x > 0) - from_x--; + { + from_x -= preview.step_offset; + from_x = (from_x < 0 ? 0 : from_x); + } else scroll_direction = MV_UP; break; case MV_RIGHT: - if (from_x < level_size_x - preview_size_x) - from_x++; + if (from_x < level_xsize - preview.xsize) + { + from_x += preview.step_offset; + from_x = (from_x > level_xsize - preview.xsize ? + level_xsize - preview.xsize : from_x); + } else scroll_direction = MV_DOWN; break; case MV_UP: if (from_y > 0) - from_y--; + { + from_y -= preview.step_offset; + from_y = (from_y < 0 ? 0 : from_y); + } else scroll_direction = MV_RIGHT; break; case MV_DOWN: - if (from_y < level_size_y - preview_size_y) - from_y++; + if (from_y < level_ysize - preview.ysize) + { + from_y += preview.step_offset; + from_y = (from_y > level_ysize - preview.ysize ? + level_ysize - preview.ysize : from_y); + } else scroll_direction = MV_LEFT; break; @@ -1754,7 +1741,7 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) break; } - DrawMicroLevelExt(xpos, ypos, from_x, from_y); + DrawPreviewLevelExt(from_x, from_y); } /* !!! THIS ALL SUCKS -- SHOULD BE CLEANLY REWRITTEN !!! */ @@ -1795,7 +1782,7 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) label_state = (label_state == MICROLABEL_IMPORTED_FROM_HEAD ? MICROLABEL_IMPORTED_BY_HEAD : MICROLABEL_IMPORTED_BY); - DrawMicroLevelLabelExt(label_state); + DrawPreviewLevelLabelExt(label_state); } game_status = last_game_status; /* restore current game status */