From 2eb9cb502efacb04761fe3bfd4bb4fa8f4661f49 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 25 Feb 2014 02:25:55 +0100 Subject: [PATCH] rnd-20140225-1-src --- src/conf_gfx.c | 48 +++++++ src/conf_var.c | 192 ++++++++++++++++++++++++++ src/conftime.h | 2 +- src/libgame/system.h | 10 ++ src/libgame/types.h | 4 + src/main.h | 16 +-- src/tools.c | 321 ++++++++++++++++++++++++++++++++++++------- 7 files changed, 538 insertions(+), 55 deletions(-) diff --git a/src/conf_gfx.c b/src/conf_gfx.c index b0065b9e..f5006d9f 100644 --- a/src/conf_gfx.c +++ b/src/conf_gfx.c @@ -5970,67 +5970,115 @@ struct ConfigInfo image_config[] = { "door_1.part_1.x", "0" }, { "door_1.part_1.y", "0" }, + { "door_1.part_1.step_xoffset", "3" }, + { "door_1.part_1.step_yoffset", "1" }, + { "door_1.part_1.step_delay", "20" }, { "door_1.part_1.draw_masked", "true" }, { "door_1.part_1.draw_order", "3" }, { "door_1.part_2.x", "0" }, { "door_1.part_2.y", "77" }, + { "door_1.part_2.step_xoffset", "3" }, + { "door_1.part_2.step_yoffset", "1" }, + { "door_1.part_2.step_delay", "20" }, { "door_1.part_2.draw_masked", "true" }, { "door_1.part_2.draw_order", "5" }, { "door_1.part_3.x", "0" }, { "door_1.part_3.y", "140" }, + { "door_1.part_3.step_xoffset", "3" }, + { "door_1.part_3.step_yoffset", "1" }, + { "door_1.part_3.step_delay", "20" }, { "door_1.part_3.draw_masked", "true" }, { "door_1.part_3.draw_order", "4" }, { "door_1.part_4.x", "0" }, { "door_1.part_4.y", "203" }, + { "door_1.part_4.step_xoffset", "3" }, + { "door_1.part_4.step_yoffset", "1" }, + { "door_1.part_4.step_delay", "20" }, { "door_1.part_4.draw_masked", "true" }, { "door_1.part_4.draw_order", "6" }, { "door_1.part_5.x", "0" }, { "door_1.part_5.y", "0" }, + { "door_1.part_5.step_xoffset", "-3" }, + { "door_1.part_5.step_yoffset", "-1" }, + { "door_1.part_5.step_delay", "20" }, { "door_1.part_5.draw_masked", "true" }, { "door_1.part_5.draw_order", "1" }, { "door_1.part_6.x", "0" }, { "door_1.part_6.y", "77" }, + { "door_1.part_6.step_xoffset", "-3" }, + { "door_1.part_6.step_yoffset", "-1" }, + { "door_1.part_6.step_delay", "20" }, { "door_1.part_6.draw_masked", "true" }, { "door_1.part_6.draw_order", "7" }, { "door_1.part_7.x", "0" }, { "door_1.part_7.y", "140" }, + { "door_1.part_7.step_xoffset", "-3" }, + { "door_1.part_7.step_yoffset", "-1" }, + { "door_1.part_7.step_delay", "20" }, { "door_1.part_7.draw_masked", "true" }, { "door_1.part_7.draw_order", "2" }, { "door_1.part_8.x", "0" }, { "door_1.part_8.y", "203" }, + { "door_1.part_8.step_xoffset", "-3" }, + { "door_1.part_8.step_yoffset", "-1" }, + { "door_1.part_8.step_delay", "20" }, { "door_1.part_8.draw_masked", "true" }, { "door_1.part_8.draw_order", "8" }, { "door_2.part_1.x", "0" }, { "door_2.part_1.y", "0" }, + { "door_2.part_1.step_xoffset", "3" }, + { "door_2.part_1.step_yoffset", "1" }, + { "door_2.part_1.step_delay", "20" }, { "door_2.part_1.draw_masked", "true" }, { "door_2.part_1.draw_order", "2" }, { "door_2.part_2.x", "0" }, { "door_2.part_2.y", "50" }, + { "door_2.part_2.step_xoffset", "3" }, + { "door_2.part_2.step_yoffset", "1" }, + { "door_2.part_2.step_delay", "20" }, { "door_2.part_2.draw_masked", "true" }, { "door_2.part_2.draw_order", "3" }, { "door_2.part_3.x", "0" }, { "door_2.part_3.y", "0" }, + { "door_2.part_3.step_xoffset", "-3" }, + { "door_2.part_3.step_yoffset", "-1" }, + { "door_2.part_3.step_delay", "20" }, { "door_2.part_3.draw_masked", "true" }, { "door_2.part_3.draw_order", "1" }, { "door_2.part_4.x", "0" }, { "door_2.part_4.y", "50" }, + { "door_2.part_4.step_xoffset", "-3" }, + { "door_2.part_4.step_yoffset", "-1" }, + { "door_2.part_4.step_delay", "20" }, { "door_2.part_4.draw_masked", "true" }, { "door_2.part_4.draw_order", "4" }, { "door_2.part_5.x", "-1" }, { "door_2.part_5.y", "-1" }, + { "door_2.part_5.step_xoffset", "0" }, + { "door_2.part_5.step_yoffset", "0" }, + { "door_2.part_5.step_delay", "0" }, { "door_2.part_5.draw_masked", "true" }, { "door_2.part_5.draw_order", "0" }, { "door_2.part_6.x", "-1" }, { "door_2.part_6.y", "-1" }, + { "door_2.part_6.step_xoffset", "0" }, + { "door_2.part_6.step_yoffset", "0" }, + { "door_2.part_6.step_delay", "0" }, { "door_2.part_6.draw_masked", "true" }, { "door_2.part_6.draw_order", "0" }, { "door_2.part_7.x", "-1" }, { "door_2.part_7.y", "-1" }, + { "door_2.part_7.step_xoffset", "0" }, + { "door_2.part_7.step_yoffset", "0" }, + { "door_2.part_7.step_delay", "0" }, { "door_2.part_7.draw_masked", "true" }, { "door_2.part_7.draw_order", "0" }, { "door_2.part_8.x", "-1" }, { "door_2.part_8.y", "-1" }, + { "door_2.part_8.step_xoffset", "0" }, + { "door_2.part_8.step_yoffset", "0" }, + { "door_2.part_8.step_delay", "0" }, { "door_2.part_8.draw_masked", "true" }, { "door_2.part_8.draw_order", "0" }, diff --git a/src/conf_var.c b/src/conf_var.c index 7089c113..a044c51b 100644 --- a/src/conf_var.c +++ b/src/conf_var.c @@ -2100,6 +2100,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_1.y", &door_1.part_1.y }, + { + "door_1.part_1.step_xoffset", + &door_1.part_1.step_xoffset + }, + { + "door_1.part_1.step_yoffset", + &door_1.part_1.step_yoffset + }, + { + "door_1.part_1.step_delay", + &door_1.part_1.step_delay + }, { "door_1.part_1.draw_masked", &door_1.part_1.draw_masked @@ -2116,6 +2128,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_2.y", &door_1.part_2.y }, + { + "door_1.part_2.step_xoffset", + &door_1.part_2.step_xoffset + }, + { + "door_1.part_2.step_yoffset", + &door_1.part_2.step_yoffset + }, + { + "door_1.part_2.step_delay", + &door_1.part_2.step_delay + }, { "door_1.part_2.draw_masked", &door_1.part_2.draw_masked @@ -2132,6 +2156,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_3.y", &door_1.part_3.y }, + { + "door_1.part_3.step_xoffset", + &door_1.part_3.step_xoffset + }, + { + "door_1.part_3.step_yoffset", + &door_1.part_3.step_yoffset + }, + { + "door_1.part_3.step_delay", + &door_1.part_3.step_delay + }, { "door_1.part_3.draw_masked", &door_1.part_3.draw_masked @@ -2148,6 +2184,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_4.y", &door_1.part_4.y }, + { + "door_1.part_4.step_xoffset", + &door_1.part_4.step_xoffset + }, + { + "door_1.part_4.step_yoffset", + &door_1.part_4.step_yoffset + }, + { + "door_1.part_4.step_delay", + &door_1.part_4.step_delay + }, { "door_1.part_4.draw_masked", &door_1.part_4.draw_masked @@ -2164,6 +2212,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_5.y", &door_1.part_5.y }, + { + "door_1.part_5.step_xoffset", + &door_1.part_5.step_xoffset + }, + { + "door_1.part_5.step_yoffset", + &door_1.part_5.step_yoffset + }, + { + "door_1.part_5.step_delay", + &door_1.part_5.step_delay + }, { "door_1.part_5.draw_masked", &door_1.part_5.draw_masked @@ -2180,6 +2240,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_6.y", &door_1.part_6.y }, + { + "door_1.part_6.step_xoffset", + &door_1.part_6.step_xoffset + }, + { + "door_1.part_6.step_yoffset", + &door_1.part_6.step_yoffset + }, + { + "door_1.part_6.step_delay", + &door_1.part_6.step_delay + }, { "door_1.part_6.draw_masked", &door_1.part_6.draw_masked @@ -2196,6 +2268,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_7.y", &door_1.part_7.y }, + { + "door_1.part_7.step_xoffset", + &door_1.part_7.step_xoffset + }, + { + "door_1.part_7.step_yoffset", + &door_1.part_7.step_yoffset + }, + { + "door_1.part_7.step_delay", + &door_1.part_7.step_delay + }, { "door_1.part_7.draw_masked", &door_1.part_7.draw_masked @@ -2212,6 +2296,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_1.part_8.y", &door_1.part_8.y }, + { + "door_1.part_8.step_xoffset", + &door_1.part_8.step_xoffset + }, + { + "door_1.part_8.step_yoffset", + &door_1.part_8.step_yoffset + }, + { + "door_1.part_8.step_delay", + &door_1.part_8.step_delay + }, { "door_1.part_8.draw_masked", &door_1.part_8.draw_masked @@ -2228,6 +2324,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_1.y", &door_2.part_1.y }, + { + "door_2.part_1.step_xoffset", + &door_2.part_1.step_xoffset + }, + { + "door_2.part_1.step_yoffset", + &door_2.part_1.step_yoffset + }, + { + "door_2.part_1.step_delay", + &door_2.part_1.step_delay + }, { "door_2.part_1.draw_masked", &door_2.part_1.draw_masked @@ -2244,6 +2352,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_2.y", &door_2.part_2.y }, + { + "door_2.part_2.step_xoffset", + &door_2.part_2.step_xoffset + }, + { + "door_2.part_2.step_yoffset", + &door_2.part_2.step_yoffset + }, + { + "door_2.part_2.step_delay", + &door_2.part_2.step_delay + }, { "door_2.part_2.draw_masked", &door_2.part_2.draw_masked @@ -2260,6 +2380,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_3.y", &door_2.part_3.y }, + { + "door_2.part_3.step_xoffset", + &door_2.part_3.step_xoffset + }, + { + "door_2.part_3.step_yoffset", + &door_2.part_3.step_yoffset + }, + { + "door_2.part_3.step_delay", + &door_2.part_3.step_delay + }, { "door_2.part_3.draw_masked", &door_2.part_3.draw_masked @@ -2276,6 +2408,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_4.y", &door_2.part_4.y }, + { + "door_2.part_4.step_xoffset", + &door_2.part_4.step_xoffset + }, + { + "door_2.part_4.step_yoffset", + &door_2.part_4.step_yoffset + }, + { + "door_2.part_4.step_delay", + &door_2.part_4.step_delay + }, { "door_2.part_4.draw_masked", &door_2.part_4.draw_masked @@ -2292,6 +2436,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_5.y", &door_2.part_5.y }, + { + "door_2.part_5.step_xoffset", + &door_2.part_5.step_xoffset + }, + { + "door_2.part_5.step_yoffset", + &door_2.part_5.step_yoffset + }, + { + "door_2.part_5.step_delay", + &door_2.part_5.step_delay + }, { "door_2.part_5.draw_masked", &door_2.part_5.draw_masked @@ -2308,6 +2464,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_6.y", &door_2.part_6.y }, + { + "door_2.part_6.step_xoffset", + &door_2.part_6.step_xoffset + }, + { + "door_2.part_6.step_yoffset", + &door_2.part_6.step_yoffset + }, + { + "door_2.part_6.step_delay", + &door_2.part_6.step_delay + }, { "door_2.part_6.draw_masked", &door_2.part_6.draw_masked @@ -2324,6 +2492,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_7.y", &door_2.part_7.y }, + { + "door_2.part_7.step_xoffset", + &door_2.part_7.step_xoffset + }, + { + "door_2.part_7.step_yoffset", + &door_2.part_7.step_yoffset + }, + { + "door_2.part_7.step_delay", + &door_2.part_7.step_delay + }, { "door_2.part_7.draw_masked", &door_2.part_7.draw_masked @@ -2340,6 +2520,18 @@ struct TokenIntPtrInfo image_config_vars[] = "door_2.part_8.y", &door_2.part_8.y }, + { + "door_2.part_8.step_xoffset", + &door_2.part_8.step_xoffset + }, + { + "door_2.part_8.step_yoffset", + &door_2.part_8.step_yoffset + }, + { + "door_2.part_8.step_delay", + &door_2.part_8.step_delay + }, { "door_2.part_8.draw_masked", &door_2.part_8.draw_masked diff --git a/src/conftime.h b/src/conftime.h index efafec1c..39730fac 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2014-02-24 17:29" +#define COMPILE_DATE_STRING "2014-02-25 02:23" diff --git a/src/libgame/system.h b/src/libgame/system.h index 5179c03b..0b2800f2 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -1208,6 +1208,16 @@ struct MenuPosInfo int align, valign; }; +struct DoorPartPosInfo +{ + int x, y; + int step_xoffset; + int step_yoffset; + int step_delay; + boolean draw_masked; + int sort_priority; +}; + struct TextPosInfo { int x, y; diff --git a/src/libgame/types.h b/src/libgame/types.h index 6e55364c..86514b00 100644 --- a/src/libgame/types.h +++ b/src/libgame/types.h @@ -66,6 +66,10 @@ typedef unsigned char byte; #define EVEN(a) (((a) & 1) == 0) #endif +#ifndef CEIL +#define CEIL(a, b) (((a) + (b) - 1) / (b)) +#endif + #define SIZEOF_ARRAY(array, type) (sizeof(array) / sizeof(type)) #define SIZEOF_ARRAY_INT(array) SIZEOF_ARRAY(array, int) diff --git a/src/main.h b/src/main.h index 10e48258..aecccc46 100644 --- a/src/main.h +++ b/src/main.h @@ -2300,14 +2300,14 @@ struct MenuInfo struct DoorInfo { - struct TextPosInfo part_1; - struct TextPosInfo part_2; - struct TextPosInfo part_3; - struct TextPosInfo part_4; - struct TextPosInfo part_5; - struct TextPosInfo part_6; - struct TextPosInfo part_7; - struct TextPosInfo part_8; + struct DoorPartPosInfo part_1; + struct DoorPartPosInfo part_2; + struct DoorPartPosInfo part_3; + struct DoorPartPosInfo part_4; + struct DoorPartPosInfo part_5; + struct DoorPartPosInfo part_6; + struct DoorPartPosInfo part_7; + struct DoorPartPosInfo part_8; int width; int height; diff --git a/src/tools.c b/src/tools.c index 59edb3d2..ee3ae43f 100644 --- a/src/tools.c +++ b/src/tools.c @@ -54,7 +54,7 @@ struct DoorPartControlInfo { int door_nr; int graphic; - struct TextPosInfo *pos; + struct DoorPartPosInfo *pos; }; static struct DoorPartControlInfo door_part_controls[] = @@ -5320,6 +5320,13 @@ void InitDoors() /* fill structure for door part draw order */ dpo->nr = i; dpo->sort_priority = dpc->pos->sort_priority; + +#if 0 + struct DoorPartPosInfo *pos = dpc->pos; + + printf(":0: step_xoffset == %d, step_yoffset == %d\n", + pos->step_xoffset, pos->step_yoffset); +#endif } /* sort door part controls according to sort_priority and graphic number */ @@ -5381,16 +5388,33 @@ unsigned int SetDoorState(unsigned int door_state) // ========== TEST 1 =========================================================== +int euclid(int a, int b) +{ + return (b ? euclid(b, a % b) : a); +} + unsigned int MoveDoor(unsigned int door_state) { + struct XY panel_pos_list[] = + { + { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 }, + { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 }, + }; + struct Rect door_rect_list[] = + { + { DX, DY, DXSIZE, DYSIZE }, + { VX, VY, VXSIZE, VYSIZE } + }; static int door1 = DOOR_OPEN_1; static int door2 = DOOR_CLOSE_2; -#if 0 +#if 1 unsigned int door_delay = 0; unsigned int door_delay_value; +#endif +#if 0 int stepsize = 1; #endif - int i, j; + int i; #if 1 if (door_1.width < 0 || door_1.width > DXSIZE) @@ -5452,66 +5476,271 @@ unsigned int MoveDoor(unsigned int door_state) if (door_state & DOOR_ACTION) { + boolean door_panel_drawn[NUM_DOORS]; + boolean door_part_done[NUM_DOORS * MAX_NUM_DOOR_PARTS]; + boolean door_part_done_all; + int num_xsteps[NUM_DOORS * MAX_NUM_DOOR_PARTS]; + int num_ysteps[NUM_DOORS * MAX_NUM_DOOR_PARTS]; + int max_move_delay = 0; // delay for complete animations of all doors + int max_step_delay = 0; // delay (ms) between two animation frames + int num_move_steps = 0; // number of animation steps for all doors + int k; + for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++) { int nr = door_part_order[i].nr; struct DoorPartControlInfo *dpc = &door_part_controls[nr]; int door_token = dpc->door_nr; - int door_index = DOOR_INDEX_FROM_TOKEN(door_token); - int graphic = dpc->graphic; - struct GraphicInfo *g = &graphic_info[graphic]; - struct TextPosInfo *pos = dpc->pos; - int panel_src_x, panel_src_y; - int dx, dy, dxsize, dysize; - static boolean door_panel_drawn[NUM_DOORS]; - if (i == 0) - for (j = 0; j < NUM_DOORS; j++) - door_panel_drawn[j] = FALSE; + door_part_done[nr] = !(door_state & door_token); + } - if (door_token == DOOR_1) - { - panel_src_x = DOOR_GFX_PAGEX1; - panel_src_y = DOOR_GFX_PAGEY1; - dx = DX; - dy = DY; - dxsize = DXSIZE; - dysize = DYSIZE; - } - else // DOOR_2 - { - panel_src_x = DOOR_GFX_PAGEX1; - panel_src_y = DOOR_GFX_PAGEY2; - dx = VX; - dy = VY; - dxsize = VXSIZE; - dysize = VYSIZE; - } + for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++) + { + struct DoorPartControlInfo *dpc = &door_part_controls[i]; + struct GraphicInfo *g = &graphic_info[dpc->graphic]; + struct DoorPartPosInfo *pos = dpc->pos; + int step_xoffset = ABS(pos->step_xoffset); + int step_yoffset = ABS(pos->step_yoffset); + int step_delay = pos->step_delay; + int move_xsize = (step_xoffset ? g->width : 0); + int move_ysize = (step_yoffset ? g->height : 0); + /* + int move_size = (move_xsize && move_ysize ? + MIN(move_xsize, move_ysize) : + move_xsize ? move_xsize : move_ysize); + */ + int move_xsteps = (step_xoffset ? CEIL(move_xsize, step_xoffset) : 0); + int move_ysteps = (step_yoffset ? CEIL(move_ysize, step_yoffset) : 0); + /* + int move_xdelay = move_xsteps * step_delay; + int move_ydelay = move_ysteps * step_delay; + int move_delay = (move_xdelay && move_ydelay ? + MIN(move_xdelay, move_ydelay) : + move_xdelay ? move_xdelay : move_ydelay); + */ + int move_steps = (move_xsteps && move_ysteps ? + MIN(move_xsteps, move_ysteps) : + move_xsteps ? move_xsteps : move_ysteps); + int move_delay = move_steps * step_delay; + // int move_delay = MAX(move_xsize, move_ysize) * step_delay; + + 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_xsteps[i] = move_xsteps; + num_ysteps[i] = move_ysteps; + } - if (!(door_state & door_token)) - continue; + num_move_steps = max_move_delay / max_step_delay; - if (!g->bitmap) - continue; + door_delay_value = max_step_delay; + +#if 0 + printf("::: max_move_delay == %d, max_step_delay == %d, num_move_steps == %d\n", + max_move_delay, max_step_delay, num_move_steps); +#endif - if (!door_panel_drawn[door_index]) + for (k = 0; k < num_move_steps; k++) + { + for (i = 0; i < NUM_DOORS; i++) + door_panel_drawn[i] = FALSE; + + for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++) { - BlitBitmap(bitmap_db_door, drawto, panel_src_x, panel_src_y, - dxsize, dysize, dx, dy); + int nr = door_part_order[i].nr; + struct DoorPartControlInfo *dpc = &door_part_controls[nr]; + int door_token = dpc->door_nr; + int door_index = DOOR_INDEX_FROM_TOKEN(door_token); + 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]; + int src_xx, src_yy; + int dst_xx, dst_yy; + int width, height; + + if (door_part_done[nr]) + continue; - door_panel_drawn[door_index] = TRUE; - } + if (!(door_state & door_token)) + continue; + + if (!g->bitmap) + continue; + + if (!door_panel_drawn[door_index]) + { + BlitBitmap(bitmap_db_door, drawto, panel_pos->x, panel_pos->y, + door_rect->width, door_rect->height, + door_rect->x, door_rect->y); + + door_panel_drawn[door_index] = TRUE; + } #if 1 - // !!! TEST !!! - if (!((door_state & door_token) & DOOR_CLOSE)) - continue; + if ((door_state & door_token) & DOOR_OPEN) + { +#if 0 + // !!! TEST !!! + if (nr != 2) + continue; +#endif + +#if 0 + if (k == 0) + printf("::: step_xoffset == %d, step_yoffset == %d\n", + pos->step_xoffset, pos->step_yoffset); +#endif + + if (pos->step_xoffset < 0) + { +#if 1 + src_xx = 0; + dst_xx = pos->x + ABS(k * pos->step_xoffset); + width = g->width; + + if (dst_xx + width > door_rect->width) + width = door_rect->width - dst_xx; +#else + src_xx = 0; + width = g->width + k * pos->step_xoffset; + + if (width > door_rect->width) + width = door_rect->width; + + dst_xx = door_rect->width - width; +#endif + } + else + { + src_xx = 0; + dst_xx = pos->x - k * pos->step_xoffset; + + if (dst_xx < 0) + { + src_xx = ABS(dst_xx); + dst_xx = 0; + } + + width = g->width - src_xx; + } + + if (pos->step_yoffset < 0) + { +#if 1 + src_yy = 0; + dst_yy = pos->y + ABS(k * pos->step_yoffset); + height = g->height; + + if (dst_yy + height > door_rect->height) + height = door_rect->height - dst_yy; +#else + src_yy = 0; + height = g->height + k * pos->step_yoffset; + + if (height > door_rect->height) + height = door_rect->height; + + dst_yy = door_rect->height - height; +#endif + } + else + { + src_yy = 0; + dst_yy = pos->y - k * pos->step_yoffset; + + if (dst_yy < 0) + { + src_yy = ABS(dst_yy); + dst_yy = 0; + } + + height = g->height - src_yy; + } + + if (width < 0 || height < 0) + door_part_done[nr] = TRUE; + } + else // DOOR_CLOSE + { +#if 1 + // !!! TEST !!! + + door_part_done[nr] = TRUE; + + BlitBitmapMasked(g->bitmap, drawto, g->src_x, g->src_y, + g->width, g->height, + door_rect->x + pos->x, door_rect->y + pos->y); + + redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token); +#else + src_xx = (num_xsteps[nr] - k) * pos->step_xoffset; + src_yy = (num_ysteps[nr] - k) * pos->step_yoffset; + dst_xx = pos->x; + dst_yy = pos->y; + width = g->width - src_xx; + height = g->height - src_yy; + + // if (width < ABS(pos->step_xoffset) + + + + + src_xx = g->width - k * pos->step_xoffset; + src_yy = g->height - k * pos->step_yoffset; + dst_xx = pos->x; + dst_yy = pos->y; + + if (width < 0 || height < 0) + door_part_done[nr] = TRUE; +#endif + } + + if (door_part_done[nr]) + continue; + +#if 0 + // !!! TEST !!! + if (nr != 7) + continue; +#endif + + 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); +#else + // !!! TEST !!! + if (!((door_state & door_token) & DOOR_CLOSE)) + continue; + + BlitBitmapMasked(g->bitmap, drawto, g->src_x, g->src_y, + g->width, g->height, + door_rect->x + pos->x, door_rect->y + pos->y); #endif - BlitBitmapMasked(g->bitmap, drawto, g->src_x, g->src_y, - g->width, g->height, dx + pos->x, dy + pos->y); + redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token); + } + + door_part_done_all = TRUE; + + for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++) + if (!door_part_done[i]) + door_part_done_all = FALSE; - redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token); + if (door_part_done_all) + break; + + if (!(door_state & DOOR_NO_DELAY)) + { + BackToFront(); + + if (game_status == GAME_MODE_MAIN) + DoAnimation(); + + WaitUntilDelayReached(&door_delay, door_delay_value); + } } } -- 2.34.1