X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=424a3272071868cb0877171f5dfffab88fa7a544;hb=1e196be4c0a2f1edf823b3a0e5a14a146317686e;hp=3184acaa51de78b18e8edccb0b5150f0a9af11ae;hpb=1d5a33fc89d071c8e8a242ff3b51258f1b6b0e1e;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 3184acaa..424a3272 100644 --- a/src/tools.c +++ b/src/tools.c @@ -543,7 +543,10 @@ void DrawPlayer(struct PlayerInfo *player) phase = 7 - phase; } - DrawGraphicThruMask(sx, sy, graphic + phase); + if (game_emulation == EMU_SUPAPLEX) + DrawGraphic(sx, sy, GFX_SP_DISK_RED); + else + DrawGraphicThruMask(sx, sy, graphic + phase); } if ((last_jx != jx || last_jy != jy) && @@ -936,13 +939,14 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, { int ux = LEVELX(x), uy = LEVELY(y); int graphic = el2gfx(element); - int phase4 = ABS(MovPos[ux][uy]) / (TILEX / 4); - int phase = phase4 / 2; + int phase8 = ABS(MovPos[ux][uy]) / (TILEX / 8); + int phase4 = phase8 / 2; + int phase2 = phase8 / 4; int dir = MovDir[ux][uy]; if (element == EL_PACMAN || element == EL_KAEFER || element == EL_FLIEGER) { - graphic += 4*!phase; + graphic += 4 * !phase2; if (dir == MV_UP) graphic += 1; @@ -951,6 +955,23 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, else if (dir == MV_DOWN) graphic += 3; } + else if (element == EL_SP_SNIKSNAK) + { + if (dir == MV_LEFT) + graphic = GFX_SP_SNIKSNAK_LEFT; + else if (dir == MV_RIGHT) + graphic = GFX_SP_SNIKSNAK_RIGHT; + else if (dir == MV_UP) + graphic = GFX_SP_SNIKSNAK_UP; + else + graphic = GFX_SP_SNIKSNAK_DOWN; + + graphic += (phase8 < 4 ? phase8 : 7 - phase8); + } + else if (element == EL_SP_ELECTRON) + { + graphic = GFX2_SP_ELECTRON + getGraphicAnimationPhase(8, 2, ANIM_NORMAL); + } else if (element == EL_MAULWURF || element == EL_PINGUIN || element == EL_SCHWEIN || element == EL_DRACHE) { @@ -983,12 +1004,12 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, } else if (element == EL_BUTTERFLY || element == EL_FIREFLY) { - graphic += !phase; + graphic += !phase2; } else if ((element == EL_FELSBROCKEN || IS_GEM(element)) && !cut_mode) { if (element != EL_SP_INFOTRON) - graphic += phase * (element == EL_FELSBROCKEN ? 2 : 1); + graphic += phase2 * (element == EL_FELSBROCKEN ? 2 : 1); } else if (element == EL_SIEB_LEER || element == EL_SIEB2_LEER || element == EL_SIEB_VOLL || element == EL_SIEB2_VOLL) @@ -1184,7 +1205,12 @@ void DrawScreenField(int x, int y) if (!IN_LEV_FIELD(ux, uy)) { - DrawScreenElement(x, y, EL_BETON); + if (ux < -1 || ux > lev_fieldx || uy < -1 || uy > lev_fieldy) + element = EL_LEERRAUM; + else + element = BorderElement; + + DrawScreenElement(x, y, element); return; } @@ -1373,7 +1399,7 @@ void DrawMicroLevel(int xpos, int ypos) Ur[x][y]); else if (x >= -1 && x < lev_fieldx+1 && y >= -1 && y < lev_fieldy+1) DrawMicroElement(xpos + x * MICRO_TILEX, ypos + y * MICRO_TILEY, - EL_BETON); + BorderElement); XFillRectangle(display, drawto,gc, SX, MICROLABEL_YPOS, SXSIZE, FONT4_YSIZE); @@ -1933,12 +1959,24 @@ int el2gfx(int element) case EL_PFEIL_R: return GFX_PFEIL_R; case EL_PFEIL_O: return GFX_PFEIL_O; case EL_PFEIL_U: return GFX_PFEIL_U; + case EL_SPEED_PILL: return GFX_SPEED_PILL; + case EL_SP_TERMINAL_ACTIVE: return GFX_SP_TERMINAL; + case EL_SP_BUG_ACTIVE: return GFX_SP_BUG_ACTIVE; + default: { if (IS_CHAR(element)) return GFX_CHAR_START + (element - EL_CHAR_START); else if (element >= EL_SP_START && element <= EL_SP_END) - return GFX_START_ROCKSMORE + (element - EL_SP_START); + { + int nr_element = element - EL_SP_START; + int gfx_per_line = 8; + int nr_graphic = + (nr_element / gfx_per_line) * MORE_PER_LINE + + (nr_element % gfx_per_line); + + return GFX_START_ROCKSMORE + nr_graphic; + } else return -1; }