X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=d467fcdab02194e28c0b98fe18be6567f47da3ba;hb=bcb174b5375ad10e279b20204c913c873fc2c65d;hp=13512839ad64c9c39d409be12909e73923e635e8;hpb=94b124e87edbd2e12d7b83f45254fcbfff8554cd;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 13512839..d467fcda 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1,14 +1,14 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-98 Artsoft Entertainment * -* Holger Schemel * -* Oststrasse 11a * -* 33604 Bielefeld * -* phone: ++49 +521 290471 * -* email: aeglos@valinor.owl.de * +* (c) 1995-2001 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* tools.c * +* tools.c * ***********************************************************/ #include @@ -85,7 +85,7 @@ void SetDrawtoField(int mode) void BackToFront() { int x,y; - DrawBuffer buffer = (drawto_field == window ? backbuffer : drawto_field); + DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field); if (setup.direct_draw && game_status == PLAYING) redraw_mask &= ~REDRAW_MAIN; @@ -352,148 +352,6 @@ void ClearWindow() redraw_mask |= REDRAW_FIELD; } - -#if 0 -int getFontWidth(int font_size, int font_type) -{ - return (font_size == FS_BIG ? FONT1_XSIZE : - font_size == FS_MEDIUM ? FONT6_XSIZE : - font_type == FC_SPECIAL1 ? FONT3_XSIZE : - font_type == FC_SPECIAL2 ? FONT4_XSIZE : - font_type == FC_SPECIAL3 ? FONT5_XSIZE : - FONT2_XSIZE); -} - -int getFontHeight(int font_size, int font_type) -{ - return (font_size == FS_BIG ? FONT1_YSIZE : - font_size == FS_MEDIUM ? FONT6_YSIZE : - font_type == FC_SPECIAL1 ? FONT3_YSIZE : - font_type == FC_SPECIAL2 ? FONT4_YSIZE : - font_type == FC_SPECIAL3 ? FONT5_YSIZE : - FONT2_YSIZE); -} - -void DrawInitText(char *text, int ypos, int color) -{ - if (window && pix[PIX_SMALLFONT]) - { - ClearRectangle(window, 0, ypos, WIN_XSIZE, FONT2_YSIZE); - DrawTextExt(window, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2, - ypos, text, FS_SMALL, color); - FlushDisplay(); - } -} - -void DrawTextFCentered(int y, int font_type, char *format, ...) -{ - char buffer[FULL_SXSIZE / FONT5_XSIZE + 10]; - int font_width = getFontWidth(FS_SMALL, font_type); - va_list ap; - - va_start(ap, format); - vsprintf(buffer, format, ap); - va_end(ap); - - DrawText(SX + (SXSIZE - strlen(buffer) * font_width) / 2, SY + y, - buffer, FS_SMALL, font_type); -} - -void DrawTextF(int x, int y, int font_type, char *format, ...) -{ - char buffer[FULL_SXSIZE / FONT5_XSIZE + 10]; - va_list ap; - - va_start(ap, format); - vsprintf(buffer, format, ap); - va_end(ap); - - DrawText(SX + x, SY + y, buffer, FS_SMALL, font_type); -} - -void DrawText(int x, int y, char *text, int font_size, int font_type) -{ - DrawTextExt(drawto, gc, x, y, text, font_size, font_type); - - if (x < DX) - redraw_mask |= REDRAW_FIELD; - else if (y < VY) - redraw_mask |= REDRAW_DOOR_1; -} - -void DrawTextExt(DrawBuffer d, GC gc, int x, int y, - char *text, int font_size, int font_type) -{ - int font_width, font_height, font_start; - int font_bitmap; - boolean print_inverse = FALSE; - - if (font_size != FS_SMALL && font_size != FS_BIG && font_size != FS_MEDIUM) - font_size = FS_SMALL; - if (font_type < FC_RED || font_type > FC_SPECIAL3) - font_type = FC_RED; - - font_width = getFontWidth(font_size, font_type); - font_height = getFontHeight(font_size, font_type); - - font_bitmap = (font_size == FS_BIG ? PIX_BIGFONT : - font_size == FS_MEDIUM ? PIX_MEDIUMFONT : - PIX_SMALLFONT); - font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : - font_size == FS_MEDIUM ? FONT6_YSIZE : - FONT2_YSIZE) * - FONT_LINES_PER_FONT); - - if (font_type == FC_SPECIAL3) - font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT; - - while (*text) - { - char c = *text++; - - if (c == '~' && font_size == FS_SMALL) - { - print_inverse = TRUE; - continue; - } - - if (c >= 'a' && c <= 'z') - c = 'A' + (c - 'a'); - else if (c == 'ä' || c == 'Ä') - c = 91; - else if (c == 'ö' || c == 'Ö') - c = 92; - else if (c == 'ü' || c == 'Ü') - c = 93; - - if (c >= 32 && c <= 95) - { - int src_x = ((c - 32) % FONT_CHARS_PER_LINE) * font_width; - int src_y = ((c - 32) / FONT_CHARS_PER_LINE) * font_height + font_start; - int dest_x = x, dest_y = y; - - if (print_inverse) - { - BlitBitmap(pix[font_bitmap], d, - FONT_CHARS_PER_LINE * font_width, - 3 * font_height + font_start, - font_width, font_height, x, y); - - SetClipOrigin(clip_gc[font_bitmap], dest_x - src_x, dest_y - src_y); - BlitBitmapMasked(pix_masked[font_bitmap], d, - 0, 0, font_width, font_height, dest_x, dest_y); - } - else - BlitBitmap(pix[font_bitmap], d, - src_x, src_y, font_width, font_height, dest_x, dest_y); - } - - x += font_width; - } -} -#endif - - void MarkTileDirty(int x, int y) { int xx = redraw_x1 + x; @@ -576,7 +434,10 @@ void DrawPlayer(struct PlayerInfo *player) if (Store[last_jx][last_jy] && IS_DRAWABLE(last_element)) { DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]); - DrawLevelFieldThruMask(last_jx, last_jy); + if (last_element == EL_DYNAMITE_ACTIVE) + DrawDynamite(last_jx, last_jy); + else + DrawLevelFieldThruMask(last_jx, last_jy); } else if (last_element == EL_DYNAMITE_ACTIVE) DrawDynamite(last_jx, last_jy); @@ -609,6 +470,8 @@ void DrawPlayer(struct PlayerInfo *player) DrawLevelElement(jx, jy, Store[jx][jy]); else if (!IS_ACTIVE_BOMB(element)) DrawLevelField(jx, jy); + else + DrawLevelElement(jx, jy, EL_LEERRAUM); /* draw player himself */ @@ -913,7 +776,7 @@ void DrawGraphic(int x, int y, int graphic) MarkTileDirty(x,y); } -void DrawGraphicExt(DrawBuffer bitmap, int x, int y, int graphic) +void DrawGraphicExt(DrawBuffer *bitmap, int x, int y, int graphic) { int bitmap_nr; int src_x, src_y; @@ -937,12 +800,12 @@ void DrawGraphicThruMask(int x, int y, int graphic) MarkTileDirty(x,y); } -void DrawGraphicThruMaskExt(DrawBuffer d, int dest_x, int dest_y, int graphic) +void DrawGraphicThruMaskExt(DrawBuffer *d, int dest_x, int dest_y, int graphic) { int tile = graphic; int bitmap_nr; int src_x, src_y; - Bitmap src_bitmap; + Bitmap *src_bitmap; GC drawing_gc; if (graphic == GFX_LEERRAUM) @@ -979,7 +842,7 @@ void DrawMiniGraphic(int x, int y, int graphic) MarkTileDirty(x/2, y/2); } -void getMiniGraphicSource(int graphic, Bitmap *bitmap, int *x, int *y) +void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) { if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) { @@ -1026,9 +889,9 @@ void getMiniGraphicSource(int graphic, Bitmap *bitmap, int *x, int *y) } } -void DrawMiniGraphicExt(DrawBuffer d, int x, int y, int graphic) +void DrawMiniGraphicExt(DrawBuffer *d, int x, int y, int graphic) { - Bitmap bitmap; + Bitmap *bitmap; int src_x, src_y; getMiniGraphicSource(graphic, &bitmap, &src_x, &src_y); @@ -1043,7 +906,7 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int src_x, src_y, dest_x, dest_y; int tile = graphic; int bitmap_nr; - Bitmap src_bitmap; + Bitmap *src_bitmap; GC drawing_gc; if (graphic < 0) @@ -1249,7 +1112,9 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, else if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK || element == EL_BD_ROCK || - IS_GEM(element)) && !cut_mode) + element == EL_SP_INFOTRON || + IS_GEM(element)) + && !cut_mode) { if (uy >= lev_fieldy-1 || !IS_BELT(Feld[ux][uy+1])) { @@ -1269,13 +1134,15 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, } } else if (element == EL_MAGIC_WALL_EMPTY || + element == EL_MAGIC_WALL_EMPTYING || element == EL_MAGIC_WALL_BD_EMPTY || + element == EL_MAGIC_WALL_BD_EMPTYING || element == EL_MAGIC_WALL_FULL || element == EL_MAGIC_WALL_BD_FULL) { graphic += 3 + getGraphicAnimationPhase(4, 4, ANIM_REVERSE); } - else if (IS_AMOEBOID(element)) + else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING) { graphic = (element == EL_AMOEBE_TOT ? GFX_AMOEBE_TOT : GFX_AMOEBE_LEBT); graphic += (x + 2 * y + 4) % 4; @@ -1478,7 +1345,7 @@ void DrawLevelElement(int x, int y, int element) void DrawScreenField(int x, int y) { int ux = LEVELX(x), uy = LEVELY(y); - int element; + int element, content; if (!IN_LEV_FIELD(ux, uy)) { @@ -1492,33 +1359,36 @@ void DrawScreenField(int x, int y) } element = Feld[ux][uy]; + content = Store[ux][uy]; if (IS_MOVING(ux, uy)) { int horiz_move = (MovDir[ux][uy] == MV_LEFT || MovDir[ux][uy] == MV_RIGHT); boolean cut_mode = NO_CUTTING; - if (Store[ux][uy] == EL_MORAST_LEER || - Store[ux][uy] == EL_MAGIC_WALL_EMPTY || - Store[ux][uy] == EL_MAGIC_WALL_BD_EMPTY || - Store[ux][uy] == EL_AMOEBE_NASS) + if (element == EL_QUICKSAND_EMPTYING || + element == EL_MAGIC_WALL_EMPTYING || + element == EL_MAGIC_WALL_BD_EMPTYING || + element == EL_AMOEBA_DRIPPING) cut_mode = CUT_ABOVE; - else if (Store[ux][uy] == EL_MORAST_VOLL || - Store[ux][uy] == EL_MAGIC_WALL_FULL || - Store[ux][uy] == EL_MAGIC_WALL_BD_FULL) + else if (element == EL_QUICKSAND_FILLING || + element == EL_MAGIC_WALL_FILLING || + element == EL_MAGIC_WALL_BD_FILLING) cut_mode = CUT_BELOW; if (cut_mode == CUT_ABOVE) - DrawScreenElementShifted(x, y, 0, 0, Store[ux][uy], NO_CUTTING); + DrawScreenElementShifted(x, y, 0, 0, element, NO_CUTTING); else DrawScreenElement(x, y, EL_LEERRAUM); if (horiz_move) DrawScreenElementShifted(x, y, MovPos[ux][uy], 0, element, NO_CUTTING); - else + else if (cut_mode == NO_CUTTING) DrawScreenElementShifted(x, y, 0, MovPos[ux][uy], element, cut_mode); + else + DrawScreenElementShifted(x, y, 0, MovPos[ux][uy], content, cut_mode); - if (Store[ux][uy] == EL_SALZSAEURE) + if (content == EL_SALZSAEURE) DrawLevelElementThruMask(ux, uy + 1, EL_SALZSAEURE); } else if (IS_BLOCKED(ux, uy)) @@ -1527,6 +1397,7 @@ void DrawScreenField(int x, int y) int sx, sy; int horiz_move; boolean cut_mode = NO_CUTTING; + int element_old, content_old; Blocked2Moving(ux, uy, &oldx, &oldy); sx = SCREENX(oldx); @@ -1534,19 +1405,26 @@ void DrawScreenField(int x, int y) horiz_move = (MovDir[oldx][oldy] == MV_LEFT || MovDir[oldx][oldy] == MV_RIGHT); - if (Store[oldx][oldy] == EL_MORAST_LEER || - Store[oldx][oldy] == EL_MAGIC_WALL_EMPTY || - Store[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTY || - Store[oldx][oldy] == EL_AMOEBE_NASS) + element_old = Feld[oldx][oldy]; + content_old = Store[oldx][oldy]; + + if (element_old == EL_QUICKSAND_EMPTYING || + element_old == EL_MAGIC_WALL_EMPTYING || + element_old == EL_MAGIC_WALL_BD_EMPTYING || + element_old == EL_AMOEBA_DRIPPING) cut_mode = CUT_ABOVE; DrawScreenElement(x, y, EL_LEERRAUM); - element = Feld[oldx][oldy]; if (horiz_move) - DrawScreenElementShifted(sx,sy, MovPos[oldx][oldy],0,element,NO_CUTTING); + DrawScreenElementShifted(sx, sy, MovPos[oldx][oldy], 0, element_old, + NO_CUTTING); + else if (cut_mode == NO_CUTTING) + DrawScreenElementShifted(sx, sy, 0, MovPos[oldx][oldy], element_old, + cut_mode); else - DrawScreenElementShifted(sx,sy, 0,MovPos[oldx][oldy],element,cut_mode); + DrawScreenElementShifted(sx, sy, 0, MovPos[oldx][oldy], content_old, + cut_mode); } else if (IS_DRAWABLE(element)) DrawScreenElement(x, y, element); @@ -2170,7 +2048,7 @@ unsigned int MoveDoor(unsigned int door_state) for(x=start; x<=DXSIZE; x+=stepsize) { - Bitmap bitmap = pix[PIX_DOOR]; + Bitmap *bitmap = pix[PIX_DOOR]; GC gc = bitmap->stored_clip_gc; WaitUntilDelayReached(&door_delay, door_delay_value); @@ -2288,7 +2166,7 @@ void UndrawSpecialEditorDoor() } #ifndef TARGET_SDL -int ReadPixel(DrawBuffer bitmap, int x, int y) +int ReadPixel(DrawBuffer *bitmap, int x, int y) { XImage *pixel_image; unsigned long pixel_value; @@ -2417,8 +2295,8 @@ void CreateToolButtons() for (i=0; icustom_id; } +int get_next_element(int element) +{ + switch(element) + { + case EL_QUICKSAND_FILLING: return EL_MORAST_VOLL; + case EL_QUICKSAND_EMPTYING: return EL_MORAST_LEER; + case EL_MAGIC_WALL_FILLING: return EL_MAGIC_WALL_FULL; + case EL_MAGIC_WALL_EMPTYING: return EL_MAGIC_WALL_EMPTY; + case EL_MAGIC_WALL_BD_FILLING: return EL_MAGIC_WALL_BD_FULL; + case EL_MAGIC_WALL_BD_EMPTYING: return EL_MAGIC_WALL_BD_EMPTY; + case EL_AMOEBA_DRIPPING: return EL_AMOEBE_NASS; + + default: return element; + } +} + int el2gfx(int element) { switch(element) @@ -2530,10 +2424,12 @@ int el2gfx(int element) case EL_DIAMANT: return GFX_DIAMANT; case EL_MORAST_LEER: return GFX_MORAST_LEER; case EL_MORAST_VOLL: return GFX_MORAST_VOLL; + case EL_QUICKSAND_EMPTYING: return GFX_MORAST_LEER; case EL_TROPFEN: return GFX_TROPFEN; case EL_BOMBE: return GFX_BOMBE; case EL_MAGIC_WALL_OFF: return GFX_MAGIC_WALL_OFF; case EL_MAGIC_WALL_EMPTY: return GFX_MAGIC_WALL_EMPTY; + case EL_MAGIC_WALL_EMPTYING:return GFX_MAGIC_WALL_EMPTY; case EL_MAGIC_WALL_FULL: return GFX_MAGIC_WALL_FULL; case EL_MAGIC_WALL_DEAD: return GFX_MAGIC_WALL_DEAD; case EL_SALZSAEURE: return GFX_SALZSAEURE; @@ -2543,6 +2439,7 @@ int el2gfx(int element) case EL_AMOEBE_VOLL: return GFX_AMOEBE_VOLL; case EL_AMOEBE_BD: return GFX_AMOEBE_BD; case EL_AMOEBA2DIAM: return GFX_AMOEBA2DIAM; + case EL_AMOEBA_DRIPPING: return GFX_AMOEBE_NASS; case EL_KOKOSNUSS: return GFX_KOKOSNUSS; case EL_LIFE: return GFX_LIFE; case EL_LIFE_ASYNC: return GFX_LIFE_ASYNC; @@ -2595,6 +2492,7 @@ int el2gfx(int element) case EL_MAMPFER2: return GFX_MAMPFER2; case EL_MAGIC_WALL_BD_OFF: return GFX_MAGIC_WALL_BD_OFF; case EL_MAGIC_WALL_BD_EMPTY:return GFX_MAGIC_WALL_BD_EMPTY; + case EL_MAGIC_WALL_BD_EMPTYING:return GFX_MAGIC_WALL_BD_EMPTY; case EL_MAGIC_WALL_BD_FULL: return GFX_MAGIC_WALL_BD_FULL; case EL_MAGIC_WALL_BD_DEAD: return GFX_MAGIC_WALL_BD_DEAD; case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB;