X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=074b232b5c2251f5e7ad52ed4fa19f996b6cd932;hb=7b387b9e5e8095a01c18ea041f19d71be83146b9;hp=d3909d5eedbfff6901940af9c64a692d8481f1fc;hpb=5c94351c5b8a12d8615b447b6275dd2f68615be4;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index d3909d5e..074b232b 100644 --- a/src/tools.c +++ b/src/tools.c @@ -523,7 +523,11 @@ void FadeExt(int fade_mask, int fade_mode) { static int fade_mode_skip = FADE_MODE_NONE; void (*draw_border_function)(void) = NULL; - Bitmap *bitmap = (fade_mode == FADE_MODE_CROSSFADE ? bitmap_db_cross : NULL); +#if 0 + Bitmap *bitmap = (fade_mode != FADE_MODE_FADE_IN ? bitmap_db_cross : NULL); +#else + Bitmap *bitmap = (fade_mode & FADE_TYPE_TRANSFORM ? bitmap_db_cross : NULL); +#endif int x, y, width, height; int fade_delay, post_delay; @@ -531,6 +535,10 @@ void FadeExt(int fade_mask, int fade_mode) if (fade_mode & FADE_TYPE_SKIP) { +#if 0 + printf("::: will skip %d ... [%d]\n", fade_mode, fade_mode_skip); +#endif + fade_mode_skip = fade_mode; return; @@ -549,6 +557,11 @@ void FadeExt(int fade_mask, int fade_mode) return; } +#if 1 + if (global.autoplay_leveldir) + fading.fade_mode = FADE_MODE_NONE; +#endif + #if 1 if (fading.fade_mode == FADE_MODE_NONE) return; @@ -599,6 +612,14 @@ void FadeExt(int fade_mask, int fade_mode) void FadeIn(int fade_mask) { +#if 1 + // printf("::: now fading in...\n"); + + if (fading.fade_mode & FADE_TYPE_TRANSFORM) + FadeExt(fade_mask, fading.fade_mode); + else + FadeExt(fade_mask, FADE_MODE_FADE_IN); +#else #if 1 if (fading.fade_mode == FADE_MODE_CROSSFADE) FadeExt(fade_mask, FADE_MODE_CROSSFADE); @@ -607,10 +628,19 @@ void FadeIn(int fade_mask) #else FadeExt(fade_mask, FADE_MODE_FADE_IN); #endif +#endif } void FadeOut(int fade_mask) { +#if 1 + // printf("::: fading.fade_mode == %d\n", fading.fade_mode); + + if (fading.fade_mode & FADE_TYPE_TRANSFORM) + FadeCrossSaveBackbuffer(); + else + FadeExt(fade_mask, FADE_MODE_FADE_OUT); +#else #if 1 if (fading.fade_mode == FADE_MODE_CROSSFADE) FadeCrossSaveBackbuffer(); @@ -619,6 +649,7 @@ void FadeOut(int fade_mask) #else FadeExt(fade_mask, FADE_MODE_FADE_OUT); #endif +#endif } void FadeCross(int fade_mask) @@ -631,25 +662,46 @@ void FadeCrossSaveBackbuffer() BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); } +static void FadeSetLeaveNext(struct TitleFadingInfo fading_leave, boolean set) +{ + static struct TitleFadingInfo fading_leave_stored; + + if (set) + fading_leave_stored = fading_leave; + else + fading = fading_leave_stored; +} + void FadeSetEnterMenu() { fading = menu.enter_menu; + + FadeSetLeaveNext(fading, TRUE); /* (keep same fade mode) */ } void FadeSetLeaveMenu() { fading = menu.leave_menu; + + FadeSetLeaveNext(fading, TRUE); /* (keep same fade mode) */ } -void FadeSetStartItem() +void FadeSetEnterScreen() { - fading = menu.start_item; + fading = menu.enter_screen[game_status]; + + FadeSetLeaveNext(menu.leave_screen[game_status], TRUE); /* store */ +} + +void FadeSetLeaveScreen() +{ + FadeSetLeaveNext(menu.leave_screen[game_status], FALSE); /* recall */ } void FadeSetFromType(int type) { if (type & TYPE_ENTER_SCREEN) - FadeSetStartItem(); + FadeSetEnterScreen(); else if (type & TYPE_ENTER) FadeSetEnterMenu(); else if (type & TYPE_LEAVE) @@ -860,6 +912,55 @@ inline int getGraphicAnimationFrame(int graphic, int sync_frame) sync_frame); } +void getSizedGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y, + int tilesize_raw) +{ + struct + { + int width_mult, width_div; + int height_mult, height_div; + } + offset_calc[6] = + { + { 15, 16, 2, 3 }, /* 1 x 1 */ + { 7, 8, 2, 3 }, /* 2 x 2 */ + { 3, 4, 2, 3 }, /* 4 x 4 */ + { 1, 2, 2, 3 }, /* 8 x 8 */ + { 0, 1, 2, 3 }, /* 16 x 16 */ + { 0, 1, 0, 1 }, /* 32 x 32 */ + }; + int tilesize = MIN(MAX(1, tilesize_raw), TILESIZE); + int offset_calc_pos = log_2(tilesize); + Bitmap *src_bitmap = graphic_info[graphic].bitmap; + int width_mult = offset_calc[offset_calc_pos].width_mult; + int width_div = offset_calc[offset_calc_pos].width_div; + int height_mult = offset_calc[offset_calc_pos].height_mult; + int height_div = offset_calc[offset_calc_pos].height_div; + int startx = src_bitmap->width * width_mult / width_div; + int starty = src_bitmap->height * height_mult / height_div; + int src_x = startx + graphic_info[graphic].src_x * tilesize / TILESIZE; + int src_y = starty + graphic_info[graphic].src_y * tilesize / TILESIZE; + + *bitmap = src_bitmap; + *x = src_x; + *y = src_y; +} + +void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) +{ +#if 1 + getSizedGraphicSource(graphic, bitmap, x, y, MINI_TILESIZE); +#else + struct GraphicInfo *g = &graphic_info[graphic]; + int mini_startx = 0; + int mini_starty = g->bitmap->height * 2 / 3; + + *bitmap = g->bitmap; + *x = mini_startx + g->src_x / 2; + *y = mini_starty + g->src_y / 2; +#endif +} + inline void getGraphicSourceExt(int graphic, int frame, Bitmap **bitmap, int *x, int *y, boolean get_backside) { @@ -951,21 +1052,26 @@ void DrawGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, int graphic, BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dst_x, dst_y); } -void DrawMiniGraphic(int x, int y, int graphic) +void DrawSizedGraphic(int x, int y, int graphic, int tilesize) { - DrawMiniGraphicExt(drawto, SX + x * MINI_TILEX,SY + y * MINI_TILEY, graphic); - MarkTileDirty(x / 2, y / 2); + DrawSizedGraphicExt(drawto, SX + x * tilesize, SY + y * tilesize, graphic, + tilesize); + MarkTileDirty(x / tilesize, y / tilesize); } -void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) +void DrawSizedGraphicExt(DrawBuffer *d, int x, int y, int graphic, int tilesize) { - struct GraphicInfo *g = &graphic_info[graphic]; - int mini_startx = 0; - int mini_starty = g->bitmap->height * 2 / 3; + Bitmap *src_bitmap; + int src_x, src_y; - *bitmap = g->bitmap; - *x = mini_startx + g->src_x / 2; - *y = mini_starty + g->src_y / 2; + getSizedGraphicSource(graphic, &src_bitmap, &src_x, &src_y, tilesize); + BlitBitmap(src_bitmap, d, src_x, src_y, tilesize, tilesize, x, y); +} + +void DrawMiniGraphic(int x, int y, int graphic) +{ + DrawMiniGraphicExt(drawto, SX + x * MINI_TILEX,SY + y * MINI_TILEY, graphic); + MarkTileDirty(x / 2, y / 2); } void DrawMiniGraphicExt(DrawBuffer *d, int x, int y, int graphic) @@ -1774,44 +1880,13 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } -void getPreviewGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y, - int tilesize) -{ - struct - { - int width_mult, width_div; - int height_mult, height_div; - } offset_calc[4] = - { - { 0, 1, 0, 1 }, - { 0, 1, 2, 3 }, - { 1, 2, 2, 3 }, - { 3, 4, 2, 3 }, - }; - int offset_calc_pos = (tilesize < MICRO_TILESIZE || tilesize > TILESIZE ? 3 : - 5 - log_2(tilesize)); - Bitmap *src_bitmap = graphic_info[graphic].bitmap; - int width_mult = offset_calc[offset_calc_pos].width_mult; - int width_div = offset_calc[offset_calc_pos].width_div; - int height_mult = offset_calc[offset_calc_pos].height_mult; - int height_div = offset_calc[offset_calc_pos].height_div; - int mini_startx = src_bitmap->width * width_mult / width_div; - int mini_starty = src_bitmap->height * height_mult / height_div; - int src_x = mini_startx + graphic_info[graphic].src_x * tilesize / TILESIZE; - int src_y = mini_starty + graphic_info[graphic].src_y * tilesize / TILESIZE; - - *bitmap = src_bitmap; - *x = src_x; - *y = src_y; -} - 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); + getSizedGraphicSource(graphic, &src_bitmap, &src_x, &src_y, tilesize); BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize, dst_x,dst_y); } @@ -1930,8 +2005,8 @@ static void DrawPreviewLevelLabelExt(int mode) #endif #if 1 - if (pos->chars != -1) - max_len_label_text = pos->chars; + if (pos->size != -1) + max_len_label_text = pos->size; #endif for (i = 0; i < max_len_label_text; i++) @@ -2040,8 +2115,8 @@ void DrawPreviewLevel(boolean restart) #endif #if 1 - if (pos->chars != -1) - max_len_label_text = pos->chars; + if (pos->size != -1) + max_len_label_text = pos->size; #endif strncpy(label_text, leveldir_current->name, max_len_label_text); @@ -2872,6 +2947,11 @@ boolean Request(char *text, unsigned int req_state) case EVENT_KEYPRESS: switch (GetEventKey((KeyEvent *)&event, TRUE)) { + case KSYM_space: + if (req_state & REQ_CONFIRM) + result = 1; + break; + case KSYM_Return: result = 1; break; @@ -2883,6 +2963,7 @@ boolean Request(char *text, unsigned int req_state) default: break; } + if (req_state & REQ_PLAYER) result = 0; break; @@ -5674,6 +5755,13 @@ int el2preimg(int element) return element_info[element].special_graphic[GFX_SPECIAL_ARG_PREVIEW]; } +int el2doorimg(int element) +{ + element = GFX_ELEMENT(element); + + return element_info[element].special_graphic[GFX_SPECIAL_ARG_DOOR]; +} + int font2baseimg(int font_nr) { return font_info[font_nr].special_graphic[GFX_SPECIAL_ARG_DEFAULT];