X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=258c99a6517a72c65b3c205214920884a8483bcf;hb=72b2940bea34cebf61175bc62a474cb78dcec467;hp=56f7de4b48eb3ec2738eedefd7fd5b88d9fa0151;hpb=4dd13e13723d0f55916fc013dc621fbdf2691a09;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 56f7de4b..258c99a6 100644 --- a/src/tools.c +++ b/src/tools.c @@ -456,8 +456,9 @@ void DrawPlayer(struct PlayerInfo *player) int next_jx = jx + (jx - last_jx), next_jy = jy + (jy - last_jy); int sx = SCREENX(jx), sy = SCREENY(jy); int sxx = 0, syy = 0; - int element = Feld[jx][jy]; + int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy]; int graphic, phase; + boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE); if (!player->active || player->gone || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy))) @@ -478,14 +479,18 @@ void DrawPlayer(struct PlayerInfo *player) /* draw things in the field the player is leaving, if needed */ + /* if (last_jx != jx || last_jy != jy) + */ + + if (player_is_moving) { - if (Store[last_jx][last_jy] && IS_DRAWABLE(Feld[last_jx][last_jy])) + 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); } - else if (Feld[last_jx][last_jy] == EL_DYNAMIT) + else if (last_element == EL_DYNAMIT) DrawDynamite(last_jx, last_jy); else DrawLevelField(last_jx, last_jy); @@ -522,9 +527,12 @@ void DrawPlayer(struct PlayerInfo *player) if (game_emulation == EMU_SUPAPLEX) { static int last_dir = MV_LEFT; + int action = (player->programmed_action ? player->programmed_action : + player->action); boolean action_moving = - ((player->action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) && - !(player->action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN))); + (player_is_moving || + ((action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) && + !(action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)))); graphic = GFX_SP_MURPHY; @@ -601,7 +609,7 @@ void DrawPlayer(struct PlayerInfo *player) { int px = SCREENX(next_jx), py = SCREENY(next_jy); - if (Feld[jx][jy] == EL_SOKOBAN_FELD_LEER || + if (element == EL_SOKOBAN_FELD_LEER || Feld[next_jx][next_jy] == EL_SOKOBAN_FELD_VOLL) DrawGraphicShiftedThruMask(px, py, sxx, syy, GFX_SOKOBAN_OBJEKT, NO_CUTTING); @@ -624,7 +632,7 @@ void DrawPlayer(struct PlayerInfo *player) } } - /* draw things in front of player (EL_DYNAMIT || EL_DYNABOMB) */ + /* draw things in front of player (EL_DYNAMIT or EL_DYNABOMB) */ if (element == EL_DYNAMIT || element == EL_DYNABOMB) { @@ -647,8 +655,11 @@ void DrawPlayer(struct PlayerInfo *player) DrawGraphicThruMask(sx, sy, graphic + phase); } - if ((last_jx != jx || last_jy != jy) && - Feld[last_jx][last_jy] == EL_EXPLODING) + /* + if ((last_jx != jx || last_jy != jy) && last_element == EL_EXPLODING) + */ + + if (player_is_moving && last_element == EL_EXPLODING) { int phase = Frame[last_jx][last_jy]; int delay = 2; @@ -658,6 +669,14 @@ void DrawPlayer(struct PlayerInfo *player) GFX_EXPLOSION + ((phase - 1) / delay - 1)); } + /* draw elements that stay over the player */ + /* handle the field the player is leaving ... */ + if (player_is_moving && IS_OVER_PLAYER(last_element)) + DrawLevelField(last_jx, last_jy); + /* ... and the field the player is entering */ + if (IS_OVER_PLAYER(element)) + DrawLevelField(jx, jy); + if (setup.direct_draw) { int dest_x = SX + SCREENX(MIN(jx, last_jx)) * TILEX; @@ -936,6 +955,7 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y) else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) { graphic -= GFX_START_ROCKSMORE; + graphic -= ((graphic / MORE_PER_LINE) * MORE_PER_LINE) / 2; *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; @@ -1622,6 +1642,7 @@ void DrawMicroElement(int xpos, int ypos, int element) if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) { graphic -= GFX_START_ROCKSMORE; + graphic -= ((graphic / MORE_PER_LINE) * MORE_PER_LINE) / 2; 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, @@ -1841,12 +1862,7 @@ boolean Request(char *text, unsigned int req_state) DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1); /* clear door drawing field */ -#if 0 - XFillRectangle(display, pix[PIX_DB_DOOR], gc, - DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE); -#else XFillRectangle(display, drawto, gc, DX, DY, DXSIZE, DYSIZE); -#endif /* write text for request */ for(ty=0; ty<13; ty++) @@ -1871,37 +1887,12 @@ boolean Request(char *text, unsigned int req_state) } sprintf(txt, text); txt[tl] = 0; -#if 0 - DrawTextExt(pix[PIX_DB_DOOR], gc, - DOOR_GFX_PAGEX1 + 51 - (tl * 14)/2, SY + ty * 16, - txt, FS_SMALL, FC_YELLOW); -#else DrawTextExt(drawto, gc, DX + 51 - (tl * 14)/2, DY + 8 + ty * 16, txt, FS_SMALL, FC_YELLOW); -#endif text += tl + (tc == 32 ? 1 : 0); } -#if 0 - if (req_state & REQ_ASK) - { - DrawYesNoButton(BUTTON_OK, DB_INIT); - DrawYesNoButton(BUTTON_NO, DB_INIT); - } - else if (req_state & REQ_CONFIRM) - { - DrawConfirmButton(BUTTON_CONFIRM, DB_INIT); - } - else if (req_state & REQ_PLAYER) - { - DrawPlayerButton(BUTTON_PLAYER_1, DB_INIT); - DrawPlayerButton(BUTTON_PLAYER_2, DB_INIT); - DrawPlayerButton(BUTTON_PLAYER_3, DB_INIT); - DrawPlayerButton(BUTTON_PLAYER_4, DB_INIT); - } -#else - if (req_state & REQ_ASK) { MapGadget(tool_gadget[TOOL_CTRL_ID_YES]); @@ -1924,8 +1915,6 @@ boolean Request(char *text, unsigned int req_state) DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); -#endif - OpenDoor(DOOR_OPEN_1); ClearEventQueue(); @@ -1953,11 +1942,6 @@ boolean Request(char *text, unsigned int req_state) case ButtonRelease: case MotionNotify: { - -#if 0 - int choice; -#endif - if (event.type == MotionNotify) { Window root, child; @@ -1987,46 +1971,6 @@ boolean Request(char *text, unsigned int req_state) button_status = MB_RELEASED; } - - -#if 0 - if (req_state & REQ_ASK) - choice = CheckYesNoButtons(mx,my,button_status); - else if (req_state & REQ_CONFIRM) - choice = CheckConfirmButton(mx,my,button_status); - else - choice = CheckPlayerButtons(mx,my,button_status); - - switch(choice) - { - case BUTTON_OK: - result = TRUE; - break; - case BUTTON_NO: - result = FALSE; - break; - case BUTTON_CONFIRM: - result = TRUE | FALSE; - break; - - case BUTTON_PLAYER_1: - result = 1; - break; - case BUTTON_PLAYER_2: - result = 2; - break; - case BUTTON_PLAYER_3: - result = 3; - break; - case BUTTON_PLAYER_4: - result = 4; - break; - - default: - break; - } -#else - /* this sets 'request_gadget_id' */ HandleGadgets(mx, my, button_status); @@ -2058,7 +2002,6 @@ boolean Request(char *text, unsigned int req_state) default: break; } -#endif break; } @@ -2730,6 +2673,22 @@ int el2gfx(int element) /* ^^^^^^^^^^ non-standard position in supaplex graphic set! */ case EL_INVISIBLE_STEEL: return GFX_INVISIBLE_STEEL; case EL_BLACK_ORB: return GFX_BLACK_ORB; + case EL_EM_GATE_1: return GFX_EM_GATE_1; + case EL_EM_GATE_2: return GFX_EM_GATE_2; + case EL_EM_GATE_3: return GFX_EM_GATE_3; + case EL_EM_GATE_4: return GFX_EM_GATE_4; + case EL_EM_GATE_1X: return GFX_EM_GATE_1X; + case EL_EM_GATE_2X: return GFX_EM_GATE_2X; + case EL_EM_GATE_3X: return GFX_EM_GATE_3X; + case EL_EM_GATE_4X: return GFX_EM_GATE_4X; + case EL_EM_KEY_1_FILE: return GFX_EM_KEY_1; + case EL_EM_KEY_2_FILE: return GFX_EM_KEY_2; + case EL_EM_KEY_3_FILE: return GFX_EM_KEY_3; + case EL_EM_KEY_4_FILE: return GFX_EM_KEY_4; + case EL_EM_KEY_1: return GFX_EM_KEY_1; + case EL_EM_KEY_2: return GFX_EM_KEY_2; + case EL_EM_KEY_3: return GFX_EM_KEY_3; + case EL_EM_KEY_4: return GFX_EM_KEY_4; default: {