From 2e61fe84534a7798c987553cc0f4bb5a4f0c264a Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Thu, 27 Feb 2014 02:26:45 +0100 Subject: [PATCH] rnd-20140227-1-src --- src/conf_gfx.c | 18 ++++++ src/conf_var.c | 64 ++++++++++++++++++++ src/conftime.h | 2 +- src/libgame/system.h | 1 + src/main.h | 2 + src/tools.c | 135 ++++++++++++++++++++++++++++++++++++++----- 6 files changed, 206 insertions(+), 16 deletions(-) diff --git a/src/conf_gfx.c b/src/conf_gfx.c index f5006d9f..90c25853 100644 --- a/src/conf_gfx.c +++ b/src/conf_gfx.c @@ -6082,6 +6082,24 @@ struct ConfigInfo image_config[] = { "door_2.part_8.draw_masked", "true" }, { "door_2.part_8.draw_order", "0" }, + { "door_1.panel.x", "0" }, + { "door_1.panel.y", "0" }, + { "door_1.panel.step_xoffset", "0" }, + { "door_1.panel.step_yoffset", "1" }, + { "door_1.panel.step_delay", "10" }, + { "door_1.panel.start_step", "212" }, + { "door_1.panel.draw_masked", "false" }, + { "door_1.panel.draw_order", "0" }, + + { "door_2.panel.x", "0" }, + { "door_2.panel.y", "0" }, + { "door_2.panel.step_xoffset", "0" }, + { "door_2.panel.step_yoffset", "1" }, + { "door_2.panel.step_delay", "10" }, + { "door_2.panel.start_step", "32" }, + { "door_2.panel.draw_masked", "false" }, + { "door_2.panel.draw_order", "0" }, + { "door_1.width", "-1" }, { "door_1.height", "-1" }, { "door_1.step_offset", "2" }, diff --git a/src/conf_var.c b/src/conf_var.c index a044c51b..7cd60d12 100644 --- a/src/conf_var.c +++ b/src/conf_var.c @@ -2540,6 +2540,70 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_8.draw_order", &door_2.part_8.sort_priority }, + { + "door_1.panel.x", + &door_1.panel.x + }, + { + "door_1.panel.y", + &door_1.panel.y + }, + { + "door_1.panel.step_xoffset", + &door_1.panel.step_xoffset + }, + { + "door_1.panel.step_yoffset", + &door_1.panel.step_yoffset + }, + { + "door_1.panel.step_delay", + &door_1.panel.step_delay + }, + { + "door_1.panel.start_step", + &door_1.panel.start_step + }, + { + "door_1.panel.draw_masked", + &door_1.panel.draw_masked + }, + { + "door_1.panel.draw_order", + &door_1.panel.sort_priority + }, + { + "door_2.panel.x", + &door_2.panel.x + }, + { + "door_2.panel.y", + &door_2.panel.y + }, + { + "door_2.panel.step_xoffset", + &door_2.panel.step_xoffset + }, + { + "door_2.panel.step_yoffset", + &door_2.panel.step_yoffset + }, + { + "door_2.panel.step_delay", + &door_2.panel.step_delay + }, + { + "door_2.panel.start_step", + &door_2.panel.start_step + }, + { + "door_2.panel.draw_masked", + &door_2.panel.draw_masked + }, + { + "door_2.panel.draw_order", + &door_2.panel.sort_priority + }, { "door_1.width", &door_1.width diff --git a/src/conftime.h b/src/conftime.h index d1de6144..e9184eb7 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2014-02-26 00:54" +#define COMPILE_DATE_STRING "2014-02-27 02:26" diff --git a/src/libgame/system.h b/src/libgame/system.h index 0b2800f2..0d7f583c 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -1214,6 +1214,7 @@ struct DoorPartPosInfo int step_xoffset; int step_yoffset; int step_delay; + int start_step; boolean draw_masked; int sort_priority; }; diff --git a/src/main.h b/src/main.h index aecccc46..385cc498 100644 --- a/src/main.h +++ b/src/main.h @@ -2309,6 +2309,8 @@ struct DoorInfo struct DoorPartPosInfo part_7; struct DoorPartPosInfo part_8; + struct DoorPartPosInfo panel; + int width; int height; int step_offset; diff --git a/src/tools.c b/src/tools.c index 96415c52..5b32c1c2 100644 --- a/src/tools.c +++ b/src/tools.c @@ -41,8 +41,11 @@ /* constants for number of doors and door parts */ #define NUM_DOORS 2 +#define NUM_PANELS NUM_DOORS +// #define NUM_PANELS 0 #define MAX_PARTS_PER_DOOR 8 -#define MAX_DOOR_PARTS (NUM_DOORS * MAX_PARTS_PER_DOOR) +#define MAX_DOOR_PARTS (NUM_DOORS * MAX_PARTS_PER_DOOR + NUM_PANELS) +#define DOOR_PART_IS_PANEL(i) ((i) >= NUM_DOORS * MAX_PARTS_PER_DOOR) struct DoorPartOrderInfo @@ -102,6 +105,7 @@ static struct DoorPartControlInfo door_part_controls[] = IMG_DOOR_1_GFX_PART_8, &door_1.part_8 }, + { DOOR_2, IMG_DOOR_2_GFX_PART_1, @@ -143,6 +147,17 @@ static struct DoorPartControlInfo door_part_controls[] = &door_2.part_8 }, + { + DOOR_1, + IMG_BACKGROUND_PANEL, + &door_1.panel + }, + { + DOOR_2, + IMG_BACKGROUND_TAPE, + &door_2.panel + }, + { -1, -1, @@ -5486,14 +5501,25 @@ unsigned int MoveDoor(unsigned int door_state) for (i = 0; i < MAX_DOOR_PARTS; i++) { - int nr = door_part_order[i].nr; - struct DoorPartControlInfo *dpc = &door_part_controls[nr]; + struct DoorPartControlInfo *dpc = &door_part_controls[i]; struct GraphicInfo *g = &graphic_info[dpc->graphic]; int door_token = dpc->door_nr; - door_part_done[nr] = (!(door_state & door_token) || - !g->bitmap); + door_part_done[i] = (!(door_state & door_token) || + !g->bitmap); + } + +#if 0 + for (i = 0; i < MAX_DOOR_PARTS; i++) + { + struct DoorPartControlInfo *dpc = &door_part_controls[i]; + struct DoorPartPosInfo *pos = dpc->pos; + int start_step = pos->start_step; + + printf("::: ---> %d: start_step == %d [%d]\n", + i, start_step, door_part_done[i]); } +#endif for (i = 0; i < MAX_DOOR_PARTS; i++) { @@ -5502,6 +5528,7 @@ unsigned int MoveDoor(unsigned int door_state) struct DoorPartPosInfo *pos = dpc->pos; int step_xoffset = ABS(pos->step_xoffset); int step_yoffset = ABS(pos->step_yoffset); + int start_step = pos->start_step; int step_delay = pos->step_delay; float move_xsize = (step_xoffset ? g->width : 0); float move_ysize = (step_yoffset ? g->height : 0); @@ -5509,15 +5536,27 @@ unsigned int MoveDoor(unsigned int door_state) int move_ysteps = (step_yoffset ? ceil(move_ysize / step_yoffset) : 0); int move_steps = (move_xsteps && move_ysteps ? MIN(move_xsteps, move_ysteps) : - move_xsteps ? move_xsteps : move_ysteps); + move_xsteps ? move_xsteps : move_ysteps) - start_step; int move_delay = move_steps * step_delay; + if (door_part_done[i]) + continue; + max_move_delay = MAX(max_move_delay, move_delay); max_step_delay = (max_step_delay == 0 ? step_delay : euclid(max_step_delay, step_delay)); - num_steps[i] = (move_xsteps && move_ysteps ? - MIN(move_xsteps, move_ysteps) : - move_xsteps ? move_xsteps : move_ysteps); + num_steps[i] = move_steps; + +#if 0 +#if 0 + printf("::: %d: move_delay == %d, start_step == %d [%d]\n", + i, move_delay, start_step, door_part_order[i].nr); +#else + if (DOOR_PART_IS_PANEL(i)) + printf("::: %d: move_delay == %d, start_step == %d\n", + i, move_delay, start_step); +#endif +#endif } num_move_steps = max_move_delay / max_step_delay; @@ -5528,6 +5567,10 @@ unsigned int MoveDoor(unsigned int door_state) door_delay_value *= 10; #endif +#if 0 + printf("::: num_move_steps == %d, max_move_delay == %d, max_step_delay == %d\n", num_move_steps, max_move_delay, max_step_delay); +#endif + for (k = 0; k < num_move_steps; k++) { for (i = 0; i < NUM_DOORS; i++) @@ -5539,29 +5582,45 @@ unsigned int MoveDoor(unsigned int door_state) struct DoorPartControlInfo *dpc = &door_part_controls[nr]; int door_token = dpc->door_nr; int door_index = DOOR_INDEX_FROM_TOKEN(door_token); + boolean is_panel = DOOR_PART_IS_PANEL(nr); struct GraphicInfo *g = &graphic_info[dpc->graphic]; struct DoorPartPosInfo *pos = dpc->pos; struct XY *panel_pos = &panel_pos_list[door_index]; struct Rect *door_rect = &door_rect_list[door_index]; + Bitmap *bitmap = (is_panel ? bitmap_db_door : g->bitmap); int current_door_state = door_state & door_token; boolean door_opening = ((current_door_state & DOOR_OPEN) != 0); boolean door_closing = ((current_door_state & DOOR_CLOSE) != 0); + boolean mode_opening = (is_panel ? door_closing : door_opening); int step_delay = pos->step_delay; int step_factor = step_delay / max_step_delay; int k1 = (step_factor ? k / step_factor + 1 : k); - int kk = (door_opening ? k1 : num_steps[nr] - k1); - int src_xx, src_yy; - int dst_xx, dst_yy; + int k2 = (mode_opening ? k1 : num_steps[nr] - k1); + int kk = (k2 < 0 ? 0 : k2); + int src_x, src_y, src_xx, src_yy; + int dst_x, dst_y, dst_xx, dst_yy; int width, height; +#if 0 + if (DOOR_PART_IS_PANEL(nr)) + { + int start_step = pos->start_step; + + k2 = (door_closing ? k1 : num_steps[nr] - k1);// - start_step; + kk = (k2 < 0 ? 0 : k2); + } +#endif + #if 0 // !!! TEST !!! if (nr != 0) continue; #endif +#if 0 if (door_part_done[nr]) continue; +#endif if (!(door_state & door_token)) continue; @@ -5569,16 +5628,23 @@ unsigned int MoveDoor(unsigned int door_state) if (!g->bitmap) continue; +#if 0 if (current_move_delay % step_delay) continue; +#endif // draw door panel if (!door_panel_drawn[door_index]) { +#if 1 + ClearRectangle(drawto, door_rect->x, door_rect->y, + door_rect->width, door_rect->height); +#else BlitBitmap(bitmap_db_door, drawto, panel_pos->x, panel_pos->y, door_rect->width, door_rect->height, door_rect->x, door_rect->y); +#endif door_panel_drawn[door_index] = TRUE; } @@ -5606,6 +5672,8 @@ unsigned int MoveDoor(unsigned int door_state) } width = g->width - src_xx; + + // printf("::: k == %d [%d] \n", k, start_step); } if (pos->step_yoffset < 0) // door part on bottom side @@ -5631,11 +5699,48 @@ unsigned int MoveDoor(unsigned int door_state) height = g->height - src_yy; } + if (is_panel) + { + src_x = panel_pos->x + src_xx; + src_y = panel_pos->y + src_yy; + } + else + { + src_x = g->src_x + src_xx; + src_y = g->src_y + src_yy; + } + + dst_x = door_rect->x + dst_xx; + dst_y = door_rect->y + dst_yy; + if (width >= 0 && width <= g->width && height >= 0 && height <= g->height) - BlitBitmapMasked(g->bitmap, drawto, - g->src_x + src_xx, g->src_y + src_yy, width, height, - door_rect->x + dst_xx, door_rect->y + dst_yy); + { + if (is_panel || !pos->draw_masked) + BlitBitmap(bitmap, drawto, src_x, src_y, width, height, + dst_x, dst_y); + else + BlitBitmapMasked(bitmap, drawto, src_x, src_y, width, height, + dst_x, dst_y); + } + +#if 0 + if (DOOR_PART_IS_PANEL(nr)) + { + bitmap = bitmap_db_door; + src_x = panel_pos->x + src_xx; + src_y = panel_pos->y + src_yy; + + printf("::: width == %d, height == %d [%d, %d] [%d, %d]\n", + width, height, g->width, g->height, src_x, src_y); + + if (width >= 0 && width <= g->width && + height >= 0 && height <= g->height) + BlitBitmap(bitmap, drawto, src_x, src_y, + width, height, + dst_x, dst_y); + } +#endif redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token); -- 2.34.1