From: Holger Schemel Date: Sat, 30 Aug 2014 08:57:13 +0000 (+0200) Subject: Merge branch 'master' into releases X-Git-Tag: 3.2.6.0^0 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=95e671b15104bb05c8302000facc906cbf0b133e;hp=42c90fcf3dd414871b0994ea00f149ddf2986c6b Merge branch 'master' into releases --- diff --git a/ChangeLog b/ChangeLog index 58278f94..52445eae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,126 @@ +2008-10-11 + * fixed behaviour of player option "no centering when relocating" which + was incorrect when disabled and relocation target inside visible area + and "no scrolling when relocating" enabled at the same time + +2008-10-06 + * fixed problems with re-mapping players on playfield to input devices: + previously, players found on the level playfield were changed to the + players connected to input devices (for example, player 3 in the level + was changed to player 1 (using artwork of player 3, to be able to use + a player with a different color)); this had the disadvantage that CE + conditions using player elements did not work (because the players in + the level definition are different to those effectively used in-game); + the new system uses the same player elements as defined in the level + playfield and re-maps the input devices of connected players to the + corresponding player elements when playing the level (in the above + example, player 3 now really exists in the game and is moved using the + events from input device 1); level tapes still store the events from + input devices 1 to 4, which are then re-mapped to players accordingly + when re-playing the tape (just as it is done when playing the level) + +2008-09-29 + * fixed bug with player relocation while the player switches an element + +2008-09-24 + * fixed bug with EM/DC style exit and EM/DC style steel exit which was + not walkable (and did not let the player enter) when in process of + opening, but not fully open yet (which can cause the player not being + able to enter the exit in EM/DC style levels in time) + +2008-08-02 + * fixed some bugs regarding the new level/CE random seed reset options + +2008-07-14 + * moved "level settings" and "editor settings" to two tabbed screens in + level editor to gain space for additional level property settings + * added level setting to start a level with always the same random seed + * added CE action "set random seed" to re-initialize random seed in game + (this is the only CE action that gets executed before the CE changes, + which is needed to use the newly set random seed during the CE change) + +2008-06-16 + * fixed redraw problem of special editor door when playing from editor + +2008-06-16 + * fixed initialization of gfx_element for level sketch image creation + +2008-06-15 + * added switch for EM style dynamite "[ ] explodes with chain reaction" + (with default set to "on" for existing levels, but "off" for all new + levels), as EM style dynamite does not chain-explode in original EM + +2008-02-05 + * added optional initial inventory for players (pre-collected elements) + * added change page actions "set player inventory" and "set CE artwork" + * added recognition of "player" parameter on change pages when player + actions are defined, but no trigger player in corresponding condition + (this resulted in actions that only affected the first player before) + * fixed bug with change actions being executed for newly created custom + elements resulting from custom element changes, when the intention was + only to check for change actions for the previous custom element + +2008-02-03 + * changed design and size of element drawing area in level editor + * added "element used as action parameter" to element change actions + +2008-01-27 + * added possibility to reanimate player immediately after his death + (for example, by "change to when explosion of ") + +2008-01-25 + * fixed bug with "gray" white door not being uncovered by magnifier + * added score for collecting (any) key to the white key config page + +2008-01-22 + * added condition "deadly when " for custom elements + that behaves a bit like the existing "deadly when ", + but with the following differences: + - it only kills players or friends when it was moving before it hits + - it does not kill players or friends that try to run into it + +2008-01-21 + * fixed the following change conditions where a player element is used + as the "element that is triggering the custom element change": + - touching + - hitting + - explosion of + - move of + (the last two conditions already worked partially, but only for the + first player, and not for the "Murphy" player when using "move of") + +2008-01-20 + * fixed crash bug caused by accessing invalid element (with value -1) + in UpdateGameControlValues() + * fixed graphical bug when using two-tile movement animations with EMC + game engine without explicitly using native EMC graphics engine + +2007-10-31 + * fixed bug in new "can dig" feature (see below) so that an unsuccessful + try to push something (due to push delay) does not cause a dig action + +2007-10-29 + * fixed bug with reference elements used as trigger elements on custom + element change pages not being recognized + * fixed bug with reference elements not being removed from the playfield + * added engine functionality that allows custom elements that "can dig" + other elements not only to do so when moving by themselves, but also + when being pushed by the player (therefore adding the functionality to + push one element over another element, replacing it with the new one) + +2007-10-23 + * added command line function to write level sketch images to directory + +2007-10-20 + * merged override and auto-override options into new override options + with a new data type than can take the values "no", "yes" and "auto" + +2007-10-18 + * fixed growing steel wall to also leave behind steel wall instead of + normal, destructible wall + * fixed handling of rocks falling through stacks of quicksand with + different speed (before, the rocks just got stuck in the quicksand) + 2007-10-09 * fixed nasty bug with auto-override and normal override not working on program startup (especially when current level set has custom artwork) diff --git a/Makefile b/Makefile index ea1154ef..65ea127a 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ CROSS_PATH_MSDOS = /usr/local/cross-msdos/i386-msdosdjgpp CROSS_PATH_WIN32 = /usr/local/cross-tools/i386-mingw32msvc # compile special edition of R'n'D instead of the normal (classic) version -SPECIAL_EDITION = rnd_jue +# SPECIAL_EDITION = rnd_jue # ----------------------------------------------------------------------------- @@ -130,6 +130,9 @@ enginetestnew: all leveltest: all ./Scripts/make_enginetest.sh leveltest +levelsketch_images: all + ./Scripts/make_levelsketch_images.sh + backup: ./Scripts/make_backup.sh src 1 diff --git a/src/Makefile b/src/Makefile index 6b82fb50..bd5538ea 100644 --- a/src/Makefile +++ b/src/Makefile @@ -311,13 +311,13 @@ clean: clean-obj clean-ico clean-bin # ----------------------------------------------------------------------------- run: all - $(PROGNAME) --verbose + cd .. && ./$(PROGBASE) --verbose gdb: all - gdb -batch -x ../GDB_COMMANDS $(PROGNAME) + cd .. && gdb -batch -x GDB_COMMANDS ./$(PROGBASE) valgrind: all - valgrind -v --leak-check=yes $(PROGNAME) 2> ../valgrind.out + cd .. && valgrind -v --leak-check=yes ./$(PROGBASE) 2> valgrind.out # ----------------------------------------------------------------------------- diff --git a/src/conf_cus.c b/src/conf_cus.c index 06f91a75..50d70783 100644 --- a/src/conf_cus.c +++ b/src/conf_cus.c @@ -18,2053 +18,2053 @@ /* values for graphics configuration (custom elements) */ - { "custom_1", "RocksElements.pcx" }, - { "custom_1.xpos", "7" }, - { "custom_1.ypos", "9" }, + { "custom_1", "RocksCE.pcx" }, + { "custom_1.xpos", "0" }, + { "custom_1.ypos", "0" }, { "custom_1.frames", "1" }, - { "custom_1.EDITOR", "RocksElements.pcx" }, - { "custom_1.EDITOR.xpos", "15" }, - { "custom_1.EDITOR.ypos", "13" }, + { "custom_1.EDITOR", "RocksCE.pcx" }, + { "custom_1.EDITOR.xpos", "16" }, + { "custom_1.EDITOR.ypos", "0" }, - { "custom_2", "RocksElements.pcx" }, - { "custom_2.xpos", "7" }, - { "custom_2.ypos", "9" }, + { "custom_2", "RocksCE.pcx" }, + { "custom_2.xpos", "1" }, + { "custom_2.ypos", "0" }, { "custom_2.frames", "1" }, - { "custom_2.EDITOR", "RocksElements.pcx" }, - { "custom_2.EDITOR.xpos", "15" }, - { "custom_2.EDITOR.ypos", "13" }, + { "custom_2.EDITOR", "RocksCE.pcx" }, + { "custom_2.EDITOR.xpos", "17" }, + { "custom_2.EDITOR.ypos", "0" }, - { "custom_3", "RocksElements.pcx" }, - { "custom_3.xpos", "7" }, - { "custom_3.ypos", "9" }, + { "custom_3", "RocksCE.pcx" }, + { "custom_3.xpos", "2" }, + { "custom_3.ypos", "0" }, { "custom_3.frames", "1" }, - { "custom_3.EDITOR", "RocksElements.pcx" }, - { "custom_3.EDITOR.xpos", "15" }, - { "custom_3.EDITOR.ypos", "13" }, + { "custom_3.EDITOR", "RocksCE.pcx" }, + { "custom_3.EDITOR.xpos", "18" }, + { "custom_3.EDITOR.ypos", "0" }, - { "custom_4", "RocksElements.pcx" }, - { "custom_4.xpos", "7" }, - { "custom_4.ypos", "9" }, + { "custom_4", "RocksCE.pcx" }, + { "custom_4.xpos", "3" }, + { "custom_4.ypos", "0" }, { "custom_4.frames", "1" }, - { "custom_4.EDITOR", "RocksElements.pcx" }, - { "custom_4.EDITOR.xpos", "15" }, - { "custom_4.EDITOR.ypos", "13" }, + { "custom_4.EDITOR", "RocksCE.pcx" }, + { "custom_4.EDITOR.xpos", "19" }, + { "custom_4.EDITOR.ypos", "0" }, - { "custom_5", "RocksElements.pcx" }, - { "custom_5.xpos", "7" }, - { "custom_5.ypos", "9" }, + { "custom_5", "RocksCE.pcx" }, + { "custom_5.xpos", "4" }, + { "custom_5.ypos", "0" }, { "custom_5.frames", "1" }, - { "custom_5.EDITOR", "RocksElements.pcx" }, - { "custom_5.EDITOR.xpos", "15" }, - { "custom_5.EDITOR.ypos", "13" }, + { "custom_5.EDITOR", "RocksCE.pcx" }, + { "custom_5.EDITOR.xpos", "20" }, + { "custom_5.EDITOR.ypos", "0" }, - { "custom_6", "RocksElements.pcx" }, - { "custom_6.xpos", "7" }, - { "custom_6.ypos", "9" }, + { "custom_6", "RocksCE.pcx" }, + { "custom_6.xpos", "5" }, + { "custom_6.ypos", "0" }, { "custom_6.frames", "1" }, - { "custom_6.EDITOR", "RocksElements.pcx" }, - { "custom_6.EDITOR.xpos", "15" }, - { "custom_6.EDITOR.ypos", "13" }, + { "custom_6.EDITOR", "RocksCE.pcx" }, + { "custom_6.EDITOR.xpos", "21" }, + { "custom_6.EDITOR.ypos", "0" }, - { "custom_7", "RocksElements.pcx" }, - { "custom_7.xpos", "7" }, - { "custom_7.ypos", "9" }, + { "custom_7", "RocksCE.pcx" }, + { "custom_7.xpos", "6" }, + { "custom_7.ypos", "0" }, { "custom_7.frames", "1" }, - { "custom_7.EDITOR", "RocksElements.pcx" }, - { "custom_7.EDITOR.xpos", "15" }, - { "custom_7.EDITOR.ypos", "13" }, + { "custom_7.EDITOR", "RocksCE.pcx" }, + { "custom_7.EDITOR.xpos", "22" }, + { "custom_7.EDITOR.ypos", "0" }, - { "custom_8", "RocksElements.pcx" }, + { "custom_8", "RocksCE.pcx" }, { "custom_8.xpos", "7" }, - { "custom_8.ypos", "9" }, + { "custom_8.ypos", "0" }, { "custom_8.frames", "1" }, - { "custom_8.EDITOR", "RocksElements.pcx" }, - { "custom_8.EDITOR.xpos", "15" }, - { "custom_8.EDITOR.ypos", "13" }, + { "custom_8.EDITOR", "RocksCE.pcx" }, + { "custom_8.EDITOR.xpos", "23" }, + { "custom_8.EDITOR.ypos", "0" }, - { "custom_9", "RocksElements.pcx" }, - { "custom_9.xpos", "7" }, - { "custom_9.ypos", "9" }, + { "custom_9", "RocksCE.pcx" }, + { "custom_9.xpos", "8" }, + { "custom_9.ypos", "0" }, { "custom_9.frames", "1" }, - { "custom_9.EDITOR", "RocksElements.pcx" }, - { "custom_9.EDITOR.xpos", "15" }, - { "custom_9.EDITOR.ypos", "13" }, + { "custom_9.EDITOR", "RocksCE.pcx" }, + { "custom_9.EDITOR.xpos", "24" }, + { "custom_9.EDITOR.ypos", "0" }, - { "custom_10", "RocksElements.pcx" }, - { "custom_10.xpos", "7" }, - { "custom_10.ypos", "9" }, + { "custom_10", "RocksCE.pcx" }, + { "custom_10.xpos", "9" }, + { "custom_10.ypos", "0" }, { "custom_10.frames", "1" }, - { "custom_10.EDITOR", "RocksElements.pcx" }, - { "custom_10.EDITOR.xpos", "15" }, - { "custom_10.EDITOR.ypos", "13" }, + { "custom_10.EDITOR", "RocksCE.pcx" }, + { "custom_10.EDITOR.xpos", "25" }, + { "custom_10.EDITOR.ypos", "0" }, - { "custom_11", "RocksElements.pcx" }, - { "custom_11.xpos", "7" }, - { "custom_11.ypos", "9" }, + { "custom_11", "RocksCE.pcx" }, + { "custom_11.xpos", "10" }, + { "custom_11.ypos", "0" }, { "custom_11.frames", "1" }, - { "custom_11.EDITOR", "RocksElements.pcx" }, - { "custom_11.EDITOR.xpos", "15" }, - { "custom_11.EDITOR.ypos", "13" }, + { "custom_11.EDITOR", "RocksCE.pcx" }, + { "custom_11.EDITOR.xpos", "26" }, + { "custom_11.EDITOR.ypos", "0" }, - { "custom_12", "RocksElements.pcx" }, - { "custom_12.xpos", "7" }, - { "custom_12.ypos", "9" }, + { "custom_12", "RocksCE.pcx" }, + { "custom_12.xpos", "11" }, + { "custom_12.ypos", "0" }, { "custom_12.frames", "1" }, - { "custom_12.EDITOR", "RocksElements.pcx" }, - { "custom_12.EDITOR.xpos", "15" }, - { "custom_12.EDITOR.ypos", "13" }, + { "custom_12.EDITOR", "RocksCE.pcx" }, + { "custom_12.EDITOR.xpos", "27" }, + { "custom_12.EDITOR.ypos", "0" }, - { "custom_13", "RocksElements.pcx" }, - { "custom_13.xpos", "7" }, - { "custom_13.ypos", "9" }, + { "custom_13", "RocksCE.pcx" }, + { "custom_13.xpos", "12" }, + { "custom_13.ypos", "0" }, { "custom_13.frames", "1" }, - { "custom_13.EDITOR", "RocksElements.pcx" }, - { "custom_13.EDITOR.xpos", "15" }, - { "custom_13.EDITOR.ypos", "13" }, + { "custom_13.EDITOR", "RocksCE.pcx" }, + { "custom_13.EDITOR.xpos", "28" }, + { "custom_13.EDITOR.ypos", "0" }, - { "custom_14", "RocksElements.pcx" }, - { "custom_14.xpos", "7" }, - { "custom_14.ypos", "9" }, + { "custom_14", "RocksCE.pcx" }, + { "custom_14.xpos", "13" }, + { "custom_14.ypos", "0" }, { "custom_14.frames", "1" }, - { "custom_14.EDITOR", "RocksElements.pcx" }, - { "custom_14.EDITOR.xpos", "15" }, - { "custom_14.EDITOR.ypos", "13" }, + { "custom_14.EDITOR", "RocksCE.pcx" }, + { "custom_14.EDITOR.xpos", "29" }, + { "custom_14.EDITOR.ypos", "0" }, - { "custom_15", "RocksElements.pcx" }, - { "custom_15.xpos", "7" }, - { "custom_15.ypos", "9" }, + { "custom_15", "RocksCE.pcx" }, + { "custom_15.xpos", "14" }, + { "custom_15.ypos", "0" }, { "custom_15.frames", "1" }, - { "custom_15.EDITOR", "RocksElements.pcx" }, - { "custom_15.EDITOR.xpos", "15" }, - { "custom_15.EDITOR.ypos", "13" }, + { "custom_15.EDITOR", "RocksCE.pcx" }, + { "custom_15.EDITOR.xpos", "30" }, + { "custom_15.EDITOR.ypos", "0" }, - { "custom_16", "RocksElements.pcx" }, - { "custom_16.xpos", "7" }, - { "custom_16.ypos", "9" }, + { "custom_16", "RocksCE.pcx" }, + { "custom_16.xpos", "15" }, + { "custom_16.ypos", "0" }, { "custom_16.frames", "1" }, - { "custom_16.EDITOR", "RocksElements.pcx" }, - { "custom_16.EDITOR.xpos", "15" }, - { "custom_16.EDITOR.ypos", "13" }, + { "custom_16.EDITOR", "RocksCE.pcx" }, + { "custom_16.EDITOR.xpos", "31" }, + { "custom_16.EDITOR.ypos", "0" }, - { "custom_17", "RocksElements.pcx" }, - { "custom_17.xpos", "7" }, - { "custom_17.ypos", "9" }, + { "custom_17", "RocksCE.pcx" }, + { "custom_17.xpos", "0" }, + { "custom_17.ypos", "1" }, { "custom_17.frames", "1" }, - { "custom_17.EDITOR", "RocksElements.pcx" }, - { "custom_17.EDITOR.xpos", "15" }, - { "custom_17.EDITOR.ypos", "13" }, + { "custom_17.EDITOR", "RocksCE.pcx" }, + { "custom_17.EDITOR.xpos", "16" }, + { "custom_17.EDITOR.ypos", "1" }, - { "custom_18", "RocksElements.pcx" }, - { "custom_18.xpos", "7" }, - { "custom_18.ypos", "9" }, + { "custom_18", "RocksCE.pcx" }, + { "custom_18.xpos", "1" }, + { "custom_18.ypos", "1" }, { "custom_18.frames", "1" }, - { "custom_18.EDITOR", "RocksElements.pcx" }, - { "custom_18.EDITOR.xpos", "15" }, - { "custom_18.EDITOR.ypos", "13" }, + { "custom_18.EDITOR", "RocksCE.pcx" }, + { "custom_18.EDITOR.xpos", "17" }, + { "custom_18.EDITOR.ypos", "1" }, - { "custom_19", "RocksElements.pcx" }, - { "custom_19.xpos", "7" }, - { "custom_19.ypos", "9" }, + { "custom_19", "RocksCE.pcx" }, + { "custom_19.xpos", "2" }, + { "custom_19.ypos", "1" }, { "custom_19.frames", "1" }, - { "custom_19.EDITOR", "RocksElements.pcx" }, - { "custom_19.EDITOR.xpos", "15" }, - { "custom_19.EDITOR.ypos", "13" }, + { "custom_19.EDITOR", "RocksCE.pcx" }, + { "custom_19.EDITOR.xpos", "18" }, + { "custom_19.EDITOR.ypos", "1" }, - { "custom_20", "RocksElements.pcx" }, - { "custom_20.xpos", "7" }, - { "custom_20.ypos", "9" }, + { "custom_20", "RocksCE.pcx" }, + { "custom_20.xpos", "3" }, + { "custom_20.ypos", "1" }, { "custom_20.frames", "1" }, - { "custom_20.EDITOR", "RocksElements.pcx" }, - { "custom_20.EDITOR.xpos", "15" }, - { "custom_20.EDITOR.ypos", "13" }, + { "custom_20.EDITOR", "RocksCE.pcx" }, + { "custom_20.EDITOR.xpos", "19" }, + { "custom_20.EDITOR.ypos", "1" }, - { "custom_21", "RocksElements.pcx" }, - { "custom_21.xpos", "7" }, - { "custom_21.ypos", "9" }, + { "custom_21", "RocksCE.pcx" }, + { "custom_21.xpos", "4" }, + { "custom_21.ypos", "1" }, { "custom_21.frames", "1" }, - { "custom_21.EDITOR", "RocksElements.pcx" }, - { "custom_21.EDITOR.xpos", "15" }, - { "custom_21.EDITOR.ypos", "13" }, + { "custom_21.EDITOR", "RocksCE.pcx" }, + { "custom_21.EDITOR.xpos", "20" }, + { "custom_21.EDITOR.ypos", "1" }, - { "custom_22", "RocksElements.pcx" }, - { "custom_22.xpos", "7" }, - { "custom_22.ypos", "9" }, + { "custom_22", "RocksCE.pcx" }, + { "custom_22.xpos", "5" }, + { "custom_22.ypos", "1" }, { "custom_22.frames", "1" }, - { "custom_22.EDITOR", "RocksElements.pcx" }, - { "custom_22.EDITOR.xpos", "15" }, - { "custom_22.EDITOR.ypos", "13" }, + { "custom_22.EDITOR", "RocksCE.pcx" }, + { "custom_22.EDITOR.xpos", "21" }, + { "custom_22.EDITOR.ypos", "1" }, - { "custom_23", "RocksElements.pcx" }, - { "custom_23.xpos", "7" }, - { "custom_23.ypos", "9" }, + { "custom_23", "RocksCE.pcx" }, + { "custom_23.xpos", "6" }, + { "custom_23.ypos", "1" }, { "custom_23.frames", "1" }, - { "custom_23.EDITOR", "RocksElements.pcx" }, - { "custom_23.EDITOR.xpos", "15" }, - { "custom_23.EDITOR.ypos", "13" }, + { "custom_23.EDITOR", "RocksCE.pcx" }, + { "custom_23.EDITOR.xpos", "22" }, + { "custom_23.EDITOR.ypos", "1" }, - { "custom_24", "RocksElements.pcx" }, + { "custom_24", "RocksCE.pcx" }, { "custom_24.xpos", "7" }, - { "custom_24.ypos", "9" }, + { "custom_24.ypos", "1" }, { "custom_24.frames", "1" }, - { "custom_24.EDITOR", "RocksElements.pcx" }, - { "custom_24.EDITOR.xpos", "15" }, - { "custom_24.EDITOR.ypos", "13" }, + { "custom_24.EDITOR", "RocksCE.pcx" }, + { "custom_24.EDITOR.xpos", "23" }, + { "custom_24.EDITOR.ypos", "1" }, - { "custom_25", "RocksElements.pcx" }, - { "custom_25.xpos", "7" }, - { "custom_25.ypos", "9" }, + { "custom_25", "RocksCE.pcx" }, + { "custom_25.xpos", "8" }, + { "custom_25.ypos", "1" }, { "custom_25.frames", "1" }, - { "custom_25.EDITOR", "RocksElements.pcx" }, - { "custom_25.EDITOR.xpos", "15" }, - { "custom_25.EDITOR.ypos", "13" }, + { "custom_25.EDITOR", "RocksCE.pcx" }, + { "custom_25.EDITOR.xpos", "24" }, + { "custom_25.EDITOR.ypos", "1" }, - { "custom_26", "RocksElements.pcx" }, - { "custom_26.xpos", "7" }, - { "custom_26.ypos", "9" }, + { "custom_26", "RocksCE.pcx" }, + { "custom_26.xpos", "9" }, + { "custom_26.ypos", "1" }, { "custom_26.frames", "1" }, - { "custom_26.EDITOR", "RocksElements.pcx" }, - { "custom_26.EDITOR.xpos", "15" }, - { "custom_26.EDITOR.ypos", "13" }, + { "custom_26.EDITOR", "RocksCE.pcx" }, + { "custom_26.EDITOR.xpos", "25" }, + { "custom_26.EDITOR.ypos", "1" }, - { "custom_27", "RocksElements.pcx" }, - { "custom_27.xpos", "7" }, - { "custom_27.ypos", "9" }, + { "custom_27", "RocksCE.pcx" }, + { "custom_27.xpos", "10" }, + { "custom_27.ypos", "1" }, { "custom_27.frames", "1" }, - { "custom_27.EDITOR", "RocksElements.pcx" }, - { "custom_27.EDITOR.xpos", "15" }, - { "custom_27.EDITOR.ypos", "13" }, + { "custom_27.EDITOR", "RocksCE.pcx" }, + { "custom_27.EDITOR.xpos", "26" }, + { "custom_27.EDITOR.ypos", "1" }, - { "custom_28", "RocksElements.pcx" }, - { "custom_28.xpos", "7" }, - { "custom_28.ypos", "9" }, + { "custom_28", "RocksCE.pcx" }, + { "custom_28.xpos", "11" }, + { "custom_28.ypos", "1" }, { "custom_28.frames", "1" }, - { "custom_28.EDITOR", "RocksElements.pcx" }, - { "custom_28.EDITOR.xpos", "15" }, - { "custom_28.EDITOR.ypos", "13" }, + { "custom_28.EDITOR", "RocksCE.pcx" }, + { "custom_28.EDITOR.xpos", "27" }, + { "custom_28.EDITOR.ypos", "1" }, - { "custom_29", "RocksElements.pcx" }, - { "custom_29.xpos", "7" }, - { "custom_29.ypos", "9" }, + { "custom_29", "RocksCE.pcx" }, + { "custom_29.xpos", "12" }, + { "custom_29.ypos", "1" }, { "custom_29.frames", "1" }, - { "custom_29.EDITOR", "RocksElements.pcx" }, - { "custom_29.EDITOR.xpos", "15" }, - { "custom_29.EDITOR.ypos", "13" }, + { "custom_29.EDITOR", "RocksCE.pcx" }, + { "custom_29.EDITOR.xpos", "28" }, + { "custom_29.EDITOR.ypos", "1" }, - { "custom_30", "RocksElements.pcx" }, - { "custom_30.xpos", "7" }, - { "custom_30.ypos", "9" }, + { "custom_30", "RocksCE.pcx" }, + { "custom_30.xpos", "13" }, + { "custom_30.ypos", "1" }, { "custom_30.frames", "1" }, - { "custom_30.EDITOR", "RocksElements.pcx" }, - { "custom_30.EDITOR.xpos", "15" }, - { "custom_30.EDITOR.ypos", "13" }, + { "custom_30.EDITOR", "RocksCE.pcx" }, + { "custom_30.EDITOR.xpos", "29" }, + { "custom_30.EDITOR.ypos", "1" }, - { "custom_31", "RocksElements.pcx" }, - { "custom_31.xpos", "7" }, - { "custom_31.ypos", "9" }, + { "custom_31", "RocksCE.pcx" }, + { "custom_31.xpos", "14" }, + { "custom_31.ypos", "1" }, { "custom_31.frames", "1" }, - { "custom_31.EDITOR", "RocksElements.pcx" }, - { "custom_31.EDITOR.xpos", "15" }, - { "custom_31.EDITOR.ypos", "13" }, + { "custom_31.EDITOR", "RocksCE.pcx" }, + { "custom_31.EDITOR.xpos", "30" }, + { "custom_31.EDITOR.ypos", "1" }, - { "custom_32", "RocksElements.pcx" }, - { "custom_32.xpos", "7" }, - { "custom_32.ypos", "9" }, + { "custom_32", "RocksCE.pcx" }, + { "custom_32.xpos", "15" }, + { "custom_32.ypos", "1" }, { "custom_32.frames", "1" }, - { "custom_32.EDITOR", "RocksElements.pcx" }, - { "custom_32.EDITOR.xpos", "15" }, - { "custom_32.EDITOR.ypos", "13" }, + { "custom_32.EDITOR", "RocksCE.pcx" }, + { "custom_32.EDITOR.xpos", "31" }, + { "custom_32.EDITOR.ypos", "1" }, - { "custom_33", "RocksElements.pcx" }, - { "custom_33.xpos", "7" }, - { "custom_33.ypos", "9" }, + { "custom_33", "RocksCE.pcx" }, + { "custom_33.xpos", "0" }, + { "custom_33.ypos", "2" }, { "custom_33.frames", "1" }, - { "custom_33.EDITOR", "RocksElements.pcx" }, - { "custom_33.EDITOR.xpos", "15" }, - { "custom_33.EDITOR.ypos", "13" }, + { "custom_33.EDITOR", "RocksCE.pcx" }, + { "custom_33.EDITOR.xpos", "16" }, + { "custom_33.EDITOR.ypos", "2" }, - { "custom_34", "RocksElements.pcx" }, - { "custom_34.xpos", "7" }, - { "custom_34.ypos", "9" }, + { "custom_34", "RocksCE.pcx" }, + { "custom_34.xpos", "1" }, + { "custom_34.ypos", "2" }, { "custom_34.frames", "1" }, - { "custom_34.EDITOR", "RocksElements.pcx" }, - { "custom_34.EDITOR.xpos", "15" }, - { "custom_34.EDITOR.ypos", "13" }, + { "custom_34.EDITOR", "RocksCE.pcx" }, + { "custom_34.EDITOR.xpos", "17" }, + { "custom_34.EDITOR.ypos", "2" }, - { "custom_35", "RocksElements.pcx" }, - { "custom_35.xpos", "7" }, - { "custom_35.ypos", "9" }, + { "custom_35", "RocksCE.pcx" }, + { "custom_35.xpos", "2" }, + { "custom_35.ypos", "2" }, { "custom_35.frames", "1" }, - { "custom_35.EDITOR", "RocksElements.pcx" }, - { "custom_35.EDITOR.xpos", "15" }, - { "custom_35.EDITOR.ypos", "13" }, + { "custom_35.EDITOR", "RocksCE.pcx" }, + { "custom_35.EDITOR.xpos", "18" }, + { "custom_35.EDITOR.ypos", "2" }, - { "custom_36", "RocksElements.pcx" }, - { "custom_36.xpos", "7" }, - { "custom_36.ypos", "9" }, + { "custom_36", "RocksCE.pcx" }, + { "custom_36.xpos", "3" }, + { "custom_36.ypos", "2" }, { "custom_36.frames", "1" }, - { "custom_36.EDITOR", "RocksElements.pcx" }, - { "custom_36.EDITOR.xpos", "15" }, - { "custom_36.EDITOR.ypos", "13" }, + { "custom_36.EDITOR", "RocksCE.pcx" }, + { "custom_36.EDITOR.xpos", "19" }, + { "custom_36.EDITOR.ypos", "2" }, - { "custom_37", "RocksElements.pcx" }, - { "custom_37.xpos", "7" }, - { "custom_37.ypos", "9" }, + { "custom_37", "RocksCE.pcx" }, + { "custom_37.xpos", "4" }, + { "custom_37.ypos", "2" }, { "custom_37.frames", "1" }, - { "custom_37.EDITOR", "RocksElements.pcx" }, - { "custom_37.EDITOR.xpos", "15" }, - { "custom_37.EDITOR.ypos", "13" }, + { "custom_37.EDITOR", "RocksCE.pcx" }, + { "custom_37.EDITOR.xpos", "20" }, + { "custom_37.EDITOR.ypos", "2" }, - { "custom_38", "RocksElements.pcx" }, - { "custom_38.xpos", "7" }, - { "custom_38.ypos", "9" }, + { "custom_38", "RocksCE.pcx" }, + { "custom_38.xpos", "5" }, + { "custom_38.ypos", "2" }, { "custom_38.frames", "1" }, - { "custom_38.EDITOR", "RocksElements.pcx" }, - { "custom_38.EDITOR.xpos", "15" }, - { "custom_38.EDITOR.ypos", "13" }, + { "custom_38.EDITOR", "RocksCE.pcx" }, + { "custom_38.EDITOR.xpos", "21" }, + { "custom_38.EDITOR.ypos", "2" }, - { "custom_39", "RocksElements.pcx" }, - { "custom_39.xpos", "7" }, - { "custom_39.ypos", "9" }, + { "custom_39", "RocksCE.pcx" }, + { "custom_39.xpos", "6" }, + { "custom_39.ypos", "2" }, { "custom_39.frames", "1" }, - { "custom_39.EDITOR", "RocksElements.pcx" }, - { "custom_39.EDITOR.xpos", "15" }, - { "custom_39.EDITOR.ypos", "13" }, + { "custom_39.EDITOR", "RocksCE.pcx" }, + { "custom_39.EDITOR.xpos", "22" }, + { "custom_39.EDITOR.ypos", "2" }, - { "custom_40", "RocksElements.pcx" }, + { "custom_40", "RocksCE.pcx" }, { "custom_40.xpos", "7" }, - { "custom_40.ypos", "9" }, + { "custom_40.ypos", "2" }, { "custom_40.frames", "1" }, - { "custom_40.EDITOR", "RocksElements.pcx" }, - { "custom_40.EDITOR.xpos", "15" }, - { "custom_40.EDITOR.ypos", "13" }, + { "custom_40.EDITOR", "RocksCE.pcx" }, + { "custom_40.EDITOR.xpos", "23" }, + { "custom_40.EDITOR.ypos", "2" }, - { "custom_41", "RocksElements.pcx" }, - { "custom_41.xpos", "7" }, - { "custom_41.ypos", "9" }, + { "custom_41", "RocksCE.pcx" }, + { "custom_41.xpos", "8" }, + { "custom_41.ypos", "2" }, { "custom_41.frames", "1" }, - { "custom_41.EDITOR", "RocksElements.pcx" }, - { "custom_41.EDITOR.xpos", "15" }, - { "custom_41.EDITOR.ypos", "13" }, + { "custom_41.EDITOR", "RocksCE.pcx" }, + { "custom_41.EDITOR.xpos", "24" }, + { "custom_41.EDITOR.ypos", "2" }, - { "custom_42", "RocksElements.pcx" }, - { "custom_42.xpos", "7" }, - { "custom_42.ypos", "9" }, + { "custom_42", "RocksCE.pcx" }, + { "custom_42.xpos", "9" }, + { "custom_42.ypos", "2" }, { "custom_42.frames", "1" }, - { "custom_42.EDITOR", "RocksElements.pcx" }, - { "custom_42.EDITOR.xpos", "15" }, - { "custom_42.EDITOR.ypos", "13" }, + { "custom_42.EDITOR", "RocksCE.pcx" }, + { "custom_42.EDITOR.xpos", "25" }, + { "custom_42.EDITOR.ypos", "2" }, - { "custom_43", "RocksElements.pcx" }, - { "custom_43.xpos", "7" }, - { "custom_43.ypos", "9" }, + { "custom_43", "RocksCE.pcx" }, + { "custom_43.xpos", "10" }, + { "custom_43.ypos", "2" }, { "custom_43.frames", "1" }, - { "custom_43.EDITOR", "RocksElements.pcx" }, - { "custom_43.EDITOR.xpos", "15" }, - { "custom_43.EDITOR.ypos", "13" }, + { "custom_43.EDITOR", "RocksCE.pcx" }, + { "custom_43.EDITOR.xpos", "26" }, + { "custom_43.EDITOR.ypos", "2" }, - { "custom_44", "RocksElements.pcx" }, - { "custom_44.xpos", "7" }, - { "custom_44.ypos", "9" }, + { "custom_44", "RocksCE.pcx" }, + { "custom_44.xpos", "11" }, + { "custom_44.ypos", "2" }, { "custom_44.frames", "1" }, - { "custom_44.EDITOR", "RocksElements.pcx" }, - { "custom_44.EDITOR.xpos", "15" }, - { "custom_44.EDITOR.ypos", "13" }, + { "custom_44.EDITOR", "RocksCE.pcx" }, + { "custom_44.EDITOR.xpos", "27" }, + { "custom_44.EDITOR.ypos", "2" }, - { "custom_45", "RocksElements.pcx" }, - { "custom_45.xpos", "7" }, - { "custom_45.ypos", "9" }, + { "custom_45", "RocksCE.pcx" }, + { "custom_45.xpos", "12" }, + { "custom_45.ypos", "2" }, { "custom_45.frames", "1" }, - { "custom_45.EDITOR", "RocksElements.pcx" }, - { "custom_45.EDITOR.xpos", "15" }, - { "custom_45.EDITOR.ypos", "13" }, + { "custom_45.EDITOR", "RocksCE.pcx" }, + { "custom_45.EDITOR.xpos", "28" }, + { "custom_45.EDITOR.ypos", "2" }, - { "custom_46", "RocksElements.pcx" }, - { "custom_46.xpos", "7" }, - { "custom_46.ypos", "9" }, + { "custom_46", "RocksCE.pcx" }, + { "custom_46.xpos", "13" }, + { "custom_46.ypos", "2" }, { "custom_46.frames", "1" }, - { "custom_46.EDITOR", "RocksElements.pcx" }, - { "custom_46.EDITOR.xpos", "15" }, - { "custom_46.EDITOR.ypos", "13" }, + { "custom_46.EDITOR", "RocksCE.pcx" }, + { "custom_46.EDITOR.xpos", "29" }, + { "custom_46.EDITOR.ypos", "2" }, - { "custom_47", "RocksElements.pcx" }, - { "custom_47.xpos", "7" }, - { "custom_47.ypos", "9" }, + { "custom_47", "RocksCE.pcx" }, + { "custom_47.xpos", "14" }, + { "custom_47.ypos", "2" }, { "custom_47.frames", "1" }, - { "custom_47.EDITOR", "RocksElements.pcx" }, - { "custom_47.EDITOR.xpos", "15" }, - { "custom_47.EDITOR.ypos", "13" }, + { "custom_47.EDITOR", "RocksCE.pcx" }, + { "custom_47.EDITOR.xpos", "30" }, + { "custom_47.EDITOR.ypos", "2" }, - { "custom_48", "RocksElements.pcx" }, - { "custom_48.xpos", "7" }, - { "custom_48.ypos", "9" }, + { "custom_48", "RocksCE.pcx" }, + { "custom_48.xpos", "15" }, + { "custom_48.ypos", "2" }, { "custom_48.frames", "1" }, - { "custom_48.EDITOR", "RocksElements.pcx" }, - { "custom_48.EDITOR.xpos", "15" }, - { "custom_48.EDITOR.ypos", "13" }, + { "custom_48.EDITOR", "RocksCE.pcx" }, + { "custom_48.EDITOR.xpos", "31" }, + { "custom_48.EDITOR.ypos", "2" }, - { "custom_49", "RocksElements.pcx" }, - { "custom_49.xpos", "7" }, - { "custom_49.ypos", "9" }, + { "custom_49", "RocksCE.pcx" }, + { "custom_49.xpos", "0" }, + { "custom_49.ypos", "3" }, { "custom_49.frames", "1" }, - { "custom_49.EDITOR", "RocksElements.pcx" }, - { "custom_49.EDITOR.xpos", "15" }, - { "custom_49.EDITOR.ypos", "13" }, + { "custom_49.EDITOR", "RocksCE.pcx" }, + { "custom_49.EDITOR.xpos", "16" }, + { "custom_49.EDITOR.ypos", "3" }, - { "custom_50", "RocksElements.pcx" }, - { "custom_50.xpos", "7" }, - { "custom_50.ypos", "9" }, + { "custom_50", "RocksCE.pcx" }, + { "custom_50.xpos", "1" }, + { "custom_50.ypos", "3" }, { "custom_50.frames", "1" }, - { "custom_50.EDITOR", "RocksElements.pcx" }, - { "custom_50.EDITOR.xpos", "15" }, - { "custom_50.EDITOR.ypos", "13" }, + { "custom_50.EDITOR", "RocksCE.pcx" }, + { "custom_50.EDITOR.xpos", "17" }, + { "custom_50.EDITOR.ypos", "3" }, - { "custom_51", "RocksElements.pcx" }, - { "custom_51.xpos", "7" }, - { "custom_51.ypos", "9" }, + { "custom_51", "RocksCE.pcx" }, + { "custom_51.xpos", "2" }, + { "custom_51.ypos", "3" }, { "custom_51.frames", "1" }, - { "custom_51.EDITOR", "RocksElements.pcx" }, - { "custom_51.EDITOR.xpos", "15" }, - { "custom_51.EDITOR.ypos", "13" }, + { "custom_51.EDITOR", "RocksCE.pcx" }, + { "custom_51.EDITOR.xpos", "18" }, + { "custom_51.EDITOR.ypos", "3" }, - { "custom_52", "RocksElements.pcx" }, - { "custom_52.xpos", "7" }, - { "custom_52.ypos", "9" }, + { "custom_52", "RocksCE.pcx" }, + { "custom_52.xpos", "3" }, + { "custom_52.ypos", "3" }, { "custom_52.frames", "1" }, - { "custom_52.EDITOR", "RocksElements.pcx" }, - { "custom_52.EDITOR.xpos", "15" }, - { "custom_52.EDITOR.ypos", "13" }, + { "custom_52.EDITOR", "RocksCE.pcx" }, + { "custom_52.EDITOR.xpos", "19" }, + { "custom_52.EDITOR.ypos", "3" }, - { "custom_53", "RocksElements.pcx" }, - { "custom_53.xpos", "7" }, - { "custom_53.ypos", "9" }, + { "custom_53", "RocksCE.pcx" }, + { "custom_53.xpos", "4" }, + { "custom_53.ypos", "3" }, { "custom_53.frames", "1" }, - { "custom_53.EDITOR", "RocksElements.pcx" }, - { "custom_53.EDITOR.xpos", "15" }, - { "custom_53.EDITOR.ypos", "13" }, + { "custom_53.EDITOR", "RocksCE.pcx" }, + { "custom_53.EDITOR.xpos", "20" }, + { "custom_53.EDITOR.ypos", "3" }, - { "custom_54", "RocksElements.pcx" }, - { "custom_54.xpos", "7" }, - { "custom_54.ypos", "9" }, + { "custom_54", "RocksCE.pcx" }, + { "custom_54.xpos", "5" }, + { "custom_54.ypos", "3" }, { "custom_54.frames", "1" }, - { "custom_54.EDITOR", "RocksElements.pcx" }, - { "custom_54.EDITOR.xpos", "15" }, - { "custom_54.EDITOR.ypos", "13" }, + { "custom_54.EDITOR", "RocksCE.pcx" }, + { "custom_54.EDITOR.xpos", "21" }, + { "custom_54.EDITOR.ypos", "3" }, - { "custom_55", "RocksElements.pcx" }, - { "custom_55.xpos", "7" }, - { "custom_55.ypos", "9" }, + { "custom_55", "RocksCE.pcx" }, + { "custom_55.xpos", "6" }, + { "custom_55.ypos", "3" }, { "custom_55.frames", "1" }, - { "custom_55.EDITOR", "RocksElements.pcx" }, - { "custom_55.EDITOR.xpos", "15" }, - { "custom_55.EDITOR.ypos", "13" }, + { "custom_55.EDITOR", "RocksCE.pcx" }, + { "custom_55.EDITOR.xpos", "22" }, + { "custom_55.EDITOR.ypos", "3" }, - { "custom_56", "RocksElements.pcx" }, + { "custom_56", "RocksCE.pcx" }, { "custom_56.xpos", "7" }, - { "custom_56.ypos", "9" }, + { "custom_56.ypos", "3" }, { "custom_56.frames", "1" }, - { "custom_56.EDITOR", "RocksElements.pcx" }, - { "custom_56.EDITOR.xpos", "15" }, - { "custom_56.EDITOR.ypos", "13" }, + { "custom_56.EDITOR", "RocksCE.pcx" }, + { "custom_56.EDITOR.xpos", "23" }, + { "custom_56.EDITOR.ypos", "3" }, - { "custom_57", "RocksElements.pcx" }, - { "custom_57.xpos", "7" }, - { "custom_57.ypos", "9" }, + { "custom_57", "RocksCE.pcx" }, + { "custom_57.xpos", "8" }, + { "custom_57.ypos", "3" }, { "custom_57.frames", "1" }, - { "custom_57.EDITOR", "RocksElements.pcx" }, - { "custom_57.EDITOR.xpos", "15" }, - { "custom_57.EDITOR.ypos", "13" }, + { "custom_57.EDITOR", "RocksCE.pcx" }, + { "custom_57.EDITOR.xpos", "24" }, + { "custom_57.EDITOR.ypos", "3" }, - { "custom_58", "RocksElements.pcx" }, - { "custom_58.xpos", "7" }, - { "custom_58.ypos", "9" }, + { "custom_58", "RocksCE.pcx" }, + { "custom_58.xpos", "9" }, + { "custom_58.ypos", "3" }, { "custom_58.frames", "1" }, - { "custom_58.EDITOR", "RocksElements.pcx" }, - { "custom_58.EDITOR.xpos", "15" }, - { "custom_58.EDITOR.ypos", "13" }, + { "custom_58.EDITOR", "RocksCE.pcx" }, + { "custom_58.EDITOR.xpos", "25" }, + { "custom_58.EDITOR.ypos", "3" }, - { "custom_59", "RocksElements.pcx" }, - { "custom_59.xpos", "7" }, - { "custom_59.ypos", "9" }, + { "custom_59", "RocksCE.pcx" }, + { "custom_59.xpos", "10" }, + { "custom_59.ypos", "3" }, { "custom_59.frames", "1" }, - { "custom_59.EDITOR", "RocksElements.pcx" }, - { "custom_59.EDITOR.xpos", "15" }, - { "custom_59.EDITOR.ypos", "13" }, + { "custom_59.EDITOR", "RocksCE.pcx" }, + { "custom_59.EDITOR.xpos", "26" }, + { "custom_59.EDITOR.ypos", "3" }, - { "custom_60", "RocksElements.pcx" }, - { "custom_60.xpos", "7" }, - { "custom_60.ypos", "9" }, + { "custom_60", "RocksCE.pcx" }, + { "custom_60.xpos", "11" }, + { "custom_60.ypos", "3" }, { "custom_60.frames", "1" }, - { "custom_60.EDITOR", "RocksElements.pcx" }, - { "custom_60.EDITOR.xpos", "15" }, - { "custom_60.EDITOR.ypos", "13" }, + { "custom_60.EDITOR", "RocksCE.pcx" }, + { "custom_60.EDITOR.xpos", "27" }, + { "custom_60.EDITOR.ypos", "3" }, - { "custom_61", "RocksElements.pcx" }, - { "custom_61.xpos", "7" }, - { "custom_61.ypos", "9" }, + { "custom_61", "RocksCE.pcx" }, + { "custom_61.xpos", "12" }, + { "custom_61.ypos", "3" }, { "custom_61.frames", "1" }, - { "custom_61.EDITOR", "RocksElements.pcx" }, - { "custom_61.EDITOR.xpos", "15" }, - { "custom_61.EDITOR.ypos", "13" }, + { "custom_61.EDITOR", "RocksCE.pcx" }, + { "custom_61.EDITOR.xpos", "28" }, + { "custom_61.EDITOR.ypos", "3" }, - { "custom_62", "RocksElements.pcx" }, - { "custom_62.xpos", "7" }, - { "custom_62.ypos", "9" }, + { "custom_62", "RocksCE.pcx" }, + { "custom_62.xpos", "13" }, + { "custom_62.ypos", "3" }, { "custom_62.frames", "1" }, - { "custom_62.EDITOR", "RocksElements.pcx" }, - { "custom_62.EDITOR.xpos", "15" }, - { "custom_62.EDITOR.ypos", "13" }, + { "custom_62.EDITOR", "RocksCE.pcx" }, + { "custom_62.EDITOR.xpos", "29" }, + { "custom_62.EDITOR.ypos", "3" }, - { "custom_63", "RocksElements.pcx" }, - { "custom_63.xpos", "7" }, - { "custom_63.ypos", "9" }, + { "custom_63", "RocksCE.pcx" }, + { "custom_63.xpos", "14" }, + { "custom_63.ypos", "3" }, { "custom_63.frames", "1" }, - { "custom_63.EDITOR", "RocksElements.pcx" }, - { "custom_63.EDITOR.xpos", "15" }, - { "custom_63.EDITOR.ypos", "13" }, + { "custom_63.EDITOR", "RocksCE.pcx" }, + { "custom_63.EDITOR.xpos", "30" }, + { "custom_63.EDITOR.ypos", "3" }, - { "custom_64", "RocksElements.pcx" }, - { "custom_64.xpos", "7" }, - { "custom_64.ypos", "9" }, + { "custom_64", "RocksCE.pcx" }, + { "custom_64.xpos", "15" }, + { "custom_64.ypos", "3" }, { "custom_64.frames", "1" }, - { "custom_64.EDITOR", "RocksElements.pcx" }, - { "custom_64.EDITOR.xpos", "15" }, - { "custom_64.EDITOR.ypos", "13" }, + { "custom_64.EDITOR", "RocksCE.pcx" }, + { "custom_64.EDITOR.xpos", "31" }, + { "custom_64.EDITOR.ypos", "3" }, - { "custom_65", "RocksElements.pcx" }, - { "custom_65.xpos", "7" }, - { "custom_65.ypos", "9" }, + { "custom_65", "RocksCE.pcx" }, + { "custom_65.xpos", "0" }, + { "custom_65.ypos", "4" }, { "custom_65.frames", "1" }, - { "custom_65.EDITOR", "RocksElements.pcx" }, - { "custom_65.EDITOR.xpos", "15" }, - { "custom_65.EDITOR.ypos", "13" }, + { "custom_65.EDITOR", "RocksCE.pcx" }, + { "custom_65.EDITOR.xpos", "16" }, + { "custom_65.EDITOR.ypos", "4" }, - { "custom_66", "RocksElements.pcx" }, - { "custom_66.xpos", "7" }, - { "custom_66.ypos", "9" }, + { "custom_66", "RocksCE.pcx" }, + { "custom_66.xpos", "1" }, + { "custom_66.ypos", "4" }, { "custom_66.frames", "1" }, - { "custom_66.EDITOR", "RocksElements.pcx" }, - { "custom_66.EDITOR.xpos", "15" }, - { "custom_66.EDITOR.ypos", "13" }, + { "custom_66.EDITOR", "RocksCE.pcx" }, + { "custom_66.EDITOR.xpos", "17" }, + { "custom_66.EDITOR.ypos", "4" }, - { "custom_67", "RocksElements.pcx" }, - { "custom_67.xpos", "7" }, - { "custom_67.ypos", "9" }, + { "custom_67", "RocksCE.pcx" }, + { "custom_67.xpos", "2" }, + { "custom_67.ypos", "4" }, { "custom_67.frames", "1" }, - { "custom_67.EDITOR", "RocksElements.pcx" }, - { "custom_67.EDITOR.xpos", "15" }, - { "custom_67.EDITOR.ypos", "13" }, + { "custom_67.EDITOR", "RocksCE.pcx" }, + { "custom_67.EDITOR.xpos", "18" }, + { "custom_67.EDITOR.ypos", "4" }, - { "custom_68", "RocksElements.pcx" }, - { "custom_68.xpos", "7" }, - { "custom_68.ypos", "9" }, + { "custom_68", "RocksCE.pcx" }, + { "custom_68.xpos", "3" }, + { "custom_68.ypos", "4" }, { "custom_68.frames", "1" }, - { "custom_68.EDITOR", "RocksElements.pcx" }, - { "custom_68.EDITOR.xpos", "15" }, - { "custom_68.EDITOR.ypos", "13" }, + { "custom_68.EDITOR", "RocksCE.pcx" }, + { "custom_68.EDITOR.xpos", "19" }, + { "custom_68.EDITOR.ypos", "4" }, - { "custom_69", "RocksElements.pcx" }, - { "custom_69.xpos", "7" }, - { "custom_69.ypos", "9" }, + { "custom_69", "RocksCE.pcx" }, + { "custom_69.xpos", "4" }, + { "custom_69.ypos", "4" }, { "custom_69.frames", "1" }, - { "custom_69.EDITOR", "RocksElements.pcx" }, - { "custom_69.EDITOR.xpos", "15" }, - { "custom_69.EDITOR.ypos", "13" }, + { "custom_69.EDITOR", "RocksCE.pcx" }, + { "custom_69.EDITOR.xpos", "20" }, + { "custom_69.EDITOR.ypos", "4" }, - { "custom_70", "RocksElements.pcx" }, - { "custom_70.xpos", "7" }, - { "custom_70.ypos", "9" }, + { "custom_70", "RocksCE.pcx" }, + { "custom_70.xpos", "5" }, + { "custom_70.ypos", "4" }, { "custom_70.frames", "1" }, - { "custom_70.EDITOR", "RocksElements.pcx" }, - { "custom_70.EDITOR.xpos", "15" }, - { "custom_70.EDITOR.ypos", "13" }, + { "custom_70.EDITOR", "RocksCE.pcx" }, + { "custom_70.EDITOR.xpos", "21" }, + { "custom_70.EDITOR.ypos", "4" }, - { "custom_71", "RocksElements.pcx" }, - { "custom_71.xpos", "7" }, - { "custom_71.ypos", "9" }, + { "custom_71", "RocksCE.pcx" }, + { "custom_71.xpos", "6" }, + { "custom_71.ypos", "4" }, { "custom_71.frames", "1" }, - { "custom_71.EDITOR", "RocksElements.pcx" }, - { "custom_71.EDITOR.xpos", "15" }, - { "custom_71.EDITOR.ypos", "13" }, + { "custom_71.EDITOR", "RocksCE.pcx" }, + { "custom_71.EDITOR.xpos", "22" }, + { "custom_71.EDITOR.ypos", "4" }, - { "custom_72", "RocksElements.pcx" }, + { "custom_72", "RocksCE.pcx" }, { "custom_72.xpos", "7" }, - { "custom_72.ypos", "9" }, + { "custom_72.ypos", "4" }, { "custom_72.frames", "1" }, - { "custom_72.EDITOR", "RocksElements.pcx" }, - { "custom_72.EDITOR.xpos", "15" }, - { "custom_72.EDITOR.ypos", "13" }, + { "custom_72.EDITOR", "RocksCE.pcx" }, + { "custom_72.EDITOR.xpos", "23" }, + { "custom_72.EDITOR.ypos", "4" }, - { "custom_73", "RocksElements.pcx" }, - { "custom_73.xpos", "7" }, - { "custom_73.ypos", "9" }, + { "custom_73", "RocksCE.pcx" }, + { "custom_73.xpos", "8" }, + { "custom_73.ypos", "4" }, { "custom_73.frames", "1" }, - { "custom_73.EDITOR", "RocksElements.pcx" }, - { "custom_73.EDITOR.xpos", "15" }, - { "custom_73.EDITOR.ypos", "13" }, + { "custom_73.EDITOR", "RocksCE.pcx" }, + { "custom_73.EDITOR.xpos", "24" }, + { "custom_73.EDITOR.ypos", "4" }, - { "custom_74", "RocksElements.pcx" }, - { "custom_74.xpos", "7" }, - { "custom_74.ypos", "9" }, + { "custom_74", "RocksCE.pcx" }, + { "custom_74.xpos", "9" }, + { "custom_74.ypos", "4" }, { "custom_74.frames", "1" }, - { "custom_74.EDITOR", "RocksElements.pcx" }, - { "custom_74.EDITOR.xpos", "15" }, - { "custom_74.EDITOR.ypos", "13" }, + { "custom_74.EDITOR", "RocksCE.pcx" }, + { "custom_74.EDITOR.xpos", "25" }, + { "custom_74.EDITOR.ypos", "4" }, - { "custom_75", "RocksElements.pcx" }, - { "custom_75.xpos", "7" }, - { "custom_75.ypos", "9" }, + { "custom_75", "RocksCE.pcx" }, + { "custom_75.xpos", "10" }, + { "custom_75.ypos", "4" }, { "custom_75.frames", "1" }, - { "custom_75.EDITOR", "RocksElements.pcx" }, - { "custom_75.EDITOR.xpos", "15" }, - { "custom_75.EDITOR.ypos", "13" }, + { "custom_75.EDITOR", "RocksCE.pcx" }, + { "custom_75.EDITOR.xpos", "26" }, + { "custom_75.EDITOR.ypos", "4" }, - { "custom_76", "RocksElements.pcx" }, - { "custom_76.xpos", "7" }, - { "custom_76.ypos", "9" }, + { "custom_76", "RocksCE.pcx" }, + { "custom_76.xpos", "11" }, + { "custom_76.ypos", "4" }, { "custom_76.frames", "1" }, - { "custom_76.EDITOR", "RocksElements.pcx" }, - { "custom_76.EDITOR.xpos", "15" }, - { "custom_76.EDITOR.ypos", "13" }, + { "custom_76.EDITOR", "RocksCE.pcx" }, + { "custom_76.EDITOR.xpos", "27" }, + { "custom_76.EDITOR.ypos", "4" }, - { "custom_77", "RocksElements.pcx" }, - { "custom_77.xpos", "7" }, - { "custom_77.ypos", "9" }, + { "custom_77", "RocksCE.pcx" }, + { "custom_77.xpos", "12" }, + { "custom_77.ypos", "4" }, { "custom_77.frames", "1" }, - { "custom_77.EDITOR", "RocksElements.pcx" }, - { "custom_77.EDITOR.xpos", "15" }, - { "custom_77.EDITOR.ypos", "13" }, + { "custom_77.EDITOR", "RocksCE.pcx" }, + { "custom_77.EDITOR.xpos", "28" }, + { "custom_77.EDITOR.ypos", "4" }, - { "custom_78", "RocksElements.pcx" }, - { "custom_78.xpos", "7" }, - { "custom_78.ypos", "9" }, + { "custom_78", "RocksCE.pcx" }, + { "custom_78.xpos", "13" }, + { "custom_78.ypos", "4" }, { "custom_78.frames", "1" }, - { "custom_78.EDITOR", "RocksElements.pcx" }, - { "custom_78.EDITOR.xpos", "15" }, - { "custom_78.EDITOR.ypos", "13" }, + { "custom_78.EDITOR", "RocksCE.pcx" }, + { "custom_78.EDITOR.xpos", "29" }, + { "custom_78.EDITOR.ypos", "4" }, - { "custom_79", "RocksElements.pcx" }, - { "custom_79.xpos", "7" }, - { "custom_79.ypos", "9" }, + { "custom_79", "RocksCE.pcx" }, + { "custom_79.xpos", "14" }, + { "custom_79.ypos", "4" }, { "custom_79.frames", "1" }, - { "custom_79.EDITOR", "RocksElements.pcx" }, - { "custom_79.EDITOR.xpos", "15" }, - { "custom_79.EDITOR.ypos", "13" }, + { "custom_79.EDITOR", "RocksCE.pcx" }, + { "custom_79.EDITOR.xpos", "30" }, + { "custom_79.EDITOR.ypos", "4" }, - { "custom_80", "RocksElements.pcx" }, - { "custom_80.xpos", "7" }, - { "custom_80.ypos", "9" }, + { "custom_80", "RocksCE.pcx" }, + { "custom_80.xpos", "15" }, + { "custom_80.ypos", "4" }, { "custom_80.frames", "1" }, - { "custom_80.EDITOR", "RocksElements.pcx" }, - { "custom_80.EDITOR.xpos", "15" }, - { "custom_80.EDITOR.ypos", "13" }, + { "custom_80.EDITOR", "RocksCE.pcx" }, + { "custom_80.EDITOR.xpos", "31" }, + { "custom_80.EDITOR.ypos", "4" }, - { "custom_81", "RocksElements.pcx" }, - { "custom_81.xpos", "7" }, - { "custom_81.ypos", "9" }, + { "custom_81", "RocksCE.pcx" }, + { "custom_81.xpos", "0" }, + { "custom_81.ypos", "5" }, { "custom_81.frames", "1" }, - { "custom_81.EDITOR", "RocksElements.pcx" }, - { "custom_81.EDITOR.xpos", "15" }, - { "custom_81.EDITOR.ypos", "13" }, + { "custom_81.EDITOR", "RocksCE.pcx" }, + { "custom_81.EDITOR.xpos", "16" }, + { "custom_81.EDITOR.ypos", "5" }, - { "custom_82", "RocksElements.pcx" }, - { "custom_82.xpos", "7" }, - { "custom_82.ypos", "9" }, + { "custom_82", "RocksCE.pcx" }, + { "custom_82.xpos", "1" }, + { "custom_82.ypos", "5" }, { "custom_82.frames", "1" }, - { "custom_82.EDITOR", "RocksElements.pcx" }, - { "custom_82.EDITOR.xpos", "15" }, - { "custom_82.EDITOR.ypos", "13" }, + { "custom_82.EDITOR", "RocksCE.pcx" }, + { "custom_82.EDITOR.xpos", "17" }, + { "custom_82.EDITOR.ypos", "5" }, - { "custom_83", "RocksElements.pcx" }, - { "custom_83.xpos", "7" }, - { "custom_83.ypos", "9" }, + { "custom_83", "RocksCE.pcx" }, + { "custom_83.xpos", "2" }, + { "custom_83.ypos", "5" }, { "custom_83.frames", "1" }, - { "custom_83.EDITOR", "RocksElements.pcx" }, - { "custom_83.EDITOR.xpos", "15" }, - { "custom_83.EDITOR.ypos", "13" }, + { "custom_83.EDITOR", "RocksCE.pcx" }, + { "custom_83.EDITOR.xpos", "18" }, + { "custom_83.EDITOR.ypos", "5" }, - { "custom_84", "RocksElements.pcx" }, - { "custom_84.xpos", "7" }, - { "custom_84.ypos", "9" }, + { "custom_84", "RocksCE.pcx" }, + { "custom_84.xpos", "3" }, + { "custom_84.ypos", "5" }, { "custom_84.frames", "1" }, - { "custom_84.EDITOR", "RocksElements.pcx" }, - { "custom_84.EDITOR.xpos", "15" }, - { "custom_84.EDITOR.ypos", "13" }, + { "custom_84.EDITOR", "RocksCE.pcx" }, + { "custom_84.EDITOR.xpos", "19" }, + { "custom_84.EDITOR.ypos", "5" }, - { "custom_85", "RocksElements.pcx" }, - { "custom_85.xpos", "7" }, - { "custom_85.ypos", "9" }, + { "custom_85", "RocksCE.pcx" }, + { "custom_85.xpos", "4" }, + { "custom_85.ypos", "5" }, { "custom_85.frames", "1" }, - { "custom_85.EDITOR", "RocksElements.pcx" }, - { "custom_85.EDITOR.xpos", "15" }, - { "custom_85.EDITOR.ypos", "13" }, + { "custom_85.EDITOR", "RocksCE.pcx" }, + { "custom_85.EDITOR.xpos", "20" }, + { "custom_85.EDITOR.ypos", "5" }, - { "custom_86", "RocksElements.pcx" }, - { "custom_86.xpos", "7" }, - { "custom_86.ypos", "9" }, + { "custom_86", "RocksCE.pcx" }, + { "custom_86.xpos", "5" }, + { "custom_86.ypos", "5" }, { "custom_86.frames", "1" }, - { "custom_86.EDITOR", "RocksElements.pcx" }, - { "custom_86.EDITOR.xpos", "15" }, - { "custom_86.EDITOR.ypos", "13" }, + { "custom_86.EDITOR", "RocksCE.pcx" }, + { "custom_86.EDITOR.xpos", "21" }, + { "custom_86.EDITOR.ypos", "5" }, - { "custom_87", "RocksElements.pcx" }, - { "custom_87.xpos", "7" }, - { "custom_87.ypos", "9" }, + { "custom_87", "RocksCE.pcx" }, + { "custom_87.xpos", "6" }, + { "custom_87.ypos", "5" }, { "custom_87.frames", "1" }, - { "custom_87.EDITOR", "RocksElements.pcx" }, - { "custom_87.EDITOR.xpos", "15" }, - { "custom_87.EDITOR.ypos", "13" }, + { "custom_87.EDITOR", "RocksCE.pcx" }, + { "custom_87.EDITOR.xpos", "22" }, + { "custom_87.EDITOR.ypos", "5" }, - { "custom_88", "RocksElements.pcx" }, + { "custom_88", "RocksCE.pcx" }, { "custom_88.xpos", "7" }, - { "custom_88.ypos", "9" }, + { "custom_88.ypos", "5" }, { "custom_88.frames", "1" }, - { "custom_88.EDITOR", "RocksElements.pcx" }, - { "custom_88.EDITOR.xpos", "15" }, - { "custom_88.EDITOR.ypos", "13" }, + { "custom_88.EDITOR", "RocksCE.pcx" }, + { "custom_88.EDITOR.xpos", "23" }, + { "custom_88.EDITOR.ypos", "5" }, - { "custom_89", "RocksElements.pcx" }, - { "custom_89.xpos", "7" }, - { "custom_89.ypos", "9" }, + { "custom_89", "RocksCE.pcx" }, + { "custom_89.xpos", "8" }, + { "custom_89.ypos", "5" }, { "custom_89.frames", "1" }, - { "custom_89.EDITOR", "RocksElements.pcx" }, - { "custom_89.EDITOR.xpos", "15" }, - { "custom_89.EDITOR.ypos", "13" }, + { "custom_89.EDITOR", "RocksCE.pcx" }, + { "custom_89.EDITOR.xpos", "24" }, + { "custom_89.EDITOR.ypos", "5" }, - { "custom_90", "RocksElements.pcx" }, - { "custom_90.xpos", "7" }, - { "custom_90.ypos", "9" }, + { "custom_90", "RocksCE.pcx" }, + { "custom_90.xpos", "9" }, + { "custom_90.ypos", "5" }, { "custom_90.frames", "1" }, - { "custom_90.EDITOR", "RocksElements.pcx" }, - { "custom_90.EDITOR.xpos", "15" }, - { "custom_90.EDITOR.ypos", "13" }, + { "custom_90.EDITOR", "RocksCE.pcx" }, + { "custom_90.EDITOR.xpos", "25" }, + { "custom_90.EDITOR.ypos", "5" }, - { "custom_91", "RocksElements.pcx" }, - { "custom_91.xpos", "7" }, - { "custom_91.ypos", "9" }, + { "custom_91", "RocksCE.pcx" }, + { "custom_91.xpos", "10" }, + { "custom_91.ypos", "5" }, { "custom_91.frames", "1" }, - { "custom_91.EDITOR", "RocksElements.pcx" }, - { "custom_91.EDITOR.xpos", "15" }, - { "custom_91.EDITOR.ypos", "13" }, + { "custom_91.EDITOR", "RocksCE.pcx" }, + { "custom_91.EDITOR.xpos", "26" }, + { "custom_91.EDITOR.ypos", "5" }, - { "custom_92", "RocksElements.pcx" }, - { "custom_92.xpos", "7" }, - { "custom_92.ypos", "9" }, + { "custom_92", "RocksCE.pcx" }, + { "custom_92.xpos", "11" }, + { "custom_92.ypos", "5" }, { "custom_92.frames", "1" }, - { "custom_92.EDITOR", "RocksElements.pcx" }, - { "custom_92.EDITOR.xpos", "15" }, - { "custom_92.EDITOR.ypos", "13" }, + { "custom_92.EDITOR", "RocksCE.pcx" }, + { "custom_92.EDITOR.xpos", "27" }, + { "custom_92.EDITOR.ypos", "5" }, - { "custom_93", "RocksElements.pcx" }, - { "custom_93.xpos", "7" }, - { "custom_93.ypos", "9" }, + { "custom_93", "RocksCE.pcx" }, + { "custom_93.xpos", "12" }, + { "custom_93.ypos", "5" }, { "custom_93.frames", "1" }, - { "custom_93.EDITOR", "RocksElements.pcx" }, - { "custom_93.EDITOR.xpos", "15" }, - { "custom_93.EDITOR.ypos", "13" }, + { "custom_93.EDITOR", "RocksCE.pcx" }, + { "custom_93.EDITOR.xpos", "28" }, + { "custom_93.EDITOR.ypos", "5" }, - { "custom_94", "RocksElements.pcx" }, - { "custom_94.xpos", "7" }, - { "custom_94.ypos", "9" }, + { "custom_94", "RocksCE.pcx" }, + { "custom_94.xpos", "13" }, + { "custom_94.ypos", "5" }, { "custom_94.frames", "1" }, - { "custom_94.EDITOR", "RocksElements.pcx" }, - { "custom_94.EDITOR.xpos", "15" }, - { "custom_94.EDITOR.ypos", "13" }, + { "custom_94.EDITOR", "RocksCE.pcx" }, + { "custom_94.EDITOR.xpos", "29" }, + { "custom_94.EDITOR.ypos", "5" }, - { "custom_95", "RocksElements.pcx" }, - { "custom_95.xpos", "7" }, - { "custom_95.ypos", "9" }, + { "custom_95", "RocksCE.pcx" }, + { "custom_95.xpos", "14" }, + { "custom_95.ypos", "5" }, { "custom_95.frames", "1" }, - { "custom_95.EDITOR", "RocksElements.pcx" }, - { "custom_95.EDITOR.xpos", "15" }, - { "custom_95.EDITOR.ypos", "13" }, + { "custom_95.EDITOR", "RocksCE.pcx" }, + { "custom_95.EDITOR.xpos", "30" }, + { "custom_95.EDITOR.ypos", "5" }, - { "custom_96", "RocksElements.pcx" }, - { "custom_96.xpos", "7" }, - { "custom_96.ypos", "9" }, + { "custom_96", "RocksCE.pcx" }, + { "custom_96.xpos", "15" }, + { "custom_96.ypos", "5" }, { "custom_96.frames", "1" }, - { "custom_96.EDITOR", "RocksElements.pcx" }, - { "custom_96.EDITOR.xpos", "15" }, - { "custom_96.EDITOR.ypos", "13" }, + { "custom_96.EDITOR", "RocksCE.pcx" }, + { "custom_96.EDITOR.xpos", "31" }, + { "custom_96.EDITOR.ypos", "5" }, - { "custom_97", "RocksElements.pcx" }, - { "custom_97.xpos", "7" }, - { "custom_97.ypos", "9" }, + { "custom_97", "RocksCE.pcx" }, + { "custom_97.xpos", "0" }, + { "custom_97.ypos", "6" }, { "custom_97.frames", "1" }, - { "custom_97.EDITOR", "RocksElements.pcx" }, - { "custom_97.EDITOR.xpos", "15" }, - { "custom_97.EDITOR.ypos", "13" }, + { "custom_97.EDITOR", "RocksCE.pcx" }, + { "custom_97.EDITOR.xpos", "16" }, + { "custom_97.EDITOR.ypos", "6" }, - { "custom_98", "RocksElements.pcx" }, - { "custom_98.xpos", "7" }, - { "custom_98.ypos", "9" }, + { "custom_98", "RocksCE.pcx" }, + { "custom_98.xpos", "1" }, + { "custom_98.ypos", "6" }, { "custom_98.frames", "1" }, - { "custom_98.EDITOR", "RocksElements.pcx" }, - { "custom_98.EDITOR.xpos", "15" }, - { "custom_98.EDITOR.ypos", "13" }, + { "custom_98.EDITOR", "RocksCE.pcx" }, + { "custom_98.EDITOR.xpos", "17" }, + { "custom_98.EDITOR.ypos", "6" }, - { "custom_99", "RocksElements.pcx" }, - { "custom_99.xpos", "7" }, - { "custom_99.ypos", "9" }, + { "custom_99", "RocksCE.pcx" }, + { "custom_99.xpos", "2" }, + { "custom_99.ypos", "6" }, { "custom_99.frames", "1" }, - { "custom_99.EDITOR", "RocksElements.pcx" }, - { "custom_99.EDITOR.xpos", "15" }, - { "custom_99.EDITOR.ypos", "13" }, + { "custom_99.EDITOR", "RocksCE.pcx" }, + { "custom_99.EDITOR.xpos", "18" }, + { "custom_99.EDITOR.ypos", "6" }, - { "custom_100", "RocksElements.pcx" }, - { "custom_100.xpos", "7" }, - { "custom_100.ypos", "9" }, + { "custom_100", "RocksCE.pcx" }, + { "custom_100.xpos", "3" }, + { "custom_100.ypos", "6" }, { "custom_100.frames", "1" }, - { "custom_100.EDITOR", "RocksElements.pcx" }, - { "custom_100.EDITOR.xpos", "15" }, - { "custom_100.EDITOR.ypos", "13" }, + { "custom_100.EDITOR", "RocksCE.pcx" }, + { "custom_100.EDITOR.xpos", "19" }, + { "custom_100.EDITOR.ypos", "6" }, - { "custom_101", "RocksElements.pcx" }, - { "custom_101.xpos", "7" }, - { "custom_101.ypos", "9" }, + { "custom_101", "RocksCE.pcx" }, + { "custom_101.xpos", "4" }, + { "custom_101.ypos", "6" }, { "custom_101.frames", "1" }, - { "custom_101.EDITOR", "RocksElements.pcx" }, - { "custom_101.EDITOR.xpos", "15" }, - { "custom_101.EDITOR.ypos", "13" }, + { "custom_101.EDITOR", "RocksCE.pcx" }, + { "custom_101.EDITOR.xpos", "20" }, + { "custom_101.EDITOR.ypos", "6" }, - { "custom_102", "RocksElements.pcx" }, - { "custom_102.xpos", "7" }, - { "custom_102.ypos", "9" }, + { "custom_102", "RocksCE.pcx" }, + { "custom_102.xpos", "5" }, + { "custom_102.ypos", "6" }, { "custom_102.frames", "1" }, - { "custom_102.EDITOR", "RocksElements.pcx" }, - { "custom_102.EDITOR.xpos", "15" }, - { "custom_102.EDITOR.ypos", "13" }, + { "custom_102.EDITOR", "RocksCE.pcx" }, + { "custom_102.EDITOR.xpos", "21" }, + { "custom_102.EDITOR.ypos", "6" }, - { "custom_103", "RocksElements.pcx" }, - { "custom_103.xpos", "7" }, - { "custom_103.ypos", "9" }, + { "custom_103", "RocksCE.pcx" }, + { "custom_103.xpos", "6" }, + { "custom_103.ypos", "6" }, { "custom_103.frames", "1" }, - { "custom_103.EDITOR", "RocksElements.pcx" }, - { "custom_103.EDITOR.xpos", "15" }, - { "custom_103.EDITOR.ypos", "13" }, + { "custom_103.EDITOR", "RocksCE.pcx" }, + { "custom_103.EDITOR.xpos", "22" }, + { "custom_103.EDITOR.ypos", "6" }, - { "custom_104", "RocksElements.pcx" }, + { "custom_104", "RocksCE.pcx" }, { "custom_104.xpos", "7" }, - { "custom_104.ypos", "9" }, + { "custom_104.ypos", "6" }, { "custom_104.frames", "1" }, - { "custom_104.EDITOR", "RocksElements.pcx" }, - { "custom_104.EDITOR.xpos", "15" }, - { "custom_104.EDITOR.ypos", "13" }, + { "custom_104.EDITOR", "RocksCE.pcx" }, + { "custom_104.EDITOR.xpos", "23" }, + { "custom_104.EDITOR.ypos", "6" }, - { "custom_105", "RocksElements.pcx" }, - { "custom_105.xpos", "7" }, - { "custom_105.ypos", "9" }, + { "custom_105", "RocksCE.pcx" }, + { "custom_105.xpos", "8" }, + { "custom_105.ypos", "6" }, { "custom_105.frames", "1" }, - { "custom_105.EDITOR", "RocksElements.pcx" }, - { "custom_105.EDITOR.xpos", "15" }, - { "custom_105.EDITOR.ypos", "13" }, + { "custom_105.EDITOR", "RocksCE.pcx" }, + { "custom_105.EDITOR.xpos", "24" }, + { "custom_105.EDITOR.ypos", "6" }, - { "custom_106", "RocksElements.pcx" }, - { "custom_106.xpos", "7" }, - { "custom_106.ypos", "9" }, + { "custom_106", "RocksCE.pcx" }, + { "custom_106.xpos", "9" }, + { "custom_106.ypos", "6" }, { "custom_106.frames", "1" }, - { "custom_106.EDITOR", "RocksElements.pcx" }, - { "custom_106.EDITOR.xpos", "15" }, - { "custom_106.EDITOR.ypos", "13" }, + { "custom_106.EDITOR", "RocksCE.pcx" }, + { "custom_106.EDITOR.xpos", "25" }, + { "custom_106.EDITOR.ypos", "6" }, - { "custom_107", "RocksElements.pcx" }, - { "custom_107.xpos", "7" }, - { "custom_107.ypos", "9" }, + { "custom_107", "RocksCE.pcx" }, + { "custom_107.xpos", "10" }, + { "custom_107.ypos", "6" }, { "custom_107.frames", "1" }, - { "custom_107.EDITOR", "RocksElements.pcx" }, - { "custom_107.EDITOR.xpos", "15" }, - { "custom_107.EDITOR.ypos", "13" }, + { "custom_107.EDITOR", "RocksCE.pcx" }, + { "custom_107.EDITOR.xpos", "26" }, + { "custom_107.EDITOR.ypos", "6" }, - { "custom_108", "RocksElements.pcx" }, - { "custom_108.xpos", "7" }, - { "custom_108.ypos", "9" }, + { "custom_108", "RocksCE.pcx" }, + { "custom_108.xpos", "11" }, + { "custom_108.ypos", "6" }, { "custom_108.frames", "1" }, - { "custom_108.EDITOR", "RocksElements.pcx" }, - { "custom_108.EDITOR.xpos", "15" }, - { "custom_108.EDITOR.ypos", "13" }, + { "custom_108.EDITOR", "RocksCE.pcx" }, + { "custom_108.EDITOR.xpos", "27" }, + { "custom_108.EDITOR.ypos", "6" }, - { "custom_109", "RocksElements.pcx" }, - { "custom_109.xpos", "7" }, - { "custom_109.ypos", "9" }, + { "custom_109", "RocksCE.pcx" }, + { "custom_109.xpos", "12" }, + { "custom_109.ypos", "6" }, { "custom_109.frames", "1" }, - { "custom_109.EDITOR", "RocksElements.pcx" }, - { "custom_109.EDITOR.xpos", "15" }, - { "custom_109.EDITOR.ypos", "13" }, + { "custom_109.EDITOR", "RocksCE.pcx" }, + { "custom_109.EDITOR.xpos", "28" }, + { "custom_109.EDITOR.ypos", "6" }, - { "custom_110", "RocksElements.pcx" }, - { "custom_110.xpos", "7" }, - { "custom_110.ypos", "9" }, + { "custom_110", "RocksCE.pcx" }, + { "custom_110.xpos", "13" }, + { "custom_110.ypos", "6" }, { "custom_110.frames", "1" }, - { "custom_110.EDITOR", "RocksElements.pcx" }, - { "custom_110.EDITOR.xpos", "15" }, - { "custom_110.EDITOR.ypos", "13" }, + { "custom_110.EDITOR", "RocksCE.pcx" }, + { "custom_110.EDITOR.xpos", "29" }, + { "custom_110.EDITOR.ypos", "6" }, - { "custom_111", "RocksElements.pcx" }, - { "custom_111.xpos", "7" }, - { "custom_111.ypos", "9" }, + { "custom_111", "RocksCE.pcx" }, + { "custom_111.xpos", "14" }, + { "custom_111.ypos", "6" }, { "custom_111.frames", "1" }, - { "custom_111.EDITOR", "RocksElements.pcx" }, - { "custom_111.EDITOR.xpos", "15" }, - { "custom_111.EDITOR.ypos", "13" }, + { "custom_111.EDITOR", "RocksCE.pcx" }, + { "custom_111.EDITOR.xpos", "30" }, + { "custom_111.EDITOR.ypos", "6" }, - { "custom_112", "RocksElements.pcx" }, - { "custom_112.xpos", "7" }, - { "custom_112.ypos", "9" }, + { "custom_112", "RocksCE.pcx" }, + { "custom_112.xpos", "15" }, + { "custom_112.ypos", "6" }, { "custom_112.frames", "1" }, - { "custom_112.EDITOR", "RocksElements.pcx" }, - { "custom_112.EDITOR.xpos", "15" }, - { "custom_112.EDITOR.ypos", "13" }, + { "custom_112.EDITOR", "RocksCE.pcx" }, + { "custom_112.EDITOR.xpos", "31" }, + { "custom_112.EDITOR.ypos", "6" }, - { "custom_113", "RocksElements.pcx" }, - { "custom_113.xpos", "7" }, - { "custom_113.ypos", "9" }, + { "custom_113", "RocksCE.pcx" }, + { "custom_113.xpos", "0" }, + { "custom_113.ypos", "7" }, { "custom_113.frames", "1" }, - { "custom_113.EDITOR", "RocksElements.pcx" }, - { "custom_113.EDITOR.xpos", "15" }, - { "custom_113.EDITOR.ypos", "13" }, + { "custom_113.EDITOR", "RocksCE.pcx" }, + { "custom_113.EDITOR.xpos", "16" }, + { "custom_113.EDITOR.ypos", "7" }, - { "custom_114", "RocksElements.pcx" }, - { "custom_114.xpos", "7" }, - { "custom_114.ypos", "9" }, + { "custom_114", "RocksCE.pcx" }, + { "custom_114.xpos", "1" }, + { "custom_114.ypos", "7" }, { "custom_114.frames", "1" }, - { "custom_114.EDITOR", "RocksElements.pcx" }, - { "custom_114.EDITOR.xpos", "15" }, - { "custom_114.EDITOR.ypos", "13" }, + { "custom_114.EDITOR", "RocksCE.pcx" }, + { "custom_114.EDITOR.xpos", "17" }, + { "custom_114.EDITOR.ypos", "7" }, - { "custom_115", "RocksElements.pcx" }, - { "custom_115.xpos", "7" }, - { "custom_115.ypos", "9" }, + { "custom_115", "RocksCE.pcx" }, + { "custom_115.xpos", "2" }, + { "custom_115.ypos", "7" }, { "custom_115.frames", "1" }, - { "custom_115.EDITOR", "RocksElements.pcx" }, - { "custom_115.EDITOR.xpos", "15" }, - { "custom_115.EDITOR.ypos", "13" }, + { "custom_115.EDITOR", "RocksCE.pcx" }, + { "custom_115.EDITOR.xpos", "18" }, + { "custom_115.EDITOR.ypos", "7" }, - { "custom_116", "RocksElements.pcx" }, - { "custom_116.xpos", "7" }, - { "custom_116.ypos", "9" }, + { "custom_116", "RocksCE.pcx" }, + { "custom_116.xpos", "3" }, + { "custom_116.ypos", "7" }, { "custom_116.frames", "1" }, - { "custom_116.EDITOR", "RocksElements.pcx" }, - { "custom_116.EDITOR.xpos", "15" }, - { "custom_116.EDITOR.ypos", "13" }, + { "custom_116.EDITOR", "RocksCE.pcx" }, + { "custom_116.EDITOR.xpos", "19" }, + { "custom_116.EDITOR.ypos", "7" }, - { "custom_117", "RocksElements.pcx" }, - { "custom_117.xpos", "7" }, - { "custom_117.ypos", "9" }, + { "custom_117", "RocksCE.pcx" }, + { "custom_117.xpos", "4" }, + { "custom_117.ypos", "7" }, { "custom_117.frames", "1" }, - { "custom_117.EDITOR", "RocksElements.pcx" }, - { "custom_117.EDITOR.xpos", "15" }, - { "custom_117.EDITOR.ypos", "13" }, + { "custom_117.EDITOR", "RocksCE.pcx" }, + { "custom_117.EDITOR.xpos", "20" }, + { "custom_117.EDITOR.ypos", "7" }, - { "custom_118", "RocksElements.pcx" }, - { "custom_118.xpos", "7" }, - { "custom_118.ypos", "9" }, + { "custom_118", "RocksCE.pcx" }, + { "custom_118.xpos", "5" }, + { "custom_118.ypos", "7" }, { "custom_118.frames", "1" }, - { "custom_118.EDITOR", "RocksElements.pcx" }, - { "custom_118.EDITOR.xpos", "15" }, - { "custom_118.EDITOR.ypos", "13" }, + { "custom_118.EDITOR", "RocksCE.pcx" }, + { "custom_118.EDITOR.xpos", "21" }, + { "custom_118.EDITOR.ypos", "7" }, - { "custom_119", "RocksElements.pcx" }, - { "custom_119.xpos", "7" }, - { "custom_119.ypos", "9" }, + { "custom_119", "RocksCE.pcx" }, + { "custom_119.xpos", "6" }, + { "custom_119.ypos", "7" }, { "custom_119.frames", "1" }, - { "custom_119.EDITOR", "RocksElements.pcx" }, - { "custom_119.EDITOR.xpos", "15" }, - { "custom_119.EDITOR.ypos", "13" }, + { "custom_119.EDITOR", "RocksCE.pcx" }, + { "custom_119.EDITOR.xpos", "22" }, + { "custom_119.EDITOR.ypos", "7" }, - { "custom_120", "RocksElements.pcx" }, + { "custom_120", "RocksCE.pcx" }, { "custom_120.xpos", "7" }, - { "custom_120.ypos", "9" }, + { "custom_120.ypos", "7" }, { "custom_120.frames", "1" }, - { "custom_120.EDITOR", "RocksElements.pcx" }, - { "custom_120.EDITOR.xpos", "15" }, - { "custom_120.EDITOR.ypos", "13" }, + { "custom_120.EDITOR", "RocksCE.pcx" }, + { "custom_120.EDITOR.xpos", "23" }, + { "custom_120.EDITOR.ypos", "7" }, - { "custom_121", "RocksElements.pcx" }, - { "custom_121.xpos", "7" }, - { "custom_121.ypos", "9" }, + { "custom_121", "RocksCE.pcx" }, + { "custom_121.xpos", "8" }, + { "custom_121.ypos", "7" }, { "custom_121.frames", "1" }, - { "custom_121.EDITOR", "RocksElements.pcx" }, - { "custom_121.EDITOR.xpos", "15" }, - { "custom_121.EDITOR.ypos", "13" }, + { "custom_121.EDITOR", "RocksCE.pcx" }, + { "custom_121.EDITOR.xpos", "24" }, + { "custom_121.EDITOR.ypos", "7" }, - { "custom_122", "RocksElements.pcx" }, - { "custom_122.xpos", "7" }, - { "custom_122.ypos", "9" }, + { "custom_122", "RocksCE.pcx" }, + { "custom_122.xpos", "9" }, + { "custom_122.ypos", "7" }, { "custom_122.frames", "1" }, - { "custom_122.EDITOR", "RocksElements.pcx" }, - { "custom_122.EDITOR.xpos", "15" }, - { "custom_122.EDITOR.ypos", "13" }, + { "custom_122.EDITOR", "RocksCE.pcx" }, + { "custom_122.EDITOR.xpos", "25" }, + { "custom_122.EDITOR.ypos", "7" }, - { "custom_123", "RocksElements.pcx" }, - { "custom_123.xpos", "7" }, - { "custom_123.ypos", "9" }, + { "custom_123", "RocksCE.pcx" }, + { "custom_123.xpos", "10" }, + { "custom_123.ypos", "7" }, { "custom_123.frames", "1" }, - { "custom_123.EDITOR", "RocksElements.pcx" }, - { "custom_123.EDITOR.xpos", "15" }, - { "custom_123.EDITOR.ypos", "13" }, + { "custom_123.EDITOR", "RocksCE.pcx" }, + { "custom_123.EDITOR.xpos", "26" }, + { "custom_123.EDITOR.ypos", "7" }, - { "custom_124", "RocksElements.pcx" }, - { "custom_124.xpos", "7" }, - { "custom_124.ypos", "9" }, + { "custom_124", "RocksCE.pcx" }, + { "custom_124.xpos", "11" }, + { "custom_124.ypos", "7" }, { "custom_124.frames", "1" }, - { "custom_124.EDITOR", "RocksElements.pcx" }, - { "custom_124.EDITOR.xpos", "15" }, - { "custom_124.EDITOR.ypos", "13" }, + { "custom_124.EDITOR", "RocksCE.pcx" }, + { "custom_124.EDITOR.xpos", "27" }, + { "custom_124.EDITOR.ypos", "7" }, - { "custom_125", "RocksElements.pcx" }, - { "custom_125.xpos", "7" }, - { "custom_125.ypos", "9" }, + { "custom_125", "RocksCE.pcx" }, + { "custom_125.xpos", "12" }, + { "custom_125.ypos", "7" }, { "custom_125.frames", "1" }, - { "custom_125.EDITOR", "RocksElements.pcx" }, - { "custom_125.EDITOR.xpos", "15" }, - { "custom_125.EDITOR.ypos", "13" }, + { "custom_125.EDITOR", "RocksCE.pcx" }, + { "custom_125.EDITOR.xpos", "28" }, + { "custom_125.EDITOR.ypos", "7" }, - { "custom_126", "RocksElements.pcx" }, - { "custom_126.xpos", "7" }, - { "custom_126.ypos", "9" }, + { "custom_126", "RocksCE.pcx" }, + { "custom_126.xpos", "13" }, + { "custom_126.ypos", "7" }, { "custom_126.frames", "1" }, - { "custom_126.EDITOR", "RocksElements.pcx" }, - { "custom_126.EDITOR.xpos", "15" }, - { "custom_126.EDITOR.ypos", "13" }, + { "custom_126.EDITOR", "RocksCE.pcx" }, + { "custom_126.EDITOR.xpos", "29" }, + { "custom_126.EDITOR.ypos", "7" }, - { "custom_127", "RocksElements.pcx" }, - { "custom_127.xpos", "7" }, - { "custom_127.ypos", "9" }, + { "custom_127", "RocksCE.pcx" }, + { "custom_127.xpos", "14" }, + { "custom_127.ypos", "7" }, { "custom_127.frames", "1" }, - { "custom_127.EDITOR", "RocksElements.pcx" }, - { "custom_127.EDITOR.xpos", "15" }, - { "custom_127.EDITOR.ypos", "13" }, + { "custom_127.EDITOR", "RocksCE.pcx" }, + { "custom_127.EDITOR.xpos", "30" }, + { "custom_127.EDITOR.ypos", "7" }, - { "custom_128", "RocksElements.pcx" }, - { "custom_128.xpos", "7" }, - { "custom_128.ypos", "9" }, + { "custom_128", "RocksCE.pcx" }, + { "custom_128.xpos", "15" }, + { "custom_128.ypos", "7" }, { "custom_128.frames", "1" }, - { "custom_128.EDITOR", "RocksElements.pcx" }, - { "custom_128.EDITOR.xpos", "15" }, - { "custom_128.EDITOR.ypos", "13" }, + { "custom_128.EDITOR", "RocksCE.pcx" }, + { "custom_128.EDITOR.xpos", "31" }, + { "custom_128.EDITOR.ypos", "7" }, - { "custom_129", "RocksElements.pcx" }, - { "custom_129.xpos", "7" }, - { "custom_129.ypos", "9" }, + { "custom_129", "RocksCE.pcx" }, + { "custom_129.xpos", "0" }, + { "custom_129.ypos", "8" }, { "custom_129.frames", "1" }, - { "custom_129.EDITOR", "RocksElements.pcx" }, - { "custom_129.EDITOR.xpos", "15" }, - { "custom_129.EDITOR.ypos", "13" }, + { "custom_129.EDITOR", "RocksCE.pcx" }, + { "custom_129.EDITOR.xpos", "16" }, + { "custom_129.EDITOR.ypos", "8" }, - { "custom_130", "RocksElements.pcx" }, - { "custom_130.xpos", "7" }, - { "custom_130.ypos", "9" }, + { "custom_130", "RocksCE.pcx" }, + { "custom_130.xpos", "1" }, + { "custom_130.ypos", "8" }, { "custom_130.frames", "1" }, - { "custom_130.EDITOR", "RocksElements.pcx" }, - { "custom_130.EDITOR.xpos", "15" }, - { "custom_130.EDITOR.ypos", "13" }, + { "custom_130.EDITOR", "RocksCE.pcx" }, + { "custom_130.EDITOR.xpos", "17" }, + { "custom_130.EDITOR.ypos", "8" }, - { "custom_131", "RocksElements.pcx" }, - { "custom_131.xpos", "7" }, - { "custom_131.ypos", "9" }, + { "custom_131", "RocksCE.pcx" }, + { "custom_131.xpos", "2" }, + { "custom_131.ypos", "8" }, { "custom_131.frames", "1" }, - { "custom_131.EDITOR", "RocksElements.pcx" }, - { "custom_131.EDITOR.xpos", "15" }, - { "custom_131.EDITOR.ypos", "13" }, + { "custom_131.EDITOR", "RocksCE.pcx" }, + { "custom_131.EDITOR.xpos", "18" }, + { "custom_131.EDITOR.ypos", "8" }, - { "custom_132", "RocksElements.pcx" }, - { "custom_132.xpos", "7" }, - { "custom_132.ypos", "9" }, + { "custom_132", "RocksCE.pcx" }, + { "custom_132.xpos", "3" }, + { "custom_132.ypos", "8" }, { "custom_132.frames", "1" }, - { "custom_132.EDITOR", "RocksElements.pcx" }, - { "custom_132.EDITOR.xpos", "15" }, - { "custom_132.EDITOR.ypos", "13" }, + { "custom_132.EDITOR", "RocksCE.pcx" }, + { "custom_132.EDITOR.xpos", "19" }, + { "custom_132.EDITOR.ypos", "8" }, - { "custom_133", "RocksElements.pcx" }, - { "custom_133.xpos", "7" }, - { "custom_133.ypos", "9" }, + { "custom_133", "RocksCE.pcx" }, + { "custom_133.xpos", "4" }, + { "custom_133.ypos", "8" }, { "custom_133.frames", "1" }, - { "custom_133.EDITOR", "RocksElements.pcx" }, - { "custom_133.EDITOR.xpos", "15" }, - { "custom_133.EDITOR.ypos", "13" }, + { "custom_133.EDITOR", "RocksCE.pcx" }, + { "custom_133.EDITOR.xpos", "20" }, + { "custom_133.EDITOR.ypos", "8" }, - { "custom_134", "RocksElements.pcx" }, - { "custom_134.xpos", "7" }, - { "custom_134.ypos", "9" }, + { "custom_134", "RocksCE.pcx" }, + { "custom_134.xpos", "5" }, + { "custom_134.ypos", "8" }, { "custom_134.frames", "1" }, - { "custom_134.EDITOR", "RocksElements.pcx" }, - { "custom_134.EDITOR.xpos", "15" }, - { "custom_134.EDITOR.ypos", "13" }, + { "custom_134.EDITOR", "RocksCE.pcx" }, + { "custom_134.EDITOR.xpos", "21" }, + { "custom_134.EDITOR.ypos", "8" }, - { "custom_135", "RocksElements.pcx" }, - { "custom_135.xpos", "7" }, - { "custom_135.ypos", "9" }, + { "custom_135", "RocksCE.pcx" }, + { "custom_135.xpos", "6" }, + { "custom_135.ypos", "8" }, { "custom_135.frames", "1" }, - { "custom_135.EDITOR", "RocksElements.pcx" }, - { "custom_135.EDITOR.xpos", "15" }, - { "custom_135.EDITOR.ypos", "13" }, + { "custom_135.EDITOR", "RocksCE.pcx" }, + { "custom_135.EDITOR.xpos", "22" }, + { "custom_135.EDITOR.ypos", "8" }, - { "custom_136", "RocksElements.pcx" }, + { "custom_136", "RocksCE.pcx" }, { "custom_136.xpos", "7" }, - { "custom_136.ypos", "9" }, + { "custom_136.ypos", "8" }, { "custom_136.frames", "1" }, - { "custom_136.EDITOR", "RocksElements.pcx" }, - { "custom_136.EDITOR.xpos", "15" }, - { "custom_136.EDITOR.ypos", "13" }, + { "custom_136.EDITOR", "RocksCE.pcx" }, + { "custom_136.EDITOR.xpos", "23" }, + { "custom_136.EDITOR.ypos", "8" }, - { "custom_137", "RocksElements.pcx" }, - { "custom_137.xpos", "7" }, - { "custom_137.ypos", "9" }, + { "custom_137", "RocksCE.pcx" }, + { "custom_137.xpos", "8" }, + { "custom_137.ypos", "8" }, { "custom_137.frames", "1" }, - { "custom_137.EDITOR", "RocksElements.pcx" }, - { "custom_137.EDITOR.xpos", "15" }, - { "custom_137.EDITOR.ypos", "13" }, + { "custom_137.EDITOR", "RocksCE.pcx" }, + { "custom_137.EDITOR.xpos", "24" }, + { "custom_137.EDITOR.ypos", "8" }, - { "custom_138", "RocksElements.pcx" }, - { "custom_138.xpos", "7" }, - { "custom_138.ypos", "9" }, + { "custom_138", "RocksCE.pcx" }, + { "custom_138.xpos", "9" }, + { "custom_138.ypos", "8" }, { "custom_138.frames", "1" }, - { "custom_138.EDITOR", "RocksElements.pcx" }, - { "custom_138.EDITOR.xpos", "15" }, - { "custom_138.EDITOR.ypos", "13" }, + { "custom_138.EDITOR", "RocksCE.pcx" }, + { "custom_138.EDITOR.xpos", "25" }, + { "custom_138.EDITOR.ypos", "8" }, - { "custom_139", "RocksElements.pcx" }, - { "custom_139.xpos", "7" }, - { "custom_139.ypos", "9" }, + { "custom_139", "RocksCE.pcx" }, + { "custom_139.xpos", "10" }, + { "custom_139.ypos", "8" }, { "custom_139.frames", "1" }, - { "custom_139.EDITOR", "RocksElements.pcx" }, - { "custom_139.EDITOR.xpos", "15" }, - { "custom_139.EDITOR.ypos", "13" }, + { "custom_139.EDITOR", "RocksCE.pcx" }, + { "custom_139.EDITOR.xpos", "26" }, + { "custom_139.EDITOR.ypos", "8" }, - { "custom_140", "RocksElements.pcx" }, - { "custom_140.xpos", "7" }, - { "custom_140.ypos", "9" }, + { "custom_140", "RocksCE.pcx" }, + { "custom_140.xpos", "11" }, + { "custom_140.ypos", "8" }, { "custom_140.frames", "1" }, - { "custom_140.EDITOR", "RocksElements.pcx" }, - { "custom_140.EDITOR.xpos", "15" }, - { "custom_140.EDITOR.ypos", "13" }, + { "custom_140.EDITOR", "RocksCE.pcx" }, + { "custom_140.EDITOR.xpos", "27" }, + { "custom_140.EDITOR.ypos", "8" }, - { "custom_141", "RocksElements.pcx" }, - { "custom_141.xpos", "7" }, - { "custom_141.ypos", "9" }, + { "custom_141", "RocksCE.pcx" }, + { "custom_141.xpos", "12" }, + { "custom_141.ypos", "8" }, { "custom_141.frames", "1" }, - { "custom_141.EDITOR", "RocksElements.pcx" }, - { "custom_141.EDITOR.xpos", "15" }, - { "custom_141.EDITOR.ypos", "13" }, + { "custom_141.EDITOR", "RocksCE.pcx" }, + { "custom_141.EDITOR.xpos", "28" }, + { "custom_141.EDITOR.ypos", "8" }, - { "custom_142", "RocksElements.pcx" }, - { "custom_142.xpos", "7" }, - { "custom_142.ypos", "9" }, + { "custom_142", "RocksCE.pcx" }, + { "custom_142.xpos", "13" }, + { "custom_142.ypos", "8" }, { "custom_142.frames", "1" }, - { "custom_142.EDITOR", "RocksElements.pcx" }, - { "custom_142.EDITOR.xpos", "15" }, - { "custom_142.EDITOR.ypos", "13" }, + { "custom_142.EDITOR", "RocksCE.pcx" }, + { "custom_142.EDITOR.xpos", "29" }, + { "custom_142.EDITOR.ypos", "8" }, - { "custom_143", "RocksElements.pcx" }, - { "custom_143.xpos", "7" }, - { "custom_143.ypos", "9" }, + { "custom_143", "RocksCE.pcx" }, + { "custom_143.xpos", "14" }, + { "custom_143.ypos", "8" }, { "custom_143.frames", "1" }, - { "custom_143.EDITOR", "RocksElements.pcx" }, - { "custom_143.EDITOR.xpos", "15" }, - { "custom_143.EDITOR.ypos", "13" }, + { "custom_143.EDITOR", "RocksCE.pcx" }, + { "custom_143.EDITOR.xpos", "30" }, + { "custom_143.EDITOR.ypos", "8" }, - { "custom_144", "RocksElements.pcx" }, - { "custom_144.xpos", "7" }, - { "custom_144.ypos", "9" }, + { "custom_144", "RocksCE.pcx" }, + { "custom_144.xpos", "15" }, + { "custom_144.ypos", "8" }, { "custom_144.frames", "1" }, - { "custom_144.EDITOR", "RocksElements.pcx" }, - { "custom_144.EDITOR.xpos", "15" }, - { "custom_144.EDITOR.ypos", "13" }, + { "custom_144.EDITOR", "RocksCE.pcx" }, + { "custom_144.EDITOR.xpos", "31" }, + { "custom_144.EDITOR.ypos", "8" }, - { "custom_145", "RocksElements.pcx" }, - { "custom_145.xpos", "7" }, + { "custom_145", "RocksCE.pcx" }, + { "custom_145.xpos", "0" }, { "custom_145.ypos", "9" }, { "custom_145.frames", "1" }, - { "custom_145.EDITOR", "RocksElements.pcx" }, - { "custom_145.EDITOR.xpos", "15" }, - { "custom_145.EDITOR.ypos", "13" }, + { "custom_145.EDITOR", "RocksCE.pcx" }, + { "custom_145.EDITOR.xpos", "16" }, + { "custom_145.EDITOR.ypos", "9" }, - { "custom_146", "RocksElements.pcx" }, - { "custom_146.xpos", "7" }, + { "custom_146", "RocksCE.pcx" }, + { "custom_146.xpos", "1" }, { "custom_146.ypos", "9" }, { "custom_146.frames", "1" }, - { "custom_146.EDITOR", "RocksElements.pcx" }, - { "custom_146.EDITOR.xpos", "15" }, - { "custom_146.EDITOR.ypos", "13" }, + { "custom_146.EDITOR", "RocksCE.pcx" }, + { "custom_146.EDITOR.xpos", "17" }, + { "custom_146.EDITOR.ypos", "9" }, - { "custom_147", "RocksElements.pcx" }, - { "custom_147.xpos", "7" }, + { "custom_147", "RocksCE.pcx" }, + { "custom_147.xpos", "2" }, { "custom_147.ypos", "9" }, { "custom_147.frames", "1" }, - { "custom_147.EDITOR", "RocksElements.pcx" }, - { "custom_147.EDITOR.xpos", "15" }, - { "custom_147.EDITOR.ypos", "13" }, + { "custom_147.EDITOR", "RocksCE.pcx" }, + { "custom_147.EDITOR.xpos", "18" }, + { "custom_147.EDITOR.ypos", "9" }, - { "custom_148", "RocksElements.pcx" }, - { "custom_148.xpos", "7" }, + { "custom_148", "RocksCE.pcx" }, + { "custom_148.xpos", "3" }, { "custom_148.ypos", "9" }, { "custom_148.frames", "1" }, - { "custom_148.EDITOR", "RocksElements.pcx" }, - { "custom_148.EDITOR.xpos", "15" }, - { "custom_148.EDITOR.ypos", "13" }, + { "custom_148.EDITOR", "RocksCE.pcx" }, + { "custom_148.EDITOR.xpos", "19" }, + { "custom_148.EDITOR.ypos", "9" }, - { "custom_149", "RocksElements.pcx" }, - { "custom_149.xpos", "7" }, + { "custom_149", "RocksCE.pcx" }, + { "custom_149.xpos", "4" }, { "custom_149.ypos", "9" }, { "custom_149.frames", "1" }, - { "custom_149.EDITOR", "RocksElements.pcx" }, - { "custom_149.EDITOR.xpos", "15" }, - { "custom_149.EDITOR.ypos", "13" }, + { "custom_149.EDITOR", "RocksCE.pcx" }, + { "custom_149.EDITOR.xpos", "20" }, + { "custom_149.EDITOR.ypos", "9" }, - { "custom_150", "RocksElements.pcx" }, - { "custom_150.xpos", "7" }, + { "custom_150", "RocksCE.pcx" }, + { "custom_150.xpos", "5" }, { "custom_150.ypos", "9" }, { "custom_150.frames", "1" }, - { "custom_150.EDITOR", "RocksElements.pcx" }, - { "custom_150.EDITOR.xpos", "15" }, - { "custom_150.EDITOR.ypos", "13" }, + { "custom_150.EDITOR", "RocksCE.pcx" }, + { "custom_150.EDITOR.xpos", "21" }, + { "custom_150.EDITOR.ypos", "9" }, - { "custom_151", "RocksElements.pcx" }, - { "custom_151.xpos", "7" }, + { "custom_151", "RocksCE.pcx" }, + { "custom_151.xpos", "6" }, { "custom_151.ypos", "9" }, { "custom_151.frames", "1" }, - { "custom_151.EDITOR", "RocksElements.pcx" }, - { "custom_151.EDITOR.xpos", "15" }, - { "custom_151.EDITOR.ypos", "13" }, + { "custom_151.EDITOR", "RocksCE.pcx" }, + { "custom_151.EDITOR.xpos", "22" }, + { "custom_151.EDITOR.ypos", "9" }, - { "custom_152", "RocksElements.pcx" }, + { "custom_152", "RocksCE.pcx" }, { "custom_152.xpos", "7" }, { "custom_152.ypos", "9" }, { "custom_152.frames", "1" }, - { "custom_152.EDITOR", "RocksElements.pcx" }, - { "custom_152.EDITOR.xpos", "15" }, - { "custom_152.EDITOR.ypos", "13" }, + { "custom_152.EDITOR", "RocksCE.pcx" }, + { "custom_152.EDITOR.xpos", "23" }, + { "custom_152.EDITOR.ypos", "9" }, - { "custom_153", "RocksElements.pcx" }, - { "custom_153.xpos", "7" }, + { "custom_153", "RocksCE.pcx" }, + { "custom_153.xpos", "8" }, { "custom_153.ypos", "9" }, { "custom_153.frames", "1" }, - { "custom_153.EDITOR", "RocksElements.pcx" }, - { "custom_153.EDITOR.xpos", "15" }, - { "custom_153.EDITOR.ypos", "13" }, + { "custom_153.EDITOR", "RocksCE.pcx" }, + { "custom_153.EDITOR.xpos", "24" }, + { "custom_153.EDITOR.ypos", "9" }, - { "custom_154", "RocksElements.pcx" }, - { "custom_154.xpos", "7" }, + { "custom_154", "RocksCE.pcx" }, + { "custom_154.xpos", "9" }, { "custom_154.ypos", "9" }, { "custom_154.frames", "1" }, - { "custom_154.EDITOR", "RocksElements.pcx" }, - { "custom_154.EDITOR.xpos", "15" }, - { "custom_154.EDITOR.ypos", "13" }, + { "custom_154.EDITOR", "RocksCE.pcx" }, + { "custom_154.EDITOR.xpos", "25" }, + { "custom_154.EDITOR.ypos", "9" }, - { "custom_155", "RocksElements.pcx" }, - { "custom_155.xpos", "7" }, + { "custom_155", "RocksCE.pcx" }, + { "custom_155.xpos", "10" }, { "custom_155.ypos", "9" }, { "custom_155.frames", "1" }, - { "custom_155.EDITOR", "RocksElements.pcx" }, - { "custom_155.EDITOR.xpos", "15" }, - { "custom_155.EDITOR.ypos", "13" }, + { "custom_155.EDITOR", "RocksCE.pcx" }, + { "custom_155.EDITOR.xpos", "26" }, + { "custom_155.EDITOR.ypos", "9" }, - { "custom_156", "RocksElements.pcx" }, - { "custom_156.xpos", "7" }, + { "custom_156", "RocksCE.pcx" }, + { "custom_156.xpos", "11" }, { "custom_156.ypos", "9" }, { "custom_156.frames", "1" }, - { "custom_156.EDITOR", "RocksElements.pcx" }, - { "custom_156.EDITOR.xpos", "15" }, - { "custom_156.EDITOR.ypos", "13" }, + { "custom_156.EDITOR", "RocksCE.pcx" }, + { "custom_156.EDITOR.xpos", "27" }, + { "custom_156.EDITOR.ypos", "9" }, - { "custom_157", "RocksElements.pcx" }, - { "custom_157.xpos", "7" }, + { "custom_157", "RocksCE.pcx" }, + { "custom_157.xpos", "12" }, { "custom_157.ypos", "9" }, { "custom_157.frames", "1" }, - { "custom_157.EDITOR", "RocksElements.pcx" }, - { "custom_157.EDITOR.xpos", "15" }, - { "custom_157.EDITOR.ypos", "13" }, + { "custom_157.EDITOR", "RocksCE.pcx" }, + { "custom_157.EDITOR.xpos", "28" }, + { "custom_157.EDITOR.ypos", "9" }, - { "custom_158", "RocksElements.pcx" }, - { "custom_158.xpos", "7" }, + { "custom_158", "RocksCE.pcx" }, + { "custom_158.xpos", "13" }, { "custom_158.ypos", "9" }, { "custom_158.frames", "1" }, - { "custom_158.EDITOR", "RocksElements.pcx" }, - { "custom_158.EDITOR.xpos", "15" }, - { "custom_158.EDITOR.ypos", "13" }, + { "custom_158.EDITOR", "RocksCE.pcx" }, + { "custom_158.EDITOR.xpos", "29" }, + { "custom_158.EDITOR.ypos", "9" }, - { "custom_159", "RocksElements.pcx" }, - { "custom_159.xpos", "7" }, + { "custom_159", "RocksCE.pcx" }, + { "custom_159.xpos", "14" }, { "custom_159.ypos", "9" }, { "custom_159.frames", "1" }, - { "custom_159.EDITOR", "RocksElements.pcx" }, - { "custom_159.EDITOR.xpos", "15" }, - { "custom_159.EDITOR.ypos", "13" }, + { "custom_159.EDITOR", "RocksCE.pcx" }, + { "custom_159.EDITOR.xpos", "30" }, + { "custom_159.EDITOR.ypos", "9" }, - { "custom_160", "RocksElements.pcx" }, - { "custom_160.xpos", "7" }, + { "custom_160", "RocksCE.pcx" }, + { "custom_160.xpos", "15" }, { "custom_160.ypos", "9" }, { "custom_160.frames", "1" }, - { "custom_160.EDITOR", "RocksElements.pcx" }, - { "custom_160.EDITOR.xpos", "15" }, - { "custom_160.EDITOR.ypos", "13" }, + { "custom_160.EDITOR", "RocksCE.pcx" }, + { "custom_160.EDITOR.xpos", "31" }, + { "custom_160.EDITOR.ypos", "9" }, - { "custom_161", "RocksElements.pcx" }, - { "custom_161.xpos", "7" }, - { "custom_161.ypos", "9" }, + { "custom_161", "RocksCE.pcx" }, + { "custom_161.xpos", "0" }, + { "custom_161.ypos", "10" }, { "custom_161.frames", "1" }, - { "custom_161.EDITOR", "RocksElements.pcx" }, - { "custom_161.EDITOR.xpos", "15" }, - { "custom_161.EDITOR.ypos", "13" }, + { "custom_161.EDITOR", "RocksCE.pcx" }, + { "custom_161.EDITOR.xpos", "16" }, + { "custom_161.EDITOR.ypos", "10" }, - { "custom_162", "RocksElements.pcx" }, - { "custom_162.xpos", "7" }, - { "custom_162.ypos", "9" }, + { "custom_162", "RocksCE.pcx" }, + { "custom_162.xpos", "1" }, + { "custom_162.ypos", "10" }, { "custom_162.frames", "1" }, - { "custom_162.EDITOR", "RocksElements.pcx" }, - { "custom_162.EDITOR.xpos", "15" }, - { "custom_162.EDITOR.ypos", "13" }, + { "custom_162.EDITOR", "RocksCE.pcx" }, + { "custom_162.EDITOR.xpos", "17" }, + { "custom_162.EDITOR.ypos", "10" }, - { "custom_163", "RocksElements.pcx" }, - { "custom_163.xpos", "7" }, - { "custom_163.ypos", "9" }, + { "custom_163", "RocksCE.pcx" }, + { "custom_163.xpos", "2" }, + { "custom_163.ypos", "10" }, { "custom_163.frames", "1" }, - { "custom_163.EDITOR", "RocksElements.pcx" }, - { "custom_163.EDITOR.xpos", "15" }, - { "custom_163.EDITOR.ypos", "13" }, + { "custom_163.EDITOR", "RocksCE.pcx" }, + { "custom_163.EDITOR.xpos", "18" }, + { "custom_163.EDITOR.ypos", "10" }, - { "custom_164", "RocksElements.pcx" }, - { "custom_164.xpos", "7" }, - { "custom_164.ypos", "9" }, + { "custom_164", "RocksCE.pcx" }, + { "custom_164.xpos", "3" }, + { "custom_164.ypos", "10" }, { "custom_164.frames", "1" }, - { "custom_164.EDITOR", "RocksElements.pcx" }, - { "custom_164.EDITOR.xpos", "15" }, - { "custom_164.EDITOR.ypos", "13" }, + { "custom_164.EDITOR", "RocksCE.pcx" }, + { "custom_164.EDITOR.xpos", "19" }, + { "custom_164.EDITOR.ypos", "10" }, - { "custom_165", "RocksElements.pcx" }, - { "custom_165.xpos", "7" }, - { "custom_165.ypos", "9" }, + { "custom_165", "RocksCE.pcx" }, + { "custom_165.xpos", "4" }, + { "custom_165.ypos", "10" }, { "custom_165.frames", "1" }, - { "custom_165.EDITOR", "RocksElements.pcx" }, - { "custom_165.EDITOR.xpos", "15" }, - { "custom_165.EDITOR.ypos", "13" }, + { "custom_165.EDITOR", "RocksCE.pcx" }, + { "custom_165.EDITOR.xpos", "20" }, + { "custom_165.EDITOR.ypos", "10" }, - { "custom_166", "RocksElements.pcx" }, - { "custom_166.xpos", "7" }, - { "custom_166.ypos", "9" }, + { "custom_166", "RocksCE.pcx" }, + { "custom_166.xpos", "5" }, + { "custom_166.ypos", "10" }, { "custom_166.frames", "1" }, - { "custom_166.EDITOR", "RocksElements.pcx" }, - { "custom_166.EDITOR.xpos", "15" }, - { "custom_166.EDITOR.ypos", "13" }, + { "custom_166.EDITOR", "RocksCE.pcx" }, + { "custom_166.EDITOR.xpos", "21" }, + { "custom_166.EDITOR.ypos", "10" }, - { "custom_167", "RocksElements.pcx" }, - { "custom_167.xpos", "7" }, - { "custom_167.ypos", "9" }, + { "custom_167", "RocksCE.pcx" }, + { "custom_167.xpos", "6" }, + { "custom_167.ypos", "10" }, { "custom_167.frames", "1" }, - { "custom_167.EDITOR", "RocksElements.pcx" }, - { "custom_167.EDITOR.xpos", "15" }, - { "custom_167.EDITOR.ypos", "13" }, + { "custom_167.EDITOR", "RocksCE.pcx" }, + { "custom_167.EDITOR.xpos", "22" }, + { "custom_167.EDITOR.ypos", "10" }, - { "custom_168", "RocksElements.pcx" }, + { "custom_168", "RocksCE.pcx" }, { "custom_168.xpos", "7" }, - { "custom_168.ypos", "9" }, + { "custom_168.ypos", "10" }, { "custom_168.frames", "1" }, - { "custom_168.EDITOR", "RocksElements.pcx" }, - { "custom_168.EDITOR.xpos", "15" }, - { "custom_168.EDITOR.ypos", "13" }, + { "custom_168.EDITOR", "RocksCE.pcx" }, + { "custom_168.EDITOR.xpos", "23" }, + { "custom_168.EDITOR.ypos", "10" }, - { "custom_169", "RocksElements.pcx" }, - { "custom_169.xpos", "7" }, - { "custom_169.ypos", "9" }, + { "custom_169", "RocksCE.pcx" }, + { "custom_169.xpos", "8" }, + { "custom_169.ypos", "10" }, { "custom_169.frames", "1" }, - { "custom_169.EDITOR", "RocksElements.pcx" }, - { "custom_169.EDITOR.xpos", "15" }, - { "custom_169.EDITOR.ypos", "13" }, + { "custom_169.EDITOR", "RocksCE.pcx" }, + { "custom_169.EDITOR.xpos", "24" }, + { "custom_169.EDITOR.ypos", "10" }, - { "custom_170", "RocksElements.pcx" }, - { "custom_170.xpos", "7" }, - { "custom_170.ypos", "9" }, + { "custom_170", "RocksCE.pcx" }, + { "custom_170.xpos", "9" }, + { "custom_170.ypos", "10" }, { "custom_170.frames", "1" }, - { "custom_170.EDITOR", "RocksElements.pcx" }, - { "custom_170.EDITOR.xpos", "15" }, - { "custom_170.EDITOR.ypos", "13" }, + { "custom_170.EDITOR", "RocksCE.pcx" }, + { "custom_170.EDITOR.xpos", "25" }, + { "custom_170.EDITOR.ypos", "10" }, - { "custom_171", "RocksElements.pcx" }, - { "custom_171.xpos", "7" }, - { "custom_171.ypos", "9" }, + { "custom_171", "RocksCE.pcx" }, + { "custom_171.xpos", "10" }, + { "custom_171.ypos", "10" }, { "custom_171.frames", "1" }, - { "custom_171.EDITOR", "RocksElements.pcx" }, - { "custom_171.EDITOR.xpos", "15" }, - { "custom_171.EDITOR.ypos", "13" }, + { "custom_171.EDITOR", "RocksCE.pcx" }, + { "custom_171.EDITOR.xpos", "26" }, + { "custom_171.EDITOR.ypos", "10" }, - { "custom_172", "RocksElements.pcx" }, - { "custom_172.xpos", "7" }, - { "custom_172.ypos", "9" }, + { "custom_172", "RocksCE.pcx" }, + { "custom_172.xpos", "11" }, + { "custom_172.ypos", "10" }, { "custom_172.frames", "1" }, - { "custom_172.EDITOR", "RocksElements.pcx" }, - { "custom_172.EDITOR.xpos", "15" }, - { "custom_172.EDITOR.ypos", "13" }, + { "custom_172.EDITOR", "RocksCE.pcx" }, + { "custom_172.EDITOR.xpos", "27" }, + { "custom_172.EDITOR.ypos", "10" }, - { "custom_173", "RocksElements.pcx" }, - { "custom_173.xpos", "7" }, - { "custom_173.ypos", "9" }, + { "custom_173", "RocksCE.pcx" }, + { "custom_173.xpos", "12" }, + { "custom_173.ypos", "10" }, { "custom_173.frames", "1" }, - { "custom_173.EDITOR", "RocksElements.pcx" }, - { "custom_173.EDITOR.xpos", "15" }, - { "custom_173.EDITOR.ypos", "13" }, + { "custom_173.EDITOR", "RocksCE.pcx" }, + { "custom_173.EDITOR.xpos", "28" }, + { "custom_173.EDITOR.ypos", "10" }, - { "custom_174", "RocksElements.pcx" }, - { "custom_174.xpos", "7" }, - { "custom_174.ypos", "9" }, + { "custom_174", "RocksCE.pcx" }, + { "custom_174.xpos", "13" }, + { "custom_174.ypos", "10" }, { "custom_174.frames", "1" }, - { "custom_174.EDITOR", "RocksElements.pcx" }, - { "custom_174.EDITOR.xpos", "15" }, - { "custom_174.EDITOR.ypos", "13" }, + { "custom_174.EDITOR", "RocksCE.pcx" }, + { "custom_174.EDITOR.xpos", "29" }, + { "custom_174.EDITOR.ypos", "10" }, - { "custom_175", "RocksElements.pcx" }, - { "custom_175.xpos", "7" }, - { "custom_175.ypos", "9" }, + { "custom_175", "RocksCE.pcx" }, + { "custom_175.xpos", "14" }, + { "custom_175.ypos", "10" }, { "custom_175.frames", "1" }, - { "custom_175.EDITOR", "RocksElements.pcx" }, - { "custom_175.EDITOR.xpos", "15" }, - { "custom_175.EDITOR.ypos", "13" }, + { "custom_175.EDITOR", "RocksCE.pcx" }, + { "custom_175.EDITOR.xpos", "30" }, + { "custom_175.EDITOR.ypos", "10" }, - { "custom_176", "RocksElements.pcx" }, - { "custom_176.xpos", "7" }, - { "custom_176.ypos", "9" }, + { "custom_176", "RocksCE.pcx" }, + { "custom_176.xpos", "15" }, + { "custom_176.ypos", "10" }, { "custom_176.frames", "1" }, - { "custom_176.EDITOR", "RocksElements.pcx" }, - { "custom_176.EDITOR.xpos", "15" }, - { "custom_176.EDITOR.ypos", "13" }, + { "custom_176.EDITOR", "RocksCE.pcx" }, + { "custom_176.EDITOR.xpos", "31" }, + { "custom_176.EDITOR.ypos", "10" }, - { "custom_177", "RocksElements.pcx" }, - { "custom_177.xpos", "7" }, - { "custom_177.ypos", "9" }, + { "custom_177", "RocksCE.pcx" }, + { "custom_177.xpos", "0" }, + { "custom_177.ypos", "11" }, { "custom_177.frames", "1" }, - { "custom_177.EDITOR", "RocksElements.pcx" }, - { "custom_177.EDITOR.xpos", "15" }, - { "custom_177.EDITOR.ypos", "13" }, + { "custom_177.EDITOR", "RocksCE.pcx" }, + { "custom_177.EDITOR.xpos", "16" }, + { "custom_177.EDITOR.ypos", "11" }, - { "custom_178", "RocksElements.pcx" }, - { "custom_178.xpos", "7" }, - { "custom_178.ypos", "9" }, + { "custom_178", "RocksCE.pcx" }, + { "custom_178.xpos", "1" }, + { "custom_178.ypos", "11" }, { "custom_178.frames", "1" }, - { "custom_178.EDITOR", "RocksElements.pcx" }, - { "custom_178.EDITOR.xpos", "15" }, - { "custom_178.EDITOR.ypos", "13" }, + { "custom_178.EDITOR", "RocksCE.pcx" }, + { "custom_178.EDITOR.xpos", "17" }, + { "custom_178.EDITOR.ypos", "11" }, - { "custom_179", "RocksElements.pcx" }, - { "custom_179.xpos", "7" }, - { "custom_179.ypos", "9" }, + { "custom_179", "RocksCE.pcx" }, + { "custom_179.xpos", "2" }, + { "custom_179.ypos", "11" }, { "custom_179.frames", "1" }, - { "custom_179.EDITOR", "RocksElements.pcx" }, - { "custom_179.EDITOR.xpos", "15" }, - { "custom_179.EDITOR.ypos", "13" }, + { "custom_179.EDITOR", "RocksCE.pcx" }, + { "custom_179.EDITOR.xpos", "18" }, + { "custom_179.EDITOR.ypos", "11" }, - { "custom_180", "RocksElements.pcx" }, - { "custom_180.xpos", "7" }, - { "custom_180.ypos", "9" }, + { "custom_180", "RocksCE.pcx" }, + { "custom_180.xpos", "3" }, + { "custom_180.ypos", "11" }, { "custom_180.frames", "1" }, - { "custom_180.EDITOR", "RocksElements.pcx" }, - { "custom_180.EDITOR.xpos", "15" }, - { "custom_180.EDITOR.ypos", "13" }, + { "custom_180.EDITOR", "RocksCE.pcx" }, + { "custom_180.EDITOR.xpos", "19" }, + { "custom_180.EDITOR.ypos", "11" }, - { "custom_181", "RocksElements.pcx" }, - { "custom_181.xpos", "7" }, - { "custom_181.ypos", "9" }, + { "custom_181", "RocksCE.pcx" }, + { "custom_181.xpos", "4" }, + { "custom_181.ypos", "11" }, { "custom_181.frames", "1" }, - { "custom_181.EDITOR", "RocksElements.pcx" }, - { "custom_181.EDITOR.xpos", "15" }, - { "custom_181.EDITOR.ypos", "13" }, + { "custom_181.EDITOR", "RocksCE.pcx" }, + { "custom_181.EDITOR.xpos", "20" }, + { "custom_181.EDITOR.ypos", "11" }, - { "custom_182", "RocksElements.pcx" }, - { "custom_182.xpos", "7" }, - { "custom_182.ypos", "9" }, + { "custom_182", "RocksCE.pcx" }, + { "custom_182.xpos", "5" }, + { "custom_182.ypos", "11" }, { "custom_182.frames", "1" }, - { "custom_182.EDITOR", "RocksElements.pcx" }, - { "custom_182.EDITOR.xpos", "15" }, - { "custom_182.EDITOR.ypos", "13" }, + { "custom_182.EDITOR", "RocksCE.pcx" }, + { "custom_182.EDITOR.xpos", "21" }, + { "custom_182.EDITOR.ypos", "11" }, - { "custom_183", "RocksElements.pcx" }, - { "custom_183.xpos", "7" }, - { "custom_183.ypos", "9" }, + { "custom_183", "RocksCE.pcx" }, + { "custom_183.xpos", "6" }, + { "custom_183.ypos", "11" }, { "custom_183.frames", "1" }, - { "custom_183.EDITOR", "RocksElements.pcx" }, - { "custom_183.EDITOR.xpos", "15" }, - { "custom_183.EDITOR.ypos", "13" }, + { "custom_183.EDITOR", "RocksCE.pcx" }, + { "custom_183.EDITOR.xpos", "22" }, + { "custom_183.EDITOR.ypos", "11" }, - { "custom_184", "RocksElements.pcx" }, + { "custom_184", "RocksCE.pcx" }, { "custom_184.xpos", "7" }, - { "custom_184.ypos", "9" }, + { "custom_184.ypos", "11" }, { "custom_184.frames", "1" }, - { "custom_184.EDITOR", "RocksElements.pcx" }, - { "custom_184.EDITOR.xpos", "15" }, - { "custom_184.EDITOR.ypos", "13" }, + { "custom_184.EDITOR", "RocksCE.pcx" }, + { "custom_184.EDITOR.xpos", "23" }, + { "custom_184.EDITOR.ypos", "11" }, - { "custom_185", "RocksElements.pcx" }, - { "custom_185.xpos", "7" }, - { "custom_185.ypos", "9" }, + { "custom_185", "RocksCE.pcx" }, + { "custom_185.xpos", "8" }, + { "custom_185.ypos", "11" }, { "custom_185.frames", "1" }, - { "custom_185.EDITOR", "RocksElements.pcx" }, - { "custom_185.EDITOR.xpos", "15" }, - { "custom_185.EDITOR.ypos", "13" }, + { "custom_185.EDITOR", "RocksCE.pcx" }, + { "custom_185.EDITOR.xpos", "24" }, + { "custom_185.EDITOR.ypos", "11" }, - { "custom_186", "RocksElements.pcx" }, - { "custom_186.xpos", "7" }, - { "custom_186.ypos", "9" }, + { "custom_186", "RocksCE.pcx" }, + { "custom_186.xpos", "9" }, + { "custom_186.ypos", "11" }, { "custom_186.frames", "1" }, - { "custom_186.EDITOR", "RocksElements.pcx" }, - { "custom_186.EDITOR.xpos", "15" }, - { "custom_186.EDITOR.ypos", "13" }, + { "custom_186.EDITOR", "RocksCE.pcx" }, + { "custom_186.EDITOR.xpos", "25" }, + { "custom_186.EDITOR.ypos", "11" }, - { "custom_187", "RocksElements.pcx" }, - { "custom_187.xpos", "7" }, - { "custom_187.ypos", "9" }, + { "custom_187", "RocksCE.pcx" }, + { "custom_187.xpos", "10" }, + { "custom_187.ypos", "11" }, { "custom_187.frames", "1" }, - { "custom_187.EDITOR", "RocksElements.pcx" }, - { "custom_187.EDITOR.xpos", "15" }, - { "custom_187.EDITOR.ypos", "13" }, + { "custom_187.EDITOR", "RocksCE.pcx" }, + { "custom_187.EDITOR.xpos", "26" }, + { "custom_187.EDITOR.ypos", "11" }, - { "custom_188", "RocksElements.pcx" }, - { "custom_188.xpos", "7" }, - { "custom_188.ypos", "9" }, + { "custom_188", "RocksCE.pcx" }, + { "custom_188.xpos", "11" }, + { "custom_188.ypos", "11" }, { "custom_188.frames", "1" }, - { "custom_188.EDITOR", "RocksElements.pcx" }, - { "custom_188.EDITOR.xpos", "15" }, - { "custom_188.EDITOR.ypos", "13" }, + { "custom_188.EDITOR", "RocksCE.pcx" }, + { "custom_188.EDITOR.xpos", "27" }, + { "custom_188.EDITOR.ypos", "11" }, - { "custom_189", "RocksElements.pcx" }, - { "custom_189.xpos", "7" }, - { "custom_189.ypos", "9" }, + { "custom_189", "RocksCE.pcx" }, + { "custom_189.xpos", "12" }, + { "custom_189.ypos", "11" }, { "custom_189.frames", "1" }, - { "custom_189.EDITOR", "RocksElements.pcx" }, - { "custom_189.EDITOR.xpos", "15" }, - { "custom_189.EDITOR.ypos", "13" }, + { "custom_189.EDITOR", "RocksCE.pcx" }, + { "custom_189.EDITOR.xpos", "28" }, + { "custom_189.EDITOR.ypos", "11" }, - { "custom_190", "RocksElements.pcx" }, - { "custom_190.xpos", "7" }, - { "custom_190.ypos", "9" }, + { "custom_190", "RocksCE.pcx" }, + { "custom_190.xpos", "13" }, + { "custom_190.ypos", "11" }, { "custom_190.frames", "1" }, - { "custom_190.EDITOR", "RocksElements.pcx" }, - { "custom_190.EDITOR.xpos", "15" }, - { "custom_190.EDITOR.ypos", "13" }, + { "custom_190.EDITOR", "RocksCE.pcx" }, + { "custom_190.EDITOR.xpos", "29" }, + { "custom_190.EDITOR.ypos", "11" }, - { "custom_191", "RocksElements.pcx" }, - { "custom_191.xpos", "7" }, - { "custom_191.ypos", "9" }, + { "custom_191", "RocksCE.pcx" }, + { "custom_191.xpos", "14" }, + { "custom_191.ypos", "11" }, { "custom_191.frames", "1" }, - { "custom_191.EDITOR", "RocksElements.pcx" }, - { "custom_191.EDITOR.xpos", "15" }, - { "custom_191.EDITOR.ypos", "13" }, + { "custom_191.EDITOR", "RocksCE.pcx" }, + { "custom_191.EDITOR.xpos", "30" }, + { "custom_191.EDITOR.ypos", "11" }, - { "custom_192", "RocksElements.pcx" }, - { "custom_192.xpos", "7" }, - { "custom_192.ypos", "9" }, + { "custom_192", "RocksCE.pcx" }, + { "custom_192.xpos", "15" }, + { "custom_192.ypos", "11" }, { "custom_192.frames", "1" }, - { "custom_192.EDITOR", "RocksElements.pcx" }, - { "custom_192.EDITOR.xpos", "15" }, - { "custom_192.EDITOR.ypos", "13" }, + { "custom_192.EDITOR", "RocksCE.pcx" }, + { "custom_192.EDITOR.xpos", "31" }, + { "custom_192.EDITOR.ypos", "11" }, - { "custom_193", "RocksElements.pcx" }, - { "custom_193.xpos", "7" }, - { "custom_193.ypos", "9" }, + { "custom_193", "RocksCE.pcx" }, + { "custom_193.xpos", "0" }, + { "custom_193.ypos", "12" }, { "custom_193.frames", "1" }, - { "custom_193.EDITOR", "RocksElements.pcx" }, - { "custom_193.EDITOR.xpos", "15" }, - { "custom_193.EDITOR.ypos", "13" }, + { "custom_193.EDITOR", "RocksCE.pcx" }, + { "custom_193.EDITOR.xpos", "16" }, + { "custom_193.EDITOR.ypos", "12" }, - { "custom_194", "RocksElements.pcx" }, - { "custom_194.xpos", "7" }, - { "custom_194.ypos", "9" }, + { "custom_194", "RocksCE.pcx" }, + { "custom_194.xpos", "1" }, + { "custom_194.ypos", "12" }, { "custom_194.frames", "1" }, - { "custom_194.EDITOR", "RocksElements.pcx" }, - { "custom_194.EDITOR.xpos", "15" }, - { "custom_194.EDITOR.ypos", "13" }, + { "custom_194.EDITOR", "RocksCE.pcx" }, + { "custom_194.EDITOR.xpos", "17" }, + { "custom_194.EDITOR.ypos", "12" }, - { "custom_195", "RocksElements.pcx" }, - { "custom_195.xpos", "7" }, - { "custom_195.ypos", "9" }, + { "custom_195", "RocksCE.pcx" }, + { "custom_195.xpos", "2" }, + { "custom_195.ypos", "12" }, { "custom_195.frames", "1" }, - { "custom_195.EDITOR", "RocksElements.pcx" }, - { "custom_195.EDITOR.xpos", "15" }, - { "custom_195.EDITOR.ypos", "13" }, + { "custom_195.EDITOR", "RocksCE.pcx" }, + { "custom_195.EDITOR.xpos", "18" }, + { "custom_195.EDITOR.ypos", "12" }, - { "custom_196", "RocksElements.pcx" }, - { "custom_196.xpos", "7" }, - { "custom_196.ypos", "9" }, + { "custom_196", "RocksCE.pcx" }, + { "custom_196.xpos", "3" }, + { "custom_196.ypos", "12" }, { "custom_196.frames", "1" }, - { "custom_196.EDITOR", "RocksElements.pcx" }, - { "custom_196.EDITOR.xpos", "15" }, - { "custom_196.EDITOR.ypos", "13" }, + { "custom_196.EDITOR", "RocksCE.pcx" }, + { "custom_196.EDITOR.xpos", "19" }, + { "custom_196.EDITOR.ypos", "12" }, - { "custom_197", "RocksElements.pcx" }, - { "custom_197.xpos", "7" }, - { "custom_197.ypos", "9" }, + { "custom_197", "RocksCE.pcx" }, + { "custom_197.xpos", "4" }, + { "custom_197.ypos", "12" }, { "custom_197.frames", "1" }, - { "custom_197.EDITOR", "RocksElements.pcx" }, - { "custom_197.EDITOR.xpos", "15" }, - { "custom_197.EDITOR.ypos", "13" }, + { "custom_197.EDITOR", "RocksCE.pcx" }, + { "custom_197.EDITOR.xpos", "20" }, + { "custom_197.EDITOR.ypos", "12" }, - { "custom_198", "RocksElements.pcx" }, - { "custom_198.xpos", "7" }, - { "custom_198.ypos", "9" }, + { "custom_198", "RocksCE.pcx" }, + { "custom_198.xpos", "5" }, + { "custom_198.ypos", "12" }, { "custom_198.frames", "1" }, - { "custom_198.EDITOR", "RocksElements.pcx" }, - { "custom_198.EDITOR.xpos", "15" }, - { "custom_198.EDITOR.ypos", "13" }, + { "custom_198.EDITOR", "RocksCE.pcx" }, + { "custom_198.EDITOR.xpos", "21" }, + { "custom_198.EDITOR.ypos", "12" }, - { "custom_199", "RocksElements.pcx" }, - { "custom_199.xpos", "7" }, - { "custom_199.ypos", "9" }, + { "custom_199", "RocksCE.pcx" }, + { "custom_199.xpos", "6" }, + { "custom_199.ypos", "12" }, { "custom_199.frames", "1" }, - { "custom_199.EDITOR", "RocksElements.pcx" }, - { "custom_199.EDITOR.xpos", "15" }, - { "custom_199.EDITOR.ypos", "13" }, + { "custom_199.EDITOR", "RocksCE.pcx" }, + { "custom_199.EDITOR.xpos", "22" }, + { "custom_199.EDITOR.ypos", "12" }, - { "custom_200", "RocksElements.pcx" }, + { "custom_200", "RocksCE.pcx" }, { "custom_200.xpos", "7" }, - { "custom_200.ypos", "9" }, + { "custom_200.ypos", "12" }, { "custom_200.frames", "1" }, - { "custom_200.EDITOR", "RocksElements.pcx" }, - { "custom_200.EDITOR.xpos", "15" }, - { "custom_200.EDITOR.ypos", "13" }, + { "custom_200.EDITOR", "RocksCE.pcx" }, + { "custom_200.EDITOR.xpos", "23" }, + { "custom_200.EDITOR.ypos", "12" }, - { "custom_201", "RocksElements.pcx" }, - { "custom_201.xpos", "7" }, - { "custom_201.ypos", "9" }, + { "custom_201", "RocksCE.pcx" }, + { "custom_201.xpos", "8" }, + { "custom_201.ypos", "12" }, { "custom_201.frames", "1" }, - { "custom_201.EDITOR", "RocksElements.pcx" }, - { "custom_201.EDITOR.xpos", "15" }, - { "custom_201.EDITOR.ypos", "13" }, + { "custom_201.EDITOR", "RocksCE.pcx" }, + { "custom_201.EDITOR.xpos", "24" }, + { "custom_201.EDITOR.ypos", "12" }, - { "custom_202", "RocksElements.pcx" }, - { "custom_202.xpos", "7" }, - { "custom_202.ypos", "9" }, + { "custom_202", "RocksCE.pcx" }, + { "custom_202.xpos", "9" }, + { "custom_202.ypos", "12" }, { "custom_202.frames", "1" }, - { "custom_202.EDITOR", "RocksElements.pcx" }, - { "custom_202.EDITOR.xpos", "15" }, - { "custom_202.EDITOR.ypos", "13" }, + { "custom_202.EDITOR", "RocksCE.pcx" }, + { "custom_202.EDITOR.xpos", "25" }, + { "custom_202.EDITOR.ypos", "12" }, - { "custom_203", "RocksElements.pcx" }, - { "custom_203.xpos", "7" }, - { "custom_203.ypos", "9" }, + { "custom_203", "RocksCE.pcx" }, + { "custom_203.xpos", "10" }, + { "custom_203.ypos", "12" }, { "custom_203.frames", "1" }, - { "custom_203.EDITOR", "RocksElements.pcx" }, - { "custom_203.EDITOR.xpos", "15" }, - { "custom_203.EDITOR.ypos", "13" }, + { "custom_203.EDITOR", "RocksCE.pcx" }, + { "custom_203.EDITOR.xpos", "26" }, + { "custom_203.EDITOR.ypos", "12" }, - { "custom_204", "RocksElements.pcx" }, - { "custom_204.xpos", "7" }, - { "custom_204.ypos", "9" }, + { "custom_204", "RocksCE.pcx" }, + { "custom_204.xpos", "11" }, + { "custom_204.ypos", "12" }, { "custom_204.frames", "1" }, - { "custom_204.EDITOR", "RocksElements.pcx" }, - { "custom_204.EDITOR.xpos", "15" }, - { "custom_204.EDITOR.ypos", "13" }, + { "custom_204.EDITOR", "RocksCE.pcx" }, + { "custom_204.EDITOR.xpos", "27" }, + { "custom_204.EDITOR.ypos", "12" }, - { "custom_205", "RocksElements.pcx" }, - { "custom_205.xpos", "7" }, - { "custom_205.ypos", "9" }, + { "custom_205", "RocksCE.pcx" }, + { "custom_205.xpos", "12" }, + { "custom_205.ypos", "12" }, { "custom_205.frames", "1" }, - { "custom_205.EDITOR", "RocksElements.pcx" }, - { "custom_205.EDITOR.xpos", "15" }, - { "custom_205.EDITOR.ypos", "13" }, + { "custom_205.EDITOR", "RocksCE.pcx" }, + { "custom_205.EDITOR.xpos", "28" }, + { "custom_205.EDITOR.ypos", "12" }, - { "custom_206", "RocksElements.pcx" }, - { "custom_206.xpos", "7" }, - { "custom_206.ypos", "9" }, + { "custom_206", "RocksCE.pcx" }, + { "custom_206.xpos", "13" }, + { "custom_206.ypos", "12" }, { "custom_206.frames", "1" }, - { "custom_206.EDITOR", "RocksElements.pcx" }, - { "custom_206.EDITOR.xpos", "15" }, - { "custom_206.EDITOR.ypos", "13" }, + { "custom_206.EDITOR", "RocksCE.pcx" }, + { "custom_206.EDITOR.xpos", "29" }, + { "custom_206.EDITOR.ypos", "12" }, - { "custom_207", "RocksElements.pcx" }, - { "custom_207.xpos", "7" }, - { "custom_207.ypos", "9" }, + { "custom_207", "RocksCE.pcx" }, + { "custom_207.xpos", "14" }, + { "custom_207.ypos", "12" }, { "custom_207.frames", "1" }, - { "custom_207.EDITOR", "RocksElements.pcx" }, - { "custom_207.EDITOR.xpos", "15" }, - { "custom_207.EDITOR.ypos", "13" }, + { "custom_207.EDITOR", "RocksCE.pcx" }, + { "custom_207.EDITOR.xpos", "30" }, + { "custom_207.EDITOR.ypos", "12" }, - { "custom_208", "RocksElements.pcx" }, - { "custom_208.xpos", "7" }, - { "custom_208.ypos", "9" }, + { "custom_208", "RocksCE.pcx" }, + { "custom_208.xpos", "15" }, + { "custom_208.ypos", "12" }, { "custom_208.frames", "1" }, - { "custom_208.EDITOR", "RocksElements.pcx" }, - { "custom_208.EDITOR.xpos", "15" }, - { "custom_208.EDITOR.ypos", "13" }, + { "custom_208.EDITOR", "RocksCE.pcx" }, + { "custom_208.EDITOR.xpos", "31" }, + { "custom_208.EDITOR.ypos", "12" }, - { "custom_209", "RocksElements.pcx" }, - { "custom_209.xpos", "7" }, - { "custom_209.ypos", "9" }, + { "custom_209", "RocksCE.pcx" }, + { "custom_209.xpos", "0" }, + { "custom_209.ypos", "13" }, { "custom_209.frames", "1" }, - { "custom_209.EDITOR", "RocksElements.pcx" }, - { "custom_209.EDITOR.xpos", "15" }, + { "custom_209.EDITOR", "RocksCE.pcx" }, + { "custom_209.EDITOR.xpos", "16" }, { "custom_209.EDITOR.ypos", "13" }, - { "custom_210", "RocksElements.pcx" }, - { "custom_210.xpos", "7" }, - { "custom_210.ypos", "9" }, + { "custom_210", "RocksCE.pcx" }, + { "custom_210.xpos", "1" }, + { "custom_210.ypos", "13" }, { "custom_210.frames", "1" }, - { "custom_210.EDITOR", "RocksElements.pcx" }, - { "custom_210.EDITOR.xpos", "15" }, + { "custom_210.EDITOR", "RocksCE.pcx" }, + { "custom_210.EDITOR.xpos", "17" }, { "custom_210.EDITOR.ypos", "13" }, - { "custom_211", "RocksElements.pcx" }, - { "custom_211.xpos", "7" }, - { "custom_211.ypos", "9" }, + { "custom_211", "RocksCE.pcx" }, + { "custom_211.xpos", "2" }, + { "custom_211.ypos", "13" }, { "custom_211.frames", "1" }, - { "custom_211.EDITOR", "RocksElements.pcx" }, - { "custom_211.EDITOR.xpos", "15" }, + { "custom_211.EDITOR", "RocksCE.pcx" }, + { "custom_211.EDITOR.xpos", "18" }, { "custom_211.EDITOR.ypos", "13" }, - { "custom_212", "RocksElements.pcx" }, - { "custom_212.xpos", "7" }, - { "custom_212.ypos", "9" }, + { "custom_212", "RocksCE.pcx" }, + { "custom_212.xpos", "3" }, + { "custom_212.ypos", "13" }, { "custom_212.frames", "1" }, - { "custom_212.EDITOR", "RocksElements.pcx" }, - { "custom_212.EDITOR.xpos", "15" }, + { "custom_212.EDITOR", "RocksCE.pcx" }, + { "custom_212.EDITOR.xpos", "19" }, { "custom_212.EDITOR.ypos", "13" }, - { "custom_213", "RocksElements.pcx" }, - { "custom_213.xpos", "7" }, - { "custom_213.ypos", "9" }, + { "custom_213", "RocksCE.pcx" }, + { "custom_213.xpos", "4" }, + { "custom_213.ypos", "13" }, { "custom_213.frames", "1" }, - { "custom_213.EDITOR", "RocksElements.pcx" }, - { "custom_213.EDITOR.xpos", "15" }, + { "custom_213.EDITOR", "RocksCE.pcx" }, + { "custom_213.EDITOR.xpos", "20" }, { "custom_213.EDITOR.ypos", "13" }, - { "custom_214", "RocksElements.pcx" }, - { "custom_214.xpos", "7" }, - { "custom_214.ypos", "9" }, + { "custom_214", "RocksCE.pcx" }, + { "custom_214.xpos", "5" }, + { "custom_214.ypos", "13" }, { "custom_214.frames", "1" }, - { "custom_214.EDITOR", "RocksElements.pcx" }, - { "custom_214.EDITOR.xpos", "15" }, + { "custom_214.EDITOR", "RocksCE.pcx" }, + { "custom_214.EDITOR.xpos", "21" }, { "custom_214.EDITOR.ypos", "13" }, - { "custom_215", "RocksElements.pcx" }, - { "custom_215.xpos", "7" }, - { "custom_215.ypos", "9" }, + { "custom_215", "RocksCE.pcx" }, + { "custom_215.xpos", "6" }, + { "custom_215.ypos", "13" }, { "custom_215.frames", "1" }, - { "custom_215.EDITOR", "RocksElements.pcx" }, - { "custom_215.EDITOR.xpos", "15" }, + { "custom_215.EDITOR", "RocksCE.pcx" }, + { "custom_215.EDITOR.xpos", "22" }, { "custom_215.EDITOR.ypos", "13" }, - { "custom_216", "RocksElements.pcx" }, + { "custom_216", "RocksCE.pcx" }, { "custom_216.xpos", "7" }, - { "custom_216.ypos", "9" }, + { "custom_216.ypos", "13" }, { "custom_216.frames", "1" }, - { "custom_216.EDITOR", "RocksElements.pcx" }, - { "custom_216.EDITOR.xpos", "15" }, + { "custom_216.EDITOR", "RocksCE.pcx" }, + { "custom_216.EDITOR.xpos", "23" }, { "custom_216.EDITOR.ypos", "13" }, - { "custom_217", "RocksElements.pcx" }, - { "custom_217.xpos", "7" }, - { "custom_217.ypos", "9" }, + { "custom_217", "RocksCE.pcx" }, + { "custom_217.xpos", "8" }, + { "custom_217.ypos", "13" }, { "custom_217.frames", "1" }, - { "custom_217.EDITOR", "RocksElements.pcx" }, - { "custom_217.EDITOR.xpos", "15" }, + { "custom_217.EDITOR", "RocksCE.pcx" }, + { "custom_217.EDITOR.xpos", "24" }, { "custom_217.EDITOR.ypos", "13" }, - { "custom_218", "RocksElements.pcx" }, - { "custom_218.xpos", "7" }, - { "custom_218.ypos", "9" }, + { "custom_218", "RocksCE.pcx" }, + { "custom_218.xpos", "9" }, + { "custom_218.ypos", "13" }, { "custom_218.frames", "1" }, - { "custom_218.EDITOR", "RocksElements.pcx" }, - { "custom_218.EDITOR.xpos", "15" }, + { "custom_218.EDITOR", "RocksCE.pcx" }, + { "custom_218.EDITOR.xpos", "25" }, { "custom_218.EDITOR.ypos", "13" }, - { "custom_219", "RocksElements.pcx" }, - { "custom_219.xpos", "7" }, - { "custom_219.ypos", "9" }, + { "custom_219", "RocksCE.pcx" }, + { "custom_219.xpos", "10" }, + { "custom_219.ypos", "13" }, { "custom_219.frames", "1" }, - { "custom_219.EDITOR", "RocksElements.pcx" }, - { "custom_219.EDITOR.xpos", "15" }, + { "custom_219.EDITOR", "RocksCE.pcx" }, + { "custom_219.EDITOR.xpos", "26" }, { "custom_219.EDITOR.ypos", "13" }, - { "custom_220", "RocksElements.pcx" }, - { "custom_220.xpos", "7" }, - { "custom_220.ypos", "9" }, + { "custom_220", "RocksCE.pcx" }, + { "custom_220.xpos", "11" }, + { "custom_220.ypos", "13" }, { "custom_220.frames", "1" }, - { "custom_220.EDITOR", "RocksElements.pcx" }, - { "custom_220.EDITOR.xpos", "15" }, + { "custom_220.EDITOR", "RocksCE.pcx" }, + { "custom_220.EDITOR.xpos", "27" }, { "custom_220.EDITOR.ypos", "13" }, - { "custom_221", "RocksElements.pcx" }, - { "custom_221.xpos", "7" }, - { "custom_221.ypos", "9" }, + { "custom_221", "RocksCE.pcx" }, + { "custom_221.xpos", "12" }, + { "custom_221.ypos", "13" }, { "custom_221.frames", "1" }, - { "custom_221.EDITOR", "RocksElements.pcx" }, - { "custom_221.EDITOR.xpos", "15" }, + { "custom_221.EDITOR", "RocksCE.pcx" }, + { "custom_221.EDITOR.xpos", "28" }, { "custom_221.EDITOR.ypos", "13" }, - { "custom_222", "RocksElements.pcx" }, - { "custom_222.xpos", "7" }, - { "custom_222.ypos", "9" }, + { "custom_222", "RocksCE.pcx" }, + { "custom_222.xpos", "13" }, + { "custom_222.ypos", "13" }, { "custom_222.frames", "1" }, - { "custom_222.EDITOR", "RocksElements.pcx" }, - { "custom_222.EDITOR.xpos", "15" }, + { "custom_222.EDITOR", "RocksCE.pcx" }, + { "custom_222.EDITOR.xpos", "29" }, { "custom_222.EDITOR.ypos", "13" }, - { "custom_223", "RocksElements.pcx" }, - { "custom_223.xpos", "7" }, - { "custom_223.ypos", "9" }, + { "custom_223", "RocksCE.pcx" }, + { "custom_223.xpos", "14" }, + { "custom_223.ypos", "13" }, { "custom_223.frames", "1" }, - { "custom_223.EDITOR", "RocksElements.pcx" }, - { "custom_223.EDITOR.xpos", "15" }, + { "custom_223.EDITOR", "RocksCE.pcx" }, + { "custom_223.EDITOR.xpos", "30" }, { "custom_223.EDITOR.ypos", "13" }, - { "custom_224", "RocksElements.pcx" }, - { "custom_224.xpos", "7" }, - { "custom_224.ypos", "9" }, + { "custom_224", "RocksCE.pcx" }, + { "custom_224.xpos", "15" }, + { "custom_224.ypos", "13" }, { "custom_224.frames", "1" }, - { "custom_224.EDITOR", "RocksElements.pcx" }, - { "custom_224.EDITOR.xpos", "15" }, + { "custom_224.EDITOR", "RocksCE.pcx" }, + { "custom_224.EDITOR.xpos", "31" }, { "custom_224.EDITOR.ypos", "13" }, - { "custom_225", "RocksElements.pcx" }, - { "custom_225.xpos", "7" }, - { "custom_225.ypos", "9" }, + { "custom_225", "RocksCE.pcx" }, + { "custom_225.xpos", "0" }, + { "custom_225.ypos", "14" }, { "custom_225.frames", "1" }, - { "custom_225.EDITOR", "RocksElements.pcx" }, - { "custom_225.EDITOR.xpos", "15" }, - { "custom_225.EDITOR.ypos", "13" }, + { "custom_225.EDITOR", "RocksCE.pcx" }, + { "custom_225.EDITOR.xpos", "16" }, + { "custom_225.EDITOR.ypos", "14" }, - { "custom_226", "RocksElements.pcx" }, - { "custom_226.xpos", "7" }, - { "custom_226.ypos", "9" }, + { "custom_226", "RocksCE.pcx" }, + { "custom_226.xpos", "1" }, + { "custom_226.ypos", "14" }, { "custom_226.frames", "1" }, - { "custom_226.EDITOR", "RocksElements.pcx" }, - { "custom_226.EDITOR.xpos", "15" }, - { "custom_226.EDITOR.ypos", "13" }, + { "custom_226.EDITOR", "RocksCE.pcx" }, + { "custom_226.EDITOR.xpos", "17" }, + { "custom_226.EDITOR.ypos", "14" }, - { "custom_227", "RocksElements.pcx" }, - { "custom_227.xpos", "7" }, - { "custom_227.ypos", "9" }, + { "custom_227", "RocksCE.pcx" }, + { "custom_227.xpos", "2" }, + { "custom_227.ypos", "14" }, { "custom_227.frames", "1" }, - { "custom_227.EDITOR", "RocksElements.pcx" }, - { "custom_227.EDITOR.xpos", "15" }, - { "custom_227.EDITOR.ypos", "13" }, + { "custom_227.EDITOR", "RocksCE.pcx" }, + { "custom_227.EDITOR.xpos", "18" }, + { "custom_227.EDITOR.ypos", "14" }, - { "custom_228", "RocksElements.pcx" }, - { "custom_228.xpos", "7" }, - { "custom_228.ypos", "9" }, + { "custom_228", "RocksCE.pcx" }, + { "custom_228.xpos", "3" }, + { "custom_228.ypos", "14" }, { "custom_228.frames", "1" }, - { "custom_228.EDITOR", "RocksElements.pcx" }, - { "custom_228.EDITOR.xpos", "15" }, - { "custom_228.EDITOR.ypos", "13" }, + { "custom_228.EDITOR", "RocksCE.pcx" }, + { "custom_228.EDITOR.xpos", "19" }, + { "custom_228.EDITOR.ypos", "14" }, - { "custom_229", "RocksElements.pcx" }, - { "custom_229.xpos", "7" }, - { "custom_229.ypos", "9" }, + { "custom_229", "RocksCE.pcx" }, + { "custom_229.xpos", "4" }, + { "custom_229.ypos", "14" }, { "custom_229.frames", "1" }, - { "custom_229.EDITOR", "RocksElements.pcx" }, - { "custom_229.EDITOR.xpos", "15" }, - { "custom_229.EDITOR.ypos", "13" }, + { "custom_229.EDITOR", "RocksCE.pcx" }, + { "custom_229.EDITOR.xpos", "20" }, + { "custom_229.EDITOR.ypos", "14" }, - { "custom_230", "RocksElements.pcx" }, - { "custom_230.xpos", "7" }, - { "custom_230.ypos", "9" }, + { "custom_230", "RocksCE.pcx" }, + { "custom_230.xpos", "5" }, + { "custom_230.ypos", "14" }, { "custom_230.frames", "1" }, - { "custom_230.EDITOR", "RocksElements.pcx" }, - { "custom_230.EDITOR.xpos", "15" }, - { "custom_230.EDITOR.ypos", "13" }, + { "custom_230.EDITOR", "RocksCE.pcx" }, + { "custom_230.EDITOR.xpos", "21" }, + { "custom_230.EDITOR.ypos", "14" }, - { "custom_231", "RocksElements.pcx" }, - { "custom_231.xpos", "7" }, - { "custom_231.ypos", "9" }, + { "custom_231", "RocksCE.pcx" }, + { "custom_231.xpos", "6" }, + { "custom_231.ypos", "14" }, { "custom_231.frames", "1" }, - { "custom_231.EDITOR", "RocksElements.pcx" }, - { "custom_231.EDITOR.xpos", "15" }, - { "custom_231.EDITOR.ypos", "13" }, + { "custom_231.EDITOR", "RocksCE.pcx" }, + { "custom_231.EDITOR.xpos", "22" }, + { "custom_231.EDITOR.ypos", "14" }, - { "custom_232", "RocksElements.pcx" }, + { "custom_232", "RocksCE.pcx" }, { "custom_232.xpos", "7" }, - { "custom_232.ypos", "9" }, + { "custom_232.ypos", "14" }, { "custom_232.frames", "1" }, - { "custom_232.EDITOR", "RocksElements.pcx" }, - { "custom_232.EDITOR.xpos", "15" }, - { "custom_232.EDITOR.ypos", "13" }, + { "custom_232.EDITOR", "RocksCE.pcx" }, + { "custom_232.EDITOR.xpos", "23" }, + { "custom_232.EDITOR.ypos", "14" }, - { "custom_233", "RocksElements.pcx" }, - { "custom_233.xpos", "7" }, - { "custom_233.ypos", "9" }, + { "custom_233", "RocksCE.pcx" }, + { "custom_233.xpos", "8" }, + { "custom_233.ypos", "14" }, { "custom_233.frames", "1" }, - { "custom_233.EDITOR", "RocksElements.pcx" }, - { "custom_233.EDITOR.xpos", "15" }, - { "custom_233.EDITOR.ypos", "13" }, + { "custom_233.EDITOR", "RocksCE.pcx" }, + { "custom_233.EDITOR.xpos", "24" }, + { "custom_233.EDITOR.ypos", "14" }, - { "custom_234", "RocksElements.pcx" }, - { "custom_234.xpos", "7" }, - { "custom_234.ypos", "9" }, + { "custom_234", "RocksCE.pcx" }, + { "custom_234.xpos", "9" }, + { "custom_234.ypos", "14" }, { "custom_234.frames", "1" }, - { "custom_234.EDITOR", "RocksElements.pcx" }, - { "custom_234.EDITOR.xpos", "15" }, - { "custom_234.EDITOR.ypos", "13" }, + { "custom_234.EDITOR", "RocksCE.pcx" }, + { "custom_234.EDITOR.xpos", "25" }, + { "custom_234.EDITOR.ypos", "14" }, - { "custom_235", "RocksElements.pcx" }, - { "custom_235.xpos", "7" }, - { "custom_235.ypos", "9" }, + { "custom_235", "RocksCE.pcx" }, + { "custom_235.xpos", "10" }, + { "custom_235.ypos", "14" }, { "custom_235.frames", "1" }, - { "custom_235.EDITOR", "RocksElements.pcx" }, - { "custom_235.EDITOR.xpos", "15" }, - { "custom_235.EDITOR.ypos", "13" }, + { "custom_235.EDITOR", "RocksCE.pcx" }, + { "custom_235.EDITOR.xpos", "26" }, + { "custom_235.EDITOR.ypos", "14" }, - { "custom_236", "RocksElements.pcx" }, - { "custom_236.xpos", "7" }, - { "custom_236.ypos", "9" }, + { "custom_236", "RocksCE.pcx" }, + { "custom_236.xpos", "11" }, + { "custom_236.ypos", "14" }, { "custom_236.frames", "1" }, - { "custom_236.EDITOR", "RocksElements.pcx" }, - { "custom_236.EDITOR.xpos", "15" }, - { "custom_236.EDITOR.ypos", "13" }, + { "custom_236.EDITOR", "RocksCE.pcx" }, + { "custom_236.EDITOR.xpos", "27" }, + { "custom_236.EDITOR.ypos", "14" }, - { "custom_237", "RocksElements.pcx" }, - { "custom_237.xpos", "7" }, - { "custom_237.ypos", "9" }, + { "custom_237", "RocksCE.pcx" }, + { "custom_237.xpos", "12" }, + { "custom_237.ypos", "14" }, { "custom_237.frames", "1" }, - { "custom_237.EDITOR", "RocksElements.pcx" }, - { "custom_237.EDITOR.xpos", "15" }, - { "custom_237.EDITOR.ypos", "13" }, + { "custom_237.EDITOR", "RocksCE.pcx" }, + { "custom_237.EDITOR.xpos", "28" }, + { "custom_237.EDITOR.ypos", "14" }, - { "custom_238", "RocksElements.pcx" }, - { "custom_238.xpos", "7" }, - { "custom_238.ypos", "9" }, + { "custom_238", "RocksCE.pcx" }, + { "custom_238.xpos", "13" }, + { "custom_238.ypos", "14" }, { "custom_238.frames", "1" }, - { "custom_238.EDITOR", "RocksElements.pcx" }, - { "custom_238.EDITOR.xpos", "15" }, - { "custom_238.EDITOR.ypos", "13" }, + { "custom_238.EDITOR", "RocksCE.pcx" }, + { "custom_238.EDITOR.xpos", "29" }, + { "custom_238.EDITOR.ypos", "14" }, - { "custom_239", "RocksElements.pcx" }, - { "custom_239.xpos", "7" }, - { "custom_239.ypos", "9" }, + { "custom_239", "RocksCE.pcx" }, + { "custom_239.xpos", "14" }, + { "custom_239.ypos", "14" }, { "custom_239.frames", "1" }, - { "custom_239.EDITOR", "RocksElements.pcx" }, - { "custom_239.EDITOR.xpos", "15" }, - { "custom_239.EDITOR.ypos", "13" }, + { "custom_239.EDITOR", "RocksCE.pcx" }, + { "custom_239.EDITOR.xpos", "30" }, + { "custom_239.EDITOR.ypos", "14" }, - { "custom_240", "RocksElements.pcx" }, - { "custom_240.xpos", "7" }, - { "custom_240.ypos", "9" }, + { "custom_240", "RocksCE.pcx" }, + { "custom_240.xpos", "15" }, + { "custom_240.ypos", "14" }, { "custom_240.frames", "1" }, - { "custom_240.EDITOR", "RocksElements.pcx" }, - { "custom_240.EDITOR.xpos", "15" }, - { "custom_240.EDITOR.ypos", "13" }, + { "custom_240.EDITOR", "RocksCE.pcx" }, + { "custom_240.EDITOR.xpos", "31" }, + { "custom_240.EDITOR.ypos", "14" }, - { "custom_241", "RocksElements.pcx" }, - { "custom_241.xpos", "7" }, - { "custom_241.ypos", "9" }, + { "custom_241", "RocksCE.pcx" }, + { "custom_241.xpos", "0" }, + { "custom_241.ypos", "15" }, { "custom_241.frames", "1" }, - { "custom_241.EDITOR", "RocksElements.pcx" }, - { "custom_241.EDITOR.xpos", "15" }, - { "custom_241.EDITOR.ypos", "13" }, + { "custom_241.EDITOR", "RocksCE.pcx" }, + { "custom_241.EDITOR.xpos", "16" }, + { "custom_241.EDITOR.ypos", "15" }, - { "custom_242", "RocksElements.pcx" }, - { "custom_242.xpos", "7" }, - { "custom_242.ypos", "9" }, + { "custom_242", "RocksCE.pcx" }, + { "custom_242.xpos", "1" }, + { "custom_242.ypos", "15" }, { "custom_242.frames", "1" }, - { "custom_242.EDITOR", "RocksElements.pcx" }, - { "custom_242.EDITOR.xpos", "15" }, - { "custom_242.EDITOR.ypos", "13" }, + { "custom_242.EDITOR", "RocksCE.pcx" }, + { "custom_242.EDITOR.xpos", "17" }, + { "custom_242.EDITOR.ypos", "15" }, - { "custom_243", "RocksElements.pcx" }, - { "custom_243.xpos", "7" }, - { "custom_243.ypos", "9" }, + { "custom_243", "RocksCE.pcx" }, + { "custom_243.xpos", "2" }, + { "custom_243.ypos", "15" }, { "custom_243.frames", "1" }, - { "custom_243.EDITOR", "RocksElements.pcx" }, - { "custom_243.EDITOR.xpos", "15" }, - { "custom_243.EDITOR.ypos", "13" }, + { "custom_243.EDITOR", "RocksCE.pcx" }, + { "custom_243.EDITOR.xpos", "18" }, + { "custom_243.EDITOR.ypos", "15" }, - { "custom_244", "RocksElements.pcx" }, - { "custom_244.xpos", "7" }, - { "custom_244.ypos", "9" }, + { "custom_244", "RocksCE.pcx" }, + { "custom_244.xpos", "3" }, + { "custom_244.ypos", "15" }, { "custom_244.frames", "1" }, - { "custom_244.EDITOR", "RocksElements.pcx" }, - { "custom_244.EDITOR.xpos", "15" }, - { "custom_244.EDITOR.ypos", "13" }, + { "custom_244.EDITOR", "RocksCE.pcx" }, + { "custom_244.EDITOR.xpos", "19" }, + { "custom_244.EDITOR.ypos", "15" }, - { "custom_245", "RocksElements.pcx" }, - { "custom_245.xpos", "7" }, - { "custom_245.ypos", "9" }, + { "custom_245", "RocksCE.pcx" }, + { "custom_245.xpos", "4" }, + { "custom_245.ypos", "15" }, { "custom_245.frames", "1" }, - { "custom_245.EDITOR", "RocksElements.pcx" }, - { "custom_245.EDITOR.xpos", "15" }, - { "custom_245.EDITOR.ypos", "13" }, + { "custom_245.EDITOR", "RocksCE.pcx" }, + { "custom_245.EDITOR.xpos", "20" }, + { "custom_245.EDITOR.ypos", "15" }, - { "custom_246", "RocksElements.pcx" }, - { "custom_246.xpos", "7" }, - { "custom_246.ypos", "9" }, + { "custom_246", "RocksCE.pcx" }, + { "custom_246.xpos", "5" }, + { "custom_246.ypos", "15" }, { "custom_246.frames", "1" }, - { "custom_246.EDITOR", "RocksElements.pcx" }, - { "custom_246.EDITOR.xpos", "15" }, - { "custom_246.EDITOR.ypos", "13" }, + { "custom_246.EDITOR", "RocksCE.pcx" }, + { "custom_246.EDITOR.xpos", "21" }, + { "custom_246.EDITOR.ypos", "15" }, - { "custom_247", "RocksElements.pcx" }, - { "custom_247.xpos", "7" }, - { "custom_247.ypos", "9" }, + { "custom_247", "RocksCE.pcx" }, + { "custom_247.xpos", "6" }, + { "custom_247.ypos", "15" }, { "custom_247.frames", "1" }, - { "custom_247.EDITOR", "RocksElements.pcx" }, - { "custom_247.EDITOR.xpos", "15" }, - { "custom_247.EDITOR.ypos", "13" }, + { "custom_247.EDITOR", "RocksCE.pcx" }, + { "custom_247.EDITOR.xpos", "22" }, + { "custom_247.EDITOR.ypos", "15" }, - { "custom_248", "RocksElements.pcx" }, + { "custom_248", "RocksCE.pcx" }, { "custom_248.xpos", "7" }, - { "custom_248.ypos", "9" }, + { "custom_248.ypos", "15" }, { "custom_248.frames", "1" }, - { "custom_248.EDITOR", "RocksElements.pcx" }, - { "custom_248.EDITOR.xpos", "15" }, - { "custom_248.EDITOR.ypos", "13" }, + { "custom_248.EDITOR", "RocksCE.pcx" }, + { "custom_248.EDITOR.xpos", "23" }, + { "custom_248.EDITOR.ypos", "15" }, - { "custom_249", "RocksElements.pcx" }, - { "custom_249.xpos", "7" }, - { "custom_249.ypos", "9" }, + { "custom_249", "RocksCE.pcx" }, + { "custom_249.xpos", "8" }, + { "custom_249.ypos", "15" }, { "custom_249.frames", "1" }, - { "custom_249.EDITOR", "RocksElements.pcx" }, - { "custom_249.EDITOR.xpos", "15" }, - { "custom_249.EDITOR.ypos", "13" }, + { "custom_249.EDITOR", "RocksCE.pcx" }, + { "custom_249.EDITOR.xpos", "24" }, + { "custom_249.EDITOR.ypos", "15" }, - { "custom_250", "RocksElements.pcx" }, - { "custom_250.xpos", "7" }, - { "custom_250.ypos", "9" }, + { "custom_250", "RocksCE.pcx" }, + { "custom_250.xpos", "9" }, + { "custom_250.ypos", "15" }, { "custom_250.frames", "1" }, - { "custom_250.EDITOR", "RocksElements.pcx" }, - { "custom_250.EDITOR.xpos", "15" }, - { "custom_250.EDITOR.ypos", "13" }, + { "custom_250.EDITOR", "RocksCE.pcx" }, + { "custom_250.EDITOR.xpos", "25" }, + { "custom_250.EDITOR.ypos", "15" }, - { "custom_251", "RocksElements.pcx" }, - { "custom_251.xpos", "7" }, - { "custom_251.ypos", "9" }, + { "custom_251", "RocksCE.pcx" }, + { "custom_251.xpos", "10" }, + { "custom_251.ypos", "15" }, { "custom_251.frames", "1" }, - { "custom_251.EDITOR", "RocksElements.pcx" }, - { "custom_251.EDITOR.xpos", "15" }, - { "custom_251.EDITOR.ypos", "13" }, + { "custom_251.EDITOR", "RocksCE.pcx" }, + { "custom_251.EDITOR.xpos", "26" }, + { "custom_251.EDITOR.ypos", "15" }, - { "custom_252", "RocksElements.pcx" }, - { "custom_252.xpos", "7" }, - { "custom_252.ypos", "9" }, + { "custom_252", "RocksCE.pcx" }, + { "custom_252.xpos", "11" }, + { "custom_252.ypos", "15" }, { "custom_252.frames", "1" }, - { "custom_252.EDITOR", "RocksElements.pcx" }, - { "custom_252.EDITOR.xpos", "15" }, - { "custom_252.EDITOR.ypos", "13" }, + { "custom_252.EDITOR", "RocksCE.pcx" }, + { "custom_252.EDITOR.xpos", "27" }, + { "custom_252.EDITOR.ypos", "15" }, - { "custom_253", "RocksElements.pcx" }, - { "custom_253.xpos", "7" }, - { "custom_253.ypos", "9" }, + { "custom_253", "RocksCE.pcx" }, + { "custom_253.xpos", "12" }, + { "custom_253.ypos", "15" }, { "custom_253.frames", "1" }, - { "custom_253.EDITOR", "RocksElements.pcx" }, - { "custom_253.EDITOR.xpos", "15" }, - { "custom_253.EDITOR.ypos", "13" }, + { "custom_253.EDITOR", "RocksCE.pcx" }, + { "custom_253.EDITOR.xpos", "28" }, + { "custom_253.EDITOR.ypos", "15" }, - { "custom_254", "RocksElements.pcx" }, - { "custom_254.xpos", "7" }, - { "custom_254.ypos", "9" }, + { "custom_254", "RocksCE.pcx" }, + { "custom_254.xpos", "13" }, + { "custom_254.ypos", "15" }, { "custom_254.frames", "1" }, - { "custom_254.EDITOR", "RocksElements.pcx" }, - { "custom_254.EDITOR.xpos", "15" }, - { "custom_254.EDITOR.ypos", "13" }, + { "custom_254.EDITOR", "RocksCE.pcx" }, + { "custom_254.EDITOR.xpos", "29" }, + { "custom_254.EDITOR.ypos", "15" }, - { "custom_255", "RocksElements.pcx" }, - { "custom_255.xpos", "7" }, - { "custom_255.ypos", "9" }, + { "custom_255", "RocksCE.pcx" }, + { "custom_255.xpos", "14" }, + { "custom_255.ypos", "15" }, { "custom_255.frames", "1" }, - { "custom_255.EDITOR", "RocksElements.pcx" }, - { "custom_255.EDITOR.xpos", "15" }, - { "custom_255.EDITOR.ypos", "13" }, + { "custom_255.EDITOR", "RocksCE.pcx" }, + { "custom_255.EDITOR.xpos", "30" }, + { "custom_255.EDITOR.ypos", "15" }, - { "custom_256", "RocksElements.pcx" }, - { "custom_256.xpos", "7" }, - { "custom_256.ypos", "9" }, + { "custom_256", "RocksCE.pcx" }, + { "custom_256.xpos", "15" }, + { "custom_256.ypos", "15" }, { "custom_256.frames", "1" }, - { "custom_256.EDITOR", "RocksElements.pcx" }, - { "custom_256.EDITOR.xpos", "15" }, - { "custom_256.EDITOR.ypos", "13" }, + { "custom_256.EDITOR", "RocksCE.pcx" }, + { "custom_256.EDITOR.xpos", "31" }, + { "custom_256.EDITOR.ypos", "15" }, #endif /* CONF_CUS_C */ diff --git a/src/conf_gfx.c b/src/conf_gfx.c index fd978dae..49dca0a7 100644 --- a/src/conf_gfx.c +++ b/src/conf_gfx.c @@ -4944,12 +4944,12 @@ struct ConfigInfo image_config[] = { "global.busy.delay", "2" }, { "editor.element_border", "RocksElements.pcx" }, - { "editor.element_border.xpos", "0" }, - { "editor.element_border.ypos", "0" }, + { "editor.element_border.x", "0" }, + { "editor.element_border.y", "0" }, - { "editor.element_border_input", "RocksElements.pcx" }, - { "editor.element_border_input.xpos", "0" }, - { "editor.element_border_input.ypos", "0" }, + { "editor.element_border_input", "RocksDoor.pcx" }, + { "editor.element_border_input.x", "740" }, + { "editor.element_border_input.y", "48" }, { "editor.cascade_list", "RocksDoor.pcx" }, { "editor.cascade_list.x", "708" }, diff --git a/src/conf_grp.c b/src/conf_grp.c index bf92917f..7c89bcaa 100644 --- a/src/conf_grp.c +++ b/src/conf_grp.c @@ -18,261 +18,261 @@ /* values for graphics configuration (group elements) */ - { "group_1", "RocksDC.pcx" }, - { "group_1.xpos", "4" }, - { "group_1.ypos", "15" }, + { "group_1", "RocksCE.pcx" }, + { "group_1.xpos", "0" }, + { "group_1.ypos", "16" }, { "group_1.frames", "1" }, - { "group_1.EDITOR", "RocksDC.pcx" }, - { "group_1.EDITOR.xpos", "14" }, - { "group_1.EDITOR.ypos", "15" }, + { "group_1.EDITOR", "RocksCE.pcx" }, + { "group_1.EDITOR.xpos", "16" }, + { "group_1.EDITOR.ypos", "16" }, - { "group_2", "RocksDC.pcx" }, - { "group_2.xpos", "4" }, - { "group_2.ypos", "15" }, + { "group_2", "RocksCE.pcx" }, + { "group_2.xpos", "1" }, + { "group_2.ypos", "16" }, { "group_2.frames", "1" }, - { "group_2.EDITOR", "RocksDC.pcx" }, - { "group_2.EDITOR.xpos", "14" }, - { "group_2.EDITOR.ypos", "15" }, + { "group_2.EDITOR", "RocksCE.pcx" }, + { "group_2.EDITOR.xpos", "17" }, + { "group_2.EDITOR.ypos", "16" }, - { "group_3", "RocksDC.pcx" }, - { "group_3.xpos", "4" }, - { "group_3.ypos", "15" }, + { "group_3", "RocksCE.pcx" }, + { "group_3.xpos", "2" }, + { "group_3.ypos", "16" }, { "group_3.frames", "1" }, - { "group_3.EDITOR", "RocksDC.pcx" }, - { "group_3.EDITOR.xpos", "14" }, - { "group_3.EDITOR.ypos", "15" }, + { "group_3.EDITOR", "RocksCE.pcx" }, + { "group_3.EDITOR.xpos", "18" }, + { "group_3.EDITOR.ypos", "16" }, - { "group_4", "RocksDC.pcx" }, - { "group_4.xpos", "4" }, - { "group_4.ypos", "15" }, + { "group_4", "RocksCE.pcx" }, + { "group_4.xpos", "3" }, + { "group_4.ypos", "16" }, { "group_4.frames", "1" }, - { "group_4.EDITOR", "RocksDC.pcx" }, - { "group_4.EDITOR.xpos", "14" }, - { "group_4.EDITOR.ypos", "15" }, + { "group_4.EDITOR", "RocksCE.pcx" }, + { "group_4.EDITOR.xpos", "19" }, + { "group_4.EDITOR.ypos", "16" }, - { "group_5", "RocksDC.pcx" }, + { "group_5", "RocksCE.pcx" }, { "group_5.xpos", "4" }, - { "group_5.ypos", "15" }, + { "group_5.ypos", "16" }, { "group_5.frames", "1" }, - { "group_5.EDITOR", "RocksDC.pcx" }, - { "group_5.EDITOR.xpos", "14" }, - { "group_5.EDITOR.ypos", "15" }, + { "group_5.EDITOR", "RocksCE.pcx" }, + { "group_5.EDITOR.xpos", "20" }, + { "group_5.EDITOR.ypos", "16" }, - { "group_6", "RocksDC.pcx" }, - { "group_6.xpos", "4" }, - { "group_6.ypos", "15" }, + { "group_6", "RocksCE.pcx" }, + { "group_6.xpos", "5" }, + { "group_6.ypos", "16" }, { "group_6.frames", "1" }, - { "group_6.EDITOR", "RocksDC.pcx" }, - { "group_6.EDITOR.xpos", "14" }, - { "group_6.EDITOR.ypos", "15" }, + { "group_6.EDITOR", "RocksCE.pcx" }, + { "group_6.EDITOR.xpos", "21" }, + { "group_6.EDITOR.ypos", "16" }, - { "group_7", "RocksDC.pcx" }, - { "group_7.xpos", "4" }, - { "group_7.ypos", "15" }, + { "group_7", "RocksCE.pcx" }, + { "group_7.xpos", "6" }, + { "group_7.ypos", "16" }, { "group_7.frames", "1" }, - { "group_7.EDITOR", "RocksDC.pcx" }, - { "group_7.EDITOR.xpos", "14" }, - { "group_7.EDITOR.ypos", "15" }, + { "group_7.EDITOR", "RocksCE.pcx" }, + { "group_7.EDITOR.xpos", "22" }, + { "group_7.EDITOR.ypos", "16" }, - { "group_8", "RocksDC.pcx" }, - { "group_8.xpos", "4" }, - { "group_8.ypos", "15" }, + { "group_8", "RocksCE.pcx" }, + { "group_8.xpos", "7" }, + { "group_8.ypos", "16" }, { "group_8.frames", "1" }, - { "group_8.EDITOR", "RocksDC.pcx" }, - { "group_8.EDITOR.xpos", "14" }, - { "group_8.EDITOR.ypos", "15" }, + { "group_8.EDITOR", "RocksCE.pcx" }, + { "group_8.EDITOR.xpos", "23" }, + { "group_8.EDITOR.ypos", "16" }, - { "group_9", "RocksDC.pcx" }, - { "group_9.xpos", "4" }, - { "group_9.ypos", "15" }, + { "group_9", "RocksCE.pcx" }, + { "group_9.xpos", "8" }, + { "group_9.ypos", "16" }, { "group_9.frames", "1" }, - { "group_9.EDITOR", "RocksDC.pcx" }, - { "group_9.EDITOR.xpos", "14" }, - { "group_9.EDITOR.ypos", "15" }, + { "group_9.EDITOR", "RocksCE.pcx" }, + { "group_9.EDITOR.xpos", "24" }, + { "group_9.EDITOR.ypos", "16" }, - { "group_10", "RocksDC.pcx" }, - { "group_10.xpos", "4" }, - { "group_10.ypos", "15" }, + { "group_10", "RocksCE.pcx" }, + { "group_10.xpos", "9" }, + { "group_10.ypos", "16" }, { "group_10.frames", "1" }, - { "group_10.EDITOR", "RocksDC.pcx" }, - { "group_10.EDITOR.xpos", "14" }, - { "group_10.EDITOR.ypos", "15" }, + { "group_10.EDITOR", "RocksCE.pcx" }, + { "group_10.EDITOR.xpos", "25" }, + { "group_10.EDITOR.ypos", "16" }, - { "group_11", "RocksDC.pcx" }, - { "group_11.xpos", "4" }, - { "group_11.ypos", "15" }, + { "group_11", "RocksCE.pcx" }, + { "group_11.xpos", "10" }, + { "group_11.ypos", "16" }, { "group_11.frames", "1" }, - { "group_11.EDITOR", "RocksDC.pcx" }, - { "group_11.EDITOR.xpos", "14" }, - { "group_11.EDITOR.ypos", "15" }, + { "group_11.EDITOR", "RocksCE.pcx" }, + { "group_11.EDITOR.xpos", "26" }, + { "group_11.EDITOR.ypos", "16" }, - { "group_12", "RocksDC.pcx" }, - { "group_12.xpos", "4" }, - { "group_12.ypos", "15" }, + { "group_12", "RocksCE.pcx" }, + { "group_12.xpos", "11" }, + { "group_12.ypos", "16" }, { "group_12.frames", "1" }, - { "group_12.EDITOR", "RocksDC.pcx" }, - { "group_12.EDITOR.xpos", "14" }, - { "group_12.EDITOR.ypos", "15" }, + { "group_12.EDITOR", "RocksCE.pcx" }, + { "group_12.EDITOR.xpos", "27" }, + { "group_12.EDITOR.ypos", "16" }, - { "group_13", "RocksDC.pcx" }, - { "group_13.xpos", "4" }, - { "group_13.ypos", "15" }, + { "group_13", "RocksCE.pcx" }, + { "group_13.xpos", "12" }, + { "group_13.ypos", "16" }, { "group_13.frames", "1" }, - { "group_13.EDITOR", "RocksDC.pcx" }, - { "group_13.EDITOR.xpos", "14" }, - { "group_13.EDITOR.ypos", "15" }, + { "group_13.EDITOR", "RocksCE.pcx" }, + { "group_13.EDITOR.xpos", "28" }, + { "group_13.EDITOR.ypos", "16" }, - { "group_14", "RocksDC.pcx" }, - { "group_14.xpos", "4" }, - { "group_14.ypos", "15" }, + { "group_14", "RocksCE.pcx" }, + { "group_14.xpos", "13" }, + { "group_14.ypos", "16" }, { "group_14.frames", "1" }, - { "group_14.EDITOR", "RocksDC.pcx" }, - { "group_14.EDITOR.xpos", "14" }, - { "group_14.EDITOR.ypos", "15" }, + { "group_14.EDITOR", "RocksCE.pcx" }, + { "group_14.EDITOR.xpos", "29" }, + { "group_14.EDITOR.ypos", "16" }, - { "group_15", "RocksDC.pcx" }, - { "group_15.xpos", "4" }, - { "group_15.ypos", "15" }, + { "group_15", "RocksCE.pcx" }, + { "group_15.xpos", "14" }, + { "group_15.ypos", "16" }, { "group_15.frames", "1" }, - { "group_15.EDITOR", "RocksDC.pcx" }, - { "group_15.EDITOR.xpos", "14" }, - { "group_15.EDITOR.ypos", "15" }, + { "group_15.EDITOR", "RocksCE.pcx" }, + { "group_15.EDITOR.xpos", "30" }, + { "group_15.EDITOR.ypos", "16" }, - { "group_16", "RocksDC.pcx" }, - { "group_16.xpos", "4" }, - { "group_16.ypos", "15" }, + { "group_16", "RocksCE.pcx" }, + { "group_16.xpos", "15" }, + { "group_16.ypos", "16" }, { "group_16.frames", "1" }, - { "group_16.EDITOR", "RocksDC.pcx" }, - { "group_16.EDITOR.xpos", "14" }, - { "group_16.EDITOR.ypos", "15" }, + { "group_16.EDITOR", "RocksCE.pcx" }, + { "group_16.EDITOR.xpos", "31" }, + { "group_16.EDITOR.ypos", "16" }, - { "group_17", "RocksDC.pcx" }, - { "group_17.xpos", "4" }, - { "group_17.ypos", "15" }, + { "group_17", "RocksCE.pcx" }, + { "group_17.xpos", "0" }, + { "group_17.ypos", "17" }, { "group_17.frames", "1" }, - { "group_17.EDITOR", "RocksDC.pcx" }, - { "group_17.EDITOR.xpos", "14" }, - { "group_17.EDITOR.ypos", "15" }, + { "group_17.EDITOR", "RocksCE.pcx" }, + { "group_17.EDITOR.xpos", "16" }, + { "group_17.EDITOR.ypos", "17" }, - { "group_18", "RocksDC.pcx" }, - { "group_18.xpos", "4" }, - { "group_18.ypos", "15" }, + { "group_18", "RocksCE.pcx" }, + { "group_18.xpos", "1" }, + { "group_18.ypos", "17" }, { "group_18.frames", "1" }, - { "group_18.EDITOR", "RocksDC.pcx" }, - { "group_18.EDITOR.xpos", "14" }, - { "group_18.EDITOR.ypos", "15" }, + { "group_18.EDITOR", "RocksCE.pcx" }, + { "group_18.EDITOR.xpos", "17" }, + { "group_18.EDITOR.ypos", "17" }, - { "group_19", "RocksDC.pcx" }, - { "group_19.xpos", "4" }, - { "group_19.ypos", "15" }, + { "group_19", "RocksCE.pcx" }, + { "group_19.xpos", "2" }, + { "group_19.ypos", "17" }, { "group_19.frames", "1" }, - { "group_19.EDITOR", "RocksDC.pcx" }, - { "group_19.EDITOR.xpos", "14" }, - { "group_19.EDITOR.ypos", "15" }, + { "group_19.EDITOR", "RocksCE.pcx" }, + { "group_19.EDITOR.xpos", "18" }, + { "group_19.EDITOR.ypos", "17" }, - { "group_20", "RocksDC.pcx" }, - { "group_20.xpos", "4" }, - { "group_20.ypos", "15" }, + { "group_20", "RocksCE.pcx" }, + { "group_20.xpos", "3" }, + { "group_20.ypos", "17" }, { "group_20.frames", "1" }, - { "group_20.EDITOR", "RocksDC.pcx" }, - { "group_20.EDITOR.xpos", "14" }, - { "group_20.EDITOR.ypos", "15" }, + { "group_20.EDITOR", "RocksCE.pcx" }, + { "group_20.EDITOR.xpos", "19" }, + { "group_20.EDITOR.ypos", "17" }, - { "group_21", "RocksDC.pcx" }, + { "group_21", "RocksCE.pcx" }, { "group_21.xpos", "4" }, - { "group_21.ypos", "15" }, + { "group_21.ypos", "17" }, { "group_21.frames", "1" }, - { "group_21.EDITOR", "RocksDC.pcx" }, - { "group_21.EDITOR.xpos", "14" }, - { "group_21.EDITOR.ypos", "15" }, + { "group_21.EDITOR", "RocksCE.pcx" }, + { "group_21.EDITOR.xpos", "20" }, + { "group_21.EDITOR.ypos", "17" }, - { "group_22", "RocksDC.pcx" }, - { "group_22.xpos", "4" }, - { "group_22.ypos", "15" }, + { "group_22", "RocksCE.pcx" }, + { "group_22.xpos", "5" }, + { "group_22.ypos", "17" }, { "group_22.frames", "1" }, - { "group_22.EDITOR", "RocksDC.pcx" }, - { "group_22.EDITOR.xpos", "14" }, - { "group_22.EDITOR.ypos", "15" }, + { "group_22.EDITOR", "RocksCE.pcx" }, + { "group_22.EDITOR.xpos", "21" }, + { "group_22.EDITOR.ypos", "17" }, - { "group_23", "RocksDC.pcx" }, - { "group_23.xpos", "4" }, - { "group_23.ypos", "15" }, + { "group_23", "RocksCE.pcx" }, + { "group_23.xpos", "6" }, + { "group_23.ypos", "17" }, { "group_23.frames", "1" }, - { "group_23.EDITOR", "RocksDC.pcx" }, - { "group_23.EDITOR.xpos", "14" }, - { "group_23.EDITOR.ypos", "15" }, + { "group_23.EDITOR", "RocksCE.pcx" }, + { "group_23.EDITOR.xpos", "22" }, + { "group_23.EDITOR.ypos", "17" }, - { "group_24", "RocksDC.pcx" }, - { "group_24.xpos", "4" }, - { "group_24.ypos", "15" }, + { "group_24", "RocksCE.pcx" }, + { "group_24.xpos", "7" }, + { "group_24.ypos", "17" }, { "group_24.frames", "1" }, - { "group_24.EDITOR", "RocksDC.pcx" }, - { "group_24.EDITOR.xpos", "14" }, - { "group_24.EDITOR.ypos", "15" }, + { "group_24.EDITOR", "RocksCE.pcx" }, + { "group_24.EDITOR.xpos", "23" }, + { "group_24.EDITOR.ypos", "17" }, - { "group_25", "RocksDC.pcx" }, - { "group_25.xpos", "4" }, - { "group_25.ypos", "15" }, + { "group_25", "RocksCE.pcx" }, + { "group_25.xpos", "8" }, + { "group_25.ypos", "17" }, { "group_25.frames", "1" }, - { "group_25.EDITOR", "RocksDC.pcx" }, - { "group_25.EDITOR.xpos", "14" }, - { "group_25.EDITOR.ypos", "15" }, + { "group_25.EDITOR", "RocksCE.pcx" }, + { "group_25.EDITOR.xpos", "24" }, + { "group_25.EDITOR.ypos", "17" }, - { "group_26", "RocksDC.pcx" }, - { "group_26.xpos", "4" }, - { "group_26.ypos", "15" }, + { "group_26", "RocksCE.pcx" }, + { "group_26.xpos", "9" }, + { "group_26.ypos", "17" }, { "group_26.frames", "1" }, - { "group_26.EDITOR", "RocksDC.pcx" }, - { "group_26.EDITOR.xpos", "14" }, - { "group_26.EDITOR.ypos", "15" }, + { "group_26.EDITOR", "RocksCE.pcx" }, + { "group_26.EDITOR.xpos", "25" }, + { "group_26.EDITOR.ypos", "17" }, - { "group_27", "RocksDC.pcx" }, - { "group_27.xpos", "4" }, - { "group_27.ypos", "15" }, + { "group_27", "RocksCE.pcx" }, + { "group_27.xpos", "10" }, + { "group_27.ypos", "17" }, { "group_27.frames", "1" }, - { "group_27.EDITOR", "RocksDC.pcx" }, - { "group_27.EDITOR.xpos", "14" }, - { "group_27.EDITOR.ypos", "15" }, + { "group_27.EDITOR", "RocksCE.pcx" }, + { "group_27.EDITOR.xpos", "26" }, + { "group_27.EDITOR.ypos", "17" }, - { "group_28", "RocksDC.pcx" }, - { "group_28.xpos", "4" }, - { "group_28.ypos", "15" }, + { "group_28", "RocksCE.pcx" }, + { "group_28.xpos", "11" }, + { "group_28.ypos", "17" }, { "group_28.frames", "1" }, - { "group_28.EDITOR", "RocksDC.pcx" }, - { "group_28.EDITOR.xpos", "14" }, - { "group_28.EDITOR.ypos", "15" }, + { "group_28.EDITOR", "RocksCE.pcx" }, + { "group_28.EDITOR.xpos", "27" }, + { "group_28.EDITOR.ypos", "17" }, - { "group_29", "RocksDC.pcx" }, - { "group_29.xpos", "4" }, - { "group_29.ypos", "15" }, + { "group_29", "RocksCE.pcx" }, + { "group_29.xpos", "12" }, + { "group_29.ypos", "17" }, { "group_29.frames", "1" }, - { "group_29.EDITOR", "RocksDC.pcx" }, - { "group_29.EDITOR.xpos", "14" }, - { "group_29.EDITOR.ypos", "15" }, + { "group_29.EDITOR", "RocksCE.pcx" }, + { "group_29.EDITOR.xpos", "28" }, + { "group_29.EDITOR.ypos", "17" }, - { "group_30", "RocksDC.pcx" }, - { "group_30.xpos", "4" }, - { "group_30.ypos", "15" }, + { "group_30", "RocksCE.pcx" }, + { "group_30.xpos", "13" }, + { "group_30.ypos", "17" }, { "group_30.frames", "1" }, - { "group_30.EDITOR", "RocksDC.pcx" }, - { "group_30.EDITOR.xpos", "14" }, - { "group_30.EDITOR.ypos", "15" }, + { "group_30.EDITOR", "RocksCE.pcx" }, + { "group_30.EDITOR.xpos", "29" }, + { "group_30.EDITOR.ypos", "17" }, - { "group_31", "RocksDC.pcx" }, - { "group_31.xpos", "4" }, - { "group_31.ypos", "15" }, + { "group_31", "RocksCE.pcx" }, + { "group_31.xpos", "14" }, + { "group_31.ypos", "17" }, { "group_31.frames", "1" }, - { "group_31.EDITOR", "RocksDC.pcx" }, - { "group_31.EDITOR.xpos", "14" }, - { "group_31.EDITOR.ypos", "15" }, + { "group_31.EDITOR", "RocksCE.pcx" }, + { "group_31.EDITOR.xpos", "30" }, + { "group_31.EDITOR.ypos", "17" }, - { "group_32", "RocksDC.pcx" }, - { "group_32.xpos", "4" }, - { "group_32.ypos", "15" }, + { "group_32", "RocksCE.pcx" }, + { "group_32.xpos", "15" }, + { "group_32.ypos", "17" }, { "group_32.frames", "1" }, - { "group_32.EDITOR", "RocksDC.pcx" }, - { "group_32.EDITOR.xpos", "14" }, - { "group_32.EDITOR.ypos", "15" }, + { "group_32.EDITOR", "RocksCE.pcx" }, + { "group_32.EDITOR.xpos", "31" }, + { "group_32.EDITOR.ypos", "17" }, #endif /* CONF_GRP_C */ diff --git a/src/config.c b/src/config.c index 5e8add2a..c812adfd 100644 --- a/src/config.c +++ b/src/config.c @@ -17,6 +17,9 @@ #include "conftime.h" +#define USE_EXTENDED_VERSION 1 + + char *getCompileDateString() { return COMPILE_DATE_STRING; @@ -26,8 +29,14 @@ char *getProgramReleaseVersionString() { static char program_version_string[32]; +#if USE_EXTENDED_VERSION + sprintf(program_version_string, "%d.%d.%d.%d", + PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_PATCH, + PROGRAM_VERSION_BUILD); +#else sprintf(program_version_string, "%d.%d.%d", PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_PATCH); +#endif return program_version_string; } @@ -36,9 +45,15 @@ char *getProgramFullVersionString() { static char program_version_string[32]; +#if USE_EXTENDED_VERSION + sprintf(program_version_string, "%d.%d.%d.%d", + PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_PATCH, + PROGRAM_VERSION_BUILD); +#else sprintf(program_version_string, "%d.%d.%d-%d", PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_PATCH, PROGRAM_VERSION_BUILD); +#endif return program_version_string; } diff --git a/src/conftime.h b/src/conftime.h index 44ea4b95..c8c6c656 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2007-10-09 00:21" +#define COMPILE_DATE_STRING "2008-11-03 21:21" diff --git a/src/editor.c b/src/editor.c index 2fab93d6..5fb4dd93 100644 --- a/src/editor.c +++ b/src/editor.c @@ -111,7 +111,7 @@ /* values for the settings windows */ #define ED_LEVEL_SETTINGS_XSTART (3 * MINI_TILEX / 2) -#define ED_LEVEL_SETTINGS_YSTART (5 * MINI_TILEY) +#define ED_LEVEL_SETTINGS_YSTART (7 * MINI_TILEY) #define ED_ELEMENT_SETTINGS_XSTART (3 * MINI_TILEX / 2) #define ED_ELEMENT_SETTINGS_YSTART (10 * MINI_TILEY) @@ -121,6 +121,7 @@ #define ED_SETTINGS_XOFFSET ED_XOFFSET_CHECKBOX #define ED_SETTINGS_YOFFSET (3 * MINI_TILEY / 2) +#define ED_SETTINGS_TAB_XOFFSET 124 #define ED_LEVEL_SETTINGS_XPOS(n) (ED_LEVEL_SETTINGS_XSTART + \ (n) * ED_SETTINGS_XOFFSET) @@ -132,6 +133,16 @@ #define ED_ELEMENT_SETTINGS_YPOS(n) (ED_ELEMENT_SETTINGS_YSTART + \ (n) * ED_SETTINGS_YOFFSET) +#define ED_LEVEL_SETTINGS_TABS_XPOS(n) (ED_LEVEL_SETTINGS_XPOS(0) + \ + (n) * ED_SETTINGS_TAB_XOFFSET) +#define ED_LEVEL_SETTINGS_TABS_YPOS(n) (ED_LEVEL_SETTINGS_YSTART - \ + 3 * MINI_TILEY) + +#define ED_ELEMENT_SETTINGS_TABS_XPOS(n) (ED_ELEMENT_SETTINGS_XPOS(0) + \ + (n) * ED_SETTINGS_TAB_XOFFSET) +#define ED_ELEMENT_SETTINGS_TABS_YPOS(n) (ED_ELEMENT_SETTINGS_YSTART - \ + 2 * MINI_TILEY) + #define ED_SETTINGS1_YPOS MINI_TILEY #define ED_SETTINGS2_XPOS MINI_TILEX #define ED_SETTINGS2_YPOS (ED_SETTINGS1_YPOS + 12 * TILEY - 2) @@ -348,84 +359,90 @@ #define GADGET_ID_LEVEL_TIMESCORE_DOWN (GADGET_ID_COUNTER_FIRST + 18) #define GADGET_ID_LEVEL_TIMESCORE_TEXT (GADGET_ID_COUNTER_FIRST + 19) #define GADGET_ID_LEVEL_TIMESCORE_UP (GADGET_ID_COUNTER_FIRST + 20) -#define GADGET_ID_ELEMENT_VALUE1_DOWN (GADGET_ID_COUNTER_FIRST + 21) -#define GADGET_ID_ELEMENT_VALUE1_TEXT (GADGET_ID_COUNTER_FIRST + 22) -#define GADGET_ID_ELEMENT_VALUE1_UP (GADGET_ID_COUNTER_FIRST + 23) -#define GADGET_ID_ELEMENT_VALUE2_DOWN (GADGET_ID_COUNTER_FIRST + 24) -#define GADGET_ID_ELEMENT_VALUE2_TEXT (GADGET_ID_COUNTER_FIRST + 25) -#define GADGET_ID_ELEMENT_VALUE2_UP (GADGET_ID_COUNTER_FIRST + 26) -#define GADGET_ID_ELEMENT_VALUE3_DOWN (GADGET_ID_COUNTER_FIRST + 27) -#define GADGET_ID_ELEMENT_VALUE3_TEXT (GADGET_ID_COUNTER_FIRST + 28) -#define GADGET_ID_ELEMENT_VALUE3_UP (GADGET_ID_COUNTER_FIRST + 29) -#define GADGET_ID_ELEMENT_VALUE4_DOWN (GADGET_ID_COUNTER_FIRST + 30) -#define GADGET_ID_ELEMENT_VALUE4_TEXT (GADGET_ID_COUNTER_FIRST + 31) -#define GADGET_ID_ELEMENT_VALUE4_UP (GADGET_ID_COUNTER_FIRST + 32) -#define GADGET_ID_YAMYAM_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 33) -#define GADGET_ID_YAMYAM_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 34) -#define GADGET_ID_YAMYAM_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 35) -#define GADGET_ID_BALL_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 36) -#define GADGET_ID_BALL_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 37) -#define GADGET_ID_BALL_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 38) -#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 39) -#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 40) -#define GADGET_ID_ANDROID_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 41) -#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 42) -#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 43) -#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 44) -#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 45) -#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 46) -#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 47) -#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 48) -#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 49) -#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 50) -#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 51) -#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 52) -#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 53) -#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 54) -#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 55) -#define GADGET_ID_CUSTOM_VALUE_FIX_UP (GADGET_ID_COUNTER_FIRST + 56) -#define GADGET_ID_CUSTOM_VALUE_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57) -#define GADGET_ID_CUSTOM_VALUE_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58) -#define GADGET_ID_CUSTOM_VALUE_RND_UP (GADGET_ID_COUNTER_FIRST + 59) -#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 60) -#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 61) -#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 62) -#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63) -#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64) -#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 65) -#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 66) -#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 67) -#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 68) -#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69) -#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70) -#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 71) -#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 72) -#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 73) -#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 74) -#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 75) -#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 76) -#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 77) -#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 78) -#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 79) -#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 80) -#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 81) -#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 82) -#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 83) -#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 84) -#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 85) -#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 86) -#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 87) -#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 88) -#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 89) -#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 90) -#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 91) -#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 92) -#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 93) -#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 94) -#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 95) +#define GADGET_ID_LEVEL_RANDOM_SEED_DOWN (GADGET_ID_COUNTER_FIRST + 21) +#define GADGET_ID_LEVEL_RANDOM_SEED_TEXT (GADGET_ID_COUNTER_FIRST + 22) +#define GADGET_ID_LEVEL_RANDOM_SEED_UP (GADGET_ID_COUNTER_FIRST + 23) +#define GADGET_ID_ELEMENT_VALUE1_DOWN (GADGET_ID_COUNTER_FIRST + 24) +#define GADGET_ID_ELEMENT_VALUE1_TEXT (GADGET_ID_COUNTER_FIRST + 25) +#define GADGET_ID_ELEMENT_VALUE1_UP (GADGET_ID_COUNTER_FIRST + 26) +#define GADGET_ID_ELEMENT_VALUE2_DOWN (GADGET_ID_COUNTER_FIRST + 27) +#define GADGET_ID_ELEMENT_VALUE2_TEXT (GADGET_ID_COUNTER_FIRST + 28) +#define GADGET_ID_ELEMENT_VALUE2_UP (GADGET_ID_COUNTER_FIRST + 29) +#define GADGET_ID_ELEMENT_VALUE3_DOWN (GADGET_ID_COUNTER_FIRST + 30) +#define GADGET_ID_ELEMENT_VALUE3_TEXT (GADGET_ID_COUNTER_FIRST + 31) +#define GADGET_ID_ELEMENT_VALUE3_UP (GADGET_ID_COUNTER_FIRST + 32) +#define GADGET_ID_ELEMENT_VALUE4_DOWN (GADGET_ID_COUNTER_FIRST + 33) +#define GADGET_ID_ELEMENT_VALUE4_TEXT (GADGET_ID_COUNTER_FIRST + 34) +#define GADGET_ID_ELEMENT_VALUE4_UP (GADGET_ID_COUNTER_FIRST + 35) +#define GADGET_ID_YAMYAM_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 36) +#define GADGET_ID_YAMYAM_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 37) +#define GADGET_ID_YAMYAM_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 38) +#define GADGET_ID_BALL_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 39) +#define GADGET_ID_BALL_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 40) +#define GADGET_ID_BALL_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 41) +#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 42) +#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 43) +#define GADGET_ID_ANDROID_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 44) +#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 45) +#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 46) +#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 47) +#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 48) +#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 49) +#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 50) +#define GADGET_ID_INVENTORY_SIZE_DOWN (GADGET_ID_COUNTER_FIRST + 51) +#define GADGET_ID_INVENTORY_SIZE_TEXT (GADGET_ID_COUNTER_FIRST + 52) +#define GADGET_ID_INVENTORY_SIZE_UP (GADGET_ID_COUNTER_FIRST + 53) +#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 54) +#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 55) +#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 56) +#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 57) +#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 58) +#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 59) +#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 60) +#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 61) +#define GADGET_ID_CUSTOM_VALUE_FIX_UP (GADGET_ID_COUNTER_FIRST + 62) +#define GADGET_ID_CUSTOM_VALUE_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63) +#define GADGET_ID_CUSTOM_VALUE_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64) +#define GADGET_ID_CUSTOM_VALUE_RND_UP (GADGET_ID_COUNTER_FIRST + 65) +#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 66) +#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 67) +#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 68) +#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69) +#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70) +#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 71) +#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 72) +#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 73) +#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 74) +#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 75) +#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 76) +#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 77) +#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 78) +#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 79) +#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 80) +#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 81) +#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 82) +#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 83) +#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 84) +#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 85) +#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 86) +#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 87) +#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 88) +#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 89) +#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 90) +#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 91) +#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 92) +#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 93) +#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 94) +#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 95) +#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 96) +#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 97) +#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 98) +#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 99) +#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 100) +#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 101) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 96) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 102) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_YAMYAM_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -449,18 +466,20 @@ #define GADGET_ID_START_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 19) #define GADGET_ID_ARTWORK_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 20) #define GADGET_ID_EXPLOSION_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 21) -#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 22) -#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 23) -#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 24) -#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 25) -#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 26) -#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 27) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 28) -#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 29) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 30) +#define GADGET_ID_INVENTORY_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 22) +#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 23) +#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 24) +#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 25) +#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 26) +#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 27) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 28) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 29) +#define GADGET_ID_CUSTOM_CHANGE_ACTION (GADGET_ID_DRAWING_AREA_FIRST + 30) +#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 31) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 32) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 31) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 33) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -507,17 +526,19 @@ /* textbutton identifiers */ #define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 29) -#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) -#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) -#define GADGET_ID_PROPERTIES_CONFIG_1 (GADGET_ID_TEXTBUTTON_FIRST + 2) -#define GADGET_ID_PROPERTIES_CONFIG_2 (GADGET_ID_TEXTBUTTON_FIRST + 3) -#define GADGET_ID_PROPERTIES_CHANGE (GADGET_ID_TEXTBUTTON_FIRST + 4) -#define GADGET_ID_SAVE_AS_TEMPLATE (GADGET_ID_TEXTBUTTON_FIRST + 5) -#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 6) -#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 7) +#define GADGET_ID_LEVELINFO_LEVEL (GADGET_ID_TEXTBUTTON_FIRST + 0) +#define GADGET_ID_LEVELINFO_EDITOR (GADGET_ID_TEXTBUTTON_FIRST + 1) +#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 2) +#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 3) +#define GADGET_ID_PROPERTIES_CONFIG_1 (GADGET_ID_TEXTBUTTON_FIRST + 4) +#define GADGET_ID_PROPERTIES_CONFIG_2 (GADGET_ID_TEXTBUTTON_FIRST + 5) +#define GADGET_ID_PROPERTIES_CHANGE (GADGET_ID_TEXTBUTTON_FIRST + 6) +#define GADGET_ID_SAVE_AS_TEMPLATE (GADGET_ID_TEXTBUTTON_FIRST + 7) +#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 8) +#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 9) /* graphicbutton identifiers */ -#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 8) +#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 10) #define GADGET_ID_PREV_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 0) #define GADGET_ID_NEXT_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 1) @@ -549,55 +570,57 @@ #define GADGET_ID_RANDOM_RESTRICTED (GADGET_ID_CHECKBUTTON_FIRST + 2) #define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 3) #define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 4) -#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 5) -#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6) -#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 7) -#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 8) -#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 31) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 32) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 33) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 34) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 35) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 36) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 37) -#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 38) -#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 39) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 40) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 41) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 42) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 43) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 44) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 45) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 46) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 47) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 48) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 49) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 50) +#define GADGET_ID_EM_EXPLODES_BY_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 5) +#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6) +#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_USE_INITIAL_INVENTORY (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 33) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 34) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 35) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 36) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 37) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 39) +#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 40) +#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 41) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 42) +#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 43) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 44) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 45) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 46) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 47) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 48) +#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 49) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 50) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 51) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 52) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 51) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 53) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -615,37 +638,41 @@ #define ED_COUNTER_ID_LEVEL_GEMSLIMIT 3 #define ED_COUNTER_ID_LEVEL_TIMELIMIT 4 #define ED_COUNTER_ID_LEVEL_TIMESCORE 5 -#define ED_COUNTER_ID_LEVEL_RANDOM 6 -#define ED_COUNTER_ID_ELEMENT_VALUE1 7 -#define ED_COUNTER_ID_ELEMENT_VALUE2 8 -#define ED_COUNTER_ID_ELEMENT_VALUE3 9 -#define ED_COUNTER_ID_ELEMENT_VALUE4 10 -#define ED_COUNTER_ID_YAMYAM_CONTENT 11 -#define ED_COUNTER_ID_BALL_CONTENT 12 -#define ED_COUNTER_ID_ANDROID_CONTENT 13 -#define ED_COUNTER_ID_ENVELOPE_XSIZE 14 -#define ED_COUNTER_ID_ENVELOPE_YSIZE 15 -#define ED_COUNTER_ID_CUSTOM_SCORE 16 -#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 17 -#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 18 -#define ED_COUNTER_ID_CUSTOM_VALUE_RND 19 -#define ED_COUNTER_ID_PUSH_DELAY_FIX 20 -#define ED_COUNTER_ID_PUSH_DELAY_RND 21 -#define ED_COUNTER_ID_DROP_DELAY_FIX 22 -#define ED_COUNTER_ID_DROP_DELAY_RND 23 -#define ED_COUNTER_ID_MOVE_DELAY_FIX 24 -#define ED_COUNTER_ID_MOVE_DELAY_RND 25 -#define ED_COUNTER_ID_EXPLOSION_DELAY 26 -#define ED_COUNTER_ID_IGNITION_DELAY 27 -#define ED_COUNTER_ID_GROUP_CONTENT 28 -#define ED_COUNTER_ID_CHANGE_DELAY_FIX 29 -#define ED_COUNTER_ID_CHANGE_DELAY_RND 30 -#define ED_COUNTER_ID_CHANGE_CONT_RND 31 - -#define ED_NUM_COUNTERBUTTONS 32 +#define ED_COUNTER_ID_LEVEL_RANDOM_SEED 6 +#define ED_COUNTER_ID_LEVEL_RANDOM 7 +#define ED_COUNTER_ID_ELEMENT_VALUE1 8 +#define ED_COUNTER_ID_ELEMENT_VALUE2 9 +#define ED_COUNTER_ID_ELEMENT_VALUE3 10 +#define ED_COUNTER_ID_ELEMENT_VALUE4 11 +#define ED_COUNTER_ID_YAMYAM_CONTENT 12 +#define ED_COUNTER_ID_BALL_CONTENT 13 +#define ED_COUNTER_ID_ANDROID_CONTENT 14 +#define ED_COUNTER_ID_ENVELOPE_XSIZE 15 +#define ED_COUNTER_ID_ENVELOPE_YSIZE 16 +#define ED_COUNTER_ID_INVENTORY_SIZE 17 +#define ED_COUNTER_ID_CUSTOM_SCORE 18 +#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 19 +#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 20 +#define ED_COUNTER_ID_CUSTOM_VALUE_RND 21 +#define ED_COUNTER_ID_PUSH_DELAY_FIX 22 +#define ED_COUNTER_ID_PUSH_DELAY_RND 23 +#define ED_COUNTER_ID_DROP_DELAY_FIX 24 +#define ED_COUNTER_ID_DROP_DELAY_RND 25 +#define ED_COUNTER_ID_MOVE_DELAY_FIX 26 +#define ED_COUNTER_ID_MOVE_DELAY_RND 27 +#define ED_COUNTER_ID_EXPLOSION_DELAY 28 +#define ED_COUNTER_ID_IGNITION_DELAY 29 +#define ED_COUNTER_ID_GROUP_CONTENT 30 +#define ED_COUNTER_ID_CHANGE_DELAY_FIX 31 +#define ED_COUNTER_ID_CHANGE_DELAY_RND 32 +#define ED_COUNTER_ID_CHANGE_CONT_RND 33 + +#define ED_NUM_COUNTERBUTTONS 34 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE -#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM +#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM_SEED +#define ED_COUNTER_ID_EDITOR_FIRST ED_COUNTER_ID_LEVEL_RANDOM +#define ED_COUNTER_ID_EDITOR_LAST ED_COUNTER_ID_LEVEL_RANDOM #define ED_COUNTER_ID_CUSTOM1_FIRST ED_COUNTER_ID_CUSTOM_SCORE #define ED_COUNTER_ID_CUSTOM1_LAST ED_COUNTER_ID_DROP_DELAY_RND @@ -745,16 +772,21 @@ #define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_SELECT_CHANGE_PAGE /* values for textbutton gadgets */ -#define ED_TEXTBUTTON_ID_PROPERTIES_INFO 0 -#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG 1 -#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1 2 -#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2 3 -#define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE 4 -#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE 5 -#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 6 -#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 7 - -#define ED_NUM_TEXTBUTTONS 8 +#define ED_TEXTBUTTON_ID_LEVELINFO_LEVEL 0 +#define ED_TEXTBUTTON_ID_LEVELINFO_EDITOR 1 +#define ED_TEXTBUTTON_ID_PROPERTIES_INFO 2 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG 3 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1 4 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2 5 +#define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE 6 +#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE 7 +#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 8 +#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 9 + +#define ED_NUM_TEXTBUTTONS 10 + +#define ED_TEXTBUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL +#define ED_TEXTBUTTON_ID_LEVELINFO_LAST ED_TEXTBUTTON_ID_LEVELINFO_EDITOR #define ED_TEXTBUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO #define ED_TEXTBUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE @@ -777,57 +809,59 @@ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 0 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 1 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 2 -#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 3 -#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 4 -#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 5 -#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 6 -#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 7 -#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 8 -#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 9 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 10 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 11 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 12 -#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 13 -#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 14 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 15 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 16 -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 17 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 18 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 19 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 20 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 21 -#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 22 -#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 23 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 24 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 25 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 26 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 27 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 28 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 29 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 30 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 31 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 32 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 33 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 34 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 35 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 36 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 37 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 38 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 39 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 40 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 41 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 42 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 43 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 44 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 45 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 46 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 47 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 48 - -#define ED_NUM_CHECKBUTTONS 49 - -#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED -#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED +#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 3 +#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 4 +#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 5 +#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 6 +#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 7 +#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 8 +#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 9 +#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 10 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 11 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 12 +#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 13 +#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 14 +#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 15 +#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 16 +#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 17 +#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 18 +#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 19 +#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 20 +#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 21 +#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 22 +#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 23 +#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 24 +#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 25 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 26 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 27 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 28 +#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 29 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 30 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 31 +#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 32 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 33 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 34 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 35 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 36 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 37 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 38 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 39 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 40 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 41 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 42 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 43 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 44 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 45 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 46 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 47 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 48 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 49 +#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 50 + +#define ED_NUM_CHECKBUTTONS 51 + +#define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED +#define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE @@ -845,8 +879,8 @@ #define ED_NUM_RADIOBUTTONS 2 -#define ED_RADIOBUTTON_ID_LEVEL_FIRST ED_RADIOBUTTON_ID_PERCENTAGE -#define ED_RADIOBUTTON_ID_LEVEL_LAST ED_RADIOBUTTON_ID_QUANTITY +#define ED_RADIOBUTTON_ID_EDITOR_FIRST ED_RADIOBUTTON_ID_PERCENTAGE +#define ED_RADIOBUTTON_ID_EDITOR_LAST ED_RADIOBUTTON_ID_QUANTITY /* values for drawing area gadgets */ #define ED_DRAWING_ID_DRAWING_LEVEL 0 @@ -871,17 +905,19 @@ #define ED_DRAWING_ID_START_ELEMENT 19 #define ED_DRAWING_ID_ARTWORK_ELEMENT 20 #define ED_DRAWING_ID_EXPLOSION_ELEMENT 21 -#define ED_DRAWING_ID_CUSTOM_GRAPHIC 22 -#define ED_DRAWING_ID_CUSTOM_CONTENT 23 -#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 24 -#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 25 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 26 -#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 27 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 28 -#define ED_DRAWING_ID_GROUP_CONTENT 29 -#define ED_DRAWING_ID_RANDOM_BACKGROUND 30 +#define ED_DRAWING_ID_INVENTORY_CONTENT 22 +#define ED_DRAWING_ID_CUSTOM_GRAPHIC 23 +#define ED_DRAWING_ID_CUSTOM_CONTENT 24 +#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 25 +#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 26 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 27 +#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 28 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 29 +#define ED_DRAWING_ID_CUSTOM_CHANGE_ACTION 30 +#define ED_DRAWING_ID_GROUP_CONTENT 31 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 32 -#define ED_NUM_DRAWING_AREAS 31 +#define ED_NUM_DRAWING_AREAS 33 /* @@ -906,6 +942,10 @@ #define ED_MODE_INFO 1 #define ED_MODE_PROPERTIES 2 +/* sub-screens in the global settings section */ +#define ED_MODE_LEVELINFO_LEVEL ED_TEXTBUTTON_ID_LEVELINFO_LEVEL +#define ED_MODE_LEVELINFO_EDITOR ED_TEXTBUTTON_ID_LEVELINFO_EDITOR + /* sub-screens in the element properties section */ #define ED_MODE_PROPERTIES_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO #define ED_MODE_PROPERTIES_CONFIG ED_TEXTBUTTON_ID_PROPERTIES_CONFIG @@ -966,7 +1006,7 @@ static struct { ',', "pick drawing element" }, { 'U', "undo last operation" }, - { 'I', "level properties" }, + { 'I', "properties of level" }, { 'S', "save level" }, { 'C', "clear level" }, { 'T', "test level" }, @@ -1037,7 +1077,7 @@ static struct GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, GADGET_ID_LEVEL_GEMSLIMIT_TEXT, GADGET_ID_NONE, &level.gems_needed, - NULL, "number of gems to collect:", NULL + NULL, "number of gems to collect:", NULL }, { ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7), @@ -1056,7 +1096,15 @@ static struct "score for each second/step left:", NULL, NULL }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12), + 0, 9999, + GADGET_ID_LEVEL_RANDOM_SEED_DOWN, GADGET_ID_LEVEL_RANDOM_SEED_UP, + GADGET_ID_LEVEL_RANDOM_SEED_TEXT, GADGET_ID_NONE, + &level.random_seed, + NULL, "random seed:", "(0 => random)" + }, + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), 1, 100, GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP, GADGET_ID_LEVEL_RANDOM_TEXT, GADGET_ID_NONE, @@ -1138,6 +1186,14 @@ static struct NULL, /* will be set when used */ NULL, " ", "height", }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), + MIN_INITIAL_INVENTORY_SIZE, MAX_INITIAL_INVENTORY_SIZE, + GADGET_ID_INVENTORY_SIZE_DOWN, GADGET_ID_INVENTORY_SIZE_UP, + GADGET_ID_INVENTORY_SIZE_TEXT, GADGET_ID_NONE, + &level.initial_inventory_size[0], + NULL, NULL, "number of inventory elements" + }, /* ---------- element settings: configure 1 (custom elements) ------------ */ @@ -1515,6 +1571,7 @@ static struct ValueTextInfo options_deadliness[] = { { EP_DONT_RUN_INTO, "running into" }, { EP_DONT_COLLIDE_WITH, "colliding with" }, + { EP_DONT_GET_HIT_BY, "getting hit by" }, { EP_DONT_TOUCH, "touching" }, { -1, NULL } @@ -1673,15 +1730,16 @@ static struct ValueTextInfo options_action_type[] = { { CA_NO_ACTION, "no action" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_LEVEL_ACTIONS, "[level actions]" }, + { CA_HEADLINE_LEVEL_ACTIONS, "[level]" }, { CA_RESTART_LEVEL, "restart level" }, { CA_SHOW_ENVELOPE, "show envelope" }, { CA_SET_LEVEL_TIME, "set time" }, { CA_SET_LEVEL_SCORE, "set score" }, - { CA_SET_LEVEL_GEMS, "set needed gems" }, + { CA_SET_LEVEL_GEMS, "set gems" }, { CA_SET_LEVEL_WIND, "set wind dir." }, + { CA_SET_LEVEL_RANDOM_SEED, "set rand. seed" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_PLAYER_ACTIONS, "[player actions]" }, + { CA_HEADLINE_PLAYER_ACTIONS, "[player]" }, { CA_MOVE_PLAYER, "move player" }, { CA_EXIT_PLAYER, "exit player" }, { CA_KILL_PLAYER, "kill player" }, @@ -1690,12 +1748,14 @@ static struct ValueTextInfo options_action_type[] = { CA_SET_PLAYER_SHIELD, "set shield" }, { CA_SET_PLAYER_GRAVITY, "set gravity" }, { CA_SET_PLAYER_ARTWORK, "set artwork" }, + { CA_SET_PLAYER_INVENTORY, "set inventory" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_CE_ACTIONS, "[CE actions]" }, + { CA_HEADLINE_CE_ACTIONS, "[CE]" }, { CA_SET_CE_VALUE, "set CE value" }, { CA_SET_CE_SCORE, "set CE score" }, + { CA_SET_CE_ARTWORK, "set CE artwork" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_ENGINE_ACTIONS, "[engine actions]" }, + { CA_HEADLINE_ENGINE_ACTIONS, "[engine]" }, { CA_SET_ENGINE_SCAN_MODE, "set scan mode" }, { -1, NULL } @@ -1751,6 +1811,7 @@ static struct ValueTextInfo options_action_arg_player[] = { CA_ARG_PLAYER_4, "4" }, { CA_ARG_PLAYER_ANY, "any" }, { CA_ARG_PLAYER_TRIGGER, "trigger" }, + { CA_ARG_PLAYER_ACTION, "action ->" }, { -1, NULL } }; @@ -1784,10 +1845,12 @@ static struct ValueTextInfo options_action_arg_number[] = { CA_ARG_ELEMENT_CV_HEADLINE, "[CE value]" }, { CA_ARG_ELEMENT_CV_TARGET, "target" }, { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CV_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_CS_HEADLINE, "[CE score]" }, { CA_ARG_ELEMENT_CS_TARGET, "target" }, { CA_ARG_ELEMENT_CS_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CS_ACTION, "action ->" }, { -1, NULL } }; @@ -1821,14 +1884,17 @@ static struct ValueTextInfo options_action_arg_value[] = { CA_ARG_ELEMENT_CV_HEADLINE, "[CE value]" }, { CA_ARG_ELEMENT_CV_TARGET, "target" }, { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CV_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_CS_HEADLINE, "[CE score]" }, { CA_ARG_ELEMENT_CS_TARGET, "target" }, { CA_ARG_ELEMENT_CS_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CS_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_NR_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_NR_TARGET, "target" }, { CA_ARG_ELEMENT_NR_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_NR_ACTION, "action ->" }, { -1, NULL } }; @@ -1844,6 +1910,7 @@ static struct ValueTextInfo options_action_arg_envelope[] = { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_ACTION, "action ->" }, { -1, NULL } }; @@ -1863,6 +1930,7 @@ static struct ValueTextInfo options_action_arg_key[] = { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_ACTION, "action ->" }, { -1, NULL } }; @@ -1901,6 +1969,7 @@ static struct ValueTextInfo options_action_arg_artwork[] = { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_RESET, "reset" }, @@ -1940,6 +2009,26 @@ static struct ValueTextInfo options_action_arg_scan_mode[] = { -1, NULL } }; +static struct ValueTextInfo options_action_arg_inventory[] = +{ + { CA_ARG_INVENTORY_HEADLINE, "[add]" }, + { CA_ARG_ELEMENT_TARGET, "+ target" }, + { CA_ARG_ELEMENT_TRIGGER, "+ trigger" }, + { CA_ARG_ELEMENT_ACTION, "+ action" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_INVENTORY_RM_HEADLINE,"[remove]" }, + { CA_ARG_INVENTORY_RM_TARGET, "- target" }, + { CA_ARG_INVENTORY_RM_TRIGGER,"- trigger" }, + { CA_ARG_INVENTORY_RM_ACTION, "- action" }, + { CA_ARG_INVENTORY_RM_FIRST, "- first" }, + { CA_ARG_INVENTORY_RM_LAST, "- last" }, + { CA_ARG_INVENTORY_RM_ALL, "- all" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_INVENTORY_RESET, "reset" }, + + { -1, NULL } +}; + static char options_change_page_strings[MAX_CHANGE_PAGES][10]; static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] = { @@ -1983,13 +2072,16 @@ action_arg_options[] = { CA_SET_LEVEL_GEMS, 3, options_action_arg_number, }, { CA_SET_LEVEL_SCORE, 3, options_action_arg_number, }, { CA_SET_LEVEL_WIND, 1, options_action_arg_direction, }, + { CA_SET_LEVEL_RANDOM_SEED, 1, options_action_arg_number, }, { CA_SET_PLAYER_KEYS, 2, options_action_arg_key, }, { CA_SET_PLAYER_SPEED, 1, options_action_arg_speed, }, { CA_SET_PLAYER_SHIELD, 1, options_action_arg_shield, }, { CA_SET_PLAYER_GRAVITY, 1, options_action_arg_gravity, }, { CA_SET_PLAYER_ARTWORK, 1, options_action_arg_artwork, }, + { CA_SET_PLAYER_INVENTORY, 0, options_action_arg_inventory, }, { CA_SET_CE_VALUE, 3, options_action_arg_value, }, { CA_SET_CE_SCORE, 3, options_action_arg_value, }, + { CA_SET_CE_ARTWORK, 1, options_action_arg_artwork, }, { CA_SET_ENGINE_SCAN_MODE, 1, options_action_arg_scan_mode, }, { -1, FALSE, NULL } @@ -2268,34 +2360,46 @@ static struct } textbutton_info[ED_NUM_TEXTBUTTONS] = { { - ED_ELEMENT_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1), + ED_LEVEL_SETTINGS_TABS_XPOS(0), ED_LEVEL_SETTINGS_TABS_YPOS(0), + GADGET_ID_LEVELINFO_LEVEL, GADGET_ID_NONE, + 8, "Level", + NULL, NULL, "Configure level properties" + }, + { + ED_LEVEL_SETTINGS_TABS_XPOS(1), ED_LEVEL_SETTINGS_TABS_YPOS(0), + GADGET_ID_LEVELINFO_EDITOR, GADGET_ID_NONE, + 8, "Editor", + NULL, NULL, "Configure editor properties" + }, + { + ED_ELEMENT_SETTINGS_TABS_XPOS(0), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, 8, "Info", NULL, NULL, "Show information about element" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 124, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(1), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_NONE, 8, "Config", NULL, NULL, "Configure element properties" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 124, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(1), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CONFIG_1, GADGET_ID_NONE, 8, "Config 1", - NULL, NULL, "Configure custom element properties" + NULL, NULL, "Configure element properties, part 1" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 248, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(2), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CONFIG_2, GADGET_ID_NONE, 8, "Config 2", - NULL, NULL, "Configure custom element properties" + NULL, NULL, "Configure element properties, part 2" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 372, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(3), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_NONE, 8, "Change", - NULL, NULL, "Custom element change configuration" + NULL, NULL, "Configure custom element change pages" }, { -1, ED_ELEMENT_SETTINGS_YPOS(2), @@ -2474,14 +2578,14 @@ static struct } radiobutton_info[ED_NUM_RADIOBUTTONS] = { { - -1, ED_COUNTER2_YPOS(8), + -1, ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_LEVEL_RANDOM_UP, RADIO_NR_RANDOM_ELEMENTS, &random_placement_method, RANDOM_USE_PERCENTAGE, " ", "percentage", "use percentage for random elements" }, { - -1, ED_COUNTER2_YPOS(8), + -1, ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE, RADIO_NR_RANDOM_ELEMENTS, &random_placement_method, RANDOM_USE_QUANTITY, @@ -2501,7 +2605,7 @@ static struct /* ---------- level and editor settings ---------------------------------- */ { - ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(9) - MINI_TILEY, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1), GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, &random_placement_background_restricted, NULL, @@ -2524,6 +2628,13 @@ static struct NULL, "slip down from certain flat walls","use EM/DC style slipping behaviour" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_EM_EXPLODES_BY_FIRE, GADGET_ID_NONE, + &level.em_explodes_by_fire, + NULL, + "explodes with chain reaction", "use R'n'D style explosion behaviour" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE, @@ -2629,6 +2740,13 @@ static struct NULL, "use initial gravity", "set initial player gravity" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_USE_INITIAL_INVENTORY, GADGET_ID_NONE, + &level.use_initial_inventory[0], + NULL, + "use initial inventory:", "use collected elements on level start" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE, @@ -3030,6 +3148,15 @@ static struct NULL, NULL, NULL, "element for player explosion" }, + /* ---------- player initial inventory ----------------------------------- */ + + { + -1, ED_AREA_1X1_SETTINGS_YPOS(1), + GADGET_ID_INVENTORY_CONTENT, GADGET_ID_USE_INITIAL_INVENTORY, + &level.initial_inventory_content[0][0], MAX_INITIAL_INVENTORY_SIZE, 1, + NULL, NULL, NULL, "content for initial inventory" + }, + /* ---------- element settings: configure 1 (custom elements) ----------- */ /* ---------- custom graphic --------------------------------------------- */ @@ -3037,7 +3164,7 @@ static struct { -1, ED_AREA_1X1_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC, - &custom_element.gfx_element, 1, 1, + &custom_element.gfx_element_initial,1, 1, NULL, NULL, NULL, "custom graphic element" }, @@ -3092,10 +3219,19 @@ static struct { -1, ED_AREA_1X1_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION, - &custom_element_change.trigger_element, 1, 1, + &custom_element_change.initial_trigger_element, 1, 1, NULL, NULL, NULL, "other element triggering change" }, + /* ---------- custom change action (element used for action) ------------- */ + + { + -1, ED_AREA_1X1_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_CHANGE_ACTION, GADGET_ID_ACTION_ARG, + &custom_element_change.action_element, 1, 1, + NULL, NULL, NULL, "element used as action parameter" + }, + /* ---------- group element content -------------------------------------- */ { @@ -3108,7 +3244,7 @@ static struct /* ---------- random background (for random painting) -------------------- */ { - -1, ED_ELEMENT_SETTINGS_YPOS(14), + -1, ED_AREA_1X1_SETTINGS_YPOS(-1), GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED, &random_placement_background_element, 1, 1, NULL, NULL, NULL, "random placement background" @@ -3188,6 +3324,7 @@ static int undo_buffer_position = 0; static int undo_buffer_steps = 0; static int edit_mode; +static int edit_mode_levelinfo; static int edit_mode_properties; static int element_shift = 0; @@ -4946,27 +5083,40 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height, (input ? IMG_EDITOR_ELEMENT_BORDER_INPUT : IMG_EDITOR_ELEMENT_BORDER); Bitmap *src_bitmap; int src_x, src_y; - int num_mini_tilex = width / MINI_TILEX + 1; - int num_mini_tiley = height / MINI_TILEY + 1; - int from_x = dest_x - MINI_TILEX / 2; - int from_y = dest_y - MINI_TILEY / 2; - int to_x = from_x + num_mini_tilex * MINI_TILEX - 1; - int to_y = from_y + num_mini_tiley * MINI_TILEY - 1; - int x, y; + int bx = (input ? 4 : 8); + int by = (input ? 4 : 8); + int bx2 = TILEX - bx; + int by2 = TILEY - by; + int i; - getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y); + getGraphicSource(border_graphic, 0, &src_bitmap, &src_x, &src_y); - for (y = 0; y < num_mini_tiley; y++) - for (x = 0; x < num_mini_tilex; x++) - BlitBitmap(src_bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY, - from_x + x * MINI_TILEX, from_y + y * MINI_TILEY); + BlitBitmap(src_bitmap, drawto, src_x, src_y, + bx, by, dest_x - bx, dest_y - by); + BlitBitmap(src_bitmap, drawto, src_x + bx2, src_y, + bx, by, dest_x + width, dest_y - by); + BlitBitmap(src_bitmap, drawto, src_x, src_y + by2, + bx, by, dest_x - bx, dest_y + height); + BlitBitmap(src_bitmap, drawto, src_x + bx2, src_y + by2, + bx, by, dest_x + width, dest_y + height); - ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2); + for (i = 0; i < width / MINI_TILEX; i++) + { + BlitBitmap(src_bitmap, drawto, src_x + bx, src_y, MINI_TILEX, by, + dest_x + i * MINI_TILEX, dest_y - by); + BlitBitmap(src_bitmap, drawto, src_x + bx, src_y + by2, MINI_TILEX, by, + dest_x + i * MINI_TILEX, dest_y + height); + } - DrawSimpleBlackLine(drawto, from_x, from_y, to_x, from_y); - DrawSimpleBlackLine(drawto, to_x, from_y, to_x, to_y); - DrawSimpleBlackLine(drawto, to_x, to_y, from_x, to_y); - DrawSimpleBlackLine(drawto, from_x, to_y, from_x, from_y); + for (i = 0; i < height / MINI_TILEY; i++) + { + BlitBitmap(src_bitmap, drawto, src_x, src_y + by, bx, MINI_TILEY, + dest_x - bx, dest_y + i * MINI_TILEY); + BlitBitmap(src_bitmap, drawto, src_x + bx2, src_y + by, bx, MINI_TILEY, + dest_x + width, dest_y + i * MINI_TILEY); + } + + ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2); } static void DrawDrawingArea(int id) @@ -4988,14 +5138,16 @@ static void DrawDrawingArea(int id) static void ScrollMiniLevel(int from_x, int from_y, int scroll) { -#if 1 +#if 0 + /* (directly solved in BlitBitmap() now) */ static Bitmap *tmp_backbuffer = NULL; #endif int x, y; int dx = (scroll == ED_SCROLL_LEFT ? -1 : scroll == ED_SCROLL_RIGHT ? 1 : 0); int dy = (scroll == ED_SCROLL_UP ? -1 : scroll == ED_SCROLL_DOWN ? 1 : 0); -#if 1 +#if 0 + /* (directly solved in BlitBitmap() now) */ if (tmp_backbuffer == NULL) tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); @@ -5027,8 +5179,6 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll) SY + (dy == +1 ? MINI_TILEY : 0)); #endif - printf("::: ScrollMiniLevel: A.1\n"); - if (dx) { x = (dx == 1 ? 0 : ed_fieldx - 1); @@ -5042,8 +5192,6 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll) DrawMiniElementOrWall(x, y, from_x, from_y); } - printf("::: ScrollMiniLevel: Z\n"); - redraw_mask |= REDRAW_FIELD; BackToFront(); } @@ -5695,7 +5843,8 @@ static void CreateTextbuttonGadgets() event_mask = GD_EVENT_RELEASED; - if (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE) + if ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) || + (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE)) { gd_x1 = DOOR_GFX_PAGEX4 + ED_TEXTBUTTON_TAB_XPOS; gd_x2 = DOOR_GFX_PAGEX3 + ED_TEXTBUTTON_TAB_XPOS; @@ -6594,8 +6743,11 @@ static void replace_custom_element_in_settings(int element_from, if (change->target_element == element_from) change->target_element = element_to; - if (change->trigger_element == element_from) - change->trigger_element = element_to; + if (change->initial_trigger_element == element_from) + change->initial_trigger_element = element_to; + + if (change->action_element == element_from) + change->action_element = element_to; for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) @@ -6771,11 +6923,13 @@ static void CopyCustomElementPropertiesToEditor(int element) /* set deadliness selectbox help value */ custom_element.deadliness = (DONT_TOUCH(element) ? EP_DONT_TOUCH : + DONT_GET_HIT_BY(element) ? EP_DONT_GET_HIT_BY : DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH : DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO : custom_element.deadliness); custom_element_properties[EP_DEADLY] = (DONT_TOUCH(element) || + DONT_GET_HIT_BY(element) || DONT_COLLIDE_WITH(element) || DONT_RUN_INTO(element)); @@ -6923,6 +7077,7 @@ static void CopyCustomElementPropertiesToGame(int element) /* set deadliness property from checkbox and selectbox */ custom_element_properties[EP_DONT_RUN_INTO] = FALSE; custom_element_properties[EP_DONT_COLLIDE_WITH] = FALSE; + custom_element_properties[EP_DONT_GET_HIT_BY] = FALSE; custom_element_properties[EP_DONT_TOUCH] = FALSE; custom_element_properties[custom_element.deadliness] = custom_element_properties[EP_DEADLY]; @@ -7031,6 +7186,8 @@ void CheckElementDescriptions() void DrawLevelEd() { + StopAnimation(); + CloseDoor(DOOR_CLOSE_ALL); #if 1 @@ -7053,6 +7210,7 @@ void DrawLevelEd() else { edit_mode = ED_MODE_DRAWING; + edit_mode_levelinfo = ED_MODE_LEVELINFO_LEVEL; edit_mode_properties = ED_MODE_PROPERTIES_INFO; ResetUndoBuffer(); @@ -7077,6 +7235,8 @@ void DrawLevelEd() ReinitializeElementList(); /* update dynamic level element list */ ReinitializeElementListButtons(); /* custom element may look different */ + InitElementPropertiesGfxElement(); + #if 1 UnmapAllGadgets(); #else @@ -7372,25 +7532,125 @@ static void DrawDrawingWindow() MapLevelEditorToolboxDrawingGadgets(); } -static void DrawLevelInfoWindow() +static int getTabulatorBarWidth() { + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; + struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE]; + + return gd_gi4->x - gd_gi1->x + gd_gi4->width; +} + +static void DrawLevelInfoTabulatorGadgets() +{ + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL]; + struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; + int gd_x = gd->x + gd_gi1->border.width / 2; + int gd_y = gd->y + gd_gi1->height - 1; + Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); + int id_first = ED_TEXTBUTTON_ID_LEVELINFO_LEVEL; + int id_last = ED_TEXTBUTTON_ID_LEVELINFO_EDITOR; +#if 1 +#else + int max_tabs = 2; +#endif int i; - stick_element_properties_window = FALSE; + for (i = id_first; i <= id_last; i++) + { + int gadget_id = textbutton_info[i].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + boolean active = (i != edit_mode_levelinfo); - SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); - ClearField(); - UnmapLevelEditorWindowGadgets(); + /* draw background line below tabulator button */ + ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); -#if 0 - DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings"); - DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings"); + /* draw solid line below inactive tabulator buttons */ + if (!active && tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color); + + ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); + MapTextbuttonGadget(i); + } + +#if 1 + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + getTabulatorBarWidth(), ED_GADGET_DISTANCE, + tab_color); #else - DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, - "Level Settings", FONT_TITLE_1); - DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS, - "Editor Settings", FONT_TITLE_1); + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE, + ED_GADGET_DISTANCE, tab_color); +#endif +} + +static void DrawPropertiesTabulatorGadgets() +{ + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; + struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; + int gd_x = gd->x + gd_gi1->border.width / 2; + int gd_y = gd->y + gd_gi1->height - 1; + Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); + int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO; + int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; +#if 1 +#else + int max_tabs = 4; #endif + int i; + + /* draw two config tabulators for player elements */ + if (ELEM_IS_PLAYER(properties_element)) + id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2; + + /* draw two config and one "change" tabulator for custom elements */ + if (IS_CUSTOM_ELEMENT(properties_element)) + id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE; + + for (i = id_first; i <= id_last; i++) + { + int gadget_id = textbutton_info[i].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + boolean active = (i != edit_mode_properties); + + /* use "config 1" and "config 2" instead of "config" for players and CEs */ + if (i == ED_TEXTBUTTON_ID_PROPERTIES_CONFIG && + (ELEM_IS_PLAYER(properties_element) || + IS_CUSTOM_ELEMENT(properties_element))) + continue; + + /* draw background line below tabulator button */ + ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); + + /* draw solid line below inactive tabulator buttons */ + if (!active && tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color); + + ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); + MapTextbuttonGadget(i); + } + +#if 1 + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + getTabulatorBarWidth(), ED_GADGET_DISTANCE, + tab_color); +#else + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE, + ED_GADGET_DISTANCE, tab_color); +#endif +} + +static void DrawLevelInfoLevel() +{ + int i; /* draw counter gadgets */ for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++) @@ -7400,22 +7660,62 @@ static void DrawLevelInfoWindow() for (i = ED_SELECTBOX_ID_LEVEL_FIRST; i <= ED_SELECTBOX_ID_LEVEL_LAST; i++) MapSelectboxGadget(i); + /* draw text input gadgets */ + for (i = ED_TEXTINPUT_ID_LEVEL_FIRST; i <= ED_TEXTINPUT_ID_LEVEL_LAST; i++) + MapTextInputGadget(i); +} + +static void DrawLevelInfoEditor() +{ + int i; + + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_EDITOR_FIRST; i <= ED_COUNTER_ID_EDITOR_LAST; i++) + MapCounterButtons(i); + /* draw checkbutton gadgets */ - for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i <= ED_CHECKBUTTON_ID_LEVEL_LAST; i++) + for (i=ED_CHECKBUTTON_ID_EDITOR_FIRST; i<= ED_CHECKBUTTON_ID_EDITOR_LAST; i++) MapCheckbuttonGadget(i); /* draw radiobutton gadgets */ - for (i=ED_RADIOBUTTON_ID_LEVEL_FIRST; i <= ED_RADIOBUTTON_ID_LEVEL_LAST; i++) + for (i=ED_RADIOBUTTON_ID_EDITOR_FIRST; i<= ED_RADIOBUTTON_ID_EDITOR_LAST; i++) MapRadiobuttonGadget(i); - /* draw text input gadgets */ - for (i = ED_TEXTINPUT_ID_LEVEL_FIRST; i <= ED_TEXTINPUT_ID_LEVEL_LAST; i++) - MapTextInputGadget(i); - /* draw drawing area */ MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND); } +static void DrawLevelInfoWindow() +{ + stick_element_properties_window = FALSE; + + UnmapLevelEditorWindowGadgets(); + + SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); + ClearField(); + +#if 1 +#if 1 + DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Global Settings"); +#else + DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings"); + DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings"); +#endif +#else + DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, + "Level Settings", FONT_TITLE_1); + DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS, + "Editor Settings", FONT_TITLE_1); +#endif + + DrawLevelInfoTabulatorGadgets(); + + if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVEL) + DrawLevelInfoLevel(); + else /* (edit_mode_levelinfo == ED_MODE_LEVELINFO_EDITOR) */ + DrawLevelInfoEditor(); +} + static void DrawCustomContentArea() { int id = ED_DRAWING_ID_CUSTOM_CONTENT; @@ -7566,6 +7866,35 @@ static void DrawGroupElementArea(int element) MapDrawingArea(id); } +static void DrawPlayerInitialInventoryArea(int element) +{ + int player_nr = GET_PLAYER_NR(element); + int num_elements = level.initial_inventory_size[player_nr]; + int id = ED_DRAWING_ID_INVENTORY_CONTENT; + int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2; + int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2; + int xsize = MAX_INITIAL_INVENTORY_SIZE; + int ysize = 1; + + /* determine horizontal position to the right of specified gadget */ + if (drawingarea_info[id].gadget_id_align != GADGET_ID_NONE) + sx += (right_gadget_border[drawingarea_info[id].gadget_id_align] + + ED_DRAWINGAREA_TEXT_DISTANCE); + + /* determine horizontal offset for leading text */ + if (drawingarea_info[id].text_left != NULL) + sx += getTextWidthForDrawingArea(drawingarea_info[id].text_left); + + UnmapDrawingArea(id); + + ModifyEditorDrawingArea(id, num_elements, 1); + + /* delete content areas in case of reducing number of them */ + DrawBackground(sx, sy, (xsize + 1) * MINI_TILEX, (ysize + 1) * MINI_TILEY); + + MapDrawingArea(id); +} + static void DrawEnvelopeTextArea(int envelope_nr) { int id = ED_TEXTAREA_ID_ENVELOPE_INFO; @@ -7618,63 +7947,6 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line) max_lines_per_screen, -1, TRUE, FALSE, FALSE); } -static void DrawPropertiesTabulatorGadgets() -{ - struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; - struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE]; - struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; - int gd_x = gd->x + gd_gi1->border.width / 2; - int gd_y = gd->y + gd_gi1->height - 1; - Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); - int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO; - int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; -#if 1 -#else - int max_tabs = 4; -#endif - int i; - - /* draw additional "change" tabulator for custom elements */ - if (IS_CUSTOM_ELEMENT(properties_element)) - id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE; - - for (i = id_first; i <= id_last; i++) - { - int gadget_id = textbutton_info[i].gadget_id; - struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - boolean active = (i != edit_mode_properties); - - /* use "config 1" and "config 2" instead of "config" */ - if (i == ED_TEXTBUTTON_ID_PROPERTIES_CONFIG && - IS_CUSTOM_ELEMENT(properties_element)) - continue; - - /* draw background line below tabulator button */ - ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); - - /* draw solid line below inactive tabulator buttons */ - if (!active && tab_color != BLACK_PIXEL) /* black => transparent */ - FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color); - - ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); - MapTextbuttonGadget(i); - } - -#if 1 - /* draw little border line below tabulator buttons */ - if (tab_color != BLACK_PIXEL) /* black => transparent */ - FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, - gd_gi4->x - gd_gi1->x + gd_gi4->width, ED_GADGET_DISTANCE, - tab_color); -#else - /* draw little border line below tabulator buttons */ - if (tab_color != BLACK_PIXEL) /* black => transparent */ - FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, - max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE, - ED_GADGET_DISTANCE, tab_color); -#endif -} - static void DrawPropertiesInfo() { static struct @@ -7714,6 +7986,7 @@ static void DrawPropertiesInfo() { EP_DONT_RUN_INTO, "- deadly when running into" }, { EP_DONT_COLLIDE_WITH, "- deadly when colliding with" }, + { EP_DONT_GET_HIT_BY, "- deadly when getting hit by" }, { EP_DONT_TOUCH, "- deadly when touching" }, { EP_INDESTRUCTIBLE, "- indestructible" }, @@ -7887,6 +8160,7 @@ static struct { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EMC_KEY_8, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_DC_KEY_WHITE, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, @@ -8031,49 +8305,75 @@ static void DrawPropertiesConfig() /* these properties can be set for every player individually */ - drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value = - &level.start_element[player_nr]; - drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value = - &level.artwork_element[player_nr]; - drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value = - &level.explosion_element[player_nr]; - - checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value = - &level.use_start_element[player_nr]; - checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value = - &level.use_artwork_element[player_nr]; - checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value = - &level.use_explosion_element[player_nr]; - checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value = - &level.initial_player_gravity[player_nr]; - - selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value = - &level.initial_player_stepsize[player_nr]; - - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); - MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? - ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : - ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_RELOCATION); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_GRAVITY); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE); - - MapDrawingArea(ED_DRAWING_ID_START_ELEMENT); - MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT); - MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT); - - MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED); + if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_1) + { + drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value = + &level.start_element[player_nr]; + drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value = + &level.artwork_element[player_nr]; + drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value = + &level.explosion_element[player_nr]; + + checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value = + &level.use_start_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value = + &level.use_artwork_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value = + &level.use_explosion_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value = + &level.initial_player_gravity[player_nr]; + + selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value = + &level.initial_player_stepsize[player_nr]; + + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); + MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? + ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : + ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_RELOCATION); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_GRAVITY); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE); + + MapDrawingArea(ED_DRAWING_ID_START_ELEMENT); + MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT); + MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT); + + MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED); + } + else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2) + { + drawingarea_info[ED_DRAWING_ID_INVENTORY_CONTENT].value = + &level.initial_inventory_content[player_nr][0]; + + counterbutton_info[ED_COUNTER_ID_INVENTORY_SIZE].value = + &level.initial_inventory_size[player_nr]; + + checkbutton_info[ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY].value = + &level.use_initial_inventory[player_nr]; + + /* draw checkbutton gadgets */ + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY); + + /* draw counter gadgets */ + MapCounterButtons(ED_COUNTER_ID_INVENTORY_SIZE); + + /* draw drawing area gadgets */ + DrawPlayerInitialInventoryArea(properties_element); + } } if (IS_GEM(properties_element)) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); + if (properties_element == EL_EM_DYNAMITE) + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE); + if (COULD_MOVE_INTO_ACID(properties_element) && !ELEM_IS_PLAYER(properties_element) && (!IS_CUSTOM_ELEMENT(properties_element) || @@ -8220,6 +8520,7 @@ static void DrawPropertiesChangeDrawingAreas() { MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_ACTION); DrawCustomChangeContentArea(); } @@ -8330,12 +8631,18 @@ static void DrawPropertiesWindow() stick_element_properties_window = FALSE; /* make sure that previous properties edit mode exists for this element */ + if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG_2 && + !IS_CUSTOM_ELEMENT(properties_element)) + edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_2; + if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG && + !ELEM_IS_PLAYER(properties_element) && !IS_CUSTOM_ELEMENT(properties_element)) edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG && - IS_CUSTOM_ELEMENT(properties_element)) + (ELEM_IS_PLAYER(properties_element) || + IS_CUSTOM_ELEMENT(properties_element))) edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1; CopyElementPropertiesToEditor(properties_element); @@ -8351,7 +8658,7 @@ static void DrawPropertiesWindow() SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); ClearField(); -#if 0 +#if 1 DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings"); #else DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, @@ -8383,8 +8690,12 @@ static void DrawPropertiesWindow() static void UpdateCustomElementGraphicGadgets() { + struct ElementInfo *ei = &element_info[properties_element]; int i; + ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial : + properties_element); + ModifyEditorElementList(); RedrawDrawingElements(); @@ -10361,6 +10672,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi) CopyGroupElementPropertiesToGame(properties_element); break; + case ED_COUNTER_ID_INVENTORY_SIZE: + DrawPlayerInitialInventoryArea(properties_element); + break; + case ED_COUNTER_ID_ENVELOPE_XSIZE: case ED_COUNTER_ID_ENVELOPE_YSIZE: DrawEnvelopeTextArea(-1); @@ -10457,8 +10772,15 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) int type_id = gi->custom_type_id; int i; - if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST && - type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST) + if (type_id >= ED_TEXTBUTTON_ID_LEVELINFO_FIRST && + type_id <= ED_TEXTBUTTON_ID_LEVELINFO_LAST) + { + edit_mode_levelinfo = gi->custom_type_id; + + DrawLevelInfoWindow(); + } + else if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST && + type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST) { edit_mode_properties = gi->custom_type_id; @@ -10924,11 +11246,13 @@ static void HandleControlButtons(struct GadgetInfo *gi) CloseDoor(DOOR_CLOSE_ALL); + BackToFront(); /* force redraw of undrawn special door */ + DrawCompleteVideoDisplay(); level_editor_test_game = TRUE; - StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE); + StartGameActions(FALSE, setup.autorecord, level.random_seed); } break; @@ -11153,6 +11477,7 @@ void HandleLevelEditorIdle() static unsigned long action_delay = 0; unsigned long action_delay_value = GameFrameDelay; int xpos = 1, ypos = 2; + int i; if (edit_mode != ED_MODE_PROPERTIES) return; @@ -11160,6 +11485,14 @@ void HandleLevelEditorIdle() if (!DelayReached(&action_delay, action_delay_value)) return; + for (i = 0; i < ED_NUM_SELECTBOX; i++) + { + struct GadgetInfo *gi = level_editor_gadget[selectbox_info[i].gadget_id]; + + if (gi->mapped && gi->active && gi->selectbox.open) + return; + } + DrawEditorElementAnimation(SX + xpos * TILEX, SY + ypos * TILEY + MINI_TILEY / 2); diff --git a/src/events.c b/src/events.c index 811d8f9a..278704e6 100644 --- a/src/events.c +++ b/src/events.c @@ -223,6 +223,10 @@ void HandleOtherEvents(Event *event) case SDL_JOYBUTTONUP: HandleJoystickEvent(event); break; + + case SDL_SYSWMEVENT: + HandleWindowManagerEvent(event); + break; #endif default: @@ -413,6 +417,13 @@ void HandleClientMessageEvent(ClientMessageEvent *event) CloseAllAndExit(0); } +void HandleWindowManagerEvent(Event *event) +{ +#if defined(TARGET_SDL) + SDLHandleWindowManagerEvent(event); +#endif +} + void HandleButton(int mx, int my, int button, int button_nr) { static int old_mx = 0, old_my = 0; @@ -733,7 +744,7 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_MAIN && (key == setup.shortcut.toggle_pause || key == KSYM_space)) { - StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE); + StartGameActions(options.network, setup.autorecord, level.random_seed); return; } diff --git a/src/events.h b/src/events.h index 16b15ebd..7cde0e00 100644 --- a/src/events.h +++ b/src/events.h @@ -28,7 +28,8 @@ void HandleButtonEvent(ButtonEvent *); void HandleMotionEvent(MotionEvent *); void HandleKeyEvent(KeyEvent *); void HandleFocusEvent(FocusChangeEvent *); -void HandleClientMessageEvent(ClientMessageEvent *event); +void HandleClientMessageEvent(ClientMessageEvent *); +void HandleWindowManagerEvent(Event *); void HandleNoEvent(void); diff --git a/src/files.c b/src/files.c index 3b51e6e2..c3277722 100644 --- a/src/files.c +++ b/src/files.c @@ -182,6 +182,12 @@ static struct LevelFileConfigInfo chunk_config_INFO[] = &li.gems_needed, 0 }, + { + -1, -1, + TYPE_INTEGER, CONF_VALUE_32_BIT(2), + &li.random_seed, 0 + }, + { -1, -1, TYPE_BOOLEAN, CONF_VALUE_8_BIT(2), @@ -218,6 +224,12 @@ static struct LevelFileConfigInfo chunk_config_INFO[] = &li.dont_collide_with_bits, ~0 /* default: always deadly */ }, + { + -1, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(8), + &li.em_explodes_by_fire, FALSE + }, + { -1, -1, TYPE_INTEGER, CONF_VALUE_16_BIT(5), @@ -311,6 +323,22 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_ELEMENT, CONF_VALUE_16_BIT(3), &li.explosion_element[0], EL_PLAYER_1 }, + { + EL_PLAYER_1, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(13), + &li.use_initial_inventory[0], FALSE + }, + { + EL_PLAYER_1, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(14), + &li.initial_inventory_size[0], 1 + }, + { + EL_PLAYER_1, -1, + TYPE_ELEMENT_LIST, CONF_VALUE_BYTES(1), + &li.initial_inventory_content[0][0],EL_EMPTY, NULL, + &li.initial_inventory_size[0], 1, MAX_INITIAL_INVENTORY_SIZE + }, { EL_PLAYER_2, -1, @@ -352,6 +380,22 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_ELEMENT, CONF_VALUE_16_BIT(3), &li.explosion_element[1], EL_PLAYER_2 }, + { + EL_PLAYER_2, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(13), + &li.use_initial_inventory[1], FALSE + }, + { + EL_PLAYER_2, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(14), + &li.initial_inventory_size[1], 1 + }, + { + EL_PLAYER_2, -1, + TYPE_ELEMENT_LIST, CONF_VALUE_BYTES(1), + &li.initial_inventory_content[1][0],EL_EMPTY, NULL, + &li.initial_inventory_size[1], 1, MAX_INITIAL_INVENTORY_SIZE + }, { EL_PLAYER_3, -1, @@ -393,6 +437,22 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_ELEMENT, CONF_VALUE_16_BIT(3), &li.explosion_element[2], EL_PLAYER_3 }, + { + EL_PLAYER_3, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(13), + &li.use_initial_inventory[2], FALSE + }, + { + EL_PLAYER_3, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(14), + &li.initial_inventory_size[2], 1 + }, + { + EL_PLAYER_3, -1, + TYPE_ELEMENT_LIST, CONF_VALUE_BYTES(1), + &li.initial_inventory_content[2][0],EL_EMPTY, NULL, + &li.initial_inventory_size[2], 1, MAX_INITIAL_INVENTORY_SIZE + }, { EL_PLAYER_4, -1, @@ -434,6 +494,22 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_ELEMENT, CONF_VALUE_16_BIT(3), &li.explosion_element[3], EL_PLAYER_4 }, + { + EL_PLAYER_4, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(13), + &li.use_initial_inventory[3], FALSE + }, + { + EL_PLAYER_4, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(14), + &li.initial_inventory_size[3], 1 + }, + { + EL_PLAYER_4, -1, + TYPE_ELEMENT_LIST, CONF_VALUE_BYTES(1), + &li.initial_inventory_content[3][0],EL_EMPTY, NULL, + &li.initial_inventory_size[3], 1, MAX_INITIAL_INVENTORY_SIZE + }, { EL_EMERALD, -1, @@ -806,8 +882,8 @@ static struct LevelFileConfigInfo chunk_config_CUSX_base[] = { -1, -1, TYPE_ELEMENT, CONF_VALUE_16_BIT(1), - &xx_ei.gfx_element, EL_EMPTY_SPACE, - &yy_ei.gfx_element + &xx_ei.gfx_element_initial, EL_EMPTY_SPACE, + &yy_ei.gfx_element_initial }, { @@ -1045,7 +1121,7 @@ static struct LevelFileConfigInfo chunk_config_CUSX_change[] = { -1, -1, TYPE_ELEMENT, CONF_VALUE_16_BIT(5), - &xx_change.trigger_element, EL_EMPTY_SPACE + &xx_change.initial_trigger_element, EL_EMPTY_SPACE }, { @@ -1100,6 +1176,12 @@ static struct LevelFileConfigInfo chunk_config_CUSX_change[] = &xx_change.action_arg, CA_ARG_UNDEFINED }, + { + -1, -1, + TYPE_ELEMENT, CONF_VALUE_16_BIT(7), + &xx_change.action_element, EL_EMPTY_SPACE + }, + { -1, -1, TYPE_CONTENT_LIST, CONF_VALUE_BYTES(1), @@ -1132,7 +1214,7 @@ static struct LevelFileConfigInfo chunk_config_GRPX[] = { -1, -1, TYPE_ELEMENT, CONF_VALUE_16_BIT(1), - &xx_ei.gfx_element, EL_EMPTY_SPACE + &xx_ei.gfx_element_initial, EL_EMPTY_SPACE }, { @@ -1620,6 +1702,9 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) level->changed = FALSE; + /* 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; @@ -1950,6 +2035,7 @@ int getMappedElement(int element) case EL_KEY_OBSOLETE: element = EL_KEY_1; + break; case EL_EM_KEY_1_FILE_OBSOLETE: element = EL_EM_KEY_1; @@ -2355,7 +2441,7 @@ static int LoadLevel_CUS3(FILE *file, int chunk_size, struct LevelInfo *level) ReadUnusedBytesFromFile(file, 7); ei->use_gfx_element = getFile8Bit(file); - ei->gfx_element = getMappedElement(getFile16BitBE(file)); + ei->gfx_element_initial = getMappedElement(getFile16BitBE(file)); ei->collect_score_initial = getFile8Bit(file); ei->collect_count_initial = getFile8Bit(file); @@ -2384,7 +2470,7 @@ static int LoadLevel_CUS3(FILE *file, int chunk_size, struct LevelInfo *level) ei->change->delay_random = getFile16BitBE(file); ei->change->delay_frames = getFile16BitBE(file); - ei->change->trigger_element = getMappedElement(getFile16BitBE(file)); + ei->change->initial_trigger_element= getMappedElement(getFile16BitBE(file)); ei->change->explode = getFile8Bit(file); ei->change->use_target_content = getFile8Bit(file); @@ -2454,7 +2540,7 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) ei->use_last_ce_value = getFile8Bit(file); ei->use_gfx_element = getFile8Bit(file); - ei->gfx_element = getMappedElement(getFile16BitBE(file)); + ei->gfx_element_initial = getMappedElement(getFile16BitBE(file)); ei->collect_score_initial = getFile8Bit(file); ei->collect_count_initial = getFile8Bit(file); @@ -2517,7 +2603,7 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) change->delay_random = getFile16BitBE(file); change->delay_frames = getFile16BitBE(file); - change->trigger_element = getMappedElement(getFile16BitBE(file)); + change->initial_trigger_element = getMappedElement(getFile16BitBE(file)); change->explode = getFile8Bit(file); change->use_target_content = getFile8Bit(file); @@ -2587,7 +2673,7 @@ static int LoadLevel_GRP1(FILE *file, int chunk_size, struct LevelInfo *level) group->num_elements = getFile8Bit(file); ei->use_gfx_element = getFile8Bit(file); - ei->gfx_element = getMappedElement(getFile16BitBE(file)); + ei->gfx_element_initial = getMappedElement(getFile16BitBE(file)); group->choice_mode = getFile8Bit(file); @@ -6239,7 +6325,7 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) /* try to detect and fix "Snake Bite" levels, which are broken with 3.2.0 */ { - int element = EL_CUSTOM_START + 255; + int element = EL_CUSTOM_256; struct ElementInfo *ei = &element_info[element]; struct ElementChangeInfo *change = &ei->change_page[0]; @@ -6259,9 +6345,40 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) change->target_element = EL_PLAYER_1; } + /* try to detect and fix "Zelda II" levels, which are broken with 3.2.5 */ + { + int element = EL_CUSTOM_16; + struct ElementInfo *ei = &element_info[element]; + + /* This is needed to fix a problem that was caused by a bugfix in function + game.c/CheckTriggeredElementChangeExt() introduced with 3.2.5 that + corrects the behaviour when a custom element changes to another custom + element with a higher element number that has change actions defined. + Normally, only one change per frame is allowed for custom elements. + Therefore, it is checked if a custom element already changed in the + current frame; if it did, subsequent changes are suppressed. + Unfortunately, this is only checked for element changes, but not for + change actions, which are still executed. As the function above loops + through all custom elements from lower to higher, an element change + resulting in a lower CE number won't be checked again, while a target + element with a higher number will also be checked, and potential change + actions will get executed for this CE, too (which is wrong), while + further changes are ignored (which is correct). As this bugfix breaks + Zelda II (but no other levels), allow the previous, incorrect behaviour + for this outstanding level set to not break the game or existing tapes */ + + if (strncmp(leveldir_current->identifier, "zelda2", 6) == 0 || + strncmp(ei->description, "scanline - row 1", 16) == 0) + level->use_action_after_change_bug = TRUE; + } + /* not centering level after relocating player was default only in 3.2.3 */ if (level->game_version == VERSION_IDENT(3,2,3,0)) /* (no pre-releases) */ level->shifted_relocation = TRUE; + + /* EM style elements always chain-exploded in R'n'D engine before 3.2.6 */ + if (level->game_version < VERSION_IDENT(3,2,6,0)) + level->em_explodes_by_fire = TRUE; } static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) @@ -6393,6 +6510,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) /* initialize element properties for level editor etc. */ InitElementPropertiesEngine(level->game_version); InitElementPropertiesAfterLoading(level->game_version); + InitElementPropertiesGfxElement(); } static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename) @@ -6771,7 +6889,7 @@ static void SaveLevel_CUS3(FILE *file, struct LevelInfo *level, WriteUnusedBytesToFile(file, 7); putFile8Bit(file, ei->use_gfx_element); - putFile16BitBE(file, ei->gfx_element); + putFile16BitBE(file, ei->gfx_element_initial); putFile8Bit(file, ei->collect_score_initial); putFile8Bit(file, ei->collect_count_initial); @@ -6797,7 +6915,7 @@ static void SaveLevel_CUS3(FILE *file, struct LevelInfo *level, putFile16BitBE(file, ei->change->delay_random); putFile16BitBE(file, ei->change->delay_frames); - putFile16BitBE(file, ei->change->trigger_element); + putFile16BitBE(file, ei->change->initial_trigger_element); putFile8Bit(file, ei->change->explode); putFile8Bit(file, ei->change->use_target_content); @@ -6850,7 +6968,7 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) putFile8Bit(file, ei->use_last_ce_value); putFile8Bit(file, ei->use_gfx_element); - putFile16BitBE(file, ei->gfx_element); + putFile16BitBE(file, ei->gfx_element_initial); putFile8Bit(file, ei->collect_score_initial); putFile8Bit(file, ei->collect_count_initial); @@ -6909,7 +7027,7 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) putFile16BitBE(file, change->delay_random); putFile16BitBE(file, change->delay_frames); - putFile16BitBE(file, change->trigger_element); + putFile16BitBE(file, change->initial_trigger_element); putFile8Bit(file, change->explode); putFile8Bit(file, change->use_target_content); @@ -6961,7 +7079,7 @@ static void SaveLevel_GRP1(FILE *file, struct LevelInfo *level, int element) putFile8Bit(file, group->num_elements); putFile8Bit(file, ei->use_gfx_element); - putFile16BitBE(file, ei->gfx_element); + putFile16BitBE(file, ei->gfx_element_initial); putFile8Bit(file, group->choice_mode); @@ -8013,9 +8131,8 @@ void SaveScore(int nr) #define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 28 #define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 29 #define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 30 -#define SETUP_TOKEN_AUTO_OVERRIDE_ARTWORK 31 -#define NUM_GLOBAL_SETUP_TOKENS 32 +#define NUM_GLOBAL_SETUP_TOKENS 31 /* editor setup */ #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 @@ -8140,10 +8257,9 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_STRING, &si.graphics_set, "graphics_set" }, { TYPE_STRING, &si.sounds_set, "sounds_set" }, { TYPE_STRING, &si.music_set, "music_set" }, - { TYPE_SWITCH, &si.override_level_graphics, "override_level_graphics" }, - { TYPE_SWITCH, &si.override_level_sounds, "override_level_sounds" }, - { TYPE_SWITCH, &si.override_level_music, "override_level_music" }, - { TYPE_SWITCH, &si.auto_override_artwork, "auto_override_artwork" }, + { TYPE_SWITCH3,&si.override_level_graphics, "override_level_graphics" }, + { TYPE_SWITCH3,&si.override_level_sounds, "override_level_sounds" }, + { TYPE_SWITCH3,&si.override_level_music, "override_level_music" }, }; static boolean not_used = FALSE; @@ -8298,7 +8414,6 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->override_level_graphics = FALSE; si->override_level_sounds = FALSE; si->override_level_music = FALSE; - si->auto_override_artwork = FALSE; si->editor.el_boulderdash = TRUE; si->editor.el_emerald_mine = TRUE; @@ -8357,7 +8472,9 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) #if defined(CREATE_SPECIAL_EDITION_RND_JUE) si->handicap = FALSE; si->fullscreen = TRUE; - si->auto_override_artwork = TRUE; + si->override_level_graphics = AUTO; + si->override_level_sounds = AUTO; + si->override_level_music = AUTO; #endif } @@ -9626,9 +9743,9 @@ void LoadHelpTextInfo() } -/* ------------------------------------------------------------------------- * - * convert levels - * ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ +/* convert levels */ +/* ------------------------------------------------------------------------- */ #define MAX_NUM_CONVERT_LEVELS 1000 @@ -9738,3 +9855,165 @@ void ConvertLevels() CloseAllAndExit(0); } + + +/* ------------------------------------------------------------------------- */ +/* create and save images for use in level sketches (raw BMP format) */ +/* ------------------------------------------------------------------------- */ + +void CreateLevelSketchImages() +{ +#if defined(TARGET_SDL) + Bitmap *bitmap1; + Bitmap *bitmap2; + int i; + + InitElementPropertiesGfxElement(); + + bitmap1 = CreateBitmap(TILEX, TILEY, DEFAULT_DEPTH); + bitmap2 = CreateBitmap(MINI_TILEX, MINI_TILEY, DEFAULT_DEPTH); + + for (i = 0; i < NUM_FILE_ELEMENTS; i++) + { + Bitmap *src_bitmap; + int src_x, src_y; + int element = getMappedElement(i); + int graphic = el2edimg(element); + char basename1[16]; + char basename2[16]; + char *filename1; + char *filename2; + + sprintf(basename1, "%03d.bmp", i); + sprintf(basename2, "%03ds.bmp", i); + + 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); + + if (SDL_SaveBMP(bitmap1->surface, filename1) != 0) + Error(ERR_EXIT, "cannot save level sketch image file '%s'", filename1); + + getMiniGraphicSource(graphic, &src_bitmap, &src_x, &src_y); + BlitBitmap(src_bitmap, bitmap2, src_x, src_y, MINI_TILEX, MINI_TILEY, 0, 0); + + if (SDL_SaveBMP(bitmap2->surface, filename2) != 0) + Error(ERR_EXIT, "cannot save level sketch image file '%s'", filename2); + + free(filename1); + free(filename2); + + if (options.debug) + printf("%03d `%03d%c", i, i, (i % 10 < 9 ? ' ' : '\n')); + } + + FreeBitmap(bitmap1); + FreeBitmap(bitmap2); + + if (options.debug) + printf("\n"); + + Error(ERR_INFO, "%d normal and small images created", NUM_FILE_ELEMENTS); + + CloseAllAndExit(0); +#endif +} + + +/* ------------------------------------------------------------------------- */ +/* create and save images for custom and group elements (raw BMP format) */ +/* ------------------------------------------------------------------------- */ + +void CreateCustomElementImages() +{ +#if defined(TARGET_SDL) + char *filename = "graphics.classic/RocksCE.bmp"; + Bitmap *bitmap; + Bitmap *src_bitmap; + int dummy_graphic = IMG_CUSTOM_99; + int yoffset_ce = 0; + int yoffset_ge = (TILEY * NUM_CUSTOM_ELEMENTS / 16); + int src_x, src_y; + int i; + + bitmap = CreateBitmap(TILEX * 16 * 2, + TILEY * (NUM_CUSTOM_ELEMENTS + NUM_GROUP_ELEMENTS) / 16, + DEFAULT_DEPTH); + + getGraphicSource(dummy_graphic, 0, &src_bitmap, &src_x, &src_y); + + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int x = i % 16; + int y = i / 16; + int ii = i + 1; + int j; + + 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); + + for (j = 2; j >= 0; j--) + { + int c = ii % 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, + TILEX * 16 + TILEX * x + 6 + j * 8, + TILEY * y + 10 + yoffset_ce); + + ii /= 10; + } + } + + for (i = 0; i < NUM_GROUP_ELEMENTS; i++) + { + int x = i % 16; + int y = i / 16; + int ii = i + 1; + int j; + + 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); + + for (j = 1; j >= 0; j--) + { + int c = ii % 10; + + BlitBitmap(src_bitmap, bitmap, TILEX + c * 10, 11, 10, 10, + TILEX * x + 6 + j * 10, + TILEY * y + 11 + yoffset_ge); + + BlitBitmap(src_bitmap, bitmap, TILEX + c * 8, TILEY + 12, 6, 10, + TILEX * 16 + TILEX * x + 10 + j * 8, + TILEY * y + 10 + yoffset_ge); + + ii /= 10; + } + } + + if (SDL_SaveBMP(bitmap->surface, filename) != 0) + Error(ERR_EXIT, "cannot save CE graphics file '%s'", filename); + + FreeBitmap(bitmap); + + CloseAllAndExit(0); +#endif +} + +#if 0 +void CreateLevelSketchImages_TEST() +{ + void CreateCustomElementImages() +} +#endif diff --git a/src/files.h b/src/files.h index 51509f8c..75dc3460 100644 --- a/src/files.h +++ b/src/files.h @@ -68,6 +68,7 @@ void LoadMusicInfo(); void LoadHelpAnimInfo(); void LoadHelpTextInfo(); -void ConvertLevels(void); +void ConvertLevels(); +void CreateLevelSketchImages(); #endif /* FILES_H */ diff --git a/src/game.c b/src/game.c index 708c0510..d4e4cf3f 100644 --- a/src/game.c +++ b/src/game.c @@ -58,9 +58,37 @@ #define USE_FIX_KILLED_BY_NON_WALKABLE (USE_NEW_STUFF * 1) #define USE_FIX_IMPACT_COLLISION (USE_NEW_STUFF * 1) +#define USE_FIX_CE_ACTION_WITH_PLAYER (USE_NEW_STUFF * 1) +#define USE_FIX_NO_ACTION_AFTER_CHANGE (USE_NEW_STUFF * 1) + +#define USE_PLAYER_REANIMATION (USE_NEW_STUFF * 1) #define USE_GFX_RESET_WHEN_NOT_MOVING (USE_NEW_STUFF * 1) +#define USE_NEW_PLAYER_ASSIGNMENTS (USE_NEW_STUFF * 1) + +#define USE_DELAYED_GFX_REDRAW (USE_NEW_STUFF * 0) + +#if USE_DELAYED_GFX_REDRAW +#define TEST_DrawLevelField(x, y) \ + GfxRedraw[x][y] |= GFX_REDRAW_TILE +#define TEST_DrawLevelFieldCrumbledSand(x, y) \ + GfxRedraw[x][y] |= GFX_REDRAW_TILE_CRUMBLED +#define TEST_DrawLevelFieldCrumbledSandNeighbours(x, y) \ + GfxRedraw[x][y] |= GFX_REDRAW_TILE_CRUMBLED_NEIGHBOURS +#define TEST_DrawTwinkleOnField(x, y) \ + GfxRedraw[x][y] |= GFX_REDRAW_TILE_TWINKLED +#else +#define TEST_DrawLevelField(x, y) \ + DrawLevelField(x, y) +#define TEST_DrawLevelFieldCrumbledSand(x, y) \ + DrawLevelFieldCrumbledSand(x, y) +#define TEST_DrawLevelFieldCrumbledSandNeighbours(x, y) \ + DrawLevelFieldCrumbledSandNeighbours(x, y) +#define TEST_DrawTwinkleOnField(x, y) \ + DrawTwinkleOnField(x, y) +#endif + /* for DigField() */ #define DF_NO_PUSH 0 @@ -1033,7 +1061,10 @@ static boolean MovePlayer(struct PlayerInfo *, int, int); static void ScrollPlayer(struct PlayerInfo *, int); static void ScrollScreen(struct PlayerInfo *, int); -int DigField(struct PlayerInfo *, int, int, int, int, int, int, int); +static int DigField(struct PlayerInfo *, int, int, int, int, int, int, int); +static boolean DigFieldByCE(int, int, int); +static boolean SnapField(struct PlayerInfo *, int, int); +static boolean DropElement(struct PlayerInfo *); static void InitBeltMovement(void); static void CloseAllOpenTimegates(void); @@ -1100,14 +1131,12 @@ void TestIfBadThingRunsIntoPlayer(int, int, int); void TestIfFriendTouchesBadThing(int, int); void TestIfBadThingTouchesFriend(int, int); void TestIfBadThingTouchesOtherBadThing(int, int); +void TestIfGoodThingGetsHitByBadThing(int, int, int); void KillPlayer(struct PlayerInfo *); void BuryPlayer(struct PlayerInfo *); void RemovePlayer(struct PlayerInfo *); -boolean SnapField(struct PlayerInfo *, int, int); -boolean DropElement(struct PlayerInfo *); - static int getInvisibleActiveFromInvisibleElement(int); static int getInvisibleFromInvisibleActiveElement(int); @@ -1140,6 +1169,8 @@ static int recursion_loop_depth; static boolean recursion_loop_detected; static boolean recursion_loop_element; +static int map_player_action[MAX_PLAYERS]; + /* ------------------------------------------------------------------------- */ /* definition of elements that automatically change to other elements after */ @@ -1698,6 +1729,7 @@ static void InitPlayerField(int x, int y, int element, boolean init_game) } else { + stored_player[0].initial_element = element; stored_player[0].use_murphy = TRUE; if (!level.use_artwork_element[0]) @@ -1756,6 +1788,17 @@ static void InitPlayerField(int x, int y, int element, boolean init_game) player->jx = player->last_jx = x; player->jy = player->last_jy = y; } + +#if USE_PLAYER_REANIMATION + if (!init_game) + { + int player_nr = GET_PLAYER_NR(element); + struct PlayerInfo *player = &stored_player[player_nr]; + + if (player->active && player->killed) + player->reanimated = TRUE; /* if player was just killed, reanimate him */ + } +#endif } static void InitField(int x, int y, boolean init_game) @@ -1943,6 +1986,34 @@ static void InitField(int x, int y, boolean init_game) Feld[x][y] = EL_EMC_MAGIC_BALL_SWITCH_ACTIVE; break; + case EL_TRIGGER_PLAYER: + case EL_TRIGGER_ELEMENT: + case EL_TRIGGER_CE_VALUE: + case EL_TRIGGER_CE_SCORE: + case EL_SELF: + case EL_ANY_ELEMENT: + case EL_CURRENT_CE_VALUE: + case EL_CURRENT_CE_SCORE: + case EL_PREV_CE_1: + case EL_PREV_CE_2: + case EL_PREV_CE_3: + case EL_PREV_CE_4: + case EL_PREV_CE_5: + case EL_PREV_CE_6: + case EL_PREV_CE_7: + case EL_PREV_CE_8: + case EL_NEXT_CE_1: + case EL_NEXT_CE_2: + case EL_NEXT_CE_3: + case EL_NEXT_CE_4: + case EL_NEXT_CE_5: + case EL_NEXT_CE_6: + case EL_NEXT_CE_7: + case EL_NEXT_CE_8: + /* reference elements should not be used on the playfield */ + Feld[x][y] = EL_EMPTY; + break; + default: if (IS_CUSTOM_ELEMENT(element)) { @@ -2383,35 +2454,38 @@ void UpdateGameControlValues() if (gpc->type == TYPE_ELEMENT) { - int last_anim_random_frame = gfx.anim_random_frame; - int element = gpc->value; - int graphic = el2panelimg(element); - - if (gpc->value != gpc->last_value) - { - gpc->gfx_frame = 0; - gpc->gfx_random = INIT_GFX_RANDOM(); - } - else + if (gpc->value != EL_UNDEFINED && gpc->value != EL_EMPTY) { - gpc->gfx_frame++; + int last_anim_random_frame = gfx.anim_random_frame; + int element = gpc->value; + int graphic = el2panelimg(element); - if (ANIM_MODE(graphic) == ANIM_RANDOM && - IS_NEXT_FRAME(gpc->gfx_frame, graphic)) + if (gpc->value != gpc->last_value) + { + gpc->gfx_frame = 0; gpc->gfx_random = INIT_GFX_RANDOM(); - } + } + else + { + gpc->gfx_frame++; + + if (ANIM_MODE(graphic) == ANIM_RANDOM && + IS_NEXT_FRAME(gpc->gfx_frame, graphic)) + gpc->gfx_random = INIT_GFX_RANDOM(); + } - if (ANIM_MODE(graphic) == ANIM_RANDOM) - gfx.anim_random_frame = gpc->gfx_random; + if (ANIM_MODE(graphic) == ANIM_RANDOM) + gfx.anim_random_frame = gpc->gfx_random; - if (ANIM_MODE(graphic) == ANIM_CE_SCORE) - gpc->gfx_frame = element_info[element].collect_score; + if (ANIM_MODE(graphic) == ANIM_CE_SCORE) + gpc->gfx_frame = element_info[element].collect_score; - gpc->frame = getGraphicAnimationFrame(el2panelimg(gpc->value), - gpc->gfx_frame); + gpc->frame = getGraphicAnimationFrame(el2panelimg(gpc->value), + gpc->gfx_frame); - if (ANIM_MODE(graphic) == ANIM_RANDOM) - gfx.anim_random_frame = last_anim_random_frame; + if (ANIM_MODE(graphic) == ANIM_RANDOM) + gfx.anim_random_frame = last_anim_random_frame; + } } } } @@ -3313,7 +3387,7 @@ static void InitGameEngine() SET_PROPERTY(ch_delay->element, EP_CAN_CHANGE_OR_HAS_ACTION, TRUE); } - /* ---------- initialize internal run-time variables ------------- */ + /* ---------- initialize internal run-time variables --------------------- */ for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) { @@ -3351,6 +3425,27 @@ static void InitGameEngine() } } +#if 1 + /* ---------- initialize reference elements in change conditions --------- */ + + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + struct ElementInfo *ei = &element_info[element]; + + for (j = 0; j < ei->num_change_pages; j++) + { + int trigger_element = ei->change_page[j].initial_trigger_element; + + if (trigger_element >= EL_PREV_CE_8 && + trigger_element <= EL_NEXT_CE_8) + trigger_element = RESOLVED_REFERENCE_ELEMENT(element, trigger_element); + + ei->change_page[j].trigger_element = trigger_element; + } + } +#endif + /* ---------- initialize run-time trigger player and element ------------- */ for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) @@ -3360,8 +3455,8 @@ static void InitGameEngine() for (j = 0; j < ei->num_change_pages; j++) { ei->change_page[j].actual_trigger_element = EL_EMPTY; - ei->change_page[j].actual_trigger_player = EL_PLAYER_1; - ei->change_page[j].actual_trigger_player_bits = CH_PLAYER_1; + ei->change_page[j].actual_trigger_player = EL_EMPTY; + ei->change_page[j].actual_trigger_player_bits = CH_PLAYER_NONE; ei->change_page[j].actual_trigger_side = CH_SIDE_NONE; ei->change_page[j].actual_trigger_ce_value = 0; ei->change_page[j].actual_trigger_ce_score = 0; @@ -3589,6 +3684,11 @@ void InitGame() boolean emulate_sp = TRUE; /* unless non-SUPAPLEX elements found */ #if 0 boolean do_fading = (game_status == GAME_MODE_MAIN); +#endif +#if 1 + int initial_move_dir = MV_DOWN; +#else + int initial_move_dir = MV_NONE; #endif int i, j, x, y; @@ -3610,7 +3710,10 @@ void InitGame() player->present = FALSE; player->active = FALSE; + player->mapped = FALSE; + player->killed = FALSE; + player->reanimated = FALSE; player->action = 0; player->effective_action = 0; @@ -3634,18 +3737,19 @@ void InitGame() player->dynabombs_left = 0; player->dynabomb_xl = FALSE; - player->MovDir = MV_NONE; + player->MovDir = initial_move_dir; player->MovPos = 0; player->GfxPos = 0; - player->GfxDir = MV_NONE; + player->GfxDir = initial_move_dir; player->GfxAction = ACTION_DEFAULT; player->Frame = 0; player->StepFrame = 0; - player->use_murphy = FALSE; + player->initial_element = player->element_nr; player->artwork_element = (level.use_artwork_element[i] ? level.artwork_element[i] : player->element_nr); + player->use_murphy = FALSE; player->block_last_field = FALSE; /* initialized in InitPlayerField() */ player->block_delay_adjustment = 0; /* initialized in InitPlayerField() */ @@ -3658,7 +3762,7 @@ void InitGame() player->step_counter = 0; - player->last_move_dir = MV_NONE; + player->last_move_dir = initial_move_dir; player->is_active = FALSE; @@ -3682,7 +3786,7 @@ void InitGame() player->anim_delay_counter = 0; player->post_delay_counter = 0; - player->dir_waiting = MV_NONE; + player->dir_waiting = initial_move_dir; player->action_waiting = ACTION_DEFAULT; player->last_action_waiting = ACTION_DEFAULT; player->special_action_bored = ACTION_DEFAULT; @@ -3715,6 +3819,26 @@ void InitGame() player->inventory_infinite_element = EL_UNDEFINED; player->inventory_size = 0; + if (level.use_initial_inventory[i]) + { + for (j = 0; j < level.initial_inventory_size[i]; j++) + { + int element = level.initial_inventory_content[i][j]; + int collect_count = element_info[element].collect_count_initial; + int k; + + if (!IS_CUSTOM_ELEMENT(element)) + collect_count = 1; + + if (collect_count == 0) + player->inventory_infinite_element = element; + else + for (k = 0; k < collect_count; k++) + if (player->inventory_size < MAX_INVENTORY_SIZE) + player->inventory_element[player->inventory_size++] = element; + } + } + DigField(player, 0, 0, 0, 0, 0, 0, DF_NO_PUSH); SnapField(player, 0, 0); @@ -3728,6 +3852,8 @@ void InitGame() player->LevelSolved_SaveScore = FALSE; player->LevelSolved_CountingTime = 0; player->LevelSolved_CountingScore = 0; + + map_player_action[i] = i; } network_player_action_received = FALSE; @@ -3831,6 +3957,7 @@ void InitGame() GfxElement[x][y] = EL_UNDEFINED; GfxAction[x][y] = ACTION_DEFAULT; GfxDir[x][y] = MV_NONE; + GfxRedraw[x][y] = GFX_REDRAW_NONE; } SCAN_PLAYFIELD(x, y) @@ -3919,6 +4046,124 @@ void InitGame() if (game.belt_dir[i] == MV_NONE) game.belt_dir_nr[i] = 3; /* not moving, next moving left */ +#if USE_NEW_PLAYER_ASSIGNMENTS + /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */ + /* choose default local player */ + local_player = &stored_player[0]; + + for (i = 0; i < MAX_PLAYERS; i++) + stored_player[i].connected = FALSE; + + local_player->connected = TRUE; + /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */ + + if (tape.playing) + { + /* try to guess locally connected team mode players (needed for correct + assignment of player figures from level to locally playing players) */ + + for (i = 0; i < MAX_PLAYERS; i++) + if (tape.player_participates[i]) + stored_player[i].connected = TRUE; + } + else if (setup.team_mode && !options.network) + { + /* try to guess locally connected team mode players (needed for correct + assignment of player figures from level to locally playing players) */ + + for (i = 0; i < MAX_PLAYERS; i++) + if (setup.input[i].use_joystick || + setup.input[i].key.left != KSYM_UNDEFINED) + stored_player[i].connected = TRUE; + } + +#if 0 + for (i = 0; i < MAX_PLAYERS; i++) + printf("::: player %d: %s\n", i, + (stored_player[i].connected ? "connected" : "not connected")); + + for (i = 0; i < MAX_PLAYERS; i++) + printf("::: player %d: %s\n", i, + (stored_player[i].present ? "present" : "not present")); +#endif + + /* check if any connected player was not found in playfield */ + for (i = 0; i < MAX_PLAYERS; i++) + { + struct PlayerInfo *player = &stored_player[i]; + + if (player->connected && !player->present) + { + struct PlayerInfo *field_player = NULL; + +#if 0 + printf("::: looking for field player for player %d ...\n", i); +#endif + + /* assign first free player found that is present in the playfield */ + + /* first try: look for unmapped playfield player that is not connected */ + if (field_player == NULL) + for (j = 0; j < MAX_PLAYERS; j++) + if (stored_player[j].present && + !stored_player[j].mapped && + !stored_player[j].connected) + field_player = &stored_player[j]; + + /* second try: look for *any* unmapped playfield player */ + if (field_player == NULL) + for (j = 0; j < MAX_PLAYERS; j++) + if (stored_player[j].present && + !stored_player[j].mapped) + field_player = &stored_player[j]; + + if (field_player != NULL) + { + int jx = field_player->jx, jy = field_player->jy; + +#if 0 + printf("::: found player figure %d\n", field_player->index_nr); +#endif + + player->present = FALSE; + player->active = FALSE; + + field_player->present = TRUE; + field_player->active = TRUE; + + /* + player->initial_element = field_player->initial_element; + player->artwork_element = field_player->artwork_element; + + player->block_last_field = field_player->block_last_field; + player->block_delay_adjustment = field_player->block_delay_adjustment; + */ + + StorePlayer[jx][jy] = field_player->element_nr; + + field_player->jx = field_player->last_jx = jx; + field_player->jy = field_player->last_jy = jy; + + if (local_player == player) + local_player = field_player; + + map_player_action[field_player->index_nr] = i; + + field_player->mapped = TRUE; + +#if 0 + printf("::: map_player_action[%d] == %d\n", + field_player->index_nr, i); +#endif + } + } + + if (player->connected && player->present) + player->mapped = TRUE; + } + +#else + /* check if any connected player was not found in playfield */ for (i = 0; i < MAX_PLAYERS; i++) { @@ -3928,24 +4173,26 @@ void InitGame() { for (j = 0; j < MAX_PLAYERS; j++) { - struct PlayerInfo *some_player = &stored_player[j]; - int jx = some_player->jx, jy = some_player->jy; + struct PlayerInfo *field_player = &stored_player[j]; + int jx = field_player->jx, jy = field_player->jy; /* assign first free player found that is present in the playfield */ - if (some_player->present && !some_player->connected) + if (field_player->present && !field_player->connected) { player->present = TRUE; player->active = TRUE; - some_player->present = FALSE; - some_player->active = FALSE; + field_player->present = FALSE; + field_player->active = FALSE; - player->artwork_element = some_player->artwork_element; + player->initial_element = field_player->initial_element; + player->artwork_element = field_player->artwork_element; - player->block_last_field = some_player->block_last_field; - player->block_delay_adjustment = some_player->block_delay_adjustment; + player->block_last_field = field_player->block_last_field; + player->block_delay_adjustment = field_player->block_delay_adjustment; StorePlayer[jx][jy] = player->element_nr; + player->jx = player->last_jx = jx; player->jy = player->last_jy = jy; @@ -3954,14 +4201,35 @@ void InitGame() } } } +#endif + +#if 0 + printf("::: local_player->present == %d\n", local_player->present); +#endif if (tape.playing) { /* when playing a tape, eliminate all players who do not participate */ +#if USE_NEW_PLAYER_ASSIGNMENTS + for (i = 0; i < MAX_PLAYERS; i++) + { + if (stored_player[i].active && + !tape.player_participates[map_player_action[i]]) + { + struct PlayerInfo *player = &stored_player[i]; + int jx = player->jx, jy = player->jy; + + player->active = FALSE; + StorePlayer[jx][jy] = 0; + Feld[jx][jy] = EL_EMPTY; + } + } +#else for (i = 0; i < MAX_PLAYERS; i++) { - if (stored_player[i].active && !tape.player_participates[i]) + if (stored_player[i].active && + !tape.player_participates[i]) { struct PlayerInfo *player = &stored_player[i]; int jx = player->jx, jy = player->jy; @@ -3971,6 +4239,7 @@ void InitGame() Feld[jx][jy] = EL_EMPTY; } } +#endif } else if (!options.network && !setup.team_mode) /* && !tape.playing */ { @@ -4001,9 +4270,15 @@ void InitGame() /* when recording the game, store which players take part in the game */ if (tape.recording) { +#if USE_NEW_PLAYER_ASSIGNMENTS + for (i = 0; i < MAX_PLAYERS; i++) + if (stored_player[i].connected) + tape.player_participates[i] = TRUE; +#else for (i = 0; i < MAX_PLAYERS; i++) if (stored_player[i].active) tape.player_participates[i] = TRUE; +#endif } if (options.debug) @@ -5061,6 +5336,10 @@ static void RemoveField(int x, int y) GfxElement[x][y] = EL_UNDEFINED; GfxAction[x][y] = ACTION_DEFAULT; GfxDir[x][y] = MV_NONE; +#if 0 + /* !!! this would prevent the removed tile from being redrawn !!! */ + GfxRedraw[x][y] = GFX_REDRAW_NONE; +#endif } void RemoveMovingField(int x, int y) @@ -5086,7 +5365,7 @@ void RemoveMovingField(int x, int y) Store[oldx][oldy] = Store2[oldx][oldy] = 0; - DrawLevelField(oldx, oldy); + TEST_DrawLevelField(oldx, oldy); return; } @@ -5115,8 +5394,8 @@ void RemoveMovingField(int x, int y) if (next_element != EL_UNDEFINED) Feld[oldx][oldy] = next_element; - DrawLevelField(oldx, oldy); - DrawLevelField(newx, newy); + TEST_DrawLevelField(oldx, oldy); + TEST_DrawLevelField(newx, newy); } void DrawDynamite(int x, int y) @@ -5224,8 +5503,6 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, if (quick_relocation) { - int offset = game.scroll_delay_value; - if (!IN_VIS_FIELD(SCREENX(x), SCREENY(y)) || center_screen) { if (!level.shifted_relocation || center_screen) @@ -5266,8 +5543,47 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, } else { +#if 1 + if (!level.shifted_relocation || center_screen) + { + /* quick relocation (without scrolling), with centering of screen */ + + scroll_x = (x < SBX_Left + MIDPOSX ? SBX_Left : + x > SBX_Right + MIDPOSX ? SBX_Right : + x - MIDPOSX); + + scroll_y = (y < SBY_Upper + MIDPOSY ? SBY_Upper : + y > SBY_Lower + MIDPOSY ? SBY_Lower : + y - MIDPOSY); + } + else + { + /* quick relocation (without scrolling), but do not center screen */ + + int center_scroll_x = (old_x < SBX_Left + MIDPOSX ? SBX_Left : + old_x > SBX_Right + MIDPOSX ? SBX_Right : + old_x - MIDPOSX); + + int center_scroll_y = (old_y < SBY_Upper + MIDPOSY ? SBY_Upper : + old_y > SBY_Lower + MIDPOSY ? SBY_Lower : + old_y - MIDPOSY); + + int offset_x = x + (scroll_x - center_scroll_x); + int offset_y = y + (scroll_y - center_scroll_y); + + scroll_x = (offset_x < SBX_Left + MIDPOSX ? SBX_Left : + offset_x > SBX_Right + MIDPOSX ? SBX_Right : + offset_x - MIDPOSX); + + scroll_y = (offset_y < SBY_Upper + MIDPOSY ? SBY_Upper : + offset_y > SBY_Lower + MIDPOSY ? SBY_Lower : + offset_y - MIDPOSY); + } +#else /* quick relocation (without scrolling), inside visible screen area */ + int offset = game.scroll_delay_value; + if ((move_dir == MV_LEFT && scroll_x > x - MIDPOSX + offset) || (move_dir == MV_RIGHT && scroll_x < x - MIDPOSX - offset)) scroll_x = x - MIDPOSX + (scroll_x < x - MIDPOSX ? -offset : +offset); @@ -5283,6 +5599,7 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, /* don't scroll over playfield boundaries */ if (scroll_y < SBY_Upper || scroll_y > SBY_Lower) scroll_y = (scroll_y < SBY_Upper ? SBY_Upper : SBY_Lower); +#endif } RedrawPlayfield(TRUE, 0,0,0,0); @@ -5467,6 +5784,21 @@ void RelocatePlayer(int jx, int jy, int el_player_raw) CheckTriggeredElementChangeByPlayer(jx, jy, element, CE_PLAYER_ENTERS_X, player->index_bit, enter_side); + +#if 1 + if (player->is_switching) + { + /* ensure that relocation while still switching an element does not cause + a new element to be treated as also switched directly after relocation + (this is important for teleporter switches that teleport the player to + a place where another teleporter switch is in the same direction, which + would then incorrectly be treated as immediately switched before the + direction key that caused the switch was released) */ + + player->switch_x += jx - old_jx; + player->switch_y += jy - old_jy; + } +#endif } void Explode(int ex, int ey, int phase, int mode) @@ -5779,12 +6111,12 @@ void Explode(int ex, int ey, int phase, int mode) InitField_WithBug2(x, y, FALSE); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); TestIfElementTouchesCustomElement(x, y); if (GFX_CRUMBLED(element)) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); if (IS_PLAYER(x, y) && !PLAYERINFO(x, y)->present) StorePlayer[x][y] = 0; @@ -5798,7 +6130,7 @@ void Explode(int ex, int ey, int phase, int mode) int frame = getGraphicAnimationFrame(graphic, GfxFrame[x][y]); if (phase == delay) - DrawLevelFieldCrumbledSand(x, y); + TEST_DrawLevelFieldCrumbledSand(x, y); if (IS_WALKABLE_OVER(Back[x][y]) && Back[x][y] != EL_EMPTY) { @@ -5875,8 +6207,12 @@ void Bang(int x, int y) { struct PlayerInfo *player = PLAYERINFO(x, y); +#if USE_FIX_CE_ACTION_WITH_PLAYER + element = Feld[x][y] = player->initial_element; +#else element = Feld[x][y] = (player->use_murphy ? EL_SP_MURPHY : player->element_nr); +#endif if (level.use_explosion_element[player->index_nr]) { @@ -6101,7 +6437,7 @@ static void ToggleBeltSwitch(int x, int y) if (e_belt_nr == belt_nr) { Feld[xx][yy] = belt_base_switch_element[belt_nr] + belt_dir_nr; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } } else if (IS_BELT(element) && belt_dir != MV_NONE) @@ -6113,7 +6449,7 @@ static void ToggleBeltSwitch(int x, int y) int belt_part = Feld[xx][yy] - belt_base_element[belt_nr]; Feld[xx][yy] = belt_base_active_element[belt_nr] + belt_part; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } } else if (IS_BELT_ACTIVE(element) && belt_dir == MV_NONE) @@ -6125,7 +6461,7 @@ static void ToggleBeltSwitch(int x, int y) int belt_part = Feld[xx][yy] - belt_base_active_element[belt_nr]; Feld[xx][yy] = belt_base_element[belt_nr] + belt_part; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } } } @@ -6146,34 +6482,34 @@ static void ToggleSwitchgateSwitch(int x, int y) element == EL_SWITCHGATE_SWITCH_DOWN) { Feld[xx][yy] = EL_SWITCHGATE_SWITCH_UP + game.switchgate_pos; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } else if (element == EL_DC_SWITCHGATE_SWITCH_UP || element == EL_DC_SWITCHGATE_SWITCH_DOWN) { Feld[xx][yy] = EL_DC_SWITCHGATE_SWITCH_UP + game.switchgate_pos; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } #else if (element == EL_SWITCHGATE_SWITCH_UP) { Feld[xx][yy] = EL_SWITCHGATE_SWITCH_DOWN; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } else if (element == EL_SWITCHGATE_SWITCH_DOWN) { Feld[xx][yy] = EL_SWITCHGATE_SWITCH_UP; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } else if (element == EL_DC_SWITCHGATE_SWITCH_UP) { Feld[xx][yy] = EL_DC_SWITCHGATE_SWITCH_DOWN; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } else if (element == EL_DC_SWITCHGATE_SWITCH_DOWN) { Feld[xx][yy] = EL_DC_SWITCHGATE_SWITCH_UP; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } #endif else if (element == EL_SWITCHGATE_OPEN || @@ -6221,25 +6557,25 @@ static void RedrawAllLightSwitchesAndInvisibleElements() game.light_time_left > 0) { Feld[x][y] = EL_LIGHT_SWITCH_ACTIVE; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_LIGHT_SWITCH_ACTIVE && game.light_time_left == 0) { Feld[x][y] = EL_LIGHT_SWITCH; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_EMC_DRIPPER && game.light_time_left > 0) { Feld[x][y] = EL_EMC_DRIPPER_ACTIVE; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_EMC_DRIPPER_ACTIVE && game.light_time_left == 0) { Feld[x][y] = EL_EMC_DRIPPER; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_INVISIBLE_STEELWALL || element == EL_INVISIBLE_WALL || @@ -6248,11 +6584,11 @@ static void RedrawAllLightSwitchesAndInvisibleElements() if (game.light_time_left > 0) Feld[x][y] = getInvisibleActiveFromInvisibleElement(element); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); /* uncrumble neighbour fields, if needed */ if (element == EL_INVISIBLE_SAND) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); } else if (element == EL_INVISIBLE_STEELWALL_ACTIVE || element == EL_INVISIBLE_WALL_ACTIVE || @@ -6261,11 +6597,11 @@ static void RedrawAllLightSwitchesAndInvisibleElements() if (game.light_time_left == 0) Feld[x][y] = getInvisibleFromInvisibleActiveElement(element); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); /* re-crumble neighbour fields, if needed */ if (element == EL_INVISIBLE_SAND) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); } } } @@ -6282,13 +6618,13 @@ static void RedrawAllInvisibleElementsForLenses() game.lenses_time_left > 0) { Feld[x][y] = EL_EMC_DRIPPER_ACTIVE; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_EMC_DRIPPER_ACTIVE && game.lenses_time_left == 0) { Feld[x][y] = EL_EMC_DRIPPER; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_INVISIBLE_STEELWALL || element == EL_INVISIBLE_WALL || @@ -6297,11 +6633,11 @@ static void RedrawAllInvisibleElementsForLenses() if (game.lenses_time_left > 0) Feld[x][y] = getInvisibleActiveFromInvisibleElement(element); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); /* uncrumble neighbour fields, if needed */ if (element == EL_INVISIBLE_SAND) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); } else if (element == EL_INVISIBLE_STEELWALL_ACTIVE || element == EL_INVISIBLE_WALL_ACTIVE || @@ -6310,11 +6646,11 @@ static void RedrawAllInvisibleElementsForLenses() if (game.lenses_time_left == 0) Feld[x][y] = getInvisibleFromInvisibleActiveElement(element); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); /* re-crumble neighbour fields, if needed */ if (element == EL_INVISIBLE_SAND) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); } } } @@ -6331,13 +6667,13 @@ static void RedrawAllInvisibleElementsForMagnifier() game.magnify_time_left > 0) { Feld[x][y] = EL_EMC_FAKE_GRASS_ACTIVE; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_EMC_FAKE_GRASS_ACTIVE && game.magnify_time_left == 0) { Feld[x][y] = EL_EMC_FAKE_GRASS; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (IS_GATE_GRAY(element) && game.magnify_time_left > 0) @@ -6348,8 +6684,10 @@ static void RedrawAllInvisibleElementsForMagnifier() element - EL_EM_GATE_1_GRAY + EL_EM_GATE_1_GRAY_ACTIVE : IS_EMC_GATE_GRAY(element) ? element - EL_EMC_GATE_5_GRAY + EL_EMC_GATE_5_GRAY_ACTIVE : + IS_DC_GATE_GRAY(element) ? + EL_DC_GATE_WHITE_GRAY_ACTIVE : element); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (IS_GATE_GRAY_ACTIVE(element) && game.magnify_time_left == 0) @@ -6360,8 +6698,10 @@ static void RedrawAllInvisibleElementsForMagnifier() element - EL_EM_GATE_1_GRAY_ACTIVE + EL_EM_GATE_1_GRAY : IS_EMC_GATE_GRAY_ACTIVE(element) ? element - EL_EMC_GATE_5_GRAY_ACTIVE + EL_EMC_GATE_5_GRAY : + IS_DC_GATE_GRAY_ACTIVE(element) ? + EL_DC_GATE_WHITE_GRAY : element); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } } } @@ -6398,7 +6738,7 @@ static void ActivateTimegateSwitch(int x, int y) else if (element == EL_TIMEGATE_SWITCH_ACTIVE) { Feld[xx][yy] = EL_TIMEGATE_SWITCH; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } */ @@ -6440,7 +6780,7 @@ void Impact(int x, int y) RemoveMovingField(x, y + 1); Feld[x][y + 1] = EL_QUICKSAND_EMPTY; Feld[x][y + 2] = EL_ROCK; - DrawLevelField(x, y + 2); + TEST_DrawLevelField(x, y + 2); object_hit = TRUE; } @@ -6450,7 +6790,7 @@ void Impact(int x, int y) RemoveMovingField(x, y + 1); Feld[x][y + 1] = EL_QUICKSAND_FAST_EMPTY; Feld[x][y + 2] = EL_ROCK; - DrawLevelField(x, y + 2); + TEST_DrawLevelField(x, y + 2); object_hit = TRUE; } @@ -6474,7 +6814,7 @@ void Impact(int x, int y) el_act_dir2img(element, GfxAction[x][y], MV_DOWN) != el2img(element)) { ResetGfxAnimation(x, y); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } if (impact && CAN_EXPLODE_IMPACT(element)) @@ -6948,7 +7288,7 @@ inline static void TurnRoundExt(int x, int y) { Feld[move_x][move_y] = EL_EMC_SPRING_BUMPER_ACTIVE; ResetGfxAnimation(move_x, move_y); - DrawLevelField(move_x, move_y); + TEST_DrawLevelField(move_x, move_y); MovDir[x][y] = back_dir; } @@ -7587,6 +7927,33 @@ void StartMoving(int x, int y) Store[x][y + 1] = Store[x][y]; Store[x][y] = 0; + PlayLevelSoundAction(x, y, ACTION_FILLING); + } + else if (Feld[x][y + 1] == EL_QUICKSAND_FAST_EMPTY) + { + if (!MovDelay[x][y]) + { + MovDelay[x][y] = TILEY + 1; + + ResetGfxAnimation(x, y); + ResetGfxAnimation(x, y + 1); + } + + if (MovDelay[x][y]) + { + DrawLevelElement(x, y, EL_QUICKSAND_EMPTYING); + DrawLevelElement(x, y + 1, EL_QUICKSAND_FAST_FILLING); + + MovDelay[x][y]--; + if (MovDelay[x][y]) + return; + } + + Feld[x][y] = EL_QUICKSAND_EMPTY; + Feld[x][y + 1] = EL_QUICKSAND_FAST_FULL; + Store[x][y + 1] = Store[x][y]; + Store[x][y] = 0; + PlayLevelSoundAction(x, y, ACTION_FILLING); } } @@ -7632,6 +7999,33 @@ void StartMoving(int x, int y) Store[x][y + 1] = Store[x][y]; Store[x][y] = 0; + PlayLevelSoundAction(x, y, ACTION_FILLING); + } + else if (Feld[x][y + 1] == EL_QUICKSAND_EMPTY) + { + if (!MovDelay[x][y]) + { + MovDelay[x][y] = TILEY + 1; + + ResetGfxAnimation(x, y); + ResetGfxAnimation(x, y + 1); + } + + if (MovDelay[x][y]) + { + DrawLevelElement(x, y, EL_QUICKSAND_FAST_EMPTYING); + DrawLevelElement(x, y + 1, EL_QUICKSAND_FILLING); + + MovDelay[x][y]--; + if (MovDelay[x][y]) + return; + } + + Feld[x][y] = EL_QUICKSAND_FAST_EMPTY; + Feld[x][y + 1] = EL_QUICKSAND_FULL; + Store[x][y + 1] = Store[x][y]; + Store[x][y] = 0; + PlayLevelSoundAction(x, y, ACTION_FILLING); } } @@ -7999,7 +8393,7 @@ void StartMoving(int x, int y) element == EL_SP_SNIKSNAK || element == EL_SP_ELECTRON || element == EL_MOLE)) - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } } @@ -8033,7 +8427,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); PlayLevelSoundActionIfLoop(x, y, ACTION_ATTACKING); @@ -8073,7 +8467,7 @@ void StartMoving(int x, int y) if (IN_SCR_FIELD(sx, sy)) { - DrawLevelFieldCrumbledSand(xx, yy); + TEST_DrawLevelFieldCrumbledSand(xx, yy); DrawGraphic(sx, sy, flame_graphic, frame); } } @@ -8081,7 +8475,7 @@ void StartMoving(int x, int y) { if (Feld[xx][yy] == EL_FLAMES) Feld[xx][yy] = EL_EMPTY; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } } } @@ -8124,7 +8518,7 @@ void StartMoving(int x, int y) Feld[newx][newy] == EL_EM_STEEL_EXIT_OPEN) { RemoveField(x, y); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); PlayLevelSound(newx, newy, SND_PENGUIN_PASSING); if (IN_SCR_FIELD(SCREENX(newx), SCREENY(newy))) @@ -8140,7 +8534,7 @@ void StartMoving(int x, int y) else if (IS_FOOD_PENGUIN(Feld[newx][newy])) { if (DigField(local_player, x, y, newx, newy, 0,0, DF_DIG) == MP_MOVING) - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); else GfxDir[x][y] = MovDir[x][y] = MV_NONE; } @@ -8151,7 +8545,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); return; } @@ -8165,7 +8559,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); } PlayLevelSound(x, y, SND_PIG_DIGGING); @@ -8175,7 +8569,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); return; } @@ -8254,7 +8648,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); PlayLevelSoundAction(x, y, ACTION_DIGGING); } @@ -8265,7 +8659,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); #endif return; @@ -8274,6 +8668,10 @@ void StartMoving(int x, int y) else if (IS_CUSTOM_ELEMENT(element) && CUSTOM_ELEMENT_CAN_ENTER_FIELD(element, newx, newy)) { +#if 1 + if (!DigFieldByCE(newx, newy, element)) + return; +#else int new_element = Feld[newx][newy]; if (!IS_FREE(newx, newy)) @@ -8302,7 +8700,7 @@ void StartMoving(int x, int y) else { RemoveField(newx, newy); - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); } /* if digged element was about to explode, prevent the explosion */ @@ -8312,6 +8710,7 @@ void StartMoving(int x, int y) } Store[newx][newy] = EL_EMPTY; + #if 1 /* this makes it possible to leave the removed element again */ if (IS_EQUAL_OR_IN_GROUP(new_element, MOVE_ENTER_EL(element))) @@ -8325,6 +8724,8 @@ void StartMoving(int x, int y) Store[newx][newy] = (move_leave_element == EL_TRIGGER_ELEMENT ? new_element : move_leave_element); } +#endif + #endif if (move_pattern & MV_MAZE_RUNNER_STYLE) @@ -8340,7 +8741,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); return; } @@ -8367,7 +8768,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); PlayLevelSound(x, y, SND_DRAGON_ATTACKING); @@ -8405,7 +8806,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); } PlayLevelSound(x, y, SND_YAMYAM_DIGGING); @@ -8436,7 +8837,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); } PlayLevelSound(x, y, SND_DARK_YAMYAM_DIGGING); @@ -8459,7 +8860,7 @@ void StartMoving(int x, int y) ResetGfxAnimation(x, y); GfxAction[x][y] = ACTION_DIGGING; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); MovDelay[newx][newy] = 0; /* start amoeba shrinking delay */ @@ -8468,7 +8869,7 @@ void StartMoving(int x, int y) else /* element == EL_PACMAN */ { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + TEST_DrawLevelField(newx, newy); PlayLevelSound(x, y, SND_PACMAN_DIGGING); } } @@ -8550,7 +8951,7 @@ void ContinueMoving(int x, int y) GfxAction[x][y], GfxDir[x][y], GfxFrame[x][y]); #endif - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); return; /* element is still moving */ } @@ -8569,7 +8970,7 @@ void ContinueMoving(int x, int y) { Feld[x][y] = EL_SAND; - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); } else if (element == EL_QUICKSAND_FILLING) { @@ -8736,7 +9137,7 @@ void ContinueMoving(int x, int y) InitField(x, y, FALSE); if (GFX_CRUMBLED(Feld[x][y])) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); if (ELEM_IS_PLAYER(move_leave_element)) RelocatePlayer(x, y, move_leave_element); @@ -8752,8 +9153,8 @@ void ContinueMoving(int x, int y) element_info[element].move_pattern == MV_WHEN_DROPPED))) GfxDir[x][y] = MovDir[newx][newy] = 0; - DrawLevelField(x, y); - DrawLevelField(newx, newy); + TEST_DrawLevelField(x, y); + TEST_DrawLevelField(newx, newy); Stop[newx][newy] = TRUE; /* ignore this element until the next frame */ @@ -8798,7 +9199,12 @@ void ContinueMoving(int x, int y) else if (element == EL_PENGUIN) TestIfFriendTouchesBadThing(newx, newy); - /* give the player one last chance (one more frame) to move away */ + if (DONT_GET_HIT_BY(element)) + { + TestIfGoodThingGetsHitByBadThing(newx, newy, direction); + } + + /* give the player one last chance (one more frame) to move away */ if (CAN_FALL(element) && direction == MV_DOWN && (last_line || (!IS_FREE(x, newy + 1) && (!IS_PLAYER(x, newy + 1) || @@ -9015,7 +9421,7 @@ void AmoebeUmwandelnBD(int ax, int ay, int new_element) AmoebaNr[x][y] = 0; Feld[x][y] = new_element; InitField(x, y, FALSE); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); done = TRUE; } } @@ -9057,7 +9463,7 @@ void AmoebeWaechst(int x, int y) { Feld[x][y] = Store[x][y]; Store[x][y] = 0; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } } } @@ -9089,7 +9495,7 @@ void AmoebaDisappearing(int x, int y) if (!MovDelay[x][y]) { Feld[x][y] = EL_EMPTY; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); /* don't let mole enter this field in this cycle; (give priority to objects falling to this field from above) */ @@ -9116,7 +9522,7 @@ void AmoebeAbleger(int ax, int ay) if (!level.amoeba_speed && element != EL_EMC_DRIPPER) { Feld[ax][ay] = EL_AMOEBA_DEAD; - DrawLevelField(ax, ay); + TEST_DrawLevelField(ax, ay); return; } @@ -9186,7 +9592,7 @@ void AmoebeAbleger(int ax, int ay) if (i == 4 && (!waiting_for_player || element == EL_BD_AMOEBA)) { Feld[ax][ay] = EL_AMOEBA_DEAD; - DrawLevelField(ax, ay); + TEST_DrawLevelField(ax, ay); AmoebaCnt[AmoebaNr[ax][ay]]--; if (AmoebaCnt[AmoebaNr[ax][ay]] <= 0) /* amoeba is completely dead */ @@ -9250,7 +9656,7 @@ void AmoebeAbleger(int ax, int ay) return; } - DrawLevelField(newax, neway); + TEST_DrawLevelField(newax, neway); } void Life(int ax, int ay) @@ -9308,7 +9714,7 @@ void Life(int ax, int ay) { Feld[xx][yy] = EL_EMPTY; if (!Stop[xx][yy]) - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); Stop[xx][yy] = TRUE; changed = TRUE; } @@ -9321,7 +9727,7 @@ void Life(int ax, int ay) Feld[xx][yy] = element; MovDelay[xx][yy] = (element == EL_GAME_OF_LIFE ? 0 : life_time-1); if (!Stop[xx][yy]) - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); Stop[xx][yy] = TRUE; changed = TRUE; } @@ -9585,28 +9991,28 @@ void MauerWaechst(int x, int y) if (MovDir[x][y] == MV_LEFT) { if (IN_LEV_FIELD(x - 1, y) && IS_WALL(Feld[x - 1][y])) - DrawLevelField(x - 1, y); + TEST_DrawLevelField(x - 1, y); } else if (MovDir[x][y] == MV_RIGHT) { if (IN_LEV_FIELD(x + 1, y) && IS_WALL(Feld[x + 1][y])) - DrawLevelField(x + 1, y); + TEST_DrawLevelField(x + 1, y); } else if (MovDir[x][y] == MV_UP) { if (IN_LEV_FIELD(x, y - 1) && IS_WALL(Feld[x][y - 1])) - DrawLevelField(x, y - 1); + TEST_DrawLevelField(x, y - 1); } else { if (IN_LEV_FIELD(x, y + 1) && IS_WALL(Feld[x][y + 1])) - DrawLevelField(x, y + 1); + TEST_DrawLevelField(x, y + 1); } Feld[x][y] = Store[x][y]; Store[x][y] = 0; GfxDir[x][y] = MovDir[x][y] = MV_NONE; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } } } @@ -9697,7 +10103,7 @@ void MauerAbleger(int ax, int ay) } if (element == EL_EXPANDABLE_WALL && (links_frei || rechts_frei)) - DrawLevelField(ax, ay); + TEST_DrawLevelField(ax, ay); if (!IN_LEV_FIELD(ax, ay-1) || IS_WALL(Feld[ax][ay-1])) oben_massiv = TRUE; @@ -9815,7 +10221,7 @@ void MauerAblegerStahl(int ax, int ay) element == EL_EXPANDABLE_STEELWALL_HORIZONTAL) && ((links_massiv && rechts_massiv) || element == EL_EXPANDABLE_STEELWALL_VERTICAL)) - Feld[ax][ay] = EL_WALL; + Feld[ax][ay] = EL_STEELWALL; if (new_wall) PlayLevelSoundAction(ax, ay, ACTION_GROWING); @@ -9861,7 +10267,7 @@ void CheckForDragon(int x, int y) if (IN_LEV_FIELD(xx, yy) && Feld[xx][yy] == EL_FLAMES) { Feld[xx][yy] = EL_EMPTY; - DrawLevelField(xx, yy); + TEST_DrawLevelField(xx, yy); } else break; @@ -9925,7 +10331,7 @@ static void ChangeActiveTrap(int x, int y) /* if new animation frame was drawn, correct crumbled sand border */ if (IS_NEW_FRAME(GfxFrame[x][y], graphic)) - DrawLevelFieldCrumbledSand(x, y); + TEST_DrawLevelFieldCrumbledSand(x, y); } static int getSpecialActionElement(int element, int number, int base_element) @@ -9959,6 +10365,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) int action_type = change->action_type; int action_mode = change->action_mode; int action_arg = change->action_arg; + int action_element = change->action_element; int i; if (!change->has_action) @@ -9970,11 +10377,21 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) (level.time > 0 ? TimeLeft : TimePlayed); - int action_arg_element = + int action_arg_element_raw = (action_arg == CA_ARG_PLAYER_TRIGGER ? change->actual_trigger_player : action_arg == CA_ARG_ELEMENT_TRIGGER ? change->actual_trigger_element : action_arg == CA_ARG_ELEMENT_TARGET ? change->target_element : + action_arg == CA_ARG_ELEMENT_ACTION ? change->action_element : + action_arg == CA_ARG_INVENTORY_RM_TRIGGER ? change->actual_trigger_element: + action_arg == CA_ARG_INVENTORY_RM_TARGET ? change->target_element : + action_arg == CA_ARG_INVENTORY_RM_ACTION ? change->action_element : EL_EMPTY); + int action_arg_element = GetElementFromGroupElement(action_arg_element_raw); + +#if 0 + if (action_arg_element_raw == EL_GROUP_START) + printf("::: %d,%d: %d ('%s')\n", x, y, element, EL_NAME(element)); +#endif int action_arg_direction = (action_arg >= CA_ARG_DIRECTION_LEFT && @@ -10031,10 +10448,13 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) action_arg == CA_ARG_NUMBER_LEVEL_SCORE ? local_player->score : action_arg == CA_ARG_ELEMENT_CV_TARGET ? GET_NEW_CE_VALUE(target_element): action_arg == CA_ARG_ELEMENT_CV_TRIGGER ? change->actual_trigger_ce_value: + action_arg == CA_ARG_ELEMENT_CV_ACTION ? GET_NEW_CE_VALUE(action_element): action_arg == CA_ARG_ELEMENT_CS_TARGET ? GET_CE_SCORE(target_element) : action_arg == CA_ARG_ELEMENT_CS_TRIGGER ? change->actual_trigger_ce_score: + action_arg == CA_ARG_ELEMENT_CS_ACTION ? GET_CE_SCORE(action_element) : action_arg == CA_ARG_ELEMENT_NR_TARGET ? change->target_element : action_arg == CA_ARG_ELEMENT_NR_TRIGGER ? change->actual_trigger_element : + action_arg == CA_ARG_ELEMENT_NR_ACTION ? change->action_element : -1); int action_arg_number_old = @@ -10051,7 +10471,9 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) action_arg_number_min, action_arg_number_max); #if 1 - int trigger_player_bits = change->actual_trigger_player_bits; + int trigger_player_bits = + (change->actual_trigger_player_bits != CH_PLAYER_NONE ? + change->actual_trigger_player_bits : change->trigger_player); #else int trigger_player_bits = (change->actual_trigger_player >= EL_PLAYER_1 && @@ -10064,6 +10486,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) (action_arg >= CA_ARG_PLAYER_1 && action_arg <= CA_ARG_PLAYER_4 ? action_arg - CA_ARG_PLAYER : action_arg == CA_ARG_PLAYER_TRIGGER ? trigger_player_bits : + action_arg == CA_ARG_PLAYER_ACTION ? 1 << GET_PLAYER_NR(action_element) : PLAYER_BITS_ANY); /* ---------- execute action -------------------------------------------- */ @@ -10165,6 +10588,33 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) break; } + case CA_SET_LEVEL_RANDOM_SEED: + { +#if 1 + /* ensure that setting a new random seed while playing is predictable */ + InitRND(action_arg_number_new ? action_arg_number_new : RND(1000000) + 1); +#else + InitRND(action_arg_number_new); +#endif + +#if 0 + printf("::: %d -> %d\n", action_arg_number_new, RND(10)); +#endif + +#if 0 + { + int i; + + printf("::: "); + for (i = 0; i < 9; i++) + printf("%d, ", RND(2)); + printf("\n"); + } +#endif + + break; + } + /* ---------- player actions ------------------------------------------ */ case CA_MOVE_PLAYER: @@ -10219,6 +10669,10 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) case CA_SET_PLAYER_SPEED: { +#if 0 + printf("::: trigger_player_bits == %d\n", trigger_player_bits); +#endif + for (i = 0; i < MAX_PLAYERS; i++) { if (trigger_player_bits & (1 << i)) @@ -10336,6 +10790,104 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) break; } + case CA_SET_PLAYER_INVENTORY: + { + for (i = 0; i < MAX_PLAYERS; i++) + { + struct PlayerInfo *player = &stored_player[i]; + int j, k; + + if (trigger_player_bits & (1 << i)) + { + int inventory_element = action_arg_element; + + if (action_arg == CA_ARG_ELEMENT_TARGET || + action_arg == CA_ARG_ELEMENT_TRIGGER || + action_arg == CA_ARG_ELEMENT_ACTION) + { + int element = inventory_element; + int collect_count = element_info[element].collect_count_initial; + + if (!IS_CUSTOM_ELEMENT(element)) + collect_count = 1; + + if (collect_count == 0) + player->inventory_infinite_element = element; + else + for (k = 0; k < collect_count; k++) + if (player->inventory_size < MAX_INVENTORY_SIZE) + player->inventory_element[player->inventory_size++] = + element; + } + else if (action_arg == CA_ARG_INVENTORY_RM_TARGET || + action_arg == CA_ARG_INVENTORY_RM_TRIGGER || + action_arg == CA_ARG_INVENTORY_RM_ACTION) + { + if (player->inventory_infinite_element != EL_UNDEFINED && + IS_EQUAL_OR_IN_GROUP(player->inventory_infinite_element, + action_arg_element_raw)) + player->inventory_infinite_element = EL_UNDEFINED; + + for (k = 0, j = 0; j < player->inventory_size; j++) + { + if (!IS_EQUAL_OR_IN_GROUP(player->inventory_element[j], + action_arg_element_raw)) + player->inventory_element[k++] = player->inventory_element[j]; + } + + player->inventory_size = k; + } + else if (action_arg == CA_ARG_INVENTORY_RM_FIRST) + { + if (player->inventory_size > 0) + { + for (j = 0; j < player->inventory_size - 1; j++) + player->inventory_element[j] = player->inventory_element[j + 1]; + + player->inventory_size--; + } + } + else if (action_arg == CA_ARG_INVENTORY_RM_LAST) + { + if (player->inventory_size > 0) + player->inventory_size--; + } + else if (action_arg == CA_ARG_INVENTORY_RM_ALL) + { + player->inventory_infinite_element = EL_UNDEFINED; + player->inventory_size = 0; + } + else if (action_arg == CA_ARG_INVENTORY_RESET) + { + player->inventory_infinite_element = EL_UNDEFINED; + player->inventory_size = 0; + + if (level.use_initial_inventory[i]) + { + for (j = 0; j < level.initial_inventory_size[i]; j++) + { + int element = level.initial_inventory_content[i][j]; + int collect_count = element_info[element].collect_count_initial; + + if (!IS_CUSTOM_ELEMENT(element)) + collect_count = 1; + + if (collect_count == 0) + player->inventory_infinite_element = element; + else + for (k = 0; k < collect_count; k++) + if (player->inventory_size < MAX_INVENTORY_SIZE) + player->inventory_element[player->inventory_size++] = + element; + } + } + } + } + } + + break; + } + /* ---------- CE actions ---------------------------------------------- */ case CA_SET_CE_VALUE: @@ -10404,6 +10956,38 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) break; } + case CA_SET_CE_ARTWORK: + { + int artwork_element = action_arg_element; + boolean reset_frame = FALSE; + int xx, yy; + + if (action_arg == CA_ARG_ELEMENT_RESET) + artwork_element = (ei->use_gfx_element ? ei->gfx_element_initial : + element); + + if (ei->gfx_element != artwork_element) + reset_frame = TRUE; + + ei->gfx_element = artwork_element; + + SCAN_PLAYFIELD(xx, yy) + { + if (Feld[xx][yy] == element) + { + if (reset_frame) + { + ResetGfxAnimation(xx, yy); + ResetRandomAnimationValue(xx, yy); + } + + TEST_DrawLevelField(xx, yy); + } + } + + break; + } + /* ---------- engine actions ------------------------------------------ */ case CA_SET_ENGINE_SCAN_MODE: @@ -10480,10 +11064,10 @@ static void CreateFieldExt(int x, int y, int element, boolean is_change) ResetRandomAnimationValue(x, y); #endif - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); if (GFX_CRUMBLED(new_element)) - DrawLevelFieldCrumbledSandNeighbours(x, y); + TEST_DrawLevelFieldCrumbledSandNeighbours(x, y); } #if 1 @@ -10563,8 +11147,8 @@ static boolean ChangeElement(int x, int y, int element, int page) { /* reset actual trigger element, trigger player and action element */ change->actual_trigger_element = EL_EMPTY; - change->actual_trigger_player = EL_PLAYER_1; - change->actual_trigger_player_bits = CH_PLAYER_1; + change->actual_trigger_player = EL_EMPTY; + change->actual_trigger_player_bits = CH_PLAYER_NONE; change->actual_trigger_side = CH_SIDE_NONE; change->actual_trigger_ce_value = 0; change->actual_trigger_ce_score = 0; @@ -10724,6 +11308,7 @@ static void HandleElementChange(int x, int y, int page) int element = MovingOrBlocked2Element(x, y); struct ElementInfo *ei = &element_info[element]; struct ElementChangeInfo *change = &ei->change_page[page]; + boolean handle_action_before_change = FALSE; #ifdef DEBUG if (!CAN_CHANGE_OR_HAS_ACTION(element) && @@ -10806,6 +11391,15 @@ static void HandleElementChange(int x, int y, int page) return; } +#if 1 + /* special case: set new level random seed before changing element */ + if (change->has_action && change->action_type == CA_SET_LEVEL_RANDOM_SEED) + handle_action_before_change = TRUE; + + if (change->has_action && handle_action_before_change) + ExecuteCustomElementAction(x, y, element, page); +#endif + if (change->can_change) { if (ChangeElement(x, y, element, page)) @@ -10815,7 +11409,7 @@ static void HandleElementChange(int x, int y, int page) } } - if (change->has_action) + if (change->has_action && !handle_action_before_change) ExecuteCustomElementAction(x, y, element, page); } } @@ -10951,6 +11545,11 @@ static boolean CheckTriggeredElementChangeExt(int trigger_x, int trigger_y, change->actual_trigger_ce_value = CustomValue[trigger_x][trigger_y]; change->actual_trigger_ce_score = GET_CE_SCORE(trigger_element); +#if 0 + printf("::: TRIGGERED CHANGE FOUND: %d ['%s'], %d\n", + element, EL_NAME(element), p); +#endif + if ((change->can_change && !change_done) || change->has_action) { int x, y; @@ -10961,6 +11560,21 @@ static boolean CheckTriggeredElementChangeExt(int trigger_x, int trigger_y, { if (change->can_change && !change_done) { +#if USE_FIX_NO_ACTION_AFTER_CHANGE + /* if element already changed in this frame, not only prevent + another element change (checked in ChangeElement()), but + also prevent additional element actions for this element */ + + if (ChangeCount[x][y] >= game.max_num_changes_per_frame && + !level.use_action_after_change_bug) + continue; +#endif + +#if 0 + printf("::: TRIGGERED CHANGE FOUND: %d ['%s'], %d -- CHANGE\n", + element, EL_NAME(element), p); +#endif + ChangeDelay[x][y] = 1; ChangeEvent[x][y] = trigger_event; @@ -10969,6 +11583,22 @@ static boolean CheckTriggeredElementChangeExt(int trigger_x, int trigger_y, #if USE_NEW_DELAYED_ACTION else if (change->has_action) { +#if USE_FIX_NO_ACTION_AFTER_CHANGE + /* if element already changed in this frame, not only prevent + another element change (checked in ChangeElement()), but + also prevent additional element actions for this element */ + + if (ChangeCount[x][y] >= game.max_num_changes_per_frame && + !level.use_action_after_change_bug) + continue; +#endif + + +#if 0 + printf("::: TRIGGERED CHANGE FOUND: %d ['%s'], %d -- ACTION\n", + element, EL_NAME(element), p); +#endif + ExecuteCustomElementAction(x, y, element, p); PlayLevelSoundElementAction(x, y, element, ACTION_PAGE_1 + p); } @@ -10986,6 +11616,12 @@ static boolean CheckTriggeredElementChangeExt(int trigger_x, int trigger_y, { change_done = TRUE; change_done_any = TRUE; + +#if 0 + printf("::: TRIGGERED CHANGE FOUND: %d ['%s'], %d -- DONE\n", + element, EL_NAME(element), p); +#endif + } } } @@ -11040,6 +11676,10 @@ static boolean CheckElementChangeExt(int x, int y, RECURSION_LOOP_DETECTION_START(trigger_element, FALSE); +#if 0 + printf("::: X: trigger_player_bits == %d\n", trigger_player); +#endif + for (p = 0; p < element_info[element].num_change_pages; p++) { struct ElementChangeInfo *change = &element_info[element].change_page[p]; @@ -11565,7 +12205,7 @@ void GameActions() } if (game.restart_level) - StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE); + StartGameActions(options.network, setup.autorecord, level.random_seed); if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { @@ -11685,6 +12325,18 @@ void GameActions() if (tape.recording) TapeRecordAction(tape_action); +#if USE_NEW_PLAYER_ASSIGNMENTS + { + byte mapped_action[MAX_PLAYERS]; + + for (i = 0; i < MAX_PLAYERS; i++) + mapped_action[i] = stored_player[map_player_action[i]].effective_action; + + for (i = 0; i < MAX_PLAYERS; i++) + stored_player[i].effective_action = mapped_action[i]; + } +#endif + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { GameActions_EM_Main(); @@ -11851,7 +12503,7 @@ void GameActions_RND() if (MovDelay[x][y] <= 0) { RemoveField(x, y); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); TestIfElementTouchesCustomElement(x, y); /* for empty space */ } @@ -11885,7 +12537,7 @@ void GameActions_RND() if (GfxAction[x][y] == ACTION_PUSHING && !IS_MOVING(x, y)) { ResetGfxAnimation(x, y); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } #if DEBUG @@ -12020,7 +12672,7 @@ void GameActions_RND() DrawLevelGraphicAnimationIfNeeded(x, y, graphic); if (IS_GEM(element) || element == EL_SP_INFOTRON) - DrawTwinkleOnField(x, y); + TEST_DrawTwinkleOnField(x, y); } else if (IS_MOVING(x, y)) ContinueMoving(x, y); @@ -12155,7 +12807,7 @@ void GameActions_RND() DrawLevelGraphicAnimationIfNeeded(x, y, graphic); if (IS_GEM(element) || element == EL_SP_INFOTRON) - DrawTwinkleOnField(x, y); + TEST_DrawTwinkleOnField(x, y); } else if ((element == EL_ACID || element == EL_EXIT_OPEN || @@ -12340,19 +12992,19 @@ void GameActions_RND() element == EL_MAGIC_WALL_FULL) { Feld[x][y] = EL_MAGIC_WALL_DEAD; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_BD_MAGIC_WALL_ACTIVE || element == EL_BD_MAGIC_WALL_FULL) { Feld[x][y] = EL_BD_MAGIC_WALL_DEAD; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_DC_MAGIC_WALL_ACTIVE || element == EL_DC_MAGIC_WALL_FULL) { Feld[x][y] = EL_DC_MAGIC_WALL_DEAD; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } } @@ -12406,6 +13058,36 @@ void GameActions_RND() } } +#if USE_DELAYED_GFX_REDRAW + SCAN_PLAYFIELD(x, y) + { +#if 1 + if (GfxRedraw[x][y] != GFX_REDRAW_NONE) +#else + if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)) && + GfxRedraw[x][y] != GFX_REDRAW_NONE) +#endif + { + /* !!! PROBLEM: THIS REDRAWS THE PLAYFIELD _AFTER_ THE SCAN, BUT TILES + !!! MAY HAVE CHANGED AFTER BEING DRAWN DURING PLAYFIELD SCAN !!! */ + + if (GfxRedraw[x][y] & GFX_REDRAW_TILE) + DrawLevelField(x, y); + + if (GfxRedraw[x][y] & GFX_REDRAW_TILE_CRUMBLED) + DrawLevelFieldCrumbledSand(x, y); + + if (GfxRedraw[x][y] & GFX_REDRAW_TILE_CRUMBLED_NEIGHBOURS) + DrawLevelFieldCrumbledSandNeighbours(x, y); + + if (GfxRedraw[x][y] & GFX_REDRAW_TILE_TWINKLED) + DrawTwinkleOnField(x, y); + } + + GfxRedraw[x][y] = GFX_REDRAW_NONE; + } +#endif + CheckLevelTime(); DrawAllPlayers(); @@ -12490,12 +13172,13 @@ static boolean AllPlayersInVisibleScreen() void ScrollLevel(int dx, int dy) { -#if 1 +#if 0 + /* (directly solved in BlitBitmap() now) */ static Bitmap *bitmap_db_field2 = NULL; int softscroll_offset = (setup.soft_scrolling ? TILEX : 0); int x, y; #else - int i, x, y; + int x, y; #endif #if 0 @@ -12505,7 +13188,8 @@ void ScrollLevel(int dx, int dy) return; #endif -#if 1 +#if 0 + /* (directly solved in BlitBitmap() now) */ if (bitmap_db_field2 == NULL) bitmap_db_field2 = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); @@ -12963,7 +13647,7 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) else if (old_jx == jx && old_jy != jy) player->MovDir = (old_jy < jy ? MV_DOWN : MV_UP); - DrawLevelField(jx, jy); /* for "crumbled sand" */ + TEST_DrawLevelField(jx, jy); /* for "crumbled sand" */ player->last_move_dir = player->MovDir; player->is_moving = TRUE; @@ -13108,8 +13792,14 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) if (Feld[jx][jy] == EL_EXIT_OPEN || Feld[jx][jy] == EL_EM_EXIT_OPEN || +#if 1 + Feld[jx][jy] == EL_EM_EXIT_OPENING || +#endif Feld[jx][jy] == EL_STEEL_EXIT_OPEN || Feld[jx][jy] == EL_EM_STEEL_EXIT_OPEN || +#if 1 + Feld[jx][jy] == EL_EM_STEEL_EXIT_OPENING || +#endif Feld[jx][jy] == EL_SP_EXIT_OPEN || Feld[jx][jy] == EL_SP_EXIT_OPENING) /* <-- special case */ { @@ -13148,8 +13838,13 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) CE_PLAYER_ENTERS_X, player->index_bit, enter_side); +#if USE_FIX_CE_ACTION_WITH_PLAYER + CheckTriggeredElementChangeBySide(jx, jy, player->initial_element, + CE_MOVE_OF_X, move_direction); +#else CheckTriggeredElementChangeBySide(jx, jy, player->element_nr, CE_MOVE_OF_X, move_direction); +#endif } if (game.engine_version >= VERSION_IDENT(3,0,7,0)) @@ -13276,7 +13971,7 @@ void TestIfPlayerTouchesCustomElement(int x, int y) if (!IN_LEV_FIELD(xx, yy)) continue; - if (IS_PLAYER(x, y)) + if (IS_PLAYER(x, y)) /* player found at center element */ { struct PlayerInfo *player = PLAYERINFO(x, y); @@ -13294,8 +13989,21 @@ void TestIfPlayerTouchesCustomElement(int x, int y) CheckTriggeredElementChangeByPlayer(xx, yy, border_element, CE_PLAYER_TOUCHES_X, player->index_bit, border_side); + +#if USE_FIX_CE_ACTION_WITH_PLAYER + { + /* use player element that is initially defined in the level playfield, + not the player element that corresponds to the runtime player number + (example: a level that contains EL_PLAYER_3 as the only player would + incorrectly give EL_PLAYER_1 for "player->element_nr") */ + int player_element = PLAYERINFO(x, y)->initial_element; + + CheckElementChangeBySide(xx, yy, border_element, player_element, + CE_TOUCHING_X, border_side); + } +#endif } - else if (IS_PLAYER(xx, yy)) + else if (IS_PLAYER(xx, yy)) /* player found at border element */ { struct PlayerInfo *player = PLAYERINFO(xx, yy); @@ -13310,6 +14018,20 @@ void TestIfPlayerTouchesCustomElement(int x, int y) CheckTriggeredElementChangeByPlayer(x, y, center_element, CE_PLAYER_TOUCHES_X, player->index_bit, center_side); + +#if USE_FIX_CE_ACTION_WITH_PLAYER + { + /* use player element that is initially defined in the level playfield, + not the player element that corresponds to the runtime player number + (example: a level that contains EL_PLAYER_3 as the only player would + incorrectly give EL_PLAYER_1 for "player->element_nr") */ + int player_element = PLAYERINFO(xx, yy)->initial_element; + + CheckElementChangeBySide(x, y, center_element, player_element, + CE_TOUCHING_X, center_side); + } +#endif + break; } } @@ -13382,10 +14104,14 @@ void TestIfElementTouchesCustomElement(int x, int y) /* check for change of border element */ CheckElementChangeBySide(xx, yy, border_element, center_element, CE_TOUCHING_X, center_side); + + /* (center element cannot be player, so we dont have to check this here) */ } for (i = 0; i < NUM_DIRECTIONS; i++) { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; int border_side = trigger_sides[i][1]; int border_element = border_element_old[i]; @@ -13397,6 +14123,20 @@ void TestIfElementTouchesCustomElement(int x, int y) change_center_element = CheckElementChangeBySide(x, y, center_element, border_element, CE_TOUCHING_X, border_side); + +#if USE_FIX_CE_ACTION_WITH_PLAYER + if (IS_PLAYER(xx, yy)) + { + /* use player element that is initially defined in the level playfield, + not the player element that corresponds to the runtime player number + (example: a level that contains EL_PLAYER_3 as the only player would + incorrectly give EL_PLAYER_1 for "player->element_nr") */ + int player_element = PLAYERINFO(xx, yy)->initial_element; + + CheckElementChangeBySide(x, y, center_element, player_element, + CE_TOUCHING_X, border_side); + } +#endif } } @@ -13494,11 +14234,25 @@ void TestIfElementHitsCustomElement(int x, int y, int direction) CheckElementChangeBySide(x, y, hitting_element, touched_element, CE_HITTING_X, touched_side); - CheckElementChangeBySide(hitx, hity, touched_element, - hitting_element, CE_HIT_BY_X, hitting_side); + CheckElementChangeBySide(hitx, hity, touched_element, hitting_element, + CE_HIT_BY_X, hitting_side); CheckElementChangeBySide(hitx, hity, touched_element, hitting_element, CE_HIT_BY_SOMETHING, opposite_direction); + +#if USE_FIX_CE_ACTION_WITH_PLAYER + if (IS_PLAYER(hitx, hity)) + { + /* use player element that is initially defined in the level playfield, + not the player element that corresponds to the runtime player number + (example: a level that contains EL_PLAYER_3 as the only player would + incorrectly give EL_PLAYER_1 for "player->element_nr") */ + int player_element = PLAYERINFO(hitx, hity)->initial_element; + + CheckElementChangeBySide(x, y, hitting_element, player_element, + CE_HITTING_X, touched_side); + } +#endif } } @@ -13671,6 +14425,7 @@ void TestIfBadThingHitsGoodThing(int bad_x, int bad_y, int bad_move_dir) test_x = bad_x + test_xy[i][0]; test_y = bad_y + test_xy[i][1]; + if (!IN_LEV_FIELD(test_x, test_y)) continue; @@ -13701,12 +14456,14 @@ void TestIfBadThingHitsGoodThing(int bad_x, int bad_y, int bad_move_dir) kill_x = test_x; kill_y = test_y; + break; } else if (test_element == EL_PENGUIN) { kill_x = test_x; kill_y = test_y; + break; } } @@ -13729,6 +14486,63 @@ void TestIfBadThingHitsGoodThing(int bad_x, int bad_y, int bad_move_dir) } } +void TestIfGoodThingGetsHitByBadThing(int bad_x, int bad_y, int bad_move_dir) +{ + int bad_element = Feld[bad_x][bad_y]; + int dx = (bad_move_dir == MV_LEFT ? -1 : bad_move_dir == MV_RIGHT ? +1 : 0); + int dy = (bad_move_dir == MV_UP ? -1 : bad_move_dir == MV_DOWN ? +1 : 0); + int test_x = bad_x + dx, test_y = bad_y + dy; + int test_move_dir, test_element; + int kill_x = -1, kill_y = -1; + + if (!IN_LEV_FIELD(test_x, test_y)) + return; + + test_move_dir = + (IS_MOVING(test_x, test_y) ? MovDir[test_x][test_y] : MV_NONE); + + test_element = Feld[test_x][test_y]; + + if (test_move_dir != bad_move_dir) + { + /* good thing can be player or penguin that does not move away */ + if (IS_PLAYER(test_x, test_y)) + { + struct PlayerInfo *player = PLAYERINFO(test_x, test_y); + + /* (note: in comparison to DONT_RUN_TO and DONT_TOUCH, also handle the + player as being hit when he is moving towards the bad thing, because + the "get hit by" condition would be lost after the player stops) */ + if (player->MovPos != 0 && player->MovDir == bad_move_dir) + return; /* player moves away from bad thing */ + + kill_x = test_x; + kill_y = test_y; + } + else if (test_element == EL_PENGUIN) + { + kill_x = test_x; + kill_y = test_y; + } + } + + if (kill_x != -1 || kill_y != -1) + { + if (IS_PLAYER(kill_x, kill_y)) + { + struct PlayerInfo *player = PLAYERINFO(kill_x, kill_y); + + if (player->shield_deadly_time_left > 0 && + !IS_INDESTRUCTIBLE(bad_element)) + Bang(bad_x, bad_y); + else if (!PLAYER_ENEMY_PROTECTED(kill_x, kill_y)) + KillPlayer(player); + } + else + Bang(kill_x, kill_y); + } +} + void TestIfPlayerTouchesBadThing(int x, int y) { TestIfGoodThingHitsBadThing(x, y, MV_NONE); @@ -13800,6 +14614,11 @@ void KillPlayer(struct PlayerInfo *player) if (!player->active) return; +#if 0 + printf("::: 0: killed == %d, active == %d, reanimated == %d\n", + player->killed, player->active, player->reanimated); +#endif + /* the following code was introduced to prevent an infinite loop when calling -> Bang() -> CheckTriggeredElementChangeExt() @@ -13824,8 +14643,31 @@ void KillPlayer(struct PlayerInfo *player) player->shield_normal_time_left = 0; player->shield_deadly_time_left = 0; +#if 0 + printf("::: 1: killed == %d, active == %d, reanimated == %d\n", + player->killed, player->active, player->reanimated); +#endif + Bang(jx, jy); + +#if 0 + printf("::: 2: killed == %d, active == %d, reanimated == %d\n", + player->killed, player->active, player->reanimated); +#endif + +#if USE_PLAYER_REANIMATION +#if 1 + if (player->reanimated) /* killed player may have been reanimated */ + player->killed = player->reanimated = FALSE; + else + BuryPlayer(player); +#else + if (player->killed) /* player may have been reanimated */ + BuryPlayer(player); +#endif +#else BuryPlayer(player); +#endif } static void KillPlayerUnlessEnemyProtected(int x, int y) @@ -13866,7 +14708,7 @@ void RemovePlayer(struct PlayerInfo *player) StorePlayer[jx][jy] = 0; if (player->is_moving) - DrawLevelField(player->last_jx, player->last_jy); + TEST_DrawLevelField(player->last_jx, player->last_jy); for (i = 0; i < MAX_PLAYERS; i++) if (stored_player[i].active) @@ -13937,9 +14779,9 @@ static boolean checkDiagonalPushing(struct PlayerInfo *player, ============================================================================= */ -int DigField(struct PlayerInfo *player, - int oldx, int oldy, int x, int y, - int real_dx, int real_dy, int mode) +static int DigField(struct PlayerInfo *player, + int oldx, int oldy, int x, int y, + int real_dx, int real_dy, int mode) { boolean is_player = (IS_PLAYER(oldx, oldy) || mode != DF_DIG); boolean player_was_pushing = player->is_pushing; @@ -14094,8 +14936,14 @@ int DigField(struct PlayerInfo *player, } else if (element == EL_EXIT_OPEN || element == EL_EM_EXIT_OPEN || +#if 1 + element == EL_EM_EXIT_OPENING || +#endif element == EL_STEEL_EXIT_OPEN || element == EL_EM_STEEL_EXIT_OPEN || +#if 1 + element == EL_EM_STEEL_EXIT_OPENING || +#endif element == EL_SP_EXIT_OPEN || element == EL_SP_EXIT_OPENING) { @@ -14418,8 +15266,10 @@ int DigField(struct PlayerInfo *player, if (!(IN_LEV_FIELD(nextx, nexty) && (IS_FREE(nextx, nexty) || - (Feld[nextx][nexty] == EL_SOKOBAN_FIELD_EMPTY && - IS_SB_ELEMENT(element))))) + (IS_SB_ELEMENT(element) && + Feld[nextx][nexty] == EL_SOKOBAN_FIELD_EMPTY) || + (IS_CUSTOM_ELEMENT(element) && + CUSTOM_ELEMENT_CAN_ENTER_FIELD(element, nextx, nexty))))) return MP_NO_ACTION; if (!checkDiagonalPushing(player, x, y, real_dx, real_dy)) @@ -14439,6 +15289,13 @@ int DigField(struct PlayerInfo *player, return MP_NO_ACTION; } + if (IS_CUSTOM_ELEMENT(element) && + CUSTOM_ELEMENT_CAN_ENTER_FIELD(element, nextx, nexty)) + { + if (!DigFieldByCE(nextx, nexty, element)) + return MP_NO_ACTION; + } + if (IS_SB_ELEMENT(element)) { if (element == EL_SOKOBAN_FIELD_FULL) @@ -14524,7 +15381,7 @@ int DigField(struct PlayerInfo *player, game.robot_wheel_active = TRUE; - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_SP_TERMINAL) { @@ -14579,7 +15436,7 @@ int DigField(struct PlayerInfo *player, local_player->lights_still_needed--; ResetGfxAnimation(x, y); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_TIME_ORB_FULL) { @@ -14599,7 +15456,7 @@ int DigField(struct PlayerInfo *player, } ResetGfxAnimation(x, y); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); } else if (element == EL_EMC_MAGIC_BALL_SWITCH || element == EL_EMC_MAGIC_BALL_SWITCH_ACTIVE) @@ -14681,7 +15538,66 @@ int DigField(struct PlayerInfo *player, return MP_MOVING; } -boolean SnapField(struct PlayerInfo *player, int dx, int dy) +static boolean DigFieldByCE(int x, int y, int digging_element) +{ + int element = Feld[x][y]; + + if (!IS_FREE(x, y)) + { + int action = (IS_DIGGABLE(element) ? ACTION_DIGGING : + IS_COLLECTIBLE(element) ? ACTION_COLLECTING : + ACTION_BREAKING); + + /* no element can dig solid indestructible elements */ + if (IS_INDESTRUCTIBLE(element) && + !IS_DIGGABLE(element) && + !IS_COLLECTIBLE(element)) + return FALSE; + + if (AmoebaNr[x][y] && + (element == EL_AMOEBA_FULL || + element == EL_BD_AMOEBA || + element == EL_AMOEBA_GROWING)) + { + AmoebaCnt[AmoebaNr[x][y]]--; + AmoebaCnt2[AmoebaNr[x][y]]--; + } + + if (IS_MOVING(x, y)) + RemoveMovingField(x, y); + else + { + RemoveField(x, y); + TEST_DrawLevelField(x, y); + } + + /* if digged element was about to explode, prevent the explosion */ + ExplodeField[x][y] = EX_TYPE_NONE; + + PlayLevelSoundAction(x, y, action); + } + + Store[x][y] = EL_EMPTY; + +#if 1 + /* this makes it possible to leave the removed element again */ + if (IS_EQUAL_OR_IN_GROUP(element, MOVE_ENTER_EL(digging_element))) + Store[x][y] = element; +#else + if (IS_EQUAL_OR_IN_GROUP(element, MOVE_ENTER_EL(digging_element))) + { + int move_leave_element = element_info[digging_element].move_leave_element; + + /* this makes it possible to leave the removed element again */ + Store[x][y] = (move_leave_element == EL_TRIGGER_ELEMENT ? + element : move_leave_element); + } +#endif + + return TRUE; +} + +static boolean SnapField(struct PlayerInfo *player, int dx, int dy) { int jx = player->jx, jy = player->jy; int x = jx + dx, y = jy + dy; @@ -14754,14 +15670,14 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) } if (player->MovPos != 0) /* prevent graphic bugs in versions < 2.2.0 */ - DrawLevelField(player->last_jx, player->last_jy); + TEST_DrawLevelField(player->last_jx, player->last_jy); - DrawLevelField(x, y); + TEST_DrawLevelField(x, y); return TRUE; } -boolean DropElement(struct PlayerInfo *player) +static boolean DropElement(struct PlayerInfo *player) { int old_element, new_element; int dropx = player->jx, dropy = player->jy; diff --git a/src/game.h b/src/game.h index f4216805..7a9bf984 100644 --- a/src/game.h +++ b/src/game.h @@ -182,7 +182,10 @@ struct PlayerInfo boolean present; /* player present in level playfield */ boolean connected; /* player connected (locally or via network) */ boolean active; /* player present and connected */ + boolean mapped; /* player already mapped to input device */ + boolean killed; /* player maybe present/active, but killed */ + boolean reanimated; /* player maybe killed, but reanimated */ int index_nr; /* player number (0 to 3) */ int index_bit; /* player number bit (1 << 0 to 1 << 3) */ @@ -190,6 +193,7 @@ struct PlayerInfo int client_nr; /* network client identifier */ byte action; /* action from local input device */ + byte mapped_action; /* action mapped from device to player */ byte effective_action; /* action acknowledged from network server or summarized over all configured input devices when in single player mode */ @@ -202,8 +206,9 @@ struct PlayerInfo int GfxAction; - boolean use_murphy; + int initial_element; /* EL_PLAYER_1 to EL_PLAYER_4 or EL_SP_MURPHY */ int artwork_element; + boolean use_murphy; boolean block_last_field; int block_delay_adjustment; /* needed for different engine versions */ diff --git a/src/init.c b/src/init.c index 9c89ceb5..9dab9371 100644 --- a/src/init.c +++ b/src/init.c @@ -344,6 +344,15 @@ static int getFontBitmapID(int font_nr) special = GFX_SPECIAL_ARG_DOOR; #endif +#if 0 + if (special != -1) + { + printf("%s%s\n", + font_info[font_nr].token_name, + special_suffix_info[special].suffix); + } +#endif + if (special != -1) return font_info[font_nr].special_bitmap_id[special]; else @@ -3144,10 +3153,16 @@ void InitElementPropertiesStatic() EL_SOKOBAN_FIELD_EMPTY, EL_EXIT_OPEN, EL_EM_EXIT_OPEN, +#if 1 + EL_EM_EXIT_OPENING, +#endif EL_SP_EXIT_OPEN, EL_SP_EXIT_OPENING, EL_STEEL_EXIT_OPEN, EL_EM_STEEL_EXIT_OPEN, +#if 1 + EL_EM_STEEL_EXIT_OPENING, +#endif EL_GATE_1, EL_GATE_2, EL_GATE_3, @@ -4849,6 +4864,14 @@ void InitElementPropertiesEngine(int engine_version) -1 }; + static int ep_em_explodes_by_fire[] = + { + EL_EM_DYNAMITE, + EL_EM_DYNAMITE_ACTIVE, + EL_MOLE, + -1 + }; + /* special EM style gems behaviour */ for (i = 0; ep_em_slippery_wall[i] != -1; i++) SET_PROPERTY(ep_em_slippery_wall[i], EP_EM_SLIPPERY_WALL, @@ -4858,6 +4881,11 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL, (level.em_slippery_gems && engine_version > VERSION_IDENT(2,0,1,0))); + + /* special EM style explosion behaviour regarding chain reactions */ + for (i = 0; ep_em_explodes_by_fire[i] != -1; i++) + SET_PROPERTY(ep_em_explodes_by_fire[i], EP_EXPLODES_BY_FIRE, + level.em_explodes_by_fire); } /* this is needed because some graphics depend on element properties */ @@ -4884,6 +4912,18 @@ void InitElementPropertiesAfterLoading(int engine_version) } } +void InitElementPropertiesGfxElement() +{ + int i; + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + { + struct ElementInfo *ei = &element_info[i]; + + ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial : i); + } +} + static void InitGlobal() { int graphic; @@ -4976,6 +5016,7 @@ static void InitGlobal() global.autoplay_leveldir = NULL; global.convert_leveldir = NULL; + global.create_images_dir = NULL; global.frames_per_second = 0; global.fps_slowdown = FALSE; @@ -5157,6 +5198,18 @@ void Execute_Command(char *command) global.convert_level_nr = atoi(str_ptr); /* get level_nr value */ } } + else if (strncmp(command, "create images ", 14) == 0) + { +#if defined(TARGET_SDL) + global.create_images_dir = getStringCopy(&command[14]); + + if (access(global.create_images_dir, W_OK) != 0) + Error(ERR_EXIT, "image target directory '%s' not found or not writable", + global.create_images_dir); +#else + Error(ERR_EXIT, "command only available for SDL target"); +#endif + } #if DEBUG #if defined(TARGET_SDL) @@ -5611,8 +5664,30 @@ static void InitImages() { print_timestamp_init("InitImages"); +#if 0 + printf("::: leveldir_current->identifier == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier); + printf("::: leveldir_current->graphics_path == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path); + printf("::: leveldir_current->graphics_set == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set); + printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n", + leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS)); +#endif + setLevelArtworkDir(artwork.gfx_first); +#if 0 + printf("::: leveldir_current->identifier == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier); + printf("::: leveldir_current->graphics_path == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path); + printf("::: leveldir_current->graphics_set == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set); + printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n", + leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS)); +#endif + #if 0 printf("::: InitImages for '%s' ['%s', '%s'] ['%s', '%s']\n", leveldir_current->identifier, @@ -5736,46 +5811,94 @@ static boolean CheckArtworkConfigForCustomElements(char *filename) return redefined_ce_found; } -static void InitOverrideArtwork() +static boolean CheckArtworkTypeForRedefinedCustomElements(int type) { - boolean init_override_from_setup = TRUE; + char *filename_base, *filename_local; + boolean redefined_ce_found = FALSE; - gfx.override_level_graphics = FALSE; - gfx.override_level_sounds = FALSE; - gfx.override_level_music = FALSE; + setLevelArtworkDir(ARTWORK_FIRST_NODE(artwork, type)); - if (setup.auto_override_artwork) - { - char *filename_base, *filename_local; - boolean redefined_ce_found = FALSE; +#if 0 + printf("::: leveldir_current->identifier == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier); + printf("::: leveldir_current->graphics_path == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path); + printf("::: leveldir_current->graphics_set == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set); + printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n", + leveldir_current == NULL ? "[NULL]" : + LEVELDIR_ARTWORK_SET(leveldir_current, type)); +#endif - /* first look for special artwork configured in level series config */ - filename_base = getCustomArtworkLevelConfigFilename(ARTWORK_TYPE_GRAPHICS); + /* first look for special artwork configured in level series config */ + filename_base = getCustomArtworkLevelConfigFilename(type); - if (fileExists(filename_base)) - redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_base); +#if 0 + printf("::: filename_base == '%s'\n", filename_base); +#endif - filename_local = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS); + if (fileExists(filename_base)) + redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_base); - if (filename_local != NULL && !strEqual(filename_base, filename_local)) - redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_local); + filename_local = getCustomArtworkConfigFilename(type); - if (!redefined_ce_found) - { - gfx.override_level_graphics = TRUE; - gfx.override_level_sounds = TRUE; - gfx.override_level_music = TRUE; +#if 0 + printf("::: filename_local == '%s'\n", filename_local); +#endif - init_override_from_setup = FALSE; - } - } + if (filename_local != NULL && !strEqual(filename_base, filename_local)) + redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_local); + +#if 0 + printf("::: redefined_ce_found == %d\n", redefined_ce_found); +#endif - if (init_override_from_setup) + return redefined_ce_found; +} + +static void InitOverrideArtwork() +{ + boolean redefined_ce_found = FALSE; + + /* to check if this level set redefines any CEs, do not use overriding */ + gfx.override_level_graphics = FALSE; + gfx.override_level_sounds = FALSE; + gfx.override_level_music = FALSE; + + /* now check if this level set has definitions for custom elements */ + if (setup.override_level_graphics == AUTO || + setup.override_level_sounds == AUTO || + setup.override_level_music == AUTO) + redefined_ce_found = + (CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_GRAPHICS) | + CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_SOUNDS) | + CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_MUSIC)); + +#if 0 + printf("::: redefined_ce_found == %d\n", redefined_ce_found); +#endif + + if (redefined_ce_found) { - gfx.override_level_graphics = setup.override_level_graphics; - gfx.override_level_sounds = setup.override_level_sounds; - gfx.override_level_music = setup.override_level_music; + /* this level set has CE definitions: change "AUTO" to "FALSE" */ + gfx.override_level_graphics = (setup.override_level_graphics == TRUE); + gfx.override_level_sounds = (setup.override_level_sounds == TRUE); + gfx.override_level_music = (setup.override_level_music == TRUE); } + else + { + /* this level set has no CE definitions: change "AUTO" to "TRUE" */ + gfx.override_level_graphics = (setup.override_level_graphics != FALSE); + gfx.override_level_sounds = (setup.override_level_sounds != FALSE); + gfx.override_level_music = (setup.override_level_music != FALSE); + } + +#if 0 + printf("::: => %d, %d, %d\n", + gfx.override_level_graphics, + gfx.override_level_sounds, + gfx.override_level_music); +#endif } static char *getNewArtworkIdentifier(int type) @@ -6108,6 +6231,11 @@ void OpenAll() ConvertLevels(); return; } + else if (global.create_images_dir) + { + CreateLevelSketchImages(); + return; + } game_status = GAME_MODE_MAIN; diff --git a/src/init.h b/src/init.h index 3df39d26..4226241a 100644 --- a/src/init.h +++ b/src/init.h @@ -36,6 +36,7 @@ void ResolveGroupElement(int); void InitElementPropertiesStatic(void); void InitElementPropertiesEngine(int); void InitElementPropertiesAfterLoading(int); +void InitElementPropertiesGfxElement(); void ReloadCustomArtwork(int); void RedrawBackground(); diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 9d23c75f..5e4b9310 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -337,13 +337,26 @@ unsigned int init_random_number(int nr, long seed) { if (seed == NEW_RANDOMIZE) { -#if defined(TARGET_SDL) - seed = (long)SDL_GetTicks(); -#else + /* default random seed */ + seed = (long)time(NULL); // seconds since the epoch + +#if !defined(PLATFORM_WIN32) + /* add some more randomness */ struct timeval current_time; gettimeofday(¤t_time, NULL); - seed = (long)current_time.tv_usec; + + seed += (long)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 +#endif + +#if 1 + /* add some more randomness */ + seed += GetSimpleRandom(1000000); #endif } @@ -1600,6 +1613,24 @@ boolean get_boolean_from_string(char *s) return result; } +int get_switch3_from_string(char *s) +{ + char *s_lower = getStringToLower(s); + int result = FALSE; + + if (strEqual(s_lower, "true") || + strEqual(s_lower, "yes") || + strEqual(s_lower, "on") || + get_integer_from_string(s) == 1) + result = TRUE; + else if (strEqual(s_lower, "auto")) + result = AUTO; + + free(s_lower); + + return result; +} + /* ------------------------------------------------------------------------- */ /* functions for generic lists */ diff --git a/src/libgame/misc.h b/src/libgame/misc.h index 29aaee70..56467dc1 100644 --- a/src/libgame/misc.h +++ b/src/libgame/misc.h @@ -25,7 +25,7 @@ #define READ_COUNTER 1 /* values for InitRND() */ -#define NEW_RANDOMIZE -1 +#define NEW_RANDOMIZE 0 #define RANDOM_ENGINE 0 #define RANDOM_SIMPLE 1 @@ -169,6 +169,7 @@ char getValidConfigValueChar(char); int get_integer_from_string(char *); boolean get_boolean_from_string(char *); +int get_switch3_from_string(char *); ListNode *newListNode(void); void addNodeToList(ListNode **, char *, void *); diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index ab3ac82d..f751fe85 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -296,6 +296,26 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) } } + +#if 1 + SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); + +#if defined(PLATFORM_WIN32) + { + SDL_SysWMinfo wminfo; + HWND hwnd; + + SDL_VERSION(&wminfo.version); + SDL_GetWMInfo(&wminfo); + + hwnd = wminfo.window; + + DragAcceptFiles(hwnd, TRUE); + } +#endif +#endif + + return success; } @@ -1787,6 +1807,36 @@ void SDLNextEvent(Event *event) } } +void SDLHandleWindowManagerEvent(Event *event) +{ +#if defined(PLATFORM_WIN32) + SDL_SysWMEvent *syswmevent = (SDL_SysWMEvent *)event; + SDL_SysWMmsg *syswmmsg = (SDL_SysWMmsg *)(syswmevent->msg); + + if (syswmmsg->msg == WM_DROPFILES) + { + HDROP hdrop = (HDROP)syswmmsg->wParam; + int i, num_files; + + printf("::: SDL_SYSWMEVENT:\n"); + + num_files = DragQueryFile(hdrop, 0xffffffff, NULL, 0); + + for (i = 0; i < num_files; i++) + { + int buffer_len = DragQueryFile(hdrop, i, NULL, 0); + char buffer[buffer_len + 1]; + + DragQueryFile(hdrop, i, buffer, buffer_len + 1); + + printf("::: - '%s'\n", buffer); + } + + DragFinish((HDROP)syswmmsg->wParam); + } +#endif +} + /* ========================================================================= */ /* joystick functions */ diff --git a/src/libgame/sdl.h b/src/libgame/sdl.h index 19ead5e5..62196e1a 100644 --- a/src/libgame/sdl.h +++ b/src/libgame/sdl.h @@ -19,7 +19,9 @@ #include #include #include - +#if defined(PLATFORM_WIN32) +#include +#endif /* definitions needed for "system.c" */ @@ -375,6 +377,7 @@ void SDLOpenAudio(void); void SDLCloseAudio(void); void SDLNextEvent(Event *); +void SDLHandleWindowManagerEvent(Event *); void HandleJoystickEvent(Event *); void SDLInitJoysticks(void); diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 9d095724..3e539249 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -334,7 +334,9 @@ char *setLevelArtworkDir(TreeInfo *ti) checked_free(*artwork_path_ptr); if ((level_artwork = getTreeInfoFromIdentifier(ti, *artwork_set_ptr))) + { *artwork_path_ptr = getStringCopy(getSetupArtworkDir(level_artwork)); + } else { /* @@ -2685,6 +2687,10 @@ void setSetupInfo(struct TokenInfo *token_info, *(boolean *)setup_value = get_boolean_from_string(token_value); break; + case TYPE_SWITCH3: + *(int *)setup_value = get_switch3_from_string(token_value); + break; + case TYPE_KEY: *(Key *)setup_value = getKeyFromKeyName(token_value); break; @@ -3747,10 +3753,20 @@ char *getSetupValue(int type, void *value) strcpy(value_string, (*(boolean *)value ? "on" : "off")); break; + case TYPE_SWITCH3: + strcpy(value_string, (*(int *)value == AUTO ? "auto" : + *(int *)value == FALSE ? "off" : "on")); + break; + case TYPE_YES_NO: strcpy(value_string, (*(boolean *)value ? "yes" : "no")); break; + case TYPE_YES_NO_AUTO: + strcpy(value_string, (*(int *)value == AUTO ? "auto" : + *(int *)value == FALSE ? "no" : "yes")); + break; + case TYPE_ECS_AGA: strcpy(value_string, (*(boolean *)value ? "AGA" : "ECS")); break; diff --git a/src/libgame/setup.h b/src/libgame/setup.h index 02a815ab..414cf74e 100644 --- a/src/libgame/setup.h +++ b/src/libgame/setup.h @@ -21,33 +21,35 @@ /* values for setup file handling */ #define TYPE_BOOLEAN (1 << 0) #define TYPE_SWITCH (1 << 1) -#define TYPE_YES_NO (1 << 2) -#define TYPE_ECS_AGA (1 << 3) -#define TYPE_KEY (1 << 4) -#define TYPE_KEY_X11 (1 << 5) -#define TYPE_INTEGER (1 << 6) -#define TYPE_STRING (1 << 7) -#define TYPE_ELEMENT (1 << 8) -#define TYPE_GRAPHIC (1 << 9) +#define TYPE_SWITCH3 (1 << 2) +#define TYPE_YES_NO (1 << 3) +#define TYPE_YES_NO_AUTO (1 << 4) +#define TYPE_ECS_AGA (1 << 5) +#define TYPE_KEY (1 << 6) +#define TYPE_KEY_X11 (1 << 7) +#define TYPE_INTEGER (1 << 8) +#define TYPE_STRING (1 << 9) +#define TYPE_ELEMENT (1 << 10) +#define TYPE_GRAPHIC (1 << 11) /* additional values for setup screen */ -#define TYPE_ENTER_SCREEN (1 << 10) -#define TYPE_LEAVE_SCREEN (1 << 11) -#define TYPE_ENTER_MENU (1 << 12) -#define TYPE_LEAVE_MENU (1 << 13) -#define TYPE_ENTER_LIST (1 << 14) -#define TYPE_LEAVE_LIST (1 << 15) -#define TYPE_EMPTY (1 << 16) -#define TYPE_KEYTEXT (1 << 17) - -#define TYPE_GHOSTED (1 << 18) -#define TYPE_QUERY (1 << 19) +#define TYPE_ENTER_SCREEN (1 << 12) +#define TYPE_LEAVE_SCREEN (1 << 13) +#define TYPE_ENTER_MENU (1 << 14) +#define TYPE_LEAVE_MENU (1 << 15) +#define TYPE_ENTER_LIST (1 << 16) +#define TYPE_LEAVE_LIST (1 << 17) +#define TYPE_EMPTY (1 << 18) +#define TYPE_KEYTEXT (1 << 19) + +#define TYPE_GHOSTED (1 << 20) +#define TYPE_QUERY (1 << 21) /* additional values for internal purposes */ -#define TYPE_BITFIELD (1 << 20) -#define TYPE_CONTENT (1 << 21) -#define TYPE_ELEMENT_LIST (1 << 22) -#define TYPE_CONTENT_LIST (1 << 23) +#define TYPE_BITFIELD (1 << 22) +#define TYPE_CONTENT (1 << 23) +#define TYPE_ELEMENT_LIST (1 << 24) +#define TYPE_CONTENT_LIST (1 << 25) /* derived values for setup file handling */ #define TYPE_BOOLEAN_STYLE (TYPE_BOOLEAN | \ @@ -57,6 +59,8 @@ /* derived values for setup screen */ #define TYPE_VALUE (TYPE_BOOLEAN_STYLE | \ + TYPE_SWITCH3 | \ + TYPE_YES_NO_AUTO | \ TYPE_KEY | \ TYPE_KEY_X11 | \ TYPE_INTEGER | \ diff --git a/src/libgame/system.c b/src/libgame/system.c index 7a6618eb..20ea20be 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -491,8 +491,34 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap, if (DrawingDeactivated(dst_x, dst_y, width, height)) return; - sysCopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, - dst_x, dst_y, BLIT_OPAQUE); +#if 0 + /* !!! APPARENTLY THIS HAS BEEN FIXED IN SDL 1.2.12 !!! */ +#if defined(TARGET_SDL) && defined(PLATFORM_WIN32) + if (src_bitmap == dst_bitmap) + { + /* !!! THIS IS A BUG (IN THE SDL LIBRARY?) AND SHOULD BE FIXED !!! */ + + /* needed when blitting directly to same bitmap -- should not be needed with + recent SDL libraries, but apparently does not work in 1.2.11 directly */ + + static Bitmap *tmp_bitmap = NULL; + + if (tmp_bitmap == NULL) + tmp_bitmap = CreateBitmap(MAX(FXSIZE, WIN_XSIZE), + MAX(FYSIZE, WIN_YSIZE), DEFAULT_DEPTH); + + sysCopyArea(src_bitmap, tmp_bitmap, + src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE); + sysCopyArea(tmp_bitmap, dst_bitmap, + src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE); + + return; + } +#endif +#endif + + sysCopyArea(src_bitmap, dst_bitmap, + src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE); } void FadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, diff --git a/src/libgame/system.h b/src/libgame/system.h index 28e5a2ea..3791f1e6 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -870,10 +870,9 @@ struct SetupInfo char *graphics_set; char *sounds_set; char *music_set; - boolean override_level_graphics; - boolean override_level_sounds; - boolean override_level_music; - boolean auto_override_artwork; + int override_level_graphics; /* not boolean -- can also be "AUTO" */ + int override_level_sounds; /* not boolean -- can also be "AUTO" */ + int override_level_music; /* not boolean -- can also be "AUTO" */ struct SetupEditorInfo editor; struct SetupEditorCascadeInfo editor_cascade; diff --git a/src/libgame/types.h b/src/libgame/types.h index f4d0e820..d6f49bdd 100644 --- a/src/libgame/types.h +++ b/src/libgame/types.h @@ -26,11 +26,22 @@ typedef int boolean; typedef unsigned char byte; #endif -#ifndef FALSE -#define FALSE 0 -#define TRUE (!FALSE) +#ifdef TRUE +#undef TRUE +#endif + +#ifdef FALSE +#undef FALSE #endif +#ifdef AUTO +#undef AUTO +#endif + +#define TRUE 1 +#define FALSE 0 +#define AUTO -1 + #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif diff --git a/src/main.c b/src/main.c index aae4944a..f1ea104e 100644 --- a/src/main.c +++ b/src/main.c @@ -75,6 +75,7 @@ int GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; int GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; int GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; int GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +int GfxRedraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; int ActiveElement[MAX_NUM_ELEMENTS]; int ActiveButton[NUM_IMAGE_FILES]; @@ -5538,6 +5539,7 @@ static void print_usage() " \"dump tape FILE\" dump tape data from FILE\n" " \"autoplay LEVELDIR [NR ...]\" play level tapes for LEVELDIR\n" " \"convert LEVELDIR [NR]\" convert levels in LEVELDIR\n" + " \"create images DIRECTORY\" write BMP images to DIRECTORY\n" "\n", program.command_basename); } diff --git a/src/main.h b/src/main.h index 763195b9..d47b4068 100644 --- a/src/main.h +++ b/src/main.h @@ -108,6 +108,7 @@ #define EP_THROWABLE 28 #define EP_CAN_EXPLODE 29 #define EP_GRAVITY_REACHABLE 30 +#define EP_DONT_GET_HIT_BY 31 /* values for pre-defined properties */ /* (from here on, values can be changed by inserting new values) */ @@ -280,6 +281,7 @@ PLAYER_BITS_3 | \ PLAYER_BITS_4) #define PLAYER_BITS_TRIGGER (1 << 4) +#define PLAYER_BITS_ACTION (1 << 5) /* values for move directions (bits 0 - 3: basic move directions) */ #define MV_BIT_PREVIOUS 4 @@ -336,7 +338,7 @@ #define CP_WHEN_REMOVABLE 4 #define CP_WHEN_WALKABLE 5 -/* values for change actions for custom elements */ +/* values for change actions for custom elements (stored in level file) */ #define CA_NO_ACTION 0 #define CA_EXIT_PLAYER 1 #define CA_KILL_PLAYER 2 @@ -355,6 +357,9 @@ #define CA_SET_CE_SCORE 15 #define CA_SET_CE_VALUE 16 #define CA_SET_ENGINE_SCAN_MODE 17 +#define CA_SET_PLAYER_INVENTORY 18 +#define CA_SET_CE_ARTWORK 19 +#define CA_SET_LEVEL_RANDOM_SEED 20 #define CA_HEADLINE_LEVEL_ACTIONS 250 #define CA_HEADLINE_PLAYER_ACTIONS 251 @@ -394,6 +399,7 @@ #define CA_ARG_PLAYER_4 (CA_ARG_PLAYER + PLAYER_BITS_4) #define CA_ARG_PLAYER_ANY (CA_ARG_PLAYER + PLAYER_BITS_ANY) #define CA_ARG_PLAYER_TRIGGER (CA_ARG_PLAYER + PLAYER_BITS_TRIGGER) +#define CA_ARG_PLAYER_ACTION (CA_ARG_PLAYER + PLAYER_BITS_ACTION) #define CA_ARG_PLAYER_HEADLINE (CA_ARG_PLAYER + 999) #define CA_ARG_NUMBER 11000 #define CA_ARG_NUMBER_MIN (CA_ARG_NUMBER + 0) @@ -410,15 +416,19 @@ #define CA_ARG_ELEMENT_RESET (CA_ARG_ELEMENT + 0) #define CA_ARG_ELEMENT_TARGET (CA_ARG_ELEMENT + 1) #define CA_ARG_ELEMENT_TRIGGER (CA_ARG_ELEMENT + 2) +#define CA_ARG_ELEMENT_ACTION (CA_ARG_ELEMENT + 7) #define CA_ARG_ELEMENT_HEADLINE (CA_ARG_ELEMENT + 997) #define CA_ARG_ELEMENT_CV_TARGET (CA_ARG_ELEMENT_TARGET) #define CA_ARG_ELEMENT_CV_TRIGGER (CA_ARG_ELEMENT_TRIGGER) +#define CA_ARG_ELEMENT_CV_ACTION (CA_ARG_ELEMENT_ACTION) #define CA_ARG_ELEMENT_CV_HEADLINE (CA_ARG_ELEMENT_HEADLINE) #define CA_ARG_ELEMENT_NR_TARGET (CA_ARG_ELEMENT + 3) #define CA_ARG_ELEMENT_NR_TRIGGER (CA_ARG_ELEMENT + 4) +#define CA_ARG_ELEMENT_NR_ACTION (CA_ARG_ELEMENT + 8) #define CA_ARG_ELEMENT_NR_HEADLINE (CA_ARG_ELEMENT + 998) #define CA_ARG_ELEMENT_CS_TARGET (CA_ARG_ELEMENT + 5) #define CA_ARG_ELEMENT_CS_TRIGGER (CA_ARG_ELEMENT + 6) +#define CA_ARG_ELEMENT_CS_ACTION (CA_ARG_ELEMENT + 9) #define CA_ARG_ELEMENT_CS_HEADLINE (CA_ARG_ELEMENT + 999) #define CA_ARG_SPEED 13000 #define CA_ARG_SPEED_NOT_MOVING (CA_ARG_SPEED + STEPSIZE_NOT_MOVING) @@ -455,6 +465,16 @@ #define CA_ARG_SCAN_MODE_NORMAL (CA_ARG_SCAN_MODE + MV_NORMAL) #define CA_ARG_SCAN_MODE_REVERSE (CA_ARG_SCAN_MODE + MV_REVERSE) #define CA_ARG_SCAN_MODE_HEADLINE (CA_ARG_SCAN_MODE + 999) +#define CA_ARG_INVENTORY 18000 +#define CA_ARG_INVENTORY_RESET (CA_ARG_INVENTORY + 0) +#define CA_ARG_INVENTORY_RM_TARGET (CA_ARG_INVENTORY + 1) +#define CA_ARG_INVENTORY_RM_TRIGGER (CA_ARG_INVENTORY + 2) +#define CA_ARG_INVENTORY_RM_ACTION (CA_ARG_INVENTORY + 3) +#define CA_ARG_INVENTORY_RM_FIRST (CA_ARG_INVENTORY + 4) +#define CA_ARG_INVENTORY_RM_LAST (CA_ARG_INVENTORY + 5) +#define CA_ARG_INVENTORY_RM_ALL (CA_ARG_INVENTORY + 6) +#define CA_ARG_INVENTORY_HEADLINE (CA_ARG_INVENTORY + 998) +#define CA_ARG_INVENTORY_RM_HEADLINE (CA_ARG_INVENTORY + 999) #define CA_ARG_UNDEFINED 65535 /* values for custom move patterns (bits 0 - 3: basic move directions) */ @@ -548,6 +568,7 @@ #define IS_THROWABLE(e) HAS_PROPERTY(e, EP_THROWABLE) #define CAN_EXPLODE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE) #define IS_GRAVITY_REACHABLE(e) HAS_PROPERTY(e, EP_GRAVITY_REACHABLE) +#define DONT_GET_HIT_BY(e) HAS_PROPERTY(e, EP_DONT_GET_HIT_BY) /* macros for special configurable properties */ #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) @@ -674,9 +695,11 @@ (e) <= EL_EM_GATE_4) #define IS_EMC_GATE(e) ((e) >= EL_EMC_GATE_5 && \ (e) <= EL_EMC_GATE_8) +#define IS_DC_GATE(e) ((e) == EL_DC_GATE_WHITE) #define IS_GATE(e) (IS_RND_GATE(e) || \ IS_EM_GATE(e) || \ - IS_EMC_GATE(e)) + IS_EMC_GATE(e) || \ + IS_DC_GATE(e)) #define RND_GATE_NR(e) ((e) - EL_GATE_1) #define EM_GATE_NR(e) ((e) - EL_EM_GATE_1) #define EMC_GATE_NR(e) ((e) - EL_EMC_GATE_5 + 4) @@ -696,12 +719,17 @@ (e) <= EL_EMC_GATE_8_GRAY) #define IS_EMC_GATE_GRAY_ACTIVE(e) ((e) >= EL_EMC_GATE_5_GRAY_ACTIVE && \ (e) <= EL_EMC_GATE_8_GRAY_ACTIVE) +#define IS_DC_GATE_GRAY(e) ((e) == EL_DC_GATE_WHITE_GRAY) +#define IS_DC_GATE_GRAY_ACTIVE(e) ((e) == EL_DC_GATE_WHITE_GRAY_ACTIVE) + #define IS_GATE_GRAY(e) (IS_RND_GATE_GRAY(e) || \ IS_EM_GATE_GRAY(e) || \ - IS_EMC_GATE_GRAY(e)) + IS_EMC_GATE_GRAY(e) || \ + IS_DC_GATE_GRAY(e)) #define IS_GATE_GRAY_ACTIVE(e) (IS_RND_GATE_GRAY_ACTIVE(e) || \ IS_EM_GATE_GRAY_ACTIVE(e) || \ - IS_EMC_GATE_GRAY_ACTIVE(e)) + IS_EMC_GATE_GRAY_ACTIVE(e) || \ + IS_DC_GATE_GRAY_ACTIVE(e)) #define RND_GATE_GRAY_NR(e) ((e) - EL_GATE_1_GRAY) #define RND_GATE_GRAY_ACTIVE_NR(e) ((e) - EL_GATE_1_GRAY_ACTIVE) #define EM_GATE_GRAY_NR(e) ((e) - EL_EM_GATE_1_GRAY) @@ -731,8 +759,12 @@ #define IS_DC_STEELWALL_2(e) ((e) >= EL_DC_STEELWALL_2_LEFT && \ (e) <= EL_DC_STEELWALL_2_SINGLE) +#if 1 +#define GFX_ELEMENT(e) (element_info[e].gfx_element) +#else #define GFX_ELEMENT(e) (element_info[e].use_gfx_element ? \ element_info[e].gfx_element : e) +#endif /* !!! CHECK THIS !!! */ #if 1 @@ -888,6 +920,10 @@ #define STD_ELEMENT_CONTENTS 4 #define MAX_ELEMENT_CONTENTS 8 +/* values for initial player inventory */ +#define MIN_INITIAL_INVENTORY_SIZE 1 +#define MAX_INITIAL_INVENTORY_SIZE 8 + /* often used screen positions */ #define SX 8 #define SY 8 @@ -929,6 +965,12 @@ #define MICROLABEL1_YPOS (MICROLEVEL_YPOS - 36) #define MICROLABEL2_YPOS (MICROLEVEL_YPOS + MICROLEVEL_YSIZE + 7) +/* values for GfxRedraw */ +#define GFX_REDRAW_NONE (0) +#define GFX_REDRAW_TILE (1 << 0) +#define GFX_REDRAW_TILE_CRUMBLED (1 << 1) +#define GFX_REDRAW_TILE_CRUMBLED_NEIGHBOURS (1 << 2) +#define GFX_REDRAW_TILE_TWINKLED (1 << 3) /* score for elements */ #define SC_EMERALD 0 @@ -1949,12 +1991,12 @@ /* program information and versioning definitions */ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 2 -#define PROGRAM_VERSION_PATCH 5 +#define PROGRAM_VERSION_PATCH 6 #define PROGRAM_VERSION_BUILD 0 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" -#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2007 by Holger Schemel" +#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2008 by Holger Schemel" #define PROGRAM_EMAIL_STRING "info@artsoft.org" #define PROGRAM_WEBSITE_STRING "http://www.artsoft.org/" #define PROGRAM_GAME_BY_STRING "A Game by Artsoft Entertainment" @@ -2252,6 +2294,8 @@ struct LevelInfo char name[MAX_LEVEL_NAME_LEN + 1]; char author[MAX_LEVEL_AUTHOR_LEN + 1]; + int random_seed; + struct EnvelopeInfo envelope[NUM_ENVELOPES]; int score[LEVEL_SCORE_ELEMENTS]; @@ -2312,7 +2356,12 @@ struct LevelInfo int initial_player_stepsize[MAX_PLAYERS]; /* initial player speed */ boolean initial_player_gravity[MAX_PLAYERS]; + boolean use_initial_inventory[MAX_PLAYERS]; + int initial_inventory_size[MAX_PLAYERS]; + int initial_inventory_content[MAX_PLAYERS][MAX_INITIAL_INVENTORY_SIZE]; + boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */ + boolean em_explodes_by_fire; /* EM style chain explosion behaviour */ boolean use_spring_bug; /* for compatibility with old levels */ boolean use_time_orb_bug; /* for compatibility with old levels */ boolean instant_relocation; /* no visual delay when relocating player */ @@ -2335,6 +2384,9 @@ struct LevelInfo boolean no_valid_file; /* set when level file missing or invalid */ boolean changed; /* set when level was changed in the editor */ + + /* runtime flags to handle bugs in old levels (not stored in level file) */ + boolean use_action_after_change_bug; }; struct GlobalInfo @@ -2346,6 +2398,8 @@ struct GlobalInfo char *convert_leveldir; int convert_level_nr; + char *create_images_dir; + int num_toons; float frames_per_second; @@ -2376,7 +2430,7 @@ struct ElementChangeInfo int delay_random; /* added frame delay before changed (random) */ int delay_frames; /* either 1 (frames) or 50 (seconds; 50 fps) */ - int trigger_element; /* element triggering change */ + int initial_trigger_element; /* initial element triggering change */ struct Content target_content;/* elements for extended change target */ boolean use_target_content; /* use extended change target */ @@ -2391,9 +2445,12 @@ struct ElementChangeInfo int action_type; /* type of action */ int action_mode; /* mode of action */ int action_arg; /* parameter of action */ + int action_element; /* element related to action */ /* ---------- internal values used at runtime when playing ---------- */ + int trigger_element; /* element triggering change */ + /* functions that are called before, while and after the change of an element -- currently only used for non-custom elements */ void (*pre_change_function)(int x, int y); @@ -2471,7 +2528,7 @@ struct ElementInfo unsigned long properties[NUM_EP_BITFIELDS]; /* element base properties */ boolean use_gfx_element; /* use custom graphic element */ - int gfx_element; /* optional custom graphic element */ + int gfx_element_initial; /* initial optional custom graphic element */ int access_direction; /* accessible from which direction */ @@ -2522,6 +2579,8 @@ struct ElementInfo boolean in_group[NUM_GROUP_ELEMENTS]; + int gfx_element; /* runtime optional custom graphic element */ + int collect_score; /* runtime score value for collecting */ /* count of this element on playfield, calculated after each frame */ @@ -2738,6 +2797,7 @@ extern int GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern int GfxRedraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int ActiveElement[MAX_NUM_ELEMENTS]; extern int ActiveButton[NUM_IMAGE_FILES]; diff --git a/src/network.c b/src/network.c index 1a0feda6..fd98b62d 100644 --- a/src/network.c +++ b/src/network.c @@ -308,7 +308,7 @@ void SendToServer_NrWanted(int nr_wanted) void SendToServer_StartPlaying() { - unsigned long new_random_seed = InitRND(NEW_RANDOMIZE); + unsigned long new_random_seed = InitRND(level.random_seed); int dummy = 0; /* !!! HAS NO MEANING ANYMORE !!! */ /* the name of the level must be enough */ diff --git a/src/screens.c b/src/screens.c index 0d162f25..60bba456 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1776,7 +1776,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else if (pos == MAIN_CONTROL_GAME) { - StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE); + StartGameActions(options.network, setup.autorecord, level.random_seed); } else if (pos == MAIN_CONTROL_SETUP) { @@ -2010,7 +2010,8 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) if (info_info[choice].type & menu_navigation_type || info_info[choice].type & TYPE_ENTER_SCREEN || - info_info[choice].type & TYPE_BOOLEAN_STYLE) + info_info[choice].type & TYPE_BOOLEAN_STYLE || + info_info[choice].type & TYPE_YES_NO_AUTO) button = MB_MENU_CHOICE; } else if (dy) @@ -4019,6 +4020,13 @@ static void execSetupSound() static void execSetupArtwork() { +#if 0 + printf("::: '%s', '%s', '%s'\n", + artwork.gfx_current->subdir, + artwork.gfx_current->fullpath, + artwork.gfx_current->basepath); +#endif + setup.graphics_set = artwork.gfx_current->identifier; setup.sounds_set = artwork.snd_current->identifier; setup.music_set = artwork.mus_current->identifier; @@ -4203,10 +4211,16 @@ static struct TokenInfo setup_info_artwork[] = { TYPE_STRING, &music_set_name, "" }, { TYPE_EMPTY, NULL, "" }, #if 1 +#if 1 + { TYPE_YES_NO_AUTO,&setup.override_level_graphics,"Override Level Graphics:"}, + { TYPE_YES_NO_AUTO,&setup.override_level_sounds, "Override Level Sounds:" }, + { TYPE_YES_NO_AUTO,&setup.override_level_music, "Override Level Music:" }, +#else { TYPE_YES_NO, &setup.override_level_graphics,"Override Level Graphics:" }, { TYPE_YES_NO, &setup.override_level_sounds, "Override Level Sounds:" }, { TYPE_YES_NO, &setup.override_level_music, "Override Level Music:" }, { TYPE_YES_NO, &setup.auto_override_artwork, "Auto-Override Non-CE Sets:" }, +#endif #else { TYPE_STRING, NULL, "Override Level Artwork:"}, { TYPE_YES_NO, &setup.override_level_graphics, "Graphics:" }, @@ -4323,11 +4337,12 @@ static Key getSetupKey() static int getSetupTextFont(int type) { - if (type & (TYPE_SWITCH | - TYPE_YES_NO | - TYPE_STRING | - TYPE_ECS_AGA | - TYPE_KEYTEXT | + if (type & (TYPE_SWITCH | + TYPE_YES_NO | + TYPE_YES_NO_AUTO | + TYPE_STRING | + TYPE_ECS_AGA | + TYPE_KEYTEXT | TYPE_ENTER_LIST)) return FONT_MENU_2; else @@ -4344,6 +4359,9 @@ static int getSetupValueFont(int type, void *value) return FONT_VALUE_1; else if (type & TYPE_BOOLEAN_STYLE) return (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF); + else if (type & TYPE_YES_NO_AUTO) + return (*(int *)value == AUTO ? FONT_OPTION_ON : + *(int *)value == FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON); else return FONT_VALUE_1; } @@ -4356,11 +4374,13 @@ 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; + int font_nr, font_width, font_height; int type = setup_info[pos].type; void *value = setup_info[pos].value; char *value_string = getSetupValue(type, value); +#if 1 int i; +#endif if (value_string == NULL) return; @@ -4370,9 +4390,7 @@ static void drawSetupValue(int pos) xpos = MENU_SCREEN_START_XPOS; if (type & TYPE_QUERY) - { value_string = ""; - } } else if (type & TYPE_STRING) { @@ -4383,11 +4401,16 @@ static void drawSetupValue(int pos) if (strlen(value_string) > max_value_len) value_string[max_value_len] = '\0'; } + else if (type & TYPE_YES_NO_AUTO) + { + xpos = MENU_SCREEN_VALUE_XPOS - 1; + } startx = mSX + xpos * 32; starty = mSY + ypos * 32; font_nr = getSetupValueFont(type, value); font_width = getFontWidth(font_nr); + font_height = getFontHeight(font_nr); /* downward compatibility correction for Juergen Bonhagen's menu settings */ if (setup_mode != SETUP_MODE_INPUT) @@ -4424,8 +4447,12 @@ static void drawSetupValue(int pos) } } +#if 0 + DrawBackground(startx, starty, SX + SXSIZE - startx, font_height); +#else for (i = 0; i <= MENU_SCREEN_MAX_XPOS - xpos; i++) DrawText(startx + i * font_width, starty, " ", font_nr); +#endif DrawText(startx, starty, value_string, font_nr); @@ -4433,12 +4460,21 @@ static void drawSetupValue(int pos) getFontBitmapInfo(font_nr)->draw_xoffset = font_draw_xoffset_old; } -static void changeSetupValue(int pos) +static void changeSetupValue(int pos, int dx) { if (setup_info[pos].type & TYPE_BOOLEAN_STYLE) { *(boolean *)setup_info[pos].value ^= TRUE; } + else if (setup_info[pos].type & TYPE_YES_NO_AUTO) + { + *(int *)setup_info[pos].value = + (dx == -1 ? + (*(int *)setup_info[pos].value == AUTO ? TRUE : + *(int *)setup_info[pos].value == TRUE ? FALSE : AUTO) : + (*(int *)setup_info[pos].value == TRUE ? AUTO : + *(int *)setup_info[pos].value == AUTO ? FALSE : TRUE)); + } else if (setup_info[pos].type & TYPE_KEY) { Key key; @@ -4651,7 +4687,8 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER); if (setup_info[choice].type & menu_navigation_type || - setup_info[choice].type & TYPE_BOOLEAN_STYLE) + setup_info[choice].type & TYPE_BOOLEAN_STYLE || + setup_info[choice].type & TYPE_YES_NO_AUTO) button = MB_MENU_CHOICE; } else if (dy) @@ -4702,7 +4739,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) else { if (setup_info[y].type & TYPE_VALUE) - changeSetupValue(y); + changeSetupValue(y, dx); } } } diff --git a/src/tape.c b/src/tape.c index fc90ad51..49f06aa3 100644 --- a/src/tape.c +++ b/src/tape.c @@ -475,7 +475,7 @@ void TapeErase() tape.pos[tape.counter].delay = 0; tape.changed = TRUE; - tape.random_seed = InitRND(NEW_RANDOMIZE); + tape.random_seed = InitRND(level.random_seed); tape.file_version = FILE_VERSION_ACTUAL; tape.game_version = GAME_VERSION_ACTUAL; @@ -538,7 +538,7 @@ void TapeStartRecording(long random_seed) static void TapeStartGameRecording() { - TapeStartRecording(NEW_RANDOMIZE); + TapeStartRecording(level.random_seed); #if defined(NETWORK_AVALIABLE) if (options.network) diff --git a/src/tools.c b/src/tools.c index b26add56..e80cd996 100644 --- a/src/tools.c +++ b/src/tools.c @@ -503,6 +503,16 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) return; } +#if 0 + printf("::: !!! FADING %d ... [%d] [%d]\n", fade_mode, fade_type, + fade_type_skip); +#endif + +#if 1 + fade_delay = fading.fade_delay; + post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0); +#endif + if (fade_type_skip != FADE_TYPE_NONE) { #if 0 @@ -513,7 +523,11 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) if (fade_type & fade_type_skip) fade_type_skip = FADE_TYPE_NONE; +#if 1 + fade_delay = 0; +#else return; +#endif } #if 1 @@ -534,7 +548,7 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) } #endif - /* !!! what abount fade_mask == REDRAW_FIELD | REDRAW_ALL ??? !!! */ + /* !!! what about fade_mask == REDRAW_FIELD | REDRAW_ALL ??? !!! */ #if 0 printf("::: NOW FADING %d ... [%d]\n", fade_mode, fade_type); @@ -553,8 +567,10 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) width = FULL_SXSIZE; height = FULL_SYSIZE; +#if 0 fade_delay = fading.fade_delay; post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0); +#endif if (border.draw_masked_when_fading) draw_border_function = DrawMaskedBorder_FIELD; /* update when fading */ @@ -568,8 +584,10 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) width = WIN_XSIZE; height = WIN_YSIZE; +#if 0 fade_delay = fading.fade_delay; post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0); +#endif } #if 1 @@ -6203,6 +6221,19 @@ void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em, action == ACTION_FILLING || action == ACTION_EMPTYING); + /* special case: graphic uses "2nd movement tile" and has defined + 7 frames for movement animation (or less) => use default graphic + for last (8th) frame which ends the movement animation */ + if (g->double_movement && g->anim_frames < 8 && frame_em == 7) + { + action = ACTION_DEFAULT; /* (keep action_* unchanged for now) */ + graphic = (direction == MV_NONE ? + el_act2img(effective_element, action) : + el_act_dir2img(effective_element, action, direction)); + + g = &graphic_info[graphic]; + } + #if 0 if (tile == Xsand_stonesand_1 || tile == Xsand_stonesand_2 || @@ -6237,6 +6268,16 @@ void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em, GfxFrame[x][y]++; +#if 1 + /* !!! TEST !!! NEW !!! DOES NOT WORK RIGHT YET !!! */ + if (g->double_movement && frame_em == 0) + { + GfxFrame[x][y] = 0; + + // printf("::: resetting... [%d]\n", tile); + } +#endif + if (move_dir == MV_LEFT) GfxFrame[x - 1][y] = GfxFrame[x][y]; else if (move_dir == MV_RIGHT) @@ -6291,13 +6332,21 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, { int action = object_mapping[tile].action; int direction = object_mapping[tile].direction; + boolean is_backside = object_mapping[tile].is_backside; int effective_element = get_effective_element_EM(tile, frame_em); +#if 1 + int effective_action = action; +#else + int effective_action = (frame_em < 7 ? action : ACTION_DEFAULT); +#endif int graphic = (direction == MV_NONE ? - el_act2img(effective_element, action) : - el_act_dir2img(effective_element, action, direction)); + el_act2img(effective_element, effective_action) : + el_act_dir2img(effective_element, effective_action, + direction)); int crumbled = (direction == MV_NONE ? - el_act2crm(effective_element, action) : - el_act_dir2crm(effective_element, action, direction)); + el_act2crm(effective_element, effective_action) : + el_act_dir2crm(effective_element, effective_action, + direction)); int base_graphic = el_act2img(effective_element, ACTION_DEFAULT); int base_crumbled = el_act2crm(effective_element, ACTION_DEFAULT); boolean has_crumbled_graphics = (base_crumbled != base_graphic); @@ -6307,6 +6356,30 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, #endif int sync_frame; + /* special case: graphic uses "2nd movement tile" and has defined + 7 frames for movement animation (or less) => use default graphic + for last (8th) frame which ends the movement animation */ + if (g->double_movement && g->anim_frames < 8 && frame_em == 7) + { + effective_action = ACTION_DEFAULT; + graphic = (direction == MV_NONE ? + el_act2img(effective_element, effective_action) : + el_act_dir2img(effective_element, effective_action, + direction)); + crumbled = (direction == MV_NONE ? + el_act2crm(effective_element, effective_action) : + el_act_dir2crm(effective_element, effective_action, + direction)); + + g = &graphic_info[graphic]; + } + +#if 0 + if (frame_em == 7) + return; +#endif + + #if 0 if (frame_em == 0) /* reset animation frame for certain elements */ { @@ -6324,14 +6397,391 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, SetRandomAnimationValue(x, y); +#if 0 + int i = tile; + int j = frame_em; + int xxx_sync_frame = (i == Xdrip_stretch ? 7 : + i == Xdrip_stretchB ? 7 : + i == Ydrip_s2 ? j + 8 : + i == Ydrip_s2B ? j + 8 : + i == Xacid_1 ? 0 : + i == Xacid_2 ? 10 : + i == Xacid_3 ? 20 : + i == Xacid_4 ? 30 : + i == Xacid_5 ? 40 : + i == Xacid_6 ? 50 : + i == Xacid_7 ? 60 : + i == Xacid_8 ? 70 : + i == Xfake_acid_1 ? 0 : + i == Xfake_acid_2 ? 10 : + i == Xfake_acid_3 ? 20 : + i == Xfake_acid_4 ? 30 : + i == Xfake_acid_5 ? 40 : + i == Xfake_acid_6 ? 50 : + i == Xfake_acid_7 ? 60 : + i == Xfake_acid_8 ? 70 : + i == Xball_2 ? 7 : + i == Xball_2B ? j + 8 : + i == Yball_eat ? j + 1 : + i == Ykey_1_eat ? j + 1 : + i == Ykey_2_eat ? j + 1 : + i == Ykey_3_eat ? j + 1 : + i == Ykey_4_eat ? j + 1 : + i == Ykey_5_eat ? j + 1 : + i == Ykey_6_eat ? j + 1 : + i == Ykey_7_eat ? j + 1 : + i == Ykey_8_eat ? j + 1 : + i == Ylenses_eat ? j + 1 : + i == Ymagnify_eat ? j + 1 : + i == Ygrass_eat ? j + 1 : + i == Ydirt_eat ? j + 1 : + i == Xamoeba_1 ? 0 : + i == Xamoeba_2 ? 1 : + i == Xamoeba_3 ? 2 : + i == Xamoeba_4 ? 3 : + i == Xamoeba_5 ? 0 : + i == Xamoeba_6 ? 1 : + i == Xamoeba_7 ? 2 : + i == Xamoeba_8 ? 3 : + i == Xexit_2 ? j + 8 : + i == Xexit_3 ? j + 16 : + i == Xdynamite_1 ? 0 : + i == Xdynamite_2 ? 8 : + i == Xdynamite_3 ? 16 : + i == Xdynamite_4 ? 24 : + i == Xsand_stonein_1 ? j + 1 : + i == Xsand_stonein_2 ? j + 9 : + i == Xsand_stonein_3 ? j + 17 : + i == Xsand_stonein_4 ? j + 25 : + i == Xsand_stoneout_1 && j == 0 ? 0 : + i == Xsand_stoneout_1 && j == 1 ? 0 : + i == Xsand_stoneout_1 && j == 2 ? 1 : + i == Xsand_stoneout_1 && j == 3 ? 2 : + i == Xsand_stoneout_1 && j == 4 ? 2 : + i == Xsand_stoneout_1 && j == 5 ? 3 : + i == Xsand_stoneout_1 && j == 6 ? 4 : + i == Xsand_stoneout_1 && j == 7 ? 4 : + i == Xsand_stoneout_2 && j == 0 ? 5 : + i == Xsand_stoneout_2 && j == 1 ? 6 : + i == Xsand_stoneout_2 && j == 2 ? 7 : + i == Xsand_stoneout_2 && j == 3 ? 8 : + i == Xsand_stoneout_2 && j == 4 ? 9 : + i == Xsand_stoneout_2 && j == 5 ? 11 : + i == Xsand_stoneout_2 && j == 6 ? 13 : + i == Xsand_stoneout_2 && j == 7 ? 15 : + i == Xboom_bug && j == 1 ? 2 : + i == Xboom_bug && j == 2 ? 2 : + i == Xboom_bug && j == 3 ? 4 : + i == Xboom_bug && j == 4 ? 4 : + i == Xboom_bug && j == 5 ? 2 : + i == Xboom_bug && j == 6 ? 2 : + i == Xboom_bug && j == 7 ? 0 : + i == Xboom_bomb && j == 1 ? 2 : + i == Xboom_bomb && j == 2 ? 2 : + i == Xboom_bomb && j == 3 ? 4 : + i == Xboom_bomb && j == 4 ? 4 : + i == Xboom_bomb && j == 5 ? 2 : + i == Xboom_bomb && j == 6 ? 2 : + i == Xboom_bomb && j == 7 ? 0 : + i == Xboom_android && j == 7 ? 6 : + i == Xboom_1 && j == 1 ? 2 : + i == Xboom_1 && j == 2 ? 2 : + i == Xboom_1 && j == 3 ? 4 : + i == Xboom_1 && j == 4 ? 4 : + i == Xboom_1 && j == 5 ? 6 : + i == Xboom_1 && j == 6 ? 6 : + i == Xboom_1 && j == 7 ? 8 : + i == Xboom_2 && j == 0 ? 8 : + i == Xboom_2 && j == 1 ? 8 : + i == Xboom_2 && j == 2 ? 10 : + i == Xboom_2 && j == 3 ? 10 : + i == Xboom_2 && j == 4 ? 10 : + i == Xboom_2 && j == 5 ? 12 : + i == Xboom_2 && j == 6 ? 12 : + i == Xboom_2 && j == 7 ? 12 : +#if 0 + special_animation && j == 4 ? 3 : + effective_action != action ? 0 : +#endif + j); +#endif + +#if 0 + int xxx_effective_action; + int xxx_has_action_graphics; + + { + int element = object_mapping[i].element_rnd; + int action = object_mapping[i].action; + int direction = object_mapping[i].direction; + boolean is_backside = object_mapping[i].is_backside; +#if 0 + boolean action_removing = (action == ACTION_DIGGING || + action == ACTION_SNAPPING || + action == ACTION_COLLECTING); +#endif + boolean action_exploding = ((action == ACTION_EXPLODING || + action == ACTION_SMASHED_BY_ROCK || + action == ACTION_SMASHED_BY_SPRING) && + element != EL_DIAMOND); + boolean action_active = (action == ACTION_ACTIVE); + boolean action_other = (action == ACTION_OTHER); + + { +#if 1 + int effective_element = get_effective_element_EM(i, j); +#else + int effective_element = (j > 5 && i == Yacid_splash_eB ? EL_EMPTY : + j > 5 && i == Yacid_splash_wB ? EL_EMPTY : + j < 7 ? element : + i == Xdrip_stretch ? element : + i == Xdrip_stretchB ? element : + i == Ydrip_s1 ? element : + i == Ydrip_s1B ? element : + i == Xball_1B ? element : + i == Xball_2 ? element : + i == Xball_2B ? element : + i == Yball_eat ? element : + i == Ykey_1_eat ? element : + i == Ykey_2_eat ? element : + i == Ykey_3_eat ? element : + i == Ykey_4_eat ? element : + i == Ykey_5_eat ? element : + i == Ykey_6_eat ? element : + i == Ykey_7_eat ? element : + i == Ykey_8_eat ? element : + i == Ylenses_eat ? element : + i == Ymagnify_eat ? element : + i == Ygrass_eat ? element : + i == Ydirt_eat ? element : + i == Yemerald_stone ? EL_EMERALD : + i == Ydiamond_stone ? EL_ROCK : + i == Xsand_stonein_1 ? element : + i == Xsand_stonein_2 ? element : + i == Xsand_stonein_3 ? element : + i == Xsand_stonein_4 ? element : + is_backside ? EL_EMPTY : + action_removing ? EL_EMPTY : + element); +#endif + int effective_action = (j < 7 ? action : + i == Xdrip_stretch ? action : + i == Xdrip_stretchB ? action : + i == Ydrip_s1 ? action : + i == Ydrip_s1B ? action : + i == Xball_1B ? action : + i == Xball_2 ? action : + i == Xball_2B ? action : + i == Yball_eat ? action : + i == Ykey_1_eat ? action : + i == Ykey_2_eat ? action : + i == Ykey_3_eat ? action : + i == Ykey_4_eat ? action : + i == Ykey_5_eat ? action : + i == Ykey_6_eat ? action : + i == Ykey_7_eat ? action : + i == Ykey_8_eat ? action : + i == Ylenses_eat ? action : + i == Ymagnify_eat ? action : + i == Ygrass_eat ? action : + i == Ydirt_eat ? action : + i == Xsand_stonein_1 ? action : + i == Xsand_stonein_2 ? action : + i == Xsand_stonein_3 ? action : + i == Xsand_stonein_4 ? action : + i == Xsand_stoneout_1 ? action : + i == Xsand_stoneout_2 ? action : + i == Xboom_android ? ACTION_EXPLODING : + action_exploding ? ACTION_EXPLODING : + action_active ? action : + action_other ? action : + ACTION_DEFAULT); + int graphic = (el_act_dir2img(effective_element, effective_action, + direction)); + int crumbled = (el_act_dir2crm(effective_element, effective_action, + direction)); + int base_graphic = el_act2img(effective_element, ACTION_DEFAULT); + int base_crumbled = el_act2crm(effective_element, ACTION_DEFAULT); + boolean has_action_graphics = (graphic != base_graphic); + boolean has_crumbled_graphics = (base_crumbled != base_graphic); + struct GraphicInfo *g = &graphic_info[graphic]; +#if 0 + struct GraphicInfo *g_crumbled = &graphic_info[crumbled]; +#endif + struct GraphicInfo_EM *g_em = &graphic_info_em_object[i][7 - j]; + Bitmap *src_bitmap; + int src_x, src_y; + /* ensure to get symmetric 3-frame, 2-delay animations as used in EM */ + boolean special_animation = (action != ACTION_DEFAULT && + g->anim_frames == 3 && + g->anim_delay == 2 && + g->anim_mode & ANIM_LINEAR); + xxx_sync_frame = (i == Xdrip_stretch ? 7 : + i == Xdrip_stretchB ? 7 : + i == Ydrip_s2 ? j + 8 : + i == Ydrip_s2B ? j + 8 : + i == Xacid_1 ? 0 : + i == Xacid_2 ? 10 : + i == Xacid_3 ? 20 : + i == Xacid_4 ? 30 : + i == Xacid_5 ? 40 : + i == Xacid_6 ? 50 : + i == Xacid_7 ? 60 : + i == Xacid_8 ? 70 : + i == Xfake_acid_1 ? 0 : + i == Xfake_acid_2 ? 10 : + i == Xfake_acid_3 ? 20 : + i == Xfake_acid_4 ? 30 : + i == Xfake_acid_5 ? 40 : + i == Xfake_acid_6 ? 50 : + i == Xfake_acid_7 ? 60 : + i == Xfake_acid_8 ? 70 : + i == Xball_2 ? 7 : + i == Xball_2B ? j + 8 : + i == Yball_eat ? j + 1 : + i == Ykey_1_eat ? j + 1 : + i == Ykey_2_eat ? j + 1 : + i == Ykey_3_eat ? j + 1 : + i == Ykey_4_eat ? j + 1 : + i == Ykey_5_eat ? j + 1 : + i == Ykey_6_eat ? j + 1 : + i == Ykey_7_eat ? j + 1 : + i == Ykey_8_eat ? j + 1 : + i == Ylenses_eat ? j + 1 : + i == Ymagnify_eat ? j + 1 : + i == Ygrass_eat ? j + 1 : + i == Ydirt_eat ? j + 1 : + i == Xamoeba_1 ? 0 : + i == Xamoeba_2 ? 1 : + i == Xamoeba_3 ? 2 : + i == Xamoeba_4 ? 3 : + i == Xamoeba_5 ? 0 : + i == Xamoeba_6 ? 1 : + i == Xamoeba_7 ? 2 : + i == Xamoeba_8 ? 3 : + i == Xexit_2 ? j + 8 : + i == Xexit_3 ? j + 16 : + i == Xdynamite_1 ? 0 : + i == Xdynamite_2 ? 8 : + i == Xdynamite_3 ? 16 : + i == Xdynamite_4 ? 24 : + i == Xsand_stonein_1 ? j + 1 : + i == Xsand_stonein_2 ? j + 9 : + i == Xsand_stonein_3 ? j + 17 : + i == Xsand_stonein_4 ? j + 25 : + i == Xsand_stoneout_1 && j == 0 ? 0 : + i == Xsand_stoneout_1 && j == 1 ? 0 : + i == Xsand_stoneout_1 && j == 2 ? 1 : + i == Xsand_stoneout_1 && j == 3 ? 2 : + i == Xsand_stoneout_1 && j == 4 ? 2 : + i == Xsand_stoneout_1 && j == 5 ? 3 : + i == Xsand_stoneout_1 && j == 6 ? 4 : + i == Xsand_stoneout_1 && j == 7 ? 4 : + i == Xsand_stoneout_2 && j == 0 ? 5 : + i == Xsand_stoneout_2 && j == 1 ? 6 : + i == Xsand_stoneout_2 && j == 2 ? 7 : + i == Xsand_stoneout_2 && j == 3 ? 8 : + i == Xsand_stoneout_2 && j == 4 ? 9 : + i == Xsand_stoneout_2 && j == 5 ? 11 : + i == Xsand_stoneout_2 && j == 6 ? 13 : + i == Xsand_stoneout_2 && j == 7 ? 15 : + i == Xboom_bug && j == 1 ? 2 : + i == Xboom_bug && j == 2 ? 2 : + i == Xboom_bug && j == 3 ? 4 : + i == Xboom_bug && j == 4 ? 4 : + i == Xboom_bug && j == 5 ? 2 : + i == Xboom_bug && j == 6 ? 2 : + i == Xboom_bug && j == 7 ? 0 : + i == Xboom_bomb && j == 1 ? 2 : + i == Xboom_bomb && j == 2 ? 2 : + i == Xboom_bomb && j == 3 ? 4 : + i == Xboom_bomb && j == 4 ? 4 : + i == Xboom_bomb && j == 5 ? 2 : + i == Xboom_bomb && j == 6 ? 2 : + i == Xboom_bomb && j == 7 ? 0 : + i == Xboom_android && j == 7 ? 6 : + i == Xboom_1 && j == 1 ? 2 : + i == Xboom_1 && j == 2 ? 2 : + i == Xboom_1 && j == 3 ? 4 : + i == Xboom_1 && j == 4 ? 4 : + i == Xboom_1 && j == 5 ? 6 : + i == Xboom_1 && j == 6 ? 6 : + i == Xboom_1 && j == 7 ? 8 : + i == Xboom_2 && j == 0 ? 8 : + i == Xboom_2 && j == 1 ? 8 : + i == Xboom_2 && j == 2 ? 10 : + i == Xboom_2 && j == 3 ? 10 : + i == Xboom_2 && j == 4 ? 10 : + i == Xboom_2 && j == 5 ? 12 : + i == Xboom_2 && j == 6 ? 12 : + i == Xboom_2 && j == 7 ? 12 : + special_animation && j == 4 ? 3 : + effective_action != action ? 0 : + j); + + xxx_effective_action = effective_action; + xxx_has_action_graphics = has_action_graphics; + } + } +#endif + int frame = getAnimationFrame(g->anim_frames, g->anim_delay, g->anim_mode, g->anim_start_frame, sync_frame); + +#if 0 + return; +#endif + +#if 0 + if (frame_em == 7) + return; +#endif + +#if 0 + int old_src_x = g_em->src_x; + int old_src_y = g_em->src_y; +#endif + +#if 1 + getGraphicSourceExt(graphic, frame, &g_em->bitmap, &g_em->src_x, &g_em->src_y, + g->double_movement && is_backside); +#else getGraphicSourceExt(graphic, frame, &g_em->bitmap, &g_em->src_x, &g_em->src_y, FALSE); +#endif + + +#if 0 + return; +#endif + +#if 0 + if (frame_em == 7) + { + if (graphic == IMG_BUG_MOVING_RIGHT) + printf("::: %d, %d, %d: %d, %d [%d, %d -> %d, %d]\n", graphic, x, y, + g->double_movement, is_backside, + old_src_x, old_src_y, g_em->src_x, g_em->src_y); + + return; + } +#endif + + +#if 0 + g_em->src_offset_x = 0; + g_em->src_offset_y = 0; + g_em->dst_offset_x = 0; + g_em->dst_offset_y = 0; + g_em->width = TILEX; + g_em->height = TILEY; + + g_em->preserve_background = FALSE; +#endif /* (updating the "crumbled" graphic definitions is probably not really needed, as animations for crumbled graphics can't be longer than one EMC cycle) */ @@ -6361,6 +6811,86 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em, g_em->has_crumbled_graphics = TRUE; } #endif + +#if 0 + { + int effective_action = xxx_effective_action; + int has_action_graphics = xxx_has_action_graphics; + + if ((!g->double_movement && (effective_action == ACTION_FALLING || + effective_action == ACTION_MOVING || + effective_action == ACTION_PUSHING || + effective_action == ACTION_EATING)) || + (!has_action_graphics && (effective_action == ACTION_FILLING || + effective_action == ACTION_EMPTYING))) + { + int move_dir = + (effective_action == ACTION_FALLING || + effective_action == ACTION_FILLING || + effective_action == ACTION_EMPTYING ? MV_DOWN : direction); + int dx = (move_dir == MV_LEFT ? -1 : move_dir == MV_RIGHT ? 1 : 0); + int dy = (move_dir == MV_UP ? -1 : move_dir == MV_DOWN ? 1 : 0); + int num_steps = (i == Ydrip_s1 ? 16 : + i == Ydrip_s1B ? 16 : + i == Ydrip_s2 ? 16 : + i == Ydrip_s2B ? 16 : + i == Xsand_stonein_1 ? 32 : + i == Xsand_stonein_2 ? 32 : + i == Xsand_stonein_3 ? 32 : + i == Xsand_stonein_4 ? 32 : + i == Xsand_stoneout_1 ? 16 : + i == Xsand_stoneout_2 ? 16 : 8); + int cx = ABS(dx) * (TILEX / num_steps); + int cy = ABS(dy) * (TILEY / num_steps); + int step_frame = (i == Ydrip_s2 ? j + 8 : + i == Ydrip_s2B ? j + 8 : + i == Xsand_stonein_2 ? j + 8 : + i == Xsand_stonein_3 ? j + 16 : + i == Xsand_stonein_4 ? j + 24 : + i == Xsand_stoneout_2 ? j + 8 : j) + 1; + int step = (is_backside ? step_frame : num_steps - step_frame); + + if (is_backside) /* tile where movement starts */ + { + if (dx < 0 || dy < 0) + { + g_em->src_offset_x = cx * step; + g_em->src_offset_y = cy * step; + } + else + { + g_em->dst_offset_x = cx * step; + g_em->dst_offset_y = cy * step; + } + } + else /* tile where movement ends */ + { + if (dx < 0 || dy < 0) + { + g_em->dst_offset_x = cx * step; + g_em->dst_offset_y = cy * step; + } + else + { + g_em->src_offset_x = cx * step; + g_em->src_offset_y = cy * step; + } + } + + g_em->width = TILEX - cx * step; + g_em->height = TILEY - cy * step; + } + + /* create unique graphic identifier to decide if tile must be redrawn */ + /* bit 31 - 16 (16 bit): EM style graphic + bit 15 - 12 ( 4 bit): EM style frame + bit 11 - 6 ( 6 bit): graphic width + bit 5 - 0 ( 6 bit): graphic height */ + g_em->unique_identifier = + (graphic << 16) | (frame << 12) | (g_em->width << 6) | g_em->height; + } +#endif + } void getGraphicSourcePlayerExt_EM(struct GraphicInfo_EM *g_em,