From d2569aa3db9021edea83086dc34ece98cfc92493 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 19 Feb 1999 17:00:57 +0100 Subject: [PATCH 01/16] rnd-19990219-3 --- src/game.c | 12 ++ src/init.c | 35 +----- src/tools.c | 312 +++------------------------------------------------- 3 files changed, 29 insertions(+), 330 deletions(-) diff --git a/src/game.c b/src/game.c index fcaedf73..dea71db2 100644 --- a/src/game.c +++ b/src/game.c @@ -591,6 +591,18 @@ void InitGame() DrawAllPlayers(); FadeToFront(); + +#if 1 + + if (setup.soft_scrolling) + XCopyArea(display, fieldbuffer, backbuffer, gc, + FX, FY, SXSIZE, SYSIZE, SX, SY); + + redraw_mask |= REDRAW_FROM_BACKBUFFER; + +#endif + + /* copy default game door content to main double buffer */ XCopyArea(display, pix[PIX_DOOR], drawto, gc, DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); diff --git a/src/init.c b/src/init.c index 6935fc82..85339702 100644 --- a/src/init.c +++ b/src/init.c @@ -628,45 +628,12 @@ void InitGfx() int tile = tile_needs_clipping[i].start + j; int graphic = tile; int src_x, src_y; - Pixmap src_pixmap; - -#if 0 - if (graphic >= GFX_START_ROCKSSCREEN && - graphic <= GFX_END_ROCKSSCREEN) - { - src_pixmap = clipmask[PIX_BACK]; - graphic -= GFX_START_ROCKSSCREEN; - src_x = SX + (graphic % GFX_PER_LINE) * TILEX; - src_y = SY + (graphic / GFX_PER_LINE) * TILEY; - } - else if (graphic >= GFX_START_ROCKSHEROES && - graphic <= GFX_END_ROCKSHEROES) - { - src_pixmap = clipmask[PIX_HEROES]; - graphic -= GFX_START_ROCKSHEROES; - src_x = (graphic % HEROES_PER_LINE) * TILEX; - src_y = (graphic / HEROES_PER_LINE) * TILEY; - } - else if (graphic >= GFX_START_ROCKSFONT && - graphic <= GFX_END_ROCKSFONT) - { - src_pixmap = clipmask[PIX_BIGFONT]; - graphic -= GFX_START_ROCKSFONT; - src_x = (graphic % FONT_CHARS_PER_LINE) * TILEX; - src_y = (graphic / FONT_CHARS_PER_LINE) * TILEY + - FC_SPECIAL1 * FONT_LINES_PER_FONT * TILEY; - } - else - break; -#else - int pixmap_nr; + Pixmap src_pixmap; getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y); src_pixmap = clipmask[pixmap_nr]; -#endif - tile_clipmask[tile] = XCreatePixmap(display, window, TILEX,TILEY, 1); XCopyArea(display,src_pixmap,tile_clipmask[tile],copy_clipmask_gc, diff --git a/src/tools.c b/src/tools.c index 2626f2e4..49e65e5c 100644 --- a/src/tools.c +++ b/src/tools.c @@ -94,12 +94,6 @@ void BackToFront() if (redraw_mask & REDRAW_FIELD) redraw_mask &= ~REDRAW_TILES; - /* - if (redraw_mask & REDRAW_FIELD || - (ScreenGfxPos && setup.soft_scrolling && game_status == PLAYING)) - redraw_mask &= ~REDRAW_TILES; - */ - if (!redraw_mask) return; @@ -110,12 +104,6 @@ void BackToFront() XSync(display, FALSE); - /* -#ifdef MSDOS - wait_for_vsync = TRUE; -#endif - */ - if (redraw_mask & REDRAW_ALL) { XCopyArea(display, backbuffer, window, gc, @@ -443,10 +431,10 @@ void DrawAllPlayers() void DrawPlayerField(int x, int y) { - if (!IS_PLAYER(x,y)) + if (!IS_PLAYER(x, y)) return; - DrawPlayer(PLAYERINFO(x,y)); + DrawPlayer(PLAYERINFO(x, y)); } void DrawPlayer(struct PlayerInfo *player) @@ -478,10 +466,6 @@ 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(last_element)) @@ -654,10 +638,6 @@ void DrawPlayer(struct PlayerInfo *player) DrawGraphicThruMask(sx, sy, graphic + phase); } - /* - 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]; @@ -792,56 +772,12 @@ void DrawGraphic(int x, int y, int graphic) void DrawGraphicExt(Drawable d, GC gc, int x, int y, int graphic) { - -#if 1 - int pixmap_nr; int src_x, src_y; getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y); XCopyArea(display, pix[pixmap_nr], d, gc, src_x, src_y, TILEX, TILEY, x, y); - -#else - - if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) - { - graphic -= GFX_START_ROCKSSCREEN; - XCopyArea(display, pix[PIX_BACK], d, gc, - SX + (graphic % GFX_PER_LINE) * TILEX, - SY + (graphic / GFX_PER_LINE) * TILEY, - TILEX, TILEY, x, y); - } - else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) - { - graphic -= GFX_START_ROCKSMORE; - XCopyArea(display, pix[PIX_MORE], d, gc, - (graphic % MORE_PER_LINE) * TILEX, - (graphic / MORE_PER_LINE) * TILEY, - TILEX, TILEY, x, y); - } - else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) - { - graphic -= GFX_START_ROCKSHEROES; - XCopyArea(display, pix[PIX_HEROES], d, gc, - (graphic % HEROES_PER_LINE) * TILEX, - (graphic / HEROES_PER_LINE) * TILEY, - TILEX, TILEY, x, y); - } - else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) - { - graphic -= GFX_START_ROCKSFONT; - XCopyArea(display, pix[PIX_BIGFONT], d, gc, - (graphic % FONT_CHARS_PER_LINE) * TILEX, - (graphic / FONT_CHARS_PER_LINE) * TILEY + - FC_SPECIAL1 * FONT_LINES_PER_FONT * TILEY, - TILEX, TILEY, x, y); - } - else - XFillRectangle(display, d, gc, x, y, TILEX, TILEY); - -#endif - } void DrawGraphicThruMask(int x, int y, int graphic) @@ -861,9 +797,6 @@ void DrawGraphicThruMask(int x, int y, int graphic) void DrawGraphicThruMaskExt(Drawable d, int dest_x, int dest_y, int graphic) { - -#if 1 - int tile = graphic; int pixmap_nr; int src_x, src_y; @@ -877,46 +810,6 @@ void DrawGraphicThruMaskExt(Drawable d, int dest_x, int dest_y, int graphic) src_pixmap = pix[pixmap_nr]; drawing_gc = clip_gc[pixmap_nr]; -#else - - int src_x, src_y; - int tile = graphic; - Pixmap src_pixmap; - GC drawing_gc; - - if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) - { - src_pixmap = pix[PIX_BACK]; - drawing_gc = clip_gc[PIX_BACK]; - graphic -= GFX_START_ROCKSSCREEN; - src_x = SX + (graphic % GFX_PER_LINE) * TILEX; - src_y = SY + (graphic / GFX_PER_LINE) * TILEY; - } - else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) - { - src_pixmap = pix[PIX_MORE]; - drawing_gc = clip_gc[PIX_MORE]; - graphic -= GFX_START_ROCKSMORE; - src_x = (graphic % MORE_PER_LINE) * TILEX; - src_y = (graphic / MORE_PER_LINE) * TILEY; - } - else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) - { - src_pixmap = pix[PIX_HEROES]; - drawing_gc = clip_gc[PIX_HEROES]; - graphic -= GFX_START_ROCKSHEROES; - src_x = (graphic % HEROES_PER_LINE) * TILEX; - src_y = (graphic / HEROES_PER_LINE) * TILEY; - } - else - { - DrawGraphicExt(d, gc, dest_x,dest_y, graphic); - return; - } - -#endif - - if (tile_clipmask[tile] != None) { XSetClipMask(display, tile_clip_gc, tile_clipmask[tile]); @@ -977,48 +870,12 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y) void DrawMiniGraphicExt(Drawable d, GC gc, int x, int y, int graphic) { - -#if 1 - Pixmap pixmap; int src_x, src_y; getMiniGraphicSource(graphic, &pixmap, &src_x, &src_y); XCopyArea(display, pixmap, d, gc, src_x, src_y, MINI_TILEX, MINI_TILEY, x, y); - -#else - - if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) - { - graphic -= GFX_START_ROCKSSCREEN; - XCopyArea(display, pix[PIX_BACK], d, gc, - MINI_GFX_STARTX + (graphic % MINI_GFX_PER_LINE) * MINI_TILEX, - MINI_GFX_STARTY + (graphic / MINI_GFX_PER_LINE) * MINI_TILEY, - MINI_TILEX, MINI_TILEY, x, y); - } - else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) - { - graphic -= GFX_START_ROCKSMORE; - XCopyArea(display, pix[PIX_MORE], d, gc, - MINI_MORE_STARTX + (graphic % MINI_MORE_PER_LINE) * MINI_TILEX, - MINI_MORE_STARTY + (graphic / MINI_MORE_PER_LINE) * MINI_TILEY, - MINI_TILEX, MINI_TILEY, x, y); - } - else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) - { - graphic -= GFX_START_ROCKSFONT; - XCopyArea(display, pix[PIX_SMALLFONT], d, gc, - (graphic % FONT_CHARS_PER_LINE) * FONT4_XSIZE, - (graphic / FONT_CHARS_PER_LINE) * FONT4_YSIZE + - FC_SPECIAL2 * FONT2_YSIZE * FONT_LINES_PER_FONT, - MINI_TILEX, MINI_TILEY, x, y); - } - else - XFillRectangle(display, d, gc, x, y, MINI_TILEX, MINI_TILEY); - -#endif - } void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, @@ -1028,6 +885,7 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int cx = 0, cy = 0; int src_x, src_y, dest_x, dest_y; int tile = graphic; + int pixmap_nr; Pixmap src_pixmap; GC drawing_gc; @@ -1101,32 +959,9 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, MarkTileDirty(x, y + SIGN(dy)); } - if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) - { - src_pixmap = pix[PIX_BACK]; - drawing_gc = clip_gc[PIX_BACK]; - graphic -= GFX_START_ROCKSSCREEN; - src_x = SX + (graphic % GFX_PER_LINE) * TILEX + cx; - src_y = SY + (graphic / GFX_PER_LINE) * TILEY + cy; - } - else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) - { - src_pixmap = pix[PIX_MORE]; - drawing_gc = clip_gc[PIX_MORE]; - graphic -= GFX_START_ROCKSMORE; - src_x = (graphic % MORE_PER_LINE) * TILEX + cx; - src_y = (graphic / MORE_PER_LINE) * TILEY + cy; - } - else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) - { - src_pixmap = pix[PIX_HEROES]; - drawing_gc = clip_gc[PIX_HEROES]; - graphic -= GFX_START_ROCKSHEROES; - src_x = (graphic % HEROES_PER_LINE) * TILEX + cx; - src_y = (graphic / HEROES_PER_LINE) * TILEY + cy; - } - else /* big font graphics currently not allowed (and not needed) */ - return; + getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y); + src_pixmap = pix[pixmap_nr]; + drawing_gc = clip_gc[pixmap_nr]; dest_x = FX + x * TILEX + dx; dest_y = FY + y * TILEY + dy; @@ -1608,24 +1443,6 @@ void DrawMiniElementOrWall(int sx, int sy, int scroll_x, int scroll_y) if (steel_position != -1) DrawMiniGraphic(sx, sy, border[steel_position][steel_type]); - - -#if 0 - if (x == -1 && y == -1) - DrawMiniGraphic(sx, sy, GFX_STEEL_UPPER_LEFT); - else if (x == lev_fieldx && y == -1) - DrawMiniGraphic(sx, sy, GFX_STEEL_UPPER_RIGHT); - else if (x == -1 && y == lev_fieldy) - DrawMiniGraphic(sx, sy, GFX_STEEL_LOWER_LEFT); - else if (x == lev_fieldx && y == lev_fieldy) - DrawMiniGraphic(sx, sy, GFX_STEEL_LOWER_RIGHT); - else if (x == -1 || x == lev_fieldx) - DrawMiniGraphic(sx, sy, GFX_STEEL_VERTICAL); - else if (y == -1 || y == lev_fieldy) - DrawMiniGraphic(sx, sy, GFX_STEEL_HORIZONTAL); -#endif - - } } @@ -1664,11 +1481,21 @@ void DrawLevel() for(y=BY1; y<=BY2; y++) DrawScreenField(x, y); + +#if 1 + + redraw_mask |= REDRAW_FIELD; + +#else + if (setup.soft_scrolling) XCopyArea(display, fieldbuffer, backbuffer, gc, FX, FY, SXSIZE, SYSIZE, SX, SY); redraw_mask |= (REDRAW_FIELD | REDRAW_FROM_BACKBUFFER); + +#endif + } void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) @@ -2229,15 +2056,7 @@ unsigned int MoveDoor(unsigned int door_state) redraw_mask |= REDRAW_DOOR_2; } - - -#if 1 BackToFront(); -#else - XCopyArea(display, drawto, window, gc, DX, DY, DXSIZE, DYSIZE, DX, DY); -#endif - - if (game_status == MAINMENU) DoAnimation(); @@ -2436,105 +2255,6 @@ static void UnmapToolButtons() static void HandleToolButtons(struct GadgetInfo *gi) { request_gadget_id = gi->custom_id; - - -#if 0 - int id = gi->custom_id; - - if (game_status != PLAYING) - return; - - switch (id) - { - case GAME_CTRL_ID_STOP: - if (AllPlayersGone) - { - CloseDoor(DOOR_CLOSE_1); - game_status = MAINMENU; - DrawMainMenu(); - break; - } - - if (Request("Do you really want to quit the game ?", - REQ_ASK | REQ_STAY_CLOSED)) - { -#ifndef MSDOS - if (options.network) - SendToServer_StopPlaying(); - else -#endif - { - game_status = MAINMENU; - DrawMainMenu(); - } - } - else - OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK); - break; - - case GAME_CTRL_ID_PAUSE: - if (options.network) - { -#ifndef MSDOS - if (tape.pausing) - SendToServer_ContinuePlaying(); - else - SendToServer_PausePlaying(); -#endif - } - else - TapeTogglePause(); - break; - - case GAME_CTRL_ID_PLAY: - if (tape.pausing) - { -#ifndef MSDOS - if (options.network) - SendToServer_ContinuePlaying(); - else -#endif - { - tape.pausing = FALSE; - DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0); - } - } - break; - - case SOUND_CTRL_ID_MUSIC: - if (setup.sound_music) - { - setup.sound_music = FALSE; - FadeSound(background_loop[level_nr % num_bg_loops]); - } - else if (sound_loops_allowed) - { - setup.sound = setup.sound_music = TRUE; - PlaySoundLoop(background_loop[level_nr % num_bg_loops]); - } - break; - - case SOUND_CTRL_ID_LOOPS: - if (setup.sound_loops) - setup.sound_loops = FALSE; - else if (sound_loops_allowed) - setup.sound = setup.sound_loops = TRUE; - break; - - case SOUND_CTRL_ID_SIMPLE: - if (setup.sound_simple) - setup.sound_simple = FALSE; - else if (sound_status==SOUND_AVAILABLE) - setup.sound = setup.sound_simple = TRUE; - break; - - default: - break; - } -#endif - - - } int el2gfx(int element) -- 2.34.1 From 181399ef548528792ef51d1cfeb875b57b0133ae Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 19 Feb 1999 17:34:52 +0100 Subject: [PATCH 02/16] rnd-19990219-5-src --- Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4616aecb..2d575c76 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,13 @@ clean: $(MAKE_CMD) clean backup: - ./Scripts/make_backup.sh + ./Scripts/make_backup.sh src + +backup_lev: + ./Scripts/make_backup.sh lev + +backup_gfx: + ./Scripts/make_backup.sh gfx dist-unix: ./Scripts/make_dist_unix.sh . -- 2.34.1 From 20e58eb6573a45a41c25958e17e8d9c20f738edc Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 20 Feb 1999 02:03:28 +0100 Subject: [PATCH 03/16] rnd-19990220-1-src --- src/buttons.c | 5 +- src/editor.c | 317 ++++++++++++++++++++++++++++++++++---------------- src/events.c | 10 -- src/files.c | 3 + src/game.c | 12 +- src/main.h | 3 + src/screens.c | 6 + src/tools.c | 64 ++++++++-- src/tools.h | 2 + 9 files changed, 296 insertions(+), 126 deletions(-) diff --git a/src/buttons.c b/src/buttons.c index c24981f3..78e28d16 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -899,7 +899,8 @@ static void MultiMapGadgets(int mode) { if ((mode & MULTIMAP_PLAYFIELD && gi->x < SX + SXSIZE) || (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y < DY + DYSIZE) || - (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y > DY + DYSIZE)) + (mode & MULTIMAP_DOOR_2 && gi->x >= DX && gi->y > DY + DYSIZE) || + (mode & MULTIMAP_ALL) == MULTIMAP_ALL) { if (mode & MULTIMAP_UNMAP) { @@ -1183,6 +1184,8 @@ void HandleGadgets(int mx, int my, int button) if (gadget_pressed_repeated) { + gi->event.type = GD_EVENT_PRESSED; + if (gi->event_mask & GD_EVENT_REPEATED && DelayReached(&pressed_delay, GADGET_FRAME_DELAY)) gi->callback_action(gi); diff --git a/src/editor.c b/src/editor.c index ee201420..d5233e26 100644 --- a/src/editor.c +++ b/src/editor.c @@ -221,51 +221,54 @@ #define GADGET_ID_LEVEL_TIMESCORE_DOWN 43 #define GADGET_ID_LEVEL_TIMESCORE_TEXT 44 #define GADGET_ID_LEVEL_TIMESCORE_UP 45 +#define GADGET_ID_SELECT_LEVEL_DOWN 46 +#define GADGET_ID_SELECT_LEVEL_TEXT 47 +#define GADGET_ID_SELECT_LEVEL_UP 48 /* drawing area identifiers */ -#define GADGET_ID_DRAWING_LEVEL 46 -#define GADGET_ID_ELEM_CONTENT_0 47 -#define GADGET_ID_ELEM_CONTENT_1 48 -#define GADGET_ID_ELEM_CONTENT_2 49 -#define GADGET_ID_ELEM_CONTENT_3 50 -#define GADGET_ID_ELEM_CONTENT_4 51 -#define GADGET_ID_ELEM_CONTENT_5 52 -#define GADGET_ID_ELEM_CONTENT_6 53 -#define GADGET_ID_ELEM_CONTENT_7 54 -#define GADGET_ID_AMOEBA_CONTENT 55 +#define GADGET_ID_DRAWING_LEVEL 49 +#define GADGET_ID_ELEM_CONTENT_0 50 +#define GADGET_ID_ELEM_CONTENT_1 51 +#define GADGET_ID_ELEM_CONTENT_2 52 +#define GADGET_ID_ELEM_CONTENT_3 53 +#define GADGET_ID_ELEM_CONTENT_4 54 +#define GADGET_ID_ELEM_CONTENT_5 55 +#define GADGET_ID_ELEM_CONTENT_6 56 +#define GADGET_ID_ELEM_CONTENT_7 57 +#define GADGET_ID_AMOEBA_CONTENT 58 /* text input identifiers */ -#define GADGET_ID_LEVEL_NAME 56 -#define GADGET_ID_LEVEL_AUTHOR 57 +#define GADGET_ID_LEVEL_NAME 59 +#define GADGET_ID_LEVEL_AUTHOR 60 /* gadgets for scrolling of drawing area */ -#define GADGET_ID_SCROLL_UP 58 -#define GADGET_ID_SCROLL_DOWN 59 -#define GADGET_ID_SCROLL_LEFT 60 -#define GADGET_ID_SCROLL_RIGHT 61 -#define GADGET_ID_SCROLL_HORIZONTAL 62 -#define GADGET_ID_SCROLL_VERTICAL 63 +#define GADGET_ID_SCROLL_UP 61 +#define GADGET_ID_SCROLL_DOWN 62 +#define GADGET_ID_SCROLL_LEFT 63 +#define GADGET_ID_SCROLL_RIGHT 64 +#define GADGET_ID_SCROLL_HORIZONTAL 65 +#define GADGET_ID_SCROLL_VERTICAL 66 /* gadgets for scrolling element list */ -#define GADGET_ID_ELEMENTLIST_UP 64 -#define GADGET_ID_ELEMENTLIST_DOWN 65 +#define GADGET_ID_ELEMENTLIST_UP 67 +#define GADGET_ID_ELEMENTLIST_DOWN 68 /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST 66 -#define GADGET_ID_ELEMENTLIST_LAST 105 +#define GADGET_ID_ELEMENTLIST_FIRST 69 +#define GADGET_ID_ELEMENTLIST_LAST 108 /* buttons for level settings */ -#define GADGET_ID_RANDOM_PERCENTAGE 106 -#define GADGET_ID_RANDOM_QUANTITY 107 -#define GADGET_ID_RANDOM_RESTRICTED 108 -#define GADGET_ID_DOUBLE_SPEED 109 -#define GADGET_ID_GRAVITY 110 -#define GADGET_ID_STICK_ELEMENT 111 +#define GADGET_ID_RANDOM_PERCENTAGE 109 +#define GADGET_ID_RANDOM_QUANTITY 110 +#define GADGET_ID_RANDOM_RESTRICTED 111 +#define GADGET_ID_DOUBLE_SPEED 112 +#define GADGET_ID_GRAVITY 113 +#define GADGET_ID_STICK_ELEMENT 114 /* another drawing area for random placement */ -#define GADGET_ID_RANDOM_BACKGROUND 112 +#define GADGET_ID_RANDOM_BACKGROUND 115 -#define NUM_EDITOR_GADGETS 113 +#define NUM_EDITOR_GADGETS 116 /* radio button numbers */ #define RADIO_NR_NONE 0 @@ -281,8 +284,9 @@ #define ED_COUNTER_ID_LEVEL_TIMELIMIT 5 #define ED_COUNTER_ID_LEVEL_TIMESCORE 6 #define ED_COUNTER_ID_LEVEL_RANDOM 7 +#define ED_COUNTER_ID_SELECT_LEVEL 8 -#define ED_NUM_COUNTERBUTTONS 8 +#define ED_NUM_COUNTERBUTTONS 9 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE #define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM @@ -459,6 +463,14 @@ static struct GADGET_ID_LEVEL_RANDOM_TEXT, &random_placement_value, "random element placement", "in" + }, + { + DX - SX - 1, 0 - SY + 31, + 1, 100, + GADGET_ID_SELECT_LEVEL_DOWN, GADGET_ID_SELECT_LEVEL_UP, + GADGET_ID_SELECT_LEVEL_TEXT, + &level_nr, + NULL, NULL } }; @@ -644,6 +656,8 @@ static int new_element3 = EL_ERDREICH; #define BUTTON_STEPSIZE(button) (button == 1 ? 1 : button == 2 ? 5 : 10) /* forward declaration for internal use */ +static void ModifyEditorCounter(int, int); +static void ModifyEditorCounterLimits(int, int, int); static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); @@ -1318,15 +1332,39 @@ static void CreateCounterButtons() counterbutton_info[i].gadget_id_up); int gd_xoffset; int gd_x, gd_x1, gd_x2, gd_y; + int x_size, y_size; unsigned long event_mask; char infotext[MAX_INFOTEXT_LEN + 1]; event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; - gd_xoffset = (j == 0 ? ED_BUTTON_MINUS_XPOS : ED_BUTTON_PLUS_XPOS); - gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset; - gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset; - gd_y = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS; + if (i == ED_COUNTER_ID_SELECT_LEVEL) + { + int sid = (j == 0 ? + ED_SCROLLBUTTON_ID_AREA_LEFT : + ED_SCROLLBUTTON_ID_AREA_RIGHT); + + event_mask |= GD_EVENT_RELEASED; + + if (j == 1) + xpos += ED_GADGET_DISTANCE; + ypos += ED_GADGET_DISTANCE; + + gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[sid].xpos; + gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE; + gd_y = DOOR_GFX_PAGEY1 + scrollbutton_info[sid].ypos; + x_size = ED_SCROLLBUTTON_XSIZE; + y_size = ED_SCROLLBUTTON_YSIZE; + } + else + { + gd_xoffset = (j == 0 ? ED_BUTTON_MINUS_XPOS : ED_BUTTON_PLUS_XPOS); + gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset; + gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset; + gd_y = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS; + x_size = ED_BUTTON_COUNT_XSIZE; + y_size = ED_BUTTON_COUNT_YSIZE; + } sprintf(infotext, "%s counter value by 1, 5 or 10", (j == 0 ? "decrease" : "increase")); @@ -1336,8 +1374,8 @@ static void CreateCounterButtons() GDI_INFO_TEXT, infotext, GDI_X, xpos, GDI_Y, ypos, - GDI_WIDTH, ED_BUTTON_COUNT_XSIZE, - GDI_HEIGHT, ED_BUTTON_COUNT_YSIZE, + GDI_WIDTH, x_size, + GDI_HEIGHT, y_size, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, GDI_STATE, GD_BUTTON_UNPRESSED, GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y, @@ -1357,8 +1395,19 @@ static void CreateCounterButtons() id = counterbutton_info[i].gadget_id_text; event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING; - gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS; - gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS; + if (i == ED_COUNTER_ID_SELECT_LEVEL) + { + xpos += ED_GADGET_DISTANCE; + ypos -= ED_GADGET_DISTANCE; + + gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS; + gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS; + } + else + { + gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS; + gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS; + } gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, @@ -1675,23 +1724,35 @@ void CreateLevelEditorGadgets() CreateCheckbuttonGadgets(); } +static void MapCounterButtons(int id) +{ + MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]); + MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_text]); + MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_up]); +} + static void MapControlButtons() { + int counter_id; int i; + /* map toolbox buttons */ for (i=0; ix < DX) + if (level_editor_gadget[i]->x < SX + SXSIZE) UnmapGadget(level_editor_gadget[i]); } @@ -1767,10 +1828,53 @@ void UnmapLevelEditorGadgets() UnmapGadget(level_editor_gadget[i]); } -void DrawLevelEd() +static void ResetUndoBuffer() +{ + undo_buffer_position = -1; + undo_buffer_steps = -1; + CopyLevelToUndoBuffer(UNDO_IMMEDIATE); +} + +static void DrawEditModeWindow() +{ + if (edit_mode == ED_MODE_INFO) + DrawLevelInfoWindow(); + else if (edit_mode == ED_MODE_PROPERTIES) + DrawPropertiesWindow(); + else /* edit_mode == ED_MODE_DRAWING */ + DrawDrawingWindow(); +} + +static boolean LevelChanged() { - edit_mode = ED_MODE_DRAWING; + boolean level_changed = FALSE; + int x, y; + + for(y=0; ycustom_id; + int counter_id = gi->custom_type_id; + int button = gi->event.button; + int *counter_value = counterbutton_info[counter_id].value; + int step = BUTTON_STEPSIZE(button) * + (gadget_id == counterbutton_info[counter_id].gadget_id_down ? -1 : +1); + int old_counter_value = *counter_value; + boolean released = (gi->event.type == GD_EVENT_RELEASED); + + if (LevelChanged()) + { + if (gi->event.type == GD_EVENT_PRESSED) + return; + + if (!Request("Level has changed! Discard changes ?", REQ_ASK)) + { + ModifyEditorCounter(counter_id, old_counter_value); + return; + } + } + else if (released) + return; + + if (gadget_id == counterbutton_info[counter_id].gadget_id_text) + *counter_value = gi->text.number_value; + else + ModifyEditorCounter(counter_id, *counter_value + step); + + LoadLevel(level_nr); + ResetUndoBuffer(); + DrawEditModeWindow(); +} + static void AdjustDrawingAreaGadgets() { int ed_xsize = lev_fieldx + 2; @@ -1985,6 +2129,14 @@ static void ModifyEditorCounter(int counter_id, int new_value) *counter_value = gi->text.number_value; } +static void ModifyEditorCounterLimits(int counter_id, int min, int max) +{ + int gadget_id = counterbutton_info[counter_id].gadget_id_text; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + + ModifyGadget(gi, GDI_NUMBER_MIN, min, GDI_NUMBER_MAX, max, GDI_END); +} + static void PickDrawingElement(int button, int element) { if (button < 1 || button > 3) @@ -2962,7 +3114,7 @@ static void CopyLevelToUndoBuffer(int mode) for(y=0; ytext.number_value; else @@ -3323,8 +3481,6 @@ static void HandleControlButtons(struct GadgetInfo *gi) int button = gi->event.button; int step = BUTTON_STEPSIZE(button); int new_element = BUTTON_ELEMENT(button); - int player_present = FALSE; - int level_changed = FALSE; int i, x, y; if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT) @@ -3552,19 +3708,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; } - for(y=0; ygems_still_needed,3), FS_SMALL, FC_YELLOW); DrawText(DX + XX_DYNAMITE, DY + YY_DYNAMITE, diff --git a/src/main.h b/src/main.h index 59f504f3..5f0a813a 100644 --- a/src/main.h +++ b/src/main.h @@ -544,6 +544,8 @@ extern char *element_info[]; #define FONT3_YSIZE 14 #define FONT4_XSIZE 16 #define FONT4_YSIZE 16 +#define FONT5_XSIZE 10 +#define FONT5_YSIZE 12 #define GFX_STARTX SX #define GFX_STARTY SY @@ -1294,6 +1296,7 @@ extern char *element_info[]; #define FC_YELLOW 3 #define FC_SPECIAL1 4 #define FC_SPECIAL2 5 +#define FC_SPECIAL3 6 /* values for game_status */ #define EXITGAME 0 diff --git a/src/screens.c b/src/screens.c index 3bf0c300..d494e99a 100644 --- a/src/screens.c +++ b/src/screens.c @@ -70,6 +70,9 @@ void DrawMainMenu() return; } + /* needed if last screen was the editor screen */ + UndrawSpecialEditorDoor(); + /* map gadgets for main menu screen */ MapTapeButtons(); @@ -130,7 +133,10 @@ void DrawMainMenu() OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); +#if 0 ClearEventQueue(); +#endif + } void HandleMainMenu(int mx, int my, int dx, int dy, int button) diff --git a/src/tools.c b/src/tools.c index 49e65e5c..39e327cc 100644 --- a/src/tools.c +++ b/src/tools.c @@ -316,12 +316,14 @@ void ClearWindow() void DrawTextFCentered(int y, int font_type, char *format, ...) { - char buffer[FULL_SXSIZE / FONT3_XSIZE + 10]; + char buffer[FULL_SXSIZE / FONT5_XSIZE + 10]; int font_xsize; va_list ap; font_xsize = (font_type < FC_SPECIAL1 ? FONT2_XSIZE : - font_type < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE); + font_type < FC_SPECIAL2 ? FONT3_XSIZE : + font_type < FC_SPECIAL3 ? FONT4_XSIZE : + FONT5_XSIZE); va_start(ap, format); vsprintf(buffer, format, ap); @@ -333,7 +335,7 @@ void DrawTextFCentered(int y, int font_type, char *format, ...) void DrawTextF(int x, int y, int font_type, char *format, ...) { - char buffer[FULL_SXSIZE / FONT3_XSIZE + 10]; + char buffer[FULL_SXSIZE / FONT5_XSIZE + 10]; va_list ap; va_start(ap, format); @@ -362,18 +364,26 @@ void DrawTextExt(Drawable d, GC gc, int x, int y, if (font_size != FS_SMALL && font_size != FS_BIG) font_size = FS_SMALL; - if (font_type < FC_RED || font_type > FC_SPECIAL2) + if (font_type < FC_RED || font_type > FC_SPECIAL3) font_type = FC_RED; font_width = (font_size == FS_BIG ? FONT1_XSIZE : font_type < FC_SPECIAL1 ? FONT2_XSIZE : - font_type < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE); - font_height = (font_size == FS_BIG ? FONT1_XSIZE : - font_type < FC_SPECIAL2 ? FONT2_XSIZE : FONT4_XSIZE); + font_type < FC_SPECIAL2 ? FONT3_XSIZE : + font_type < FC_SPECIAL3 ? FONT4_XSIZE : + FONT5_XSIZE); + font_height = (font_size == FS_BIG ? FONT1_YSIZE : + font_type < FC_SPECIAL1 ? FONT2_YSIZE : + font_type < FC_SPECIAL2 ? FONT3_YSIZE : + font_type < FC_SPECIAL3 ? FONT4_YSIZE : + FONT5_YSIZE); font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT); font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) * FONT_LINES_PER_FONT); + if (font_type == FC_SPECIAL3) + font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT + 3; + while (*text) { char c = *text++; @@ -1513,9 +1523,6 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y) { int x, y; - /* determine border element for this level */ - SetBorderElement(); - XFillRectangle(display, drawto, gc, xpos, ypos, MICROLEV_XSIZE, MICROLEV_YSIZE); @@ -1742,7 +1749,10 @@ boolean Request(char *text, unsigned int req_state) DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); OpenDoor(DOOR_OPEN_1); + +#if 0 ClearEventQueue(); +#endif if (!(req_state & REQUEST_WAIT_FOR)) return(FALSE); @@ -2071,7 +2081,33 @@ unsigned int MoveDoor(unsigned int door_state) if (door_state & DOOR_ACTION_2) door2 = door_state & DOOR_ACTION_2; - return(door1 | door2); + return (door1 | door2); +} + +void DrawSpecialEditorDoor() +{ + /* draw bigger toolbox window */ + XCopyArea(display, pix[PIX_DOOR], drawto, gc, + DOOR_GFX_PAGEX7, 60, 108, 56, EX - 4, EY - 12); + + /* draw background for level selection gadgets */ + XCopyArea(display, pix[PIX_DOOR], drawto, gc, + DOOR_GFX_PAGEX7, 0, 108, 60, EX - 4, 0); + + redraw_mask |= REDRAW_ALL; +} + +void UndrawSpecialEditorDoor() +{ + /* draw normal tape recorder window */ + XCopyArea(display, pix[PIX_BACK], drawto, gc, + 562, 344, 108, 56, EX - 4, EY - 12); + + /* draw game title */ + XCopyArea(display, pix[PIX_BACK], drawto, gc, + 562, 0, 108, 60, EX - 4, 0); + + redraw_mask |= REDRAW_ALL; } int ReadPixel(Drawable d, int x, int y) @@ -2188,6 +2224,11 @@ static struct } }; +static void DoNotDisplayInfoText(void *ptr) +{ + return; +} + void CreateToolButtons() { int i; @@ -2235,6 +2276,7 @@ void CreateToolButtons() GDI_DECORATION_SHIFTING, 1, 1, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleToolButtons, + GDI_CALLBACK_INFO, DoNotDisplayInfoText, GDI_END); if (gi == NULL) diff --git a/src/tools.h b/src/tools.h index 7878a283..9ec88df2 100644 --- a/src/tools.h +++ b/src/tools.h @@ -105,6 +105,8 @@ unsigned int OpenDoor(unsigned int); unsigned int CloseDoor(unsigned int); unsigned int GetDoorState(void); unsigned int MoveDoor(unsigned int); +void DrawSpecialEditorDoor(); +void UndrawSpecialEditorDoor(); int ReadPixel(Drawable, int, int); void CreateToolButtons(); -- 2.34.1 From 4c8c9d74169f09d9b21e3ea0d826b60cda37caaa Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 22 Feb 1999 00:56:34 +0100 Subject: [PATCH 04/16] rnd-19990222-1-src --- src/buttons.c | 101 ++++++++----- src/buttons.h | 59 ++++---- src/editor.c | 409 +++++++++++++++++++++++++++----------------------- src/game.c | 18 +-- src/main.h | 2 +- src/tools.c | 68 ++++----- src/tools.h | 2 + 7 files changed, 350 insertions(+), 309 deletions(-) diff --git a/src/buttons.c b/src/buttons.c index 78e28d16..4844f2fe 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -362,8 +362,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) char cursor_letter; char cursor_string[3]; char text[MAX_GADGET_TEXTSIZE + 1]; - int font_color = FC_YELLOW; - int border = gi->design_border; + int font_type = gi->text.font_type; + int font_width = getFontWidth(FS_SMALL, font_type); + int border = gi->border.size; strcpy(text, gi->text.value); strcat(text, " "); @@ -374,16 +375,16 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* middle part of gadget */ for (i=0; i<=gi->text.size; i++) XCopyArea(display, gd->pixmap, drawto, gc, - gd->x + border, gd->y, FONT2_XSIZE, gi->height, - gi->x + border + i * FONT2_XSIZE, gi->y); + gd->x + border, gd->y, font_width, gi->height, + gi->x + border + i * font_width, gi->y); /* right part of gadget */ XCopyArea(display, gd->pixmap, drawto, gc, - gd->x + ED_WIN_COUNT_XSIZE - border, gd->y, + gd->x + gi->border.width - border, gd->y, border, gi->height, gi->x + gi->width - border, gi->y); /* gadget text value */ - DrawText(gi->x + border, gi->y + border, text, FS_SMALL, font_color); + DrawText(gi->x + border, gi->y + border, text, FS_SMALL, font_type); cursor_letter = gi->text.value[gi->text.cursor_position]; cursor_string[0] = '~'; @@ -392,8 +393,8 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* draw cursor, if active */ if (pressed) - DrawText(gi->x + border + gi->text.cursor_position * FONT2_XSIZE, - gi->y + border, cursor_string, FS_SMALL, font_color); + DrawText(gi->x + border + gi->text.cursor_position * font_width, + gi->y + border, cursor_string, FS_SMALL, font_type); } break; @@ -403,9 +404,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) int xpos = gi->x; int ypos = gi->y + gi->scrollbar.position; int design_full = gi->width; - int design_body = design_full - 2 * gi->design_border; + int design_body = design_full - 2 * gi->border.size; int size_full = gi->scrollbar.size; - int size_body = size_full - 2 * gi->design_border; + int size_body = size_full - 2 * gi->border.size; int num_steps = size_body / design_body; int step_size_remain = size_body - num_steps * design_body; @@ -416,28 +417,28 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* upper part of gadget */ XCopyArea(display, gd->pixmap, drawto, gc, gd->x, gd->y, - gi->width, gi->design_border, + gi->width, gi->border.size, xpos, ypos); /* middle part of gadget */ for (i=0; ipixmap, drawto, gc, - gd->x, gd->y + gi->design_border, + gd->x, gd->y + gi->border.size, gi->width, design_body, - xpos, ypos + gi->design_border + i * design_body); + xpos, ypos + gi->border.size + i * design_body); /* remaining middle part of gadget */ if (step_size_remain > 0) XCopyArea(display, gd->pixmap, drawto, gc, - gd->x, gd->y + gi->design_border, + gd->x, gd->y + gi->border.size, gi->width, step_size_remain, - xpos, ypos + gi->design_border + num_steps * design_body); + xpos, ypos + gi->border.size + num_steps * design_body); /* lower part of gadget */ XCopyArea(display, gd->pixmap, drawto, gc, - gd->x, gd->y + design_full - gi->design_border, - gi->width, gi->design_border, - xpos, ypos + size_full - gi->design_border); + gd->x, gd->y + design_full - gi->border.size, + gi->width, gi->border.size, + xpos, ypos + size_full - gi->border.size); } break; @@ -447,9 +448,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) int xpos = gi->x + gi->scrollbar.position; int ypos = gi->y; int design_full = gi->height; - int design_body = design_full - 2 * gi->design_border; + int design_body = design_full - 2 * gi->border.size; int size_full = gi->scrollbar.size; - int size_body = size_full - 2 * gi->design_border; + int size_body = size_full - 2 * gi->border.size; int num_steps = size_body / design_body; int step_size_remain = size_body - num_steps * design_body; @@ -460,28 +461,28 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* left part of gadget */ XCopyArea(display, gd->pixmap, drawto, gc, gd->x, gd->y, - gi->design_border, gi->height, + gi->border.size, gi->height, xpos, ypos); /* middle part of gadget */ for (i=0; ipixmap, drawto, gc, - gd->x + gi->design_border, gd->y, + gd->x + gi->border.size, gd->y, design_body, gi->height, - xpos + gi->design_border + i * design_body, ypos); + xpos + gi->border.size + i * design_body, ypos); /* remaining middle part of gadget */ if (step_size_remain > 0) XCopyArea(display, gd->pixmap, drawto, gc, - gd->x + gi->design_border, gd->y, + gd->x + gi->border.size, gd->y, step_size_remain, gi->height, - xpos + gi->design_border + num_steps * design_body, ypos); + xpos + gi->border.size + num_steps * design_body, ypos); /* right part of gadget */ XCopyArea(display, gd->pixmap, drawto, gc, - gd->x + design_full - gi->design_border, gd->y, - gi->design_border, gi->height, - xpos + size_full - gi->design_border, ypos); + gd->x + design_full - gi->border.size, gd->y, + gi->border.size, gi->height, + xpos + size_full - gi->border.size, ypos); } break; @@ -599,15 +600,13 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) gi->text.size = max_textsize; gi->text.value[max_textsize] = '\0'; - - if (gi->width == 0 && gi->height == 0) - { - gi->width = (gi->text.size + 1) * FONT2_XSIZE + 6; - gi->height = ED_WIN_COUNT_YSIZE; - } } break; + case GDI_TEXT_FONT: + gi->text.font_type = va_arg(ap, int); + break; + case GDI_DESIGN_UNPRESSED: gi->design[GD_BUTTON_UNPRESSED].pixmap = va_arg(ap, Pixmap); gi->design[GD_BUTTON_UNPRESSED].x = va_arg(ap, int); @@ -632,8 +631,12 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) gi->alt_design[GD_BUTTON_PRESSED].y = va_arg(ap, int); break; - case GDI_DESIGN_BORDER: - gi->design_border = va_arg(ap, int); + case GDI_BORDER_SIZE: + gi->border.size = va_arg(ap, int); + break; + + case GDI_TEXTINPUT_DESIGN_WIDTH: + gi->border.width = va_arg(ap, int); break; case GDI_DECORATION_DESIGN: @@ -734,6 +737,15 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) /* adjust gadget values in relation to other gadget values */ + if (gi->type & GD_TYPE_TEXTINPUT) + { + int font_width = getFontWidth(FS_SMALL, gi->text.font_type); + int font_height = getFontHeight(FS_SMALL, gi->text.font_type); + + gi->width = 2 * gi->border.size + (gi->text.size + 1) * font_width; + gi->height = 2 * gi->border.size + font_height; + } + if (gi->type & GD_TYPE_TEXTINPUT_NUMERIC) { struct GadgetTextInput *text = &gi->text; @@ -760,6 +772,7 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) gs->size = gs->size_max * gs->items_visible / gs->items_max; gs->position = gs->size_max * gs->item_position / gs->items_max; gs->position_max = gs->size_max - gs->size; + gs->correction = gs->size_max / gs->items_max / 2; /* finetuning for maximal right/bottom position */ if (gs->item_position == gs->items_max - gs->items_visible) @@ -992,7 +1005,9 @@ void HandleGadgets(int mx, int my, int button) if (new_gi == last_gi) { /* if mouse button pressed inside activated text gadget, set cursor */ - gi->text.cursor_position = (mx - gi->x) / FONT2_XSIZE; + gi->text.cursor_position = + (mx - gi->x - gi->border.size) / + getFontWidth(FS_SMALL, gi->text.font_type); if (gi->text.cursor_position < 0) gi->text.cursor_position = 0; @@ -1007,6 +1022,8 @@ void HandleGadgets(int mx, int my, int button) CheckRangeOfNumericInputGadget(gi); DrawGadget(gi, DG_UNPRESSED, DG_DIRECT); + gi->event.type = GD_EVENT_TEXT_LEAVING; + if (gi->event_mask & GD_EVENT_TEXT_LEAVING) gi->callback_action(gi); @@ -1213,7 +1230,13 @@ void HandleGadgets(int mx, int my, int button) if (gs->position > gs->position_max) gs->position = gs->position_max; - gs->item_position = gs->items_max * gs->position / gs->size_max; + gs->item_position = + gs->items_max * (gs->position + gs->correction) / gs->size_max; + + if (gs->item_position < 0) + gs->item_position = 0; + if (gs->item_position > gs->items_max - 1) + gs->item_position = gs->items_max - 1; if (old_item_position != gs->item_position) { @@ -1314,6 +1337,8 @@ void HandleGadgetsKeyInput(KeySym key) CheckRangeOfNumericInputGadget(gi); DrawGadget(gi, DG_UNPRESSED, DG_DIRECT); + gi->event.type = GD_EVENT_TEXT_RETURN; + if (gi->event_mask & GD_EVENT_TEXT_RETURN) gi->callback_action(gi); diff --git a/src/buttons.h b/src/buttons.h index cd8db0ef..f3d93c89 100644 --- a/src/buttons.h +++ b/src/buttons.h @@ -83,15 +83,6 @@ void DrawCompleteVideoDisplay(void); /* NEW GADGET STUFF -------------------------------------------------------- */ -/* some values for gadget graphics (also used by editor.c) */ -#define ED_BUTTON_COUNT_YPOS 60 -#define ED_BUTTON_COUNT_XSIZE 20 -#define ED_BUTTON_COUNT_YSIZE 20 -#define ED_WIN_COUNT_XPOS (2 + ED_BUTTON_COUNT_XSIZE + 2) -#define ED_WIN_COUNT_YPOS ED_BUTTON_COUNT_YPOS -#define ED_WIN_COUNT_XSIZE 52 -#define ED_WIN_COUNT_YSIZE ED_BUTTON_COUNT_YSIZE - /* gadget types */ #define GD_TYPE_NORMAL_BUTTON (1 << 0) #define GD_TYPE_CHECK_BUTTON (1 << 1) @@ -144,28 +135,36 @@ void DrawCompleteVideoDisplay(void); #define GDI_NUMBER_MAX 13 #define GDI_TEXT_VALUE 14 #define GDI_TEXT_SIZE 15 -#define GDI_DESIGN_UNPRESSED 16 -#define GDI_DESIGN_PRESSED 17 -#define GDI_ALT_DESIGN_UNPRESSED 18 -#define GDI_ALT_DESIGN_PRESSED 19 -#define GDI_DESIGN_BORDER 20 -#define GDI_DECORATION_DESIGN 21 -#define GDI_DECORATION_POSITION 22 -#define GDI_DECORATION_SIZE 23 -#define GDI_DECORATION_SHIFTING 24 -#define GDI_EVENT_MASK 25 -#define GDI_EVENT 26 -#define GDI_CALLBACK_INFO 27 -#define GDI_CALLBACK_ACTION 28 -#define GDI_AREA_SIZE 29 -#define GDI_ITEM_SIZE 30 -#define GDI_SCROLLBAR_ITEMS_MAX 31 -#define GDI_SCROLLBAR_ITEMS_VISIBLE 32 -#define GDI_SCROLLBAR_ITEM_POSITION 33 -#define GDI_INFO_TEXT 34 +#define GDI_TEXT_FONT 16 +#define GDI_DESIGN_UNPRESSED 17 +#define GDI_DESIGN_PRESSED 18 +#define GDI_ALT_DESIGN_UNPRESSED 19 +#define GDI_ALT_DESIGN_PRESSED 20 +#define GDI_BORDER_SIZE 21 +#define GDI_TEXTINPUT_DESIGN_WIDTH 22 +#define GDI_DECORATION_DESIGN 23 +#define GDI_DECORATION_POSITION 24 +#define GDI_DECORATION_SIZE 25 +#define GDI_DECORATION_SHIFTING 26 +#define GDI_EVENT_MASK 27 +#define GDI_EVENT 28 +#define GDI_CALLBACK_INFO 29 +#define GDI_CALLBACK_ACTION 30 +#define GDI_AREA_SIZE 31 +#define GDI_ITEM_SIZE 32 +#define GDI_SCROLLBAR_ITEMS_MAX 33 +#define GDI_SCROLLBAR_ITEMS_VISIBLE 34 +#define GDI_SCROLLBAR_ITEM_POSITION 35 +#define GDI_INFO_TEXT 36 typedef void (*gadget_function)(void *); +struct GadgetBorder +{ + int size; /* size of gadget border */ + int width; /* for text input gadgets */ +}; + struct GadgetDesign { Pixmap pixmap; /* Pixmap with gadget surface */ @@ -203,6 +202,7 @@ struct GadgetTextInput int number_max; /* maximal allowed numeric value */ int size; /* maximal size of input text */ int cursor_position; /* actual cursor position */ + int font_type; /* font to use for text input */ }; struct GadgetScrollbar @@ -215,6 +215,7 @@ struct GadgetScrollbar int position; /* scrollbar position on screen */ int position_max; /* bottom/right scrollbar position */ int drag_position; /* drag position on scrollbar */ + int correction; /* scrollbar position correction */ }; struct GadgetInfo @@ -230,10 +231,10 @@ struct GadgetInfo boolean checked; /* check/radio button state */ int radio_nr; /* number of radio button series */ boolean mapped; /* gadget is active */ + struct GadgetBorder border; /* gadget border design */ struct GadgetDesign design[2]; /* 0: normal; 1: pressed */ struct GadgetDesign alt_design[2]; /* alternative design */ struct GadgetDecoration deco; /* decoration on top of gadget */ - int design_border; /* border size of gadget decoration */ unsigned long event_mask; /* possible events for this gadget */ struct GadgetEvent event; /* actual gadget event */ gadget_function callback_info; /* function for pop-up info text */ diff --git a/src/editor.c b/src/editor.c index d5233e26..fd269219 100644 --- a/src/editor.c +++ b/src/editor.c @@ -23,14 +23,12 @@ #include "tape.h" /* positions in the level editor */ -#define ED_WIN_MB_LEFT_XPOS 7 -#define ED_WIN_MB_LEFT_YPOS 6 -#define ED_WIN_LEVELNR_XPOS 77 -#define ED_WIN_LEVELNR_YPOS 7 -#define ED_WIN_MB_MIDDLE_XPOS 7 -#define ED_WIN_MB_MIDDLE_YPOS 258 -#define ED_WIN_MB_RIGHT_XPOS 77 -#define ED_WIN_MB_RIGHT_YPOS 258 +#define ED_WIN_MB_LEFT_XPOS 6 +#define ED_WIN_MB_LEFT_YPOS 258 +#define ED_WIN_MB_MIDDLE_XPOS 42 +#define ED_WIN_MB_MIDDLE_YPOS ED_WIN_MB_LEFT_YPOS +#define ED_WIN_MB_RIGHT_XPOS 78 +#define ED_WIN_MB_RIGHT_YPOS ED_WIN_MB_LEFT_YPOS /* other constants for the editor */ #define ED_SCROLL_NO 0 @@ -72,21 +70,12 @@ #define ED_NUM_CTRL_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS) /* values for the element list */ -#define ED_ELEMENTLIST_UP_XPOS 35 -#define ED_ELEMENTLIST_UP_YPOS 5 -#define ED_ELEMENTLIST_UP_ALT_YPOS 140 -#define ED_ELEMENTLIST_DOWN_XPOS 35 -#define ED_ELEMENTLIST_DOWN_YPOS 250 -#define ED_ELEMENTLIST_DOWN_ALT_YPOS 165 -#define ED_ELEMENTLIST_UPDOWN_XSIZE 30 -#define ED_ELEMENTLIST_UPDOWN_YSIZE 25 -#define ED_ELEMENTLIST_XPOS 6 +#define ED_ELEMENTLIST_XPOS 5 #define ED_ELEMENTLIST_YPOS 30 -#define ED_ELEMENTLIST_ALT_YPOS 190 -#define ED_ELEMENTLIST_XSIZE 22 -#define ED_ELEMENTLIST_YSIZE 22 +#define ED_ELEMENTLIST_XSIZE 20 +#define ED_ELEMENTLIST_YSIZE 20 #define ED_ELEMENTLIST_BUTTONS_HORIZ 4 -#define ED_ELEMENTLIST_BUTTONS_VERT 10 +#define ED_ELEMENTLIST_BUTTONS_VERT 11 #define ED_NUM_ELEMENTLIST_BUTTONS (ED_ELEMENTLIST_BUTTONS_HORIZ * \ ED_ELEMENTLIST_BUTTONS_VERT) @@ -120,7 +109,7 @@ #define ED_AREA_RANDOM_BACKGROUND_XPOS (29 * MINI_TILEX) #define ED_AREA_RANDOM_BACKGROUND_YPOS (31 * MINI_TILEY) -/* values for scrolling gadgets */ +/* values for scrolling gadgets for drawing area */ #define ED_SCROLLBUTTON_XPOS 24 #define ED_SCROLLBUTTON_YPOS 0 #define ED_SCROLLBAR_XPOS 24 @@ -146,13 +135,38 @@ #define ED_SCROLL_VERTICAL_XSIZE ED_SCROLLBUTTON_XSIZE #define ED_SCROLL_VERTICAL_YSIZE (SYSIZE - 4 * ED_SCROLLBUTTON_YSIZE) +/* values for scrolling gadgets for element list */ +#define ED_SCROLLBUTTON2_XPOS 50 +#define ED_SCROLLBUTTON2_YPOS 0 +#define ED_SCROLLBAR2_XPOS 50 +#define ED_SCROLLBAR2_YPOS 20 + +#define ED_SCROLLBUTTON2_XSIZE 10 +#define ED_SCROLLBUTTON2_YSIZE 10 + +#define ED_SCROLL2_UP_XPOS 85 +#define ED_SCROLL2_UP_YPOS 30 +#define ED_SCROLL2_DOWN_XPOS ED_SCROLL2_UP_XPOS +#define ED_SCROLL2_DOWN_YPOS (ED_SCROLL2_UP_YPOS + \ + ED_ELEMENTLIST_BUTTONS_VERT * \ + ED_ELEMENTLIST_YSIZE - \ + ED_SCROLLBUTTON2_YSIZE) +#define ED_SCROLL2_VERTICAL_XPOS ED_SCROLL2_UP_XPOS +#define ED_SCROLL2_VERTICAL_YPOS (ED_SCROLL2_UP_YPOS + \ + ED_SCROLLBUTTON2_YSIZE) +#define ED_SCROLL2_VERTICAL_XSIZE ED_SCROLLBUTTON2_XSIZE +#define ED_SCROLL2_VERTICAL_YSIZE (ED_ELEMENTLIST_BUTTONS_VERT * \ + ED_ELEMENTLIST_YSIZE - \ + 2 * ED_SCROLLBUTTON2_YSIZE) + /* values for checkbutton gadgets */ #define ED_CHECKBUTTON_XSIZE ED_BUTTON_COUNT_XSIZE #define ED_CHECKBUTTON_YSIZE ED_BUTTON_COUNT_YSIZE #define ED_CHECKBUTTON_UNCHECKED_XPOS ED_BUTTON_MINUS_XPOS #define ED_CHECKBUTTON_CHECKED_XPOS ED_BUTTON_PLUS_XPOS #define ED_CHECKBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 22) -#define ED_STICKYBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 88) +#define ED_RADIOBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 44) +#define ED_STICKYBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 66) /* some positions in the editor control window */ #define ED_BUTTON_ELEM_XPOS 6 @@ -160,6 +174,19 @@ #define ED_BUTTON_ELEM_XSIZE 22 #define ED_BUTTON_ELEM_YSIZE 22 +/* some values for text input and counter gadgets */ +#define ED_BUTTON_COUNT_YPOS 60 +#define ED_BUTTON_COUNT_XSIZE 20 +#define ED_BUTTON_COUNT_YSIZE 20 +#define ED_WIN_COUNT_XPOS (2 + ED_BUTTON_COUNT_XSIZE + 2) +#define ED_WIN_COUNT_YPOS ED_BUTTON_COUNT_YPOS +#define ED_WIN_COUNT_XSIZE 52 +#define ED_WIN_COUNT_YSIZE ED_BUTTON_COUNT_YSIZE +#define ED_WIN_COUNT2_XPOS 27 +#define ED_WIN_COUNT2_YPOS 3 +#define ED_WIN_COUNT2_XSIZE 46 +#define ED_WIN_COUNT2_YSIZE ED_BUTTON_COUNT_YSIZE + #define ED_BUTTON_MINUS_XPOS 2 #define ED_BUTTON_MINUS_YPOS ED_BUTTON_COUNT_YPOS #define ED_BUTTON_MINUS_XSIZE ED_BUTTON_COUNT_XSIZE @@ -250,25 +277,26 @@ #define GADGET_ID_SCROLL_VERTICAL 66 /* gadgets for scrolling element list */ -#define GADGET_ID_ELEMENTLIST_UP 67 -#define GADGET_ID_ELEMENTLIST_DOWN 68 - -/* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST 69 -#define GADGET_ID_ELEMENTLIST_LAST 108 +#define GADGET_ID_SCROLL_LIST_UP 67 +#define GADGET_ID_SCROLL_LIST_DOWN 68 +#define GADGET_ID_SCROLL_LIST_VERTICAL 69 /* buttons for level settings */ -#define GADGET_ID_RANDOM_PERCENTAGE 109 -#define GADGET_ID_RANDOM_QUANTITY 110 -#define GADGET_ID_RANDOM_RESTRICTED 111 -#define GADGET_ID_DOUBLE_SPEED 112 -#define GADGET_ID_GRAVITY 113 -#define GADGET_ID_STICK_ELEMENT 114 +#define GADGET_ID_RANDOM_PERCENTAGE 70 +#define GADGET_ID_RANDOM_QUANTITY 71 +#define GADGET_ID_RANDOM_RESTRICTED 72 +#define GADGET_ID_DOUBLE_SPEED 73 +#define GADGET_ID_GRAVITY 74 +#define GADGET_ID_STICK_ELEMENT 75 /* another drawing area for random placement */ -#define GADGET_ID_RANDOM_BACKGROUND 115 +#define GADGET_ID_RANDOM_BACKGROUND 76 + +/* gadgets for buttons in element list */ +#define GADGET_ID_ELEMENTLIST_FIRST 77 +#define GADGET_ID_ELEMENTLIST_LAST (77 + ED_NUM_ELEMENTLIST_BUTTONS - 1) -#define NUM_EDITOR_GADGETS 116 +#define NUM_EDITOR_GADGETS (GADGET_ID_ELEMENTLIST_LAST + 1) /* radio button numbers */ #define RADIO_NR_NONE 0 @@ -305,10 +333,14 @@ #define ED_SCROLLBUTTON_ID_AREA_LAST ED_SCROLLBUTTON_ID_AREA_RIGHT /* values for scrollbar gadgets */ -#define ED_SCROLLBAR_ID_HORIZONTAL 0 -#define ED_SCROLLBAR_ID_VERTICAL 1 +#define ED_SCROLLBAR_ID_AREA_HORIZONTAL 0 +#define ED_SCROLLBAR_ID_AREA_VERTICAL 1 +#define ED_SCROLLBAR_ID_LIST_VERTICAL 2 -#define ED_NUM_SCROLLBARS 2 +#define ED_NUM_SCROLLBARS 3 + +#define ED_SCROLLBAR_ID_AREA_FIRST ED_SCROLLBAR_ID_AREA_HORIZONTAL +#define ED_SCROLLBAR_ID_AREA_LAST ED_SCROLLBAR_ID_AREA_VERTICAL /* values for text input gadgets */ #define ED_TEXTINPUT_ID_LEVEL_NAME 0 @@ -465,7 +497,7 @@ static struct "random element placement", "in" }, { - DX - SX - 1, 0 - SY + 31, + DX + 5 - SX, DY + 3 - SY, 1, 100, GADGET_ID_SELECT_LEVEL_DOWN, GADGET_ID_SELECT_LEVEL_UP, GADGET_ID_SELECT_LEVEL_TEXT, @@ -532,15 +564,15 @@ static struct "scroll level editing area right" }, { - ED_ELEMENTLIST_UP_XPOS, ED_ELEMENTLIST_UP_ALT_YPOS, - ED_ELEMENTLIST_UP_XPOS, ED_ELEMENTLIST_UP_YPOS, - GADGET_ID_ELEMENTLIST_UP, + ED_SCROLLBUTTON2_XPOS, ED_SCROLLBUTTON2_YPOS + 0 * ED_SCROLLBUTTON2_YSIZE, + ED_SCROLL2_UP_XPOS, ED_SCROLL2_UP_YPOS, + GADGET_ID_SCROLL_LIST_UP, "scroll element list up ('Page Up')" }, { - ED_ELEMENTLIST_DOWN_XPOS, ED_ELEMENTLIST_DOWN_ALT_YPOS, - ED_ELEMENTLIST_DOWN_XPOS, ED_ELEMENTLIST_DOWN_YPOS, - GADGET_ID_ELEMENTLIST_DOWN, + ED_SCROLLBUTTON2_XPOS, ED_SCROLLBUTTON2_YPOS + 1 * ED_SCROLLBUTTON2_YSIZE, + ED_SCROLL2_DOWN_XPOS, ED_SCROLL2_DOWN_YPOS, + GADGET_ID_SCROLL_LIST_DOWN, "scroll element list down ('Page Down')" } }; @@ -556,20 +588,28 @@ static struct } scrollbar_info[ED_NUM_SCROLLBARS] = { { - ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS, - ED_SCROLL_HORIZONTAL_XPOS, ED_SCROLL_HORIZONTAL_YPOS, - ED_SCROLL_HORIZONTAL_XSIZE, ED_SCROLL_HORIZONTAL_YSIZE, + ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS, + SX + ED_SCROLL_HORIZONTAL_XPOS, SY + ED_SCROLL_HORIZONTAL_YPOS, + ED_SCROLL_HORIZONTAL_XSIZE, ED_SCROLL_HORIZONTAL_YSIZE, GD_TYPE_SCROLLBAR_HORIZONTAL, GADGET_ID_SCROLL_HORIZONTAL, "scroll level editing area horizontally" }, { - ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS, - ED_SCROLL_VERTICAL_XPOS, ED_SCROLL_VERTICAL_YPOS, - ED_SCROLL_VERTICAL_XSIZE, ED_SCROLL_VERTICAL_YSIZE, + ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS, + SX + ED_SCROLL_VERTICAL_XPOS, SY + ED_SCROLL_VERTICAL_YPOS, + ED_SCROLL_VERTICAL_XSIZE, ED_SCROLL_VERTICAL_YSIZE, GD_TYPE_SCROLLBAR_VERTICAL, GADGET_ID_SCROLL_VERTICAL, "scroll level editing area vertically" + }, + { + ED_SCROLLBAR2_XPOS, ED_SCROLLBAR2_YPOS, + DX + ED_SCROLL2_VERTICAL_XPOS, DY + ED_SCROLL2_VERTICAL_YPOS, + ED_SCROLL2_VERTICAL_XSIZE, ED_SCROLL2_VERTICAL_YSIZE, + GD_TYPE_SCROLLBAR_VERTICAL, + GADGET_ID_SCROLL_LIST_VERTICAL, + "scroll element list vertically" } }; @@ -1217,17 +1257,17 @@ static void CreateControlButtons() event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; - if (id == GADGET_ID_ELEMENTLIST_UP || - id == GADGET_ID_ELEMENTLIST_DOWN) + if (id == GADGET_ID_SCROLL_LIST_UP || + id == GADGET_ID_SCROLL_LIST_DOWN) { x += DX; y += DY; - width = ED_ELEMENTLIST_UPDOWN_XSIZE; - height = ED_ELEMENTLIST_UPDOWN_YSIZE; - gd_x1 = DOOR_GFX_PAGEX6 + scrollbutton_info[i].xpos; - gd_y1 = DOOR_GFX_PAGEY1 + scrollbutton_info[i].y; - gd_x2 = gd_x1; - gd_y2 = DOOR_GFX_PAGEY1 + scrollbutton_info[i].ypos; + width = ED_SCROLLBUTTON2_XSIZE; + height = ED_SCROLLBUTTON2_YSIZE; + gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[i].xpos; + gd_y1 = DOOR_GFX_PAGEY1 + scrollbutton_info[i].ypos; + gd_x2 = gd_x1 - ED_SCROLLBUTTON2_XSIZE; + gd_y2 = gd_y1; } else { @@ -1268,7 +1308,7 @@ static void CreateControlButtons() Pixmap deco_pixmap; int deco_x, deco_y, deco_xpos, deco_ypos; int gd_xoffset, gd_yoffset; - int gd_x, gd_y1, gd_y2; + int gd_x1, gd_x2, gd_y; int x = i % ED_ELEMENTLIST_BUTTONS_HORIZ; int y = i / ED_ELEMENTLIST_BUTTONS_HORIZ; int id = GADGET_ID_ELEMENTLIST_FIRST + i; @@ -1278,9 +1318,9 @@ static void CreateControlButtons() gd_xoffset = ED_ELEMENTLIST_XPOS + x * ED_ELEMENTLIST_XSIZE; gd_yoffset = ED_ELEMENTLIST_YPOS + y * ED_ELEMENTLIST_YSIZE; - gd_x = DOOR_GFX_PAGEX6 + ED_ELEMENTLIST_XPOS; - gd_y1 = DOOR_GFX_PAGEY1 + ED_ELEMENTLIST_YPOS; - gd_y2 = DOOR_GFX_PAGEY1 + ED_ELEMENTLIST_ALT_YPOS; + gd_x1 = DOOR_GFX_PAGEX6 + ED_ELEMENTLIST_XPOS + ED_ELEMENTLIST_XSIZE; + gd_x2 = DOOR_GFX_PAGEX6 + ED_ELEMENTLIST_XPOS; + gd_y = DOOR_GFX_PAGEY1 + ED_ELEMENTLIST_YPOS; getMiniGraphicSource(el2gfx(editor_element[i]), &deco_pixmap, &deco_x, &deco_y); @@ -1296,8 +1336,8 @@ static void CreateControlButtons() GDI_HEIGHT, ED_ELEMENTLIST_YSIZE, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, GDI_STATE, GD_BUTTON_UNPRESSED, - GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x, gd_y1, - GDI_DESIGN_PRESSED, gd_pixmap, gd_x, gd_y2, + GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y, + GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y, GDI_DECORATION_DESIGN, deco_pixmap, deco_x, deco_y, GDI_DECORATION_POSITION, deco_xpos, deco_ypos, GDI_DECORATION_SIZE, MINI_TILEX, MINI_TILEY, @@ -1347,7 +1387,7 @@ static void CreateCounterButtons() event_mask |= GD_EVENT_RELEASED; if (j == 1) - xpos += ED_GADGET_DISTANCE; + xpos += 2 * ED_GADGET_DISTANCE; ypos += ED_GADGET_DISTANCE; gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[sid].xpos; @@ -1392,16 +1432,22 @@ static void CreateCounterButtons() if (j == 0) { + int font_type = FC_YELLOW; + int gd_width = ED_WIN_COUNT_XSIZE; + id = counterbutton_info[i].gadget_id_text; event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING; if (i == ED_COUNTER_ID_SELECT_LEVEL) { - xpos += ED_GADGET_DISTANCE; + font_type = FC_SPECIAL3; + + xpos += 2 * ED_GADGET_DISTANCE; ypos -= ED_GADGET_DISTANCE; - gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS; - gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS; + gd_x = DOOR_GFX_PAGEX6 + ED_WIN_COUNT2_XPOS; + gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT2_YPOS; + gd_width = ED_WIN_COUNT2_XSIZE; } else { @@ -1419,9 +1465,11 @@ static void CreateCounterButtons() GDI_NUMBER_MIN, counterbutton_info[i].min_value, GDI_NUMBER_MAX, counterbutton_info[i].max_value, GDI_TEXT_SIZE, 3, + GDI_TEXT_FONT, font_type, GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x, gd_y, GDI_DESIGN_PRESSED, gd_pixmap, gd_x, gd_y, - GDI_DESIGN_BORDER, ED_BORDER_SIZE, + GDI_BORDER_SIZE, ED_BORDER_SIZE, + GDI_TEXTINPUT_DESIGN_WIDTH, gd_width, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleCounterButtons, GDI_END); @@ -1560,9 +1608,11 @@ static void CreateTextInputGadgets() GDI_TYPE, GD_TYPE_TEXTINPUT_ALPHANUMERIC, GDI_TEXT_VALUE, textinput_info[i].value, GDI_TEXT_SIZE, textinput_info[i].size, + GDI_TEXT_FONT, FC_YELLOW, GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x, gd_y, GDI_DESIGN_PRESSED, gd_pixmap, gd_x, gd_y, - GDI_DESIGN_BORDER, ED_BORDER_SIZE, + GDI_BORDER_SIZE, ED_BORDER_SIZE, + GDI_TEXTINPUT_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleTextInputGadgets, GDI_END); @@ -1587,31 +1637,41 @@ static void CreateScrollbarGadgets() int items_max, items_visible, item_position; unsigned long event_mask; - if (scrollbar_info[i].type == GD_TYPE_SCROLLBAR_HORIZONTAL) + if (i == ED_SCROLLBAR_ID_LIST_VERTICAL) { - items_max = MAX(lev_fieldx + 2, ed_fieldx); - items_visible = ed_fieldx; + items_max = elements_in_list / ED_ELEMENTLIST_BUTTONS_HORIZ; + items_visible = ED_ELEMENTLIST_BUTTONS_VERT; item_position = 0; } - else + else /* drawing area scrollbars */ { - items_max = MAX(lev_fieldy + 2, ed_fieldy); - items_visible = ed_fieldy; - item_position = 0; + if (scrollbar_info[i].type == GD_TYPE_SCROLLBAR_HORIZONTAL) + { + items_max = MAX(lev_fieldx + 2, ed_fieldx); + items_visible = ed_fieldx; + item_position = 0; + } + else + { + items_max = MAX(lev_fieldy + 2, ed_fieldy); + items_visible = ed_fieldy; + item_position = 0; + } } event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS; gd_x1 = DOOR_GFX_PAGEX8 + scrollbar_info[i].xpos; - gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE; + gd_x2 = (gd_x1 - (scrollbar_info[i].type == GD_TYPE_SCROLLBAR_HORIZONTAL ? + scrollbar_info[i].height : scrollbar_info[i].width)); gd_y1 = DOOR_GFX_PAGEY1 + scrollbar_info[i].ypos; gd_y2 = DOOR_GFX_PAGEY1 + scrollbar_info[i].ypos; gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, scrollbar_info[i].infotext, - GDI_X, SX + scrollbar_info[i].x, - GDI_Y, SY + scrollbar_info[i].y, + GDI_X, scrollbar_info[i].x, + GDI_Y, scrollbar_info[i].y, GDI_WIDTH, scrollbar_info[i].width, GDI_HEIGHT, scrollbar_info[i].height, GDI_TYPE, scrollbar_info[i].type, @@ -1621,7 +1681,7 @@ static void CreateScrollbarGadgets() GDI_STATE, GD_BUTTON_UNPRESSED, GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y1, GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y2, - GDI_DESIGN_BORDER, ED_BORDER_SIZE, + GDI_BORDER_SIZE, ED_BORDER_SIZE, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleControlButtons, GDI_END); @@ -1648,7 +1708,7 @@ static void CreateCheckbuttonGadgets() gd_x2 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_UNCHECKED_XPOS; gd_x3 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_CHECKED_XPOS; gd_x4 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_CHECKED_XPOS; - gd_y = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_YPOS; + gd_y = DOOR_GFX_PAGEY1 + ED_RADIOBUTTON_YPOS; for (i=0; icustom_id; - int counter_id = gi->custom_type_id; - int button = gi->event.button; - int *counter_value = counterbutton_info[counter_id].value; - int step = BUTTON_STEPSIZE(button) * - (gadget_id == counterbutton_info[counter_id].gadget_id_down ? -1 : +1); - int old_counter_value = *counter_value; - boolean released = (gi->event.type == GD_EVENT_RELEASED); - - if (LevelChanged()) - { - if (gi->event.type == GD_EVENT_PRESSED) - return; - - if (!Request("Level has changed! Discard changes ?", REQ_ASK)) - { - ModifyEditorCounter(counter_id, old_counter_value); - return; - } - } - else if (released) - return; - - if (gadget_id == counterbutton_info[counter_id].gadget_id_text) - *counter_value = gi->text.number_value; - else - ModifyEditorCounter(counter_id, *counter_value + step); - - LoadLevel(level_nr); - ResetUndoBuffer(); - DrawEditModeWindow(); -} - static void AdjustDrawingAreaGadgets() { int ed_xsize = lev_fieldx + 2; @@ -2054,8 +2057,8 @@ static void AdjustDrawingAreaGadgets() ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_RIGHT], GDI_X, x, GDI_END); ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_DOWN], GDI_Y, y, GDI_END); - width = scrollbar_info[ED_SCROLLBAR_ID_HORIZONTAL].width + xoffset; - height = scrollbar_info[ED_SCROLLBAR_ID_VERTICAL].height + yoffset; + width = scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].width + xoffset; + height = scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].height + yoffset; ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_HORIZONTAL], GDI_WIDTH, width, @@ -2146,24 +2149,21 @@ static void PickDrawingElement(int button, int element) { new_element1 = element; DrawMiniGraphicExt(drawto, gc, - DX + ED_WIN_MB_LEFT_XPOS, - DY + ED_WIN_MB_LEFT_YPOS, + DX + ED_WIN_MB_LEFT_XPOS, DY + ED_WIN_MB_LEFT_YPOS, el2gfx(new_element1)); } else if (button == 2) { new_element2 = element; DrawMiniGraphicExt(drawto, gc, - DX + ED_WIN_MB_MIDDLE_XPOS, - DY + ED_WIN_MB_MIDDLE_YPOS, + DX + ED_WIN_MB_MIDDLE_XPOS, DY + ED_WIN_MB_MIDDLE_YPOS, el2gfx(new_element2)); } else { new_element3 = element; DrawMiniGraphicExt(drawto, gc, - DX + ED_WIN_MB_RIGHT_XPOS, - DY + ED_WIN_MB_RIGHT_YPOS, + DX + ED_WIN_MB_RIGHT_XPOS, DY + ED_WIN_MB_RIGHT_YPOS, el2gfx(new_element3)); } @@ -3442,8 +3442,20 @@ static void HandleCounterButtons(struct GadgetInfo *gi) if (counter_id == ED_COUNTER_ID_SELECT_LEVEL) { - SelectNewLevelToEdit(gi); - return; + boolean pressed = (gi->event.type == GD_EVENT_PRESSED); + boolean released = (gi->event.type == GD_EVENT_RELEASED); + boolean level_changed = LevelChanged(); + + if ((level_changed && pressed) || (!level_changed && released)) + return; + + if (level_changed && !Request("Level has changed! Discard changes ?", + REQ_ASK)) + { + if (gadget_id == counterbutton_info[counter_id].gadget_id_text) + ModifyEditorCounter(counter_id, *counter_value); + return; + } } if (gadget_id == counterbutton_info[counter_id].gadget_id_text) @@ -3451,12 +3463,27 @@ static void HandleCounterButtons(struct GadgetInfo *gi) else ModifyEditorCounter(counter_id, *counter_value + step); - if (counter_id == ED_COUNTER_ID_ELEM_CONTENT) - DrawElementContentAreas(); - else if (counter_id == ED_COUNTER_ID_LEVEL_XSIZE) - lev_fieldx = level.fieldx; - else if (counter_id == ED_COUNTER_ID_LEVEL_YSIZE) - lev_fieldy = level.fieldy; + switch (counter_id) + { + case ED_COUNTER_ID_ELEM_CONTENT: + DrawElementContentAreas(); + break; + + case ED_COUNTER_ID_LEVEL_XSIZE: + case ED_COUNTER_ID_LEVEL_YSIZE: + lev_fieldx = level.fieldx; + lev_fieldy = level.fieldy; + break; + + case ED_COUNTER_ID_SELECT_LEVEL: + LoadLevel(level_nr); + ResetUndoBuffer(); + DrawEditModeWindow(); + break; + + default: + break; + } } static void HandleTextInputGadgets(struct GadgetInfo *gi) @@ -3498,9 +3525,6 @@ static void HandleControlButtons(struct GadgetInfo *gi) case GADGET_ID_SCROLL_LEFT: if (level_xpos >= 0) { - int gadget_id = GADGET_ID_SCROLL_HORIZONTAL; - struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - if (lev_fieldx < ed_fieldx - 2) break; @@ -3512,16 +3536,14 @@ static void HandleControlButtons(struct GadgetInfo *gi) else DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); - ModifyGadget(gi, GDI_SCROLLBAR_ITEM_POSITION, level_xpos + 1, GDI_END); + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_HORIZONTAL], + GDI_SCROLLBAR_ITEM_POSITION, level_xpos + 1, GDI_END); } break; case GADGET_ID_SCROLL_RIGHT: if (level_xpos <= lev_fieldx - ed_fieldx) { - int gadget_id = GADGET_ID_SCROLL_HORIZONTAL; - struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - if (lev_fieldx < ed_fieldx - 2) break; @@ -3533,16 +3555,14 @@ static void HandleControlButtons(struct GadgetInfo *gi) else DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); - ModifyGadget(gi, GDI_SCROLLBAR_ITEM_POSITION, level_xpos + 1, GDI_END); + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_HORIZONTAL], + GDI_SCROLLBAR_ITEM_POSITION, level_xpos + 1, GDI_END); } break; case GADGET_ID_SCROLL_UP: if (level_ypos >= 0) { - int gadget_id = GADGET_ID_SCROLL_VERTICAL; - struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - if (lev_fieldy < ed_fieldy - 2) break; @@ -3554,16 +3574,14 @@ static void HandleControlButtons(struct GadgetInfo *gi) else DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); - ModifyGadget(gi, GDI_SCROLLBAR_ITEM_POSITION, level_ypos + 1, GDI_END); + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_VERTICAL], + GDI_SCROLLBAR_ITEM_POSITION, level_ypos + 1, GDI_END); } break; case GADGET_ID_SCROLL_DOWN: if (level_ypos <= lev_fieldy - ed_fieldy) { - int gadget_id = GADGET_ID_SCROLL_VERTICAL; - struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - if (lev_fieldy < ed_fieldy - 2) break; @@ -3575,7 +3593,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) else DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); - ModifyGadget(gi, GDI_SCROLLBAR_ITEM_POSITION, level_ypos + 1, GDI_END); + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_VERTICAL], + GDI_SCROLLBAR_ITEM_POSITION, level_ypos + 1, GDI_END); } break; @@ -3589,15 +3608,25 @@ static void HandleControlButtons(struct GadgetInfo *gi) DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); break; - case GADGET_ID_ELEMENTLIST_UP: - case GADGET_ID_ELEMENTLIST_DOWN: - step *= (id == GADGET_ID_ELEMENTLIST_UP ? -1 : +1); - element_shift += step * ED_ELEMENTLIST_BUTTONS_HORIZ; + case GADGET_ID_SCROLL_LIST_UP: + case GADGET_ID_SCROLL_LIST_DOWN: + case GADGET_ID_SCROLL_LIST_VERTICAL: + if (id == GADGET_ID_SCROLL_LIST_VERTICAL) + element_shift = gi->event.item_position * ED_ELEMENTLIST_BUTTONS_HORIZ; + else + { + step *= (id == GADGET_ID_SCROLL_LIST_UP ? -1 : +1); + element_shift += step * ED_ELEMENTLIST_BUTTONS_HORIZ; - if (element_shift < 0) - element_shift = 0; - if (element_shift > elements_in_list - ED_NUM_ELEMENTLIST_BUTTONS) - element_shift = elements_in_list - ED_NUM_ELEMENTLIST_BUTTONS; + if (element_shift < 0) + element_shift = 0; + if (element_shift > elements_in_list - ED_NUM_ELEMENTLIST_BUTTONS) + element_shift = elements_in_list - ED_NUM_ELEMENTLIST_BUTTONS; + + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL], + GDI_SCROLLBAR_ITEM_POSITION, + element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END); + } for (i=0; igems_still_needed,3), FS_SMALL, FC_YELLOW); + int2str(local_player->gems_still_needed, 3), FS_SMALL, FC_YELLOW); DrawText(DX + XX_DYNAMITE, DY + YY_DYNAMITE, int2str(local_player->dynamite, 3), FS_SMALL, FC_YELLOW); DrawText(DX + XX_SCORE, DY + YY_SCORE, diff --git a/src/main.h b/src/main.h index 5f0a813a..0a52d8f5 100644 --- a/src/main.h +++ b/src/main.h @@ -545,7 +545,7 @@ extern char *element_info[]; #define FONT4_XSIZE 16 #define FONT4_YSIZE 16 #define FONT5_XSIZE 10 -#define FONT5_YSIZE 12 +#define FONT5_YSIZE 14 #define GFX_STARTX SX #define GFX_STARTY SY diff --git a/src/tools.c b/src/tools.c index 39e327cc..4412ad1f 100644 --- a/src/tools.c +++ b/src/tools.c @@ -314,22 +314,35 @@ void ClearWindow() redraw_mask |= REDRAW_FIELD; } +int getFontWidth(int font_size, int font_type) +{ + return (font_size == FS_BIG ? FONT1_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_type == FC_SPECIAL1 ? FONT3_YSIZE : + font_type == FC_SPECIAL2 ? FONT4_YSIZE : + font_type == FC_SPECIAL3 ? FONT5_YSIZE : + FONT2_YSIZE); +} + void DrawTextFCentered(int y, int font_type, char *format, ...) { char buffer[FULL_SXSIZE / FONT5_XSIZE + 10]; - int font_xsize; + int font_width = getFontWidth(FS_SMALL, font_type); va_list ap; - font_xsize = (font_type < FC_SPECIAL1 ? FONT2_XSIZE : - font_type < FC_SPECIAL2 ? FONT3_XSIZE : - font_type < FC_SPECIAL3 ? FONT4_XSIZE : - FONT5_XSIZE); - va_start(ap, format); vsprintf(buffer, format, ap); va_end(ap); - DrawText(SX + (SXSIZE - strlen(buffer) * font_xsize) / 2, SY + y, + DrawText(SX + (SXSIZE - strlen(buffer) * font_width) / 2, SY + y, buffer, FS_SMALL, font_type); } @@ -367,28 +380,21 @@ void DrawTextExt(Drawable d, GC gc, int x, int y, if (font_type < FC_RED || font_type > FC_SPECIAL3) font_type = FC_RED; - font_width = (font_size == FS_BIG ? FONT1_XSIZE : - font_type < FC_SPECIAL1 ? FONT2_XSIZE : - font_type < FC_SPECIAL2 ? FONT3_XSIZE : - font_type < FC_SPECIAL3 ? FONT4_XSIZE : - FONT5_XSIZE); - font_height = (font_size == FS_BIG ? FONT1_YSIZE : - font_type < FC_SPECIAL1 ? FONT2_YSIZE : - font_type < FC_SPECIAL2 ? FONT3_YSIZE : - font_type < FC_SPECIAL3 ? FONT4_YSIZE : - FONT5_YSIZE); + 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_LINES_PER_FONT); if (font_type == FC_SPECIAL3) - font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT + 3; + font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT; while (*text) { char c = *text++; - if (c == '~' && font_size == FS_SMALL && font_type <= FC_YELLOW) + if (c == '~' && font_size == FS_SMALL) { print_inverse = TRUE; continue; @@ -1491,21 +1497,7 @@ void DrawLevel() for(y=BY1; y<=BY2; y++) DrawScreenField(x, y); - -#if 1 - redraw_mask |= REDRAW_FIELD; - -#else - - if (setup.soft_scrolling) - XCopyArea(display, fieldbuffer, backbuffer, gc, - FX, FY, SXSIZE, SYSIZE, SX, SY); - - redraw_mask |= (REDRAW_FIELD | REDRAW_FROM_BACKBUFFER); - -#endif - } void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) @@ -2088,11 +2080,7 @@ void DrawSpecialEditorDoor() { /* draw bigger toolbox window */ XCopyArea(display, pix[PIX_DOOR], drawto, gc, - DOOR_GFX_PAGEX7, 60, 108, 56, EX - 4, EY - 12); - - /* draw background for level selection gadgets */ - XCopyArea(display, pix[PIX_DOOR], drawto, gc, - DOOR_GFX_PAGEX7, 0, 108, 60, EX - 4, 0); + DOOR_GFX_PAGEX7, 0, 108, 56, EX - 4, EY - 12); redraw_mask |= REDRAW_ALL; } @@ -2103,10 +2091,6 @@ void UndrawSpecialEditorDoor() XCopyArea(display, pix[PIX_BACK], drawto, gc, 562, 344, 108, 56, EX - 4, EY - 12); - /* draw game title */ - XCopyArea(display, pix[PIX_BACK], drawto, gc, - 562, 0, 108, 60, EX - 4, 0); - redraw_mask |= REDRAW_ALL; } diff --git a/src/tools.h b/src/tools.h index 9ec88df2..6eaf88c2 100644 --- a/src/tools.h +++ b/src/tools.h @@ -62,6 +62,8 @@ void SetDrawtoField(int); void BackToFront(); void FadeToFront(); void ClearWindow(); +int getFontWidth(int, int); +int getFontHeight(int, int); void DrawTextF(int, int, int, char *, ...); void DrawTextFCentered(int, int, char *, ...); void DrawText(int, int, char *, int, int); -- 2.34.1 From 5d2162e19c73b04f6ffccf2f3db4a2b758f47f2b Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 27 Feb 1999 02:00:47 +0100 Subject: [PATCH 05/16] rnd-19990227-1-src --- src/editor.c | 2 +- src/tools.c | 18 +++--------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/editor.c b/src/editor.c index fd269219..856523de 100644 --- a/src/editor.c +++ b/src/editor.c @@ -683,7 +683,7 @@ static int ed_fieldx = MAX_ED_FIELDX - 1, ed_fieldy = MAX_ED_FIELDY - 1; /* actual position of level editor drawing area in level playfield */ static int level_xpos = -1, level_ypos = -1; -#define IN_ED_FIELD(x,y) ((x)>=0 && (x)=0 &&(y)=0 && (x)=0 &&(y) Date: Sun, 14 Mar 1999 02:17:28 +0100 Subject: [PATCH 06/16] rnd-19990314-1-src --- src/editor.c | 6 ++--- src/game.c | 70 ++++++++++++++++++++++++++++++---------------------- src/init.c | 30 ++++++++++++++++------ src/main.h | 14 ++++++++--- src/tools.c | 19 ++++++++------ 5 files changed, 88 insertions(+), 51 deletions(-) diff --git a/src/editor.c b/src/editor.c index 856523de..bf51938f 100644 --- a/src/editor.c +++ b/src/editor.c @@ -811,8 +811,8 @@ int editor_element[] = EL_MORAST_LEER, EL_MORAST_VOLL, - EL_DYNAMIT_AUS, - EL_DYNAMIT, + EL_DYNAMITE_INACTIVE, + EL_DYNAMITE_ACTIVE, EL_AUSGANG_ZU, EL_AUSGANG_AUF, @@ -2467,7 +2467,7 @@ static void DrawPropertiesWindow() { EL_PACMAN_L, &level.score[SC_PACMAN], TEXT_SMASHING }, { EL_PACMAN_U, &level.score[SC_PACMAN], TEXT_SMASHING }, { EL_KOKOSNUSS, &level.score[SC_KOKOSNUSS], TEXT_CRACKING }, - { EL_DYNAMIT_AUS, &level.score[SC_DYNAMIT], TEXT_COLLECTING }, + { EL_DYNAMITE_INACTIVE,&level.score[SC_DYNAMIT], TEXT_COLLECTING }, { EL_SCHLUESSEL1, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING }, { EL_SCHLUESSEL2, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING }, { EL_SCHLUESSEL3, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING }, diff --git a/src/game.c b/src/game.c index b4e3fc97..1fbb21a5 100644 --- a/src/game.c +++ b/src/game.c @@ -280,7 +280,7 @@ static void InitField(int x, int y, boolean init_game) } break; - case EL_DYNAMIT: + case EL_DYNAMITE_ACTIVE: MovDelay[x][y] = 96; break; @@ -359,7 +359,7 @@ void InitGame() player->dynamite = 0; player->dynabomb_count = 0; - player->dynabomb_size = 0; + player->dynabomb_size = 1; player->dynabombs_left = 0; player->dynabomb_xl = FALSE; @@ -1054,7 +1054,7 @@ void DrawDynamite(int x, int y) if (Store[x][y]) DrawGraphic(sx, sy, el2gfx(Store[x][y])); - if (Feld[x][y] == EL_DYNAMIT) + if (Feld[x][y] == EL_DYNAMITE_ACTIVE) { if ((phase = (96 - MovDelay[x][y]) / 12) > 6) phase = 6; @@ -1083,10 +1083,13 @@ void CheckDynamite(int x, int y) if (!(MovDelay[x][y] % 12)) PlaySoundLevel(x, y, SND_ZISCH); - if (Feld[x][y] == EL_DYNAMIT && !(MovDelay[x][y] % 12)) - DrawDynamite(x, y); - else if (Feld[x][y] == EL_DYNABOMB && !(MovDelay[x][y] % 6)) - DrawDynamite(x, y); + if (IS_ACTIVE_BOMB(Feld[x][y])) + { + int delay = (Feld[x][y] == EL_DYNAMITE_ACTIVE ? 12 : 6); + + if (!(MovDelay[x][y] % delay)) + DrawDynamite(x, y); + } return; } @@ -1127,8 +1130,8 @@ void Explode(int ex, int ey, int phase, int mode) if (!IN_LEV_FIELD(x, y) || IS_MASSIVE(element) || element == EL_BURNING) continue; - if ((mode!=EX_NORMAL || center_element == EL_AMOEBA2DIAM) && - (x!=ex || y!=ey)) + if ((mode != EX_NORMAL || center_element == EL_AMOEBA2DIAM) && + (x != ex || y != ey)) continue; if (element == EL_EXPLODING) @@ -1277,7 +1280,9 @@ void Explode(int ex, int ey, int phase, int mode) void DynaExplode(int ex, int ey) { int i, j; - struct PlayerInfo *player = &stored_player[Store2[ex][ey] - EL_SPIELER1]; + int dynabomb_size = 1; + boolean dynabomb_xl = FALSE; + struct PlayerInfo *player; static int xy[4][2] = { { 0, -1 }, @@ -1286,16 +1291,22 @@ void DynaExplode(int ex, int ey) { 0, +1 } }; - Store2[ex][ey] = 0; /* delete player information */ + if (IS_ACTIVE_BOMB(Feld[ex][ey])) + { + player = &stored_player[Feld[ex][ey] - EL_DYNABOMB_ACTIVE_1]; + dynabomb_size = player->dynabomb_size; + dynabomb_xl = player->dynabomb_xl; + player->dynabombs_left++; + } Explode(ex, ey, EX_PHASE_START, EX_CENTER); for (i=0; i<4; i++) { - for (j=1; j<=player->dynabomb_size; j++) + for (j=1; j<=dynabomb_size; j++) { - int x = ex+j*xy[i%4][0]; - int y = ey+j*xy[i%4][1]; + int x = ex + j * xy[i % 4][0]; + int y = ey + j * xy[i % 4][1]; int element; if (!IN_LEV_FIELD(x, y) || IS_MASSIVE(Feld[x][y])) @@ -1307,12 +1318,10 @@ void DynaExplode(int ex, int ey) if (element != EL_LEERRAUM && element != EL_ERDREICH && element != EL_EXPLODING && - !player->dynabomb_xl) + !dynabomb_xl) break; } } - - player->dynabombs_left++; } void Bang(int x, int y) @@ -1340,7 +1349,10 @@ void Bang(int x, int y) RaiseScoreElement(element); Explode(x, y, EX_PHASE_START, EX_NORMAL); break; - case EL_DYNABOMB: + case EL_DYNABOMB_ACTIVE_1: + case EL_DYNABOMB_ACTIVE_2: + case EL_DYNABOMB_ACTIVE_3: + case EL_DYNABOMB_ACTIVE_4: case EL_DYNABOMB_NR: case EL_DYNABOMB_SZ: case EL_DYNABOMB_XL: @@ -3579,7 +3591,7 @@ void GameActions() } else if (IS_MOVING(x, y)) ContinueMoving(x, y); - else if (element == EL_DYNAMIT || element == EL_DYNABOMB) + else if (IS_ACTIVE_BOMB(element)) CheckDynamite(x, y); else if (element == EL_EXPLODING) Explode(x, y, Frame[x][y], EX_NORMAL); @@ -4385,11 +4397,11 @@ int DigField(struct PlayerInfo *player, PlaySoundLevel(x, y, SND_PONG); break; - case EL_DYNAMIT_AUS: + case EL_DYNAMITE_INACTIVE: case EL_SP_DISK_RED: RemoveField(x, y); player->dynamite++; - RaiseScoreElement(EL_DYNAMIT); + RaiseScoreElement(EL_DYNAMITE_INACTIVE); DrawText(DX_DYNAMITE, DY_DYNAMITE, int2str(local_player->dynamite, 3), FS_SMALL, FC_YELLOW); @@ -4403,21 +4415,21 @@ int DigField(struct PlayerInfo *player, RemoveField(x, y); player->dynabomb_count++; player->dynabombs_left++; - RaiseScoreElement(EL_DYNAMIT); + RaiseScoreElement(EL_DYNAMITE_INACTIVE); PlaySoundLevel(x, y, SND_PONG); break; case EL_DYNABOMB_SZ: RemoveField(x, y); player->dynabomb_size++; - RaiseScoreElement(EL_DYNAMIT); + RaiseScoreElement(EL_DYNAMITE_INACTIVE); PlaySoundLevel(x, y, SND_PONG); break; case EL_DYNABOMB_XL: RemoveField(x, y); player->dynabomb_xl = TRUE; - RaiseScoreElement(EL_DYNAMIT); + RaiseScoreElement(EL_DYNAMITE_INACTIVE); PlaySoundLevel(x, y, SND_PONG); break; @@ -4794,8 +4806,7 @@ boolean PlaceBomb(struct PlayerInfo *player) element = Feld[jx][jy]; if ((player->dynamite == 0 && player->dynabombs_left == 0) || - element == EL_DYNAMIT || element == EL_DYNABOMB || - element == EL_EXPLODING) + IS_ACTIVE_BOMB(element) || element == EL_EXPLODING) return FALSE; if (element != EL_LEERRAUM) @@ -4803,7 +4814,7 @@ boolean PlaceBomb(struct PlayerInfo *player) if (player->dynamite) { - Feld[jx][jy] = EL_DYNAMIT; + Feld[jx][jy] = EL_DYNAMITE_ACTIVE; MovDelay[jx][jy] = 96; player->dynamite--; DrawText(DX_DYNAMITE, DY_DYNAMITE, int2str(local_player->dynamite, 3), @@ -4818,8 +4829,7 @@ boolean PlaceBomb(struct PlayerInfo *player) } else { - Feld[jx][jy] = EL_DYNABOMB; - Store2[jx][jy] = player->element_nr; /* for DynaExplode() */ + Feld[jx][jy] = EL_DYNABOMB_ACTIVE_1 + (player->element_nr - EL_SPIELER1); MovDelay[jx][jy] = 96; player->dynabombs_left--; if (IN_SCR_FIELD(SCREENX(jx), SCREENY(jy))) @@ -4909,7 +4919,7 @@ void RaiseScoreElement(int element) case EL_KOKOSNUSS: RaiseScore(level.score[SC_KOKOSNUSS]); break; - case EL_DYNAMIT: + case EL_DYNAMITE_INACTIVE: RaiseScore(level.score[SC_DYNAMIT]); break; case EL_SCHLUESSEL: diff --git a/src/init.c b/src/init.c index 85339702..4f18c12a 100644 --- a/src/init.c +++ b/src/init.c @@ -1313,7 +1313,7 @@ void InitElementProperties() EL_EM_GATE_2X, EL_EM_GATE_3X, EL_EM_GATE_4X, - EL_DYNAMIT_AUS, + EL_DYNAMITE_INACTIVE, EL_UNSICHTBAR, EL_BIRNE_AUS, EL_BIRNE_EIN, @@ -1379,9 +1379,12 @@ void InitElementProperties() static int ep_explosive[] = { EL_BOMBE, - EL_DYNAMIT, - EL_DYNAMIT_AUS, - EL_DYNABOMB, + EL_DYNAMITE_ACTIVE, + EL_DYNAMITE_INACTIVE, + EL_DYNABOMB_ACTIVE_1, + EL_DYNABOMB_ACTIVE_2, + EL_DYNABOMB_ACTIVE_3, + EL_DYNABOMB_ACTIVE_4, EL_DYNABOMB_NR, EL_DYNABOMB_SZ, EL_DYNABOMB_XL, @@ -1538,6 +1541,16 @@ void InitElementProperties() }; static int ep_over_player_num = sizeof(ep_over_player)/sizeof(int); + static int ep_active_bomb[] = + { + EL_DYNAMITE_ACTIVE, + EL_DYNABOMB_ACTIVE_1, + EL_DYNABOMB_ACTIVE_2, + EL_DYNABOMB_ACTIVE_3, + EL_DYNABOMB_ACTIVE_4 + }; + static int ep_active_bomb_num = sizeof(ep_active_bomb)/sizeof(int); + static long ep_bit[] = { EP_BIT_AMOEBALIVE, @@ -1569,7 +1582,8 @@ void InitElementProperties() EP_BIT_EATABLE, EP_BIT_SP_ELEMENT, EP_BIT_QUICK_GATE, - EP_BIT_OVER_PLAYER + EP_BIT_OVER_PLAYER, + EP_BIT_ACTIVE_BOMB }; static int *ep_array[] = { @@ -1602,7 +1616,8 @@ void InitElementProperties() ep_eatable, ep_sp_element, ep_quick_gate, - ep_over_player + ep_over_player, + ep_active_bomb }; static int *ep_num[] = { @@ -1635,7 +1650,8 @@ void InitElementProperties() &ep_eatable_num, &ep_sp_element_num, &ep_quick_gate_num, - &ep_over_player_num + &ep_over_player_num, + &ep_active_bomb_num }; static int num_properties = sizeof(ep_num)/sizeof(int *); diff --git a/src/main.h b/src/main.h index 0a52d8f5..726e58ac 100644 --- a/src/main.h +++ b/src/main.h @@ -126,6 +126,7 @@ typedef unsigned char byte; #define EP_BIT_SP_ELEMENT (1 << 28) #define EP_BIT_QUICK_GATE (1 << 29) #define EP_BIT_OVER_PLAYER (1 << 30) +#define EP_BIT_ACTIVE_BOMB (1 << 31) #define IS_AMOEBALIVE(e) (Elementeigenschaften[e] & EP_BIT_AMOEBALIVE) #define IS_AMOEBOID(e) (Elementeigenschaften[e] & EP_BIT_AMOEBOID) @@ -158,6 +159,7 @@ typedef unsigned char byte; #define IS_SP_ELEMENT(e) (Elementeigenschaften[e] & EP_BIT_SP_ELEMENT) #define IS_QUICK_GATE(e) (Elementeigenschaften[e] & EP_BIT_QUICK_GATE) #define IS_OVER_PLAYER(e) (Elementeigenschaften[e] & EP_BIT_OVER_PLAYER) +#define IS_ACTIVE_BOMB(e) (Elementeigenschaften[e] & EP_BIT_ACTIVE_BOMB) #define IS_PLAYER(x,y) (ELEM_IS_PLAYER(StorePlayer[x][y])) @@ -600,7 +602,7 @@ extern char *element_info[]; #define EL_KOKOSNUSS 25 #define EL_LIFE 26 #define EL_LIFE_ASYNC 27 -#define EL_DYNAMIT 28 +#define EL_DYNAMITE_ACTIVE 28 #define EL_BADEWANNE 29 #define EL_ABLENK_AUS 30 #define EL_ABLENK_EIN 31 @@ -616,7 +618,7 @@ extern char *element_info[]; #define EL_PFORTE2X 41 #define EL_PFORTE3X 42 #define EL_PFORTE4X 43 -#define EL_DYNAMIT_AUS 44 +#define EL_DYNAMITE_INACTIVE 44 #define EL_PACMAN 45 #define EL_UNSICHTBAR 46 #define EL_BIRNE_AUS 47 @@ -635,7 +637,9 @@ extern char *element_info[]; #define EL_MAMPFER2 60 #define EL_SIEB2_INAKTIV 61 #define EL_INVISIBLE_STEEL 62 -#define EL_DYNABOMB 63 + +#define EL_UNUSED_63 63 + #define EL_DYNABOMB_NR 64 #define EL_DYNABOMB_SZ 65 #define EL_DYNABOMB_XL 66 @@ -823,6 +827,10 @@ extern char *element_info[]; #define EL_EM_KEY_2 310 #define EL_EM_KEY_3 311 #define EL_EM_KEY_4 312 +#define EL_DYNABOMB_ACTIVE_1 313 +#define EL_DYNABOMB_ACTIVE_2 314 +#define EL_DYNABOMB_ACTIVE_3 315 +#define EL_DYNABOMB_ACTIVE_4 316 /* "unreal" (and therefore not drawable) runtime elements */ #define EL_BLOCKED 400 diff --git a/src/tools.c b/src/tools.c index a946e4b3..a5224ae1 100644 --- a/src/tools.c +++ b/src/tools.c @@ -489,7 +489,7 @@ void DrawPlayer(struct PlayerInfo *player) DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]); DrawLevelFieldThruMask(last_jx, last_jy); } - else if (last_element == EL_DYNAMIT) + else if (last_element == EL_DYNAMITE_ACTIVE) DrawDynamite(last_jx, last_jy); else DrawLevelField(last_jx, last_jy); @@ -518,7 +518,7 @@ void DrawPlayer(struct PlayerInfo *player) if (Store[jx][jy]) DrawLevelElement(jx, jy, Store[jx][jy]); - else if (element != EL_DYNAMIT && element != EL_DYNABOMB) + else if (!IS_ACTIVE_BOMB(element)) DrawLevelField(jx, jy); /* draw player himself */ @@ -631,13 +631,13 @@ void DrawPlayer(struct PlayerInfo *player) } } - /* draw things in front of player (EL_DYNAMIT or EL_DYNABOMB) */ + /* draw things in front of player (active dynamite or dynabombs) */ - if (element == EL_DYNAMIT || element == EL_DYNABOMB) + if (IS_ACTIVE_BOMB(element)) { graphic = el2gfx(element); - if (element == EL_DYNAMIT) + if (element == EL_DYNAMITE_ACTIVE) { if ((phase = (96 - MovDelay[jx][jy]) / 12) > 6) phase = 6; @@ -2332,7 +2332,7 @@ int el2gfx(int element) case EL_KOKOSNUSS: return GFX_KOKOSNUSS; case EL_LIFE: return GFX_LIFE; case EL_LIFE_ASYNC: return GFX_LIFE_ASYNC; - case EL_DYNAMIT: return GFX_DYNAMIT; + case EL_DYNAMITE_ACTIVE: return GFX_DYNAMIT; case EL_BADEWANNE: return GFX_BADEWANNE; case EL_BADEWANNE1: return GFX_BADEWANNE1; case EL_BADEWANNE2: return GFX_BADEWANNE2; @@ -2353,7 +2353,7 @@ int el2gfx(int element) case EL_PFORTE2X: return GFX_PFORTE2X; case EL_PFORTE3X: return GFX_PFORTE3X; case EL_PFORTE4X: return GFX_PFORTE4X; - case EL_DYNAMIT_AUS: return GFX_DYNAMIT_AUS; + case EL_DYNAMITE_INACTIVE: return GFX_DYNAMIT_AUS; case EL_PACMAN: return GFX_PACMAN; case EL_PACMAN_R: return GFX_PACMAN_R; case EL_PACMAN_O: return GFX_PACMAN_O; @@ -2383,7 +2383,10 @@ int el2gfx(int element) 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_DYNABOMB: return GFX_DYNABOMB; + case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB; + case EL_DYNABOMB_ACTIVE_2: return GFX_DYNABOMB; + case EL_DYNABOMB_ACTIVE_3: return GFX_DYNABOMB; + case EL_DYNABOMB_ACTIVE_4: return GFX_DYNABOMB; case EL_DYNABOMB_NR: return GFX_DYNABOMB_NR; case EL_DYNABOMB_SZ: return GFX_DYNABOMB_SZ; case EL_DYNABOMB_XL: return GFX_DYNABOMB_XL; -- 2.34.1 From 0c27626bae90cb1eeea4939de0130a49b9aac507 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sun, 14 Mar 1999 21:48:10 +0100 Subject: [PATCH 07/16] rnd-19990314-2-src --- src/Makefile | 18 +++++++++++++++--- src/files.c | 7 +------ src/game.c | 11 +++++++++++ src/init.c | 8 ++++---- src/joystick.c | 2 +- src/main.c | 3 ++- src/main.h | 17 ++++++++++++----- src/misc.c | 11 +++++++---- src/msdos.c | 2 +- src/sound.c | 3 ++- 10 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/Makefile b/src/Makefile index 4c0a427b..fb7dd26a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -16,8 +16,11 @@ CC = gcc # specify X11 library path on your system XLIB_PATH = /usr/X11/lib -# change this to the directory where you want to install game data like levels -GAME_DIR = . +# choose directory for read-only game data (like graphics, sounds, levels) +# RO_GAME_DIR = /usr/games + +# choose directory for writable game data (like highscore files) +# RW_GAME_DIR = /var/games # uncomment this if your system has no joystick include file # JOYSTICK = -DNO_JOYSTICK @@ -62,9 +65,18 @@ endif CPP = $(CC) -E -CONFIG_GAME_DIR = -DGAME_DIR="\"$(GAME_DIR)\"" +ifdef RO_GAME_DIR +CONFIG_RO_GAME_DIR = -DRO_GAME_DIR="\"$(RO_GAME_DIR)\"" +endif + +ifdef RW_GAME_DIR +CONFIG_RW_GAME_DIR = -DRW_GAME_DIR="\"$(RW_GAME_DIR)\"" +endif + CONFIG_SCORE_ENTRIES = -D$(SCORE_ENTRIES) +CONFIG_GAME_DIR = $(CONFIG_RO_GAME_DIR) $(CONFIG_RW_GAME_DIR) + CONFIG = $(CONFIG_GAME_DIR) $(SOUNDS) $(JOYSTICK) \ $(CONFIG_SCORE_ENTRIES) $(XPM_INCLUDE_FILE) diff --git a/src/files.c b/src/files.c index 34c53f77..a7238908 100644 --- a/src/files.c +++ b/src/files.c @@ -116,11 +116,6 @@ static void SaveUserLevelInfo(); /* for 'InitUserLevelDir()' */ static char *getSetupLine(char *, int); /* for 'SaveUserLevelInfo()' */ -static char *getGlobalDataDir() -{ - return GAME_DIR; -} - char *getUserDataDir() { static char *userdata_dir = NULL; @@ -178,7 +173,7 @@ static char *getTapeDir(char *level_subdir) static char *getScoreDir(char *level_subdir) { static char *score_dir = NULL; - char *data_dir = getGlobalDataDir(); + char *data_dir = options.rw_base_directory; char *score_subdir = SCORES_DIRECTORY; if (score_dir) diff --git a/src/game.c b/src/game.c index 1fbb21a5..48482c90 100644 --- a/src/game.c +++ b/src/game.c @@ -1313,6 +1313,11 @@ void DynaExplode(int ex, int ey) break; element = Feld[x][y]; + + /* do not restart explosions of fields with active bombs */ + if (element == EL_EXPLODING && IS_ACTIVE_BOMB(Store2[x][y])) + continue; + Explode(x, y, EX_PHASE_START, EX_BORDER); if (element != EL_LEERRAUM && @@ -4579,6 +4584,8 @@ int DigField(struct PlayerInfo *player, player->programmed_action = move_direction; DOUBLE_PLAYER_SPEED(player); + PlaySoundLevel(x, y, SND_GATE); + break; case EL_EM_GATE_1X: @@ -4594,6 +4601,8 @@ int DigField(struct PlayerInfo *player, player->programmed_action = move_direction; DOUBLE_PLAYER_SPEED(player); + PlaySoundLevel(x, y, SND_GATE); + break; case EL_SP_PORT1_LEFT: @@ -4635,6 +4644,8 @@ int DigField(struct PlayerInfo *player, player->programmed_action = move_direction; DOUBLE_PLAYER_SPEED(player); + PlaySoundLevel(x, y, SND_GATE); + break; case EL_AUSGANG_ZU: diff --git a/src/init.c b/src/init.c index 4f18c12a..dcd82244 100644 --- a/src/init.c +++ b/src/init.c @@ -388,7 +388,7 @@ void InitWindow(int argc, char *argv[]) PropModePrepend, (unsigned char *) &delete_atom, 1); sprintf(icon_filename, "%s/%s/%s", - options.base_directory, GRAPHICS_DIRECTORY, + options.ro_base_directory, GRAPHICS_DIRECTORY, icon_pic.picture_filename); XReadBitmapFile(display,window,icon_filename, &icon_width,&icon_height, @@ -397,7 +397,7 @@ void InitWindow(int argc, char *argv[]) Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename); sprintf(icon_filename, "%s/%s/%s", - options.base_directory, GRAPHICS_DIRECTORY, + options.ro_base_directory, GRAPHICS_DIRECTORY, icon_pic.picturemask_filename); XReadBitmapFile(display,window,icon_filename, &icon_width,&icon_height, @@ -696,7 +696,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) sprintf(basefilename, "%s%s", pic->picture_filename, picture_ext); DrawInitText(basefilename, 150, FC_YELLOW); sprintf(filename, "%s/%s/%s", - options.base_directory, GRAPHICS_DIRECTORY, basefilename); + options.ro_base_directory, GRAPHICS_DIRECTORY, basefilename); #ifdef MSDOS rest(100); @@ -772,7 +772,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) sprintf(basefilename, "%s%s", pic->picture_filename, picturemask_ext); DrawInitText(basefilename, 150, FC_YELLOW); sprintf(filename, "%s/%s/%s", - options.base_directory, GRAPHICS_DIRECTORY, basefilename); + options.ro_base_directory, GRAPHICS_DIRECTORY, basefilename); #if DEBUG_TIMING debug_print_timestamp(1, NULL); /* initialize timestamp function */ diff --git a/src/joystick.c b/src/joystick.c index 3982e0a1..3aeb8e9d 100644 --- a/src/joystick.c +++ b/src/joystick.c @@ -157,7 +157,7 @@ int Joystick(int player_nr) if (joystick_nr < 0) return 0; - /* the allegro global variable ïnum_joysticksï contains the number + /* the allegro global variable 'num_joysticks' contains the number of joysticks found at initialization under MSDOS / Windows */ #if 0 diff --git a/src/main.c b/src/main.c index d7508917..e18599df 100644 --- a/src/main.c +++ b/src/main.c @@ -177,7 +177,8 @@ char *sound_name[NUM_SOUNDS] = "boom", "booom", "exit", - "empty" + "empty", + "gate" }; /* background music */ diff --git a/src/main.h b/src/main.h index 726e58ac..a625102c 100644 --- a/src/main.h +++ b/src/main.h @@ -236,7 +236,8 @@ struct OptionInfo char *display_name; char *server_host; int server_port; - char *base_directory; + char *ro_base_directory; + char *rw_base_directory; char *level_directory; boolean serveronly; boolean network; @@ -1273,8 +1274,9 @@ extern char *element_info[]; #define SND_SP_BOOOM 58 #define SND_SP_EXIT 59 #define SND_EMPTY 60 +#define SND_GATE 61 -#define NUM_SOUNDS 61 +#define NUM_SOUNDS 62 /* default input keys */ #define KEY_UNDEFINDED XK_VoidSymbol @@ -1319,11 +1321,16 @@ extern char *element_info[]; #define SETUPINPUT 9 #define CALIBRATION 10 -#ifndef GAME_DIR -#define GAME_DIR "." +#ifndef RO_GAME_DIR +#define RO_GAME_DIR "." #endif -#define BASE_PATH GAME_DIR +#ifndef RW_GAME_DIR +#define RW_GAME_DIR "." +#endif + +#define RO_BASE_PATH RO_GAME_DIR +#define RW_BASE_PATH RW_GAME_DIR #define GRAPHICS_DIRECTORY "graphics" #define SOUNDS_DIRECTORY "sounds" diff --git a/src/misc.c b/src/misc.c index 2200460a..7ff3a947 100644 --- a/src/misc.c +++ b/src/misc.c @@ -379,8 +379,9 @@ void GetOptions(char *argv[]) options.display_name = NULL; options.server_host = NULL; options.server_port = 0; - options.base_directory = BASE_PATH; - options.level_directory = BASE_PATH "/" LEVELS_DIRECTORY; + options.ro_base_directory = RO_BASE_PATH; + options.rw_base_directory = RW_BASE_PATH; + options.level_directory = RO_BASE_PATH "/" LEVELS_DIRECTORY; options.serveronly = FALSE; options.network = FALSE; options.verbose = FALSE; @@ -446,13 +447,15 @@ void GetOptions(char *argv[]) if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.base_directory = option_arg; + /* this should be extended to separate options for ro and rw data */ + options.ro_base_directory = option_arg; + options.rw_base_directory = option_arg; if (option_arg == next_option) options_left++; /* adjust path for level directory accordingly */ options.level_directory = - getPath2(options.base_directory, LEVELS_DIRECTORY); + getPath2(options.ro_base_directory, LEVELS_DIRECTORY); } else if (strncmp(option, "-levels", option_len) == 0) { diff --git a/src/msdos.c b/src/msdos.c index 5090c55c..df72b8eb 100644 --- a/src/msdos.c +++ b/src/msdos.c @@ -294,7 +294,7 @@ Display *XOpenDisplay(char *display_name) BITMAP *mouse_bitmap = NULL; char *filename; - filename = getPath3(options.base_directory, GRAPHICS_DIRECTORY, + filename = getPath3(options.ro_base_directory, GRAPHICS_DIRECTORY, MOUSE_FILENAME); mouse_bitmap = Read_PCX_to_AllegroBitmap(filename); diff --git a/src/sound.c b/src/sound.c index 928a955c..7839902a 100644 --- a/src/sound.c +++ b/src/sound.c @@ -724,7 +724,8 @@ boolean LoadSound(struct SoundInfo *snd_info) #endif sprintf(filename, "%s/%s/%s.%s", - options.base_directory, SOUNDS_DIRECTORY, snd_info->name, sound_ext); + options.ro_base_directory, SOUNDS_DIRECTORY, + snd_info->name, sound_ext); #ifndef MSDOS -- 2.34.1 From 5caf02865ba54b967aa085c4221040113a9e1976 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 15 Mar 1999 01:38:13 +0100 Subject: [PATCH 08/16] rnd-19990315-1-src --- src/files.c | 16 ++++++++-------- src/game.c | 7 ++++--- src/main.h | 4 ++-- src/network.c | 4 +--- src/screens.c | 2 +- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/files.c b/src/files.c index a7238908..00099201 100644 --- a/src/files.c +++ b/src/files.c @@ -827,15 +827,15 @@ void LoadScore(int level_nr) fscanf(file, "%d", &highscore[i].Score); fgets(line, MAX_LINE_LEN, file); - if (line[strlen(line)-1] == '\n') - line[strlen(line)-1] = '\0'; + if (line[strlen(line) - 1] == '\n') + line[strlen(line) - 1] = '\0'; for (line_ptr = line; *line_ptr; line_ptr++) { if (*line_ptr != ' ' && *line_ptr != '\t' && *line_ptr != '\0') { - strncpy(highscore[i].Name, line_ptr, MAX_NAMELEN - 1); - highscore[i].Name[MAX_NAMELEN - 1] = '\0'; + strncpy(highscore[i].Name, line_ptr, MAX_PLAYER_NAME_LEN); + highscore[i].Name[MAX_PLAYER_NAME_LEN] = '\0'; break; } } @@ -1572,11 +1572,11 @@ void LoadSetup() freeSetupFileList(setup_file_list); /* needed to work around problems with fixed length strings */ - if (strlen(setup.player_name) >= MAX_NAMELEN) - setup.player_name[MAX_NAMELEN - 1] = '\0'; - else if (strlen(setup.player_name) < MAX_NAMELEN - 1) + if (strlen(setup.player_name) > MAX_PLAYER_NAME_LEN) + setup.player_name[MAX_PLAYER_NAME_LEN] = '\0'; + else if (strlen(setup.player_name) < MAX_PLAYER_NAME_LEN) { - char *new_name = checked_malloc(MAX_NAMELEN); + char *new_name = checked_malloc(MAX_PLAYER_NAME_LEN + 1); strcpy(new_name, setup.player_name); free(setup.player_name); diff --git a/src/game.c b/src/game.c index 48482c90..89ed530f 100644 --- a/src/game.c +++ b/src/game.c @@ -897,15 +897,16 @@ int NewHiScore() #ifdef ONE_PER_NAME put_into_list: #endif - strncpy(highscore[k].Name, setup.player_name, MAX_NAMELEN - 1); - highscore[k].Name[MAX_NAMELEN - 1] = '\0'; + strncpy(highscore[k].Name, setup.player_name, MAX_PLAYER_NAME_LEN); + highscore[k].Name[MAX_PLAYER_NAME_LEN] = '\0'; highscore[k].Score = local_player->score; position = k; break; } #ifdef ONE_PER_NAME - else if (!strncmp(setup.player_name, highscore[k].Name, MAX_NAMELEN - 1)) + else if (!strncmp(setup.player_name, highscore[k].Name, + MAX_PLAYER_NAME_LEN)) break; /* player already there with a higher score */ #endif diff --git a/src/main.h b/src/main.h index a625102c..fad880a4 100644 --- a/src/main.h +++ b/src/main.h @@ -201,7 +201,7 @@ typedef unsigned char byte; #define NUM_PIXMAPS 10 /* boundaries of arrays etc. */ -#define MAX_NAMELEN (10+1) +#define MAX_PLAYER_NAME_LEN 10 #define MAX_LEVEL_NAME_LEN 32 #define MAX_LEVEL_AUTHOR_LEN 32 #define MAX_TAPELEN (1000 * 50) /* max. time * framerate */ @@ -227,7 +227,7 @@ typedef unsigned char byte; struct HiScore { - char Name[MAX_NAMELEN]; + char Name[MAX_PLAYER_NAME_LEN + 1]; int Score; }; diff --git a/src/network.c b/src/network.c index 5d137f05..e16c0d9f 100644 --- a/src/network.c +++ b/src/network.c @@ -33,12 +33,10 @@ #include "screens.h" #include "misc.h" -#define MAX_PLAYER_NAME_LEN 14 - struct NetworkClientPlayerInfo { byte nr; - char name[MAX_PLAYER_NAME_LEN + 2]; + char name[MAX_PLAYER_NAME_LEN + 1]; struct NetworkClientPlayerInfo *next; }; diff --git a/src/screens.c b/src/screens.c index d494e99a..ed99fd40 100644 --- a/src/screens.c +++ b/src/screens.c @@ -763,7 +763,7 @@ void HandleTypeName(int newxpos, KeySym key) } if (((key >= XK_A && key <= XK_Z) || (key >= XK_a && key <= XK_z)) && - xpos < MAX_NAMELEN - 1) + xpos < MAX_PLAYER_NAME_LEN) { char ascii; -- 2.34.1 From 9f58d4b9046806b85beb763ed91ff0f4610cf9cf Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 15 Mar 1999 02:25:01 +0100 Subject: [PATCH 09/16] rnd-19990315-2-src --- src/game.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/game.c b/src/game.c index 89ed530f..2cabfe2f 100644 --- a/src/game.c +++ b/src/game.c @@ -1118,9 +1118,16 @@ void Explode(int ex, int ey, int phase, int mode) RemoveMovingField(ex, ey); } - for (y=ey-1; y Date: Wed, 17 Mar 1999 00:17:21 +0100 Subject: [PATCH 10/16] rnd-19990317-1-src --- src/Makefile | 2 +- src/game.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index fb7dd26a..6c81021d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -59,7 +59,7 @@ PROGNAME = ../rocksndiamonds LIBS = -L$(XLIB_PATH) $(EXTRA_X11_LIBS) -lX11 -lm $(EXTRA_LIBS) else RM = del -PROGNAME = ..\rocks.exe +PROGNAME = ../rocks.exe LIBS = -lm -lalleg endif diff --git a/src/game.c b/src/game.c index 2cabfe2f..d4860369 100644 --- a/src/game.c +++ b/src/game.c @@ -1114,8 +1114,10 @@ void Explode(int ex, int ey, int phase, int mode) if (IS_MOVING(ex, ey) || IS_BLOCKED(ex, ey)) { + /* put moving element to center field (and let it explode there) */ center_element = MovingOrBlocked2Element(ex, ey); RemoveMovingField(ex, ey); + Feld[ex][ey] = center_element; } for (y=ey-1; y<=ey+1; y++) for(x=ex-1; x<=ex+1; x++) -- 2.34.1 From 48542a06103232c408ce6250f5bc2d9add00f233 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 4 Jun 1999 01:33:42 +0200 Subject: [PATCH 11/16] rnd-19990604-1-src --- src/events.c | 13 ++++++++++++- src/files.c | 7 +++++++ src/init.c | 4 +++- src/main.h | 3 ++- src/screens.c | 40 ++++++++++++++++++++-------------------- 5 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/events.c b/src/events.c index 60a6ceb3..a34c1ab9 100644 --- a/src/events.c +++ b/src/events.c @@ -68,7 +68,8 @@ void EventLoop(void) if (game_status != PLAYING) { XSync(display, FALSE); - Delay(10); + if (!XPending(display)) /* delay only if no pending events */ + Delay(10); } /* refresh window contents from drawing buffer, if needed */ @@ -529,6 +530,16 @@ void HandleKey(KeySym key, int key_status) HandleSetupInputScreen(0,0, 0,0, MB_MENU_CHOICE); break; + case XK_Page_Up: + if (game_status == CHOOSELEVEL) + HandleChooseLevel(0,0, 0,-SCR_FIELDY, MB_MENU_MARK); + break; + + case XK_Page_Down: + if (game_status == CHOOSELEVEL) + HandleChooseLevel(0,0, 0,SCR_FIELDY, MB_MENU_MARK); + break; + default: break; } diff --git a/src/files.c b/src/files.c index 00099201..7e1ad30b 100644 --- a/src/files.c +++ b/src/files.c @@ -975,6 +975,7 @@ static struct /* level directory info */ { TYPE_STRING, &ldi.name, "name" }, + { TYPE_STRING, &ldi.name_short, "name_short" }, { TYPE_STRING, &ldi.author, "author" }, { TYPE_INTEGER, &ldi.levels, "levels" }, { TYPE_INTEGER, &ldi.first_level, "first_level" }, @@ -1240,6 +1241,7 @@ static void checkSetupFileListIdentifier(struct SetupFileList *setup_file_list, static void setLevelDirInfoToDefaults(struct LevelDirInfo *ldi) { ldi->name = getStringCopy(ANONYMOUS_NAME); + ldi->name_short = NULL; ldi->author = getStringCopy(ANONYMOUS_NAME); ldi->levels = 0; ldi->first_level = 0; @@ -1462,6 +1464,10 @@ static int LoadLevelInfoFromLevelDir(char *level_directory, int start_entry) setSetupInfo(i, getTokenValue(setup_file_list, token_info[i].text)); leveldir[current_entry] = ldi; + if (leveldir[current_entry].name_short == NULL) + leveldir[current_entry].name_short = + getStringCopy(leveldir[current_entry].name); + leveldir[current_entry].filename = getStringCopy(dir_entry->d_name); leveldir[current_entry].last_level = leveldir[current_entry].first_level + @@ -1532,6 +1538,7 @@ static void SaveUserLevelInfo() setLevelDirInfoToDefaults(&ldi); ldi.name = getLoginName(); + ldi.name_short = getLoginName(); ldi.author = getRealName(); ldi.levels = 100; ldi.first_level = 1; diff --git a/src/init.c b/src/init.c index dcd82244..78bfb711 100644 --- a/src/init.c +++ b/src/init.c @@ -1497,7 +1497,9 @@ void InitElementProperties() EL_SP_HARD_BASE5, EL_SP_HARD_BASE6, EL_SP_CHIP_UPPER, - EL_SP_CHIP_LOWER + EL_SP_CHIP_LOWER, + /* additional elements that appeared in newer Supaplex levels */ + EL_UNSICHTBAR }; static int ep_sp_element_num = sizeof(ep_sp_element)/sizeof(int); diff --git a/src/main.h b/src/main.h index fad880a4..d0aed23d 100644 --- a/src/main.h +++ b/src/main.h @@ -368,6 +368,7 @@ struct LevelDirInfo { char *filename; char *name; + char *name_short; /* optional short name for level selection screen */ char *author; int levels; int first_level; @@ -1338,7 +1339,7 @@ extern char *element_info[]; #define TAPES_DIRECTORY "tapes" #define SCORES_DIRECTORY "scores" -#define PROGRAM_VERSION_STRING "1.3.0" +#define PROGRAM_VERSION_STRING "1.3.5" #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" #define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_VERSION_STRING diff --git a/src/screens.c b/src/screens.c index ed99fd40..c1ad55de 100644 --- a/src/screens.c +++ b/src/screens.c @@ -28,18 +28,18 @@ /* for DrawSetupScreen(), HandleSetupScreen() */ #define SETUP_SCREEN_POS_START 2 -#define SETUP_SCREEN_POS_END 16 +#define SETUP_SCREEN_POS_END (SCR_FIELDY - 1) #define SETUP_SCREEN_POS_EMPTY1 (SETUP_SCREEN_POS_END - 2) #define SETUP_SCREEN_POS_EMPTY2 (SETUP_SCREEN_POS_END - 2) /* for HandleSetupInputScreen() */ #define SETUPINPUT_SCREEN_POS_START 2 -#define SETUPINPUT_SCREEN_POS_END 15 +#define SETUPINPUT_SCREEN_POS_END (SCR_FIELDY - 2) #define SETUPINPUT_SCREEN_POS_EMPTY1 (SETUPINPUT_SCREEN_POS_START + 3) #define SETUPINPUT_SCREEN_POS_EMPTY2 (SETUPINPUT_SCREEN_POS_END - 1) /* for HandleChooseLevel() */ -#define MAX_LEVEL_SERIES_ON_SCREEN 15 +#define MAX_LEVEL_SERIES_ON_SCREEN (SCR_FIELDY - 2) #ifdef MSDOS extern unsigned char get_ascii(KeySym); @@ -820,7 +820,7 @@ static void drawChooseLevelList(int first_entry, int num_page_entries) for(i=0; i num_page_entries + 2) + if (first_entry == -1) { - choice = num_page_entries + 2; - first_entry = num_leveldirs - num_page_entries; + first_entry = leveldir_nr - num_page_entries + 1; + choice = leveldir_nr - first_entry + 3; } drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(leveldir_nr); + redraw = TRUE; } if (redraw) @@ -896,7 +894,15 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) y = choice + dy; } else - x = y = 0; + x = y = 0; /* no action */ + + if (ABS(dy) == SCR_FIELDY) /* handle XK_Page_Up, XK_Page_Down */ + { + dy = SIGN(dy); + step = num_page_entries - 1; + x = 1; + y = (dy < 0 ? 2 : num_page_entries + 3); + } } if (x == 1 && y == 2) @@ -904,13 +910,10 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) if (first_entry > 0 && (dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY))) { -#if 0 - first_entry--; -#else first_entry -= step; if (first_entry < 0) first_entry = 0; -#endif + drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(first_entry); DrawGraphic(0, choice - 1, GFX_KUGEL_ROT); @@ -922,13 +925,10 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) if (first_entry + num_page_entries < num_leveldirs && (dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY))) { -#if 0 - first_entry++; -#else first_entry += step; if (first_entry + num_page_entries > num_leveldirs) first_entry = num_leveldirs - num_page_entries; -#endif + drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(first_entry + num_page_entries - 1); DrawGraphic(0, choice - 1, GFX_KUGEL_ROT); -- 2.34.1 From 472c408b6f77da95f694142431030af508c187a5 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 4 Jun 1999 23:13:13 +0200 Subject: [PATCH 12/16] rnd-19990604-2-src --- src/screens.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/screens.c b/src/screens.c index c1ad55de..8afe5535 100644 --- a/src/screens.c +++ b/src/screens.c @@ -868,7 +868,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) { if (first_entry == -1) { - first_entry = leveldir_nr - num_page_entries + 1; + first_entry = MAX(0, leveldir_nr - num_page_entries + 1); choice = leveldir_nr - first_entry + 3; } @@ -927,7 +927,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) { first_entry += step; if (first_entry + num_page_entries > num_leveldirs) - first_entry = num_leveldirs - num_page_entries; + first_entry = MAX(0, num_leveldirs - num_page_entries); drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(first_entry + num_page_entries - 1); -- 2.34.1 From 538315c24bc8be21751b452eef2f02b13e159f55 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Thu, 10 Jun 1999 01:46:32 +0200 Subject: [PATCH 13/16] rnd-19990610-1-src --- src/files.c | 199 +++++++++++++++++++++++++++++++++++++++----------- src/main.c | 74 +++++++++++++++++-- src/main.h | 171 ++++++++++++++++++++++++++++++++++--------- src/screens.c | 11 ++- src/tools.c | 98 +++++++++++++++++++++---- 5 files changed, 452 insertions(+), 101 deletions(-) diff --git a/src/files.c b/src/files.c index 7e1ad30b..80c766cd 100644 --- a/src/files.c +++ b/src/files.c @@ -26,14 +26,15 @@ #define MAX_LINE_LEN 1000 /* maximal input line length */ #define CHUNK_ID_LEN 4 /* IFF style chunk id length */ #define LEVEL_HEADER_SIZE 80 /* size of level file header */ -#define LEVEL_HEADER_UNUSED 16 /* unused level header bytes */ +#define LEVEL_HEADER_UNUSED 15 /* unused level header bytes */ #define TAPE_HEADER_SIZE 20 /* size of tape file header */ #define TAPE_HEADER_UNUSED 7 /* unused tape header bytes */ -#define FILE_VERSION_1_0 10 /* old 1.0 file version */ -#define FILE_VERSION_1_2 12 /* actual file version */ +#define FILE_VERSION_1_0 10 /* 1.0 file version (old) */ +#define FILE_VERSION_1_2 12 /* 1.2 file version (still in use) */ +#define FILE_VERSION_1_4 14 /* 1.4 file version (new) */ /* file identifier strings */ -#define LEVEL_COOKIE "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.2" +#define LEVEL_COOKIE "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.4" #define SCORE_COOKIE "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2" #define TAPE_COOKIE "ROCKSNDIAMONDS_TAPE_FILE_VERSION_1.2" #define SETUP_COOKIE "ROCKSNDIAMONDS_SETUP_FILE_VERSION_1.2" @@ -41,6 +42,7 @@ #define LEVELINFO_COOKIE "ROCKSNDIAMONDS_LEVELINFO_FILE_VERSION_1.2" /* old file identifiers for backward compatibility */ #define LEVEL_COOKIE_10 "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.0" +#define LEVEL_COOKIE_12 "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.2" #define TAPE_COOKIE_10 "ROCKSNDIAMONDS_LEVELREC_FILE_VERSION_1.0" /* file names and filename extensions */ @@ -82,36 +84,103 @@ #define LEVELCLASS_CONTRIBUTION_END 299 #define LEVELCLASS_USER_START 300 #define LEVELCLASS_USER_END 399 +#define LEVELCLASS_BD_START 400 +#define LEVELCLASS_BD_END 499 +#define LEVELCLASS_EM_START 500 +#define LEVELCLASS_EM_END 599 +#define LEVELCLASS_SP_START 600 +#define LEVELCLASS_SP_END 699 +#define LEVELCLASS_DX_START 700 +#define LEVELCLASS_DX_END 799 #define LEVELCLASS_TUTORIAL LEVELCLASS_TUTORIAL_START #define LEVELCLASS_CLASSICS LEVELCLASS_CLASSICS_START #define LEVELCLASS_CONTRIBUTION LEVELCLASS_CONTRIBUTION_START #define LEVELCLASS_USER LEVELCLASS_USER_START +#define LEVELCLASS_BD LEVELCLASS_BD_START +#define LEVELCLASS_EM LEVELCLASS_EM_START +#define LEVELCLASS_SP LEVELCLASS_SP_START +#define LEVELCLASS_DX LEVELCLASS_DX_START + #define LEVELCLASS_UNDEFINED 999 -#define IS_LEVELCLASS_TUTORIAL(n) \ - (leveldir[n].sort_priority >= LEVELCLASS_TUTORIAL_START && \ - leveldir[n].sort_priority <= LEVELCLASS_TUTORIAL_END) -#define IS_LEVELCLASS_CLASSICS(n) \ - (leveldir[n].sort_priority >= LEVELCLASS_CLASSICS_START && \ - leveldir[n].sort_priority <= LEVELCLASS_CLASSICS_END) -#define IS_LEVELCLASS_CONTRIBUTION(n) \ - (leveldir[n].sort_priority >= LEVELCLASS_CONTRIBUTION_START && \ - leveldir[n].sort_priority <= LEVELCLASS_CONTRIBUTION_END) -#define IS_LEVELCLASS_USER(n) \ - (leveldir[n].sort_priority >= LEVELCLASS_USER_START && \ - leveldir[n].sort_priority <= LEVELCLASS_USER_END) +#define NUM_LEVELCLASS_DESC 8 +char *levelclass_desc[NUM_LEVELCLASS_DESC] = +{ + "Tutorial Levels", + "Classic Originals", + "Contributions", + "Private Levels", + "Boulderdash", + "Emerald Mine", + "Supaplex", + "DX Boulderdash" +}; + +#define IS_LEVELCLASS_TUTORIAL(p) \ + ((p)->sort_priority >= LEVELCLASS_TUTORIAL_START && \ + (p)->sort_priority <= LEVELCLASS_TUTORIAL_END) +#define IS_LEVELCLASS_CLASSICS(p) \ + ((p)->sort_priority >= LEVELCLASS_CLASSICS_START && \ + (p)->sort_priority <= LEVELCLASS_CLASSICS_END) +#define IS_LEVELCLASS_CONTRIBUTION(p) \ + ((p)->sort_priority >= LEVELCLASS_CONTRIBUTION_START && \ + (p)->sort_priority <= LEVELCLASS_CONTRIBUTION_END) +#define IS_LEVELCLASS_USER(p) \ + ((p)->sort_priority >= LEVELCLASS_USER_START && \ + (p)->sort_priority <= LEVELCLASS_USER_END) +#define IS_LEVELCLASS_BD(p) \ + ((p)->sort_priority >= LEVELCLASS_BD_START && \ + (p)->sort_priority <= LEVELCLASS_BD_END) +#define IS_LEVELCLASS_EM(p) \ + ((p)->sort_priority >= LEVELCLASS_EM_START && \ + (p)->sort_priority <= LEVELCLASS_EM_END) +#define IS_LEVELCLASS_SP(p) \ + ((p)->sort_priority >= LEVELCLASS_SP_START && \ + (p)->sort_priority <= LEVELCLASS_SP_END) +#define IS_LEVELCLASS_DX(p) \ + ((p)->sort_priority >= LEVELCLASS_DX_START && \ + (p)->sort_priority <= LEVELCLASS_DX_END) #define LEVELCLASS(n) (IS_LEVELCLASS_TUTORIAL(n) ? LEVELCLASS_TUTORIAL : \ IS_LEVELCLASS_CLASSICS(n) ? LEVELCLASS_CLASSICS : \ IS_LEVELCLASS_CONTRIBUTION(n) ? LEVELCLASS_CONTRIBUTION : \ IS_LEVELCLASS_USER(n) ? LEVELCLASS_USER : \ + IS_LEVELCLASS_BD(n) ? LEVELCLASS_BD : \ + IS_LEVELCLASS_EM(n) ? LEVELCLASS_EM : \ + IS_LEVELCLASS_SP(n) ? LEVELCLASS_SP : \ + IS_LEVELCLASS_DX(n) ? LEVELCLASS_DX : \ LEVELCLASS_UNDEFINED) -#define LEVELCOLOR(n) (IS_LEVELCLASS_TUTORIAL(n) ? FC_BLUE : \ - IS_LEVELCLASS_CLASSICS(n) ? FC_YELLOW : \ - IS_LEVELCLASS_CONTRIBUTION(n) ? FC_GREEN : \ - IS_LEVELCLASS_USER(n) ? FC_RED : FC_BLUE) +#define LEVELCOLOR(n) (IS_LEVELCLASS_TUTORIAL(n) ? FC_BLUE : \ + IS_LEVELCLASS_CLASSICS(n) ? FC_RED : \ + IS_LEVELCLASS_BD(n) ? FC_GREEN : \ + IS_LEVELCLASS_EM(n) ? FC_YELLOW : \ + IS_LEVELCLASS_SP(n) ? FC_GREEN : \ + IS_LEVELCLASS_DX(n) ? FC_YELLOW : \ + IS_LEVELCLASS_CONTRIBUTION(n) ? FC_GREEN : \ + IS_LEVELCLASS_USER(n) ? FC_RED : \ + FC_BLUE) + +#define LEVELSORTING(n) (IS_LEVELCLASS_TUTORIAL(n) ? 0 : \ + IS_LEVELCLASS_CLASSICS(n) ? 1 : \ + IS_LEVELCLASS_BD(n) ? 2 : \ + IS_LEVELCLASS_EM(n) ? 3 : \ + IS_LEVELCLASS_SP(n) ? 4 : \ + IS_LEVELCLASS_DX(n) ? 5 : \ + IS_LEVELCLASS_CONTRIBUTION(n) ? 6 : \ + IS_LEVELCLASS_USER(n) ? 7 : \ + 9) + +char *getLevelClassDescription(struct LevelDirInfo *ldi) +{ + int position = ldi->sort_priority / 100; + + if (position >= 0 && position < NUM_LEVELCLASS_DESC) + return levelclass_desc[position]; + else + return "Unknown Level Class"; +} static void SaveUserLevelInfo(); /* for 'InitUserLevelDir()' */ static char *getSetupLine(char *, int); /* for 'SaveUserLevelInfo()' */ @@ -321,7 +390,7 @@ static void setLevelInfoToDefaults() } else { - switch (LEVELCLASS(leveldir_nr)) + switch (LEVELCLASS(&leveldir[leveldir_nr])) { case LEVELCLASS_TUTORIAL: strcpy(level.author, PROGRAM_AUTHOR_STRING); @@ -350,7 +419,8 @@ void LoadLevel(int level_nr) char *filename = getLevelFilename(level_nr); char cookie[MAX_LINE_LEN]; char chunk[CHUNK_ID_LEN + 1]; - int file_version = FILE_VERSION_1_2; /* last version of level files */ + boolean encoding_16bit = FALSE; /* default: maximal 256 elements */ + int file_version = FILE_VERSION_1_4; /* last version of level files */ int chunk_length; FILE *file; @@ -370,6 +440,8 @@ void LoadLevel(int level_nr) if (strcmp(cookie, LEVEL_COOKIE_10) == 0) /* old 1.0 level format */ file_version = FILE_VERSION_1_0; + else if (strcmp(cookie, LEVEL_COOKIE_12) == 0)/* 1.2 (8 bit) level format */ + file_version = FILE_VERSION_1_2; else if (strcmp(cookie, LEVEL_COOKIE) != 0) /* unknown level format */ { Error(ERR_WARN, "wrong file identifier of level file '%s'", filename); @@ -424,10 +496,11 @@ void LoadLevel(int level_nr) level.double_speed = (fgetc(file) == 1 ? TRUE : FALSE); level.gravity = (fgetc(file) == 1 ? TRUE : FALSE); + encoding_16bit = (fgetc(file) == 1 ? TRUE : FALSE); + for(i=0; i= FILE_VERSION_1_2) { getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); @@ -454,7 +527,10 @@ void LoadLevel(int level_nr) for(i=0; i 255) + encoding_16bit = TRUE; + + /* check level field for 16-bit elements */ + for(y=0; y 255) + encoding_16bit = TRUE; + + oldest_possible_cookie = (encoding_16bit ? LEVEL_COOKIE : LEVEL_COOKIE_12); + + fputs(oldest_possible_cookie, file); /* file identifier */ fputc('\n', file); putFileChunk(file, "HEAD", LEVEL_HEADER_SIZE, BYTE_ORDER_BIG_ENDIAN); @@ -523,7 +619,7 @@ void SaveLevel(int level_nr) for(i=0; iname = getStringCopy(ANONYMOUS_NAME); ldi->name_short = NULL; ldi->author = getStringCopy(ANONYMOUS_NAME); + ldi->imported_from = NULL; ldi->levels = 0; ldi->first_level = 0; ldi->sort_priority = LEVELCLASS_UNDEFINED; /* default: least priority */ @@ -1400,18 +1509,20 @@ static int compareLevelDirInfoEntries(const void *object1, const void *object2) const struct LevelDirInfo *entry2 = object2; int compare_result; - if (entry1->sort_priority != entry2->sort_priority) - compare_result = entry1->sort_priority - entry2->sort_priority; - else + if (entry1->sort_priority == entry2->sort_priority) { - char *name1 = getStringToLower(entry1->name); - char *name2 = getStringToLower(entry2->name); + char *name1 = getStringToLower(entry1->name_short); + char *name2 = getStringToLower(entry2->name_short); compare_result = strcmp(name1, name2); free(name1); free(name2); } + else if (LEVELSORTING(entry1) == LEVELSORTING(entry2)) + compare_result = entry1->sort_priority - entry2->sort_priority; + else + compare_result = LEVELSORTING(entry1) - LEVELSORTING(entry2); return compare_result; } @@ -1474,7 +1585,9 @@ static int LoadLevelInfoFromLevelDir(char *level_directory, int start_entry) leveldir[current_entry].levels - 1; leveldir[current_entry].user_defined = (level_directory == options.level_directory ? FALSE : TRUE); - leveldir[current_entry].color = LEVELCOLOR(current_entry); + leveldir[current_entry].color = LEVELCOLOR(&leveldir[current_entry]); + leveldir[current_entry].class_desc = + getLevelClassDescription(&leveldir[current_entry]); freeSetupFileList(setup_file_list); current_entry++; @@ -1538,7 +1651,6 @@ static void SaveUserLevelInfo() setLevelDirInfoToDefaults(&ldi); ldi.name = getLoginName(); - ldi.name_short = getLoginName(); ldi.author = getRealName(); ldi.levels = 100; ldi.first_level = 1; @@ -1549,7 +1661,8 @@ static void SaveUserLevelInfo() getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER, LEVELINFO_COOKIE)); for (i=FIRST_LEVELINFO_TOKEN; i<=LAST_LEVELINFO_TOKEN; i++) - fprintf(file, "%s\n", getSetupLine("", i)); + if (i != LEVELINFO_TOKEN_NAME_SHORT && i != LEVELINFO_TOKEN_IMPORTED_FROM) + fprintf(file, "%s\n", getSetupLine("", i)); fclose(file); free(filename); diff --git a/src/main.c b/src/main.c index e18599df..14756c5e 100644 --- a/src/main.c +++ b/src/main.c @@ -236,10 +236,10 @@ char *element_info[] = "yellow door", "green door", "blue door", - "grey door (opened by red key)", - "grey door (opened by yellow key)", - "grey door (opened by green key)", - "grey door (opened by blue key)", + "gray door (opened by red key)", + "gray door (opened by yellow key)", + "gray door (opened by green key)", + "gray door (opened by blue key)", "dynamite", "pac man", "invisible normal wall", @@ -451,7 +451,71 @@ char *element_info[] = "unknown", "unknown", "unknown", - "unknown" + "unknown", + + /* 256 */ + + "pearl", + "crystal", + "wall with pearl", + "wall with crystal", + "white door", + "gray door (opened by white key)", + "white key", + "force field", + "extra time", + "switch gate (open)", + "switch gate (closed)", + "switch for switch gate", + "time gate", + "time gate with magic wheel", + "green conveyor belt (left)", + "green conveyor belt (middle)", + "green conveyor belt (right)", + "switch for green conveyor belt", + "red conveyor belt (left)", + "red conveyor belt (middle)", + "red conveyor belt (right)", + "switch for red conveyor belt", + "blue conveyor belt (left)", + "blue conveyor belt (middle)", + "blue conveyor belt (right)", + "switch for blue conveyor belt", + "land mine", + "mail envelope", + "light switch", + "sign (exclamation)", + "sign (radio activity)", + "sign (stop)", + "sign (wheel chair)", + "sign (parking)", + "sign (one way)", + "sign (heart)", + "sign (triangle)", + "sign (round)", + "sign (exit)", + "sign (yin yang)", + "sign (other)", + "mole (starts moving left)", + "mole (starts moving right)", + "mole (starts moving up)", + "mole (starts moving down)", + "steel (?)", + "invisible sand", + "-", + "-", + "-", + "-", + "-", + "-", + "-", + "-", + "-", + "-" + + /* + "-------------------------------", + */ }; int main(int argc, char *argv[]) diff --git a/src/main.h b/src/main.h index d0aed23d..0550a996 100644 --- a/src/main.h +++ b/src/main.h @@ -366,17 +366,19 @@ struct LevelInfo struct LevelDirInfo { - char *filename; - char *name; + char *filename; /* level series sub-directory inside level directory */ + char *name; /* level series name, as displayed on main screen */ char *name_short; /* optional short name for level selection screen */ - char *author; - int levels; - int first_level; - int last_level; - int sort_priority; - boolean user_defined; - boolean readonly; - int color; + char *author; /* level series author name levels without author */ + char *imported_from; /* optional comment for imported level series */ + int levels; /* number of levels in level series */ + int first_level; /* first level number (to allow start with 0 or 1) */ + int last_level; /* last level number (automatically calculated) */ + int sort_priority; /* sort levels by 'sort_priority' and then by name */ + boolean user_defined; /* user defined levels are stored in home directory */ + boolean readonly; /* readonly levels can not be changed with editor */ + int color; /* color to use on selection screen for this level */ + char *class_desc; /* description of level series class */ }; struct TapeInfo @@ -815,35 +817,83 @@ extern char *element_info[]; #define EL_UNUSED_254 254 #define EL_UNUSED_255 255 +#define EL_PEARL 256 +#define EL_CRYSTAL 257 +#define EL_WALL_PEARL 258 +#define EL_WALL_CRYSTAL 259 +#define EL_DOOR_WHITE 260 +#define EL_DOOR_WHITE_GRAY 261 +#define EL_KEY_WHITE 262 +#define EL_FORCE_FIELD 263 +#define EL_EXTRA_TIME 264 +#define EL_SWITCH_GATE_OPEN 265 +#define EL_SWITCH_GATE_CLOSED 266 +#define EL_SWITCH_GATE_SWITCH 267 +#define EL_TIME_GATE 268 +#define EL_TIME_GATE_WHEEL 269 +#define EL_BELT_GREEN_LEFT 270 +#define EL_BELT_GREEN_MIDDLE 271 +#define EL_BELT_GREEN_RIGHT 272 +#define EL_BELT_GREEN_SWITCH 273 +#define EL_BELT_RED_LEFT 274 +#define EL_BELT_RED_MIDDLE 275 +#define EL_BELT_RED_RIGHT 276 +#define EL_BELT_RED_SWITCH 277 +#define EL_BELT_BLUE_LEFT 278 +#define EL_BELT_BLUE_MIDDLE 279 +#define EL_BELT_BLUE_RIGHT 280 +#define EL_BELT_BLUE_SWITCH 281 +#define EL_LANDMINE 282 +#define EL_ENVELOPE 283 +#define EL_LIGHT_SWITCH 284 +#define EL_SIGN_EXCLAMATION 285 +#define EL_SIGN_RADIOACTIVITY 286 +#define EL_SIGN_STOP 287 +#define EL_SIGN_WHEELCHAIR 288 +#define EL_SIGN_PARKING 289 +#define EL_SIGN_ONEWAY 290 +#define EL_SIGN_HEART 291 +#define EL_SIGN_TRIANGLE 292 +#define EL_SIGN_ROUND 293 +#define EL_SIGN_EXIT 294 +#define EL_SIGN_YINYANG 295 +#define EL_SIGN_OTHER 296 +#define EL_MOLE_LEFT 297 +#define EL_MOLE_RIGHT 298 +#define EL_MOLE_UP 299 +#define EL_MOLE_DOWN 300 +#define EL_STEEL_SLANTED 301 +#define EL_SAND_INVISIBLE 302 + /* "real" (and therefore drawable) runtime elements */ -#define EL_SIEB_LEER 300 -#define EL_SIEB2_LEER 301 -#define EL_SIEB_VOLL 302 -#define EL_SIEB2_VOLL 303 -#define EL_SIEB_TOT 304 -#define EL_SIEB2_TOT 305 -#define EL_AUSGANG_ACT 306 -#define EL_SP_TERMINAL_ACTIVE 307 -#define EL_SP_BUG_ACTIVE 308 -#define EL_EM_KEY_1 309 -#define EL_EM_KEY_2 310 -#define EL_EM_KEY_3 311 -#define EL_EM_KEY_4 312 -#define EL_DYNABOMB_ACTIVE_1 313 -#define EL_DYNABOMB_ACTIVE_2 314 -#define EL_DYNABOMB_ACTIVE_3 315 -#define EL_DYNABOMB_ACTIVE_4 316 +#define EL_SIEB_LEER 1000 +#define EL_SIEB2_LEER 1001 +#define EL_SIEB_VOLL 1002 +#define EL_SIEB2_VOLL 1003 +#define EL_SIEB_TOT 1004 +#define EL_SIEB2_TOT 1005 +#define EL_AUSGANG_ACT 1006 +#define EL_SP_TERMINAL_ACTIVE 1007 +#define EL_SP_BUG_ACTIVE 1008 +#define EL_EM_KEY_1 1009 +#define EL_EM_KEY_2 1010 +#define EL_EM_KEY_3 1011 +#define EL_EM_KEY_4 1012 +#define EL_DYNABOMB_ACTIVE_1 1013 +#define EL_DYNABOMB_ACTIVE_2 1014 +#define EL_DYNABOMB_ACTIVE_3 1015 +#define EL_DYNABOMB_ACTIVE_4 1016 /* "unreal" (and therefore not drawable) runtime elements */ -#define EL_BLOCKED 400 -#define EL_EXPLODING 401 -#define EL_CRACKINGNUT 402 -#define EL_BLURB_LEFT 403 -#define EL_BLURB_RIGHT 404 -#define EL_AMOEBING 405 -#define EL_MAUERND 406 -#define EL_BURNING 407 -#define EL_PLAYER_IS_LEAVING 408 +#define EL_BLOCKED 2000 +#define EL_EXPLODING 2001 +#define EL_CRACKINGNUT 2002 +#define EL_BLURB_LEFT 2003 +#define EL_BLURB_RIGHT 2004 +#define EL_AMOEBING 2005 +#define EL_MAUERND 2006 +#define EL_BURNING 2007 +#define EL_PLAYER_IS_LEAVING 2008 /* game graphics: ** 0 - 255: graphics from "RocksScreen" @@ -1213,6 +1263,55 @@ extern char *element_info[]; #define GFX_CHAR_COPY (GFX_CHAR_ASCII0 + 94) #define GFX_CHAR_END (GFX_CHAR_START + 79) +/* new elements which still have no graphic */ +#define GFX_PEARL GFX_CHAR_FRAGE +#define GFX_CRYSTAL GFX_CHAR_FRAGE +#define GFX_WALL_PEARL GFX_CHAR_FRAGE +#define GFX_WALL_CRYSTAL GFX_CHAR_FRAGE +#define GFX_DOOR_WHITE GFX_CHAR_FRAGE +#define GFX_DOOR_WHITE_GRAY GFX_CHAR_FRAGE +#define GFX_KEY_WHITE GFX_CHAR_FRAGE +#define GFX_FORCE_FIELD GFX_CHAR_FRAGE +#define GFX_EXTRA_TIME GFX_CHAR_FRAGE +#define GFX_SWITCH_GATE_OPEN GFX_CHAR_FRAGE +#define GFX_SWITCH_GATE_CLOSED GFX_CHAR_FRAGE +#define GFX_SWITCH_GATE_SWITCH GFX_CHAR_FRAGE +#define GFX_TIME_GATE GFX_CHAR_FRAGE +#define GFX_TIME_GATE_WHEEL GFX_CHAR_FRAGE +#define GFX_BELT_GREEN_LEFT GFX_CHAR_FRAGE +#define GFX_BELT_GREEN_MIDDLE GFX_CHAR_FRAGE +#define GFX_BELT_GREEN_RIGHT GFX_CHAR_FRAGE +#define GFX_BELT_GREEN_SWITCH GFX_CHAR_FRAGE +#define GFX_BELT_RED_LEFT GFX_CHAR_FRAGE +#define GFX_BELT_RED_MIDDLE GFX_CHAR_FRAGE +#define GFX_BELT_RED_RIGHT GFX_CHAR_FRAGE +#define GFX_BELT_RED_SWITCH GFX_CHAR_FRAGE +#define GFX_BELT_BLUE_LEFT GFX_CHAR_FRAGE +#define GFX_BELT_BLUE_MIDDLE GFX_CHAR_FRAGE +#define GFX_BELT_BLUE_RIGHT GFX_CHAR_FRAGE +#define GFX_BELT_BLUE_SWITCH GFX_CHAR_FRAGE +#define GFX_LANDMINE GFX_CHAR_FRAGE +#define GFX_ENVELOPE GFX_CHAR_FRAGE +#define GFX_LIGHT_SWITCH GFX_CHAR_FRAGE +#define GFX_SIGN_EXCLAMATION GFX_CHAR_FRAGE +#define GFX_SIGN_RADIOACTIVITY GFX_CHAR_FRAGE +#define GFX_SIGN_STOP GFX_CHAR_FRAGE +#define GFX_SIGN_WHEELCHAIR GFX_CHAR_FRAGE +#define GFX_SIGN_PARKING GFX_CHAR_FRAGE +#define GFX_SIGN_ONEWAY GFX_CHAR_FRAGE +#define GFX_SIGN_HEART GFX_CHAR_FRAGE +#define GFX_SIGN_TRIANGLE GFX_CHAR_FRAGE +#define GFX_SIGN_ROUND GFX_CHAR_FRAGE +#define GFX_SIGN_EXIT GFX_CHAR_FRAGE +#define GFX_SIGN_YINYANG GFX_CHAR_FRAGE +#define GFX_SIGN_OTHER GFX_CHAR_FRAGE +#define GFX_MOLE_LEFT GFX_CHAR_FRAGE +#define GFX_MOLE_RIGHT GFX_CHAR_FRAGE +#define GFX_MOLE_UP GFX_CHAR_FRAGE +#define GFX_MOLE_DOWN GFX_CHAR_FRAGE +#define GFX_STEEL_SLANTED GFX_CHAR_FRAGE +#define GFX_SAND_INVISIBLE GFX_CHAR_FRAGE + /* the names of the sounds */ #define SND_ALCHEMY 0 #define SND_AMOEBE 1 diff --git a/src/screens.c b/src/screens.c index 8afe5535..bd1a65f1 100644 --- a/src/screens.c +++ b/src/screens.c @@ -839,9 +839,16 @@ static void drawChooseLevelInfo(int leveldir_nr) int x, last_redraw_mask = redraw_mask; XFillRectangle(display, drawto, gc, SX + 32, SY + 32, SXSIZE - 32, 32); + +#if 0 DrawTextFCentered(40, FC_RED, "%3d levels (%s)", leveldir[leveldir_nr].levels, leveldir[leveldir_nr].readonly ? "readonly" : "writable"); +#else + DrawTextFCentered(40, FC_RED, "%3d levels (%s)", + leveldir[leveldir_nr].levels, + leveldir[leveldir_nr].class_desc); +#endif /* let BackToFront() redraw only what is needed */ redraw_mask = last_redraw_mask | REDRAW_TILES; @@ -915,7 +922,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) first_entry = 0; drawChooseLevelList(first_entry, num_page_entries); - drawChooseLevelInfo(first_entry); + drawChooseLevelInfo(first_entry + choice - 3); DrawGraphic(0, choice - 1, GFX_KUGEL_ROT); return; } @@ -930,7 +937,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) first_entry = MAX(0, num_leveldirs - num_page_entries); drawChooseLevelList(first_entry, num_page_entries); - drawChooseLevelInfo(first_entry + num_page_entries - 1); + drawChooseLevelInfo(first_entry + choice - 3); DrawGraphic(0, choice - 1, GFX_KUGEL_ROT); return; } diff --git a/src/tools.c b/src/tools.c index a5224ae1..4159ba7e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1532,26 +1532,35 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y) redraw_mask |= REDRAW_MICROLEVEL; } +#define MICROLABEL_EMPTY 0 +#define MICROLABEL_LEVEL_NAME 1 +#define MICROLABEL_CREATED_BY 2 +#define MICROLABEL_LEVEL_AUTHOR 3 +#define MICROLABEL_IMPORTED_FROM 4 +#define MICROLABEL_LEVEL_IMPORT_INFO 5 + +#define MAX_MICROLABEL_SIZE (SXSIZE / FONT4_XSIZE) + static void DrawMicroLevelLabelExt(int mode) { - char label_text[100]; + char label_text[MAX_MICROLABEL_SIZE + 1]; XFillRectangle(display, drawto,gc, SX, MICROLABEL_YPOS, SXSIZE, FONT4_YSIZE); - strcpy(label_text, (mode == 1 ? level.name : - mode == 2 ? "created by" : - mode == 3 ? level.author : "")); + strncpy(label_text, (mode == MICROLABEL_LEVEL_NAME ? level.name : + mode == MICROLABEL_CREATED_BY ? "created by" : + mode == MICROLABEL_LEVEL_AUTHOR ? level.author : + mode == MICROLABEL_IMPORTED_FROM ? "imported from" : + mode == MICROLABEL_LEVEL_IMPORT_INFO ? + leveldir[leveldir_nr].imported_from : ""), + MAX_MICROLABEL_SIZE); + label_text[MAX_MICROLABEL_SIZE] = '\0'; if (strlen(label_text) > 0) { - int size, lxpos, lypos; - - label_text[SXSIZE / FONT4_XSIZE] = '\0'; - - size = strlen(label_text); - lxpos = SX + (SXSIZE - size * FONT4_XSIZE) / 2; - lypos = MICROLABEL_YPOS; + int lxpos = SX + (SXSIZE - strlen(label_text) * FONT4_XSIZE) / 2; + int lypos = MICROLABEL_YPOS; DrawText(lxpos, lypos, label_text, FS_SMALL, FC_SPECIAL2); } @@ -1630,10 +1639,22 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) strcmp(level.author, leveldir[leveldir_nr].name) != 0 && DelayReached(&label_delay, MICROLEVEL_LABEL_DELAY)) { - label_counter = (label_counter + 1) % 23; - label_state = (label_counter >= 0 && label_counter <= 7 ? 1 : - label_counter >= 9 && label_counter <= 12 ? 2 : - label_counter >= 14 && label_counter <= 21 ? 3 : 0); + int max_label_counter = 23; + + if (leveldir[leveldir_nr].imported_from != NULL) + max_label_counter += 14; + + label_counter = (label_counter + 1) % max_label_counter; + label_state = (label_counter >= 0 && label_counter <= 7 ? + MICROLABEL_LEVEL_NAME : + label_counter >= 9 && label_counter <= 12 ? + MICROLABEL_CREATED_BY : + label_counter >= 14 && label_counter <= 21 ? + MICROLABEL_LEVEL_AUTHOR : + label_counter >= 23 && label_counter <= 26 ? + MICROLABEL_IMPORTED_FROM : + label_counter >= 28 && label_counter <= 35 ? + MICROLABEL_LEVEL_IMPORT_INFO : MICROLABEL_EMPTY); DrawMicroLevelLabelExt(label_state); } } @@ -2425,6 +2446,53 @@ int el2gfx(int element) 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; + case EL_PEARL: return GFX_PEARL; + case EL_CRYSTAL: return GFX_CRYSTAL; + case EL_WALL_PEARL: return GFX_WALL_PEARL; + case EL_WALL_CRYSTAL: return GFX_WALL_CRYSTAL; + case EL_DOOR_WHITE: return GFX_DOOR_WHITE; + case EL_DOOR_WHITE_GRAY: return GFX_DOOR_WHITE_GRAY; + case EL_KEY_WHITE: return GFX_KEY_WHITE; + case EL_FORCE_FIELD: return GFX_FORCE_FIELD; + case EL_EXTRA_TIME: return GFX_EXTRA_TIME; + case EL_SWITCH_GATE_OPEN: return GFX_SWITCH_GATE_OPEN; + case EL_SWITCH_GATE_CLOSED: return GFX_SWITCH_GATE_CLOSED; + case EL_SWITCH_GATE_SWITCH: return GFX_SWITCH_GATE_SWITCH; + case EL_TIME_GATE: return GFX_TIME_GATE; + case EL_TIME_GATE_WHEEL: return GFX_TIME_GATE_WHEEL; + case EL_BELT_GREEN_LEFT: return GFX_BELT_GREEN_LEFT; + case EL_BELT_GREEN_MIDDLE: return GFX_BELT_GREEN_MIDDLE; + case EL_BELT_GREEN_RIGHT: return GFX_BELT_GREEN_RIGHT; + case EL_BELT_GREEN_SWITCH: return GFX_BELT_GREEN_SWITCH; + case EL_BELT_RED_LEFT: return GFX_BELT_RED_LEFT; + case EL_BELT_RED_MIDDLE: return GFX_BELT_RED_MIDDLE; + case EL_BELT_RED_RIGHT: return GFX_BELT_RED_RIGHT; + case EL_BELT_RED_SWITCH: return GFX_BELT_RED_SWITCH; + case EL_BELT_BLUE_LEFT: return GFX_BELT_BLUE_LEFT; + case EL_BELT_BLUE_MIDDLE: return GFX_BELT_BLUE_MIDDLE; + case EL_BELT_BLUE_RIGHT: return GFX_BELT_BLUE_RIGHT; + case EL_BELT_BLUE_SWITCH: return GFX_BELT_BLUE_SWITCH; + case EL_LANDMINE: return GFX_LANDMINE; + case EL_ENVELOPE: return GFX_ENVELOPE; + case EL_LIGHT_SWITCH: return GFX_LIGHT_SWITCH; + case EL_SIGN_EXCLAMATION: return GFX_SIGN_EXCLAMATION; + case EL_SIGN_RADIOACTIVITY: return GFX_SIGN_RADIOACTIVITY; + case EL_SIGN_STOP: return GFX_SIGN_STOP; + case EL_SIGN_WHEELCHAIR: return GFX_SIGN_WHEELCHAIR; + case EL_SIGN_PARKING: return GFX_SIGN_PARKING; + case EL_SIGN_ONEWAY: return GFX_SIGN_ONEWAY; + case EL_SIGN_HEART: return GFX_SIGN_HEART; + case EL_SIGN_TRIANGLE: return GFX_SIGN_TRIANGLE; + case EL_SIGN_ROUND: return GFX_SIGN_ROUND; + case EL_SIGN_EXIT: return GFX_SIGN_EXIT; + case EL_SIGN_YINYANG: return GFX_SIGN_YINYANG; + case EL_SIGN_OTHER: return GFX_SIGN_OTHER; + case EL_MOLE_LEFT: return GFX_MOLE_LEFT; + case EL_MOLE_RIGHT: return GFX_MOLE_RIGHT; + case EL_MOLE_UP: return GFX_MOLE_UP; + case EL_MOLE_DOWN: return GFX_MOLE_DOWN; + case EL_STEEL_SLANTED: return GFX_STEEL_SLANTED; + case EL_SAND_INVISIBLE: return GFX_SAND_INVISIBLE; default: { -- 2.34.1 From d4665f01d15ba3679f378819710a84d6c2348a9c Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 7 Aug 1999 21:22:34 +0200 Subject: [PATCH 14/16] rnd-19990807-1-src --- src/editor.c | 61 ++++++- src/game.c | 101 +++++++++-- src/image.c | 4 +- src/init.c | 81 +++++++-- src/main.c | 98 ++++++----- src/main.h | 471 ++++++++++++++++++++++++++++++--------------------- src/pcx.c | 15 ++ src/pcx.h | 3 + src/tools.c | 116 ++++++++----- 9 files changed, 642 insertions(+), 308 deletions(-) diff --git a/src/editor.c b/src/editor.c index bf51938f..6aa94aeb 100644 --- a/src/editor.c +++ b/src/editor.c @@ -736,7 +736,7 @@ int editor_element[] = EL_CHAR('U'), EL_CHAR('L'), - EL_CHAR_MINUS, + EL_CHAR('-'), EL_CHAR('D'), EL_CHAR('E'), EL_CHAR('R'), @@ -774,7 +774,7 @@ int editor_element[] = EL_CHAR('E'), EL_CHAR('M'), EL_CHAR('E'), - EL_CHAR_MINUS, + EL_CHAR('-'), EL_CHAR('R'), EL_CHAR('A'), @@ -936,7 +936,7 @@ int editor_element[] = EL_CHAR('K'), EL_CHAR('O'), - EL_CHAR_MINUS, + EL_CHAR('-'), EL_CHAR('B'), EL_CHAR('A'), EL_CHAR('N'), @@ -946,11 +946,6 @@ int editor_element[] = EL_SOKOBAN_FELD_VOLL, EL_BETON, - EL_LEERRAUM, - EL_LEERRAUM, - EL_LEERRAUM, - EL_LEERRAUM, - EL_CHAR('S'), EL_CHAR('U'), EL_CHAR('P'), @@ -1011,6 +1006,56 @@ int editor_element[] = EL_SP_CHIP_UPPER, EL_SP_CHIP_LOWER, + EL_CHAR('D'), + EL_CHAR('I'), + EL_CHAR('A'), + EL_CHAR('-'), + + EL_CHAR('M'), + EL_CHAR('O'), + EL_CHAR('N'), + EL_CHAR('D'), + + EL_CHAR('C'), + EL_CHAR('A'), + EL_CHAR('V'), + EL_CHAR('E'), + + EL_CHAR('S'), + EL_CHAR(' '), + EL_CHAR('I'), + EL_CHAR('I'), + + EL_BELT1_LEFT, + EL_BELT1_MIDDLE, + EL_BELT1_RIGHT, + EL_BELT1_SWITCH_M, + + EL_BELT2_LEFT, + EL_BELT2_MIDDLE, + EL_BELT2_RIGHT, + EL_BELT2_SWITCH_M, + + EL_BELT3_LEFT, + EL_BELT3_MIDDLE, + EL_BELT3_RIGHT, + EL_BELT3_SWITCH_M, + + EL_BELT4_LEFT, + EL_BELT4_MIDDLE, + EL_BELT4_RIGHT, + EL_BELT4_SWITCH_M, + + EL_BELT1_SWITCH_L, + EL_BELT2_SWITCH_L, + EL_BELT3_SWITCH_L, + EL_BELT4_SWITCH_L, + + EL_BELT1_SWITCH_R, + EL_BELT2_SWITCH_R, + EL_BELT3_SWITCH_R, + EL_BELT4_SWITCH_R, + /* EL_CHAR('D'), EL_CHAR('Y'), diff --git a/src/game.c b/src/game.c index d4860369..ce6ca3ab 100644 --- a/src/game.c +++ b/src/game.c @@ -23,6 +23,9 @@ #include "joystick.h" #include "network.h" +/* this switch controls how rocks move horizontally */ +#define OLD_GAME_BEHAVIOUR FALSE + /* for DigField() */ #define DF_NO_PUSH 0 #define DF_DIG 1 @@ -144,7 +147,7 @@ static unsigned int getStateCheckSum(int counter) checksum += mult++ * StorePlayer[x][y]; checksum += mult++ * Frame[x][y]; checksum += mult++ * AmoebaNr[x][y]; - checksum += mult++ * JustHit[x][y]; + checksum += mult++ * JustStopped[x][y]; checksum += mult++ * Stop[x][y]; */ } @@ -366,6 +369,7 @@ void InitGame() player->MovDir = MV_NO_MOVING; player->MovPos = 0; player->Pushing = FALSE; + player->Switching = FALSE; player->GfxPos = 0; player->Frame = 0; @@ -419,6 +423,8 @@ void InitGame() AllPlayersGone = FALSE; game.magic_wall_active = FALSE; game.magic_wall_time_left = 0; + for (i=0; i<4; i++) + game.belt_dir[i] = MV_NO_MOVING; for (i=0; i0 && IS_FREE(x-1, y) && (IS_FREE(x-1, y+1) || Feld[x-1][y+1] == EL_SALZSAEURE)); @@ -2431,12 +2443,14 @@ void ContinueMoving(int x, int y) int newx = x + dx, newy = y + dy; int step = (horiz_move ? dx : dy) * TILEX/8; - if (CAN_FALL(element) && horiz_move && !IS_SP_ELEMENT(element)) - step*=2; - else if (element == EL_TROPFEN) + if (element == EL_TROPFEN) step/=2; else if (Store[x][y] == EL_MORAST_VOLL || Store[x][y] == EL_MORAST_LEER) step/=4; +#if OLD_GAME_BEHAVIOUR + else if (CAN_FALL(element) && horiz_move && !IS_SP_ELEMENT(element)) + step*=2; +#endif MovPos[x][y] += step; @@ -2500,7 +2514,7 @@ void ContinueMoving(int x, int y) DrawLevelField(newx, newy); Stop[newx][newy] = TRUE; - JustHit[x][newy] = 3; + JustStopped[newx][newy] = 3; if (DONT_TOUCH(element)) /* object may be nasty to player or others */ { @@ -3566,8 +3580,8 @@ void GameActions() for (y=0; y0) - JustHit[x][y]--; + if (JustStopped[x][y] > 0) + JustStopped[x][y]--; #if DEBUG if (IS_BLOCKED(x, y)) @@ -4355,6 +4369,7 @@ int DigField(struct PlayerInfo *player, if (mode == DF_NO_PUSH) { + player->Switching = FALSE; player->push_delay = 0; return MF_NO_ACTION; } @@ -4364,7 +4379,7 @@ int DigField(struct PlayerInfo *player, element = Feld[x][y]; - switch(element) + switch (element) { case EL_LEERRAUM: PlaySoundLevel(x, y, SND_EMPTY); @@ -4511,6 +4526,72 @@ int DigField(struct PlayerInfo *player, } break; + case EL_BELT1_SWITCH_L: + case EL_BELT1_SWITCH_M: + case EL_BELT1_SWITCH_R: + case EL_BELT2_SWITCH_L: + case EL_BELT2_SWITCH_M: + case EL_BELT2_SWITCH_R: + case EL_BELT3_SWITCH_L: + case EL_BELT3_SWITCH_M: + case EL_BELT3_SWITCH_R: + case EL_BELT4_SWITCH_L: + case EL_BELT4_SWITCH_M: + case EL_BELT4_SWITCH_R: + { + static int belt_base_element[4] = + { + EL_BELT1_SWITCH_L, + EL_BELT2_SWITCH_L, + EL_BELT3_SWITCH_L, + EL_BELT4_SWITCH_L + }; + static int belt_move_dir[3] = + { + MV_LEFT, + MV_NO_MOVING, + MV_RIGHT + }; + + int belt_nr = (element < EL_BELT2_SWITCH_L ? 0 : + element < EL_BELT3_SWITCH_L ? 1 : + element < EL_BELT4_SWITCH_L ? 2 : 3); + int belt_dir_nr = element - belt_base_element[belt_nr]; + int belt_dir_nr_next = (belt_dir_nr + 1) % 3; + int belt_dir_next = belt_move_dir[belt_dir_nr_next]; + int xx, yy; + + if (player->Switching) + return MF_ACTION; + + game.belt_dir[belt_nr] = belt_dir_next; + + for (yy=0; yySwitching = TRUE; + + return MF_ACTION; + } + break; + case EL_SP_EXIT: if (local_player->gems_still_needed > 0) return MF_NO_ACTION; diff --git a/src/image.c b/src/image.c index 09a75fce..83d8216b 100644 --- a/src/image.c +++ b/src/image.c @@ -514,7 +514,7 @@ int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename, /* read the graphic file in PCX format to image structure */ if ((image = Read_PCX_to_Image(filename)) == NULL) - return PCX_FileInvalid; + return errno_pcx; #if DEBUG_TIMING printf("%s:\n", filename); @@ -548,7 +548,7 @@ int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename, *pixmap = ximageinfo->pixmap; *pixmap_mask = ximageinfo->pixmap_mask; - return(PCX_Success); + return PCX_Success; } #endif /* !MSDOS */ diff --git a/src/init.c b/src/init.c index 78bfb711..00cf8234 100644 --- a/src/init.c +++ b/src/init.c @@ -480,7 +480,8 @@ void InitGfx() { "Door", TRUE }, { "Heroes", TRUE }, { "Toons", TRUE }, - { "More", TRUE }, + { "SP", TRUE }, + { "DC", TRUE }, { "Font", FALSE }, { "Font2", FALSE } }; @@ -491,7 +492,8 @@ void InitGfx() { "RocksDoor", TRUE }, { "RocksHeroes", TRUE }, { "RocksToons", TRUE }, - { "RocksMore", TRUE }, + { "RocksSP", TRUE }, + { "RocksDC", TRUE }, { "RocksFont", FALSE }, { "RocksFont2", FALSE } }; @@ -1553,7 +1555,41 @@ void InitElementProperties() }; static int ep_active_bomb_num = sizeof(ep_active_bomb)/sizeof(int); - static long ep_bit[] = + static int ep_belt[] = + { + EL_BELT1_LEFT, + EL_BELT1_MIDDLE, + EL_BELT1_RIGHT, + EL_BELT2_LEFT, + EL_BELT2_MIDDLE, + EL_BELT2_RIGHT, + EL_BELT3_LEFT, + EL_BELT3_MIDDLE, + EL_BELT3_RIGHT, + EL_BELT4_LEFT, + EL_BELT4_MIDDLE, + EL_BELT4_RIGHT, + }; + static int ep_belt_num = sizeof(ep_belt)/sizeof(int); + + static int ep_belt_switch[] = + { + EL_BELT1_SWITCH_L, + EL_BELT1_SWITCH_M, + EL_BELT1_SWITCH_R, + EL_BELT2_SWITCH_L, + EL_BELT2_SWITCH_M, + EL_BELT2_SWITCH_R, + EL_BELT3_SWITCH_L, + EL_BELT3_SWITCH_M, + EL_BELT3_SWITCH_R, + EL_BELT4_SWITCH_L, + EL_BELT4_SWITCH_M, + EL_BELT4_SWITCH_R, + }; + static int ep_belt_switch_num = sizeof(ep_belt_switch)/sizeof(int); + + static long ep1_bit[] = { EP_BIT_AMOEBALIVE, EP_BIT_AMOEBOID, @@ -1587,7 +1623,12 @@ void InitElementProperties() EP_BIT_OVER_PLAYER, EP_BIT_ACTIVE_BOMB }; - static int *ep_array[] = + static long ep2_bit[] = + { + EP_BIT_BELT, + EP_BIT_BELT_SWITCH + }; + static int *ep1_array[] = { ep_amoebalive, ep_amoeboid, @@ -1621,7 +1662,12 @@ void InitElementProperties() ep_over_player, ep_active_bomb }; - static int *ep_num[] = + static int *ep2_array[] = + { + ep_belt, + ep_belt_switch + }; + static int *ep1_num[] = { &ep_amoebalive_num, &ep_amoeboid_num, @@ -1655,16 +1701,29 @@ void InitElementProperties() &ep_over_player_num, &ep_active_bomb_num }; - static int num_properties = sizeof(ep_num)/sizeof(int *); + static int *ep2_num[] = + { + &ep_belt_num, + &ep_belt_switch_num + }; + static int num_properties1 = sizeof(ep1_num)/sizeof(int *); + static int num_properties2 = sizeof(ep2_num)/sizeof(int *); for(i=0; i'", + "letter '>'", /* 150 */ "letter '?'", "letter '@'", "letter 'A'", @@ -356,7 +357,7 @@ char *element_info[] = "letter 'E'", "letter 'F'", "letter 'G'", - "letter 'H'", + "letter 'H'", /* 160 */ "letter 'I'", "letter 'J'", "letter 'K'", @@ -366,7 +367,7 @@ char *element_info[] = "letter 'O'", "letter 'P'", "letter 'Q'", - "letter 'R'", + "letter 'R'", /* 170 */ "letter 'S'", "letter 'T'", "letter 'U'", @@ -376,7 +377,7 @@ char *element_info[] = "letter 'Y'", "letter 'Z'", "letter 'Ä'", - "letter 'Ö'", + "letter 'Ö'", /* 180 */ "letter 'Ü'", "letter '^'", "letter ''", @@ -386,6 +387,7 @@ char *element_info[] = "letter ''", "letter ''", "letter ''", + "letter ''", /* 190 */ "letter ''", "letter ''", "letter ''", @@ -395,8 +397,7 @@ char *element_info[] = "letter ''", "letter ''", "letter ''", - "letter ''", - "growing wall (horizontally)", + "growing wall (horizontally)", /* 200 */ "growing wall (vertically)", "growing wall (all directions)", "unused", @@ -406,7 +407,7 @@ char *element_info[] = "unused", "unused", "unused", - "empty space", + "empty space", /* 210 */ "zonk", "base", "murphy", @@ -416,7 +417,7 @@ char *element_info[] = "exit", "orange disk", "port (leading right)", - "port (leading down)", + "port (leading down)", /* 220 */ "port (leading left)", "port (leading up)", "port (leading right)", @@ -426,7 +427,7 @@ char *element_info[] = "snik snak", "yellow disk", "terminal", - "red disk", + "red disk", /* 230 */ "port (vertically)", "port (horizontally)", "port (all directions)", @@ -436,7 +437,7 @@ char *element_info[] = "chip (right half)", "hardware", "hardware", - "hardware", + "hardware", /* 240 */ "hardware", "hardware", "hardware", @@ -446,7 +447,7 @@ char *element_info[] = "hardware", "chip (upper half)", "chip (lower half)", - "unknown", + "unknown", /* 250 */ "unknown", "unknown", "unknown", @@ -455,38 +456,51 @@ char *element_info[] = /* 256 */ - "pearl", + "pearl", /* (256) */ "crystal", "wall with pearl", "wall with crystal", - "white door", + "white door", /* 260 */ "gray door (opened by white key)", "white key", "force field", "extra time", "switch gate (open)", "switch gate (closed)", - "switch for switch gate", + "switch for switch gate (open)", + "switch for switch gate (closed)", "time gate", - "time gate with magic wheel", - "green conveyor belt (left)", - "green conveyor belt (middle)", - "green conveyor belt (right)", - "switch for green conveyor belt", + "time gate with magic wheel", /* 270 */ "red conveyor belt (left)", "red conveyor belt (middle)", "red conveyor belt (right)", - "switch for red conveyor belt", + "switch for red conveyor belt (left)", + "switch for red conveyor belt (middle)", + "switch for red conveyor belt (right)", + "yellow conveyor belt (left)", + "yellow conveyor belt (middle)", + "yellow conveyor belt (right)", + "switch for yellow conveyor belt (left)", /* 280 */ + "switch for yellow conveyor belt (middle)", + "switch for yellow conveyor belt (right)", + "green conveyor belt (left)", + "green conveyor belt (middle)", + "green conveyor belt (right)", + "switch for green conveyor belt (left)", + "switch for green conveyor belt (middle)", + "switch for green conveyor belt (right)", "blue conveyor belt (left)", - "blue conveyor belt (middle)", + "blue conveyor belt (middle)", /* 290 */ "blue conveyor belt (right)", - "switch for blue conveyor belt", + "switch for blue conveyor belt (left)", + "switch for blue conveyor belt (middle)", + "switch for blue conveyor belt (right)", "land mine", "mail envelope", "light switch", "sign (exclamation)", "sign (radio activity)", - "sign (stop)", + "sign (stop)", /* 300 */ "sign (wheel chair)", "sign (parking)", "sign (one way)", @@ -496,7 +510,7 @@ char *element_info[] = "sign (exit)", "sign (yin yang)", "sign (other)", - "mole (starts moving left)", + "mole (starts moving left)", /* 310 */ "mole (starts moving right)", "mole (starts moving up)", "mole (starts moving down)", @@ -506,7 +520,7 @@ char *element_info[] = "-", "-", "-", - "-", + "-", /* 320 */ "-", "-", "-", diff --git a/src/main.h b/src/main.h index 0550a996..b10d0357 100644 --- a/src/main.h +++ b/src/main.h @@ -95,6 +95,7 @@ typedef unsigned char byte; #define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2) #define IN_LEV_FIELD(x,y) ((x)>=0 && (x)=0 &&(y)= 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_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) { graphic -= GFX_START_ROCKSHEROES; @@ -755,6 +748,20 @@ void getGraphicSource(int graphic, int *pixmap_nr, int *x, int *y) *x = (graphic % HEROES_PER_LINE) * TILEX; *y = (graphic / HEROES_PER_LINE) * TILEY; } + else if (graphic >= GFX_START_ROCKSSP && graphic <= GFX_END_ROCKSSP) + { + graphic -= GFX_START_ROCKSSP; + *pixmap_nr = PIX_SP; + *x = (graphic % SP_PER_LINE) * TILEX; + *y = (graphic / SP_PER_LINE) * TILEY; + } + else if (graphic >= GFX_START_ROCKSDC && graphic <= GFX_END_ROCKSDC) + { + graphic -= GFX_START_ROCKSDC; + *pixmap_nr = PIX_DC; + *x = (graphic % DC_PER_LINE) * TILEX; + *y = (graphic / DC_PER_LINE) * TILEY; + } else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) { graphic -= GFX_START_ROCKSFONT; @@ -765,7 +772,7 @@ void getGraphicSource(int graphic, int *pixmap_nr, int *x, int *y) } else { - *pixmap_nr = PIX_MORE; + *pixmap_nr = PIX_SP; *x = 0; *y = 0; } @@ -860,13 +867,20 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y) *x = MINI_GFX_STARTX + (graphic % MINI_GFX_PER_LINE) * MINI_TILEX; *y = MINI_GFX_STARTY + (graphic / MINI_GFX_PER_LINE) * MINI_TILEY; } - else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) + else if (graphic >= GFX_START_ROCKSSP && graphic <= GFX_END_ROCKSSP) { - 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; + graphic -= GFX_START_ROCKSSP; + graphic -= ((graphic / SP_PER_LINE) * SP_PER_LINE) / 2; + *pixmap = pix[PIX_SP]; + *x = MINI_SP_STARTX + (graphic % MINI_SP_PER_LINE) * MINI_TILEX; + *y = MINI_SP_STARTY + (graphic / MINI_SP_PER_LINE) * MINI_TILEY; + } + else if (graphic >= GFX_START_ROCKSDC && graphic <= GFX_END_ROCKSDC) + { + graphic -= GFX_START_ROCKSDC; + *pixmap = pix[PIX_DC]; + *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_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) { @@ -878,9 +892,9 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y) } else { - *pixmap = pix[PIX_MORE]; - *x = MINI_MORE_STARTX; - *y = MINI_MORE_STARTY; + *pixmap = pix[PIX_SP]; + *x = MINI_SP_STARTX; + *y = MINI_SP_STARTY; } } @@ -1459,13 +1473,22 @@ void DrawMicroElement(int xpos, int ypos, int element) graphic = el2gfx(element); - if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) + if (graphic >= GFX_START_ROCKSSP && graphic <= GFX_END_ROCKSSP) + { + graphic -= GFX_START_ROCKSSP; + graphic -= ((graphic / SP_PER_LINE) * SP_PER_LINE) / 2; + XCopyArea(display, pix[PIX_SP], drawto, gc, + MICRO_SP_STARTX + (graphic % MICRO_SP_PER_LINE) *MICRO_TILEX, + MICRO_SP_STARTY + (graphic / MICRO_SP_PER_LINE) *MICRO_TILEY, + MICRO_TILEX, MICRO_TILEY, xpos, ypos); + } + else if (graphic >= GFX_START_ROCKSDC && graphic <= GFX_END_ROCKSDC) { - 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, + graphic -= GFX_START_ROCKSDC; + graphic -= ((graphic / DC_PER_LINE) * DC_PER_LINE) / 2; + XCopyArea(display, pix[PIX_DC], drawto, gc, + MICRO_DC_STARTX + (graphic % MICRO_DC_PER_LINE) *MICRO_TILEX, + MICRO_DC_STARTY + (graphic / MICRO_DC_PER_LINE) *MICRO_TILEY, MICRO_TILEX, MICRO_TILEY, xpos, ypos); } else @@ -2455,23 +2478,36 @@ int el2gfx(int element) case EL_KEY_WHITE: return GFX_KEY_WHITE; case EL_FORCE_FIELD: return GFX_FORCE_FIELD; case EL_EXTRA_TIME: return GFX_EXTRA_TIME; - case EL_SWITCH_GATE_OPEN: return GFX_SWITCH_GATE_OPEN; - case EL_SWITCH_GATE_CLOSED: return GFX_SWITCH_GATE_CLOSED; - case EL_SWITCH_GATE_SWITCH: return GFX_SWITCH_GATE_SWITCH; + case EL_SWITCHGATE_OPEN: return GFX_SWITCHGATE_OPEN; + case EL_SWITCHGATE_CLOSED: return GFX_SWITCHGATE_CLOSED; + case EL_SWITCHGATE_SWITCH_L:return GFX_SWITCHGATE_SWITCH_L; + case EL_SWITCHGATE_SWITCH_R:return GFX_SWITCHGATE_SWITCH_R; case EL_TIME_GATE: return GFX_TIME_GATE; case EL_TIME_GATE_WHEEL: return GFX_TIME_GATE_WHEEL; - case EL_BELT_GREEN_LEFT: return GFX_BELT_GREEN_LEFT; - case EL_BELT_GREEN_MIDDLE: return GFX_BELT_GREEN_MIDDLE; - case EL_BELT_GREEN_RIGHT: return GFX_BELT_GREEN_RIGHT; - case EL_BELT_GREEN_SWITCH: return GFX_BELT_GREEN_SWITCH; - case EL_BELT_RED_LEFT: return GFX_BELT_RED_LEFT; - case EL_BELT_RED_MIDDLE: return GFX_BELT_RED_MIDDLE; - case EL_BELT_RED_RIGHT: return GFX_BELT_RED_RIGHT; - case EL_BELT_RED_SWITCH: return GFX_BELT_RED_SWITCH; - case EL_BELT_BLUE_LEFT: return GFX_BELT_BLUE_LEFT; - case EL_BELT_BLUE_MIDDLE: return GFX_BELT_BLUE_MIDDLE; - case EL_BELT_BLUE_RIGHT: return GFX_BELT_BLUE_RIGHT; - case EL_BELT_BLUE_SWITCH: return GFX_BELT_BLUE_SWITCH; + case EL_BELT1_LEFT: return GFX_BELT1_LEFT; + case EL_BELT1_MIDDLE: return GFX_BELT1_MIDDLE; + case EL_BELT1_RIGHT: return GFX_BELT1_RIGHT; + case EL_BELT1_SWITCH_L: return GFX_BELT1_SWITCH_L; + case EL_BELT1_SWITCH_M: return GFX_BELT1_SWITCH_M; + case EL_BELT1_SWITCH_R: return GFX_BELT1_SWITCH_R; + case EL_BELT2_LEFT: return GFX_BELT2_LEFT; + case EL_BELT2_MIDDLE: return GFX_BELT2_MIDDLE; + case EL_BELT2_RIGHT: return GFX_BELT2_RIGHT; + case EL_BELT2_SWITCH_L: return GFX_BELT2_SWITCH_L; + case EL_BELT2_SWITCH_M: return GFX_BELT2_SWITCH_M; + case EL_BELT2_SWITCH_R: return GFX_BELT2_SWITCH_R; + case EL_BELT3_LEFT: return GFX_BELT3_LEFT; + case EL_BELT3_MIDDLE: return GFX_BELT3_MIDDLE; + case EL_BELT3_RIGHT: return GFX_BELT3_RIGHT; + case EL_BELT3_SWITCH_L: return GFX_BELT3_SWITCH_L; + case EL_BELT3_SWITCH_M: return GFX_BELT3_SWITCH_M; + case EL_BELT3_SWITCH_R: return GFX_BELT3_SWITCH_R; + case EL_BELT4_LEFT: return GFX_BELT4_LEFT; + case EL_BELT4_MIDDLE: return GFX_BELT4_MIDDLE; + case EL_BELT4_RIGHT: return GFX_BELT4_RIGHT; + case EL_BELT4_SWITCH_L: return GFX_BELT4_SWITCH_L; + case EL_BELT4_SWITCH_M: return GFX_BELT4_SWITCH_M; + case EL_BELT4_SWITCH_R: return GFX_BELT4_SWITCH_R; case EL_LANDMINE: return GFX_LANDMINE; case EL_ENVELOPE: return GFX_ENVELOPE; case EL_LIGHT_SWITCH: return GFX_LIGHT_SWITCH; @@ -2503,10 +2539,10 @@ int el2gfx(int element) 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) * SP_PER_LINE + (nr_element % gfx_per_line); - return GFX_START_ROCKSMORE + nr_graphic; + return GFX_START_ROCKSSP + nr_graphic; } else return -1; -- 2.34.1 From 12d604d7378a05f91df4b061195a9943f2214da8 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sun, 8 Aug 1999 03:45:49 +0200 Subject: [PATCH 15/16] rnd-19990808-1-src --- src/editor.c | 15 +++-- src/events.c | 5 +- src/game.c | 151 ++++++++++++++++++++++++++++++++++++++++++++------- src/main.h | 66 +++++++++++----------- src/tools.c | 30 +++++----- 5 files changed, 196 insertions(+), 71 deletions(-) diff --git a/src/editor.c b/src/editor.c index 6aa94aeb..5fb13e1e 100644 --- a/src/editor.c +++ b/src/editor.c @@ -3935,6 +3935,8 @@ void HandleLevelEditorKeyInput(KeySym key) ClickOnGadget(level_editor_gadget[id], button); else if (letter == '.') ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button); + else if (key == XK_space || key == XK_Return) + ClickOnGadget(level_editor_gadget[GADGET_ID_TEST], button); else for (i=0; i= 'A' && key <= 'Z' ? "Shift-" : - gi->custom_id == GADGET_ID_SINGLE_ITEMS ? ".' or '" : ""), - key); + if (gi->custom_id == GADGET_ID_SINGLE_ITEMS) /* special case 1 */ + sprintf(shortcut, " ('.' or '%c')", key); + else if (gi->custom_id == GADGET_ID_TEST) /* special case 2 */ + sprintf(shortcut, " ('Enter' or 'Shift-%c')", key); + else /* normal case */ + sprintf(shortcut, " ('%s%c')", + (key >= 'A' && key <= 'Z' ? "Shift-" : ""), key); if (strlen(infotext) + strlen(shortcut) <= MAX_INFOTEXT_LEN) strcat(infotext, shortcut); diff --git a/src/events.c b/src/events.c index a34c1ab9..0e812285 100644 --- a/src/events.c +++ b/src/events.c @@ -477,7 +477,8 @@ void HandleKey(KeySym key, int key_status) if (key_status == KEY_RELEASED) return; - if (key == XK_Return && game_status == PLAYING && AllPlayersGone) + if ((key == XK_Return || key == XK_space) && + game_status == PLAYING && AllPlayersGone) { CloseDoor(DOOR_CLOSE_1); game_status = MAINMENU; @@ -520,6 +521,7 @@ void HandleKey(KeySym key, int key_status) switch(key) { case XK_Return: + case XK_space: if (game_status == MAINMENU) HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE); else if (game_status == CHOOSELEVEL) @@ -553,6 +555,7 @@ void HandleKey(KeySym key, int key_status) switch(key) { case XK_Return: + case XK_space: game_status = MAINMENU; DrawMainMenu(); BackToFront(); diff --git a/src/game.c b/src/game.c index ce6ca3ab..2fd57d06 100644 --- a/src/game.c +++ b/src/game.c @@ -179,6 +179,50 @@ void GetPlayerConfig() InitJoysticks(); } +static int getBeltNrFromElement(int element) +{ + return (element < EL_BELT2_LEFT ? 0 : + element < EL_BELT3_LEFT ? 1 : + element < EL_BELT4_LEFT ? 2 : 3); +} + +static int getBeltNrFromSwitchElement(int element) +{ + return (element < EL_BELT2_SWITCH_L ? 0 : + element < EL_BELT3_SWITCH_L ? 1 : + element < EL_BELT4_SWITCH_L ? 2 : 3); +} + +static int getBeltDirNrFromSwitchElement(int element) +{ + static int belt_base_element[4] = + { + EL_BELT1_SWITCH_L, + EL_BELT2_SWITCH_L, + EL_BELT3_SWITCH_L, + EL_BELT4_SWITCH_L + }; + + int belt_nr = getBeltNrFromSwitchElement(element); + int belt_dir_nr = element - belt_base_element[belt_nr]; + + return (belt_dir_nr % 3); +} + +static int getBeltDirFromSwitchElement(int element) +{ + static int belt_move_dir[3] = + { + MV_LEFT, + MV_NO_MOVING, + MV_RIGHT + }; + + int belt_dir_nr = getBeltDirNrFromSwitchElement(element); + + return belt_move_dir[belt_dir_nr]; +} + static void InitField(int x, int y, boolean init_game) { switch (Feld[x][y]) @@ -322,6 +366,34 @@ static void InitField(int x, int y, boolean init_game) Feld[x][y] = EL_EM_KEY_4; break; + case EL_BELT1_SWITCH_L: + case EL_BELT1_SWITCH_M: + case EL_BELT1_SWITCH_R: + case EL_BELT2_SWITCH_L: + case EL_BELT2_SWITCH_M: + case EL_BELT2_SWITCH_R: + case EL_BELT3_SWITCH_L: + case EL_BELT3_SWITCH_M: + case EL_BELT3_SWITCH_R: + case EL_BELT4_SWITCH_L: + case EL_BELT4_SWITCH_M: + case EL_BELT4_SWITCH_R: + if (init_game) + { + int belt_nr = getBeltNrFromSwitchElement(Feld[x][y]); + int belt_dir = getBeltDirFromSwitchElement(Feld[x][y]); + int belt_dir_nr = getBeltDirNrFromSwitchElement(Feld[x][y]); + + if (game.belt_dir_nr[belt_nr] == 3) /* initial value */ + { + game.belt_dir[belt_nr] = belt_dir; + game.belt_dir_nr[belt_nr] = belt_dir_nr; + } + else /* more than one switch -- set it like the first switch */ + { + Feld[x][y] = Feld[x][y] - belt_dir_nr + game.belt_dir_nr[belt_nr]; + } + } default: break; } @@ -424,7 +496,10 @@ void InitGame() game.magic_wall_active = FALSE; game.magic_wall_time_left = 0; for (i=0; i<4; i++) + { game.belt_dir[i] = MV_NO_MOVING; + game.belt_dir_nr[i] = 3; /* no moving, next switch left */ + } for (i=0; i0 && IS_FREE(x-1, y)); + boolean right_is_free = (xSwitching) return MF_ACTION; - game.belt_dir[belt_nr] = belt_dir_next; + game.belt_dir_nr[belt_nr] = belt_dir_nr; + game.belt_dir[belt_nr] = belt_dir; + + if (belt_dir_nr == 3) + belt_dir_nr = 1; + + player->Switching = TRUE; for (yy=0; yySwitching = TRUE; - return MF_ACTION; } break; diff --git a/src/main.h b/src/main.h index b10d0357..72528fa6 100644 --- a/src/main.h +++ b/src/main.h @@ -216,7 +216,7 @@ typedef unsigned char byte; #define MAX_TAPELEN (1000 * 50) /* max. time * framerate */ #define MAX_LEVDIR_ENTRIES 100 #define MAX_SCORE_ENTRIES 100 -#define MAX_ELEMENTS 512 +#define MAX_ELEMENTS 700 /* 500 static + 200 runtime */ #define MAX_NUM_AMOEBA 100 /* values for elements with content */ @@ -419,6 +419,7 @@ struct GameInfo boolean magic_wall_active; int magic_wall_time_left; int belt_dir[4]; + int belt_dir_nr[4]; }; struct GlobalInfo @@ -576,6 +577,7 @@ extern char *element_info[]; #define MICRO_GFX_PER_LINE 128 #define HEROES_PER_LINE 16 + #define MINI_SP_STARTX 0 #define MINI_SP_STARTY 352 #define MICRO_SP_STARTX 0 @@ -586,18 +588,18 @@ extern char *element_info[]; #define MINI_DC_STARTX 256 #define MINI_DC_STARTY 0 -#define MICRO_DC_STARTX 0 -#define MICRO_DC_STARTY 0 +#define MICRO_DC_STARTX 256 +#define MICRO_DC_STARTY 384 #define DC_PER_LINE 8 #define MINI_DC_PER_LINE 8 -#define MICRO_DC_PER_LINE 32 +#define MICRO_DC_PER_LINE 8 #define FONT_CHARS_PER_LINE 16 #define FONT_LINES_PER_FONT 4 /* game elements: -** 0 - 1000: real elements, stored in level file -** 1000 - 2000: flag elements, only used at runtime +** 0 - 499: real elements, stored in level file +** 500 - 699: flag elements, only used at runtime */ /* "real" level elements */ #define EL_LEERRAUM 0 @@ -901,34 +903,34 @@ extern char *element_info[]; #define EL_SAND_INVISIBLE 315 /* "real" (and therefore drawable) runtime elements */ -#define EL_SIEB_LEER 1000 -#define EL_SIEB2_LEER 1001 -#define EL_SIEB_VOLL 1002 -#define EL_SIEB2_VOLL 1003 -#define EL_SIEB_TOT 1004 -#define EL_SIEB2_TOT 1005 -#define EL_AUSGANG_ACT 1006 -#define EL_SP_TERMINAL_ACTIVE 1007 -#define EL_SP_BUG_ACTIVE 1008 -#define EL_EM_KEY_1 1009 -#define EL_EM_KEY_2 1010 -#define EL_EM_KEY_3 1011 -#define EL_EM_KEY_4 1012 -#define EL_DYNABOMB_ACTIVE_1 1013 -#define EL_DYNABOMB_ACTIVE_2 1014 -#define EL_DYNABOMB_ACTIVE_3 1015 -#define EL_DYNABOMB_ACTIVE_4 1016 +#define EL_SIEB_LEER 500 +#define EL_SIEB2_LEER 501 +#define EL_SIEB_VOLL 502 +#define EL_SIEB2_VOLL 503 +#define EL_SIEB_TOT 504 +#define EL_SIEB2_TOT 505 +#define EL_AUSGANG_ACT 506 +#define EL_SP_TERMINAL_ACTIVE 507 +#define EL_SP_BUG_ACTIVE 508 +#define EL_EM_KEY_1 509 +#define EL_EM_KEY_2 510 +#define EL_EM_KEY_3 511 +#define EL_EM_KEY_4 512 +#define EL_DYNABOMB_ACTIVE_1 513 +#define EL_DYNABOMB_ACTIVE_2 514 +#define EL_DYNABOMB_ACTIVE_3 515 +#define EL_DYNABOMB_ACTIVE_4 516 /* "unreal" (and therefore not drawable) runtime elements */ -#define EL_BLOCKED 2000 -#define EL_EXPLODING 2001 -#define EL_CRACKINGNUT 2002 -#define EL_BLURB_LEFT 2003 -#define EL_BLURB_RIGHT 2004 -#define EL_AMOEBING 2005 -#define EL_MAUERND 2006 -#define EL_BURNING 2007 -#define EL_PLAYER_IS_LEAVING 2008 +#define EL_BLOCKED 600 +#define EL_EXPLODING 601 +#define EL_CRACKINGNUT 602 +#define EL_BLURB_LEFT 603 +#define EL_BLURB_RIGHT 604 +#define EL_AMOEBING 605 +#define EL_MAUERND 606 +#define EL_BURNING 607 +#define EL_PLAYER_IS_LEAVING 608 /* game graphics: ** 0 - 255: graphics from "RocksScreen" diff --git a/src/tools.c b/src/tools.c index b9c4a826..bde3b716 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1116,17 +1116,20 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, else if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK || IS_GEM(element)) && !cut_mode) { - if (element == EL_FELSBROCKEN || element == EL_SP_ZONK) + if (uy >= lev_fieldy-1 || !IS_BELT(Feld[ux][uy+1])) { - if (dir == MV_LEFT) - graphic += (4 - phase4) % 4; - else if (dir == MV_RIGHT) - graphic += phase4; - else - graphic += phase2 * 2; + if (element == EL_FELSBROCKEN || element == EL_SP_ZONK) + { + if (dir == MV_LEFT) + graphic += (4 - phase4) % 4; + else if (dir == MV_RIGHT) + graphic += phase4; + else + graphic += phase2 * 2; + } + else if (element != EL_SP_INFOTRON) + graphic += phase2; } - else if (element != EL_SP_INFOTRON) - graphic += phase2; } else if (element == EL_SIEB_LEER || element == EL_SIEB2_LEER || element == EL_SIEB_VOLL || element == EL_SIEB2_VOLL) @@ -1478,17 +1481,16 @@ void DrawMicroElement(int xpos, int ypos, int element) graphic -= GFX_START_ROCKSSP; graphic -= ((graphic / SP_PER_LINE) * SP_PER_LINE) / 2; XCopyArea(display, pix[PIX_SP], drawto, gc, - MICRO_SP_STARTX + (graphic % MICRO_SP_PER_LINE) *MICRO_TILEX, - MICRO_SP_STARTY + (graphic / MICRO_SP_PER_LINE) *MICRO_TILEY, + MICRO_SP_STARTX + (graphic % MICRO_SP_PER_LINE) * MICRO_TILEX, + MICRO_SP_STARTY + (graphic / MICRO_SP_PER_LINE) * MICRO_TILEY, MICRO_TILEX, MICRO_TILEY, xpos, ypos); } else if (graphic >= GFX_START_ROCKSDC && graphic <= GFX_END_ROCKSDC) { graphic -= GFX_START_ROCKSDC; - graphic -= ((graphic / DC_PER_LINE) * DC_PER_LINE) / 2; XCopyArea(display, pix[PIX_DC], drawto, gc, - MICRO_DC_STARTX + (graphic % MICRO_DC_PER_LINE) *MICRO_TILEX, - MICRO_DC_STARTY + (graphic / MICRO_DC_PER_LINE) *MICRO_TILEY, + MICRO_DC_STARTX + (graphic % MICRO_DC_PER_LINE) * MICRO_TILEX, + MICRO_DC_STARTY + (graphic / MICRO_DC_PER_LINE) * MICRO_TILEY, MICRO_TILEX, MICRO_TILEY, xpos, ypos); } else -- 2.34.1 From 2fe139696892ee39f804b5c7315b8f0977ab01ec Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 9 Aug 1999 00:27:56 +0200 Subject: [PATCH 16/16] rnd-19990809-1-src --- src/editor.c | 15 ++++ src/game.c | 215 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/init.c | 106 ++++++++++++++++++++++--- src/main.c | 19 ++--- src/main.h | 104 +++++++++++-------------- src/tools.c | 22 ++++-- 6 files changed, 390 insertions(+), 91 deletions(-) diff --git a/src/editor.c b/src/editor.c index 5fb13e1e..c5af9691 100644 --- a/src/editor.c +++ b/src/editor.c @@ -1056,6 +1056,21 @@ int editor_element[] = EL_BELT3_SWITCH_R, EL_BELT4_SWITCH_R, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_SWITCH_1, + EL_ENVELOPE, + + EL_LANDMINE, + EL_SAND_INVISIBLE, + EL_STEEL_SLANTED, + EL_LEERRAUM, + + EL_SIGN_EXCLAMATION, + EL_SIGN_STOP, + EL_LIGHT_SWITCH_OFF, + EL_LIGHT_SWITCH_ON, + /* EL_CHAR('D'), EL_CHAR('Y'), diff --git a/src/game.c b/src/game.c index 2fd57d06..a9c903cc 100644 --- a/src/game.c +++ b/src/game.c @@ -394,6 +394,18 @@ static void InitField(int x, int y, boolean init_game) Feld[x][y] = Feld[x][y] - belt_dir_nr + game.belt_dir_nr[belt_nr]; } } + break; + + case EL_SWITCHGATE_SWITCH_2: /* always start with same switch pos */ + if (init_game) + Feld[x][y] = EL_SWITCHGATE_SWITCH_1; + break; + + case EL_LIGHT_SWITCH_ON: + if (init_game) + game.light_time_left = 10 * FRAMES_PER_SECOND; + break; + default: break; } @@ -495,10 +507,12 @@ void InitGame() AllPlayersGone = FALSE; game.magic_wall_active = FALSE; game.magic_wall_time_left = 0; + game.switchgate_pos = 0; + game.light_time_left = 0; for (i=0; i<4; i++) { game.belt_dir[i] = MV_NO_MOVING; - game.belt_dir_nr[i] = 3; /* no moving, next switch left */ + game.belt_dir_nr[i] = 3; /* not moving, next moving left */ } for (i=0; i 0) + { + game.light_time_left--; + + if (game.light_time_left == 0) + { + for (y=0; y= (1000 / GameFrameDelay) && !tape.pausing) { TimeFrames = 0; @@ -4493,6 +4588,7 @@ int DigField(struct PlayerInfo *player, break; case EL_ERDREICH: + case EL_SAND_INVISIBLE: Feld[x][y] = EL_LEERRAUM; PlaySoundLevel(x, y, SND_SCHLURF); break; @@ -4530,6 +4626,11 @@ int DigField(struct PlayerInfo *player, PlaySoundLevel(x, y, SND_PONG); break; + case EL_ENVELOPE: + Feld[x][y] = EL_LEERRAUM; + PlaySoundLevel(x, y, SND_PONG); + break; + case EL_DYNAMITE_INACTIVE: case EL_SP_DISK_RED: RemoveField(x, y); @@ -4669,21 +4770,23 @@ int DigField(struct PlayerInfo *player, if (player->Switching) return MF_ACTION; + player->Switching = TRUE; + game.belt_dir_nr[belt_nr] = belt_dir_nr; game.belt_dir[belt_nr] = belt_dir; if (belt_dir_nr == 3) belt_dir_nr = 1; - player->Switching = TRUE; - for (yy=0; yySwitching) + return MF_ACTION; + + player->Switching = TRUE; + + game.switchgate_pos = !game.switchgate_pos; + + for (yy=0; yySwitching) + return MF_ACTION; + + player->Switching = TRUE; + + game.light_time_left = + (element == EL_LIGHT_SWITCH_OFF ? 10 * FRAMES_PER_SECOND : 0); + + for (yy=0; yy 0) + { + Feld[xx][yy] = EL_LIGHT_SWITCH_ON; + DrawLevelField(xx, yy); + } + else if (element == EL_LIGHT_SWITCH_ON && + game.light_time_left == 0) + { + Feld[xx][yy] = EL_LIGHT_SWITCH_OFF; + DrawLevelField(xx, yy); + } + + if (element == EL_INVISIBLE_STEEL || + element == EL_UNSICHTBAR || + element == EL_SAND_INVISIBLE) + DrawLevelField(xx, yy); + } + } + + return MF_ACTION; + } + break; + case EL_SP_EXIT: if (local_player->gems_still_needed > 0) return MF_NO_ACTION; @@ -4805,6 +4994,18 @@ int DigField(struct PlayerInfo *player, break; + case EL_SWITCHGATE_OPEN: + if (!IN_LEV_FIELD(x + dx, y + dy) || !IS_FREE(x + dx, y + dy)) + return MF_NO_ACTION; + + /* automatically move to the next field with double speed */ + player->programmed_action = move_direction; + DOUBLE_PLAYER_SPEED(player); + + PlaySoundLevel(x, y, SND_GATE); + + break; + case EL_SP_PORT1_LEFT: case EL_SP_PORT2_LEFT: case EL_SP_PORT1_RIGHT: diff --git a/src/init.c b/src/init.c index 00cf8234..09804ee1 100644 --- a/src/init.c +++ b/src/init.c @@ -870,7 +870,9 @@ void InitElementProperties() EL_EM_GATE_1X, EL_EM_GATE_2X, EL_EM_GATE_3X, - EL_EM_GATE_4X + EL_EM_GATE_4X, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_CLOSED }; static int ep_pforte_num = sizeof(ep_pforte)/sizeof(int); @@ -926,7 +928,34 @@ void InitElementProperties() EL_SP_HARD_BASE6, EL_SP_TERMINAL, EL_SP_EXIT, - EL_INVISIBLE_STEEL + EL_INVISIBLE_STEEL, + EL_BELT1_SWITCH_L, + EL_BELT1_SWITCH_M, + EL_BELT1_SWITCH_R, + EL_BELT2_SWITCH_L, + EL_BELT2_SWITCH_M, + EL_BELT2_SWITCH_R, + EL_BELT3_SWITCH_L, + EL_BELT3_SWITCH_M, + EL_BELT3_SWITCH_R, + EL_BELT4_SWITCH_L, + EL_BELT4_SWITCH_M, + EL_BELT4_SWITCH_R, + EL_LIGHT_SWITCH_OFF, + EL_LIGHT_SWITCH_ON, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEEL_SLANTED }; static int ep_solid_num = sizeof(ep_solid)/sizeof(int); @@ -955,6 +984,8 @@ void InitElementProperties() EL_EM_GATE_2X, EL_EM_GATE_3X, EL_EM_GATE_4X, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_CLOSED, EL_SP_HARD_GRAY, EL_SP_HARD_GREEN, EL_SP_HARD_BLUE, @@ -966,7 +997,34 @@ void InitElementProperties() EL_SP_HARD_BASE4, EL_SP_HARD_BASE5, EL_SP_HARD_BASE6, - EL_INVISIBLE_STEEL + EL_INVISIBLE_STEEL, + EL_BELT1_SWITCH_L, + EL_BELT1_SWITCH_M, + EL_BELT1_SWITCH_R, + EL_BELT2_SWITCH_L, + EL_BELT2_SWITCH_M, + EL_BELT2_SWITCH_R, + EL_BELT3_SWITCH_L, + EL_BELT3_SWITCH_M, + EL_BELT3_SWITCH_R, + EL_BELT4_SWITCH_L, + EL_BELT4_SWITCH_M, + EL_BELT4_SWITCH_R, + EL_LIGHT_SWITCH_OFF, + EL_LIGHT_SWITCH_ON, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEEL_SLANTED }; static int ep_massive_num = sizeof(ep_massive)/sizeof(int); @@ -998,7 +1056,8 @@ void InitElementProperties() EL_SP_CHIP_RIGHT, EL_SP_CHIP_UPPER, EL_SP_CHIP_LOWER, - EL_SPEED_PILL + EL_SPEED_PILL, + EL_STEEL_SLANTED }; static int ep_slippery_num = sizeof(ep_slippery)/sizeof(int); @@ -1064,7 +1123,8 @@ void InitElementProperties() EL_SP_HARD_BASE6, EL_SP_TERMINAL, EL_SP_EXIT, - EL_INVISIBLE_STEEL + EL_INVISIBLE_STEEL, + EL_STEEL_SLANTED }; static int ep_mauer_num = sizeof(ep_mauer)/sizeof(int); @@ -1199,7 +1259,8 @@ void InitElementProperties() EL_SALZSAEURE, EL_SP_SNIKSNAK, EL_SP_ELECTRON, - EL_SP_BUG_ACTIVE + EL_SP_BUG_ACTIVE, + EL_LANDMINE }; static int ep_dont_go_to_num = sizeof(ep_dont_go_to)/sizeof(int); @@ -1374,7 +1435,32 @@ void InitElementProperties() EL_SP_HARD_BASE5, EL_SP_HARD_BASE6, EL_SP_EXIT, - EL_INVISIBLE_STEEL + EL_INVISIBLE_STEEL, + EL_BELT1_SWITCH_L, + EL_BELT1_SWITCH_M, + EL_BELT1_SWITCH_R, + EL_BELT2_SWITCH_L, + EL_BELT2_SWITCH_M, + EL_BELT2_SWITCH_R, + EL_BELT3_SWITCH_L, + EL_BELT3_SWITCH_M, + EL_BELT3_SWITCH_R, + EL_BELT4_SWITCH_L, + EL_BELT4_SWITCH_M, + EL_BELT4_SWITCH_R, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEEL_SLANTED }; static int ep_inactive_num = sizeof(ep_inactive)/sizeof(int); @@ -1454,7 +1540,8 @@ void InitElementProperties() { EL_ERDREICH, EL_SP_BASE, - EL_SP_BUG + EL_SP_BUG, + EL_SAND_INVISIBLE }; static int ep_eatable_num = sizeof(ep_eatable)/sizeof(int); @@ -1525,7 +1612,8 @@ void InitElementProperties() EL_SP_PORT2_DOWN, EL_SP_PORT_X, EL_SP_PORT_Y, - EL_SP_PORT_XY + EL_SP_PORT_XY, + EL_SWITCHGATE_OPEN }; static int ep_quick_gate_num = sizeof(ep_quick_gate)/sizeof(int); diff --git a/src/main.c b/src/main.c index 181415d4..dac98c0f 100644 --- a/src/main.c +++ b/src/main.c @@ -467,8 +467,8 @@ char *element_info[] = "extra time", "switch gate (open)", "switch gate (closed)", - "switch for switch gate (open)", - "switch for switch gate (closed)", + "switch for switch gate", + "switch for switch gate", "time gate", "time gate with magic wheel", /* 270 */ "red conveyor belt (left)", @@ -497,10 +497,11 @@ char *element_info[] = "switch for blue conveyor belt (right)", "land mine", "mail envelope", - "light switch", + "light switch (off)", + "light switch (on)", "sign (exclamation)", - "sign (radio activity)", - "sign (stop)", /* 300 */ + "sign (radio activity)", /* 300 */ + "sign (stop)", "sign (wheel chair)", "sign (parking)", "sign (one way)", @@ -509,22 +510,22 @@ char *element_info[] = "sign (round)", "sign (exit)", "sign (yin yang)", - "sign (other)", - "mole (starts moving left)", /* 310 */ + "sign (other)", /* 310 */ + "mole (starts moving left)", "mole (starts moving right)", "mole (starts moving up)", "mole (starts moving down)", - "steel (?)", + "steel wall (slanted)", "invisible sand", "-", "-", "-", - "-", "-", /* 320 */ "-", "-", "-", "-", + "-", "-" /* diff --git a/src/main.h b/src/main.h index 72528fa6..ab26aad5 100644 --- a/src/main.h +++ b/src/main.h @@ -420,6 +420,8 @@ struct GameInfo int magic_wall_time_left; int belt_dir[4]; int belt_dir_nr[4]; + int switchgate_pos; + int light_time_left; }; struct GlobalInfo @@ -852,8 +854,8 @@ extern char *element_info[]; #define EL_EXTRA_TIME 264 #define EL_SWITCHGATE_OPEN 265 #define EL_SWITCHGATE_CLOSED 266 -#define EL_SWITCHGATE_SWITCH_L 267 -#define EL_SWITCHGATE_SWITCH_R 268 +#define EL_SWITCHGATE_SWITCH_1 267 +#define EL_SWITCHGATE_SWITCH_2 268 #define EL_TIME_GATE 269 #define EL_TIME_GATE_WHEEL 270 #define EL_BELT1_LEFT 271 @@ -882,25 +884,26 @@ extern char *element_info[]; #define EL_BELT4_SWITCH_R 294 #define EL_LANDMINE 295 #define EL_ENVELOPE 296 -#define EL_LIGHT_SWITCH 297 -#define EL_SIGN_EXCLAMATION 298 -#define EL_SIGN_RADIOACTIVITY 299 -#define EL_SIGN_STOP 300 -#define EL_SIGN_WHEELCHAIR 301 -#define EL_SIGN_PARKING 302 -#define EL_SIGN_ONEWAY 303 -#define EL_SIGN_HEART 304 -#define EL_SIGN_TRIANGLE 305 -#define EL_SIGN_ROUND 306 -#define EL_SIGN_EXIT 307 -#define EL_SIGN_YINYANG 308 -#define EL_SIGN_OTHER 309 -#define EL_MOLE_LEFT 310 -#define EL_MOLE_RIGHT 311 -#define EL_MOLE_UP 312 -#define EL_MOLE_DOWN 313 -#define EL_STEEL_SLANTED 314 -#define EL_SAND_INVISIBLE 315 +#define EL_LIGHT_SWITCH_OFF 297 +#define EL_LIGHT_SWITCH_ON 298 +#define EL_SIGN_EXCLAMATION 299 +#define EL_SIGN_RADIOACTIVITY 300 +#define EL_SIGN_STOP 301 +#define EL_SIGN_WHEELCHAIR 302 +#define EL_SIGN_PARKING 303 +#define EL_SIGN_ONEWAY 304 +#define EL_SIGN_HEART 305 +#define EL_SIGN_TRIANGLE 306 +#define EL_SIGN_ROUND 307 +#define EL_SIGN_EXIT 308 +#define EL_SIGN_YINYANG 309 +#define EL_SIGN_OTHER 310 +#define EL_MOLE_LEFT 311 +#define EL_MOLE_RIGHT 312 +#define EL_MOLE_UP 313 +#define EL_MOLE_DOWN 314 +#define EL_STEEL_SLANTED 315 +#define EL_SAND_INVISIBLE 316 /* "real" (and therefore drawable) runtime elements */ #define EL_SIEB_LEER 500 @@ -920,6 +923,8 @@ extern char *element_info[]; #define EL_DYNABOMB_ACTIVE_2 514 #define EL_DYNABOMB_ACTIVE_3 515 #define EL_DYNABOMB_ACTIVE_4 516 +#define EL_SWITCHGATE_OPENING 517 +#define EL_SWITCHGATE_CLOSING 518 /* "unreal" (and therefore not drawable) runtime elements */ #define EL_BLOCKED 600 @@ -1230,8 +1235,13 @@ extern char *element_info[]; #define GFX_SP_CHIP_UPPER (GFX_START_ROCKSSP + 4 * SP_PER_LINE + 6) #define GFX_SP_CHIP_LOWER (GFX_START_ROCKSSP + 4 * SP_PER_LINE + 7) +#define GFX_INVISIBLE_STEEL_ON (GFX_START_ROCKSSP + 5 * SP_PER_LINE + 1) +#define GFX_SAND_INVISIBLE_ON (GFX_START_ROCKSSP + 5 * SP_PER_LINE + 2) #define GFX_INVISIBLE_STEEL (GFX_START_ROCKSSP + 5 * SP_PER_LINE + 3) +#define GFX_UNSICHTBAR_ON (GFX_START_ROCKSSP + 5 * SP_PER_LINE + 5) +#define GFX_SAND_INVISIBLE (GFX_START_ROCKSSP + 5 * SP_PER_LINE + 6) #define GFX_UNSICHTBAR (GFX_START_ROCKSSP + 5 * SP_PER_LINE + 7) + #define GFX_SP_ZONK (GFX_START_ROCKSSP + 6 * SP_PER_LINE + 0) #define GFX_EM_KEY_1 (GFX_START_ROCKSSP + 6 * SP_PER_LINE + 4) @@ -1297,6 +1307,19 @@ extern char *element_info[]; #define GFX_BELT3_SWITCH_R (GFX_START_ROCKSDC + 14 * DC_PER_LINE + 2) #define GFX_BELT4_SWITCH_R (GFX_START_ROCKSDC + 14 * DC_PER_LINE + 3) +#define GFX_SWITCHGATE_OPEN (GFX_START_ROCKSDC + 15 * DC_PER_LINE + 4) +#define GFX_SWITCHGATE_CLOSED (GFX_START_ROCKSDC + 15 * DC_PER_LINE + 0) +#define GFX_SWITCHGATE_SWITCH_1 (GFX_START_ROCKSDC + 12 * DC_PER_LINE + 4) +#define GFX_SWITCHGATE_SWITCH_2 (GFX_START_ROCKSDC + 12 * DC_PER_LINE + 5) +#define GFX_LIGHT_SWITCH_OFF (GFX_START_ROCKSDC + 12 * DC_PER_LINE + 6) +#define GFX_LIGHT_SWITCH_ON (GFX_START_ROCKSDC + 12 * DC_PER_LINE + 7) + +#define GFX_ENVELOPE (GFX_START_ROCKSDC + 14 * DC_PER_LINE + 4) +#define GFX_SIGN_EXCLAMATION (GFX_START_ROCKSDC + 14 * DC_PER_LINE + 5) +#define GFX_SIGN_STOP (GFX_START_ROCKSDC + 14 * DC_PER_LINE + 6) +#define GFX_LANDMINE (GFX_START_ROCKSDC + 14 * DC_PER_LINE + 7) +#define GFX_STEEL_SLANTED (GFX_START_ROCKSDC + 15 * DC_PER_LINE + 5) + /* graphics from "RocksFont" */ #define GFX_CHAR_START (GFX_START_ROCKSFONT) #define GFX_CHAR_ASCII0 (GFX_CHAR_START - 32) @@ -1339,46 +1362,9 @@ extern char *element_info[]; #define GFX_KEY_WHITE GFX_CHAR_FRAGE #define GFX_FORCE_FIELD GFX_CHAR_FRAGE #define GFX_EXTRA_TIME GFX_CHAR_FRAGE -#define GFX_SWITCHGATE_OPEN GFX_CHAR_FRAGE -#define GFX_SWITCHGATE_CLOSED GFX_CHAR_FRAGE -#define GFX_SWITCHGATE_SWITCH_L GFX_CHAR_FRAGE -#define GFX_SWITCHGATE_SWITCH_R GFX_CHAR_FRAGE #define GFX_TIME_GATE GFX_CHAR_FRAGE #define GFX_TIME_GATE_WHEEL GFX_CHAR_FRAGE - -/* -#define GFX_BELT1_LEFT GFX_CHAR_FRAGE -#define GFX_BELT1_MIDDLE GFX_CHAR_FRAGE -#define GFX_BELT1_RIGHT GFX_CHAR_FRAGE -#define GFX_BELT1_SWITCH_L GFX_CHAR_FRAGE -#define GFX_BELT1_SWITCH_M GFX_CHAR_FRAGE -#define GFX_BELT1_SWITCH_R GFX_CHAR_FRAGE -#define GFX_BELT2_LEFT GFX_CHAR_FRAGE -#define GFX_BELT2_MIDDLE GFX_CHAR_FRAGE -#define GFX_BELT2_RIGHT GFX_CHAR_FRAGE -#define GFX_BELT2_SWITCH_L GFX_CHAR_FRAGE -#define GFX_BELT2_SWITCH_M GFX_CHAR_FRAGE -#define GFX_BELT2_SWITCH_R GFX_CHAR_FRAGE -#define GFX_BELT3_LEFT GFX_CHAR_FRAGE -#define GFX_BELT3_MIDDLE GFX_CHAR_FRAGE -#define GFX_BELT3_RIGHT GFX_CHAR_FRAGE -#define GFX_BELT3_SWITCH_L GFX_CHAR_FRAGE -#define GFX_BELT3_SWITCH_M GFX_CHAR_FRAGE -#define GFX_BELT3_SWITCH_R GFX_CHAR_FRAGE -#define GFX_BELT4_LEFT GFX_CHAR_FRAGE -#define GFX_BELT4_MIDDLE GFX_CHAR_FRAGE -#define GFX_BELT4_RIGHT GFX_CHAR_FRAGE -#define GFX_BELT4_SWITCH_L GFX_CHAR_FRAGE -#define GFX_BELT4_SWITCH_M GFX_CHAR_FRAGE -#define GFX_BELT4_SWITCH_R GFX_CHAR_FRAGE -*/ - -#define GFX_LANDMINE GFX_CHAR_FRAGE -#define GFX_ENVELOPE GFX_CHAR_FRAGE -#define GFX_LIGHT_SWITCH GFX_CHAR_FRAGE -#define GFX_SIGN_EXCLAMATION GFX_CHAR_FRAGE #define GFX_SIGN_RADIOACTIVITY GFX_CHAR_FRAGE -#define GFX_SIGN_STOP GFX_CHAR_FRAGE #define GFX_SIGN_WHEELCHAIR GFX_CHAR_FRAGE #define GFX_SIGN_PARKING GFX_CHAR_FRAGE #define GFX_SIGN_ONEWAY GFX_CHAR_FRAGE @@ -1392,8 +1378,6 @@ extern char *element_info[]; #define GFX_MOLE_RIGHT GFX_CHAR_FRAGE #define GFX_MOLE_UP GFX_CHAR_FRAGE #define GFX_MOLE_DOWN GFX_CHAR_FRAGE -#define GFX_STEEL_SLANTED GFX_CHAR_FRAGE -#define GFX_SAND_INVISIBLE GFX_CHAR_FRAGE /* the names of the sounds */ #define SND_ALCHEMY 0 diff --git a/src/tools.c b/src/tools.c index bde3b716..41fd86eb 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1157,6 +1157,14 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, else if (rechts_massiv) graphic = GFX_MAUER_L; } + else if ((element == EL_INVISIBLE_STEEL || + element == EL_UNSICHTBAR || + element == EL_SAND_INVISIBLE) && game.light_time_left) + { + graphic = (element == EL_INVISIBLE_STEEL ? GFX_INVISIBLE_STEEL_ON : + element == EL_UNSICHTBAR ? GFX_UNSICHTBAR_ON : + GFX_SAND_INVISIBLE_ON); + } if (dx || dy) DrawGraphicShifted(x, y, dx, dy, graphic, cut_mode, mask_mode); @@ -1220,7 +1228,7 @@ void ErdreichAnbroeckeln(int x, int y) element = Feld[ux][uy]; - if (element == EL_ERDREICH) + if (element == EL_ERDREICH || element == EL_LANDMINE) { if (!IN_SCR_FIELD(x, y)) return; @@ -1238,7 +1246,7 @@ void ErdreichAnbroeckeln(int x, int y) else element = Feld[uxx][uyy]; - if (element == EL_ERDREICH) + if (element == EL_ERDREICH || element == EL_LANDMINE) continue; if (i == 1 || i == 2) @@ -1277,7 +1285,8 @@ void ErdreichAnbroeckeln(int x, int y) uxx = ux + xy[i][0]; uyy = uy + xy[i][1]; - if (!IN_LEV_FIELD(uxx, uyy) || Feld[uxx][uyy] != EL_ERDREICH || + if (!IN_LEV_FIELD(uxx, uyy) || + (Feld[uxx][uyy] != EL_ERDREICH && Feld[uxx][uyy] != EL_LANDMINE) || !IN_SCR_FIELD(xx, yy)) continue; @@ -2482,8 +2491,8 @@ int el2gfx(int element) case EL_EXTRA_TIME: return GFX_EXTRA_TIME; case EL_SWITCHGATE_OPEN: return GFX_SWITCHGATE_OPEN; case EL_SWITCHGATE_CLOSED: return GFX_SWITCHGATE_CLOSED; - case EL_SWITCHGATE_SWITCH_L:return GFX_SWITCHGATE_SWITCH_L; - case EL_SWITCHGATE_SWITCH_R:return GFX_SWITCHGATE_SWITCH_R; + case EL_SWITCHGATE_SWITCH_1:return GFX_SWITCHGATE_SWITCH_1; + case EL_SWITCHGATE_SWITCH_2:return GFX_SWITCHGATE_SWITCH_2; case EL_TIME_GATE: return GFX_TIME_GATE; case EL_TIME_GATE_WHEEL: return GFX_TIME_GATE_WHEEL; case EL_BELT1_LEFT: return GFX_BELT1_LEFT; @@ -2512,7 +2521,8 @@ int el2gfx(int element) case EL_BELT4_SWITCH_R: return GFX_BELT4_SWITCH_R; case EL_LANDMINE: return GFX_LANDMINE; case EL_ENVELOPE: return GFX_ENVELOPE; - case EL_LIGHT_SWITCH: return GFX_LIGHT_SWITCH; + case EL_LIGHT_SWITCH_OFF: return GFX_LIGHT_SWITCH_OFF; + case EL_LIGHT_SWITCH_ON: return GFX_LIGHT_SWITCH_ON; case EL_SIGN_EXCLAMATION: return GFX_SIGN_EXCLAMATION; case EL_SIGN_RADIOACTIVITY: return GFX_SIGN_RADIOACTIVITY; case EL_SIGN_STOP: return GFX_SIGN_STOP; -- 2.34.1