X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=a4dad466928ffb62ef7de2475a7fd2e4f9cccdbd;hb=b6659e15c47b5f66e7db42af93080dda213a9605;hp=c000d097f9a5d0110bfb589a1975829599ab1340;hpb=21f34b5bebb5acc7f43a0dff5d4883775591c359;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index c000d097..a4dad466 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1517,6 +1517,11 @@ void SetRandomAnimationValue(int x, int y) gfx.anim_random_frame = GfxRandom[x][y]; } +void SetAnimationFirstLevel(int first_level) +{ + gfx.anim_first_level = first_level; +} + int getGraphicAnimationFrame(int graphic, int sync_frame) { // animation synchronized with global frame counter, not move position @@ -3056,6 +3061,8 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, SDLFreeBitmapTextures(request.bitmap); SDLCreateBitmapTextures(request.bitmap); + ResetBitmapAlpha(request.bitmap); + // set envelope request run-time values request.sx = sx; request.sy = sy; @@ -3069,7 +3076,11 @@ void DrawEnvelopeRequestToScreen(int drawing_target) game.request_active && drawing_target == DRAW_TO_SCREEN) { - if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + struct GraphicInfo *g = &graphic_info[IMG_BACKGROUND_REQUEST]; + + SetBitmapAlphaNextBlit(request.bitmap, g->alpha); + + if (g->draw_masked) BlitToScreenMasked(request.bitmap, 0, 0, request.xsize, request.ysize, request.sx, request.sy); else @@ -3145,9 +3156,8 @@ static void setRequestPosition(int *x, int *y, boolean add_border_size) setRequestPositionExt(x, y, request.width, request.height, add_border_size); } -static void DrawEnvelopeRequest(char *text, unsigned int req_state) +static void DrawEnvelopeRequestText(int sx, int sy, char *text) { - DrawBuffer *drawto_last = drawto; char *text_final = text; char *text_door_style = NULL; int graphic = IMG_BACKGROUND_REQUEST; @@ -3164,15 +3174,11 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) int line_length = max_text_width / font_width; int max_lines = max_text_height / line_height; int text_width = line_length * font_width; - int width = request.width; - int height = request.height; - int tile_size = MAX(request.step_offset, 1); - int x_steps = width / tile_size; - int y_steps = height / tile_size; int sx_offset = border_size; int sy_offset = border_size; - int sx, sy; - int x, y; + + // force DOOR font inside door area + SetFontStatus(GAME_MODE_PSEUDO_DOOR); if (request.centered) sx_offset = (request.width - text_width) / 2; @@ -3181,6 +3187,13 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) { char *src_text_ptr, *dst_text_ptr; + if (maxWordLengthInRequestString(text) > line_length) + { + font_nr = FONT_REQUEST_NARROW; + font_width = getFontWidth(font_nr); + line_length = max_text_width / font_width; + } + text_door_style = checked_malloc(2 * strlen(text) + 1); src_text_ptr = text; @@ -3204,6 +3217,28 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) text_final = text_door_style; } + DrawTextBuffer(sx + sx_offset, sy + sy_offset, text_final, font_nr, + line_length, -1, max_lines, line_spacing, mask_mode, + request.autowrap, request.centered, FALSE); + + if (text_door_style) + free(text_door_style); + + ResetFontStatus(); +} + +static void DrawEnvelopeRequest(char *text, unsigned int req_state) +{ + DrawBuffer *drawto_last = drawto; + int graphic = IMG_BACKGROUND_REQUEST; + int width = request.width; + int height = request.height; + int tile_size = MAX(request.step_offset, 1); + int x_steps = width / tile_size; + int y_steps = height / tile_size; + int sx, sy; + int x, y; + setRequestPosition(&sx, &sy, FALSE); // draw complete envelope request to temporary bitmap @@ -3217,14 +3252,8 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) x, y, x_steps, y_steps, tile_size, tile_size); - // force DOOR font inside door area - SetFontStatus(GAME_MODE_PSEUDO_DOOR); - - DrawTextBuffer(sx + sx_offset, sy + sy_offset, text_final, font_nr, - line_length, -1, max_lines, line_spacing, mask_mode, - request.autowrap, request.centered, FALSE); - - ResetFontStatus(); + // write text for request + DrawEnvelopeRequestText(sx, sy, text); MapToolButtons(req_state); @@ -3233,9 +3262,6 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) // prepare complete envelope request from temporary bitmap PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy, width, height); - - if (text_door_style) - free(text_door_style); } static void AnimateEnvelopeRequest(int anim_mode, int action) @@ -4587,11 +4613,12 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) break; default: - // only check clickable animations if no request gadget clicked - HandleGlobalAnimClicks(mx, my, button_status, FALSE); break; } + // only needed to handle clickable pointer animations here + HandleGlobalAnimClicks(mx, my, button_status, FALSE); + break; } @@ -8522,14 +8549,14 @@ unsigned int InitRND(int seed) return InitEngineRandom_RND(seed); } -static struct Mapping_EM_to_RND_object object_mapping[GAME_TILE_MAX]; -static struct Mapping_EM_to_RND_player player_mapping[MAX_PLAYERS][PLY_MAX]; +static struct Mapping_EM_to_RND_object em_object_mapping[GAME_TILE_MAX]; +static struct Mapping_EM_to_RND_player em_player_mapping[MAX_PLAYERS][PLY_MAX]; static int get_effective_element_EM(int tile, int frame_em) { - int element = object_mapping[tile].element_rnd; - int action = object_mapping[tile].action; - boolean is_backside = object_mapping[tile].is_backside; + int element = em_object_mapping[tile].element_rnd; + int action = em_object_mapping[tile].action; + boolean is_backside = em_object_mapping[tile].is_backside; boolean action_removing = (action == ACTION_DIGGING || action == ACTION_SNAPPING || action == ACTION_COLLECTING); @@ -8677,8 +8704,8 @@ void ResetGfxAnimation_EM(int x, int y, int tile) void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em, int tile, int frame_em, int x, int y) { - int action = object_mapping[tile].action; - int direction = object_mapping[tile].direction; + int action = em_object_mapping[tile].action; + int direction = em_object_mapping[tile].direction; int effective_element = get_effective_element_EM(tile, frame_em); int graphic = (direction == MV_NONE ? el_act2img(effective_element, action) : @@ -8717,11 +8744,11 @@ void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em, } else if (action_moving) { - boolean is_backside = object_mapping[tile].is_backside; + boolean is_backside = em_object_mapping[tile].is_backside; if (is_backside) { - int direction = object_mapping[tile].direction; + int direction = em_object_mapping[tile].direction; int move_dir = (action_falling ? MV_DOWN : direction); GfxFrame[x][y]++; @@ -8776,9 +8803,9 @@ void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em, void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, int tile, int frame_em, int x, int y) { - int action = object_mapping[tile].action; - int direction = object_mapping[tile].direction; - boolean is_backside = object_mapping[tile].is_backside; + int action = em_object_mapping[tile].action; + int direction = em_object_mapping[tile].direction; + boolean is_backside = em_object_mapping[tile].is_backside; int effective_element = get_effective_element_EM(tile, frame_em); int effective_action = action; int graphic = (direction == MV_NONE ? @@ -8842,9 +8869,9 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, void getGraphicSourcePlayerExt_EM(struct GraphicInfo_EM *g_em, int player_nr, int anim, int frame_em) { - int element = player_mapping[player_nr][anim].element_rnd; - int action = player_mapping[player_nr][anim].action; - int direction = player_mapping[player_nr][anim].direction; + int element = em_player_mapping[player_nr][anim].element_rnd; + int action = em_player_mapping[player_nr][anim].action; + int direction = em_player_mapping[player_nr][anim].direction; int graphic = (direction == MV_NONE ? el_act2img(element, action) : el_act_dir2img(element, action, direction)); @@ -8874,10 +8901,10 @@ void InitGraphicInfo_EM(void) // always start with reliable default values for (i = 0; i < GAME_TILE_MAX; i++) { - object_mapping[i].element_rnd = EL_UNKNOWN; - object_mapping[i].is_backside = FALSE; - object_mapping[i].action = ACTION_DEFAULT; - object_mapping[i].direction = MV_NONE; + em_object_mapping[i].element_rnd = EL_UNKNOWN; + em_object_mapping[i].is_backside = FALSE; + em_object_mapping[i].action = ACTION_DEFAULT; + em_object_mapping[i].direction = MV_NONE; } // always start with reliable default values @@ -8885,9 +8912,9 @@ void InitGraphicInfo_EM(void) { for (i = 0; i < PLY_MAX; i++) { - player_mapping[p][i].element_rnd = EL_UNKNOWN; - player_mapping[p][i].action = ACTION_DEFAULT; - player_mapping[p][i].direction = MV_NONE; + em_player_mapping[p][i].element_rnd = EL_UNKNOWN; + em_player_mapping[p][i].action = ACTION_DEFAULT; + em_player_mapping[p][i].direction = MV_NONE; } } @@ -8895,14 +8922,14 @@ void InitGraphicInfo_EM(void) { int e = em_object_mapping_list[i].element_em; - object_mapping[e].element_rnd = em_object_mapping_list[i].element_rnd; - object_mapping[e].is_backside = em_object_mapping_list[i].is_backside; + em_object_mapping[e].element_rnd = em_object_mapping_list[i].element_rnd; + em_object_mapping[e].is_backside = em_object_mapping_list[i].is_backside; if (em_object_mapping_list[i].action != -1) - object_mapping[e].action = em_object_mapping_list[i].action; + em_object_mapping[e].action = em_object_mapping_list[i].action; if (em_object_mapping_list[i].direction != -1) - object_mapping[e].direction = + em_object_mapping[e].direction = MV_DIR_FROM_BIT(em_object_mapping_list[i].direction); } @@ -8911,22 +8938,22 @@ void InitGraphicInfo_EM(void) int a = em_player_mapping_list[i].action_em; int p = em_player_mapping_list[i].player_nr; - player_mapping[p][a].element_rnd = em_player_mapping_list[i].element_rnd; + em_player_mapping[p][a].element_rnd = em_player_mapping_list[i].element_rnd; if (em_player_mapping_list[i].action != -1) - player_mapping[p][a].action = em_player_mapping_list[i].action; + em_player_mapping[p][a].action = em_player_mapping_list[i].action; if (em_player_mapping_list[i].direction != -1) - player_mapping[p][a].direction = + em_player_mapping[p][a].direction = MV_DIR_FROM_BIT(em_player_mapping_list[i].direction); } for (i = 0; i < GAME_TILE_MAX; i++) { - int element = object_mapping[i].element_rnd; - int action = object_mapping[i].action; - int direction = object_mapping[i].direction; - boolean is_backside = object_mapping[i].is_backside; + int element = em_object_mapping[i].element_rnd; + int action = em_object_mapping[i].action; + int direction = em_object_mapping[i].direction; + boolean is_backside = em_object_mapping[i].is_backside; boolean action_exploding = ((action == ACTION_EXPLODING || action == ACTION_SMASHED_BY_ROCK || action == ACTION_SMASHED_BY_SPRING) && @@ -9198,10 +9225,10 @@ void InitGraphicInfo_EM(void) { for (j = 0; j < 8; j++) { - int element = object_mapping[i].element_rnd; - int action = object_mapping[i].action; - int direction = object_mapping[i].direction; - boolean is_backside = object_mapping[i].is_backside; + int element = em_object_mapping[i].element_rnd; + int action = em_object_mapping[i].action; + int direction = em_object_mapping[i].direction; + boolean is_backside = em_object_mapping[i].is_backside; int graphic_action = el_act_dir2img(element, action, direction); int graphic_default = el_act_dir2img(element, ACTION_DEFAULT, direction); @@ -9241,9 +9268,9 @@ void InitGraphicInfo_EM(void) { for (i = 0; i < PLY_MAX; i++) { - int element = player_mapping[p][i].element_rnd; - int action = player_mapping[p][i].action; - int direction = player_mapping[p][i].direction; + int element = em_player_mapping[p][i].element_rnd; + int action = em_player_mapping[p][i].action; + int direction = em_player_mapping[p][i].direction; for (j = 0; j < 8; j++) {