X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=ac194d56a5b97d3d5435e8dbdc68ab5c5b400c36;hb=19d38b8a650bd10ffbbaed031f5b3819dbcd32ce;hp=49d429605d35c7ceba89f06d84aecbf637fd1c95;hpb=04822a800bb5479087613b0730fdf7e765ba012c;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 49d42960..ac194d56 100644 --- a/src/tools.c +++ b/src/tools.c @@ -5228,7 +5228,7 @@ unsigned int MoveDoor(unsigned int door_state) unsigned int door_delay_value; int stepsize = 1; -#if 0 +#if 1 if (door_1.width < 0 || door_1.width > DXSIZE) door_1.width = DXSIZE; if (door_1.height < 0 || door_1.height > DYSIZE) @@ -5267,6 +5267,8 @@ unsigned int MoveDoor(unsigned int door_state) door_delay_value = (door_state & DOOR_ACTION_1 ? door_1.step_delay : door_2.step_delay); + // door_delay_value *= 4; // !!! TEST ONLY !!! + if (setup.quick_doors) { stepsize = 20; /* must be chosen to always draw last frame */ @@ -5286,6 +5288,24 @@ unsigned int MoveDoor(unsigned int door_state) if (door_state & DOOR_ACTION) { +#if 1 + struct GraphicInfo *g1_left = &graphic_info[IMG_DOOR_1_WING_LEFT]; + struct GraphicInfo *g1_right = &graphic_info[IMG_DOOR_1_WING_RIGHT]; + struct GraphicInfo *g2_left = &graphic_info[IMG_DOOR_2_WING_LEFT]; + struct GraphicInfo *g2_right = &graphic_info[IMG_DOOR_2_WING_RIGHT]; + int door_1_left_width = g1_left->width; + int door_1_left_height = g1_left->height; + int door_1_right_width = g1_right->width; + int door_1_right_height = g1_right->height; + int door_2_left_width = g2_left->width; + int door_2_left_height = g2_left->height; + int door_2_right_width = g2_right->width; + int door_2_right_height = g2_right->height; + int door_1_width = MAX(door_1_left_width, door_1_right_width); + int door_1_height = MAX(door_1_left_height, door_1_right_height); + int door_2_width = MAX(door_2_left_width, door_2_right_width); + int door_2_height = MAX(door_2_left_height, door_2_right_height); +#endif boolean handle_door_1 = (door_state & DOOR_ACTION_1); boolean handle_door_2 = (door_state & DOOR_ACTION_2); boolean door_1_done = (!handle_door_1); @@ -5293,15 +5313,21 @@ unsigned int MoveDoor(unsigned int door_state) boolean door_1_vertical = (door_1.anim_mode & ANIM_VERTICAL); boolean door_2_vertical = (door_2.anim_mode & ANIM_VERTICAL); #if 1 +#if 1 + int door_size_1 = (door_1_vertical ? door_1_height : door_1_width); + int door_size_2 = (door_2_vertical ? door_2_height : door_2_width); +#else int door_size_1 = (door_1_vertical ? DYSIZE : DXSIZE); int door_size_2 = (door_2_vertical ? VYSIZE : VXSIZE); +#endif #else int door_size_1 = (door_1_vertical ? door_1.height : door_1.width); int door_size_2 = (door_2_vertical ? door_2.height : door_2.width); #endif int max_door_size_1 = (door_1_vertical ? DYSIZE : DXSIZE); int max_door_size_2 = (door_2_vertical ? VYSIZE : VXSIZE); - int door_size = (handle_door_1 ? door_size_1 : door_size_2); + // int door_size = (handle_door_1 ? door_size_1 : door_size_2); + int door_size = (handle_door_2 ? door_size_2 : door_size_1); int max_door_size = (handle_door_1 ? max_door_size_1 : max_door_size_2); int door_skip = max_door_size - door_size; int end = door_size; @@ -5320,14 +5346,30 @@ unsigned int MoveDoor(unsigned int door_state) for (k = start; k <= end && !(door_1_done && door_2_done); k += stepsize) { int x = k; +#if 0 Bitmap *bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; GC gc = bitmap->stored_clip_gc; +#endif - if (door_state & DOOR_ACTION_1) + if (door_state & DOOR_ACTION_1 && + x * door_1.step_offset <= door_size_1) { int a = MIN(x * door_1.step_offset, end); int p = (door_state & DOOR_OPEN_1 ? end - a : a); +#if 1 + int i = p; +#else int i = p + door_skip; +#endif + +#if 1 + struct GraphicInfo *g_left = &graphic_info[IMG_DOOR_1_WING_LEFT]; + struct GraphicInfo *g_right = &graphic_info[IMG_DOOR_1_WING_RIGHT]; + Bitmap *bm_left = g_left->bitmap; + Bitmap *bm_right = g_right->bitmap; + GC gc_left = bm_left->stored_clip_gc; + GC gc_right = bm_right->stored_clip_gc; +#endif if (door_1.anim_mode & ANIM_STATIC_PANEL) { @@ -5346,9 +5388,29 @@ unsigned int MoveDoor(unsigned int door_state) if (door_1.anim_mode & ANIM_HORIZONTAL && x <= DXSIZE) { +#if 1 + int src1_x = g_right->src_x; + int src1_y = g_right->src_y; + int src2_x = g_left->src_x + g_left->width - i; + int src2_y = g_left->src_y; + int dst1_x = DX + DXSIZE - i; + int dst1_y = DY; + int dst2_x = DX; + int dst2_y = DY; + int width = i; + int height = DYSIZE; + + SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y); + BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height, + dst1_x, dst1_y); + + SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y); + BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height, + dst2_x, dst2_y); +#else int src1_x = DXSIZE, src1_y = DOOR_GFX_PAGEY1; - int dst1_x = DX + DXSIZE - i, dst1_y = DY; int src2_x = DXSIZE - i, src2_y = DOOR_GFX_PAGEY1; + int dst1_x = DX + DXSIZE - i, dst1_y = DY; int dst2_x = DX, dst2_y = DY; int width = i, height = DYSIZE; @@ -5359,12 +5421,33 @@ unsigned int MoveDoor(unsigned int door_state) SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y); BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height, dst2_x, dst2_y); +#endif } else if (door_1.anim_mode & ANIM_VERTICAL && x <= DYSIZE) { +#if 1 + int src1_x = g_right->src_x; + int src1_y = g_right->src_y; + int src2_x = g_left->src_x; + int src2_y = g_left->src_y + g_left->height - i; + int dst1_x = DX; + int dst1_y = DY + DYSIZE - i; + int dst2_x = DX; + int dst2_y = DY; + int width = DXSIZE; + int height = i; + + SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y); + BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height, + dst1_x, dst1_y); + + SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y); + BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height, + dst2_x, dst2_y); +#else int src1_x = DXSIZE, src1_y = DOOR_GFX_PAGEY1; - int dst1_x = DX, dst1_y = DY + DYSIZE - i; int src2_x = 0, src2_y = DOOR_GFX_PAGEY1 + DYSIZE - i; + int dst1_x = DX, dst1_y = DY + DYSIZE - i; int dst2_x = DX, dst2_y = DY; int width = DXSIZE, height = i; @@ -5375,11 +5458,98 @@ unsigned int MoveDoor(unsigned int door_state) SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y); BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height, dst2_x, dst2_y); +#endif } else if (x <= DXSIZE) /* ANIM_DEFAULT */ { int j = (door_1.anim_mode == ANIM_DEFAULT ? (DXSIZE - i) / 3 : 0); +#if 1 + int src1_x = g_right->src_x; + int src1_y = g_right->src_y; + int src2_x = g_left->src_x + g_left->width - i; + int src2_y = g_left->src_y; + int dst1_x = DX + DXSIZE - i; + int dst1_y = DY; + int dst2_x = DX; + int dst2_y = DY; + int width = i; + int height1 = 63, height2 = DYSIZE / 2 - height1; + int ypos1 = 0, ypos2 = height2; + int ypos3 = DYSIZE / 2, ypos4 = DYSIZE - height2; + + SetClipOrigin(bm_right, gc_right, + dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bm_right, drawto, + src1_x, src1_y + ypos1, width, height2, + dst1_x, dst1_y + ypos1 + j); + BlitBitmapMasked(bm_right, drawto, + src1_x, src1_y + ypos3, width, height1, + dst1_x, dst1_y + ypos3 + j); + SetClipOrigin(bm_left, gc_left, + dst2_x - src2_x, dst2_y - src2_y - j); + BlitBitmapMasked(bm_left, drawto, + src2_x, src2_y + ypos1 + j, width, height2 - j, + dst2_x, dst2_y + ypos1); + BlitBitmapMasked(bm_left, drawto, + src2_x, src2_y + ypos3, width, height1, + dst2_x, dst2_y + ypos3 - j); + + SetClipOrigin(bm_left, gc_left, + dst2_x - src2_x, dst2_y - src2_y - j); + BlitBitmapMasked(bm_left, drawto, + src2_x, src2_y + ypos2, width, height1, + dst2_x, dst2_y + ypos2 - j); + BlitBitmapMasked(bm_left, drawto, + src2_x, src2_y + ypos4, width, height2, + dst2_x, dst2_y + ypos4 - j); + SetClipOrigin(bm_right, gc_right, + dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bm_right, drawto, + src1_x, src1_y + ypos2, width, height1, + dst1_x, dst1_y + ypos2 + j); + BlitBitmapMasked(bm_right, drawto, + src1_x, src1_y + ypos4, width, height2 - j, + dst1_x, dst1_y + ypos4 + j); +#else + int src1_x = DXSIZE, src1_y = DOOR_GFX_PAGEY1; + int src2_x = DXSIZE - i, src2_y = DOOR_GFX_PAGEY1; + int dst1_x = DX + DXSIZE - i, dst1_y = DY; + int dst2_x = DX, dst2_y = DY; + int width = i, height = DYSIZE; + int ypos1 = 63, ypos2 = 77, ypos3 = 140, ypos4 = 203; + + SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bitmap, drawto, + src1_x, src1_y, width, ypos2, + dst1_x, dst1_y + j); + BlitBitmapMasked(bitmap, drawto, + src1_x, src1_y + ypos3, width, ypos1, + dst1_x, dst1_y + ypos3 + j); + SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j); + BlitBitmapMasked(bitmap, drawto, + src2_x, src2_y + j, width, ypos2 - j, + dst2_x, dst2_y); + BlitBitmapMasked(bitmap, drawto, + src2_x, src2_y + ypos3, width, ypos1, + dst2_x, dst2_y + ypos3 - j); + + SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j); + BlitBitmapMasked(bitmap, drawto, + src2_x, src2_y + ypos2, width, ypos1, + dst2_x, dst2_y + ypos2 - j); + BlitBitmapMasked(bitmap, drawto, + src2_x, src2_y + ypos4, width, ypos2, + dst2_x, dst2_y + ypos4 - j); + SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bitmap, drawto, + src1_x, src1_y + ypos2, width, ypos1, + dst1_x, dst1_y + ypos2 + j); + BlitBitmapMasked(bitmap, drawto, + src1_x, src1_y + ypos4, width, ypos2 - j, + dst1_x, dst1_y + ypos4 + j); + + /* SetClipOrigin(bitmap, gc, DX - i, (DY + j) - DOOR_GFX_PAGEY1); BlitBitmapMasked(bitmap, drawto, DXSIZE, DOOR_GFX_PAGEY1, i, 77, @@ -5409,18 +5579,30 @@ unsigned int MoveDoor(unsigned int door_state) BlitBitmapMasked(bitmap, drawto, DXSIZE, DOOR_GFX_PAGEY1 + 203, i, 77 - j, DX + DXSIZE - i, DY + 203 + j); + */ +#endif } redraw_mask |= REDRAW_DOOR_1; door_1_done = (a == end); } - if (door_state & DOOR_ACTION_2) + if (door_state & DOOR_ACTION_2 && + x * door_2.step_offset <= door_size_2) { int a = MIN(x * door_2.step_offset, door_size); int p = (door_state & DOOR_OPEN_2 ? door_size - a : a); int i = p + door_skip; +#if 1 + struct GraphicInfo *g_left = &graphic_info[IMG_DOOR_2_WING_LEFT]; + struct GraphicInfo *g_right = &graphic_info[IMG_DOOR_2_WING_RIGHT]; + Bitmap *bm_left = g_left->bitmap; + Bitmap *bm_right = g_right->bitmap; + GC gc_left = bm_left->stored_clip_gc; + GC gc_right = bm_right->stored_clip_gc; +#endif + if (door_2.anim_mode & ANIM_STATIC_PANEL) { BlitBitmap(bitmap_db_door, drawto, @@ -5438,9 +5620,29 @@ unsigned int MoveDoor(unsigned int door_state) if (door_2.anim_mode & ANIM_HORIZONTAL && x <= VXSIZE) { +#if 1 + int src1_x = g_right->src_x; + int src1_y = g_right->src_y; + int src2_x = g_left->src_x + g_left->width - i; + int src2_y = g_left->src_y; + int dst1_x = VX + VXSIZE - i; + int dst1_y = VY; + int dst2_x = VX; + int dst2_y = VY; + int width = i; + int height = VYSIZE; + + SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y); + BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height, + dst1_x, dst1_y); + + SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y); + BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height, + dst2_x, dst2_y); +#else int src1_x = VXSIZE, src1_y = DOOR_GFX_PAGEY2; - int dst1_x = VX + VXSIZE - i, dst1_y = VY; int src2_x = VXSIZE - i, src2_y = DOOR_GFX_PAGEY2; + int dst1_x = VX + VXSIZE - i, dst1_y = VY; int dst2_x = VX, dst2_y = VY; int width = i, height = VYSIZE; @@ -5451,12 +5653,33 @@ unsigned int MoveDoor(unsigned int door_state) SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y); BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height, dst2_x, dst2_y); +#endif } else if (door_2.anim_mode & ANIM_VERTICAL && x <= VYSIZE) { +#if 1 + int src1_x = g_right->src_x; + int src1_y = g_right->src_y; + int src2_x = g_left->src_x; + int src2_y = g_left->src_y + g_left->height - i; + int dst1_x = VX; + int dst1_y = VY + VYSIZE - i; + int dst2_x = VX; + int dst2_y = VY; + int width = VXSIZE; + int height = i; + + SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y); + BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height, + dst1_x, dst1_y); + + SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y); + BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height, + dst2_x, dst2_y); +#else int src1_x = VXSIZE, src1_y = DOOR_GFX_PAGEY2; - int dst1_x = VX, dst1_y = VY + VYSIZE - i; int src2_x = 0, src2_y = DOOR_GFX_PAGEY2 + VYSIZE - i; + int dst1_x = VX, dst1_y = VY + VYSIZE - i; int dst2_x = VX, dst2_y = VY; int width = VXSIZE, height = i; @@ -5467,11 +5690,73 @@ unsigned int MoveDoor(unsigned int door_state) SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y); BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height, dst2_x, dst2_y); +#endif } else if (x <= VXSIZE) /* ANIM_DEFAULT */ { int j = (door_2.anim_mode == ANIM_DEFAULT ? (VXSIZE - i) / 3 : 0); +#if 1 + int src1_x = g_right->src_x; + int src1_y = g_right->src_y; + int src2_x = g_left->src_x + g_left->width - i; + int src2_y = g_left->src_y; + int dst1_x = VX + VXSIZE - i; + int dst1_y = VY; + int dst2_x = VX; + int dst2_y = VY; + int width = i; + int height = VYSIZE / 2; + int ypos1 = 0, ypos2 = VYSIZE / 2; + + SetClipOrigin(bm_right, gc_right, + dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bm_right, drawto, + src1_x, src1_y + ypos1, width, height, + dst1_x, dst1_y + ypos1 + j); + SetClipOrigin(bm_left, gc_left, + dst2_x - src2_x, dst2_y - src2_y - j); + BlitBitmapMasked(bm_left, drawto, + src2_x, src2_y + ypos1 + j, width, height - j, + dst2_x, dst2_y + ypos1); + + SetClipOrigin(bm_left, gc_left, + dst2_x - src2_x, dst2_y - src2_y - j); + BlitBitmapMasked(bm_left, drawto, + src2_x, src2_y + ypos2, width, height, + dst2_x, dst2_y + ypos2 - j); + SetClipOrigin(bm_right, gc_right, + dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bm_right, drawto, + src1_x, src1_y + ypos2, width, height - j, + dst1_x, dst1_y + ypos2 + j); +#else + int src1_x = VXSIZE, src1_y = DOOR_GFX_PAGEY2; + int src2_x = VXSIZE - i, src2_y = DOOR_GFX_PAGEY2; + int dst1_x = VX + VXSIZE - i, dst1_y = VY; + int dst2_x = VX, dst2_y = VY; + int width = i, height = VYSIZE; + int ypos = VYSIZE / 2; + + SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bitmap, drawto, + src1_x, src1_y, width, ypos, + dst1_x, dst1_y + j); + SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src1_y - j); + BlitBitmapMasked(bitmap, drawto, + src2_x, src2_y + j, width, ypos - j, + dst2_x, dst2_y); + + SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src1_y - j); + BlitBitmapMasked(bitmap, drawto, + src2_x, src2_y + ypos, width, ypos, + dst2_x, dst2_y + ypos - j); + SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j); + BlitBitmapMasked(bitmap, drawto, + src1_x, src1_y + ypos, width, ypos - j, + dst1_x, dst1_y + ypos + j); + + /* SetClipOrigin(bitmap, gc, VX - i, (VY + j) - DOOR_GFX_PAGEY2); BlitBitmapMasked(bitmap, drawto, VXSIZE, DOOR_GFX_PAGEY2, i, VYSIZE / 2, @@ -5490,6 +5775,8 @@ unsigned int MoveDoor(unsigned int door_state) VXSIZE, DOOR_GFX_PAGEY2 + VYSIZE / 2, i, VYSIZE / 2 - j, VX + VXSIZE - i, VY + VYSIZE / 2 + j); + */ +#endif } redraw_mask |= REDRAW_DOOR_2; @@ -8254,11 +8541,33 @@ int getBeltSwitchElementFromBeltNrAndBeltDir(int belt_nr, int belt_dir) return getBeltSwitchElementFromBeltNrAndBeltDirNr(belt_nr, belt_dir_nr); } +#if 1 +boolean getTeamMode_EM() +{ + return game.team_mode; +} +#else int getNumActivePlayers_EM() { +#if 1 + int num_players = 0; + int i; + + if (!tape.playing) + return (setup.team_mode ? MAX_PLAYERS : 1); + + for (i = 0; i < MAX_PLAYERS; i++) + if (tape.player_participates[i]) + num_players++; + + return (num_players > 1 ? MAX_PLAYERS : 1); + +#else + int num_players = 0; int i; + /* when recording game, activate all connected players */ if (!tape.playing) return -1; @@ -8267,7 +8576,9 @@ int getNumActivePlayers_EM() num_players++; return num_players; +#endif } +#endif int getGameFrameDelay_EM(int native_em_game_frame_delay) {