X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=ac20e3c144e5b3567019de53c3ad60344ab517c5;hb=520b554dfeb3a72b6b3af91903642b158169407c;hp=4b87d8118696c33434364a001e878c1c99101835;hpb=438885e31e0cf03304f95b125c949b9c8641e6b5;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 4b87d811..ac20e3c1 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 @@ -55,7 +58,7 @@ static struct DoorPartOrderInfo door_part_order[MAX_DOOR_PARTS]; struct DoorPartControlInfo { - int door_nr; + int door_token; int graphic; struct DoorPartPosInfo *pos; }; @@ -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, @@ -1002,11 +1017,28 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) ClearRectangle(backbuffer, x, y, width, height); #endif +#if 1 + +#if 1 + BlitBitmap(backbuffer, window, x, y, width, height, x, y); + + redraw_mask &= ~fade_mask; +#else + /* always redraw area that was explicitly marked to fade */ + redraw_mask |= fade_mask; + + BackToFront(); +#endif + +#else + #if 1 BlitBitmap(backbuffer, window, x, y, width, height, x, y); redraw_mask = REDRAW_NONE; + // (^^^ WRONG; should be "redraw_mask &= ~fade_mask" if done this way) #else BackToFront(); +#endif #endif return; @@ -2957,7 +2989,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action) dst_x + xsize_size_left, dst_y + ysize_size_top); #endif -#if 1 +#if 0 redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; // redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER; #else @@ -3402,14 +3434,28 @@ static void DrawPreviewLevelPlayfieldExt(int from_x, int from_y) int preview_height = preview.ysize * tile_size; int real_preview_xsize = MIN(level_xsize, preview.xsize); int real_preview_ysize = MIN(level_ysize, preview.ysize); + int real_preview_width = real_preview_xsize * tile_size; + int real_preview_height = real_preview_ysize * tile_size; int dst_x = SX + ALIGNED_XPOS(preview.x, preview_width, preview.align); int dst_y = SY + ALIGNED_YPOS(preview.y, preview_height, preview.valign); int x, y; +#if 1 + if (!IN_GFX_FIELD_FULL(dst_x, dst_y + preview_height - 1)) + return; +#endif + +#if 0 + dst_x += (preview_width - real_preview_width) / 2; + dst_y += (preview_height - real_preview_height) / 2; + + DrawBackground(dst_x, dst_y, real_preview_width, real_preview_height); +#else DrawBackground(dst_x, dst_y, preview_width, preview_height); - dst_x += (preview_width - real_preview_xsize * tile_size) / 2; - dst_y += (preview_height - real_preview_ysize * tile_size) / 2; + dst_x += (preview_width - real_preview_width) / 2; + dst_y += (preview_height - real_preview_height) / 2; +#endif for (x = 0; x < real_preview_xsize; x++) { @@ -3461,6 +3507,9 @@ static void DrawPreviewLevelLabelExt(int mode) int font_nr = pos->font; int i; + if (!IN_GFX_FIELD_FULL(pos->x, pos->y + getFontHeight(pos->font))) + return; + if (mode == MICROLABEL_LEVEL_AUTHOR_HEAD || mode == MICROLABEL_IMPORTED_FROM_HEAD || mode == MICROLABEL_IMPORTED_BY_HEAD) @@ -3600,7 +3649,8 @@ static void DrawPreviewLevelExt(boolean restart) label_text[max_len_label_text] = '\0'; #if 1 - DrawTextSAligned(pos->x, pos->y, label_text, font_nr, pos->align); + if (IN_GFX_FIELD_FULL(pos->x, pos->y + getFontHeight(pos->font))) + DrawTextSAligned(pos->x, pos->y, label_text, font_nr, pos->align); #else lxpos = SX + (SXSIZE - getTextWidth(label_text, font_nr)) / 2; lypos = SY + MICROLABEL1_YPOS; @@ -4535,9 +4585,14 @@ static boolean RequestDoor(char *text, unsigned int req_state) CloseDoor(DOOR_CLOSE_1); /* save old door content */ +#if 1 + BlitBitmap(bitmap_db_door_1, bitmap_db_door_1, + 0 * DXSIZE, 0, DXSIZE, DYSIZE, 1 * DXSIZE, 0); +#else BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1); +#endif } SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); @@ -4607,9 +4662,13 @@ static boolean RequestDoor(char *text, unsigned int req_state) } /* copy request gadgets to door backbuffer */ +#if 1 + BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); +#else BlitBitmap(drawto, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); +#endif OpenDoor(DOOR_OPEN_1); @@ -5311,16 +5370,179 @@ static int compareDoorPartOrderInfo(const void *object1, const void *object2) return compare_result; } +void InitGraphicCompatibilityInfo_Doors() +{ + struct + { + int door_token; + int part_1, part_8; + struct DoorInfo *door; + } + doors[] = + { + { DOOR_1, IMG_DOOR_1_GFX_PART_1, IMG_DOOR_1_GFX_PART_8, &door_1 }, + { DOOR_2, IMG_DOOR_2_GFX_PART_1, IMG_DOOR_2_GFX_PART_8, &door_2 }, + + { -1, -1, -1, NULL } + }; + struct Rect door_rect_list[] = + { + { DX, DY, DXSIZE, DYSIZE }, + { VX, VY, VXSIZE, VYSIZE } + }; + int i, j; + + for (i = 0; doors[i].door_token != -1; i++) + { + int door_token = doors[i].door_token; + int door_index = DOOR_INDEX_FROM_TOKEN(door_token); + int part_1 = doors[i].part_1; + int part_8 = doors[i].part_8; + int part_2 = part_1 + 1; + int part_3 = part_1 + 2; + struct DoorInfo *door = doors[i].door; + struct Rect *door_rect = &door_rect_list[door_index]; + boolean door_gfx_redefined = FALSE; + + /* check if any door part graphic definitions have been redefined */ + + for (j = 0; door_part_controls[j].door_token != -1; j++) + { + struct DoorPartControlInfo *dpc = &door_part_controls[j]; + struct FileInfo *fi = getImageListEntryFromImageID(dpc->graphic); + + if (dpc->door_token == door_token && fi->redefined) + door_gfx_redefined = TRUE; + } + + /* check for old-style door graphic/animation modifications */ + + if (!door_gfx_redefined) + { + if (door->anim_mode & ANIM_STATIC_PANEL) + { + door->panel.step_xoffset = 0; + door->panel.step_yoffset = 0; + } + + if (door->anim_mode & (ANIM_HORIZONTAL | ANIM_VERTICAL)) + { + struct GraphicInfo *g_part_1 = &graphic_info[part_1]; + struct GraphicInfo *g_part_2 = &graphic_info[part_2]; + int num_door_steps, num_panel_steps; + + /* remove door part graphics other than the two default wings */ + + for (j = 0; door_part_controls[j].door_token != -1; j++) + { + struct DoorPartControlInfo *dpc = &door_part_controls[j]; + struct GraphicInfo *g = &graphic_info[dpc->graphic]; + + if (dpc->graphic >= part_3 && + dpc->graphic <= part_8) + g->bitmap = NULL; + } + + /* set graphics and screen positions of the default wings */ + + g_part_1->width = door_rect->width; + g_part_1->height = door_rect->height; + g_part_2->width = door_rect->width; + g_part_2->height = door_rect->height; + g_part_2->src_x = door_rect->width; + g_part_2->src_y = g_part_1->src_y; + + door->part_2.x = door->part_1.x; + door->part_2.y = door->part_1.y; + + if (door->width != -1) + { + g_part_1->width = door->width; + g_part_2->width = door->width; + + // special treatment for graphics and screen position of right wing + g_part_2->src_x += door_rect->width - door->width; + door->part_2.x += door_rect->width - door->width; + } + + if (door->height != -1) + { + g_part_1->height = door->height; + g_part_2->height = door->height; + + // special treatment for graphics and screen position of bottom wing + g_part_2->src_y += door_rect->height - door->height; + door->part_2.y += door_rect->height - door->height; + } + + /* set animation delays for the default wings and panels */ + + door->part_1.step_delay = door->step_delay; + door->part_2.step_delay = door->step_delay; + door->panel.step_delay = door->step_delay; + + /* set animation draw order for the default wings */ + + door->part_1.sort_priority = 2; /* draw left wing over ... */ + door->part_2.sort_priority = 1; /* ... right wing */ + + /* set animation draw offset for the default wings */ + + if (door->anim_mode & ANIM_HORIZONTAL) + { + door->part_1.step_xoffset = door->step_offset; + door->part_1.step_yoffset = 0; + door->part_2.step_xoffset = door->step_offset * -1; + door->part_2.step_yoffset = 0; + + num_door_steps = g_part_1->width / door->step_offset; + } + else // ANIM_VERTICAL + { + door->part_1.step_xoffset = 0; + door->part_1.step_yoffset = door->step_offset; + door->part_2.step_xoffset = 0; + door->part_2.step_yoffset = door->step_offset * -1; + + num_door_steps = g_part_1->height / door->step_offset; + } + + /* set animation draw offset for the default panels */ + + if (door->step_offset > 1) + { + num_panel_steps = 2 * door_rect->height / door->step_offset; + door->panel.start_step = num_panel_steps - num_door_steps; + } + else + { + num_panel_steps = door_rect->height / door->step_offset; + door->panel.start_step = num_panel_steps - num_door_steps / 2; + door->panel.step_delay *= 2; + } + } + } + } +} + void InitDoors() { int i; - for (i = 0; door_part_controls[i].door_nr != -1; i++) + for (i = 0; door_part_controls[i].door_token != -1; i++) { struct DoorPartControlInfo *dpc = &door_part_controls[i]; struct DoorPartOrderInfo *dpo = &door_part_order[i]; - /* fill structure for door part draw order */ + /* initialize "start_step_opening" and "start_step_closing", if needed */ + if (dpc->pos->start_step_opening == 0 && + dpc->pos->start_step_closing == 0) + { + // dpc->pos->start_step_opening = dpc->pos->start_step; + dpc->pos->start_step_closing = dpc->pos->start_step; + } + + /* fill structure for door part draw order (sorted below) */ dpo->nr = i; dpo->sort_priority = dpc->pos->sort_priority; @@ -5341,6 +5563,15 @@ unsigned int OpenDoor(unsigned int door_state) { if (door_state & DOOR_COPY_BACK) { +#if 1 + if (door_state & DOOR_OPEN_1) + BlitBitmap(bitmap_db_door_1, bitmap_db_door_1, + 1 * DXSIZE, 0, DXSIZE, DYSIZE, 0 * DXSIZE, 0); + + if (door_state & DOOR_OPEN_2) + BlitBitmap(bitmap_db_door_2, bitmap_db_door_2, + 1 * VXSIZE, 0, VXSIZE, VYSIZE, 0 * VXSIZE, 0); +#else if (door_state & DOOR_OPEN_1) BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, @@ -5350,6 +5581,7 @@ unsigned int OpenDoor(unsigned int door_state) BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY2, VXSIZE, VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2); +#endif door_state &= ~DOOR_COPY_BACK; } @@ -5363,6 +5595,15 @@ unsigned int CloseDoor(unsigned int door_state) if (!(door_state & DOOR_NO_COPY_BACK)) { +#if 1 + if (old_door_state & DOOR_OPEN_1) + BlitBitmap(backbuffer, bitmap_db_door_1, + DX, DY, DXSIZE, DYSIZE, 0, 0); + + if (old_door_state & DOOR_OPEN_2) + BlitBitmap(backbuffer, bitmap_db_door_2, + VX, VY, VXSIZE, VYSIZE, 0, 0); +#else if (old_door_state & DOOR_OPEN_1) BlitBitmap(backbuffer, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); @@ -5370,6 +5611,7 @@ unsigned int CloseDoor(unsigned int door_state) if (old_door_state & DOOR_OPEN_2) BlitBitmap(backbuffer, bitmap_db_door, VX, VY, VXSIZE, VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2); +#endif door_state &= ~DOOR_NO_COPY_BACK; } @@ -5398,11 +5640,13 @@ int euclid(int a, int b) unsigned int MoveDoor(unsigned int door_state) { +#if 0 struct XY panel_pos_list[] = { { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 }, { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 }, }; +#endif struct Rect door_rect_list[] = { { DX, DY, DXSIZE, DYSIZE }, @@ -5410,13 +5654,8 @@ unsigned int MoveDoor(unsigned int door_state) }; static int door1 = DOOR_OPEN_1; static int door2 = DOOR_CLOSE_2; -#if 1 unsigned int door_delay = 0; unsigned int door_delay_value; -#endif -#if 0 - int stepsize = 1; -#endif int i; #if 1 @@ -5480,63 +5719,91 @@ unsigned int MoveDoor(unsigned int door_state) if (door_state & DOOR_ACTION) { boolean door_panel_drawn[NUM_DOORS]; + boolean panel_has_doors[NUM_DOORS]; + boolean door_part_skip[MAX_DOOR_PARTS]; boolean door_part_done[MAX_DOOR_PARTS]; boolean door_part_done_all; - int num_xsteps[MAX_DOOR_PARTS]; - int num_ysteps[MAX_DOOR_PARTS]; + int num_steps[MAX_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 current_move_delay = 0; int k; + for (i = 0; i < NUM_DOORS; i++) + panel_has_doors[i] = FALSE; + 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; + int door_token = dpc->door_token; - door_part_done[nr] = (!(door_state & door_token) || - !g->bitmap); + door_part_done[i] = FALSE; + door_part_skip[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 GraphicInfo *g = &graphic_info[dpc->graphic]; 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++) + { + int nr = door_part_order[i].nr; + struct DoorPartControlInfo *dpc = &door_part_controls[nr]; + struct DoorPartPosInfo *pos = dpc->pos; + struct GraphicInfo *g = &graphic_info[dpc->graphic]; + int door_token = dpc->door_token; + int door_index = DOOR_INDEX_FROM_TOKEN(door_token); + boolean is_panel = DOOR_PART_IS_PANEL(nr); int step_xoffset = ABS(pos->step_xoffset); int step_yoffset = ABS(pos->step_yoffset); int step_delay = pos->step_delay; + 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 part_opening = (is_panel ? door_closing : door_opening); + int start_step = (part_opening ? pos->start_step_opening : + pos->start_step_closing); float move_xsize = (step_xoffset ? g->width : 0); float 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); + move_xsteps ? move_xsteps : move_ysteps) - start_step; int move_delay = move_steps * step_delay; - // int move_delay = MAX(move_xsize, move_ysize) * step_delay; + + if (door_part_skip[nr]) + continue; + + if (!is_panel) + panel_has_doors[door_index] = TRUE; 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[nr] = move_steps; - num_xsteps[i] = move_xsteps; - num_ysteps[i] = move_ysteps; +#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; @@ -5548,18 +5815,13 @@ unsigned int MoveDoor(unsigned int door_state) #endif #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 0 - for (i = 0; i < MAX_DOOR_PARTS; i++) - printf("::: door_part_done[%d] == %d\n", i, door_part_done[i]); - printf("\n"); + 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++) { + door_part_done_all = TRUE; + for (i = 0; i < NUM_DOORS; i++) door_panel_drawn[i] = FALSE; @@ -5567,25 +5829,65 @@ unsigned int MoveDoor(unsigned int door_state) { 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 GraphicInfo *g = &graphic_info[dpc->graphic]; + int door_token = dpc->door_token; + int door_index = DOOR_INDEX_FROM_TOKEN(door_token); + boolean is_panel = DOOR_PART_IS_PANEL(nr); +#if 0 struct XY *panel_pos = &panel_pos_list[door_index]; +#endif struct Rect *door_rect = &door_rect_list[door_index]; + Bitmap *bitmap_db_door = (door_token == DOOR_1 ? bitmap_db_door_1 : + bitmap_db_door_2); + 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 = !door_opening; + boolean part_opening = (is_panel ? door_closing : door_opening); + boolean part_closing = !part_opening; + int start_step = (part_opening ? pos->start_step_opening : + pos->start_step_closing); int step_delay = pos->step_delay; - int src_xx, src_yy; - int dst_xx, dst_yy; + int step_factor = step_delay / max_step_delay; + int k1 = (step_factor ? k / step_factor + 1 : k); + int k2 = (part_opening ? k1 + start_step : 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 (k == 0 && is_panel && door_token == DOOR_2) + printf("::: %d, %d\n", g->width, g->height); +#endif + +#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 != 16 && nr != 0) + continue; +#endif + #if 0 // !!! TEST !!! - if (nr != 0 && nr != 8) + if (!is_panel) continue; #endif - if (door_part_done[nr]) +#if 1 + if (door_part_skip[nr]) continue; +#endif if (!(door_state & door_token)) continue; @@ -5593,235 +5895,159 @@ 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; } - if ((door_state & door_token) & DOOR_OPEN) + // draw opening or closing door parts + + if (pos->step_xoffset < 0) // door part on right side { - int step_factor = step_delay / max_step_delay; - int kx = k / step_factor + 1; - int ky = k / step_factor + 1; + src_xx = 0; + dst_xx = pos->x + ABS(kk * pos->step_xoffset); + width = g->width; -#if 0 - // if (k == 0) - printf("::: kx == %d, ky == %d\n", kx, ky); -#endif + if (dst_xx + width > door_rect->width) + width = door_rect->width - dst_xx; + } + else // door part on left side + { + src_xx = 0; + dst_xx = pos->x - kk * pos->step_xoffset; - if (pos->step_xoffset < 0) + if (dst_xx < 0) { - src_xx = 0; - dst_xx = pos->x + ABS(kx * pos->step_xoffset); - width = g->width; - - if (dst_xx + width > door_rect->width) - width = door_rect->width - dst_xx; + src_xx = ABS(dst_xx); + dst_xx = 0; } - else - { - src_xx = 0; - dst_xx = pos->x - kx * pos->step_xoffset; - if (dst_xx < 0) - { - src_xx = ABS(dst_xx); - dst_xx = 0; - } + width = g->width - src_xx; - width = g->width - src_xx; - } - - if (pos->step_yoffset < 0) - { - src_yy = 0; - dst_yy = pos->y + ABS(ky * pos->step_yoffset); - height = g->height; + // printf("::: k == %d [%d] \n", k, start_step); + } - if (dst_yy + height > door_rect->height) - height = door_rect->height - dst_yy; - } - else - { - src_yy = 0; - dst_yy = pos->y - ky * pos->step_yoffset; + if (pos->step_yoffset < 0) // door part on bottom side + { + src_yy = 0; + dst_yy = pos->y + ABS(kk * pos->step_yoffset); + height = g->height; - if (dst_yy < 0) - { - src_yy = ABS(dst_yy); - dst_yy = 0; - } + if (dst_yy + height > door_rect->height) + height = door_rect->height - dst_yy; + } + else // door part on top side + { + src_yy = 0; + dst_yy = pos->y - kk * pos->step_yoffset; - height = g->height - src_yy; + if (dst_yy < 0) + { + src_yy = ABS(dst_yy); + dst_yy = 0; } -#if 0 - if (width < 0 || height < 0) - door_part_done[nr] = TRUE; -#endif + height = g->height - src_yy; } - else // DOOR_CLOSE + + if (is_panel) { - int step_factor = step_delay / max_step_delay; - int num_steps = (num_xsteps[nr] && num_ysteps[nr] ? - MIN(num_xsteps[nr], num_ysteps[nr]) : - num_xsteps[nr] ? num_xsteps[nr] : - num_ysteps[nr]); #if 1 - int kx = num_steps - k / step_factor - 1; - int ky = num_steps - k / step_factor - 1; + src_x = src_xx; + src_y = src_yy; #else - int kx = num_xsteps[nr] - k; - int ky = num_ysteps[nr] - k; -#endif - -#if 0 - // !!! TEST !!! - if (nr != 0) - continue; + src_x = panel_pos->x + src_xx; + src_y = panel_pos->y + src_yy; #endif + } + else + { + src_x = g->src_x + src_xx; + src_y = g->src_y + src_yy; + } -#if 0 - // if (k == 0) - printf("::: kx == %d, ky == %d\n", kx, ky); -#endif + dst_x = door_rect->x + dst_xx; + dst_y = door_rect->y + dst_yy; #if 0 - if (k == 0) - printf("::: step_xoffset == %d, step_yoffset == %d\n", - pos->step_xoffset, pos->step_yoffset); + if (DOOR_PART_IS_PANEL(nr)) + { + printf("::: width == %d, height == %d [%d, %d] [%d, %d]\n", + width, height, g->width, g->height, src_x, src_y); + } #endif - if (pos->step_xoffset < 0) - { - src_xx = 0; - dst_xx = pos->x + ABS(kx * pos->step_xoffset); - width = g->width; - - if (dst_xx + width > door_rect->width) - width = door_rect->width - dst_xx; - } - else - { - src_xx = 0; - dst_xx = pos->x - kx * 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) - { - src_yy = 0; - dst_yy = pos->y + ABS(ky * pos->step_yoffset); - height = g->height; - - if (dst_yy + height > door_rect->height) - height = door_rect->height - dst_yy; - } + if (width >= 0 && width <= g->width && + height >= 0 && height <= g->height) + { + if (is_panel || !pos->draw_masked) + BlitBitmap(bitmap, drawto, src_x, src_y, width, height, + dst_x, dst_y); else - { - src_yy = 0; - dst_yy = pos->y - ky * pos->step_yoffset; - - if (dst_yy < 0) - { - src_yy = ABS(dst_yy); - dst_yy = 0; - } - - height = g->height - src_yy; - } + BlitBitmapMasked(bitmap, drawto, src_x, src_y, width, height, + dst_x, dst_y); + } #if 0 - printf("::: src_xx, src_yy ; dst_xx, dst_yy ; width, height == %d, %d ; %d, %d ; %d, %d\n", src_xx, src_yy, dst_xx, dst_yy, width, height); + 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 -#if 0 - if ((pos->step_xoffset != 0 && width >= g->width) || - (pos->step_yoffset != 0 && height >= g->height)) - door_part_done[nr] = TRUE; -#endif + redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token); -#if 0 #if 1 - // !!! TEST !!! - + if ((part_opening && (width < 0 || height < 0)) || + (part_closing && (width >= g->width && height >= g->height))) 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 -#endif - } - - if (door_part_done[nr]) - continue; - -#if 0 - // !!! TEST !!! - if (nr != 7) - continue; + if ((door_opening && (width < 0 || height < 0)) || + (door_closing && (width >= g->width && height >= g->height))) + door_part_done[nr] = TRUE; #endif - 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); - // else - // printf("::: %d: width == %d, height == %d\n", nr, width, height); - - redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token); - #if 1 - if ((((door_state & door_token) & DOOR_OPEN) && - (width < 0 || height < 0)) || - (((door_state & door_token) & DOOR_CLOSE) && - (width >= g->width && height >= g->height))) - door_part_done[nr] = TRUE; + // continue door part animations, but not panel after door has closed + if (!door_part_done[nr] && + !(is_panel && door_closing && panel_has_doors[door_index])) + door_part_done_all = FALSE; #else - if ((((door_state & door_token) & DOOR_OPEN) && - (width < 0 || height < 0)) || - (((door_state & door_token) & DOOR_CLOSE) && - ((pos->step_xoffset != 0 && width >= g->width) || - (pos->step_yoffset != 0 && height >= g->height)))) - door_part_done[nr] = TRUE; + // continue door part animations, but not panel after door has closed + if (!door_part_done[nr] && !(is_panel && door_closing)) + door_part_done_all = FALSE; +#endif + +#if 0 + if (!door_part_done[nr]) + printf("::: k == %d, nr == %d\n", k, nr); #endif } @@ -5837,24 +6063,32 @@ unsigned int MoveDoor(unsigned int door_state) current_move_delay += max_step_delay; } +#if 0 door_part_done_all = TRUE; for (i = 0; i < MAX_DOOR_PARTS; i++) - if (!door_part_done[i]) + if (!door_part_done[i] && + !(DOOR_PART_IS_PANEL(i) && door_closing)) door_part_done_all = FALSE; - +#endif +#if 1 if (door_part_done_all) break; +#endif } } - // redraw_mask |= REDRAW_ALL; - if (door_state & DOOR_ACTION_1) door1 = door_state & DOOR_ACTION_1; if (door_state & DOOR_ACTION_2) door2 = door_state & DOOR_ACTION_2; +#if 0 + printf("::: DOORS DONE %08x\n", door_state); + Delay(3000); + printf("::: GO!\n"); +#endif + return (door1 | door2); } @@ -6609,8 +6843,8 @@ void CreateToolButtons() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_INFO_TEXT, toolbutton_info[i].infotext, - GDI_X, dx + pos->x, - GDI_Y, dy + pos->y, + GDI_X, dx + GDI_ACTIVE_POS(pos->x), + GDI_Y, dy + GDI_ACTIVE_POS(pos->y), GDI_WIDTH, gfx->width, GDI_HEIGHT, gfx->height, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, @@ -6769,8 +7003,8 @@ void CreateToolButtons() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_INFO_TEXT, toolbutton_info[i].infotext, - GDI_X, DX + toolbutton_info[i].x, - GDI_Y, DY + toolbutton_info[i].y, + GDI_X, DX + GDI_ACTIVE_POS(toolbutton_info[i].x), + GDI_Y, DY + GDI_ACTIVE_POS(toolbutton_info[i].y), GDI_WIDTH, toolbutton_info[i].width, GDI_HEIGHT, toolbutton_info[i].height, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, @@ -11069,9 +11303,13 @@ void ChangeViewportPropertiesIfNeeded() int *door_2_x = (game_status == GAME_MODE_EDITOR ? &EX : &VX); int *door_2_y = (game_status == GAME_MODE_EDITOR ? &EY : &VY); #endif +#if 1 + int gfx_game_mode = game_status; +#else int gfx_game_mode = (game_status == GAME_MODE_PLAYING || game_status == GAME_MODE_EDITOR ? game_status : GAME_MODE_MAIN); +#endif int gfx_game_mode2 = (game_status == GAME_MODE_EDITOR ? GAME_MODE_DEFAULT : game_status); struct RectWithBorder *vp_playfield = &viewport.playfield[gfx_game_mode]; @@ -11243,7 +11481,9 @@ void ChangeViewportPropertiesIfNeeded() InitGfxBuffers(); #endif +#if 0 if (gfx_game_mode == GAME_MODE_MAIN) +#endif { #if 1 init_gadgets_and_toons = TRUE;