X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=0c9cd1766e69264bcacc83ed69a7f278ac7d9e96;hp=fbd0ca17d7da66db7838717432ca6206eb17ee35;hb=8d46c5298f0fcce7bdb52f3835b2fbbdc403dfe0;hpb=5b0dc92b2f5aba6cebec2c334728a4d17a3d75df diff --git a/src/tools.c b/src/tools.c index fbd0ca17..0c9cd176 100644 --- a/src/tools.c +++ b/src/tools.c @@ -319,6 +319,7 @@ void ClearWindow() 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 : @@ -328,12 +329,34 @@ int getFontWidth(int font_size, int font_type) 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) +{ +#ifdef USE_SDL_LIBRARY + if (sdl_window && sdl_pix[PIX_SMALLFONT]) + { + SDLFillRectangle(sdl_window, 0, ypos, WIN_XSIZE, FONT2_YSIZE, 0x000000); + DrawTextExt(window, gc, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2, + ypos,text,FS_SMALL,color); + SDL_Flip(sdl_window); + } +#else + if (display && window && pix[PIX_SMALLFONT]) + { + XFillRectangle(display, window, gc, 0, ypos, WIN_XSIZE, FONT2_YSIZE); + DrawTextExt(window, gc, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2, + ypos,text,FS_SMALL,color); + XFlush(display); + } +#endif +} + void DrawTextFCentered(int y, int font_type, char *format, ...) { char buffer[FULL_SXSIZE / FONT5_XSIZE + 10]; @@ -377,7 +400,7 @@ void DrawTextExt(Drawable d, GC gc, int x, int y, int font_pixmap; boolean print_inverse = FALSE; - if (font_size != FS_SMALL && font_size != FS_BIG) + 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; @@ -385,8 +408,12 @@ void DrawTextExt(Drawable d, GC gc, int x, int y, font_width = getFontWidth(font_size, font_type); font_height = getFontHeight(font_size, font_type); - font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT); - font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) * + font_pixmap = (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) @@ -430,8 +457,15 @@ void DrawTextExt(Drawable d, GC gc, int x, int y, 0, 0, font_width, font_height, dest_x, dest_y); } else + { +#ifdef USE_SDL_LIBRARY + SDLCopyArea(sdl_pix[font_pixmap], sdl_window, + src_x, src_y, font_width, font_height, dest_x, dest_y); +#else XCopyArea(display, pix[font_pixmap], d, gc, src_x, src_y, font_width, font_height, dest_x, dest_y); +#endif + } } x += font_width; @@ -569,6 +603,8 @@ void DrawPlayer(struct PlayerInfo *player) graphic = GFX_MURPHY_GO_LEFT; else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT) graphic = GFX_MURPHY_GO_RIGHT; + else + graphic = GFX_MURPHY_GO_LEFT; graphic += getGraphicAnimationPhase(3, 2, ANIM_OSCILLATE); } @@ -628,7 +664,9 @@ void DrawPlayer(struct PlayerInfo *player) int element = Feld[next_jx][next_jy]; int graphic = el2gfx(element); - if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK) && sxx) + if ((element == EL_FELSBROCKEN || + element == EL_SP_ZONK || + element == EL_BD_ROCK) && sxx) { int phase = (player->GfxPos / (TILEX / 4)); @@ -784,6 +822,13 @@ void getGraphicSource(int graphic, int *pixmap_nr, int *x, int *y) *x = (graphic % DC_PER_LINE) * TILEX; *y = (graphic / DC_PER_LINE) * TILEY; } + else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) + { + graphic -= GFX_START_ROCKSMORE; + *pixmap_nr = PIX_MORE; + *x = (graphic % MORE_PER_LINE) * TILEX; + *y = (graphic / MORE_PER_LINE) * TILEY; + } else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) { graphic -= GFX_START_ROCKSFONT; @@ -904,6 +949,13 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y) *x = MINI_DC_STARTX + (graphic % MINI_DC_PER_LINE) * MINI_TILEX; *y = MINI_DC_STARTY + (graphic / MINI_DC_PER_LINE) * MINI_TILEY; } + else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) + { + graphic -= GFX_START_ROCKSMORE; + *pixmap = pix[PIX_MORE]; + *x = MINI_MORE_STARTX + (graphic % MINI_MORE_PER_LINE) * MINI_TILEX; + *y = MINI_MORE_STARTY + (graphic / MINI_MORE_PER_LINE) * MINI_TILEY; + } else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) { graphic -= GFX_START_ROCKSFONT; @@ -1135,12 +1187,20 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, { graphic += !phase2; } - else if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK || + else if (element == EL_BALLOON) + { + graphic += phase4; + } + else if ((element == EL_FELSBROCKEN || + element == EL_SP_ZONK || + element == EL_BD_ROCK || IS_GEM(element)) && !cut_mode) { if (uy >= lev_fieldy-1 || !IS_BELT(Feld[ux][uy+1])) { - if (element == EL_FELSBROCKEN || element == EL_SP_ZONK) + if (element == EL_FELSBROCKEN || + element == EL_SP_ZONK || + element == EL_BD_ROCK) { if (dir == MV_LEFT) graphic += (4 - phase4) % 4; @@ -1153,8 +1213,10 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, graphic += phase2; } } - else if (element == EL_SIEB_LEER || element == EL_SIEB2_LEER || - element == EL_SIEB_VOLL || element == EL_SIEB2_VOLL) + else if (element == EL_MAGIC_WALL_EMPTY || + element == EL_MAGIC_WALL_BD_EMPTY || + element == EL_MAGIC_WALL_FULL || + element == EL_MAGIC_WALL_BD_FULL) { graphic += 3 + getGraphicAnimationPhase(4, 4, ANIM_REVERSE); } @@ -1250,7 +1312,10 @@ void ErdreichAnbroeckeln(int x, int y) element = Feld[ux][uy]; - if (element == EL_ERDREICH || element == EL_LANDMINE) + if (element == EL_ERDREICH || + element == EL_LANDMINE || + element == EL_TRAP_INACTIVE || + element == EL_TRAP_ACTIVE) { if (!IN_SCR_FIELD(x, y)) return; @@ -1268,7 +1333,10 @@ void ErdreichAnbroeckeln(int x, int y) else element = Feld[uxx][uyy]; - if (element == EL_ERDREICH || element == EL_LANDMINE) + if (element == EL_ERDREICH || + element == EL_LANDMINE || + element == EL_TRAP_INACTIVE || + element == EL_TRAP_ACTIVE) continue; if (i == 1 || i == 2) @@ -1308,7 +1376,10 @@ void ErdreichAnbroeckeln(int x, int y) uyy = uy + xy[i][1]; if (!IN_LEV_FIELD(uxx, uyy) || - (Feld[uxx][uyy] != EL_ERDREICH && Feld[uxx][uyy] != EL_LANDMINE) || + (Feld[uxx][uyy] != EL_ERDREICH && + Feld[uxx][uyy] != EL_LANDMINE && + Feld[uxx][uyy] != EL_TRAP_INACTIVE && + Feld[uxx][uyy] != EL_TRAP_ACTIVE) || !IN_SCR_FIELD(xx, yy)) continue; @@ -1373,13 +1444,13 @@ void DrawScreenField(int x, int y) boolean cut_mode = NO_CUTTING; if (Store[ux][uy] == EL_MORAST_LEER || - Store[ux][uy] == EL_SIEB_LEER || - Store[ux][uy] == EL_SIEB2_LEER || + Store[ux][uy] == EL_MAGIC_WALL_EMPTY || + Store[ux][uy] == EL_MAGIC_WALL_BD_EMPTY || Store[ux][uy] == EL_AMOEBE_NASS) cut_mode = CUT_ABOVE; else if (Store[ux][uy] == EL_MORAST_VOLL || - Store[ux][uy] == EL_SIEB_VOLL || - Store[ux][uy] == EL_SIEB2_VOLL) + Store[ux][uy] == EL_MAGIC_WALL_FULL || + Store[ux][uy] == EL_MAGIC_WALL_BD_FULL) cut_mode = CUT_BELOW; if (cut_mode == CUT_ABOVE) @@ -1409,8 +1480,8 @@ void DrawScreenField(int x, int y) MovDir[oldx][oldy] == MV_RIGHT); if (Store[oldx][oldy] == EL_MORAST_LEER || - Store[oldx][oldy] == EL_SIEB_LEER || - Store[oldx][oldy] == EL_SIEB2_LEER || + Store[oldx][oldy] == EL_MAGIC_WALL_EMPTY || + Store[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTY || Store[oldx][oldy] == EL_AMOEBE_NASS) cut_mode = CUT_ABOVE; @@ -1524,6 +1595,14 @@ void DrawMicroElement(int xpos, int ypos, int element) MICRO_DC_STARTY + (graphic / MICRO_DC_PER_LINE) * MICRO_TILEY, MICRO_TILEX, MICRO_TILEY, xpos, ypos); } + else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) + { + graphic -= GFX_START_ROCKSMORE; + XCopyArea(display, pix[PIX_MORE], drawto, gc, + MICRO_MORE_STARTX + (graphic % MICRO_MORE_PER_LINE) *MICRO_TILEX, + MICRO_MORE_STARTY + (graphic / MICRO_MORE_PER_LINE) *MICRO_TILEY, + MICRO_TILEX, MICRO_TILEY, xpos, ypos); + } else XCopyArea(display, pix[PIX_BACK], drawto, gc, MICRO_GFX_STARTX + (graphic % MICRO_GFX_PER_LINE) * MICRO_TILEX, @@ -1609,7 +1688,7 @@ static void DrawMicroLevelLabelExt(int mode) mode == MICROLABEL_LEVEL_AUTHOR ? level.author : mode == MICROLABEL_IMPORTED_FROM ? "imported from" : mode == MICROLABEL_LEVEL_IMPORT_INFO ? - leveldir[leveldir_nr].imported_from : ""), + leveldir_current->imported_from : ""), MAX_MICROLABEL_SIZE); label_text[MAX_MICROLABEL_SIZE] = '\0'; @@ -1692,12 +1771,12 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) /* redraw micro level label, if needed */ if (strcmp(level.name, NAMELESS_LEVEL_NAME) != 0 && strcmp(level.author, ANONYMOUS_NAME) != 0 && - strcmp(level.author, leveldir[leveldir_nr].name) != 0 && + strcmp(level.author, leveldir_current->name) != 0 && DelayReached(&label_delay, MICROLEVEL_LABEL_DELAY)) { int max_label_counter = 23; - if (leveldir[leveldir_nr].imported_from != NULL) + if (leveldir_current->imported_from != NULL) max_label_counter += 14; label_counter = (label_counter + 1) % max_label_counter; @@ -2395,10 +2474,10 @@ int el2gfx(int element) case EL_MORAST_VOLL: return GFX_MORAST_VOLL; case EL_TROPFEN: return GFX_TROPFEN; case EL_BOMBE: return GFX_BOMBE; - case EL_SIEB_INAKTIV: return GFX_SIEB_INAKTIV; - case EL_SIEB_LEER: return GFX_SIEB_LEER; - case EL_SIEB_VOLL: return GFX_SIEB_VOLL; - case EL_SIEB_TOT: return GFX_SIEB_TOT; + case EL_MAGIC_WALL_OFF: return GFX_MAGIC_WALL_OFF; + case EL_MAGIC_WALL_EMPTY: 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; case EL_AMOEBE_TOT: return GFX_AMOEBE_TOT; case EL_AMOEBE_NASS: return GFX_AMOEBE_NASS; @@ -2456,10 +2535,10 @@ int el2gfx(int element) case EL_ERZ_EDEL_ROT: return GFX_ERZ_EDEL_ROT; case EL_ERZ_EDEL_LILA: return GFX_ERZ_EDEL_LILA; case EL_MAMPFER2: return GFX_MAMPFER2; - case EL_SIEB2_INAKTIV: return GFX_SIEB2_INAKTIV; - case EL_SIEB2_LEER: return GFX_SIEB2_LEER; - case EL_SIEB2_VOLL: return GFX_SIEB2_VOLL; - case EL_SIEB2_TOT: return GFX_SIEB2_TOT; + 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_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; case EL_DYNABOMB_ACTIVE_2: return GFX_DYNABOMB; case EL_DYNABOMB_ACTIVE_3: return GFX_DYNABOMB; @@ -2568,6 +2647,43 @@ int el2gfx(int element) case EL_TIMEGATE_CLOSED: return GFX_TIMEGATE_CLOSED; case EL_TIMEGATE_SWITCH_ON: return GFX_TIMEGATE_SWITCH; case EL_TIMEGATE_SWITCH_OFF:return GFX_TIMEGATE_SWITCH; + case EL_BALLOON: return GFX_BALLOON; + case EL_BALLOON_SEND_LEFT: return GFX_BALLOON_SEND_LEFT; + case EL_BALLOON_SEND_RIGHT: return GFX_BALLOON_SEND_RIGHT; + case EL_BALLOON_SEND_UP: return GFX_BALLOON_SEND_UP; + case EL_BALLOON_SEND_DOWN: return GFX_BALLOON_SEND_DOWN; + case EL_BALLOON_SEND_ANY: return GFX_BALLOON_SEND_ANY; + case EL_EMC_STEEL_WALL_1: return GFX_EMC_STEEL_WALL_1; + case EL_EMC_STEEL_WALL_2: return GFX_EMC_STEEL_WALL_2; + case EL_EMC_STEEL_WALL_3: return GFX_EMC_STEEL_WALL_3; + case EL_EMC_STEEL_WALL_4: return GFX_EMC_STEEL_WALL_4; + case EL_EMC_WALL_1: return GFX_EMC_WALL_1; + case EL_EMC_WALL_2: return GFX_EMC_WALL_2; + case EL_EMC_WALL_3: return GFX_EMC_WALL_3; + case EL_EMC_WALL_4: return GFX_EMC_WALL_4; + case EL_EMC_WALL_5: return GFX_EMC_WALL_5; + case EL_EMC_WALL_6: return GFX_EMC_WALL_6; + case EL_EMC_WALL_7: return GFX_EMC_WALL_7; + case EL_EMC_WALL_8: return GFX_EMC_WALL_8; + case EL_TUBE_CROSS: return GFX_TUBE_CROSS; + case EL_TUBE_VERTICAL: return GFX_TUBE_VERTICAL; + case EL_TUBE_HORIZONTAL: return GFX_TUBE_HORIZONTAL; + case EL_TUBE_VERT_LEFT: return GFX_TUBE_VERT_LEFT; + case EL_TUBE_VERT_RIGHT: return GFX_TUBE_VERT_RIGHT; + case EL_TUBE_HORIZ_UP: return GFX_TUBE_HORIZ_UP; + case EL_TUBE_HORIZ_DOWN: return GFX_TUBE_HORIZ_DOWN; + case EL_TUBE_LEFT_UP: return GFX_TUBE_LEFT_UP; + case EL_TUBE_LEFT_DOWN: return GFX_TUBE_LEFT_DOWN; + case EL_TUBE_RIGHT_UP: return GFX_TUBE_RIGHT_UP; + case EL_TUBE_RIGHT_DOWN: return GFX_TUBE_RIGHT_DOWN; + case EL_SPRING: return GFX_SPRING; + case EL_SPRING_MOVING: return GFX_SPRING; + case EL_TRAP_INACTIVE: return GFX_TRAP_INACTIVE; + case EL_TRAP_ACTIVE: return GFX_TRAP_ACTIVE; + case EL_BD_WALL: return GFX_BD_WALL; + case EL_BD_ROCK: return GFX_BD_ROCK; + case EL_DX_SUPABOMB: return GFX_DX_SUPABOMB; + case EL_SP_MURPHY_CLONE: return GFX_SP_MURPHY_CLONE; default: {