X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=068afdef8b6fa22003b984360fc6213366455718;hb=2a357b702b5ceb9bf9173ac02f68cf42340b3158;hp=e28f068e467df5a93d88eb2f8f06fd53d67be701;hpb=891c39ca37c4fea5f6cc4ca40f913a56c68ef495;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index e28f068e..068afdef 100644 --- a/src/tools.c +++ b/src/tools.c @@ -91,8 +91,8 @@ void RedrawPlayfield(boolean force_redraw, int x, int y, int width, int height) if (setup.direct_draw) SetDrawtoField(DRAW_BACKBUFFER); - for(xx=BX1; xx<=BX2; xx++) - for(yy=BY1; yy<=BY2; yy++) + for (xx = BX1; xx <= BX2; xx++) + for (yy = BY1; yy <= BY2; yy++) if (xx >= x1 && xx <= x2 && yy >= y1 && yy <= y2) DrawScreenField(xx, yy); DrawAllPlayers(); @@ -263,8 +263,8 @@ void BackToFront() if (redraw_mask & REDRAW_TILES) { - for(x=0; xis_pushing ? ACTION_PUSHING : + player->is_digging ? ACTION_DIGGING : + player->is_collecting ? ACTION_COLLECTING : + player->is_moving ? ACTION_MOVING : + player->is_snapping ? ACTION_SNAPPING : + player->is_sleeping ? ACTION_SLEEPING : + player->is_bored ? ACTION_BORING : + player->is_waiting ? ACTION_WAITING : ACTION_DEFAULT); + + if (player->is_sleeping) + { + if (player->num_special_action_sleeping > 0) + { + if (player->anim_delay_counter == 0 && player->post_delay_counter == 0) + { + int last_special_action = player->special_action_sleeping; + int num_special_action = player->num_special_action_sleeping; + int special_action = + (last_special_action == ACTION_DEFAULT ? ACTION_SLEEPING_1 : + last_special_action == ACTION_SLEEPING ? ACTION_SLEEPING : + last_special_action < ACTION_SLEEPING_1 + num_special_action - 1 ? + last_special_action + 1 : ACTION_SLEEPING); + int special_graphic = + el_act_dir2img(player->element_nr, special_action, move_dir); + + player->anim_delay_counter = + graphic_info[special_graphic].anim_delay_fixed + + SimpleRND(graphic_info[special_graphic].anim_delay_random); + player->post_delay_counter = + graphic_info[special_graphic].post_delay_fixed + + SimpleRND(graphic_info[special_graphic].post_delay_random); + + player->special_action_sleeping = special_action; + } + + if (player->anim_delay_counter > 0) + { + action = player->special_action_sleeping; + player->anim_delay_counter--; + } + else if (player->post_delay_counter > 0) + { + player->post_delay_counter--; + } + } + } + else if (player->is_bored) + { + if (player->num_special_action_bored > 0) + { + if (player->anim_delay_counter == 0 && player->post_delay_counter == 0) + { + int special_action = + ACTION_BORING_1 + SimpleRND(player->num_special_action_bored); + int special_graphic = + el_act_dir2img(player->element_nr, special_action, move_dir); + + player->anim_delay_counter = + graphic_info[special_graphic].anim_delay_fixed + + SimpleRND(graphic_info[special_graphic].anim_delay_random); + player->post_delay_counter = + graphic_info[special_graphic].post_delay_fixed + + SimpleRND(graphic_info[special_graphic].post_delay_random); + + player->special_action_bored = special_action; + } + + if (player->anim_delay_counter > 0) + { + action = player->special_action_bored; + player->anim_delay_counter--; + } + else if (player->post_delay_counter > 0) + { + player->post_delay_counter--; + } + } + } + + return action; +} + static int getPlayerGraphic(struct PlayerInfo *player, int move_dir) { if (player->use_murphy_graphic) @@ -570,7 +654,7 @@ void DrawAllPlayers() { int i; - for(i=0; iis_pushing ? ACTION_PUSHING : player->is_digging ? ACTION_DIGGING : player->is_collecting ? ACTION_COLLECTING : @@ -637,10 +727,36 @@ void DrawPlayer(struct PlayerInfo *player) player->is_bored ? ACTION_BORING : player->is_waiting ? ACTION_WAITING : ACTION_DEFAULT); - if (player->is_bored || player->is_sleeping) + if (player->is_bored && player->num_special_action_bored > 0) { - /* ... */ + if (player->anim_delay_counter == 0 && player->post_delay_counter == 0) + { + int graphic_waiting; + + action = ACTION_BORING_1 + SimpleRND(player->num_special_action_bored); + special_graphic = el_act_dir2img(EL_SP_MURPHY, action, move_dir); + + player->anim_delay_counter = + graphic_info[special_graphic].anim_delay_fixed + + SimpleRND(graphic_info[special_graphic].anim_delay_random); + player->post_delay_counter = + graphic_info[special_graphic].post_delay_fixed + + SimpleRND(graphic_info[special_graphic].post_delay_random); + player->special_action_bored = action; + } + + if (player->anim_delay_counter > 0) + { + action = player->special_action_bored; + player->anim_delay_counter--; + } + + if (player->post_delay_counter > 0) + { + player->post_delay_counter--; + } } +#endif #if 0 printf("::: '%s'\n", element_action_info[action].suffix); @@ -1242,7 +1358,7 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame) getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); - for(i=0; i<4; i++) + for (i = 0; i < 4; i++) { int xx = x + xy[i][0]; int yy = y + xy[i][1]; @@ -1287,7 +1403,7 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame) getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); #endif - for(i=0; i<4; i++) + for (i = 0; i < 4; i++) { int xx = x + xy[i][0]; int yy = y + xy[i][1]; @@ -1376,7 +1492,7 @@ void DrawLevelFieldCrumbledSandNeighbours(int x, int y) }; int i; - for(i=0; i<4; i++) + for (i = 0; i < 4; i++) { int xx = x + xy[i][0]; int yy = y + xy[i][1]; @@ -1624,7 +1740,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) int ystep = (ystart < yend || xstep == 0 ? 1 : 0); int x, y; - for (x=xstart, y=ystart; x <= xend && y <= yend; x += xstep, y += ystep) + for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep) { int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2; int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2; @@ -1638,7 +1754,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) SetDrawtoField(DRAW_BACKBUFFER); - for (yy=0; yy < ysize; yy++) for (xx=0; xx < xsize; xx++) + for (yy = 0; yy < ysize; yy++) for (xx = 0; xx < xsize; xx++) DrawEnvelopeBackground(envelope_nr, sx,sy, xx,yy, xsize, ysize, font_nr); DrawTextToTextArea(SX + sx + font_width, SY + sy + font_height, @@ -1725,8 +1841,8 @@ void DrawLevel() SetDrawBackgroundMask(REDRAW_NONE); ClearWindow(); - for(x=BX1; x<=BX2; x++) - for(y=BY1; y<=BY2; y++) + for (x = BX1; x <= BX2; x++) + for (y = BY1; y <= BY2; y++) DrawScreenField(x, y); redraw_mask |= REDRAW_FIELD; @@ -1736,8 +1852,8 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) { int x,y; - for(x=0; xstored_clip_gc; @@ -2669,7 +2785,7 @@ void CreateToolButtons() { int i; - for (i=0; i