# TODO it seems that EL::SAND has to be used instead of EL.SAND. What to do? module EL # "real" level file elements UNDEFINED = -1 # TODO: maybe change to nil? # TODO: make EL_CHAR(c) usable (probably something like Element.fromChar(c)) #define EL_CHAR(c) (EL_CHAR_ASCII0 + MAP_FONT_ASCII(c)) def token_name(id) @@nameInfo[id][0] end def class_name(id) @@nameInfo[id][1] end def editor_description(id) @@nameInfo[id][2] end def EL._el(token, description = nil, elClass = nil, id = nil, makeConstant = true) id = id ? id : $_tmp; $_tmp = id + 1 elClass = token[0, token.index(".")] if !elClass && token.index(".") elClass = token[0, token.index("_")] if !elClass && token.index("_") elClass = token if !elClass description = token.gsub(/_/, " ") if !description @@nameInfo[id] = [token, elClass, description] module_eval "#{token.gsub(/\./, "_").gsub(/\[|\]/, "").upcase} = #{id}" if makeConstant end @@nameInfo = [] # ----------------------------------------------------------------------- # "real" level file elements # ----------------------------------------------------------------------- _el "empty_space", nil, "empty_space", 0 EMPTY = EMPTY_SPACE _el "sand" _el "wall", "normal wall" _el "wall_slippery", "slippery wall" _el "rock" _el "key_obsolete", "key (OBSOLETE)", "obsolete" _el "emerald" _el "exit_closed", "closed exit" _el "player_obsolete", "player (OBSOLETE)", "obsolete" _el "bug", "bug (random start direction)" _el "spaceship", "spaceship (random start direction)" _el "yamyam", "yam yam (random start direction)" _el "robot" _el "steelwall", "steel wall" _el "diamond" _el "amoeba_dead", "dead amoeba" _el "quicksand_empty", "empty quicksand" _el "quicksand_full", "quicksand with rock" _el "amoeba_drop" _el "bomb" _el "magic_wall", nil, "magic_wall" _el "speed_pill", nil, "speed_pill" _el "acid" _el "amoeba_wet", "dropping amoeba (EM style)" _el "amoeba_dry", "normal amoeba" _el "nut", "nut with emerald" _el "game_of_life", "Conway's wall of life", "game_of_life" _el "biomaze" _el "dynamite.active", "burning dynamite" _el "stoneblock", "wall", "wall" _el "robot_wheel", "magic wheel", "robot_wheel" _el "robot_wheel.active", "magic wheel (running)", "robot_wheel" (1..4).each do |i| _el "key_#{i}" end (1..4).each do |i| _el "gate_#{i}", "door #{i}" end (1..4).each do |i| _el "gate_#{i}_gray", "gray door (opened by key #{i})" end _el "dynamite" _el "pacman", "pac man (random start direction)" _el "invisible_wall", "invisible normal wall", "wall" _el "lamp", "lamp (off)" _el "lamp.active", "lamp (on)" _el "wall_emerald", "wall with emerald" _el "wall_diamond", "wall with diamond" _el "amoeba_full", "amoeba with content" _el "bd_amoeba", "amoeba (BD style)", "bd_amoeba" _el "time_orb_full", "time orb (full)", "time_orb_full" _el "time_orb_empty", "time orb (empty)", "time_orb_empty" _el "expandable_wall", "growing wall (horizontal, visible)", "wall" _el "bd_diamond", "diamond (BD style)", "bd_diamond" _el "emerald_yellow", "yellow emerald" _el "wall_bd_diamond", "wall with BD style diamond" _el "wall_emerald_yellow", "wall with yellow emerald" _el "dark_yamyam", "dark yam yam", "dark_yamyam" _el "bd_magic_wall", "magic wall (BD style)", "bd_magic_wall" _el "invisible_steelwall", "invisible steel wall", "steelwall" _el "sokoban_field_player", "sokoban field with player" _el "dynabomb_increase_number", "increases number of bombs" _el "dynabomb_increase_size", "increases explosion size" _el "dynabomb_increase_power", "increases power of explosion" _el "sokoban_object" _el "sokoban_field_empty", "sokoban empty field" _el "sokoban_field_full", "sokoban field with object" "butterfly,firefly".split(",").each do |t| "right,up,left,down".split(",").each do |d| _el "bd_#{t}.#{d}", "#{t} (starts moving #{d})" end "1down,2left,3up,4right".split(",").each do |d| module_eval "BD_#{t.upcase}_#{d[0]} = BD_#{t.upcase}_#{d[1..5].upcase}" end end _el "bd_butterfly", "butterfly (random start direction)", "bd_butterfly" _el "bd_firefly", "firefly (random start direction)", "bd_firefly" (1..4).each do |i| _el "player_#{i}" end "bug,spaceship,pacman".split(",").each do |t| "right,up,left,down".split(",").each do |d| _el "#{t}.#{d}", (t == "pacman" ? "pac man" : t) + " (starts moving #{d})" end end _el "emerald_red", "red emerald" _el "emerald_purple", "purple emerald" _el "wall_emerald_red", "wall with red emerald" _el "wall_emerald_purple", "wall with purple emerald" _el "acid_pool_topleft", "acid pool (top left)", "wall" _el "acid_pool_topright", "acid pool (top right)", "wall" _el "acid_pool_bottomleft", "acid pool (bottom left)", "wall" _el "acid_pool_bottom", "acid pool (bottom)", "wall" _el "acid_pool_bottomright", "acid pool (bottom right)", "wall" _el "bd_wall", "normal wall (BD style)", "wall" _el "bd_rock", "rock (BD style)", "bd_rock" _el "exit_open", "open exit" _el "black_orb", "black orb bomb", "black_orb" _el "amoeba_to_diamond", "amoeba" _el "mole", "mole (random start direction)" _el "penguin" _el "satellite" "left,right,up,down".split(",").each do |i| _el "arrow_#{i}" end _el "pig" _el "dragon", "fire breathing dragon" _el "em_key_1_file_obsolete", "key (OBSOLETE)", "obsolete" # TODO TODO TODO UNFINISHED CHAR_START = 120 CHAR_ASCII0 = CHAR_START - 32 CHAR_ASCII0_START = CHAR_ASCII0 + 32 $_tmp = CHAR_START { "space" => " ", "exclam" => "!", "quotedbl" => "\"", "numbersign" => "#", "dollar" => "$", "percent" => "%", "ampersand" => "&", "apostrophe" => "'", "parenleft" => "(", "parenright" => ")", "asterisk" => "*", "plus" => "+", "comma" => ",", "minus" => "-", "period" => ".", "slash" => "/", "0" => "0", "1" => "1", "2" => "2", "3" => "3", "4" => "4", "5" => "5", "6" => "6", "7" => "7", "8" => "8", "9" => "9", "colon" => ":", "semicolon" => ";", "less" => "<", "equal" => "=", "greater" => ">", "question" => "?", "at" => "@", "a" => "A", "b" => "B", "c" => "C", "d" => "D", "e" => "E", "f" => "F", "g" => "G", "h" => "H", "i" => "I", "j" => "J", "k" => "K", "l" => "L", "m" => "M", "n" => "N", "o" => "O", "p" => "P", "q" => "Q", "r" => "R", "s" => "S", "t" => "T", "u" => "U", "v" => "V", "w" => "W", "x" => "X", "y" => "Y", "z" => "Z", "bracketleft" => "[", "backslash" => "\\", "bracketright" => "]", "asciicircum" => "^", "underscore" => "_", "copyright" => "\xa9", "aumlaut" => "\xc4", "oumlaut" => "\xd6", "uumlaut" => "\xdc", "degree" => "\xb0", "trademark" => "\xae", "cursor" => "\xa0" }.each do |id, ch| _el "char_#{id}", "letter '#{ch}'" end 9.times do _el "char_unused", "letter ''", nil, nil, false end CHAR_ASCII0_END = CHAR_ASCII0 + 111 CHAR_END = CHAR_START + 79 _el "expandable_wall_horizontal", "growing wall (horizontal)", "wall", 200 _el "expandable_wall_vertical", "growing wall (vertical)", "wall" _el "expandable_wall_any", "growing wall (any direction)", "wall" (1..4).each do |i| _el "em_gate_#{i}", "door #{i} (EM style)", "gate" end (2..4).each do |i| _el "em_key_#{i}_file_obsolete", "key (OBSOLETE)", "obsolete" end SP_START = 210 _el "sp_empty_space", "empty space", "empty_space", SP_START SP_EMPTY = SP_EMPTY_SPACE _el "sp_zonk", "zonk", "sp_zonk" _el "sp_base", "base", "sp_base" _el "sp_murphy", "murphy", "player" _el "sp_infotron", "infotron", "sp_infotron" _el "sp_chip_single", "chip (single)", "wall" _el "sp_hardware_gray", "hardware", "wall" _el "sp_exit_closed", "exit", "sp_exit" _el "sp_disk_orange", "orange disk", "sp_disk_orange" "right,down,left,up".split(",").each do |i| _el "sp_port_#{i}", "port (leading #{i})", "sp_port" end "right,down,left,up".split(",").each do |i| _el "sp_gravity_port_#{i}", "gravity port (leading #{i})", "sp_port" end _el "sp_sniksnak", "snik snak", "sp_sniksnak" _el "sp_disk_yellow", "yellow disk", "sp_disk_yellow" _el "sp_terminal", "terminal", "sp_terminal" _el "sp_disk_red", "red disk", "dynamite" _el "sp_port_vertical", "port (vertical)", "sp_port" _el "sp_port_horizontal", "port (horizontal)", "sp_port" _el "sp_port_any", "port (any direction)", "sp_port" _el "sp_electron", "electron", "sp_electron" _el "sp_buggy_base", "buggy base", "sp_buggy_base" _el "sp_chip_left", "chip (left half)", "wall" _el "sp_chip_right", "chip (right half)", "wall" _el "sp_hardware_base_1", "hardware", "wall" "green,blue,red,yellow".split(",").each do |i| _el "sp_hardware_#{i}", "hardware", "wall" end (2..6).each do |i| _el "sp_hardware_base_#{i}", "hardware", "wall" end _el "sp_chip_top", "chip (upper half)", "wall" _el "sp_chip_bottom", "chip (lower half)", "wall" $_tmp = 250 (1..4).each do |i| _el "em_gate_#{i}_gray", "gray door (EM style, key #{i})", "gate" end _el "em_dynamite", "dynamite (EM style)", "dynamite" _el "em_dynamite.active", "burning dynamite (EM style)", "dynamite" _el "pearl" _el "crystal" _el "wall_pearl", "wall with pearl" _el "wall_crystal", "wall with crystal" _el "door_white", "white door", "gate" _el "door_white_gray", "gray door (opened by white key)", "gate" _el "key_white", "white key" _el "shield_normal", "shield (normal)", "shield_normal" _el "extra_time", nil, "extra_time" _el "switchgate_open", "switch gate (open)" _el "switchgate_closed", "switch gate (closed)" _el "switchgate_switch_up", "switch for switch gate", "switchgate_switch" _el "switchgate_switch_down", "switch for switch gate", "switchgate_switch" _el "unused_269", "-" _el "unused_270", "-" (1..4).each do |i| "left,middle,right".split(",").each do |d| _el "conveyor_belt_#{i}_#{d}", "conveyor belt #{i} (#{d})", "conveyor_belt" end "left,middle,right".split(",").each do |d| _el "conveyor_belt_#{i}_switch_#{d}", "switch for conveyor belt #{i} (#{d})", "conveyor_belt_switch" end end _el "landmine", "land mine", "sand" _el "envelope_obsolete", "envelope (OBSOLETE)", "obsolete" _el "light_switch", "light switch (off)", "light_switch" _el "light_switch.active", "light switch (on)", "light_switch" _el "sign_exclamation", "sign (exclamation)", "wall" _el "sign_radioactivity", "sign (radio activity)", "wall" _el "sign_stop", "sign (stop)", "wall" _el "sign_wheelchair", "sign (wheel chair)", "wall" _el "sign_parking", "sign (parking)", "wall" _el "sign_oneway", "sign (one way)", "wall" _el "sign_heart", "sign (heart)", "wall" _el "sign_triangle", "sign (triangle)", "wall" _el "sign_round", "sign (round)", "wall" _el "sign_exit", "sign (exit)", "wall" _el "sign_yinyang", "sign (yin yang)", "wall" _el "sign_other", "sign (other)", "wall" "left,right,up,down".split(",").each do |i| _el "mole.#{i}", "mole (starts moving #{i})" end _el "steelwall_slippery", "slippery steel wall" _el "invisible_sand", "invisible sand", "sand" _el "dx_unknown_15", "dx unknown element 15", "unknown" _el "dx_unknown_42", "dx unknown element 42", "unknown" _el "unused_319", "(not used)" _el "unused_320", "(not used)" _el "shield_deadly", "shield (deadly, kills enemies)", "shield_deadly" _el "timegate_open", "time gate (open)" _el "timegate_closed", "time gate (closed)" _el "timegate_switch.active", "switch for time gate", "timegate_switch" _el "timegate_switch", "switch for time gate", "timegate_switch" _el "balloon" _el "balloon_switch_left", "wind switch (left)", "balloon_switch" _el "balloon_switch_right", "wind switch (right)", "balloon_switch" _el "balloon_switch_up", "wind switch (up)", "balloon_switch" _el "balloon_switch_down", "wind switch (down)", "balloon_switch" _el "balloon_switch_any", "wind switch (any direction)", "balloon_switch" (1..4).each do |i| _el "emc_steelwall_#{i}", "steel wall", "steelwall" end (1..8).each do |i| _el "emc_wall_#{i}", "normal wall", "wall" end _el "tube_any", "tube (any direction)" "vv,hh,vv_left,vv_right,hh_up,hh_down,left_up,left_down,right_up,right_down".split(",").each do |i| i = i.gsub(/vv/,"vertical").gsub(/hh/,"horizontal") # to shorten the above string _el "tube_#{i}", "tube (#{i.gsub(/_/,' & ')})" end _el "spring" _el "trap" _el "dx_supabomb", "stable bomb (DX style)", "bomb" _el "unused_358", "-" _el "unused_359", "-" $_tmp = CUSTOM_START = 360 NUM_CUSTOM_ELEMENTS = 256 (1..NUM_CUSTOM_ELEMENTS).each do |i| _el "custom_#{i}", "custom element #{i}" end CUSTOM_END = 615 (1..4).each do |i| _el "em_key_#{i}", "key #{i} (EM style)", "key" end (1..4).each do |i| _el "envelope_#{i}", "mail envelope #{i}" end GROUP_START = 624 NUM_GROUP_ELEMENTS = 32 GROUP_END = 655 (1..NUM_GROUP_ELEMENTS).each do |i| _el "group_#{i}", "group element #{i}" end _el "unknown", "unknown element" _el "trigger_element", "element triggering change" _el "trigger_player", "player triggering change" _el "sp_gravity_on_port_right", "gravity on port (leading right)", "sp_port" _el "sp_gravity_on_port_down", "gravity on port (leading down)", "sp_port" _el "sp_gravity_on_port_left", "gravity on port (leading left)", "sp_port" _el "sp_gravity_on_port_up", "gravity on port (leading up)", "sp_port" _el "sp_gravity_off_port_right", "gravity off port (leading right)", "sp_port" _el "sp_gravity_off_port_down", "gravity off port (leading down)", "sp_port" _el "sp_gravity_off_port_left", "gravity off port (leading left)", "sp_port" _el "sp_gravity_off_port_up", "gravity off port (leading up)", "sp_port" _el "balloon_switch_none", "wind switch (off)", "balloon_switch" (5..8).each do |i| _el "emc_gate_#{i}", "door #{i} (EMC style)", "gate" end (5..8).each do |i| _el "emc_gate_#{i}_gray", "gray door (EMC style, key #{i})", "gate" end (5..8).each do |i| _el "emc_key_#{i}", "key #{i} (EMC style)", "key" end _el "emc_android", "android", "emc_android" _el "emc_grass", "grass", "emc_grass" _el "emc_magic_ball", "magic ball", "emc_magic_ball" _el "emc_magic_ball.active", "magic ball (activated)", "emc_magic_ball" _el "emc_magic_ball_switch", "magic ball switch (off)", "emc_magic_ball_switch" _el "emc_magic_ball_switch.active", "magic ball switch (on)", "emc_magic_ball_switch" _el "emc_spring_bumper", "spring bumper", "emc_spring_bumper" _el "emc_plant", "plant", "emc_plant" _el "emc_lenses", "lenses", "emc_lenses" _el "emc_magnifier", "magnifier", "emc_magnifier" (9..16).each do |i| _el "emc_wall_#{i}", "normal wall", "wall" end (1..4).each do |i| _el "emc_wall_slippery_#{i}", "slippery wall", "wall" end _el "emc_fake_grass", "fake grass", "fake_grass" _el "emc_fake_acid", "fake acid", "fake_acid" _el "emc_dripper", "dripper", "dripper" _el "trigger_ce_value", "CE value of element triggering change" _el "trigger_ce_score", "CE score of element triggering change" _el "current_ce_value", "CE value of current element" _el "current_ce_score", "CE score of current element" [ "left", "right", "up", "down" ].each do |i| _el "yamyam.#{i}", "yam yam (starts moving #{i})" end _el "bd_expandable_wall", "growing wall (horizontal, BD style)", "wall" (1..8).each do |i| _el "prev_ce_#{9-i}", "CE #{9-i} position#{9-i==1?"":"s"} earlier in list", "prev_ce" end _el "self", "the current custom element" (1..8).each do |i| _el "next_ce_#{i}", "CE #{i} position#{i==1?"":"s"} later in list", "next_ce" end _el "any_element", "this element matches any element", "any_element" NUM_FILE_ELEMENTS = 732 # ----------------------------------------------------------------------- # "real" (and therefore drawable) runtime elements # ----------------------------------------------------------------------- $_tmp = FIRST_RUNTIME_REAL = NUM_FILE_ELEMENTS (1..4).each do |i| _el "dynabomb_player_#{i}.active", "-" end _el "sp_disk_red.active", "-", "dynamite" _el "switchgate.opening", "-" _el "switchgate.closing", "-" _el "timegate.opening", "-" _el "timegate.closing", "-" _el "pearl.breaking", "-" _el "trap.active", "-" _el "invisible_steelwall.active", "-", "steelwall" _el "invisible_wall.active", "-", "wall" _el "invisible_sand.active", "-", "sand" (1..4).each do |i| [ "left", "middle", "right" ].each do |d| _el "conveyor_belt_#{i}_#{d}.active", "-", "conveyor_belt" end end _el "exit.opening", "-" _el "exit.closing", "-" _el "sp_exit.opening", "-" _el "sp_exit.closing", "-" _el "sp_exit_open", "-", "sp_exit" _el "sp_terminal.active", "-" _el "sp_buggy_base.activating", "-" _el "sp_buggy_base.active", "-" _el "sp_murphy_clone", "-", "murphy_clone" _el "amoeba.dropping", "-" _el "quicksand.emptying", "-" _el "magic_wall.active", "-" _el "bd_magic_wall.active", "-", "magic_wall" _el "magic_wall_full", "-", "magic_wall" _el "bd_magic_wall_full", "-", "magic_wall" _el "magic_wall.emptying", "-", "magic_wall" _el "bd_magic_wall.emptying", "-", "magic_wall" _el "magic_wall_dead", "-", "magic_wall" _el "bd_magic_wall_dead", "-", "magic_wall" _el "emc_fake_grass.active", "-", "fake_grass" (1..4).each do |i| _el "gate_#{i}_gray.active", "" end (1..8).each do |i| _el "em_gate_#{i}_gray.active", "", "gate" end _el "emc_dripper.active", "dripper", "dripper" _el "emc_spring_bumper.active", "spring bumper", "emc_spring_bumper" # ----------------------------------------------------------------------- # "unreal" (and therefore not drawable) runtime elements # ----------------------------------------------------------------------- $_tmp = FIRST_RUNTIME_UNREAL = FIRST_RUNTIME_REAL + 60 _el "blocked", "-", "-" _el "explosion", "-", "-" _el "nut.breaking", "-", "-" _el "diamond.breaking", "-", "-" _el "acid_splash_left", "-", "-" _el "acid_splash_right", "-", "-" _el "amoeba.growing", "-", "-" _el "amoeba.shrinking", "-", "-" _el "expandable_wall.growing", "-", "-" _el "flames", "-", "-" _el "player_is_leaving", "-", "-" (1..4).each do |i| _el "player_is_exploding_#{i}", "-", "-" end _el "quicksand.filling", "-" _el "magic_wall.filling", "-", "-" _el "bd_magic_wall.filling", "-", "-" _el "element.snapping", "-", "-" _el "diagonal.shrinking", "-", "-" _el "diagonal.growing", "-", "-" NUM_RUNTIME_ELEMENTS = FIRST_RUNTIME_UNREAL + 21 # ----------------------------------------------------------------------- # dummy elements (never used as game elements, only used as graphics) # ----------------------------------------------------------------------- $_tmp = FIRST_DUMMY = NUM_RUNTIME_ELEMENTS _el "steelwall_topleft", "-", "-" _el "steelwall_topright", "-", "-" _el "steelwall_bottomleft", "-", "-" _el "steelwall_bottomright", "-", "-" _el "steelwall_horizontal", "-", "-" _el "steelwall_vertical", "-", "-" _el "invisible_steelwall_topleft", "-", "-" _el "invisible_steelwall_topright", "-", "-" _el "invisible_steelwall_bottomleft", "-", "-" _el "invisible_steelwall_bottomright", "-", "-" _el "invisible_steelwall_horizontal", "-", "-" _el "invisible_steelwall_vertical", "-", "-" _el "dynabomb", "-", "-" _el "dynabomb.active", "-", "-" (1..4).each do |i| _el "dynabomb_player_#{i}", "-", "-" end _el "shield_normal.active", "-", "-" _el "shield_deadly.active", "-", "-" _el "amoeba", "-" _el "[default]", "-", "default" _el "[bd_default]", "-", "bd_default" _el "[sp_default]", "-", "sp_default" _el "[sb_default]", "-", "sb_default" $_tmp = FIRST_INTERNAL = FIRST_DUMMY + 25 _el "internal_clipboard_custom", "empty custom element" _el "internal_clipboard_change", "empty change page" _el "internal_clipboard_group", "empty group element" _el "internal_dummy", "-" _el "internal_cascade_bd", "show Boulder Dash elements" _el "internal_cascade_bd.active", "hide Boulder Dash elements" _el "internal_cascade_em", "show Emerald Mine elements" _el "internal_cascade_em.active", "hide Emerald Mine elements" _el "internal_cascade_emc", "show Emerald Mine Club elements" _el "internal_cascade_emc.active", "hide Emerald Mine Club elements" _el "internal_cascade_rnd", "show Rocks'n'Diamonds elements" _el "internal_cascade_rnd.active", "hide Rocks'n'Diamonds elements" _el "internal_cascade_sb", "show Sokoban elements" _el "internal_cascade_sb.active", "hide Sokoban elements" _el "internal_cascade_sp", "show Supaplex elements" _el "internal_cascade_sp.active", "hide Supaplex elements" _el "internal_cascade_dc", "show Diamond Caves II elements" _el "internal_cascade_dc.active", "hide Diamond Caves II elements" _el "internal_cascade_dx", "show DX Boulderdash elements" _el "internal_cascade_dx.active", "hide DX Boulderdash elements" _el "internal_cascade_chars", "show text elements" _el "internal_cascade_chars.active", "hide text elements" _el "internal_cascade_ce", "show custom elements" _el "internal_cascade_ce.active", "hide custom elements" _el "internal_cascade_ge", "show group elements" _el "internal_cascade_ge.active", "hide group elements" _el "internal_cascade_ref", "show reference elements" _el "internal_cascade_ref.active", "hide reference elements" _el "internal_cascade_user", "show user defined elements" _el "internal_cascade_user.active", "hide user defined elements" _el "internal_cascade_dynamic", "show elements used in this level" _el "internal_cascade_dynamic.active", "hide elements used in this level" INTERNAL_CLIPBOARD_START = FIRST_INTERNAL + 0 INTERNAL_CLIPBOARD_END = FIRST_INTERNAL + 2 INTERNAL_START = FIRST_INTERNAL INTERNAL_END = FIRST_INTERNAL + 31 MAX_NUM_ELEMENTS = FIRST_INTERNAL + 32 end