From: Holger Schemel Date: Sat, 30 Aug 2014 09:00:00 +0000 (+0200) Subject: Merge branch 'master' into releases X-Git-Tag: 3.3.1.0^0 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=cc5a0e1eae262a928c1a0f451c6ce401f52d8828;hp=dbb6dd2fa61e2999cec9c129ba546a28db7ff602 Merge branch 'master' into releases --- diff --git a/ChangeLog b/ChangeLog index db17bdff..0ae29c85 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,76 @@ +2013-10-23 + * version 3.3.1.0 released + +2013-10-21 + * version number set to 3.3.1.0 + +2012-10-13 + * fixed display of level time switching from ascending to descending + when making use of the "time orb bug" (see element setting in editor) + (see level 053 of set "rnd_equinox_tetrachloride_ii" for an example) + * fixed graphics performance problems (especially on Mac OS X) by using + whole-playfield redraw on SDL target, while still using the previous + single-tile redraw method on X11 target (using redraw tiles threshold) + +2011-10-07 + * fixed code (esp. random/tape handling) when compiled on 64-bit systems + (by replacing all "long" types by "int" types) + +2010-11-19 + * fixed nasty bug (affecting crumbled graphics) after adding new special + graphics suffix ".TAPE" (and messing some things up in src/main.c) + +2010-08-04 + * fixed wrong argument order in DrawTextBuffer() in gadgets.c + (this caused fonts in envelope config in level editor being invisible) + +2010-07-19 + * fixed some problems with half tile size and even tile sized playfields + +2010-07-12 + * added level selection screen (when clicking on main menu level number) + * added level tracing (played, solved) for use in level selection screen + (to display already played or solved levels in different font color) + +2010-06-24 + * added alternative game mode for playing with half size playfield tiles + * fixed another memory violation bug in the native Supaplex game engine + (this potential memory bug was also in the original Megaplex code, but + apparently only occured under rare conditions triggered by using the + additional added preceding playfield memory area to make a few strange + levels using dirty off-playfield tricks (bugs) like "12s033.sp" also + solvable (this all worked fine in the classic DOS version, of course)) + +2010-06-23 + * added graphics performance optimization to native Supaplex game engine + * fixed bug with accidentally removing preceding buffer in SP engine + * moved some editor graphics from "RocksDoor.pcx" to "RocksMore.pcx" + (to prevent compatibility mapping of these newer graphics to older + (custom) versions of "RocksDoor.pcx" which did not contain them yet) + +2010-06-18 + * added separately configurable game panel background to graphics config + * fixed displaying Supaplex time (now based on 35 fps instead of 50 fps) + +2010-06-16 + * added tape panel graphics and screen positions to graphics config + +2010-06-15 + * added compatibility stuff for redefined "global.door" (which affects + all parts of that image that have their own graphics definition now) + +2010-06-14 + * added sound button graphics to graphics config + +2010-06-13 + * added tape button graphics and screen positions to graphics config + +2010-06-09 + * improved single step mode in R'n'D, EM and SP engines + +2010-06-08 + * version number set to 3.3.0.2 + 2010-06-08 * version 3.3.0.1 released diff --git a/Makefile b/Makefile index 75fde6be..b2d8476c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # ============================================================================= # Rocks'n'Diamonds Makefile # ----------------------------------------------------------------------------- -# (c) 1995-2007 Holger Schemel +# (c) 1995-2013 Holger Schemel # ============================================================================= # ----------------------------------------------------------------------------- @@ -175,6 +175,9 @@ dist-build-win32: dist-build-macosx: # (this is done by "dist-package-macosx" target) +dist-build-macosx-ppc: + # (this is done by "dist-package-macosx-ppc" target) + dist-package-unix: ./Scripts/make_dist.sh unix . @@ -187,6 +190,9 @@ dist-package-win32: dist-package-macosx: ./Scripts/make_dist.sh mac . $(MAKE) +dist-package-macosx-ppc: + ./Scripts/make_dist.sh mac-ppc . $(MAKE) + dist-upload-unix: ./Scripts/make_dist.sh unix . upload @@ -199,6 +205,9 @@ dist-upload-win32: dist-upload-macosx: ./Scripts/make_dist.sh mac . upload +dist-upload-macosx-ppc: + ./Scripts/make_dist.sh mac-ppc . upload + dist-build-all: $(MAKE) clean $(MAKE) dist-build-unix ; $(MAKE) dist-clean @@ -209,12 +218,14 @@ dist-package-all: $(MAKE) dist-package-unix $(MAKE) dist-package-win32 $(MAKE) dist-package-macosx + $(MAKE) dist-package-macosx-ppc # $(MAKE) dist-package-msdos dist-upload-all: $(MAKE) dist-upload-unix $(MAKE) dist-upload-win32 $(MAKE) dist-upload-macosx + $(MAKE) dist-upload-macosx-ppc # $(MAKE) dist-upload-msdos dist-all: dist-build-all dist-package-all diff --git a/src/Makefile b/src/Makefile index 4bbbcca9..3a9230f2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -30,9 +30,11 @@ RANLIB = ranlib ETAGS = etags RM = rm -f -BMP2ICO = bmp2ico +CONVERT = convert WINDRES = windres +CONVERT_ICON_ARGS = -transparent black -background transparent + PROGBASE = rocksndiamonds ifdef SPECIAL_EDITION # create special edition @@ -108,7 +110,7 @@ endif ifeq ($(TARGET),sdl-static) # compiling for SDL target (static) SYS_CFLAGS = -DTARGET_SDL $(shell sdl-config --cflags) -SDL_LIBS = -lSDL_image -lSDL_mixer -lSDL_net -lsmpeg +SDL_LIBS = -lSDL_image -lSDL_mixer -lSDL_net -lsmpeg -lmikmod SYS_LDFLAGS = $(SDL_LIBS) $(shell sdl-config --static-libs) endif @@ -232,15 +234,19 @@ GAME_SP_DIR = game_sp GAME_SP = $(GAME_SP_DIR)/game_sp.a RNDLIBS = $(LIBGAME) $(GAME_EM) $(GAME_SP) +AUTOCONF = conf_gfx.h conf_snd.h conf_mus.h ICONBASE = windows_icon +ICON_BASEPATH = ../Special/Icons/windows_icons ifeq ($(PLATFORM),cross-win32) ifdef SPECIAL_EDITION -ICONSUFFIX = 32x32_$(SPECIAL_EDITION) +# ICONSUFFIX = 32x32_$(SPECIAL_EDITION) +ICON_PATH = $(ICON_BASEPATH)/$(SPECIAL_EDITION) else -ICONSUFFIX = 32x32 +# ICONSUFFIX = 32x32 +ICON_PATH = $(ICON_BASEPATH)/default endif -ICON32X32 = ../graphics/$(ICONBASE)_$(ICONSUFFIX).bmp +# ICON32X32 = ../graphics/$(ICONBASE)_$(ICONSUFFIX).bmp ICON = $(ICONBASE).o endif @@ -249,7 +255,7 @@ endif # build targets # ----------------------------------------------------------------------------- -all: libgame_dir game_em_dir game_sp_dir $(PROGNAME) +all: $(AUTOCONF) libgame_dir game_em_dir game_sp_dir $(PROGNAME) $(PROGNAME): $(RNDLIBS) $(TIMESTAMP_FILE) $(OBJS) $(ICON) $(CC) $(PROFILING) $(OBJS) $(ICON) $(RNDLIBS) $(LDFLAGS) -o $(PROGNAME) @@ -290,7 +296,8 @@ $(TIMESTAMP_FILE): $(SRCS) $(LIBGAME) $(GAME_EM) $(GAME_SP) > $(TIMESTAMP_FILE) $(ICON): - $(BMP2ICO) -transparent $(ICONBASE).ico $(ICON32X32) +# $(CONVERT) $(ICON32X32) $(CONVERT_ICON_ARGS) $(ICONBASE).ico + $(CONVERT) $(ICON_PATH)/*.png $(CONVERT_ICON_ARGS) $(ICONBASE).ico echo "$(ICONBASE) ICON $(ICONBASE).ico" | $(WINDRES) -o $(ICON) .c.o: diff --git a/src/conf_fnt.c b/src/conf_fnt.c index f23bd997..c0ba77e6 100644 --- a/src/conf_fnt.c +++ b/src/conf_fnt.c @@ -83,6 +83,10 @@ font_to_graphic[] = FONT_TEXT_1, GFX_SPECIAL_ARG_LEVELS, IMG_FONT_TEXT_1_LEVELS }, + { + FONT_TEXT_1, GFX_SPECIAL_ARG_LEVELNR, + IMG_FONT_TEXT_1_LEVELNR + }, { FONT_TEXT_1, GFX_SPECIAL_ARG_SETUP, IMG_FONT_TEXT_1_SETUP @@ -119,6 +123,10 @@ font_to_graphic[] = FONT_TEXT_2, GFX_SPECIAL_ARG_LEVELS, IMG_FONT_TEXT_2_LEVELS }, + { + FONT_TEXT_2, GFX_SPECIAL_ARG_LEVELNR, + IMG_FONT_TEXT_2_LEVELNR + }, { FONT_TEXT_2, GFX_SPECIAL_ARG_SETUP, IMG_FONT_TEXT_2_SETUP @@ -143,6 +151,10 @@ font_to_graphic[] = FONT_TEXT_3, GFX_SPECIAL_ARG_LEVELS, IMG_FONT_TEXT_3_LEVELS }, + { + FONT_TEXT_3, GFX_SPECIAL_ARG_LEVELNR, + IMG_FONT_TEXT_3_LEVELNR + }, { FONT_TEXT_3, GFX_SPECIAL_ARG_SETUP, IMG_FONT_TEXT_3_SETUP @@ -171,6 +183,10 @@ font_to_graphic[] = FONT_TEXT_4, GFX_SPECIAL_ARG_LEVELS, IMG_FONT_TEXT_4_LEVELS }, + { + FONT_TEXT_4, GFX_SPECIAL_ARG_LEVELNR, + IMG_FONT_TEXT_4_LEVELNR + }, { FONT_TEXT_4, GFX_SPECIAL_ARG_SETUP, IMG_FONT_TEXT_4_SETUP diff --git a/src/conf_gfx.c b/src/conf_gfx.c index f8a5ae3f..b04ca43f 100644 --- a/src/conf_gfx.c +++ b/src/conf_gfx.c @@ -69,6 +69,10 @@ struct ConfigTypeInfo image_config_suffix[] = { ".sort_priority", ARG_UNDEFINED, TYPE_INTEGER }, { ".class", ARG_UNDEFINED, TYPE_STRING }, { ".style", ARG_UNDEFINED, TYPE_STRING }, + { ".active_xoffset", "0", TYPE_INTEGER }, + { ".active_yoffset", "0", TYPE_INTEGER }, + { ".pressed_xoffset", "0", TYPE_INTEGER }, + { ".pressed_yoffset", "0", TYPE_INTEGER }, { NULL, NULL, 0 } }; @@ -4692,6 +4696,172 @@ struct ConfigInfo image_config[] = { "menu.scrollbar.active.ypos", "10" }, { "menu.scrollbar.active.frames", "1" }, + { "game.button.gfx.stop", "RocksDoor.pcx" }, + { "game.button.gfx.stop.x", "305" }, + { "game.button.gfx.stop.y", "185" }, + { "game.button.gfx.stop.width", "30" }, + { "game.button.gfx.stop.height", "30" }, + { "game.button.gfx.stop.pressed_xoffset", "-100" }, + { "game.button.gfx.pause", "RocksDoor.pcx" }, + { "game.button.gfx.pause.x", "335" }, + { "game.button.gfx.pause.y", "185" }, + { "game.button.gfx.pause.width", "30" }, + { "game.button.gfx.pause.height", "30" }, + { "game.button.gfx.pause.pressed_xoffset", "-100" }, + { "game.button.gfx.play", "RocksDoor.pcx" }, + { "game.button.gfx.play.x", "365" }, + { "game.button.gfx.play.y", "185" }, + { "game.button.gfx.play.width", "30" }, + { "game.button.gfx.play.height", "30" }, + { "game.button.gfx.play.pressed_xoffset", "-100" }, + { "game.button.gfx.sound_music", "RocksDoor.pcx" }, + { "game.button.gfx.sound_music.x", "305" }, + { "game.button.gfx.sound_music.y", "245" }, + { "game.button.gfx.sound_music.width", "30" }, + { "game.button.gfx.sound_music.height", "30" }, + { "game.button.gfx.sound_music.pressed_xoffset", "-100" }, + { "game.button.gfx.sound_music.active_yoffset", "-30" }, + { "game.button.gfx.sound_loops", "RocksDoor.pcx" }, + { "game.button.gfx.sound_loops.x", "335" }, + { "game.button.gfx.sound_loops.y", "245" }, + { "game.button.gfx.sound_loops.width", "30" }, + { "game.button.gfx.sound_loops.height", "30" }, + { "game.button.gfx.sound_loops.pressed_xoffset", "-100" }, + { "game.button.gfx.sound_loops.active_yoffset", "-30" }, + { "game.button.gfx.sound_simple", "RocksDoor.pcx" }, + { "game.button.gfx.sound_simple.x", "365" }, + { "game.button.gfx.sound_simple.y", "245" }, + { "game.button.gfx.sound_simple.width", "30" }, + { "game.button.gfx.sound_simple.height", "30" }, + { "game.button.gfx.sound_simple.pressed_xoffset", "-100" }, + { "game.button.gfx.sound_simple.active_yoffset", "-30" }, + + { "tape.button.gfx.eject", "RocksDoor.pcx" }, + { "tape.button.gfx.eject.x", "305" }, + { "tape.button.gfx.eject.y", "357" }, + { "tape.button.gfx.eject.width", "18" }, + { "tape.button.gfx.eject.height", "18" }, + { "tape.button.gfx.eject.pressed_xoffset", "-100" }, + { "tape.button.gfx.extra", "RocksDoor.pcx" }, + { "tape.button.gfx.extra.x", "505" }, + { "tape.button.gfx.extra.y", "357" }, + { "tape.button.gfx.extra.width", "18" }, + { "tape.button.gfx.extra.height", "18" }, + { "tape.button.gfx.extra.pressed_xoffset", "-100" }, + { "tape.button.gfx.stop", "RocksDoor.pcx" }, + { "tape.button.gfx.stop.x", "323" }, + { "tape.button.gfx.stop.y", "357" }, + { "tape.button.gfx.stop.width", "18" }, + { "tape.button.gfx.stop.height", "18" }, + { "tape.button.gfx.stop.pressed_xoffset", "-100" }, + { "tape.button.gfx.pause", "RocksDoor.pcx" }, + { "tape.button.gfx.pause.x", "341" }, + { "tape.button.gfx.pause.y", "357" }, + { "tape.button.gfx.pause.width", "18" }, + { "tape.button.gfx.pause.height", "18" }, + { "tape.button.gfx.pause.pressed_xoffset", "-100" }, + { "tape.button.gfx.record", "RocksDoor.pcx" }, + { "tape.button.gfx.record.x", "359" }, + { "tape.button.gfx.record.y", "357" }, + { "tape.button.gfx.record.width", "18" }, + { "tape.button.gfx.record.height", "18" }, + { "tape.button.gfx.record.pressed_xoffset", "-100" }, + { "tape.button.gfx.play", "RocksDoor.pcx" }, + { "tape.button.gfx.play.x", "377" }, + { "tape.button.gfx.play.y", "357" }, + { "tape.button.gfx.play.width", "18" }, + { "tape.button.gfx.play.height", "18" }, + { "tape.button.gfx.play.pressed_xoffset", "-100" }, + + { "tape.symbol.gfx.eject", UNDEFINED_FILENAME }, + { "tape.symbol.gfx.stop", UNDEFINED_FILENAME }, + { "tape.symbol.gfx.pause", "RocksDoor.pcx" }, + { "tape.symbol.gfx.pause.x", "340" }, + { "tape.symbol.gfx.pause.y", "321" }, + { "tape.symbol.gfx.pause.width", "17" }, + { "tape.symbol.gfx.pause.height", "13" }, + { "tape.symbol.gfx.record", "RocksDoor.pcx" }, + { "tape.symbol.gfx.record.x", "325" }, + { "tape.symbol.gfx.record.y", "321" }, + { "tape.symbol.gfx.record.width", "16" }, + { "tape.symbol.gfx.record.height", "16" }, + { "tape.symbol.gfx.play", "RocksDoor.pcx" }, + { "tape.symbol.gfx.play.x", "357" }, + { "tape.symbol.gfx.play.y", "321" }, + { "tape.symbol.gfx.play.width", "11" }, + { "tape.symbol.gfx.play.height", "13" }, + { "tape.symbol.gfx.fast_forward", "RocksDoor.pcx" }, + { "tape.symbol.gfx.fast_forward.x", "539" }, + { "tape.symbol.gfx.fast_forward.y", "193" }, + { "tape.symbol.gfx.fast_forward.width", "27" }, + { "tape.symbol.gfx.fast_forward.height", "13" }, + { "tape.symbol.gfx.warp_forward", "RocksDoor.pcx" }, + { "tape.symbol.gfx.warp_forward.x", "539" }, + { "tape.symbol.gfx.warp_forward.y", "152" }, + { "tape.symbol.gfx.warp_forward.width", "27" }, + { "tape.symbol.gfx.warp_forward.height", "13" }, + { "tape.symbol.gfx.warp_forward_blind", "RocksDoor.pcx" }, + { "tape.symbol.gfx.warp_forward_blind.x", "539" }, + { "tape.symbol.gfx.warp_forward_blind.y", "165" }, + { "tape.symbol.gfx.warp_forward_blind.width", "27" }, + { "tape.symbol.gfx.warp_forward_blind.height","13" }, + { "tape.symbol.gfx.pause_before_end", "RocksDoor.pcx" }, + { "tape.symbol.gfx.pause_before_end.x", "539" }, + { "tape.symbol.gfx.pause_before_end.y", "221" }, + { "tape.symbol.gfx.pause_before_end.width", "27" }, + { "tape.symbol.gfx.pause_before_end.height", "13" }, + { "tape.symbol.gfx.single_step", UNDEFINED_FILENAME }, + + { "tape.label.gfx.eject", UNDEFINED_FILENAME }, + { "tape.label.gfx.stop", UNDEFINED_FILENAME }, + { "tape.label.gfx.pause", "RocksDoor.pcx" }, + { "tape.label.gfx.pause.x", "305" }, + { "tape.label.gfx.pause.y", "341" }, + { "tape.label.gfx.pause.width", "35" }, + { "tape.label.gfx.pause.height", "8" }, + { "tape.label.gfx.record", "RocksDoor.pcx" }, + { "tape.label.gfx.record.x", "305" }, + { "tape.label.gfx.record.y", "321" }, + { "tape.label.gfx.record.width", "20" }, + { "tape.label.gfx.record.height", "12" }, + { "tape.label.gfx.play", "RocksDoor.pcx" }, + { "tape.label.gfx.play.x", "370" }, + { "tape.label.gfx.play.y", "321" }, + { "tape.label.gfx.play.width", "22" }, + { "tape.label.gfx.play.height", "12" }, + { "tape.label.gfx.fast_forward", "RocksDoor.pcx" }, + { "tape.label.gfx.fast_forward.x", "505" }, + { "tape.label.gfx.fast_forward.y", "193" }, + { "tape.label.gfx.fast_forward.width", "40" }, + { "tape.label.gfx.fast_forward.height", "28" }, + { "tape.label.gfx.warp_forward", "RocksDoor.pcx" }, + { "tape.label.gfx.warp_forward.x", "505" }, + { "tape.label.gfx.warp_forward.y", "165" }, + { "tape.label.gfx.warp_forward.width", "40" }, + { "tape.label.gfx.warp_forward.height", "28" }, + { "tape.label.gfx.warp_forward_blind", "RocksDoor.pcx" }, + { "tape.label.gfx.warp_forward_blind.x", "505" }, + { "tape.label.gfx.warp_forward_blind.y", "165" }, + { "tape.label.gfx.warp_forward_blind.width", "40" }, + { "tape.label.gfx.warp_forward_blind.height", "28" }, + { "tape.label.gfx.pause_before_end", "RocksDoor.pcx" }, + { "tape.label.gfx.pause_before_end.x", "505" }, + { "tape.label.gfx.pause_before_end.y", "221" }, + { "tape.label.gfx.pause_before_end.width", "40" }, + { "tape.label.gfx.pause_before_end.height", "28" }, + { "tape.label.gfx.single_step", "RocksDoor.pcx" }, + { "tape.label.gfx.single_step.x", "557" }, + { "tape.label.gfx.single_step.y", "139" }, + { "tape.label.gfx.single_step.width", "38" }, + { "tape.label.gfx.single_step.height", "13" }, + + { "tape.label.gfx.date", "RocksDoor.pcx" }, + { "tape.label.gfx.date.x", "305" }, + { "tape.label.gfx.date.y", "285" }, + { "tape.label.gfx.date.width", "90" }, + { "tape.label.gfx.date.height", "13" }, + { "tape.label.gfx.time", UNDEFINED_FILENAME }, + { "font.initial_1", "RocksFontSmall.pcx" }, { "font.initial_1.x", "0" }, { "font.initial_1.y", "0" }, @@ -4759,6 +4929,8 @@ struct ConfigInfo image_config[] = { "font.text_1.LEVELS.y", "0" }, { "font.text_1.LEVELS.width", "16" }, { "font.text_1.LEVELS.height", "32" }, + { "font.text_1.LEVELNR", UNDEFINED_FILENAME }, + { "font.text_1.LEVELNR.clone_from", "font.text_1.LEVELS" }, { "font.text_1.SETUP", UNDEFINED_FILENAME }, { "font.text_1.SETUP.clone_from", "font.text_1.LEVELS" }, { "font.text_1.PREVIEW", "RocksFontEM.pcx" }, @@ -4792,6 +4964,8 @@ struct ConfigInfo image_config[] = { "font.text_2.LEVELS.y", "160" }, { "font.text_2.LEVELS.width", "16" }, { "font.text_2.LEVELS.height", "32" }, + { "font.text_2.LEVELNR", UNDEFINED_FILENAME }, + { "font.text_2.LEVELNR.clone_from", "font.text_2.LEVELS" }, { "font.text_2.SETUP", UNDEFINED_FILENAME }, { "font.text_2.SETUP.clone_from", "font.text_2.LEVELS" }, { "font.text_2.PREVIEW", "RocksFontEM.pcx" }, @@ -4819,6 +4993,8 @@ struct ConfigInfo image_config[] = { "font.text_3.LEVELS.y", "320" }, { "font.text_3.LEVELS.width", "16" }, { "font.text_3.LEVELS.height", "32" }, + { "font.text_3.LEVELNR", UNDEFINED_FILENAME }, + { "font.text_3.LEVELNR.clone_from", "font.text_3.LEVELS" }, { "font.text_3.SETUP", UNDEFINED_FILENAME }, { "font.text_3.SETUP.clone_from", "font.text_3.LEVELS" }, { "font.text_3.PREVIEW", "RocksFontEM.pcx" }, @@ -4848,6 +5024,8 @@ struct ConfigInfo image_config[] = { "font.text_4.LEVELS.y", "480" }, { "font.text_4.LEVELS.width", "16" }, { "font.text_4.LEVELS.height", "32" }, + { "font.text_4.LEVELNR", UNDEFINED_FILENAME }, + { "font.text_4.LEVELNR.clone_from", "font.text_4.LEVELS" }, { "font.text_4.SETUP", UNDEFINED_FILENAME }, { "font.text_4.SETUP.clone_from", "font.text_4.LEVELS" }, { "font.text_4.SCORES", "RocksFontMedium.pcx" }, @@ -4982,21 +5160,21 @@ struct ConfigInfo image_config[] = { "global.busy.frames_per_line", "7" }, { "global.busy.delay", "2" }, - { "editor.element_border", "RocksElements.pcx" }, - { "editor.element_border.x", "0" }, - { "editor.element_border.y", "0" }, + { "editor.element_border", "RocksMore.pcx" }, + { "editor.element_border.xpos", "0" }, + { "editor.element_border.ypos", "2" }, - { "editor.element_border_input", "RocksDoor.pcx" }, - { "editor.element_border_input.x", "740" }, - { "editor.element_border_input.y", "48" }, + { "editor.element_border_input", "RocksMore.pcx" }, + { "editor.element_border_input.xpos", "10" }, + { "editor.element_border_input.ypos", "7" }, - { "editor.cascade_list", "RocksDoor.pcx" }, - { "editor.cascade_list.x", "708" }, - { "editor.cascade_list.y", "80" }, + { "editor.cascade_list", "RocksMore.pcx" }, + { "editor.cascade_list.xpos", "9" }, + { "editor.cascade_list.ypos", "8" }, { "editor.cascade_list.frames", "1" }, - { "editor.cascade_list.active", "RocksDoor.pcx" }, - { "editor.cascade_list.active.x", "740" }, - { "editor.cascade_list.active.y", "80" }, + { "editor.cascade_list.active", "RocksMore.pcx" }, + { "editor.cascade_list.active.xpos", "10" }, + { "editor.cascade_list.active.ypos", "8" }, { "editor.cascade_list.active.frames", "1" }, { "background", UNDEFINED_FILENAME }, @@ -5004,6 +5182,7 @@ struct ConfigInfo image_config[] = { "background.TITLE", UNDEFINED_FILENAME }, { "background.MAIN", UNDEFINED_FILENAME }, { "background.LEVELS", UNDEFINED_FILENAME }, + { "background.LEVELNR", UNDEFINED_FILENAME }, { "background.SCORES", UNDEFINED_FILENAME }, { "background.EDITOR", UNDEFINED_FILENAME }, { "background.INFO", UNDEFINED_FILENAME }, @@ -5016,6 +5195,16 @@ struct ConfigInfo image_config[] = { "background.SETUP", UNDEFINED_FILENAME }, { "background.PLAYING", UNDEFINED_FILENAME }, { "background.DOOR", UNDEFINED_FILENAME }, + { "background.TAPE", "RocksDoor.pcx" }, + { "background.TAPE.x", "200" }, + { "background.TAPE.y", "280" }, + { "background.TAPE.width", "100" }, + { "background.TAPE.height", "100" }, + { "background.PANEL", "RocksDoor.pcx" }, + { "background.PANEL.x", "400" }, + { "background.PANEL.y", "0" }, + { "background.PANEL.width", "100" }, + { "background.PANEL.height", "280" }, { "background.titlescreen_initial_1", UNDEFINED_FILENAME }, { "background.titlescreen_initial_2", UNDEFINED_FILENAME }, @@ -5317,6 +5506,7 @@ struct ConfigInfo image_config[] = { "border.draw_masked.TITLE", "false" }, { "border.draw_masked.MAIN", "false" }, { "border.draw_masked.LEVELS", "false" }, + { "border.draw_masked.LEVELNR", "false" }, { "border.draw_masked.SCORES", "false" }, { "border.draw_masked.EDITOR", "false" }, { "border.draw_masked.INFO", "false" }, @@ -5377,6 +5567,8 @@ struct ConfigInfo image_config[] = { "menu.draw_yoffset.MAIN", "0" }, { "menu.draw_xoffset.LEVELS", "0" }, { "menu.draw_yoffset.LEVELS", "0" }, + { "menu.draw_xoffset.LEVELNR", "0" }, + { "menu.draw_yoffset.LEVELNR", "0" }, { "menu.draw_xoffset.SCORES", "0" }, { "menu.draw_yoffset.SCORES", "0" }, { "menu.draw_xoffset.EDITOR", "0" }, @@ -5428,6 +5620,7 @@ struct ConfigInfo image_config[] = { "menu.list_size", "-1" }, { "menu.list_size.LEVELS", "-1" }, + { "menu.list_size.LEVELNR", "-1" }, { "menu.list_size.SCORES", "-1" }, { "menu.list_size.INFO", "-1" }, { "menu.list_size.SETUP", "-1" }, @@ -6396,10 +6589,83 @@ struct ConfigInfo image_config[] = { "game.button.sound_simple.x", "65" }, { "game.button.sound_simple.y", "245" }, + { "tape.button.eject.x", "5" }, + { "tape.button.eject.y", "77" }, + { "tape.button.stop.x", "23" }, + { "tape.button.stop.y", "77" }, + { "tape.button.pause.x", "41" }, + { "tape.button.pause.y", "77" }, + { "tape.button.record.x", "59" }, + { "tape.button.record.y", "77" }, + { "tape.button.play.x", "77" }, + { "tape.button.play.y", "77" }, + + { "tape.symbol.eject.x", "-1" }, + { "tape.symbol.eject.y", "-1" }, + { "tape.symbol.stop.x", "-1" }, + { "tape.symbol.stop.y", "-1" }, + { "tape.symbol.pause.x", "40" }, + { "tape.symbol.pause.y", "41" }, + { "tape.symbol.record.x", "25" }, + { "tape.symbol.record.y", "41" }, + { "tape.symbol.play.x", "57" }, + { "tape.symbol.play.y", "41" }, + { "tape.symbol.fast_forward.x", "39" }, + { "tape.symbol.fast_forward.y", "42" }, + { "tape.symbol.warp_forward.x", "39" }, + { "tape.symbol.warp_forward.y", "42" }, + { "tape.symbol.warp_forward_blind.x", "39" }, + { "tape.symbol.warp_forward_blind.y", "42" }, + { "tape.symbol.pause_before_end.x", "39" }, + { "tape.symbol.pause_before_end.y", "42" }, + { "tape.symbol.single_step.x", "-1" }, + { "tape.symbol.single_step.y", "-1" }, + + { "tape.label.eject.x", "-1" }, + { "tape.label.eject.y", "-1" }, + { "tape.label.stop.x", "-1" }, + { "tape.label.stop.y", "-1" }, + { "tape.label.pause.x", "5" }, + { "tape.label.pause.y", "61" }, + { "tape.label.record.x", "5" }, + { "tape.label.record.y", "41" }, + { "tape.label.play.x", "70" }, + { "tape.label.play.y", "41" }, + { "tape.label.fast_forward.x", "5" }, + { "tape.label.fast_forward.y", "42" }, + { "tape.label.warp_forward.x", "-1" }, + { "tape.label.warp_forward.y", "-1" }, + { "tape.label.warp_forward_blind.x", "5" }, + { "tape.label.warp_forward_blind.y", "42" }, + { "tape.label.pause_before_end.x", "5" }, + { "tape.label.pause_before_end.y", "42" }, + { "tape.label.single_step.x", "57" }, + { "tape.label.single_step.y", "42" }, + + { "tape.label.date.x", "5" }, + { "tape.label.date.y", "5" }, + { "tape.label.time.x", "-1" }, + { "tape.label.time.y", "-1" }, + + { "tape.text.date.x", "7" }, + { "tape.text.date.y", "19" }, + { "tape.text.date.align", "left" }, + { "tape.text.date.valign", "top" }, + { "tape.text.date.digits", "-1" }, + { "tape.text.date.font", "font.tape_recorder" }, + + { "tape.text.time.x", "44" }, + { "tape.text.time.y", "55" }, + { "tape.text.time.align", "left" }, + { "tape.text.time.valign", "top" }, + { "tape.text.time.digits", "-1" }, + { "tape.text.time.font", "font.tape_recorder" }, + { "game.forced_scroll_delay_value", "-1" }, { "game.use_native_emc_graphics_engine", "false" }, { "game.use_native_sp_graphics_engine", "true" }, { "game.use_masked_pushing", "false" }, + { "game.tile_size", "32" }, { "[player].boring_delay_fixed", "1000" }, { "[player].boring_delay_random", "1000" }, diff --git a/src/conf_gfx.h b/src/conf_gfx.h index a8557b04..32ae13ba 100644 --- a/src/conf_gfx.h +++ b/src/conf_gfx.h @@ -1699,126 +1699,167 @@ #define IMG_MENU_BUTTON_QUIT_ACTIVE 1678 #define IMG_MENU_SCROLLBAR 1679 #define IMG_MENU_SCROLLBAR_ACTIVE 1680 -#define IMG_FONT_INITIAL_1 1681 -#define IMG_FONT_INITIAL_2 1682 -#define IMG_FONT_INITIAL_3 1683 -#define IMG_FONT_INITIAL_4 1684 -#define IMG_FONT_TITLE_1 1685 -#define IMG_FONT_TITLE_2 1686 -#define IMG_FONT_TITLE_2_SETUP 1687 -#define IMG_FONT_MENU_1 1688 -#define IMG_FONT_MENU_1_ACTIVE 1689 -#define IMG_FONT_MENU_2 1690 -#define IMG_FONT_MENU_2_ACTIVE 1691 -#define IMG_FONT_TEXT_1 1692 -#define IMG_FONT_TEXT_1_MAIN 1693 -#define IMG_FONT_TEXT_1_LEVELS 1694 -#define IMG_FONT_TEXT_1_SETUP 1695 -#define IMG_FONT_TEXT_1_PREVIEW 1696 -#define IMG_FONT_TEXT_1_SCORES 1697 -#define IMG_FONT_TEXT_1_ACTIVE_SCORES 1698 -#define IMG_FONT_TEXT_1_PANEL 1699 -#define IMG_FONT_TEXT_1_DOOR 1700 -#define IMG_FONT_TEXT_2 1701 -#define IMG_FONT_TEXT_2_MAIN 1702 -#define IMG_FONT_TEXT_2_LEVELS 1703 -#define IMG_FONT_TEXT_2_SETUP 1704 -#define IMG_FONT_TEXT_2_PREVIEW 1705 -#define IMG_FONT_TEXT_2_SCORES 1706 -#define IMG_FONT_TEXT_2_ACTIVE_SCORES 1707 -#define IMG_FONT_TEXT_3 1708 -#define IMG_FONT_TEXT_3_LEVELS 1709 -#define IMG_FONT_TEXT_3_SETUP 1710 -#define IMG_FONT_TEXT_3_PREVIEW 1711 -#define IMG_FONT_TEXT_3_SCORES 1712 -#define IMG_FONT_TEXT_3_ACTIVE_SCORES 1713 -#define IMG_FONT_TEXT_4 1714 -#define IMG_FONT_TEXT_4_MAIN 1715 -#define IMG_FONT_TEXT_4_LEVELS 1716 -#define IMG_FONT_TEXT_4_SETUP 1717 -#define IMG_FONT_TEXT_4_SCORES 1718 -#define IMG_FONT_TEXT_4_ACTIVE_SCORES 1719 -#define IMG_FONT_ENVELOPE_1 1720 -#define IMG_FONT_ENVELOPE_2 1721 -#define IMG_FONT_ENVELOPE_3 1722 -#define IMG_FONT_ENVELOPE_4 1723 -#define IMG_FONT_INPUT_1 1724 -#define IMG_FONT_INPUT_1_MAIN 1725 -#define IMG_FONT_INPUT_1_ACTIVE 1726 -#define IMG_FONT_INPUT_1_ACTIVE_MAIN 1727 -#define IMG_FONT_INPUT_1_ACTIVE_SETUP 1728 -#define IMG_FONT_INPUT_2 1729 -#define IMG_FONT_INPUT_2_ACTIVE 1730 -#define IMG_FONT_OPTION_OFF 1731 -#define IMG_FONT_OPTION_ON 1732 -#define IMG_FONT_VALUE_1 1733 -#define IMG_FONT_VALUE_2 1734 -#define IMG_FONT_VALUE_OLD 1735 -#define IMG_FONT_LEVEL_NUMBER 1736 -#define IMG_FONT_LEVEL_NUMBER_ACTIVE 1737 -#define IMG_FONT_TAPE_RECORDER 1738 -#define IMG_FONT_GAME_INFO 1739 -#define IMG_FONT_INFO_ELEMENTS 1740 -#define IMG_FONT_INFO_LEVELSET 1741 -#define IMG_GLOBAL_BORDER 1742 -#define IMG_GLOBAL_DOOR 1743 -#define IMG_GLOBAL_BUSY 1744 -#define IMG_EDITOR_ELEMENT_BORDER 1745 -#define IMG_EDITOR_ELEMENT_BORDER_INPUT 1746 -#define IMG_EDITOR_CASCADE_LIST 1747 -#define IMG_EDITOR_CASCADE_LIST_ACTIVE 1748 -#define IMG_BACKGROUND 1749 -#define IMG_BACKGROUND_TITLE_INITIAL 1750 -#define IMG_BACKGROUND_TITLE 1751 -#define IMG_BACKGROUND_MAIN 1752 -#define IMG_BACKGROUND_LEVELS 1753 -#define IMG_BACKGROUND_SCORES 1754 -#define IMG_BACKGROUND_EDITOR 1755 -#define IMG_BACKGROUND_INFO 1756 -#define IMG_BACKGROUND_INFO_ELEMENTS 1757 -#define IMG_BACKGROUND_INFO_MUSIC 1758 -#define IMG_BACKGROUND_INFO_CREDITS 1759 -#define IMG_BACKGROUND_INFO_PROGRAM 1760 -#define IMG_BACKGROUND_INFO_VERSION 1761 -#define IMG_BACKGROUND_INFO_LEVELSET 1762 -#define IMG_BACKGROUND_SETUP 1763 -#define IMG_BACKGROUND_PLAYING 1764 -#define IMG_BACKGROUND_DOOR 1765 -#define IMG_BACKGROUND_TITLESCREEN_INITIAL_1 1766 -#define IMG_BACKGROUND_TITLESCREEN_INITIAL_2 1767 -#define IMG_BACKGROUND_TITLESCREEN_INITIAL_3 1768 -#define IMG_BACKGROUND_TITLESCREEN_INITIAL_4 1769 -#define IMG_BACKGROUND_TITLESCREEN_INITIAL_5 1770 -#define IMG_BACKGROUND_TITLESCREEN_1 1771 -#define IMG_BACKGROUND_TITLESCREEN_2 1772 -#define IMG_BACKGROUND_TITLESCREEN_3 1773 -#define IMG_BACKGROUND_TITLESCREEN_4 1774 -#define IMG_BACKGROUND_TITLESCREEN_5 1775 -#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_1 1776 -#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_2 1777 -#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_3 1778 -#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_4 1779 -#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_5 1780 -#define IMG_BACKGROUND_TITLEMESSAGE_1 1781 -#define IMG_BACKGROUND_TITLEMESSAGE_2 1782 -#define IMG_BACKGROUND_TITLEMESSAGE_3 1783 -#define IMG_BACKGROUND_TITLEMESSAGE_4 1784 -#define IMG_BACKGROUND_TITLEMESSAGE_5 1785 -#define IMG_BACKGROUND_ENVELOPE_1 1786 -#define IMG_BACKGROUND_ENVELOPE_2 1787 -#define IMG_BACKGROUND_ENVELOPE_3 1788 -#define IMG_BACKGROUND_ENVELOPE_4 1789 -#define IMG_TITLESCREEN_INITIAL_1 1790 -#define IMG_TITLESCREEN_INITIAL_2 1791 -#define IMG_TITLESCREEN_INITIAL_3 1792 -#define IMG_TITLESCREEN_INITIAL_4 1793 -#define IMG_TITLESCREEN_INITIAL_5 1794 -#define IMG_TITLESCREEN_1 1795 -#define IMG_TITLESCREEN_2 1796 -#define IMG_TITLESCREEN_3 1797 -#define IMG_TITLESCREEN_4 1798 -#define IMG_TITLESCREEN_5 1799 +#define IMG_GAME_BUTTON_GFX_STOP 1681 +#define IMG_GAME_BUTTON_GFX_PAUSE 1682 +#define IMG_GAME_BUTTON_GFX_PLAY 1683 +#define IMG_GAME_BUTTON_GFX_SOUND_MUSIC 1684 +#define IMG_GAME_BUTTON_GFX_SOUND_LOOPS 1685 +#define IMG_GAME_BUTTON_GFX_SOUND_SIMPLE 1686 +#define IMG_TAPE_BUTTON_GFX_EJECT 1687 +#define IMG_TAPE_BUTTON_GFX_EXTRA 1688 +#define IMG_TAPE_BUTTON_GFX_STOP 1689 +#define IMG_TAPE_BUTTON_GFX_PAUSE 1690 +#define IMG_TAPE_BUTTON_GFX_RECORD 1691 +#define IMG_TAPE_BUTTON_GFX_PLAY 1692 +#define IMG_TAPE_SYMBOL_GFX_EJECT 1693 +#define IMG_TAPE_SYMBOL_GFX_STOP 1694 +#define IMG_TAPE_SYMBOL_GFX_PAUSE 1695 +#define IMG_TAPE_SYMBOL_GFX_RECORD 1696 +#define IMG_TAPE_SYMBOL_GFX_PLAY 1697 +#define IMG_TAPE_SYMBOL_GFX_FAST_FORWARD 1698 +#define IMG_TAPE_SYMBOL_GFX_WARP_FORWARD 1699 +#define IMG_TAPE_SYMBOL_GFX_WARP_FORWARD_BLIND 1700 +#define IMG_TAPE_SYMBOL_GFX_PAUSE_BEFORE_END 1701 +#define IMG_TAPE_SYMBOL_GFX_SINGLE_STEP 1702 +#define IMG_TAPE_LABEL_GFX_EJECT 1703 +#define IMG_TAPE_LABEL_GFX_STOP 1704 +#define IMG_TAPE_LABEL_GFX_PAUSE 1705 +#define IMG_TAPE_LABEL_GFX_RECORD 1706 +#define IMG_TAPE_LABEL_GFX_PLAY 1707 +#define IMG_TAPE_LABEL_GFX_FAST_FORWARD 1708 +#define IMG_TAPE_LABEL_GFX_WARP_FORWARD 1709 +#define IMG_TAPE_LABEL_GFX_WARP_FORWARD_BLIND 1710 +#define IMG_TAPE_LABEL_GFX_PAUSE_BEFORE_END 1711 +#define IMG_TAPE_LABEL_GFX_SINGLE_STEP 1712 +#define IMG_TAPE_LABEL_GFX_DATE 1713 +#define IMG_TAPE_LABEL_GFX_TIME 1714 +#define IMG_FONT_INITIAL_1 1715 +#define IMG_FONT_INITIAL_2 1716 +#define IMG_FONT_INITIAL_3 1717 +#define IMG_FONT_INITIAL_4 1718 +#define IMG_FONT_TITLE_1 1719 +#define IMG_FONT_TITLE_2 1720 +#define IMG_FONT_TITLE_2_SETUP 1721 +#define IMG_FONT_MENU_1 1722 +#define IMG_FONT_MENU_1_ACTIVE 1723 +#define IMG_FONT_MENU_2 1724 +#define IMG_FONT_MENU_2_ACTIVE 1725 +#define IMG_FONT_TEXT_1 1726 +#define IMG_FONT_TEXT_1_MAIN 1727 +#define IMG_FONT_TEXT_1_LEVELS 1728 +#define IMG_FONT_TEXT_1_LEVELNR 1729 +#define IMG_FONT_TEXT_1_SETUP 1730 +#define IMG_FONT_TEXT_1_PREVIEW 1731 +#define IMG_FONT_TEXT_1_SCORES 1732 +#define IMG_FONT_TEXT_1_ACTIVE_SCORES 1733 +#define IMG_FONT_TEXT_1_PANEL 1734 +#define IMG_FONT_TEXT_1_DOOR 1735 +#define IMG_FONT_TEXT_2 1736 +#define IMG_FONT_TEXT_2_MAIN 1737 +#define IMG_FONT_TEXT_2_LEVELS 1738 +#define IMG_FONT_TEXT_2_LEVELNR 1739 +#define IMG_FONT_TEXT_2_SETUP 1740 +#define IMG_FONT_TEXT_2_PREVIEW 1741 +#define IMG_FONT_TEXT_2_SCORES 1742 +#define IMG_FONT_TEXT_2_ACTIVE_SCORES 1743 +#define IMG_FONT_TEXT_3 1744 +#define IMG_FONT_TEXT_3_LEVELS 1745 +#define IMG_FONT_TEXT_3_LEVELNR 1746 +#define IMG_FONT_TEXT_3_SETUP 1747 +#define IMG_FONT_TEXT_3_PREVIEW 1748 +#define IMG_FONT_TEXT_3_SCORES 1749 +#define IMG_FONT_TEXT_3_ACTIVE_SCORES 1750 +#define IMG_FONT_TEXT_4 1751 +#define IMG_FONT_TEXT_4_MAIN 1752 +#define IMG_FONT_TEXT_4_LEVELS 1753 +#define IMG_FONT_TEXT_4_LEVELNR 1754 +#define IMG_FONT_TEXT_4_SETUP 1755 +#define IMG_FONT_TEXT_4_SCORES 1756 +#define IMG_FONT_TEXT_4_ACTIVE_SCORES 1757 +#define IMG_FONT_ENVELOPE_1 1758 +#define IMG_FONT_ENVELOPE_2 1759 +#define IMG_FONT_ENVELOPE_3 1760 +#define IMG_FONT_ENVELOPE_4 1761 +#define IMG_FONT_INPUT_1 1762 +#define IMG_FONT_INPUT_1_MAIN 1763 +#define IMG_FONT_INPUT_1_ACTIVE 1764 +#define IMG_FONT_INPUT_1_ACTIVE_MAIN 1765 +#define IMG_FONT_INPUT_1_ACTIVE_SETUP 1766 +#define IMG_FONT_INPUT_2 1767 +#define IMG_FONT_INPUT_2_ACTIVE 1768 +#define IMG_FONT_OPTION_OFF 1769 +#define IMG_FONT_OPTION_ON 1770 +#define IMG_FONT_VALUE_1 1771 +#define IMG_FONT_VALUE_2 1772 +#define IMG_FONT_VALUE_OLD 1773 +#define IMG_FONT_LEVEL_NUMBER 1774 +#define IMG_FONT_LEVEL_NUMBER_ACTIVE 1775 +#define IMG_FONT_TAPE_RECORDER 1776 +#define IMG_FONT_GAME_INFO 1777 +#define IMG_FONT_INFO_ELEMENTS 1778 +#define IMG_FONT_INFO_LEVELSET 1779 +#define IMG_GLOBAL_BORDER 1780 +#define IMG_GLOBAL_DOOR 1781 +#define IMG_GLOBAL_BUSY 1782 +#define IMG_EDITOR_ELEMENT_BORDER 1783 +#define IMG_EDITOR_ELEMENT_BORDER_INPUT 1784 +#define IMG_EDITOR_CASCADE_LIST 1785 +#define IMG_EDITOR_CASCADE_LIST_ACTIVE 1786 +#define IMG_BACKGROUND 1787 +#define IMG_BACKGROUND_TITLE_INITIAL 1788 +#define IMG_BACKGROUND_TITLE 1789 +#define IMG_BACKGROUND_MAIN 1790 +#define IMG_BACKGROUND_LEVELS 1791 +#define IMG_BACKGROUND_LEVELNR 1792 +#define IMG_BACKGROUND_SCORES 1793 +#define IMG_BACKGROUND_EDITOR 1794 +#define IMG_BACKGROUND_INFO 1795 +#define IMG_BACKGROUND_INFO_ELEMENTS 1796 +#define IMG_BACKGROUND_INFO_MUSIC 1797 +#define IMG_BACKGROUND_INFO_CREDITS 1798 +#define IMG_BACKGROUND_INFO_PROGRAM 1799 +#define IMG_BACKGROUND_INFO_VERSION 1800 +#define IMG_BACKGROUND_INFO_LEVELSET 1801 +#define IMG_BACKGROUND_SETUP 1802 +#define IMG_BACKGROUND_PLAYING 1803 +#define IMG_BACKGROUND_DOOR 1804 +#define IMG_BACKGROUND_TAPE 1805 +#define IMG_BACKGROUND_PANEL 1806 +#define IMG_BACKGROUND_TITLESCREEN_INITIAL_1 1807 +#define IMG_BACKGROUND_TITLESCREEN_INITIAL_2 1808 +#define IMG_BACKGROUND_TITLESCREEN_INITIAL_3 1809 +#define IMG_BACKGROUND_TITLESCREEN_INITIAL_4 1810 +#define IMG_BACKGROUND_TITLESCREEN_INITIAL_5 1811 +#define IMG_BACKGROUND_TITLESCREEN_1 1812 +#define IMG_BACKGROUND_TITLESCREEN_2 1813 +#define IMG_BACKGROUND_TITLESCREEN_3 1814 +#define IMG_BACKGROUND_TITLESCREEN_4 1815 +#define IMG_BACKGROUND_TITLESCREEN_5 1816 +#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_1 1817 +#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_2 1818 +#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_3 1819 +#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_4 1820 +#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_5 1821 +#define IMG_BACKGROUND_TITLEMESSAGE_1 1822 +#define IMG_BACKGROUND_TITLEMESSAGE_2 1823 +#define IMG_BACKGROUND_TITLEMESSAGE_3 1824 +#define IMG_BACKGROUND_TITLEMESSAGE_4 1825 +#define IMG_BACKGROUND_TITLEMESSAGE_5 1826 +#define IMG_BACKGROUND_ENVELOPE_1 1827 +#define IMG_BACKGROUND_ENVELOPE_2 1828 +#define IMG_BACKGROUND_ENVELOPE_3 1829 +#define IMG_BACKGROUND_ENVELOPE_4 1830 +#define IMG_TITLESCREEN_INITIAL_1 1831 +#define IMG_TITLESCREEN_INITIAL_2 1832 +#define IMG_TITLESCREEN_INITIAL_3 1833 +#define IMG_TITLESCREEN_INITIAL_4 1834 +#define IMG_TITLESCREEN_INITIAL_5 1835 +#define IMG_TITLESCREEN_1 1836 +#define IMG_TITLESCREEN_2 1837 +#define IMG_TITLESCREEN_3 1838 +#define IMG_TITLESCREEN_4 1839 +#define IMG_TITLESCREEN_5 1840 -#define NUM_IMAGE_FILES 1800 +#define NUM_IMAGE_FILES 1841 #endif /* CONF_GFX_H */ diff --git a/src/conf_var.c b/src/conf_var.c index e12f0015..059f3db6 100644 --- a/src/conf_var.c +++ b/src/conf_var.c @@ -936,6 +936,10 @@ struct TokenIntPtrInfo image_config_vars[] = "border.draw_masked.LEVELS", &border.draw_masked[GFX_SPECIAL_ARG_LEVELS] }, + { + "border.draw_masked.LEVELNR", + &border.draw_masked[GFX_SPECIAL_ARG_LEVELNR] + }, { "border.draw_masked.SCORES", &border.draw_masked[GFX_SPECIAL_ARG_SCORES] @@ -1160,6 +1164,14 @@ struct TokenIntPtrInfo image_config_vars[] = "menu.draw_yoffset.LEVELS", &menu.draw_yoffset[GFX_SPECIAL_ARG_LEVELS] }, + { + "menu.draw_xoffset.LEVELNR", + &menu.draw_xoffset[GFX_SPECIAL_ARG_LEVELNR] + }, + { + "menu.draw_yoffset.LEVELNR", + &menu.draw_yoffset[GFX_SPECIAL_ARG_LEVELNR] + }, { "menu.draw_xoffset.SCORES", &menu.draw_xoffset[GFX_SPECIAL_ARG_SCORES] @@ -1356,6 +1368,10 @@ struct TokenIntPtrInfo image_config_vars[] = "menu.list_size.LEVELS", &menu.list_size[GFX_SPECIAL_ARG_LEVELS] }, + { + "menu.list_size.LEVELNR", + &menu.list_size[GFX_SPECIAL_ARG_LEVELNR] + }, { "menu.list_size.SCORES", &menu.list_size[GFX_SPECIAL_ARG_SCORES] @@ -5060,6 +5076,270 @@ struct TokenIntPtrInfo image_config_vars[] = "game.button.sound_simple.y", &game.button.sound_simple.y }, + { + "tape.button.eject.x", + &tape.button.eject.x + }, + { + "tape.button.eject.y", + &tape.button.eject.y + }, + { + "tape.button.stop.x", + &tape.button.stop.x + }, + { + "tape.button.stop.y", + &tape.button.stop.y + }, + { + "tape.button.pause.x", + &tape.button.pause.x + }, + { + "tape.button.pause.y", + &tape.button.pause.y + }, + { + "tape.button.record.x", + &tape.button.record.x + }, + { + "tape.button.record.y", + &tape.button.record.y + }, + { + "tape.button.play.x", + &tape.button.play.x + }, + { + "tape.button.play.y", + &tape.button.play.y + }, + { + "tape.symbol.eject.x", + &tape.symbol.eject.x + }, + { + "tape.symbol.eject.y", + &tape.symbol.eject.y + }, + { + "tape.symbol.stop.x", + &tape.symbol.stop.x + }, + { + "tape.symbol.stop.y", + &tape.symbol.stop.y + }, + { + "tape.symbol.pause.x", + &tape.symbol.pause.x + }, + { + "tape.symbol.pause.y", + &tape.symbol.pause.y + }, + { + "tape.symbol.record.x", + &tape.symbol.record.x + }, + { + "tape.symbol.record.y", + &tape.symbol.record.y + }, + { + "tape.symbol.play.x", + &tape.symbol.play.x + }, + { + "tape.symbol.play.y", + &tape.symbol.play.y + }, + { + "tape.symbol.fast_forward.x", + &tape.symbol.fast_forward.x + }, + { + "tape.symbol.fast_forward.y", + &tape.symbol.fast_forward.y + }, + { + "tape.symbol.warp_forward.x", + &tape.symbol.warp_forward.x + }, + { + "tape.symbol.warp_forward.y", + &tape.symbol.warp_forward.y + }, + { + "tape.symbol.warp_forward_blind.x", + &tape.symbol.warp_forward_blind.x + }, + { + "tape.symbol.warp_forward_blind.y", + &tape.symbol.warp_forward_blind.y + }, + { + "tape.symbol.pause_before_end.x", + &tape.symbol.pause_before_end.x + }, + { + "tape.symbol.pause_before_end.y", + &tape.symbol.pause_before_end.y + }, + { + "tape.symbol.single_step.x", + &tape.symbol.single_step.x + }, + { + "tape.symbol.single_step.y", + &tape.symbol.single_step.y + }, + { + "tape.label.eject.x", + &tape.label.eject.x + }, + { + "tape.label.eject.y", + &tape.label.eject.y + }, + { + "tape.label.stop.x", + &tape.label.stop.x + }, + { + "tape.label.stop.y", + &tape.label.stop.y + }, + { + "tape.label.pause.x", + &tape.label.pause.x + }, + { + "tape.label.pause.y", + &tape.label.pause.y + }, + { + "tape.label.record.x", + &tape.label.record.x + }, + { + "tape.label.record.y", + &tape.label.record.y + }, + { + "tape.label.play.x", + &tape.label.play.x + }, + { + "tape.label.play.y", + &tape.label.play.y + }, + { + "tape.label.fast_forward.x", + &tape.label.fast_forward.x + }, + { + "tape.label.fast_forward.y", + &tape.label.fast_forward.y + }, + { + "tape.label.warp_forward.x", + &tape.label.warp_forward.x + }, + { + "tape.label.warp_forward.y", + &tape.label.warp_forward.y + }, + { + "tape.label.warp_forward_blind.x", + &tape.label.warp_forward_blind.x + }, + { + "tape.label.warp_forward_blind.y", + &tape.label.warp_forward_blind.y + }, + { + "tape.label.pause_before_end.x", + &tape.label.pause_before_end.x + }, + { + "tape.label.pause_before_end.y", + &tape.label.pause_before_end.y + }, + { + "tape.label.single_step.x", + &tape.label.single_step.x + }, + { + "tape.label.single_step.y", + &tape.label.single_step.y + }, + { + "tape.label.date.x", + &tape.label.date.x + }, + { + "tape.label.date.y", + &tape.label.date.y + }, + { + "tape.label.time.x", + &tape.label.time.x + }, + { + "tape.label.time.y", + &tape.label.time.y + }, + { + "tape.text.date.x", + &tape.text.date.x + }, + { + "tape.text.date.y", + &tape.text.date.y + }, + { + "tape.text.date.align", + &tape.text.date.align + }, + { + "tape.text.date.valign", + &tape.text.date.valign + }, + { + "tape.text.date.digits", + &tape.text.date.size + }, + { + "tape.text.date.font", + &tape.text.date.font + }, + { + "tape.text.time.x", + &tape.text.time.x + }, + { + "tape.text.time.y", + &tape.text.time.y + }, + { + "tape.text.time.align", + &tape.text.time.align + }, + { + "tape.text.time.valign", + &tape.text.time.valign + }, + { + "tape.text.time.digits", + &tape.text.time.size + }, + { + "tape.text.time.font", + &tape.text.time.font + }, { "game.forced_scroll_delay_value", &game.forced_scroll_delay_value @@ -5076,6 +5356,10 @@ struct TokenIntPtrInfo image_config_vars[] = "game.use_masked_pushing", &game.use_masked_pushing }, + { + "game.tile_size", + &game.tile_size + }, { "[player].boring_delay_fixed", &game.player_boring_delay_fixed diff --git a/src/conftime.h b/src/conftime.h index dbaea91e..304aecb5 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2010-06-08 22:20" +#define COMPILE_DATE_STRING "2013-10-23 22:33" diff --git a/src/editor.c b/src/editor.c index 5752d742..005a1a2a 100644 --- a/src/editor.c +++ b/src/editor.c @@ -971,8 +971,13 @@ #define RANDOM_USE_QUANTITY 1 /* maximal size of level editor drawing area */ +#if NEW_TILESIZE +#define MAX_ED_FIELDX (SCR_FIELDX) +#define MAX_ED_FIELDY (SCR_FIELDY - 1) +#else #define MAX_ED_FIELDX (2 * SCR_FIELDX) #define MAX_ED_FIELDY (2 * SCR_FIELDY - 1) +#endif /* @@ -2710,7 +2715,7 @@ static struct GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE, &level.continuous_snapping, NULL, - "continuos snapping", "use snapping without releasing key" + "continuous snapping", "use snapping without releasing key" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), @@ -5143,7 +5148,7 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height, int by2 = TILEY - by; int i; - getGraphicSource(border_graphic, 0, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(border_graphic, 0, &src_bitmap, &src_x, &src_y); BlitBitmap(src_bitmap, drawto, src_x, src_y, bx, by, dest_x - bx, dest_y - by); @@ -5225,7 +5230,7 @@ static void CreateControlButtons() { Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int i; /* create toolbox buttons */ @@ -5514,7 +5519,7 @@ static void CreateCounterButtons() int gd_xoffset; int gd_x, gd_x1, gd_x2, gd_y; int x_size, y_size; - unsigned long event_mask; + unsigned int event_mask; char infotext[max_infotext_len + 1]; event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; @@ -5650,7 +5655,7 @@ static void CreateDrawingAreas() for (i = 0; i < ED_NUM_DRAWING_AREAS; i++) { struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int id = drawingarea_info[i].gadget_id; int x = SX + drawingarea_info[i].x; int y = SY + drawingarea_info[i].y; @@ -5701,7 +5706,7 @@ static void CreateTextInputGadgets() Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; int gd_x, gd_y; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = textinput_info[i].gadget_id; @@ -5749,7 +5754,7 @@ static void CreateTextAreaGadgets() Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; int gd_x, gd_y; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = textarea_info[i].gadget_id; int area_xsize = textarea_info[i].xsize; @@ -5798,7 +5803,7 @@ static void CreateSelectboxGadgets() Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; int gd_x, gd_y; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = selectbox_info[i].gadget_id; int x = SX + selectbox_info[i].x; @@ -5875,7 +5880,7 @@ static void CreateTextbuttonGadgets() Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; int gd_x1, gd_x2, gd_y1, gd_y2; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = textbutton_info[i].gadget_id; int x = SX + textbutton_info[i].x; @@ -5948,7 +5953,7 @@ static void CreateGraphicbuttonGadgets() { Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int i; /* create buttons for scrolling of drawing area and element list */ @@ -6055,7 +6060,7 @@ static void CreateScrollbarGadgets() int gd_x1, gd_x2, gd_y1, gd_y2; struct GadgetInfo *gi; int items_max, items_visible, item_position; - unsigned long event_mask; + unsigned int event_mask; if (i == ED_SCROLLBAR_ID_LIST_VERTICAL) { @@ -6122,7 +6127,7 @@ static void CreateCheckbuttonGadgets() { Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int gd_x1, gd_x2, gd_x3, gd_x4, gd_y; int i; @@ -6185,7 +6190,7 @@ static void CreateRadiobuttonGadgets() { Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int gd_x1, gd_x2, gd_x3, gd_x4, gd_y; int i; @@ -8812,7 +8817,7 @@ static void DrawEditorElementAnimation(int x, int y) ANIM_MODE(graphic) == ANIM_CE_SCORE ? custom_element.collect_score_initial : FrameCounter); - DrawGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); + DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); } static void DrawEditorElementName(int x, int y, int element) @@ -10309,7 +10314,10 @@ static void FloodFill(int from_x, int from_y, int fill_element) static int DrawLevelText(int sx, int sy, char letter, int mode) { static short delete_buffer[MAX_LEV_FIELDX]; - static int start_sx, start_sy; + static int start_sx; +#if 0 + static int start_sy; +#endif static int last_sx, last_sy; static boolean typing = FALSE; int letter_element = EL_CHAR_ASCII0 + letter; @@ -10351,8 +10359,12 @@ static int DrawLevelText(int sx, int sy, char letter, int mode) DrawLevelText(0, 0, 0, TEXT_END); typing = TRUE; - start_sx = last_sx = sx; - start_sy = last_sy = sy; + start_sx = sx; +#if 0 + start_sy = sy; +#endif + last_sx = sx; + last_sy = sy; DrawLevelText(sx, sy, 0, TEXT_SETCURSOR); break; @@ -10717,10 +10729,10 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) gi->y + sy * MINI_TILEY, el2edimg(new_element)); else - DrawGraphicExt(drawto, - gi->x + sx * TILEX, - gi->y + sy * TILEY, - el2img(new_element), 0); + DrawFixedGraphicExt(drawto, + gi->x + sx * TILEX, + gi->y + sy * TILEY, + el2img(new_element), 0); if (id == GADGET_ID_CUSTOM_GRAPHIC) new_element = GFX_ELEMENT(new_element); @@ -11744,8 +11756,8 @@ void HandleLevelEditorKeyInput(Key key) void HandleLevelEditorIdle() { - static unsigned long action_delay = 0; - unsigned long action_delay_value = GameFrameDelay; + static unsigned int action_delay = 0; + unsigned int action_delay_value = GameFrameDelay; int xpos = 1, ypos = 2; int i; diff --git a/src/engines.h b/src/engines.h index 8bd49cb8..ca773262 100644 --- a/src/engines.h +++ b/src/engines.h @@ -34,7 +34,7 @@ extern int getGameFrameDelay_EM(int); extern void PlayLevelSound_EM(int, int, int, int); extern void InitGraphicInfo_EM(void); -extern void CheckSingleStepMode_EM(byte action[], int, boolean); +extern void CheckSingleStepMode_EM(byte action[], int, boolean, boolean); void SetGfxAnimation_EM(struct GraphicInfo_EM *, int, int, int, int); void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *, int, int, int, int); @@ -49,7 +49,7 @@ void getGraphicSourcePlayerExt_EM(struct GraphicInfo_EM *, int, int, int); extern void SetBitmaps_SP(Bitmap **); #endif -void CheckSingleStepMode_SP(boolean); +void CheckSingleStepMode_SP(boolean, boolean); void getGraphicSource_SP(struct GraphicInfo_SP *, int, int, int, int); int getGraphicInfo_Delay(int); diff --git a/src/events.c b/src/events.c index 8c7aecae..d583d873 100644 --- a/src/events.c +++ b/src/events.c @@ -29,7 +29,7 @@ static boolean cursor_inside_playfield = FALSE; static boolean playfield_cursor_set = FALSE; -static unsigned long playfield_cursor_delay = 0; +static unsigned int playfield_cursor_delay = 0; /* event filter especially needed for SDL event filtering due to @@ -465,7 +465,11 @@ void HandleButton(int mx, int my, int button, int button_nr) break; case GAME_MODE_LEVELS: - HandleChooseLevel(mx, my, 0, 0, button); + HandleChooseLevelSet(mx, my, 0, 0, button); + break; + + case GAME_MODE_LEVELNR: + HandleChooseLevelNr(mx, my, 0, 0, button); break; case GAME_MODE_SCORES: @@ -630,12 +634,12 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_PLAYING) { /* only needed for single-step tape recording mode */ - static boolean clear_button_2[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + static boolean clear_snap_button[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + static boolean clear_drop_button[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + static boolean element_snapped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; static boolean element_dropped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; int pnr; - ssi = setup.shortcut; - for (pnr = 0; pnr < MAX_PLAYERS; pnr++) { byte key_action = 0; @@ -649,14 +653,30 @@ void HandleKey(Key key, int key_status) if (key == *key_info[i].key_custom) key_action |= key_info[i].action; - for (i = 0; i < NUM_DIRECTIONS; i++) - if (key == *key_info[i].key_snap) - key_action |= key_info[i].action | JOY_BUTTON_SNAP; + /* use combined snap+direction keys for the first player only */ + if (pnr == 0) + { + ssi = setup.shortcut; - if (tape.single_step && clear_button_2[pnr]) + for (i = 0; i < NUM_DIRECTIONS; i++) + if (key == *key_info[i].key_snap) + key_action |= key_info[i].action | JOY_BUTTON_SNAP; + } + + /* clear delayed snap and drop actions in single step mode (see below) */ + if (tape.single_step) { - stored_player[pnr].action &= ~KEY_BUTTON_2; - clear_button_2[pnr] = FALSE; + if (clear_snap_button[pnr]) + { + stored_player[pnr].action &= ~KEY_BUTTON_SNAP; + clear_snap_button[pnr] = FALSE; + } + + if (clear_drop_button[pnr]) + { + stored_player[pnr].action &= ~KEY_BUTTON_DROP; + clear_drop_button[pnr] = FALSE; + } } if (key_status == KEY_PRESSED) @@ -666,43 +686,82 @@ void HandleKey(Key key, int key_status) if (tape.single_step && tape.recording && tape.pausing) { - if (key_status == KEY_PRESSED && - (key_action & (KEY_MOTION | KEY_BUTTON_1))) + if (key_status == KEY_PRESSED && key_action & KEY_MOTION) { TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - if (key_action & KEY_MOTION) + /* if snap key already pressed, don't snap when releasing (below) */ + if (stored_player[pnr].action & KEY_BUTTON_SNAP) + element_snapped[pnr] = TRUE; + + /* if drop key already pressed, don't drop when releasing (below) */ + if (stored_player[pnr].action & KEY_BUTTON_DROP) + element_dropped[pnr] = TRUE; + } +#if 1 + else if (key_status == KEY_PRESSED && key_action & KEY_BUTTON_DROP) + { + if (level.game_engine_type == GAME_ENGINE_TYPE_EM || + level.game_engine_type == GAME_ENGINE_TYPE_SP) { - if (stored_player[pnr].action & KEY_BUTTON_2) - element_dropped[pnr] = TRUE; +#if 0 + printf("::: drop key pressed\n"); +#endif + + if (level.game_engine_type == GAME_ENGINE_TYPE_SP && + getRedDiskReleaseFlag_SP() == 0) + stored_player[pnr].action &= ~KEY_BUTTON_DROP; + + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); } } - else if (key_status == KEY_RELEASED && - (key_action & KEY_BUTTON_2)) +#endif + else if (key_status == KEY_RELEASED && key_action & KEY_BUTTON) { - if (!element_dropped[pnr]) + if (key_action & KEY_BUTTON_SNAP) { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + /* if snap key was released without moving (see above), snap now */ + if (!element_snapped[pnr]) + { + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - stored_player[pnr].action |= KEY_BUTTON_2; - clear_button_2[pnr] = TRUE; + stored_player[pnr].action |= KEY_BUTTON_SNAP; + + /* clear delayed snap button on next event */ + clear_snap_button[pnr] = TRUE; + } + + element_snapped[pnr] = FALSE; } - element_dropped[pnr] = FALSE; +#if 1 + if (key_action & KEY_BUTTON_DROP && + level.game_engine_type == GAME_ENGINE_TYPE_RND) + { + /* if drop key was released without moving (see above), drop now */ + if (!element_dropped[pnr]) + { + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + + if (level.game_engine_type != GAME_ENGINE_TYPE_SP || + getRedDiskReleaseFlag_SP() != 0) + stored_player[pnr].action |= KEY_BUTTON_DROP; + + /* clear delayed drop button on next event */ + clear_drop_button[pnr] = TRUE; + } + + element_dropped[pnr] = FALSE; + } +#endif } } -#if 1 else if (tape.recording && tape.pausing) { /* prevent key release events from un-pausing a paused game */ - if (key_status == KEY_PRESSED && - (key_action & KEY_ACTION)) + if (key_status == KEY_PRESSED && key_action & KEY_ACTION) TapeTogglePause(TAPE_TOGGLE_MANUAL); } -#else - else if (tape.recording && tape.pausing && (key_action & KEY_ACTION)) - TapeTogglePause(TAPE_TOGGLE_MANUAL); -#endif } } else @@ -816,6 +875,7 @@ void HandleKey(Key key, int key_status) case GAME_MODE_TITLE: case GAME_MODE_MAIN: case GAME_MODE_LEVELS: + case GAME_MODE_LEVELNR: case GAME_MODE_SETUP: case GAME_MODE_INFO: case GAME_MODE_SCORES: @@ -828,7 +888,9 @@ void HandleKey(Key key, int key_status) else if (game_status == GAME_MODE_MAIN) HandleMainMenu(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0, 0, 0, 0, MB_MENU_CHOICE); + HandleChooseLevelSet(0, 0, 0, 0, MB_MENU_CHOICE); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_INFO) @@ -844,7 +906,9 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_TITLE) HandleTitleScreen(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0, 0, 0, 0, MB_MENU_LEAVE); + HandleChooseLevelSet(0, 0, 0, 0, MB_MENU_LEAVE); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_INFO) @@ -855,7 +919,9 @@ void HandleKey(Key key, int key_status) case KSYM_Page_Up: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + HandleChooseLevelSet(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) @@ -866,7 +932,9 @@ void HandleKey(Key key, int key_status) case KSYM_Page_Down: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + HandleChooseLevelSet(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) @@ -944,7 +1012,7 @@ void HandleKey(Key key, int key_status) } break; - case KSYM_S: + case KSYM_s: if (!global.fps_slowdown) { global.fps_slowdown = TRUE; @@ -965,17 +1033,17 @@ void HandleKey(Key key, int key_status) break; case KSYM_f: - ScrollStepSize = TILEX/8; + ScrollStepSize = TILEX / 8; printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); break; case KSYM_g: - ScrollStepSize = TILEX/4; + ScrollStepSize = TILEX / 4; printf("ScrollStepSize == %d (1/4)\n", ScrollStepSize); break; case KSYM_h: - ScrollStepSize = TILEX/2; + ScrollStepSize = TILEX / 2; printf("ScrollStepSize == %d (1/2)\n", ScrollStepSize); break; @@ -1069,10 +1137,11 @@ void HandleJoystick() case GAME_MODE_TITLE: case GAME_MODE_MAIN: case GAME_MODE_LEVELS: + case GAME_MODE_LEVELNR: case GAME_MODE_SETUP: case GAME_MODE_INFO: { - static unsigned long joystickmove_delay = 0; + static unsigned int joystickmove_delay = 0; if (joystick && !button && !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY)) @@ -1083,7 +1152,9 @@ void HandleJoystick() else if (game_status == GAME_MODE_MAIN) HandleMainMenu(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + HandleChooseLevelSet(0,0,dx,dy,newbutton?MB_MENU_CHOICE : MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0,dx,dy,newbutton? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) diff --git a/src/files.c b/src/files.c index 349d2d52..7ff37822 100644 --- a/src/files.c +++ b/src/files.c @@ -1596,11 +1596,203 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change) change->post_change_function = NULL; } -static void setLevelInfoToDefaults(struct LevelInfo *level) +#if 1 + +static void setLevelInfoToDefaults_Level(struct LevelInfo *level) +{ + int i, x, y; + + li = *level; /* copy level data into temporary buffer */ + setConfigToDefaultsFromConfigList(chunk_config_INFO); + *level = li; /* copy temporary buffer back to level data */ + + setLevelInfoToDefaults_EM(); + setLevelInfoToDefaults_SP(); + + level->native_em_level = &native_em_level; + level->native_sp_level = &native_sp_level; + + level->file_version = FILE_VERSION_ACTUAL; + level->game_version = GAME_VERSION_ACTUAL; + + level->creation_date = getCurrentDate(); + + level->encoding_16bit_field = TRUE; + level->encoding_16bit_yamyam = TRUE; + level->encoding_16bit_amoeba = TRUE; + + for (x = 0; x < MAX_LEV_FIELDX; x++) + for (y = 0; y < MAX_LEV_FIELDY; y++) + level->field[x][y] = EL_SAND; + + for (i = 0; i < MAX_LEVEL_NAME_LEN; i++) + level->name[i] = '\0'; + for (i = 0; i < MAX_LEVEL_AUTHOR_LEN; i++) + level->author[i] = '\0'; + + strcpy(level->name, NAMELESS_LEVEL_NAME); + strcpy(level->author, ANONYMOUS_NAME); + + level->field[0][0] = EL_PLAYER_1; + level->field[STD_LEV_FIELDX - 1][STD_LEV_FIELDY - 1] = EL_EXIT_CLOSED; + + BorderElement = EL_STEELWALL; + + /* set all bug compatibility flags to "false" => do not emulate this bug */ + level->use_action_after_change_bug = FALSE; + + if (leveldir_current) + { + /* try to determine better author name than 'anonymous' */ + if (!strEqual(leveldir_current->author, ANONYMOUS_NAME)) + { + strncpy(level->author, leveldir_current->author, MAX_LEVEL_AUTHOR_LEN); + level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; + } + else + { + switch (LEVELCLASS(leveldir_current)) + { + case LEVELCLASS_TUTORIAL: + strcpy(level->author, PROGRAM_AUTHOR_STRING); + break; + + case LEVELCLASS_CONTRIB: + strncpy(level->author, leveldir_current->name, MAX_LEVEL_AUTHOR_LEN); + level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; + break; + + case LEVELCLASS_PRIVATE: + strncpy(level->author, getRealName(), MAX_LEVEL_AUTHOR_LEN); + level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; + break; + + default: + /* keep default value */ + break; + } + } + } +} + +static void setLevelInfoToDefaults_Elements(struct LevelInfo *level) +{ + static boolean clipboard_elements_initialized = FALSE; + int i; + + InitElementPropertiesStatic(); + + li = *level; /* copy level data into temporary buffer */ + setConfigToDefaultsFromConfigList(chunk_config_ELEM); + *level = li; /* copy temporary buffer back to level data */ + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + { + int element = i; + struct ElementInfo *ei = &element_info[element]; + + /* never initialize clipboard elements after the very first time */ + /* (to be able to use clipboard elements between several levels) */ + if (IS_CLIPBOARD_ELEMENT(element) && clipboard_elements_initialized) + continue; + + if (IS_ENVELOPE(element)) + { + int envelope_nr = element - EL_ENVELOPE_1; + + setConfigToDefaultsFromConfigList(chunk_config_NOTE); + + level->envelope[envelope_nr] = xx_envelope; + } + + if (IS_CUSTOM_ELEMENT(element) || + IS_GROUP_ELEMENT(element) || + IS_INTERNAL_ELEMENT(element)) + { + xx_ei = *ei; /* copy element data into temporary buffer */ + + setConfigToDefaultsFromConfigList(chunk_config_CUSX_base); + + *ei = xx_ei; + } + + setElementChangePages(ei, 1); + setElementChangeInfoToDefaults(ei->change); + + if (IS_CUSTOM_ELEMENT(element) || + IS_GROUP_ELEMENT(element) || + IS_INTERNAL_ELEMENT(element)) + { + setElementDescriptionToDefault(ei); + + ei->modified_settings = FALSE; + } + + if (IS_CUSTOM_ELEMENT(element) || + IS_INTERNAL_ELEMENT(element)) + { + /* internal values used in level editor */ + + ei->access_type = 0; + ei->access_layer = 0; + ei->access_protected = 0; + ei->walk_to_action = 0; + ei->smash_targets = 0; + ei->deadliness = 0; + + ei->can_explode_by_fire = FALSE; + ei->can_explode_smashed = FALSE; + ei->can_explode_impact = FALSE; + + ei->current_change_page = 0; + } + + if (IS_GROUP_ELEMENT(element) || + IS_INTERNAL_ELEMENT(element)) + { + struct ElementGroupInfo *group; + + /* initialize memory for list of elements in group */ + if (ei->group == NULL) + ei->group = checked_malloc(sizeof(struct ElementGroupInfo)); + + group = ei->group; + + xx_group = *group; /* copy group data into temporary buffer */ + + setConfigToDefaultsFromConfigList(chunk_config_GRPX); + + *group = xx_group; + } + } + + clipboard_elements_initialized = TRUE; +} + +static void setLevelInfoToDefaults(struct LevelInfo *level, + boolean level_info_only) +{ + setLevelInfoToDefaults_Level(level); + + if (!level_info_only) + setLevelInfoToDefaults_Elements(level); + + level->no_valid_file = FALSE; + + level->changed = FALSE; +} + +#else + +static void setLevelInfoToDefaults(struct LevelInfo *level, + boolean level_info_only) { static boolean clipboard_elements_initialized = FALSE; int i, x, y; + if (level_info_only) + return; + InitElementPropertiesStatic(); li = *level; /* copy level data into temporary buffer */ @@ -1731,40 +1923,42 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) /* set all bug compatibility flags to "false" => do not emulate this bug */ level->use_action_after_change_bug = FALSE; - if (leveldir_current == NULL) /* only when dumping level */ - return; - - /* try to determine better author name than 'anonymous' */ - if (!strEqual(leveldir_current->author, ANONYMOUS_NAME)) + if (leveldir_current) { - strncpy(level->author, leveldir_current->author, MAX_LEVEL_AUTHOR_LEN); - level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; - } - else - { - switch (LEVELCLASS(leveldir_current)) + /* try to determine better author name than 'anonymous' */ + if (!strEqual(leveldir_current->author, ANONYMOUS_NAME)) { - case LEVELCLASS_TUTORIAL: - strcpy(level->author, PROGRAM_AUTHOR_STRING); - break; - - case LEVELCLASS_CONTRIB: - strncpy(level->author, leveldir_current->name, MAX_LEVEL_AUTHOR_LEN); - level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; - break; - - case LEVELCLASS_PRIVATE: - strncpy(level->author, getRealName(), MAX_LEVEL_AUTHOR_LEN); - level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; - break; - - default: - /* keep default value */ - break; + strncpy(level->author, leveldir_current->author, MAX_LEVEL_AUTHOR_LEN); + level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; + } + else + { + switch (LEVELCLASS(leveldir_current)) + { + case LEVELCLASS_TUTORIAL: + strcpy(level->author, PROGRAM_AUTHOR_STRING); + break; + + case LEVELCLASS_CONTRIB: + strncpy(level->author, leveldir_current->name, MAX_LEVEL_AUTHOR_LEN); + level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; + break; + + case LEVELCLASS_PRIVATE: + strncpy(level->author, getRealName(), MAX_LEVEL_AUTHOR_LEN); + level->author[MAX_LEVEL_AUTHOR_LEN] = '\0'; + break; + + default: + /* keep default value */ + break; + } } } } +#endif + static void setFileInfoToDefaults(struct LevelFileInfo *level_file_info) { level_file_info->nr = 0; @@ -2390,13 +2584,21 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) { int i, x, y; int element; - int num_contents, content_xsize, content_ysize; + int num_contents; +#if 0 + int content_xsize, content_ysize; +#endif int content_array[MAX_ELEMENT_CONTENTS][3][3]; element = getMappedElement(getFile16BitBE(file)); num_contents = getFile8Bit(file); +#if 1 + getFile8Bit(file); /* content x size (unused) */ + getFile8Bit(file); /* content y size (unused) */ +#else content_xsize = getFile8Bit(file); content_ysize = getFile8Bit(file); +#endif ReadUnusedBytesFromFile(file, LEVEL_CHUNK_CNT2_UNUSED); @@ -3120,7 +3322,8 @@ static int LoadLevel_GRPX(FILE *file, int chunk_size, struct LevelInfo *level) } static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) + struct LevelFileInfo *level_file_info, + boolean level_info_only) { char *filename = level_file_info->filename; char cookie[MAX_LINE_LEN]; @@ -3133,7 +3336,8 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, level->no_valid_file = TRUE; #if 1 - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); #else if (level != &level_template) Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); @@ -3160,7 +3364,8 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, else /* check for pre-2.0 file format with cookie string */ { strcpy(cookie, chunk_name); - fgets(&cookie[4], MAX_LINE_LEN - 4, file); + if (fgets(&cookie[4], MAX_LINE_LEN - 4, file) == NULL) + cookie[4] = '\0'; if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; @@ -4091,7 +4296,8 @@ static void LoadLevelFromFileStream_SP(FILE *file, struct LevelInfo *level, } static void LoadLevelFromFileInfo_SP(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) + struct LevelFileInfo *level_file_info, + boolean level_info_only) { char *filename = level_file_info->filename; FILE *file; @@ -4109,7 +4315,8 @@ static void LoadLevelFromFileInfo_SP(struct LevelInfo *level, { level->no_valid_file = TRUE; - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); return; } @@ -6186,7 +6393,8 @@ static void LoadLevelFromFileStream_DC(FILE *file, struct LevelInfo *level, } static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) + struct LevelFileInfo *level_file_info, + boolean level_info_only) { char *filename = level_file_info->filename; FILE *file; @@ -6198,7 +6406,8 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, { level->no_valid_file = TRUE; - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); return; } @@ -6208,7 +6417,8 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, if (level_file_info->packed) { /* read "magic bytes" from start of file */ - fgets(magic_bytes, num_magic_bytes + 1, file); + if (fgets(magic_bytes, num_magic_bytes + 1, file) == NULL) + magic_bytes[0] = '\0'; /* check "magic bytes" for correct file format */ if (!strPrefix(magic_bytes, "DC2")) @@ -6301,7 +6511,8 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, { level->no_valid_file = TRUE; - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); return; } @@ -6535,7 +6746,8 @@ int getMappedElement_SB(int element_ascii, boolean use_ces) } static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) + struct LevelFileInfo *level_file_info, + boolean level_info_only) { char *filename = level_file_info->filename; char line[MAX_LINE_LEN], line_raw[MAX_LINE_LEN], previous_line[MAX_LINE_LEN]; @@ -6565,7 +6777,8 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, { level->no_valid_file = TRUE; - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); return; } @@ -6842,14 +7055,16 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, /* ------------------------------------------------------------------------- */ static void LoadLevelFromFileInfo_EM(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) + struct LevelFileInfo *level_file_info, + boolean level_info_only) { - if (!LoadNativeLevel_EM(level_file_info->filename)) + if (!LoadNativeLevel_EM(level_file_info->filename, level_info_only)) level->no_valid_file = TRUE; } static void LoadLevelFromFileInfo_SP(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) + struct LevelFileInfo *level_file_info, + boolean level_info_only) { int pos = 0; @@ -6857,7 +7072,7 @@ static void LoadLevelFromFileInfo_SP(struct LevelInfo *level, if (level_file_info->packed) pos = level_file_info->nr - leveldir_current->first_level; - if (!LoadNativeLevel_SP(level_file_info->filename, pos)) + if (!LoadNativeLevel_SP(level_file_info->filename, pos, level_info_only)) level->no_valid_file = TRUE; } @@ -6896,44 +7111,49 @@ void SaveNativeLevel(struct LevelInfo *level) /* functions for loading generic level */ /* ------------------------------------------------------------------------- */ -void LoadLevelFromFileInfo(struct LevelInfo *level, - struct LevelFileInfo *level_file_info) +static void LoadLevelFromFileInfo(struct LevelInfo *level, + struct LevelFileInfo *level_file_info, + boolean level_info_only) { /* always start with reliable default values */ - setLevelInfoToDefaults(level); + setLevelInfoToDefaults(level, level_info_only); switch (level_file_info->type) { case LEVEL_FILE_TYPE_RND: - LoadLevelFromFileInfo_RND(level, level_file_info); + LoadLevelFromFileInfo_RND(level, level_file_info, level_info_only); break; case LEVEL_FILE_TYPE_EM: - LoadLevelFromFileInfo_EM(level, level_file_info); + LoadLevelFromFileInfo_EM(level, level_file_info, level_info_only); level->game_engine_type = GAME_ENGINE_TYPE_EM; break; case LEVEL_FILE_TYPE_SP: - LoadLevelFromFileInfo_SP(level, level_file_info); + LoadLevelFromFileInfo_SP(level, level_file_info, level_info_only); level->game_engine_type = GAME_ENGINE_TYPE_SP; break; case LEVEL_FILE_TYPE_DC: - LoadLevelFromFileInfo_DC(level, level_file_info); + LoadLevelFromFileInfo_DC(level, level_file_info, level_info_only); break; case LEVEL_FILE_TYPE_SB: - LoadLevelFromFileInfo_SB(level, level_file_info); + LoadLevelFromFileInfo_SB(level, level_file_info, level_info_only); break; default: - LoadLevelFromFileInfo_RND(level, level_file_info); + LoadLevelFromFileInfo_RND(level, level_file_info, level_info_only); break; } /* if level file is invalid, restore level structure to default values */ if (level->no_valid_file) - setLevelInfoToDefaults(level); + { + setLevelInfoToDefaults(level, level_info_only); + + level->no_valid_file = TRUE; /* but keep "no valid file" flag */ + } if (level->game_engine_type == GAME_ENGINE_TYPE_UNKNOWN) level->game_engine_type = GAME_ENGINE_TYPE_RND; @@ -6953,7 +7173,7 @@ void LoadLevelFromFilename(struct LevelInfo *level, char *filename) level_file_info.type = LEVEL_FILE_TYPE_RND; /* no others supported yet */ level_file_info.filename = filename; - LoadLevelFromFileInfo(level, &level_file_info); + LoadLevelFromFileInfo(level, &level_file_info, FALSE); } static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) @@ -7341,7 +7561,7 @@ void LoadLevelTemplate(int nr) setLevelFileInfo(&level_template.file_info, nr); filename = level_template.file_info.filename; - LoadLevelFromFileInfo(&level_template, &level_template.file_info); + LoadLevelFromFileInfo(&level_template, &level_template.file_info, FALSE); LoadLevel_InitVersion(&level_template, filename); LoadLevel_InitElements(&level_template, filename); @@ -7356,7 +7576,7 @@ void LoadLevel(int nr) setLevelFileInfo(&level.file_info, nr); filename = level.file_info.filename; - LoadLevelFromFileInfo(&level, &level.file_info); + LoadLevelFromFileInfo(&level, &level.file_info, FALSE); if (level.use_custom_template) LoadLevelTemplate(-1); @@ -7368,6 +7588,20 @@ void LoadLevel(int nr) LoadLevel_InitNativeEngines(&level, filename); } +void LoadLevelInfoOnly(int nr) +{ +#if 0 + char *filename; +#endif + + setLevelFileInfo(&level.file_info, nr); +#if 0 + filename = level.file_info.filename; +#endif + + LoadLevelFromFileInfo(&level, &level.file_info, TRUE); +} + static int SaveLevel_VERS(FILE *file, struct LevelInfo *level) { int chunk_size = 0; @@ -8567,7 +8801,8 @@ void LoadTapeFromFilename(char *filename) else /* check for pre-2.0 file format with cookie string */ { strcpy(cookie, chunk_name); - fgets(&cookie[4], MAX_LINE_LEN - 4, file); + if (fgets(&cookie[4], MAX_LINE_LEN - 4, file) == NULL) + cookie[4] = '\0'; if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; @@ -8910,7 +9145,8 @@ void LoadScore(int nr) return; /* check file identifier */ - fgets(cookie, MAX_LINE_LEN, file); + if (fgets(cookie, MAX_LINE_LEN, file) == NULL) + cookie[0] = '\0'; if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; @@ -8923,10 +9159,12 @@ void LoadScore(int nr) for (i = 0; i < MAX_SCORE_ENTRIES; i++) { - fscanf(file, "%d", &highscore[i].Score); - fgets(line, MAX_LINE_LEN, file); + if (fscanf(file, "%d", &highscore[i].Score) == EOF) + Error(ERR_WARN, "fscanf() failed; %s", strerror(errno)); + if (fgets(line, MAX_LINE_LEN, file) == NULL) + line[0] = '\0'; - if (line[strlen(line) - 1] == '\n') + if (strlen(line) > 0 && line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; for (line_ptr = line; *line_ptr; line_ptr++) @@ -9001,14 +9239,15 @@ void SaveScore(int nr) #define SETUP_TOKEN_PREFER_AGA_GRAPHICS 23 #define SETUP_TOKEN_GAME_FRAME_DELAY 24 #define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS 25 -#define SETUP_TOKEN_GRAPHICS_SET 26 -#define SETUP_TOKEN_SOUNDS_SET 27 -#define SETUP_TOKEN_MUSIC_SET 28 -#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 29 -#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 30 -#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 31 +#define SETUP_TOKEN_SMALL_GAME_GRAPHICS 26 +#define SETUP_TOKEN_GRAPHICS_SET 27 +#define SETUP_TOKEN_SOUNDS_SET 28 +#define SETUP_TOKEN_MUSIC_SET 29 +#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 30 +#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 31 +#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 32 -#define NUM_GLOBAL_SETUP_TOKENS 32 +#define NUM_GLOBAL_SETUP_TOKENS 33 /* editor setup */ #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 @@ -9060,19 +9299,20 @@ void SaveScore(int nr) #define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4 6 #define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL 7 #define SETUP_TOKEN_SHORTCUT_TAPE_EJECT 8 -#define SETUP_TOKEN_SHORTCUT_TAPE_STOP 9 -#define SETUP_TOKEN_SHORTCUT_TAPE_PAUSE 10 -#define SETUP_TOKEN_SHORTCUT_TAPE_RECORD 11 -#define SETUP_TOKEN_SHORTCUT_TAPE_PLAY 12 -#define SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE 13 -#define SETUP_TOKEN_SHORTCUT_SOUND_LOOPS 14 -#define SETUP_TOKEN_SHORTCUT_SOUND_MUSIC 15 -#define SETUP_TOKEN_SHORTCUT_SNAP_LEFT 16 -#define SETUP_TOKEN_SHORTCUT_SNAP_RIGHT 17 -#define SETUP_TOKEN_SHORTCUT_SNAP_UP 18 -#define SETUP_TOKEN_SHORTCUT_SNAP_DOWN 19 - -#define NUM_SHORTCUT_SETUP_TOKENS 20 +#define SETUP_TOKEN_SHORTCUT_TAPE_EXTRA 9 +#define SETUP_TOKEN_SHORTCUT_TAPE_STOP 10 +#define SETUP_TOKEN_SHORTCUT_TAPE_PAUSE 11 +#define SETUP_TOKEN_SHORTCUT_TAPE_RECORD 12 +#define SETUP_TOKEN_SHORTCUT_TAPE_PLAY 13 +#define SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE 14 +#define SETUP_TOKEN_SHORTCUT_SOUND_LOOPS 15 +#define SETUP_TOKEN_SHORTCUT_SOUND_MUSIC 16 +#define SETUP_TOKEN_SHORTCUT_SNAP_LEFT 17 +#define SETUP_TOKEN_SHORTCUT_SNAP_RIGHT 18 +#define SETUP_TOKEN_SHORTCUT_SNAP_UP 19 +#define SETUP_TOKEN_SHORTCUT_SNAP_DOWN 20 + +#define NUM_SHORTCUT_SETUP_TOKENS 21 /* player setup */ #define SETUP_TOKEN_PLAYER_USE_JOYSTICK 0 @@ -9143,6 +9383,7 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH, &si.prefer_aga_graphics, "prefer_aga_graphics" }, { TYPE_INTEGER,&si.game_frame_delay, "game_frame_delay" }, { TYPE_SWITCH, &si.sp_show_border_elements, "sp_show_border_elements" }, + { TYPE_SWITCH, &si.small_game_graphics, "small_game_graphics" }, { TYPE_STRING, &si.graphics_set, "graphics_set" }, { TYPE_STRING, &si.sounds_set, "sounds_set" }, { TYPE_STRING, &si.music_set, "music_set" }, @@ -9218,6 +9459,7 @@ static struct TokenInfo shortcut_setup_tokens[] = { TYPE_KEY_X11, &ssi.focus_player[3], "shortcut.focus_player_4" }, { TYPE_KEY_X11, &ssi.focus_player_all,"shortcut.focus_player_all" }, { TYPE_KEY_X11, &ssi.tape_eject, "shortcut.tape_eject" }, + { TYPE_KEY_X11, &ssi.tape_extra, "shortcut.tape_extra" }, { TYPE_KEY_X11, &ssi.tape_stop, "shortcut.tape_stop" }, { TYPE_KEY_X11, &ssi.tape_pause, "shortcut.tape_pause" }, { TYPE_KEY_X11, &ssi.tape_record, "shortcut.tape_record" }, @@ -9309,6 +9551,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->prefer_aga_graphics = TRUE; si->game_frame_delay = GAME_FRAME_DELAY; si->sp_show_border_elements = FALSE; + si->small_game_graphics = FALSE; si->graphics_set = getStringCopy(GFX_DEFAULT_SUBDIR); si->sounds_set = getStringCopy(SND_DEFAULT_SUBDIR); @@ -9346,6 +9589,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->shortcut.focus_player_all = DEFAULT_KEY_FOCUS_PLAYER_ALL; si->shortcut.tape_eject = DEFAULT_KEY_TAPE_EJECT; + si->shortcut.tape_extra = DEFAULT_KEY_TAPE_EXTRA; si->shortcut.tape_stop = DEFAULT_KEY_TAPE_STOP; si->shortcut.tape_pause = DEFAULT_KEY_TAPE_PAUSE; si->shortcut.tape_record = DEFAULT_KEY_TAPE_RECORD; @@ -10870,8 +11114,9 @@ void CreateLevelSketchImages() filename1 = getPath2(global.create_images_dir, basename1); filename2 = getPath2(global.create_images_dir, basename2); - getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); - BlitBitmap(src_bitmap, bitmap1, src_x, src_y, TILEX, TILEY, 0, 0); + getFixedGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + BlitBitmap(src_bitmap, bitmap1, src_x, src_y, TILEX, TILEY, + 0, 0); if (SDL_SaveBMP(bitmap1->surface, filename1) != 0) Error(ERR_EXIT, "cannot save level sketch image file '%s'", filename1); @@ -10922,7 +11167,7 @@ void CreateCustomElementImages() TILEY * (NUM_CUSTOM_ELEMENTS + NUM_GROUP_ELEMENTS) / 16, DEFAULT_DEPTH); - getGraphicSource(dummy_graphic, 0, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(dummy_graphic, 0, &src_bitmap, &src_x, &src_y); for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) { @@ -10934,18 +11179,22 @@ void CreateCustomElementImages() BlitBitmap(src_bitmap, bitmap, 0, 0, TILEX, TILEY, TILEX * x, TILEY * y + yoffset_ce); - BlitBitmap(src_bitmap, bitmap, 0, TILEY, TILEX, TILEY, - TILEX * x + TILEX * 16, TILEY * y + yoffset_ce); + BlitBitmap(src_bitmap, bitmap, 0, TILEY, + TILEX, TILEY, + TILEX * x + TILEX * 16, + TILEY * y + yoffset_ce); for (j = 2; j >= 0; j--) { int c = ii % 10; - BlitBitmap(src_bitmap, bitmap, TILEX + c * 7, 0, 6, 10, + BlitBitmap(src_bitmap, bitmap, + TILEX + c * 7, 0, 6, 10, TILEX * x + 6 + j * 7, TILEY * y + 11 + yoffset_ce); - BlitBitmap(src_bitmap, bitmap, TILEX + c * 8, TILEY, 6, 10, + BlitBitmap(src_bitmap, bitmap, + TILEX + c * 8, TILEY, 6, 10, TILEX * 16 + TILEX * x + 6 + j * 8, TILEY * y + 10 + yoffset_ce); @@ -10963,8 +11212,10 @@ void CreateCustomElementImages() BlitBitmap(src_bitmap, bitmap, 0, 0, TILEX, TILEY, TILEX * x, TILEY * y + yoffset_ge); - BlitBitmap(src_bitmap, bitmap, 0, TILEY, TILEX, TILEY, - TILEX * x + TILEX * 16, TILEY * y + yoffset_ge); + BlitBitmap(src_bitmap, bitmap, 0, TILEY, + TILEX, TILEY, + TILEX * x + TILEX * 16, + TILEY * y + yoffset_ge); for (j = 1; j >= 0; j--) { @@ -10974,7 +11225,8 @@ void CreateCustomElementImages() TILEX * x + 6 + j * 10, TILEY * y + 11 + yoffset_ge); - BlitBitmap(src_bitmap, bitmap, TILEX + c * 8, TILEY + 12, 6, 10, + BlitBitmap(src_bitmap, bitmap, + TILEX + c * 8, TILEY + 12, 6, 10, TILEX * 16 + TILEX * x + 10 + j * 8, TILEY * y + 10 + yoffset_ge); diff --git a/src/files.h b/src/files.h index 9edda322..cd8bfec4 100644 --- a/src/files.h +++ b/src/files.h @@ -36,6 +36,7 @@ char *getDefaultLevelFilename(int); void LoadLevelFromFilename(struct LevelInfo *, char *); void LoadLevel(int); void LoadLevelTemplate(int); +void LoadLevelInfoOnly(int); void SaveLevel(int); void SaveLevelTemplate(); void SaveNativeLevel(struct LevelInfo *); diff --git a/src/game.c b/src/game.c index aeb40a51..e16e5b1b 100644 --- a/src/game.c +++ b/src/game.c @@ -120,45 +120,7 @@ #define PANEL_XPOS(p) (DX + ALIGNED_TEXT_XPOS(p)) #define PANEL_YPOS(p) (DY + ALIGNED_TEXT_YPOS(p)) -/* special positions in the game control window (relative to control window) */ -#define XX_LEVEL1 (PANEL_XPOS(game.panel.level)) -#define XX_LEVEL2 (PANEL_XPOS(game.panel.level) - 1) -#define XX_LEVEL (PANEL_XPOS(game.panel.level)) -#define YY_LEVEL (PANEL_YPOS(game.panel.level)) -#define XX_EMERALDS (PANEL_XPOS(game.panel.gems)) -#define YY_EMERALDS (PANEL_YPOS(game.panel.gems)) -#define XX_DYNAMITE (PANEL_XPOS(game.panel.inventory)) -#define YY_DYNAMITE (PANEL_YPOS(game.panel.inventory)) -#define XX_KEYS (PANEL_XPOS(game.panel.keys)) -#define YY_KEYS (PANEL_YPOS(game.panel.keys)) -#define XX_SCORE (PANEL_XPOS(game.panel.score)) -#define YY_SCORE (PANEL_YPOS(game.panel.score)) -#define XX_TIME1 (PANEL_XPOS(game.panel.time)) -#define XX_TIME2 (PANEL_XPOS(game.panel.time) + 1) -#define XX_TIME (PANEL_XPOS(game.panel.time)) -#define YY_TIME (PANEL_YPOS(game.panel.time)) - -/* special positions in the game control window (relative to main window) */ -#define DX_LEVEL1 (DX + XX_LEVEL1) -#define DX_LEVEL2 (DX + XX_LEVEL2) -#define DX_LEVEL (DX + XX_LEVEL) -#define DY_LEVEL (DY + YY_LEVEL) -#define DX_EMERALDS (DX + XX_EMERALDS) -#define DY_EMERALDS (DY + YY_EMERALDS) -#define DX_DYNAMITE (DX + XX_DYNAMITE) -#define DY_DYNAMITE (DY + YY_DYNAMITE) -#define DX_KEYS (DX + XX_KEYS) -#define DY_KEYS (DY + YY_KEYS) -#define DX_SCORE (DX + XX_SCORE) -#define DY_SCORE (DY + YY_SCORE) -#define DX_TIME1 (DX + XX_TIME1) -#define DX_TIME2 (DX + XX_TIME2) -#define DX_TIME (DX + XX_TIME) -#define DY_TIME (DY + YY_TIME) - -#if 1 /* game panel display and control definitions */ - #define GAME_PANEL_LEVEL_NUMBER 0 #define GAME_PANEL_GEMS 1 #define GAME_PANEL_INVENTORY_COUNT 2 @@ -876,8 +838,6 @@ static struct GamePanelControlInfo game_panel_controls[] = -1, } }; -#endif - /* values for delayed check of falling and moving elements and for collision */ #define CHECK_DELAY_MOVING 3 @@ -2076,8 +2036,6 @@ static inline void InitField_WithBug2(int x, int y, boolean init_game) */ } -#if 1 - static int get_key_element_from_nr(int key_nr) { int key_base_element = (key_nr >= STD_NUM_KEYS ? EL_EMC_KEY_5 - STD_NUM_KEYS : @@ -2229,7 +2187,7 @@ void UpdateGameControlValues() level.native_em_level->lev->time : level.game_engine_type == GAME_ENGINE_TYPE_SP ? level.native_sp_level->game_sp->time_played : - level.time == 0 ? TimePlayed : TimeLeft); + game.no_time_limit ? TimePlayed : TimeLeft); int score = (local_player->LevelSolved ? local_player->LevelSolved_CountingScore : level.game_engine_type == GAME_ENGINE_TYPE_EM ? @@ -2539,8 +2497,15 @@ void DisplayGameControlValues() return; /* copy default game door content to main double buffer */ +#if 1 + /* !!! CHECK AGAIN !!! */ + SetPanelBackground(); + // SetDoorBackgroundImage(IMG_BACKGROUND_PANEL); + DrawBackground(DX, DY, DXSIZE, DYSIZE); +#else BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); +#endif /* redraw game control buttons */ #if 1 @@ -2781,11 +2746,7 @@ void UpdateAndDisplayGameControlValues() void DrawGameValue_Emeralds(int value) { struct TextPosInfo *pos = &game.panel.gems; -#if 1 int font_nr = pos->font; -#else - int font_nr = FONT_TEXT_2; -#endif int font_width = getFontWidth(font_nr); int chars = pos->size; @@ -2804,11 +2765,7 @@ void DrawGameValue_Emeralds(int value) void DrawGameValue_Dynamite(int value) { struct TextPosInfo *pos = &game.panel.inventory_count; -#if 1 int font_nr = pos->font; -#else - int font_nr = FONT_TEXT_2; -#endif int font_width = getFontWidth(font_nr); int chars = pos->size; @@ -2827,11 +2784,7 @@ void DrawGameValue_Dynamite(int value) void DrawGameValue_Score(int value) { struct TextPosInfo *pos = &game.panel.score; -#if 1 int font_nr = pos->font; -#else - int font_nr = FONT_TEXT_2; -#endif int font_width = getFontWidth(font_nr); int chars = pos->size; @@ -2854,13 +2807,8 @@ void DrawGameValue_Time(int value) int chars1 = 3; int chars2 = 4; int chars = pos->size; -#if 1 int font1_nr = pos->font; int font2_nr = pos->font_alt; -#else - int font1_nr = FONT_TEXT_2; - int font2_nr = FONT_TEXT_1; -#endif int font_nr = font1_nr; boolean use_dynamic_chars = (chars == -1 ? TRUE : FALSE); @@ -2904,13 +2852,8 @@ void DrawGameValue_Level(int value) int chars1 = 2; int chars2 = 3; int chars = pos->size; -#if 1 int font1_nr = pos->font; int font2_nr = pos->font_alt; -#else - int font1_nr = FONT_TEXT_2; - int font2_nr = FONT_TEXT_1; -#endif int font_nr = font1_nr; boolean use_dynamic_chars = (chars == -1 ? TRUE : FALSE); @@ -2934,63 +2877,27 @@ void DrawGameValue_Level(int value) void DrawGameValue_Keys(int key[MAX_NUM_KEYS]) { -#if 0 - struct TextPosInfo *pos = &game.panel.keys; -#endif -#if 0 - int base_key_graphic = EL_KEY_1; -#endif int i; #if 1 return; /* !!! USE NEW STUFF !!! */ #endif -#if 0 - if (PANEL_DEACTIVATED(pos)) - return; -#endif - -#if 0 - if (level.game_engine_type == GAME_ENGINE_TYPE_EM) - base_key_graphic = EL_EM_KEY_1; -#endif - -#if 0 - pos->width = 4 * MINI_TILEX; -#endif - -#if 1 for (i = 0; i < MAX_NUM_KEYS; i++) -#else - /* currently only 4 of 8 possible keys are displayed */ - for (i = 0; i < STD_NUM_KEYS; i++) -#endif { -#if 1 struct TextPosInfo *pos = &game.panel.key[i]; -#endif int src_x = DOOR_GFX_PAGEX5 + 18 + (i % 4) * MINI_TILEX; int src_y = DOOR_GFX_PAGEY1 + 123; -#if 1 int dst_x = PANEL_XPOS(pos); int dst_y = PANEL_YPOS(pos); -#else - int dst_x = PANEL_XPOS(pos) + i * MINI_TILEX; - int dst_y = PANEL_YPOS(pos); -#endif -#if 1 int element = (i >= STD_NUM_KEYS ? EL_EMC_KEY_5 - 4 : level.game_engine_type == GAME_ENGINE_TYPE_EM ? EL_EM_KEY_1 : EL_KEY_1) + i; int graphic = el2edimg(element); -#endif -#if 1 if (PANEL_DEACTIVATED(pos)) continue; -#endif #if 0 /* masked blit with tiles from half-size scaled bitmap does not work yet @@ -3002,9 +2909,6 @@ void DrawGameValue_Keys(int key[MAX_NUM_KEYS]) if (key[i]) { -#if 0 - int graphic = el2edimg(base_key_graphic + i); -#endif Bitmap *src_bitmap; int src_x, src_y; @@ -3016,127 +2920,15 @@ void DrawGameValue_Keys(int key[MAX_NUM_KEYS]) dst_x, dst_y); } #else -#if 1 if (key[i]) DrawMiniGraphicExt(drawto, dst_x, dst_y, graphic); else BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY, dst_x, dst_y); -#else - if (key[i]) - DrawMiniGraphicExt(drawto, dst_x, dst_y, el2edimg(base_key_graphic + i)); - else - BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, src_x, src_y, - MINI_TILEX, MINI_TILEY, dst_x, dst_y); -#endif -#endif - } -} - -#else - -void DrawGameValue_Emeralds(int value) -{ - int font_nr = FONT_TEXT_2; - int xpos = (3 * 14 - 3 * getFontWidth(font_nr)) / 2; - - if (PANEL_DEACTIVATED(game.panel.gems)) - return; - - DrawText(DX_EMERALDS + xpos, DY_EMERALDS, int2str(value, 3), font_nr); -} - -void DrawGameValue_Dynamite(int value) -{ - int font_nr = FONT_TEXT_2; - int xpos = (3 * 14 - 3 * getFontWidth(font_nr)) / 2; - - if (PANEL_DEACTIVATED(game.panel.inventory_count)) - return; - - DrawText(DX_DYNAMITE + xpos, DY_DYNAMITE, int2str(value, 3), font_nr); -} - -void DrawGameValue_Score(int value) -{ - int font_nr = FONT_TEXT_2; - int xpos = (5 * 14 - 5 * getFontWidth(font_nr)) / 2; - - if (PANEL_DEACTIVATED(game.panel.score)) - return; - - DrawText(DX_SCORE + xpos, DY_SCORE, int2str(value, 5), font_nr); -} - -void DrawGameValue_Time(int value) -{ - int font1_nr = FONT_TEXT_2; -#if 1 - int font2_nr = FONT_TEXT_1; -#else - int font2_nr = FONT_LEVEL_NUMBER; #endif - int xpos3 = (3 * 14 - 3 * getFontWidth(font1_nr)) / 2; - int xpos4 = (4 * 10 - 4 * getFontWidth(font2_nr)) / 2; - - if (PANEL_DEACTIVATED(game.panel.time)) - return; - - /* clear background if value just changed its size */ - if (value == 999 || value == 1000) - ClearRectangleOnBackground(drawto, DX_TIME1, DY_TIME, 14 * 3, 14); - - if (value < 1000) - DrawText(DX_TIME1 + xpos3, DY_TIME, int2str(value, 3), font1_nr); - else - DrawText(DX_TIME2 + xpos4, DY_TIME, int2str(value, 4), font2_nr); -} - -void DrawGameValue_Level(int value) -{ - int font1_nr = FONT_TEXT_2; -#if 1 - int font2_nr = FONT_TEXT_1; -#else - int font2_nr = FONT_LEVEL_NUMBER; -#endif - - if (PANEL_DEACTIVATED(game.panel.level)) - return; - - if (level_nr < 100) - DrawText(DX_LEVEL1, DY_LEVEL, int2str(value, 2), font1_nr); - else - DrawText(DX_LEVEL2, DY_LEVEL, int2str(value, 3), font2_nr); -} - -void DrawGameValue_Keys(int key[MAX_NUM_KEYS]) -{ - int base_key_graphic = EL_KEY_1; - int i; - - if (PANEL_DEACTIVATED(game.panel.keys)) - return; - - if (level.game_engine_type == GAME_ENGINE_TYPE_EM) - base_key_graphic = EL_EM_KEY_1; - - /* currently only 4 of 8 possible keys are displayed */ - for (i = 0; i < STD_NUM_KEYS; i++) - { - int x = XX_KEYS + i * MINI_TILEX; - int y = YY_KEYS; - - if (key[i]) - DrawMiniGraphicExt(drawto, DX + x,DY + y, el2edimg(base_key_graphic + i)); - else - BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, - DOOR_GFX_PAGEX5 + x, y, MINI_TILEX, MINI_TILEY, DX + x,DY + y); } } -#endif - void DrawAllGameValues(int emeralds, int dynamite, int score, int time, int key_bits) { @@ -3173,7 +2965,7 @@ void DrawGameDoorValues() void DrawGameDoorValues_OLD() { - int time_value = (level.time == 0 ? TimePlayed : TimeLeft); + int time_value = (game.no_time_limit ? TimePlayed : TimeLeft); int dynamite_value = 0; int score_value = (local_player->LevelSolved ? local_player->score_final : local_player->score); @@ -3916,6 +3708,8 @@ void InitGame() AllPlayersGone = FALSE; + game.no_time_limit = (level.time == 0); + game.yamyam_content_nr = 0; game.robot_wheel_active = FALSE; game.magic_wall_active = FALSE; @@ -4347,11 +4141,27 @@ void InitGame() SBY_Lower = lev_fieldy - SCR_FIELDY + 1; } +#if NEW_TILESIZE + + if (lev_fieldx + (SBX_Left < 0 ? 2 : 0) <= SCR_FIELDX) + SBX_Left = SBX_Right = -1 * (SCR_FIELDX - lev_fieldx) / 2; + + if (lev_fieldy + (SBY_Upper < 0 ? 2 : 0) <= SCR_FIELDY) + SBY_Upper = SBY_Lower = -1 * (SCR_FIELDY - lev_fieldy) / 2; + + if (EVEN(SCR_FIELDX)) + SBX_Left--; + if (EVEN(SCR_FIELDY)) + SBY_Upper--; + +#else + if (lev_fieldx + (SBX_Left == -1 ? 2 : 0) <= SCR_FIELDX) SBX_Left = SBX_Right = -1 * (SCR_FIELDX - lev_fieldx) / 2; if (lev_fieldy + (SBY_Upper == -1 ? 2 : 0) <= SCR_FIELDY) SBY_Upper = SBY_Lower = -1 * (SCR_FIELDY - lev_fieldy) / 2; +#endif /* if local player not found, look for custom element that might create the player (make some assumptions about the right custom element) */ @@ -4462,6 +4272,10 @@ void InitGame() local_player->jy - MIDPOSY); } +#if 0 + printf("::: %d, %d (initial)\n", scroll_x, scroll_y); +#endif + #if 0 /* do not use PLAYING mask for fading out from main screen */ game_status = GAME_MODE_MAIN; @@ -4519,9 +4333,13 @@ void InitGame() if (game.timegate_time_left == 0) CloseAllOpenTimegates(); +#if NEW_TILESIZE + BlitScreenToBitmap(backbuffer); +#else /* blit playfield from scroll buffer to normal back buffer for fading in */ if (setup.soft_scrolling) BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); +#endif redraw_mask |= REDRAW_FROM_BACKBUFFER; } @@ -4539,8 +4357,24 @@ void InitGame() if (!game.restart_level) { /* copy default game door content to main double buffer */ +#if 1 +#if 1 + /* !!! CHECK AGAIN !!! */ + SetPanelBackground(); + // SetDoorBackgroundImage(IMG_BACKGROUND_PANEL); + DrawBackground(DX, DY, DXSIZE, DYSIZE); +#else + struct GraphicInfo *gfx = &graphic_info[IMG_BACKGROUND_PANEL]; + + /* (ClearRectangle() only needed if panel bitmap is smaller than panel) */ + ClearRectangle(drawto, DX, DY, DXSIZE, DYSIZE); + BlitBitmap(gfx->bitmap, drawto, gfx->src_x, gfx->src_y, + MIN(gfx->width, DXSIZE), MIN(gfx->height, DYSIZE), DX, DY); +#endif +#else BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); +#endif } SetPanelBackground(); @@ -4591,6 +4425,17 @@ void InitGame() MapTapeButtons(); #endif + if (!game.restart_level && !tape.playing) + { + LevelStats_incPlayed(level_nr); + + SaveLevelSetup_SeriesInfo(); + +#if 0 + printf("::: PLAYING LEVEL (%d)\n", LevelStats_getPlayed(level_nr)); +#endif + } + game.restart_level = FALSE; } @@ -4809,7 +4654,8 @@ static void PlayerWins(struct PlayerInfo *player) player->score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? level.native_em_level->lev->score : player->score); - player->LevelSolved_CountingTime = (level.time == 0 ? TimePlayed : TimeLeft); + player->LevelSolved_CountingTime = (game.no_time_limit ? TimePlayed : + TimeLeft); player->LevelSolved_CountingScore = player->score_final; } @@ -4834,6 +4680,17 @@ void GameWon() local_player->LevelSolved_SaveTape = tape.recording; local_player->LevelSolved_SaveScore = !tape.playing; + if (!tape.playing) + { + LevelStats_incSolved(level_nr); + + SaveLevelSetup_SeriesInfo(); + +#if 0 + printf("::: LEVEL SOLVED (%d)\n", LevelStats_getSolved(level_nr)); +#endif + } + if (tape.auto_play) /* tape might already be stopped here */ tape.auto_play_level_solved = TRUE; @@ -4844,7 +4701,7 @@ void GameWon() game_over_delay_1 = game_over_delay_value_1; game_over_delay_2 = game_over_delay_value_2; - time = time_final = (level.time == 0 ? TimePlayed : TimeLeft); + time = time_final = (game.no_time_limit ? TimePlayed : TimeLeft); score = score_final = local_player->score_final; if (TimeLeft > 0) @@ -4852,7 +4709,7 @@ void GameWon() time_final = 0; score_final += TimeLeft * level.score[SC_TIME_BONUS]; } - else if (level.time == 0 && TimePlayed < 999) + else if (game.no_time_limit && TimePlayed < 999) { time_final = 999; score_final += (999 - TimePlayed) * level.score[SC_TIME_BONUS]; @@ -5038,6 +4895,7 @@ void GameEnd() if (level_nr == leveldir_current->handicap_level) { leveldir_current->handicap_level++; + SaveLevelSetup_SeriesInfo(); } @@ -8115,7 +7973,7 @@ void StartMoving(int x, int y) else if (Feld[x][y + 1] == EL_MAGIC_WALL_ACTIVE) { if (!MovDelay[x][y]) - MovDelay[x][y] = TILEY/4 + 1; + MovDelay[x][y] = TILEY / 4 + 1; if (MovDelay[x][y]) { @@ -8143,7 +8001,7 @@ void StartMoving(int x, int y) else if (Feld[x][y + 1] == EL_BD_MAGIC_WALL_ACTIVE) { if (!MovDelay[x][y]) - MovDelay[x][y] = TILEY/4 + 1; + MovDelay[x][y] = TILEY / 4 + 1; if (MovDelay[x][y]) { @@ -8171,7 +8029,7 @@ void StartMoving(int x, int y) else if (Feld[x][y + 1] == EL_DC_MAGIC_WALL_ACTIVE) { if (!MovDelay[x][y]) - MovDelay[x][y] = TILEY/4 + 1; + MovDelay[x][y] = TILEY / 4 + 1; if (MovDelay[x][y]) { @@ -9485,8 +9343,8 @@ void AmoebeUmwandelnBD(int ax, int ay, int new_element) void AmoebeWaechst(int x, int y) { - static unsigned long sound_delay = 0; - static unsigned long sound_delay_value = 0; + static unsigned int sound_delay = 0; + static unsigned int sound_delay_value = 0; if (!MovDelay[x][y]) /* start new growing cycle */ { @@ -9521,8 +9379,8 @@ void AmoebeWaechst(int x, int y) void AmoebaDisappearing(int x, int y) { - static unsigned long sound_delay = 0; - static unsigned long sound_delay_value = 0; + static unsigned int sound_delay = 0; + static unsigned int sound_delay_value = 0; if (!MovDelay[x][y]) /* start new shrinking cycle */ { @@ -11998,9 +11856,22 @@ static void SetPlayerWaiting(struct PlayerInfo *player, boolean is_waiting) } } +static void CheckSingleStepMode(struct PlayerInfo *player) +{ + if (tape.single_step && tape.recording && !tape.pausing) + { + /* as it is called "single step mode", just return to pause mode when the + player stopped moving after one tile (or never starts moving at all) */ + if (!player->is_moving && !player->is_pushing) + { + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + SnapField(player, 0, 0); /* stop snapping */ + } + } +} + static byte PlayerActions(struct PlayerInfo *player, byte player_action) { - boolean moved = FALSE, snapped = FALSE, dropped = FALSE; int left = player_action & JOY_LEFT; int right = player_action & JOY_RIGHT; int up = player_action & JOY_UP; @@ -12016,32 +11887,16 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action) if (player_action) { if (button1) - snapped = SnapField(player, dx, dy); + SnapField(player, dx, dy); else { if (button2) - dropped = DropElement(player); + DropElement(player); - moved = MovePlayer(player, dx, dy); + MovePlayer(player, dx, dy); } - if (tape.single_step && tape.recording && !tape.pausing) - { -#if 1 - /* as it is called "single step mode", just return to pause mode when the - player stopped moving after one tile (or never starts moving at all) */ - if (!player->is_moving) -#else - /* this is buggy: there are quite some cases where the single step mode - does not return to pause mode (like pushing things that don't move - or simply by trying to run against a wall) */ - if (button1 || (dropped && !moved)) -#endif - { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - SnapField(player, 0, 0); /* stop snapping */ - } - } + CheckSingleStepMode(player); SetPlayerWaiting(player, FALSE); @@ -12065,6 +11920,8 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action) player->is_dropping_pressed = FALSE; player->drop_pressed_delay = 0; + CheckSingleStepMode(player); + return 0; } } @@ -12137,9 +11994,13 @@ static void CheckLevelTime() PlaySound(SND_GAME_RUNNING_OUT_OF_TIME); #if 1 + /* this does not make sense: game_panel_controls[GAME_PANEL_TIME].value + is reset from other values in UpdateGameDoorValues() -- FIX THIS */ + game_panel_controls[GAME_PANEL_TIME].value = TimeLeft; - DisplayGameControlValues(); + /* (already called by UpdateAndDisplayGameControlValues() below) */ + // DisplayGameControlValues(); #else DrawGameValue_Time(TimeLeft); #endif @@ -12154,19 +12015,20 @@ static void CheckLevelTime() } } #if 1 - else if (level.time == 0 && !AllPlayersGone) /* level w/o time limit */ + else if (game.no_time_limit && !AllPlayersGone) /* level w/o time limit */ { game_panel_controls[GAME_PANEL_TIME].value = TimePlayed; - DisplayGameControlValues(); + /* (already called by UpdateAndDisplayGameControlValues() below) */ + // DisplayGameControlValues(); } #else - else if (level.time == 0 && !AllPlayersGone) /* level w/o time limit */ + else if (game.no_time_limit && !AllPlayersGone) /* level w/o time limit */ DrawGameValue_Time(TimePlayed); #endif level.native_em_level->lev->time = - (level.time == 0 ? TimePlayed : TimeLeft); + (game.no_time_limit ? TimePlayed : TimeLeft); } if (tape.recording || tape.playing) @@ -12233,9 +12095,9 @@ void AdvanceFrameAndPlayerCounters(int player_nr) } void StartGameActions(boolean init_network_game, boolean record_tape, - long random_seed) + int random_seed) { - unsigned long new_random_seed = InitRND(random_seed); + unsigned int new_random_seed = InitRND(random_seed); if (record_tape) TapeStartRecording(new_random_seed); @@ -12254,8 +12116,8 @@ void StartGameActions(boolean init_network_game, boolean record_tape, void GameActions() { - static unsigned long game_frame_delay = 0; - unsigned long game_frame_delay_value; + static unsigned int game_frame_delay = 0; + unsigned int game_frame_delay_value; byte *recorded_player_action; byte summarized_player_action = 0; byte tape_action[MAX_PLAYERS]; @@ -13023,7 +12885,7 @@ void GameActions_RND() /* new experimental amoeba growth stuff */ if (!(FrameCounter % 8)) { - static unsigned long random = 1684108901; + static unsigned int random = 1684108901; for (i = 0; i < level.amoeba_speed * 28 / 8; i++) { @@ -13207,9 +13069,9 @@ void GameActions_RND() if (options.debug) /* calculate frames per second */ { - static unsigned long fps_counter = 0; + static unsigned int fps_counter = 0; static int fps_frames = 0; - unsigned long fps_delay_ms = Counter() - fps_counter; + unsigned int fps_delay_ms = Counter() - fps_counter; fps_frames++; @@ -13345,8 +13207,29 @@ void ScrollLevel(int dx, int dy) #else +#if NEW_TILESIZE +#if NEW_SCROLL + int softscroll_offset = (setup.soft_scrolling ? 2 * TILEX_VAR : 0); +#else + int softscroll_offset = (setup.soft_scrolling ? TILEX_VAR : 0); +#endif +#else +#if NEW_SCROLL + int softscroll_offset = (setup.soft_scrolling ? 2 * TILEX : 0); +#else int softscroll_offset = (setup.soft_scrolling ? TILEX : 0); +#endif +#endif +#if NEW_TILESIZE + BlitBitmap(drawto_field, drawto_field, + FX + TILEX_VAR * (dx == -1) - softscroll_offset, + FY + TILEY_VAR * (dy == -1) - softscroll_offset, + SXSIZE - TILEX_VAR * (dx != 0) + 2 * softscroll_offset, + SYSIZE - TILEY_VAR * (dy != 0) + 2 * softscroll_offset, + FX + TILEX_VAR * (dx == 1) - softscroll_offset, + FY + TILEY_VAR * (dy == 1) - softscroll_offset); +#else BlitBitmap(drawto_field, drawto_field, FX + TILEX * (dx == -1) - softscroll_offset, FY + TILEY * (dy == -1) - softscroll_offset, @@ -13355,6 +13238,8 @@ void ScrollLevel(int dx, int dy) FX + TILEX * (dx == 1) - softscroll_offset, FY + TILEY * (dy == 1) - softscroll_offset); #endif + +#endif #endif if (dx != 0) @@ -13617,7 +13502,7 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) int original_move_delay_value = player->move_delay_value; #if DEBUG - printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.2 LEVEL TAPES. [%ld]\n", + printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.2 LEVEL TAPES. [%d]\n", tape.counter); #endif @@ -13999,14 +13884,14 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) KillPlayer(&stored_player[i]); } #if 1 - else if (level.time == 0 && !AllPlayersGone) /* level w/o time limit */ + else if (game.no_time_limit && !AllPlayersGone) /* level w/o time limit */ { game_panel_controls[GAME_PANEL_TIME].value = TimePlayed; DisplayGameControlValues(); } #else - else if (level.time == 0 && !AllPlayersGone) /* level w/o time limit */ + else if (game.no_time_limit && !AllPlayersGone) /* level w/o time limit */ DrawGameValue_Time(TimePlayed); #endif } @@ -14019,7 +13904,7 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) void ScrollScreen(struct PlayerInfo *player, int mode) { - static unsigned long screen_frame_counter = 0; + static unsigned int screen_frame_counter = 0; if (mode == SCROLL_INIT) { @@ -15562,6 +15447,7 @@ static int DigField(struct PlayerInfo *player, if (level.time > 0 || level.use_time_orb_bug) { TimeLeft += level.time_orb_time; + game.no_time_limit = FALSE; #if 1 game_panel_controls[GAME_PANEL_TIME].value = TimeLeft; @@ -15916,14 +15802,19 @@ static boolean DropElement(struct PlayerInfo *player) if (IS_CUSTOM_ELEMENT(new_element) && CAN_MOVE(new_element) && element_info[new_element].move_pattern == MV_WHEN_DROPPED) { - int move_direction, nextx, nexty; +#if 0 + int move_direction; + int nextx, nexty; +#endif if (element_info[new_element].move_direction_initial == MV_START_AUTOMATIC) MovDir[dropx][dropy] = drop_direction; +#if 0 move_direction = MovDir[dropx][dropy]; nextx = dropx + GET_DX_FROM_DIR(move_direction); nexty = dropy + GET_DY_FROM_DIR(move_direction); +#endif ChangeCount[dropx][dropy] = 0; /* allow at least one more change */ @@ -16240,31 +16131,6 @@ void PlayLevelSound_SP(int xx, int yy, int element_sp, int action_sp) PlayLevelSoundElementAction(x, y, element, action); } -#if 0 -void ChangeTime(int value) -{ - int *time = (level.time == 0 ? &TimePlayed : &TimeLeft); - - *time += value; - - /* EMC game engine uses value from time counter of RND game engine */ - level.native_em_level->lev->time = *time; - - DrawGameValue_Time(*time); -} - -void RaiseScore(int value) -{ - /* EMC game engine and RND game engine have separate score counters */ - int *score = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? - &level.native_em_level->lev->score : &local_player->score); - - *score += value; - - DrawGameValue_Score(*score); -} -#endif - void RaiseScore(int value) { local_player->score += value; @@ -16428,7 +16294,7 @@ void RequestQuitGame(boolean ask_if_really_quit) /* random generator functions */ /* ------------------------------------------------------------------------- */ -unsigned int InitEngineRandom_RND(long seed) +unsigned int InitEngineRandom_RND(int seed) { game.num_random_calls = 0; @@ -16521,7 +16387,7 @@ static void SaveEngineSnapshotValues_RND() static void LoadEngineSnapshotValues_RND() { - unsigned long num_random_calls = game.num_random_calls; + unsigned int num_random_calls = game.num_random_calls; int i, j; for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) @@ -16694,98 +16560,38 @@ boolean CheckEngineSnapshot() /* ---------- new game button stuff ---------------------------------------- */ -/* graphic position values for game buttons */ -#define GAME_BUTTON_XSIZE 30 -#define GAME_BUTTON_YSIZE 30 -#define GAME_BUTTON_XPOS 5 -#define GAME_BUTTON_YPOS 215 -#define SOUND_BUTTON_XPOS 5 -#define SOUND_BUTTON_YPOS (GAME_BUTTON_YPOS + GAME_BUTTON_YSIZE) - -#define GAME_BUTTON_STOP_XPOS (GAME_BUTTON_XPOS + 0 * GAME_BUTTON_XSIZE) -#define GAME_BUTTON_PAUSE_XPOS (GAME_BUTTON_XPOS + 1 * GAME_BUTTON_XSIZE) -#define GAME_BUTTON_PLAY_XPOS (GAME_BUTTON_XPOS + 2 * GAME_BUTTON_XSIZE) -#define SOUND_BUTTON_MUSIC_XPOS (SOUND_BUTTON_XPOS + 0 * GAME_BUTTON_XSIZE) -#define SOUND_BUTTON_LOOPS_XPOS (SOUND_BUTTON_XPOS + 1 * GAME_BUTTON_XSIZE) -#define SOUND_BUTTON_SIMPLE_XPOS (SOUND_BUTTON_XPOS + 2 * GAME_BUTTON_XSIZE) - static struct { - int *x, *y; - int gd_x, gd_y; + int graphic; + struct Rect *pos; int gadget_id; char *infotext; } gamebutton_info[NUM_GAME_BUTTONS] = { -#if 1 { - &game.button.stop.x, &game.button.stop.y, - GAME_BUTTON_STOP_XPOS, GAME_BUTTON_YPOS, - GAME_CTRL_ID_STOP, - "stop game" + IMG_GAME_BUTTON_GFX_STOP, &game.button.stop, + GAME_CTRL_ID_STOP, "stop game" }, { - &game.button.pause.x, &game.button.pause.y, - GAME_BUTTON_PAUSE_XPOS, GAME_BUTTON_YPOS, - GAME_CTRL_ID_PAUSE, - "pause game" + IMG_GAME_BUTTON_GFX_PAUSE, &game.button.pause, + GAME_CTRL_ID_PAUSE, "pause game" }, { - &game.button.play.x, &game.button.play.y, - GAME_BUTTON_PLAY_XPOS, GAME_BUTTON_YPOS, - GAME_CTRL_ID_PLAY, - "play game" + IMG_GAME_BUTTON_GFX_PLAY, &game.button.play, + GAME_CTRL_ID_PLAY, "play game" }, { - &game.button.sound_music.x, &game.button.sound_music.y, - SOUND_BUTTON_MUSIC_XPOS, SOUND_BUTTON_YPOS, - SOUND_CTRL_ID_MUSIC, - "background music on/off" + IMG_GAME_BUTTON_GFX_SOUND_MUSIC, &game.button.sound_music, + SOUND_CTRL_ID_MUSIC, "background music on/off" }, { - &game.button.sound_loops.x, &game.button.sound_loops.y, - SOUND_BUTTON_LOOPS_XPOS, SOUND_BUTTON_YPOS, - SOUND_CTRL_ID_LOOPS, - "sound loops on/off" + IMG_GAME_BUTTON_GFX_SOUND_LOOPS, &game.button.sound_loops, + SOUND_CTRL_ID_LOOPS, "sound loops on/off" }, { - &game.button.sound_simple.x,&game.button.sound_simple.y, - SOUND_BUTTON_SIMPLE_XPOS, SOUND_BUTTON_YPOS, - SOUND_CTRL_ID_SIMPLE, - "normal sounds on/off" + IMG_GAME_BUTTON_GFX_SOUND_SIMPLE, &game.button.sound_simple, + SOUND_CTRL_ID_SIMPLE, "normal sounds on/off" } -#else - { - GAME_BUTTON_STOP_XPOS, GAME_BUTTON_YPOS, - GAME_CTRL_ID_STOP, - "stop game" - }, - { - GAME_BUTTON_PAUSE_XPOS, GAME_BUTTON_YPOS, - GAME_CTRL_ID_PAUSE, - "pause game" - }, - { - GAME_BUTTON_PLAY_XPOS, GAME_BUTTON_YPOS, - GAME_CTRL_ID_PLAY, - "play game" - }, - { - SOUND_BUTTON_MUSIC_XPOS, SOUND_BUTTON_YPOS, - SOUND_CTRL_ID_MUSIC, - "background music on/off" - }, - { - SOUND_BUTTON_LOOPS_XPOS, SOUND_BUTTON_YPOS, - SOUND_CTRL_ID_LOOPS, - "sound loops on/off" - }, - { - SOUND_BUTTON_SIMPLE_XPOS, SOUND_BUTTON_YPOS, - SOUND_CTRL_ID_SIMPLE, - "normal sounds on/off" - } -#endif }; void CreateGameButtons() @@ -16794,23 +16600,22 @@ void CreateGameButtons() for (i = 0; i < NUM_GAME_BUTTONS; i++) { - Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; + struct GraphicInfo *gfx = &graphic_info[gamebutton_info[i].graphic]; + struct Rect *pos = gamebutton_info[i].pos; struct GadgetInfo *gi; int button_type; boolean checked; - unsigned long event_mask; - int x, y; - int gd_xoffset, gd_yoffset; - int gd_x1, gd_x2, gd_y1, gd_y2; + unsigned int event_mask; + int gd_x = gfx->src_x; + int gd_y = gfx->src_y; + int gd_xp = gfx->src_x + gfx->pressed_xoffset; + int gd_yp = gfx->src_y + gfx->pressed_yoffset; + int gd_xa = gfx->src_x + gfx->active_xoffset; + int gd_ya = gfx->src_y + gfx->active_yoffset; + int gd_xap = gfx->src_x + gfx->active_xoffset + gfx->pressed_xoffset; + int gd_yap = gfx->src_y + gfx->active_yoffset + gfx->pressed_yoffset; int id = i; - x = DX + *gamebutton_info[i].x; - y = DY + *gamebutton_info[i].y; - gd_xoffset = gamebutton_info[i].gd_x; - gd_yoffset = gamebutton_info[i].gd_y; - gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset; - gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset; - if (id == GAME_CTRL_ID_STOP || id == GAME_CTRL_ID_PAUSE || id == GAME_CTRL_ID_PLAY) @@ -16818,8 +16623,6 @@ void CreateGameButtons() button_type = GD_TYPE_NORMAL_BUTTON; checked = FALSE; event_mask = GD_EVENT_RELEASED; - gd_y1 = DOOR_GFX_PAGEY1 + gd_yoffset - GAME_BUTTON_YSIZE; - gd_y2 = DOOR_GFX_PAGEY1 + gd_yoffset - GAME_BUTTON_YSIZE; } else { @@ -16829,28 +16632,21 @@ void CreateGameButtons() (id == SOUND_CTRL_ID_LOOPS && setup.sound_loops) || (id == SOUND_CTRL_ID_SIMPLE && setup.sound_simple) ? TRUE : FALSE); event_mask = GD_EVENT_PRESSED; - gd_y1 = DOOR_GFX_PAGEY1 + gd_yoffset; - gd_y2 = DOOR_GFX_PAGEY1 + gd_yoffset - GAME_BUTTON_YSIZE; } gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_INFO_TEXT, gamebutton_info[i].infotext, -#if 1 - GDI_X, x, - GDI_Y, y, -#else - GDI_X, DX + gd_xoffset, - GDI_Y, DY + gd_yoffset, -#endif - GDI_WIDTH, GAME_BUTTON_XSIZE, - GDI_HEIGHT, GAME_BUTTON_YSIZE, + GDI_X, DX + pos->x, + GDI_Y, DY + pos->y, + GDI_WIDTH, gfx->width, + GDI_HEIGHT, gfx->height, GDI_TYPE, button_type, GDI_STATE, GD_BUTTON_UNPRESSED, GDI_CHECKED, checked, - GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1, - GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y1, - GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y2, - GDI_ALT_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2, + GDI_DESIGN_UNPRESSED, gfx->bitmap, gd_x, gd_y, + GDI_DESIGN_PRESSED, gfx->bitmap, gd_xp, gd_yp, + GDI_ALT_DESIGN_UNPRESSED, gfx->bitmap, gd_xa, gd_ya, + GDI_ALT_DESIGN_PRESSED, gfx->bitmap, gd_xap, gd_yap, GDI_DIRECT_DRAW, FALSE, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleGameButtons, diff --git a/src/game.h b/src/game.h index c764e1d3..50490be3 100644 --- a/src/game.h +++ b/src/game.h @@ -89,12 +89,12 @@ struct GamePanelInfo struct GameButtonInfo { - struct MenuPosInfo stop; - struct MenuPosInfo pause; - struct MenuPosInfo play; - struct MenuPosInfo sound_music; - struct MenuPosInfo sound_loops; - struct MenuPosInfo sound_simple; + struct Rect stop; + struct Rect pause; + struct Rect play; + struct Rect sound_music; + struct Rect sound_loops; + struct Rect sound_simple; }; #else @@ -122,6 +122,7 @@ struct GameInfo boolean use_masked_pushing; int forced_scroll_delay_value; int scroll_delay_value; + int tile_size; /* values for engine initialization */ int default_push_delay_fixed; @@ -155,6 +156,7 @@ struct GameInfo boolean gravity; boolean explosions_delayed; boolean envelope_active; + boolean no_time_limit; /* (variable only in very special case) */ /* values for the new EMC elements */ int lenses_time_left; @@ -177,7 +179,7 @@ struct GameInfo boolean set_centered_player; /* values for random number generator initialization after snapshot */ - unsigned long num_random_calls; + unsigned int num_random_calls; }; struct PlayerInfo @@ -277,7 +279,7 @@ struct PlayerInfo int push_delay; int push_delay_value; - unsigned long actual_frame_counter; + unsigned int actual_frame_counter; int drop_delay; int drop_pressed_delay; @@ -330,7 +332,7 @@ void Moving2Blocked(int, int, int *, int *); void Blocked2Moving(int, int, int *, int *); void DrawDynamite(int, int); -void StartGameActions(boolean, boolean, long); +void StartGameActions(boolean, boolean, int); void GameActions(void); void GameActions_EM_Main(); @@ -349,7 +351,7 @@ void RaiseScoreElement(int); void RequestQuitGameExt(boolean, boolean, char *); void RequestQuitGame(boolean); -unsigned int InitEngineRandom_RND(long); +unsigned int InitEngineRandom_RND(int); unsigned int RND(int); void FreeEngineSnapshot(); diff --git a/src/game_em/cave.c b/src/game_em/cave.c index 5fb55dc5..b816aff2 100644 --- a/src/game_em/cave.c +++ b/src/game_em/cave.c @@ -74,7 +74,7 @@ void setLevelInfoToDefaults_EM(void) #define MAX_EM_LEVEL_SIZE 16384 -boolean LoadNativeLevel_EM(char *filename) +boolean LoadNativeLevel_EM(char *filename, boolean level_info_only) { unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE]; int raw_leveldata_length; @@ -86,7 +86,8 @@ boolean LoadNativeLevel_EM(char *filename) if (!(file = fopen(filename, MODE_READ))) { - Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename); return FALSE; } diff --git a/src/game_em/export.h b/src/game_em/export.h index 05e7ae65..7efbfc3b 100644 --- a/src/game_em/export.h +++ b/src/game_em/export.h @@ -700,7 +700,7 @@ struct GraphicInfo_EM struct EngineSnapshotInfo_EM { struct GameInfo_EM game_em; - unsigned long RandomEM; + unsigned int RandomEM; struct LEVEL lev; struct PLAYER ply[MAX_PLAYERS]; short Array[4][EM_MAX_CAVE_HEIGHT][EM_MAX_CAVE_WIDTH]; @@ -727,13 +727,15 @@ extern struct EngineSnapshotInfo_EM engine_snapshot_em; extern void em_open_all(); extern void em_close_all(); +extern void InitGfxBuffers_EM(); + extern void InitGameEngine_EM(); extern void GameActions_EM(byte *, boolean); -extern unsigned int InitEngineRandom_EM(long); +extern unsigned int InitEngineRandom_EM(int); extern void setLevelInfoToDefaults_EM(); -extern boolean LoadNativeLevel_EM(char *); +extern boolean LoadNativeLevel_EM(char *, boolean); extern void BackToFront_EM(void); extern void BlitScreenToBitmap_EM(Bitmap *); diff --git a/src/game_em/global.h b/src/game_em/global.h index 8cd8624a..2da0ec8e 100644 --- a/src/game_em/global.h +++ b/src/game_em/global.h @@ -14,6 +14,10 @@ extern int debug; extern char *progname; extern char *arg_basedir; +#if 0 +extern int TILEX, TILEY; +#endif + extern int frame; extern short ulaw_to_linear[256]; @@ -41,7 +45,6 @@ void play_sound(int, int, int); void sound_play(void); int cave_convert(char *); -boolean LoadNativeLevel_EM(char *); void game_init_vars(void); void game_play_init(int, char *); @@ -56,7 +59,7 @@ void convert_em_level(unsigned char *, int); void prepare_em_level(void); int sound_thread(void); -int read_sample(char *, short **, long *); +int read_sample(char *, short **, int *); void read_cave_list(void); void free_cave_list(void); diff --git a/src/game_em/graphics.c b/src/game_em/graphics.c index 5764e9e3..d7f7025a 100644 --- a/src/game_em/graphics.c +++ b/src/game_em/graphics.c @@ -29,6 +29,12 @@ #define USE_EXTENDED_GRAPHICS_ENGINE 1 + +#if 0 +int TILEX = ORIG_TILEX * ZOOM_FACTOR; +int TILEY = ORIG_TILEY * ZOOM_FACTOR; +#endif + int frame; /* current screen frame */ int screen_x, screen_y; /* current scroll position */ @@ -59,7 +65,63 @@ void BlitScreenToBitmap_EM(Bitmap *target_bitmap) { int x = screen_x % (MAX_BUF_XSIZE * TILEX); int y = screen_y % (MAX_BUF_YSIZE * TILEY); + int sx, sy, sxsize, sysize; + int xsize = SXSIZE; + int ysize = SYSIZE; + int full_xsize = lev.width * TILEX; + int full_ysize = lev.height * TILEY; + + sxsize = (full_xsize < xsize ? full_xsize : xsize); + sysize = (full_ysize < ysize ? full_ysize : ysize); + sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0); + sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0); + +#if 0 + printf("::: %d, %d\n", screenBitmap->width, screenBitmap->height); + BlitBitmap(screenBitmap, target_bitmap, 0, 0, 544, 544, SX, SY); + return; +#endif +#if 1 + if (x < 2 * TILEX && y < 2 * TILEY) + { + BlitBitmap(screenBitmap, target_bitmap, x, y, + sxsize, sysize, sx, sy); + } + else if (x < 2 * TILEX && y >= 2 * TILEY) + { + BlitBitmap(screenBitmap, target_bitmap, x, y, + sxsize, MAX_BUF_YSIZE * TILEY - y, + sx, sy); + BlitBitmap(screenBitmap, target_bitmap, x, 0, + sxsize, y - 2 * TILEY, + sx, sy + MAX_BUF_YSIZE * TILEY - y); + } + else if (x >= 2 * TILEX && y < 2 * TILEY) + { + BlitBitmap(screenBitmap, target_bitmap, x, y, + MAX_BUF_XSIZE * TILEX - x, sysize, + sx, sy); + BlitBitmap(screenBitmap, target_bitmap, 0, y, + x - 2 * TILEX, sysize, + sx + MAX_BUF_XSIZE * TILEX - x, sy); + } + else + { + BlitBitmap(screenBitmap, target_bitmap, x, y, + MAX_BUF_XSIZE * TILEX - x, MAX_BUF_YSIZE * TILEY - y, + sx, sy); + BlitBitmap(screenBitmap, target_bitmap, 0, y, + x - 2 * TILEX, MAX_BUF_YSIZE * TILEY - y, + sx + MAX_BUF_XSIZE * TILEX - x, sy); + BlitBitmap(screenBitmap, target_bitmap, x, 0, + MAX_BUF_XSIZE * TILEX - x, y - 2 * TILEY, + sx, sy + MAX_BUF_YSIZE * TILEY - y); + BlitBitmap(screenBitmap, target_bitmap, 0, 0, + x - 2 * TILEX, y - 2 * TILEY, + sx + MAX_BUF_XSIZE * TILEX - x, sy + MAX_BUF_YSIZE * TILEY - y); + } +#else if (x < 2 * TILEX && y < 2 * TILEY) { BlitBitmap(screenBitmap, target_bitmap, x, y, @@ -98,6 +160,7 @@ void BlitScreenToBitmap_EM(Bitmap *target_bitmap) x - 2 * TILEX, y - 2 * TILEY, SX + MAX_BUF_XSIZE * TILEX - x, SY + MAX_BUF_YSIZE * TILEY - y); } +#endif } void BackToFront_EM(void) @@ -138,6 +201,22 @@ void BackToFront_EM(void) boolean half_shifted_y = (EVEN(SCR_FIELDY) && screen_y % TILEY != 0); #endif + int sx, sy; +#if 0 + int sxsize, sysize; +#endif + int xsize = SXSIZE; + int ysize = SYSIZE; + int full_xsize = lev.width * TILEX; + int full_ysize = lev.height * TILEY; + +#if 0 + sxsize = (full_xsize < xsize ? full_xsize : xsize); + sysize = (full_ysize < ysize ? full_ysize : ysize); +#endif + sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0); + sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0); + #if 0 #if 1 printf("::: %d, %d\n", EVEN(SCR_FIELDX), screen_x); @@ -164,8 +243,8 @@ void BackToFront_EM(void) if (redraw[xx][yy]) BlitBitmap(screenBitmap, window, xx * TILEX, yy * TILEY, TILEX, TILEY, - SX + x * TILEX - scroll_xoffset, - SY + y * TILEY - scroll_yoffset); + sx + x * TILEX - scroll_xoffset, + sy + y * TILEY - scroll_yoffset); } } @@ -231,12 +310,21 @@ static void DrawLevelField_EM(int x, int y, int sx, int sy, boolean draw_masked) { struct GraphicInfo_EM *g = getObjectGraphic(x, y); +#if NEW_TILESIZE + int src_x = g->src_x + g->src_offset_x * TILESIZE_VAR / TILESIZE; + int src_y = g->src_y + g->src_offset_y * TILESIZE_VAR / TILESIZE; + int dst_x = sx * TILEX + g->dst_offset_x * TILESIZE_VAR / TILESIZE; + int dst_y = sy * TILEY + g->dst_offset_y * TILESIZE_VAR / TILESIZE; + int width = g->width * TILESIZE_VAR / TILESIZE; + int height = g->height * TILESIZE_VAR / TILESIZE; +#else int src_x = g->src_x + g->src_offset_x; int src_y = g->src_y + g->src_offset_y; int dst_x = sx * TILEX + g->dst_offset_x; int dst_y = sy * TILEY + g->dst_offset_y; int width = g->width; int height = g->height; +#endif int left = screen_x / TILEX; int top = screen_y / TILEY; @@ -274,6 +362,7 @@ static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy, #else struct GraphicInfo_EM *g = getObjectGraphic(x, y); #endif + int crumbled_border_size; int left = screen_x / TILEX; int top = screen_y / TILEY; int i; @@ -290,6 +379,12 @@ static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy, g = getObjectGraphic(x, y); #endif + crumbled_border_size = g->crumbled_border_size; + +#if NEW_TILESIZE + crumbled_border_size = crumbled_border_size * TILESIZE_VAR / TILESIZE; +#endif + #if 0 if (x == 3 && y == 3 && frame == 0) printf("::: %d, %d\n", @@ -305,17 +400,17 @@ static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy, if (i == 1 || i == 2) { - width = g->crumbled_border_size; + width = crumbled_border_size; height = TILEY; - cx = (i == 2 ? TILEX - g->crumbled_border_size : 0); + cx = (i == 2 ? TILEX - crumbled_border_size : 0); cy = 0; } else { width = TILEX; - height = g->crumbled_border_size; + height = crumbled_border_size; cx = 0; - cy = (i == 3 ? TILEY - g->crumbled_border_size : 0); + cy = (i == 3 ? TILEY - crumbled_border_size : 0); } if (width > 0 && height > 0) @@ -918,9 +1013,9 @@ void RedrawPlayfield_EM(boolean force_redraw) if (draw_new_player_location && !quick_relocation) { #if 1 - unsigned long game_frame_delay_value = getGameFrameDelay_EM(20); + unsigned int game_frame_delay_value = getGameFrameDelay_EM(20); #else - unsigned long game_frame_delay_value = getGameFrameDelay_EM(25); + unsigned int game_frame_delay_value = getGameFrameDelay_EM(25); #endif int wait_delay_value = game_frame_delay_value; int screen_xx = VALID_SCREEN_X(sx); diff --git a/src/game_em/init.c b/src/game_em/init.c index 6e7fe948..2033b2db 100644 --- a/src/game_em/init.c +++ b/src/game_em/init.c @@ -46,7 +46,7 @@ struct GameInfo_EM game_em; static int sound_pid = -1; int sound_pipe[2] = { -1, -1 }; /* for communication */ short *sound_data[SAMPLE_MAX]; /* pointer to sound data */ -long sound_length[SAMPLE_MAX]; /* length of sound data */ +int sound_length[SAMPLE_MAX]; /* length of sound data */ static const char *sound_names[SAMPLE_MAX] = { @@ -154,10 +154,15 @@ int open_all(void) sprmaskBitmap = emc_bitmaps[1]->clip_mask; #endif +#if 0 + printf("::: CreateBitmap: %d, %d => %d\n", + MAX_BUF_XSIZE, TILEX, MAX_BUF_XSIZE * TILEX); + screenBitmap = CreateBitmap(MAX_BUF_XSIZE * TILEX, MAX_BUF_YSIZE * TILEY, DEFAULT_DEPTH); global_em_info.screenbuffer = screenBitmap; +#endif #endif @@ -245,6 +250,33 @@ int open_all(void) return(0); } +void InitGfxBuffers_EM() +{ + +#if 1 + +#if 0 + printf("::: InitGfxBuffers_EM: %d, %d => %d\n", + MAX_BUF_XSIZE, TILEX, MAX_BUF_XSIZE * TILEX); +#endif + + ReCreateBitmap(&screenBitmap, MAX_BUF_XSIZE * TILEX, MAX_BUF_YSIZE * TILEY, + DEFAULT_DEPTH); + + global_em_info.screenbuffer = screenBitmap; + +#else + + printf("::: CreateBitmap: %d, %d => %d\n", + MAX_BUF_XSIZE, TILEX, MAX_BUF_XSIZE * TILEX); + + screenBitmap = CreateBitmap(MAX_BUF_XSIZE * TILEX, MAX_BUF_YSIZE * TILEY, + DEFAULT_DEPTH); + + global_em_info.screenbuffer = screenBitmap; +#endif +} + void em_open_all() { /* pre-calculate some data */ @@ -369,7 +401,7 @@ void sound_play(void) clear_mem(play, sizeof(play)); } -unsigned int InitEngineRandom_EM(long seed) +unsigned int InitEngineRandom_EM(int seed) { if (seed == NEW_RANDOMIZE) { diff --git a/src/game_em/input.c b/src/game_em/input.c index 7447f4b1..76932c54 100644 --- a/src/game_em/input.c +++ b/src/game_em/input.c @@ -6,7 +6,7 @@ #include "main_em.h" -unsigned long RandomEM; +unsigned int RandomEM; struct LEVEL lev; struct PLAYER ply[MAX_PLAYERS]; @@ -74,6 +74,7 @@ void InitGameEngine_EM() void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode) { int i; + boolean player_is_dropping = FALSE; #if 0 static int foo = -1; @@ -127,7 +128,15 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode) DrawGameDoorValues_EM(); } - CheckSingleStepMode_EM(action, frame, game_em.any_player_moving); + for (i = 0; i < MAX_PLAYERS; i++) + if (ply[i].joy_drop && + ply[i].dynamite && + ply[i].dynamite_cnt > 0 && + ply[i].dynamite_cnt < 5) + player_is_dropping = TRUE; + + CheckSingleStepMode_EM(action, frame, game_em.any_player_moving, + player_is_dropping); #if 1 game_animscreen(); diff --git a/src/game_em/main_em.h b/src/game_em/main_em.h index c5efc415..91b01844 100644 --- a/src/game_em/main_em.h +++ b/src/game_em/main_em.h @@ -45,6 +45,10 @@ /* screen sizes and positions for EM engine */ +#define NEW_TILESIZE 1 + +#define ORIG_TILESIZE 16 + #define ORIG_TILEX 16 #define ORIG_TILEY 16 #define ORIG_SCOREX 8 @@ -54,10 +58,22 @@ #define ORIG_MENUFONTX 12 #define ORIG_MENUFONTY 16 +#if NEW_TILESIZE +#define ZOOM_FACTOR (2 * TILESIZE_VAR / TILESIZE) +#else #define ZOOM_FACTOR 2 +#endif +#define TILESIZE 32 + +#if NEW_TILESIZE +extern int TILESIZE_VAR; +#define TILEX TILESIZE_VAR +#define TILEY TILESIZE_VAR +#else #define TILEX (ORIG_TILEX * ZOOM_FACTOR) #define TILEY (ORIG_TILEY * ZOOM_FACTOR) +#endif #define SCOREX (ORIG_SCOREX * ZOOM_FACTOR) #define SCOREY (ORIG_SCOREY * ZOOM_FACTOR) #define GFXMENUFONTX (ORIG_GFXMENUFONTX * ZOOM_FACTOR) @@ -117,7 +133,7 @@ extern int SX, SY; /* exported variables */ /* ------------------------------------------------------------------------- */ -extern unsigned long RandomEM; +extern unsigned int RandomEM; extern struct LEVEL lev; extern struct PLAYER ply[MAX_PLAYERS]; diff --git a/src/game_em/sample.h b/src/game_em/sample.h index 853b27d3..efbd7745 100644 --- a/src/game_em/sample.h +++ b/src/game_em/sample.h @@ -10,7 +10,7 @@ extern void play_element_sound(int, int, int, int); extern char play[SAMPLE_MAX]; extern int sound_pipe[2]; extern short *sound_data[SAMPLE_MAX]; -extern long sound_length[SAMPLE_MAX]; +extern int sound_length[SAMPLE_MAX]; #define MIXER_MAX 4 /* maximum number of samples we can play at once */ diff --git a/src/game_em/sound.c b/src/game_em/sound.c index c1334cc7..f03abf1e 100644 --- a/src/game_em/sound.c +++ b/src/game_em/sound.c @@ -65,13 +65,13 @@ int sound_thread(void) { int audio_fd; /* file descriptor of /dev/audio or -1 if not open */ int audio_format; - int sample_rate; + // int sample_rate; int fragment_size; unsigned char *audio_buffer; /* actual buffer pumped to /dev/audio */ short *mix_buffer; char sound_play[SAMPLE_MAX]; /* if set, we should be playing these sounds */ - long sound_pos[SAMPLE_MAX]; /* position in the sound */ + int sound_pos[SAMPLE_MAX]; /* position in the sound */ int mix_play[MIXER_MAX]; /* which sounds we have chosen to mix (calculated each time) */ int mix_count; int i; @@ -80,7 +80,7 @@ int sound_thread(void) audio_fd = -1; audio_format = AUDIO_ULAW; /* defaults for non-OSS /dev/audio */ - sample_rate = 8000; + // sample_rate = 8000; fragment_size = 256; audio_buffer = 0; mix_buffer = 0; @@ -242,7 +242,7 @@ int sound_thread(void) goto reset; } - sample_rate = i; + // sample_rate = i; if (ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &i) == -1) { Error(ERR_WARN, "unable to get block size in sound thread"); @@ -301,7 +301,7 @@ int sound_thread(void) register short *mix_ptr = mix_buffer; register short *sound_ptr = sound_data[mix_play[i]] + sound_pos[mix_play[i]]; - register long count = + register int count = sound_length[mix_play[i]] - sound_pos[mix_play[i]]; if (count > fragment_size) @@ -380,16 +380,16 @@ int sound_thread(void) return(0); } -int read_sample(char *name, short **data, long *length) +int read_sample(char *name, short **data, int *length) { int result; FILE *file = 0; short *dataptr = 0; - long datalength; + int datalength; int i, actual, ch; unsigned char buffer[24]; - unsigned long temp; + unsigned int temp; file = fopen(name, "rb"); if (file == 0) @@ -454,7 +454,7 @@ int read_sample(char *name, short **data, long *length) temp = buffer[12] << 24 | buffer[13] << 16 | buffer[14] << 8 | buffer[15]; if (temp != 1) { - fprintf(stderr, "%s: \"%s\": %s (%ld != 1)\n", progname, name, + fprintf(stderr, "%s: \"%s\": %s (%d != 1)\n", progname, name, "bad encoding type", temp); result = 1; goto fail; @@ -464,7 +464,7 @@ int read_sample(char *name, short **data, long *length) temp = buffer[16] << 24 | buffer[17] << 16 | buffer[18] << 8 | buffer[19]; if (temp != 8000) { - fprintf(stderr, "%s: \"%s\": %s (%ld != 8000)\n", progname, name, + fprintf(stderr, "%s: \"%s\": %s (%d != 8000)\n", progname, name, "bad sample rate", temp); result = 1; goto fail; @@ -474,7 +474,7 @@ int read_sample(char *name, short **data, long *length) temp = buffer[20] << 24 | buffer[21] << 16 | buffer[22] << 8 | buffer[23]; if (temp != 1) { - fprintf(stderr, "%s: \"%s\": %s (%ld != 1)\n", progname, name, + fprintf(stderr, "%s: \"%s\": %s (%d != 1)\n", progname, name, "unsupported channels", temp); result = 1; goto fail; diff --git a/src/game_em/synchro_1.c b/src/game_em/synchro_1.c index 3a469fdf..ef4d0f2c 100644 --- a/src/game_em/synchro_1.c +++ b/src/game_em/synchro_1.c @@ -469,7 +469,6 @@ static void check_player(struct PLAYER *ply) int oldy = ply->y; int x = oldx; int y = oldy; - int anim = 0; int dx = 0, dy = 0; game_em.last_player_direction[ply->num] = MV_NONE; @@ -485,26 +484,22 @@ static void check_player(struct PLAYER *ply) { x--; dx = -1; - anim = 3; } else if (ply->joy_e) /* east */ { x++; dx = 1; - anim = 1; } if (ply->joy_n) /* north */ { y--; dy = -1; - anim = 0; } else if (ply->joy_s) /* south */ { y++; dy = 1; - anim = 2; } #else @@ -515,25 +510,21 @@ static void check_player(struct PLAYER *ply) { y--; dy = -1; - anim = 0; } else if (ply->joy_e) /* east */ { x++; dx = 1; - anim = 1; } else if (ply->joy_s) /* south */ { y++; dy = 1; - anim = 2; } else if (ply->joy_w) /* west */ { x--; dx = -1; - anim = 3; } } else @@ -542,25 +533,21 @@ static void check_player(struct PLAYER *ply) { x--; dx = -1; - anim = 3; } else if (ply->joy_s) /* south */ { y++; dy = 1; - anim = 2; } else if (ply->joy_e) /* east */ { x++; dx = 1; - anim = 1; } else if (ply->joy_n) /* north */ { y--; dy = -1; - anim = 0; } } #endif diff --git a/src/game_em/synchro_2.c b/src/game_em/synchro_2.c index 82ca79b6..c4b9a678 100644 --- a/src/game_em/synchro_2.c +++ b/src/game_em/synchro_2.c @@ -43,7 +43,7 @@ void synchro_2(void) { int x = 0; int y = 1; - unsigned long random = RandomEM; + unsigned int random = RandomEM; short *cave_cache = Cave[y]; /* might be a win */ int score = 0; diff --git a/src/game_sp/BugsTerminals.c b/src/game_sp/BugsTerminals.c index 94850270..d0a82ad4 100644 --- a/src/game_sp/BugsTerminals.c +++ b/src/game_sp/BugsTerminals.c @@ -127,7 +127,7 @@ void subAnimateTerminals(int si) void subRandomize() { - long Tick = MyGetTickCount(); + int Tick = MyGetTickCount(); RandomSeed = (Tick ^ (Tick >> 16)) & 0xFFFF; } diff --git a/src/game_sp/DDScrollBuffer.c b/src/game_sp/DDScrollBuffer.c index e8bd2fbc..de24a921 100644 --- a/src/game_sp/DDScrollBuffer.c +++ b/src/game_sp/DDScrollBuffer.c @@ -7,14 +7,14 @@ #include -long mScrollX, mScrollY; -long mScrollX_last, mScrollY_last; +int mScrollX, mScrollY; +int mScrollX_last, mScrollY_last; #if 1 -long ScreenBuffer[2 + MAX_PLAYFIELD_WIDTH + 2][2 + MAX_PLAYFIELD_HEIGHT + 2]; +int ScreenBuffer[2 + MAX_PLAYFIELD_WIDTH + 2][2 + MAX_PLAYFIELD_HEIGHT + 2]; boolean redraw[2 + MAX_PLAYFIELD_WIDTH + 2][2 + MAX_PLAYFIELD_HEIGHT + 2]; #else -long ScreenBuffer[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; +int ScreenBuffer[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; #endif @@ -50,6 +50,15 @@ static void ScrollPlayfield(int dx, int dy) int y2 = mScrollY_last / TILEY + (SCR_FIELDY - 1) + 2; int x, y; +#if NEW_TILESIZE + BlitBitmap(bitmap_db_field_sp, bitmap_db_field_sp, + TILEX_VAR * (dx == -1), + TILEY_VAR * (dy == -1), + (MAX_BUF_XSIZE * TILEX_VAR) - TILEX_VAR * (dx != 0), + (MAX_BUF_YSIZE * TILEY_VAR) - TILEY_VAR * (dy != 0), + TILEX_VAR * (dx == 1), + TILEY_VAR * (dy == 1)); +#else BlitBitmap(bitmap_db_field_sp, bitmap_db_field_sp, TILEX * (dx == -1), TILEY * (dy == -1), @@ -57,11 +66,18 @@ static void ScrollPlayfield(int dx, int dy) (MAX_BUF_YSIZE * TILEY) - TILEY * (dy != 0), TILEX * (dx == 1), TILEY * (dy == 1)); +#endif /* when scrolling the whole playfield, do not redraw single tiles */ +#if 1 + for (x = 0; x < 2 + MAX_PLAYFIELD_WIDTH + 2; x++) + for (y = 0; y < 2 + MAX_PLAYFIELD_HEIGHT + 2; y++) + redraw[x][y] = FALSE; +#else for (x = 0; x < MAX_BUF_XSIZE; x++) for (y = 0; y < MAX_BUF_YSIZE; y++) redraw[x][y] = FALSE; +#endif redraw_tiles = 0; DrawFrameIfNeeded(); @@ -75,9 +91,9 @@ static void ScrollPlayfield(int dx, int dy) int sx = x - x1; int sy = y - y1; int tsi = GetSI(x, y); - long id = ((PlayField16[tsi]) | - (PlayField8[tsi] << 16) | - (DisPlayField[tsi] << 24)); + int id = ((PlayField16[tsi]) | + (PlayField8[tsi] << 16) | + (DisPlayField[tsi] << 24)); if ((dx == -1 && x == x2) || (dx == +1 && x == x1) || @@ -145,10 +161,13 @@ void InitScrollPlayfield() ScrollPlayfieldIfNeededExt(TRUE); } +#define DEBUG_REDRAW 0 + void UpdatePlayfield(boolean force_redraw) { int x, y; -#if 1 + +#if DEBUG_REDRAW int num_redrawn = 0; #endif @@ -161,8 +180,10 @@ void UpdatePlayfield(boolean force_redraw) int sync_frame = GfxFrame[x][y]; boolean redraw = force_redraw; +#if DEBUG_REDRAW #if 0 redraw = TRUE; // !!! TEST ONLY -- ALWAYS REDRAW !!! +#endif #endif if (graphic < 0) @@ -201,20 +222,22 @@ void UpdatePlayfield(boolean force_redraw) int sx = x * StretchWidth; int sy = y * StretchWidth; +#if DEBUG_REDRAW #if 0 printf("::: REDRAW (%d, %d): %d, %d\n", x, y, graphic, sync_frame); +#endif #endif DDSpriteBuffer_BltImg(sx, sy, graphic, sync_frame); -#if 1 +#if DEBUG_REDRAW num_redrawn++; #endif } } } -#if 0 +#if DEBUG_REDRAW printf("::: FRAME %d: %d redrawn\n", FrameCounter, num_redrawn); #endif } @@ -238,8 +261,17 @@ void BlitScreenToBitmap_SP(Bitmap *target_bitmap) int xsize = SXSIZE; int ysize = SYSIZE; +#if NEW_TILESIZE + int full_xsize = (FieldWidth - (menBorder ? 0 : 1)) * TILEX_VAR; + int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY_VAR; +#else int full_xsize = (FieldWidth - (menBorder ? 0 : 1)) * TILEX; int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY; +#endif + +#if NEW_TILESIZE + +#endif sxsize = (full_xsize < xsize ? full_xsize : xsize); sysize = (full_ysize < ysize ? full_ysize : ysize); @@ -258,49 +290,132 @@ void BlitScreenToBitmap_SP(Bitmap *target_bitmap) } #endif +#if NEW_TILESIZE + px = px * TILESIZE_VAR / TILESIZE; + py = py * TILESIZE_VAR / TILESIZE; +#endif + +#if 0 + printf("::: (%d, %d) (%d, %d) (%d, %d) [%d / %d]\n", + px, py, sxsize, sysize, sx, sy, + FieldHeight, menBorder); +#endif + +#if 0 + printf("::: (%d, %d)\n", + bitmap_db_field_sp->width, bitmap_db_field_sp->height); +#endif + BlitBitmap(bitmap_db_field_sp, target_bitmap, px, py, sxsize, sysize, sx, sy); } void BackToFront_SP(void) { + static int scroll_x_last = -1, scroll_y_last = -1; static boolean scrolling_last = FALSE; - int left = mScrollX / TILEX; - int top = mScrollY / TILEY; + static boolean ExplosionShakeMurphy_last = -1; +#if 1 + boolean scrolling = (mScrollX != scroll_x_last || mScrollY != scroll_y_last); + // boolean scrolling = (mScrollX != mScrollX_last || mScrollY != mScrollY_last); +#else boolean scrolling = (mScrollX % TILEX != 0 || mScrollY % TILEY != 0); +#endif int x, y; +#if 0 + printf("::: %d, %d / %d, %d [%d, %d]\n", + mScrollX, mScrollY, + mScrollX_last, mScrollY_last, + game_sp.scroll_xoffset, game_sp.scroll_yoffset); +#endif + SyncDisplay(); - if (1 || - redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last) + if (0 || + redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last || + ExplosionShakeMurphy != 0 || ExplosionShakeMurphy_last != 0) { BlitScreenToBitmap_SP(window); } else { - for (x = 0; x < SCR_FIELDX; x++) + int scroll_xoffset = mScrollX - mScrollX_last + game_sp.scroll_xoffset; + int scroll_yoffset = mScrollY - mScrollY_last + game_sp.scroll_yoffset; + int x1 = 0, x2 = SCR_FIELDX - (scroll_xoffset != 0 ? 0 : 1); + int y1 = 0, y2 = SCR_FIELDY - (scroll_yoffset != 0 ? 0 : 1); +#if NEW_TILESIZE + int full_xsize = (FieldWidth - (menBorder ? 0 : 1)) * TILEX_VAR; + int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY_VAR; +#else + int full_xsize = (FieldWidth - (menBorder ? 0 : 1)) * TILEX; + int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY; +#endif +#if 1 + int xsize = SXSIZE; + int ysize = SYSIZE; + int sxsize = (full_xsize < xsize ? full_xsize : xsize); + int sysize = (full_ysize < ysize ? full_ysize : ysize); + int sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0); + int sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0); +#else + int sx = SX + (full_xsize < SXSIZE ? (SXSIZE - full_xsize) / 2 : 0); + int sy = SY + (full_ysize < SYSIZE ? (SYSIZE - full_ysize) / 2 : 0); +#endif + +#if 1 + InitGfxClipRegion(TRUE, sx, sy, sxsize, sysize); +#else + InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE); +#endif + +#if NEW_TILESIZE + scroll_xoffset = scroll_xoffset * TILESIZE_VAR / TILESIZE; + scroll_yoffset = scroll_yoffset * TILESIZE_VAR / TILESIZE; +#endif + + for (x = x1; x <= x2; x++) { - for (y = 0; y < SCR_FIELDY; y++) + for (y = y1; y <= y2; y++) { - int xx = (left + x) % MAX_BUF_XSIZE; - int yy = (top + y) % MAX_BUF_YSIZE; + int xx = 2 + x; + int yy = 2 + y; +#if NEW_TILESIZE + if (redraw[xx][yy]) + BlitBitmap(bitmap_db_field_sp, window, + xx * TILEX_VAR, yy * TILEY_VAR, TILEX_VAR, TILEY_VAR, + sx + x * TILEX_VAR - scroll_xoffset, + sy + y * TILEY_VAR - scroll_yoffset); +#else if (redraw[xx][yy]) BlitBitmap(bitmap_db_field_sp, window, xx * TILEX, yy * TILEY, TILEX, TILEY, - SX + x * TILEX, SY + y * TILEY); + sx + x * TILEX - scroll_xoffset, + sy + y * TILEY - scroll_yoffset); +#endif } } + + InitGfxClipRegion(FALSE, -1, -1, -1, -1); } FlushDisplay(); +#if 1 + for (x = 0; x < 2 + MAX_PLAYFIELD_WIDTH + 2; x++) + for (y = 0; y < 2 + MAX_PLAYFIELD_HEIGHT + 2; y++) + redraw[x][y] = FALSE; +#else for (x = 0; x < MAX_BUF_XSIZE; x++) for (y = 0; y < MAX_BUF_YSIZE; y++) redraw[x][y] = FALSE; +#endif redraw_tiles = 0; + scroll_x_last = mScrollX; + scroll_y_last = mScrollY; scrolling_last = scrolling; + ExplosionShakeMurphy_last = ExplosionShakeMurphy; } void DDScrollBuffer_ScrollTo(int X, int Y) @@ -339,12 +454,15 @@ void DDScrollBuffer_ScrollTowards(int X, int Y, double Step) ScrollPlayfieldIfNeeded(); } -void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS) +void DDScrollBuffer_SoftScrollTo(int X, int Y, int TimeMS, int FPS) { double dx, dY; - long dT, StepCount; +#if 0 + int dT; +#endif + int StepCount; double T, tStep; - long oldX, oldY, maxD; + int oldX, oldY, maxD; static boolean AlreadyRunning = False; if (NoDisplayFlag) @@ -366,7 +484,9 @@ void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS) if (StepCount == 0) StepCount = 1; +#if 0 dT = 1000 / FPS; +#endif tStep = (double)1 / StepCount; oldX = mScrollX; oldY = mScrollY; diff --git a/src/game_sp/DDScrollBuffer.h b/src/game_sp/DDScrollBuffer.h index e34ef219..83bb5c85 100644 --- a/src/game_sp/DDScrollBuffer.h +++ b/src/game_sp/DDScrollBuffer.h @@ -8,8 +8,8 @@ #include "global.h" -extern long mScrollX, mScrollY; -extern long mScrollX_last, mScrollY_last; +extern int mScrollX, mScrollY; +extern int mScrollX_last, mScrollY_last; #if 1 extern boolean redraw[2 + MAX_PLAYFIELD_WIDTH + 2][2 + MAX_PLAYFIELD_HEIGHT + 2]; @@ -21,11 +21,11 @@ extern int TEST_flag; extern void InitScrollPlayfield(); -extern void UpdatePlayfield(); +extern void UpdatePlayfield(boolean); extern void RestorePlayfield(); extern void DDScrollBuffer_ScrollTo(int X, int Y); extern void DDScrollBuffer_ScrollTowards(int X, int Y, double Step); -extern void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS); +extern void DDScrollBuffer_SoftScrollTo(int X, int Y, int TimeMS, int FPS); #endif /* DDSCROLLBUFFER_H */ diff --git a/src/game_sp/DDSpriteBuffer.c b/src/game_sp/DDSpriteBuffer.c index 4683d319..47ec6aa3 100644 --- a/src/game_sp/DDSpriteBuffer.c +++ b/src/game_sp/DDSpriteBuffer.c @@ -7,15 +7,34 @@ static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY) { +#if NEW_TILESIZE +#if 0 + int pseudo_sxsize = SXSIZE * TILESIZE / TILESIZE_VAR; + int pseudo_sysize = SYSIZE * TILESIZE / TILESIZE_VAR; +#endif +#endif int scx = (mScrollX_last < 0 ? 0 : mScrollX_last); int scy = (mScrollY_last < 0 ? 0 : mScrollY_last); int sx1 = scx - 2 * TILEX; int sy1 = scy - 2 * TILEY; +#if NEW_TILESIZE +#if 1 + int sx2 = scx + (SCR_FIELDX + 1) * TILEX; + int sy2 = scy + (SCR_FIELDY + 1) * TILEY; +#else + int sx2 = scx + pseudo_sxsize + 1 * TILEX; + int sy2 = scy + pseudo_sysize + 1 * TILEY; +#endif +#else int sx2 = scx + SXSIZE + 1 * TILEX; int sy2 = scy + SYSIZE + 1 * TILEY; - +#endif int sx = pX - sx1; int sy = pY - sy1; + int tile_x = sx / TILESIZE; + int tile_y = sy / TILESIZE; + int move_x = (sx + TILESIZE - 1) / TILESIZE; + int move_y = (sy + TILESIZE - 1) / TILESIZE; if (NoDisplayFlag) return; @@ -24,8 +43,36 @@ static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY) if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2) return; +#if NEW_TILESIZE + +#if 0 + SpriteX = SpriteX * TILESIZE_VAR / TILESIZE; + SpriteY = SpriteY * TILESIZE_VAR / TILESIZE; +#endif + + sx = sx * TILESIZE_VAR / TILESIZE; + sy = sy * TILESIZE_VAR / TILESIZE; + + BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY, + TILEX_VAR, TILEY_VAR, sx, sy); +#else BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY, TILEX, TILEY, sx, sy); +#endif + + redraw[tile_x][tile_y] = TRUE; + redraw_tiles++; + + if (move_x != tile_x) + { + redraw[move_x][tile_y] = TRUE; + redraw_tiles++; + } + else if (move_y != tile_y) + { + redraw[tile_x][move_y] = TRUE; + redraw_tiles++; + } } void DDSpriteBuffer_BltImg(int pX, int pY, int graphic, int sync_frame) diff --git a/src/game_sp/Display.c b/src/game_sp/Display.c index d3bf853e..ae9d26ea 100644 --- a/src/game_sp/Display.c +++ b/src/game_sp/Display.c @@ -10,8 +10,8 @@ int ScreenScrollXPos, ScreenScrollYPos; int ExplosionShake, ExplosionShakeMurphy; boolean NoDisplayFlag; -long DisplayMinX, DisplayMaxX; -long DisplayMinY, DisplayMaxY; +int DisplayMinX, DisplayMaxX; +int DisplayMinY, DisplayMaxY; void subDisplayLevel() @@ -52,7 +52,7 @@ void ScrollTowards(int X, int Y) DDScrollBuffer_ScrollTowards(X, Y, 2 * ZoomFactor); } -void SoftScrollTo(int X, int Y, long TimeMS, int FPS) +void SoftScrollTo(int X, int Y, int TimeMS, int FPS) { if (NoDisplayFlag) return; diff --git a/src/game_sp/Display.h b/src/game_sp/Display.h index bc0934f4..dee7b16e 100644 --- a/src/game_sp/Display.h +++ b/src/game_sp/Display.h @@ -13,12 +13,12 @@ extern int ScreenScrollXPos, ScreenScrollYPos; extern int ExplosionShake, ExplosionShakeMurphy; extern boolean NoDisplayFlag; -extern long DisplayMinX, DisplayMaxX; -extern long DisplayMinY, DisplayMaxY; +extern int DisplayMinX, DisplayMaxX; +extern int DisplayMinY, DisplayMaxY; extern void subDisplayLevel(); extern void ScrollTo(int, int); extern void ScrollTowards(int, int); -extern void SoftScrollTo(int, int, long, int); +extern void SoftScrollTo(int, int, int, int); #endif /* DISPLAY_H */ diff --git a/src/game_sp/Explosions.c b/src/game_sp/Explosions.c index 4eded7b3..0a73d754 100644 --- a/src/game_sp/Explosions.c +++ b/src/game_sp/Explosions.c @@ -17,7 +17,10 @@ static void subExplodeZonk(int tsi, int cx); void subAnimateExplosion(int si) { - int ax, bl, X, Y; + int ax, bl; +#if 0 + int X, Y; +#endif if (LowByte(PlayField16[si]) != fiExplosion) return; @@ -35,8 +38,10 @@ void subAnimateExplosion(int si) MovHighByte(&PlayField16[si], bl); // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#if 0 X = GetStretchX(si); Y = GetStretchY(si); +#endif GfxGraphic[GetX(si)][GetY(si)] = aniDefaultExplosion; // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -71,8 +76,10 @@ loc_g_28D0: // explosion produces infotron MovHighByte(&PlayField16[si], bl); // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#if 0 X = GetStretchX(si); Y = GetStretchY(si); +#endif GfxGraphic[GetX(si)][GetY(si)] = aniElectronExplosion; // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ } @@ -136,7 +143,7 @@ static void LetExplodeFieldSP(int tsi, int cx, int dh) { int al; - if (tsi < (-FieldWidth)) + if (tsi < -FieldWidth) return; al = LowByte(PlayField16[tsi]); @@ -276,15 +283,19 @@ static void subExplodeInfotron(int tsi, int cx) void subClearFieldDueToExplosion(int si) { +#if 0 int X, Y; +#endif if (LowByte(PlayField16[si]) == fiExplosion) return; PlayField16[si] = 0; // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#if 0 X = GetStretchX(si); Y = GetStretchY(si); +#endif GfxGraphic[GetX(si)][GetY(si)] = aniSpace; // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ } diff --git a/src/game_sp/Globals.c b/src/game_sp/Globals.c index e34d1962..9ddbf2b0 100644 --- a/src/game_sp/Globals.c +++ b/src/game_sp/Globals.c @@ -14,11 +14,15 @@ int FieldWidth; // standard size = 60 int FieldHeight; // standard size = 24 int HeaderSize; // standard size = 96 int FieldMax, LevelMax; -long FileMax; +#if 0 +int FileMax; +#endif #if 1 -int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; -byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; +int *PlayField16; +byte *PlayField8; +// int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; +// byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; #else int *PlayField16; @@ -44,7 +48,7 @@ int MurphyPosIndex, MurphyXPos, MurphyYPos; int MurphyScreenXPos, MurphyScreenYPos; int MurphyExplodePos, SplitMoveFlag, RedDiskReleaseMurphyPos; int KillMurphyFlag, MurphyMoveCounter; -long YawnSleepCounter; +int YawnSleepCounter; int MurphyVarFaceLeft; int ScratchGravity, GravityFlag; int RedDiskReleaseFlag, MovingPictureSequencePhase; @@ -164,6 +168,8 @@ boolean isSnappingSequence(int sequence) void InitGlobals() { + InitPrecedingPlayfieldMemory(); + AutoScrollFlag = True; FreezeZonks = 0; LevelLoaded = False; @@ -175,6 +181,18 @@ void InitGlobals() bPlaying = False; menBorder = False; + /* add preceding playfield buffer (as large as preceding memory area) */ + PlayField16 = checked_calloc((game_sp.preceding_buffer_size + + SP_MAX_PLAYFIELD_SIZE + + SP_HEADER_SIZE) * sizeof(int)); + PlayField16 = &PlayField16[game_sp.preceding_buffer_size]; + + /* add preceding playfield buffer (as large as one playfield row) */ + PlayField8 = checked_calloc((SP_MAX_PLAYFIELD_WIDTH + + SP_MAX_PLAYFIELD_SIZE + + SP_HEADER_SIZE) * sizeof(byte)); + PlayField8 = &PlayField8[SP_MAX_PLAYFIELD_WIDTH]; + #if 0 /* these defaults will be changed after reading a Supaplex level file */ PlayField8 = REDIM_1D(sizeof(byte), 0, FieldMax); diff --git a/src/game_sp/Globals.h b/src/game_sp/Globals.h index 05d4cd7c..6b965de9 100644 --- a/src/game_sp/Globals.h +++ b/src/game_sp/Globals.h @@ -13,9 +13,14 @@ #define True (!False) #endif -#define ScrollDelta ((long)1) +#define ScrollDelta ((int)1) +#if NEW_TILESIZE +// #define ZoomFactor (ZOOM_FACTOR) #define ZoomFactor (2) +#else +#define ZoomFactor (2) +#endif #define StretchWidth (ZoomFactor * 16) #define TwoPixels (ZoomFactor * 2) @@ -224,8 +229,8 @@ typedef struct { int Width; int Height; - long OffSet; - long Size; + int OffSet; + int Size; } LevelDescriptor; #define HAS_LevelDescriptor #endif @@ -295,8 +300,10 @@ extern boolean DemoAvailable; extern boolean menBorder; #if 1 -extern int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; -extern byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; +extern int *PlayField16; +extern byte *PlayField8; +// extern int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; +// extern byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; extern byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; #else extern int *PlayField16; @@ -312,7 +319,9 @@ extern int HeaderSize; extern int TimerVar; extern short RandomSeed; -extern long FileMax; +#if 0 +extern int FileMax; +#endif extern LevelInfoType LInfo; extern int ScrollMinX, ScrollMaxX, ScrollMinY, ScrollMaxY; @@ -334,6 +343,6 @@ extern int RedDiskReleasePhase; extern int ScratchGravity, GravityFlag; extern int SnikSnaksElectronsFrozen; extern int YellowDisksExploded; -extern long YawnSleepCounter; +extern int YawnSleepCounter; #endif /* GLOBALS_H */ diff --git a/src/game_sp/MainForm.c b/src/game_sp/MainForm.c index c54bf63d..d33191d6 100644 --- a/src/game_sp/MainForm.c +++ b/src/game_sp/MainForm.c @@ -187,14 +187,30 @@ static void ReStretch() void SetScrollEdges() { +#if NEW_TILESIZE +#if 0 + int pseudo_sxsize = SXSIZE * TILESIZE / TILESIZE_VAR; + int pseudo_sysize = SYSIZE * TILESIZE / TILESIZE_VAR; +#endif +#endif int border1_offset = (menBorder ? 1 : 2); int border2_offset = (menBorder ? 0 : TILESIZE / 2); /* scroll correction for border frame (1 tile) or border element (2 tiles) */ ScrollMinX = 0; ScrollMinY = 0; +#if NEW_TILESIZE +#if 1 + ScrollMaxX = (DisplayMaxX + border1_offset - SCR_FIELDX) * TILEX; + ScrollMaxY = (DisplayMaxY + border1_offset - SCR_FIELDY) * TILEY; +#else + ScrollMaxX = (DisplayMaxX + border1_offset) * TILEX - pseudo_sxsize; + ScrollMaxY = (DisplayMaxY + border1_offset) * TILEY - pseudo_sysize; +#endif +#else ScrollMaxX = (DisplayMaxX + border1_offset) * TILEX - SXSIZE; ScrollMaxY = (DisplayMaxY + border1_offset) * TILEY - SYSIZE; +#endif /* scroll correction for border element (half tile on left and right side) */ ScrollMinX += border2_offset; diff --git a/src/game_sp/Murphy.c b/src/game_sp/Murphy.c index 06cd9f7d..115227ff 100644 --- a/src/game_sp/Murphy.c +++ b/src/game_sp/Murphy.c @@ -81,6 +81,10 @@ void subAnimateMurphy(int *si) } } // loc_g_5E8B: +#if 0 + printf("::: RedDiskReleaseFlag == %d\n", RedDiskReleaseFlag); +#endif + bl = DemoKeyCode; if (bl != 0) // a key was pressed! goto locKeyPressed5FCF; diff --git a/src/game_sp/export.h b/src/game_sp/export.h index fe5995fd..364ede02 100644 --- a/src/game_sp/export.h +++ b/src/game_sp/export.h @@ -110,6 +110,7 @@ struct GameInfo_SP int score; /* needed for engine snapshots */ + char **preceding_buffer; int preceding_buffer_size; int scroll_xoffset, scroll_yoffset; @@ -186,16 +187,17 @@ extern struct EngineSnapshotInfo_SP engine_snapshot_sp; extern void sp_open_all(); extern void sp_close_all(); +extern void InitPrecedingPlayfieldMemory(); extern void InitGfxBuffers_SP(); extern void InitGameEngine_SP(); extern void GameActions_SP(byte *, boolean); -extern unsigned int InitEngineRandom_SP(long); +extern unsigned int InitEngineRandom_SP(int); extern void setLevelInfoToDefaults_SP(); extern void copyInternalEngineVars_SP(); -extern boolean LoadNativeLevel_SP(char *, int); +extern boolean LoadNativeLevel_SP(char *, int, boolean); extern void SaveNativeLevel_SP(char *); extern void BackToFront_SP(void); @@ -209,4 +211,6 @@ extern void SaveEngineSnapshotValues_SP(); extern int map_key_RND_to_SP(int); extern int map_key_SP_to_RND(int); +extern int getRedDiskReleaseFlag_SP(); + #endif /* GAME_SP_EXPORT_H */ diff --git a/src/game_sp/file.c b/src/game_sp/file.c index f841cf20..53eb22ff 100644 --- a/src/game_sp/file.c +++ b/src/game_sp/file.c @@ -60,64 +60,9 @@ void setLevelInfoToDefaults_SP() void copyInternalEngineVars_SP() { - char *preceding_playfield_memory[] = - { - "95 89 95 89 95 89 3b 8a 3b 8a 3b 8a 3b 8a 3b 8a", // |......;.;.;.;.;.| - "3b 8a 3b 8a 3b 8a e8 8a e8 8a e8 8a e8 8a e8 8a", // |;.;.;.è.è.è.è.è.| - "e8 8a e8 8a e8 8a b1 8b b1 8b b1 8b b1 8b b1 8b", // |è.è.è.±.±.±.±.±.| - "b1 8b b1 8b b1 8b 85 8c 85 8c 85 8c 85 8c 85 8c", // |±.±.±...........| - "85 8c 85 8c 85 8c 5b 8d 5b 8d 5b 8d 5b 8d 5b 8d", // |......[.[.[.[.[.| - "5b 8d 5b 8d 5b 8d 06 8e 06 8e 06 8e 06 8e 06 8e", // |[.[.[...........| - "06 8e 06 8e 06 8e ac 8e ac 8e ac 8e ac 8e ac 8e", // |......¬.¬.¬.¬.¬.| - "ac 8e ac 8e ac 8e 59 8f 59 8f 59 8f 59 8f 59 8f", // |¬.¬.¬.Y.Y.Y.Y.Y.| - "59 8f 59 8f 59 8f 00 00 70 13 00 00 00 00 e8 17", // |Y.Y.Y...p.....è.| - "00 00 00 00 00 00 69 38 00 00 00 00 00 00 00 00", // |......i8........| - "00 00 00 00 00 00 00 00 d0 86 00 00 b2 34 00 00", // |........Ð...²4..| - "00 00 00 00 00 00 8f 8b 1d 34 00 00 00 00 00 00", // |.........4......| - "00 00 00 00 23 39 09 09 00 0c 00 08 00 58 00 00", // |....#9.......X..| - "00 00 00 25 77 06 7f 00 00 00 01 00 00 00 00 00", // |...%w...........| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 ec 06 26 05 00 00 00", // |.........ì.&....| - "00 00 00 01 00 00 00 00 31 32 33 34 35 36 37 38", // |........12345678| - "39 30 2d 00 08 00 51 57 45 52 54 59 55 49 4f 50", // |90-...QWERTYUIOP| - "00 00 0a 00 41 53 44 46 47 48 4a 4b 4c 00 00 00", // |....ASDFGHJKL...| - "00 00 5a 58 43 56 42 4e 4d 00 00 00 00 00 00 20", // |..ZXCVBNM...... | - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 2e 00 1e 00 31 00 14 00 39 00", // |..........1...9.| - "1f 00 14 00 18 00 ff ff 01 00 01 4c 45 56 45 4c", // |......ÿÿ...LEVEL| - "53 2e 44 41 54 00 00 00 00 00 00 00 00 00 00 00", // |S.DAT...........| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - - NULL - }; - int preceding_buffer_size = 0; int count; int i, x, y; - for (i = 0; preceding_playfield_memory[i] != NULL; i++) - preceding_buffer_size += 8; /* eight 16-bit integer values */ - - /* needed for engine snapshots */ - game_sp.preceding_buffer_size = preceding_buffer_size; - LInfo = native_sp_level.header; FieldWidth = native_sp_level.width; @@ -127,19 +72,29 @@ void copyInternalEngineVars_SP() FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1; LevelMax = (FieldWidth * FieldHeight) - 1; +#if 0 /* (add one byte for the level number stored as first byte of demo data) */ FileMax = FieldMax + native_sp_level.demo.length + 1; +#endif #if 0 PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax); DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax); - PlayField16 = REDIM_1D(sizeof(int), -preceding_buffer_size, FieldMax); + PlayField16 = REDIM_1D(sizeof(int), -game_sp.preceding_buffer_size, FieldMax); #endif + /* initialize preceding playfield buffer */ + for (i = -game_sp.preceding_buffer_size; i < 0; i++) + PlayField16[i] = 0; + + /* initialize preceding playfield buffer */ + for (i = -SP_MAX_PLAYFIELD_WIDTH; i < 0; i++) + PlayField8[i] = 0; + count = 0; - for (i = 0; preceding_playfield_memory[i] != NULL; i++) + for (i = 0; game_sp.preceding_buffer[i] != NULL; i++) { - char *s = preceding_playfield_memory[i]; + char *s = game_sp.preceding_buffer[i]; boolean hi_byte = FALSE; /* little endian data => start with low byte */ while (s[0] != '\0' && s[1] != '\0') @@ -151,7 +106,7 @@ void copyInternalEngineVars_SP() if (hi_byte) byte <<= 8; - PlayField16[-preceding_buffer_size + count] |= byte; + PlayField16[-game_sp.preceding_buffer_size + count] |= byte; if (hi_byte) count++; @@ -343,7 +298,8 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height, } } -boolean LoadNativeLevel_SP(char *filename, int level_pos) +boolean LoadNativeLevel_SP(char *filename, int level_pos, + boolean level_info_only) { FILE *file; int i, l, x, y; @@ -369,7 +325,8 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) if (!(file = fopen(filename, MODE_READ))) { - Error(ERR_WARN, "cannot open file '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot open file '%s' -- using empty level", filename); return FALSE; } diff --git a/src/game_sp/init.c b/src/game_sp/init.c index d8e4597d..acd426ff 100644 --- a/src/game_sp/init.c +++ b/src/game_sp/init.c @@ -3,6 +3,56 @@ #include "global.h" +char *preceding_playfield_memory[] = +{ + "95 89 95 89 95 89 3b 8a 3b 8a 3b 8a 3b 8a 3b 8a", // |......;.;.;.;.;.| + "3b 8a 3b 8a 3b 8a e8 8a e8 8a e8 8a e8 8a e8 8a", // |;.;.;.è.è.è.è.è.| + "e8 8a e8 8a e8 8a b1 8b b1 8b b1 8b b1 8b b1 8b", // |è.è.è.±.±.±.±.±.| + "b1 8b b1 8b b1 8b 85 8c 85 8c 85 8c 85 8c 85 8c", // |±.±.±...........| + "85 8c 85 8c 85 8c 5b 8d 5b 8d 5b 8d 5b 8d 5b 8d", // |......[.[.[.[.[.| + "5b 8d 5b 8d 5b 8d 06 8e 06 8e 06 8e 06 8e 06 8e", // |[.[.[...........| + "06 8e 06 8e 06 8e ac 8e ac 8e ac 8e ac 8e ac 8e", // |......¬.¬.¬.¬.¬.| + "ac 8e ac 8e ac 8e 59 8f 59 8f 59 8f 59 8f 59 8f", // |¬.¬.¬.Y.Y.Y.Y.Y.| + "59 8f 59 8f 59 8f 00 00 70 13 00 00 00 00 e8 17", // |Y.Y.Y...p.....è.| + "00 00 00 00 00 00 69 38 00 00 00 00 00 00 00 00", // |......i8........| + "00 00 00 00 00 00 00 00 d0 86 00 00 b2 34 00 00", // |........Ð...²4..| + "00 00 00 00 00 00 8f 8b 1d 34 00 00 00 00 00 00", // |.........4......| + "00 00 00 00 23 39 09 09 00 0c 00 08 00 58 00 00", // |....#9.......X..| + "00 00 00 25 77 06 7f 00 00 00 01 00 00 00 00 00", // |...%w...........| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 ec 06 26 05 00 00 00", // |.........ì.&....| + "00 00 00 01 00 00 00 00 31 32 33 34 35 36 37 38", // |........12345678| + "39 30 2d 00 08 00 51 57 45 52 54 59 55 49 4f 50", // |90-...QWERTYUIOP| + "00 00 0a 00 41 53 44 46 47 48 4a 4b 4c 00 00 00", // |....ASDFGHJKL...| + "00 00 5a 58 43 56 42 4e 4d 00 00 00 00 00 00 20", // |..ZXCVBNM...... | + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 2e 00 1e 00 31 00 14 00 39 00", // |..........1...9.| + "1f 00 14 00 18 00 ff ff 01 00 01 4c 45 56 45 4c", // |......ÿÿ...LEVEL| + "53 2e 44 41 54 00 00 00 00 00 00 00 00 00 00 00", // |S.DAT...........| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + + NULL +}; + + Bitmap *bitmap_db_field_sp; struct EngineSnapshotInfo_SP engine_snapshot_sp; @@ -16,18 +66,30 @@ void sp_close_all() { } +void InitPrecedingPlayfieldMemory() +{ + int preceding_buffer_size = 0; + int i; + + for (i = 0; preceding_playfield_memory[i] != NULL; i++) + preceding_buffer_size += 8; /* eight 16-bit integer values */ + + game_sp.preceding_buffer = preceding_playfield_memory; + game_sp.preceding_buffer_size = preceding_buffer_size; +} + void InitGfxBuffers_SP() { ReCreateBitmap(&bitmap_db_field_sp, FXSIZE, FYSIZE, DEFAULT_DEPTH); } -unsigned int InitEngineRandom_SP(long seed) +unsigned int InitEngineRandom_SP(int seed) { if (seed == NEW_RANDOMIZE) { subRandomize(); - seed = (long)RandomSeed; + seed = (int)RandomSeed; } RandomSeed = (short)seed; @@ -68,7 +130,9 @@ void SaveEngineSnapshotValues_SP() SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldHeight)); SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldMax)); SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(LevelMax)); +#if 0 SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FileMax)); +#endif SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(TimerVar)); SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RandomSeed)); diff --git a/src/game_sp/main.c b/src/game_sp/main.c index 1308353d..4fe06feb 100644 --- a/src/game_sp/main.c +++ b/src/game_sp/main.c @@ -66,10 +66,20 @@ void RedrawPlayfield_SP(boolean force_redraw) void DrawGameDoorValues_SP() { - game_sp.time_played = TimerVar / setup.game_frame_delay; +#if 1 + // game_sp.time_played = TimerVar / FRAMES_PER_SECOND_SP; + game_sp.time_played = TimerVar / FRAMES_PER_SECOND; +#else + game_sp.time_played = TimerVar * setup.game_frame_delay / 1000; +#endif game_sp.infotrons_still_needed = InfotronsNeeded; game_sp.red_disk_count = RedDiskCount; game_sp.score = 0; // (currently no score in Supaplex engine) + +#if 0 + printf("::: %d, %d => %d\n", + TimerVar, setup.game_frame_delay, game_sp.time_played); +#endif } void GameActions_SP(byte action[MAX_PLAYERS], boolean warp_mode) @@ -86,9 +96,15 @@ void GameActions_SP(byte action[MAX_PLAYERS], boolean warp_mode) if (!warp_mode) /* do not redraw values in warp mode */ DrawGameDoorValues_SP(); - CheckSingleStepMode_SP(PlayField16[MurphyPosIndex] != fiMurphy); + CheckSingleStepMode_SP(PlayField16[MurphyPosIndex] == fiMurphy, + HighByte(PlayField16[MurphyPosIndex]) == 0x2A); for (x = DisplayMinX; x <= DisplayMaxX; x++) for (y = DisplayMinY; y <= DisplayMaxY; y++) GfxFrame[x][y]++; } + +int getRedDiskReleaseFlag_SP() +{ + return RedDiskReleaseFlag; +} diff --git a/src/game_sp/main_sp.h b/src/game_sp/main_sp.h index 6e61508b..ac239390 100644 --- a/src/game_sp/main_sp.h +++ b/src/game_sp/main_sp.h @@ -27,13 +27,28 @@ /* screen sizes and positions for SP engine */ +#define NEW_TILESIZE 1 + #define ORIG_TILESIZE 16 +#if NEW_TILESIZE +#define ZOOM_FACTOR (2 * TILESIZE_VAR / TILESIZE) +#else #define ZOOM_FACTOR 2 +#endif +#if NEW_TILESIZE +extern int TILESIZE_VAR; +#define TILESIZE 32 +#define TILEX TILESIZE +#define TILEY TILESIZE +#define TILEX_VAR TILESIZE_VAR +#define TILEY_VAR TILESIZE_VAR +#else #define TILESIZE (ORIG_TILESIZE * ZOOM_FACTOR) #define TILEX TILESIZE #define TILEY TILESIZE +#endif #define ORIG_SCR_MENUX 20 #define ORIG_SCR_MENUY 12 @@ -55,10 +70,18 @@ extern int SX, SY; #define SX 8 #define SY 8 #endif + +#if NEW_TILESIZE +#define SXSIZE (SCR_FIELDX * TILEX_VAR) +#define SYSIZE (SCR_FIELDY * TILEY_VAR) +#define FXSIZE (MAX_BUF_XSIZE * TILEX_VAR) +#define FYSIZE (MAX_BUF_YSIZE * TILEY_VAR) +#else #define SXSIZE (SCR_FIELDX * TILEX) #define SYSIZE (SCR_FIELDY * TILEY) #define FXSIZE (MAX_BUF_XSIZE * TILEX) #define FYSIZE (MAX_BUF_YSIZE * TILEY) +#endif #if 1 extern int REAL_SX, REAL_SY; diff --git a/src/game_sp/vb_lib.c b/src/game_sp/vb_lib.c index f71693c0..bdbe7691 100644 --- a/src/game_sp/vb_lib.c +++ b/src/game_sp/vb_lib.c @@ -23,7 +23,7 @@ void *REDIM_1D(int data_size, int first_data_pos, int last_data_pos) } #endif -long MyGetTickCount() +int MyGetTickCount() { return random_linux_libc(RANDOM_SIMPLE); } diff --git a/src/game_sp/vb_lib.h b/src/game_sp/vb_lib.h index cf8e3462..4f19f3a2 100644 --- a/src/game_sp/vb_lib.h +++ b/src/game_sp/vb_lib.h @@ -15,6 +15,6 @@ extern void *REDIM_1D(int, int, int); #endif -extern long MyGetTickCount(); +extern int MyGetTickCount(); #endif /* VB_LIB_H */ diff --git a/src/init.c b/src/init.c index 5e5301c7..f176e13e 100644 --- a/src/init.c +++ b/src/init.c @@ -39,7 +39,7 @@ #define CONFIG_TOKEN_GLOBAL_BUSY "global.busy" #define DEBUG_PRINT_INIT_TIMESTAMPS TRUE -#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 1 +#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 0 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; @@ -159,8 +159,8 @@ void DrawInitAnim() { struct GraphicInfo *graphic_info_last = graphic_info; int graphic = 0; - static unsigned long action_delay = 0; - unsigned long action_delay_value = GameFrameDelay; + static unsigned int action_delay = 0; + unsigned int action_delay_value = GameFrameDelay; int sync_frame = FrameCounter; int x, y; @@ -175,9 +175,9 @@ void DrawInitAnim() #if 0 { - static unsigned long last_counter = -1; - unsigned long current_counter = Counter(); - unsigned long delay = current_counter - last_counter; + static unsigned int last_counter = -1; + unsigned int current_counter = Counter(); + unsigned int delay = current_counter - last_counter; if (last_counter != -1 && delay > action_delay_value + 5) printf("::: DrawInitAnim: DELAY TOO LONG: %ld\n", delay); @@ -217,7 +217,7 @@ void DrawInitAnim() int height = graphic_info[graphic].height; int frame = getGraphicAnimationFrame(graphic, sync_frame); - getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); BlitBitmap(src_bitmap, window, src_x, src_y, width, height, x, y); #else /* !!! this can only draw TILEX/TILEY size animations !!! */ @@ -862,8 +862,8 @@ void InitElementGraphicInfo() if (swap_movement_tiles_always || swap_movement_tiles_autodetected) { /* get current (wrong) backside tile coordinates */ - getGraphicSourceExt(graphic, 0, &dummy, &src_x_back, &src_y_back, - TRUE); + getFixedGraphicSourceExt(graphic, 0, &dummy, + &src_x_back, &src_y_back, TRUE); /* set frontside tile coordinates to backside tile coordinates */ g->src_x = src_x_back; @@ -1334,6 +1334,29 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE) g->height = parameter[GFX_ARG_HEIGHT]; + if (src_bitmap) + { + if (g->width <= 0) + { + Error(ERR_INFO_LINE, "-"); + Error(ERR_WARN, "invalid value %d for '%s.width' (fallback done to %d)", + g->width, getTokenFromImageID(graphic), TILEX); + Error(ERR_INFO_LINE, "-"); + + g->width = TILEX; /* will be checked to be inside bitmap later */ + } + + if (g->height <= 0) + { + Error(ERR_INFO_LINE, "-"); + Error(ERR_WARN, "invalid value %d for '%s.height' (fallback done to %d)", + g->height, getTokenFromImageID(graphic), TILEY); + Error(ERR_INFO_LINE, "-"); + + g->height = TILEY; /* will be checked to be inside bitmap later */ + } + } + #if 0 /* optional zoom factor for scaling up the image to a larger size */ if (parameter[GFX_ARG_SCALE_UP_FACTOR] != ARG_UNDEFINED_VALUE) @@ -1501,6 +1524,12 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, g->class = parameter[GFX_ARG_CLASS]; if (parameter[GFX_ARG_STYLE] != ARG_UNDEFINED_VALUE) g->style = parameter[GFX_ARG_STYLE]; + + /* this is only used for drawing menu buttons and text */ + g->active_xoffset = parameter[GFX_ARG_ACTIVE_XOFFSET]; + g->active_yoffset = parameter[GFX_ARG_ACTIVE_YOFFSET]; + g->pressed_xoffset = parameter[GFX_ARG_PRESSED_XOFFSET]; + g->pressed_yoffset = parameter[GFX_ARG_PRESSED_YOFFSET]; } static void set_graphic_parameters(int graphic) @@ -1828,7 +1857,7 @@ static void InitGraphicInfo() static boolean clipmasks_initialized = FALSE; Pixmap src_pixmap; XGCValues clip_gc_values; - unsigned long clip_gc_valuemask; + unsigned int clip_gc_valuemask; GC copy_clipmask_gc = None; #endif @@ -1848,6 +1877,7 @@ static void InitGraphicInfo() IMG_BACKGROUND_TITLE, IMG_BACKGROUND_MAIN, IMG_BACKGROUND_LEVELS, + IMG_BACKGROUND_LEVELNR, IMG_BACKGROUND_SCORES, IMG_BACKGROUND_EDITOR, IMG_BACKGROUND_INFO, @@ -1858,6 +1888,8 @@ static void InitGraphicInfo() IMG_BACKGROUND_INFO_LEVELSET, IMG_BACKGROUND_SETUP, IMG_BACKGROUND_DOOR, + IMG_BACKGROUND_TAPE, + IMG_BACKGROUND_PANEL, IMG_TITLESCREEN_INITIAL_1, IMG_TITLESCREEN_INITIAL_2, @@ -1936,7 +1968,7 @@ static void InitGraphicInfo() /* check if first animation frame is inside specified bitmap */ first_frame = 0; - getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); #if 1 /* this avoids calculating wrong start position for out-of-bounds frame */ @@ -1970,7 +2002,7 @@ static void InitGraphicInfo() /* check if last animation frame is inside specified bitmap */ last_frame = graphic_info[i].anim_frames - 1; - getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y); if (src_x < 0 || src_y < 0 || src_x + width > src_bitmap_width || @@ -1984,6 +2016,7 @@ static void InitGraphicInfo() Error(ERR_INFO, "error: last animation frame (%d) out of bounds (%d, %d) [%d, %d]", last_frame, src_x, src_y, src_bitmap_width, src_bitmap_height); + Error(ERR_INFO, "::: %d, %d", width, height); Error(ERR_INFO, "custom graphic rejected for this element/action"); if (i == fallback_graphic) @@ -1997,7 +2030,7 @@ static void InitGraphicInfo() #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) /* currently we only need a tile clip mask from the first frame */ - getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); if (copy_clipmask_gc == None) { @@ -2031,6 +2064,60 @@ static void InitGraphicInfo() #endif } +static void InitGraphicCompatibilityInfo() +{ + struct FileInfo *fi_global_door = + getImageListEntryFromImageID(IMG_GLOBAL_DOOR); + int num_images = getImageListSize(); + int i; + + /* the following compatibility handling is needed for the following case: + versions up to 3.3.0.0 used one large bitmap "global.door" for various + graphics mainly used for door and panel graphics, like editor, tape and + in-game buttons with hard-coded bitmap positions and button sizes; as + these graphics now have individual definitions, redefining "global.door" + to change all these graphics at once like before does not work anymore + (because all those individual definitions still have their default values); + to solve this, remap all those individual definitions that are not + redefined to the new bitmap of "global.door" if it was redefined */ + + /* special compatibility handling if image "global.door" was redefined */ + if (fi_global_door->redefined) + { + for (i = 0; i < num_images; i++) + { + struct FileInfo *fi = getImageListEntryFromImageID(i); + + /* process only those images that still use the default settings */ + if (!fi->redefined) + { + /* process all images which default to same image as "global.door" */ + if (strEqual(fi->default_filename, fi_global_door->default_filename)) + { + // printf("::: special treatment needed for token '%s'\n", fi->token); + + graphic_info[i].bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; + } + } + } + } + +#if 0 + for (i = 0; i < num_images; i++) + { + struct FileInfo *fi = getImageListEntryFromImageID(i); + + if (i == IMG_GLOBAL_DOOR) + { + printf("::: %s, %s, %d\n", + fi->default_filename, + fi->filename, + fi->redefined); + } + } +#endif +} + static void InitElementSoundInfo() { struct PropertyMapping *property_mapping = getSoundListPropertyMapping(); @@ -2426,6 +2513,9 @@ static void ReinitializeGraphics() InitGraphicInfo_EM(); /* graphic mapping for EM engine */ print_timestamp_time("InitGraphicInfo_EM"); + InitGraphicCompatibilityInfo(); + print_timestamp_time("InitGraphicCompatibilityInfo"); + SetMainBackgroundImage(IMG_BACKGROUND); print_timestamp_time("SetMainBackgroundImage"); SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); @@ -5035,6 +5125,8 @@ static void InitGlobal() global.fading_status = GAME_MODE_MAIN; global.fading_type = TYPE_ENTER_MENU; #endif + + global.use_envelope_request = FALSE; /* !!! MOVE TO ARTWORK CONFIG !!! */ } void Execute_Command(char *command) @@ -5468,6 +5560,7 @@ void InitGfxBuffers() InitGfxScrollbufferInfo(FXSIZE, FYSIZE); InitGfxClipRegion(FALSE, -1, -1, -1, -1); + InitGfxBuffers_EM(); InitGfxBuffers_SP(); } @@ -6216,11 +6309,18 @@ void OpenAll() InitSetup(); + print_timestamp_time("[init setup/config stuff (1)]"); + InitGameInfo(); + print_timestamp_time("[init setup/config stuff (2)]"); InitPlayerInfo(); + print_timestamp_time("[init setup/config stuff (3)]"); InitArtworkInfo(); /* needed before loading gfx, sound & music */ + print_timestamp_time("[init setup/config stuff (4)]"); InitArtworkConfig(); /* needed before forking sound child process */ + print_timestamp_time("[init setup/config stuff (5)]"); InitMixer(); + print_timestamp_time("[init setup/config stuff (6)]"); #if 0 InitCounter(); diff --git a/src/libgame/gadgets.c b/src/libgame/gadgets.c index 4ac2a294..2113b824 100644 --- a/src/libgame/gadgets.c +++ b/src/libgame/gadgets.c @@ -383,7 +383,7 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* gadget text value */ #if 1 DrawTextBuffer(gi->x + border_x, gi->y + border_y, gi->textarea.value, - font_nr, gi->textarea.xsize, 0, -1, gi->textarea.ysize, + font_nr, gi->textarea.xsize, -1, gi->textarea.ysize, 0, BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE); #else DrawTextToTextArea(gi->x + border_x, gi->y + border_y, @@ -1399,18 +1399,18 @@ boolean anyTextGadgetActive() static boolean insideSelectboxLine(struct GadgetInfo *gi, int mx, int my) { - return(gi != NULL && - gi->type & GD_TYPE_SELECTBOX && - mx >= gi->x && mx < gi->x + gi->width && - my >= gi->y && my < gi->y + gi->height); + return (gi != NULL && + gi->type & GD_TYPE_SELECTBOX && + mx >= gi->x && mx < gi->x + gi->width && + my >= gi->y && my < gi->y + gi->height); } static boolean insideSelectboxArea(struct GadgetInfo *gi, int mx, int my) { - return(gi != NULL && - gi->type & GD_TYPE_SELECTBOX && - mx >= gi->selectbox.x && mx < gi->selectbox.x + gi->selectbox.width && - my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height); + return (gi != NULL && + gi->type & GD_TYPE_SELECTBOX && + mx >= gi->selectbox.x && mx < gi->selectbox.x + gi->selectbox.width && + my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height); } void ClickOnGadget(struct GadgetInfo *gi, int button) @@ -1431,8 +1431,8 @@ void ClickOnGadget(struct GadgetInfo *gi, int button) boolean HandleGadgets(int mx, int my, int button) { - static unsigned long pressed_delay = 0; - static unsigned long pressed_delay_value = GADGET_FRAME_DELAY; + static unsigned int pressed_delay = 0; + static unsigned int pressed_delay_value = GADGET_FRAME_DELAY; static int last_button = 0; static int last_mx = 0, last_my = 0; static int pressed_mx = 0, pressed_my = 0; @@ -1458,7 +1458,9 @@ boolean HandleGadgets(int mx, int my, int button) boolean gadget_dragging; boolean gadget_released; boolean gadget_released_inside; +#if 0 boolean gadget_released_inside_select_line; +#endif boolean gadget_released_inside_select_area; boolean gadget_released_off_borders; boolean changed_position = FALSE; @@ -1561,12 +1563,16 @@ boolean HandleGadgets(int mx, int my, int button) /* when handling selectbox, set additional state values */ if (gadget_released_inside && (last_gi->type & GD_TYPE_SELECTBOX)) { +#if 0 gadget_released_inside_select_line = insideSelectboxLine(last_gi, mx, my); +#endif gadget_released_inside_select_area = insideSelectboxArea(last_gi, mx, my); } else { +#if 0 gadget_released_inside_select_line = FALSE; +#endif gadget_released_inside_select_area = FALSE; } diff --git a/src/libgame/gadgets.h b/src/libgame/gadgets.h index 43125d66..7b8ce7f5 100644 --- a/src/libgame/gadgets.h +++ b/src/libgame/gadgets.h @@ -135,7 +135,7 @@ struct GadgetDecoration struct GadgetEvent { - unsigned long type; /* event type */ + unsigned int type; /* event type */ int button; /* button number for button events */ int x, y; /* gadget position at event time */ boolean off_borders; /* mouse pointer outside gadget? */ diff --git a/src/libgame/image.c b/src/libgame/image.c index 8ccf1fcb..498c1c0b 100644 --- a/src/libgame/image.c +++ b/src/libgame/image.c @@ -64,28 +64,28 @@ void freeImage(Image *image) note: the internal format is big endian */ #define memory_to_value(ptr, len) ( \ -(len) == 1 ? (unsigned long)( *( (byte *)(ptr)) ) : \ -(len) == 2 ? (unsigned long)(((unsigned long)(*( (byte *)(ptr)) ))<< 8) \ - + ( *(((byte *)(ptr))+1) ) : \ -(len) == 3 ? (unsigned long)(((unsigned long)(*( (byte *)(ptr)) ))<<16) \ - + (((unsigned long)(*(((byte *)(ptr))+1)))<< 8) \ - + ( *(((byte *)(ptr))+2) ) : \ - (unsigned long)(((unsigned long)(*( (byte *)(ptr)) ))<<24) \ - + (((unsigned long)(*(((byte *)(ptr))+1)))<<16) \ - + (((unsigned long)(*(((byte *)(ptr))+2)))<< 8) \ - + ( *(((byte *)(ptr))+3) ) ) +(len) == 1 ? (unsigned int)( *( (byte *)(ptr)) ) : \ +(len) == 2 ? (unsigned int)(((unsigned int)(*( (byte *)(ptr)) ))<< 8) \ + + ( *(((byte *)(ptr))+1) ) : \ +(len) == 3 ? (unsigned int)(((unsigned int)(*( (byte *)(ptr)) ))<<16) \ + + (((unsigned int)(*(((byte *)(ptr))+1)))<< 8) \ + + ( *(((byte *)(ptr))+2) ) : \ + (unsigned int)(((unsigned int)(*( (byte *)(ptr)) ))<<24) \ + + (((unsigned int)(*(((byte *)(ptr))+1)))<<16) \ + + (((unsigned int)(*(((byte *)(ptr))+2)))<< 8) \ + + ( *(((byte *)(ptr))+3) ) ) #define value_to_memory(value, ptr, len) ( \ (len) == 1 ? (*( (byte *)(ptr) ) = ( value ) ) : \ -(len) == 2 ? (*( (byte *)(ptr) ) = (((unsigned long)(value))>> 8), \ +(len) == 2 ? (*( (byte *)(ptr) ) = (((unsigned int)(value))>> 8), \ *(((byte *)(ptr))+1) = ( value ) ) : \ -(len) == 3 ? (*( (byte *)(ptr) ) = (((unsigned long)(value))>>16), \ - *(((byte *)(ptr))+1) = (((unsigned long)(value))>> 8), \ +(len) == 3 ? (*( (byte *)(ptr) ) = (((unsigned int)(value))>>16), \ + *(((byte *)(ptr))+1) = (((unsigned int)(value))>> 8), \ *(((byte *)(ptr))+2) = ( value ) ) : \ - (*( (byte *)(ptr) ) = (((unsigned long)(value))>>24), \ - *(((byte *)(ptr))+1) = (((unsigned long)(value))>>16), \ - *(((byte *)(ptr))+2) = (((unsigned long)(value))>> 8), \ + (*( (byte *)(ptr) ) = (((unsigned int)(value))>>24), \ + *(((byte *)(ptr))+1) = (((unsigned int)(value))>>16), \ + *(((byte *)(ptr))+2) = (((unsigned int)(value))>> 8), \ *(((byte *)(ptr))+3) = ( value ) )) static Pixmap Image_to_Mask(Image *image, Display *display, Window window) diff --git a/src/libgame/image.h b/src/libgame/image.h index 89f4f7c4..c3c1e0d1 100644 --- a/src/libgame/image.h +++ b/src/libgame/image.h @@ -59,10 +59,10 @@ typedef struct #define IMAGETYPE_RGB 1 /* RGB image with colormap */ #define IMAGETYPE_TRUECOLOR 2 /* true-color image */ -#define TRUECOLOR_RED(pixel) (((unsigned long)((pixel) & 0xff0000)) >> 16) -#define TRUECOLOR_GREEN(pixel) (((unsigned long)((pixel) & 0xff00)) >> 8) -#define TRUECOLOR_BLUE(pixel) ( (unsigned long)((pixel) & 0xff)) -#define RGB_TO_TRUECOLOR(r,g,b) ((((unsigned long)((r) & 0xff00)) << 8) | ((g) & 0xff00) | (((unsigned short)(b)) >> 8)) +#define TRUECOLOR_RED(pixel) (((unsigned int)((pixel) & 0xff0000)) >> 16) +#define TRUECOLOR_GREEN(pixel) (((unsigned int)((pixel) & 0xff00)) >> 8) +#define TRUECOLOR_BLUE(pixel) ( (unsigned int)((pixel) & 0xff)) +#define RGB_TO_TRUECOLOR(r,g,b) ((((unsigned int)((r) & 0xff00)) << 8) | ((g) & 0xff00) | (((unsigned short)(b)) >> 8)) Image *newImage(unsigned int, unsigned int, unsigned int); void freeImage(Image *); diff --git a/src/libgame/joystick.c b/src/libgame/joystick.c index b286de23..d5a78a29 100644 --- a/src/libgame/joystick.c +++ b/src/libgame/joystick.c @@ -208,7 +208,7 @@ char *getDeviceNameFromJoystickNr(int joystick_nr) static int JoystickPositionPercent(int center, int border, int actual) { - long range, position; + int range, position; int percent; if (border < center && actual > center) diff --git a/src/libgame/misc.c b/src/libgame/misc.c index b8f2fe5c..60dbcf06 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -168,7 +168,7 @@ boolean getTokenValueFromString(char *string, char **token, char **value) /* ------------------------------------------------------------------------- */ #if defined(PLATFORM_MSDOS) -volatile unsigned long counter = 0; +volatile unsigned int counter = 0; void increment_counter() { @@ -185,7 +185,7 @@ END_OF_FUNCTION(increment_counter); #if 1 #ifdef TARGET_SDL -static unsigned long getCurrentMS() +static unsigned int getCurrentMS() { return SDL_GetTicks(); } @@ -193,7 +193,7 @@ static unsigned long getCurrentMS() #else /* !TARGET_SDL */ #if defined(PLATFORM_UNIX) -static unsigned long getCurrentMS() +static unsigned int getCurrentMS() { struct timeval current_time; @@ -204,10 +204,10 @@ static unsigned long getCurrentMS() #endif /* PLATFORM_UNIX */ #endif /* !TARGET_SDL */ -static unsigned long mainCounter(int mode) +static unsigned int mainCounter(int mode) { - static unsigned long base_ms = 0; - unsigned long current_ms; + static unsigned int base_ms = 0; + unsigned int current_ms; /* get current system milliseconds */ current_ms = getCurrentMS(); @@ -223,11 +223,11 @@ static unsigned long mainCounter(int mode) #else #ifdef TARGET_SDL -static unsigned long mainCounter(int mode) +static unsigned int mainCounter(int mode) { - static unsigned long base_ms = 0; - unsigned long current_ms; - unsigned long counter_ms; + static unsigned int base_ms = 0; + unsigned int current_ms; + unsigned int counter_ms; current_ms = SDL_GetTicks(); @@ -243,11 +243,11 @@ static unsigned long mainCounter(int mode) #else /* !TARGET_SDL */ #if defined(PLATFORM_UNIX) -static unsigned long mainCounter(int mode) +static unsigned int mainCounter(int mode) { static struct timeval base_time = { 0, 0 }; struct timeval current_time; - unsigned long counter_ms; + unsigned int counter_ms; gettimeofday(¤t_time, NULL); @@ -276,7 +276,7 @@ void InitCounter() /* set counter back to zero */ #endif } -unsigned long Counter() /* get milliseconds since last call of InitCounter() */ +unsigned int Counter() /* get milliseconds since last call of InitCounter() */ { #if !defined(PLATFORM_MSDOS) return mainCounter(READ_COUNTER); @@ -285,7 +285,7 @@ unsigned long Counter() /* get milliseconds since last call of InitCounter() */ #endif } -static void sleep_milliseconds(unsigned long milliseconds_delay) +static void sleep_milliseconds(unsigned int milliseconds_delay) { boolean do_busy_waiting = (milliseconds_delay < 5 ? TRUE : FALSE); @@ -296,7 +296,7 @@ static void sleep_milliseconds(unsigned long milliseconds_delay) therefore it's better to do a short interval of busy waiting to get our sleeping time more accurate */ - unsigned long base_counter = Counter(), actual_counter = Counter(); + unsigned int base_counter = Counter(), actual_counter = Counter(); while (actual_counter < base_counter + milliseconds_delay && actual_counter >= base_counter) @@ -320,15 +320,15 @@ static void sleep_milliseconds(unsigned long milliseconds_delay) } } -void Delay(unsigned long delay) /* Sleep specified number of milliseconds */ +void Delay(unsigned int delay) /* Sleep specified number of milliseconds */ { sleep_milliseconds(delay); } -boolean FrameReached(unsigned long *frame_counter_var, - unsigned long frame_delay) +boolean FrameReached(unsigned int *frame_counter_var, + unsigned int frame_delay) { - unsigned long actual_frame_counter = FrameCounter; + unsigned int actual_frame_counter = FrameCounter; if (actual_frame_counter >= *frame_counter_var && actual_frame_counter < *frame_counter_var + frame_delay) @@ -339,10 +339,10 @@ boolean FrameReached(unsigned long *frame_counter_var, return TRUE; } -boolean DelayReached(unsigned long *counter_var, - unsigned long delay) +boolean DelayReached(unsigned int *counter_var, + unsigned int delay) { - unsigned long actual_counter = Counter(); + unsigned int actual_counter = Counter(); if (actual_counter >= *counter_var && actual_counter < *counter_var + delay) @@ -353,9 +353,9 @@ boolean DelayReached(unsigned long *counter_var, return TRUE; } -void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) +void WaitUntilDelayReached(unsigned int *counter_var, unsigned int delay) { - unsigned long actual_counter; + unsigned int actual_counter; while (1) { @@ -376,12 +376,12 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) /* random generator functions */ /* ------------------------------------------------------------------------- */ -unsigned int init_random_number(int nr, long seed) +unsigned int init_random_number(int nr, int seed) { if (seed == NEW_RANDOMIZE) { /* default random seed */ - seed = (long)time(NULL); // seconds since the epoch + seed = (int)time(NULL); // seconds since the epoch #if !defined(PLATFORM_WIN32) /* add some more randomness */ @@ -389,12 +389,12 @@ unsigned int init_random_number(int nr, long seed) gettimeofday(¤t_time, NULL); - seed += (long)current_time.tv_usec; // microseconds since the epoch + seed += (int)current_time.tv_usec; // microseconds since the epoch #endif #if defined(TARGET_SDL) /* add some more randomness */ - seed += (long)SDL_GetTicks(); // milliseconds since SDL init + seed += (int)SDL_GetTicks(); // milliseconds since SDL init #endif #if 1 @@ -426,7 +426,7 @@ static char *get_corrected_real_name(char *real_name) char *to_ptr = real_name_new; /* copy the name string, but not more than MAX_USERNAME_LEN characters */ - while (*from_ptr && (long)(to_ptr - real_name_new) < MAX_USERNAME_LEN - 1) + while (*from_ptr && (int)(to_ptr - real_name_new) < MAX_USERNAME_LEN - 1) { /* the name field read from "passwd" file may also contain additional user information, separated by commas, which will be removed here */ @@ -890,7 +890,7 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) options.special_flags = getStringCopy(&option[2]); #else char *flags_string = &option[2]; - unsigned long flags_value; + unsigned int flags_value; if (*flags_string == '\0') Error(ERR_EXIT_HELP, "empty flag ignored"); @@ -1024,7 +1024,7 @@ void Error(int mode, char *format, ...) /* checked memory allocation and freeing functions */ /* ------------------------------------------------------------------------- */ -void *checked_malloc(unsigned long size) +void *checked_malloc(unsigned int size) { void *ptr; @@ -1036,7 +1036,7 @@ void *checked_malloc(unsigned long size) return ptr; } -void *checked_calloc(unsigned long size) +void *checked_calloc(unsigned int size) { void *ptr; @@ -1048,7 +1048,7 @@ void *checked_calloc(unsigned long size) return ptr; } -void *checked_realloc(void *ptr, unsigned long size) +void *checked_realloc(void *ptr, unsigned int size) { ptr = realloc(ptr, size); @@ -1064,7 +1064,7 @@ void checked_free(void *ptr) free(ptr); } -void clear_mem(void *ptr, unsigned long size) +void clear_mem(void *ptr, unsigned int size) { #if defined(PLATFORM_WIN32) /* for unknown reason, memset() sometimes crashes when compiled with MinGW */ @@ -1193,7 +1193,8 @@ boolean getFileChunk(FILE *file, char *chunk_name, int *chunk_size, const int chunk_name_length = 4; /* read chunk name */ - fgets(chunk_name, chunk_name_length + 1, file); + if (fgets(chunk_name, chunk_name_length + 1, file) == NULL) + return FALSE; if (chunk_size != NULL) { @@ -1256,7 +1257,7 @@ int putFileVersion(FILE *file, int version) return 4; } -void ReadBytesFromFile(FILE *file, byte *buffer, unsigned long bytes) +void ReadBytesFromFile(FILE *file, byte *buffer, unsigned int bytes) { int i; @@ -1264,7 +1265,7 @@ void ReadBytesFromFile(FILE *file, byte *buffer, unsigned long bytes) buffer[i] = fgetc(file); } -void WriteBytesToFile(FILE *file, byte *buffer, unsigned long bytes) +void WriteBytesToFile(FILE *file, byte *buffer, unsigned int bytes) { int i; @@ -1272,13 +1273,13 @@ void WriteBytesToFile(FILE *file, byte *buffer, unsigned long bytes) fputc(buffer[i], file); } -void ReadUnusedBytesFromFile(FILE *file, unsigned long bytes) +void ReadUnusedBytesFromFile(FILE *file, unsigned int bytes) { while (bytes-- && !feof(file)) fgetc(file); } -void WriteUnusedBytesToFile(FILE *file, unsigned long bytes) +void WriteUnusedBytesToFile(FILE *file, unsigned int bytes) { while (bytes--) fputc(0, file); @@ -1475,7 +1476,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) while (translate_key[++i].x11name); if (!translate_key[i].x11name) - sprintf(name_buffer, "0x%04lx", (unsigned long)key); + sprintf(name_buffer, "0x%04x", (unsigned int)key); } *x11name = name_buffer; @@ -1552,7 +1553,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) } else if (strPrefix(name_ptr, "0x")) { - unsigned long value = 0; + unsigned int value = 0; name_ptr += 2; @@ -3148,7 +3149,7 @@ void debug_print_timestamp(int counter_nr, char *message) counter[counter_nr][0] = Counter_Microseconds(); #else - static long counter[DEBUG_NUM_TIMESTAMPS][2]; + static int counter[DEBUG_NUM_TIMESTAMPS][2]; char *unit = "s"; counter[counter_nr][0] = Counter(); diff --git a/src/libgame/misc.h b/src/libgame/misc.h index 34499610..b8cdbbdb 100644 --- a/src/libgame/misc.h +++ b/src/libgame/misc.h @@ -80,13 +80,13 @@ int log_2(unsigned int); boolean getTokenValueFromString(char *, char **, char **); void InitCounter(void); -unsigned long Counter(void); -void Delay(unsigned long); -boolean FrameReached(unsigned long *, unsigned long); -boolean DelayReached(unsigned long *, unsigned long); -void WaitUntilDelayReached(unsigned long *, unsigned long); +unsigned int Counter(void); +void Delay(unsigned int); +boolean FrameReached(unsigned int *, unsigned int); +boolean DelayReached(unsigned int *, unsigned int); +void WaitUntilDelayReached(unsigned int *, unsigned int); -unsigned int init_random_number(int, long); +unsigned int init_random_number(int, int); unsigned int get_random_number(int, int); char *getLoginName(void); @@ -121,11 +121,11 @@ void SetError(char *, ...); char *GetError(void); void Error(int, char *, ...); -void *checked_malloc(unsigned long); -void *checked_calloc(unsigned long); -void *checked_realloc(void *, unsigned long); +void *checked_malloc(unsigned int); +void *checked_calloc(unsigned int); +void *checked_realloc(void *, unsigned int); void checked_free(void *); -void clear_mem(void *, unsigned long); +void clear_mem(void *, unsigned int); void swap_numbers(int *, int *); void swap_number_pairs(int *, int *, int *, int *); @@ -142,11 +142,11 @@ int putFileChunk(FILE *, char *, int, int); int getFileVersion(FILE *); int putFileVersion(FILE *, int); -void ReadBytesFromFile(FILE *, byte *, unsigned long); -void WriteBytesToFile(FILE *, byte *, unsigned long); +void ReadBytesFromFile(FILE *, byte *, unsigned int); +void WriteBytesToFile(FILE *, byte *, unsigned int); -void ReadUnusedBytesFromFile(FILE *, unsigned long); -void WriteUnusedBytesToFile(FILE *, unsigned long); +void ReadUnusedBytesFromFile(FILE *, unsigned int); +void WriteUnusedBytesToFile(FILE *, unsigned int); #define getFile8Bit(f) getFile8BitInteger(f) #define putFile8Bit(f,x) putFile8BitInteger(f,x) diff --git a/src/libgame/msdos.c b/src/libgame/msdos.c index 407752bc..c4c6ff4f 100644 --- a/src/libgame/msdos.c +++ b/src/libgame/msdos.c @@ -329,8 +329,8 @@ Display *XOpenDisplay(char *display_name) Window XCreateSimpleWindow(Display *display, Window parent, int x, int y, unsigned int width, unsigned int height, - unsigned int border_width, unsigned long border, - unsigned long background) + unsigned int border_width, unsigned int border, + unsigned int background) { video_bitmap = create_video_bitmap(XRES, YRES); clear_to_color(video_bitmap, background); @@ -381,7 +381,7 @@ void XFree(void *data) checked_free(data); } -GC XCreateGC(Display *display, Drawable d, unsigned long value_mask, +GC XCreateGC(Display *display, Drawable d, unsigned int value_mask, XGCValues *values) { XGCValues *gcv; @@ -811,7 +811,7 @@ int XLookupString(XKeyEvent *key_event, char *buffer, int buffer_size, return 0; } -void XSetForeground(Display *display, GC gc, unsigned long pixel) +void XSetForeground(Display *display, GC gc, unsigned int pixel) { XGCValues *gcv = (XGCValues *)gc; diff --git a/src/libgame/msdos.h b/src/libgame/msdos.h index 95e0dbc0..9d6a2155 100644 --- a/src/libgame/msdos.h +++ b/src/libgame/msdos.h @@ -555,7 +555,7 @@ #define BlackPixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->black_pixel) #define WhitePixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->white_pixel) #define RootWindow(dpy, scr) (ScreenOfDisplay(dpy,scr)->root) -#define AllPlanes ((unsigned long)~0L) +#define AllPlanes ((unsigned int)~0L) #define DefaultVisual(dpy, scr) (NULL) #define DefaultDepth(dpy, scr) (NULL) @@ -565,8 +565,8 @@ #define XGetPixel(ximage, x, y) \ ((*((ximage)->f.get_pixel))((ximage), (x), (y))) -typedef unsigned long Pixel; /* Index into colormap */ -typedef unsigned long XID; +typedef unsigned int Pixel; /* Index into colormap */ +typedef unsigned int XID; typedef XID Window; typedef XID Drawable; typedef XID Pixmap; @@ -574,9 +574,9 @@ typedef XID Colormap; typedef XID KeySym; typedef XID GContext; typedef struct _XDisplay Display; -typedef long Visual; -typedef long XVisualInfo; -typedef long Atom; +typedef int Visual; +typedef int XVisualInfo; +typedef int Atom; typedef int Status; typedef int Bool; typedef int XComposeStatus; /* we don't need the real type */ @@ -590,8 +590,8 @@ typedef struct { Colormap cmap; /* default color map */ Window root; /* root window id */ - unsigned long white_pixel; /* white pixel value */ - unsigned long black_pixel; /* black pixel value */ + unsigned int white_pixel; /* white pixel value */ + unsigned int black_pixel; /* black pixel value */ int x; int y; unsigned int width; @@ -610,13 +610,13 @@ typedef struct _XImage { struct funcs { - unsigned long (*get_pixel) (struct _XImage *, int, int); + unsigned int (*get_pixel) (struct _XImage *, int, int); } f; } XImage; typedef struct { - long flags; /* marks which fields in this structure are defined */ + int flags; /* marks which fields in this structure are defined */ int width, height; /* should set so old wm's don't mess up */ int min_width, min_height; int max_width, max_height; @@ -624,7 +624,7 @@ typedef struct typedef struct { - long flags; /* marks which fields in this structure are defined */ + int flags; /* marks which fields in this structure are defined */ Bool input; /* does this application rely on the window manager to get keyboard input? */ int initial_state; /* see below */ @@ -645,13 +645,13 @@ typedef struct typedef struct { - unsigned long foreground; /* foreground pixel */ - unsigned long background; /* background pixel */ + unsigned int foreground; /* foreground pixel */ + unsigned int background; /* background pixel */ Bool graphics_exposures; /* boolean, should exposures be generated */ Pixmap clip_mask; /* bitmap clipping; other calls for rects */ int clip_x_origin; /* x origin for clipping */ int clip_y_origin; /* y origin for clipping */ - unsigned long value_mask; + unsigned int value_mask; int line_width; /* line width */ int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ int cap_style; /* CapNotLast, CapButt, @@ -711,10 +711,10 @@ void XMapWindow(Display *, Window); Display *XOpenDisplay(char *); Window XCreateSimpleWindow(Display *, Window, int, int, unsigned int, unsigned int, unsigned int, - unsigned long, unsigned long); + unsigned int, unsigned int); Status XStringListToTextProperty(char **, int, XTextProperty *); void XFree(void *); -GC XCreateGC(Display *, Drawable, unsigned long, XGCValues *); +GC XCreateGC(Display *, Drawable, unsigned int, XGCValues *); void XSetClipMask(Display *, GC, Pixmap); void XSetClipOrigin(Display *, GC, int, int); void XFillRectangle(Display *, Drawable, GC, int, int, @@ -735,7 +735,7 @@ void XNextEvent(Display *, XEvent *); int XPending(Display *); KeySym XLookupKeysym(XKeyEvent *, int); int XLookupString(XKeyEvent *, char *, int, KeySym *, XComposeStatus *); -void XSetForeground(Display *, GC, unsigned long); +void XSetForeground(Display *, GC, unsigned int); void XDrawLine(Display *, Drawable, GC, int, int, int, int); void XDestroyImage(XImage *); void XDestroyWindow(Display *, Window); diff --git a/src/libgame/random.c b/src/libgame/random.c index 92f6ca3a..099fe72b 100644 --- a/src/libgame/random.c +++ b/src/libgame/random.c @@ -129,7 +129,7 @@ position of the rear pointer is just (MAX_TYPES * (rptr - state)) + TYPE_3 == TYPE_3. */ -static long int randtbl_0[DEG_3 + 1] = +static int randtbl_0[DEG_3 + 1] = { TYPE_3, -851904987, -43806228, -2029755270, 1390239686, -1912102820, @@ -139,7 +139,7 @@ static long int randtbl_0[DEG_3 + 1] = -607508183, -205999574, -1696891592, 1492211999, -1528267240, -952028296, -189082757, 362343714, 1424981831, 2039449641, }; -static long int randtbl_1[DEG_3 + 1] = +static int randtbl_1[DEG_3 + 1] = { TYPE_3, -851904987, -43806228, -2029755270, 1390239686, -1912102820, @@ -161,8 +161,8 @@ static long int randtbl_1[DEG_3 + 1] = in the initialization of randtbl) because the state table pointer is set to point to randtbl[1] (as explained below).) */ -static long int *fptr[2] = { &randtbl_0[SEP_3 + 1], &randtbl_1[SEP_3 + 1] }; -static long int *rptr[2] = { &randtbl_0[1], &randtbl_1[1] }; +static int *fptr[2] = { &randtbl_0[SEP_3 + 1], &randtbl_1[SEP_3 + 1] }; +static int *rptr[2] = { &randtbl_0[1], &randtbl_1[1] }; @@ -176,13 +176,13 @@ static long int *rptr[2] = { &randtbl_0[1], &randtbl_1[1] }; indexing every time to find the address of the last element to see if the front and rear pointers have wrapped. */ -static long int *state[2] = { &randtbl_0[1], &randtbl_1[1] }; +static int *state[2] = { &randtbl_0[1], &randtbl_1[1] }; static int rand_type[2] = { TYPE_3, TYPE_3 }; static int rand_deg[2] = { DEG_3, DEG_3 }; static int rand_sep[2] = { SEP_3, SEP_3 }; -static long int *end_ptr[2] = +static int *end_ptr[2] = { &randtbl_0[sizeof(randtbl_0) / sizeof(randtbl_0[0])], &randtbl_1[sizeof(randtbl_1) / sizeof(randtbl_1[0])] @@ -203,7 +203,7 @@ void srandom_linux_libc(int nr, unsigned int x) if (rand_type[nr] != TYPE_0) { - register long int i; + register int i; for (i = 1; i < rand_deg[nr]; ++i) state[nr][i] = (1103515145 * state[nr][i - 1]) + 12345; @@ -227,21 +227,21 @@ void srandom_linux_libc(int nr, unsigned int x) rear pointers can't wrap on the same call by not testing the rear pointer if the front one has wrapped. Returns a 31-bit random number. */ -long int random_linux_libc(int nr) +int random_linux_libc(int nr) { if (rand_type[nr] == TYPE_0) { - state[nr][0] = ((state[nr][0] * 1103515245) + 12345) & LONG_MAX; + state[nr][0] = ((state[nr][0] * 1103515245) + 12345) & INT_MAX; return state[nr][0]; } else { - long int i; + int i; *fptr[nr] += *rptr[nr]; /* Chucking least random bit. */ - i = (*fptr[nr] >> 1) & LONG_MAX; + i = (*fptr[nr] >> 1) & INT_MAX; fptr[nr]++; if (fptr[nr] >= end_ptr[nr]) diff --git a/src/libgame/random.h b/src/libgame/random.h index bde1214d..98b101f1 100644 --- a/src/libgame/random.h +++ b/src/libgame/random.h @@ -15,6 +15,6 @@ #define RANDOM_H void srandom_linux_libc(int, unsigned int); -long int random_linux_libc(int); +int random_linux_libc(int); #endif diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 4c484243..3774b320 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -1334,12 +1334,17 @@ int zoomSurfaceRGBA_scaleDownBy2(SDL_Surface *src, SDL_Surface *dst) { int x, y; tColorRGBA *sp, *csp, *dp; - int sgap, dgap; +#if 0 + int sgap; +#endif + int dgap; /* pointer setup */ sp = csp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; +#if 0 sgap = src->pitch - src->w * 4; +#endif dgap = dst->pitch - dst->w * 4; for (y = 0; y < dst->h; y++) @@ -1386,7 +1391,10 @@ int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) { int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy; tColorRGBA *sp, *csp, *dp; - int sgap, dgap; +#if 0 + int sgap; +#endif + int dgap; /* use specialized zoom function when scaling down to exactly half size */ if (src->w == 2 * dst->w && @@ -1425,7 +1433,9 @@ int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) /* pointer setup */ sp = csp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; +#if 0 sgap = src->pitch - src->w * 4; +#endif dgap = dst->pitch - dst->w * 4; csay = say; diff --git a/src/libgame/setup.c b/src/libgame/setup.c index b7e34adf..fe4c98ba 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -1630,6 +1630,7 @@ SetupFileList *addListEntry(SetupFileList *list, char *token, char *value) return addListEntry(list->next, token, value); } +#if 0 #ifdef DEBUG static void printSetupFileList(SetupFileList *list) { @@ -1642,6 +1643,7 @@ static void printSetupFileList(SetupFileList *list) printSetupFileList(list->next); } #endif +#endif #ifdef DEBUG DEFINE_HASHTABLE_INSERT(insert_hash_entry, char, char); @@ -2679,7 +2681,7 @@ static TreeInfo *getTreeInfoCopy(TreeInfo *ti) return ti_copy; } -static void freeTreeInfo(TreeInfo *ti) +void freeTreeInfo(TreeInfo *ti) { if (ti == NULL) return; @@ -3061,8 +3063,8 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, char *directory_name) { #if 0 - static unsigned long progress_delay = 0; - unsigned long progress_delay_value = 100; /* (in milliseconds) */ + static unsigned int progress_delay = 0; + unsigned int progress_delay_value = 100; /* (in milliseconds) */ #endif char *directory_path = getPath2(level_directory, directory_name); char *filename = getPath2(directory_path, LEVELINFO_FILENAME); @@ -3625,8 +3627,8 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, LevelDirTree *level_node) { #if 0 - static unsigned long progress_delay = 0; - unsigned long progress_delay_value = 100; /* (in milliseconds) */ + static unsigned int progress_delay = 0; + unsigned int progress_delay_value = 100; /* (in milliseconds) */ #endif int type = (*artwork_node)->type; @@ -3977,7 +3979,9 @@ static void checkSeriesInfo() { static char *level_directory = NULL; DIR *dir; +#if 0 struct dirent *dir_entry; +#endif /* check for more levels besides the 'levels' field of 'levelinfo.conf' */ @@ -3989,9 +3993,11 @@ static void checkSeriesInfo() if ((dir = opendir(level_directory)) == NULL) { Error(ERR_WARN, "cannot read level directory '%s'", level_directory); + return; } +#if 0 while ((dir_entry = readdir(dir)) != NULL) /* last directory entry */ { if (strlen(dir_entry->d_name) > 4 && @@ -4006,7 +4012,6 @@ static void checkSeriesInfo() levelnum_value = atoi(levelnum_str); -#if 0 if (levelnum_value < leveldir_current->first_level) { Error(ERR_WARN, "additional level %d found", levelnum_value); @@ -4017,9 +4022,9 @@ static void checkSeriesInfo() Error(ERR_WARN, "additional level %d found", levelnum_value); leveldir_current->last_level = levelnum_value; } -#endif } } +#endif closedir(dir); } @@ -4029,10 +4034,17 @@ void LoadLevelSetup_SeriesInfo() char *filename; SetupFileHash *level_setup_hash = NULL; char *level_subdir = leveldir_current->subdir; + int i; /* always start with reliable default values */ level_nr = leveldir_current->first_level; + for (i = 0; i < MAX_LEVELS; i++) + { + LevelStats_setPlayed(i, 0); + LevelStats_setSolved(i, 0); + } + checkSeriesInfo(leveldir_current); /* ----------------------------------------------------------------------- */ @@ -4047,6 +4059,8 @@ void LoadLevelSetup_SeriesInfo() { char *token_value; + /* get last played level in this level set */ + token_value = getHashEntry(level_setup_hash, TOKEN_STR_LAST_PLAYED_LEVEL); if (token_value) @@ -4059,6 +4073,8 @@ void LoadLevelSetup_SeriesInfo() level_nr = leveldir_current->last_level; } + /* get handicap level in this level set */ + token_value = getHashEntry(level_setup_hash, TOKEN_STR_HANDICAP_LEVEL); if (token_value) @@ -4076,6 +4092,31 @@ void LoadLevelSetup_SeriesInfo() leveldir_current->handicap_level = level_nr; } + /* get number of played and solved levels in this level set */ + + BEGIN_HASH_ITERATION(level_setup_hash, itr) + { + char *token = HASH_ITERATION_TOKEN(itr); + char *value = HASH_ITERATION_VALUE(itr); + + if (strlen(token) == 3 && + token[0] >= '0' && token[0] <= '9' && + token[1] >= '0' && token[1] <= '9' && + token[2] >= '0' && token[2] <= '9') + { + int level_nr = atoi(token); + + if (value != NULL) + LevelStats_setPlayed(level_nr, atoi(value)); /* read 1st column */ + + value = strchr(value, ' '); + + if (value != NULL) + LevelStats_setSolved(level_nr, atoi(value)); /* read 2nd column */ + } + } + END_HASH_ITERATION(hash, itr) + checkSetupFileHashIdentifier(level_setup_hash, filename, getCookie("LEVELSETUP")); @@ -4094,6 +4135,7 @@ void SaveLevelSetup_SeriesInfo() char *level_nr_str = int2str(level_nr, 0); char *handicap_level_str = int2str(leveldir_current->handicap_level, 0); FILE *file; + int i; /* ----------------------------------------------------------------------- */ /* ~/./levelsetup//levelsetup.conf */ @@ -4114,8 +4156,24 @@ void SaveLevelSetup_SeriesInfo() getCookie("LEVELSETUP"))); fprintf(file, "%s\n", getFormattedSetupEntry(TOKEN_STR_LAST_PLAYED_LEVEL, level_nr_str)); - fprintf(file, "%s\n", getFormattedSetupEntry(TOKEN_STR_HANDICAP_LEVEL, - handicap_level_str)); + fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_HANDICAP_LEVEL, + handicap_level_str)); + + for (i = leveldir_current->first_level; i <= leveldir_current->last_level; + i++) + { + if (LevelStats_getPlayed(i) > 0 || + LevelStats_getSolved(i) > 0) + { + char token[16]; + char value[16]; + + sprintf(token, "%03d", i); + sprintf(value, "%d %d", LevelStats_getPlayed(i), LevelStats_getSolved(i)); + + fprintf(file, "%s\n", getFormattedSetupEntry(token, value)); + } + } fclose(file); @@ -4123,3 +4181,37 @@ void SaveLevelSetup_SeriesInfo() free(filename); } + +int LevelStats_getPlayed(int nr) +{ + return (nr >= 0 && nr < MAX_LEVELS ? level_stats[nr].played : 0); +} + +int LevelStats_getSolved(int nr) +{ + return (nr >= 0 && nr < MAX_LEVELS ? level_stats[nr].solved : 0); +} + +void LevelStats_setPlayed(int nr, int value) +{ + if (nr >= 0 && nr < MAX_LEVELS) + level_stats[nr].played = value; +} + +void LevelStats_setSolved(int nr, int value) +{ + if (nr >= 0 && nr < MAX_LEVELS) + level_stats[nr].solved = value; +} + +void LevelStats_incPlayed(int nr) +{ + if (nr >= 0 && nr < MAX_LEVELS) + level_stats[nr].played++; +} + +void LevelStats_incSolved(int nr) +{ + if (nr >= 0 && nr < MAX_LEVELS) + level_stats[nr].solved++; +} diff --git a/src/libgame/setup.h b/src/libgame/setup.h index b0b6a8d2..c667c348 100644 --- a/src/libgame/setup.h +++ b/src/libgame/setup.h @@ -266,6 +266,7 @@ void sortTreeInfoBySortFunction(TreeInfo **, int (*compare_function)(const void *, const void *)); void sortTreeInfo(TreeInfo **); +void freeTreeInfo(TreeInfo *); char *getHomeDir(void); char *getCommonDataDir(void); @@ -319,4 +320,11 @@ void SaveLevelSetup_LastSeries(void); void LoadLevelSetup_SeriesInfo(void); void SaveLevelSetup_SeriesInfo(void); +int LevelStats_getPlayed(int); +int LevelStats_getSolved(int); +void LevelStats_setPlayed(int, int); +void LevelStats_setSolved(int, int); +void LevelStats_incPlayed(int); +void LevelStats_incSolved(int); + #endif /* MISC_H */ diff --git a/src/libgame/sound.c b/src/libgame/sound.c index d620dd93..ff42562a 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "platform.h" @@ -75,8 +76,8 @@ struct SoundHeader_WAV { unsigned short compression_code; unsigned short num_channels; - unsigned long sample_rate; - unsigned long bytes_per_second; + unsigned int sample_rate; + unsigned int bytes_per_second; unsigned short block_align; unsigned short bits_per_sample; }; @@ -98,7 +99,7 @@ struct SampleInfo int type; int format; void *data_ptr; /* pointer to first sample (8 or 16 bit) */ - long data_len; /* number of samples, NOT number of bytes */ + int data_len; /* number of samples, NOT number of bytes */ int num_channels; /* mono: 1 channel, stereo: 2 channels */ }; typedef struct SampleInfo SoundInfo; @@ -114,13 +115,13 @@ struct SoundControl int state; - unsigned long playing_starttime; - unsigned long playing_pos; + unsigned int playing_starttime; + unsigned int playing_pos; int type; int format; void *data_ptr; /* pointer to first sample (8 or 16 bit) */ - long data_len; /* number of samples, NOT number of bytes */ + int data_len; /* number of samples, NOT number of bytes */ int num_channels; /* mono: 1 channel, stereo: 2 channels */ #if defined(TARGET_ALLEGRO) @@ -468,11 +469,11 @@ static void WriteReloadInfoToPipe(char *set_identifier, int type) SoundControl snd_ctrl; TreeInfo *ti = (type == SND_CTRL_RELOAD_SOUNDS ? artwork.snd_current : artwork.mus_current); - unsigned long str_size1 = strlen(leveldir_current->fullpath) + 1; - unsigned long str_size2 = strlen(leveldir_current->sounds_path) + 1; - unsigned long str_size3 = strlen(leveldir_current->music_path) + 1; - unsigned long str_size4 = strlen(ti->basepath) + 1; - unsigned long str_size5 = strlen(ti->fullpath) + 1; + unsigned int str_size1 = strlen(leveldir_current->fullpath) + 1; + unsigned int str_size2 = strlen(leveldir_current->sounds_path) + 1; + unsigned int str_size3 = strlen(leveldir_current->music_path) + 1; + unsigned int str_size4 = strlen(ti->basepath) + 1; + unsigned int str_size5 = strlen(ti->fullpath) + 1; boolean override_level_artwork = (type == SND_CTRL_RELOAD_SOUNDS ? gfx.override_level_sounds : gfx.override_level_music); @@ -500,15 +501,15 @@ static void WriteReloadInfoToPipe(char *set_identifier, int type) write(audio.mixer_pipe[1], ti, sizeof(TreeInfo)) < 0 || write(audio.mixer_pipe[1], &str_size1, - sizeof(unsigned long)) < 0 || + sizeof(unsigned int)) < 0 || write(audio.mixer_pipe[1], &str_size2, - sizeof(unsigned long)) < 0 || + sizeof(unsigned int)) < 0 || write(audio.mixer_pipe[1], &str_size3, - sizeof(unsigned long)) < 0 || + sizeof(unsigned int)) < 0 || write(audio.mixer_pipe[1], &str_size4, - sizeof(unsigned long)) < 0 || + sizeof(unsigned int)) < 0 || write(audio.mixer_pipe[1], &str_size5, - sizeof(unsigned long)) < 0 || + sizeof(unsigned int)) < 0 || write(audio.mixer_pipe[1], leveldir_current->fullpath, str_size1) < 0 || write(audio.mixer_pipe[1], leveldir_current->sounds_path, @@ -531,7 +532,7 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) TreeInfo **ti_ptr = ((snd_ctrl->state & SND_CTRL_RELOAD_SOUNDS) ? &artwork.snd_current : &artwork.mus_current); TreeInfo *ti = *ti_ptr; - unsigned long str_size1, str_size2, str_size3, str_size4, str_size5; + unsigned int str_size1, str_size2, str_size3, str_size4, str_size5; static char *set_identifier = NULL; boolean *override_level_artwork = (snd_ctrl->state & SND_CTRL_RELOAD_SOUNDS ? &gfx.override_level_sounds : @@ -562,15 +563,15 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) read(audio.mixer_pipe[0], ti, sizeof(TreeInfo)) != sizeof(TreeInfo) || read(audio.mixer_pipe[0], &str_size1, - sizeof(unsigned long)) != sizeof(unsigned long) || + sizeof(unsigned int)) != sizeof(unsigned int) || read(audio.mixer_pipe[0], &str_size2, - sizeof(unsigned long)) != sizeof(unsigned long) || + sizeof(unsigned int)) != sizeof(unsigned int) || read(audio.mixer_pipe[0], &str_size3, - sizeof(unsigned long)) != sizeof(unsigned long) || + sizeof(unsigned int)) != sizeof(unsigned int) || read(audio.mixer_pipe[0], &str_size4, - sizeof(unsigned long)) != sizeof(unsigned long) || + sizeof(unsigned int)) != sizeof(unsigned int) || read(audio.mixer_pipe[0], &str_size5, - sizeof(unsigned long)) != sizeof(unsigned long)) + sizeof(unsigned int)) != sizeof(unsigned int)) Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); leveldir_current->fullpath = checked_calloc(str_size1); @@ -874,7 +875,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) /* don't play sound more than n times simultaneously (with n == 2 for now) */ if (k >= 2) { - unsigned long playing_current = Counter(); + unsigned int playing_current = Counter(); int longest = 0, longest_nr = audio.first_sound_channel; /* look for oldest equal sound */ @@ -925,7 +926,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) if (mixer_active_channels == audio.num_channels - (mixer[audio.music_channel].active ? 0 : 1)) { - unsigned long playing_current = Counter(); + unsigned int playing_current = Counter(); int longest = 0, longest_nr = audio.first_sound_channel; #if 0 @@ -933,8 +934,8 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) /* print some debugging information about audio channel usage */ for (i = audio.first_sound_channel; i < audio.num_channels; i++) { - Error(ERR_INFO, "Mixer_InsertSound: %d [%d]: %ld (%ld)", - i, mixer[i].active, mixer[i].data_len, (long)mixer[i].data_ptr); + Error(ERR_INFO, "Mixer_InsertSound: %d [%d]: %d (%d)", + i, mixer[i].active, mixer[i].data_len, (int)mixer[i].data_ptr); } #endif #endif @@ -1120,7 +1121,7 @@ static void CopySampleToMixingBuffer(SoundControl *snd_ctrl, static void Mixer_Main_DSP() { static short premix_first_buffer[DEFAULT_AUDIO_FRAGMENT_SIZE]; - static long premix_last_buffer[DEFAULT_AUDIO_FRAGMENT_SIZE]; + static int premix_last_buffer[DEFAULT_AUDIO_FRAGMENT_SIZE]; static byte playing_buffer[DEFAULT_AUDIO_FRAGMENT_SIZE]; boolean stereo; int fragment_size; @@ -1148,11 +1149,11 @@ static void Mixer_Main_DSP() /* first clear the last premixing buffer */ clear_mem(premix_last_buffer, - max_sample_size * num_output_channels * sizeof(long)); + max_sample_size * num_output_channels * sizeof(int)); for (i = 0; i < audio.num_channels; i++) { - void *sample_ptr; + // void *sample_ptr; int sample_len; int sample_pos; int sample_size; @@ -1167,7 +1168,7 @@ static void Mixer_Main_DSP() } /* pointer, lenght and actual playing position of sound sample */ - sample_ptr = mixer[i].data_ptr; + // sample_ptr = mixer[i].data_ptr; sample_len = mixer[i].data_len; sample_pos = mixer[i].playing_pos; sample_size = MIN(max_sample_size, sample_len - sample_pos); @@ -1203,7 +1204,7 @@ static void Mixer_Main_DSP() if (mixer[i].volume != SOUND_MAX_VOLUME) for (j = 0; j < sample_size * num_output_channels; j++) premix_first_buffer[j] = - mixer[i].volume * (long)premix_first_buffer[j] / SOUND_MAX_VOLUME; + mixer[i].volume * (int)premix_first_buffer[j] / SOUND_MAX_VOLUME; /* adjust left and right channel volume due to stereo sound position */ if (stereo) @@ -1265,7 +1266,8 @@ static void Mixer_Main_DSP() } /* finally play the sound fragment */ - write(audio.device_fd, playing_buffer, fragment_size); + if (write(audio.device_fd, playing_buffer, fragment_size) == -1) + Error(ERR_WARN, "write() failed; %s", strerror(errno)); if (!mixer_active_channels) CloseAudioDevice(&audio.device_fd); @@ -1302,7 +1304,7 @@ static int Mixer_Main_SimpleAudio(SoundControl snd_ctrl) if (mixer[i].volume != SOUND_MAX_VOLUME) for (j = 0; j < sample_size; j++) premix_first_buffer[j] = - mixer[i].volume * (long)premix_first_buffer[j] / SOUND_MAX_VOLUME; + mixer[i].volume * (int)premix_first_buffer[j] / SOUND_MAX_VOLUME; /* might be needed for u-law /dev/audio */ for (j = 0; j < sample_size; j++) @@ -1648,8 +1650,8 @@ static void *Load_WAV(char *filename) printf("WAV file: '%s'\n", filename); printf(" Compression code: %d'\n", header.compression_code); printf(" Number of channels: %d'\n", header.num_channels); - printf(" Sample rate: %ld'\n", header.sample_rate); - printf(" Average bytes per second: %ld'\n", header.bytes_per_second); + printf(" Sample rate: %d'\n", header.sample_rate); + printf(" Average bytes per second: %d'\n", header.bytes_per_second); printf(" Block align: %d'\n", header.block_align); printf(" Significant bits per sample: %d'\n", header.bits_per_sample); #endif diff --git a/src/libgame/system.c b/src/libgame/system.c index 4b7a3cad..51e8df89 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -46,6 +46,8 @@ LevelDirTree *leveldir_first = NULL; LevelDirTree *leveldir_current = NULL; int level_nr; +struct LevelStats level_stats[MAX_LEVELS]; + Display *display = NULL; Visual *visual = NULL; int screen = 0; @@ -244,6 +246,8 @@ void SetDrawBackgroundMask(int draw_background_mask) gfx.draw_background_mask = draw_background_mask; } +#if 0 + static void DrawBitmapFromTile(Bitmap *bitmap, Bitmap *tile, int dest_x, int dest_y, int width, int height) { @@ -300,6 +304,39 @@ void SetBackgroundBitmap(Bitmap *background_bitmap_tile, int mask) } } +#else + +void SetBackgroundBitmap(Bitmap *background_bitmap_tile, int mask) +{ + if (background_bitmap_tile != NULL) + gfx.background_bitmap_mask |= mask; + else + gfx.background_bitmap_mask &= ~mask; + +#if 0 + if (gfx.background_bitmap == NULL) + gfx.background_bitmap = CreateBitmap(video.width, video.height, + DEFAULT_DEPTH); +#endif + + if (background_bitmap_tile == NULL) /* empty background requested */ + return; + + if (mask == REDRAW_ALL) + BlitBitmapTiled(background_bitmap_tile, gfx.background_bitmap, 0, 0, 0, 0, + 0, 0, video.width, video.height); + else if (mask == REDRAW_FIELD) + BlitBitmapTiled(background_bitmap_tile, gfx.background_bitmap, 0, 0, 0, 0, + gfx.real_sx, gfx.real_sy, gfx.full_sxsize, gfx.full_sysize); + else if (mask == REDRAW_DOOR_1) + { + BlitBitmapTiled(background_bitmap_tile, gfx.background_bitmap, 0, 0, 0, 0, + gfx.dx, gfx.dy, gfx.dxsize, gfx.dysize); + } +} + +#endif + void SetWindowBackgroundBitmap(Bitmap *background_bitmap_tile) { /* remove every mask before setting mask for window */ @@ -701,10 +738,43 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap, #endif #endif +#if 0 + if (dst_x < gfx.sx + gfx.sxsize) + printf("::: %d: BlitBitmap(%d, %d, %d, %d)\n", + FrameCounter, dst_x, dst_y, width, height); +#endif + sysCopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE); } +void BlitBitmapTiled(Bitmap *src_bitmap, Bitmap *dst_bitmap, + int src_x, int src_y, int src_width, int src_height, + int dst_x, int dst_y, int dst_width, int dst_height) +{ + int src_xsize = (src_width == 0 ? src_bitmap->width : src_width); + int src_ysize = (src_height == 0 ? src_bitmap->height : src_height); + int dst_xsize = dst_width; + int dst_ysize = dst_height; + int src_xsteps = (dst_xsize + src_xsize - 1) / src_xsize; + int src_ysteps = (dst_ysize + src_ysize - 1) / src_ysize; + int x, y; + + for (y = 0; y < src_ysteps; y++) + { + for (x = 0; x < src_xsteps; x++) + { + int draw_x = dst_x + x * src_xsize; + int draw_y = dst_y + y * src_ysize; + int draw_xsize = MIN(src_xsize, dst_xsize - x * src_xsize); + int draw_ysize = MIN(src_ysize, dst_ysize - y * src_ysize); + + BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, draw_xsize, draw_ysize, + draw_x, draw_y); + } + } +} + void FadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, int fade_mode, int fade_delay, int post_delay, void (*draw_border_function)(void)) @@ -1110,7 +1180,9 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, int width_4, height_4; int width_8, height_8; int width_16, height_16; +#if 0 int width_32, height_32; +#endif int new_width, new_height; /* calculate new image dimensions for normal sized image */ @@ -1141,8 +1213,10 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, height_8 = height_1 / 8; width_16 = width_1 / 16; height_16 = height_1 / 16; +#if 0 width_32 = width_1 / 32; height_32 = height_1 / 32; +#endif UPDATE_BUSY_STATE(); diff --git a/src/libgame/system.h b/src/libgame/system.h index 4383b60b..11670c69 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -73,6 +73,7 @@ #define DEFAULT_KEY_FOCUS_PLAYER_4 KSYM_F8 #define DEFAULT_KEY_FOCUS_PLAYER_ALL KSYM_F9 #define DEFAULT_KEY_TAPE_EJECT KSYM_UNDEFINED +#define DEFAULT_KEY_TAPE_EXTRA KSYM_UNDEFINED #define DEFAULT_KEY_TAPE_STOP KSYM_UNDEFINED #define DEFAULT_KEY_TAPE_PAUSE KSYM_UNDEFINED #define DEFAULT_KEY_TAPE_RECORD KSYM_UNDEFINED @@ -284,7 +285,18 @@ REDRAW_TILES | \ REDRAW_MICROLEVEL) #define REDRAW_FPS (1 << 11) + +#if defined(TARGET_X11) +/* on old-style, classic and potentially slow graphics systems, redraw single + tiles instead of the whole playfield unless a certain threshold is reached; + when using the X11 target, this method should still be fast on all systems */ #define REDRAWTILES_THRESHOLD (SCR_FIELDX * SCR_FIELDY / 2) +#else +/* on modern graphics systems and when using the SDL target, this tile redraw + optimization can slow things down a lot due to many small blits compared to + one single playfield-sized blit (especially observed on Mac OS X with SDL) */ +#define REDRAWTILES_THRESHOLD 0 +#endif #define IN_GFX_SCREEN(x, y) (x >= gfx.sx && x < gfx.sx + gfx.sxsize && \ y >= gfx.sy && y < gfx.sy + gfx.sysize) @@ -303,6 +315,7 @@ #define GAME_FRAME_DELAY 20 /* frame delay in milliseconds */ #define FFWD_FRAME_DELAY 10 /* 200% speed for fast forward */ #define FRAMES_PER_SECOND (ONE_SECOND_DELAY / GAME_FRAME_DELAY) +#define FRAMES_PER_SECOND_SP 35 /* maximum playfield size supported by libgame functions */ #define MAX_PLAYFIELD_WIDTH 128 @@ -314,6 +327,9 @@ /* maximum allowed length of player name */ #define MAX_PLAYER_NAME_LEN 10 +/* maximum number of levels in a level set */ +#define MAX_LEVELS 1000 + /* default name for empty highscore entry */ #define EMPTY_PLAYER_NAME "no name" @@ -502,16 +518,20 @@ #define TREE_TYPE_SOUNDS_DIR ARTWORK_TYPE_SOUNDS #define TREE_TYPE_MUSIC_DIR ARTWORK_TYPE_MUSIC #define TREE_TYPE_LEVEL_DIR 3 +#define TREE_TYPE_LEVEL_NR 4 -#define NUM_TREE_TYPES 4 +#define NUM_TREE_TYPES 5 #define INFOTEXT_UNDEFINED "" #define INFOTEXT_GRAPHICS_DIR "Custom Graphics" #define INFOTEXT_SOUNDS_DIR "Custom Sounds" #define INFOTEXT_MUSIC_DIR "Custom Music" #define INFOTEXT_LEVEL_DIR "Level Sets" +#define INFOTEXT_LEVEL_NR "Levels" -#define TREE_INFOTEXT(t) ((t) == TREE_TYPE_LEVEL_DIR ? \ +#define TREE_INFOTEXT(t) ((t) == TREE_TYPE_LEVEL_NR ? \ + INFOTEXT_LEVEL_NR : \ + (t) == TREE_TYPE_LEVEL_DIR ? \ INFOTEXT_LEVEL_DIR : \ (t) == TREE_TYPE_GRAPHICS_DIR ? \ INFOTEXT_GRAPHICS_DIR : \ @@ -863,6 +883,7 @@ struct SetupShortcutInfo Key focus_player_all; Key tape_eject; + Key tape_extra; Key tape_stop; Key tape_pause; Key tape_record; @@ -914,6 +935,7 @@ struct SetupInfo boolean prefer_aga_graphics; int game_frame_delay; boolean sp_show_border_elements; + boolean small_game_graphics; char *graphics_set; char *sounds_set; @@ -1151,6 +1173,12 @@ struct TextPosInfo int id; }; +struct LevelStats +{ + int played; + int solved; +}; + /* ========================================================================= */ /* exported variables */ @@ -1171,6 +1199,8 @@ extern LevelDirTree *leveldir_first; extern LevelDirTree *leveldir_current; extern int level_nr; +extern struct LevelStats level_stats[]; + extern Display *display; extern Visual *visual; extern int screen; @@ -1220,6 +1250,7 @@ Bitmap *CreateBitmap(int, int, int); void ReCreateBitmap(Bitmap **, int, int, int); void FreeBitmap(Bitmap *); void BlitBitmap(Bitmap *, Bitmap *, int, int, int, int, int, int); +void BlitBitmapTiled(Bitmap *, Bitmap *, int, int, int, int, int, int, int,int); void FadeRectangle(Bitmap *bitmap, int, int, int, int, int, int, int, void (*draw_border_function)(void)); void FillRectangle(Bitmap *, int, int, int, int, Pixel); diff --git a/src/libgame/text.c b/src/libgame/text.c index 23de7cac..9d4d1193 100644 --- a/src/libgame/text.c +++ b/src/libgame/text.c @@ -28,7 +28,7 @@ static GC font_clip_gc = None; static void InitFontClipmasks() { XGCValues clip_gc_values; - unsigned long clip_gc_valuemask; + unsigned int clip_gc_valuemask; GC copy_clipmask_gc; int i, j; @@ -210,8 +210,8 @@ int maxWordLengthInString(char *text) void DrawInitTextExt(char *text, int ypos, int font_nr, boolean force) { - static unsigned long progress_delay = 0; - unsigned long progress_delay_value = 100; /* (in milliseconds) */ + static unsigned int progress_delay = 0; + unsigned int progress_delay_value = 100; /* (in milliseconds) */ UPDATE_BUSY_STATE(); diff --git a/src/libgame/toons.c b/src/libgame/toons.c index 300ae70b..264cda43 100644 --- a/src/libgame/toons.c +++ b/src/libgame/toons.c @@ -186,13 +186,13 @@ void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc, boolean AnimateToon(int toon_nr, boolean restart) { - static unsigned long animation_frame_counter = 0; + static unsigned int animation_frame_counter = 0; static int pos_x = 0, pos_y = 0; static int delta_x = 0, delta_y = 0; static int frame = 0; static boolean horiz_move, vert_move; - static unsigned long anim_delay = 0; - static unsigned long anim_delay_value = 0; + static unsigned int anim_delay = 0; + static unsigned int anim_delay_value = 0; static int width,height; static int pad_x,pad_y; static int cut_x,cut_y; @@ -342,8 +342,8 @@ boolean AnimateToon(int toon_nr, boolean restart) void HandleAnimation(int mode) { - static unsigned long animstart_delay = -1; - static unsigned long animstart_delay_value = 0; + static unsigned int animstart_delay = -1; + static unsigned int animstart_delay_value = 0; static boolean anim_running = FALSE; static boolean anim_restart = TRUE; static boolean reset_delay = TRUE; diff --git a/src/libgame/x11.c b/src/libgame/x11.c index f95c3da9..66f4a3ef 100644 --- a/src/libgame/x11.c +++ b/src/libgame/x11.c @@ -110,7 +110,7 @@ static DrawWindow *X11InitWindow() DrawWindow *new_window = CreateBitmapStruct(); unsigned int border_width = 4; XGCValues gc_values; - unsigned long gc_valuemask; + unsigned int gc_valuemask; #if !defined(PLATFORM_MSDOS) XTextProperty windowName, iconName; Pixmap icon_pixmap, iconmask_pixmap; @@ -121,13 +121,13 @@ static DrawWindow *X11InitWindow() XClassHint class_hints; char *window_name = program.window_title; char *icon_name = program.window_title; - long window_event_mask; + int window_event_mask; Atom proto_atom = None, delete_atom = None; #endif int screen_width, screen_height; int win_xpos, win_ypos; - unsigned long pen_fg = WhitePixel(display, screen); - unsigned long pen_bg = BlackPixel(display, screen); + unsigned int pen_fg = WhitePixel(display, screen); + unsigned int pen_bg = BlackPixel(display, screen); const int width = video.width, height = video.height; int i; @@ -289,7 +289,7 @@ Bitmap *X11LoadImage(char *filename) char *error = "Read_PCX_to_Pixmap(): %s '%s'"; int pcx_err; XGCValues clip_gc_values; - unsigned long clip_gc_valuemask; + unsigned int clip_gc_valuemask; pcx_err = Read_PCX_to_Pixmap(display, window->drawable, window->gc, filename, &new_bitmap->drawable, &new_bitmap->clip_mask); diff --git a/src/main.c b/src/main.c index d5dbe91c..94c5c3ac 100644 --- a/src/main.c +++ b/src/main.c @@ -41,7 +41,11 @@ SDL_Thread *server_thread; int key_joystick_mapping = 0; #if 1 +#if NEW_SCROLL +boolean redraw[2 + MAX_LEV_FIELDX + 2][2 + MAX_LEV_FIELDY + 2]; +#else boolean redraw[MAX_LEV_FIELDX + 2][MAX_LEV_FIELDY + 2]; +#endif #else boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; #endif @@ -97,6 +101,11 @@ int DX = 566, DY = 60; int VX = 566, VY = 400; int EX = 566, EY = 356; int dDX, dDY; +int SXSIZE = 17 * TILEX; /* SCR_FIELDX * TILEX */ +int SYSIZE = 17 * TILEY; /* SCR_FIELDY * TILEY */ +int FULL_SXSIZE = 2 + 17 * TILEX + 2; /* 2 + SXSIZE + 2 */ +int FULL_SYSIZE = 2 + 17 * TILEY + 2; /* 2 + SYSIZE + 2 */ +int TILESIZE_VAR = TILESIZE; #if 1 int FX, FY; @@ -5451,12 +5460,14 @@ struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1 + 1] = { ".TITLE", GFX_SPECIAL_ARG_TITLE, }, { ".MAIN", GFX_SPECIAL_ARG_MAIN, }, { ".LEVELS", GFX_SPECIAL_ARG_LEVELS }, + { ".LEVELNR", GFX_SPECIAL_ARG_LEVELNR }, { ".SCORES", GFX_SPECIAL_ARG_SCORES, }, { ".EDITOR", GFX_SPECIAL_ARG_EDITOR, }, { ".INFO", GFX_SPECIAL_ARG_INFO, }, { ".SETUP", GFX_SPECIAL_ARG_SETUP, }, { ".PLAYING", GFX_SPECIAL_ARG_PLAYING, }, { ".DOOR", GFX_SPECIAL_ARG_DOOR, }, + { ".TAPE", GFX_SPECIAL_ARG_TAPE, }, { ".PANEL", GFX_SPECIAL_ARG_PANEL, }, { ".PREVIEW", GFX_SPECIAL_ARG_PREVIEW, }, { ".CRUMBLED", GFX_SPECIAL_ARG_CRUMBLED, }, diff --git a/src/main.h b/src/main.h index d16f5bc9..434d3c93 100644 --- a/src/main.h +++ b/src/main.h @@ -31,6 +31,9 @@ #include "conf_mus.h" /* include auto-generated data structure definitions */ +#define NEW_TILESIZE 1 +#define NEW_SCROLL 1 + #define IMG_UNDEFINED (-1) #define IMG_EMPTY IMG_EMPTY_SPACE #define IMG_SP_EMPTY IMG_EMPTY_SPACE @@ -962,6 +965,8 @@ #define TILESIZE 32 #define TILEX TILESIZE #define TILEY TILESIZE +#define TILEX_VAR TILESIZE_VAR +#define TILEY_VAR TILESIZE_VAR #define MINI_TILESIZE (TILESIZE / 2) #define MINI_TILEX MINI_TILESIZE #define MINI_TILEY MINI_TILESIZE @@ -970,18 +975,49 @@ #define MICRO_TILEY MICRO_TILESIZE #define MIDPOSX (SCR_FIELDX / 2) #define MIDPOSY (SCR_FIELDY / 2) +#if NEW_TILESIZE +#if NEW_SCROLL +#if 0 +#define SXSIZE (SCR_FIELDX * TILEX_VAR) +#define SYSIZE (SCR_FIELDY * TILEY_VAR) +#endif +#define FXSIZE ((2 + SCR_FIELDX + 2) * TILEX_VAR) +#define FYSIZE ((2 + SCR_FIELDY + 2) * TILEY_VAR) +#else +#if 0 +#define SXSIZE (SCR_FIELDX * TILEX_VAR) +#define SYSIZE (SCR_FIELDY * TILEY_VAR) +#endif +#define FXSIZE ((SCR_FIELDX + 2) * TILEX_VAR) +#define FYSIZE ((SCR_FIELDY + 2) * TILEY_VAR) +#endif +#else +#if NEW_SCROLL +#if 0 #define SXSIZE (SCR_FIELDX * TILEX) #define SYSIZE (SCR_FIELDY * TILEY) +#endif +#define FXSIZE ((2 + SCR_FIELDX + 2) * TILEX) +#define FYSIZE ((2 + SCR_FIELDY + 2) * TILEY) +#else +#if 0 +#define SXSIZE (SCR_FIELDX * TILEX) +#define SYSIZE (SCR_FIELDY * TILEY) +#endif #define FXSIZE ((SCR_FIELDX + 2) * TILEX) #define FYSIZE ((SCR_FIELDY + 2) * TILEY) +#endif +#endif #define DXSIZE 100 #define DYSIZE 280 #define VXSIZE DXSIZE #define VYSIZE 100 #define EXSIZE DXSIZE #define EYSIZE (VYSIZE + 44) +#if 0 #define FULL_SXSIZE (2 + SXSIZE + 2) #define FULL_SYSIZE (2 + SYSIZE + 2) +#endif #define MICROLEVEL_XSIZE ((STD_LEV_FIELDX + 2) * MICRO_TILEX) #define MICROLEVEL_YSIZE ((STD_LEV_FIELDY + 2) * MICRO_TILEY) #define MICROLEVEL_XPOS (SX + (SXSIZE - MICROLEVEL_XSIZE) / 2) @@ -1822,17 +1858,19 @@ #define GFX_SPECIAL_ARG_TITLE 3 #define GFX_SPECIAL_ARG_MAIN 4 #define GFX_SPECIAL_ARG_LEVELS 5 -#define GFX_SPECIAL_ARG_SCORES 6 -#define GFX_SPECIAL_ARG_EDITOR 7 -#define GFX_SPECIAL_ARG_INFO 8 -#define GFX_SPECIAL_ARG_SETUP 9 -#define GFX_SPECIAL_ARG_PLAYING 10 -#define GFX_SPECIAL_ARG_DOOR 11 -#define GFX_SPECIAL_ARG_PANEL 12 -#define GFX_SPECIAL_ARG_PREVIEW 13 -#define GFX_SPECIAL_ARG_CRUMBLED 14 - -#define NUM_SPECIAL_GFX_ARGS 15 +#define GFX_SPECIAL_ARG_LEVELNR 6 +#define GFX_SPECIAL_ARG_SCORES 7 +#define GFX_SPECIAL_ARG_EDITOR 8 +#define GFX_SPECIAL_ARG_INFO 9 +#define GFX_SPECIAL_ARG_SETUP 10 +#define GFX_SPECIAL_ARG_PLAYING 11 +#define GFX_SPECIAL_ARG_DOOR 12 +#define GFX_SPECIAL_ARG_TAPE 13 +#define GFX_SPECIAL_ARG_PANEL 14 +#define GFX_SPECIAL_ARG_PREVIEW 15 +#define GFX_SPECIAL_ARG_CRUMBLED 16 + +#define NUM_SPECIAL_GFX_ARGS 17 /* these additional definitions are currently only used for draw offsets */ #define GFX_SPECIAL_ARG_INFO_MAIN 0 @@ -1914,8 +1952,12 @@ #define GFX_ARG_SORT_PRIORITY 45 #define GFX_ARG_CLASS 46 #define GFX_ARG_STYLE 47 +#define GFX_ARG_ACTIVE_XOFFSET 48 +#define GFX_ARG_ACTIVE_YOFFSET 49 +#define GFX_ARG_PRESSED_XOFFSET 50 +#define GFX_ARG_PRESSED_YOFFSET 51 -#define NUM_GFX_ARGS 48 +#define NUM_GFX_ARGS 52 /* values for sound configuration suffixes */ @@ -1995,24 +2037,25 @@ #define GAME_MODE_TITLE 3 #define GAME_MODE_MAIN 4 #define GAME_MODE_LEVELS 5 -#define GAME_MODE_SCORES 6 -#define GAME_MODE_EDITOR 7 -#define GAME_MODE_INFO 8 -#define GAME_MODE_SETUP 9 -#define GAME_MODE_PLAYING 10 -#define GAME_MODE_PSEUDO_DOOR 11 -#define GAME_MODE_PSEUDO_PANEL 12 -#define GAME_MODE_PSEUDO_PREVIEW 13 -#define GAME_MODE_PSEUDO_CRUMBLED 14 +#define GAME_MODE_LEVELNR 6 +#define GAME_MODE_SCORES 7 +#define GAME_MODE_EDITOR 8 +#define GAME_MODE_INFO 9 +#define GAME_MODE_SETUP 10 +#define GAME_MODE_PLAYING 11 +#define GAME_MODE_PSEUDO_DOOR 12 +#define GAME_MODE_PSEUDO_TAPE 13 +#define GAME_MODE_PSEUDO_PANEL 14 +#define GAME_MODE_PSEUDO_PREVIEW 15 +#define GAME_MODE_PSEUDO_CRUMBLED 16 /* there are no special config file suffixes for these modes */ -#define GAME_MODE_PSEUDO_TYPENAME 15 -#define GAME_MODE_QUIT 16 +#define GAME_MODE_PSEUDO_TYPENAME 17 +#define GAME_MODE_QUIT 18 /* special definitions currently only used for custom artwork configuration */ #define MUSIC_PREFIX_BACKGROUND 0 #define NUM_MUSIC_PREFIXES 1 -#define MAX_LEVELS 1000 /* definitions for demo animation lists */ #define HELPANIM_LIST_NEXT -1 @@ -2022,8 +2065,8 @@ /* program information and versioning definitions */ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 3 -#define PROGRAM_VERSION_PATCH 0 -#define PROGRAM_VERSION_BUILD 1 +#define PROGRAM_VERSION_PATCH 1 +#define PROGRAM_VERSION_BUILD 0 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" @@ -2460,6 +2503,8 @@ struct GlobalInfo int fading_status; int fading_type; #endif + + boolean use_envelope_request; }; struct ElementChangeInfo @@ -2573,7 +2618,7 @@ struct ElementInfo /* ---------- special element property values ---------- */ - unsigned long properties[NUM_EP_BITFIELDS]; /* element base properties */ + unsigned int properties[NUM_EP_BITFIELDS]; /* element base properties */ boolean use_gfx_element; /* use custom graphic element */ int gfx_element_initial; /* initial optional custom graphic element */ @@ -2716,6 +2761,11 @@ struct GraphicInfo int class; int style; + int active_xoffset; + int active_yoffset; + int pressed_xoffset; + int pressed_yoffset; + boolean use_image_size; /* use image size as default width and height */ #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -2814,7 +2864,11 @@ extern SDL_Thread *server_thread; extern int key_joystick_mapping; #if 1 +#if NEW_SCROLL +extern boolean redraw[2 + MAX_LEV_FIELDX + 2][2 + MAX_LEV_FIELDY + 2]; +#else extern boolean redraw[MAX_LEV_FIELDX + 2][MAX_LEV_FIELDY + 2]; +#endif #else extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; #endif @@ -2870,6 +2924,9 @@ extern int DX, DY; extern int VX, VY; extern int EX, EY; extern int dDX, dDY; +extern int SXSIZE, SYSIZE; +extern int FULL_SXSIZE, FULL_SYSIZE; +extern int TILESIZE_VAR; extern int FX, FY; extern int ScrollStepSize; diff --git a/src/netserv.c b/src/netserv.c index ac1b71c4..b895a303 100644 --- a/src/netserv.c +++ b/src/netserv.c @@ -77,7 +77,7 @@ static unsigned char realbuffer[512], *buffer = realbuffer + 4; static int interrupt; -static unsigned long ServerFrameCounter = 0; +static unsigned int ServerFrameCounter = 0; static void addtobuffer(struct NetworkServerPlayerInfo *player, unsigned char *b, int len) @@ -97,7 +97,8 @@ static void flushuser(struct NetworkServerPlayerInfo *player) #if defined(TARGET_SDL) SDLNet_TCP_Send(player->fd, player->writbuffer, player->nwrite); #else - write(player->fd, player->writbuffer, player->nwrite); + if (write(player->fd, player->writbuffer, player->nwrite) == -1) + Error(ERR_WARN, "write() failed; %s", strerror(errno)); #endif player->nwrite = 0; } @@ -586,7 +587,8 @@ void NetworkServer(int port, int serveronly) setsid(); if (fork()) exit(0); - chdir("/"); + if (chdir("/") == -1) + Error(ERR_WARN, "chdir() failed; %s", strerror(errno)); /* open a fake stdin, stdout, stderr, just in case */ open("/dev/null", O_RDONLY); diff --git a/src/network.c b/src/network.c index fd98b62d..b13e4c9a 100644 --- a/src/network.c +++ b/src/network.c @@ -87,7 +87,8 @@ static void SendBufferToServer(int size) #if defined(TARGET_SDL) SDLNet_TCP_Send(sfd, writbuffer, nwrite); #else - write(sfd, writbuffer, nwrite); + if (write(sfd, writbuffer, nwrite) == -1) + Error(ERR_WARN, "write() failed; %s", strerror(errno)); #endif nwrite = 0; } @@ -308,7 +309,7 @@ void SendToServer_NrWanted(int nr_wanted) void SendToServer_StartPlaying() { - unsigned long new_random_seed = InitRND(level.random_seed); + unsigned int new_random_seed = InitRND(level.random_seed); int dummy = 0; /* !!! HAS NO MEANING ANYMORE !!! */ /* the name of the level must be enough */ @@ -502,12 +503,10 @@ static void Handle_OP_START_PLAYING() { LevelDirTree *new_leveldir; int new_level_nr; - int dummy; - unsigned long new_random_seed; + unsigned int new_random_seed; char *new_leveldir_identifier; new_level_nr = (buffer[2] << 8) + buffer[3]; - dummy = (buffer[4] << 8) + buffer[5]; /* (obsolete) */ new_random_seed = (buffer[6] << 24) | (buffer[7] << 16) | (buffer[8] << 8) | (buffer[9]); new_leveldir_identifier = (char *)&buffer[10]; diff --git a/src/screens.c b/src/screens.c index de24626a..77b90603 100644 --- a/src/screens.c +++ b/src/screens.c @@ -141,7 +141,8 @@ static void execSetupGraphics(void); static void execSetupArtwork(void); static void HandleChooseTree(int, int, int, int, int, TreeInfo **); -static void DrawChooseLevel(void); +static void DrawChooseLevelSet(void); +static void DrawChooseLevelNr(void); static void DrawInfoScreen(void); static void DrawAndFadeInInfoScreen(int); static void DrawSetupScreen(void); @@ -175,6 +176,9 @@ static TreeInfo *scroll_delay_current = NULL; static TreeInfo *game_speeds = NULL; static TreeInfo *game_speed_current = NULL; +static TreeInfo *level_number = NULL; +static TreeInfo *level_number_current = NULL; + static struct { int value; @@ -867,8 +871,13 @@ static void InitializeMainControls() if (pos_text != NULL) /* (x/y may be -1/-1 here) */ { +#if 1 + /* calculate size for non-clickable text -- needed for text alignment */ + boolean calculate_text_size = (pos_button == NULL && text != NULL); +#else /* calculate width for non-clickable text -- needed for text alignment */ boolean calculate_text_width = (pos_button == NULL && text != NULL); +#endif if (visibleMenuPos(pos_button)) { @@ -878,10 +887,17 @@ static void InitializeMainControls() pos_text->y = pos_button->y; } +#if 1 + if (pos_text->width == -1 || calculate_text_size) + pos_text->width = text_width; + if (pos_text->height == -1 || calculate_text_size) + pos_text->height = text_height; +#else if (pos_text->width == -1 || calculate_text_width) pos_text->width = text_width; if (pos_text->height == -1) pos_text->height = text_height; +#endif } if (pos_input != NULL) /* (x/y may be -1/-1 here) */ @@ -945,7 +961,7 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, int y = mSY + pos->y; DrawBackgroundForGraphic(x, y, pos->width, pos->height, button_graphic); - DrawGraphicThruMaskExt(drawto, x, y, button_graphic, 0); + DrawFixedGraphicThruMaskExt(drawto, x, y, button_graphic, 0); } if (visibleTextPos(pos_text) && text != NULL) @@ -1020,6 +1036,13 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y) int rect_x = ALIGNED_TEXT_XPOS(rect); int rect_y = ALIGNED_TEXT_YPOS(rect); +#if 0 + printf("::: insideTextPosRect: (%d, %d), (%d, %d) [%d, %d] (%d, %d) => %d\n", + x, y, rect_x, rect_y, rect->x, rect->y, rect->width, rect->height, + (x >= rect_x && x < rect_x + rect->width && + y >= rect_y && y < rect_y + rect->height)); +#endif + return (x >= rect_x && x < rect_x + rect->width && y >= rect_y && y < rect_y + rect->height); } @@ -1046,7 +1069,7 @@ static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) graphic = BUTTON_ACTIVE(graphic); DrawBackgroundForGraphic(x, y, TILEX, TILEY, graphic); - DrawGraphicThruMaskExt(drawto, x, y, graphic, 0); + DrawFixedGraphicThruMaskExt(drawto, x, y, graphic, 0); } static void initCursor(int ypos, int graphic) @@ -1425,7 +1448,7 @@ static void gotoTopLevelDir() void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { - static unsigned long title_delay = 0; + static unsigned int title_delay = 0; static int title_screen_nr = 0; static int last_sound = -1, last_music = -1; boolean return_to_main_menu = FALSE; @@ -1703,10 +1726,19 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) for (i = 0; main_controls[i].nr != -1; i++) { +#if 0 + printf("::: check click (%d, %d) for %d [%d] ...\n", + mx - mSX, my - mSY, i, main_controls[i].nr); +#endif + if (insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY) || insideTextPosRect(main_controls[i].pos_text, mx - mSX, my - mSY) || insideTextPosRect(main_controls[i].pos_input, mx - mSX, my - mSY)) { +#if 0 + printf("::: inside %d\n", i); +#endif + pos = main_controls[i].nr; break; @@ -1726,6 +1758,20 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) { HandleMainMenu_SelectLevel(1, dx < 0 ? -1 : +1); } + else if (pos == MAIN_CONTROL_FIRST_LEVEL && !button) + { + HandleMainMenu_SelectLevel(MAX_LEVELS, -1); + } + else if (pos == MAIN_CONTROL_LAST_LEVEL && !button) + { + HandleMainMenu_SelectLevel(MAX_LEVELS, +1); + } + else if (pos == MAIN_CONTROL_LEVEL_NUMBER && !button) + { + game_status = GAME_MODE_LEVELNR; + + DrawChooseLevelNr(); + } else if (pos >= MAIN_CONTROL_NAME && pos <= MAIN_CONTROL_QUIT) { if (button) @@ -1763,7 +1809,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) gotoTopLevelDir(); #endif - DrawChooseLevel(); + DrawChooseLevelSet(); } } else if (pos == MAIN_CONTROL_SCORES) @@ -2197,8 +2243,8 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init) ClearRectangleOnBackground(drawto, xstart, ystart2 + (i - start) * ystep, TILEX, TILEY); - DrawGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep, - graphic, sync_frame, USE_MASKING); + DrawFixedGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep, + graphic, sync_frame, USE_MASKING); if (init) DrawInfoScreen_HelpText(element, action, direction, i - start); @@ -2289,7 +2335,7 @@ void DrawInfoScreen_Elements() void HandleInfoScreen_Elements(int button) { - static unsigned long info_delay = 0; + static unsigned int info_delay = 0; static int num_anims; static int num_pages; static int page; @@ -3296,8 +3342,8 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, char *title_string = NULL; int yoffset_sets = MENU_TITLE1_YPOS; int yoffset_setup = 16; - int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? yoffset_sets : - yoffset_setup); + int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR || + ti->type == TREE_TYPE_LEVEL_NR ? yoffset_sets : yoffset_setup); int last_game_status = game_status; /* save current game status */ title_string = ti->infotext; @@ -3365,6 +3411,9 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) int ypos = MENU_TITLE2_YPOS; int font_nr = FONT_TITLE_2; + if (ti->type == TREE_TYPE_LEVEL_NR) + DrawTextFCentered(ypos, font_nr, leveldir_current->name); + if (ti->type != TREE_TYPE_LEVEL_DIR) return; @@ -3373,6 +3422,18 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) DrawBackgroundForFont(SX, SY + ypos, SXSIZE, getFontHeight(font_nr), font_nr); +#if 1 + if (node->parent_link) + DrawTextFCentered(ypos, font_nr, "leave \"%s\"", + node->node_parent->name); + else if (node->level_group) + DrawTextFCentered(ypos, font_nr, "enter \"%s\"", + node->name); + else if (ti->type == TREE_TYPE_LEVEL_DIR) + DrawTextFCentered(ypos, font_nr, "%3d %s (%s)", + node->levels, (node->levels > 1 ? "levels" : "level"), + node->class_desc); +#else if (node->parent_link) DrawTextFCentered(ypos, font_nr, "leave group \"%s\"", node->class_desc); @@ -3382,6 +3443,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) else if (ti->type == TREE_TYPE_LEVEL_DIR) DrawTextFCentered(ypos, font_nr, "%3d levels (%s)", node->levels, node->class_desc); +#endif /* let BackToFront() redraw only what is needed */ redraw_mask = last_redraw_mask | REDRAW_TILES; @@ -3468,6 +3530,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else { + if (game_status == GAME_MODE_LEVELNR) + level_nr = atoi(level_number_current->identifier); + game_status = GAME_MODE_MAIN; DrawMainMenuExt(REDRAW_FIELD, FALSE); @@ -3651,7 +3716,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else { + if (game_status == GAME_MODE_LEVELNR) + level_nr = atoi(level_number_current->identifier); + game_status = GAME_MODE_MAIN; + DrawMainMenu(); } } @@ -3659,7 +3728,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } } -void DrawChooseLevel() +void DrawChooseLevelSet() { SetMainBackgroundImage(IMG_BACKGROUND_LEVELS); @@ -3669,13 +3738,84 @@ void DrawChooseLevel() PlayMenuMusic(); } -void HandleChooseLevel(int mx, int my, int dx, int dy, int button) +void HandleChooseLevelSet(int mx, int my, int dx, int dy, int button) { HandleChooseTree(mx, my, dx, dy, button, &leveldir_current); DoAnimation(); } +void DrawChooseLevelNr() +{ + int i; + + if (level_number != NULL) + { + freeTreeInfo(level_number); + + level_number = NULL; + } + + for (i = leveldir_current->first_level; i <= leveldir_current->last_level;i++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_LEVEL_NR); + char identifier[32], name[32]; + int value = i; + + /* temporarily load level info to get level name */ + LoadLevelInfoOnly(i); + + ti->node_top = &level_number; + ti->sort_priority = 10000 + value; + ti->color = (level.no_valid_file ? FC_BLUE : + LevelStats_getSolved(i) ? FC_GREEN : + LevelStats_getPlayed(i) ? FC_YELLOW : FC_RED); + + sprintf(identifier, "%d", value); + sprintf(name, "%03d: %s", value, + (level.no_valid_file ? "(no file)" : level.name)); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + + pushTreeInfo(&level_number, ti); + } + + /* sort level number values to start with lowest level number */ + sortTreeInfo(&level_number); + + /* set current level number to current level number */ + level_number_current = + getTreeInfoFromIdentifier(level_number, i_to_a(level_nr)); + + /* if that also fails, set current level number to first available level */ + if (level_number_current == NULL) + level_number_current = level_number; + + SetMainBackgroundImage(IMG_BACKGROUND_LEVELNR); + +#if 1 + DrawChooseTree(&level_number_current); +#else + DrawChooseTree(&leveldir_current); +#endif + + PlayMenuSound(); + PlayMenuMusic(); +} + +void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button) +{ +#if 1 + HandleChooseTree(mx, my, dx, dy, button, &level_number_current); +#else + HandleChooseTree(mx, my, dx, dy, button, &leveldir_current); +#endif + + DoAnimation(); +} + void DrawHallOfFame(int highlight_position) { UnmapAllGadgets(); @@ -4241,6 +4381,7 @@ static struct TokenInfo setup_info_graphics[] = { TYPE_SWITCH, &setup.toons, "Show Toons:" }, { TYPE_ECS_AGA, &setup.prefer_aga_graphics,"EMC graphics preference:" }, { TYPE_SWITCH, &setup.sp_show_border_elements,"Supaplex Border Elements:" }, + { TYPE_SWITCH, &setup.small_game_graphics, "Small Game Graphics:" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, @@ -4312,11 +4453,11 @@ static struct TokenInfo setup_info_input[] = static struct TokenInfo setup_info_shortcuts[] = { - { TYPE_ENTER_MENU, execSetupShortcuts1, "Various Keys" }, - { TYPE_ENTER_MENU, execSetupShortcuts2, "Player Focus" }, - { TYPE_ENTER_MENU, execSetupShortcuts3, "Tape Buttons" }, - { TYPE_ENTER_MENU, execSetupShortcuts4, "Sound & Music" }, - { TYPE_ENTER_MENU, execSetupShortcuts5, "TAS Snap Keys" }, + { TYPE_ENTER_MENU, execSetupShortcuts1, "Various Keys" }, + { TYPE_ENTER_MENU, execSetupShortcuts2, "Player Focus" }, + { TYPE_ENTER_MENU, execSetupShortcuts3, "Tape Buttons" }, + { TYPE_ENTER_MENU, execSetupShortcuts4, "Sound & Music" }, + { TYPE_ENTER_MENU, execSetupShortcuts5, "TAS Snap Keys" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, @@ -4360,15 +4501,17 @@ static struct TokenInfo setup_info_shortcuts_2[] = static struct TokenInfo setup_info_shortcuts_3[] = { - { TYPE_KEYTEXT, NULL, "Tape Eject:", }, + { TYPE_KEYTEXT, NULL, "Eject Tape:", }, { TYPE_KEY, &setup.shortcut.tape_eject, "" }, - { TYPE_KEYTEXT, NULL, "Tape Stop:", }, + { TYPE_KEYTEXT, NULL, "Warp / Single Step:", }, + { TYPE_KEY, &setup.shortcut.tape_extra, "" }, + { TYPE_KEYTEXT, NULL, "Stop Tape:", }, { TYPE_KEY, &setup.shortcut.tape_stop, "" }, - { TYPE_KEYTEXT, NULL, "Tape Pause:", }, + { TYPE_KEYTEXT, NULL, "Pause / Unpause Tape:",}, { TYPE_KEY, &setup.shortcut.tape_pause, "" }, - { TYPE_KEYTEXT, NULL, "Tape Record:", }, + { TYPE_KEYTEXT, NULL, "Record Tape:", }, { TYPE_KEY, &setup.shortcut.tape_record, "" }, - { TYPE_KEYTEXT, NULL, "Tape Play:", }, + { TYPE_KEYTEXT, NULL, "Play Tape:", }, { TYPE_KEY, &setup.shortcut.tape_play, "" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, @@ -4378,11 +4521,11 @@ static struct TokenInfo setup_info_shortcuts_3[] = static struct TokenInfo setup_info_shortcuts_4[] = { - { TYPE_KEYTEXT, NULL, "Sound Effects (Normal):", }, + { TYPE_KEYTEXT, NULL, "Toggle Sound Effects (Normal):", }, { TYPE_KEY, &setup.shortcut.sound_simple, "" }, - { TYPE_KEYTEXT, NULL, "Sound Effects (Looping):", }, + { TYPE_KEYTEXT, NULL, "Toggle Sound Effects (Looping):", }, { TYPE_KEY, &setup.shortcut.sound_loops, "" }, - { TYPE_KEYTEXT, NULL, "Music:", }, + { TYPE_KEYTEXT, NULL, "Toggle Music:", }, { TYPE_KEY, &setup.shortcut.sound_music, "" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, @@ -4492,7 +4635,10 @@ static void drawSetupValue(int pos) int ypos = MENU_SCREEN_START_YPOS + pos; int startx = mSX + xpos * 32; int starty = mSY + ypos * 32; - int font_nr, font_width, font_height; + int font_nr, font_width; +#if 0 + int font_height; +#endif int type = setup_info[pos].type; void *value = setup_info[pos].value; char *value_string = getSetupValue(type, value); @@ -4528,7 +4674,9 @@ static void drawSetupValue(int pos) starty = mSY + ypos * 32; font_nr = getSetupValueFont(type, value); font_width = getFontWidth(font_nr); +#if 0 font_height = getFontHeight(font_nr); +#endif /* downward compatibility correction for Juergen Bonhagen's menu settings */ if (setup_mode != SETUP_MODE_INPUT) @@ -5011,8 +5159,8 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active) ClearRectangleOnBackground(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY, TILEX, TILEY); - DrawGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY, - PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0); + DrawFixedGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY, + PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0); if (setup.input[player_nr].use_joystick) { @@ -5368,7 +5516,7 @@ static boolean CalibrateJoystickMain(int player_nr) { for (x = 0; x < 3; x++) { - DrawGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0); + DrawFixedGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0); check[x][y] = FALSE; } } @@ -5392,7 +5540,7 @@ static boolean CalibrateJoystickMain(int player_nr) new_joystick_xmiddle = joy_x; new_joystick_ymiddle = joy_y; - DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0); + DrawFixedGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0); FadeIn(REDRAW_FIELD); @@ -5464,8 +5612,10 @@ static boolean CalibrateJoystickMain(int player_nr) if (x != last_x || y != last_y) { - DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_YELLOW, 0); - DrawGraphic(xpos + x, ypos + y, IMG_MENU_CALIBRATE_RED, 0); + DrawFixedGraphic(xpos + last_x, ypos + last_y, + IMG_MENU_CALIBRATE_YELLOW, 0); + DrawFixedGraphic(xpos + x, ypos + y, + IMG_MENU_CALIBRATE_RED, 0); last_x = x; last_y = y; @@ -5768,7 +5918,7 @@ static struct static void CreateScreenMenubuttons() { struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int i; for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++) @@ -5821,7 +5971,7 @@ static void CreateScreenMenubuttons() static void CreateScreenScrollbuttons() { struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int i; /* these values are not constant, but can change at runtime */ @@ -5901,7 +6051,7 @@ static void CreateScreenScrollbars() int gd_x1, gd_x2, gd_y1, gd_y2; struct GadgetInfo *gi; int items_max, items_visible, item_position; - unsigned long event_mask; + unsigned int event_mask; int num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN; int id = scrollbar_info[i].gadget_id; @@ -6082,21 +6232,27 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) case SCREEN_CTRL_ID_SCROLL_UP: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); + HandleChooseLevelSet(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); break; case SCREEN_CTRL_ID_SCROLL_DOWN: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); + HandleChooseLevelSet(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); break; case SCREEN_CTRL_ID_SCROLL_VERTICAL: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE); + HandleChooseLevelSet(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE); break; diff --git a/src/screens.h b/src/screens.h index e08e1be4..7c3a1999 100644 --- a/src/screens.h +++ b/src/screens.h @@ -32,7 +32,8 @@ void RedrawSetupScreenAfterFullscreenToggle(); void HandleTitleScreen(int, int, int, int, int); void HandleMainMenu(int, int, int, int, int); -void HandleChooseLevel(int, int, int, int, int); +void HandleChooseLevelSet(int, int, int, int, int); +void HandleChooseLevelNr(int, int, int, int, int); void HandleHallOfFame(int, int, int, int, int); void HandleInfoScreen(int, int, int, int, int); void HandleSetupScreen(int, int, int, int, int); diff --git a/src/tape.c b/src/tape.c index 5c90cb41..1d8a3ed0 100644 --- a/src/tape.c +++ b/src/tape.c @@ -186,7 +186,7 @@ static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS]; /* video display functions */ /* ========================================================================= */ -void DrawVideoDisplay(unsigned long state, unsigned long value) +void DrawVideoDisplay(unsigned int state, unsigned int value) { int i, j, k; static char *monatsname[12] = @@ -194,6 +194,8 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; + +#if 0 static struct { int gd_x1, gd_y1; @@ -344,6 +346,105 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) } }, }; +#endif + +#if 1 + static struct + { + int graphic; + struct Rect *pos; + } + video_pos[NUM_TAPE_FUNCTIONS][NUM_TAPE_FUNCTION_PARTS] = + { + { + { IMG_TAPE_LABEL_GFX_PLAY, &tape.label.play }, + { IMG_TAPE_SYMBOL_GFX_PLAY, &tape.symbol.play }, + }, + { + { IMG_TAPE_LABEL_GFX_RECORD, &tape.label.record }, + { IMG_TAPE_SYMBOL_GFX_RECORD, &tape.symbol.record }, + }, + { + { IMG_TAPE_LABEL_GFX_PAUSE, &tape.label.pause }, + { IMG_TAPE_SYMBOL_GFX_PAUSE, &tape.symbol.pause }, + }, + { + { IMG_TAPE_LABEL_GFX_DATE, &tape.label.date }, + { -1, NULL }, + }, + { + { IMG_TAPE_LABEL_GFX_TIME, &tape.label.time }, + { -1, NULL }, + }, + { + { IMG_TAPE_LABEL_GFX_FAST_FORWARD, &tape.label.fast_forward }, + { IMG_TAPE_SYMBOL_GFX_FAST_FORWARD, &tape.symbol.fast_forward }, + }, + { + { IMG_TAPE_LABEL_GFX_PAUSE_BEFORE_END, &tape.label.pause_before_end }, + { IMG_TAPE_SYMBOL_GFX_PAUSE_BEFORE_END, &tape.symbol.pause_before_end }, + }, + { + { IMG_TAPE_LABEL_GFX_WARP_FORWARD_BLIND, &tape.label.warp_forward_blind}, + { IMG_TAPE_SYMBOL_GFX_WARP_FORWARD_BLIND, &tape.symbol.warp_forward_blind}, + }, + { + { IMG_TAPE_LABEL_GFX_WARP_FORWARD, &tape.label.warp_forward }, + { IMG_TAPE_SYMBOL_GFX_WARP_FORWARD, &tape.symbol.warp_forward }, + }, + { + { IMG_TAPE_LABEL_GFX_SINGLE_STEP, &tape.label.single_step }, + { IMG_TAPE_SYMBOL_GFX_SINGLE_STEP, &tape.symbol.single_step }, + }, + }; + + for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++) /* on or off states */ + { + for (i = 0; i < NUM_TAPE_FUNCTIONS; i++) /* record, play, ... */ + { + for (j = 0; j < NUM_TAPE_FUNCTION_PARTS; j++) /* label or symbol */ + { + if (video_pos[i][j].graphic == -1 || + video_pos[i][j].pos->x < 0 || + video_pos[i][j].pos->y < 0) + continue; + + if (state & (1 << (i * 2 + k))) + { + struct GraphicInfo *gfx_bg = &graphic_info[IMG_BACKGROUND_TAPE]; + struct GraphicInfo *gfx = &graphic_info[video_pos[i][j].graphic]; + struct Rect *pos = video_pos[i][j].pos; + Bitmap *gd_bitmap; + int gd_x, gd_y; + int skip_value = + (j == 0 ? VIDEO_DISPLAY_SYMBOL_ONLY : VIDEO_DISPLAY_LABEL_ONLY); + + if (value == skip_value) + continue; + + if (k == 1) /* on */ + { + gd_bitmap = gfx->bitmap; + gd_x = gfx->src_x; + gd_y = gfx->src_y; + } + else /* off */ + { + gd_bitmap = gfx_bg->bitmap; + gd_x = gfx_bg->src_x + pos->x; + gd_y = gfx_bg->src_y + pos->y; + } + + /* some tape graphics may be undefined -- only draw if defined */ + if (gd_bitmap != NULL) + BlitBitmap(gd_bitmap, drawto, gd_x, gd_y, gfx->width, gfx->height, + VX + pos->x, VY + pos->y); + } + } + } + } + +#else for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++) /* on or off states */ { @@ -379,6 +480,32 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) } } } +#endif + +#if 1 + if (state & VIDEO_STATE_DATE_ON) + { + struct TextPosInfo *pos = &tape.text.date; + int tag = value % 100; + int monat = (value/100) % 100; + int jahr = (value/10000); + + DrawText(VX + pos->x, VY + pos->y, int2str(tag, 2), pos->font); + DrawText(VX + pos->x + 27, VY + pos->y, monatsname[monat], pos->font); + DrawText(VX + pos->x + 64, VY + pos->y, int2str(jahr, 2), pos->font); + } + + if (state & VIDEO_STATE_TIME_ON) + { + struct TextPosInfo *pos = &tape.text.time; + int min = value / 60; + int sec = value % 60; + + DrawText(VX + pos->x, VY + pos->y, int2str(min, 2), pos->font); + DrawText(VX + pos->x + 27, VY + pos->y, int2str(sec, 2), pos->font); + } + +#else if (state & VIDEO_STATE_DATE_ON) { @@ -404,6 +531,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) DrawText(VX + VIDEO_TIME_XPOS + 27, VY + VIDEO_TIME_YPOS, int2str(sec, 2), FONT_TAPE_RECORDER); } +#endif redraw_mask |= REDRAW_DOOR_2; } @@ -549,12 +677,12 @@ static void TapeRewind() InitRND(tape.random_seed); } -static void TapeSetRandomSeed(long random_seed) +static void TapeSetRandomSeed(int random_seed) { tape.random_seed = InitRND(random_seed); } -void TapeStartRecording(long random_seed) +void TapeStartRecording(int random_seed) { if (!TAPE_IS_STOPPED(tape)) TapeStop(); @@ -1060,7 +1188,9 @@ void AutoPlayTape() static int num_levels_solved = 0; static int num_tape_missing = 0; static boolean level_failed[MAX_TAPES_PER_SET]; +#if 0 static boolean tape_missing[MAX_TAPES_PER_SET]; +#endif int i; if (autoplay_initialized) @@ -1109,7 +1239,9 @@ void AutoPlayTape() for (i = 0; i < MAX_TAPES_PER_SET; i++) { level_failed[i] = FALSE; +#if 0 tape_missing[i] = FALSE; +#endif } autoplay_initialized = TRUE; @@ -1144,8 +1276,10 @@ void AutoPlayTape() if (tape.no_valid_file) { num_tape_missing++; +#if 0 if (level_nr >= 0 && level_nr < MAX_TAPES_PER_SET) tape_missing[level_nr] = TRUE; +#endif printf("(no tape)\n"); continue; @@ -1197,55 +1331,38 @@ void AutoPlayTape() /* ---------- new tape button stuff ---------------------------------------- */ -/* graphic position values for tape buttons */ -#define TAPE_BUTTON_XSIZE 18 -#define TAPE_BUTTON_YSIZE 18 -#define TAPE_BUTTON_XPOS 5 -#define TAPE_BUTTON_YPOS 77 - -#define TAPE_BUTTON_EJECT_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE) -#define TAPE_BUTTON_EXTRA_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE) -#define TAPE_BUTTON_STOP_XPOS (TAPE_BUTTON_XPOS + 1 * TAPE_BUTTON_XSIZE) -#define TAPE_BUTTON_PAUSE_XPOS (TAPE_BUTTON_XPOS + 2 * TAPE_BUTTON_XSIZE) -#define TAPE_BUTTON_RECORD_XPOS (TAPE_BUTTON_XPOS + 3 * TAPE_BUTTON_XSIZE) -#define TAPE_BUTTON_PLAY_XPOS (TAPE_BUTTON_XPOS + 4 * TAPE_BUTTON_XSIZE) - static struct { - int x, y; + int graphic; + struct Rect *pos; int gadget_id; char *infotext; } tapebutton_info[NUM_TAPE_BUTTONS] = { { - TAPE_BUTTON_EJECT_XPOS, TAPE_BUTTON_YPOS, - TAPE_CTRL_ID_EJECT, - "eject tape" + IMG_TAPE_BUTTON_GFX_EJECT, &tape.button.eject, + TAPE_CTRL_ID_EJECT, "eject tape" }, { - TAPE_BUTTON_EXTRA_XPOS, TAPE_BUTTON_YPOS, - TAPE_CTRL_ID_EXTRA, - "extra functions" + /* (same position as "eject" button) */ + IMG_TAPE_BUTTON_GFX_EXTRA, &tape.button.eject, + TAPE_CTRL_ID_EXTRA, "extra functions" }, { - TAPE_BUTTON_STOP_XPOS, TAPE_BUTTON_YPOS, - TAPE_CTRL_ID_STOP, - "stop tape" + IMG_TAPE_BUTTON_GFX_STOP, &tape.button.stop, + TAPE_CTRL_ID_STOP, "stop tape" }, { - TAPE_BUTTON_PAUSE_XPOS, TAPE_BUTTON_YPOS, - TAPE_CTRL_ID_PAUSE, - "pause tape" + IMG_TAPE_BUTTON_GFX_PAUSE, &tape.button.pause, + TAPE_CTRL_ID_PAUSE, "pause tape" }, { - TAPE_BUTTON_RECORD_XPOS, TAPE_BUTTON_YPOS, - TAPE_CTRL_ID_RECORD, - "record tape" + IMG_TAPE_BUTTON_GFX_RECORD, &tape.button.record, + TAPE_CTRL_ID_RECORD, "record tape" }, { - TAPE_BUTTON_PLAY_XPOS, TAPE_BUTTON_YPOS, - TAPE_CTRL_ID_PLAY, - "play tape" + IMG_TAPE_BUTTON_GFX_PLAY, &tape.button.play, + TAPE_CTRL_ID_PLAY, "play tape" } }; @@ -1255,34 +1372,25 @@ void CreateTapeButtons() for (i = 0; i < NUM_TAPE_BUTTONS; i++) { - Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; + struct GraphicInfo *gfx = &graphic_info[tapebutton_info[i].graphic]; + struct Rect *pos = tapebutton_info[i].pos; struct GadgetInfo *gi; - int gd_xoffset, gd_yoffset; - int gd_x1, gd_x2, gd_y; + int gd_x = gfx->src_x; + int gd_y = gfx->src_y; + int gd_xp = gfx->src_x + gfx->pressed_xoffset; + int gd_yp = gfx->src_y + gfx->pressed_yoffset; int id = i; - gd_xoffset = tapebutton_info[i].x; - gd_yoffset = tapebutton_info[i].y; - gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset; - gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset; - gd_y = DOOR_GFX_PAGEY2 + gd_yoffset; - - if (i == TAPE_CTRL_ID_EXTRA) - { - gd_x1 = DOOR_GFX_PAGEX6 + gd_xoffset; - gd_x2 = DOOR_GFX_PAGEX5 + gd_xoffset; - } - gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_INFO_TEXT, tapebutton_info[i].infotext, - GDI_X, VX + gd_xoffset, - GDI_Y, VY + gd_yoffset, - GDI_WIDTH, TAPE_BUTTON_XSIZE, - GDI_HEIGHT, TAPE_BUTTON_YSIZE, + GDI_X, VX + pos->x, + GDI_Y, VY + pos->y, + GDI_WIDTH, gfx->width, + GDI_HEIGHT, gfx->height, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, GDI_STATE, GD_BUTTON_UNPRESSED, - GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y, - GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y, + GDI_DESIGN_UNPRESSED, gfx->bitmap, gd_x, gd_y, + GDI_DESIGN_PRESSED, gfx->bitmap, gd_xp, gd_yp, GDI_DIRECT_DRAW, FALSE, GDI_EVENT_MASK, GD_EVENT_RELEASED, GDI_CALLBACK_ACTION, HandleTapeButtons, @@ -1449,10 +1557,13 @@ static void HandleTapeButtons(struct GadgetInfo *gi) void HandleTapeButtonKeys(Key key) { - boolean use_extra = (tape.recording || tape.playing); + boolean eject_button_is_active = TAPE_IS_STOPPED(tape); + boolean extra_button_is_active = !eject_button_is_active; - if (key == setup.shortcut.tape_eject) - HandleTapeButtonsExt(use_extra ? TAPE_CTRL_ID_EXTRA : TAPE_CTRL_ID_EJECT); + if (key == setup.shortcut.tape_eject && eject_button_is_active) + HandleTapeButtonsExt(TAPE_CTRL_ID_EJECT); + else if (key == setup.shortcut.tape_extra && extra_button_is_active) + HandleTapeButtonsExt(TAPE_CTRL_ID_EXTRA); else if (key == setup.shortcut.tape_stop) HandleTapeButtonsExt(TAPE_CTRL_ID_STOP); else if (key == setup.shortcut.tape_pause) diff --git a/src/tape.h b/src/tape.h index cafa235d..6a5107cb 100644 --- a/src/tape.h +++ b/src/tape.h @@ -93,6 +93,51 @@ #define VIDEO_DISPLAY_SYMBOL_ONLY -2 +struct TapeButtonInfo +{ + struct Rect eject; + struct Rect stop; + struct Rect pause; + struct Rect record; + struct Rect play; +}; + +struct TapeSymbolInfo +{ + struct Rect eject; + struct Rect stop; + struct Rect pause; + struct Rect record; + struct Rect play; + struct Rect fast_forward; + struct Rect warp_forward; + struct Rect warp_forward_blind; + struct Rect pause_before_end; + struct Rect single_step; +}; + +struct TapeLabelInfo +{ + struct Rect eject; + struct Rect stop; + struct Rect pause; + struct Rect record; + struct Rect play; + struct Rect fast_forward; + struct Rect warp_forward; + struct Rect warp_forward_blind; + struct Rect pause_before_end; + struct Rect single_step; + struct Rect date; + struct Rect time; +}; + +struct TapeTextInfo +{ + struct TextPosInfo date; + struct TextPosInfo time; +}; + struct TapeInfo { int file_version; /* file format version the tape is stored with */ @@ -101,11 +146,11 @@ struct TapeInfo char *level_identifier; int level_nr; - unsigned long random_seed; - unsigned long date; - unsigned long counter; - unsigned long length; - unsigned long length_seconds; + unsigned int random_seed; + unsigned int date; + unsigned int counter; + unsigned int length; + unsigned int length_seconds; unsigned int delay_played; boolean pause_before_death; boolean recording, playing, pausing; @@ -128,11 +173,16 @@ struct TapeInfo byte delay; } pos[MAX_TAPE_LEN]; + struct TapeButtonInfo button; + struct TapeSymbolInfo symbol; + struct TapeLabelInfo label; + struct TapeTextInfo text; + boolean no_valid_file; /* set when tape file missing or invalid */ }; -void DrawVideoDisplay(unsigned long, unsigned long); +void DrawVideoDisplay(unsigned int, unsigned int); void DrawCompleteVideoDisplay(void); void TapeDeactivateDisplayOn(); @@ -141,7 +191,7 @@ void TapeDeactivateDisplayOff(boolean); void TapeSetDateFromEpochSeconds(time_t); void TapeSetDateFromNow(); -void TapeStartRecording(long); +void TapeStartRecording(int); void TapeHaltRecording(void); void TapeStopRecording(void); void TapeRecordAction(byte *); diff --git a/src/tools.c b/src/tools.c index c26996b6..6c8e96be 100644 --- a/src/tools.c +++ b/src/tools.c @@ -108,6 +108,37 @@ void SetDrawtoField(int mode) { if (mode == DRAW_BUFFERED && setup.soft_scrolling) { +#if NEW_TILESIZE +#if NEW_SCROLL + FX = 2 * TILEX_VAR; + FY = 2 * TILEY_VAR; + BX1 = -2; + BY1 = -2; + BX2 = SCR_FIELDX + 1; + BY2 = SCR_FIELDY + 1; + redraw_x1 = 2; + redraw_y1 = 2; +#else + FX = TILEX_VAR; + FY = TILEY_VAR; + BX1 = -1; + BY1 = -1; + BX2 = SCR_FIELDX; + BY2 = SCR_FIELDY; + redraw_x1 = 1; + redraw_y1 = 1; +#endif +#else +#if NEW_SCROLL + FX = 2 * TILEX; + FY = 2 * TILEY; + BX1 = -2; + BY1 = -2; + BX2 = SCR_FIELDX + 1; + BY2 = SCR_FIELDY + 1; + redraw_x1 = 2; + redraw_y1 = 2; +#else FX = TILEX; FY = TILEY; BX1 = -1; @@ -116,6 +147,8 @@ void SetDrawtoField(int mode) BY2 = SCR_FIELDY; redraw_x1 = 1; redraw_y1 = 1; +#endif +#endif drawto_field = fieldbuffer; } @@ -251,6 +284,11 @@ void DrawMaskedBorder(int redraw_mask) effectiveGameStatus() == GAME_MODE_TITLE) return; + /* never draw masked screen borders when displaying request outside door */ + if (effectiveGameStatus() == GAME_MODE_PSEUDO_DOOR && + global.use_envelope_request) + return; + if (redraw_mask & REDRAW_ALL) DrawMaskedBorder_ALL(); else @@ -266,6 +304,79 @@ void DrawMaskedBorder(int redraw_mask) } } +void BlitScreenToBitmap(Bitmap *target_bitmap) +{ + DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field); + int fx = FX, fy = FY; + +#if NEW_TILESIZE + int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + int dx_var = dx * TILESIZE_VAR / TILESIZE; + int dy_var = dy * TILESIZE_VAR / TILESIZE; + int ffx, ffy; + + // fx += dx * TILESIZE_VAR / TILESIZE; + // fy += dy * TILESIZE_VAR / TILESIZE; +#else + fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); +#endif + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; + ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) + fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; + else + fx += (dx_var > 0 ? TILEX_VAR : 0); + } + else + { + fx += dx_var; + } + + if (EVEN(SCR_FIELDY)) + { + if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) + fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR; + else + fy += (dy_var > 0 ? TILEY_VAR : 0); + } + else + { + fy += dy_var; + } + +#if 0 + printf("::: (%d, %d) [(%d / %d, %d / %d)] => %d, %d\n", + scroll_x, scroll_y, + SBX_Left, SBX_Right, + SBY_Upper, SBY_Lower, + fx, fy); +#endif + + if (border.draw_masked[GAME_MODE_PLAYING]) + { + if (buffer != backbuffer) + { + /* copy playfield buffer to backbuffer to add masked border */ + BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); + DrawMaskedBorder(REDRAW_FIELD); + } + + BlitBitmap(backbuffer, target_bitmap, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, + REAL_SX, REAL_SY); + } + else + { + BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); + } +} + void BackToFront() { int x, y; @@ -284,12 +395,45 @@ void BackToFront() if (redraw_mask & REDRAW_TILES && redraw_tiles > REDRAWTILES_THRESHOLD) redraw_mask |= REDRAW_FIELD; +#if 0 + // never redraw single tiles, always redraw the whole field + // (redrawing single tiles up to a certain threshold was faster on old, + // now legacy graphics, but slows things down on modern graphics now) + // UPDATE: this is now globally defined by value of REDRAWTILES_THRESHOLD + if (redraw_mask & REDRAW_TILES) + redraw_mask |= REDRAW_FIELD; +#endif + +#if 0 + /* !!! TEST ONLY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + /* (force full redraw) */ + if (game_status == GAME_MODE_PLAYING) + redraw_mask |= REDRAW_FIELD; +#endif + if (redraw_mask & REDRAW_FIELD) redraw_mask &= ~REDRAW_TILES; if (redraw_mask == REDRAW_NONE) return; +#if 0 + printf("::: "); + if (redraw_mask & REDRAW_ALL) + printf("[REDRAW_ALL]"); + if (redraw_mask & REDRAW_FIELD) + printf("[REDRAW_FIELD]"); + if (redraw_mask & REDRAW_TILES) + printf("[REDRAW_TILES]"); + if (redraw_mask & REDRAW_DOOR_1) + printf("[REDRAW_DOOR_1]"); + if (redraw_mask & REDRAW_DOOR_2) + printf("[REDRAW_DOOR_2]"); + if (redraw_mask & REDRAW_FROM_BACKBUFFER) + printf("[REDRAW_FROM_BACKBUFFER]"); + printf(" [%d]\n", FrameCounter); +#endif + if (redraw_mask & REDRAW_TILES && game_status == GAME_MODE_PLAYING && border.draw_masked[GAME_MODE_PLAYING]) @@ -332,7 +476,7 @@ void BackToFront() SyncDisplay(); - /* prevent drawing masked border to backbuffer when using playfield buffer */ + /* never draw masked border to backbuffer when using playfield buffer */ if (game_status != GAME_MODE_PLAYING || redraw_mask & REDRAW_FROM_BACKBUFFER || buffer == backbuffer) @@ -361,51 +505,88 @@ void BackToFront() } else { +#if 1 + BlitScreenToBitmap(window); +#else int fx = FX, fy = FY; - if (setup.soft_scrolling) +#if NEW_TILESIZE + int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + int dx_var = dx * TILESIZE_VAR / TILESIZE; + int dy_var = dy * TILESIZE_VAR / TILESIZE; + int ffx, ffy; + + // fx += dx * TILESIZE_VAR / TILESIZE; + // fy += dy * TILESIZE_VAR / TILESIZE; +#else + fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); +#endif + + /* !!! THIS WORKS !!! */ + + printf("::: %d, %d\n", scroll_x, scroll_y); + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; + ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; + + if (EVEN(SCR_FIELDX)) { - fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); - fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) + fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; + else + fx += (dx > 0 ? TILEX_VAR : 0); } - - if (setup.soft_scrolling || - ABS(ScreenMovPos) + ScrollStepSize == TILEX || - ABS(ScreenMovPos) == ScrollStepSize || - redraw_tiles > REDRAWTILES_THRESHOLD) + else { - if (border.draw_masked[GAME_MODE_PLAYING]) - { - if (buffer != backbuffer) - { - /* copy playfield buffer to backbuffer to add masked border */ - BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); - DrawMaskedBorder(REDRAW_FIELD); - } + fx += dx; + } - BlitBitmap(backbuffer, window, - REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, - REAL_SX, REAL_SY); - } + if (EVEN(SCR_FIELDY)) + { + if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) + fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR; else + fy += (dy > 0 ? TILEY_VAR : 0); + } + else + { + fy += dy; + } + + if (border.draw_masked[GAME_MODE_PLAYING]) + { + if (buffer != backbuffer) { - BlitBitmap(buffer, window, fx, fy, SXSIZE, SYSIZE, SX, SY); + /* copy playfield buffer to backbuffer to add masked border */ + BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); + DrawMaskedBorder(REDRAW_FIELD); } + BlitBitmap(backbuffer, window, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, + REAL_SX, REAL_SY); + } + else + { + BlitBitmap(buffer, window, fx, fy, SXSIZE, SYSIZE, SX, SY); + } +#endif + #if 0 #ifdef DEBUG - printf("redrawing all (ScreenGfxPos == %d) because %s\n", - ScreenGfxPos, - (setup.soft_scrolling ? - "setup.soft_scrolling" : - ABS(ScreenGfxPos) + ScrollStepSize == TILEX ? - "ABS(ScreenGfxPos) + ScrollStepSize == TILEX" : - ABS(ScreenGfxPos) == ScrollStepSize ? - "ABS(ScreenGfxPos) == ScrollStepSize" : - "redraw_tiles > REDRAWTILES_THRESHOLD")); + printf("redrawing all (ScreenGfxPos == %d) because %s\n", + ScreenGfxPos, + (setup.soft_scrolling ? + "setup.soft_scrolling" : + ABS(ScreenGfxPos) + ScrollStepSize == TILEX ? + "ABS(ScreenGfxPos) + ScrollStepSize == TILEX" : + ABS(ScreenGfxPos) == ScrollStepSize ? + "ABS(ScreenGfxPos) == ScrollStepSize" : + "redraw_tiles > REDRAWTILES_THRESHOLD")); #endif #endif - } } redraw_mask &= ~REDRAW_MAIN; @@ -439,12 +620,93 @@ void BackToFront() printf("::: REDRAW_TILES\n"); #endif +#if NEW_TILESIZE + +#if 1 + InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE); + + { + int sx = SX; // - (EVEN(SCR_FIELDX) ? TILEX_VAR / 2 : 0); + int sy = SY; // + (EVEN(SCR_FIELDY) ? TILEY_VAR / 2 : 0); + + int dx = 0, dy = 0; + int dx_var = dx * TILESIZE_VAR / TILESIZE; + int dy_var = dy * TILESIZE_VAR / TILESIZE; + int ffx, ffy; + int fx = FX, fy = FY; + + int scr_fieldx = SCR_FIELDX + (EVEN(SCR_FIELDX) ? 2 : 0); + int scr_fieldy = SCR_FIELDY + (EVEN(SCR_FIELDY) ? 2 : 0); + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; + ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) + { + fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; + + if (fx % TILEX_VAR) + sx -= TILEX_VAR / 2; + else + sx -= TILEX_VAR; + } + else + { + fx += (dx_var > 0 ? TILEX_VAR : 0); + } + } + + if (EVEN(SCR_FIELDY)) + { + if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) + { + fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR; + + if (fy % TILEY_VAR) + sy -= TILEY_VAR / 2; + else + sy -= TILEY_VAR; + } + else + { + fy += (dy_var > 0 ? TILEY_VAR : 0); + } + } + +#if 0 + printf("::: %d, %d, %d, %d\n", sx, sy, SCR_FIELDX, SCR_FIELDY); +#endif + + for (x = 0; x < scr_fieldx; x++) + for (y = 0 ; y < scr_fieldy; y++) + if (redraw[redraw_x1 + x][redraw_y1 + y]) + BlitBitmap(buffer, window, + FX + x * TILEX_VAR, FY + y * TILEY_VAR, + TILEX_VAR, TILEY_VAR, + sx + x * TILEX_VAR, sy + y * TILEY_VAR); + } + + InitGfxClipRegion(FALSE, -1, -1, -1, -1); +#else + for (x = 0; x < SCR_FIELDX; x++) + for (y = 0 ; y < SCR_FIELDY; y++) + if (redraw[redraw_x1 + x][redraw_y1 + y]) + BlitBitmap(buffer, window, + FX + x * TILEX_VAR, FY + y * TILEY_VAR, + TILEX_VAR, TILEY_VAR, + SX + x * TILEX_VAR, SY + y * TILEY_VAR); +#endif + +#else for (x = 0; x < SCR_FIELDX; x++) for (y = 0 ; y < SCR_FIELDY; y++) if (redraw[redraw_x1 + x][redraw_y1 + y]) BlitBitmap(buffer, window, FX + x * TILEX, FY + y * TILEY, TILEX, TILEY, SX + x * TILEX, SY + y * TILEY); +#endif } if (redraw_mask & REDRAW_FPS) /* display frames per second */ @@ -795,8 +1057,22 @@ void SetDoorBackgroundImage(int graphic) void SetPanelBackground() { +#if 1 + struct GraphicInfo *gfx = &graphic_info[IMG_BACKGROUND_PANEL]; + +#if 1 + BlitBitmapTiled(gfx->bitmap, bitmap_db_panel, gfx->src_x, gfx->src_y, + gfx->width, gfx->height, 0, 0, DXSIZE, DYSIZE); +#else + /* (ClearRectangle() only needed if panel bitmap is smaller than panel) */ + ClearRectangle(bitmap_db_panel, DX, DY, DXSIZE, DYSIZE); + BlitBitmap(gfx->bitmap, bitmap_db_panel, gfx->src_x, gfx->src_y, + MIN(gfx->width, DXSIZE), MIN(gfx->height, DYSIZE), 0, 0); +#endif +#else BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, bitmap_db_panel, DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, 0, 0); +#endif SetDoorBackgroundBitmap(bitmap_db_panel); } @@ -811,7 +1087,18 @@ void DrawBackground(int x, int y, int width, int height) ClearRectangleOnBackground(backbuffer, x, y, width, height); #endif +#if 1 + /* (this only works for the current arrangement of playfield and panels) */ + if (x < gfx.dx) + redraw_mask |= REDRAW_FIELD; + else if (y < gfx.vy) + redraw_mask |= REDRAW_DOOR_1; + else + redraw_mask |= REDRAW_DOOR_2; +#else + /* (this is just wrong (when drawing to one of the two door panel areas)) */ redraw_mask |= REDRAW_FIELD; +#endif } void DrawBackgroundForFont(int x, int y, int width, int height, int font_nr) @@ -932,8 +1219,9 @@ inline int getGraphicAnimationFrame(int graphic, int sync_frame) sync_frame); } -void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, - Bitmap **bitmap, int *x, int *y) +void getSizedGraphicSourceExt(int graphic, int frame, int tilesize_raw, + Bitmap **bitmap, int *x, int *y, + boolean get_backside) { struct { @@ -959,8 +1247,15 @@ void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, int height_div = offset_calc[offset_calc_pos].height_div; int startx = src_bitmap->width * width_mult / width_div; int starty = src_bitmap->height * height_mult / height_div; +#if NEW_TILESIZE + int src_x = (g->src_x + (get_backside ? g->offset2_x : 0)) * + tilesize / TILESIZE; + int src_y = (g->src_y + (get_backside ? g->offset2_y : 0)) * + tilesize / TILESIZE; +#else int src_x = g->src_x * tilesize / TILESIZE; int src_y = g->src_y * tilesize / TILESIZE; +#endif int width = g->width * tilesize / TILESIZE; int height = g->height * tilesize / TILESIZE; int offset_x = g->offset_x * tilesize / TILESIZE; @@ -993,6 +1288,25 @@ void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, *y = starty + src_y; } +void getFixedGraphicSourceExt(int graphic, int frame, Bitmap **bitmap, + int *x, int *y, boolean get_backside) +{ + getSizedGraphicSourceExt(graphic, frame, TILESIZE, bitmap, x, y, + get_backside); +} + +void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, + Bitmap **bitmap, int *x, int *y) +{ + getSizedGraphicSourceExt(graphic, frame, tilesize_raw, bitmap, x, y, FALSE); +} + +void getFixedGraphicSource(int graphic, int frame, + Bitmap **bitmap, int *x, int *y) +{ + getSizedGraphicSourceExt(graphic, frame, TILESIZE, bitmap, x, y, FALSE); +} + void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) { #if 1 @@ -1015,6 +1329,12 @@ inline void getGraphicSourceExt(int graphic, int frame, Bitmap **bitmap, int src_x = g->src_x + (get_backside ? g->offset2_x : 0); int src_y = g->src_y + (get_backside ? g->offset2_y : 0); +#if NEW_TILESIZE + if (TILESIZE_VAR != TILESIZE) + return getSizedGraphicSourceExt(graphic, frame, TILESIZE_VAR, bitmap, x, y, + get_backside); +#endif + *bitmap = g->bitmap; if (g->offset_y == 0) /* frames are ordered horizontally */ @@ -1056,7 +1376,28 @@ void DrawGraphic(int x, int y, int graphic, int frame) } #endif +#if NEW_TILESIZE + DrawGraphicExt(drawto_field, FX + x * TILEX_VAR, FY + y * TILEY_VAR, graphic, + frame); +#else DrawGraphicExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, frame); +#endif + MarkTileDirty(x, y); +} + +void DrawFixedGraphic(int x, int y, int graphic, int frame) +{ +#if DEBUG + if (!IN_SCR_FIELD(x, y)) + { + printf("DrawGraphic(): x = %d, y = %d, graphic = %d\n", x, y, graphic); + printf("DrawGraphic(): This should never happen!\n"); + return; + } +#endif + + DrawFixedGraphicExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, + frame); MarkTileDirty(x, y); } @@ -1067,6 +1408,20 @@ void DrawGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, int src_x, src_y; getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); +#if NEW_TILESIZE + BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX_VAR, TILEY_VAR, x, y); +#else + BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); +#endif +} + +void DrawFixedGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, + int frame) +{ + Bitmap *src_bitmap; + int src_x, src_y; + + getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); } @@ -1081,8 +1436,29 @@ void DrawGraphicThruMask(int x, int y, int graphic, int frame) } #endif - DrawGraphicThruMaskExt(drawto_field, FX + x * TILEX, FY + y *TILEY, graphic, +#if NEW_TILESIZE + DrawGraphicThruMaskExt(drawto_field, FX + x * TILEX_VAR, FY + y * TILEY_VAR, + graphic, frame); +#else + DrawGraphicThruMaskExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, frame); +#endif + MarkTileDirty(x, y); +} + +void DrawFixedGraphicThruMask(int x, int y, int graphic, int frame) +{ +#if DEBUG + if (!IN_SCR_FIELD(x, y)) + { + printf("DrawGraphicThruMask(): x = %d,y = %d, graphic = %d\n",x,y,graphic); + printf("DrawGraphicThruMask(): This should never happen!\n"); + return; + } +#endif + + DrawFixedGraphicThruMaskExt(drawto_field, FX + x * TILEX, FY + y * TILEY, + graphic, frame); MarkTileDirty(x, y); } @@ -1094,6 +1470,24 @@ void DrawGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, int graphic, getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, + dst_x - src_x, dst_y - src_y); +#if NEW_TILESIZE + BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX_VAR, TILEY_VAR, + dst_x, dst_y); +#else + BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dst_x, dst_y); +#endif +} + +void DrawFixedGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, + int graphic, int frame) +{ + Bitmap *src_bitmap; + int src_x, src_y; + + getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, dst_x - src_x, dst_y - src_y); BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dst_x, dst_y); @@ -1214,6 +1608,15 @@ inline static void DrawGraphicShiftedNormal(int x, int y, int dx, int dy, } #endif +#if NEW_TILESIZE + width = width * TILESIZE_VAR / TILESIZE; + height = height * TILESIZE_VAR / TILESIZE; + cx = cx * TILESIZE_VAR / TILESIZE; + cy = cy * TILESIZE_VAR / TILESIZE; + dx = dx * TILESIZE_VAR / TILESIZE; + dy = dy * TILESIZE_VAR / TILESIZE; +#endif + if (width > 0 && height > 0) { getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); @@ -1221,8 +1624,13 @@ inline static void DrawGraphicShiftedNormal(int x, int y, int dx, int dy, src_x += cx; src_y += cy; +#if NEW_TILESIZE + dst_x = FX + x * TILEX_VAR + dx; + dst_y = FY + y * TILEY_VAR + dy; +#else dst_x = FX + x * TILEX + dx; dst_y = FY + y * TILEY + dy; +#endif if (mask_mode == USE_MASKING) { @@ -1246,7 +1654,11 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, Bitmap *src_bitmap; int src_x, src_y; int dst_x, dst_y; +#if NEW_TILESIZE + int width = TILEX_VAR, height = TILEY_VAR; +#else int width = TILEX, height = TILEY; +#endif int x1 = x; int y1 = y; int x2 = x + SIGN(dx); @@ -1293,8 +1705,13 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, { getGraphicSourceExt(graphic, frame, &src_bitmap, &src_x, &src_y, TRUE); +#if NEW_TILESIZE + dst_x = FX + x1 * TILEX_VAR; + dst_y = FY + y1 * TILEY_VAR; +#else dst_x = FX + x1 * TILEX; dst_y = FY + y1 * TILEY; +#endif if (mask_mode == USE_MASKING) { @@ -1315,8 +1732,13 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, { getGraphicSourceExt(graphic, frame, &src_bitmap, &src_x, &src_y, FALSE); +#if NEW_TILESIZE + dst_x = FX + x2 * TILEX_VAR; + dst_y = FY + y2 * TILEY_VAR; +#else dst_x = FX + x2 * TILEX; dst_y = FY + y2 * TILEY; +#endif if (mask_mode == USE_MASKING) { @@ -1486,6 +1908,15 @@ static void DrawLevelFieldCrumbledInnerCorners(int x, int y, int dx, int dy, getGraphicSource(graphic, 1, &src_bitmap, &src_x, &src_y); +#if NEW_TILESIZE + width = crumbled_border_size * TILESIZE_VAR / TILESIZE; + height = crumbled_border_size * TILESIZE_VAR / TILESIZE; + cx = (dx > 0 ? TILEX - crumbled_border_size : 0) * TILESIZE_VAR / TILESIZE; + cy = (dy > 0 ? TILEY - crumbled_border_size : 0) * TILESIZE_VAR / TILESIZE; + + BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy, + width, height, FX + sx * TILEX_VAR + cx, FY + sy * TILEY_VAR + cy); +#else width = crumbled_border_size; height = crumbled_border_size; cx = (dx > 0 ? TILEX - crumbled_border_size : 0); @@ -1493,6 +1924,7 @@ static void DrawLevelFieldCrumbledInnerCorners(int x, int y, int dx, int dy, BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy, width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy); +#endif } static void DrawLevelFieldCrumbledBorders(int x, int y, int graphic, int frame, @@ -1531,8 +1963,18 @@ static void DrawLevelFieldCrumbledBorders(int x, int y, int graphic, int frame, } #endif +#if NEW_TILESIZE + BlitBitmap(src_bitmap, drawto_field, + src_x + cx * TILESIZE_VAR / TILESIZE, + src_y + cy * TILESIZE_VAR / TILESIZE, + width * TILESIZE_VAR / TILESIZE, + height * TILESIZE_VAR / TILESIZE, + FX + sx * TILEX_VAR + cx * TILESIZE_VAR / TILESIZE, + FY + sy * TILEY_VAR + cy * TILESIZE_VAR / TILESIZE); +#else BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy, width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy); +#endif /* (remaining middle border part must be at least as big as corner part) */ if (!(graphic_info[graphic].style & STYLE_ACCURATE_BORDERS) || @@ -1579,8 +2021,18 @@ static void DrawLevelFieldCrumbledBorders(int x, int y, int graphic, int frame, by = cy; } +#if NEW_TILESIZE + BlitBitmap(src_bitmap, drawto_field, + src_x + bx * TILESIZE_VAR / TILESIZE, + src_y + by * TILESIZE_VAR / TILESIZE, + width * TILESIZE_VAR / TILESIZE, + height * TILESIZE_VAR / TILESIZE, + FX + sx * TILEX_VAR + cx * TILESIZE_VAR / TILESIZE, + FY + sy * TILEY_VAR + cy * TILESIZE_VAR / TILESIZE); +#else BlitBitmap(src_bitmap, drawto_field, src_x + bx, src_y + by, width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy); +#endif } } #else @@ -2031,7 +2483,7 @@ void DrawEnvelopeBackground(int envelope_nr, int startx, int starty, int inner_sy = (height >= 3 * font_height ? font_height : 0); boolean draw_masked = graphic_info[graphic].draw_masked; - getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); if (src_bitmap == NULL || width < font_width || height < font_height) { @@ -2063,7 +2515,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND); boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); - unsigned long anim_delay = 0; + unsigned int anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); int anim_delay_value = (no_delay ? 0 : frame_delay_value); int font_nr = FONT_ENVELOPE_1 + envelope_nr; @@ -2125,7 +2577,7 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND); boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); - unsigned long anim_delay = 0; + unsigned int anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); int anim_delay_value = (no_delay ? 0 : frame_delay_value); #if 1 @@ -2417,7 +2869,7 @@ void ShowEnvelopeDoor(char *text, int action) game.envelope_active = FALSE; #if 1 - game_status = last_game_status; /* restore current game status */ + // game_status = last_game_status; /* restore current game status */ if (action == ACTION_CLOSING) { @@ -2445,6 +2897,9 @@ void ShowEnvelopeDoor(char *text, int action) BackToFront(); + /* (important: after "BackToFront()", but before "SetDrawtoField()") */ + game_status = last_game_status; /* restore current game status */ + if (game_status == GAME_MODE_PLAYING && level.game_engine_type == GAME_ENGINE_TYPE_RND) SetDrawtoField(DRAW_BUFFERED); @@ -2632,11 +3087,11 @@ static void DrawPreviewLevelLabelExt(int mode) void DrawPreviewLevel(boolean restart) { - static unsigned long scroll_delay = 0; - static unsigned long label_delay = 0; + static unsigned int scroll_delay = 0; + static unsigned int label_delay = 0; static int from_x, from_y, scroll_direction; static int label_state, label_counter; - unsigned long scroll_delay_value = preview.step_delay; + unsigned int scroll_delay_value = preview.step_delay; boolean show_level_border = (BorderElement != EL_EMPTY); int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); @@ -2827,6 +3282,18 @@ inline void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, DrawGraphicExt(dst_bitmap, x, y, graphic, frame); } +inline void DrawFixedGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, + int graphic, int sync_frame, + int mask_mode) +{ + int frame = getGraphicAnimationFrame(graphic, sync_frame); + + if (mask_mode == USE_MASKING) + DrawFixedGraphicThruMaskExt(dst_bitmap, x, y, graphic, frame); + else + DrawFixedGraphicExt(dst_bitmap, x, y, graphic, frame); +} + inline void DrawGraphicAnimation(int x, int y, int graphic) { int lx = LEVELX(x), ly = LEVELY(y); @@ -2834,6 +3301,23 @@ inline void DrawGraphicAnimation(int x, int y, int graphic) if (!IN_SCR_FIELD(x, y)) return; +#if NEW_TILESIZE + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX_VAR, FY + y * TILEY_VAR, + graphic, GfxFrame[lx][ly], NO_MASKING); +#else + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY, + graphic, GfxFrame[lx][ly], NO_MASKING); +#endif + MarkTileDirty(x, y); +} + +inline void DrawFixedGraphicAnimation(int x, int y, int graphic) +{ + int lx = LEVELX(x), ly = LEVELY(y); + + if (!IN_SCR_FIELD(x, y)) + return; + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, GfxFrame[lx][ly], NO_MASKING); MarkTileDirty(x, y); @@ -3378,13 +3862,16 @@ boolean Request(char *text, unsigned int req_state) int last_game_status = game_status; /* save current game status */ int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN; int font_nr = FONT_TEXT_2; - boolean use_envelope_request = TRUE * 0; #if 0 int max_word_len = 0; #endif char *text_ptr; int i; +#if 1 + global.use_envelope_request = 0; +#endif + #if 1 if (maxWordLengthInString(text) > MAX_REQUEST_LINE_FONT1_LEN) { @@ -3440,13 +3927,21 @@ boolean Request(char *text, unsigned int req_state) UnmapAllGadgets(); -#if 1 - if (old_door_state & DOOR_OPEN_1 && !use_envelope_request) + /* draw released gadget before proceeding */ + // BackToFront(); + +#if 0 + if (old_door_state & DOOR_OPEN_1 && !global.use_envelope_request) #else if (old_door_state & DOOR_OPEN_1) #endif { +#if 1 + if (!global.use_envelope_request) + CloseDoor(DOOR_CLOSE_1); +#else CloseDoor(DOOR_CLOSE_1); +#endif /* save old door content */ BlitBitmap(bitmap_db_door, bitmap_db_door, @@ -3502,7 +3997,7 @@ boolean Request(char *text, unsigned int req_state) game_status = last_game_status; /* restore current game status */ #if 1 - if (use_envelope_request) + if (global.use_envelope_request) { /* !!! TMP !!! */ FreeToolButtons(); @@ -3533,7 +4028,7 @@ boolean Request(char *text, unsigned int req_state) DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); #if 1 - if (use_envelope_request) + if (global.use_envelope_request) { ShowEnvelopeDoor(text, ACTION_OPENING); @@ -3557,7 +4052,7 @@ boolean Request(char *text, unsigned int req_state) #endif #if 1 - if (!use_envelope_request) + if (!global.use_envelope_request) OpenDoor(DOOR_OPEN_1); #else OpenDoor(DOOR_OPEN_1); @@ -3579,7 +4074,7 @@ boolean Request(char *text, unsigned int req_state) } #if 1 - if (game_status != GAME_MODE_MAIN && !use_envelope_request) + if (game_status != GAME_MODE_MAIN && !global.use_envelope_request) InitAnimation(); #else if (game_status != GAME_MODE_MAIN) @@ -3721,8 +4216,16 @@ boolean Request(char *text, unsigned int req_state) Delay(10); } +#if 1 + game_status = GAME_MODE_PSEUDO_DOOR; +#endif + BackToFront(); +#if 1 + game_status = last_game_status; /* restore current game status */ +#endif + #else DoAnimation(); @@ -3744,12 +4247,12 @@ boolean Request(char *text, unsigned int req_state) UnmapToolButtons(); #if 1 - if (use_envelope_request) + if (global.use_envelope_request) ShowEnvelopeDoor(text, ACTION_CLOSING); #endif #if 1 - if (!(req_state & REQ_STAY_OPEN) && !use_envelope_request) + if (!(req_state & REQ_STAY_OPEN) && !global.use_envelope_request) #else if (!(req_state & REQ_STAY_OPEN)) #endif @@ -3842,8 +4345,8 @@ unsigned int MoveDoor(unsigned int door_state) { static int door1 = DOOR_OPEN_1; static int door2 = DOOR_CLOSE_2; - unsigned long door_delay = 0; - unsigned long door_delay_value; + unsigned int door_delay = 0; + unsigned int door_delay_value; int stepsize = 1; if (door_1.width < 0 || door_1.width > DXSIZE) @@ -4262,7 +4765,7 @@ void CreateToolButtons() Bitmap *deco_bitmap = None; int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int gd_xoffset, gd_yoffset; int gd_x1, gd_x2, gd_y; int id = i; @@ -6745,7 +7248,7 @@ int getGameFrameDelay_EM(int native_em_game_frame_delay) return game_frame_delay_value; } -unsigned int InitRND(long seed) +unsigned int InitRND(int seed) { if (level.game_engine_type == GAME_ENGINE_TYPE_EM) return InitEngineRandom_EM(seed); @@ -6778,6 +7281,7 @@ inline static int get_effective_element_EM(int tile, int frame_em) return (frame_em > 5 ? EL_EMPTY : element); #if 0 + /* !!! FIX !!! */ case Ydiamond_stone: // if (!game.use_native_emc_graphics_engine) return EL_ROCK; @@ -8333,29 +8837,45 @@ void InitGraphicInfo_EM(void) } void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, - boolean any_player_moving) + boolean any_player_moving, + boolean player_is_dropping) { - int i; - if (tape.single_step && tape.recording && !tape.pausing) { +#if 0 boolean active_players = FALSE; + int i; for (i = 0; i < MAX_PLAYERS; i++) if (action[i] != JOY_NO_ACTION) active_players = TRUE; +#endif - if (frame == 0) + // if (frame == 0) + if (frame == 0 && !player_is_dropping) TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); } } -void CheckSingleStepMode_SP(boolean murphy_is_moving) +void CheckSingleStepMode_SP(boolean murphy_is_waiting, + boolean murphy_is_dropping) { +#if 0 + printf("::: waiting: %d, dropping: %d\n", + murphy_is_waiting, murphy_is_dropping); +#endif + if (tape.single_step && tape.recording && !tape.pausing) { - if (!murphy_is_moving) + // if (murphy_is_waiting || murphy_is_dropping) + if (murphy_is_waiting) + { +#if 0 + printf("::: murphy is waiting -> pause mode\n"); +#endif + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + } } } @@ -8518,8 +9038,27 @@ void ChangeViewportPropertiesIfNeeded() int border_size = vp_playfield->border_size; int new_sx = vp_playfield->x + border_size; int new_sy = vp_playfield->y + border_size; + int new_sxsize = vp_playfield->width - 2 * border_size; + int new_sysize = vp_playfield->height - 2 * border_size; + int new_real_sx = vp_playfield->x; + int new_real_sy = vp_playfield->y; + int new_full_sxsize = vp_playfield->width; + int new_full_sysize = vp_playfield->height; +#if NEW_TILESIZE + int new_tilesize_var = TILESIZE / (setup.small_game_graphics ? 2 : 1); + int tilesize = (gfx_game_mode == GAME_MODE_PLAYING ? new_tilesize_var : + gfx_game_mode == GAME_MODE_EDITOR ? MINI_TILESIZE : TILESIZE); + int new_scr_fieldx = new_sxsize / tilesize; + int new_scr_fieldy = new_sysize / tilesize; + int new_scr_fieldx_buffers = new_sxsize / new_tilesize_var; + int new_scr_fieldy_buffers = new_sysize / new_tilesize_var; +#else int new_scr_fieldx = (vp_playfield->width - 2 * border_size) / TILESIZE; int new_scr_fieldy = (vp_playfield->height - 2 * border_size) / TILESIZE; +#endif + boolean init_gfx_buffers = FALSE; + boolean init_video_buffer = FALSE; + boolean init_gadgets_and_toons = FALSE; #if 0 /* !!! TEST ONLY !!! */ @@ -8533,6 +9072,10 @@ void ChangeViewportPropertiesIfNeeded() WIN_XSIZE = viewport.window.width; WIN_YSIZE = viewport.window.height; +#if 1 + init_video_buffer = TRUE; + init_gfx_buffers = TRUE; +#else InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); InitGfxBuffers(); @@ -8542,40 +9085,123 @@ void ChangeViewportPropertiesIfNeeded() // RedrawBackground(); #endif +#endif + + // printf("::: video: init_video_buffer, init_gfx_buffers\n"); } if (new_scr_fieldx != SCR_FIELDX || - new_scr_fieldy != SCR_FIELDY || - new_sx != SX || + new_scr_fieldy != SCR_FIELDY) + { + /* this always toggles between MAIN and GAME when using small tile size */ + + SCR_FIELDX = new_scr_fieldx; + SCR_FIELDY = new_scr_fieldy; + + // printf("::: new_scr_fieldx != SCR_FIELDX ...\n"); + } + +#if 0 + if (new_tilesize_var != TILESIZE_VAR && + gfx_game_mode == GAME_MODE_PLAYING) + { + /* doing this outside GAME_MODE_PLAYING would give wrong playfield size */ + + TILESIZE_VAR = new_tilesize_var; + + init_gfx_buffers = TRUE; + + // printf("::: tilesize: init_gfx_buffers\n"); + } +#endif + + if (new_sx != SX || new_sy != SY || - vp_playfield->x != REAL_SX || - vp_playfield->y != REAL_SY || + new_sxsize != SXSIZE || + new_sysize != SYSIZE || + new_real_sx != REAL_SX || + new_real_sy != REAL_SY || + new_full_sxsize != FULL_SXSIZE || + new_full_sysize != FULL_SYSIZE || + new_tilesize_var != TILESIZE_VAR || vp_door_1->x != *door_1_x || vp_door_1->y != *door_1_y || vp_door_2->x != *door_2_x || vp_door_2->y != *door_2_y) { - SCR_FIELDX = new_scr_fieldx; - SCR_FIELDY = new_scr_fieldy; SX = new_sx; SY = new_sy; - REAL_SX = vp_playfield->x; - REAL_SY = vp_playfield->y; + SXSIZE = new_sxsize; + SYSIZE = new_sysize; + REAL_SX = new_real_sx; + REAL_SY = new_real_sy; + FULL_SXSIZE = new_full_sxsize; + FULL_SYSIZE = new_full_sysize; + TILESIZE_VAR = new_tilesize_var; + +#if 0 + printf("::: %d, %d, %d [%d]\n", + SCR_FIELDX, SCR_FIELDY, TILESIZE_VAR, + setup.small_game_graphics); +#endif *door_1_x = vp_door_1->x; *door_1_y = vp_door_1->y; *door_2_x = vp_door_2->x; *door_2_y = vp_door_2->y; +#if 1 + init_gfx_buffers = TRUE; + + // printf("::: viewports: init_gfx_buffers\n"); +#else InitGfxBuffers(); +#endif if (gfx_game_mode == GAME_MODE_MAIN) { +#if 1 + init_gadgets_and_toons = TRUE; + + // printf("::: viewports: init_gadgets_and_toons\n"); +#else InitGadgets(); InitToons(); +#endif } } + if (init_gfx_buffers) + { + // printf("::: init_gfx_buffers\n"); + + SCR_FIELDX = new_scr_fieldx_buffers; + SCR_FIELDY = new_scr_fieldy_buffers; + + InitGfxBuffers(); + + SCR_FIELDX = new_scr_fieldx; + SCR_FIELDY = new_scr_fieldy; + } + + if (init_video_buffer) + { + // printf("::: init_video_buffer\n"); + + InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); + + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); + } + + if (init_gadgets_and_toons) + { + // printf("::: init_gadgets_and_toons\n"); + + InitGadgets(); + InitToons(); + } + #if 0 printf("::: %d, %d / %d, %d [%d]\n", VX, VY, EX, EY, game_status); #endif diff --git a/src/tools.h b/src/tools.h index 510524af..d834df77 100644 --- a/src/tools.h +++ b/src/tools.h @@ -70,6 +70,7 @@ void DrawMaskedBorder(int); void SetDrawtoField(int); void RedrawPlayfield(boolean, int, int, int, int); +void BlitScreenToBitmap(Bitmap *); void BackToFront(); void FadeIn(int); @@ -103,8 +104,13 @@ void FloodFillLevel(int, int, int, short[MAX_LEV_FIELDX][MAX_LEV_FIELDY], void SetRandomAnimationValue(int, int); int getGraphicAnimationFrame(int, int); -void DrawGraphicAnimationExt(DrawBuffer *, int, int, int, int, int); + void DrawGraphicAnimation(int, int, int); +void DrawGraphicAnimationExt(DrawBuffer *, int, int, int, int, int); + +void DrawFixedGraphicAnimation(int, int, int); +void DrawFixedGraphicAnimationExt(DrawBuffer *, int, int, int, int, int); + void DrawLevelGraphicAnimation(int, int, int); void DrawLevelElementAnimation(int, int, int); void DrawLevelGraphicAnimationIfNeeded(int, int, int); @@ -114,17 +120,27 @@ void DrawAllPlayers(void); void DrawPlayerField(int, int); void DrawPlayer(struct PlayerInfo *); +void getSizedGraphicSourceExt(int, int, int, Bitmap **, int *, int *, boolean); +void getFixedGraphicSourceExt(int, int, Bitmap **, int *, int *, boolean); void getSizedGraphicSource(int, int, int, Bitmap **, int *, int *); +void getFixedGraphicSource(int, int, Bitmap **, int *, int *); void getMiniGraphicSource(int, Bitmap **, int *, int *); void getGraphicSourceExt(int, int, Bitmap **, int *, int *, boolean); void getGraphicSource(int, int, Bitmap **, int *, int *); + void DrawGraphic(int, int, int, int); void DrawGraphicExt(DrawBuffer *, int, int, int, int); void DrawGraphicThruMask(int, int, int, int); void DrawGraphicThruMaskExt(DrawBuffer *, int, int, int, int); +void DrawFixedGraphic(int, int, int, int); +void DrawFixedGraphicExt(DrawBuffer *, int, int, int, int); +void DrawFixedGraphicThruMask(int, int, int, int); +void DrawFixedGraphicThruMaskExt(DrawBuffer *, int, int, int, int); + void DrawSizedGraphic(int, int, int, int, int); void DrawSizedGraphicExt(DrawBuffer *, int, int, int, int, int); + void DrawMiniGraphic(int, int, int); void DrawMiniGraphicExt(DrawBuffer *, int, int, int); @@ -202,7 +218,7 @@ int getBeltElementFromBeltNrAndBeltDir(int, int); int getBeltSwitchElementFromBeltNrAndBeltDirNr(int, int); int getBeltSwitchElementFromBeltNrAndBeltDir(int, int); -unsigned int InitRND(long); +unsigned int InitRND(int); void InitGraphicInfo_EM(void); void PlayMenuSoundExt(int);