From 28e4091c1dd856b5c19df39846dbd60e1690197f Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sat, 16 Jan 2021 14:28:18 +0000 Subject: [PATCH] New upstream version 1.18 --- CHANGELOG | 89 + COPYING | 340 + INSTALL | 50 + Makefile.in | 64 + Makefile.mingw | 38 + README | 102 + actions.h | 54 + browser/chroma-script.js | 7396 +++++++++++++++++ browser/chroma-style.css | 522 ++ browser/chroma.html | 121 + browser/graphics-marble.svg | 687 ++ browser/graphics-marble.xml | 309 + browser/graphics-neon.svg | 1300 +++ browser/graphics-neon.xml | 310 + browser/graphics-xor.png | Bin 0 -> 5026 bytes browser/graphics-xor.xml | 113 + browser/graphics-zen.svg | 203 + browser/graphics-zen.xml | 251 + browser/levels.xml | 831 ++ browser/preview-marble.svg | 85 + browser/preview-neon.svg | 127 + browser/preview-xor.svg | 17 + browser/preview-zen.svg | 30 + chroma.h | 30 + chroma.nsi | 2723 ++++++ colours.c | 408 + colours.h | 42 + colours/chroma-enhanced.chroma | 77 + colours/chroma-enigma.chroma | 77 + colours/chroma-monochrome.chroma | 77 + colours/chroma-reverse.chroma | 77 + colours/chroma-standard.chroma | 77 + colours/fallback.chroma | 6 + configure | 4298 ++++++++++ configure.ac | 113 + cursesdisplay.c | 1872 +++++ cursesmenudisplay.c | 887 ++ display.h | 34 + editor.c | 1118 +++ engine.c | 1528 ++++ enigma.c | 312 + graphics.c | 1746 ++++ graphics.h | 130 + graphics/chroma-marble.chroma | 323 + graphics/chroma-marble/16_arrow_blue_down.png | Bin 0 -> 692 bytes graphics/chroma-marble/16_arrow_blue_left.png | Bin 0 -> 679 bytes .../chroma-marble/16_arrow_blue_right.png | Bin 0 -> 686 bytes graphics/chroma-marble/16_arrow_blue_up.png | Bin 0 -> 651 bytes .../chroma-marble/16_arrow_green_down.png | Bin 0 -> 702 bytes .../chroma-marble/16_arrow_green_left.png | Bin 0 -> 686 bytes .../chroma-marble/16_arrow_green_right.png | Bin 0 -> 688 bytes graphics/chroma-marble/16_arrow_green_up.png | Bin 0 -> 653 bytes graphics/chroma-marble/16_arrow_red_down.png | Bin 0 -> 696 bytes graphics/chroma-marble/16_arrow_red_left.png | Bin 0 -> 677 bytes graphics/chroma-marble/16_arrow_red_right.png | Bin 0 -> 682 bytes graphics/chroma-marble/16_arrow_red_up.png | Bin 0 -> 654 bytes .../chroma-marble/16_arrow_shadow_down.png | Bin 0 -> 243 bytes .../chroma-marble/16_arrow_shadow_left.png | Bin 0 -> 216 bytes .../chroma-marble/16_arrow_shadow_right.png | Bin 0 -> 221 bytes graphics/chroma-marble/16_arrow_shadow_up.png | Bin 0 -> 238 bytes graphics/chroma-marble/16_bomb_blue_down.png | Bin 0 -> 836 bytes graphics/chroma-marble/16_bomb_blue_left.png | Bin 0 -> 843 bytes graphics/chroma-marble/16_bomb_blue_right.png | Bin 0 -> 856 bytes graphics/chroma-marble/16_bomb_blue_up.png | Bin 0 -> 841 bytes graphics/chroma-marble/16_bomb_green_down.png | Bin 0 -> 836 bytes graphics/chroma-marble/16_bomb_green_left.png | Bin 0 -> 847 bytes .../chroma-marble/16_bomb_green_right.png | Bin 0 -> 854 bytes graphics/chroma-marble/16_bomb_green_up.png | Bin 0 -> 841 bytes graphics/chroma-marble/16_bomb_red_down.png | Bin 0 -> 835 bytes graphics/chroma-marble/16_bomb_red_left.png | Bin 0 -> 846 bytes graphics/chroma-marble/16_bomb_red_right.png | Bin 0 -> 855 bytes graphics/chroma-marble/16_bomb_red_up.png | Bin 0 -> 841 bytes .../chroma-marble/16_bomb_shadow_down.png | Bin 0 -> 175 bytes .../chroma-marble/16_bomb_shadow_left.png | Bin 0 -> 175 bytes .../chroma-marble/16_bomb_shadow_right.png | Bin 0 -> 175 bytes graphics/chroma-marble/16_bomb_shadow_up.png | Bin 0 -> 175 bytes graphics/chroma-marble/16_circle.png | Bin 0 -> 832 bytes graphics/chroma-marble/16_circle_double.png | Bin 0 -> 890 bytes .../chroma-marble/16_circle_double_shadow.png | Bin 0 -> 260 bytes graphics/chroma-marble/16_circle_shadow.png | Bin 0 -> 260 bytes graphics/chroma-marble/16_door.png | Bin 0 -> 788 bytes graphics/chroma-marble/16_door_shadow.png | Bin 0 -> 216 bytes graphics/chroma-marble/16_dots.png | Bin 0 -> 224 bytes graphics/chroma-marble/16_dots_double.png | Bin 0 -> 382 bytes .../chroma-marble/16_dots_double_shadow.png | Bin 0 -> 200 bytes graphics/chroma-marble/16_dots_shadow.png | Bin 0 -> 315 bytes graphics/chroma-marble/16_dots_x.png | Bin 0 -> 337 bytes graphics/chroma-marble/16_dots_x_shadow.png | Bin 0 -> 222 bytes graphics/chroma-marble/16_dots_y.png | Bin 0 -> 305 bytes graphics/chroma-marble/16_dots_y_shadow.png | Bin 0 -> 334 bytes graphics/chroma-marble/16_map_bottom_left.png | Bin 0 -> 868 bytes .../chroma-marble/16_map_bottom_right.png | Bin 0 -> 862 bytes graphics/chroma-marble/16_map_shadow.png | Bin 0 -> 371 bytes graphics/chroma-marble/16_map_top_left.png | Bin 0 -> 862 bytes graphics/chroma-marble/16_map_top_right.png | Bin 0 -> 878 bytes graphics/chroma-marble/16_player_one.png | Bin 0 -> 715 bytes .../chroma-marble/16_player_one_swapped.png | Bin 0 -> 740 bytes graphics/chroma-marble/16_player_shadow.png | Bin 0 -> 223 bytes graphics/chroma-marble/16_player_two.png | Bin 0 -> 709 bytes .../chroma-marble/16_player_two_swapped.png | Bin 0 -> 726 bytes graphics/chroma-marble/16_space.png | Bin 0 -> 8161 bytes graphics/chroma-marble/16_star.png | Bin 0 -> 659 bytes graphics/chroma-marble/16_star_shadow.png | Bin 0 -> 305 bytes graphics/chroma-marble/16_switch.png | Bin 0 -> 743 bytes graphics/chroma-marble/16_switch_shadow.png | Bin 0 -> 175 bytes graphics/chroma-marble/16_teleport.png | Bin 0 -> 753 bytes graphics/chroma-marble/16_teleport_shadow.png | Bin 0 -> 175 bytes graphics/chroma-marble/16_wall.png | Bin 0 -> 8996 bytes graphics/chroma-marble/16_wall_inside.png | Bin 0 -> 150 bytes .../chroma-marble/16_wall_inside_shadow.png | Bin 0 -> 308 bytes graphics/chroma-marble/16_wall_outside.png | Bin 0 -> 240 bytes .../chroma-marble/16_wall_outside_shadow.png | Bin 0 -> 310 bytes graphics/chroma-marble/16_wall_x.png | Bin 0 -> 123 bytes graphics/chroma-marble/16_wall_x_shadow.png | Bin 0 -> 302 bytes graphics/chroma-marble/16_wall_y.png | Bin 0 -> 128 bytes graphics/chroma-marble/16_wall_y_shadow.png | Bin 0 -> 304 bytes graphics/chroma-marble/20_arrow_blue_down.png | Bin 0 -> 918 bytes graphics/chroma-marble/20_arrow_blue_left.png | Bin 0 -> 876 bytes .../chroma-marble/20_arrow_blue_right.png | Bin 0 -> 1031 bytes graphics/chroma-marble/20_arrow_blue_up.png | Bin 0 -> 843 bytes .../chroma-marble/20_arrow_green_down.png | Bin 0 -> 930 bytes .../chroma-marble/20_arrow_green_left.png | Bin 0 -> 895 bytes .../chroma-marble/20_arrow_green_right.png | Bin 0 -> 905 bytes graphics/chroma-marble/20_arrow_green_up.png | Bin 0 -> 842 bytes graphics/chroma-marble/20_arrow_red_down.png | Bin 0 -> 909 bytes graphics/chroma-marble/20_arrow_red_left.png | Bin 0 -> 877 bytes graphics/chroma-marble/20_arrow_red_right.png | Bin 0 -> 1029 bytes graphics/chroma-marble/20_arrow_red_up.png | Bin 0 -> 843 bytes .../chroma-marble/20_arrow_shadow_down.png | Bin 0 -> 255 bytes .../chroma-marble/20_arrow_shadow_left.png | Bin 0 -> 235 bytes .../chroma-marble/20_arrow_shadow_right.png | Bin 0 -> 373 bytes graphics/chroma-marble/20_arrow_shadow_up.png | Bin 0 -> 251 bytes graphics/chroma-marble/20_bomb_blue_down.png | Bin 0 -> 1155 bytes graphics/chroma-marble/20_bomb_blue_left.png | Bin 0 -> 1162 bytes graphics/chroma-marble/20_bomb_blue_right.png | Bin 0 -> 1171 bytes graphics/chroma-marble/20_bomb_blue_up.png | Bin 0 -> 1157 bytes graphics/chroma-marble/20_bomb_green_down.png | Bin 0 -> 1155 bytes graphics/chroma-marble/20_bomb_green_left.png | Bin 0 -> 1168 bytes .../chroma-marble/20_bomb_green_right.png | Bin 0 -> 1176 bytes graphics/chroma-marble/20_bomb_green_up.png | Bin 0 -> 1163 bytes graphics/chroma-marble/20_bomb_red_down.png | Bin 0 -> 1147 bytes graphics/chroma-marble/20_bomb_red_left.png | Bin 0 -> 1164 bytes graphics/chroma-marble/20_bomb_red_right.png | Bin 0 -> 1167 bytes graphics/chroma-marble/20_bomb_red_up.png | Bin 0 -> 1160 bytes .../chroma-marble/20_bomb_shadow_down.png | Bin 0 -> 315 bytes .../chroma-marble/20_bomb_shadow_left.png | Bin 0 -> 315 bytes .../chroma-marble/20_bomb_shadow_right.png | Bin 0 -> 315 bytes graphics/chroma-marble/20_bomb_shadow_up.png | Bin 0 -> 315 bytes graphics/chroma-marble/20_circle.png | Bin 0 -> 1093 bytes graphics/chroma-marble/20_circle_double.png | Bin 0 -> 1217 bytes .../chroma-marble/20_circle_double_shadow.png | Bin 0 -> 280 bytes graphics/chroma-marble/20_circle_shadow.png | Bin 0 -> 280 bytes graphics/chroma-marble/20_door.png | Bin 0 -> 1013 bytes graphics/chroma-marble/20_door_shadow.png | Bin 0 -> 336 bytes graphics/chroma-marble/20_dots.png | Bin 0 -> 243 bytes graphics/chroma-marble/20_dots_double.png | Bin 0 -> 445 bytes .../chroma-marble/20_dots_double_shadow.png | Bin 0 -> 227 bytes graphics/chroma-marble/20_dots_shadow.png | Bin 0 -> 194 bytes graphics/chroma-marble/20_dots_x.png | Bin 0 -> 442 bytes graphics/chroma-marble/20_dots_x_shadow.png | Bin 0 -> 254 bytes graphics/chroma-marble/20_dots_y.png | Bin 0 -> 393 bytes graphics/chroma-marble/20_dots_y_shadow.png | Bin 0 -> 225 bytes graphics/chroma-marble/20_map_bottom_left.png | Bin 0 -> 1059 bytes .../chroma-marble/20_map_bottom_right.png | Bin 0 -> 1035 bytes graphics/chroma-marble/20_map_shadow.png | Bin 0 -> 341 bytes graphics/chroma-marble/20_map_top_left.png | Bin 0 -> 1045 bytes graphics/chroma-marble/20_map_top_right.png | Bin 0 -> 1062 bytes graphics/chroma-marble/20_player_one.png | Bin 0 -> 972 bytes .../chroma-marble/20_player_one_swapped.png | Bin 0 -> 936 bytes graphics/chroma-marble/20_player_shadow.png | Bin 0 -> 236 bytes graphics/chroma-marble/20_player_two.png | Bin 0 -> 934 bytes .../chroma-marble/20_player_two_swapped.png | Bin 0 -> 932 bytes graphics/chroma-marble/20_space.png | Bin 0 -> 12894 bytes graphics/chroma-marble/20_star.png | Bin 0 -> 857 bytes graphics/chroma-marble/20_star_shadow.png | Bin 0 -> 341 bytes graphics/chroma-marble/20_switch.png | Bin 0 -> 961 bytes graphics/chroma-marble/20_switch_shadow.png | Bin 0 -> 315 bytes graphics/chroma-marble/20_teleport.png | Bin 0 -> 965 bytes graphics/chroma-marble/20_teleport_shadow.png | Bin 0 -> 315 bytes graphics/chroma-marble/20_wall.png | Bin 0 -> 11939 bytes graphics/chroma-marble/20_wall_inside.png | Bin 0 -> 168 bytes .../chroma-marble/20_wall_inside_shadow.png | Bin 0 -> 313 bytes graphics/chroma-marble/20_wall_outside.png | Bin 0 -> 309 bytes .../chroma-marble/20_wall_outside_shadow.png | Bin 0 -> 315 bytes graphics/chroma-marble/20_wall_x.png | Bin 0 -> 128 bytes graphics/chroma-marble/20_wall_x_shadow.png | Bin 0 -> 306 bytes graphics/chroma-marble/20_wall_y.png | Bin 0 -> 132 bytes graphics/chroma-marble/20_wall_y_shadow.png | Bin 0 -> 309 bytes graphics/chroma-marble/24_arrow_blue_down.png | Bin 0 -> 1200 bytes graphics/chroma-marble/24_arrow_blue_left.png | Bin 0 -> 1130 bytes .../chroma-marble/24_arrow_blue_right.png | Bin 0 -> 1153 bytes graphics/chroma-marble/24_arrow_blue_up.png | Bin 0 -> 1134 bytes .../chroma-marble/24_arrow_green_down.png | Bin 0 -> 1199 bytes .../chroma-marble/24_arrow_green_left.png | Bin 0 -> 1152 bytes .../chroma-marble/24_arrow_green_right.png | Bin 0 -> 1159 bytes graphics/chroma-marble/24_arrow_green_up.png | Bin 0 -> 1139 bytes graphics/chroma-marble/24_arrow_red_down.png | Bin 0 -> 1197 bytes graphics/chroma-marble/24_arrow_red_left.png | Bin 0 -> 1132 bytes graphics/chroma-marble/24_arrow_red_right.png | Bin 0 -> 1156 bytes graphics/chroma-marble/24_arrow_red_up.png | Bin 0 -> 1138 bytes .../chroma-marble/24_arrow_shadow_down.png | Bin 0 -> 287 bytes .../chroma-marble/24_arrow_shadow_left.png | Bin 0 -> 258 bytes .../chroma-marble/24_arrow_shadow_right.png | Bin 0 -> 258 bytes graphics/chroma-marble/24_arrow_shadow_up.png | Bin 0 -> 278 bytes graphics/chroma-marble/24_bomb_blue_down.png | Bin 0 -> 1511 bytes graphics/chroma-marble/24_bomb_blue_left.png | Bin 0 -> 1550 bytes graphics/chroma-marble/24_bomb_blue_right.png | Bin 0 -> 1544 bytes graphics/chroma-marble/24_bomb_blue_up.png | Bin 0 -> 1522 bytes graphics/chroma-marble/24_bomb_green_down.png | Bin 0 -> 1524 bytes graphics/chroma-marble/24_bomb_green_left.png | Bin 0 -> 1556 bytes .../chroma-marble/24_bomb_green_right.png | Bin 0 -> 1552 bytes graphics/chroma-marble/24_bomb_green_up.png | Bin 0 -> 1537 bytes graphics/chroma-marble/24_bomb_red_down.png | Bin 0 -> 1512 bytes graphics/chroma-marble/24_bomb_red_left.png | Bin 0 -> 1545 bytes graphics/chroma-marble/24_bomb_red_right.png | Bin 0 -> 1540 bytes graphics/chroma-marble/24_bomb_red_up.png | Bin 0 -> 1524 bytes .../chroma-marble/24_bomb_shadow_down.png | Bin 0 -> 206 bytes .../chroma-marble/24_bomb_shadow_left.png | Bin 0 -> 206 bytes .../chroma-marble/24_bomb_shadow_right.png | Bin 0 -> 206 bytes graphics/chroma-marble/24_bomb_shadow_up.png | Bin 0 -> 206 bytes graphics/chroma-marble/24_circle.png | Bin 0 -> 1382 bytes graphics/chroma-marble/24_circle_double.png | Bin 0 -> 1581 bytes .../chroma-marble/24_circle_double_shadow.png | Bin 0 -> 296 bytes graphics/chroma-marble/24_circle_shadow.png | Bin 0 -> 296 bytes graphics/chroma-marble/24_door.png | Bin 0 -> 1363 bytes graphics/chroma-marble/24_door_shadow.png | Bin 0 -> 253 bytes graphics/chroma-marble/24_dots.png | Bin 0 -> 250 bytes graphics/chroma-marble/24_dots_double.png | Bin 0 -> 501 bytes .../chroma-marble/24_dots_double_shadow.png | Bin 0 -> 237 bytes graphics/chroma-marble/24_dots_shadow.png | Bin 0 -> 192 bytes graphics/chroma-marble/24_dots_x.png | Bin 0 -> 527 bytes graphics/chroma-marble/24_dots_x_shadow.png | Bin 0 -> 270 bytes graphics/chroma-marble/24_dots_y.png | Bin 0 -> 477 bytes graphics/chroma-marble/24_dots_y_shadow.png | Bin 0 -> 238 bytes graphics/chroma-marble/24_map_bottom_left.png | Bin 0 -> 1634 bytes .../chroma-marble/24_map_bottom_right.png | Bin 0 -> 1620 bytes graphics/chroma-marble/24_map_shadow.png | Bin 0 -> 568 bytes graphics/chroma-marble/24_map_top_left.png | Bin 0 -> 1624 bytes graphics/chroma-marble/24_map_top_right.png | Bin 0 -> 1608 bytes graphics/chroma-marble/24_player_one.png | Bin 0 -> 1260 bytes .../chroma-marble/24_player_one_swapped.png | Bin 0 -> 1231 bytes graphics/chroma-marble/24_player_shadow.png | Bin 0 -> 268 bytes graphics/chroma-marble/24_player_two.png | Bin 0 -> 1208 bytes .../chroma-marble/24_player_two_swapped.png | Bin 0 -> 1168 bytes graphics/chroma-marble/24_space.png | Bin 0 -> 15372 bytes graphics/chroma-marble/24_star.png | Bin 0 -> 1098 bytes graphics/chroma-marble/24_star_shadow.png | Bin 0 -> 389 bytes graphics/chroma-marble/24_switch.png | Bin 0 -> 1236 bytes graphics/chroma-marble/24_switch_shadow.png | Bin 0 -> 206 bytes graphics/chroma-marble/24_teleport.png | Bin 0 -> 1245 bytes graphics/chroma-marble/24_teleport_shadow.png | Bin 0 -> 206 bytes graphics/chroma-marble/24_wall.png | Bin 0 -> 15587 bytes graphics/chroma-marble/24_wall_inside.png | Bin 0 -> 205 bytes .../chroma-marble/24_wall_inside_shadow.png | Bin 0 -> 318 bytes graphics/chroma-marble/24_wall_outside.png | Bin 0 -> 341 bytes .../chroma-marble/24_wall_outside_shadow.png | Bin 0 -> 185 bytes graphics/chroma-marble/24_wall_x.png | Bin 0 -> 133 bytes graphics/chroma-marble/24_wall_x_shadow.png | Bin 0 -> 178 bytes graphics/chroma-marble/24_wall_y.png | Bin 0 -> 142 bytes graphics/chroma-marble/24_wall_y_shadow.png | Bin 0 -> 314 bytes graphics/chroma-marble/32_arrow_blue_down.png | Bin 0 -> 1766 bytes graphics/chroma-marble/32_arrow_blue_left.png | Bin 0 -> 1690 bytes .../chroma-marble/32_arrow_blue_right.png | Bin 0 -> 1710 bytes graphics/chroma-marble/32_arrow_blue_up.png | Bin 0 -> 1704 bytes .../chroma-marble/32_arrow_green_down.png | Bin 0 -> 1811 bytes .../chroma-marble/32_arrow_green_left.png | Bin 0 -> 1744 bytes .../chroma-marble/32_arrow_green_right.png | Bin 0 -> 1730 bytes graphics/chroma-marble/32_arrow_green_up.png | Bin 0 -> 1722 bytes graphics/chroma-marble/32_arrow_red_down.png | Bin 0 -> 1744 bytes graphics/chroma-marble/32_arrow_red_left.png | Bin 0 -> 1677 bytes graphics/chroma-marble/32_arrow_red_right.png | Bin 0 -> 1700 bytes graphics/chroma-marble/32_arrow_red_up.png | Bin 0 -> 1701 bytes .../chroma-marble/32_arrow_shadow_down.png | Bin 0 -> 329 bytes .../chroma-marble/32_arrow_shadow_left.png | Bin 0 -> 297 bytes .../chroma-marble/32_arrow_shadow_right.png | Bin 0 -> 293 bytes graphics/chroma-marble/32_arrow_shadow_up.png | Bin 0 -> 324 bytes graphics/chroma-marble/32_bomb_blue_down.png | Bin 0 -> 2251 bytes graphics/chroma-marble/32_bomb_blue_left.png | Bin 0 -> 2328 bytes graphics/chroma-marble/32_bomb_blue_right.png | Bin 0 -> 2319 bytes graphics/chroma-marble/32_bomb_blue_up.png | Bin 0 -> 2303 bytes graphics/chroma-marble/32_bomb_green_down.png | Bin 0 -> 2322 bytes graphics/chroma-marble/32_bomb_green_left.png | Bin 0 -> 2376 bytes .../chroma-marble/32_bomb_green_right.png | Bin 0 -> 2367 bytes graphics/chroma-marble/32_bomb_green_up.png | Bin 0 -> 2356 bytes graphics/chroma-marble/32_bomb_red_down.png | Bin 0 -> 2288 bytes graphics/chroma-marble/32_bomb_red_left.png | Bin 0 -> 2325 bytes graphics/chroma-marble/32_bomb_red_right.png | Bin 0 -> 2323 bytes graphics/chroma-marble/32_bomb_red_up.png | Bin 0 -> 2293 bytes .../chroma-marble/32_bomb_shadow_down.png | Bin 0 -> 210 bytes .../chroma-marble/32_bomb_shadow_left.png | Bin 0 -> 210 bytes .../chroma-marble/32_bomb_shadow_right.png | Bin 0 -> 210 bytes graphics/chroma-marble/32_bomb_shadow_up.png | Bin 0 -> 210 bytes graphics/chroma-marble/32_circle.png | Bin 0 -> 2045 bytes graphics/chroma-marble/32_circle_double.png | Bin 0 -> 2431 bytes .../chroma-marble/32_circle_double_shadow.png | Bin 0 -> 335 bytes graphics/chroma-marble/32_circle_shadow.png | Bin 0 -> 335 bytes graphics/chroma-marble/32_door.png | Bin 0 -> 1955 bytes graphics/chroma-marble/32_door_shadow.png | Bin 0 -> 268 bytes graphics/chroma-marble/32_dots.png | Bin 0 -> 335 bytes graphics/chroma-marble/32_dots_double.png | Bin 0 -> 673 bytes .../chroma-marble/32_dots_double_shadow.png | Bin 0 -> 277 bytes graphics/chroma-marble/32_dots_shadow.png | Bin 0 -> 220 bytes graphics/chroma-marble/32_dots_x.png | Bin 0 -> 702 bytes graphics/chroma-marble/32_dots_x_shadow.png | Bin 0 -> 296 bytes graphics/chroma-marble/32_dots_y.png | Bin 0 -> 634 bytes graphics/chroma-marble/32_dots_y_shadow.png | Bin 0 -> 272 bytes graphics/chroma-marble/32_map_bottom_left.png | Bin 0 -> 2270 bytes .../chroma-marble/32_map_bottom_right.png | Bin 0 -> 2263 bytes graphics/chroma-marble/32_map_shadow.png | Bin 0 -> 688 bytes graphics/chroma-marble/32_map_top_left.png | Bin 0 -> 2281 bytes graphics/chroma-marble/32_map_top_right.png | Bin 0 -> 2269 bytes graphics/chroma-marble/32_player_one.png | Bin 0 -> 1893 bytes .../chroma-marble/32_player_one_swapped.png | Bin 0 -> 1752 bytes graphics/chroma-marble/32_player_shadow.png | Bin 0 -> 288 bytes graphics/chroma-marble/32_player_two.png | Bin 0 -> 1730 bytes .../chroma-marble/32_player_two_swapped.png | Bin 0 -> 1677 bytes graphics/chroma-marble/32_space.png | Bin 0 -> 24114 bytes graphics/chroma-marble/32_star.png | Bin 0 -> 1594 bytes graphics/chroma-marble/32_star_shadow.png | Bin 0 -> 457 bytes graphics/chroma-marble/32_switch.png | Bin 0 -> 1744 bytes graphics/chroma-marble/32_switch_shadow.png | Bin 0 -> 210 bytes graphics/chroma-marble/32_teleport.png | Bin 0 -> 1832 bytes graphics/chroma-marble/32_teleport_shadow.png | Bin 0 -> 210 bytes graphics/chroma-marble/32_wall.png | Bin 0 -> 24258 bytes graphics/chroma-marble/32_wall_inside.png | Bin 0 -> 239 bytes .../chroma-marble/32_wall_inside_shadow.png | Bin 0 -> 330 bytes graphics/chroma-marble/32_wall_outside.png | Bin 0 -> 440 bytes .../chroma-marble/32_wall_outside_shadow.png | Bin 0 -> 196 bytes graphics/chroma-marble/32_wall_x.png | Bin 0 -> 144 bytes graphics/chroma-marble/32_wall_x_shadow.png | Bin 0 -> 185 bytes graphics/chroma-marble/32_wall_y.png | Bin 0 -> 155 bytes graphics/chroma-marble/32_wall_y_shadow.png | Bin 0 -> 323 bytes graphics/chroma-marble/40_arrow_blue_down.png | Bin 0 -> 2170 bytes graphics/chroma-marble/40_arrow_blue_left.png | Bin 0 -> 2186 bytes .../chroma-marble/40_arrow_blue_right.png | Bin 0 -> 2120 bytes graphics/chroma-marble/40_arrow_blue_up.png | Bin 0 -> 2082 bytes .../chroma-marble/40_arrow_green_down.png | Bin 0 -> 2242 bytes .../chroma-marble/40_arrow_green_left.png | Bin 0 -> 2248 bytes .../chroma-marble/40_arrow_green_right.png | Bin 0 -> 2190 bytes graphics/chroma-marble/40_arrow_green_up.png | Bin 0 -> 2127 bytes graphics/chroma-marble/40_arrow_red_down.png | Bin 0 -> 2193 bytes graphics/chroma-marble/40_arrow_red_left.png | Bin 0 -> 2193 bytes graphics/chroma-marble/40_arrow_red_right.png | Bin 0 -> 2118 bytes graphics/chroma-marble/40_arrow_red_up.png | Bin 0 -> 2084 bytes .../chroma-marble/40_arrow_shadow_down.png | Bin 0 -> 366 bytes .../chroma-marble/40_arrow_shadow_left.png | Bin 0 -> 331 bytes .../chroma-marble/40_arrow_shadow_right.png | Bin 0 -> 329 bytes graphics/chroma-marble/40_arrow_shadow_up.png | Bin 0 -> 364 bytes graphics/chroma-marble/40_bomb_blue_down.png | Bin 0 -> 2879 bytes graphics/chroma-marble/40_bomb_blue_left.png | Bin 0 -> 2938 bytes graphics/chroma-marble/40_bomb_blue_right.png | Bin 0 -> 2983 bytes graphics/chroma-marble/40_bomb_blue_up.png | Bin 0 -> 2902 bytes graphics/chroma-marble/40_bomb_green_down.png | Bin 0 -> 2974 bytes graphics/chroma-marble/40_bomb_green_left.png | Bin 0 -> 3014 bytes .../chroma-marble/40_bomb_green_right.png | Bin 0 -> 3085 bytes graphics/chroma-marble/40_bomb_green_up.png | Bin 0 -> 2996 bytes graphics/chroma-marble/40_bomb_red_down.png | Bin 0 -> 2913 bytes graphics/chroma-marble/40_bomb_red_left.png | Bin 0 -> 2942 bytes graphics/chroma-marble/40_bomb_red_right.png | Bin 0 -> 3017 bytes graphics/chroma-marble/40_bomb_red_up.png | Bin 0 -> 2922 bytes .../chroma-marble/40_bomb_shadow_down.png | Bin 0 -> 222 bytes .../chroma-marble/40_bomb_shadow_left.png | Bin 0 -> 222 bytes .../chroma-marble/40_bomb_shadow_right.png | Bin 0 -> 222 bytes graphics/chroma-marble/40_bomb_shadow_up.png | Bin 0 -> 222 bytes graphics/chroma-marble/40_circle.png | Bin 0 -> 2739 bytes graphics/chroma-marble/40_circle_double.png | Bin 0 -> 3417 bytes .../chroma-marble/40_circle_double_shadow.png | Bin 0 -> 447 bytes graphics/chroma-marble/40_circle_shadow.png | Bin 0 -> 447 bytes graphics/chroma-marble/40_door.png | Bin 0 -> 2139 bytes graphics/chroma-marble/40_door_shadow.png | Bin 0 -> 250 bytes graphics/chroma-marble/40_dots.png | Bin 0 -> 416 bytes graphics/chroma-marble/40_dots_double.png | Bin 0 -> 758 bytes .../chroma-marble/40_dots_double_shadow.png | Bin 0 -> 335 bytes graphics/chroma-marble/40_dots_shadow.png | Bin 0 -> 251 bytes graphics/chroma-marble/40_dots_x.png | Bin 0 -> 1030 bytes graphics/chroma-marble/40_dots_x_shadow.png | Bin 0 -> 414 bytes graphics/chroma-marble/40_dots_y.png | Bin 0 -> 849 bytes graphics/chroma-marble/40_dots_y_shadow.png | Bin 0 -> 354 bytes graphics/chroma-marble/40_map_bottom_left.png | Bin 0 -> 1762 bytes .../chroma-marble/40_map_bottom_right.png | Bin 0 -> 1686 bytes graphics/chroma-marble/40_map_shadow.png | Bin 0 -> 559 bytes graphics/chroma-marble/40_map_top_left.png | Bin 0 -> 1739 bytes graphics/chroma-marble/40_map_top_right.png | Bin 0 -> 1741 bytes graphics/chroma-marble/40_player_one.png | Bin 0 -> 2502 bytes .../chroma-marble/40_player_one_swapped.png | Bin 0 -> 2269 bytes graphics/chroma-marble/40_player_shadow.png | Bin 0 -> 300 bytes graphics/chroma-marble/40_player_two.png | Bin 0 -> 2234 bytes .../chroma-marble/40_player_two_swapped.png | Bin 0 -> 2108 bytes graphics/chroma-marble/40_space.png | Bin 0 -> 33175 bytes graphics/chroma-marble/40_star.png | Bin 0 -> 2115 bytes graphics/chroma-marble/40_star_shadow.png | Bin 0 -> 615 bytes graphics/chroma-marble/40_switch.png | Bin 0 -> 2227 bytes graphics/chroma-marble/40_switch_shadow.png | Bin 0 -> 222 bytes graphics/chroma-marble/40_teleport.png | Bin 0 -> 2349 bytes graphics/chroma-marble/40_teleport_shadow.png | Bin 0 -> 222 bytes graphics/chroma-marble/40_wall.png | Bin 0 -> 33733 bytes graphics/chroma-marble/40_wall_inside.png | Bin 0 -> 287 bytes .../chroma-marble/40_wall_inside_shadow.png | Bin 0 -> 349 bytes graphics/chroma-marble/40_wall_outside.png | Bin 0 -> 537 bytes .../chroma-marble/40_wall_outside_shadow.png | Bin 0 -> 215 bytes graphics/chroma-marble/40_wall_x.png | Bin 0 -> 144 bytes graphics/chroma-marble/40_wall_x_shadow.png | Bin 0 -> 200 bytes graphics/chroma-marble/40_wall_y.png | Bin 0 -> 161 bytes graphics/chroma-marble/40_wall_y_shadow.png | Bin 0 -> 338 bytes graphics/chroma-marble/64_arrow_blue_down.png | Bin 0 -> 4265 bytes graphics/chroma-marble/64_arrow_blue_left.png | Bin 0 -> 4243 bytes .../chroma-marble/64_arrow_blue_right.png | Bin 0 -> 4156 bytes graphics/chroma-marble/64_arrow_blue_up.png | Bin 0 -> 4179 bytes .../chroma-marble/64_arrow_green_down.png | Bin 0 -> 4433 bytes .../chroma-marble/64_arrow_green_left.png | Bin 0 -> 4372 bytes .../chroma-marble/64_arrow_green_right.png | Bin 0 -> 4276 bytes graphics/chroma-marble/64_arrow_green_up.png | Bin 0 -> 4301 bytes graphics/chroma-marble/64_arrow_red_down.png | Bin 0 -> 4317 bytes graphics/chroma-marble/64_arrow_red_left.png | Bin 0 -> 4281 bytes graphics/chroma-marble/64_arrow_red_right.png | Bin 0 -> 4193 bytes graphics/chroma-marble/64_arrow_red_up.png | Bin 0 -> 4207 bytes .../chroma-marble/64_arrow_shadow_down.png | Bin 0 -> 552 bytes .../chroma-marble/64_arrow_shadow_left.png | Bin 0 -> 463 bytes .../chroma-marble/64_arrow_shadow_right.png | Bin 0 -> 472 bytes graphics/chroma-marble/64_arrow_shadow_up.png | Bin 0 -> 544 bytes graphics/chroma-marble/64_bomb_blue_down.png | Bin 0 -> 5968 bytes graphics/chroma-marble/64_bomb_blue_left.png | Bin 0 -> 6075 bytes graphics/chroma-marble/64_bomb_blue_right.png | Bin 0 -> 6188 bytes graphics/chroma-marble/64_bomb_blue_up.png | Bin 0 -> 5988 bytes graphics/chroma-marble/64_bomb_green_down.png | Bin 0 -> 6256 bytes graphics/chroma-marble/64_bomb_green_left.png | Bin 0 -> 6347 bytes .../chroma-marble/64_bomb_green_right.png | Bin 0 -> 6481 bytes graphics/chroma-marble/64_bomb_green_up.png | Bin 0 -> 6259 bytes graphics/chroma-marble/64_bomb_red_down.png | Bin 0 -> 6036 bytes graphics/chroma-marble/64_bomb_red_left.png | Bin 0 -> 6112 bytes graphics/chroma-marble/64_bomb_red_right.png | Bin 0 -> 6256 bytes graphics/chroma-marble/64_bomb_red_up.png | Bin 0 -> 6058 bytes .../chroma-marble/64_bomb_shadow_down.png | Bin 0 -> 333 bytes .../chroma-marble/64_bomb_shadow_left.png | Bin 0 -> 333 bytes .../chroma-marble/64_bomb_shadow_right.png | Bin 0 -> 333 bytes graphics/chroma-marble/64_bomb_shadow_up.png | Bin 0 -> 333 bytes graphics/chroma-marble/64_circle.png | Bin 0 -> 5531 bytes graphics/chroma-marble/64_circle_double.png | Bin 0 -> 6936 bytes .../chroma-marble/64_circle_double_shadow.png | Bin 0 -> 792 bytes graphics/chroma-marble/64_circle_shadow.png | Bin 0 -> 792 bytes graphics/chroma-marble/64_door.png | Bin 0 -> 4114 bytes graphics/chroma-marble/64_door_shadow.png | Bin 0 -> 617 bytes graphics/chroma-marble/64_dots.png | Bin 0 -> 718 bytes graphics/chroma-marble/64_dots_double.png | Bin 0 -> 1356 bytes .../chroma-marble/64_dots_double_shadow.png | Bin 0 -> 527 bytes graphics/chroma-marble/64_dots_shadow.png | Bin 0 -> 362 bytes graphics/chroma-marble/64_dots_x.png | Bin 0 -> 1633 bytes graphics/chroma-marble/64_dots_x_shadow.png | Bin 0 -> 688 bytes graphics/chroma-marble/64_dots_y.png | Bin 0 -> 1512 bytes graphics/chroma-marble/64_dots_y_shadow.png | Bin 0 -> 744 bytes graphics/chroma-marble/64_map_bottom_left.png | Bin 0 -> 5300 bytes .../chroma-marble/64_map_bottom_right.png | Bin 0 -> 5252 bytes graphics/chroma-marble/64_map_shadow.png | Bin 0 -> 2049 bytes graphics/chroma-marble/64_map_top_left.png | Bin 0 -> 5342 bytes graphics/chroma-marble/64_map_top_right.png | Bin 0 -> 5354 bytes graphics/chroma-marble/64_player_one.png | Bin 0 -> 5005 bytes .../chroma-marble/64_player_one_swapped.png | Bin 0 -> 4364 bytes graphics/chroma-marble/64_player_shadow.png | Bin 0 -> 489 bytes graphics/chroma-marble/64_player_two.png | Bin 0 -> 4644 bytes .../chroma-marble/64_player_two_swapped.png | Bin 0 -> 4193 bytes graphics/chroma-marble/64_space.png | Bin 0 -> 69346 bytes graphics/chroma-marble/64_star.png | Bin 0 -> 3876 bytes graphics/chroma-marble/64_star_shadow.png | Bin 0 -> 1142 bytes graphics/chroma-marble/64_switch.png | Bin 0 -> 3906 bytes graphics/chroma-marble/64_switch_shadow.png | Bin 0 -> 333 bytes graphics/chroma-marble/64_teleport.png | Bin 0 -> 4030 bytes graphics/chroma-marble/64_teleport_shadow.png | Bin 0 -> 333 bytes graphics/chroma-marble/64_wall.png | Bin 0 -> 70259 bytes graphics/chroma-marble/64_wall_inside.png | Bin 0 -> 428 bytes .../chroma-marble/64_wall_inside_shadow.png | Bin 0 -> 422 bytes graphics/chroma-marble/64_wall_outside.png | Bin 0 -> 830 bytes .../chroma-marble/64_wall_outside_shadow.png | Bin 0 -> 424 bytes graphics/chroma-marble/64_wall_x.png | Bin 0 -> 181 bytes graphics/chroma-marble/64_wall_x_shadow.png | Bin 0 -> 388 bytes graphics/chroma-marble/64_wall_y.png | Bin 0 -> 201 bytes graphics/chroma-marble/64_wall_y_shadow.png | Bin 0 -> 386 bytes graphics/chroma-neon.chroma | 327 + graphics/chroma-neon/16_arrow_blue_down.png | Bin 0 -> 755 bytes .../chroma-neon/16_arrow_blue_down_shadow.png | Bin 0 -> 903 bytes graphics/chroma-neon/16_arrow_blue_left.png | Bin 0 -> 566 bytes .../chroma-neon/16_arrow_blue_left_shadow.png | Bin 0 -> 669 bytes graphics/chroma-neon/16_arrow_blue_right.png | Bin 0 -> 566 bytes .../16_arrow_blue_right_shadow.png | Bin 0 -> 671 bytes graphics/chroma-neon/16_arrow_blue_up.png | Bin 0 -> 751 bytes .../chroma-neon/16_arrow_blue_up_shadow.png | Bin 0 -> 898 bytes graphics/chroma-neon/16_arrow_green_down.png | Bin 0 -> 748 bytes .../16_arrow_green_down_shadow.png | Bin 0 -> 913 bytes graphics/chroma-neon/16_arrow_green_left.png | Bin 0 -> 565 bytes .../16_arrow_green_left_shadow.png | Bin 0 -> 682 bytes graphics/chroma-neon/16_arrow_green_right.png | Bin 0 -> 565 bytes .../16_arrow_green_right_shadow.png | Bin 0 -> 690 bytes graphics/chroma-neon/16_arrow_green_up.png | Bin 0 -> 746 bytes .../chroma-neon/16_arrow_green_up_shadow.png | Bin 0 -> 909 bytes graphics/chroma-neon/16_arrow_red_down.png | Bin 0 -> 739 bytes .../chroma-neon/16_arrow_red_down_shadow.png | Bin 0 -> 918 bytes graphics/chroma-neon/16_arrow_red_left.png | Bin 0 -> 566 bytes .../chroma-neon/16_arrow_red_left_shadow.png | Bin 0 -> 679 bytes graphics/chroma-neon/16_arrow_red_right.png | Bin 0 -> 564 bytes .../chroma-neon/16_arrow_red_right_shadow.png | Bin 0 -> 693 bytes graphics/chroma-neon/16_arrow_red_up.png | Bin 0 -> 741 bytes .../chroma-neon/16_arrow_red_up_shadow.png | Bin 0 -> 907 bytes graphics/chroma-neon/16_bomb_blue_down.png | Bin 0 -> 693 bytes .../chroma-neon/16_bomb_blue_down_shadow.png | Bin 0 -> 1225 bytes graphics/chroma-neon/16_bomb_blue_left.png | Bin 0 -> 549 bytes .../chroma-neon/16_bomb_blue_left_shadow.png | Bin 0 -> 904 bytes graphics/chroma-neon/16_bomb_blue_right.png | Bin 0 -> 547 bytes .../chroma-neon/16_bomb_blue_right_shadow.png | Bin 0 -> 903 bytes graphics/chroma-neon/16_bomb_blue_up.png | Bin 0 -> 697 bytes .../chroma-neon/16_bomb_blue_up_shadow.png | Bin 0 -> 1231 bytes graphics/chroma-neon/16_bomb_green_down.png | Bin 0 -> 701 bytes .../chroma-neon/16_bomb_green_down_shadow.png | Bin 0 -> 1321 bytes graphics/chroma-neon/16_bomb_green_left.png | Bin 0 -> 547 bytes .../chroma-neon/16_bomb_green_left_shadow.png | Bin 0 -> 1223 bytes graphics/chroma-neon/16_bomb_green_right.png | Bin 0 -> 551 bytes .../16_bomb_green_right_shadow.png | Bin 0 -> 1231 bytes graphics/chroma-neon/16_bomb_green_up.png | Bin 0 -> 705 bytes .../chroma-neon/16_bomb_green_up_shadow.png | Bin 0 -> 1314 bytes graphics/chroma-neon/16_bomb_red_down.png | Bin 0 -> 703 bytes .../chroma-neon/16_bomb_red_down_shadow.png | Bin 0 -> 1311 bytes graphics/chroma-neon/16_bomb_red_left.png | Bin 0 -> 555 bytes .../chroma-neon/16_bomb_red_left_shadow.png | Bin 0 -> 1221 bytes graphics/chroma-neon/16_bomb_red_right.png | Bin 0 -> 550 bytes .../chroma-neon/16_bomb_red_right_shadow.png | Bin 0 -> 1225 bytes graphics/chroma-neon/16_bomb_red_up.png | Bin 0 -> 712 bytes .../chroma-neon/16_bomb_red_up_shadow.png | Bin 0 -> 1316 bytes graphics/chroma-neon/16_circle.png | Bin 0 -> 712 bytes graphics/chroma-neon/16_circle_double.png | Bin 0 -> 505 bytes .../chroma-neon/16_circle_double_shadow.png | Bin 0 -> 767 bytes graphics/chroma-neon/16_circle_shadow.png | Bin 0 -> 1038 bytes graphics/chroma-neon/16_door.png | Bin 0 -> 525 bytes graphics/chroma-neon/16_door_shadow.png | Bin 0 -> 599 bytes graphics/chroma-neon/16_dots.png | Bin 0 -> 651 bytes graphics/chroma-neon/16_dots_double.png | Bin 0 -> 852 bytes .../chroma-neon/16_dots_double_shadow.png | Bin 0 -> 781 bytes graphics/chroma-neon/16_dots_shadow.png | Bin 0 -> 417 bytes graphics/chroma-neon/16_dots_x.png | Bin 0 -> 589 bytes graphics/chroma-neon/16_dots_x_shadow.png | Bin 0 -> 461 bytes graphics/chroma-neon/16_dots_y.png | Bin 0 -> 568 bytes graphics/chroma-neon/16_dots_y_shadow.png | Bin 0 -> 455 bytes graphics/chroma-neon/16_earth.png | Bin 0 -> 468 bytes graphics/chroma-neon/16_earth_double.png | Bin 0 -> 564 bytes .../chroma-neon/16_earth_double_shadow.png | Bin 0 -> 619 bytes graphics/chroma-neon/16_earth_shadow.png | Bin 0 -> 378 bytes graphics/chroma-neon/16_earth_x.png | Bin 0 -> 442 bytes graphics/chroma-neon/16_earth_x_shadow.png | Bin 0 -> 374 bytes graphics/chroma-neon/16_earth_y.png | Bin 0 -> 417 bytes graphics/chroma-neon/16_earth_y_shadow.png | Bin 0 -> 353 bytes graphics/chroma-neon/16_map_bottom_left.png | Bin 0 -> 990 bytes .../chroma-neon/16_map_bottom_left_shadow.png | Bin 0 -> 421 bytes graphics/chroma-neon/16_map_bottom_right.png | Bin 0 -> 990 bytes .../16_map_bottom_right_shadow.png | Bin 0 -> 421 bytes graphics/chroma-neon/16_map_top_left.png | Bin 0 -> 998 bytes .../chroma-neon/16_map_top_left_shadow.png | Bin 0 -> 430 bytes graphics/chroma-neon/16_map_top_right.png | Bin 0 -> 993 bytes .../chroma-neon/16_map_top_right_shadow.png | Bin 0 -> 429 bytes graphics/chroma-neon/16_player_one.png | Bin 0 -> 588 bytes graphics/chroma-neon/16_player_one_shadow.png | Bin 0 -> 709 bytes .../chroma-neon/16_player_one_swapped.png | Bin 0 -> 529 bytes .../16_player_one_swapped_shadow.png | Bin 0 -> 536 bytes graphics/chroma-neon/16_player_two.png | Bin 0 -> 503 bytes graphics/chroma-neon/16_player_two_shadow.png | Bin 0 -> 685 bytes .../chroma-neon/16_player_two_swapped.png | Bin 0 -> 469 bytes .../16_player_two_swapped_shadow.png | Bin 0 -> 532 bytes graphics/chroma-neon/16_star.png | Bin 0 -> 840 bytes graphics/chroma-neon/16_star_shadow.png | Bin 0 -> 1038 bytes graphics/chroma-neon/16_switch.png | Bin 0 -> 393 bytes graphics/chroma-neon/16_switch_shadow.png | Bin 0 -> 483 bytes graphics/chroma-neon/16_teleport.png | Bin 0 -> 459 bytes graphics/chroma-neon/16_teleport_shadow.png | Bin 0 -> 301 bytes graphics/chroma-neon/16_wall.png | Bin 0 -> 295 bytes graphics/chroma-neon/16_wall_inside.png | Bin 0 -> 246 bytes graphics/chroma-neon/16_wall_outside.png | Bin 0 -> 228 bytes graphics/chroma-neon/16_wall_shadow.png | Bin 0 -> 698 bytes graphics/chroma-neon/16_wall_x.png | Bin 0 -> 196 bytes graphics/chroma-neon/16_wall_y.png | Bin 0 -> 204 bytes graphics/chroma-neon/20_arrow_blue_down.png | Bin 0 -> 1053 bytes .../chroma-neon/20_arrow_blue_down_shadow.png | Bin 0 -> 1259 bytes graphics/chroma-neon/20_arrow_blue_left.png | Bin 0 -> 749 bytes .../chroma-neon/20_arrow_blue_left_shadow.png | Bin 0 -> 892 bytes graphics/chroma-neon/20_arrow_blue_right.png | Bin 0 -> 748 bytes .../20_arrow_blue_right_shadow.png | Bin 0 -> 900 bytes graphics/chroma-neon/20_arrow_blue_up.png | Bin 0 -> 1056 bytes .../chroma-neon/20_arrow_blue_up_shadow.png | Bin 0 -> 1237 bytes graphics/chroma-neon/20_arrow_green_down.png | Bin 0 -> 1050 bytes .../20_arrow_green_down_shadow.png | Bin 0 -> 1277 bytes graphics/chroma-neon/20_arrow_green_left.png | Bin 0 -> 758 bytes .../20_arrow_green_left_shadow.png | Bin 0 -> 908 bytes graphics/chroma-neon/20_arrow_green_right.png | Bin 0 -> 754 bytes .../20_arrow_green_right_shadow.png | Bin 0 -> 908 bytes graphics/chroma-neon/20_arrow_green_up.png | Bin 0 -> 1053 bytes .../chroma-neon/20_arrow_green_up_shadow.png | Bin 0 -> 1262 bytes graphics/chroma-neon/20_arrow_red_down.png | Bin 0 -> 1040 bytes .../chroma-neon/20_arrow_red_down_shadow.png | Bin 0 -> 1272 bytes graphics/chroma-neon/20_arrow_red_left.png | Bin 0 -> 751 bytes .../chroma-neon/20_arrow_red_left_shadow.png | Bin 0 -> 905 bytes graphics/chroma-neon/20_arrow_red_right.png | Bin 0 -> 751 bytes .../chroma-neon/20_arrow_red_right_shadow.png | Bin 0 -> 907 bytes graphics/chroma-neon/20_arrow_red_up.png | Bin 0 -> 1050 bytes .../chroma-neon/20_arrow_red_up_shadow.png | Bin 0 -> 1247 bytes graphics/chroma-neon/20_bomb_blue_down.png | Bin 0 -> 935 bytes .../chroma-neon/20_bomb_blue_down_shadow.png | Bin 0 -> 1686 bytes graphics/chroma-neon/20_bomb_blue_left.png | Bin 0 -> 703 bytes .../chroma-neon/20_bomb_blue_left_shadow.png | Bin 0 -> 1207 bytes graphics/chroma-neon/20_bomb_blue_right.png | Bin 0 -> 706 bytes .../chroma-neon/20_bomb_blue_right_shadow.png | Bin 0 -> 1202 bytes graphics/chroma-neon/20_bomb_blue_up.png | Bin 0 -> 945 bytes .../chroma-neon/20_bomb_blue_up_shadow.png | Bin 0 -> 1665 bytes graphics/chroma-neon/20_bomb_green_down.png | Bin 0 -> 943 bytes .../chroma-neon/20_bomb_green_down_shadow.png | Bin 0 -> 1704 bytes graphics/chroma-neon/20_bomb_green_left.png | Bin 0 -> 706 bytes .../chroma-neon/20_bomb_green_left_shadow.png | Bin 0 -> 1214 bytes graphics/chroma-neon/20_bomb_green_right.png | Bin 0 -> 702 bytes .../20_bomb_green_right_shadow.png | Bin 0 -> 1227 bytes graphics/chroma-neon/20_bomb_green_up.png | Bin 0 -> 953 bytes .../chroma-neon/20_bomb_green_up_shadow.png | Bin 0 -> 1821 bytes graphics/chroma-neon/20_bomb_red_down.png | Bin 0 -> 930 bytes .../chroma-neon/20_bomb_red_down_shadow.png | Bin 0 -> 1691 bytes graphics/chroma-neon/20_bomb_red_left.png | Bin 0 -> 707 bytes .../chroma-neon/20_bomb_red_left_shadow.png | Bin 0 -> 1216 bytes graphics/chroma-neon/20_bomb_red_right.png | Bin 0 -> 701 bytes .../chroma-neon/20_bomb_red_right_shadow.png | Bin 0 -> 1224 bytes graphics/chroma-neon/20_bomb_red_up.png | Bin 0 -> 942 bytes .../chroma-neon/20_bomb_red_up_shadow.png | Bin 0 -> 1673 bytes graphics/chroma-neon/20_circle.png | Bin 0 -> 936 bytes graphics/chroma-neon/20_circle_double.png | Bin 0 -> 661 bytes .../chroma-neon/20_circle_double_shadow.png | Bin 0 -> 993 bytes graphics/chroma-neon/20_circle_shadow.png | Bin 0 -> 1374 bytes graphics/chroma-neon/20_door.png | Bin 0 -> 622 bytes graphics/chroma-neon/20_door_shadow.png | Bin 0 -> 906 bytes graphics/chroma-neon/20_dots.png | Bin 0 -> 1019 bytes graphics/chroma-neon/20_dots_double.png | Bin 0 -> 1226 bytes .../chroma-neon/20_dots_double_shadow.png | Bin 0 -> 1157 bytes graphics/chroma-neon/20_dots_shadow.png | Bin 0 -> 572 bytes graphics/chroma-neon/20_dots_x.png | Bin 0 -> 801 bytes graphics/chroma-neon/20_dots_x_shadow.png | Bin 0 -> 585 bytes graphics/chroma-neon/20_dots_y.png | Bin 0 -> 788 bytes graphics/chroma-neon/20_dots_y_shadow.png | Bin 0 -> 588 bytes graphics/chroma-neon/20_earth.png | Bin 0 -> 731 bytes graphics/chroma-neon/20_earth_double.png | Bin 0 -> 820 bytes .../chroma-neon/20_earth_double_shadow.png | Bin 0 -> 887 bytes graphics/chroma-neon/20_earth_shadow.png | Bin 0 -> 492 bytes graphics/chroma-neon/20_earth_x.png | Bin 0 -> 576 bytes graphics/chroma-neon/20_earth_x_shadow.png | Bin 0 -> 461 bytes graphics/chroma-neon/20_earth_y.png | Bin 0 -> 558 bytes graphics/chroma-neon/20_earth_y_shadow.png | Bin 0 -> 449 bytes graphics/chroma-neon/20_map_bottom_left.png | Bin 0 -> 1211 bytes .../chroma-neon/20_map_bottom_left_shadow.png | Bin 0 -> 528 bytes graphics/chroma-neon/20_map_bottom_right.png | Bin 0 -> 1199 bytes .../20_map_bottom_right_shadow.png | Bin 0 -> 540 bytes graphics/chroma-neon/20_map_top_left.png | Bin 0 -> 1216 bytes .../chroma-neon/20_map_top_left_shadow.png | Bin 0 -> 534 bytes graphics/chroma-neon/20_map_top_right.png | Bin 0 -> 1211 bytes .../chroma-neon/20_map_top_right_shadow.png | Bin 0 -> 537 bytes graphics/chroma-neon/20_player_one.png | Bin 0 -> 984 bytes graphics/chroma-neon/20_player_one_shadow.png | Bin 0 -> 975 bytes .../chroma-neon/20_player_one_swapped.png | Bin 0 -> 835 bytes .../20_player_one_swapped_shadow.png | Bin 0 -> 708 bytes graphics/chroma-neon/20_player_two.png | Bin 0 -> 681 bytes graphics/chroma-neon/20_player_two_shadow.png | Bin 0 -> 899 bytes .../chroma-neon/20_player_two_swapped.png | Bin 0 -> 640 bytes .../20_player_two_swapped_shadow.png | Bin 0 -> 675 bytes graphics/chroma-neon/20_star.png | Bin 0 -> 1211 bytes graphics/chroma-neon/20_star_shadow.png | Bin 0 -> 1389 bytes graphics/chroma-neon/20_switch.png | Bin 0 -> 517 bytes graphics/chroma-neon/20_switch_shadow.png | Bin 0 -> 592 bytes graphics/chroma-neon/20_teleport.png | Bin 0 -> 457 bytes graphics/chroma-neon/20_teleport_shadow.png | Bin 0 -> 369 bytes graphics/chroma-neon/20_wall.png | Bin 0 -> 300 bytes graphics/chroma-neon/20_wall_inside.png | Bin 0 -> 274 bytes graphics/chroma-neon/20_wall_outside.png | Bin 0 -> 246 bytes graphics/chroma-neon/20_wall_shadow.png | Bin 0 -> 847 bytes graphics/chroma-neon/20_wall_x.png | Bin 0 -> 207 bytes graphics/chroma-neon/20_wall_y.png | Bin 0 -> 221 bytes graphics/chroma-neon/24_arrow_blue_down.png | Bin 0 -> 1410 bytes .../chroma-neon/24_arrow_blue_down_shadow.png | Bin 0 -> 1614 bytes graphics/chroma-neon/24_arrow_blue_left.png | Bin 0 -> 940 bytes .../chroma-neon/24_arrow_blue_left_shadow.png | Bin 0 -> 1140 bytes graphics/chroma-neon/24_arrow_blue_right.png | Bin 0 -> 920 bytes .../24_arrow_blue_right_shadow.png | Bin 0 -> 1137 bytes graphics/chroma-neon/24_arrow_blue_up.png | Bin 0 -> 1415 bytes .../chroma-neon/24_arrow_blue_up_shadow.png | Bin 0 -> 1614 bytes graphics/chroma-neon/24_arrow_green_down.png | Bin 0 -> 1404 bytes .../24_arrow_green_down_shadow.png | Bin 0 -> 1772 bytes graphics/chroma-neon/24_arrow_green_left.png | Bin 0 -> 948 bytes .../24_arrow_green_left_shadow.png | Bin 0 -> 1168 bytes graphics/chroma-neon/24_arrow_green_right.png | Bin 0 -> 943 bytes .../24_arrow_green_right_shadow.png | Bin 0 -> 1165 bytes graphics/chroma-neon/24_arrow_green_up.png | Bin 0 -> 1408 bytes .../chroma-neon/24_arrow_green_up_shadow.png | Bin 0 -> 1774 bytes graphics/chroma-neon/24_arrow_red_down.png | Bin 0 -> 1388 bytes .../chroma-neon/24_arrow_red_down_shadow.png | Bin 0 -> 1766 bytes graphics/chroma-neon/24_arrow_red_left.png | Bin 0 -> 933 bytes .../chroma-neon/24_arrow_red_left_shadow.png | Bin 0 -> 1153 bytes graphics/chroma-neon/24_arrow_red_right.png | Bin 0 -> 927 bytes .../chroma-neon/24_arrow_red_right_shadow.png | Bin 0 -> 1155 bytes graphics/chroma-neon/24_arrow_red_up.png | Bin 0 -> 1396 bytes .../chroma-neon/24_arrow_red_up_shadow.png | Bin 0 -> 1631 bytes graphics/chroma-neon/24_bomb_blue_down.png | Bin 0 -> 1327 bytes .../chroma-neon/24_bomb_blue_down_shadow.png | Bin 0 -> 2405 bytes graphics/chroma-neon/24_bomb_blue_left.png | Bin 0 -> 1134 bytes .../chroma-neon/24_bomb_blue_left_shadow.png | Bin 0 -> 1974 bytes graphics/chroma-neon/24_bomb_blue_right.png | Bin 0 -> 1146 bytes .../chroma-neon/24_bomb_blue_right_shadow.png | Bin 0 -> 1991 bytes graphics/chroma-neon/24_bomb_blue_up.png | Bin 0 -> 1347 bytes .../chroma-neon/24_bomb_blue_up_shadow.png | Bin 0 -> 2388 bytes graphics/chroma-neon/24_bomb_green_down.png | Bin 0 -> 1312 bytes .../chroma-neon/24_bomb_green_down_shadow.png | Bin 0 -> 2415 bytes graphics/chroma-neon/24_bomb_green_left.png | Bin 0 -> 997 bytes .../chroma-neon/24_bomb_green_left_shadow.png | Bin 0 -> 1854 bytes graphics/chroma-neon/24_bomb_green_right.png | Bin 0 -> 979 bytes .../24_bomb_green_right_shadow.png | Bin 0 -> 1864 bytes graphics/chroma-neon/24_bomb_green_up.png | Bin 0 -> 1317 bytes .../chroma-neon/24_bomb_green_up_shadow.png | Bin 0 -> 2395 bytes graphics/chroma-neon/24_bomb_red_down.png | Bin 0 -> 1263 bytes .../chroma-neon/24_bomb_red_down_shadow.png | Bin 0 -> 2329 bytes graphics/chroma-neon/24_bomb_red_left.png | Bin 0 -> 992 bytes .../chroma-neon/24_bomb_red_left_shadow.png | Bin 0 -> 1816 bytes graphics/chroma-neon/24_bomb_red_right.png | Bin 0 -> 968 bytes .../chroma-neon/24_bomb_red_right_shadow.png | Bin 0 -> 1819 bytes graphics/chroma-neon/24_bomb_red_up.png | Bin 0 -> 1272 bytes .../chroma-neon/24_bomb_red_up_shadow.png | Bin 0 -> 2346 bytes graphics/chroma-neon/24_circle.png | Bin 0 -> 1202 bytes graphics/chroma-neon/24_circle_double.png | Bin 0 -> 907 bytes .../chroma-neon/24_circle_double_shadow.png | Bin 0 -> 1552 bytes graphics/chroma-neon/24_circle_shadow.png | Bin 0 -> 1801 bytes graphics/chroma-neon/24_door.png | Bin 0 -> 802 bytes graphics/chroma-neon/24_door_shadow.png | Bin 0 -> 1179 bytes graphics/chroma-neon/24_dots.png | Bin 0 -> 1141 bytes graphics/chroma-neon/24_dots_double.png | Bin 0 -> 1558 bytes .../chroma-neon/24_dots_double_shadow.png | Bin 0 -> 1514 bytes graphics/chroma-neon/24_dots_shadow.png | Bin 0 -> 656 bytes graphics/chroma-neon/24_dots_x.png | Bin 0 -> 1060 bytes graphics/chroma-neon/24_dots_x_shadow.png | Bin 0 -> 689 bytes graphics/chroma-neon/24_dots_y.png | Bin 0 -> 1032 bytes graphics/chroma-neon/24_dots_y_shadow.png | Bin 0 -> 680 bytes graphics/chroma-neon/24_earth.png | Bin 0 -> 852 bytes graphics/chroma-neon/24_earth_double.png | Bin 0 -> 1030 bytes .../chroma-neon/24_earth_double_shadow.png | Bin 0 -> 1145 bytes graphics/chroma-neon/24_earth_shadow.png | Bin 0 -> 550 bytes graphics/chroma-neon/24_earth_x.png | Bin 0 -> 746 bytes graphics/chroma-neon/24_earth_x_shadow.png | Bin 0 -> 555 bytes graphics/chroma-neon/24_earth_y.png | Bin 0 -> 713 bytes graphics/chroma-neon/24_earth_y_shadow.png | Bin 0 -> 524 bytes graphics/chroma-neon/24_map_bottom_left.png | Bin 0 -> 1796 bytes .../chroma-neon/24_map_bottom_left_shadow.png | Bin 0 -> 620 bytes graphics/chroma-neon/24_map_bottom_right.png | Bin 0 -> 1790 bytes .../24_map_bottom_right_shadow.png | Bin 0 -> 640 bytes graphics/chroma-neon/24_map_top_left.png | Bin 0 -> 1798 bytes .../chroma-neon/24_map_top_left_shadow.png | Bin 0 -> 637 bytes graphics/chroma-neon/24_map_top_right.png | Bin 0 -> 1796 bytes .../chroma-neon/24_map_top_right_shadow.png | Bin 0 -> 644 bytes graphics/chroma-neon/24_player_one.png | Bin 0 -> 1285 bytes graphics/chroma-neon/24_player_one_shadow.png | Bin 0 -> 1172 bytes .../chroma-neon/24_player_one_swapped.png | Bin 0 -> 1112 bytes .../24_player_one_swapped_shadow.png | Bin 0 -> 849 bytes graphics/chroma-neon/24_player_two.png | Bin 0 -> 880 bytes graphics/chroma-neon/24_player_two_shadow.png | Bin 0 -> 1122 bytes .../chroma-neon/24_player_two_swapped.png | Bin 0 -> 817 bytes .../24_player_two_swapped_shadow.png | Bin 0 -> 828 bytes graphics/chroma-neon/24_star.png | Bin 0 -> 1618 bytes graphics/chroma-neon/24_star_shadow.png | Bin 0 -> 1814 bytes graphics/chroma-neon/24_switch.png | Bin 0 -> 659 bytes graphics/chroma-neon/24_switch_shadow.png | Bin 0 -> 681 bytes graphics/chroma-neon/24_teleport.png | Bin 0 -> 686 bytes graphics/chroma-neon/24_teleport_shadow.png | Bin 0 -> 392 bytes graphics/chroma-neon/24_wall.png | Bin 0 -> 307 bytes graphics/chroma-neon/24_wall_inside.png | Bin 0 -> 335 bytes graphics/chroma-neon/24_wall_outside.png | Bin 0 -> 356 bytes graphics/chroma-neon/24_wall_shadow.png | Bin 0 -> 1083 bytes graphics/chroma-neon/24_wall_x.png | Bin 0 -> 219 bytes graphics/chroma-neon/24_wall_y.png | Bin 0 -> 232 bytes graphics/chroma-neon/32_arrow_blue_down.png | Bin 0 -> 2158 bytes .../chroma-neon/32_arrow_blue_down_shadow.png | Bin 0 -> 2549 bytes graphics/chroma-neon/32_arrow_blue_left.png | Bin 0 -> 1325 bytes .../chroma-neon/32_arrow_blue_left_shadow.png | Bin 0 -> 1893 bytes graphics/chroma-neon/32_arrow_blue_right.png | Bin 0 -> 1325 bytes .../32_arrow_blue_right_shadow.png | Bin 0 -> 1879 bytes graphics/chroma-neon/32_arrow_blue_up.png | Bin 0 -> 2160 bytes .../chroma-neon/32_arrow_blue_up_shadow.png | Bin 0 -> 2550 bytes graphics/chroma-neon/32_arrow_green_down.png | Bin 0 -> 2182 bytes .../32_arrow_green_down_shadow.png | Bin 0 -> 2581 bytes graphics/chroma-neon/32_arrow_green_left.png | Bin 0 -> 1350 bytes .../32_arrow_green_left_shadow.png | Bin 0 -> 1925 bytes graphics/chroma-neon/32_arrow_green_right.png | Bin 0 -> 1360 bytes .../32_arrow_green_right_shadow.png | Bin 0 -> 1922 bytes graphics/chroma-neon/32_arrow_green_up.png | Bin 0 -> 2174 bytes .../chroma-neon/32_arrow_green_up_shadow.png | Bin 0 -> 2595 bytes graphics/chroma-neon/32_arrow_red_down.png | Bin 0 -> 2150 bytes .../chroma-neon/32_arrow_red_down_shadow.png | Bin 0 -> 2586 bytes graphics/chroma-neon/32_arrow_red_left.png | Bin 0 -> 1334 bytes .../chroma-neon/32_arrow_red_left_shadow.png | Bin 0 -> 1932 bytes graphics/chroma-neon/32_arrow_red_right.png | Bin 0 -> 1344 bytes .../chroma-neon/32_arrow_red_right_shadow.png | Bin 0 -> 2058 bytes graphics/chroma-neon/32_arrow_red_up.png | Bin 0 -> 2159 bytes .../chroma-neon/32_arrow_red_up_shadow.png | Bin 0 -> 2612 bytes graphics/chroma-neon/32_bomb_blue_down.png | Bin 0 -> 1901 bytes .../chroma-neon/32_bomb_blue_down_shadow.png | Bin 0 -> 3527 bytes graphics/chroma-neon/32_bomb_blue_left.png | Bin 0 -> 1246 bytes .../chroma-neon/32_bomb_blue_left_shadow.png | Bin 0 -> 2837 bytes graphics/chroma-neon/32_bomb_blue_right.png | Bin 0 -> 1258 bytes .../chroma-neon/32_bomb_blue_right_shadow.png | Bin 0 -> 2857 bytes graphics/chroma-neon/32_bomb_blue_up.png | Bin 0 -> 1933 bytes .../chroma-neon/32_bomb_blue_up_shadow.png | Bin 0 -> 3554 bytes graphics/chroma-neon/32_bomb_green_down.png | Bin 0 -> 1926 bytes .../chroma-neon/32_bomb_green_down_shadow.png | Bin 0 -> 3490 bytes graphics/chroma-neon/32_bomb_green_left.png | Bin 0 -> 1265 bytes .../chroma-neon/32_bomb_green_left_shadow.png | Bin 0 -> 3309 bytes graphics/chroma-neon/32_bomb_green_right.png | Bin 0 -> 1278 bytes .../32_bomb_green_right_shadow.png | Bin 0 -> 3292 bytes graphics/chroma-neon/32_bomb_green_up.png | Bin 0 -> 1961 bytes .../chroma-neon/32_bomb_green_up_shadow.png | Bin 0 -> 3515 bytes graphics/chroma-neon/32_bomb_red_down.png | Bin 0 -> 1919 bytes .../chroma-neon/32_bomb_red_down_shadow.png | Bin 0 -> 3511 bytes graphics/chroma-neon/32_bomb_red_left.png | Bin 0 -> 1266 bytes .../chroma-neon/32_bomb_red_left_shadow.png | Bin 0 -> 3282 bytes graphics/chroma-neon/32_bomb_red_right.png | Bin 0 -> 1257 bytes .../chroma-neon/32_bomb_red_right_shadow.png | Bin 0 -> 3252 bytes graphics/chroma-neon/32_bomb_red_up.png | Bin 0 -> 1969 bytes .../chroma-neon/32_bomb_red_up_shadow.png | Bin 0 -> 3509 bytes graphics/chroma-neon/32_circle.png | Bin 0 -> 1818 bytes graphics/chroma-neon/32_circle_double.png | Bin 0 -> 1344 bytes .../chroma-neon/32_circle_double_shadow.png | Bin 0 -> 2290 bytes graphics/chroma-neon/32_circle_shadow.png | Bin 0 -> 2982 bytes graphics/chroma-neon/32_door.png | Bin 0 -> 1222 bytes graphics/chroma-neon/32_door_shadow.png | Bin 0 -> 1728 bytes graphics/chroma-neon/32_dots.png | Bin 0 -> 1959 bytes graphics/chroma-neon/32_dots_double.png | Bin 0 -> 2491 bytes .../chroma-neon/32_dots_double_shadow.png | Bin 0 -> 2355 bytes graphics/chroma-neon/32_dots_shadow.png | Bin 0 -> 1045 bytes graphics/chroma-neon/32_dots_x.png | Bin 0 -> 1495 bytes graphics/chroma-neon/32_dots_x_shadow.png | Bin 0 -> 1002 bytes graphics/chroma-neon/32_dots_y.png | Bin 0 -> 1467 bytes graphics/chroma-neon/32_dots_y_shadow.png | Bin 0 -> 992 bytes graphics/chroma-neon/32_earth.png | Bin 0 -> 1411 bytes graphics/chroma-neon/32_earth_double.png | Bin 0 -> 1662 bytes .../chroma-neon/32_earth_double_shadow.png | Bin 0 -> 1747 bytes graphics/chroma-neon/32_earth_shadow.png | Bin 0 -> 826 bytes graphics/chroma-neon/32_earth_x.png | Bin 0 -> 1041 bytes graphics/chroma-neon/32_earth_x_shadow.png | Bin 0 -> 890 bytes graphics/chroma-neon/32_earth_y.png | Bin 0 -> 995 bytes graphics/chroma-neon/32_earth_y_shadow.png | Bin 0 -> 722 bytes graphics/chroma-neon/32_map_bottom_left.png | Bin 0 -> 2750 bytes .../chroma-neon/32_map_bottom_left_shadow.png | Bin 0 -> 777 bytes graphics/chroma-neon/32_map_bottom_right.png | Bin 0 -> 2754 bytes .../32_map_bottom_right_shadow.png | Bin 0 -> 818 bytes graphics/chroma-neon/32_map_top_left.png | Bin 0 -> 2757 bytes .../chroma-neon/32_map_top_left_shadow.png | Bin 0 -> 810 bytes graphics/chroma-neon/32_map_top_right.png | Bin 0 -> 2758 bytes .../chroma-neon/32_map_top_right_shadow.png | Bin 0 -> 825 bytes graphics/chroma-neon/32_player_one.png | Bin 0 -> 1368 bytes graphics/chroma-neon/32_player_one_shadow.png | Bin 0 -> 1651 bytes .../chroma-neon/32_player_one_swapped.png | Bin 0 -> 1257 bytes .../32_player_one_swapped_shadow.png | Bin 0 -> 1194 bytes graphics/chroma-neon/32_player_two.png | Bin 0 -> 1387 bytes graphics/chroma-neon/32_player_two_shadow.png | Bin 0 -> 2049 bytes .../chroma-neon/32_player_two_swapped.png | Bin 0 -> 1268 bytes .../32_player_two_swapped_shadow.png | Bin 0 -> 1381 bytes graphics/chroma-neon/32_star.png | Bin 0 -> 2706 bytes graphics/chroma-neon/32_star_shadow.png | Bin 0 -> 2835 bytes graphics/chroma-neon/32_switch.png | Bin 0 -> 1001 bytes graphics/chroma-neon/32_switch_shadow.png | Bin 0 -> 1009 bytes graphics/chroma-neon/32_teleport.png | Bin 0 -> 1017 bytes graphics/chroma-neon/32_teleport_shadow.png | Bin 0 -> 504 bytes graphics/chroma-neon/32_wall.png | Bin 0 -> 314 bytes graphics/chroma-neon/32_wall_inside.png | Bin 0 -> 347 bytes graphics/chroma-neon/32_wall_outside.png | Bin 0 -> 293 bytes graphics/chroma-neon/32_wall_shadow.png | Bin 0 -> 1780 bytes graphics/chroma-neon/32_wall_x.png | Bin 0 -> 244 bytes graphics/chroma-neon/32_wall_y.png | Bin 0 -> 392 bytes graphics/chroma-neon/40_arrow_blue_down.png | Bin 0 -> 3042 bytes .../chroma-neon/40_arrow_blue_down_shadow.png | Bin 0 -> 3407 bytes graphics/chroma-neon/40_arrow_blue_left.png | Bin 0 -> 1882 bytes .../chroma-neon/40_arrow_blue_left_shadow.png | Bin 0 -> 2244 bytes graphics/chroma-neon/40_arrow_blue_right.png | Bin 0 -> 1855 bytes .../40_arrow_blue_right_shadow.png | Bin 0 -> 2392 bytes graphics/chroma-neon/40_arrow_blue_up.png | Bin 0 -> 3117 bytes .../chroma-neon/40_arrow_blue_up_shadow.png | Bin 0 -> 3410 bytes graphics/chroma-neon/40_arrow_green_down.png | Bin 0 -> 3093 bytes .../40_arrow_green_down_shadow.png | Bin 0 -> 3463 bytes graphics/chroma-neon/40_arrow_green_left.png | Bin 0 -> 1946 bytes .../40_arrow_green_left_shadow.png | Bin 0 -> 2295 bytes graphics/chroma-neon/40_arrow_green_right.png | Bin 0 -> 1922 bytes .../40_arrow_green_right_shadow.png | Bin 0 -> 2437 bytes graphics/chroma-neon/40_arrow_green_up.png | Bin 0 -> 3179 bytes .../chroma-neon/40_arrow_green_up_shadow.png | Bin 0 -> 3483 bytes graphics/chroma-neon/40_arrow_red_down.png | Bin 0 -> 3055 bytes .../chroma-neon/40_arrow_red_down_shadow.png | Bin 0 -> 3439 bytes graphics/chroma-neon/40_arrow_red_left.png | Bin 0 -> 1887 bytes .../chroma-neon/40_arrow_red_left_shadow.png | Bin 0 -> 2291 bytes graphics/chroma-neon/40_arrow_red_right.png | Bin 0 -> 1882 bytes .../chroma-neon/40_arrow_red_right_shadow.png | Bin 0 -> 2303 bytes graphics/chroma-neon/40_arrow_red_up.png | Bin 0 -> 3121 bytes .../chroma-neon/40_arrow_red_up_shadow.png | Bin 0 -> 3485 bytes graphics/chroma-neon/40_bomb_blue_down.png | Bin 0 -> 2593 bytes .../chroma-neon/40_bomb_blue_down_shadow.png | Bin 0 -> 4883 bytes graphics/chroma-neon/40_bomb_blue_left.png | Bin 0 -> 1928 bytes .../chroma-neon/40_bomb_blue_left_shadow.png | Bin 0 -> 3890 bytes graphics/chroma-neon/40_bomb_blue_right.png | Bin 0 -> 1924 bytes .../chroma-neon/40_bomb_blue_right_shadow.png | Bin 0 -> 3900 bytes graphics/chroma-neon/40_bomb_blue_up.png | Bin 0 -> 2657 bytes .../chroma-neon/40_bomb_blue_up_shadow.png | Bin 0 -> 4875 bytes graphics/chroma-neon/40_bomb_green_down.png | Bin 0 -> 2664 bytes .../chroma-neon/40_bomb_green_down_shadow.png | Bin 0 -> 4962 bytes graphics/chroma-neon/40_bomb_green_left.png | Bin 0 -> 1980 bytes .../chroma-neon/40_bomb_green_left_shadow.png | Bin 0 -> 3994 bytes graphics/chroma-neon/40_bomb_green_right.png | Bin 0 -> 1975 bytes .../40_bomb_green_right_shadow.png | Bin 0 -> 4010 bytes graphics/chroma-neon/40_bomb_green_up.png | Bin 0 -> 2708 bytes .../chroma-neon/40_bomb_green_up_shadow.png | Bin 0 -> 4953 bytes graphics/chroma-neon/40_bomb_red_down.png | Bin 0 -> 2630 bytes .../chroma-neon/40_bomb_red_down_shadow.png | Bin 0 -> 4964 bytes graphics/chroma-neon/40_bomb_red_left.png | Bin 0 -> 1938 bytes .../chroma-neon/40_bomb_red_left_shadow.png | Bin 0 -> 3976 bytes graphics/chroma-neon/40_bomb_red_right.png | Bin 0 -> 1923 bytes .../chroma-neon/40_bomb_red_right_shadow.png | Bin 0 -> 3975 bytes graphics/chroma-neon/40_bomb_red_up.png | Bin 0 -> 2655 bytes .../chroma-neon/40_bomb_red_up_shadow.png | Bin 0 -> 4949 bytes graphics/chroma-neon/40_circle.png | Bin 0 -> 2615 bytes graphics/chroma-neon/40_circle_double.png | Bin 0 -> 2205 bytes .../chroma-neon/40_circle_double_shadow.png | Bin 0 -> 3476 bytes graphics/chroma-neon/40_circle_shadow.png | Bin 0 -> 3684 bytes graphics/chroma-neon/40_door.png | Bin 0 -> 1562 bytes graphics/chroma-neon/40_door_shadow.png | Bin 0 -> 2392 bytes graphics/chroma-neon/40_dots.png | Bin 0 -> 2768 bytes graphics/chroma-neon/40_dots_double.png | Bin 0 -> 4028 bytes .../chroma-neon/40_dots_double_shadow.png | Bin 0 -> 3359 bytes graphics/chroma-neon/40_dots_shadow.png | Bin 0 -> 1392 bytes graphics/chroma-neon/40_dots_x.png | Bin 0 -> 2331 bytes graphics/chroma-neon/40_dots_x_shadow.png | Bin 0 -> 1432 bytes graphics/chroma-neon/40_dots_y.png | Bin 0 -> 2264 bytes graphics/chroma-neon/40_dots_y_shadow.png | Bin 0 -> 1502 bytes graphics/chroma-neon/40_earth.png | Bin 0 -> 1970 bytes graphics/chroma-neon/40_earth_double.png | Bin 0 -> 2648 bytes .../chroma-neon/40_earth_double_shadow.png | Bin 0 -> 2472 bytes graphics/chroma-neon/40_earth_shadow.png | Bin 0 -> 1055 bytes graphics/chroma-neon/40_earth_x.png | Bin 0 -> 1575 bytes graphics/chroma-neon/40_earth_x_shadow.png | Bin 0 -> 1039 bytes graphics/chroma-neon/40_earth_y.png | Bin 0 -> 1515 bytes graphics/chroma-neon/40_earth_y_shadow.png | Bin 0 -> 997 bytes graphics/chroma-neon/40_map_bottom_left.png | Bin 0 -> 3411 bytes .../chroma-neon/40_map_bottom_left_shadow.png | Bin 0 -> 929 bytes graphics/chroma-neon/40_map_bottom_right.png | Bin 0 -> 3383 bytes .../40_map_bottom_right_shadow.png | Bin 0 -> 954 bytes graphics/chroma-neon/40_map_top_left.png | Bin 0 -> 3395 bytes .../chroma-neon/40_map_top_left_shadow.png | Bin 0 -> 980 bytes graphics/chroma-neon/40_map_top_right.png | Bin 0 -> 3420 bytes .../chroma-neon/40_map_top_right_shadow.png | Bin 0 -> 960 bytes graphics/chroma-neon/40_player_one.png | Bin 0 -> 2956 bytes graphics/chroma-neon/40_player_one_shadow.png | Bin 0 -> 2727 bytes .../chroma-neon/40_player_one_swapped.png | Bin 0 -> 2294 bytes .../40_player_one_swapped_shadow.png | Bin 0 -> 1761 bytes graphics/chroma-neon/40_player_two.png | Bin 0 -> 2396 bytes graphics/chroma-neon/40_player_two_shadow.png | Bin 0 -> 2963 bytes .../chroma-neon/40_player_two_swapped.png | Bin 0 -> 1956 bytes .../40_player_two_swapped_shadow.png | Bin 0 -> 1927 bytes graphics/chroma-neon/40_star.png | Bin 0 -> 3890 bytes graphics/chroma-neon/40_star_shadow.png | Bin 0 -> 4013 bytes graphics/chroma-neon/40_switch.png | Bin 0 -> 1259 bytes graphics/chroma-neon/40_switch_shadow.png | Bin 0 -> 1298 bytes graphics/chroma-neon/40_teleport.png | Bin 0 -> 898 bytes graphics/chroma-neon/40_teleport_shadow.png | Bin 0 -> 582 bytes graphics/chroma-neon/40_wall.png | Bin 0 -> 325 bytes graphics/chroma-neon/40_wall_inside.png | Bin 0 -> 391 bytes graphics/chroma-neon/40_wall_outside.png | Bin 0 -> 318 bytes graphics/chroma-neon/40_wall_shadow.png | Bin 0 -> 2369 bytes graphics/chroma-neon/40_wall_x.png | Bin 0 -> 270 bytes graphics/chroma-neon/40_wall_y.png | Bin 0 -> 282 bytes graphics/chroma-neon/64_arrow_blue_down.png | Bin 0 -> 6127 bytes .../chroma-neon/64_arrow_blue_down_shadow.png | Bin 0 -> 6335 bytes graphics/chroma-neon/64_arrow_blue_left.png | Bin 0 -> 3477 bytes .../chroma-neon/64_arrow_blue_left_shadow.png | Bin 0 -> 5632 bytes graphics/chroma-neon/64_arrow_blue_right.png | Bin 0 -> 3456 bytes .../64_arrow_blue_right_shadow.png | Bin 0 -> 5569 bytes graphics/chroma-neon/64_arrow_blue_up.png | Bin 0 -> 6146 bytes .../chroma-neon/64_arrow_blue_up_shadow.png | Bin 0 -> 6504 bytes graphics/chroma-neon/64_arrow_green_down.png | Bin 0 -> 6312 bytes .../64_arrow_green_down_shadow.png | Bin 0 -> 6652 bytes graphics/chroma-neon/64_arrow_green_left.png | Bin 0 -> 3601 bytes .../64_arrow_green_left_shadow.png | Bin 0 -> 5760 bytes graphics/chroma-neon/64_arrow_green_right.png | Bin 0 -> 3609 bytes .../64_arrow_green_right_shadow.png | Bin 0 -> 5891 bytes graphics/chroma-neon/64_arrow_green_up.png | Bin 0 -> 6315 bytes .../chroma-neon/64_arrow_green_up_shadow.png | Bin 0 -> 6692 bytes graphics/chroma-neon/64_arrow_red_down.png | Bin 0 -> 6171 bytes .../chroma-neon/64_arrow_red_down_shadow.png | Bin 0 -> 6458 bytes graphics/chroma-neon/64_arrow_red_left.png | Bin 0 -> 3477 bytes .../chroma-neon/64_arrow_red_left_shadow.png | Bin 0 -> 5755 bytes graphics/chroma-neon/64_arrow_red_right.png | Bin 0 -> 3483 bytes .../chroma-neon/64_arrow_red_right_shadow.png | Bin 0 -> 5642 bytes graphics/chroma-neon/64_arrow_red_up.png | Bin 0 -> 6202 bytes .../chroma-neon/64_arrow_red_up_shadow.png | Bin 0 -> 6673 bytes graphics/chroma-neon/64_bomb_blue_down.png | Bin 0 -> 4954 bytes .../chroma-neon/64_bomb_blue_down_shadow.png | Bin 0 -> 9209 bytes graphics/chroma-neon/64_bomb_blue_left.png | Bin 0 -> 3186 bytes .../chroma-neon/64_bomb_blue_left_shadow.png | Bin 0 -> 8314 bytes graphics/chroma-neon/64_bomb_blue_right.png | Bin 0 -> 3172 bytes .../chroma-neon/64_bomb_blue_right_shadow.png | Bin 0 -> 8343 bytes graphics/chroma-neon/64_bomb_blue_up.png | Bin 0 -> 5004 bytes .../chroma-neon/64_bomb_blue_up_shadow.png | Bin 0 -> 9193 bytes graphics/chroma-neon/64_bomb_green_down.png | Bin 0 -> 5038 bytes .../chroma-neon/64_bomb_green_down_shadow.png | Bin 0 -> 9586 bytes graphics/chroma-neon/64_bomb_green_left.png | Bin 0 -> 3239 bytes .../chroma-neon/64_bomb_green_left_shadow.png | Bin 0 -> 8552 bytes graphics/chroma-neon/64_bomb_green_right.png | Bin 0 -> 3205 bytes .../64_bomb_green_right_shadow.png | Bin 0 -> 8561 bytes graphics/chroma-neon/64_bomb_green_up.png | Bin 0 -> 5072 bytes .../chroma-neon/64_bomb_green_up_shadow.png | Bin 0 -> 9693 bytes graphics/chroma-neon/64_bomb_red_down.png | Bin 0 -> 4953 bytes .../chroma-neon/64_bomb_red_down_shadow.png | Bin 0 -> 9472 bytes graphics/chroma-neon/64_bomb_red_left.png | Bin 0 -> 3136 bytes .../chroma-neon/64_bomb_red_left_shadow.png | Bin 0 -> 8507 bytes graphics/chroma-neon/64_bomb_red_right.png | Bin 0 -> 3094 bytes .../chroma-neon/64_bomb_red_right_shadow.png | Bin 0 -> 8533 bytes graphics/chroma-neon/64_bomb_red_up.png | Bin 0 -> 4955 bytes .../chroma-neon/64_bomb_red_up_shadow.png | Bin 0 -> 9604 bytes graphics/chroma-neon/64_circle.png | Bin 0 -> 5271 bytes graphics/chroma-neon/64_circle_double.png | Bin 0 -> 4274 bytes .../chroma-neon/64_circle_double_shadow.png | Bin 0 -> 7232 bytes graphics/chroma-neon/64_circle_shadow.png | Bin 0 -> 8133 bytes graphics/chroma-neon/64_door.png | Bin 0 -> 3283 bytes graphics/chroma-neon/64_door_shadow.png | Bin 0 -> 5314 bytes graphics/chroma-neon/64_dots.png | Bin 0 -> 7300 bytes graphics/chroma-neon/64_dots_double.png | Bin 0 -> 10473 bytes .../chroma-neon/64_dots_double_shadow.png | Bin 0 -> 8954 bytes graphics/chroma-neon/64_dots_shadow.png | Bin 0 -> 3337 bytes graphics/chroma-neon/64_dots_x.png | Bin 0 -> 5592 bytes graphics/chroma-neon/64_dots_x_shadow.png | Bin 0 -> 3597 bytes graphics/chroma-neon/64_dots_y.png | Bin 0 -> 5531 bytes graphics/chroma-neon/64_dots_y_shadow.png | Bin 0 -> 3772 bytes graphics/chroma-neon/64_earth.png | Bin 0 -> 5307 bytes graphics/chroma-neon/64_earth_double.png | Bin 0 -> 7281 bytes .../chroma-neon/64_earth_double_shadow.png | Bin 0 -> 6105 bytes graphics/chroma-neon/64_earth_shadow.png | Bin 0 -> 2593 bytes graphics/chroma-neon/64_earth_x.png | Bin 0 -> 3938 bytes graphics/chroma-neon/64_earth_x_shadow.png | Bin 0 -> 2379 bytes graphics/chroma-neon/64_earth_y.png | Bin 0 -> 3860 bytes graphics/chroma-neon/64_earth_y_shadow.png | Bin 0 -> 2493 bytes graphics/chroma-neon/64_map_bottom_left.png | Bin 0 -> 8578 bytes .../chroma-neon/64_map_bottom_left_shadow.png | Bin 0 -> 2264 bytes graphics/chroma-neon/64_map_bottom_right.png | Bin 0 -> 8578 bytes .../64_map_bottom_right_shadow.png | Bin 0 -> 2264 bytes graphics/chroma-neon/64_map_top_left.png | Bin 0 -> 8580 bytes .../chroma-neon/64_map_top_left_shadow.png | Bin 0 -> 2240 bytes graphics/chroma-neon/64_map_top_right.png | Bin 0 -> 8580 bytes .../chroma-neon/64_map_top_right_shadow.png | Bin 0 -> 2231 bytes graphics/chroma-neon/64_player_one.png | Bin 0 -> 6809 bytes graphics/chroma-neon/64_player_one_shadow.png | Bin 0 -> 6158 bytes .../chroma-neon/64_player_one_swapped.png | Bin 0 -> 5009 bytes .../64_player_one_swapped_shadow.png | Bin 0 -> 3821 bytes graphics/chroma-neon/64_player_two.png | Bin 0 -> 4630 bytes graphics/chroma-neon/64_player_two_shadow.png | Bin 0 -> 5968 bytes .../chroma-neon/64_player_two_swapped.png | Bin 0 -> 3511 bytes .../64_player_two_swapped_shadow.png | Bin 0 -> 3849 bytes graphics/chroma-neon/64_star.png | Bin 0 -> 8414 bytes graphics/chroma-neon/64_star_shadow.png | Bin 0 -> 8193 bytes graphics/chroma-neon/64_switch.png | Bin 0 -> 2709 bytes graphics/chroma-neon/64_switch_shadow.png | Bin 0 -> 2891 bytes graphics/chroma-neon/64_teleport.png | Bin 0 -> 3012 bytes graphics/chroma-neon/64_teleport_shadow.png | Bin 0 -> 1441 bytes graphics/chroma-neon/64_wall.png | Bin 0 -> 369 bytes graphics/chroma-neon/64_wall_inside.png | Bin 0 -> 687 bytes graphics/chroma-neon/64_wall_outside.png | Bin 0 -> 431 bytes graphics/chroma-neon/64_wall_shadow.png | Bin 0 -> 4836 bytes graphics/chroma-neon/64_wall_x.png | Bin 0 -> 325 bytes graphics/chroma-neon/64_wall_y.png | Bin 0 -> 327 bytes graphics/chroma-zen.chroma | 270 + graphics/chroma-zen/16_arrow_blue_down.png | Bin 0 -> 302 bytes graphics/chroma-zen/16_arrow_blue_left.png | Bin 0 -> 264 bytes graphics/chroma-zen/16_arrow_blue_right.png | Bin 0 -> 262 bytes graphics/chroma-zen/16_arrow_blue_up.png | Bin 0 -> 296 bytes graphics/chroma-zen/16_arrow_green_down.png | Bin 0 -> 321 bytes graphics/chroma-zen/16_arrow_green_left.png | Bin 0 -> 270 bytes graphics/chroma-zen/16_arrow_green_right.png | Bin 0 -> 267 bytes graphics/chroma-zen/16_arrow_green_up.png | Bin 0 -> 314 bytes graphics/chroma-zen/16_arrow_red_down.png | Bin 0 -> 306 bytes graphics/chroma-zen/16_arrow_red_left.png | Bin 0 -> 241 bytes graphics/chroma-zen/16_arrow_red_right.png | Bin 0 -> 260 bytes graphics/chroma-zen/16_arrow_red_up.png | Bin 0 -> 294 bytes graphics/chroma-zen/16_bomb_blue_down.png | Bin 0 -> 340 bytes graphics/chroma-zen/16_bomb_blue_left.png | Bin 0 -> 288 bytes graphics/chroma-zen/16_bomb_blue_right.png | Bin 0 -> 290 bytes graphics/chroma-zen/16_bomb_blue_up.png | Bin 0 -> 340 bytes graphics/chroma-zen/16_bomb_green_down.png | Bin 0 -> 362 bytes graphics/chroma-zen/16_bomb_green_left.png | Bin 0 -> 293 bytes graphics/chroma-zen/16_bomb_green_right.png | Bin 0 -> 297 bytes graphics/chroma-zen/16_bomb_green_up.png | Bin 0 -> 362 bytes graphics/chroma-zen/16_bomb_red_down.png | Bin 0 -> 341 bytes graphics/chroma-zen/16_bomb_red_left.png | Bin 0 -> 286 bytes graphics/chroma-zen/16_bomb_red_right.png | Bin 0 -> 288 bytes graphics/chroma-zen/16_bomb_red_up.png | Bin 0 -> 341 bytes graphics/chroma-zen/16_circle.png | Bin 0 -> 307 bytes graphics/chroma-zen/16_circle_double.png | Bin 0 -> 369 bytes graphics/chroma-zen/16_door.png | Bin 0 -> 256 bytes graphics/chroma-zen/16_dots.png | Bin 0 -> 221 bytes graphics/chroma-zen/16_dots_double.png | Bin 0 -> 247 bytes graphics/chroma-zen/16_dots_x.png | Bin 0 -> 268 bytes graphics/chroma-zen/16_dots_y.png | Bin 0 -> 248 bytes graphics/chroma-zen/16_earth.png | Bin 0 -> 203 bytes graphics/chroma-zen/16_earth_double.png | Bin 0 -> 217 bytes graphics/chroma-zen/16_earth_x.png | Bin 0 -> 243 bytes graphics/chroma-zen/16_earth_y.png | Bin 0 -> 217 bytes graphics/chroma-zen/16_map_bottom_left.png | Bin 0 -> 612 bytes graphics/chroma-zen/16_map_bottom_right.png | Bin 0 -> 614 bytes graphics/chroma-zen/16_map_top_left.png | Bin 0 -> 617 bytes graphics/chroma-zen/16_map_top_right.png | Bin 0 -> 631 bytes graphics/chroma-zen/16_player_one.png | Bin 0 -> 358 bytes graphics/chroma-zen/16_player_one_swapped.png | Bin 0 -> 330 bytes graphics/chroma-zen/16_player_two.png | Bin 0 -> 287 bytes graphics/chroma-zen/16_player_two_swapped.png | Bin 0 -> 285 bytes graphics/chroma-zen/16_star.png | Bin 0 -> 445 bytes graphics/chroma-zen/16_switch.png | Bin 0 -> 260 bytes graphics/chroma-zen/16_teleport.png | Bin 0 -> 276 bytes graphics/chroma-zen/16_wall_inside.png | Bin 0 -> 166 bytes graphics/chroma-zen/16_wall_outside.png | Bin 0 -> 174 bytes graphics/chroma-zen/16_wall_x.png | Bin 0 -> 165 bytes graphics/chroma-zen/16_wall_y.png | Bin 0 -> 163 bytes graphics/chroma-zen/20_arrow_blue_down.png | Bin 0 -> 295 bytes graphics/chroma-zen/20_arrow_blue_left.png | Bin 0 -> 262 bytes graphics/chroma-zen/20_arrow_blue_right.png | Bin 0 -> 265 bytes graphics/chroma-zen/20_arrow_blue_up.png | Bin 0 -> 290 bytes graphics/chroma-zen/20_arrow_green_down.png | Bin 0 -> 310 bytes graphics/chroma-zen/20_arrow_green_left.png | Bin 0 -> 269 bytes graphics/chroma-zen/20_arrow_green_right.png | Bin 0 -> 271 bytes graphics/chroma-zen/20_arrow_green_up.png | Bin 0 -> 309 bytes graphics/chroma-zen/20_arrow_red_down.png | Bin 0 -> 298 bytes graphics/chroma-zen/20_arrow_red_left.png | Bin 0 -> 244 bytes graphics/chroma-zen/20_arrow_red_right.png | Bin 0 -> 266 bytes graphics/chroma-zen/20_arrow_red_up.png | Bin 0 -> 295 bytes graphics/chroma-zen/20_bomb_blue_down.png | Bin 0 -> 349 bytes graphics/chroma-zen/20_bomb_blue_left.png | Bin 0 -> 289 bytes graphics/chroma-zen/20_bomb_blue_right.png | Bin 0 -> 289 bytes graphics/chroma-zen/20_bomb_blue_up.png | Bin 0 -> 348 bytes graphics/chroma-zen/20_bomb_green_down.png | Bin 0 -> 378 bytes graphics/chroma-zen/20_bomb_green_left.png | Bin 0 -> 308 bytes graphics/chroma-zen/20_bomb_green_right.png | Bin 0 -> 309 bytes graphics/chroma-zen/20_bomb_green_up.png | Bin 0 -> 379 bytes graphics/chroma-zen/20_bomb_red_down.png | Bin 0 -> 349 bytes graphics/chroma-zen/20_bomb_red_left.png | Bin 0 -> 288 bytes graphics/chroma-zen/20_bomb_red_right.png | Bin 0 -> 289 bytes graphics/chroma-zen/20_bomb_red_up.png | Bin 0 -> 349 bytes graphics/chroma-zen/20_circle.png | Bin 0 -> 355 bytes graphics/chroma-zen/20_circle_double.png | Bin 0 -> 439 bytes graphics/chroma-zen/20_door.png | Bin 0 -> 268 bytes graphics/chroma-zen/20_dots.png | Bin 0 -> 257 bytes graphics/chroma-zen/20_dots_double.png | Bin 0 -> 297 bytes graphics/chroma-zen/20_dots_x.png | Bin 0 -> 319 bytes graphics/chroma-zen/20_dots_y.png | Bin 0 -> 295 bytes graphics/chroma-zen/20_earth.png | Bin 0 -> 229 bytes graphics/chroma-zen/20_earth_double.png | Bin 0 -> 254 bytes graphics/chroma-zen/20_earth_x.png | Bin 0 -> 286 bytes graphics/chroma-zen/20_earth_y.png | Bin 0 -> 251 bytes graphics/chroma-zen/20_map_bottom_left.png | Bin 0 -> 484 bytes graphics/chroma-zen/20_map_bottom_right.png | Bin 0 -> 491 bytes graphics/chroma-zen/20_map_top_left.png | Bin 0 -> 504 bytes graphics/chroma-zen/20_map_top_right.png | Bin 0 -> 484 bytes graphics/chroma-zen/20_player_one.png | Bin 0 -> 386 bytes graphics/chroma-zen/20_player_one_swapped.png | Bin 0 -> 353 bytes graphics/chroma-zen/20_player_two.png | Bin 0 -> 337 bytes graphics/chroma-zen/20_player_two_swapped.png | Bin 0 -> 319 bytes graphics/chroma-zen/20_star.png | Bin 0 -> 502 bytes graphics/chroma-zen/20_switch.png | Bin 0 -> 259 bytes graphics/chroma-zen/20_teleport.png | Bin 0 -> 306 bytes graphics/chroma-zen/20_wall_inside.png | Bin 0 -> 181 bytes graphics/chroma-zen/20_wall_outside.png | Bin 0 -> 192 bytes graphics/chroma-zen/20_wall_x.png | Bin 0 -> 308 bytes graphics/chroma-zen/20_wall_y.png | Bin 0 -> 173 bytes graphics/chroma-zen/24_arrow_blue_down.png | Bin 0 -> 346 bytes graphics/chroma-zen/24_arrow_blue_left.png | Bin 0 -> 297 bytes graphics/chroma-zen/24_arrow_blue_right.png | Bin 0 -> 294 bytes graphics/chroma-zen/24_arrow_blue_up.png | Bin 0 -> 331 bytes graphics/chroma-zen/24_arrow_green_down.png | Bin 0 -> 365 bytes graphics/chroma-zen/24_arrow_green_left.png | Bin 0 -> 311 bytes graphics/chroma-zen/24_arrow_green_right.png | Bin 0 -> 313 bytes graphics/chroma-zen/24_arrow_green_up.png | Bin 0 -> 355 bytes graphics/chroma-zen/24_arrow_red_down.png | Bin 0 -> 352 bytes graphics/chroma-zen/24_arrow_red_left.png | Bin 0 -> 276 bytes graphics/chroma-zen/24_arrow_red_right.png | Bin 0 -> 298 bytes graphics/chroma-zen/24_arrow_red_up.png | Bin 0 -> 339 bytes graphics/chroma-zen/24_bomb_blue_down.png | Bin 0 -> 413 bytes graphics/chroma-zen/24_bomb_blue_left.png | Bin 0 -> 323 bytes graphics/chroma-zen/24_bomb_blue_right.png | Bin 0 -> 320 bytes graphics/chroma-zen/24_bomb_blue_up.png | Bin 0 -> 413 bytes graphics/chroma-zen/24_bomb_green_down.png | Bin 0 -> 454 bytes graphics/chroma-zen/24_bomb_green_left.png | Bin 0 -> 358 bytes graphics/chroma-zen/24_bomb_green_right.png | Bin 0 -> 355 bytes graphics/chroma-zen/24_bomb_green_up.png | Bin 0 -> 452 bytes graphics/chroma-zen/24_bomb_red_down.png | Bin 0 -> 413 bytes graphics/chroma-zen/24_bomb_red_left.png | Bin 0 -> 323 bytes graphics/chroma-zen/24_bomb_red_right.png | Bin 0 -> 320 bytes graphics/chroma-zen/24_bomb_red_up.png | Bin 0 -> 413 bytes graphics/chroma-zen/24_circle.png | Bin 0 -> 400 bytes graphics/chroma-zen/24_circle_double.png | Bin 0 -> 503 bytes graphics/chroma-zen/24_door.png | Bin 0 -> 288 bytes graphics/chroma-zen/24_dots.png | Bin 0 -> 256 bytes graphics/chroma-zen/24_dots_double.png | Bin 0 -> 345 bytes graphics/chroma-zen/24_dots_x.png | Bin 0 -> 429 bytes graphics/chroma-zen/24_dots_y.png | Bin 0 -> 380 bytes graphics/chroma-zen/24_earth.png | Bin 0 -> 235 bytes graphics/chroma-zen/24_earth_double.png | Bin 0 -> 305 bytes graphics/chroma-zen/24_earth_x.png | Bin 0 -> 367 bytes graphics/chroma-zen/24_earth_y.png | Bin 0 -> 327 bytes graphics/chroma-zen/24_map_bottom_left.png | Bin 0 -> 950 bytes graphics/chroma-zen/24_map_bottom_right.png | Bin 0 -> 960 bytes graphics/chroma-zen/24_map_top_left.png | Bin 0 -> 947 bytes graphics/chroma-zen/24_map_top_right.png | Bin 0 -> 973 bytes graphics/chroma-zen/24_player_one.png | Bin 0 -> 438 bytes graphics/chroma-zen/24_player_one_swapped.png | Bin 0 -> 393 bytes graphics/chroma-zen/24_player_two.png | Bin 0 -> 371 bytes graphics/chroma-zen/24_player_two_swapped.png | Bin 0 -> 333 bytes graphics/chroma-zen/24_star.png | Bin 0 -> 619 bytes graphics/chroma-zen/24_switch.png | Bin 0 -> 299 bytes graphics/chroma-zen/24_teleport.png | Bin 0 -> 344 bytes graphics/chroma-zen/24_wall_inside.png | Bin 0 -> 319 bytes graphics/chroma-zen/24_wall_outside.png | Bin 0 -> 199 bytes graphics/chroma-zen/24_wall_x.png | Bin 0 -> 180 bytes graphics/chroma-zen/24_wall_y.png | Bin 0 -> 177 bytes graphics/chroma-zen/32_arrow_blue_down.png | Bin 0 -> 382 bytes graphics/chroma-zen/32_arrow_blue_left.png | Bin 0 -> 334 bytes graphics/chroma-zen/32_arrow_blue_right.png | Bin 0 -> 330 bytes graphics/chroma-zen/32_arrow_blue_up.png | Bin 0 -> 366 bytes graphics/chroma-zen/32_arrow_green_down.png | Bin 0 -> 394 bytes graphics/chroma-zen/32_arrow_green_left.png | Bin 0 -> 344 bytes graphics/chroma-zen/32_arrow_green_right.png | Bin 0 -> 341 bytes graphics/chroma-zen/32_arrow_green_up.png | Bin 0 -> 380 bytes graphics/chroma-zen/32_arrow_red_down.png | Bin 0 -> 384 bytes graphics/chroma-zen/32_arrow_red_left.png | Bin 0 -> 313 bytes graphics/chroma-zen/32_arrow_red_right.png | Bin 0 -> 331 bytes graphics/chroma-zen/32_arrow_red_up.png | Bin 0 -> 369 bytes graphics/chroma-zen/32_bomb_blue_down.png | Bin 0 -> 479 bytes graphics/chroma-zen/32_bomb_blue_left.png | Bin 0 -> 369 bytes graphics/chroma-zen/32_bomb_blue_right.png | Bin 0 -> 366 bytes graphics/chroma-zen/32_bomb_blue_up.png | Bin 0 -> 482 bytes graphics/chroma-zen/32_bomb_green_down.png | Bin 0 -> 500 bytes graphics/chroma-zen/32_bomb_green_left.png | Bin 0 -> 384 bytes graphics/chroma-zen/32_bomb_green_right.png | Bin 0 -> 386 bytes graphics/chroma-zen/32_bomb_green_up.png | Bin 0 -> 503 bytes graphics/chroma-zen/32_bomb_red_down.png | Bin 0 -> 483 bytes graphics/chroma-zen/32_bomb_red_left.png | Bin 0 -> 370 bytes graphics/chroma-zen/32_bomb_red_right.png | Bin 0 -> 368 bytes graphics/chroma-zen/32_bomb_red_up.png | Bin 0 -> 483 bytes graphics/chroma-zen/32_circle.png | Bin 0 -> 481 bytes graphics/chroma-zen/32_circle_double.png | Bin 0 -> 627 bytes graphics/chroma-zen/32_door.png | Bin 0 -> 335 bytes graphics/chroma-zen/32_dots.png | Bin 0 -> 299 bytes graphics/chroma-zen/32_dots_double.png | Bin 0 -> 440 bytes graphics/chroma-zen/32_dots_x.png | Bin 0 -> 506 bytes graphics/chroma-zen/32_dots_y.png | Bin 0 -> 480 bytes graphics/chroma-zen/32_earth.png | Bin 0 -> 265 bytes graphics/chroma-zen/32_earth_double.png | Bin 0 -> 382 bytes graphics/chroma-zen/32_earth_x.png | Bin 0 -> 430 bytes graphics/chroma-zen/32_earth_y.png | Bin 0 -> 397 bytes graphics/chroma-zen/32_map_bottom_left.png | Bin 0 -> 1144 bytes graphics/chroma-zen/32_map_bottom_right.png | Bin 0 -> 1129 bytes graphics/chroma-zen/32_map_top_left.png | Bin 0 -> 1129 bytes graphics/chroma-zen/32_map_top_right.png | Bin 0 -> 1168 bytes graphics/chroma-zen/32_player_one.png | Bin 0 -> 531 bytes graphics/chroma-zen/32_player_one_swapped.png | Bin 0 -> 488 bytes graphics/chroma-zen/32_player_two.png | Bin 0 -> 398 bytes graphics/chroma-zen/32_player_two_swapped.png | Bin 0 -> 370 bytes graphics/chroma-zen/32_star.png | Bin 0 -> 768 bytes graphics/chroma-zen/32_switch.png | Bin 0 -> 341 bytes graphics/chroma-zen/32_teleport.png | Bin 0 -> 388 bytes graphics/chroma-zen/32_wall_inside.png | Bin 0 -> 196 bytes graphics/chroma-zen/32_wall_outside.png | Bin 0 -> 208 bytes graphics/chroma-zen/32_wall_x.png | Bin 0 -> 187 bytes graphics/chroma-zen/32_wall_y.png | Bin 0 -> 178 bytes graphics/chroma-zen/40_arrow_blue_down.png | Bin 0 -> 375 bytes graphics/chroma-zen/40_arrow_blue_left.png | Bin 0 -> 333 bytes graphics/chroma-zen/40_arrow_blue_right.png | Bin 0 -> 328 bytes graphics/chroma-zen/40_arrow_blue_up.png | Bin 0 -> 370 bytes graphics/chroma-zen/40_arrow_green_down.png | Bin 0 -> 398 bytes graphics/chroma-zen/40_arrow_green_left.png | Bin 0 -> 353 bytes graphics/chroma-zen/40_arrow_green_right.png | Bin 0 -> 349 bytes graphics/chroma-zen/40_arrow_green_up.png | Bin 0 -> 392 bytes graphics/chroma-zen/40_arrow_red_down.png | Bin 0 -> 378 bytes graphics/chroma-zen/40_arrow_red_left.png | Bin 0 -> 313 bytes graphics/chroma-zen/40_arrow_red_right.png | Bin 0 -> 329 bytes graphics/chroma-zen/40_arrow_red_up.png | Bin 0 -> 373 bytes graphics/chroma-zen/40_bomb_blue_down.png | Bin 0 -> 429 bytes graphics/chroma-zen/40_bomb_blue_left.png | Bin 0 -> 334 bytes graphics/chroma-zen/40_bomb_blue_right.png | Bin 0 -> 333 bytes graphics/chroma-zen/40_bomb_blue_up.png | Bin 0 -> 431 bytes graphics/chroma-zen/40_bomb_green_down.png | Bin 0 -> 440 bytes graphics/chroma-zen/40_bomb_green_left.png | Bin 0 -> 342 bytes graphics/chroma-zen/40_bomb_green_right.png | Bin 0 -> 344 bytes graphics/chroma-zen/40_bomb_green_up.png | Bin 0 -> 443 bytes graphics/chroma-zen/40_bomb_red_down.png | Bin 0 -> 430 bytes graphics/chroma-zen/40_bomb_red_left.png | Bin 0 -> 335 bytes graphics/chroma-zen/40_bomb_red_right.png | Bin 0 -> 336 bytes graphics/chroma-zen/40_bomb_red_up.png | Bin 0 -> 433 bytes graphics/chroma-zen/40_circle.png | Bin 0 -> 606 bytes graphics/chroma-zen/40_circle_double.png | Bin 0 -> 771 bytes graphics/chroma-zen/40_door.png | Bin 0 -> 261 bytes graphics/chroma-zen/40_dots.png | Bin 0 -> 356 bytes graphics/chroma-zen/40_dots_double.png | Bin 0 -> 572 bytes graphics/chroma-zen/40_dots_x.png | Bin 0 -> 613 bytes graphics/chroma-zen/40_dots_y.png | Bin 0 -> 556 bytes graphics/chroma-zen/40_earth.png | Bin 0 -> 312 bytes graphics/chroma-zen/40_earth_double.png | Bin 0 -> 467 bytes graphics/chroma-zen/40_earth_x.png | Bin 0 -> 493 bytes graphics/chroma-zen/40_earth_y.png | Bin 0 -> 456 bytes graphics/chroma-zen/40_map_bottom_left.png | Bin 0 -> 481 bytes graphics/chroma-zen/40_map_bottom_right.png | Bin 0 -> 470 bytes graphics/chroma-zen/40_map_top_left.png | Bin 0 -> 487 bytes graphics/chroma-zen/40_map_top_right.png | Bin 0 -> 483 bytes graphics/chroma-zen/40_player_one.png | Bin 0 -> 582 bytes graphics/chroma-zen/40_player_one_swapped.png | Bin 0 -> 513 bytes graphics/chroma-zen/40_player_two.png | Bin 0 -> 370 bytes graphics/chroma-zen/40_player_two_swapped.png | Bin 0 -> 346 bytes graphics/chroma-zen/40_star.png | Bin 0 -> 937 bytes graphics/chroma-zen/40_switch.png | Bin 0 -> 280 bytes graphics/chroma-zen/40_teleport.png | Bin 0 -> 319 bytes graphics/chroma-zen/40_wall_inside.png | Bin 0 -> 224 bytes graphics/chroma-zen/40_wall_outside.png | Bin 0 -> 223 bytes graphics/chroma-zen/40_wall_x.png | Bin 0 -> 335 bytes graphics/chroma-zen/40_wall_y.png | Bin 0 -> 185 bytes graphics/chroma-zen/64_arrow_blue_down.png | Bin 0 -> 585 bytes graphics/chroma-zen/64_arrow_blue_left.png | Bin 0 -> 479 bytes graphics/chroma-zen/64_arrow_blue_right.png | Bin 0 -> 465 bytes graphics/chroma-zen/64_arrow_blue_up.png | Bin 0 -> 561 bytes graphics/chroma-zen/64_arrow_green_down.png | Bin 0 -> 766 bytes graphics/chroma-zen/64_arrow_green_left.png | Bin 0 -> 521 bytes graphics/chroma-zen/64_arrow_green_right.png | Bin 0 -> 507 bytes graphics/chroma-zen/64_arrow_green_up.png | Bin 0 -> 618 bytes graphics/chroma-zen/64_arrow_red_down.png | Bin 0 -> 586 bytes graphics/chroma-zen/64_arrow_red_left.png | Bin 0 -> 460 bytes graphics/chroma-zen/64_arrow_red_right.png | Bin 0 -> 470 bytes graphics/chroma-zen/64_arrow_red_up.png | Bin 0 -> 564 bytes graphics/chroma-zen/64_bomb_blue_down.png | Bin 0 -> 855 bytes graphics/chroma-zen/64_bomb_blue_left.png | Bin 0 -> 505 bytes graphics/chroma-zen/64_bomb_blue_right.png | Bin 0 -> 499 bytes graphics/chroma-zen/64_bomb_blue_up.png | Bin 0 -> 724 bytes graphics/chroma-zen/64_bomb_green_down.png | Bin 0 -> 760 bytes graphics/chroma-zen/64_bomb_green_left.png | Bin 0 -> 533 bytes graphics/chroma-zen/64_bomb_green_right.png | Bin 0 -> 527 bytes graphics/chroma-zen/64_bomb_green_up.png | Bin 0 -> 895 bytes graphics/chroma-zen/64_bomb_red_down.png | Bin 0 -> 725 bytes graphics/chroma-zen/64_bomb_red_left.png | Bin 0 -> 508 bytes graphics/chroma-zen/64_bomb_red_right.png | Bin 0 -> 502 bytes graphics/chroma-zen/64_bomb_red_up.png | Bin 0 -> 726 bytes graphics/chroma-zen/64_circle.png | Bin 0 -> 854 bytes graphics/chroma-zen/64_circle_double.png | Bin 0 -> 1144 bytes graphics/chroma-zen/64_door.png | Bin 0 -> 468 bytes graphics/chroma-zen/64_dots.png | Bin 0 -> 542 bytes graphics/chroma-zen/64_dots_double.png | Bin 0 -> 682 bytes graphics/chroma-zen/64_dots_x.png | Bin 0 -> 739 bytes graphics/chroma-zen/64_dots_y.png | Bin 0 -> 629 bytes graphics/chroma-zen/64_earth.png | Bin 0 -> 400 bytes graphics/chroma-zen/64_earth_double.png | Bin 0 -> 545 bytes graphics/chroma-zen/64_earth_x.png | Bin 0 -> 542 bytes graphics/chroma-zen/64_earth_y.png | Bin 0 -> 475 bytes graphics/chroma-zen/64_map_bottom_left.png | Bin 0 -> 1873 bytes graphics/chroma-zen/64_map_bottom_right.png | Bin 0 -> 1738 bytes graphics/chroma-zen/64_map_top_left.png | Bin 0 -> 1798 bytes graphics/chroma-zen/64_map_top_right.png | Bin 0 -> 1799 bytes graphics/chroma-zen/64_player_one.png | Bin 0 -> 878 bytes graphics/chroma-zen/64_player_one_swapped.png | Bin 0 -> 749 bytes graphics/chroma-zen/64_player_two.png | Bin 0 -> 623 bytes graphics/chroma-zen/64_player_two_swapped.png | Bin 0 -> 536 bytes graphics/chroma-zen/64_star.png | Bin 0 -> 1413 bytes graphics/chroma-zen/64_switch.png | Bin 0 -> 495 bytes graphics/chroma-zen/64_teleport.png | Bin 0 -> 586 bytes graphics/chroma-zen/64_wall_inside.png | Bin 0 -> 256 bytes graphics/chroma-zen/64_wall_outside.png | Bin 0 -> 268 bytes graphics/chroma-zen/64_wall_x.png | Bin 0 -> 246 bytes graphics/chroma-zen/64_wall_y.png | Bin 0 -> 196 bytes graphics/curses.chroma | 18 + graphics/fallback.chroma | 17 + graphics/font.ttf | Bin 0 -> 611552 bytes graphics/font.txt | 99 + graphics/icon.png | Bin 0 -> 800 bytes help/README | 98 + iconcurses.ico | Bin 0 -> 22486 bytes iconcurses.rc | 1 + iconsdl.ico | Bin 0 -> 22486 bytes iconsdl.rc | 18 + install-sh | 294 + level.c | 1515 ++++ level.h | 286 + levels/chroma-1/chroma-1-01.chroma | 33 + levels/chroma-1/chroma-1-02.chroma | 33 + levels/chroma-1/chroma-1-03.chroma | 33 + levels/chroma-1/chroma-1-04.chroma | 33 + levels/chroma-1/chroma-1-05.chroma | 33 + levels/chroma-1/chroma-1-06.chroma | 33 + levels/chroma-1/chroma-1-07.chroma | 33 + levels/chroma-1/chroma-1-08.chroma | 33 + levels/chroma-1/chroma-1-09.chroma | 33 + levels/chroma-1/set.chroma | 7 + levels/chroma-2/chroma-2-01.chroma | 33 + levels/chroma-2/chroma-2-02.chroma | 33 + levels/chroma-2/chroma-2-03.chroma | 33 + levels/chroma-2/chroma-2-04.chroma | 33 + levels/chroma-2/chroma-2-05.chroma | 33 + levels/chroma-2/chroma-2-06.chroma | 33 + levels/chroma-2/chroma-2-07.chroma | 33 + levels/chroma-2/chroma-2-08.chroma | 33 + levels/chroma-2/chroma-2-09.chroma | 33 + levels/chroma-2/chroma-2-10.chroma | 33 + levels/chroma-2/chroma-2-11.chroma | 33 + levels/chroma-2/chroma-2-12.chroma | 33 + levels/chroma-2/set.chroma | 7 + levels/regression/chroma-pieces.chroma | 30 + levels/regression/chroma-regression.chroma | 65 + levels/regression/enigma-regression.chroma | 68 + levels/regression/set.chroma | 7 + levels/regression/xor-regression.chroma | 134 + locale/en_US/LC_MESSAGES/chroma.mo | Bin 0 -> 15067 bytes main.c | 527 ++ menu.c | 808 ++ menu.h | 110 + names.c | 161 + po/README | 19 + po/chroma.pot | 1030 +++ po/en_US.po | 980 +++ resources/README | 115 + resources/browser/graphics-marble.svg | 3060 +++++++ resources/browser/graphics-neon.svg | 5657 +++++++++++++ resources/browser/graphics-zen.svg | 945 +++ resources/browser/preview-marble.svg | 318 + resources/browser/preview-neon.svg | 966 +++ resources/browser/preview-zen.svg | 129 + resources/convert2chroma.pl | 3951 +++++++++ resources/crush.pl | 42 + resources/icons.svg | 135 + resources/logo.svg | 89 + resources/make-base-marble.pl | 73 + resources/make-graphics.sh | 29 + resources/make-pieces-marble.pl | 196 + resources/make-pieces-neon.pl | 221 + resources/make-pieces-zen.pl | 129 + resources/make-wall-marble.pl | 73 + resources/pieces-marble-base.svg | 340 + resources/pieces-marble-wall.svg | 340 + resources/pieces-marble.svg | 2422 ++++++ resources/pieces-neon-base.svg | 4451 ++++++++++ resources/pieces-neon-overlay-double.svg | 115 + resources/pieces-neon-overlay.svg | 838 ++ resources/pieces-zen.svg | 960 +++ sdldisplay.c | 3918 +++++++++ sdlfont.c | 569 ++ sdlfont.h | 45 + sdlmenudisplay.c | 1079 +++ sdlscreen.c | 189 + sdlscreen.h | 33 + sdlshadowdisplay.c | 1277 +++ util.c | 302 + util.h | 36 + xmlparser.c | 406 + xmlparser.h | 53 + xor.c | 813 ++ 1451 files changed, 70897 insertions(+) create mode 100644 CHANGELOG create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 Makefile.in create mode 100644 Makefile.mingw create mode 100644 README create mode 100644 actions.h create mode 100644 browser/chroma-script.js create mode 100644 browser/chroma-style.css create mode 100644 browser/chroma.html create mode 100644 browser/graphics-marble.svg create mode 100644 browser/graphics-marble.xml create mode 100644 browser/graphics-neon.svg create mode 100644 browser/graphics-neon.xml create mode 100644 browser/graphics-xor.png create mode 100644 browser/graphics-xor.xml create mode 100644 browser/graphics-zen.svg create mode 100644 browser/graphics-zen.xml create mode 100644 browser/levels.xml create mode 100644 browser/preview-marble.svg create mode 100644 browser/preview-neon.svg create mode 100644 browser/preview-xor.svg create mode 100644 browser/preview-zen.svg create mode 100644 chroma.h create mode 100755 chroma.nsi create mode 100644 colours.c create mode 100644 colours.h create mode 100644 colours/chroma-enhanced.chroma create mode 100644 colours/chroma-enigma.chroma create mode 100644 colours/chroma-monochrome.chroma create mode 100644 colours/chroma-reverse.chroma create mode 100644 colours/chroma-standard.chroma create mode 100644 colours/fallback.chroma create mode 100755 configure create mode 100644 configure.ac create mode 100644 cursesdisplay.c create mode 100644 cursesmenudisplay.c create mode 100644 display.h create mode 100644 editor.c create mode 100644 engine.c create mode 100644 enigma.c create mode 100644 graphics.c create mode 100644 graphics.h create mode 100644 graphics/chroma-marble.chroma create mode 100644 graphics/chroma-marble/16_arrow_blue_down.png create mode 100644 graphics/chroma-marble/16_arrow_blue_left.png create mode 100644 graphics/chroma-marble/16_arrow_blue_right.png create mode 100644 graphics/chroma-marble/16_arrow_blue_up.png create mode 100644 graphics/chroma-marble/16_arrow_green_down.png create mode 100644 graphics/chroma-marble/16_arrow_green_left.png create mode 100644 graphics/chroma-marble/16_arrow_green_right.png create mode 100644 graphics/chroma-marble/16_arrow_green_up.png create mode 100644 graphics/chroma-marble/16_arrow_red_down.png create mode 100644 graphics/chroma-marble/16_arrow_red_left.png create mode 100644 graphics/chroma-marble/16_arrow_red_right.png create mode 100644 graphics/chroma-marble/16_arrow_red_up.png create mode 100644 graphics/chroma-marble/16_arrow_shadow_down.png create mode 100644 graphics/chroma-marble/16_arrow_shadow_left.png create mode 100644 graphics/chroma-marble/16_arrow_shadow_right.png create mode 100644 graphics/chroma-marble/16_arrow_shadow_up.png create mode 100644 graphics/chroma-marble/16_bomb_blue_down.png create mode 100644 graphics/chroma-marble/16_bomb_blue_left.png create mode 100644 graphics/chroma-marble/16_bomb_blue_right.png create mode 100644 graphics/chroma-marble/16_bomb_blue_up.png create mode 100644 graphics/chroma-marble/16_bomb_green_down.png create mode 100644 graphics/chroma-marble/16_bomb_green_left.png create mode 100644 graphics/chroma-marble/16_bomb_green_right.png create mode 100644 graphics/chroma-marble/16_bomb_green_up.png create mode 100644 graphics/chroma-marble/16_bomb_red_down.png create mode 100644 graphics/chroma-marble/16_bomb_red_left.png create mode 100644 graphics/chroma-marble/16_bomb_red_right.png create mode 100644 graphics/chroma-marble/16_bomb_red_up.png create mode 100644 graphics/chroma-marble/16_bomb_shadow_down.png create mode 100644 graphics/chroma-marble/16_bomb_shadow_left.png create mode 100644 graphics/chroma-marble/16_bomb_shadow_right.png create mode 100644 graphics/chroma-marble/16_bomb_shadow_up.png create mode 100644 graphics/chroma-marble/16_circle.png create mode 100644 graphics/chroma-marble/16_circle_double.png create mode 100644 graphics/chroma-marble/16_circle_double_shadow.png create mode 100644 graphics/chroma-marble/16_circle_shadow.png create mode 100644 graphics/chroma-marble/16_door.png create mode 100644 graphics/chroma-marble/16_door_shadow.png create mode 100644 graphics/chroma-marble/16_dots.png create mode 100644 graphics/chroma-marble/16_dots_double.png create mode 100644 graphics/chroma-marble/16_dots_double_shadow.png create mode 100644 graphics/chroma-marble/16_dots_shadow.png create mode 100644 graphics/chroma-marble/16_dots_x.png create mode 100644 graphics/chroma-marble/16_dots_x_shadow.png create mode 100644 graphics/chroma-marble/16_dots_y.png create mode 100644 graphics/chroma-marble/16_dots_y_shadow.png create mode 100644 graphics/chroma-marble/16_map_bottom_left.png create mode 100644 graphics/chroma-marble/16_map_bottom_right.png create mode 100644 graphics/chroma-marble/16_map_shadow.png create mode 100644 graphics/chroma-marble/16_map_top_left.png create mode 100644 graphics/chroma-marble/16_map_top_right.png create mode 100644 graphics/chroma-marble/16_player_one.png create mode 100644 graphics/chroma-marble/16_player_one_swapped.png create mode 100644 graphics/chroma-marble/16_player_shadow.png create mode 100644 graphics/chroma-marble/16_player_two.png create mode 100644 graphics/chroma-marble/16_player_two_swapped.png create mode 100644 graphics/chroma-marble/16_space.png create mode 100644 graphics/chroma-marble/16_star.png create mode 100644 graphics/chroma-marble/16_star_shadow.png create mode 100644 graphics/chroma-marble/16_switch.png create mode 100644 graphics/chroma-marble/16_switch_shadow.png create mode 100644 graphics/chroma-marble/16_teleport.png create mode 100644 graphics/chroma-marble/16_teleport_shadow.png create mode 100644 graphics/chroma-marble/16_wall.png create mode 100644 graphics/chroma-marble/16_wall_inside.png create mode 100644 graphics/chroma-marble/16_wall_inside_shadow.png create mode 100644 graphics/chroma-marble/16_wall_outside.png create mode 100644 graphics/chroma-marble/16_wall_outside_shadow.png create mode 100644 graphics/chroma-marble/16_wall_x.png create mode 100644 graphics/chroma-marble/16_wall_x_shadow.png create mode 100644 graphics/chroma-marble/16_wall_y.png create mode 100644 graphics/chroma-marble/16_wall_y_shadow.png create mode 100644 graphics/chroma-marble/20_arrow_blue_down.png create mode 100644 graphics/chroma-marble/20_arrow_blue_left.png create mode 100644 graphics/chroma-marble/20_arrow_blue_right.png create mode 100644 graphics/chroma-marble/20_arrow_blue_up.png create mode 100644 graphics/chroma-marble/20_arrow_green_down.png create mode 100644 graphics/chroma-marble/20_arrow_green_left.png create mode 100644 graphics/chroma-marble/20_arrow_green_right.png create mode 100644 graphics/chroma-marble/20_arrow_green_up.png create mode 100644 graphics/chroma-marble/20_arrow_red_down.png create mode 100644 graphics/chroma-marble/20_arrow_red_left.png create mode 100644 graphics/chroma-marble/20_arrow_red_right.png create mode 100644 graphics/chroma-marble/20_arrow_red_up.png create mode 100644 graphics/chroma-marble/20_arrow_shadow_down.png create mode 100644 graphics/chroma-marble/20_arrow_shadow_left.png create mode 100644 graphics/chroma-marble/20_arrow_shadow_right.png create mode 100644 graphics/chroma-marble/20_arrow_shadow_up.png create mode 100644 graphics/chroma-marble/20_bomb_blue_down.png create mode 100644 graphics/chroma-marble/20_bomb_blue_left.png create mode 100644 graphics/chroma-marble/20_bomb_blue_right.png create mode 100644 graphics/chroma-marble/20_bomb_blue_up.png create mode 100644 graphics/chroma-marble/20_bomb_green_down.png create mode 100644 graphics/chroma-marble/20_bomb_green_left.png create mode 100644 graphics/chroma-marble/20_bomb_green_right.png create mode 100644 graphics/chroma-marble/20_bomb_green_up.png create mode 100644 graphics/chroma-marble/20_bomb_red_down.png create mode 100644 graphics/chroma-marble/20_bomb_red_left.png create mode 100644 graphics/chroma-marble/20_bomb_red_right.png create mode 100644 graphics/chroma-marble/20_bomb_red_up.png create mode 100644 graphics/chroma-marble/20_bomb_shadow_down.png create mode 100644 graphics/chroma-marble/20_bomb_shadow_left.png create mode 100644 graphics/chroma-marble/20_bomb_shadow_right.png create mode 100644 graphics/chroma-marble/20_bomb_shadow_up.png create mode 100644 graphics/chroma-marble/20_circle.png create mode 100644 graphics/chroma-marble/20_circle_double.png create mode 100644 graphics/chroma-marble/20_circle_double_shadow.png create mode 100644 graphics/chroma-marble/20_circle_shadow.png create mode 100644 graphics/chroma-marble/20_door.png create mode 100644 graphics/chroma-marble/20_door_shadow.png create mode 100644 graphics/chroma-marble/20_dots.png create mode 100644 graphics/chroma-marble/20_dots_double.png create mode 100644 graphics/chroma-marble/20_dots_double_shadow.png create mode 100644 graphics/chroma-marble/20_dots_shadow.png create mode 100644 graphics/chroma-marble/20_dots_x.png create mode 100644 graphics/chroma-marble/20_dots_x_shadow.png create mode 100644 graphics/chroma-marble/20_dots_y.png create mode 100644 graphics/chroma-marble/20_dots_y_shadow.png create mode 100644 graphics/chroma-marble/20_map_bottom_left.png create mode 100644 graphics/chroma-marble/20_map_bottom_right.png create mode 100644 graphics/chroma-marble/20_map_shadow.png create mode 100644 graphics/chroma-marble/20_map_top_left.png create mode 100644 graphics/chroma-marble/20_map_top_right.png create mode 100644 graphics/chroma-marble/20_player_one.png create mode 100644 graphics/chroma-marble/20_player_one_swapped.png create mode 100644 graphics/chroma-marble/20_player_shadow.png create mode 100644 graphics/chroma-marble/20_player_two.png create mode 100644 graphics/chroma-marble/20_player_two_swapped.png create mode 100644 graphics/chroma-marble/20_space.png create mode 100644 graphics/chroma-marble/20_star.png create mode 100644 graphics/chroma-marble/20_star_shadow.png create mode 100644 graphics/chroma-marble/20_switch.png create mode 100644 graphics/chroma-marble/20_switch_shadow.png create mode 100644 graphics/chroma-marble/20_teleport.png create mode 100644 graphics/chroma-marble/20_teleport_shadow.png create mode 100644 graphics/chroma-marble/20_wall.png create mode 100644 graphics/chroma-marble/20_wall_inside.png create mode 100644 graphics/chroma-marble/20_wall_inside_shadow.png create mode 100644 graphics/chroma-marble/20_wall_outside.png create mode 100644 graphics/chroma-marble/20_wall_outside_shadow.png create mode 100644 graphics/chroma-marble/20_wall_x.png create mode 100644 graphics/chroma-marble/20_wall_x_shadow.png create mode 100644 graphics/chroma-marble/20_wall_y.png create mode 100644 graphics/chroma-marble/20_wall_y_shadow.png create mode 100644 graphics/chroma-marble/24_arrow_blue_down.png create mode 100644 graphics/chroma-marble/24_arrow_blue_left.png create mode 100644 graphics/chroma-marble/24_arrow_blue_right.png create mode 100644 graphics/chroma-marble/24_arrow_blue_up.png create mode 100644 graphics/chroma-marble/24_arrow_green_down.png create mode 100644 graphics/chroma-marble/24_arrow_green_left.png create mode 100644 graphics/chroma-marble/24_arrow_green_right.png create mode 100644 graphics/chroma-marble/24_arrow_green_up.png create mode 100644 graphics/chroma-marble/24_arrow_red_down.png create mode 100644 graphics/chroma-marble/24_arrow_red_left.png create mode 100644 graphics/chroma-marble/24_arrow_red_right.png create mode 100644 graphics/chroma-marble/24_arrow_red_up.png create mode 100644 graphics/chroma-marble/24_arrow_shadow_down.png create mode 100644 graphics/chroma-marble/24_arrow_shadow_left.png create mode 100644 graphics/chroma-marble/24_arrow_shadow_right.png create mode 100644 graphics/chroma-marble/24_arrow_shadow_up.png create mode 100644 graphics/chroma-marble/24_bomb_blue_down.png create mode 100644 graphics/chroma-marble/24_bomb_blue_left.png create mode 100644 graphics/chroma-marble/24_bomb_blue_right.png create mode 100644 graphics/chroma-marble/24_bomb_blue_up.png create mode 100644 graphics/chroma-marble/24_bomb_green_down.png create mode 100644 graphics/chroma-marble/24_bomb_green_left.png create mode 100644 graphics/chroma-marble/24_bomb_green_right.png create mode 100644 graphics/chroma-marble/24_bomb_green_up.png create mode 100644 graphics/chroma-marble/24_bomb_red_down.png create mode 100644 graphics/chroma-marble/24_bomb_red_left.png create mode 100644 graphics/chroma-marble/24_bomb_red_right.png create mode 100644 graphics/chroma-marble/24_bomb_red_up.png create mode 100644 graphics/chroma-marble/24_bomb_shadow_down.png create mode 100644 graphics/chroma-marble/24_bomb_shadow_left.png create mode 100644 graphics/chroma-marble/24_bomb_shadow_right.png create mode 100644 graphics/chroma-marble/24_bomb_shadow_up.png create mode 100644 graphics/chroma-marble/24_circle.png create mode 100644 graphics/chroma-marble/24_circle_double.png create mode 100644 graphics/chroma-marble/24_circle_double_shadow.png create mode 100644 graphics/chroma-marble/24_circle_shadow.png create mode 100644 graphics/chroma-marble/24_door.png create mode 100644 graphics/chroma-marble/24_door_shadow.png create mode 100644 graphics/chroma-marble/24_dots.png create mode 100644 graphics/chroma-marble/24_dots_double.png create mode 100644 graphics/chroma-marble/24_dots_double_shadow.png create mode 100644 graphics/chroma-marble/24_dots_shadow.png create mode 100644 graphics/chroma-marble/24_dots_x.png create mode 100644 graphics/chroma-marble/24_dots_x_shadow.png create mode 100644 graphics/chroma-marble/24_dots_y.png create mode 100644 graphics/chroma-marble/24_dots_y_shadow.png create mode 100644 graphics/chroma-marble/24_map_bottom_left.png create mode 100644 graphics/chroma-marble/24_map_bottom_right.png create mode 100644 graphics/chroma-marble/24_map_shadow.png create mode 100644 graphics/chroma-marble/24_map_top_left.png create mode 100644 graphics/chroma-marble/24_map_top_right.png create mode 100644 graphics/chroma-marble/24_player_one.png create mode 100644 graphics/chroma-marble/24_player_one_swapped.png create mode 100644 graphics/chroma-marble/24_player_shadow.png create mode 100644 graphics/chroma-marble/24_player_two.png create mode 100644 graphics/chroma-marble/24_player_two_swapped.png create mode 100644 graphics/chroma-marble/24_space.png create mode 100644 graphics/chroma-marble/24_star.png create mode 100644 graphics/chroma-marble/24_star_shadow.png create mode 100644 graphics/chroma-marble/24_switch.png create mode 100644 graphics/chroma-marble/24_switch_shadow.png create mode 100644 graphics/chroma-marble/24_teleport.png create mode 100644 graphics/chroma-marble/24_teleport_shadow.png create mode 100644 graphics/chroma-marble/24_wall.png create mode 100644 graphics/chroma-marble/24_wall_inside.png create mode 100644 graphics/chroma-marble/24_wall_inside_shadow.png create mode 100644 graphics/chroma-marble/24_wall_outside.png create mode 100644 graphics/chroma-marble/24_wall_outside_shadow.png create mode 100644 graphics/chroma-marble/24_wall_x.png create mode 100644 graphics/chroma-marble/24_wall_x_shadow.png create mode 100644 graphics/chroma-marble/24_wall_y.png create mode 100644 graphics/chroma-marble/24_wall_y_shadow.png create mode 100644 graphics/chroma-marble/32_arrow_blue_down.png create mode 100644 graphics/chroma-marble/32_arrow_blue_left.png create mode 100644 graphics/chroma-marble/32_arrow_blue_right.png create mode 100644 graphics/chroma-marble/32_arrow_blue_up.png create mode 100644 graphics/chroma-marble/32_arrow_green_down.png create mode 100644 graphics/chroma-marble/32_arrow_green_left.png create mode 100644 graphics/chroma-marble/32_arrow_green_right.png create mode 100644 graphics/chroma-marble/32_arrow_green_up.png create mode 100644 graphics/chroma-marble/32_arrow_red_down.png create mode 100644 graphics/chroma-marble/32_arrow_red_left.png create mode 100644 graphics/chroma-marble/32_arrow_red_right.png create mode 100644 graphics/chroma-marble/32_arrow_red_up.png create mode 100644 graphics/chroma-marble/32_arrow_shadow_down.png create mode 100644 graphics/chroma-marble/32_arrow_shadow_left.png create mode 100644 graphics/chroma-marble/32_arrow_shadow_right.png create mode 100644 graphics/chroma-marble/32_arrow_shadow_up.png create mode 100644 graphics/chroma-marble/32_bomb_blue_down.png create mode 100644 graphics/chroma-marble/32_bomb_blue_left.png create mode 100644 graphics/chroma-marble/32_bomb_blue_right.png create mode 100644 graphics/chroma-marble/32_bomb_blue_up.png create mode 100644 graphics/chroma-marble/32_bomb_green_down.png create mode 100644 graphics/chroma-marble/32_bomb_green_left.png create mode 100644 graphics/chroma-marble/32_bomb_green_right.png create mode 100644 graphics/chroma-marble/32_bomb_green_up.png create mode 100644 graphics/chroma-marble/32_bomb_red_down.png create mode 100644 graphics/chroma-marble/32_bomb_red_left.png create mode 100644 graphics/chroma-marble/32_bomb_red_right.png create mode 100644 graphics/chroma-marble/32_bomb_red_up.png create mode 100644 graphics/chroma-marble/32_bomb_shadow_down.png create mode 100644 graphics/chroma-marble/32_bomb_shadow_left.png create mode 100644 graphics/chroma-marble/32_bomb_shadow_right.png create mode 100644 graphics/chroma-marble/32_bomb_shadow_up.png create mode 100644 graphics/chroma-marble/32_circle.png create mode 100644 graphics/chroma-marble/32_circle_double.png create mode 100644 graphics/chroma-marble/32_circle_double_shadow.png create mode 100644 graphics/chroma-marble/32_circle_shadow.png create mode 100644 graphics/chroma-marble/32_door.png create mode 100644 graphics/chroma-marble/32_door_shadow.png create mode 100644 graphics/chroma-marble/32_dots.png create mode 100644 graphics/chroma-marble/32_dots_double.png create mode 100644 graphics/chroma-marble/32_dots_double_shadow.png create mode 100644 graphics/chroma-marble/32_dots_shadow.png create mode 100644 graphics/chroma-marble/32_dots_x.png create mode 100644 graphics/chroma-marble/32_dots_x_shadow.png create mode 100644 graphics/chroma-marble/32_dots_y.png create mode 100644 graphics/chroma-marble/32_dots_y_shadow.png create mode 100644 graphics/chroma-marble/32_map_bottom_left.png create mode 100644 graphics/chroma-marble/32_map_bottom_right.png create mode 100644 graphics/chroma-marble/32_map_shadow.png create mode 100644 graphics/chroma-marble/32_map_top_left.png create mode 100644 graphics/chroma-marble/32_map_top_right.png create mode 100644 graphics/chroma-marble/32_player_one.png create mode 100644 graphics/chroma-marble/32_player_one_swapped.png create mode 100644 graphics/chroma-marble/32_player_shadow.png create mode 100644 graphics/chroma-marble/32_player_two.png create mode 100644 graphics/chroma-marble/32_player_two_swapped.png create mode 100644 graphics/chroma-marble/32_space.png create mode 100644 graphics/chroma-marble/32_star.png create mode 100644 graphics/chroma-marble/32_star_shadow.png create mode 100644 graphics/chroma-marble/32_switch.png create mode 100644 graphics/chroma-marble/32_switch_shadow.png create mode 100644 graphics/chroma-marble/32_teleport.png create mode 100644 graphics/chroma-marble/32_teleport_shadow.png create mode 100644 graphics/chroma-marble/32_wall.png create mode 100644 graphics/chroma-marble/32_wall_inside.png create mode 100644 graphics/chroma-marble/32_wall_inside_shadow.png create mode 100644 graphics/chroma-marble/32_wall_outside.png create mode 100644 graphics/chroma-marble/32_wall_outside_shadow.png create mode 100644 graphics/chroma-marble/32_wall_x.png create mode 100644 graphics/chroma-marble/32_wall_x_shadow.png create mode 100644 graphics/chroma-marble/32_wall_y.png create mode 100644 graphics/chroma-marble/32_wall_y_shadow.png create mode 100644 graphics/chroma-marble/40_arrow_blue_down.png create mode 100644 graphics/chroma-marble/40_arrow_blue_left.png create mode 100644 graphics/chroma-marble/40_arrow_blue_right.png create mode 100644 graphics/chroma-marble/40_arrow_blue_up.png create mode 100644 graphics/chroma-marble/40_arrow_green_down.png create mode 100644 graphics/chroma-marble/40_arrow_green_left.png create mode 100644 graphics/chroma-marble/40_arrow_green_right.png create mode 100644 graphics/chroma-marble/40_arrow_green_up.png create mode 100644 graphics/chroma-marble/40_arrow_red_down.png create mode 100644 graphics/chroma-marble/40_arrow_red_left.png create mode 100644 graphics/chroma-marble/40_arrow_red_right.png create mode 100644 graphics/chroma-marble/40_arrow_red_up.png create mode 100644 graphics/chroma-marble/40_arrow_shadow_down.png create mode 100644 graphics/chroma-marble/40_arrow_shadow_left.png create mode 100644 graphics/chroma-marble/40_arrow_shadow_right.png create mode 100644 graphics/chroma-marble/40_arrow_shadow_up.png create mode 100644 graphics/chroma-marble/40_bomb_blue_down.png create mode 100644 graphics/chroma-marble/40_bomb_blue_left.png create mode 100644 graphics/chroma-marble/40_bomb_blue_right.png create mode 100644 graphics/chroma-marble/40_bomb_blue_up.png create mode 100644 graphics/chroma-marble/40_bomb_green_down.png create mode 100644 graphics/chroma-marble/40_bomb_green_left.png create mode 100644 graphics/chroma-marble/40_bomb_green_right.png create mode 100644 graphics/chroma-marble/40_bomb_green_up.png create mode 100644 graphics/chroma-marble/40_bomb_red_down.png create mode 100644 graphics/chroma-marble/40_bomb_red_left.png create mode 100644 graphics/chroma-marble/40_bomb_red_right.png create mode 100644 graphics/chroma-marble/40_bomb_red_up.png create mode 100644 graphics/chroma-marble/40_bomb_shadow_down.png create mode 100644 graphics/chroma-marble/40_bomb_shadow_left.png create mode 100644 graphics/chroma-marble/40_bomb_shadow_right.png create mode 100644 graphics/chroma-marble/40_bomb_shadow_up.png create mode 100644 graphics/chroma-marble/40_circle.png create mode 100644 graphics/chroma-marble/40_circle_double.png create mode 100644 graphics/chroma-marble/40_circle_double_shadow.png create mode 100644 graphics/chroma-marble/40_circle_shadow.png create mode 100644 graphics/chroma-marble/40_door.png create mode 100644 graphics/chroma-marble/40_door_shadow.png create mode 100644 graphics/chroma-marble/40_dots.png create mode 100644 graphics/chroma-marble/40_dots_double.png create mode 100644 graphics/chroma-marble/40_dots_double_shadow.png create mode 100644 graphics/chroma-marble/40_dots_shadow.png create mode 100644 graphics/chroma-marble/40_dots_x.png create mode 100644 graphics/chroma-marble/40_dots_x_shadow.png create mode 100644 graphics/chroma-marble/40_dots_y.png create mode 100644 graphics/chroma-marble/40_dots_y_shadow.png create mode 100644 graphics/chroma-marble/40_map_bottom_left.png create mode 100644 graphics/chroma-marble/40_map_bottom_right.png create mode 100644 graphics/chroma-marble/40_map_shadow.png create mode 100644 graphics/chroma-marble/40_map_top_left.png create mode 100644 graphics/chroma-marble/40_map_top_right.png create mode 100644 graphics/chroma-marble/40_player_one.png create mode 100644 graphics/chroma-marble/40_player_one_swapped.png create mode 100644 graphics/chroma-marble/40_player_shadow.png create mode 100644 graphics/chroma-marble/40_player_two.png create mode 100644 graphics/chroma-marble/40_player_two_swapped.png create mode 100644 graphics/chroma-marble/40_space.png create mode 100644 graphics/chroma-marble/40_star.png create mode 100644 graphics/chroma-marble/40_star_shadow.png create mode 100644 graphics/chroma-marble/40_switch.png create mode 100644 graphics/chroma-marble/40_switch_shadow.png create mode 100644 graphics/chroma-marble/40_teleport.png create mode 100644 graphics/chroma-marble/40_teleport_shadow.png create mode 100644 graphics/chroma-marble/40_wall.png create mode 100644 graphics/chroma-marble/40_wall_inside.png create mode 100644 graphics/chroma-marble/40_wall_inside_shadow.png create mode 100644 graphics/chroma-marble/40_wall_outside.png create mode 100644 graphics/chroma-marble/40_wall_outside_shadow.png create mode 100644 graphics/chroma-marble/40_wall_x.png create mode 100644 graphics/chroma-marble/40_wall_x_shadow.png create mode 100644 graphics/chroma-marble/40_wall_y.png create mode 100644 graphics/chroma-marble/40_wall_y_shadow.png create mode 100644 graphics/chroma-marble/64_arrow_blue_down.png create mode 100644 graphics/chroma-marble/64_arrow_blue_left.png create mode 100644 graphics/chroma-marble/64_arrow_blue_right.png create mode 100644 graphics/chroma-marble/64_arrow_blue_up.png create mode 100644 graphics/chroma-marble/64_arrow_green_down.png create mode 100644 graphics/chroma-marble/64_arrow_green_left.png create mode 100644 graphics/chroma-marble/64_arrow_green_right.png create mode 100644 graphics/chroma-marble/64_arrow_green_up.png create mode 100644 graphics/chroma-marble/64_arrow_red_down.png create mode 100644 graphics/chroma-marble/64_arrow_red_left.png create mode 100644 graphics/chroma-marble/64_arrow_red_right.png create mode 100644 graphics/chroma-marble/64_arrow_red_up.png create mode 100644 graphics/chroma-marble/64_arrow_shadow_down.png create mode 100644 graphics/chroma-marble/64_arrow_shadow_left.png create mode 100644 graphics/chroma-marble/64_arrow_shadow_right.png create mode 100644 graphics/chroma-marble/64_arrow_shadow_up.png create mode 100644 graphics/chroma-marble/64_bomb_blue_down.png create mode 100644 graphics/chroma-marble/64_bomb_blue_left.png create mode 100644 graphics/chroma-marble/64_bomb_blue_right.png create mode 100644 graphics/chroma-marble/64_bomb_blue_up.png create mode 100644 graphics/chroma-marble/64_bomb_green_down.png create mode 100644 graphics/chroma-marble/64_bomb_green_left.png create mode 100644 graphics/chroma-marble/64_bomb_green_right.png create mode 100644 graphics/chroma-marble/64_bomb_green_up.png create mode 100644 graphics/chroma-marble/64_bomb_red_down.png create mode 100644 graphics/chroma-marble/64_bomb_red_left.png create mode 100644 graphics/chroma-marble/64_bomb_red_right.png create mode 100644 graphics/chroma-marble/64_bomb_red_up.png create mode 100644 graphics/chroma-marble/64_bomb_shadow_down.png create mode 100644 graphics/chroma-marble/64_bomb_shadow_left.png create mode 100644 graphics/chroma-marble/64_bomb_shadow_right.png create mode 100644 graphics/chroma-marble/64_bomb_shadow_up.png create mode 100644 graphics/chroma-marble/64_circle.png create mode 100644 graphics/chroma-marble/64_circle_double.png create mode 100644 graphics/chroma-marble/64_circle_double_shadow.png create mode 100644 graphics/chroma-marble/64_circle_shadow.png create mode 100644 graphics/chroma-marble/64_door.png create mode 100644 graphics/chroma-marble/64_door_shadow.png create mode 100644 graphics/chroma-marble/64_dots.png create mode 100644 graphics/chroma-marble/64_dots_double.png create mode 100644 graphics/chroma-marble/64_dots_double_shadow.png create mode 100644 graphics/chroma-marble/64_dots_shadow.png create mode 100644 graphics/chroma-marble/64_dots_x.png create mode 100644 graphics/chroma-marble/64_dots_x_shadow.png create mode 100644 graphics/chroma-marble/64_dots_y.png create mode 100644 graphics/chroma-marble/64_dots_y_shadow.png create mode 100644 graphics/chroma-marble/64_map_bottom_left.png create mode 100644 graphics/chroma-marble/64_map_bottom_right.png create mode 100644 graphics/chroma-marble/64_map_shadow.png create mode 100644 graphics/chroma-marble/64_map_top_left.png create mode 100644 graphics/chroma-marble/64_map_top_right.png create mode 100644 graphics/chroma-marble/64_player_one.png create mode 100644 graphics/chroma-marble/64_player_one_swapped.png create mode 100644 graphics/chroma-marble/64_player_shadow.png create mode 100644 graphics/chroma-marble/64_player_two.png create mode 100644 graphics/chroma-marble/64_player_two_swapped.png create mode 100644 graphics/chroma-marble/64_space.png create mode 100644 graphics/chroma-marble/64_star.png create mode 100644 graphics/chroma-marble/64_star_shadow.png create mode 100644 graphics/chroma-marble/64_switch.png create mode 100644 graphics/chroma-marble/64_switch_shadow.png create mode 100644 graphics/chroma-marble/64_teleport.png create mode 100644 graphics/chroma-marble/64_teleport_shadow.png create mode 100644 graphics/chroma-marble/64_wall.png create mode 100644 graphics/chroma-marble/64_wall_inside.png create mode 100644 graphics/chroma-marble/64_wall_inside_shadow.png create mode 100644 graphics/chroma-marble/64_wall_outside.png create mode 100644 graphics/chroma-marble/64_wall_outside_shadow.png create mode 100644 graphics/chroma-marble/64_wall_x.png create mode 100644 graphics/chroma-marble/64_wall_x_shadow.png create mode 100644 graphics/chroma-marble/64_wall_y.png create mode 100644 graphics/chroma-marble/64_wall_y_shadow.png create mode 100644 graphics/chroma-neon.chroma create mode 100644 graphics/chroma-neon/16_arrow_blue_down.png create mode 100644 graphics/chroma-neon/16_arrow_blue_down_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_blue_left.png create mode 100644 graphics/chroma-neon/16_arrow_blue_left_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_blue_right.png create mode 100644 graphics/chroma-neon/16_arrow_blue_right_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_blue_up.png create mode 100644 graphics/chroma-neon/16_arrow_blue_up_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_green_down.png create mode 100644 graphics/chroma-neon/16_arrow_green_down_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_green_left.png create mode 100644 graphics/chroma-neon/16_arrow_green_left_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_green_right.png create mode 100644 graphics/chroma-neon/16_arrow_green_right_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_green_up.png create mode 100644 graphics/chroma-neon/16_arrow_green_up_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_red_down.png create mode 100644 graphics/chroma-neon/16_arrow_red_down_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_red_left.png create mode 100644 graphics/chroma-neon/16_arrow_red_left_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_red_right.png create mode 100644 graphics/chroma-neon/16_arrow_red_right_shadow.png create mode 100644 graphics/chroma-neon/16_arrow_red_up.png create mode 100644 graphics/chroma-neon/16_arrow_red_up_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_blue_down.png create mode 100644 graphics/chroma-neon/16_bomb_blue_down_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_blue_left.png create mode 100644 graphics/chroma-neon/16_bomb_blue_left_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_blue_right.png create mode 100644 graphics/chroma-neon/16_bomb_blue_right_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_blue_up.png create mode 100644 graphics/chroma-neon/16_bomb_blue_up_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_green_down.png create mode 100644 graphics/chroma-neon/16_bomb_green_down_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_green_left.png create mode 100644 graphics/chroma-neon/16_bomb_green_left_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_green_right.png create mode 100644 graphics/chroma-neon/16_bomb_green_right_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_green_up.png create mode 100644 graphics/chroma-neon/16_bomb_green_up_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_red_down.png create mode 100644 graphics/chroma-neon/16_bomb_red_down_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_red_left.png create mode 100644 graphics/chroma-neon/16_bomb_red_left_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_red_right.png create mode 100644 graphics/chroma-neon/16_bomb_red_right_shadow.png create mode 100644 graphics/chroma-neon/16_bomb_red_up.png create mode 100644 graphics/chroma-neon/16_bomb_red_up_shadow.png create mode 100644 graphics/chroma-neon/16_circle.png create mode 100644 graphics/chroma-neon/16_circle_double.png create mode 100644 graphics/chroma-neon/16_circle_double_shadow.png create mode 100644 graphics/chroma-neon/16_circle_shadow.png create mode 100644 graphics/chroma-neon/16_door.png create mode 100644 graphics/chroma-neon/16_door_shadow.png create mode 100644 graphics/chroma-neon/16_dots.png create mode 100644 graphics/chroma-neon/16_dots_double.png create mode 100644 graphics/chroma-neon/16_dots_double_shadow.png create mode 100644 graphics/chroma-neon/16_dots_shadow.png create mode 100644 graphics/chroma-neon/16_dots_x.png create mode 100644 graphics/chroma-neon/16_dots_x_shadow.png create mode 100644 graphics/chroma-neon/16_dots_y.png create mode 100644 graphics/chroma-neon/16_dots_y_shadow.png create mode 100644 graphics/chroma-neon/16_earth.png create mode 100644 graphics/chroma-neon/16_earth_double.png create mode 100644 graphics/chroma-neon/16_earth_double_shadow.png create mode 100644 graphics/chroma-neon/16_earth_shadow.png create mode 100644 graphics/chroma-neon/16_earth_x.png create mode 100644 graphics/chroma-neon/16_earth_x_shadow.png create mode 100644 graphics/chroma-neon/16_earth_y.png create mode 100644 graphics/chroma-neon/16_earth_y_shadow.png create mode 100644 graphics/chroma-neon/16_map_bottom_left.png create mode 100644 graphics/chroma-neon/16_map_bottom_left_shadow.png create mode 100644 graphics/chroma-neon/16_map_bottom_right.png create mode 100644 graphics/chroma-neon/16_map_bottom_right_shadow.png create mode 100644 graphics/chroma-neon/16_map_top_left.png create mode 100644 graphics/chroma-neon/16_map_top_left_shadow.png create mode 100644 graphics/chroma-neon/16_map_top_right.png create mode 100644 graphics/chroma-neon/16_map_top_right_shadow.png create mode 100644 graphics/chroma-neon/16_player_one.png create mode 100644 graphics/chroma-neon/16_player_one_shadow.png create mode 100644 graphics/chroma-neon/16_player_one_swapped.png create mode 100644 graphics/chroma-neon/16_player_one_swapped_shadow.png create mode 100644 graphics/chroma-neon/16_player_two.png create mode 100644 graphics/chroma-neon/16_player_two_shadow.png create mode 100644 graphics/chroma-neon/16_player_two_swapped.png create mode 100644 graphics/chroma-neon/16_player_two_swapped_shadow.png create mode 100644 graphics/chroma-neon/16_star.png create mode 100644 graphics/chroma-neon/16_star_shadow.png create mode 100644 graphics/chroma-neon/16_switch.png create mode 100644 graphics/chroma-neon/16_switch_shadow.png create mode 100644 graphics/chroma-neon/16_teleport.png create mode 100644 graphics/chroma-neon/16_teleport_shadow.png create mode 100644 graphics/chroma-neon/16_wall.png create mode 100644 graphics/chroma-neon/16_wall_inside.png create mode 100644 graphics/chroma-neon/16_wall_outside.png create mode 100644 graphics/chroma-neon/16_wall_shadow.png create mode 100644 graphics/chroma-neon/16_wall_x.png create mode 100644 graphics/chroma-neon/16_wall_y.png create mode 100644 graphics/chroma-neon/20_arrow_blue_down.png create mode 100644 graphics/chroma-neon/20_arrow_blue_down_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_blue_left.png create mode 100644 graphics/chroma-neon/20_arrow_blue_left_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_blue_right.png create mode 100644 graphics/chroma-neon/20_arrow_blue_right_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_blue_up.png create mode 100644 graphics/chroma-neon/20_arrow_blue_up_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_green_down.png create mode 100644 graphics/chroma-neon/20_arrow_green_down_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_green_left.png create mode 100644 graphics/chroma-neon/20_arrow_green_left_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_green_right.png create mode 100644 graphics/chroma-neon/20_arrow_green_right_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_green_up.png create mode 100644 graphics/chroma-neon/20_arrow_green_up_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_red_down.png create mode 100644 graphics/chroma-neon/20_arrow_red_down_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_red_left.png create mode 100644 graphics/chroma-neon/20_arrow_red_left_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_red_right.png create mode 100644 graphics/chroma-neon/20_arrow_red_right_shadow.png create mode 100644 graphics/chroma-neon/20_arrow_red_up.png create mode 100644 graphics/chroma-neon/20_arrow_red_up_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_blue_down.png create mode 100644 graphics/chroma-neon/20_bomb_blue_down_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_blue_left.png create mode 100644 graphics/chroma-neon/20_bomb_blue_left_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_blue_right.png create mode 100644 graphics/chroma-neon/20_bomb_blue_right_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_blue_up.png create mode 100644 graphics/chroma-neon/20_bomb_blue_up_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_green_down.png create mode 100644 graphics/chroma-neon/20_bomb_green_down_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_green_left.png create mode 100644 graphics/chroma-neon/20_bomb_green_left_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_green_right.png create mode 100644 graphics/chroma-neon/20_bomb_green_right_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_green_up.png create mode 100644 graphics/chroma-neon/20_bomb_green_up_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_red_down.png create mode 100644 graphics/chroma-neon/20_bomb_red_down_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_red_left.png create mode 100644 graphics/chroma-neon/20_bomb_red_left_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_red_right.png create mode 100644 graphics/chroma-neon/20_bomb_red_right_shadow.png create mode 100644 graphics/chroma-neon/20_bomb_red_up.png create mode 100644 graphics/chroma-neon/20_bomb_red_up_shadow.png create mode 100644 graphics/chroma-neon/20_circle.png create mode 100644 graphics/chroma-neon/20_circle_double.png create mode 100644 graphics/chroma-neon/20_circle_double_shadow.png create mode 100644 graphics/chroma-neon/20_circle_shadow.png create mode 100644 graphics/chroma-neon/20_door.png create mode 100644 graphics/chroma-neon/20_door_shadow.png create mode 100644 graphics/chroma-neon/20_dots.png create mode 100644 graphics/chroma-neon/20_dots_double.png create mode 100644 graphics/chroma-neon/20_dots_double_shadow.png create mode 100644 graphics/chroma-neon/20_dots_shadow.png create mode 100644 graphics/chroma-neon/20_dots_x.png create mode 100644 graphics/chroma-neon/20_dots_x_shadow.png create mode 100644 graphics/chroma-neon/20_dots_y.png create mode 100644 graphics/chroma-neon/20_dots_y_shadow.png create mode 100644 graphics/chroma-neon/20_earth.png create mode 100644 graphics/chroma-neon/20_earth_double.png create mode 100644 graphics/chroma-neon/20_earth_double_shadow.png create mode 100644 graphics/chroma-neon/20_earth_shadow.png create mode 100644 graphics/chroma-neon/20_earth_x.png create mode 100644 graphics/chroma-neon/20_earth_x_shadow.png create mode 100644 graphics/chroma-neon/20_earth_y.png create mode 100644 graphics/chroma-neon/20_earth_y_shadow.png create mode 100644 graphics/chroma-neon/20_map_bottom_left.png create mode 100644 graphics/chroma-neon/20_map_bottom_left_shadow.png create mode 100644 graphics/chroma-neon/20_map_bottom_right.png create mode 100644 graphics/chroma-neon/20_map_bottom_right_shadow.png create mode 100644 graphics/chroma-neon/20_map_top_left.png create mode 100644 graphics/chroma-neon/20_map_top_left_shadow.png create mode 100644 graphics/chroma-neon/20_map_top_right.png create mode 100644 graphics/chroma-neon/20_map_top_right_shadow.png create mode 100644 graphics/chroma-neon/20_player_one.png create mode 100644 graphics/chroma-neon/20_player_one_shadow.png create mode 100644 graphics/chroma-neon/20_player_one_swapped.png create mode 100644 graphics/chroma-neon/20_player_one_swapped_shadow.png create mode 100644 graphics/chroma-neon/20_player_two.png create mode 100644 graphics/chroma-neon/20_player_two_shadow.png create mode 100644 graphics/chroma-neon/20_player_two_swapped.png create mode 100644 graphics/chroma-neon/20_player_two_swapped_shadow.png create mode 100644 graphics/chroma-neon/20_star.png create mode 100644 graphics/chroma-neon/20_star_shadow.png create mode 100644 graphics/chroma-neon/20_switch.png create mode 100644 graphics/chroma-neon/20_switch_shadow.png create mode 100644 graphics/chroma-neon/20_teleport.png create mode 100644 graphics/chroma-neon/20_teleport_shadow.png create mode 100644 graphics/chroma-neon/20_wall.png create mode 100644 graphics/chroma-neon/20_wall_inside.png create mode 100644 graphics/chroma-neon/20_wall_outside.png create mode 100644 graphics/chroma-neon/20_wall_shadow.png create mode 100644 graphics/chroma-neon/20_wall_x.png create mode 100644 graphics/chroma-neon/20_wall_y.png create mode 100644 graphics/chroma-neon/24_arrow_blue_down.png create mode 100644 graphics/chroma-neon/24_arrow_blue_down_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_blue_left.png create mode 100644 graphics/chroma-neon/24_arrow_blue_left_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_blue_right.png create mode 100644 graphics/chroma-neon/24_arrow_blue_right_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_blue_up.png create mode 100644 graphics/chroma-neon/24_arrow_blue_up_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_green_down.png create mode 100644 graphics/chroma-neon/24_arrow_green_down_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_green_left.png create mode 100644 graphics/chroma-neon/24_arrow_green_left_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_green_right.png create mode 100644 graphics/chroma-neon/24_arrow_green_right_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_green_up.png create mode 100644 graphics/chroma-neon/24_arrow_green_up_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_red_down.png create mode 100644 graphics/chroma-neon/24_arrow_red_down_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_red_left.png create mode 100644 graphics/chroma-neon/24_arrow_red_left_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_red_right.png create mode 100644 graphics/chroma-neon/24_arrow_red_right_shadow.png create mode 100644 graphics/chroma-neon/24_arrow_red_up.png create mode 100644 graphics/chroma-neon/24_arrow_red_up_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_blue_down.png create mode 100644 graphics/chroma-neon/24_bomb_blue_down_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_blue_left.png create mode 100644 graphics/chroma-neon/24_bomb_blue_left_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_blue_right.png create mode 100644 graphics/chroma-neon/24_bomb_blue_right_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_blue_up.png create mode 100644 graphics/chroma-neon/24_bomb_blue_up_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_green_down.png create mode 100644 graphics/chroma-neon/24_bomb_green_down_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_green_left.png create mode 100644 graphics/chroma-neon/24_bomb_green_left_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_green_right.png create mode 100644 graphics/chroma-neon/24_bomb_green_right_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_green_up.png create mode 100644 graphics/chroma-neon/24_bomb_green_up_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_red_down.png create mode 100644 graphics/chroma-neon/24_bomb_red_down_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_red_left.png create mode 100644 graphics/chroma-neon/24_bomb_red_left_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_red_right.png create mode 100644 graphics/chroma-neon/24_bomb_red_right_shadow.png create mode 100644 graphics/chroma-neon/24_bomb_red_up.png create mode 100644 graphics/chroma-neon/24_bomb_red_up_shadow.png create mode 100644 graphics/chroma-neon/24_circle.png create mode 100644 graphics/chroma-neon/24_circle_double.png create mode 100644 graphics/chroma-neon/24_circle_double_shadow.png create mode 100644 graphics/chroma-neon/24_circle_shadow.png create mode 100644 graphics/chroma-neon/24_door.png create mode 100644 graphics/chroma-neon/24_door_shadow.png create mode 100644 graphics/chroma-neon/24_dots.png create mode 100644 graphics/chroma-neon/24_dots_double.png create mode 100644 graphics/chroma-neon/24_dots_double_shadow.png create mode 100644 graphics/chroma-neon/24_dots_shadow.png create mode 100644 graphics/chroma-neon/24_dots_x.png create mode 100644 graphics/chroma-neon/24_dots_x_shadow.png create mode 100644 graphics/chroma-neon/24_dots_y.png create mode 100644 graphics/chroma-neon/24_dots_y_shadow.png create mode 100644 graphics/chroma-neon/24_earth.png create mode 100644 graphics/chroma-neon/24_earth_double.png create mode 100644 graphics/chroma-neon/24_earth_double_shadow.png create mode 100644 graphics/chroma-neon/24_earth_shadow.png create mode 100644 graphics/chroma-neon/24_earth_x.png create mode 100644 graphics/chroma-neon/24_earth_x_shadow.png create mode 100644 graphics/chroma-neon/24_earth_y.png create mode 100644 graphics/chroma-neon/24_earth_y_shadow.png create mode 100644 graphics/chroma-neon/24_map_bottom_left.png create mode 100644 graphics/chroma-neon/24_map_bottom_left_shadow.png create mode 100644 graphics/chroma-neon/24_map_bottom_right.png create mode 100644 graphics/chroma-neon/24_map_bottom_right_shadow.png create mode 100644 graphics/chroma-neon/24_map_top_left.png create mode 100644 graphics/chroma-neon/24_map_top_left_shadow.png create mode 100644 graphics/chroma-neon/24_map_top_right.png create mode 100644 graphics/chroma-neon/24_map_top_right_shadow.png create mode 100644 graphics/chroma-neon/24_player_one.png create mode 100644 graphics/chroma-neon/24_player_one_shadow.png create mode 100644 graphics/chroma-neon/24_player_one_swapped.png create mode 100644 graphics/chroma-neon/24_player_one_swapped_shadow.png create mode 100644 graphics/chroma-neon/24_player_two.png create mode 100644 graphics/chroma-neon/24_player_two_shadow.png create mode 100644 graphics/chroma-neon/24_player_two_swapped.png create mode 100644 graphics/chroma-neon/24_player_two_swapped_shadow.png create mode 100644 graphics/chroma-neon/24_star.png create mode 100644 graphics/chroma-neon/24_star_shadow.png create mode 100644 graphics/chroma-neon/24_switch.png create mode 100644 graphics/chroma-neon/24_switch_shadow.png create mode 100644 graphics/chroma-neon/24_teleport.png create mode 100644 graphics/chroma-neon/24_teleport_shadow.png create mode 100644 graphics/chroma-neon/24_wall.png create mode 100644 graphics/chroma-neon/24_wall_inside.png create mode 100644 graphics/chroma-neon/24_wall_outside.png create mode 100644 graphics/chroma-neon/24_wall_shadow.png create mode 100644 graphics/chroma-neon/24_wall_x.png create mode 100644 graphics/chroma-neon/24_wall_y.png create mode 100644 graphics/chroma-neon/32_arrow_blue_down.png create mode 100644 graphics/chroma-neon/32_arrow_blue_down_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_blue_left.png create mode 100644 graphics/chroma-neon/32_arrow_blue_left_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_blue_right.png create mode 100644 graphics/chroma-neon/32_arrow_blue_right_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_blue_up.png create mode 100644 graphics/chroma-neon/32_arrow_blue_up_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_green_down.png create mode 100644 graphics/chroma-neon/32_arrow_green_down_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_green_left.png create mode 100644 graphics/chroma-neon/32_arrow_green_left_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_green_right.png create mode 100644 graphics/chroma-neon/32_arrow_green_right_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_green_up.png create mode 100644 graphics/chroma-neon/32_arrow_green_up_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_red_down.png create mode 100644 graphics/chroma-neon/32_arrow_red_down_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_red_left.png create mode 100644 graphics/chroma-neon/32_arrow_red_left_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_red_right.png create mode 100644 graphics/chroma-neon/32_arrow_red_right_shadow.png create mode 100644 graphics/chroma-neon/32_arrow_red_up.png create mode 100644 graphics/chroma-neon/32_arrow_red_up_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_blue_down.png create mode 100644 graphics/chroma-neon/32_bomb_blue_down_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_blue_left.png create mode 100644 graphics/chroma-neon/32_bomb_blue_left_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_blue_right.png create mode 100644 graphics/chroma-neon/32_bomb_blue_right_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_blue_up.png create mode 100644 graphics/chroma-neon/32_bomb_blue_up_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_green_down.png create mode 100644 graphics/chroma-neon/32_bomb_green_down_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_green_left.png create mode 100644 graphics/chroma-neon/32_bomb_green_left_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_green_right.png create mode 100644 graphics/chroma-neon/32_bomb_green_right_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_green_up.png create mode 100644 graphics/chroma-neon/32_bomb_green_up_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_red_down.png create mode 100644 graphics/chroma-neon/32_bomb_red_down_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_red_left.png create mode 100644 graphics/chroma-neon/32_bomb_red_left_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_red_right.png create mode 100644 graphics/chroma-neon/32_bomb_red_right_shadow.png create mode 100644 graphics/chroma-neon/32_bomb_red_up.png create mode 100644 graphics/chroma-neon/32_bomb_red_up_shadow.png create mode 100644 graphics/chroma-neon/32_circle.png create mode 100644 graphics/chroma-neon/32_circle_double.png create mode 100644 graphics/chroma-neon/32_circle_double_shadow.png create mode 100644 graphics/chroma-neon/32_circle_shadow.png create mode 100644 graphics/chroma-neon/32_door.png create mode 100644 graphics/chroma-neon/32_door_shadow.png create mode 100644 graphics/chroma-neon/32_dots.png create mode 100644 graphics/chroma-neon/32_dots_double.png create mode 100644 graphics/chroma-neon/32_dots_double_shadow.png create mode 100644 graphics/chroma-neon/32_dots_shadow.png create mode 100644 graphics/chroma-neon/32_dots_x.png create mode 100644 graphics/chroma-neon/32_dots_x_shadow.png create mode 100644 graphics/chroma-neon/32_dots_y.png create mode 100644 graphics/chroma-neon/32_dots_y_shadow.png create mode 100644 graphics/chroma-neon/32_earth.png create mode 100644 graphics/chroma-neon/32_earth_double.png create mode 100644 graphics/chroma-neon/32_earth_double_shadow.png create mode 100644 graphics/chroma-neon/32_earth_shadow.png create mode 100644 graphics/chroma-neon/32_earth_x.png create mode 100644 graphics/chroma-neon/32_earth_x_shadow.png create mode 100644 graphics/chroma-neon/32_earth_y.png create mode 100644 graphics/chroma-neon/32_earth_y_shadow.png create mode 100644 graphics/chroma-neon/32_map_bottom_left.png create mode 100644 graphics/chroma-neon/32_map_bottom_left_shadow.png create mode 100644 graphics/chroma-neon/32_map_bottom_right.png create mode 100644 graphics/chroma-neon/32_map_bottom_right_shadow.png create mode 100644 graphics/chroma-neon/32_map_top_left.png create mode 100644 graphics/chroma-neon/32_map_top_left_shadow.png create mode 100644 graphics/chroma-neon/32_map_top_right.png create mode 100644 graphics/chroma-neon/32_map_top_right_shadow.png create mode 100644 graphics/chroma-neon/32_player_one.png create mode 100644 graphics/chroma-neon/32_player_one_shadow.png create mode 100644 graphics/chroma-neon/32_player_one_swapped.png create mode 100644 graphics/chroma-neon/32_player_one_swapped_shadow.png create mode 100644 graphics/chroma-neon/32_player_two.png create mode 100644 graphics/chroma-neon/32_player_two_shadow.png create mode 100644 graphics/chroma-neon/32_player_two_swapped.png create mode 100644 graphics/chroma-neon/32_player_two_swapped_shadow.png create mode 100644 graphics/chroma-neon/32_star.png create mode 100644 graphics/chroma-neon/32_star_shadow.png create mode 100644 graphics/chroma-neon/32_switch.png create mode 100644 graphics/chroma-neon/32_switch_shadow.png create mode 100644 graphics/chroma-neon/32_teleport.png create mode 100644 graphics/chroma-neon/32_teleport_shadow.png create mode 100644 graphics/chroma-neon/32_wall.png create mode 100644 graphics/chroma-neon/32_wall_inside.png create mode 100644 graphics/chroma-neon/32_wall_outside.png create mode 100644 graphics/chroma-neon/32_wall_shadow.png create mode 100644 graphics/chroma-neon/32_wall_x.png create mode 100644 graphics/chroma-neon/32_wall_y.png create mode 100644 graphics/chroma-neon/40_arrow_blue_down.png create mode 100644 graphics/chroma-neon/40_arrow_blue_down_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_blue_left.png create mode 100644 graphics/chroma-neon/40_arrow_blue_left_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_blue_right.png create mode 100644 graphics/chroma-neon/40_arrow_blue_right_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_blue_up.png create mode 100644 graphics/chroma-neon/40_arrow_blue_up_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_green_down.png create mode 100644 graphics/chroma-neon/40_arrow_green_down_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_green_left.png create mode 100644 graphics/chroma-neon/40_arrow_green_left_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_green_right.png create mode 100644 graphics/chroma-neon/40_arrow_green_right_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_green_up.png create mode 100644 graphics/chroma-neon/40_arrow_green_up_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_red_down.png create mode 100644 graphics/chroma-neon/40_arrow_red_down_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_red_left.png create mode 100644 graphics/chroma-neon/40_arrow_red_left_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_red_right.png create mode 100644 graphics/chroma-neon/40_arrow_red_right_shadow.png create mode 100644 graphics/chroma-neon/40_arrow_red_up.png create mode 100644 graphics/chroma-neon/40_arrow_red_up_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_blue_down.png create mode 100644 graphics/chroma-neon/40_bomb_blue_down_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_blue_left.png create mode 100644 graphics/chroma-neon/40_bomb_blue_left_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_blue_right.png create mode 100644 graphics/chroma-neon/40_bomb_blue_right_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_blue_up.png create mode 100644 graphics/chroma-neon/40_bomb_blue_up_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_green_down.png create mode 100644 graphics/chroma-neon/40_bomb_green_down_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_green_left.png create mode 100644 graphics/chroma-neon/40_bomb_green_left_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_green_right.png create mode 100644 graphics/chroma-neon/40_bomb_green_right_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_green_up.png create mode 100644 graphics/chroma-neon/40_bomb_green_up_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_red_down.png create mode 100644 graphics/chroma-neon/40_bomb_red_down_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_red_left.png create mode 100644 graphics/chroma-neon/40_bomb_red_left_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_red_right.png create mode 100644 graphics/chroma-neon/40_bomb_red_right_shadow.png create mode 100644 graphics/chroma-neon/40_bomb_red_up.png create mode 100644 graphics/chroma-neon/40_bomb_red_up_shadow.png create mode 100644 graphics/chroma-neon/40_circle.png create mode 100644 graphics/chroma-neon/40_circle_double.png create mode 100644 graphics/chroma-neon/40_circle_double_shadow.png create mode 100644 graphics/chroma-neon/40_circle_shadow.png create mode 100644 graphics/chroma-neon/40_door.png create mode 100644 graphics/chroma-neon/40_door_shadow.png create mode 100644 graphics/chroma-neon/40_dots.png create mode 100644 graphics/chroma-neon/40_dots_double.png create mode 100644 graphics/chroma-neon/40_dots_double_shadow.png create mode 100644 graphics/chroma-neon/40_dots_shadow.png create mode 100644 graphics/chroma-neon/40_dots_x.png create mode 100644 graphics/chroma-neon/40_dots_x_shadow.png create mode 100644 graphics/chroma-neon/40_dots_y.png create mode 100644 graphics/chroma-neon/40_dots_y_shadow.png create mode 100644 graphics/chroma-neon/40_earth.png create mode 100644 graphics/chroma-neon/40_earth_double.png create mode 100644 graphics/chroma-neon/40_earth_double_shadow.png create mode 100644 graphics/chroma-neon/40_earth_shadow.png create mode 100644 graphics/chroma-neon/40_earth_x.png create mode 100644 graphics/chroma-neon/40_earth_x_shadow.png create mode 100644 graphics/chroma-neon/40_earth_y.png create mode 100644 graphics/chroma-neon/40_earth_y_shadow.png create mode 100644 graphics/chroma-neon/40_map_bottom_left.png create mode 100644 graphics/chroma-neon/40_map_bottom_left_shadow.png create mode 100644 graphics/chroma-neon/40_map_bottom_right.png create mode 100644 graphics/chroma-neon/40_map_bottom_right_shadow.png create mode 100644 graphics/chroma-neon/40_map_top_left.png create mode 100644 graphics/chroma-neon/40_map_top_left_shadow.png create mode 100644 graphics/chroma-neon/40_map_top_right.png create mode 100644 graphics/chroma-neon/40_map_top_right_shadow.png create mode 100644 graphics/chroma-neon/40_player_one.png create mode 100644 graphics/chroma-neon/40_player_one_shadow.png create mode 100644 graphics/chroma-neon/40_player_one_swapped.png create mode 100644 graphics/chroma-neon/40_player_one_swapped_shadow.png create mode 100644 graphics/chroma-neon/40_player_two.png create mode 100644 graphics/chroma-neon/40_player_two_shadow.png create mode 100644 graphics/chroma-neon/40_player_two_swapped.png create mode 100644 graphics/chroma-neon/40_player_two_swapped_shadow.png create mode 100644 graphics/chroma-neon/40_star.png create mode 100644 graphics/chroma-neon/40_star_shadow.png create mode 100644 graphics/chroma-neon/40_switch.png create mode 100644 graphics/chroma-neon/40_switch_shadow.png create mode 100644 graphics/chroma-neon/40_teleport.png create mode 100644 graphics/chroma-neon/40_teleport_shadow.png create mode 100644 graphics/chroma-neon/40_wall.png create mode 100644 graphics/chroma-neon/40_wall_inside.png create mode 100644 graphics/chroma-neon/40_wall_outside.png create mode 100644 graphics/chroma-neon/40_wall_shadow.png create mode 100644 graphics/chroma-neon/40_wall_x.png create mode 100644 graphics/chroma-neon/40_wall_y.png create mode 100644 graphics/chroma-neon/64_arrow_blue_down.png create mode 100644 graphics/chroma-neon/64_arrow_blue_down_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_blue_left.png create mode 100644 graphics/chroma-neon/64_arrow_blue_left_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_blue_right.png create mode 100644 graphics/chroma-neon/64_arrow_blue_right_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_blue_up.png create mode 100644 graphics/chroma-neon/64_arrow_blue_up_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_green_down.png create mode 100644 graphics/chroma-neon/64_arrow_green_down_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_green_left.png create mode 100644 graphics/chroma-neon/64_arrow_green_left_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_green_right.png create mode 100644 graphics/chroma-neon/64_arrow_green_right_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_green_up.png create mode 100644 graphics/chroma-neon/64_arrow_green_up_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_red_down.png create mode 100644 graphics/chroma-neon/64_arrow_red_down_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_red_left.png create mode 100644 graphics/chroma-neon/64_arrow_red_left_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_red_right.png create mode 100644 graphics/chroma-neon/64_arrow_red_right_shadow.png create mode 100644 graphics/chroma-neon/64_arrow_red_up.png create mode 100644 graphics/chroma-neon/64_arrow_red_up_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_blue_down.png create mode 100644 graphics/chroma-neon/64_bomb_blue_down_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_blue_left.png create mode 100644 graphics/chroma-neon/64_bomb_blue_left_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_blue_right.png create mode 100644 graphics/chroma-neon/64_bomb_blue_right_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_blue_up.png create mode 100644 graphics/chroma-neon/64_bomb_blue_up_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_green_down.png create mode 100644 graphics/chroma-neon/64_bomb_green_down_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_green_left.png create mode 100644 graphics/chroma-neon/64_bomb_green_left_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_green_right.png create mode 100644 graphics/chroma-neon/64_bomb_green_right_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_green_up.png create mode 100644 graphics/chroma-neon/64_bomb_green_up_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_red_down.png create mode 100644 graphics/chroma-neon/64_bomb_red_down_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_red_left.png create mode 100644 graphics/chroma-neon/64_bomb_red_left_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_red_right.png create mode 100644 graphics/chroma-neon/64_bomb_red_right_shadow.png create mode 100644 graphics/chroma-neon/64_bomb_red_up.png create mode 100644 graphics/chroma-neon/64_bomb_red_up_shadow.png create mode 100644 graphics/chroma-neon/64_circle.png create mode 100644 graphics/chroma-neon/64_circle_double.png create mode 100644 graphics/chroma-neon/64_circle_double_shadow.png create mode 100644 graphics/chroma-neon/64_circle_shadow.png create mode 100644 graphics/chroma-neon/64_door.png create mode 100644 graphics/chroma-neon/64_door_shadow.png create mode 100644 graphics/chroma-neon/64_dots.png create mode 100644 graphics/chroma-neon/64_dots_double.png create mode 100644 graphics/chroma-neon/64_dots_double_shadow.png create mode 100644 graphics/chroma-neon/64_dots_shadow.png create mode 100644 graphics/chroma-neon/64_dots_x.png create mode 100644 graphics/chroma-neon/64_dots_x_shadow.png create mode 100644 graphics/chroma-neon/64_dots_y.png create mode 100644 graphics/chroma-neon/64_dots_y_shadow.png create mode 100644 graphics/chroma-neon/64_earth.png create mode 100644 graphics/chroma-neon/64_earth_double.png create mode 100644 graphics/chroma-neon/64_earth_double_shadow.png create mode 100644 graphics/chroma-neon/64_earth_shadow.png create mode 100644 graphics/chroma-neon/64_earth_x.png create mode 100644 graphics/chroma-neon/64_earth_x_shadow.png create mode 100644 graphics/chroma-neon/64_earth_y.png create mode 100644 graphics/chroma-neon/64_earth_y_shadow.png create mode 100644 graphics/chroma-neon/64_map_bottom_left.png create mode 100644 graphics/chroma-neon/64_map_bottom_left_shadow.png create mode 100644 graphics/chroma-neon/64_map_bottom_right.png create mode 100644 graphics/chroma-neon/64_map_bottom_right_shadow.png create mode 100644 graphics/chroma-neon/64_map_top_left.png create mode 100644 graphics/chroma-neon/64_map_top_left_shadow.png create mode 100644 graphics/chroma-neon/64_map_top_right.png create mode 100644 graphics/chroma-neon/64_map_top_right_shadow.png create mode 100644 graphics/chroma-neon/64_player_one.png create mode 100644 graphics/chroma-neon/64_player_one_shadow.png create mode 100644 graphics/chroma-neon/64_player_one_swapped.png create mode 100644 graphics/chroma-neon/64_player_one_swapped_shadow.png create mode 100644 graphics/chroma-neon/64_player_two.png create mode 100644 graphics/chroma-neon/64_player_two_shadow.png create mode 100644 graphics/chroma-neon/64_player_two_swapped.png create mode 100644 graphics/chroma-neon/64_player_two_swapped_shadow.png create mode 100644 graphics/chroma-neon/64_star.png create mode 100644 graphics/chroma-neon/64_star_shadow.png create mode 100644 graphics/chroma-neon/64_switch.png create mode 100644 graphics/chroma-neon/64_switch_shadow.png create mode 100644 graphics/chroma-neon/64_teleport.png create mode 100644 graphics/chroma-neon/64_teleport_shadow.png create mode 100644 graphics/chroma-neon/64_wall.png create mode 100644 graphics/chroma-neon/64_wall_inside.png create mode 100644 graphics/chroma-neon/64_wall_outside.png create mode 100644 graphics/chroma-neon/64_wall_shadow.png create mode 100644 graphics/chroma-neon/64_wall_x.png create mode 100644 graphics/chroma-neon/64_wall_y.png create mode 100644 graphics/chroma-zen.chroma create mode 100644 graphics/chroma-zen/16_arrow_blue_down.png create mode 100644 graphics/chroma-zen/16_arrow_blue_left.png create mode 100644 graphics/chroma-zen/16_arrow_blue_right.png create mode 100644 graphics/chroma-zen/16_arrow_blue_up.png create mode 100644 graphics/chroma-zen/16_arrow_green_down.png create mode 100644 graphics/chroma-zen/16_arrow_green_left.png create mode 100644 graphics/chroma-zen/16_arrow_green_right.png create mode 100644 graphics/chroma-zen/16_arrow_green_up.png create mode 100644 graphics/chroma-zen/16_arrow_red_down.png create mode 100644 graphics/chroma-zen/16_arrow_red_left.png create mode 100644 graphics/chroma-zen/16_arrow_red_right.png create mode 100644 graphics/chroma-zen/16_arrow_red_up.png create mode 100644 graphics/chroma-zen/16_bomb_blue_down.png create mode 100644 graphics/chroma-zen/16_bomb_blue_left.png create mode 100644 graphics/chroma-zen/16_bomb_blue_right.png create mode 100644 graphics/chroma-zen/16_bomb_blue_up.png create mode 100644 graphics/chroma-zen/16_bomb_green_down.png create mode 100644 graphics/chroma-zen/16_bomb_green_left.png create mode 100644 graphics/chroma-zen/16_bomb_green_right.png create mode 100644 graphics/chroma-zen/16_bomb_green_up.png create mode 100644 graphics/chroma-zen/16_bomb_red_down.png create mode 100644 graphics/chroma-zen/16_bomb_red_left.png create mode 100644 graphics/chroma-zen/16_bomb_red_right.png create mode 100644 graphics/chroma-zen/16_bomb_red_up.png create mode 100644 graphics/chroma-zen/16_circle.png create mode 100644 graphics/chroma-zen/16_circle_double.png create mode 100644 graphics/chroma-zen/16_door.png create mode 100644 graphics/chroma-zen/16_dots.png create mode 100644 graphics/chroma-zen/16_dots_double.png create mode 100644 graphics/chroma-zen/16_dots_x.png create mode 100644 graphics/chroma-zen/16_dots_y.png create mode 100644 graphics/chroma-zen/16_earth.png create mode 100644 graphics/chroma-zen/16_earth_double.png create mode 100644 graphics/chroma-zen/16_earth_x.png create mode 100644 graphics/chroma-zen/16_earth_y.png create mode 100644 graphics/chroma-zen/16_map_bottom_left.png create mode 100644 graphics/chroma-zen/16_map_bottom_right.png create mode 100644 graphics/chroma-zen/16_map_top_left.png create mode 100644 graphics/chroma-zen/16_map_top_right.png create mode 100644 graphics/chroma-zen/16_player_one.png create mode 100644 graphics/chroma-zen/16_player_one_swapped.png create mode 100644 graphics/chroma-zen/16_player_two.png create mode 100644 graphics/chroma-zen/16_player_two_swapped.png create mode 100644 graphics/chroma-zen/16_star.png create mode 100644 graphics/chroma-zen/16_switch.png create mode 100644 graphics/chroma-zen/16_teleport.png create mode 100644 graphics/chroma-zen/16_wall_inside.png create mode 100644 graphics/chroma-zen/16_wall_outside.png create mode 100644 graphics/chroma-zen/16_wall_x.png create mode 100644 graphics/chroma-zen/16_wall_y.png create mode 100644 graphics/chroma-zen/20_arrow_blue_down.png create mode 100644 graphics/chroma-zen/20_arrow_blue_left.png create mode 100644 graphics/chroma-zen/20_arrow_blue_right.png create mode 100644 graphics/chroma-zen/20_arrow_blue_up.png create mode 100644 graphics/chroma-zen/20_arrow_green_down.png create mode 100644 graphics/chroma-zen/20_arrow_green_left.png create mode 100644 graphics/chroma-zen/20_arrow_green_right.png create mode 100644 graphics/chroma-zen/20_arrow_green_up.png create mode 100644 graphics/chroma-zen/20_arrow_red_down.png create mode 100644 graphics/chroma-zen/20_arrow_red_left.png create mode 100644 graphics/chroma-zen/20_arrow_red_right.png create mode 100644 graphics/chroma-zen/20_arrow_red_up.png create mode 100644 graphics/chroma-zen/20_bomb_blue_down.png create mode 100644 graphics/chroma-zen/20_bomb_blue_left.png create mode 100644 graphics/chroma-zen/20_bomb_blue_right.png create mode 100644 graphics/chroma-zen/20_bomb_blue_up.png create mode 100644 graphics/chroma-zen/20_bomb_green_down.png create mode 100644 graphics/chroma-zen/20_bomb_green_left.png create mode 100644 graphics/chroma-zen/20_bomb_green_right.png create mode 100644 graphics/chroma-zen/20_bomb_green_up.png create mode 100644 graphics/chroma-zen/20_bomb_red_down.png create mode 100644 graphics/chroma-zen/20_bomb_red_left.png create mode 100644 graphics/chroma-zen/20_bomb_red_right.png create mode 100644 graphics/chroma-zen/20_bomb_red_up.png create mode 100644 graphics/chroma-zen/20_circle.png create mode 100644 graphics/chroma-zen/20_circle_double.png create mode 100644 graphics/chroma-zen/20_door.png create mode 100644 graphics/chroma-zen/20_dots.png create mode 100644 graphics/chroma-zen/20_dots_double.png create mode 100644 graphics/chroma-zen/20_dots_x.png create mode 100644 graphics/chroma-zen/20_dots_y.png create mode 100644 graphics/chroma-zen/20_earth.png create mode 100644 graphics/chroma-zen/20_earth_double.png create mode 100644 graphics/chroma-zen/20_earth_x.png create mode 100644 graphics/chroma-zen/20_earth_y.png create mode 100644 graphics/chroma-zen/20_map_bottom_left.png create mode 100644 graphics/chroma-zen/20_map_bottom_right.png create mode 100644 graphics/chroma-zen/20_map_top_left.png create mode 100644 graphics/chroma-zen/20_map_top_right.png create mode 100644 graphics/chroma-zen/20_player_one.png create mode 100644 graphics/chroma-zen/20_player_one_swapped.png create mode 100644 graphics/chroma-zen/20_player_two.png create mode 100644 graphics/chroma-zen/20_player_two_swapped.png create mode 100644 graphics/chroma-zen/20_star.png create mode 100644 graphics/chroma-zen/20_switch.png create mode 100644 graphics/chroma-zen/20_teleport.png create mode 100644 graphics/chroma-zen/20_wall_inside.png create mode 100644 graphics/chroma-zen/20_wall_outside.png create mode 100644 graphics/chroma-zen/20_wall_x.png create mode 100644 graphics/chroma-zen/20_wall_y.png create mode 100644 graphics/chroma-zen/24_arrow_blue_down.png create mode 100644 graphics/chroma-zen/24_arrow_blue_left.png create mode 100644 graphics/chroma-zen/24_arrow_blue_right.png create mode 100644 graphics/chroma-zen/24_arrow_blue_up.png create mode 100644 graphics/chroma-zen/24_arrow_green_down.png create mode 100644 graphics/chroma-zen/24_arrow_green_left.png create mode 100644 graphics/chroma-zen/24_arrow_green_right.png create mode 100644 graphics/chroma-zen/24_arrow_green_up.png create mode 100644 graphics/chroma-zen/24_arrow_red_down.png create mode 100644 graphics/chroma-zen/24_arrow_red_left.png create mode 100644 graphics/chroma-zen/24_arrow_red_right.png create mode 100644 graphics/chroma-zen/24_arrow_red_up.png create mode 100644 graphics/chroma-zen/24_bomb_blue_down.png create mode 100644 graphics/chroma-zen/24_bomb_blue_left.png create mode 100644 graphics/chroma-zen/24_bomb_blue_right.png create mode 100644 graphics/chroma-zen/24_bomb_blue_up.png create mode 100644 graphics/chroma-zen/24_bomb_green_down.png create mode 100644 graphics/chroma-zen/24_bomb_green_left.png create mode 100644 graphics/chroma-zen/24_bomb_green_right.png create mode 100644 graphics/chroma-zen/24_bomb_green_up.png create mode 100644 graphics/chroma-zen/24_bomb_red_down.png create mode 100644 graphics/chroma-zen/24_bomb_red_left.png create mode 100644 graphics/chroma-zen/24_bomb_red_right.png create mode 100644 graphics/chroma-zen/24_bomb_red_up.png create mode 100644 graphics/chroma-zen/24_circle.png create mode 100644 graphics/chroma-zen/24_circle_double.png create mode 100644 graphics/chroma-zen/24_door.png create mode 100644 graphics/chroma-zen/24_dots.png create mode 100644 graphics/chroma-zen/24_dots_double.png create mode 100644 graphics/chroma-zen/24_dots_x.png create mode 100644 graphics/chroma-zen/24_dots_y.png create mode 100644 graphics/chroma-zen/24_earth.png create mode 100644 graphics/chroma-zen/24_earth_double.png create mode 100644 graphics/chroma-zen/24_earth_x.png create mode 100644 graphics/chroma-zen/24_earth_y.png create mode 100644 graphics/chroma-zen/24_map_bottom_left.png create mode 100644 graphics/chroma-zen/24_map_bottom_right.png create mode 100644 graphics/chroma-zen/24_map_top_left.png create mode 100644 graphics/chroma-zen/24_map_top_right.png create mode 100644 graphics/chroma-zen/24_player_one.png create mode 100644 graphics/chroma-zen/24_player_one_swapped.png create mode 100644 graphics/chroma-zen/24_player_two.png create mode 100644 graphics/chroma-zen/24_player_two_swapped.png create mode 100644 graphics/chroma-zen/24_star.png create mode 100644 graphics/chroma-zen/24_switch.png create mode 100644 graphics/chroma-zen/24_teleport.png create mode 100644 graphics/chroma-zen/24_wall_inside.png create mode 100644 graphics/chroma-zen/24_wall_outside.png create mode 100644 graphics/chroma-zen/24_wall_x.png create mode 100644 graphics/chroma-zen/24_wall_y.png create mode 100644 graphics/chroma-zen/32_arrow_blue_down.png create mode 100644 graphics/chroma-zen/32_arrow_blue_left.png create mode 100644 graphics/chroma-zen/32_arrow_blue_right.png create mode 100644 graphics/chroma-zen/32_arrow_blue_up.png create mode 100644 graphics/chroma-zen/32_arrow_green_down.png create mode 100644 graphics/chroma-zen/32_arrow_green_left.png create mode 100644 graphics/chroma-zen/32_arrow_green_right.png create mode 100644 graphics/chroma-zen/32_arrow_green_up.png create mode 100644 graphics/chroma-zen/32_arrow_red_down.png create mode 100644 graphics/chroma-zen/32_arrow_red_left.png create mode 100644 graphics/chroma-zen/32_arrow_red_right.png create mode 100644 graphics/chroma-zen/32_arrow_red_up.png create mode 100644 graphics/chroma-zen/32_bomb_blue_down.png create mode 100644 graphics/chroma-zen/32_bomb_blue_left.png create mode 100644 graphics/chroma-zen/32_bomb_blue_right.png create mode 100644 graphics/chroma-zen/32_bomb_blue_up.png create mode 100644 graphics/chroma-zen/32_bomb_green_down.png create mode 100644 graphics/chroma-zen/32_bomb_green_left.png create mode 100644 graphics/chroma-zen/32_bomb_green_right.png create mode 100644 graphics/chroma-zen/32_bomb_green_up.png create mode 100644 graphics/chroma-zen/32_bomb_red_down.png create mode 100644 graphics/chroma-zen/32_bomb_red_left.png create mode 100644 graphics/chroma-zen/32_bomb_red_right.png create mode 100644 graphics/chroma-zen/32_bomb_red_up.png create mode 100644 graphics/chroma-zen/32_circle.png create mode 100644 graphics/chroma-zen/32_circle_double.png create mode 100644 graphics/chroma-zen/32_door.png create mode 100644 graphics/chroma-zen/32_dots.png create mode 100644 graphics/chroma-zen/32_dots_double.png create mode 100644 graphics/chroma-zen/32_dots_x.png create mode 100644 graphics/chroma-zen/32_dots_y.png create mode 100644 graphics/chroma-zen/32_earth.png create mode 100644 graphics/chroma-zen/32_earth_double.png create mode 100644 graphics/chroma-zen/32_earth_x.png create mode 100644 graphics/chroma-zen/32_earth_y.png create mode 100644 graphics/chroma-zen/32_map_bottom_left.png create mode 100644 graphics/chroma-zen/32_map_bottom_right.png create mode 100644 graphics/chroma-zen/32_map_top_left.png create mode 100644 graphics/chroma-zen/32_map_top_right.png create mode 100644 graphics/chroma-zen/32_player_one.png create mode 100644 graphics/chroma-zen/32_player_one_swapped.png create mode 100644 graphics/chroma-zen/32_player_two.png create mode 100644 graphics/chroma-zen/32_player_two_swapped.png create mode 100644 graphics/chroma-zen/32_star.png create mode 100644 graphics/chroma-zen/32_switch.png create mode 100644 graphics/chroma-zen/32_teleport.png create mode 100644 graphics/chroma-zen/32_wall_inside.png create mode 100644 graphics/chroma-zen/32_wall_outside.png create mode 100644 graphics/chroma-zen/32_wall_x.png create mode 100644 graphics/chroma-zen/32_wall_y.png create mode 100644 graphics/chroma-zen/40_arrow_blue_down.png create mode 100644 graphics/chroma-zen/40_arrow_blue_left.png create mode 100644 graphics/chroma-zen/40_arrow_blue_right.png create mode 100644 graphics/chroma-zen/40_arrow_blue_up.png create mode 100644 graphics/chroma-zen/40_arrow_green_down.png create mode 100644 graphics/chroma-zen/40_arrow_green_left.png create mode 100644 graphics/chroma-zen/40_arrow_green_right.png create mode 100644 graphics/chroma-zen/40_arrow_green_up.png create mode 100644 graphics/chroma-zen/40_arrow_red_down.png create mode 100644 graphics/chroma-zen/40_arrow_red_left.png create mode 100644 graphics/chroma-zen/40_arrow_red_right.png create mode 100644 graphics/chroma-zen/40_arrow_red_up.png create mode 100644 graphics/chroma-zen/40_bomb_blue_down.png create mode 100644 graphics/chroma-zen/40_bomb_blue_left.png create mode 100644 graphics/chroma-zen/40_bomb_blue_right.png create mode 100644 graphics/chroma-zen/40_bomb_blue_up.png create mode 100644 graphics/chroma-zen/40_bomb_green_down.png create mode 100644 graphics/chroma-zen/40_bomb_green_left.png create mode 100644 graphics/chroma-zen/40_bomb_green_right.png create mode 100644 graphics/chroma-zen/40_bomb_green_up.png create mode 100644 graphics/chroma-zen/40_bomb_red_down.png create mode 100644 graphics/chroma-zen/40_bomb_red_left.png create mode 100644 graphics/chroma-zen/40_bomb_red_right.png create mode 100644 graphics/chroma-zen/40_bomb_red_up.png create mode 100644 graphics/chroma-zen/40_circle.png create mode 100644 graphics/chroma-zen/40_circle_double.png create mode 100644 graphics/chroma-zen/40_door.png create mode 100644 graphics/chroma-zen/40_dots.png create mode 100644 graphics/chroma-zen/40_dots_double.png create mode 100644 graphics/chroma-zen/40_dots_x.png create mode 100644 graphics/chroma-zen/40_dots_y.png create mode 100644 graphics/chroma-zen/40_earth.png create mode 100644 graphics/chroma-zen/40_earth_double.png create mode 100644 graphics/chroma-zen/40_earth_x.png create mode 100644 graphics/chroma-zen/40_earth_y.png create mode 100644 graphics/chroma-zen/40_map_bottom_left.png create mode 100644 graphics/chroma-zen/40_map_bottom_right.png create mode 100644 graphics/chroma-zen/40_map_top_left.png create mode 100644 graphics/chroma-zen/40_map_top_right.png create mode 100644 graphics/chroma-zen/40_player_one.png create mode 100644 graphics/chroma-zen/40_player_one_swapped.png create mode 100644 graphics/chroma-zen/40_player_two.png create mode 100644 graphics/chroma-zen/40_player_two_swapped.png create mode 100644 graphics/chroma-zen/40_star.png create mode 100644 graphics/chroma-zen/40_switch.png create mode 100644 graphics/chroma-zen/40_teleport.png create mode 100644 graphics/chroma-zen/40_wall_inside.png create mode 100644 graphics/chroma-zen/40_wall_outside.png create mode 100644 graphics/chroma-zen/40_wall_x.png create mode 100644 graphics/chroma-zen/40_wall_y.png create mode 100644 graphics/chroma-zen/64_arrow_blue_down.png create mode 100644 graphics/chroma-zen/64_arrow_blue_left.png create mode 100644 graphics/chroma-zen/64_arrow_blue_right.png create mode 100644 graphics/chroma-zen/64_arrow_blue_up.png create mode 100644 graphics/chroma-zen/64_arrow_green_down.png create mode 100644 graphics/chroma-zen/64_arrow_green_left.png create mode 100644 graphics/chroma-zen/64_arrow_green_right.png create mode 100644 graphics/chroma-zen/64_arrow_green_up.png create mode 100644 graphics/chroma-zen/64_arrow_red_down.png create mode 100644 graphics/chroma-zen/64_arrow_red_left.png create mode 100644 graphics/chroma-zen/64_arrow_red_right.png create mode 100644 graphics/chroma-zen/64_arrow_red_up.png create mode 100644 graphics/chroma-zen/64_bomb_blue_down.png create mode 100644 graphics/chroma-zen/64_bomb_blue_left.png create mode 100644 graphics/chroma-zen/64_bomb_blue_right.png create mode 100644 graphics/chroma-zen/64_bomb_blue_up.png create mode 100644 graphics/chroma-zen/64_bomb_green_down.png create mode 100644 graphics/chroma-zen/64_bomb_green_left.png create mode 100644 graphics/chroma-zen/64_bomb_green_right.png create mode 100644 graphics/chroma-zen/64_bomb_green_up.png create mode 100644 graphics/chroma-zen/64_bomb_red_down.png create mode 100644 graphics/chroma-zen/64_bomb_red_left.png create mode 100644 graphics/chroma-zen/64_bomb_red_right.png create mode 100644 graphics/chroma-zen/64_bomb_red_up.png create mode 100644 graphics/chroma-zen/64_circle.png create mode 100644 graphics/chroma-zen/64_circle_double.png create mode 100644 graphics/chroma-zen/64_door.png create mode 100644 graphics/chroma-zen/64_dots.png create mode 100644 graphics/chroma-zen/64_dots_double.png create mode 100644 graphics/chroma-zen/64_dots_x.png create mode 100644 graphics/chroma-zen/64_dots_y.png create mode 100644 graphics/chroma-zen/64_earth.png create mode 100644 graphics/chroma-zen/64_earth_double.png create mode 100644 graphics/chroma-zen/64_earth_x.png create mode 100644 graphics/chroma-zen/64_earth_y.png create mode 100644 graphics/chroma-zen/64_map_bottom_left.png create mode 100644 graphics/chroma-zen/64_map_bottom_right.png create mode 100644 graphics/chroma-zen/64_map_top_left.png create mode 100644 graphics/chroma-zen/64_map_top_right.png create mode 100644 graphics/chroma-zen/64_player_one.png create mode 100644 graphics/chroma-zen/64_player_one_swapped.png create mode 100644 graphics/chroma-zen/64_player_two.png create mode 100644 graphics/chroma-zen/64_player_two_swapped.png create mode 100644 graphics/chroma-zen/64_star.png create mode 100644 graphics/chroma-zen/64_switch.png create mode 100644 graphics/chroma-zen/64_teleport.png create mode 100644 graphics/chroma-zen/64_wall_inside.png create mode 100644 graphics/chroma-zen/64_wall_outside.png create mode 100644 graphics/chroma-zen/64_wall_x.png create mode 100644 graphics/chroma-zen/64_wall_y.png create mode 100644 graphics/curses.chroma create mode 100644 graphics/fallback.chroma create mode 100644 graphics/font.ttf create mode 100644 graphics/font.txt create mode 100644 graphics/icon.png create mode 100644 help/README create mode 100644 iconcurses.ico create mode 100644 iconcurses.rc create mode 100644 iconsdl.ico create mode 100644 iconsdl.rc create mode 100755 install-sh create mode 100644 level.c create mode 100644 level.h create mode 100644 levels/chroma-1/chroma-1-01.chroma create mode 100644 levels/chroma-1/chroma-1-02.chroma create mode 100644 levels/chroma-1/chroma-1-03.chroma create mode 100644 levels/chroma-1/chroma-1-04.chroma create mode 100644 levels/chroma-1/chroma-1-05.chroma create mode 100644 levels/chroma-1/chroma-1-06.chroma create mode 100644 levels/chroma-1/chroma-1-07.chroma create mode 100644 levels/chroma-1/chroma-1-08.chroma create mode 100644 levels/chroma-1/chroma-1-09.chroma create mode 100644 levels/chroma-1/set.chroma create mode 100644 levels/chroma-2/chroma-2-01.chroma create mode 100644 levels/chroma-2/chroma-2-02.chroma create mode 100644 levels/chroma-2/chroma-2-03.chroma create mode 100644 levels/chroma-2/chroma-2-04.chroma create mode 100644 levels/chroma-2/chroma-2-05.chroma create mode 100644 levels/chroma-2/chroma-2-06.chroma create mode 100644 levels/chroma-2/chroma-2-07.chroma create mode 100644 levels/chroma-2/chroma-2-08.chroma create mode 100644 levels/chroma-2/chroma-2-09.chroma create mode 100644 levels/chroma-2/chroma-2-10.chroma create mode 100644 levels/chroma-2/chroma-2-11.chroma create mode 100644 levels/chroma-2/chroma-2-12.chroma create mode 100644 levels/chroma-2/set.chroma create mode 100644 levels/regression/chroma-pieces.chroma create mode 100644 levels/regression/chroma-regression.chroma create mode 100644 levels/regression/enigma-regression.chroma create mode 100644 levels/regression/set.chroma create mode 100644 levels/regression/xor-regression.chroma create mode 100644 locale/en_US/LC_MESSAGES/chroma.mo create mode 100644 main.c create mode 100644 menu.c create mode 100644 menu.h create mode 100644 names.c create mode 100644 po/README create mode 100644 po/chroma.pot create mode 100644 po/en_US.po create mode 100644 resources/README create mode 100644 resources/browser/graphics-marble.svg create mode 100644 resources/browser/graphics-neon.svg create mode 100644 resources/browser/graphics-zen.svg create mode 100644 resources/browser/preview-marble.svg create mode 100644 resources/browser/preview-neon.svg create mode 100644 resources/browser/preview-zen.svg create mode 100755 resources/convert2chroma.pl create mode 100755 resources/crush.pl create mode 100644 resources/icons.svg create mode 100644 resources/logo.svg create mode 100755 resources/make-base-marble.pl create mode 100755 resources/make-graphics.sh create mode 100755 resources/make-pieces-marble.pl create mode 100755 resources/make-pieces-neon.pl create mode 100755 resources/make-pieces-zen.pl create mode 100755 resources/make-wall-marble.pl create mode 100644 resources/pieces-marble-base.svg create mode 100644 resources/pieces-marble-wall.svg create mode 100644 resources/pieces-marble.svg create mode 100644 resources/pieces-neon-base.svg create mode 100644 resources/pieces-neon-overlay-double.svg create mode 100644 resources/pieces-neon-overlay.svg create mode 100644 resources/pieces-zen.svg create mode 100644 sdldisplay.c create mode 100644 sdlfont.c create mode 100644 sdlfont.h create mode 100644 sdlmenudisplay.c create mode 100644 sdlscreen.c create mode 100644 sdlscreen.h create mode 100644 sdlshadowdisplay.c create mode 100644 util.c create mode 100644 util.h create mode 100644 xmlparser.c create mode 100644 xmlparser.h create mode 100644 xor.c diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..7a1b3ab --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,89 @@ +1.18 (10th January 2021) +========================= + * fixed problems to allow building on Ubuntu 20.04 + +1.17 (26th April 2019) +======================= + * fixed problem when undoing moves in XOR that led to player dying + +1.16 (9th January 2019) +======================== + * included browser version + * simplified shadow display code + * fixed error with replay speed + * convert2chroma.pl can now extract BBC Procyon levels + +1.15 (20th April 2013) +========================== + * fixed XML parser to avoid infinite loop on Raspberry Pi + * fixed a couple of warnings during compilation + +1.14 (12th December 2011) +========================== + * fixed Makefile problem to allow building on Ubuntu 11.10 + +1.13 (14th July 2010) +====================== + * loading a position whilst replaying another no longer continues the replay + +1.12 (22nd April 2010) +======================= + * when a player dies in XOR, the other player is now swapped in automatically + +1.11 (18th March 2010) +======================= + * walls no long erroneously appear when undoing explosions in XOR darkness + +1.10 (8th March 2010) +====================== + * replay and loading of positions from other levels now works as expected + * hopefully the final tidying of the position filtering code + +1.09 (2nd March 2010) +====================== + * in chroma, player swapping now only occurs once per keypress + * slightly tidier position filtering code + +1.08 (1st March 2010) +====================== + * only saved positions for the current level are shown by default + * invisible menu entries are now actually invisible in chroma-curses + +1.07 (15th February 2010) +========================== + * fixed a problem with exploding movers in certain pathological conditions + * made it clearer that Enigma's exact engine only works with red pieces + * fixed a problem with undo in certain pathological conditions + +1.06 (8th February 2010) +========================= + * fixed an annoying segfault when exporting solutions + * exported solutions are no longer world readable + +1.05 (4th February 2010) +========================= + * changes to configure.ac and *display.c to allow building on NetBSD + +1.04 (2nd February 2010) +========================= + * in chroma-curses, you can no longer swap pieces during a replay + * chroma-curses now gets the move counter correct when undoing + +1.03 (1st February 2010) +========================= + * fixed regression failure in Enigma "exact" game engine + * Makefile.in change to allow building on FreeBSD + +1.02 (29th January 2010) +========================= + * improved resolution handling + * "curses emulation" graphics scheme can now be resized like any other + +1.01 (22nd January 2010) +========================= + * fixed a problem with the display being rotated on some systems + +1.00 (21st January 2010) +========================= +Original release. + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..b83f24b --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..e8ada92 --- /dev/null +++ b/INSTALL @@ -0,0 +1,50 @@ +Installation +============ +Chroma uses the standard procedure for compilation and installation: + + ./configure + make + make install + +By default, this will attempt to build both the graphical (SDL) and the +terminal (curses) versions of Chroma, although the configure script may be +given either '--disable-curses' or '--disable-sdl' as options if required. + +Dependencies +============ +The SDL version of Chroma requires the following libraries: + + * SDL + http://www.libsdl.org/ + + * SDL_image + http://www.libsdl.org/projects/SDL_image/ + + * FreeType 2 + http://www.freetype.org/ + +It also uses the font "DejaVu Sans" - see graphics/font.txt for its licence: + + * DejaVu fonts + http://dejavu.sourceforge.net/ + +The curses version of Chroma requires a curses library such as: + + * ncurses + http://www.gnu.org/software/ncurses/ + +Both versions require: + + * gettext + http://www.gnu.org/software/gettext/ + +Most linux distributions should have pre-built packages for all of these. Note +that you will require both the library and development (often -devel) packages. + +Cross-compilation for Windows +============================= +Chroma may be cross-compiled for Windows using MinGW (http://www.mingw.org/). +A separate Makefile.mingw is provided for this purpose, although you will need +to ensure the libraries mentioned above are present in your MinGW installation. +PDCurses (http://pdcurses.sourceforge.net/) may be used in place of ncurses. + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..ec589da --- /dev/null +++ b/Makefile.in @@ -0,0 +1,64 @@ +CC = @CC@ +INSTALL = @INSTALL@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +datadir = @datadir@ +datarootdir = @datarootdir@ + +CFLAGS = @CFLAGS@ @CPPFLAGS@ -DCHROMA_CURSES_HEADER=\<@CURSES@.h\> -DCHROMA_DATA_DIR=\"${datadir}/chroma/\" +INSTALL = @INSTALL@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ + +all: @TARGETS@ + +OBJECTS_COMMON = main.o level.o engine.o menu.o colours.o util.o enigma.o xor.o editor.o xmlparser.o names.o +OBJECTS_CURSES = cursesdisplay.o cursesmenudisplay.o +OBJECTS_SDL = sdldisplay.o sdlshadowdisplay.o sdlmenudisplay.o sdlfont.o sdlscreen.o graphics.o + +chroma-curses: $(OBJECTS_COMMON) $(OBJECTS_CURSES) + $(CC) -o chroma-curses $(OBJECTS_COMMON) $(OBJECTS_CURSES) $(LDFLAGS) $(LIBS) + +chroma-sdl: $(OBJECTS_COMMON) $(OBJECTS_SDL) + $(CC) -o chroma $(OBJECTS_COMMON) $(OBJECTS_SDL) $(LDFLAGS) $(LIBS) + +clean: @TARGETSCLEAN@ + -rm $(OBJECTS_COMMON) + +clean-curses: + -rm $(OBJECTS_CURSES) chroma-curses + +clean-sdl: + -rm $(OBJECTS_SDL) chroma + +install: @TARGETSINSTALL@ + for datafolder in colours help levels levels/* locale locale/* locale/*/*; do \ + if [ -d $$datafolder ]; then \ + ${INSTALL} -d $(DESTDIR)$(datadir)/chroma/$$datafolder; \ + fi; \ + done + for datafile in colours/* help/* levels/* levels/*/* locale/* locale/*/* locale/*/*/*; do \ + if [ -f $$datafile ]; then \ + ${INSTALL} $$datafile $(DESTDIR)$(datadir)/chroma/$$datafile; \ + fi; \ + done + +install-curses: + ${INSTALL} -d $(DESTDIR)$(bindir) + ${INSTALL} chroma-curses $(DESTDIR)$(bindir)/chroma-curses + +install-sdl: + ${INSTALL} -d $(DESTDIR)$(bindir) + ${INSTALL} chroma $(DESTDIR)$(bindir)/chroma + for datafile in graphics graphics/*; do \ + if [ -d $$datafile ]; then \ + ${INSTALL} -d $(DESTDIR)$(datadir)/chroma/$$datafile; \ + fi; \ + done + for datafile in graphics/* graphics/*/*; do \ + if [ -f $$datafile ]; then \ + ${INSTALL} $$datafile $(DESTDIR)$(datadir)/chroma/$$datafile; \ + fi; \ + done diff --git a/Makefile.mingw b/Makefile.mingw new file mode 100644 index 0000000..ca2e3e8 --- /dev/null +++ b/Makefile.mingw @@ -0,0 +1,38 @@ +TMPDIR = /tmp/chroma-win32 +LINK = gcc +LFLAGS = -L/usr/local/cross-tools/lib/ + +WINDRES = i386-mingw32msvc-windres + +OBJECTSCOMMON = main.o level.o engine.o menu.o colours.o util.o enigma.o xor.o editor.o xmlparser.o names.o +OBJECTSCURSES = cursesdisplay.o cursesmenudisplay.o iconcurses.o +OBJECTSSDL = sdldisplay.o sdlshadowdisplay.o sdlmenudisplay.o sdlfont.o sdlscreen.o graphics.o iconsdl.o + +all: chromacurses chromasdl + +iconsdl.o: iconsdl.rc iconsdl.ico + $(WINDRES) -o iconsdl.o iconsdl.rc + +iconcurses.o: iconcurses.rc iconcurses.ico + $(WINDRES) -o iconcurses.o iconcurses.rc + +chromacurses: $(OBJECTSCOMMON) $(OBJECTSCURSES) + $(LINK) $(LFLAGS) -o chroma-curses.exe $(OBJECTSCOMMON) $(OBJECTSCURSES) -lpdcurses -lintl + +chromasdl: $(OBJECTSCOMMON) $(OBJECTSSDL) + $(LINK) $(LFLAGS) -o chroma.exe $(OBJECTSCOMMON) $(OBJECTSSDL) -lSDL -lSDL_image -mwindows -lfreetype -lintl + +clean: + -rm $(OBJECTSCOMMON) $(OBJECTSCURSES) $(OBJECTSSDL) $(OBJECTSVALIDATE) chroma.exe chroma-curses.exe chroma-setup.exe chroma-win32.zip + +install: + -rm -rf $(TMPDIR) + mkdir $(TMPDIR) + cp *.exe *.dll $(TMPDIR) + cp -r graphics/ $(TMPDIR) + cp -r colours/ $(TMPDIR) + cp -r locale/ $(TMPDIR) + mkdir $(TMPDIR)/levels/ + cp -r levels/chroma-1/ levels/chroma-2/ levels/regression/ $(TMPDIR)/levels/ + zip -r chroma-win32.zip $(TMPDIR) + diff --git a/README b/README new file mode 100644 index 0000000..f8d8038 --- /dev/null +++ b/README @@ -0,0 +1,102 @@ +Chroma 1.18 (10th January 2021) +================================ +Chroma is an abstract puzzle game. A variety of colourful shapes are arranged +in a series of increasingly complex patterns, forming fiendish traps that must +be disarmed and mysterious puzzles that must be manipulated in order to give +up their subtle secrets. Initially so straightforward that anyone can pick it +up and begin to play, yet gradually becoming difficult enough to tax even the +brightest of minds. Have you got what it takes to solve Chroma? + +Installing +========== +See INSTALL for details of how to compile and install Chroma from the tarball. + +Playing +======= +Run `chroma` for the graphical version of Chroma, or `chroma-curses` for a +minimal, text based version that runs in a terminal or a command window. + +There are twenty one levels, split into two sets - nine intended for beginners, +providing a step-by-step introduction to the mechanics of Chroma's building +blocks, and a further twelve for those in search of a real challenge. You can +play them in any order, but you'll probably find it useful to build up +experience on the earlier levels before tacking the later ones. + +In each level, the goal is to use your two player pieces to collect all of the +stars before leaving through the door. Other pieces such as circles, squares, +triangles and dots serve to help or hinder you in this quest. Part of the +challenge of Chroma is understanding exactly how these pieces interact with +one another - you'll need to experiment until you discover how their differing +properties can best be used to your advantage. To this end, the full range of +pieces is introduced over the first six levels of each set. + +There are two octagonal player pieces, of which one is active, and may be +moved using the arrow keys. To swap control to the other player piece, press +[SPACE] or [ENTER] - its colour will change to reflect this. Initially, many of +the puzzles can be solved using only one of the player pieces, but as the +levels get harder, you'll find it necessary to carefully co-ordinate the moves +of both of them in order to achieve your objective. + +If you make a mistake, you can press [DELETE] to undo as many moves as you +wish, allowing you to move in a different way or press [INSERT] to redo moves +that have been previously undone. Once a move has been made, however, you must +wait for its full consequences to take effect before you can move again. In the +graphical version, holding [SHIFT] down will speed things up, whereas [CTRL] +will slow things down, allowing you to observe the changes in more detail. +[F] will bring the pieces to their ultimate state of rest immediately. + +Pressing [ESCAPE] will present you with a menu, from which you can save your +position, load a previous position, or return to the level selection menu, as +well as allowing you to revert to the last position loaded. At the start of a +level, you can also replay the moves from a previously saved position. When +doing so, [LEFT] reverses the replay, [UP] or [DOWN] pauses it, and [RIGHT] +continues. Should you wish to stop the replay and start making moves again, +return to the menu with [ESCAPE], then press [T]. + +The Display Options menu allows you to change the graphics used, as well as +the size of the screen and the speed of the game. You can also change the keys +used and how the mouse works, and save these changes for future use if desired. + +Level Editor +============ +Selecting [E] from the title screen allows you to design your own levels. To +start with a blank level, press [L] and then [C]. You can now press [Q] to +enter the level editor itself. Use the arrow keys to move the cursor, and +[PAGE-UP] and [PAGE-DOWN] to change the currently selected piece. Pressing +[SPACE] or [ENTER] will place a piece under the cursor, and pressing [Q] will +return you to the editing menu, from which you can save your work, test the +level, or verify it to ensure that it contains no errors. The Level Options +menu allows you to give your level a title, change its size and rotate it. + +Browser Version +=============== +The "browser" directory contains all the files necessary to play Chroma in a +standards compliant browser. For Chrome, add --allow-file-access-from-files to +the browser's command line or use a different brwoser or local web server. + +Website +======= +Visit the Chroma website at http://level7.org.uk/chroma/ + +Comments and suggestions regarding Chroma are always welcome! Email chroma (at) +level7 (dot) org (dot) uk, including the word "chroma" in your subject line to +boost your chances of beating the unfortunately necessary spam filter. + +Copyright and Licence +===================== +Chroma is Copyright (C) 2010-2021 Amf + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + diff --git a/actions.h b/actions.h new file mode 100644 index 0000000..8f6ce8d --- /dev/null +++ b/actions.h @@ -0,0 +1,54 @@ +/* + actions.h + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +enum +{ + ACTION_NONE, + ACTION_QUIT, + ACTION_REDRAW, + ACTION_FAST, + ACTION_LEFT, + ACTION_RIGHT, + ACTION_UP, + ACTION_DOWN, + ACTION_SWAP, + ACTION_UNDO, + ACTION_REDO, + ACTION_PIECE_LEFT, + ACTION_PIECE_RIGHT, + ACTION_HIDE, + ACTION_PAUSE, + ACTION_FASTER, + ACTION_SLOWER, + + ACTION_MOUSE_CLICK, + ACTION_MOUSE_DRAG, + ACTION_MOUSE_DRAG_OR_CLICK, + + ACTION_MAX +}; + +#define ACTION_PAGE_UP ACTION_PIECE_LEFT +#define ACTION_PAGE_DOWN ACTION_PIECE_RIGHT +#define ACTION_ENTER ACTION_SWAP +#define ACTION_DELETE ACTION_UNDO + +#define ACTION_KEY_MIN ACTION_NONE +#define ACTION_KEY_MAX ACTION_SLOWER + 1 diff --git a/browser/chroma-script.js b/browser/chroma-script.js new file mode 100644 index 0000000..6d4ef5c --- /dev/null +++ b/browser/chroma-script.js @@ -0,0 +1,7396 @@ +const graphics_sets = [ + { set: "zen", key: "Z", title: "Zen", preview: "preview-zen.svg", sheet: "graphics-zen.svg", xml: "graphics-zen.xml" }, + { set: "marble", key: "M", title: "Marble", preview: "preview-marble.svg", sheet: "graphics-marble.svg", xml: "graphics-marble.xml" }, + { set: "neon", key: "N", title: "Neon", preview: "preview-neon.svg", sheet: "graphics-neon.svg", xml: "graphics-neon.xml" }, + { set: "xor", key: "X", title: "XOR", preview: "preview-xor.svg", sheet: "graphics-xor.png", xml: "graphics-xor.xml" } +]; + +const graphics_sizes = [ + { size: "0", key: "0", title: "Scale to fit" }, + { size: "16", key: "1", title: "16x16" }, + { size: "24", key: "2", title: "24x24" }, + { size: "32", key: "3", title: "32x32" }, + { size: "48", key: "4", title: "48x48" }, + { size: "64", key: "5", title: "64x64" }, + { size: "96", key: "6", title: "96x96" }, + { size: "128", key: "7", title: "128x128" }, + { size: "-1", key: "C", title: "Custom" } +]; + +const slider_positions = [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4, 3.6, 3.8, 4, 4.2, 4.4, 4.6, 4.8, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5]; + +const font_name = "Sans-Serif"; + +const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; +const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + +const MOVE_LEFT = 0; +const MOVE_UP = 1; +const MOVE_RIGHT = 2; +const MOVE_DOWN = 3; +const MOVE_NONE = 4; +const MOVE_SWAP = 5; +const MOVE_SWAPPED = 6; +const MOVE_UNKNOWN = 7; +const MOVE_REDO = 8; +const MOVE_UNDO = 9; + +const MOVER_FAST = 1; +const MOVER_UNDO = 2; +const MOVER_STORE = 4; + +const PIECE_SPACE = 0; +const PIECE_WALL = 1; +const PIECE_PLAYER_ONE = 2; +const PIECE_PLAYER_TWO = 3; +const PIECE_STAR = 4; +const PIECE_DOTS = 5; +const PIECE_DOOR = 6; +const PIECE_CIRCLE = 7; +const PIECE_ARROW_RED_LEFT = 8; +const PIECE_ARROW_RED_UP = 9; +const PIECE_ARROW_RED_RIGHT = 10; +const PIECE_ARROW_RED_DOWN = 11; +const PIECE_BOMB_RED_LEFT = 12; +const PIECE_BOMB_RED_UP = 13; +const PIECE_BOMB_RED_RIGHT = 14; +const PIECE_BOMB_RED_DOWN = 15; +const PIECE_ARROW_GREEN_LEFT = 16; +const PIECE_ARROW_GREEN_UP = 17; +const PIECE_ARROW_GREEN_RIGHT = 18; +const PIECE_ARROW_GREEN_DOWN = 19; +const PIECE_BOMB_GREEN_LEFT = 20; +const PIECE_BOMB_GREEN_UP = 21; +const PIECE_BOMB_GREEN_RIGHT = 22; +const PIECE_BOMB_GREEN_DOWN = 23; +const PIECE_ARROW_BLUE_LEFT = 24; +const PIECE_ARROW_BLUE_UP = 25; +const PIECE_ARROW_BLUE_RIGHT = 26; +const PIECE_ARROW_BLUE_DOWN = 27; +const PIECE_BOMB_BLUE_LEFT = 28; +const PIECE_BOMB_BLUE_UP = 29; +const PIECE_BOMB_BLUE_RIGHT = 30; +const PIECE_BOMB_BLUE_DOWN = 31; +const PIECE_CIRCLE_DOUBLE = 32; +const PIECE_DOTS_DOUBLE = 33; +const PIECE_DOTS_X = 34; +const PIECE_DOTS_Y = 35; +const PIECE_SWITCH = 36; +const PIECE_TELEPORT = 37; +const PIECE_MAP_TOP_LEFT = 38; +const PIECE_MAP_TOP_RIGHT = 39; +const PIECE_MAP_BOTTOM_LEFT = 40; +const PIECE_MAP_BOTTOM_RIGHT = 41; +const PIECE_DARKNESS = 42; +const PIECE_EXPLOSION_RED_LEFT = 43; +const PIECE_EXPLOSION_RED_HORIZONTAL = 44; +const PIECE_EXPLOSION_RED_RIGHT = 45; +const PIECE_EXPLOSION_RED_TOP = 46; +const PIECE_EXPLOSION_RED_VERTICAL = 47; +const PIECE_EXPLOSION_RED_BOTTOM = 48; +const PIECE_EXPLOSION_GREEN_LEFT = 49; +const PIECE_EXPLOSION_GREEN_HORIZONTAL = 50; +const PIECE_EXPLOSION_GREEN_RIGHT = 51; +const PIECE_EXPLOSION_GREEN_TOP = 52; +const PIECE_EXPLOSION_GREEN_VERTICAL = 53; +const PIECE_EXPLOSION_GREEN_BOTTOM = 54 ; +const PIECE_EXPLOSION_BLUE_LEFT = 55; +const PIECE_EXPLOSION_BLUE_HORIZONTAL = 56; +const PIECE_EXPLOSION_BLUE_RIGHT = 57; +const PIECE_EXPLOSION_BLUE_TOP = 58; +const PIECE_EXPLOSION_BLUE_VERTICAL = 59; +const PIECE_EXPLOSION_BLUE_BOTTOM = 60; + +const PIECE_EXPLOSION_NEW_RED_LEFT = 61; +const PIECE_EXPLOSION_NEW_RED_HORIZONTAL = 62; +const PIECE_EXPLOSION_NEW_RED_RIGHT = 63; +const PIECE_EXPLOSION_NEW_RED_TOP = 64; +const PIECE_EXPLOSION_NEW_RED_VERTICAL = 65; +const PIECE_EXPLOSION_NEW_RED_BOTTOM = 66; +const PIECE_EXPLOSION_NEW_GREEN_LEFT = 67; +const PIECE_EXPLOSION_NEW_GREEN_HORIZONTAL = 68; +const PIECE_EXPLOSION_NEW_GREEN_RIGHT = 69; +const PIECE_EXPLOSION_NEW_GREEN_TOP = 70; +const PIECE_EXPLOSION_NEW_GREEN_VERTICAL = 71; +const PIECE_EXPLOSION_NEW_GREEN_BOTTOM = 72; +const PIECE_EXPLOSION_NEW_BLUE_LEFT = 73; +const PIECE_EXPLOSION_NEW_BLUE_HORIZONTAL = 74; +const PIECE_EXPLOSION_NEW_BLUE_RIGHT = 75; +const PIECE_EXPLOSION_NEW_BLUE_TOP = 76; +const PIECE_EXPLOSION_NEW_BLUE_VERTICAL = 77; +const PIECE_EXPLOSION_NEW_BLUE_BOTTOM = 78; + +const PIECE_CURSOR = 79; +const PIECE_GONE = 80; +const PIECE_UNKNOWN = 81; + +const PIECE_EXPLOSION_FIRST = PIECE_EXPLOSION_RED_LEFT; +const PIECE_EXPLOSION_LAST = PIECE_EXPLOSION_BLUE_BOTTOM; +const PIECE_EXPLOSION_NEW_FIRST = PIECE_EXPLOSION_NEW_RED_LEFT; +const PIECE_EXPLOSION_NEW_LAST = PIECE_EXPLOSION_NEW_BLUE_BOTTOM; +const PIECE_EXPLOSION_NEW_OFFSET = (PIECE_EXPLOSION_NEW_FIRST - PIECE_EXPLOSION_FIRST); +const PIECE_MOVERS_FIRST = PIECE_ARROW_RED_LEFT; +const PIECE_MOVERS_LAST = PIECE_BOMB_BLUE_DOWN; +const PIECE_MAX = PIECE_GONE; + +const PIECE_XOR_MAGUS = PIECE_PLAYER_ONE; +const PIECE_XOR_QUESTOR = PIECE_PLAYER_TWO; +const PIECE_XOR_DOTS = PIECE_DOTS_X; +const PIECE_XOR_WAVES = PIECE_DOTS_Y; +const PIECE_XOR_CHICKEN = PIECE_ARROW_RED_LEFT; +const PIECE_XOR_V_BOMB = PIECE_BOMB_RED_LEFT; +const PIECE_XOR_FISH = PIECE_ARROW_RED_DOWN; +const PIECE_XOR_H_BOMB = PIECE_BOMB_RED_DOWN; +const PIECE_XOR_DOLL = PIECE_CIRCLE; +const PIECE_XOR_MASK = PIECE_STAR; + +/* l u r d n s w */ +const move_x = [-1, 0, 1, 0, 0, 0, 0]; +const move_y = [0, -1, 0, 1, 0, 0, 0]; + +const enigma_move_order = [MOVE_DOWN, MOVE_RIGHT, MOVE_LEFT, MOVE_UP]; + +const xor_teleport_order = [MOVE_RIGHT, MOVE_UP, MOVE_LEFT, MOVE_DOWN]; + +const MODE_CHROMA = 0; +const MODE_XOR = 1; +const MODE_ENIGMA = 2; + +const LEVELFLAG_MOVES = 1; +const LEVELFLAG_STARS = 2; +const LEVELFLAG_SWITCH = 4; +const LEVELFLAG_EXIT = 8; +const LEVELFLAG_SOLVED = 16; +const LEVELFLAG_FAILED = 32; +const LEVELFLAG_PAUSED = 64; +const LEVELFLAG_UNDO = 128; +const LEVELFLAG_TESTING = 256; +const LEVELFLAG_MAP = 512; +const LEVELFLAG_NOUNDO = 1024; + +const MAPPED_TOP_LEFT = 1; +const MAPPED_TOP_RIGHT = 2; +const MAPPED_BOTTOM_LEFT = 4; +const MAPPED_BOTTOM_RIGHT = 8; + +const GRAPHICS_BEVEL = 1 +const GRAPHICS_BEVEL_SHADOW = 2 +const GRAPHICS_BEVEL16 = 4 +const GRAPHICS_RANDOM = 8 +const GRAPHICS_KEY = 16 +const GRAPHICS_MOVER = 32 +const GRAPHICS_TILE = 64 +const GRAPHICS_ANIMATE = 128 +const GRAPHICS_LEVEL = 256 +const GRAPHICS_CLONE = 512 +const GRAPHICS_SCALE = 1024 + +const GRAPHICS_CURSES = 1 +const GRAPHICS_ZORDER = 2 +const GRAPHICS_BACKGROUND = 4 +const GRAPHICS_TRANSLATE = 8 + +const BEVEL_BASE = 0x10000 +const BEVEL_L = (BEVEL_BASE * 1) +const BEVEL_R = (BEVEL_BASE * 2) +const BEVEL_U = (BEVEL_BASE * 4) +const BEVEL_D = (BEVEL_BASE * 8) +const BEVEL_TL = (BEVEL_BASE * 16) +const BEVEL_TR = (BEVEL_BASE * 32) +const BEVEL_BL = (BEVEL_BASE * 64) +const BEVEL_BR = (BEVEL_BASE * 128) +const BEVEL_ALL = (BEVEL_BASE * 255) + +const SHADOW_BASE = 0x1000000 +const SHADOW_TOP_LEFT = 1 +const SHADOW_TOP = 2 +const SHADOW_TOP_RIGHT = 4 +const SHADOW_LEFT = 8 +const SHADOW_MIDDLE = 16 +const SHADOW_RIGHT = 32 +const SHADOW_BOTTOM_LEFT = 64 +const SHADOW_BOTTOM = 128 +const SHADOW_BOTTOM_RIGHT = 256 + +const IMAGE_PIECE = 0 +const IMAGE_SHADOW = 1 +const IMAGE_SMALL = 2 +const IMAGE_MAX = 3 + +const SIZE_PIECES = 1 +const SIZE_SMALL = 2 + +const shadow_flags = + [ + SHADOW_TOP_LEFT, SHADOW_TOP, SHADOW_TOP_RIGHT, + SHADOW_LEFT, SHADOW_MIDDLE, SHADOW_RIGHT, + SHADOW_BOTTOM_LEFT, SHADOW_BOTTOM, SHADOW_BOTTOM_RIGHT + ]; + +mouse_move = MOVE_NONE; +mouse_recent_event = false; +mouse_target = false; +mouse_target_x = 0; +mouse_target_y = 0; + +function initialise() +{ + document.getElementById("missing").textContent = "Please wait"; + document.getElementById("missing-levels").style.display = "block"; + document.getElementById("instructions").style.display = "none"; + + options = new Object; + options.previous_delay = 100; + options.storage = (localStorage.length != 0); + options.others = false; + + if(window.location.href.indexOf("?debug") != -1 || window.location.href.indexOf("?hidden") != -1) + options.show_hidden = true; + else + options.show_hidden = false; + + default_preferences(); + load_preferences(); + + screen = new Object; + screen.width = 0; + screen.height = 0; + screen.canvas = null; + screen.context = null; + screen.bar = new Object; + screen.bar.height = 0; + screen.bar.canvas = null; + screen.bar.context = null; + screen.bar.lines = 0; + screen.map = new Object; + screen.map.pixel_width = 0; + screen.map.pixel_height = 0; + screen.map.width = 0; + screen.map.height = 0; + screen.map.canvas = null; + screen.map.context = null; + screen.offset_x = 0; + screen.offset_y = 0; + + menu = new Object; + menu.state = true; + menu.becoming = true; + + graphics = new Object; + graphics.missing_sheet = true; + graphics.missing_xml = true; + graphics.set = ""; + graphics.width = 0; + graphics.height = 0; + graphics.offset_x = 0; + graphics.offset_y = 0; + graphics.sheets = []; + graphics.xml = []; + graphics.image = []; + graphics.image_flags = []; + graphics.small_width = 0; + graphics.small_height = 0; + graphics.small_image = []; + graphics.shadows = []; + graphics.shadow_image = []; + graphics.shadow_offset_x = []; + graphics.shadow_offset_y = []; + graphics.shadow_width = []; + graphics.shadow_height = []; + graphics.shadow_z = []; + graphics.shift = false; + graphics.ctrl = false; + graphics.map_colours = []; + + levels = new Object; + levels.xml = null; + levels.file = "levels.xml"; + level = null; + level_replay = null; + + toggle_keypad(options.keypad); + + window.onresize = screen_resize; + + levels_load(); +} + +function levels_load() +{ + document.getElementById("missing-levels").style.display = "block"; + + var xhr = new XMLHttpRequest(); + xhr.open("GET", levels.file); + xhr.onerror = function() { this.onerror = null; document.getElementById("error-levels").textContent = "Unable to load "+levels.file +" ("+(xhr.statusText == "" ? "If using Chrome, add --allow-file-access-from-files to the browser's command line, access via a different browser or a local web server, or play online at www.level7.org.uk/chroma/ )" : xhr.statusText); } + xhr.onload = function() { levels.xml = xhr.responseText; levels_loaded(); } + xhr.send(); +} + +function levels_loaded() +{ + document.getElementById("missing-levels").style.display = "none"; + document.getElementById("missing").style.display = "none"; + document.getElementById("items").style.display = "block"; + + levels.parser = new DOMParser(); + levels.dom = levels.parser.parseFromString(levels.xml, "text/xml"); + + var sets = levels.dom.getElementsByTagName("set"); + for(var s = 0; s < sets.length; s ++) + { + if(sets[s].getAttribute("type") != null && sets[s].getAttribute("type") != "chroma") + options.others = true; + } + + if(!options.others) + document.styleSheets[0].insertRule(".other { display: none; }"); + + main_menu(); +} + +function graphics_load(set) +{ + var sheet, xml; + + if(graphics.sheets[set] == null || graphics.xml[set] == null) + { + graphics.missing_sheet = true; + graphics.missing_xml = true; + graphics.loading = set; + + document.getElementById("missing").style.display = "block"; + document.getElementById("missing-sheet").style.display = "block"; + document.getElementById("missing-xml").style.display = "block"; + document.getElementById("items").style.display = "none"; + + for(var s = 0; s < graphics_sets.length; s ++) + { + if(graphics_sets[s].set == set) + { + sheet = graphics_sets[s].sheet; + xml = graphics_sets[s].xml; + } + } + + graphics.sheets[set] = new Image; + graphics.sheets[set].src = sheet; + + graphics.sheets[set].onerror = function() { this.onerror = null; graphics.sheets[set] = null; document.getElementById("error-sheet").textContent = "Unable to load "+sheet; setTimeout(function() { document.getElementById("items").style.display = "block"; document.getElementById("missing").style.display = "none"; document.getElementById("missing-sheet").style.display = "none"} , 1000); } + graphics.sheets[set].onload = function() { graphics.missing_sheet = false; graphics_loaded(); } + + setTimeout(graphics_load_check, 250); + + var xhr = new XMLHttpRequest(); + xhr.open("GET", xml); + xhr.onerror = function() { this.onerror = null; graphics.sheets[set] = null; document.getElementById("error-xml").textContent = "Unable to load "+xml+" ("+xhr.statusText+")"; setTimeout(function() { document.getElementById("items").style.display = "block"; document.getElementById("missing").style.display = "none"; document.getElementById("missing-xml").style.display = "none"} , 1000); } + xhr.onload = function() { graphics.missing_xml = false; graphics.xml[graphics.loading] = xhr.responseText; graphics_loaded(); } + xhr.send(); + } + else + { + graphics_loaded(); + } +} + +/* For Firefox and any other browsers incapable of firing an onload for svg images */ +function graphics_load_check() +{ + if(graphics.sheets[graphics.loading] != null) + { + if(graphics.sheets[graphics.loading].complete) + { + graphics.missing_sheet = false; + graphics_loaded(); + } + } + + if(graphics.missing_sheet == true) + setTimeout(graphics_load_check, 250); +} + +function graphics_loaded() +{ + if(graphics.sheets[graphics.set] != null && graphics.sheets[graphics.set] > 0) + graphics.missing_sheet = false; + + if(!graphics.missing_sheet) + document.getElementById("missing-sheet").style.display = "none"; + if(!graphics.missing_xml) + document.getElementById("missing-xml").style.display = "none"; + + if(graphics.missing_sheet || graphics.missing_xml) + return; + + document.getElementById("missing").style.display = "none"; + document.getElementById("items").style.display = "block"; + + graphics_render(); +} + +function graphics_render() +{ + if(level == null) + return; + + var set = options.graphics; + if(level.mode == MODE_XOR && options.graphics_xor) + set = "xor"; + + if(graphics.sheets[set] == null) + { + graphics_load(set); + return; + } + + screen.canvas = document.getElementById("screen"); + screen.bar.canvas = document.getElementById("bar"); + screen.map.canvas = document.getElementById("map"); + + /* XOR partial display */ + if(level.mode == MODE_XOR && options.xor_display) + { + var square = Math.min(window.innerWidth, window.innerHeight); + + /* Allow space on sides if landscape screen */ + if(square < window.innerWidth && square > 0.66 * window.innerWidth) + square = 0.66 * window.innerWidth; + /* Allow space below if portrait screen */ + else if(square < window.innerHeight && square > 0.66 * window.innerHeight) + square = 0.66 * window.innerHeight; + + square = Math.floor(square / 32) * 32; + + screen.canvas.height = screen.height = square; + screen.canvas.width = screen.width = square; + + screen.canvas.style.position= "fixed"; + screen.bar.canvas.style.position= "fixed"; + screen.map.canvas.style.position= "fixed"; + + /* Landscape screen */ + if(window.innerWidth > window.innerHeight) + { + screen.offset_x = Math.floor((window.innerWidth - screen.width) / 2); + screen.offset_y = Math.floor((window.innerHeight - screen.height) / 2); + screen.canvas.style.left = screen.offset_x + "px"; + screen.canvas.style.top = screen.offset_y + "px"; + + screen.map.pixel_width = screen.map.pixel_height = Math.floor((window.innerWidth - screen.width) / (2 * level.width)); + + screen.map.canvas.width = screen.map.width = level.width * screen.map.pixel_width; + screen.map.canvas.height = screen.map.height = level.height * screen.map.pixel_height; + + screen.map.canvas.style.left = (window.innerWidth - screen.map.width) + "px"; + screen.map.canvas.style.top = (window.innerHeight - screen.map.height) + "px"; + + screen.bar.height = Math.max(32, screen.map.pixel_width * 8); + screen.bar.lines = 2; + screen.bar.width = Math.floor((window.innerWidth - screen.width) / 2); + screen.bar.canvas.height = screen.bar.height * screen.bar.lines; + screen.bar.canvas.width = screen.bar.width; + + screen.bar.canvas.style.left = "0px"; + screen.bar.canvas.style.top = (window.innerHeight - screen.bar.height * screen.bar.lines) + "px"; + } + /* Portrait screen */ + else + { + screen.offset_x = Math.floor((window.innerWidth - screen.width) / 2); + screen.offset_y = Math.floor((window.innerHeight - screen.height) / 2); + screen.canvas.style.left = screen.offset_x + "px"; + screen.canvas.style.top = screen.offset_y + "px"; + + screen.map.pixel_width = screen.map.pixel_height = Math.floor((window.innerHeight - screen.height - 16) / (2 * level.height)); + + screen.map.canvas.width = screen.map.width = level.width * screen.map.pixel_width; + screen.map.canvas.height = screen.map.height = level.height * screen.map.pixel_height; + + screen.map.canvas.style.left = (window.innerWidth - screen.map.width) + "px"; + screen.map.canvas.style.top = (window.innerHeight - screen.map.height) + "px"; + + screen.bar.height = Math.max(32, screen.map.pixel_width * 8); + screen.bar.lines = 2; + screen.bar.width = window.innerWidth - screen.map.width; + screen.bar.canvas.height = screen.bar.height * screen.bar.lines; + screen.bar.canvas.width = screen.bar.width; + + screen.bar.canvas.style.left = "0px"; + screen.bar.canvas.style.top = (window.innerHeight - screen.bar.height * screen.bar.lines) + "px"; + } + } + /* Regular display */ + else + { + screen.offset_x = 0; + screen.offset_y = 0; + + screen.bar.lines = 1; + screen.bar.height = Math.floor(window.innerHeight / 24); + screen.bar.width = window.innerWidth; + + screen.canvas.height = screen.height = window.innerHeight - screen.bar.height; + screen.canvas.width = screen.width = window.innerWidth; + + screen.canvas.style.position= "fixed"; + screen.canvas.style.left = "0px"; + screen.canvas.style.top = "0px"; + + screen.bar.canvas.height = screen.bar.height; + screen.bar.canvas.width = screen.bar.width; + + screen.bar.canvas.style.position= "fixed"; + screen.bar.canvas.style.left = "0px"; + screen.bar.canvas.style.top = screen.height + "px"; + + screen.map.canvas.style.display = "none"; + } + + if(screen.canvas.getContext) + { + screen.context = screen.canvas.getContext("2d", { alpha: false }); + screen.context.fillStyle = "#000"; + screen.context.fillRect(0, 0, screen.width, screen.height); + } + else + { + alert("Unable to get screen context"); + return; + } + + if(screen.bar.canvas.getContext) + { + screen.bar.context = screen.bar.canvas.getContext("2d", { alpha: false }); + screen.bar.context.fillStyle = "#000"; + screen.bar.context.fillRect(0, 0, screen.width, screen.bar.height * screen.bar.lines); + } + else + { + alert("Unable to get bar context"); + return; + } + + if(screen.map.canvas.getContext) + { + screen.map.context = screen.map.canvas.getContext("2d", { alpha: false }); + screen.map.context.fillStyle = "#000"; + screen.map.context.fillRect(0, 0, screen.map.width, screen.map.height); + } + else + { + alert("Unable to get map context"); + return; + } + + var ox = graphics.width; + var oy = graphics.height; + var os = graphics.set; + var osh = graphics.small_height; + + /* XOR partial display */ + if(level.mode == MODE_XOR && options.xor_display) + { + var granularity = 2; + graphics.width = graphics.height = granularity * Math.floor(screen.height / (granularity * 8)); + } + /* Scale to fit screen */ + else if(options.graphics_size == 0) + { + var granularity = 2; + graphics.width = granularity * Math.floor(screen.width / (granularity * level.width)); + graphics.height = granularity * Math.floor(screen.height / (granularity * level.height)); + + graphics.width = Math.min(graphics.width, graphics.height); + graphics.height = Math.min(graphics.width, graphics.height); + } + /* Custom size */ + else if(options.graphics_size == -1) + graphics.width = graphics.height = options.graphics_custom_size; + /* Fixed size */ + else + graphics.width = graphics.height = options.graphics_size; + + graphics.small_height = graphics.small_width = Math.floor(screen.bar.height * 0.9); + + if(ox == graphics.width && oy == graphics.height && os == set && osh == graphics.small_height) + { + graphics_return_after_rendering(); + return; + } + + graphics.set = set; + + document.getElementById("missing-render").style.display = "block"; + document.getElementById("missing").style.display = "block"; + document.getElementById("items").style.display = "none"; + + setTimeout(graphics_scale_images, 10); +} + +function graphics_scale_images() +{ + var small, width, height, rescale; + + graphics.image = []; + graphics.small_image = []; + graphics.shadows = []; + graphics.shadow_image = []; + graphics.shadow_start_x = []; + graphics.shadow_offset_x = []; + graphics.shadow_start_y = []; + graphics.shadow_offset_y = []; + graphics.shadow_width = []; + graphics.shadow_height = []; + graphics.shadow_z = []; + graphics.shadow_flags = []; + graphics.map_colours = []; + + for(var p = 0; p < PIECE_MAX; p ++) + { + graphics.shadow_offset_x[p] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + graphics.shadow_offset_y[p] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + graphics.shadow_start_x[p] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + graphics.shadow_start_y[p] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + graphics.shadow_width[p] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + graphics.shadow_height[p] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + graphics.shadow_z[p] = 0; + } + + /* Workaround Firefox's poor rendering at odd sizes, especially obvious with "zen" */ + rescale = 1; + if(options.graphics == "zen" && graphics.width % 8 != 0 && graphics.height % 8 != 0 && graphics.width < 64) + rescale = 4; + + var parser = new DOMParser(); + graphics.dom = parser.parseFromString(graphics.xml[graphics.set], "text/xml"); + + var shadows = graphics.dom.getElementsByTagName("shadow"); + for(var s = 0; s < shadows.length; s ++) + { + var shadow = new Object; + shadow.x = parseInt(shadows[s].getAttribute("x")); + shadow.y = parseInt(shadows[s].getAttribute("y")); + graphics.shadows.push(shadow); + } + + var pieces = graphics.dom.getElementsByTagName("piece"); + for(var p = 0; p < pieces.length; p ++) + { + piece = eval("PIECE_" + (pieces[p].getAttribute("name").toUpperCase())); + + graphics.image_flags[piece] = 0; + + if(pieces[p].getAttribute("tile") == "yes") + graphics.image_flags[piece] |= GRAPHICS_TILE; + + if(pieces[p].getAttribute("bevel") == "piece") + graphics.image_flags[piece] |= GRAPHICS_BEVEL; + if(pieces[p].getAttribute("bevel") == "shadow") + graphics.image_flags[piece] |= GRAPHICS_BEVEL_SHADOW; + if(pieces[p].getAttribute("bevel") == "piece shadow") + graphics.image_flags[piece] |= GRAPHICS_BEVEL | GRAPHICS_BEVEL_SHADOW; + if(pieces[p].getAttribute("bevel") == "16") + graphics.image_flags[piece] |= GRAPHICS_BEVEL16; + + if(pieces[p].getAttribute("level") == "yes") + graphics.image_flags[piece] |= GRAPHICS_LEVEL; + + var clones = pieces[p].getElementsByTagName("clone"); + if(clones.length > 0 && clones[0].getAttribute("piece") != null) + { + var c = eval("PIECE_" + clones[0].getAttribute("piece").toUpperCase()); + graphics.image_flags[piece] = graphics.image_flags[c]; + graphics.image[piece] = graphics.image[c]; + graphics.small_image[piece] = graphics.small_image[c]; + graphics.shadow_image[piece] = graphics.shadow_image[c]; + + graphics.shadow_offset_x[piece][9] = graphics.shadow_offset_x[c][9]; + graphics.shadow_offset_y[piece][9] = graphics.shadow_offset_y[c][9]; + graphics.shadow_width[piece][9] = graphics.shadow_width[c][9]; + graphics.shadow_height[piece][9] = graphics.shadow_height[c][9]; + + } + + var images = pieces[p].getElementsByTagName("image"); + for(var i = 0; i < images.length; i ++) + { + if(images[i].getAttribute("type") == "small") + { + small = true; + width = graphics.small_width; + height = graphics.small_height; + } + else + { + small = false; + width = graphics.width; + height = graphics.height; + } + + if(rescale != 1) + { + width = width * rescale; + height = height * rescale; + } + + var canvas = document.createElement("canvas"); + + var context = canvas.getContext("2d"); + + var dw = images[i].getAttribute("width") != null ? images[i].getAttribute("width") : 1; + var dh = images[i].getAttribute("height") != null ? images[i].getAttribute("height") : 1; + + if(dw != 1) + width = width * dw; + if(dh != 1) + height = height * dh; + + canvas.width = width; + canvas.height = height; + + if(graphics.set == "xor") + context.imageSmoothingEnabled = false; + + if(images[i].getAttribute("colour") != null) + { + context.fillStyle = images[i].getAttribute("colour"); + context.fillRect(0, 0, width, height); + + } + else if(images[i].getAttribute("file") != null && images[i].getAttribute("file") == "svg:") + { + var x = images[i].getAttribute("x") != null ? images[i].getAttribute("x") : 0; + var y = images[i].getAttribute("y") != null ? images[i].getAttribute("y") : 0; + var w = images[i].getAttribute("w") != null ? images[i].getAttribute("w") : 100; + var h = images[i].getAttribute("h") != null ? images[i].getAttribute("h") : 100; + var rotate = images[i].getAttribute("rotate") != null ? images[i].getAttribute("rotate") : 0; + + + if(rotate != 0) + { + context.save(); + context.translate(width / 2, height / 2); + context.rotate(rotate * Math.PI / 180); + context.drawImage(graphics.sheets[graphics.set], x, y, w, h, Math.floor(-width / 2), Math.floor(-height / 2), width, height); + + context.restore(); + } + else + context.drawImage(graphics.sheets[graphics.set], x, y, w, h, 0, 0, width, height); + + } + + if(rescale != 1) + { + width = width / rescale; + height = height / rescale; + + var rescaled = document.createElement("canvas"); + rescaled.width = width; + rescaled.height = height; + + context = rescaled.getContext("2d"); + + context.drawImage(canvas, 0, 0, width * rescale, height * rescale, 0, 0, width, height); + canvas = rescaled; + } + + if(small) + { + if(graphics.small_image[piece] == null) + graphics.small_image[piece] = canvas; + else + { + var montage = document.createElement("canvas"); + montage.width = graphics.small_image[piece].width + canvas.width; + montage.height = Math.max(graphics.small_image[piece].height, canvas.height); + + var context = montage.getContext("2d"); + context.drawImage(graphics.small_image[piece], 0, 0); + context.drawImage(canvas, graphics.small_image[piece].width, 0); + + graphics.small_image[piece] = montage; + } + } + else if(images[i].getAttribute("type") == "shadow") + { + + if(images[i].getAttribute("z") != null) + graphics.shadow_z[p] = parseInt(images[i].getAttribute("z")); + + if(images[i].getAttribute("exclude-middle") == "yes") + { + var ox = images[i].getAttribute("ox") != null ? images[i].getAttribute("ox") : 0; + var oy = images[i].getAttribute("oy") != null ? images[i].getAttribute("oy") : 0; + + context.clearRect(-ox * graphics.width, -oy * graphics.height, graphics.width, graphics.height); + } + + if(graphics.shadow_image[piece] == null) + { + graphics.shadow_image[piece] = canvas; + + /* Store offsets if this is the first shadow image */ + var ox = images[i].getAttribute("ox") != null ? images[i].getAttribute("ox") : 0; + var oy = images[i].getAttribute("oy") != null ? images[i].getAttribute("oy") : 0; + + graphics.shadow_offset_x[piece][9] = graphics.width * ox; + graphics.shadow_offset_y[piece][9] = graphics.height * oy; + graphics.shadow_width[piece][9] = width; + graphics.shadow_height[piece][9] = height; + } + else + { + var montage = document.createElement("canvas"); + montage.width = graphics.shadow_image[piece].width + canvas.width; + montage.height = Math.max(graphics.shadow_image[piece].height, canvas.height); + + var context = montage.getContext("2d"); + context.drawImage(graphics.shadow_image[piece], 0, 0); + context.drawImage(canvas, graphics.shadow_image[piece].width, 0); + + graphics.shadow_image[piece] = montage; + } + } + else + { + if(graphics.image[piece] == null) + graphics.image[piece] = canvas; + else + { + var montage = document.createElement("canvas"); + montage.width = graphics.image[piece].width + canvas.width; + montage.height = Math.max(graphics.image[piece].height, canvas.height); + + var context = montage.getContext("2d"); + context.drawImage(graphics.image[piece], 0, 0); + context.drawImage(canvas, graphics.image[piece].width, 0); + + graphics.image[piece] = montage; + } + } + + } + } + + if(graphics.shadows.length > 0) + { + /* Calculate quadrants for shadow images */ + for(var p = 0; p < PIECE_MAX; p ++) + { + if(graphics.shadow_image[p] != null) + { + if(graphics.shadow_z[p] != 0) + graphics.flags |= GRAPHICS_ZORDER; + + var width = graphics.shadow_width[p][9]; + var height = graphics.shadow_height[p][9]; + var offset_x = graphics.shadow_offset_x[p][9]; + var offset_y = graphics.shadow_offset_y[p][9]; + + for(j = 0; j < 3; j ++) + { + for(k = 0; k < 3; k ++) + { + x = (j - 1) * graphics.width - offset_x; + y = (k - 1) * graphics.height - offset_y; + + /* Does the shadow fall into this square? */ + if(x > -(graphics.width) && x < width && y > -(graphics.height) && y < height) + { + if(x >= 0) + { + graphics.shadow_start_x[p][j+k*3]= x; + graphics.shadow_offset_x[p][j+k*3] = 0; + + if(x + graphics.width > width) + graphics.shadow_width[p][j+k*3] = width - x; + else + graphics.shadow_width[p][j+k*3] = graphics.width; + } + else + { + graphics.shadow_start_x[p][j+k*3] = 0; + graphics.shadow_offset_x[p][j+k*3] = -x; + + graphics.shadow_width[p][j+k*3] = graphics.width + x; + } + + + if(y >= 0) + { + graphics.shadow_start_y[p][j+k*3]= y; + graphics.shadow_offset_y[p][j+k*3] = 0; + + if(y + graphics.height > height) + graphics.shadow_height[p][j+k*3] = height - y; + else + graphics.shadow_height[p][j+k*3] = graphics.height; + } + else + { + graphics.shadow_start_y[p][j+k*3] = 0; + graphics.shadow_offset_y[p][j+k*3] = -y; + + graphics.shadow_height[p][j+k*3] = graphics.height + y; + } + + graphics.shadow_flags[p] |= shadow_flags[j+k*3]; + } + } + } + } + } + + /* Calcuate flags for shadows */ + for(s = 0; s < graphics.shadows.length; s ++) + { + graphics.shadows[s].flag = shadow_flags[(graphics.shadows[s].x + 1) + 3 * (graphics.shadows[s].y + 1)]; + graphics.shadows[s].shadow = (1 + graphics.shadows[s].x) + 3 * (1 + graphics.shadows[s].y); + } + } + + graphics_return_after_rendering(); +} + +function graphics_return_after_rendering() +{ + document.getElementById("missing-render").style.display = "none"; + document.getElementById("missing").style.display = "none"; + document.getElementById("items").style.display = "block"; + + display_focus(); + display_level(); + menu_show(false); +} + +function screen_resize() +{ + if(level != null && (menu.state == false || menu.becoming == false)) + graphics_render(); +} + +function level_from_string(s) +{ + var level = {}; + + level.mode = MODE_CHROMA; + level.title = ""; + level.width = 0; + level.height = 0; + level.flags = 0; + + level.piece = []; + level.moving = []; + level.previous = []; + level.previousmoving = []; + level.detonator = []; + level.detonatormoving = []; + level.data = []; + + level.movers = []; + level.oldmovers = []; + level.stack = []; + + level.player = 0; + level.player_x = [0, 0]; + level.player_y = [0, 0]; + level.alive = [false, false]; + + level.teleport_x = [0, 0]; + level.teleport_y = [0, 0]; + level.view_x = [0, 0]; + level.view_y = [0, 0]; + level.view_teleport_x = [0, 0]; + level.view_teleport_y = [0, 0]; + level.switched = 0; + level.mapped = 0; + + + level.stars_caught = 0; + level.stars_exploded = 0; + level.stars_total = 0; + + level.moves = []; + level.redoable_moves = []; + + level.level = 0; + + var l = s.split("\n"); + + var i = 0; + var a; + while(i < l.length) + { + if(a = l[i].match(/^mode: (\w+)/)) + { + switch(a[1]) + { + case "chroma": + level.mode = MODE_CHROMA; + break; + case "xor": + level.mode = MODE_XOR; + break; + case "enigma": + level.mode = MODE_ENIGMA; + break; + } + } + + else if(a = l[i].match(/^title: (.*)/)) + level.title = a[1]; + + else if(a = l[i].match(/^level: (.*)/)) + level.level= parseInt(a[1]); + + else if(a = l[i].match(/^size: (\d+) (\d+)/)) + { + level.width = parseInt(a[1]); + level.height = parseInt(a[2]); + + for(var x = 0; x < level.width; x ++) + { + level.piece[x] = []; + level.moving[x] = []; + level.previous[x] = []; + level.previousmoving[x] = []; + level.detonator[x] = []; + level.detonatormoving[x] = []; + level.data[x] = []; + } + } + + else if(a = l[i].match(/^stars: (\d+) (\d+) (\d+)/)) + { + level.stars_caught = parseInt(a[1]); + level.stars_exploded = parseInt(a[2]); + level.stars_total = parseInt(a[3]); + } + + else if(a = l[i].match(/^moves: (.*)/)) + moves = parseInt(a[1]); + + else if(a = l[i].match(/^player: (.*)/)) + { + p = parseInt(a[1]); + if(p == 1 || p == 2) + level.player = p - 1; + } + + else if(l[i] == "solved: 1") + { + level.flags |= LEVELFLAG_SOLVED; + level.flags |= LEVELFLAG_EXIT; + } + + else if(l[i] == "failed: 1") + level.flags |= LEVELFLAG_FAILED; + + else if(l[i] == "switched: 1") + level.switched = 1; + + else if(a = l[i].match(/^view1: (\d+) (\d+)/)) + { + level.view_x[0] = parseInt(a[1]); + level.view_y[0] = parseInt(a[2]); + } + + else if(a = l[i].match(/^view2: (\d+) (\d+)/)) + { + level.view_x[1] = parseInt(a[1]); + level.view_y[1] = parseInt(a[2]); + } + + else if(a = l[i].match(/^viewteleport1: (\d+) (\d+) \((\d+) (\d+)\)/)) + { + level.teleport_x[0] = parseInt(a[3]); + level.teleport_y[0] = parseInt(a[4]); + level.view_teleport_x[0] = parseInt(a[1]); + level.view_teleport_y[0] = parseInt(a[2]); + } + + else if(a = l[i].match(/^viewteleport2: (\d+) (\d+) \((\d+) (\d+)\)/)) + { + level.teleport_x[1] = parseInt(a[3]); + level.teleport_y[1] = parseInt(a[4]); + level.view_teleport_x[1] = parseInt(a[1]); + level.view_teleport_y[1] = parseInt(a[2]); + } + + else if(a = l[i].match(/^mapped:/)) + { + if(l[i].includes("top_left")) + level.mapped |= MAPPED_TOP_LEFT; + if(l[i].includes("top_right")) + level.mapped |= MAPPED_TOP_RIGHT; + if(l[i].includes("bottom_left")) + level.mapped |= MAPPED_BOTTOM_LEFT; + if(l[i].includes("bottom_right")) + level.mapped |= MAPPED_BOTTOM_RIGHT; + } + + else if(l[i].match(/^data:/)) + { + level.stars_total = 0; + teleport = 0; + + for(var y = 0; y < level.height; y ++) + { + i ++; + var d = l[i].split(""); + for(var x = 0; x < level.width; x ++) + { + var p = character_to_piece(d[x]); + + switch(p) + { + case PIECE_PLAYER_ONE: + level.player_x[0] = x; + level.player_y[0] = y; + level.alive[0] = true; + break; + case PIECE_PLAYER_TWO: + level.player_x[1] = x; + level.player_y[1] = y; + level.alive[1] = true; + break; + case PIECE_STAR: + level.stars_total ++; + break; + case PIECE_TELEPORT: + if(teleport < 2) + { + level.teleport_x[teleport] = x; + level.teleport_y[teleport] = y; + teleport ++; + } + break; + } + + level.piece[x][y] = p; + level.moving[x][y] = MOVE_NONE; + level.previous[x][y] = PIECE_SPACE; + level.previousmoving[x][y] = MOVE_NONE; + level.detonator[x][y] = PIECE_SPACE; + level.detonatormoving[x][y] = MOVE_NONE; + level.data[x][y] = Math.floor(Math.random() * 65536); + } + } + + level.stars_total += level.stars_caught + level.stars_exploded; + } + + else if(l[i].match(/^movedata:/)) + { + i ++; + + while(l[i] != "") + { + for(p = 0; p < l[i].length; p ++) + { + var direction = character_to_direction(l[i][p]); + if(direction != MOVE_UNKNOWN) + { + var move = new Object; + move.direction = direction; + move.movers = []; + move.count = level.moves.length; + + level.moves.push(move); + } + } + i ++; + } + } + + else if(l[i].match(/^undodata:/)) + { + i ++; + + m = 0; + + while(l[i] != "") + { + j = 0; + while(j < l[i].length) + { + var mover = new Object; + + mover.x = parseInt(l[i][j++]) * 10 + parseInt(l[i][j++]); + j ++; + mover.y = parseInt(l[i][j++]) * 10 + parseInt(l[i][j++]); + mover.direction = character_to_direction(l[i][j++]); + mover.piece = character_to_piece(l[i][j++]); + mover.piece_previous = character_to_piece(l[i][j++]); + + c = l[i][j++]; + mover.fast = (c == "," ? 1 : 0); + + level.moves[m].movers.push(mover); + + if(c == ".") + m ++; + } + + i ++; + } + } + + i ++; + } + + return level; +} + +function level_to_string() +{ + var l; + + l = "chroma level\n\n"; + + if(level.mode == MODE_XOR) + l += "mode: xor\n\n"; + + if(level.mode == MODE_ENIGMA) + l += "mode: enigma\n\n"; + + if(level.title != null && level.title != "") + l += "title: "+level.title+"\n"; + if(level.level != null && level.level != 0) + l += "level: "+level.level+"\n"; + + l += "size: "+level.width+" "+level.height+"\n"; + + l += "player: "+(level.player + 1)+"\n"; + l += "moves: "+level.moves.length+"\n"; + l += "stars: "+level.stars_caught+" "+level.stars_exploded+" "+level.stars_total+"\n"; + + if(level.flags & LEVELFLAG_SOLVED) + { + l += "solved: 1\n"; + } + + if(level.flags & LEVELFLAG_FAILED) + l += "failed: 1\n"; + + if(level.mode == MODE_XOR) + { + if(level.switched == 1) + l += "switched: "+level.switched+"\n"; + + l += "view1: "+level.view_x[0]+" "+level.view_y[0]+"\n"; + l += "view2: "+level.view_x[1]+" "+level.view_y[1]+"\n"; + + if(level.teleport_x[0] != -1) + { + l += "viewteleport1: "+level.view_teleport_x[0]+" "+level.view_teleport_y[0]+" ("+level.teleport_x[0]+" "+level.teleport_y[0]+")\n"; + l += "viewteleport2: "+level.view_teleport_x[1]+" "+level.view_teleport_y[1]+" ("+level.teleport_x[1]+" "+level.teleport_y[1]+")\n"; + } + + if(level.mapped) + { + l += "mapped:"; + if(level.mapped & MAPPED_TOP_LEFT) + l += " top_left"; + if(level.mapped & MAPPED_TOP_RIGHT) + l += " top_right"; + if(level.mapped & MAPPED_BOTTOM_LEFT) + l += " bottom_left"; + if(level.mapped & MAPPED_BOTTOM_RIGHT) + l += " bottom_right"; + l += "\n"; + } + } + + l += "\ndata:\n"; + + for(y = 0; y < level.height; y ++) + { + for(x = 0; x < level.width; x ++) + { + l += piece_to_character(level_piece(x, y)); + } + l += "\n"; + } + l += "\n"; + + if(level.moves.length != 0) + { + l += "movedata:\n"; + + for(m = 0; m < level.moves.length; m++) + { + l += direction_to_character(level.moves[m].direction); + if(m % 78 == 77) + l += "\n"; + } + l += "\n\n"; + + l += "undodata:\n"; + + buffer = ""; + for(m = 0; m < level.moves.length; m++) + { + move = level.moves[m]; + + for(n = 0; n < move.movers.length; n ++) + { + mover = move.movers[n]; + + c = ','; + if(mover.fast == 0) + c = ';'; + if(n == move.movers.length - 1) + c = '.'; + + buffer += two(mover.x); + buffer += ":"; + buffer += two(mover.y); + buffer += direction_to_character(mover.direction); + buffer += piece_to_character(mover.piece); + buffer += piece_to_character(mover.piece_previous); + buffer += c; + + if(buffer.length > 71) + { + l += buffer+"\n"; + buffer = ""; + } + } + } + if(buffer != "") + l += buffer+"\n"; + } + + return l; + +} + +function two(v) +{ + return v < 10 ? "0" + v : v; +} + + +function character_to_piece(c) +{ + switch(c) + { + case ' ': + return PIECE_SPACE; + case "%": + return PIECE_WALL; + case '1': + return PIECE_PLAYER_ONE; + case '2': + return PIECE_PLAYER_TWO; + case '.': + return PIECE_DOTS; + case 'a': + return PIECE_ARROW_RED_LEFT; + case 'b': + return PIECE_ARROW_RED_UP; + case 'c': + return PIECE_ARROW_RED_RIGHT; + case 'd': + return PIECE_ARROW_RED_DOWN; + case 'A': + return PIECE_BOMB_RED_LEFT; + case 'B': + return PIECE_BOMB_RED_UP; + case 'C': + return PIECE_BOMB_RED_RIGHT; + case 'D': + return PIECE_BOMB_RED_DOWN; + case 'e': + return PIECE_ARROW_GREEN_LEFT; + case 'f': + return PIECE_ARROW_GREEN_UP; + case 'g': + return PIECE_ARROW_GREEN_RIGHT; + case 'h': + return PIECE_ARROW_GREEN_DOWN; + case 'E': + return PIECE_BOMB_GREEN_LEFT; + case 'F': + return PIECE_BOMB_GREEN_UP; + case 'G': + return PIECE_BOMB_GREEN_RIGHT; + case 'H': + return PIECE_BOMB_GREEN_DOWN; + case 'i': + return PIECE_ARROW_BLUE_LEFT; + case 'j': + return PIECE_ARROW_BLUE_UP; + case 'k': + return PIECE_ARROW_BLUE_RIGHT; + case 'l': + return PIECE_ARROW_BLUE_DOWN; + case 'I': + return PIECE_BOMB_BLUE_LEFT; + case 'J': + return PIECE_BOMB_BLUE_UP; + case 'K': + return PIECE_BOMB_BLUE_RIGHT; + case 'L': + return PIECE_BOMB_BLUE_DOWN; + case 'o': + return PIECE_CIRCLE; + case '*': + return PIECE_STAR; + case '/': + return PIECE_DOOR; + case '8': + return PIECE_CIRCLE_DOUBLE; + case ':': + return PIECE_DOTS_DOUBLE; + case '-': + return PIECE_DOTS_X; + case '|': + return PIECE_DOTS_Y; + case 'S': + return PIECE_SWITCH; + case 'T': + return PIECE_TELEPORT; + case 'M': + return PIECE_MAP_TOP_LEFT; + case 'm': + return PIECE_MAP_TOP_RIGHT; + case 'N': + return PIECE_MAP_BOTTOM_LEFT; + case 'n': + return PIECE_MAP_BOTTOM_RIGHT; + case '!': + return PIECE_GONE; + case 'p': + return PIECE_EXPLOSION_RED_LEFT; + case 'q': + return PIECE_EXPLOSION_RED_HORIZONTAL; + case 'r': + return PIECE_EXPLOSION_RED_RIGHT; + case 'P': + return PIECE_EXPLOSION_RED_TOP; + case 'Q': + return PIECE_EXPLOSION_RED_VERTICAL; + case 'R': + return PIECE_EXPLOSION_RED_BOTTOM; + case 'u': + return PIECE_EXPLOSION_GREEN_LEFT; + case 'v': + return PIECE_EXPLOSION_GREEN_HORIZONTAL; + case 'w': + return PIECE_EXPLOSION_GREEN_RIGHT; + case 'U': + return PIECE_EXPLOSION_GREEN_TOP; + case 'V': + return PIECE_EXPLOSION_GREEN_VERTICAL; + case 'W': + return PIECE_EXPLOSION_GREEN_BOTTOM; + case 'x': + return PIECE_EXPLOSION_BLUE_LEFT; + case 'y': + return PIECE_EXPLOSION_BLUE_HORIZONTAL; + case 'z': + return PIECE_EXPLOSION_BLUE_RIGHT; + case 'X': + return PIECE_EXPLOSION_BLUE_TOP; + case 'Y': + return PIECE_EXPLOSION_BLUE_VERTICAL; + case 'Z': + return PIECE_EXPLOSION_BLUE_BOTTOM; + default: + return PIECE_UNKNOWN; + } +} + +function piece_to_character(piece) +{ + switch(piece) + { + case PIECE_SPACE: + return ' '; + case PIECE_WALL: + return '%'; + case PIECE_PLAYER_ONE: + return '1'; + case PIECE_PLAYER_TWO: + return '2'; + case PIECE_DOTS: + return '.'; + case PIECE_ARROW_RED_LEFT: + return 'a'; + case PIECE_ARROW_RED_UP: + return 'b'; + case PIECE_ARROW_RED_RIGHT: + return 'c'; + case PIECE_ARROW_RED_DOWN: + return 'd'; + case PIECE_BOMB_RED_LEFT: + return 'A'; + case PIECE_BOMB_RED_UP: + return 'B'; + case PIECE_BOMB_RED_RIGHT: + return 'C'; + case PIECE_BOMB_RED_DOWN: + return 'D'; + case PIECE_ARROW_GREEN_LEFT: + return 'e'; + case PIECE_ARROW_GREEN_UP: + return 'f'; + case PIECE_ARROW_GREEN_RIGHT: + return 'g'; + case PIECE_ARROW_GREEN_DOWN: + return 'h'; + case PIECE_BOMB_GREEN_LEFT: + return 'E'; + case PIECE_BOMB_GREEN_UP: + return 'F'; + case PIECE_BOMB_GREEN_RIGHT: + return 'G'; + case PIECE_BOMB_GREEN_DOWN: + return 'H'; + case PIECE_ARROW_BLUE_LEFT: + return 'i'; + case PIECE_ARROW_BLUE_UP: + return 'j'; + case PIECE_ARROW_BLUE_RIGHT: + return 'k'; + case PIECE_ARROW_BLUE_DOWN: + return 'l'; + case PIECE_BOMB_BLUE_LEFT: + return 'I'; + case PIECE_BOMB_BLUE_UP: + return 'J'; + case PIECE_BOMB_BLUE_RIGHT: + return 'K'; + case PIECE_BOMB_BLUE_DOWN: + return 'L'; + case PIECE_CIRCLE: + return 'o'; + case PIECE_STAR: + return '*'; + case PIECE_DOOR: + return '/'; + case PIECE_DOTS_DOUBLE: + return ':'; + case PIECE_CIRCLE_DOUBLE: + return '8'; + case PIECE_DOTS_X: + return '-'; + case PIECE_DOTS_Y: + return '|'; + case PIECE_SWITCH: + return 'S'; + case PIECE_TELEPORT: + return 'T'; + case PIECE_MAP_TOP_LEFT: + return 'M'; + case PIECE_MAP_TOP_RIGHT: + return 'm'; + case PIECE_MAP_BOTTOM_LEFT: + return 'N'; + case PIECE_MAP_BOTTOM_RIGHT: + return 'n'; + case PIECE_GONE: + return '!'; + case PIECE_EXPLOSION_RED_LEFT: + return 'p'; + case PIECE_EXPLOSION_RED_HORIZONTAL: + return 'q'; + case PIECE_EXPLOSION_RED_RIGHT: + return 'r'; + case PIECE_EXPLOSION_RED_TOP: + return 'P'; + case PIECE_EXPLOSION_RED_VERTICAL: + return 'Q'; + case PIECE_EXPLOSION_RED_BOTTOM: + return 'R'; + case PIECE_EXPLOSION_GREEN_LEFT: + return 'u'; + case PIECE_EXPLOSION_GREEN_HORIZONTAL: + return 'v'; + case PIECE_EXPLOSION_GREEN_RIGHT: + return 'w'; + case PIECE_EXPLOSION_GREEN_TOP: + return 'U'; + case PIECE_EXPLOSION_GREEN_VERTICAL: + return 'V'; + case PIECE_EXPLOSION_GREEN_BOTTOM: + return 'W'; + case PIECE_EXPLOSION_BLUE_LEFT: + return 'x'; + case PIECE_EXPLOSION_BLUE_HORIZONTAL: + return 'y'; + case PIECE_EXPLOSION_BLUE_RIGHT: + return 'z'; + case PIECE_EXPLOSION_BLUE_TOP: + return 'X'; + case PIECE_EXPLOSION_BLUE_VERTICAL: + return 'Y'; + case PIECE_EXPLOSION_BLUE_BOTTOM: + return 'Z'; + + default: + return '?'; + } +} + +function direction_to_character(direction) +{ + switch(direction) + { + case MOVE_LEFT: + return 'l'; + case MOVE_UP: + return 'u'; + case MOVE_RIGHT: + return 'r'; + case MOVE_DOWN: + return 'd'; + case MOVE_SWAP: + return 's'; + case MOVE_SWAPPED: + return 'w'; + case MOVE_NONE: + return 'n'; + + default: + return '?'; + } +} + +function character_to_direction(c) +{ + switch(c) + { + case 'l': + return MOVE_LEFT; + case 'u': + return MOVE_UP; + case 'r': + return MOVE_RIGHT; + case 'd': + return MOVE_DOWN; + case 's': + return MOVE_SWAP; + case 'w': + return MOVE_SWAPPED; + case 'n': + return MOVE_NONE; + + default: + return MOVE_UNKNOWN; + } +} + +function explosiontype(p) +{ + switch(p) + { + case PIECE_ARROW_RED_LEFT: + case PIECE_ARROW_RED_RIGHT: + case PIECE_BOMB_RED_LEFT: + case PIECE_BOMB_RED_RIGHT: + return PIECE_EXPLOSION_NEW_RED_VERTICAL; + case PIECE_ARROW_RED_UP: + case PIECE_ARROW_RED_DOWN: + case PIECE_BOMB_RED_UP: + case PIECE_BOMB_RED_DOWN: + return PIECE_EXPLOSION_NEW_RED_HORIZONTAL; + + case PIECE_ARROW_GREEN_LEFT: + case PIECE_ARROW_GREEN_RIGHT: + case PIECE_BOMB_GREEN_LEFT: + case PIECE_BOMB_GREEN_RIGHT: + return PIECE_EXPLOSION_NEW_GREEN_VERTICAL; + case PIECE_ARROW_GREEN_UP: + case PIECE_ARROW_GREEN_DOWN: + case PIECE_BOMB_GREEN_UP: + case PIECE_BOMB_GREEN_DOWN: + return PIECE_EXPLOSION_NEW_GREEN_HORIZONTAL; + + case PIECE_ARROW_BLUE_LEFT: + case PIECE_ARROW_BLUE_RIGHT: + case PIECE_BOMB_BLUE_LEFT: + case PIECE_BOMB_BLUE_RIGHT: + return PIECE_EXPLOSION_NEW_BLUE_VERTICAL; + case PIECE_ARROW_BLUE_UP: + case PIECE_ARROW_BLUE_DOWN: + case PIECE_BOMB_BLUE_UP: + case PIECE_BOMB_BLUE_DOWN: + return PIECE_EXPLOSION_NEW_BLUE_HORIZONTAL; + + default: + /* This should never happen */ + return PIECE_GONE; + } +} + +function level_moved(move) +{ + level_addmove(move); + + level.flags |= LEVELFLAG_MOVES; + + level_storemovers(); + + display_start_update(); +} + +function level_move(move) +{ + var realmove = move; + var x, y, ok, p, px, py; + var teleport, tx, ty, td, dx, dy; + + if(level.flags & LEVELFLAG_EXIT) + return; + + if(realmove == MOVE_REDO) + { + move = level.redoable_moves[level.redoable_moves.length - 1].direction; + } + + + if(move == MOVE_SWAP) + { + if(level.alive[1 - level.player]) + { + level.player = 1 - level.player; + + /* Create new movers for the stationary swapped players to allow + the display to redraw them after the swap. */ + mover_new(level.player_x[level.player], level.player_y[level.player], MOVE_SWAP, PIECE_PLAYER_ONE + level.player, 0); + + /* Is the first player still alive? */ + if(level.alive[1 - level.player]) + mover_new(level.player_x[1 - level.player], level.player_y[1 - level.player], MOVE_SWAPPED, PIECE_PLAYER_ONE + 1 - level.player, 0); + + level_moved(realmove); + + return true; + } + else + return false; + } + + if(level.alive[level.player] == 0) + return false; + + if(level.mode == MODE_XOR && options.xor_engine) + { + if(xor_move(move)) + { + level_moved(realmove); + xor_focus(); + return true; + } + return false; + } + if(level.mode == MODE_ENIGMA && options.enigma_engine) + { + if(enigma_move(move)) + { + level_moved(realmove); + return true; + } + return false; + } + + /* Consider where we are moving to */ + x = level.player_x[level.player] + move_x[move]; + y = level.player_y[level.player] + move_y[move]; + + p = level_piece(x, y); + + ok = 0; + + /* Can we move into the piece in that direction? */ + switch(p) + { + case PIECE_DOOR: + if(level.stars_caught == level.stars_total) + { + level.flags |= LEVELFLAG_EXIT; + ok = 1; + } + break; + + case PIECE_STAR: + level.stars_caught ++; + level.flags |= LEVELFLAG_STARS; + ok = 1; + break; + + case PIECE_TELEPORT: + /* Only XOR has teleports. We force the issue so as not to break + Chroma's rotational symmetry by introducing teleport order. */ + if(level.mode != MODE_XOR) + break; + + teleport = -1; + if(x == level.teleport_x[0] && y == level.teleport_y[0]) + teleport = 0; + if(x == level.teleport_x[1] && y == level.teleport_y[1]) + teleport = 1; + + if(teleport != -1) + { + tx = level.teleport_x[1 - teleport]; + ty = level.teleport_y[1 - teleport]; + td = move; + + /* Does the other teleport still exist? */ + if(level_piece(tx, ty) == PIECE_TELEPORT) + { + ok = 0; + /* Find the first available exit from it */ + for(i = 0; i < 4; i ++) + { + dx = tx + move_x[xor_teleport_order[i]]; + dy = ty + move_y[xor_teleport_order[i]]; + if(!ok && level_piece(dx, dy) == PIECE_SPACE) + { + /* Change move to produce the effect of coming + out of the teleport */ + x = dx; y = dy; move = xor_teleport_order[i]; + ok = 1; + } + } + if(ok) + { + /* Visual effects for the player going in one teleport */ + /* Store original player move direction in cosmetic mover */ + mover_new(level.teleport_x[teleport], level.teleport_y[teleport], td, PIECE_TELEPORT, 0); + level_setprevious(level.teleport_x[teleport], level.teleport_y[teleport], PIECE_PLAYER_ONE + level.player); + level_setpreviousmoving(level.teleport_x[teleport], level.teleport_y[teleport], realmove); + /* and out of the other teleport */ + mover_new(level.teleport_x[1 - teleport], level.teleport_y[1 - teleport], MOVE_NONE, PIECE_TELEPORT, 0); + + /* Change the viewpoint to that of the other teleport */ + level.view_x[level.player] = level.view_teleport_x[1 - teleport]; + level.view_y[level.player] = level.view_teleport_y[1 - teleport]; + + } + } + } + break; + + case PIECE_SWITCH: + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + ok = 1; + break; + + case PIECE_MAP_TOP_LEFT: + level.mapped |= MAPPED_TOP_LEFT; + level.flags |= LEVELFLAG_MAP; + ok = 1; + break; + + case PIECE_MAP_TOP_RIGHT: + level.mapped |= MAPPED_TOP_RIGHT; + level.flags |= LEVELFLAG_MAP; + ok = 1; + break; + + case PIECE_MAP_BOTTOM_LEFT: + level.mapped |= MAPPED_BOTTOM_LEFT; + level.flags |= LEVELFLAG_MAP; + ok = 1; + break; + + case PIECE_MAP_BOTTOM_RIGHT: + level.mapped |= MAPPED_BOTTOM_RIGHT; + level.flags |= LEVELFLAG_MAP; + ok = 1; + break; + + case PIECE_DOTS_X: + if(move == MOVE_LEFT || move == MOVE_RIGHT) + ok = 1; + break; + + case PIECE_DOTS_Y: + if(move == MOVE_UP || move == MOVE_DOWN) + ok = 1; + break; + + case PIECE_DOTS_DOUBLE: + case PIECE_DOTS: + case PIECE_SPACE: + ok = 1; + break; + } + + /* Is there a piece we can push? */ + if(!ok) + { + tx = x + move_x[move]; + ty = y + move_y[move]; + + if(canbepushed(p, level_piece(tx, ty), move, level.mode)) + { + mover_new(tx, ty, move, p, 0); + ok = 1; + } + } + + if(ok) + { + + /* Cosmetic mover for storing the player's direction in undo */ + mover_new(level.player_x[level.player], level.player_y[level.player], move, PIECE_GONE, 0); + + mover_new(x, y, move, PIECE_PLAYER_ONE + level.player, 0); + + px = level.player_x[level.player]; + py = level.player_y[level.player]; + + /* XOR protects the players move */ + if(level.mode == MODE_XOR) + { + /* Blank the player's space first to avoid upsetting undo */ + level_setpiece(px, py, PIECE_SPACE); + mover_new(px, py, (move + 1) % 4, PIECE_SPACE, 1); + } + /* Chroma lets a piece follow in the player's trail */ + else + { + /* Blank the player's space first to avoid upsetting undo */ + level_setpiece(px, py, PIECE_SPACE); + mover_consider(px, py, move % 4); + } + + level.player_x[level.player] = x; + level.player_y[level.player] = y; + + level_moved(realmove); + + if(level.mode == MODE_XOR) + xor_focus(); + + return true; + } + + return false; +} + +function mover_explode(x, y, d, p) +{ + /* Don't explode any of the edge wall */ + if(x == 0 || y == 0 || x == level.width - 1 || y == level.width - 1) + return; + + /* What have we exploded? */ + switch(level_piece(x, y)) + { + case PIECE_STAR: + level.stars_exploded ++; + level.flags |= LEVELFLAG_STARS; + break; + + case PIECE_SWITCH: + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + break; + } + + mover_new(x, y, d, p, 1); +} + +function mover_new(x, y, d, piece, fast) +{ + var mover = new Object; + + /* Don't allow two movers in the same space, unless one is exploding */ + if(!isnewexplosion(piece) && level_moving(x, y) != MOVE_NONE) + return; + + var previous = level_piece(x, y); + + mover.x = x; + mover.y = y; + mover.direction = d; + mover.piece = piece; + mover.piece_previous = previous; + mover.fast = fast; + + /* Show pieces collected by players */ + if(piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + { + if((previous < PIECE_MOVERS_FIRST || previous > PIECE_MOVERS_LAST) + && previous != PIECE_CIRCLE + && previous != PIECE_CIRCLE_DOUBLE + && previous != PIECE_PLAYER_ONE + && previous != PIECE_PLAYER_TWO) + level_setprevious(x, y, previous); + } + + /* Show players squashed by movers */ + if(piece >= PIECE_MOVERS_FIRST && piece <= PIECE_MOVERS_LAST) + { + if(previous == PIECE_PLAYER_ONE || previous == PIECE_PLAYER_TWO) + level_setprevious(x, y, previous); + } + + /* Show pieces removed by movers or explosions */ + if(previous == PIECE_DOTS + || previous == PIECE_DOTS_DOUBLE + || previous == PIECE_DOTS_X + || previous == PIECE_DOTS_Y + || isexplosion(previous)) + level_setprevious(x, y, previous); + + /* Show exploded pieces */ + if(isnewexplosion(piece) && !isnewexplosion(previous)) + { + level_setprevious(x, y, previous); + level_setpreviousmoving(x, y, level_moving(x, y)); + } + + /* Explosions occur later */ + if(!isnewexplosion(piece) && piece != PIECE_GONE) + { + level_setpiece(x, y, piece); + level_setmoving(x, y, d); + } + + /* Maintain piece graphic */ + if(d != MOVE_NONE) + { + data = level_data(x - move_x[d], y - move_y[d]) & 0xff00; + data = (level_data(x, y) & ~0xff00) | data; + level_setdata(x, y, data); + } + + level.movers.push(mover); +} + +function mover_addtostack(x, y, move) +{ + var mover = new Object; + + mover.x = x; + mover.y = y; + mover.direction = move; + mover.piece = PIECE_SPACE; + mover.fast = 0; + + level.stack.push(mover); +} + + +function level_addmove(direction) +{ + if(direction == MOVE_REDO) + { + direction = level.redoable_moves[level.redoable_moves.length - 1].direction; + level.redoable_moves.pop(); + } + else if(level.redoable_moves.length != 0) + level.redoable_moves = []; + + var move = new Object; + move.direction = direction; + move.movers = []; + move.count = level.moves.length; + + level.moves.push(move); +} + +function level_storemovers() +{ + var previous; + + for(m = 0; m < level.movers.length; m ++) + { + /* If something is moving into an explosion, don't store it as the + previous piece for this space; it will have its own mover, and thus + will be stored elsewhere. */ + previous = level.movers[m].piece_previous; + if(isexplosion(level.movers[m].piece) && level_previousmoving(level.movers[m].x, level.movers[m].y) != MOVE_NONE) + previous = PIECE_SPACE; + + mover_newundo(level.movers[m].x, level.movers[m].y, + level.movers[m].direction, level.movers[m].piece, previous, + MOVER_STORE | (m == level.movers.length - 1 ? 0 : MOVER_FAST)); + } +} + +function level_evolve() +{ + var mover, x, y, i, d, ad, ed, ax, ay, bp, bd, filled; + + if(level.mode == MODE_XOR && options.xor_engine) + { + return xor_evolve(); + } + if(level.mode == MODE_ENIGMA && options.enigma_engine) + { + return enigma_evolve(); + } + + level.oldmovers = level.movers; + level.movers = []; + + /* Chroma's engine isn't perfect. Pieces that appear to be in continuous + motion are actually momentarily stationary at the start of every cycle. + In pathological cases, this can give rise to some counterintuitive + situations, where the outcome depends on the order of the movers. + + See levels/regression/chroma-regression.chroma for some examples. + */ + + for(m = 0; m < level.oldmovers.length; m ++) + { + mover = level.oldmovers[m]; + + level_setmoving(mover.x, mover.y, MOVE_NONE); + level_setprevious(mover.x, mover.y, PIECE_SPACE); + level_setpreviousmoving(mover.x, mover.y, MOVE_NONE); + level_setdetonator(mover.x, mover.y, PIECE_SPACE); + level_setdetonatormoving(mover.x, mover.y, MOVE_NONE); + } + + /* Make any changes to the map, if necessary */ + if(level.mode == MODE_XOR && options.xor_display) + { + for(m = 0; m < level.oldmovers.length; m ++) + { + mover = level.oldmovers[m]; + + display_map_piece(mover.x, mover.y); + } + } + + + + for(m = 0; m < level.oldmovers.length; m ++) + { + mover = level.oldmovers[m]; + + /* Remove the mover if something has already moved into its space */ + if(level_moving(mover.x, mover.y) != MOVE_NONE + /* or it isn't what it should be */ + || level_piece(mover.x, mover.y) != mover.piece + ) + mover.piece = PIECE_GONE; + + switch(mover.piece) + { + case PIECE_SPACE: + case PIECE_EXPLOSION_RED_LEFT: + case PIECE_EXPLOSION_RED_HORIZONTAL: + case PIECE_EXPLOSION_RED_RIGHT: + case PIECE_EXPLOSION_RED_TOP: + case PIECE_EXPLOSION_RED_VERTICAL: + case PIECE_EXPLOSION_RED_BOTTOM: + case PIECE_EXPLOSION_GREEN_LEFT: + case PIECE_EXPLOSION_GREEN_HORIZONTAL: + case PIECE_EXPLOSION_GREEN_RIGHT: + case PIECE_EXPLOSION_GREEN_TOP: + case PIECE_EXPLOSION_GREEN_VERTICAL: + case PIECE_EXPLOSION_GREEN_BOTTOM: + case PIECE_EXPLOSION_BLUE_LEFT: + case PIECE_EXPLOSION_BLUE_HORIZONTAL: + case PIECE_EXPLOSION_BLUE_RIGHT: + case PIECE_EXPLOSION_BLUE_TOP: + case PIECE_EXPLOSION_BLUE_VERTICAL: + case PIECE_EXPLOSION_BLUE_BOTTOM: + i = 0; + filled = 0; + + /* Consider the pieces around the space */ + for(i = 0; i < 4; i ++) + { + if(filled) + continue; + + /* Enigma has a fixed move order */ + if(level.mode == MODE_ENIGMA) + d = enigma_move_order[i]; + else + /* Chroma and XOR depend on how the space was emptied */ + d = (mover.direction + i) % 4; + + ad = (d + 2) % 4; + ax = mover.x + move_x[ad]; + ay = mover.y + move_y[ad]; + + /* Can the piece move into the space? */ + if(canfall(level_piece(ax, ay), PIECE_SPACE, d) + /* and that piece isn't already moving */ + && level_moving(ax, ay) == MOVE_NONE + ) + { + x = mover.x + move_x[d]; + y = mover.y + move_y[d]; + + /* Can the piece from the opposite direction also + move into this space? */ + if(canfall(level_piece(x, y), PIECE_SPACE, ad) + /* and that piece isn't already moving */ + && level_moving(x, y) == MOVE_NONE + /* If so, can the two explode? */ + && canexplode(level_piece(ax, ay), level_piece(x, y), d, 1, level.mode) + /* (but not for XOR and Enigma) */ + && level.mode == MODE_CHROMA + ) + { + /* If so, detonate them in the middle */ + if((level_piece(x, y) & 4) == 4) + { + /* The first piece is the bomb */ + bp = level_piece(x, y); + bd = ad; + ed = level_piece(x, y) & 3; + + level_setdetonator(mover.x, mover.y, level_piece(ax, ay)); + level_setdetonatormoving(mover.x, mover.y, d); + } + else + { + /* The second piece is the bomb */ + bp = level_piece(ax, ay); + bd = d; + ed = level_piece(ax, ay) & 3; + + level_setdetonator(mover.x, mover.y, level_piece(x, y)); + level_setdetonatormoving(mover.x, mover.y, ad); + } + + /* and consider anything following them */ + mover_consider(x, y, ad); + mover_consider(ax, ay, d); + + /* Move the bomb into the space */ + level_setpiece(mover.x, mover.y, bp); + level_setmoving(mover.x, mover.y, bd); + + /* and explode it */ + mover_explode(mover.x, mover.y, ed, explosiontype(bp)); + + /* Create the central explosion now, to prevent the + piece there being processed as a later mover. */ + level_setpiece(mover.x, mover.y, explosiontype(bp)); + explode_sides(mover.x, mover.y, bp, ed); + + filled = 1; + break; + } + + /* Otherwise, keep the piece moving */ + mover_new(mover.x, mover.y, d, level_piece(ax, ay), 1); + /* and see if anything is following in its trail */ + mover_consider(ax, ay, d); + + filled = 1; + break; + } + } + + /* If the explosion has not been filled */ + if(isexplosion(mover.piece) && filled == 0 + /* and nothing else is moving into it */ + && level_moving(mover.x, mover.y) == MOVE_NONE + ) + /* then turn it into a space */ + mover_new(mover.x, mover.y, mover.direction, PIECE_SPACE, 0); + + break; + + case PIECE_PLAYER_ONE: + case PIECE_PLAYER_TWO: + case PIECE_GONE: + /* These 'movers' are purely for cosmetic purposes */ + break; + + case PIECE_TELEPORT: + /* These 'movers' are purely for cosmetic purposes */ + break; + + default: + /* A pushed arrow still falls in its natural direction */ + if(mover.fast == 0 && mover.piece >= PIECE_MOVERS_FIRST && mover.piece <= PIECE_MOVERS_LAST) + mover.direction = mover.piece % 4; + + /* Consider the space in front of the mover */ + x = mover.x + move_x[mover.direction]; + y = mover.y + move_y[mover.direction]; + + /* Can the mover move into the space in front of it? */ + if(canmove(mover.piece, level_piece(x, y), mover.direction, mover.fast) + /* and that space doesn't already have something + moving into it */ + && (level_moving(x, y) == MOVE_NONE) + ) + { + /* If so, keep it moving */ + mover_new(x, y, mover.direction, mover.piece, 1); + /* and see if anything is following in its trail */ + mover_consider(mover.x, mover.y, mover.direction); + break; + } + + /* Can the mover explode the piece in front of it? */ + if(canexplode(mover.piece, level_piece(x, y), mover.direction, mover.fast, level.mode) + /* and the piece in front isn't moving */ + && (level_moving(x, y) == MOVE_NONE + /* or it is moving towards us */ + || (level_moving(x, y) == ((mover.direction + 2) % 4) + /* (but not for XOR or Enigma) */ + && level.mode==MODE_CHROMA)) + ) + { + bp = level_piece(x, y); + level_setdetonator(x, y, mover.piece); + level_setdetonatormoving(x, y, mover.direction); + + /* Explosion direction is bomb fall direction */ + if(bp & 4) + ed = bp & 3; + else + ed = mover.piece & 3; + + mover_explode(x, y, ed, explosiontype(bp)); + + /* Create the central explosion now, to prevent the piece + there being processed as a later mover. */ + level_setpiece(x, y, explosiontype(bp)); + + mover_consider(mover.x, mover.y, mover.direction); + + explode_sides(x, y, bp, ed); + + break; + } + + } + } + + /* Create the side explosions at the end, rather than during the previous + loop. This allows multiple explosions to occur in parallel. Centre + explosions will have already been created earlier on. */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(isnewexplosion(mover.piece)) + { + if(!isnewexplosion(level_piece(mover.x, mover.y))) + { + level_setprevious(mover.x, mover.y, level_piece(mover.x, mover.y)); + level_setpreviousmoving(mover.x, mover.y, level_moving(mover.x, mover.y)); + } + + /* Use PIECE_EXPLOSION_NEW to allow detection of overlapping + explosions further down. */ + level_setpiece(mover.x, mover.y, mover.piece); + level_setmoving(mover.x, mover.y, mover.direction); + + mover.piece += PIECE_EXPLOSION_FIRST - PIECE_EXPLOSION_NEW_FIRST; + } + } + + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(isexplosion(mover.piece)) + { + /* Remove any explosions that overlap other explosions */ + if(isexplosion(level_piece(mover.x, mover.y))) + mover.piece = PIECE_GONE; + /* Otherwise, convert new explosions into explosions proper */ + else + level_setpiece(mover.x, mover.y, mover.piece); + } + /* Remove any movers that have exploded, or aren't as they should be */ + if(level_piece(mover.x, mover.y) != mover.piece) + { + mover.piece = PIECE_GONE; + } + } + + /* Is player one still alive? */ + if(level_piece(level.player_x[0], level.player_y[0]) != PIECE_PLAYER_ONE) + { + level.flags |= LEVELFLAG_MOVES; + level.alive[0] = false; + } + + /* Is player two still alive? */ + if(level_piece(level.player_x[1], level.player_y[1]) != PIECE_PLAYER_TWO) + { + level.flags |= LEVELFLAG_MOVES; + level.alive[1] = false; + } + + if(level.alive[0] == false && level.alive[1] == false) + level.flags |= LEVELFLAG_FAILED; + + level.oldmovers = []; +} + +function mover_consider(x, y, d) +{ + var tx, ty, ad; + + /* Is there already a mover in this space? If so, don't allow another */ + if(level_moving(x, y) != MOVE_NONE) + return; + + /* Enigma doesn't consider the direction in which a space was emptied */ + if(level.mode == MODE_ENIGMA) + { + mover_new(x, y, d, PIECE_SPACE, 1); + return; + } + + if(level.mode == MODE_XOR) + { + mover_new(x, y, d, PIECE_SPACE, 1); + return; + } + + ad = (d + 2) % 4; + tx = x + move_x[ad]; + ty = y + move_y[ad]; + + /* Can a piece follow in the trail of this one? */ + if(canfall(level_piece(tx, ty), PIECE_SPACE, d)) + { + /* If it's moving already, just clear this space (1.07) */ + if(level_moving(tx, ty) != MOVE_NONE) + { + mover_new(x, y, MOVE_NONE, PIECE_SPACE, 0); + return; + } + + /* Otherwise, set it moving */ + mover_new(x, y, d, level_piece(tx, ty), 1); + /* and see if there's anything following in its trail */ + mover_consider(tx, ty, d); + return; + } + + mover_new(x, y, d, PIECE_SPACE, 1); +} + +function explode_sides(x, y, p, d) +{ + /* Chroma is subtle. This may be too subtle to have any effect in practice, + but the principle elsewhere is that things should be rotationally + symmetric, and this carries through here. */ + if(level.mode == MODE_CHROMA) + { + switch(p % 4) + { + case 0: /* left */ + mover_explode(x, y - 1, d, explosiontype(p) - 1); + mover_explode(x, y + 1, d, explosiontype(p) + 1); + break; + + case 1: /* up */ + mover_explode(x + 1, y, d, explosiontype(p) + 1); + mover_explode(x - 1, y, d, explosiontype(p) - 1); + break; + + case 2: /* right */ + mover_explode(x, y + 1, d, explosiontype(p) + 1); + mover_explode(x, y - 1, d, explosiontype(p) - 1); + break; + + case 3: /* down */ + mover_explode(x - 1, y, d, explosiontype(p) - 1); + mover_explode(x + 1, y, d, explosiontype(p) + 1); + break; + } + } + else + { + switch(p % 2) + { + case 0: /* left / right */ + mover_explode(x, y - 1, d, explosiontype(p) - 1); + mover_explode(x, y + 1, d, explosiontype(p) + 1); + break; + + case 1: /* up /down */ + mover_explode(x - 1, y, d, explosiontype(p) - 1); + mover_explode(x + 1, y, d, explosiontype(p) + 1); + break; + } + } +} + +function canfall(p, into, d) +{ + /* Determine whether a piece can start moving */ + + /* Arrows and bombs */ + if(p >= PIECE_MOVERS_FIRST && p<= PIECE_MOVERS_LAST) + { + /* can start falling in their natural direction */ + if(d == (p % 4)) + { + /* but only into empty space */ + if(into == PIECE_SPACE) + return true; + /* or into directional dots if appropriate */ + if(into == PIECE_DOTS_X && (d == MOVE_LEFT || d == MOVE_RIGHT )) + return true; + if(into == PIECE_DOTS_Y && (d == MOVE_UP || d == MOVE_DOWN )) + return true; + } + } + + return false; +} + +function canmove(p, into, d, fast) +{ + /* Determine whether a piece can continue moving */ + + /* Arrows and bombs */ + if(p >= PIECE_MOVERS_FIRST && p<= PIECE_MOVERS_LAST) + { + /* can continue moving in their natural direction */ + if(d == (p % 4)) + { + /* into empty space */ + if(into == PIECE_SPACE) + return true; + /* into dots if they're already moving */ + if(into == PIECE_DOTS && fast) + return true; + /* into directional dots if appropriate */ + if(into == PIECE_DOTS_X && (d == MOVE_LEFT || d == MOVE_RIGHT )) + return true; + if(into == PIECE_DOTS_Y && (d == MOVE_UP || d == MOVE_DOWN )) + return true; + /* through dying explosions */ + if(isexplosion(into)) + return true; + /* can kill players if already moving */ + if(into == PIECE_PLAYER_ONE && fast) + return true; + if(into == PIECE_PLAYER_TWO && fast) + return true; + } + return false; + } + + /* Circles */ + if(p == PIECE_CIRCLE) + { + /* are stopped by everything other than empty space */ + if(into == PIECE_SPACE) + return true; + /* and dying explosions */ + if(isexplosion(into)) + return true; + return false; + } + + return false; +} + +function canbepushed(p, into, d, mode) +{ + /* Determine whether a piece can be pushed by the player */ + + /* Arrows and bombs */ + if(p >= PIECE_MOVERS_FIRST && p<= PIECE_MOVERS_LAST) + { + /* can be pushed, but not against their natural direction */ + if(d != ((p + 2) % 4)) + { + /* into empty space or through dots */ + if(into == PIECE_SPACE || into == PIECE_DOTS) + return true; + /* through directional dots if appropriate */ + if(into == PIECE_DOTS_X && (d == MOVE_LEFT || d == MOVE_RIGHT)) + return true; + if(into == PIECE_DOTS_Y && (d == MOVE_UP || d == MOVE_DOWN)) + return true; + } + return false; + } + + /* Circles can be pushed in any direction */ + if(p == PIECE_CIRCLE || p == PIECE_CIRCLE_DOUBLE) + { + /* into empty space */ + if(into == PIECE_SPACE) + return true; + /* XOR won't let circles (dolls) pass through dots */ + if(mode == MODE_XOR) + return false; + /* pushed through dots */ + if(into == PIECE_DOTS) + return true; + return false; + } + + return false; +} + +function canexplode(p, i, d, fast, mode) +{ + /* Only an already moving arrow or bomb can act as a detonator */ + if(fast == 0) + return false; + + /* Arrows can detonate bombs */ + if(p >= PIECE_ARROW_RED_LEFT && p<= PIECE_ARROW_RED_DOWN && + i >= PIECE_BOMB_RED_LEFT && i<= PIECE_BOMB_RED_DOWN) + return true; + if(p >= PIECE_ARROW_GREEN_LEFT && p<= PIECE_ARROW_GREEN_DOWN && + i >= PIECE_BOMB_GREEN_LEFT && i<= PIECE_BOMB_GREEN_DOWN) + return true; + if(p >= PIECE_ARROW_BLUE_LEFT && p<= PIECE_ARROW_BLUE_DOWN && + i >= PIECE_BOMB_BLUE_LEFT && i<= PIECE_BOMB_BLUE_DOWN) + return true; + + /* Enigma requires a moving arrow to detonate a stationary bomb, and + does not permit bombs to detonate other bombs */ + if(mode == MODE_ENIGMA) + return false; + + /* Bombs can be detonated by arrows pointing towards them */ + if(p >= PIECE_BOMB_RED_LEFT && p<= PIECE_BOMB_RED_DOWN && + i == (PIECE_ARROW_RED_LEFT + ((d + 2) % 4))) + return true; + if(p >= PIECE_BOMB_GREEN_LEFT && p<= PIECE_BOMB_GREEN_DOWN && + i == (PIECE_ARROW_GREEN_LEFT + ((d + 2) % 4))) + return true; + if(p >= PIECE_BOMB_BLUE_LEFT && p<= PIECE_BOMB_BLUE_DOWN && + i == (PIECE_ARROW_BLUE_LEFT + ((d + 2) % 4))) + return true; + + /* Bombs can detonate other bombs */ + if(p >= PIECE_BOMB_RED_LEFT && p<= PIECE_BOMB_RED_DOWN && + i >= PIECE_BOMB_RED_LEFT && i<= PIECE_BOMB_RED_DOWN) + return true; + if(p >= PIECE_BOMB_GREEN_LEFT && p<= PIECE_BOMB_GREEN_DOWN && + i >= PIECE_BOMB_GREEN_LEFT && i<= PIECE_BOMB_GREEN_DOWN) + return true; + if(p >= PIECE_BOMB_BLUE_LEFT && p<= PIECE_BOMB_BLUE_DOWN && + i >= PIECE_BOMB_BLUE_LEFT && i<= PIECE_BOMB_BLUE_DOWN) + return true; + + return false; +} + +function mover_newundo(x, y, d, piece, previous, flags) +{ + var mover = new Object; + + mover.x = x; + mover.y = y; + mover.direction = d; + mover.piece = piece; + mover.piece_previous = previous; + + if(flags & MOVER_FAST) + mover.fast = 1; + else + mover.fast = 0; + + if(flags & MOVER_UNDO) + { + level_setmoving(x, y, d); + + level.movers.push(mover); + } + + if(flags & MOVER_STORE) + { + level.moves[level.moves.length - 1].movers.push(mover); + } +} + +function level_undo() +{ + var td; + var x, y, d; + var m; + var fm; + + var count = 0; + + /* Working backwards, undo any changes made to the map by movers in the + previous step. */ + for(m = level.movers.length - 1; m >= 0; m --) + { + /* Not setting SPACEs fixes a pathological case without apparently breaking anything (1.07) */ + if(level.movers[m].piece != PIECE_SPACE) + level_setpiece(level.movers[m].x, level.movers[m].y, level.movers[m].piece); + } + + /* Undo any changes to the map, if necessary */ + if(level.mode == MODE_XOR && options.xor_display) + { + for(m = level.movers.length - 1; m >= 0; m --) + { + display_map_piece(level.movers[m].x, level.movers[m].y); + } + } + + /* Is player one still alive? */ + if(level_piece(level.player_x[0], level.player_y[0]) != PIECE_PLAYER_ONE) + level.alive[0] = false; + /* Is player two still alive? */ + if(level_piece(level.player_x[1], level.player_y[1]) != PIECE_PLAYER_TWO) + level.alive[1] = false; + + /* Tidy up any movers created in the previous step */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + level_setmoving(mover.x, mover.y, MOVE_NONE); + level_setprevious(mover.x, mover.y, PIECE_SPACE); + } + level.movers = []; + + /* Can't undo at very start of level */ + if(level.moves.length == 0) + return false; + + /* If there is no previous step to undo, remove this move entirely */ + if(level.moves[level.moves.length - 1].movers.length == 0) + { + level.redoable_moves.push(level.moves.pop()); + level.flags |= LEVELFLAG_MOVES; + + return false; + } + + /* Start from the last mover for this step. */ + m = level.moves[level.moves.length - 1].movers.length - 1; + + fm = 0; + td = MOVE_NONE; + + /* Working backwards, remove these pieces from the map */ + while(m >= 0) + { + fm = m; + + mover = level.moves[level.moves.length - 1].movers[m]; + + level_setpiece(mover.x, mover.y, PIECE_SPACE); + + /* If the piece is the player, update position and status */ + if(mover.piece_previous == PIECE_PLAYER_ONE || mover.piece_previous == PIECE_PLAYER_TWO) + { + level.player_x[mover.piece_previous - PIECE_PLAYER_ONE] = mover.x; + level.player_y[mover.piece_previous - PIECE_PLAYER_ONE] = mover.y; + + if(level.mode == MODE_XOR) + { + /* If a player is being resurrected in this move, and the + other player is alive, undo the automatic swap */ + if(level.alive[mover.piece_previous - PIECE_PLAYER_ONE] == 0 && level.alive[level.player]) + { + /* Cosmetic mover to deactivate other player */ + mover_newundo(level.player_x[level.player], level.player_y[level.player], MOVE_SWAPPED, PIECE_PLAYER_ONE + level.player, PIECE_SPACE, MOVER_UNDO); + } + /* The active player is the one which moves first + (last in undo */ + level.player = mover.piece_previous - PIECE_PLAYER_ONE; + } + + level.alive[mover.piece_previous - PIECE_PLAYER_ONE] = true; + } + + /* If the piece is a teleport, store the direction of the original move + into it for later use. */ + if(mover.piece == PIECE_TELEPORT) + td = mover.direction; + + /* until we reach the first mover for this step. */ + m --; + if(m >= 0 && level.moves[level.moves.length - 1].movers[m].fast == 0) + break; + } + + /* Now, move forwards through the movers and create cosmetic effects. */ + for(m = fm; m < level.moves[level.moves.length - 1].movers.length; m ++) + { + mover = level.moves[level.moves.length - 1].movers[m]; + + d = mover.direction; + x = mover.x - move_x[d]; + y = mover.y - move_y[d]; + + if(d != MOVE_NONE && d != MOVE_SWAP && d != MOVE_SWAPPED) + d = (d + 2) % 4; + + if(isexplosion(mover.piece)) + { + /* Explosions don't move. */ + d = MOVE_NONE; + /* Show dying explosion when undoing new explosion */ + level_setprevious(mover.x, mover.y, mover.piece); + } + + /* Do we need to patch up the direction this piece is moving in? */ + /* Is it the player? */ + if((mover.piece_previous == PIECE_PLAYER_ONE || mover.piece_previous == PIECE_PLAYER_TWO) && (mover.piece == PIECE_SPACE || mover.piece == PIECE_GONE)) + { + /* If so, are they moving out of a teleport? Use original direction + of move if so. */ + if(td != MOVE_NONE) + d = (td + 2) % 4; + } + /* Otherwise, if the previous piece wasn't a move, it must have been a + static piece being eaten by a mover, and thus shouldn't move. */ + else if((mover.piece_previous < PIECE_MOVERS_FIRST || mover.piece_previous > PIECE_MOVERS_LAST) && mover.piece_previous != PIECE_CIRCLE && mover.piece_previous != PIECE_CIRCLE_DOUBLE) + d = MOVE_NONE; + + /* Plot a cosmetic mover. */ + if(level_previous(mover.x, mover.y) != PIECE_SPACE) + d = MOVE_NONE; + /* but not if there are overlapping explosions */ + if(!(mover.piece_previous >= PIECE_EXPLOSION_NEW_FIRST && mover.piece_previous <= PIECE_EXPLOSION_NEW_LAST)) + mover_newundo(mover.x, mover.y, d, mover.piece_previous, PIECE_SPACE, MOVER_UNDO); + } + + /* Remove the movers in the step we've just done */ + for(m = level.moves[level.moves.length - 1].movers.length - 1; m >= fm; m --) + { + mover = level.moves[level.moves.length - 1].movers[m]; + + /* Undo any pieces exploded or caught */ + if(mover.piece_previous == PIECE_STAR) + { + if(mover.piece == PIECE_PLAYER_ONE || mover.piece == PIECE_PLAYER_TWO) + level.stars_caught --; + else + level.stars_exploded --; + + level.flags |= LEVELFLAG_STARS; + } + if(mover.piece_previous == PIECE_SWITCH) + { + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + } + if(mover.piece_previous == PIECE_MAP_TOP_LEFT) + { + level.mapped ^= MAPPED_TOP_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(mover.piece_previous == PIECE_MAP_TOP_RIGHT) + { + level.mapped ^= MAPPED_TOP_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(mover.piece_previous == PIECE_MAP_BOTTOM_LEFT) + { + level.mapped ^= MAPPED_BOTTOM_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(mover.piece_previous == PIECE_MAP_BOTTOM_RIGHT) + { + level.mapped ^= MAPPED_BOTTOM_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + + level.moves[level.moves.length - 1].movers.pop(); + } + + /* If the move was a swap, revert to the previous player */ + if(level.moves[level.moves.length - 1].direction == MOVE_SWAP) + level.player = 1 - level.player; + + /* Have we just undone failure? */ + if((level.flags & LEVELFLAG_FAILED) && (level.alive[0] == true || level.alive[1] == true)) + { + level.flags &= ~LEVELFLAG_FAILED; + level.flags |= LEVELFLAG_MOVES; + } + + /* Have we just undone success? */ + if(level.flags & (LEVELFLAG_SOLVED | LEVELFLAG_EXIT)) + { + level.flags &= ~LEVELFLAG_SOLVED; + level.flags &= ~LEVELFLAG_EXIT; + level.flags |= LEVELFLAG_STARS; + } + + if(level.mode == MODE_XOR) + xor_focus(); + + return true; +} + +function isexplosion(piece) +{ + return (piece >= PIECE_EXPLOSION_FIRST && piece <= PIECE_EXPLOSION_LAST); +} + +function isnewexplosion(piece) +{ + return (piece >= PIECE_EXPLOSION_NEW_FIRST && piece <= PIECE_EXPLOSION_NEW_LAST); +} + +function level_piece(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return PIECE_WALL; + + return level.piece[x][y]; +} + +function level_setpiece(x, y, piece) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.piece[x][y] = piece; +} + +function level_moving(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return MOVE_NONE; + + return level.moving[x][y]; +} + +function level_setmoving(x, y, moving) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.moving[x][y] = moving; +} + +function level_previous(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return PIECE_WALL; + + return level.previous[x][y]; +} + +function level_setprevious(x, y, previous) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.previous[x][y] = previous; +} + +function level_previousmoving(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return MOVE_NONE; + + return level.previousmoving[x][y]; +} + +function level_setpreviousmoving(x, y, previousmoving) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.previousmoving[x][y] = previousmoving; +} + +function level_detonator(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return PIECE_SPACE; + + return level.detonator[x][y]; +} + +function level_setdetonator(x, y, detonator) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.detonator[x][y] = detonator; +} + +function level_detonatormoving(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return MOVE_NONE; + + return level.detonatormoving[x][y]; +} + +function level_setdetonatormoving(x, y, detonatormoving) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.detonatormoving[x][y] = detonatormoving; +} + +function level_data(x, y) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return 0; + + return level.data[x][y]; +} + +function level_setdata(x, y, data) +{ + if(level == null || x < 0 || x >= level.width || y < 0 || y >= level.height) + return; + + level.data[x][y] = data; +} + +function level_rebevel_movers() +{ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(mover.piece == PIECE_WALL) + level_setpiece(mover.x, mover.y, mover.piece); + } + + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + if(mover.piece == PIECE_WALL || (isexplosion(mover.piece) && display_animation == 1)) + { + for(i = -1; i < 2; i ++) + { + for(j = - 1; j < 2; j ++) + { + bevel = display_bevelsquare(x + i, y + j); + + if(bevel != (level_data(x + i, y + j) & BEVEL_ALL)) + level_setdata(x + i, y + j, bevel | (level_data(x + i, y + j) & ~BEVEL_ALL)); + } + } + } + } +} + +function display_level() +{ + var p; + + screen.context.fillStyle = "#000000"; + screen.context.fillRect(0, 0, screen.width, screen.height); + + if(level == null) + return; + + var startx = Math.floor(- graphics.offset_x / graphics.width); + var endx = Math.ceil((screen.width - graphics.offset_x) / graphics.width); + + var starty = Math.floor(- graphics.offset_y / graphics.height); + var endy = Math.ceil((screen.height - graphics.offset_y) / graphics.height); + + if(level.mode == MODE_XOR && options.xor_display) + { + endx = startx + 8; + endy = starty + 8; + } + + if(graphics.shadows.length > 0) + { + for(var y = starty; y < endy; y ++) + { + for(var x = startx; x < endx; x ++) + { + displayshadowed_piecebase(x, y); + + p = level_piece(x, y); + if(p != PIECE_SPACE) + display_piece(p, x, y, MOVE_NONE); + } + } + } + else + { + for(var y = starty; y < endy; y ++) + { + for(var x = startx; x < endx; x ++) + { + display_piece(PIECE_SPACE, x, y, MOVE_NONE); + display_piece(level_piece(x, y), x, y, MOVE_NONE); + } + } + } + + screen.bar.context.fillStyle = "#000000"; + screen.bar.context.fillRect(0, 0, screen.bar.width, screen.bar.height * screen.bar.lines); + + if(screen.bar.lines == 1) + { + var str = level.title; + var font_size = screen.bar.height; + var ok = false; + var text; + + while(!ok) + { + screen.bar.context.font = font_size + "px " + font_name; + + text = screen.bar.context.measureText(str); + if(text.width < screen.bar.width || font_size == 1) + ok = true; + else + font_size --; + } + screen.bar.title_position = (screen.bar.width - text.width) / 2; + screen.bar.title_width = text.width; + + screen.bar.context.lineWidth = screen.bar.height / 16; + screen.bar.context.strokeStyle= "#7f7f7f"; + screen.bar.context.strokeText(str, screen.bar.title_position, screen.bar.height - screen.bar.height / 8); + + screen.bar.context.fillStyle = "#ffffff"; + screen.bar.context.fillText(str, screen.bar.title_position, screen.bar.height - screen.bar.height / 8); + } + + screen.bar.stars_width = 0; + screen.bar.moves_width = 0; + + display_moves(); + display_stars(); + + if(level.mode == MODE_XOR && options.xor_display) + display_map(); +} + +function display_movers() +{ + var m, x, y, p, pm; + var mover; + + if(graphics.shadows.length > 0) + { + displayshadowed_movers(); + return; + } + + /* First, plot spaces for all moving pieces */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m] + + display_piece(PIECE_SPACE, mover.x, mover.y, MOVE_NONE); + } + + /* Plot moving pieces */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + + if(isexplosion(mover.piece)) + { + /* Plot any piece destroyed by the explosion, or the bomb itself */ + p = level_previous(x, y); + pm = level_previousmoving(x, y); + if(p != PIECE_SPACE) + display_piece(p, x, y, pm); + + /* Plot the detonator */ + p = level_detonator(x, y); + pm = level_detonatormoving(x, y); + if(p != PIECE_SPACE) + display_piece(p, x, y, pm); + } + /* Spaces have already been covered */ + else if(mover.piece != PIECE_SPACE && mover.piece != PIECE_GONE) + { + if(display_animation < 1) + { + /* Pieces being collected, earth being eaten */ + p = level_previous(x, y); + pm = level_previousmoving(x, y); + if((p != PIECE_SPACE && !isexplosion(p) && pm == MOVE_NONE) || mover.piece == PIECE_TELEPORT) + display_piece(p, x, y, pm); + } + + display_piece(mover.piece, x, y, mover.direction); + } + } + + /* At the peak of the explosion, rebevel any walls that have been + destroyed. When undoing, rebevel any walls that have been recreated. */ + if(display_animation ==0 || display_animation == 1) + { + /* When undoing, we have to create the wall prior to rebevelling, as it + wouldn't otherwise exist until after the end of the animation. */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(mover.piece == PIECE_WALL) + level_setpiece(mover.x, mover.y, mover.piece); + } + + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + if(mover.piece == PIECE_WALL || (isexplosion(mover.piece) && display_animation == 1)) + { + for(i = -1; i < 2; i ++) + { + for(j = - 1; j < 2; j ++) + { + bevel = display_bevelsquare(x + i, y + j); + + if(bevel != (level_data(x + i, y + j) & BEVEL_ALL)) + { + level_setdata(x + i, y + j, bevel | (level_data(x + i, y + j) & ~BEVEL_ALL)); + + p = level_piece(x + i, y + j); + if(p == PIECE_WALL) + { + if(level.switched) + display_piece(PIECE_DARKNESS, x + i, y + j, MOVE_NONE); + else + display_piece(PIECE_WALL, x + i, y + j, MOVE_NONE); + } + else + { + if(level.switched) + display_piece(PIECE_DARKNESS, x + i, y + j, MOVE_NONE); + else + display_piece(PIECE_SPACE, x + i, y + j, MOVE_NONE); + /* Moving pieces will be replotted when they next move. */ + if(p != PIECE_SPACE && level_moving(x + i, y + j) == MOVE_NONE) + display_piece(p, x + i, y + j, MOVE_NONE); + } + } + } + } + } + } + } + + /* Plot explosions */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + + /* Plot growing explosion */ + if(isexplosion(mover.piece)) + display_piece(mover.piece + PIECE_EXPLOSION_NEW_FIRST - PIECE_EXPLOSION_FIRST, x, y, MOVE_NONE); + + /* Plot dying explosion */ + p = level_previous(x, y); + if(isexplosion(p) && display_animation < 1) + display_piece(p, x, y, MOVE_NONE); + } +} + +function display_piece(p, x, y, d) +{ + var op; + var sx, sy, sw, sh; + var dw, dh; + var xstart, xend, xpos, xsize; + var bimage = []; + var i; + var bsizex, bsizey, boffset; + + var px = x * graphics.width + graphics.offset_x; + var py = y * graphics.height + graphics.offset_y; + + if(p < PIECE_SPACE || p >= PIECE_MAX) + return; + + if(level.switched && (p == PIECE_WALL || p == PIECE_SPACE)) + p = PIECE_DARKNESS; + + op = p; + + if(d != MOVE_NONE + && p != PIECE_SPACE && !isexplosion(p) + && p != PIECE_TELEPORT + ) + { + if(d == MOVE_LEFT) + px = px + Math.floor((1 - display_animation) * graphics.width); + if(d == MOVE_RIGHT) + px = px - Math.floor((1 - display_animation) * graphics.width); + if(d == MOVE_UP) + py = py + Math.floor((1 - display_animation) * graphics.height); + if(d == MOVE_DOWN) + py = py - Math.floor((1 -display_animation) * graphics.height); + } + + + + if(isexplosion(p)) + screen.context.globalAlpha = 1 - display_animation; + else if(isnewexplosion(p)) + { + p += PIECE_EXPLOSION_FIRST - PIECE_EXPLOSION_NEW_FIRST; + screen.context.globalAlpha = display_animation; + } + else + screen.context.globalAlpha = 1; + + if(graphics.image[p] == null) + return; + + sx = 0; + sy = 0; + sw = graphics.width; + sh = graphics.height; + + if(graphics.image[p].width > graphics.width) + { + xstart = 0; + xend = graphics.image[p].width / graphics.width; + xsize = 1; + xpos = 0; + + if(graphics.image_flags[p] & GRAPHICS_BEVEL) + xend -= 4; + + if(graphics.image_flags[p] & GRAPHICS_BEVEL16) + xsize = 16; + + if(graphics.image_flags[p] & GRAPHICS_MOVER) + { + xsize = 5; + + if(d == MOVE_LEFT) + xpos += 1; + if(d == MOVE_UP) + xpos += 2; + if(d == MOVE_RIGHT) + xpos += 3; + if(d == MOVE_DOWN) + xpos += 4; + } + + if(graphics.image_flags[p] & GRAPHICS_LEVEL && level.level > 0) + { + xsize = 15; + xpos = level.level - 1; + } + + /* If we're plotting the players */ + if(p == PIECE_PLAYER_ONE || p == PIECE_PLAYER_TWO) + { + + /* and there's an image for the swapped player */ + if(xend > xstart + xsize) + { + /* then use it if the player is swapped out */ + if(level.player != (p & 1) && level.player != 2) + xpos += xsize; + } + } + + if(graphics.image_flags[p] & GRAPHICS_BEVEL16) + { + i = 15; + b = level_data(x, y) & BEVEL_ALL; + + if(b & BEVEL_U) + i -= 1; + if(b & BEVEL_R) + i -= 2; + if(b & BEVEL_D) + i -= 4; + if(b & BEVEL_L) + i -= 8; + + xpos += i; + } + + if(graphics.image_flags[p] & GRAPHICS_ANIMATE) + { + b = (xend - xstart) / xsize; + + if(!isexplosion(p)) + b = b * display_animation; + else + b = b * ((display_animation + (isnewexplosion(op) ? 0 : 1)) * 0.5); + + xpos += b * xsize; + } + else if(graphics.image_flags[p] & GRAPHICS_RANDOM) + { + b = (xend - xstart) / xsize; + + if(p == PIECE_SPACE) + b = (level_data(x, y) & 0xff) % b; + else + b = ((level_data(x, y) & 0xff00) / 0x100) % b; + + xpos += b * xsize; + } + else if(graphics.image_flags[p] & GRAPHICS_TILE) + { + b = x % ((xend - xstart) / xsize); + if(b < 0) + b += (xend - xstart) / xsize; + xpos += b * xsize; + + b = y % (graphics.image[p].height / graphics.height); + if(b < 0) + b += (graphics.image[p].height / graphics.height); + sy = b * graphics.height; + } + + sx = (xstart + xpos) * graphics.width; + } + + /* Plot piece */ + screen.context.drawImage(graphics.image[p], sx, sy, graphics.width, graphics.height, px, py, graphics.width, graphics.height); + + /* Plot bevelling */ + if(graphics.image_flags[p] & GRAPHICS_BEVEL) + { + b = level_data(x, y) & BEVEL_ALL; + + if(b != 0) + { + bsizex = graphics.width / 2; + bsizey = graphics.height / 2; + boffset = (xend - 1) * graphics.width; + + for(i = 0; i < 4; i ++) + bimage[i] = 0; + + if(b & BEVEL_L) + { + if(b & BEVEL_U) + bimage[0] = 3 * graphics.width; + else + bimage[0] = 1 * graphics.width; + + if(b & BEVEL_D) + bimage[2] = 3 * graphics.width; + else + bimage[2] = 1 * graphics.width; + } + else + { + if(b & BEVEL_U) + bimage[0] = 2 * graphics.width; + if(b & BEVEL_D) + bimage[2] = 2 * graphics.width; + } + + if(b & BEVEL_R) + { + if(b & BEVEL_U) + bimage[1] = 3 * graphics.width; + else + bimage[1] = 1 * graphics.width; + + if(b & BEVEL_D) + bimage[3] = 3 * graphics.width; + else + bimage[3] = 1 * graphics.width; + } + else + { + if(b & BEVEL_U) + bimage[1] = 2 * graphics.width; + if(b & BEVEL_D) + bimage[3] = 2 * graphics.width; + } + + if(b & BEVEL_TL) + bimage[0] = 4 * graphics.width; + if(b & BEVEL_TR) + bimage[1] = 4 * graphics.width; + if(b & BEVEL_BL) + bimage[2] = 4 * graphics.width; + if(b & BEVEL_BR) + bimage[3] = 4 * graphics.width; + + for(i = 0; i < 4; i ++) + { + if(bimage[i] != 0) + { + sx = boffset + bimage[i] + ((i & 1) ? bsizex : 0); + sy = (i & 2) ? bsizey : 0; + sw = bsizex; + sh = bsizey; + + screen.context.drawImage(graphics.image[p], sx, sy, sw, sh, px + ((i & 1) ? bsizex : 0), py + ((i & 2) ? bsizey : 0), bsizex, bsizey); + } + } + } + } + + screen.context.globalAlpha = 1; +} + +function displayshadowed_piecebase(x, y) +{ + var p; + var px, py; + var z; + var ok; + var b, bp; + var xend; + + var sx, sy, sw, sh; + var dx, dy, dw, dh; + var bsx, bsy, bsw, bsh; + var bdx, bdy, bdw, bdh; + var alpha; + + p = level_piece(x, y); + + if(level_moving(x, y) != MOVE_NONE) + { + if(display_animation >= 1) + p = PIECE_SPACE; + else + p = level_previous(x, y); + } + + if(level.switched && (p == PIECE_WALL || p == PIECE_SPACE)) + p = PIECE_DARKNESS; + + if(level.switched) + bp = PIECE_DARKNESS; + else + bp = PIECE_SPACE; + + image = graphics.image[bp]; + + px = x * graphics.width + graphics.offset_x; + py = y * graphics.height + graphics.offset_y; + + + sx = 0; + sy = 0; + sw = graphics.width; + sh = graphics.height; + + dx = px; + dy = py; + dw = graphics.width; + dh = graphics.height; + + /* Is the base tiled? */ + if(graphics.image_flags[bp] & GRAPHICS_TILE) + { + xend = image.width / graphics.width; + if(graphics.image_flags[bp] & GRAPHICS_BEVEL) + xend -= 4; + sx += graphics.width * (x % xend); + sy += graphics.height * (y % (image.height / graphics.height)); + } + + /* Plot the base */ + screen.context.globalAlpha = 1; + screen.context.drawImage(graphics.image[bp], sx, sy, sw, sh, dx, dy, dw, dh); + + /* Do we need to order the shadows prior to plotting? */ + if(graphics.flags & GRAPHICS_ZORDER) + { + graphics.shadows_sorted = []; + + for(s = 0; s < graphics.shadows.length; s ++) + { + shadow = graphics.shadows[s]; + + /* Determine which piece to consider the shadow of */ + p = level_piece(x - shadow.x, y - shadow.y); + if(level_moving(x - shadow.x, y - shadow.y) != MOVE_NONE) + { + if(display_animation >= 1) + p = PIECE_SPACE; + else + { + if(level_previousmoving(x - shadow.x, y - shadow.y) == MOVE_NONE) + p = level_previous(x - shadow.x, y - shadow.y); + else + p = PIECE_SPACE; + } + } + + if(p == PIECE_WALL && level.switched) + p = PIECE_DARKNESS; + + /* Does it have a shadow? */ + if(graphics.shadow_image[p] != null && (graphics.shadow_flags[p] & shadow.flag)) + { + z = graphics.shadow_z[p]; + shadow.z = graphics.shadow_z[p]; + shadow.p = p; + + graphics.shadows_sorted.push(shadow); + } + } + + graphics.shadows_sorted.sort(function(a, b) { return parseInt(a.z) - parseInt(b.z); }); + + } + else + { + /* Use the order specified in the graphics file */ + graphics.shadows_sorted = graphics.shadows; + } + + /* Plot shadows in order */ + for(var s = 0; s < graphics.shadows_sorted.length; s ++) + { + shadow = graphics.shadows_sorted[s]; + + /* Determine which piece to consider the shadow of */ + p = level_piece(x - shadow.x, y - shadow.y); + if(level_moving(x - shadow.x, y - shadow.y) != MOVE_NONE) + { + if(display_animation >= 1) + p = PIECE_SPACE; + else + { + if(level_previousmoving(x - shadow.x, y - shadow.y) == MOVE_NONE) + p = level_previous(x - shadow.x, y - shadow.y); + else + p = PIECE_SPACE; + } + } + /* Does it have a shadow? */ + if(graphics.shadow_image[p] != null && (graphics.shadow_flags[p] & shadow.flag)) + { + image = graphics.shadow_image[p]; + + if(isexplosion(p)) + screen.context.globalAlpha = 1 - display_animation; + else if(isnewexplosion(p)) + { + p += PIECE_EXPLOSION_FIRST - PIECE_EXPLOSION_NEW_FIRST; + screen.context.globalAlpha = display_animation; + } + else + screen.context.globalAlpha = 1; + + sx = graphics.shadow_start_x[p][shadow.shadow]; + sy = graphics.shadow_start_y[p][shadow.shadow]; + sw = graphics.shadow_width[p][shadow.shadow]; + sh = graphics.shadow_height[p][shadow.shadow]; + + dx = px + graphics.shadow_offset_x[p][shadow.shadow]; + dy = py + graphics.shadow_offset_y[p][shadow.shadow]; + dw = graphics.shadow_width[p][shadow.shadow]; + dh = graphics.shadow_height[p][shadow.shadow]; + + /* Are there multiple images? */ + if(image.width > graphics.shadow_width[p][9]) + { + /* Choose swapped player if necessary */ + if(p == PIECE_PLAYER_ONE || p == PIECE_PLAYER_TWO) + { + if(level.player != (p & 1) && level.player != 2) + sx += graphics.shadow_width[p][9]; + } + } + + /* Plot shadow */ + screen.context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh); + + /* Bevel shadow */ + if(graphics.image_flags[p] & GRAPHICS_BEVEL_SHADOW) + { + b = level_data(x - shadow.x, y - shadow.y) & BEVEL_ALL; + /* Top left quadrant */ + if(b & (BEVEL_L | BEVEL_U | BEVEL_TL)) + { + bsx = 0; + bsy = 0; + bsw = graphics.shadow_width[p][9] / 2; + bsh = graphics.shadow_height[p][9] / 2; + bdx = dx; + bdy = dy; + + ok = 1; + if(bsx < sx) + { + if(bsw > (sx - bsx)) + { + bsw -= (sx - bsx); + bdx -= bsx; + bsx = sx; + } + else + ok = 0; + } + if(bsy < sy) + { + if(bsh > (sy - bsy)) + { + bsh -= (sy - bsy); + bdy -= bsy; + bsy = sy; + } + else + ok = 0; + } + if(bdx + bsw > dx + dw) + { + if(bsw > ((bdx + bsw) - (dx + dw))) + bsw -= ((bdx + bsw) - (dx + dw)); + else + ok = 0; + } + if(bdy + bsh > dy + dh) + { + if(bsh > ((bdy + bsh) - (dy + dh))) + bsh -= ((bdy + bsh) - (dy + dh)); + else + ok = 0; + } + if(b & BEVEL_TL) + bsx += graphics.shadow_width[p][9] * 4; + else + { + if(b & BEVEL_U) + bsx += graphics.shadow_width[p][9] * 2; + if(b & BEVEL_L) + bsx += graphics.shadow_width[p][9]; + } + + if(ok) + screen.context.drawImage(image, bsx, bsy, bsw, bsh, bdx, bdy, bdw, bdh); + } + + /* Top right quadrant */ + if(b & (BEVEL_R | BEVEL_U | BEVEL_TR)) + { + bsx = graphics.shadow_width[p][9] / 2; + bsy = 0; + bsw = graphics.shadow_width[p][9] / 2; + bsh = graphics.shadow_height[p][9] / 2; + bdx = dx + graphics.width / 2; + bdy = dy; + + ok = 1; + if(bsx < sx) + { + if(bsw > (sx - bsx)) + { + bsw -= (sx - bsx); + bdx -= bsx; + bsx = sx; + } + else + ok = 0; + } + if(bsy < sy) + { + if(bsh > (sy - bsy)) + { + bsh -= (sy - bsy); + bdy -= bsy; + bsy = sy; + } + else + ok = 0; + } + if(bdx + bsw > dx + dw) + { + if(bsw > ((bdx + bsw) - (dx + dw))) + bsw -= ((bdx + bsw) - (dx + dw)); + else + ok = 0; + } + if(bdy + bsh > dy + dh) + { + if(bsh > ((bdy + bsh) - (dy + dh))) + bsh -= ((bdy + bsh) - (dy + dh)); + else + ok = 0; + } + if(b & BEVEL_TR) + bsx += graphics.shadow_width[p][9] * 4; + else + { + if(b & BEVEL_U) + bsx += graphics.shadow_width[p][9] * 2; + if(b & BEVEL_R) + bsx += graphics.shadow_width[p][9]; + } + if(ok) + screen.context.drawImage(image, bsx, bsy, bsw, bsh, bdx, bdy, bdw, bdh); + } + + /* Bottom left quadrant */ + if(b & (BEVEL_L | BEVEL_D | BEVEL_BL)) + { + bsx = 0; + bsy = graphics.shadow_height[p][9] / 2;; + bsw = graphics.shadow_width[p][9] / 2; + bsh = graphics.shadow_height[p][9] / 2; + bdx = dx; + bdy = dy + graphics.height / 2; + + ok = 1; + if(bsx < sx) + { + if(bsw > (sx - bsx)) + { + bsw -= (sx - bsx); + bdx -= bsx; + bsx = sx; + } + else + ok = 0; + } + if(bsy < sy) + { + if(bsh > (sy - bsy)) + { + bsh -= (sy - bsy); + bdy -= bsy; + bsy = sy; + } + else + ok = 0; + } + if(bdx + bsw > dx + dw) + { + if(bsw > ((bdx + bsw) - (dx + dw))) + bsw -= ((bdx + bsw) - (dx + dw)); + else + ok = 0; + } + if(bdy + bsh > dy + dh) + { + if(bsh > ((bdy + bsh) - (dy + dh))) + bsh -= ((bdy + bsh) - (dy + dh)); + else + ok = 0; + } + if(b & BEVEL_BL) + bsx += graphics.shadow_width[p][9] * 4; + else + { + if(b & BEVEL_D) + bsx += graphics.shadow_width[p][9] * 2; + if(b & BEVEL_L) + bsx += graphics.shadow_width[p][9]; + } + if(ok) + screen.context.drawImage(image, bsx, bsy, bsw, bsh, bdx, bdy, bdw, bdh); + } + + /* Bottom right quadrant */ + if(b & (BEVEL_R | BEVEL_D | BEVEL_BR)) + { + bsx = graphics.shadow_width[p][9] / 2; + bsy = graphics.shadow_height[p][9] / 2; + bsw = graphics.shadow_width[p][9] / 2; + bsh = graphics.shadow_height[p][9] / 2; + bdx = dx + graphics.width / 2; + bdy = dy + graphics.height / 2; + + ok = 1; + if(bsx < sx) + { + if(bsw > (sx - bsx)) + { + bsw -= (sx - bsx); + bdx -= bsx; + bsx = sx; + } + else + ok = 0; + } + if(bsy < sy) + { + if(bsh > (sy - bsy)) + { + bsh -= (sy - bsy); + bdy -= bsy; + bsy = sy; + } + else + ok = 0; + } + if(bdx + bsw > dx + dw) + { + if(bsw > ((bdx + bsw) - (dx + dw))) + bsw -= ((bdx + bsw) - (dx + dw)); + else + ok = 0; + } + if(bdy + bsh > dy + dh) + { + if(bsh > ((bdy + bsh) - (dy + dh))) + bsh -= ((bdy + bsh) - (dy + dh)); + else + ok = 0; + } + if(b & BEVEL_BR) + bsx += graphics.shadow_width[p][9] * 4; + else + { + if(b & BEVEL_D) + bsx += graphics.shadow_width[p][9] * 2; + if(b & BEVEL_R) + bsx += graphics.shadow_width[p][9]; + } + if(ok) + screen.context.drawImage(image, bsx, bsy, bsw, bsh, bdx, bdy, bdw, bdh); + } + } + } + } + + screen.context.globalAlpha = 1; +} + +function displayshadowed_movers() +{ + var x, y, p, pm; + var i, j; + var d; + var bevel; + var bevelold; + var sx, sy, sw, sh; + var dx, dy, dw, dh; + var mover; + + p = PIECE_SPACE; + + /* Stage one: plot base for pieces that need rebevelling */ + if(display_animation == 0 || display_animation == 1) + { + /* When undoing, we have to create the wall prior to rebevelling, as it + wouldn't otherwise exist until after the end of the animation. */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(mover.piece == PIECE_WALL) + level_setpiece(mover.x, mover.y, mover.piece); + } + + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + if(mover.piece == PIECE_WALL || + (isexplosion(mover.piece) && display_animation == 1)) + { + for(s = 0; s < graphics.shadows.length; s ++) + { + shadow = graphics.shadows[s]; + bevel = display_bevelsquare(x + shadow.x, y + shadow.y); + bevelold = (level_data(x + shadow.x, y + shadow.y) & BEVEL_ALL); + /* Because this happens only once per move cycle, we + are lazy and don't bother to count whether this base + has already been plotted */ + if(bevel != bevelold); + displayshadowed_piecebase(mover.x + shadow.x, mover.y + shadow.y); + } + } + } + } + + /* Stage two: plot shadows for stationary squares affected by movers */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(mover.piece != PIECE_GONE) + { + /* This is overkill, but it's easier just to plot everything that + could be affected than to calculate what is actually affected. + */ + + for(s = 0; s < graphics.shadows.length; s ++) + { + shadow = graphics.shadows[s]; + if(displayshadowed_count(mover.x + shadow.x, mover.y + shadow.y, 1) == 0) + displayshadowed_piecebase(mover.x + shadow.x, mover.y + shadow.y); + } + if(displayshadowed_count(mover.x, mover.y, 1) == 0) + displayshadowed_piecebase(mover.x, mover.y); + } + + } + /* then reset the counts */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + if(mover.piece != PIECE_GONE) + { + for(s = 0; s < graphics.shadows.length; s ++) + { + shadow = graphics.shadows[s]; + + displayshadowed_count(mover.x + shadow.x, mover.y + shadow.y, -1); + } + displayshadowed_count(mover.x, mover.y, -1); + } + } + + /* Stage three: plot shadows for movers */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + d = mover.direction; + x = mover.x; + y = mover.y; + + if(isexplosion(mover.piece)) + { + /* If the previous piece, that is, the piece destroyed in the + explosion, is stationary, we don't need to plot a shadow for it, + as that is handled in stage one. If it is moving, however, it + needs a moving shadow, which we do have to plot here. */ + p = level_previous(x, y); + pm = level_previousmoving(x, y); + if(p != PIECE_SPACE && pm != MOVE_NONE) + displayshadowed_pieceshadow(p, x, y, pm); + + /* Plot shadow for the detonator */ + p = level_detonator(x, y); + pm = level_detonatormoving(x, y); + if(p != PIECE_SPACE) + displayshadowed_pieceshadow(p, x, y, pm); + + } + /* Spaces and walls were handled in stage one */ + else if(mover.piece != PIECE_SPACE && mover.piece != PIECE_WALL && mover.piece != PIECE_GONE) + { + /* We don't need to plot the shadow for the previous piece + as that is handled in stage one */ + + /* Plot shadow for mover */ + if(mover.piece == PIECE_TELEPORT) + d = MOVE_NONE; + + displayshadowed_pieceshadow(mover.piece, mover.x, mover.y, d); + } + } + + /* Stage four: plot shadows for explosions */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + /* Plot growing explosion */ + if(isexplosion(mover.piece)) + displayshadowed_pieceshadow(mover.piece + PIECE_EXPLOSION_NEW_FIRST - PIECE_EXPLOSION_FIRST, x, y, MOVE_NONE); + + /* Plot dying explosion */ + p = level_previous(x, y); + if(isexplosion(p) && display_animation < 1) + displayshadowed_pieceshadow(p, x, y, MOVE_NONE); + } + + /* Stage five: plot pieces for stationary squares affected by movers. + We need to be careful not to plot the same piece twice, so we keep + count and only plot on the first occurrence. */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + for(s = 0; s < graphics.shadows.length; s ++) + { + shadow = graphics.shadows[s]; + if(displayshadowed_count(mover.x + shadow.x, mover.y + shadow.y, 1) == 0) + { + p = level_piece(mover.x + shadow.x, mover.y + shadow.y); + pm = level_moving(mover.x + shadow.x, mover.y + shadow.y); + if(p != PIECE_SPACE && p != PIECE_GONE && pm == MOVE_NONE) + display_piece(p, mover.x + shadow.x, mover.y + shadow.y, MOVE_NONE); + } + } + } + /* then reset the counts */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + for(s = 0; s < graphics.shadows.length; s ++) + { + shadow = graphics.shadows[s]; + displayshadowed_count(mover.x + shadow.x, mover.y + shadow.y, -1); + } + } + + /* Stage six: plot pieces for movers */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + d = mover.direction; + x = mover.x; + y = mover.y; + + if(isexplosion(mover.piece)) + { + /* Plot any piece destroyed by the explosion, or the bomb itself */ + p = level_previous(x, y); + pm = level_previousmoving(x, y); + if(p != PIECE_SPACE) + display_piece(p, x, y, pm); + + /* Plot the detonator */ + p = level_detonator(x, y); + pm = level_detonatormoving(x, y); + if(p != PIECE_SPACE) + display_piece(p, x, y, pm); + + } + /* Spaces were handled in stage one */ + else if(mover.piece != PIECE_SPACE && mover.piece != PIECE_GONE) + { + if(display_animation < 1) + { + /* Pieces being collected, earth being eaten */ + p = level_previous(x, y); + pm = level_previousmoving(x, y); + if((p != PIECE_SPACE && !isexplosion(p) && pm == MOVE_NONE) || mover.piece == PIECE_TELEPORT) + display_piece(p, x, y, pm); + } + + /* Plot the piece itself */ + if(mover.piece == PIECE_TELEPORT) + d = MOVE_NONE; + + display_piece(mover.piece, mover.x, mover.y, d); + } + pmover = mover.next; + } + + /* Stage seven: plot pieces that need rebevelling */ + if(display_animation == 0 || display_animation == 1) + { + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + if(mover.piece == PIECE_WALL || + (isexplosion(mover.piece) && display_animation == 1)) + { + for(i = -1; i < 2; i ++) + { + for(j = - 1; j < 2; j ++) + { + bevel = display_bevelsquare(x + i, y + j); + bevelold = (level_data(x + i, y + j) & BEVEL_ALL); + if(bevel != bevelold); + { + /* Here we are not lazy, to avoid issues with + transparent graphics being plotted twice */ + if(displayshadowed_count(mover.x + i, mover.y + j, 1) == 0) + { + level_setdata(x + i, y + j, bevel | (level_data(x + i, y + j) & ~BEVEL_ALL)); + p = level_piece(x + i, y + j); + if(p == PIECE_WALL) + display_piece(p, mover.x + i, mover.y + j, MOVE_NONE); + level_setdata(x + i, y + j, bevelold | (level_data(x + i, y + j) & ~BEVEL_ALL)); + } + } + } + } + } + } + /* and reset counts */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + if(mover.piece == PIECE_WALL || + (isexplosion(mover.piece) && display_animation == 1)) + { + for(i = -1; i < 2; i ++) + { + for(j = - 1; j < 2; j ++) + { + bevel = display_bevelsquare(x + i, y + j); + bevelold = (level_data(x + i, y + j) & BEVEL_ALL); + if(bevel != bevelold); + displayshadowed_count(mover.x + i, mover.y + j, -1); + } + } + } + } + } + + + /* Stage eight: plot pieces for explosions */ + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + /* Plot growing explosion */ + if(isexplosion(mover.piece)) + display_piece(mover.piece + PIECE_EXPLOSION_NEW_FIRST - PIECE_EXPLOSION_FIRST, x, y, MOVE_NONE); + + /* Plot dying explosion */ + p = level_previous(x, y); + if(isexplosion(p) && display_animation < 1) + display_piece(p, x, y, MOVE_NONE); + } + + /* Stage nine: rebevel pieces that need rebevelling */ + if(display_animation == 0 || display_animation == 1) + { + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + x = mover.x; + y = mover.y; + if(mover.piece == PIECE_WALL || (isexplosion(mover.piece) && display_animation == 1)) + { + for(i = -1; i < 2; i ++) + { + for(j = - 1; j < 2; j ++) + { + bevel = display_bevelsquare(x + i, y + j); + bevelold = (level_data(x + i, y + j) & BEVEL_ALL); + if(bevel != bevelold); + { + /* Again, we are lazy and do not keep count of + whether this square has already been rebevelled. */ + level_setdata(x + i, y + j, bevel | (level_data(x + i, y + j) & ~BEVEL_ALL)); + } + } + } + } + } + } +} + +function displayshadowed_count(x, y, delta) +{ + var d = level_data(x, y); + level_setdata(x, y, d + (delta * SHADOW_BASE)); + + return d & (0x7f * SHADOW_BASE); +} + +function displayshadowed_pieceshadow(p, x, y, d) +{ + var px, py; + var image; + var sx, sy, sw, sh; + var dx, dy, dw, dh; + + if(isexplosion(p)) + screen.context.globalAlpha = 1 - display_animation; + else if(isnewexplosion(p)) + { + p += PIECE_EXPLOSION_FIRST - PIECE_EXPLOSION_NEW_FIRST; + screen.context.globalAlpha = display_animation; + } + else + screen.context.globalAlpha = 1; + + image = graphics.shadow_image[p]; + if(image == null) + return; + + px = x * graphics.width + graphics.offset_x; + py = y * graphics.height + graphics.offset_y; + + if(d == MOVE_LEFT) + px = px + Math.floor((1 - display_animation) * graphics.width); + if(d == MOVE_RIGHT) + px = px - Math.floor((1 - display_animation) * graphics.width); + if(d == MOVE_UP) + py = py + Math.floor((1 - display_animation) * graphics.height); + if(d == MOVE_DOWN) + py = py - Math.floor((1 -display_animation) * graphics.height); + + + sx = 0; + sy = 0; + sw = graphics.shadow_width[p][9]; + sh = graphics.shadow_height[p][9]; + + dx = px + graphics.shadow_offset_x[p][9]; + dy = py + graphics.shadow_offset_y[p][9]; + dw = sw; + dh = sh; + + if(image.width > graphics.shadow_width[p][9]) + { + if(p == PIECE_PLAYER_ONE || p == PIECE_PLAYER_TWO) + { + if(level.player != (p & 1)) + sx = graphics.shadow_width[p][9]; + } + } + + /* Plot piece */ + screen.context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh); + + screen.context.globalAlpha = 1; +} + +function display_start_update() +{ + graphics.time_start = Date.now(); + + display_animation = 0; + display_movers(); + + window.requestAnimationFrame(display_update); +} + +function display_update() +{ + var t = Date.now(); + + /* Calculate what the delay should be, defaulting to the Move Speed. */ + var delay = options.move_delay; + + if(level_replay != null) + delay = options.replay_delay; + else + { + for(m = 0; m < level.movers.length; m ++) + { + mover = level.movers[m]; + + /* Use the Player Speed if the player is still moving */ + if(mover.piece == PIECE_PLAYER_ONE || mover.piece == PIECE_PLAYER_TWO) + delay = options.player_delay; + /* unless there's a piece following in their trail */ + else if(mover.piece != PIECE_SPACE && mover.fast == 1) + delay = options.move_delay; + } + + /* If we're undoing, use the Undo Speed */ + if(level.flags & LEVELFLAG_UNDO) + delay = options.undo_delay; + } + + /* If SHIFT is pressed, speed things up. */ + if(graphics.shift) + delay = delay / 10; + /* If CTRL is pressed, slow things down. */ + if(graphics.ctrl) + delay = delay * 4; + + /* If the delay has changed, preserve our position in the animation */ + if(delay != options.previous_delay) + { + if(options.previous_delay != 0) + graphics.time_start = t - (((t - graphics.time_start) * delay) / options.previous_delay); + options.previous_delay = delay; + } + + if(t < graphics.time_start + delay) + display_animation = (t - graphics.time_start) / delay; + else + display_animation = 1; + + if(level.flags & LEVELFLAG_SWITCH) + { + display_level(); + level.flags &= ~LEVELFLAG_SWITCH; + } + + display_movers(); + + if(display_animation != 1) + window.requestAnimationFrame(display_update); + else + { + if(level.flags & LEVELFLAG_STARS || level.flags & LEVELFLAG_EXIT) + { + display_stars(); + level.flags &= ~LEVELFLAG_STARS; + } + + if(level.flags & LEVELFLAG_MAP) + { + display_map(); + level.flags &= ~LEVELFLAG_MAP; + } + + if(level.flags & LEVELFLAG_MOVES) + { + display_moves(); + level.flags &= ~LEVELFLAG_MOVES; + } + + if(level.flags & LEVELFLAG_EXIT) + { + level.flags |= LEVELFLAG_SOLVED; + } + + if(!(level.flags & LEVELFLAG_UNDO)) + { + level_evolve(); + level_storemovers(); + + if(display_focus()) + display_level(); + + if(level.movers.length > 0) + display_start_update(); + else + { + if(level_replay != null) + consider_replay_move(); + else + consider_mouse_move(); + } + } + else + { + if(level_undo()) + { + level.flags |= LEVELFLAG_UNDO; + } + else + level.flags &= ~LEVELFLAG_UNDO; + + if(level_replay != null) + consider_replay_move(); + else + consider_mouse_move(); + + if(display_focus()) + display_level(); + + display_start_update(); + + if(level_replay != null) + consider_replay_move(); + } + + } +} + +function display_bevelsquare(x, y) +{ + var bevel = 0; + + bevel = 0; + + if(level_piece(x, y) == PIECE_WALL) + { + if(level_piece(x - 1, y) != PIECE_WALL) + bevel |= BEVEL_L; + if(level_piece(x + 1, y) != PIECE_WALL) + bevel |= BEVEL_R; + if(level_piece(x, y - 1) != PIECE_WALL) + bevel |= BEVEL_U; + if(level_piece(x, y + 1) != PIECE_WALL) + bevel |= BEVEL_D; + + if(((bevel & (BEVEL_L | BEVEL_U)) == 0) && level_piece(x - 1, y - 1) != PIECE_WALL) + bevel |= BEVEL_TL; + if(((bevel & (BEVEL_R | BEVEL_U)) == 0) && level_piece(x + 1, y - 1) != PIECE_WALL) + bevel |= BEVEL_TR; + if(((bevel & (BEVEL_L | BEVEL_D)) == 0) && level_piece(x - 1, y + 1) != PIECE_WALL) + bevel |= BEVEL_BL; + if(((bevel & (BEVEL_R | BEVEL_D)) == 0) && level_piece(x + 1, y + 1) != PIECE_WALL) + bevel |= BEVEL_BR; + } + else + { + if(level_piece(x - 1, y) == PIECE_WALL) + bevel |= BEVEL_L; + if(level_piece(x + 1, y) == PIECE_WALL) + bevel |= BEVEL_R; + if(level_piece(x, y - 1) == PIECE_WALL) + bevel |= BEVEL_U; + if(level_piece(x, y + 1) == PIECE_WALL) + bevel |= BEVEL_D; + + if(((bevel & (BEVEL_L | BEVEL_U)) == 0) && level_piece(x - 1, y - 1) == PIECE_WALL) + bevel |= BEVEL_TL; + if(((bevel & (BEVEL_R | BEVEL_U)) == 0) && level_piece(x + 1, y - 1) == PIECE_WALL) + bevel |= BEVEL_TR; + if(((bevel & (BEVEL_L | BEVEL_D)) == 0) && level_piece(x - 1, y + 1) == PIECE_WALL) + bevel |= BEVEL_BL; + if(((bevel & (BEVEL_R | BEVEL_D)) == 0) && level_piece(x + 1, y + 1) == PIECE_WALL) + bevel |= BEVEL_BR; + } + + return bevel; +} + +function display_bevellevel() +{ + var bevel; + var x, y; + + for(x = 0; x < level.width; x ++) + { + for(y = 0; y < level.height; y ++) + { + bevel = level_data(x, y) & ~BEVEL_ALL; + bevel = bevel | display_bevelsquare(x, y); + level_setdata(x, y, bevel); + } + } +} + +function display_moves() +{ + var str; + var line_offset; + var x; + + if(screen.bar.lines == 1) + line_offset = 0; + else + line_offset = 1 * screen.bar.height; + + if(level_replay != null) + { + if(level_replay.flags & LEVELFLAG_PAUSED) + str = "\u25a0"; + else if(level_replay.flags & LEVELFLAG_UNDO) + str = "\u25c2"; + else + str = "\u25b8"; + + str += " "+level.moves.length + "/" + level_replay.moves.length; + } + else if(level.flags & LEVELFLAG_FAILED) + str = "failed"; + else if(level.redoable_moves.length != 0) + str = level.moves.length + "/" + (level.moves.length + level.redoable_moves.length); + else + str = level.moves.length; + + str = " " + str + " "; + + screen.bar.context.font = screen.bar.height + "px " + font_name; + + var text = screen.bar.context.measureText(str); + if(screen.bar.move_width < text.width) + screen.bar.move_width = text.width; + + if(screen.bar.lines == 1) + x = screen.bar.width - graphics.small_width - screen.bar.move_width; + else + x = 0; + + screen.bar.context.fillStyle = "#000000"; + screen.bar.context.fillRect(x, line_offset, screen.bar.move_width + graphics.small_width, screen.bar.height); + + screen.bar.move_width = text.width; + + if(screen.bar.lines == 1) + x = screen.bar.width - graphics.small_width - text.width; + else + x = graphics.small_width; + + screen.bar.context.lineWidth = screen.bar.height / 16; + screen.bar.context.strokeStyle= "#0080ff"; + screen.bar.context.strokeText(str, x, line_offset + screen.bar.height - screen.bar.height / 8); + + screen.bar.context.fillStyle = "#66b3ff"; + screen.bar.context.fillText(str, x, line_offset + screen.bar.height - screen.bar.height / 8); + + var sx = 0; + /* If there is a second small image, use it for a dead player */ + if(!level.alive[level.player] && graphics.small_image[PIECE_PLAYER_ONE + level.player].width > graphics.small_width) + sx = graphics.small_width; + if(graphics.image_flags[PIECE_PLAYER_ONE + level.player] & GRAPHICS_LEVEL && level.level > 0) + sx = graphics.small_width * (level.level - 1); + + if(screen.bar.lines == 1) + x = screen.bar.width - graphics.small_width; + else + x = 0; + + if(graphics.small_image[PIECE_PLAYER_ONE + level.player] != null) + screen.bar.context.drawImage(graphics.small_image[PIECE_PLAYER_ONE + level.player], sx, 0, graphics.small_width, graphics.small_height, x, line_offset + (screen.bar.height / 2) - (graphics.small_height / 2), graphics.small_width, graphics.small_height); + +} + +function display_stars() +{ + var str; + var line_offset; + + if(screen.bar.lines == 1) + line_offset = 0; + else + line_offset = 0 * screen.bar.height; + + if(level.flags & LEVELFLAG_EXIT) + str = "solved"; + else if(level.stars_exploded != 0) + str = level.stars_exploded + " lost"; + else + str = level.stars_caught + "/" + level.stars_total; + + str = " " + str + " "; + + screen.bar.context.font = screen.bar.height + "px " + font_name; + + var text = screen.bar.context.measureText(str); + if(screen.bar.stars_width < text.width) + screen.bar.stars_width = text.width; + + screen.bar.context.fillStyle = "#000000"; + screen.bar.context.fillRect(0, line_offset, graphics.small_width + screen.bar.stars_width, screen.bar.height); + + screen.bar.stars_width = text.width; + + screen.bar.context.lineWidth = screen.bar.height / 16; + screen.bar.context.strokeStyle= "#ffa000"; + screen.bar.context.strokeText(str, graphics.small_width, line_offset + screen.bar.height - screen.bar.height / 8); + + screen.bar.context.fillStyle = "#ffff33"; + screen.bar.context.fillText(str, graphics.small_width, line_offset + screen.bar.height - screen.bar.height / 8); + + var p = PIECE_STAR; + + if(level.flags & LEVELFLAG_EXIT && !(level.flags & LEVELFLAG_FAILED) && graphics.small_image[PIECE_DOOR] != null) + p = PIECE_DOOR; + + var sx = 0; + if(graphics.image_flags[p] & GRAPHICS_LEVEL && level.level > 0) + sx = graphics.small_width * (level.level - 1); + + if(graphics.small_image[p] != null) + screen.bar.context.drawImage(graphics.small_image[p], sx, 0, graphics.small_width, graphics.small_height, 0, line_offset + (screen.bar.height / 2) - (graphics.small_height / 2), graphics.small_width, graphics.small_height) + +} + +function display_focus() +{ + if(level == null) + return; + + if(level.mode == MODE_XOR && options.xor_display) + { + ox = graphics.offset_x; + oy = graphics.offset_y; + + graphics.offset_x = 0; + graphics.offset_y = 0; + + graphics.offset_x -= level.view_x[level.player] * graphics.width; + graphics.offset_y -= level.view_y[level.player] * graphics.height; + + if(graphics.offset_x != ox || graphics.offset_y != oy) + return 1; + else + return 0; + } + + px = level.player_x[level.player] * graphics.width; + py = level.player_y[level.player] * graphics.height; + ox = graphics.offset_x; + oy = graphics.offset_y; + + display_border_x = graphics.width * 3; + display_border_y = graphics.height * 3; + + for(var i = 1; i < 4; i ++) + { + if(graphics.width * i < screen.width / 2) + display_border_x = graphics.width * i; + if(graphics.height * i < screen.height / 2) + display_border_y = graphics.height * i; + } + + maxx = (level.width * graphics.width - screen.width); + maxy = (level.height * graphics.height - screen.height); + + if((level.width - 1) * graphics.width < screen.width) + { + graphics.offset_x = (screen.width - (level.width * graphics.width)) / 2; + } + else + { + if(px < -(graphics.offset_x - display_border_x)) + graphics.offset_x = -(px - display_border_x); + if(px >= -(graphics.offset_x - screen.width + display_border_x + graphics.width)) + graphics.offset_x = -(px - screen.width + display_border_x + graphics.width); + + if(graphics.offset_x > 0) + graphics.offset_x = 0; + if(graphics.offset_x < -maxx) + graphics.offset_x = -maxx; + + } + + if((level.height - 1) * graphics.height < screen.height) + { + graphics.offset_y = (screen.height - (level.height * graphics.height)) / 2; + } + else + { + if(py < -(graphics.offset_y - display_border_y)) + graphics.offset_y = -(py - display_border_y); + if(py >= -(graphics.offset_y - screen.height + display_border_y + graphics.height)) + graphics.offset_y = -(py - screen.height + display_border_y + graphics.height); + + if(graphics.offset_y > 0) + graphics.offset_y = 0; + if(graphics.offset_y < -maxy) + graphics.offset_y = -maxy; + } + + graphics.offset_x = Math.floor(graphics.offset_x); + graphics.offset_y = Math.floor(graphics.offset_y); + + if(graphics.offset_x != ox || graphics.offset_y != oy) + return 1; + else + return 0; +} + +function display_map() +{ + graphics.map_colours = []; + + for(var x = 0; x < level.width; x ++) + { + for(var y = 0; y < level.height; y ++) + { + display_map_piece(x, y); + } + } +} + +function display_map_piece(x, y) +{ + var c = "#ffffff"; + var p = PIECE_SPACE; + + var ok = false; + + if(x < level.width / 2 && y < level.width / 2 && level.mapped & MAPPED_TOP_LEFT) + ok = true; + if(x >= level.width / 2 && y < level.width / 2 && level.mapped & MAPPED_TOP_RIGHT) + ok = true; + if(x < level.width / 2 && y >= level.width / 2 && level.mapped & MAPPED_BOTTOM_LEFT) + ok = true; + if(x >= level.width / 2 && y >= level.width / 2 && level.mapped & MAPPED_BOTTOM_RIGHT) + ok = true; + + if(ok) + { + p = level_piece(x, y); + + if(p != PIECE_WALL && p != PIECE_STAR && p != PIECE_DOOR) + p = PIECE_SPACE; + } + + if(graphics.map_colours[p] == null) + { + var context = graphics.image[p].getContext("2d"); + var r = 0; + var g = 0; + var b = 0; + var a = 1; + for(var i = 0; i < 24; i += 1) + { + for(var j = 0; j < 24; j += 1) + { + var px = (i + 0.5) * graphics.width / 24; + var py = (j + 0.5) * graphics.height / 24; + + if(graphics.image_flags[p] & GRAPHICS_LEVEL && level.level > 0) + px += (level.level - 1) * graphics.width; + var data = context.getImageData(Math.floor(px), Math.floor(py), 1, 1).data; + + r += data[0]; + g += data[1]; + b += data[2]; + a += data[3]; + } + } + colour = "#" + (Math.floor((r/a)*16).toString(16)) + (Math.floor((g/a)*16).toString(16)) + (Math.floor((b/a)*16).toString(16)); + graphics.map_colours[p] = colour; + } + + screen.map.context.fillStyle = graphics.map_colours[p]; + screen.map.context.fillRect(x * screen.map.pixel_width, y * screen.map.pixel_height, screen.map.pixel_width, screen.map.pixel_height); +} + +function main_menu() +{ + level = null; + level_replay = null; + + menu_new(""); + + var sets = levels.dom.getElementsByTagName("set"); + + + menu_section("Instructions"); + menu_new_entry("H", "How to Play", null, null, null, instructions_menu, null); + + menu_section("Chroma"); + + var other = false; + + for(var s = 0; s < sets.length; s ++) + { + if(sets[s].getAttribute("type") != "chroma" && other == false) + { + menu_section("Other Games"); + other = true; + } + + if(sets[s].getAttribute("hidden") == null || options.show_hidden) + menu_new_entry(sets[s].getAttribute("key"), sets[s].getAttribute("title"), null, null, sets[s].getAttribute("subtitle"), level_set_menu, s); + + } + + /* Are there saved positions? */ + var ok = false; + for(var i = 0; i < localStorage.length; i ++) + { + if(a = localStorage.key(i).match(/^save-(\w+)/)) + { + ok = true; + break; + } + } + + if(ok) + { + menu_section("Saved Positions"); + + menu_new_entry("S", "Saved Positions", null, null, null, saved_positions_menu, ""); + } + + menu_section("Preferences"); + + menu_new_entry("P", "Preferences", null, null, null, preferences_menu, null); + + menu_show(true); + +} + +function level_set_menu() +{ + var sets = levels.dom.getElementsByTagName("set"); + var set = sets[this.dataset.data]; + var ok; + + menu_new("Choose a Level"); + + menu_new_entry("Q", "Return to previous menu", null, null, null, main_menu, null); + menu_new_spacer(); + + var levs = set.getElementsByTagName("level"); + + for(var l = 0; l < levs.length; l ++) + { + ok = true; + if(levs[l].getAttribute("broken") != null) + { + ok = false; + if(levs[l].getAttribute("broken") == "yes" && !options.xor_fix) + ok = true; + if(levs[l].getAttribute("broken") == "no" && options.xor_fix) + ok = true; + } + if(ok) + menu_new_entry(levs[l].getAttribute("key"), levs[l].getAttribute("title"), null, null, null, play_level, levs[l].childNodes[0].nodeValue); + } + + menu_show(true); +} + +function play_level() +{ + level = level_from_string(this.dataset.data); + + revert = new Object; + revert.data = this.dataset.data; + revert.moves = level.moves.length; + + display_bevellevel(); + graphics_render(); +} + +function game_menu() +{ + menu_new("Game Options"); + + menu_new_entry("Q", "Return to Level", null, null, null, game_return, null); + menu_new_entry("A", "Abort Level and Return to Main Menu", null, null, null, main_menu, null); + menu_new_entry("V", "Revert to Original Position", level.moves.length == revert.moves ? "(only after changes)" : "", null, null, level.moves.length == revert.moves ? null : revert_level, null); + menu_new_spacer(); + menu_new_entry("L", "Load Position", null, null, null, load_position, null); + menu_new_entry("S", "Save Position", level.movers.length != 0 ? "(not while pieces in motion)" : options.storage ? "" : "(in Private Browsing mode, saved positions will be lost when the browser is closed - use Preferences / Export to save them to a file)", null, null, level.movers.length != 0 ? null : save_position, null); + menu_new_spacer(); + + if(level_replay == null) + menu_new_entry("R", "Replay Saved Position", level.moves.length != 0 ? "(only at start of level)" : "", null, null, level.moves.length != 0 ? null : load_replay_position, null); + else + menu_new_entry("T", "Stop Replaying Position", null, null, null, stop_replay, null); + + menu_new_spacer(); + menu_new_entry("P", "Preferences", null, null, null, preferences_menu, null); + + menu_show(true); +} + +function revert_level() +{ + level = level_from_string(revert.data); + display_bevellevel(); + + graphics_render(); +} + +function instructions_menu() +{ + menu_new("How to Play") + + menu_new_entry("Q", "Return to previous menu", null, null, null, quit_instructions_menu, null); + + document.getElementById("instructions").style.display = "block"; +} + +function quit_instructions_menu() +{ + document.getElementById("instructions").style.display = "none"; + main_menu(); +} + +function preferences_menu() +{ + menu_new("Preferences") + + if(level != null) + menu_new_entry("Q", "Return to Level", null, null, null, quit_preferences_menu, null); + else + menu_new_entry("Q", "Return to Main Menu", null, null, null, quit_preferences_menu, null); + + menu_new_spacer(); + + menu_new_select("K", "Show On-screen Keypad", "show_keypad", options.keypad, "no", "yes"); + + menu_section("Graphics Scheme"); + + var item = document.createElement("div"); + item.className = "item-options"; + item.id = "sets"; + + for(var s=0; s < graphics_sets.length; s ++) + { + var option = document.createElement("div"); + option.className = "option has-key four"; + + if(graphics_sets[s].set != "xor") + { + if(graphics_sets[s].set == options.graphics) + option.classList.add("selected"); + } + else + { + if(options.graphics_xor) + option.classList.add("selected"); + option.classList.add("other"); + option.id = "xor"; + } + item.appendChild(option); + + var div = document.createElement("div"); + div.className = "key"; + div.textContent = graphics_sets[s].key; + option.appendChild(div); + + var t = document.createTextNode(graphics_sets[s].title); + option.appendChild(t); + + var div = document.createElement("img"); + div.src = graphics_sets[s].preview; + option.appendChild(div); + + if(graphics_sets[s].set == "xor") + { + var t = document.createTextNode("for XOR levels"); + option.appendChild(t); + } + + option.dataset.data = graphics_sets[s].set; + option.dataset.key = graphics_sets[s].key; + option.onclick = set_graphics_set; + + } + + document.getElementById("items").appendChild(item); + + menu_section("Graphics Size"); + + var item = document.createElement("div"); + item.className = "item-options"; + item.id = "sizes"; + + for(var s=0; s < graphics_sizes.length; s ++) + { + var option = document.createElement("div"); + option.className = "option has-key three"; + if(graphics_sizes[s].size == options.graphics_size) + option.classList.add("selected"); + item.appendChild(option); + + var div = document.createElement("div"); + div.className = "key"; + div.textContent = graphics_sizes[s].key; + option.appendChild(div); + + var t = document.createTextNode(graphics_sizes[s].title); + option.appendChild(t); + + + if(graphics_sizes[s].size == -1) + { + t = document.createElement("input"); + t.type = "number"; + t.value = options.graphics_custom_size; + t.id = "custom-number"; + option.appendChild(t); + option.id = "custom"; + + option.onclick = custom_graphics_size; + } + else + option.onclick = set_graphics_size; + + option.dataset.data = graphics_sizes[s].size; + option.dataset.key = graphics_sizes[s].key; + } + + document.getElementById("items").appendChild(item); + + menu_section("Speeds"); + + menu_slider("P", "Player Speed", "player", options.player_delay); + menu_slider("V", "Move Speed", "move", options.move_delay); + menu_slider("U", "Undo Speed", "undo", options.undo_delay); + menu_slider("R", "Replay Speed", "replay", options.replay_delay); + + if(options.others) + { + menu_section("Other Game Options"); + + menu_new_select("L", "XOR Display", "xor_display", options.xor_display, "full", "partial"); + menu_new_select("O", "XOR Engine", "xor_engine", options.xor_engine, "approximate", "exact"); + menu_new_select("B", "XOR Procyon Levels", "xor_fix", options.xor_fix, "broken", "fixed"); + + menu_new_spacer(); + + menu_new_select("E", "Enigma Engine", "enigma_engine", options.enigma_engine, "approximate", "exact"); + } + + menu_section("Save and Restore"); + + menu_new_entry("S", "Save Preferences", null, options.storage ? "" : "(in Private Browsing mode, preferences will be lost when the browser is closed - use Export to save them to a file)", null, save_preferences, null); + + menu_new_entry("I", "Import and Export Preferences and Saved Positions", null, null, null, import_export_menu, null); + + menu_new_entry("D", "Restore Defaults", null, null, null, restore_default_preferences, null); + + menu_show(true); +} + +function menu_section(title) +{ + var heading = document.createElement("h2"); + heading.textContent = title; + document.getElementById("items").appendChild(heading); +} + +function menu_slider(key, title, prefix, value) +{ + var item = document.createElement("div"); + item.className = "item has-key"; + + var div = document.createElement("div"); + div.className = "key"; + div.textContent = key; + item.appendChild(div); + item.dataset.key = key; + item.onclick = clicked_slider; + + var inner = document.createElement("div"); + inner.className = "item-slider"; + + var t = document.createElement("div"); + t.className = "title"; + t.textContent = title; + inner.appendChild(t); + + var slider = document.createElement("input"); + slider.type = "range"; + slider.className = "slider"; + slider.id = prefix+"-slider"; + slider.min = 0; + slider.max = 140; + slider.value = number_to_slider(value); + slider.onchange = slider_change; + slider.oninput = slider_change; + inner.appendChild(slider); + + var number = document.createElement("input"); + number.type= "number"; + number.className = "number"; + number.id = prefix+"-number"; + number.min = 0; + number.max = 10000; + number.value = value; + number.onchange = number_change; + inner.appendChild(number); + + var div = document.createElement("div"); + div.className = "clear"; + inner.appendChild(div); + + item.appendChild(inner); + + document.getElementById("items").appendChild(item); +} + +function clicked_slider() +{ + this.getElementsByTagName("input")[0].focus(); +} + +function slider_change() +{ + id = this.id; + id = id.replace("slider", "number"); + + document.getElementById(id).value = slider_to_number(this.value); +} + +function slider_to_number(s) +{ + var p = s % 35; + var t = Math.floor(s/35); + + return slider_positions[p] * Math.pow(10, t); +} + +function number_to_slider(n) +{ + var t = 0; + var p = 0; + + while(n >= 10) + { + n = n /10; + t ++; + } + + for(var i = 0; i < 35; i ++) + { + if(n >= slider_positions[i]) + p = i; + } + + return t * 35 + p; +} + +function number_change() +{ + id = this.id; + id = id.replace("number", "slider"); + + document.getElementById(id).value = number_to_slider(this.value); +} + +function menu_new_select(key, title, prefix, value, no, yes) +{ + var item = document.createElement("div"); + item.className = "item has-key"; + + var div = document.createElement("div"); + div.className = "key"; + div.textContent = key; + item.appendChild(div); + item.dataset.key = key; + item.onclick = clicked_select; + + var inner = document.createElement("div"); + inner.className = "item-text"; + + var t = document.createTextNode(title); + inner.appendChild(t); + + var select = document.createElement("select"); + select.id = prefix; + var option = document.createElement("option"); + option.textContent = no; + option.value = 0; + option.selected = (value == false); + select.appendChild(option); + + var option = document.createElement("option"); + option.textContent = yes; + option.value = 1; + option.selected = (value == true); + select.appendChild(option); + + inner.appendChild(select); + + item.appendChild(inner); + + document.getElementById("items").appendChild(item); +} + +function clicked_select() +{ + this.getElementsByTagName("select")[0].focus(); +} + +function set_graphics_set() +{ + if(this.dataset.data != "xor") + options.graphics = this.dataset.data; + else + options.graphics_xor = !options.graphics_xor; + + var opts = document.getElementById("sets").getElementsByClassName("option"); + for(o = 0; o < opts.length; o ++) + { + if(opts[o].dataset.data == options.graphics) + opts[o].classList.add("selected"); + else + opts[o].classList.remove("selected"); + } + + var x = document.getElementById("xor"); + if(options.graphics_xor) + x.classList.add("selected"); + else + x.classList.remove("selected"); +} + +function set_graphics_size() +{ + options.graphics_size = parseInt(this.dataset.data); + + var opts = document.getElementById("sizes").getElementsByClassName("option"); + for(o = 0; o < opts.length; o ++) + { + if(opts[o].dataset.data == options.graphics_size) + opts[o].classList.add("selected"); + else + opts[o].classList.remove("selected"); + } +} + +function custom_graphics_size() +{ + var opts = document.getElementById("sizes").getElementsByClassName("selected"); + for(o = 0; o < opts.length; o ++) + opts[o].classList.remove("selected"); + + document.getElementById("custom").classList.add("selected"); + document.getElementById("custom-number").focus(); + + options.graphics_size = -1; +} + +function quit_preferences_menu() +{ + gather_preferences(); + + if(level != null) + game_return(); + else + main_menu(); +} + +function gather_preferences() +{ + options.player_delay = parseFloat(document.getElementById("player-number").value); + options.move_delay = parseFloat(document.getElementById("move-number").value); + options.undo_delay = parseFloat(document.getElementById("undo-number").value); + options.replay_delay = parseFloat(document.getElementById("replay-number").value); + + if(options.others) + { + if(document.getElementById("xor_fix").value == "1") + options.xor_fix = true; + else + options.xor_fix = false; + + if(document.getElementById("xor_display").value == "1") + options.xor_display = true; + else + options.xor_display = false; + + if(document.getElementById("xor_engine").value == "1") + options.xor_engine = true; + else + options.xor_engine = false; + + if(document.getElementById("enigma_engine").value == "1") + options.enigma_engine = true; + else + options.enigma_engine = false; + } + + if(document.getElementById("show_keypad").value == "1") + options.keypad = true; + else + options.keypad = false; + + toggle_keypad(options.keypad); + + var size = parseInt(document.getElementById("custom-number").value); + if(size > 0 && size <= 512) + options.graphics_custom_size = size; +} + +function save_preferences() +{ + gather_preferences(); + push_preferences(); + + if(level != null) + game_return(); + else + main_menu(); +} + +function push_preferences() +{ + try + { + localStorage.setItem("options.player_delay", options.player_delay); + localStorage.setItem("options.undo_delay", options.undo_delay); + localStorage.setItem("options.move_delay", options.move_delay); + localStorage.setItem("options.replay_delay", options.replay_delay); + localStorage.setItem("options.graphics", options.graphics); + localStorage.setItem("options.graphics_size", options.graphics_size); + localStorage.setItem("options.graphics_custom_size", options.graphics_custom_size); + localStorage.setItem("options.graphics_xor", options.graphics_xor); + localStorage.setItem("options.xor_fix", options.xor_fix); + localStorage.setItem("options.xor_display", options.xor_display); + localStorage.setItem("options.xor_engine", options.xor_engine); + localStorage.setItem("options.enigma_engine", options.enigma_engine); + localStorage.setItem("options.keypad", options.keypad); + } + catch(e) + { + alert("Unable to save preferences: "+e.message); + } +} + +function default_preferences() +{ + options.player_delay = 100; + options.undo_delay = 100; + options.move_delay = 100; + options.replay_delay = 100; + options.graphics = "zen"; + options.graphics_size = 0; + if(window.innerWidth < 768) + options.graphics_size = 24; + options.graphics_custom_size = 192; + options.graphics_xor = true; + options.xor_fix = true; + options.xor_display = true; + options.xor_engine = true; + options.enigma_engine = true; + options.keypad = false; +} + +function load_preferences() +{ + try + { + if(localStorage.getItem("options.player_delay") != null) + options.player_delay = parseInt(localStorage.getItem("options.player_delay")); + if(localStorage.getItem("options.undo_delay") != null) + options.undo_delay = parseInt(localStorage.getItem("options.undo_delay")); + if(localStorage.getItem("options.move_delay") != null) + options.move_delay = parseInt(localStorage.getItem("options.move_delay")); + if(localStorage.getItem("options.replay_delay") != null) + options.replay_delay = parseInt(localStorage.getItem("options.replay_delay")); + + if(localStorage.getItem("options.graphics") != null) + { + if(localStorage.getItem("options.graphics") == "zen" || + localStorage.getItem("options.graphics") == "marble" || + localStorage.getItem("options.graphics") == "neon" || + localStorage.getItem("options.graphics") == "xor") + options.graphics = localStorage.getItem("options.graphics"); + } + + if(localStorage.getItem("options.graphics_size") != null) + options.graphics_size = parseInt(localStorage.getItem("options.graphics_size")); + if(localStorage.getItem("options.graphics_custom_size") != null) + options.graphics_custom_size = parseInt(localStorage.getItem("options.graphics_custom_size")); + + if(localStorage.getItem("options.graphics_xor") == "false") + options.graphics_xor = false; + if(localStorage.getItem("options.graphics_xor") == "true") + options.graphics_xor = true; + + if(localStorage.getItem("options.xor_fix") == "false") + options.xor_fix = false; + if(localStorage.getItem("options.xor_fix") == "true") + options.xor_fix = true; + + if(localStorage.getItem("options.xor_display") == "false") + options.xor_display = false; + if(localStorage.getItem("options.xor_display") == "true") + options.xor_display = true; + + if(localStorage.getItem("options.xor_engine") == "false") + options.xor_engine = false; + if(localStorage.getItem("options.xor_engine") == "true") + options.xor_engine = true; + + if(localStorage.getItem("options.enigma_engine") == "false") + options.enigma_engine = false; + if(localStorage.getItem("options.enigma_engine") == "true") + options.enigma_engine = true; + + if(localStorage.getItem("options.keypad") == "false") + options.keypad = false; + if(localStorage.getItem("options.keypad") == "true") + options.keypad = true; + } + catch(e) + { + alert("Unable to load preferences: "+e.message); + } +} + +function restore_default_preferences() +{ + default_preferences(); + toggle_keypad(options.keypad); + preferences_menu(); +} + +function game_return() +{ + graphics_render(); +} + +function menu_keydown(e) +{ + var key = e.key; + + if(key == "Escape") + key = "Q"; + + key = key.toUpperCase(); + + if(document.activeElement.tagName == "INPUT" && key >= "0" && key <= "9") + { + return true; + } + + if(e.ctrlKey) + return true; + + var items = document.getElementsByClassName("has-key"); + for(i = 0; i < items.length; i ++) + { + if(items[i].dataset.key == key) + { + items[i].click(); + return false; + } + } +} + +function menu_show(show) +{ + document.onkeydown = null; + document.onkeyup = null; + document.onmousedown = null; + document.onmouseup = null; + document.ontouchstart = null; + document.ontouchend = null; + document.onclick = null; + + menu.becoming = show; + + if(show != menu.state) + { + if(show) + { + document.getElementById("menu-icon").style.display = "none"; + document.getElementById("menu-icon").style.opacity = 0; + + + document.getElementById("menu").style.display = "block"; + + + setTimeout(function() { menu_shown(true); }, 100); + } + else + { + document.getElementById("screen").style.display = "block"; + document.getElementById("bar").style.display = "block"; + if(level != null && level.mode == MODE_XOR && options.xor_display) + document.getElementById("map").style.display = "block"; + + + document.getElementById("keypad").style.display = "block"; + + document.getElementById("menu-icon").onclick = game_menu; + + document.getElementById("menu").style.position = "fixed"; + + document.getElementById("menu").style.right = "-100%"; + document.getElementById("menu").style.top= "-100%"; + + setTimeout(function() { menu_shown(false); }, 1000); + } + } + else + menu_shown(show); +} + +function menu_shown(show) +{ + + if(menu.state != show) + { + if(show) + { + setTimeout(menu_make_absolute, 1000); + document.getElementById("menu").style.right = "0"; + document.getElementById("menu").style.top= "0"; + } + else + { + document.getElementById("menu").style.display = "none"; + document.getElementById("menu-icon").style.display = "block"; + document.getElementById("menu-icon").style.opacity = 0; + + setTimeout(function() { document.getElementById("menu-icon").style.opacity = 1; }, 50); + } + } + + if(show) + { + document.onkeydown = menu_keydown; + document.onkeyup = null; + document.onmousedown = null; + document.onmouseup = null; + document.ontouchstart = null; + document.ontouchend = null; + document.onclick = null; + } + else + { + document.onkeydown = game_keydown; + document.onkeyup = game_keyup; + document.onmousedown = function(e) { return game_mousedown(e, false) }; + document.onmouseup = function(e) { return game_mouseup(e, false) }; + document.ontouchstart = function(e) { if(e.changedTouches.length > 0) return game_mousedown(e.changedTouches[0], true); }; + document.ontouchend = function(e) { if(e.changedTouches.length > 0) return game_mouseup(e.changedTouches[0], true); }; + document.onclick = game_click; + } + + menu.state = show; +} + + +function menu_make_absolute() +{ + if(menu.becoming == true) + { + document.getElementById("screen").style.display = "none"; + document.getElementById("bar").style.display = "none"; + document.getElementById("map").style.display = "none"; + document.getElementById("keypad").style.display = "none"; + document.getElementById("menu").style.position = "absolute"; + } +} + +function menu_new(title) +{ + menu.keys = []; + menu.key = 1; + document.getElementById("items").innerHTML = ""; + + if(title != "") + { + var heading = document.createElement("h1"); + heading.textContent = title; + document.getElementById("items").appendChild(heading); + document.getElementById("logo").classList.remove("big"); + } + else + document.getElementById("logo").classList.add("big"); + + window.scrollTo(0, 0); +} + +function menu_new_entry(key, text1, text2, text3, text4, onclick, data) +{ + var item = document.createElement("div"); + if(onclick != null) + item.className = "item has-key"; + else + item.className = "item grey"; + + if(key != null) + item.dataset.key = key.toUpperCase(); + else + { + key = menu.key.toString(36); + key = key.toUpperCase(); + menu.key ++; + + item.dataset.key = key; + } + + menu.keys[item.dataset.key] = true; + + var div = document.createElement("div"); + div.className = "key"; + div.textContent = key; + item.appendChild(div); + + var div = document.createElement("div"); + div.className = "item-text"; + item.appendChild(div); + + if(text1 != null) + { + var tdiv = document.createElement("div"); + tdiv.id = "text1"; + tdiv.className = "item-left"; + tdiv.textContent = text1; + div.appendChild(tdiv); + } + + if(text2 != null) + { + var tdiv = document.createElement("div"); + tdiv.id = "text2"; + tdiv.className = "item-right"; + tdiv.textContent = text2; + div.appendChild(tdiv); + } + + if(text1 != null || text2 != null) + { + var tdiv = document.createElement("div"); + tdiv.className = "clear"; + div.appendChild(tdiv); + } + + if(text3 != null) + { + var tdiv = document.createElement("div"); + tdiv.id = "text3"; + tdiv.className = "item-left"; + tdiv.textContent = text3; + div.appendChild(tdiv); + } + + if(text4 != null) + { + var tdiv = document.createElement("div"); + tdiv.id = "text4"; + tdiv.className = "item-right"; + tdiv.textContent = text4; + div.appendChild(tdiv); + } + + if(text3 != null || text4 != null) + { + var tdiv = document.createElement("div"); + tdiv.className = "clear"; + div.appendChild(tdiv); + } + + if(data != null) + item.dataset.data = data; + + if(onclick != null) + item.onclick = onclick; + + document.getElementById("items").appendChild(item); + + return item; +} + +function menu_new_spacer() +{ + var item = document.createElement("div"); + item.className = "spacer"; + + document.getElementById("items").appendChild(item); +} + +function save_position() +{ + var str = level_to_string(level); + var time = Date.now().toString(16); + + var summary; + + if(level.flags & LEVELFLAG_FAILED) + summary = "failed"; + else if(level.flags & LEVELFLAG_SOLVED) + summary = "solved"; + else + summary = level.stars_caught+"/"+level.stars_exploded+"/"+level.stars_total; + + summary += " "+level.moves.length+" "+level.title; + + try + { + localStorage.setItem("save-"+time, summary); + localStorage.setItem("data-"+time, str); + } + catch(e) + { + alert("Unable to save position: "+e.message); + return; + } + + if(localStorage.getItem("save-"+time) != summary || localStorage.getItem("data-"+time, str) != str) + { + alert("Unable to save position."); + return; + } + + revert = new Object; + revert.data = this.dataset.data; + revert.moves = level.moves.length; + + game_return(); +} + + +function load_position() +{ + saved_positions(level.title, "", false, false); +} + +function load_replay_position() +{ + saved_positions(level.title, "", false, true); +} + +function saved_positions_menu() +{ + saved_positions("", this.dataset.data, false, false); +} + +function saved_positions(limit, oldlimit, deleting, replay) +{ + var a; + var positions = []; + var limited = 0; + + if(replay) + menu_new("Replay Saved Position"); + else if(deleting) + menu_new("Delete Saved Positions"); + else + menu_new("Load Position"); + + var return_function = main_menu; + if(limit != "") + return_function = game_menu; + if(oldlimit != "") + return_function = load_position; + + menu_new_entry("Q", "Return to previous menu", null, null, null, return_function, null); + if(deleting == false && replay == false) + menu_new_entry("Delete", "Delete positions", null, null, null, delete_positions, limit); + menu_new_spacer(); + + for(var i = 0; i < localStorage.length; i ++) + { + if(a = localStorage.key(i).match(/^save-(\w+)/)) + positions.push(a[1]); + } + + positions.sort(function(a, b) { return b > a; }); + + var action; + if(replay) + action = load_replay; + else if(deleting) + action = delete_position; + else + action = play_level; + + for(var i = 0; i < positions.length; i ++) + { + var s = localStorage.getItem("save-"+positions[i]); + var stars = ""; + var moves = ""; + var title = ""; + var date = ""; + + if(a = s.match(/^(\S+) (\S+) (.*)/)) + { + stars = a[1]; + moves = a[2] + " move" + (a[2] == 1 ? "" : "s"); + title = a[3]; + + if(a = stars.match(/^(\d+)\/(\d+)\/(\d+)/)) + { + if(a[2] != 0) + stars = a[2] + " lost"; + else + stars = a[1] + "/" + a[3]; + } + + d = new Date(parseInt(positions[i], 16)); + date = d.toString(); + + date = days[d.getDay()]+" "+months[d.getMonth()]+" "+d.getDate()+" "+d.getHours()+":"+two(d.getMinutes())+":"+two(d.getSeconds())+" "+d.getFullYear(); + + if(limit == "" || title == limit) + menu_new_entry(null, title, stars, date, moves, action, deleting ? positions[i] : localStorage.getItem("data-"+positions[i])); + else + limited ++; + } + + } + + if(limited != 0 && deleting == false && replay == false) + { + menu_new_spacer(); + menu_new_entry("+", "Show positions for other levels", "("+limited+" other"+(limited == 1 ? "" : "s")+")", null, null, saved_positions_menu, title); + } + + menu_show(true); +} + +function delete_positions() +{ + saved_positions(this.dataset.data, level != null ? level.title : "", true, false); +} + +function delete_position() +{ + var p = this.dataset.data; + + var i = document.querySelectorAll("[data-data=\""+p+"\"]"); + if(i.length > 0) + i[0].parentElement.removeChild(i[0]); + + localStorage.removeItem("save-"+p); + localStorage.removeItem("data-"+p); +} + +function load_replay() +{ + level_replay = level_from_string(this.dataset.data); + consider_replay_move(); + display_moves(); + game_return(); +} + +function stop_replay() +{ + level_replay = null; + display_moves(); + game_return(); +} + +function consider_replay_move() +{ + var move; + + display_moves(); + + if(level.movers.length == 0 && !(level.flags & LEVELFLAG_UNDO)) + { + if(!(level_replay.flags & LEVELFLAG_PAUSED)) + { + if(level_replay.flags & LEVELFLAG_UNDO) + { + if(level_undo()) + { + level.flags |= LEVELFLAG_UNDO; + display_start_update(); + } + else + level.flags &= ~LEVELFLAG_UNDO; + } + else + { + move = level_replay.moves[level.moves.length].direction; + level_move(move); + } + } + } +} + +function import_export_menu(really) +{ + if(really != true) + gather_preferences(); + + menu_new("Import and Export Preferences and Saved Positions"); + + menu_new_entry("Q", "Return to previous menu", null, null, null, preferences_menu, null); + + menu_new_spacer(); + + menu_new_entry("E", "Export Preferences and Saved Positions to file", null, null, null, really == true ? null : export_data, null); + + var item = menu_new_entry("I", "Import Preferences and Saved Positions from file", null, null, null, really == true ? null : import_click, null); + + if(really != true) + { + var upload = document.createElement("input"); + upload.type= "file"; + div = item.getElementsByTagName("div")[3]; + div.appendChild(upload); + div.style.display = "none"; + upload.addEventListener("change", import_data); + } + + menu_new_spacer(); + + if(really == true) + menu_new_entry("Y", "Really Delete Preferences and Saved Positions", null, "(cannot be undone)", null, clear_data, null); + else + menu_new_entry("D", "Delete Preferences and Saved Positions", null, null, null, confirm_clear_data, null); + + menu_show(true); +} + +function confirm_clear_data() +{ + import_export_menu(true); +} + +function clear_data() +{ + localStorage.clear(); + alert("Preferences and Saved Positions deleted"); + + main_menu(); +} + +function export_data() +{ + push_preferences(); + + var l = {}; + for(var i = 0; i < localStorage.length; i ++) + { + l[localStorage.key(i)] = localStorage.getItem(localStorage.key(i)); + } + + var data = JSON.stringify(l); + var filename = "chroma.json"; + + var blob = new Blob([data], {type: "application/octet-stream;"}); + if(window.navigator.msSaveOrOpenBlob) + { + window.navigator.msSaveBlob(blob, filename); + } + else + { + var e = window.document.createElement("a"); + e.href = window.URL.createObjectURL(blob); + e.download = filename; + document.body.appendChild(e); + e.click(); + document.body.removeChild(e); + } +} + +function import_click() +{ + this.getElementsByTagName("input")[0].click(); +} + +function import_data() +{ + if(this.files.length == 1) + { + var reader = new FileReader(); + reader.onload = import_data_stage_two; + reader.readAsText(this.files[0]); + } +} + +function import_data_stage_two() +{ + localStorage.clear(); + + var positions = 0; + + try + { + var l = JSON.parse(this.result); + for(var i in l) + { + if(l.hasOwnProperty(i)) + { + localStorage.setItem(i, l[i]); + if(i.substr(0,5) == "save-") + positions ++; + } + } + } + catch(e) + { + alert("Unable to import data: " + e.message); + return; + } + + alert("Preferences and "+positions+" saved position"+(positions == 1 ? "" : "s")+" successfully imported"); + + options.storage = true; + + load_preferences(); + preferences_menu(); +} + +function game_keydown(e) +{ + var move = MOVE_NONE; + + if(e.key == "Shift") + graphics.shift = true; + if(e.key == "Control") + graphics.ctrl = true; + + if(e.key == "Escape" || e.key == "Q" || e.key == "q") + { + game_menu(); + return; + } + else if(e.key == "Tab") + { + display_level(); + } + else if(e.key == "ArrowUp" || e.keyCode == 104) + move = MOVE_UP; + else if(e.key == "ArrowDown" || e.keyCode == 98) + move = MOVE_DOWN; + else if(e.key == "ArrowLeft" || e.keyCode == 100) + move = MOVE_LEFT; + else if(e.key == "ArrowRight" || e.keyCode == 102) + move = MOVE_RIGHT; + else if(e.key == " " || e.key == "Enter" || e.key == "Return") + move = MOVE_SWAP; + else if(e.key == "Delete" || e.keyCode == 109) + move = MOVE_UNDO; + else if (e.key == "Insert" || e.keyCode == 107) + move = MOVE_REDO; + else + return true; + + if(move != MOVE_NONE) + make_move(move); + + return false; +} + +function game_keyup(e) +{ + if(e.key == "Shift") + graphics.shift = false; + if(e.key == "Control") + graphics.ctrl = false; +} + +function game_mouseup(e, touch) +{ + if(e.target != null) + { + if(e.target.classList.contains("key") || e.target.id == "bar") + { + mouse_move = MOVE_NONE; + } + } + + if(!keypad.classList.contains("transition")) + keypad.classList.add("transition"); + + if(touch) + document.ontouchmove = null; + else + document.onmousemove = null; +} + +function game_mousedown(e, touch) +{ + if(mouse_recent_event) + return false; + + mouse_recent_event = true; + setTimeout(function() { mouse_recent_event = false; }, 500); + + if(e.target != null) + { + if(e.target.classList.contains("key")) + { + if(e.target.id == "up") + mouse_move = MOVE_UP; + else if(e.target.id == "down") + mouse_move = MOVE_DOWN; + else if(e.target.id == "left") + mouse_move = MOVE_LEFT; + else if(e.target.id == "right") + mouse_move = MOVE_RIGHT; + else if(e.target.id == "swap") + mouse_move = MOVE_SWAP; + else if(e.target.id == "undo") + mouse_move = MOVE_UNDO; + else if(e.target.id == "redo") + mouse_move = MOVE_REDO; + + if(mouse_move != MOVE_NONE); + consider_mouse_move(); + + return false; + } + else if(e.target.id == "drag") + { + var keypad = document.getElementById("keypad"); + keypad.dataset.startX = e.clientX - keypad.offsetLeft; + keypad.dataset.startY = e.clientY - keypad.offsetTop; + keypad.classList.remove("transition"); + + if(touch) + document.ontouchmove = function(e) { if(e.changedTouches.length > 0) return drag_keypad(e.changedTouches[0], true) }; + else + document.onmousemove = function(e) { return drag_keypad(e, false) }; + + return false; + } + else if(e.target.id == "toggle") + { + options.keypad = !options.keypad; + toggle_keypad(options.keypad); + + return false; + } + else if(e.target.id == "screen") + { + var scr = document.getElementById("screen"); + scr.dataset.startX = e.clientX - graphics.offset_x; + scr.dataset.startY = e.clientY - graphics.offset_y; + + if(touch) + document.ontouchmove = function(e) { if(e.changedTouches.length > 0) return drag_screen(e.changedTouches[0], true) }; + else + document.onmousemove = function(e) { return drag_screen(e, false) }; + + return false; + } + else if(e.target.id == "bar") + { + if((screen.bar.lines == 1 && e.clientX > screen.bar.width - graphics.small_width - screen.bar.move_width) || + (screen.bar.lines != 1 && e.clientY > screen.height - screen.bar.height)) + { + mouse_move = MOVE_UNDO; + consider_mouse_move(); + } + } + } +} + +function game_click(e) +{ + var x = Math.floor((e.clientX - graphics.offset_x - screen.offset_x) / graphics.width); + var y = Math.floor((e.clientY - graphics.offset_y - screen.offset_y) / graphics.height); + + if(!mouse_recent_event) + return; + + if(level.alive[1 - level.player] && x == level.player_x[1 - level.player] && y == level.player_y[1 - level.player]) + { + mouse_move = MOVE_SWAP; + mouse_target = true; + consider_mouse_move(); + return false; + } + if(level.alive[level.player]) + { + if(x == level.player_x[level.player] && y != level.player_y[level.player]) + { + mouse_target = true; + mouse_target_x = x; + mouse_target_y = y; + + if(y < level.player_y[level.player]) + mouse_move = MOVE_UP; + else + mouse_move = MOVE_DOWN; + + consider_mouse_move(); + return false; + } + if(x != level.player_x[level.player] && y == level.player_y[level.player]) + { + mouse_target = true; + mouse_target_x = x; + mouse_target_y = y; + + if(x < level.player_x[level.player]) + mouse_move = MOVE_LEFT; + else + mouse_move = MOVE_RIGHT; + + consider_mouse_move(); + return false; + } + } +} + +function toggle_keypad(state) +{ + var keypad = document.getElementById("keypad"); + + if(state) + { + keypad.style.top = keypad.dataset.top; + keypad.style.left = keypad.dataset.left; + keypad.classList.remove("minimised"); + document.getElementById("toggle").innerHTML = "◤"; + } + else + { + keypad.dataset.top = keypad.style.top; + keypad.dataset.left = keypad.style.left; + keypad.classList.add("minimised"); + keypad.style.top = null; + keypad.style.left = null; + document.getElementById("toggle").innerHTML = "◢"; + } +} + +function consider_mouse_move() +{ + if(mouse_move != MOVE_NONE) + { + var move = make_move(mouse_move); + if(mouse_target) + { + if(mouse_move == MOVE_SWAP) + mouse_target = false; + else + { + mouse_target = move; + if(level.player_x[level.player] == mouse_target_x && level.player_y[level.player] == mouse_target_y) + mouse_target = false; + } + if(mouse_target == false) + mouse_move = MOVE_NONE; + } + } +} + +function make_move(move) +{ + if(level_replay != null) + { + if(move == MOVE_UP || move == MOVE_DOWN || move == MOVE_SWAP) + { + level_replay.flags |= LEVELFLAG_PAUSED; + } + else if(move == MOVE_LEFT || move == MOVE_UNDO) + { + level_replay.flags |= LEVELFLAG_UNDO; + level_replay.flags &= ~LEVELFLAG_PAUSED; + } + else if(move == MOVE_RIGHT || move == MOVE_REDO) + { + level_replay.flags &= ~LEVELFLAG_UNDO; + level_replay.flags &= ~LEVELFLAG_PAUSED; + } + + consider_replay_move(); + return; + } + + if(level.movers.length != 0 || level.flags & LEVELFLAG_UNDO) + return; + + if(move == MOVE_UNDO) + { + if(level_undo()) + { + level.flags |= LEVELFLAG_UNDO; + display_start_update(); + } + else + level.flags &= ~LEVELFLAG_UNDO; + } + else if(move == MOVE_REDO) + { + if(level.redoable_moves.length != 0) + level_move(MOVE_REDO) + } + else if(move != MOVE_NONE) + { + return level_move(move); + } +} + +function drag_keypad(e) +{ + var keypad = document.getElementById("keypad"); + + keypad.style.left = (e.clientX - keypad.dataset.startX) + "px"; + keypad.style.top = (e.clientY - keypad.dataset.startY) + "px"; + + return false; +} + +function drag_screen(e) +{ + var scr = document.getElementById("screen"); + + var ox = graphics.offset_x; + var oy = graphics.offset_y; + + if(level == null) + return; + + if(level.mode == MODE_XOR && options.xor_display) + return; + + if((level.width - 1) * graphics.width > screen.width) + { + graphics.offset_x = (e.clientX - scr.dataset.startX); + if(graphics.offset_x > 0) + graphics.offset_x = 0; + if(graphics.offset_x < -graphics.width * level.width + screen.width) + graphics.offset_x = -graphics.width * level.width + screen.width; + } + if((level.height - 1) * graphics.height > screen.height) + { + graphics.offset_y = (e.clientY - scr.dataset.startY); + if(graphics.offset_y > 0) + graphics.offset_y = 0; + if(graphics.offset_y < -graphics.height * level.height + screen.height) + graphics.offset_y = -graphics.height * level.height + screen.height; + } + + if(graphics.offset_x != ox || graphics.offset_y != oy) + display_level(); + + return false; + +} + +function enigma_move(move) +{ + var px, py; + var dx, dy; + var p; + var into; + + if(!level.alive[level.player]) + return false; + if(move == MOVE_SWAP) + return false; + + px = level.player_x[level.player]; + py = level.player_y[level.player]; + + dx = px + move_x[move]; + dy = py + move_y[move]; + + /* Can we make the move? */ + p = level_piece(dx, dy); + switch(p) + { + /* Pieces that can be collected */ + case PIECE_SPACE: + case PIECE_DOTS: + case PIECE_DOTS_DOUBLE: + break; + case PIECE_STAR: + level.stars_caught ++; + level.flags |= LEVELFLAG_STARS; + break; + case PIECE_DOOR: + if(level.stars_caught == level.stars_total) + level.flags |= LEVELFLAG_EXIT; + else + return false; + break; + /* Pieces that can be pushed */ + case PIECE_ARROW_RED_LEFT: + case PIECE_ARROW_RED_RIGHT: + case PIECE_ARROW_RED_UP: + case PIECE_ARROW_RED_DOWN: + case PIECE_BOMB_RED_LEFT: + case PIECE_BOMB_RED_RIGHT: + case PIECE_BOMB_RED_UP: + case PIECE_BOMB_RED_DOWN: + /* Can't push against gravity */ + if(((level_piece(dx, dy) + 2) % 4) == move) + return false; + /* fallthrough */ + case PIECE_CIRCLE: + case PIECE_CIRCLE_DOUBLE: + /* Can't push into other pieces */ + into = level_piece(dx + move_x[move], dy + move_y[move]); + if(into != PIECE_SPACE && into != PIECE_DOTS) + return false; + mover_new(dx + move_x[move], dy + move_y[move], move, p, 0); + break; + + /* Can't move */ + default: + return false; + } + + mover_new(dx, dy, move, PIECE_PLAYER_ONE + level.player, 0); + mover_new(px, py, move, PIECE_SPACE, 0); + level_setmoving(px, py, MOVE_NONE); + level.player_x[level.player] = dx; + level.player_y[level.player] = dy; + mover_addtostack(px, py, move); + + return true; + +} + +function enigma_evolve() +{ + var into; + + var d; + var i, p, ep; + + var px, py; + var dx, dy; + + var ok; + + ok = false; + while(!ok) + { + /* Examine the stack, and generate movers from it */ + for(m = 0; m < level.stack.length; m ++) + { + mover = level.stack[m]; + /* Can anything fall into this space? */ + for(i = 0; i < 4; i ++) + { + d = enigma_move_order[i]; + px = mover.x - move_x[d]; + py = mover.y - move_y[d]; + p = level_piece(px, py); + if(p >= PIECE_ARROW_RED_LEFT && p <= PIECE_BOMB_RED_DOWN && (p % 4 == d)) + { + if(level_moving(px, py) == MOVE_NONE) + { + mover_new(px, py, d, p, 1); + i = 4; + } + } + } + } + level.stack = []; + + level.oldmovers = level.movers; + level.movers = []; + + /* Examine the movers, adding new movers to a separate list */ + for(m = 0 ; m < level.oldmovers.length; m ++) + { + mover = level.oldmovers[m]; + + level_setmoving(mover.x, mover.y, MOVE_NONE); + level_setprevious(mover.x, mover.y, PIECE_SPACE); + level_setpreviousmoving(mover.x, mover.y, MOVE_NONE); + level_setdetonator(mover.x, mover.y, PIECE_SPACE); + level_setdetonatormoving(mover.x, mover.y, MOVE_NONE); + + p = mover.piece; + if(p == PIECE_EXPLOSION_RED_HORIZONTAL || p == PIECE_EXPLOSION_RED_VERTICAL) + { + mover_new(mover.x, mover.y, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(mover.x, mover.y, MOVE_NONE); + if(p == PIECE_EXPLOSION_RED_HORIZONTAL) + { + if(mover.x - 1 > 0) + { + mover_new(mover.x - 1, mover.y, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(mover.x - 1, mover.y, MOVE_NONE); + } + if(mover.x + 1 < level.width - 1) + { + mover_new(mover.x + 1, mover.y, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(mover.x + 1, mover.y, MOVE_NONE); + } + } + else + { + if(mover.y - 1 > 0) + { + mover_new(mover.x, mover.y - 1, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(mover.x, mover.y - 1, MOVE_NONE); + } + if(mover.y + 1 < level.height - 1) + { + mover_new(mover.x, mover.y + 1, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(mover.x, mover.y + 1, MOVE_NONE); + } + } + } + if((p >= PIECE_ARROW_RED_LEFT && p <= PIECE_BOMB_RED_DOWN) || p == PIECE_CIRCLE) + { + if(p == PIECE_CIRCLE) + d = mover.direction; + else + d = p % 4; + dx = mover.x + move_x[d]; + dy = mover.y + move_y[d]; + + into = level_piece(dx, dy); + /* Can it detonate something? */ + if(p >= PIECE_ARROW_RED_LEFT && p <= PIECE_ARROW_RED_DOWN && into >= PIECE_BOMB_RED_LEFT && into <= PIECE_BOMB_RED_DOWN && mover.fast && level_moving(dx, dy) == MOVE_NONE) + { + /* Add the central explosion to the stack */ + mover_new(mover.x, mover.y, d, PIECE_SPACE, 0); + level_setprevious(dx, dy, into); + level_setdetonator(dx, dy, p); + level_setdetonatormoving(dx, dy, d); + mover_addtostack(mover.x, mover.y, MOVE_NONE); + + /* Generate cosmetic side explosions */ + if(into % 2) + { + if(dx - 1 > 0) + { + ep = level_piece(dx - 1, dy); + if(ep == PIECE_STAR) + { + level.stars_exploded ++; + level.flags |= LEVELFLAG_STARS; + } + level_setmoving(dx - 1, dy, MOVE_NONE); + mover_new(dx - 1, dy, level_moving(dx - 1, dy), PIECE_EXPLOSION_RED_LEFT, 1); + level_setprevious(dx - 1, dy, ep); + } + if(dx + 1 < level.width - 1) + { + ep = level_piece(dx + 1, dy); + if(ep == PIECE_STAR) + { + level.stars_exploded ++; + level.flags |= LEVELFLAG_STARS; + } + level_setmoving(dx + 1, dy, MOVE_NONE); + mover_new(dx + 1, dy, level_moving(dx + 1, dy), PIECE_EXPLOSION_RED_RIGHT, 0); + level_setprevious(dx + 1, dy, ep); + } + mover_new(dx, dy, MOVE_NONE, PIECE_EXPLOSION_RED_HORIZONTAL, 0); + } + else + { + if(dy - 1 > 0) + { + ep = level_piece(dx, dy - 1); + if(ep == PIECE_STAR) + { + level.stars_exploded ++; + level.flags |= LEVELFLAG_STARS; + } + level_setmoving(dx, dy - 1, MOVE_NONE); + mover_new(dx, dy - 1, level_moving(dx, dy - 1), PIECE_EXPLOSION_RED_TOP, 0); + level_setprevious(dx, dy - 1, ep); + } + if(dy + 1 < level.height - 1) + { + ep = level_piece(dx, dy + 1); + if(ep == PIECE_STAR) + { + level.stars_exploded ++; + level.flags |= LEVELFLAG_STARS; + } + level_setmoving(dx, dy + 1, MOVE_NONE); + mover_new(dx, dy + 1, level_moving(dx, dy + 1), PIECE_EXPLOSION_RED_BOTTOM, 0); + level_setprevious(dx, dy + 1, ep); + } + mover_new(dx, dy, MOVE_NONE, PIECE_EXPLOSION_RED_VERTICAL, 0); + } + } + /* Can it keep moving? */ + else if(into == PIECE_SPACE || ((into == PIECE_DOTS || into == PIECE_PLAYER_ONE) && p != PIECE_CIRCLE && mover.fast == 1)) + { + mover_new(dx, dy, d, p, 1); + mover_new(mover.x, mover.y, d, PIECE_SPACE, 0); + level_setmoving(mover.x, mover.y, MOVE_NONE); + mover_addtostack(mover.x, mover.y, MOVE_NONE); + } + } + } + + if(level.movers.length != 0 || level.stack.length == 0) + ok = true; + } + + /* Is player one still alive? */ + if(level_piece(level.player_x[0], level.player_y[0]) != PIECE_PLAYER_ONE) + level.alive[0] = 0; +} + +function xor_considerdownmover(x, y) +{ + var p = level_piece(x, y - 1); + if(p == PIECE_XOR_FISH || p == PIECE_XOR_H_BOMB) + mover_addtostack(x, y - 1, 0); +} + +function xor_considerleftmover(x, y) +{ + var p = level_piece(x + 1, y); + if(p == PIECE_XOR_CHICKEN || p == PIECE_XOR_V_BOMB) + mover_addtostack(x + 1, y, 0); +} + +function xor_teleport(px, py, dx, dy, move) +{ + var teleport; + var tx, ty; + var moveout = MOVE_NONE; + + teleport = -1; + if(px == level.teleport_x[0] && py == level.teleport_y[0]) + teleport = 0; + if(px == level.teleport_x[1] && py == level.teleport_y[1]) + teleport = 1; + if(teleport == -1) + return [false, dx, dy, move]; + + tx = level.teleport_x[1 - teleport]; + ty = level.teleport_y[1 - teleport]; + + /* If the other teleport has been destroyed, turn this one into a wall */ + if(level_piece(tx, ty) != PIECE_TELEPORT) + { + mover_new(level.teleport_x[teleport], level.teleport_y[teleport], MOVE_NONE, PIECE_WALL, 0); + return [false, dx, dy, move]; + } + + if(level_piece(tx + 1, ty) == PIECE_SPACE) + { + dx = tx + 1; + dy = ty; + moveout = MOVE_RIGHT; + } + else if(level_piece(tx, ty - 1) == PIECE_SPACE) + { + dx = tx; + dy = ty - 1; + moveout = MOVE_UP; + } + else if(level_piece(tx - 1, ty) == PIECE_SPACE) + { + dx = tx - 1; + dy = ty; + moveout = MOVE_LEFT; + } + else if(level_piece(tx, ty + 1) == PIECE_SPACE) + { + dx = tx; + dy = ty + 1; + moveout = MOVE_DOWN; + } + + if(moveout != MOVE_NONE) + { + /* Visual effects for the player moving in to the teleport */ + /* Store original player move direction in cosmetic mover */ + mover_new(px, py, move, PIECE_TELEPORT, 0); + level_setprevious(px, py, PIECE_PLAYER_ONE + level.player); + level_setpreviousmoving(px, py, move); + + /* Visual effects for the player moving out of the teleport */ + mover_new(tx, ty, MOVE_NONE, PIECE_TELEPORT, 0); + + /* Change move to produce the effect of coming out of the teleport */ + move = moveout; + + level.view_x[level.player] = level.view_teleport_x[1 - teleport]; + level.view_y[level.player] = level.view_teleport_y[1 - teleport]; + + return [true, dx, dy, move]; + } + + return [false, dx, dy, move]; +} + +function xor_explode(x, y, type, previous) +{ + var p = level_piece(x, y); + + if(p == PIECE_SWITCH) + { + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + } + if(p == PIECE_XOR_MASK) + { + level.stars_exploded ++; + level.flags |= LEVELFLAG_STARS; + } + + /* Don't explode edge walls */ + if(x == 0 || y == 0 || x == level.width - 1 || y == level.height - 1) + return; + + if(previous != MOVE_NONE) + { + mover_new(x, y, previous, PIECE_GONE, 0); + level_setpiece(x, y, PIECE_SPACE); + } + mover_new(x, y, MOVE_NONE, type, 0); + if(previous == MOVE_NONE) + level_setprevious(x, y, p); +} + +function xor_move(move) +{ + var p; + var px, py; + var dx, dy; + var ox, oy; + var into; + var bp; + + if(!level.alive[level.player]) + return false + + px = level.player_x[level.player]; + py = level.player_y[level.player]; + + if(move == MOVE_LEFT) + { + dx = px - 1; + dy = py; + + ox = px - 2; + oy = py; + + p = level_piece(dx, dy); + if(p == PIECE_WALL || p == PIECE_XOR_MAGUS || p == PIECE_XOR_QUESTOR) + return false; + if(p == PIECE_DOOR) + { + if(level.stars_caught == level.stars_total) + level.flags |= LEVELFLAG_EXIT; + else + return false; + } + if(p == PIECE_XOR_WAVES || p == PIECE_XOR_CHICKEN || p == PIECE_XOR_V_BOMB) + return false; + if(p == PIECE_XOR_FISH || p == PIECE_XOR_H_BOMB) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE || into == PIECE_XOR_DOTS) + { + mover_new(ox, oy, MOVE_LEFT, p, 0); + bp = level_piece(ox, oy + 1); + if(bp == PIECE_SPACE || bp == PIECE_XOR_WAVES) + mover_addtostack(ox, oy, 0); + } + else + return false; + } + if(p == PIECE_TELEPORT) + { + var a = xor_teleport(px - 1, py, dx, dy, move); + if(!a[0]) + return false; + dx = a[1]; dy = a[2]; move = a[3]; + } + if(p == PIECE_XOR_MASK) + { + level.stars_caught ++; + level.flags |= LEVELFLAG_STARS; + } + if(p == PIECE_SWITCH) + { + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + } + if(p == PIECE_MAP_TOP_LEFT) + { + level.mapped |= MAPPED_TOP_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_TOP_RIGHT) + { + level.mapped |= MAPPED_TOP_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_LEFT) + { + level.mapped |= MAPPED_BOTTOM_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_RIGHT) + { + level.mapped |= MAPPED_BOTTOM_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_XOR_DOLL) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE) + { + mover_new(ox, oy, MOVE_LEFT, p, 0); + if(level_piece(ox - 1, oy) == PIECE_SPACE) + mover_addtostack(ox, oy, MOVE_LEFT); + } + else + return false; + } + + level.player_x[level.player] = dx; + level.player_y[level.player] = dy; + + mover_new(dx, dy, move, PIECE_XOR_MAGUS + level.player, 0); + mover_new(px, py, move, PIECE_SPACE, 0); + + if(level.flags & LEVELFLAG_EXIT) + return true; + + xor_considerdownmover(px, py); + xor_considerleftmover(px, py); + + return true; + } + + if(move == MOVE_RIGHT) + { + dx = px + 1; + dy = py; + + ox = px + 2; + oy = py; + + p = level_piece(dx, dy); + if(p == PIECE_WALL || p == PIECE_XOR_MAGUS || p == PIECE_XOR_QUESTOR) + return false; + if(p == PIECE_DOOR) + { + if(level.stars_caught == level.stars_total) + level.flags |= LEVELFLAG_EXIT; + else + return false; + } + if(p == PIECE_XOR_WAVES || p == PIECE_XOR_CHICKEN || p == PIECE_XOR_V_BOMB) + return false; + if(p == PIECE_XOR_FISH || p == PIECE_XOR_H_BOMB) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE || into == PIECE_XOR_DOTS) + { + mover_new(ox, oy, MOVE_RIGHT, p, 0); + bp = level_piece(ox, oy + 1); + if(bp == PIECE_SPACE || bp == PIECE_XOR_WAVES) + mover_addtostack(ox, oy, 0); + } + else + return false; + } + if(p == PIECE_TELEPORT) + { + var a = xor_teleport(px + 1, py, dx, dy, move); + if(!a[0]) + return false; + dx = a[1]; dy = a[2]; move = a[3]; + } + if(p == PIECE_XOR_MASK) + { + level.stars_caught ++; + level.flags |= LEVELFLAG_STARS; + } + if(p == PIECE_SWITCH) + { + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + } + if(p == PIECE_MAP_TOP_LEFT) + { + level.mapped |= MAPPED_TOP_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_TOP_RIGHT) + { + level.mapped |= MAPPED_TOP_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_LEFT) + { + level.mapped |= MAPPED_BOTTOM_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_RIGHT) + { + level.mapped |= MAPPED_BOTTOM_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_XOR_DOLL) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE) + { + mover_new(ox, oy, MOVE_RIGHT, p, 0); + if(level_piece(ox + 1, oy) == PIECE_SPACE) + mover_addtostack(ox, oy, MOVE_RIGHT); + } + else + return false + } + + level.player_x[level.player] = dx; + level.player_y[level.player] = dy; + + mover_new(dx, dy, move, PIECE_XOR_MAGUS + level.player, 0); + mover_new(px, py, move, PIECE_SPACE, 0); + + if(level.flags & LEVELFLAG_EXIT) + return true; + + xor_considerdownmover(px, py); + + return true; + } + + if(move == MOVE_UP) + { + dx = px; + dy = py - 1; + + ox = px; + oy = py - 2; + + p = level_piece(dx, dy); + if(p == PIECE_WALL || p == PIECE_XOR_MAGUS || p == PIECE_XOR_QUESTOR) + return false; + if(p == PIECE_DOOR) + { + if(level.stars_caught == level.stars_total) + level.flags |= LEVELFLAG_EXIT; + else + return false; + } + if(p == PIECE_XOR_DOTS || p == PIECE_XOR_FISH || p == PIECE_XOR_H_BOMB) + return false; + if(p == PIECE_XOR_CHICKEN || p == PIECE_XOR_V_BOMB) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE || into == PIECE_XOR_WAVES) + { + mover_new(ox, oy, MOVE_UP, p, 0); + bp = level_piece(ox - 1, oy); + if(bp == PIECE_SPACE || bp == PIECE_XOR_DOTS) + mover_addtostack(ox, oy, 0); + } + else + return false; + } + if(p == PIECE_TELEPORT) + { + var a = xor_teleport(px, py - 1, dx, dy, move); + if(!a[0]) + return false; + dx = a[1]; dy = a[2]; move = a[3]; + } + if(p == PIECE_XOR_MASK) + { + level.stars_caught ++; + level.flags |= LEVELFLAG_STARS; + } + if(p == PIECE_SWITCH) + { + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + } + if(p == PIECE_MAP_TOP_LEFT) + { + level.mapped |= MAPPED_TOP_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_TOP_RIGHT) + { + level.mapped |= MAPPED_TOP_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_LEFT) + { + level.mapped |= MAPPED_BOTTOM_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_RIGHT) + { + level.mapped |= MAPPED_BOTTOM_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_XOR_DOLL) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE) + { + mover_new(ox, oy, MOVE_UP, p, 0); + if(level_piece(ox, oy - 1) == PIECE_SPACE) + mover_addtostack(ox, oy, MOVE_UP); + } + else + return false + } + + level.player_x[level.player] = dx; + level.player_y[level.player] = dy; + + mover_new(dx, dy, move, PIECE_XOR_MAGUS + level.player, 0); + mover_new(px, py, move, PIECE_SPACE, 0); + + if(level.flags & LEVELFLAG_EXIT) + return true; + + xor_considerleftmover(px, py); + + return true; + } + + if(move == MOVE_DOWN) + { + dx = px; + dy = py + 1; + + ox = px; + oy = py + 2; + + p = level_piece(dx, dy); + if(p == PIECE_WALL || p == PIECE_XOR_MAGUS || p == PIECE_XOR_QUESTOR) + return false; + if(p == PIECE_DOOR) + { + if(level.stars_caught == level.stars_total) + level.flags |= LEVELFLAG_EXIT; + else + return false; + } + if(p == PIECE_XOR_DOTS || p == PIECE_XOR_FISH || p == PIECE_XOR_H_BOMB) + return false; + if(p == PIECE_XOR_CHICKEN || p == PIECE_XOR_V_BOMB) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE || into == PIECE_XOR_WAVES) + { + mover_new(ox, oy, MOVE_DOWN, p, 0); + bp = level_piece(ox - 1, oy); + if(bp == PIECE_SPACE || bp == PIECE_XOR_DOTS) + mover_addtostack(ox, oy, 0); + } + else + return false; + } + if(p == PIECE_TELEPORT) + { + var a = xor_teleport(px, py + 1, dx, dy, move); + if(!a[0]) + return false; + dx = a[1]; dy = a[2]; move = a[3]; + } + if(p == PIECE_XOR_MASK) + { + level.stars_caught ++; + level.flags |= LEVELFLAG_STARS; + } + if(p == PIECE_SWITCH) + { + level.switched = 1 - level.switched; + level.flags |= LEVELFLAG_SWITCH; + } + if(p == PIECE_MAP_TOP_LEFT) + { + level.mapped |= MAPPED_TOP_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_TOP_RIGHT) + { + level.mapped |= MAPPED_TOP_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_LEFT) + { + level.mapped |= MAPPED_BOTTOM_LEFT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_MAP_BOTTOM_RIGHT) + { + level.mapped |= MAPPED_BOTTOM_RIGHT; + level.flags |= LEVELFLAG_MAP; + } + if(p == PIECE_XOR_DOLL) + { + into = level_piece(ox, oy); + if(into == PIECE_SPACE) + { + mover_new(ox, oy, MOVE_DOWN, p, 0); + if(level_piece(ox, oy + 1) == PIECE_SPACE) + mover_addtostack(ox, oy, MOVE_DOWN); + } + else + return false; + } + + level.player_x[level.player] = dx; + level.player_y[level.player] = dy; + + mover_new(dx, dy, move, PIECE_XOR_MAGUS + level.player, 0); + mover_new(px, py, move, PIECE_SPACE, 0); + + if(level.flags & LEVELFLAG_EXIT) + return true; + + xor_considerleftmover(px, py); + xor_considerdownmover(px, py); + + return true; + } + + return false; +} + +function xor_evolve() +{ + var mp; + var into; + var np; + + var d; + + var px, py; + + level.oldmovers = level.movers; + level.movers = []; + + for(m = 0; m < level.oldmovers.length; m ++) + { + mover = level.oldmovers[m]; + + if(isexplosion(mover.piece)) + mover_new(mover.x, mover.y, MOVE_NONE, PIECE_SPACE, 0); + + level_setmoving(mover.x, mover.y, MOVE_NONE); + level_setprevious(mover.x, mover.y, PIECE_SPACE); + level_setpreviousmoving(mover.x, mover.y, MOVE_NONE); + level_setdetonator(mover.x, mover.y, PIECE_SPACE); + level_setdetonatormoving(mover.x, mover.y, MOVE_NONE); + + if(isexplosion(mover.piece)) + level_setprevious(mover.x, mover.y, mover.piece); + + /* Update the map */ + display_map_piece(mover.x, mover.y); + } + + while(level.movers.length == 0 && level.stack.length != 0) + { + mover = level.stack[0]; + + px = mover.x; + py = mover.y; + + mp = level_piece(px, py); + + if(mp == PIECE_XOR_FISH || mp == PIECE_XOR_H_BOMB) + { + into = level_piece(px, py + 1); + if(into == PIECE_SPACE || into == PIECE_XOR_WAVES || into == PIECE_XOR_MAGUS || into == PIECE_XOR_QUESTOR) + { + xor_considerdownmover(px, py); + xor_considerleftmover(px, py); + + np = level_piece(px, py + 2); + if(np == PIECE_SPACE || np == PIECE_XOR_WAVES || np == PIECE_XOR_MAGUS || np == PIECE_XOR_QUESTOR || np == PIECE_XOR_V_BOMB || np == PIECE_XOR_H_BOMB) + mover_addtostack(px, py + 1, MOVE_NONE); + + mover_new(px, py + 1, MOVE_DOWN, mp, 0); + mover_new(px, py, MOVE_DOWN, PIECE_SPACE, 0); + + } + if(into == PIECE_XOR_H_BOMB) + { + /* BBC XOR does *not* considerleftmover(px, py) */ + xor_considerdownmover(px, py); + xor_considerdownmover(px - 1, py + 1); + xor_considerdownmover(px + 1, py + 1); + xor_considerleftmover(px + 1, py + 1); + + mover_new(px, py, MOVE_DOWN, PIECE_SPACE, 0); + level_setdetonator(px, py + 1, mp); + level_setdetonatormoving(px, py + 1, MOVE_DOWN); + + xor_explode(px - 1, py + 1, PIECE_EXPLOSION_RED_LEFT, MOVE_NONE); + xor_explode(px, py + 1, PIECE_EXPLOSION_RED_HORIZONTAL, MOVE_NONE); + xor_explode(px + 1, py + 1, PIECE_EXPLOSION_RED_RIGHT, MOVE_NONE); + } + if(into == PIECE_XOR_V_BOMB) + { + xor_considerdownmover(px, py); + xor_considerleftmover(px, py); + xor_considerleftmover(px, py + 1); + xor_considerleftmover(px, py + 2); + + level_setdetonator(px, py + 1, mp); + level_setdetonatormoving(px, py + 1, MOVE_DOWN); + + xor_explode(px, py + 0, PIECE_EXPLOSION_RED_TOP, MOVE_DOWN); + xor_explode(px, py + 1, PIECE_EXPLOSION_RED_VERTICAL, MOVE_NONE); + xor_explode(px, py + 2, PIECE_EXPLOSION_RED_BOTTOM, MOVE_NONE); + } + } + + if(mp == PIECE_XOR_CHICKEN || mp == PIECE_XOR_V_BOMB) + { + into = level_piece(px - 1, py); + if(into == PIECE_SPACE || into == PIECE_XOR_DOTS || into == PIECE_XOR_MAGUS || into == PIECE_XOR_QUESTOR) + { + xor_considerleftmover(px, py); + xor_considerdownmover(px, py); + + np = level_piece(px - 2, py); + if(np == PIECE_SPACE || np == PIECE_XOR_DOTS || np == PIECE_XOR_MAGUS || np == PIECE_XOR_QUESTOR || np == PIECE_XOR_V_BOMB || np == PIECE_XOR_H_BOMB) + mover_addtostack(px - 1, py, MOVE_NONE); + + mover_new(px - 1, py, MOVE_LEFT, mp, 0); + mover_new(px, py, MOVE_LEFT, PIECE_SPACE, 0); + + } + if(into == PIECE_XOR_H_BOMB) + { + xor_considerleftmover(px, py); + xor_considerdownmover(px, py); + xor_considerdownmover(px - 1, py); + xor_considerdownmover(px - 2, py); + + level_setdetonator(px - 1, py, mp); + level_setdetonatormoving(px - 1, py, MOVE_LEFT); + + xor_explode(px - 2, py, PIECE_EXPLOSION_RED_LEFT, MOVE_NONE); + xor_explode(px - 1, py, PIECE_EXPLOSION_RED_HORIZONTAL, MOVE_NONE); + xor_explode(px, py, PIECE_EXPLOSION_RED_RIGHT, MOVE_LEFT); + } + if(into == PIECE_XOR_V_BOMB) + { + xor_considerleftmover(px, py); + xor_considerdownmover(px, py); + xor_considerleftmover(px - 1, py + 1); + xor_considerleftmover(px - 1, py - 1); + xor_considerdownmover(px - 1, py - 1); + + mover_new(px, py, MOVE_LEFT, PIECE_SPACE, 0); + level_setdetonator(px - 1, py, mp); + level_setdetonatormoving(px - 1, py, MOVE_LEFT); + + xor_explode(px - 1, py - 1, PIECE_EXPLOSION_RED_TOP, MOVE_NONE); + xor_explode(px - 1, py, PIECE_EXPLOSION_RED_VERTICAL, MOVE_NONE); + xor_explode(px - 1, py + 1, PIECE_EXPLOSION_RED_BOTTOM, MOVE_NONE); + } + } + + if(mp == PIECE_XOR_DOLL) + { + d = mover.direction; + + into = level_piece(px + move_x[d], py + move_y[d]); + if(into == PIECE_SPACE) + { + np = level_piece(px + 2 * move_x[d], py + 2 * move_y[d]); + if(np == PIECE_SPACE) + mover_addtostack(px + move_x[d], py + move_y[d], d); + + mover_new(px + move_x[d], py + move_y[d], d, PIECE_XOR_DOLL, 0); + mover_new(px, py, d, PIECE_SPACE, 0); + } + } + + level.stack.shift(); + } + + /* Is player one still alive? */ + if(level_piece(level.player_x[0], level.player_y[0]) != PIECE_PLAYER_ONE) + level.alive[0] = false; + + /* Is player two still alive? */ + if(level_piece(level.player_x[1], level.player_y[1]) != PIECE_PLAYER_TWO) + level.alive[1] = false; + + /* If a player has died, swap to the other player at the end of the move */ + if(level.alive[level.player] == 0 && level.stack.length == 0) + { + if(level.alive[1 - level.player]) + { + level.player = 1 - level.player; + + /* Cosmetic mover for the newly swapped in player */ + mover_new(level.player_x[level.player], level.player_y[level.player], MOVE_SWAP, PIECE_PLAYER_ONE + level.player, 0); + } + + /* Force a check for whether a redraw is needed */ + return true; + } + + return false; +} + +function xor_focus() +{ + if(level.player_x[level.player] <= level.view_x[level.player]) + level.view_x[level.player] = level.player_x[level.player] - 1; + if(level.player_x[level.player] >= level.view_x[level.player] + 7) + level.view_x[level.player] = level.player_x[level.player] - 6; + if(level.player_y[level.player] <= level.view_y[level.player]) + level.view_y[level.player] = level.player_y[level.player] - 1; + if(level.player_y[level.player] >= level.view_y[level.player] + 7) + level.view_y[level.player] = level.player_y[level.player] - 6; +} + diff --git a/browser/chroma-style.css b/browser/chroma-style.css new file mode 100644 index 0000000..9751fb5 --- /dev/null +++ b/browser/chroma-style.css @@ -0,0 +1,522 @@ +// stroke fill +// {0xcc, 0xcc, 0xcc}, {0x7f, 0x7f, 0x7f}, /* 0 */ +// {0xff, 0x99, 0x99}, {0xff, 0x00, 0x00}, /* 1 */ +// {0x99, 0xff, 0x99}, {0x00, 0xcc, 0x00}, /* 2 */ +// {0xff, 0xff, 0x33}, {0xff, 0xa0, 0x00}, /* 3 */ +// {0x99, 0x99, 0xff}, {0x00, 0x00, 0xff}, /* 4 */ +// {0xcc, 0x99, 0xff}, {0x80, 0x00, 0xff}, /* 5 */ +// {0x66, 0xb3, 0xff}, {0x00, 0x80, 0xff}, /* 6 */ +// {0xff, 0xff, 0xff}, {0x7f, 0x7f, 0x7f}, /* 7 */ +// +///* light */ - use for background blocsk +// {0xee, 0xee, 0xee}, {0x7f, 0x7f, 0x7f}, /* 0 */ +// {0xff, 0xcc, 0xcc}, {0xff, 0x00, 0x00}, /* 1 */ +// {0xcc, 0xff, 0xcc}, {0x00, 0xcc, 0x00}, /* 2 */ +// {0xff, 0xff, 0x99}, {0xff, 0xa0, 0x00}, /* 3 */ +// {0xcc, 0xcc, 0xff}, {0x00, 0x00, 0xff}, /* 4 */ +// {0xe6, 0xcc, 0xff}, {0x80, 0x00, 0xff}, /* 5 */ +// {0xb3, 0xd9, 0xff}, {0x00, 0x80, 0xff}, /* 6 */ +// {0xff, 0xff, 0xff}, {0x7f, 0x7f, 0x7f}, /* 7 */ +// +///* bold */ +// {0xaa, 0xaa, 0xaa}, {0x7f, 0x7f, 0x7f}, /* 0 */ +// {0xff, 0x5c, 0x5c}, {0xff, 0x00, 0x00}, /* 1 */ +// {0x5c, 0xff, 0x5c}, {0x00, 0xcc, 0x00}, /* 2 */ +// {0xff, 0xc0, 0x00}, {0xff, 0xa0, 0x00}, /* 3 */ +// {0x5c, 0x5c, 0xff}, {0x00, 0x00, 0xff}, /* 4 */ +// {0xae, 0x5c, 0xff}, {0x80, 0x00, 0xff}, /* 5 */ +// {0x29, 0x94, 0xff}, {0x00, 0x80, 0xff}, /* 6 */ +// {0xff, 0xff, 0xff}, {0x00, 0x00, 0x00} /* 7 white, black outline */ + + +body +{ +margin: 0px; +background: #000000; +font-family: sans-serif; +font-size: 3vw; +} + +.black, div.item.grey div.key, div.item.grey div.item-text, div.menu h1, div.menu h2 +{ +color: #7f7f7f; +-webkit-text-fill-color: #cccccc; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #7f7f7f; +text-fill-color: #cccccc; +text-stroke-width: 0.03em; +text-stroke-color: #7f7f7f; +} + +.red +{ +color: ##ff0000; +-webkit-text-fill-color: #ff9999; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #ff0000; +text-fill-color: #ff9999; +text-stroke-width: 0.3em; +text-stroke-color: #ff0000; +} + +.green +{ +color: #00cc00; +-webkit-text-fill-color: #99ff99; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #00cc00; +text-fill-color: #99ff99; +text-stroke-width: 0.03em; +text-stroke-color: #00cc00; +} + +.yellow +{ +color: #ffa000; +-webkit-text-fill-color: #ffff33; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #ffa000; +text-fill-color: #ffff33; +text-stroke-width: 0.03em; +text-stroke-color: #ffa000; +} + +.blue, div.item, div.item-options, div.instructions p +{ +color: #0000ff; +-webkit-text-fill-color: #9999ff; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #0000ff; +text-fill-color: #9999ff; +text-stroke-width: 0.03em; +text-stroke-color: #0000ff; +} + +.magenta +{ +color: #8000ff; +-webkit-text-fill-color: #cc99ff; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #8000ff; +text-fill-color: #cc99ff; +text-stroke-width: 0.03em; +text-stroke-color: #8000ff; +} + +.cyan, div.item-options div.option.selected +{ +color: #0080ff; +-webkit-text-fill-color: #66b3ff; +-webkit-text-stroke-width: 0.03em; +-webkit-text-stroke-color: #0080ff; +text-fill-color: #66b3ff; +text-stroke-width: 0.03em; +text-stroke-color: #0080ff; +} + +.black-background, div.item.grey div.key, div.item.grey div.item-text +{ +background: #eeeeee; +border: 0.06em solid #7f7f7f; +} + +.blue-background, div.item div.key, div.item div.item-text, div.item-options div.option, div.item-slider +{ +background:#ccccff; +border:0.06em solid #0000ff; +} + +.cyan-background, div.item-options div.option.selected +{ +background: #b3d9ff; +border: 0.06em solid #0080ff; +} + +div.menu +{ +position: absolute; +top: 0px; +right: 0px; +opacity: 1; +background: #ffffff; +width: 100%; +min-height: 100%; +transition: width 1s ease, height 1s ease, opacity 1s ease, top 1s ease, right 1s ease; +} + +div.menu h1 +{ +font-size: 100%; +text-align: center; +margin-top: 1em; +margin-bottom: 1em; +} + +div.menu h2 +{ +font-size: 100%; +margin-top: 1em; +margin-bottom: 0.25em; +margin-left: 1em; +margin-right: 1em; +} + +div.menu div.logo +{ +margin: auto; +text-align: center; +font-size: 125%; +margin-top: 0.5em; +margin-bottom: -0.5em; +} + +div.menu div.logo.big +{ +font-size: 500%; +margin-top: 0em; +margin-bottom: -0.125em; +} + +div.spacer { +height: 1em; +} + +div.items { +padding-bottom: 0.5em; +} + +div.item { +margin-top: 0.06em; +cursor: pointer; +width: 100%; +} + +div.item div.key { +float: left; +width: 1.5em; +text-align: center; +padding-top: 0.25em; +padding-bottom: 0.25em; +margin-left: 1em; +margin-right: 0.06em; +overflow: hidden; + +} + +div.item-text { +overflow: auto; +text-align: left; +padding-top: 0.25em; +padding-bottom: 0.25em; +padding-left: 0.5em; +padding-right: 0.25em; +margin-left: 2em; +margin-right: 1em; + +} + +div.item-text select { +float: right; +} + +div.item-options +{ +display: flex; +flex-direction: row; +flex-wrap: wrap; +justify-content: space-between; + +margin-left: 1em; +margin-right: 0.94em; + +cursor: pointer; + +} + +div.item-options div.option +{ +flex-grow: 1; +position: relative; + +margin-right: 0.06em; +margin-top: 0.06em; +padding: 0.25em; +} + +div.item-options div.option.four +{ +flex: 1 0 0; +width: 0%; +} + +div.item-options div.option.three +{ +width: 25%; +} + +div.item-options div.option div.key +{ + +display: inline-block; +width: 1.5em; +text-align: center; + +padding-top: 0.25em; +padding-bottom: 0.25em; + +margin-left: -0.25em; +margin-top: -0.25em; +margin-bottom: 0.25em; +margin-right: 0.5em; + +background:#ccccff; +border-right: 0.06em solid #0000ff; +border-bottom: 0.06em solid #0000ff; +} + +div.item-options div.option.selected div.key +{ +background: #b3d9ff; +border-right: 0.06em solid #0080ff; +border-bottom: 0.06em solid #0080ff; +} + +div.item-options div.option img +{ +width: 100%; +display: block; +} + +div.item-options div.option input +{ +float: right; +width: 3em; +height: 1em; +font-size: 100%; +} + +div.item-slider +{ +margin-left: 1em; +margin-right: 1em; +margin-top: 0.06em; +padding-left: 2em; +padding-right: 0.25em; +padding-bottom: 0.25em; +} + +div.item-slider input.slider +{ +display: block; +float: left; +width: calc(100% - 6em); +height: 1em; +} + +div.item select +{ +font-size: 100%; +} + +div.item input +{ +font-size: 100%; +} + +div.item-slider input.number +{ +float: right; +font-size: 100%; +width: 3em; +height: 1em; +} + +div.item-slider div.title +{ +text-align: left; +padding-top: 0.25em; +padding-bottom: 0.25em; +} + +div.item-left { +float: left; +} + +div.item-right { +float: right; +} + + +div.clear { +clear: both; +} + + +div.instructions p +{ +margin-left: 1em; +margin-right: 1em; +} + + + + + + + + + + + + + + + + + + + + +div#menu-icon { +display: none; +position: fixed; +top: 0px; +right: 0px; +background: #ffffff; +cursor: pointer; +transition: opacity 1s ease; +opacity: 1; +} + + + + +div.keypad +{ +position: fixed; +top: 0px; +left: 0px; +display: table; +background: #ffffff; +width: auto; +border: 1px solid black; +font-size: 16px; +} + +div.keypad.transition +{ +transition: top 1s ease, left 1s ease; +} + +div.keypad.minimised +{ +top: -125px; +left: -125px; +} + +div.keypad div.row +{ +display: table-row; +width: auto; +} + +div.keypad div.row div.cell +{ +display: table-cell; +height: 50px; +width: 50px; +text-align: center; +vertical-align: middle; +cursor: pointer; +border: 2px solid #ffffff; + +} + +div.keypad div.row div.cell div.key +{ +display: table-cell; +height: 50px; +width: 50px; +text-align: center; +vertical-align: middle; +cursor: pointer; +top: 0px; +left: 0px; +} + +div.keypad div.row div.cell div.key.cyan +{ +background:#b3d9ff; +border:2px solid #0080ff; +} + +div.keypad div.row div.cell div.key.blue +{ +background:#ccccff; +border:2px solid #0000ff; +} + +div.keypad div.row div.cell div.toggle +{ +display: table-cell; +height: 50px; +width: 50px; +text-align: right; +vertical-align: bottom; +cursor: pointer; +} + +div.keypad div.row div.cell div.drag +{ +display: table-cell; +height: 50px; +width: 50px; +text-align: left; +vertical-align: bottom; +cursor: pointer; +} + + + + + +@media (max-width: 480px) +{ + body + { + font-size: 14.4px; + } + + div.item div.key, div.item-options div.option div.key + { + display: none; + } + + div.item div.item-text, div.menu h2, div.item-options, div.item-slider, div.instructions p + { + margin-left: 0em; + margin-right: 0em; + } + + div.item-slider + { + padding-left: 0.5em; + } + + div#menu-icon + { + font-size: 200%; + } + + div.item, div.slider + { + margin-top: 1px; + } + + div.item-options div.option + { + margin-top: 1px; + margin-right: 1px; + } +} + diff --git a/browser/chroma.html b/browser/chroma.html new file mode 100644 index 0000000..e4904e0 --- /dev/null +++ b/browser/chroma.html @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-marble.svg b/browser/graphics-marble.svg new file mode 100644 index 0000000..2e1a30f --- /dev/null +++ b/browser/graphics-marble.svg @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-marble.xml b/browser/graphics-marble.xml new file mode 100644 index 0000000..f5a8a75 --- /dev/null +++ b/browser/graphics-marble.xml @@ -0,0 +1,309 @@ + + + + +Chroma Marble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-neon.svg b/browser/graphics-neon.svg new file mode 100644 index 0000000..2d60f3d --- /dev/null +++ b/browser/graphics-neon.svg @@ -0,0 +1,1300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-neon.xml b/browser/graphics-neon.xml new file mode 100644 index 0000000..b8fd0fb --- /dev/null +++ b/browser/graphics-neon.xml @@ -0,0 +1,310 @@ + + +Chroma Neon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-xor.png b/browser/graphics-xor.png new file mode 100644 index 0000000000000000000000000000000000000000..248b1b24eb844b9ebf9bca3a07f3cfcf4e04b032 GIT binary patch literal 5026 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 TG~qk{?%GTY%?&E`U0(hdtMv82 literal 0 HcmV?d00001 diff --git a/browser/graphics-xor.xml b/browser/graphics-xor.xml new file mode 100644 index 0000000..a7ef79d --- /dev/null +++ b/browser/graphics-xor.xml @@ -0,0 +1,113 @@ + + +XOR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-zen.svg b/browser/graphics-zen.svg new file mode 100644 index 0000000..b517ae3 --- /dev/null +++ b/browser/graphics-zen.svg @@ -0,0 +1,203 @@ + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/graphics-zen.xml b/browser/graphics-zen.xml new file mode 100644 index 0000000..eb00c66 --- /dev/null +++ b/browser/graphics-zen.xml @@ -0,0 +1,251 @@ + + +Chroma Zen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/levels.xml b/browser/levels.xml new file mode 100644 index 0000000..212f078 --- /dev/null +++ b/browser/levels.xml @@ -0,0 +1,831 @@ + + + + +chroma level + +title: chroma 1.01 : invitation +level: 1 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%lll%h %ll%% d%* . % *.* * % +%*l*%* h%*ll%dd%/%j * .bb*%%f%%% +%%l%% *% ll *d *%j% b %f. % +% * h % .. %%d%%%% %%%%* %ff*% +% % % *.%%%%d%d.%. . %*%b %fff% +%l l% %hh%d d%%f*f*.% %% %%%%% +%.l.% % %h*%d . %.%fff% * %* *% +% .*% %* .*% %f * % j%%% . % +%%%%%% %%h %*%% % *%%%% *..% b.% +%* *%d d%. % %*f%* jjj b% +%hhh%* *%%%%%%l%%%%% %%%%%%%%%%% +%*hh% 1 l l*.%***% * %.* %. *% +% ..%*d %l. l %...%.* b . f f% +% %%%%% %.%*%. %fff% b % *b%f *% +% %%%%%% % %%%%% .f% +% llll% %h hhh % %%% % b b f % +% ***.% %* .h*h%*..j*%%%.%%%%%%% +%%%%%%% % * . .%jjjjj% * %* *% +%ddd%d % %%%%%%%%%%%% . 2 %j j% +%.d*%* % %ddd % .f.f*f* * * % +%*. *% ...*%%*f ff%f%f% j % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.02 : illustration +level: 2 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% h *%*l% %*%c* %*g* *%*% +% .* he% .il % 2 % gf f g. % +% * *e%%%* .i % c% *% f % +% % .ee% % % b b%g.% g*% *% +% %%%%.%%% %%%%%%% *%gf %gf% +%* da%%% *i%%%%% . f f % +% da%d%% %%h% * %%k.%%%%% %%% +%* d * %*/*%cb%kkj*% % +% * %% %% h %b%bb%*%j %* cc*% % +%%% %% %eee%%%%%%%%%%% b% % +%*%%% li% *%g*.* . %*. cb *%%% +% *i %%%%% f % %%b %b % +% %%%%%%%%l l%%%%f%% %%%%%% % % +% h %d. %li.i% %%% k* %g. . % +% *e%*aa%* % % %% * % * f % +%1 % %% % %c. *%k*j. %fgg*% +%% %% %%% h % b%%%%%% %%%b%%% +% % h*e%% %%%%g.*% % c. % +% da%li% h*e % .*. %g.*% %c. *% +%*a %. % *e %%j.j %% f %%c* %% +% d%* % jk. f %cb *% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.03 : elaboration +level: 3 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%hgg*%g.%ll % %*a % h % +%gf g. .. *ee% ba *aa 1*ee% +% %% %%k* %gg* *d b b% % f % +% d %j .i% %c. cb %%%%%% +% d %% %%%%%%%%%%%%%% %d%*d% +%cc*aa% . *a d% *.l%*/*%d*% +% b %kj % .%cd *%kk.j*%b% %. % +% b %*%*%*a% d b% j %%% .% +% %% %%%%%%%%%*ccb%%%*% *he %*b% +%.eg.% l li%d%%%%%%h%%%% *fe%b*% +% fe%k* . %*. *a%h*h%* gf %%%% +%*% * *% .%%. .%% *%% %li% +%%% %%% . %%. % %k*% +%dc. % ji%c* .*%g. .e%cda% 2% +%cb *%*%*%%%%%b% * * % d %% %%% +%%%%%%%%%%%*c.%%%%% %%% b % % +%**% * %**%% d %*%* *%%%%%g. *% +%ggg. .eee%c.* %i%k. % hf% +%ff ff%% % . . li % gf% +% . . ..a%%j%*j% kl ..e% +%g* f*f *e%cb %%kj *. % f *% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.04 : detonation +level: 4 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% G*% *% %l%gF.*e% .*i*i*i% +% Gf.% gF%c*%*/*%%%%% % . % +%* %B% F % D %j% .*AA%%%%%%%J*% +%%%%*%%%%% b %*%d * % %%%% +%1d% Hl%%%%%% %c* . %LLL*i% % +% .%g* .%%k*. % b %...% %g.% +%*D% b *K% . *%%%H%%%%** %*%. % +%%%%%%%%%%* J j%* . *e%%%%%E*Ee% +%*Ee%l %%%%%%%% d % % +% %*cC*% h %g.* G% * %%%%%% +%g* % %%%gG* . %%%%%*% k. % +% f %L %*% H*% l %%%C.A%kK.*% +%%%%%%%%h%%%%%%%% l *% * % kK.% +% .%.*%.% d% . %%%%%%% % +%Cdb%Jl% %c*A.aD%%K.%* %%%%%% +% d %*.%H% .*%*K%%% *a%G*.E% +% * %j %%%%%%%%%%% *%*% b %d *% +% . % L% . *%%%%%%%%%%%%%%% +%%%%%%%%%%f%g* G% l %h h %I *i% +%*%*%L l %gGf%gg%% L %* H % % +%f%D%* *i%*gf .*%*.k% * %*D 2% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.05 : complication +level: 5 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %B 2 D% %l% %d l % +%.Iaei%Fc*iH% l d %.e *Aa %*1* % +% %J L% .h. % * %H .e% +%%%%%%%%%%%%% * % %%%.%%%%%% +% l h d %*l*%%A%K%%I %*%L% h d% +% . . . %ji%%%%%%%%%%%% %%% . .% +%* %%%%l *%*%* *% d % K% +%%%%%%%E%GA%h %%%b dj% l % % +% %%% %d % l % * % k* % +% dlh % * %.*Aa % hA% % C% +%*... f % % . %KCK%%%%%% +%.EEe % b.i%*%%%%% %%%%%%%%% *% +%%%%%%% %I%* D%%% %c* *% Dj% +%c* *%%%%%%%%E . *.ei%%%% % gD% +%%%%%%% d%c.*%* B% b *%D% % *% +%*l%L %*a%%h%%%%%%%%% %%* %% %% +% .%* . *% H %H %k*i% +%%%%D %e %% %d% H .I %* L % % +%c*%. % *%k% . * % * %DDH% +%%/%* %.i% %%A% .AA%HDL%%...% +%g*%H j % *%L %fbja%***% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.06 : transportation +level: 6 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% *e% .% *% *%*% %B *% .*h % +% /J *i f% %.% %go o % *o% +% *a% .% %% % % % o % +% %%% %oooo% oa% . G%o* % +% k*% *a % % % %%% % +%%%%%%%%%%%%%%%%%% %%% * %*%%% % +%Dk. *L % % *a %h%%%%%%%. *% +%* % o %%% % *% o %oa%% +% %c.* %G%%%%% % o *% +%*.go %* %%% %kL o %% %% +%B o%f %cc. %%% % % +%%%%%%%A%%%%%% oo Da% . *i%ooo% +% % % o %*% % 1 % +% o Hoo o g% * %%%%%%%%%% %% +% % * %%%f %* .e% * % +% g* %%%%b%%%%K%%%%%%%c.C*% %%%% +% *%%% . %* *% %%% l % +%%%%%%d%% *% .o. %e . % +% . % o % o*o *%% c% +% o 2 *% . o % .o. % di%* % +% D% j %* *%*ie%%f * % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.07 : collaboration +level: 7 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% J%*%*%B F%*% d %h*% +% C. %%%%% * * % o . %%%% +% jC. % % % % % %%%. K.*% +% h * % b %k%B % +%%%%%%%%f %%%%f%%%%%% . *%%%%% +%* .a.a%i1% *. lli%*%H %%%%% Da% +%%%* B % %kjj .*%% %%%%* %* *%% +% %*G%%%%%%%% % .%f %% +%*%%g* %%%% * %c. l c. . o % +% %% % .ji% *%%cc%h %% +%oo % %cc* % jkj%* D * %. *%% +% %% %% j %%%%%%%%%%%%%%%%% Ba% +%*%% %%j % k.* Fa%lll % %%% +%%%g.%.e%%%% g. %*%kD. % %h% +%A% *b* %2 % %k% . *a%*/*% +% %%%%%%%*i%.a *% % L% %j% % +% %J j b %%%%%%%%%%%%%% +%%* d %%%%%%%%%%% l % * C% +%gb h *a F %* oa % f h% +%%% L %% * . %%%. % b * *% +%*% . *i f %*%L g* H% j % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.08 : preparation +level: 8 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%*% .a% d . %*j %k* *% +% * % h o % D*f % o %%%%% D .% +% be% .e% *%2.%%%%e %IEA% H. % +%%* % c* % D* % *a% % D* % +%*f % . *%%%% % %%%%% *%% . % +% ja% j %%%% %d*e% b %% %%% +%%%%%%%%%* d oooo %hl f %K.Il% +% . . . . .% o o %la % j %j k*% +%* . . . . o o %*1 %%%%%%%%%% +%A%%%%%%%%%% oooo %c. % f % +%%% %e% % d * k% +%l%c*c*c*C*%%%%%%%%%%%%%% % % % +%.% %e%*%* D%*a% . .% g% +% %* *%%%%%%%% g. .%%/%% o % +%I%G.E%d% J % . % *a% d % +%%%%*%%. k.K% c. .Ho%%%%%%%%%C% +% J %*% %* %%%* b% +% g. %%%%% *%%%%%%%d%% L H D %% +% % dh% j%he%D .%H . . .*a% +% k* C%dahe c%gh%* %* . . . %% +% b %* . * . %L%F . *% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 1.09 : application +level: 9 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% c* %h le%* % *e*%. *%*a% +% h c*%. d %b . da gco %/%% +%K. % . % %biEe%* B .%*e% +% * %E* %%%.%%%%%%%% F %%%%%%% +%. .*%kc. l% % d%%%%% % +%*i G% %l*% % H * . % D2d % +%%%%%%%%%%.%% % % % %aei% G* *E% +%I h C% . %l%1 .i %l % +%* . *% *%%%%%%%%%G%* %*% % +%% cie %* . % %%%%%%%%%% +%l*af %f % %%%%%%% B .ab % +%G%%%%%% * %%% Lh %E o.e kh % +% %C* *A% *. % * K*% +% * % %%% . b% d %%%%% %%%%%%% +% % %%f%%%%gg. %H*l% ha*% +% o . . d%L% %%%* .e.%%% o %% +% . . .*%%%g.Ha% *% %*%. % +%C%%%%% %%ka k*%%%%%%%%%% %***% +%%% *% %%Ik* .II% d %GGG% +% g.c. D %%%%% %%%% . *Aa%%%%% +%* j % f* *%*% *a *%*D %*%k*i% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + +chroma level + +title: chroma 2.01 : inauguration +level: 1 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%h h l%l d% ld% *.f.* %.*...*.% +%. *d*%*h *%h.*%*bj. j %fbfjfbf% +%* l. % d %.d % ..b.f %.j.2.j.% +% d.h %.*..%l*.%* fjfb.% % +% . ..% hd.h %%%%%%%j%%%%% %%% +%*l l .. * % .b *%*% +%%%%%%%%%%%%%%d%.fj %%%%%%%%b% % +%*dhdh%l.d%dh .%*.f %*.f..*%j % +%l.d.l%*h*%ldl % b% %.j.b.j%f% % +%dhldh%h.l%h.h%%% % %f.j...%bj.% +%l.h.d%.d.%d%. */*% %.b.f.b%f%f% +%. . . * * %%%f%.%%%%%j%%%% % +%%%%% % %%%% %%d%j% b f.% +% d1%h d %l *%%%%%%%%%f% b% +%l.h.l%.l..%.%l %* *%*%*%j%* *j% +%*d.h.% h. %h%. %...%.%.%f%j.f.% +%h.l.*%*.*d%l%d %jfb.f.j.b% . % +%%%%%%% %%%%d%h % j.b. *%*b* % +%* l d h . %.* .j.f j%f.j*% +%dhlhd%.%% %*%% %bj *. *b%j*bf% +%...*.% %* *%*f f jf%bjfj% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.02 : manipulation +level: 2 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% f %* .% *g. %* h %.* l% +%g* b %jcg. f%cj *% d la %hlae% +% *j %gk.j .% kb% . *.e%dh%*% +%c*j. * %fb j *f%%h%i *aiea% +%%%%%%%%%%%2%%%g%%% . . .i% +%%c*% k.* *% .*%*%%%%%%%%%%%% +%gj.* g*.% fkb% kb% l ha% hd*% +%* . j%c.f % f%%% . *i % .le% +%%%%%j% %%% %%%.%%*d %.%%e% *a % +%gc* % f %* f*% . *% +%kf % %*g.k. c.%1%%%%%%%% %%%% +%ck. .%j b*j%k. % *%h d d.i% +%* *j%%%%%%%%%%%%%aie%*ah l.e % +% . b . .% *a * . % l .a *% +%g.% % % j.b%ahle%%%% %%*%%%%%%% +%j c* *% gbf%*dea% l %d hi de*% +%c.k.%j% bj*% . *.e *a%..a *h % +%g*.f%%%%%%%%%%l%% %% %l .e l.% +% k. %k* %d%* . %.* %% d.% +% .g.%c. .%*/*% * lea%%%d% *i% +%* b j *.f% .ai*%* . *e*% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.03 : edification +level: 3 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%*d *k* d . . % d h %gl% +% hide% .. hajgj % g..* *i %la% +%gl kb% g. * *%%%*% ck. . % +% * *%cl k%%%l%%%* .e.a% *% +%%%.%%% .*ha% .le%%%% %%%%%%%%% +% gj*%* *fi %gc.. %* l *%h *l*% +% %*%%%d%%%%%%* %*% .d. %c. . % +%c* .lh l*%kd.% % kc*ai *...e% +% . .b.d .h%jg.* % % .b1 %kfb % +% f j *.* .%c. % %.%* j *%%%%%%% +%%% %%% %%%%* %%% %%% %%%h*.*a% +%*f.l*%.i*%*kg*% c. %.a. * k. % +%k.b.g%.e %l% %cf..i% fj% ..bh% +%.a2c. %b*/*%.a%* f *%cjb%lb .% +%e.d.i%%%j% %%%%%%%j * . *e*% +%*j.h*%*%%%%%%%%*l h %%%%%%%%% % +%%% %%% . l %.. *e%*h* d % +%lc.h %%%je .*.%f j %%.b k.*hi% +%*e l. %aj d %*a%.*%cl .f .*f% +% .a% * .e..*i .ib % . * l .a% +%*%.* %.% b *a% .e% b .d % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.04 : disintegration +level: 4 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% l *%*%kK* *%F* h .B D*% +% Kl %%% L . kK*%%% . %A.c.C% +% .Ll %k. j jiK%*%.%g%E% b2d % +%%%.L * %*j %%%*h % %A.a.C% +%*% .*j %%%%%K.i * %f. %*%*B D.% +%%%%%%% %* %%K.ij*%%% %%%%%%% % +%*.e gG*% h %%L.i %*% . % +%.egG...%%.E %%%%%%%% L l % +% 1* %* g. % HG..e% K*I k*i % +%...Aac.% .e % h % J j %% +%*Aa c.*%*% % . .eG*e%. .% +% %%%%%%%E%%%%% * %%%%%%%k*.*i%% +% h %fee%h%*g. g* %%j%j%%% +%%. .*eE%%%*/*%%%%%%%%%%%%%%%%*% +%%h %*%f% g. %*%*%g*F.e% K% +% .*e. %%%%%%%%%%%% % * %.i*% +%*H G%A* d% h.eF. %. j% +% %%%%%%%%% *cC*%d% % F %j % +% %*%*%*.Aa B*% H * % +%%kLi %%%%%b .Aa%b %%%g.H.e%*Ji% +%K*. *L% * %*%*H*eF%Ji % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.05 : triplication +level: 5 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% l l %*% 1 %*% d %* H d % +%k. . %%% l d %%% % % %l% . D % +% J gd % .h. % . . %. f .I% +%%% G*% % D.L %C% %e% % c.* %%% +%*% D %h% .H. % . . % %*% +%%%%%%%%.% . % % % % %*g*%%%%% +% %.g.E% %%%*%%% j F %kb %d%l% +% *j % %*%%%%%%%%%%%%%*/*% +% %a%%% %%%%%%%%* c* J%*g.e % % +%*LHD % %* .a% d % %*%%% %%% % +% ... % %% %% .i %%%%% % % % % +%%jfb %a% %* h L%c. . . .*% +% % % . k. .%*f L %%% +%C.*.a%%%*%%C.a lg.E%%%lc*. .*% +%%%%%%%*% %%*%k*%*%%*%. F Bi% +%l%*%*%%%.%%%%%%%%%%%%%*.i j % +%*d %lg.E D %ch*%E%%%%%%%%%% +% l.Di%*d L . %%%%% h % +%he . % . k. *% * * .AI.IA2% +%*. %%% c. *.e%%%%% f % +% g*E%*% b*%kF*%*g.E G.e*% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.06 : orchestration +level: 6 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%*a h. %*% %J %DH d .*% +%bo oi.a%%%DgoE %%Dd.i .*% o .% +%*l .I.%cC. b %*.. %b% o % +% . % %%% goG%%%.1 oe% +%%%%%%%%% l .Ii%*. %*%*. % +%* j G% GoeJ%%%%%k.o %%%%%A% +% o % %*%*% L%*%*. la% +%A o %% %%%%%%%%%%%%%%%. . % +% 2 o % . *% h %d% % . % +% l o %c.%%oL %co.i%*/*% . % +% f %k*e% .*% *Da%j% o % +%%%%%%%%%%%A%%%%%%%%%%%%%% b .I% +%*% .o. %%h* l* .*% h *% +% %.o o.%*. .*.*. .*% .a%%%%%%% +%. o o o *b%%%% %%*%g*E% +%%%.o o.%%%%%%%%%G%% % d*l % +%*% .o. % .* .d.L o o % .o. % +%%%%%%%%% .o %%%% o o % o o % +% h *A%c* h .a*% o o %. o .% +% o.o.i%% o . %%% o o %I%.%C% +% b %D* %*% o o %f*f*f% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.07 : augmentation +level: 7 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%*%*% D %*Ad %.%1 % 2%* %F%*% +%%%%%goH%%%k*L%*% l o d %co%%%%% +% %* .%.% %%a% D L %kK. . % +%C*A%%%%%*%* *%.% . . % . .% +% . % H % %%%%%%% * * % fDd j% +% b % . .*% . %% %%% %% c* j% +% b % h %a%%% %G.ehG.e%%%%%%C% +%G.E% *. % * .% %h% % l % +% * % %J% %%o B %%%%%%%%a . %.% +% f % b *%c. j %. Ha% *%K% +%%%%%%%%%%%%%%%%% * *ae%%%%%%%%% +% * %J%*l %*f . Fa% d % *.% +% d % C.a%H%.%%% %%%%%.K.%o%b% +% . h %%f %%L% *a% %. *% * * % +% D . H%% .%%/%% % o %.k.%%%%% +% . B .*% %%J%c* .L% .% f %G.e% +% o .f%%oe%F%%%%%D%kK*%%%%%kBa% +% L f % . %. % .* % l*% .i% +%k% l %c* %j . %%B%%% %h.a% b % +% % . *.i *%H b o J % . . %%b%% +%*b*%* %g*.%*e c*%%*%*%kL* *% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.08 : conflagration +level: 8 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%*B.D.B*% l .*%*Bla* % H*%. L .% +%A.C.B.C% * .%%kgc. % *A% L1 % +%.A.b.D.%%%e. % d %c. %KK*II% +%C.a2c.A* o * .% .*.E%.o % J % +%.B.d.C.%%%*EE %* *%f *%. J .% +%A.D.A.C% f %fLe%%%%%%%%%%%%% +%*D.B.D*%*II%%l%%%*%E%*%I%*a *% +%%%%*%%%%%%%%*.*a%%%. D%%%cgoeG% +% % % %h h%BH %% h* . %. D .% +%kL%oii*%gH*%B. %c.j *% %%%%%%% +% * *. j% . % .%%% . . .*.*% +% k* %% .a% %%J% %%% f h% +%%%%%%%%%%%%I* %*i% j*%*%*D .a% +%. J .%*%d*%%%%%%%%%%%%% %%%%%%% +% g*i %%%.h%*.ae * c* .% * *i% +% B %* .%% %oC% L%h %f%I.i/%% +%h H % .i %*h% % .di %b%% *i% +%* %%% %d.k. %I * %%% d.%%% +%FD %E % %%* j h l%el % +%%L.*. la %%% g* %%%* *%dhae % +%*%b%f*a D*%D%H. %H%.aH%*.* L% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.09 : restoration +level: 9 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%*h.aL% *i l k* % H %d* .%*%*d% +% * k.% H l H %gKoi%kh B%%%je% +% *% de%%%gD % .a%*. *%* % +%g.* % * . . * % D *%%% o % *% +%jc. *%. % % .%*D%%%* J B% +%%%%%%%%%%% %%%%%%%%*%%%.a H.%%% +%d .J%*%*%.*2 1E %%%G%b Jj%*% +%k. .C% %f%c%DDDD% . %f*%%%%%% +%Ag. %o%%% %....% L %%%% *d % +%* b * * .%*.%****% *a%*%* % % +%%% H .%%%%%%%%%%%% f %%%% H.e% +%*%* .ab%dl%*%C*.*A% . % *%%%% % +%.%%%%%%%kd%%%%kFi%%%%%% %%ck* % +%*a*% % *%c*%% . d .*%I%gkb. % +%.o .e* . %. .fcJ %%%%%%%%% +%b. %k* %%C%c.i%C%%%%%%%*% l . % +%I*.%% *%.% * %c* %D%.% d b % +%%%%%E c.%%% . %%%e%*jI%L* o f % +% %d%*cl %*%%*E%* .% .*%.% * J % +%*/*% L.%%%A .ai%*ji%*% j % +%j% %D . b*%D %L * %Bj.% h . f % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.10 : perturbation +level: 10 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%c*1D%*.* h % .*a % . %hd le% +%%%%%%%%g*%*% % .%*% %D%.%*. . % +%. %g. J %gk. C*A %%%%%%% +% K* K% *i%* .%.%B% % .a%*% +% .fEk*%a.Ad %%%c*% . %o* %%% +%c*f j% * *%.%*%%%%%% %%%%l*%C% +% .2 %*%%%%%%gG.%c.%c* *a%*b %.% +%%%%*%j%Gg. g* %%%%%. .%%%%%%G% +% *%%%E%.*g. j *%*B*%B*B% %*%%% +%co% %%% f * b% %.% F %ih *C% +% %%l%%%%%f% bf% f % %. % +% . *i%kg.B%C.ja.%G% J % %%K% % +% * .a%.a %* be %*% j % D% b % +% .F %glGkD . % %%%%% *% .*% +%.f l %jg*.%.%%%%%*k.%L % *G% +%f . %%%%b%*/*% %%%%%%%K*%ej.% +%I%%%%%% %%%b%j%ld c.G*% B%k*b% +%ch%*D %%%Laa*gj %%%%%%%% +%.i%c. . g*%he f K.% . .*a% +% .Ee *i .o d %H% *i%%B.f. % +%* %* J f . %*%D* j %* b f % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.11 : bifurcation +level: 11 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%l%H d . %* h%% h h .%D *% +%*%. . B j %. L lk.*a. B%*g. %% +% o D%%* % *. * % *aK% +%g. * %b%%% b*H Ge %L.i *% +% .* .aG%%%%%%%%%%%%%%%%%%%%%% +%a j %%%k%G. . %l %%%* . K*% +% .%I%%%*%%%* f%%B.a%h ga%%% +%k.f% %h%%% B. g. . G%. . g.A% +%d%%%*/*%k% . % b %%* %% +%*%cgbA %%%. b. %%% %%%%%. . Hi% +%%%%% G.eh%f. % d C%*f f o%% +%*B %%* %l% * *a%ck*e *%%A.a % +% .*d%b*%d% B f % g.* H%*%%%%*% +% bFK%%gb.%l% %%%%%%%%%%%%%*.%%% +%* .e % %.% .i *%h%d%* l .% +%.a * % %%g. Fiaei%..fl C% +% . .K%c% %%%%%% %%H% %% *a % +% c.f %L% % *% . %. % +% d * %%% %%B% * .e%BL *i% +%.I%H% .j D%oh%c* o %D%%%.2.I% +%*%j*f C. .% *%I%H*e bi%1%f b% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +chroma level + +title: chroma 2.12 : culmination +level: 12 +size: 32 23 + +data: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%***e%*% .%d%d%* Ji% % +%CCC%%H%kk* * %*/*% %I*i% *a.e% +%b .% .% d. J % %.% d %% % +%% %II%%cDFae % % %%% o.e%.k.*% +% %* .f j % l . *E% b % +%k. *% %k. *%%% h.j %%%*a % +%c. %%%%%%%%%%f%*% HcC* .%* b % +% K. o%B %%%%%%%%%l%%%F%%%%% +% *. *.e *%.d %kkd%%% % +% b *k% H %% o %***% *a% +%%%%%%%%%%%.e* % L %%%%% d % +%i % %%*k. dI% *.l % +% * .* d %....d%j . jA%* * % +%. l *a%jjbf*%%%%%%%%%% k*ee% +% %% h %%%%%%%%%* D%A%BK% dF % +% g% .AA% l% 2ec.B%%%%%%%% 1L%% +% * % * o % * %*. .a % +% % %%ji% h Lci% H K%f%. % % +% l %%%% %%%.% . *% D %%% *e % +%K. o%g*k. .%J% * %%%*i *%%%%%% +%j % %.L b .I%*% .iae%*% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + diff --git a/browser/preview-marble.svg b/browser/preview-marble.svg new file mode 100644 index 0000000..e8d6d5c --- /dev/null +++ b/browser/preview-marble.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/preview-neon.svg b/browser/preview-neon.svg new file mode 100644 index 0000000..491794c --- /dev/null +++ b/browser/preview-neon.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/preview-xor.svg b/browser/preview-xor.svg new file mode 100644 index 0000000..1c2c240 --- /dev/null +++ b/browser/preview-xor.svg @@ -0,0 +1,17 @@ + + + + +image/svg+xml + + + + + + + + + + + + diff --git a/browser/preview-zen.svg b/browser/preview-zen.svg new file mode 100644 index 0000000..960ada9 --- /dev/null +++ b/browser/preview-zen.svg @@ -0,0 +1,30 @@ + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chroma.h b/chroma.h new file mode 100644 index 0000000..96c8333 --- /dev/null +++ b/chroma.h @@ -0,0 +1,30 @@ +/* + chroma.h + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#define XOR_COMPATIBILITY +#define ENIGMA_COMPATIBILITY + +#define DEBUG_MENU 1 +#define DEBUG_ORDER 2 +#define DEBUG_SPEED 4 +#define DEBUG_MOVERS 8 +#define DEBUG_HIDDEN 16 + diff --git a/chroma.nsi b/chroma.nsi new file mode 100755 index 0000000..aeeb9c2 --- /dev/null +++ b/chroma.nsi @@ -0,0 +1,2723 @@ +; Script generated by the HM NIS Edit Script Wizard. + +; HM NIS Edit Wizard helper defines +!define PRODUCT_NAME "Chroma" +!define PRODUCT_VERSION "1.16" +!define PRODUCT_PUBLISHER "Amf" +!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\chroma.exe" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" + +; MUI 1.67 compatible ------ +!include "MUI.nsh" + +; MUI Settings +!define MUI_ABORTWARNING +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" + +; Welcome page +!insertmacro MUI_PAGE_WELCOME +; License page +;!insertmacro MUI_PAGE_LICENSE "..\..\..\..\path\to\licence\YourSoftwareLicence.txt" +; Directory page +!insertmacro MUI_PAGE_DIRECTORY +; Instfiles page +!insertmacro MUI_PAGE_INSTFILES +; Finish page +!insertmacro MUI_PAGE_FINISH + +; Uninstaller pages +!insertmacro MUI_UNPAGE_INSTFILES + +; Language files +!insertmacro MUI_LANGUAGE "English" + +; MUI end ------ + +Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" +OutFile "chroma-setup.exe" +InstallDir "$PROGRAMFILES\Chroma" +InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" +ShowInstDetails show +ShowUnInstDetails show + +Section "MainSection" SEC01 + SetOutPath "$INSTDIR" + SetOverwrite try + File "chroma.exe" + File "chroma-curses.exe" + File "COPYING" + File "README" + CreateDirectory "$SMPROGRAMS\Chroma" + CreateShortCut "$SMPROGRAMS\Chroma\Chroma.lnk" "$INSTDIR\chroma.exe" + CreateShortCut "$SMPROGRAMS\Chroma\Chroma Curses.lnk" "$INSTDIR\chroma-curses.exe" + CreateShortCut "$DESKTOP\Chroma.lnk" "$INSTDIR\chroma.exe" + SetOutPath "$INSTDIR\colours" + File "colours\chroma-enhanced.chroma" + File "colours\chroma-enigma.chroma" + File "colours\chroma-monochrome.chroma" + File "colours\chroma-reverse.chroma" + File "colours\chroma-standard.chroma" + File "colours\fallback.chroma" + SetOutPath "$INSTDIR\help" + File "help\README" + SetOutPath "$INSTDIR\graphics\chroma-marble" + File "graphics\chroma-marble\16_arrow_blue_down.png" + File "graphics\chroma-marble\16_arrow_blue_left.png" + File "graphics\chroma-marble\16_arrow_blue_right.png" + File "graphics\chroma-marble\16_arrow_blue_up.png" + File "graphics\chroma-marble\16_arrow_green_down.png" + File "graphics\chroma-marble\16_arrow_green_left.png" + File "graphics\chroma-marble\16_arrow_green_right.png" + File "graphics\chroma-marble\16_arrow_green_up.png" + File "graphics\chroma-marble\16_arrow_red_down.png" + File "graphics\chroma-marble\16_arrow_red_left.png" + File "graphics\chroma-marble\16_arrow_red_right.png" + File "graphics\chroma-marble\16_arrow_red_up.png" + File "graphics\chroma-marble\16_arrow_shadow_down.png" + File "graphics\chroma-marble\16_arrow_shadow_left.png" + File "graphics\chroma-marble\16_arrow_shadow_right.png" + File "graphics\chroma-marble\16_arrow_shadow_up.png" + File "graphics\chroma-marble\16_bomb_blue_down.png" + File "graphics\chroma-marble\16_bomb_blue_left.png" + File "graphics\chroma-marble\16_bomb_blue_right.png" + File "graphics\chroma-marble\16_bomb_blue_up.png" + File "graphics\chroma-marble\16_bomb_green_down.png" + File "graphics\chroma-marble\16_bomb_green_left.png" + File "graphics\chroma-marble\16_bomb_green_right.png" + File "graphics\chroma-marble\16_bomb_green_up.png" + File "graphics\chroma-marble\16_bomb_red_down.png" + File "graphics\chroma-marble\16_bomb_red_left.png" + File "graphics\chroma-marble\16_bomb_red_right.png" + File "graphics\chroma-marble\16_bomb_red_up.png" + File "graphics\chroma-marble\16_bomb_shadow_down.png" + File "graphics\chroma-marble\16_bomb_shadow_left.png" + File "graphics\chroma-marble\16_bomb_shadow_right.png" + File "graphics\chroma-marble\16_bomb_shadow_up.png" + File "graphics\chroma-marble\16_circle.png" + File "graphics\chroma-marble\16_circle_double.png" + File "graphics\chroma-marble\16_circle_double_shadow.png" + File "graphics\chroma-marble\16_circle_shadow.png" + File "graphics\chroma-marble\16_door.png" + File "graphics\chroma-marble\16_door_shadow.png" + File "graphics\chroma-marble\16_dots.png" + File "graphics\chroma-marble\16_dots_double.png" + File "graphics\chroma-marble\16_dots_double_shadow.png" + File "graphics\chroma-marble\16_dots_shadow.png" + File "graphics\chroma-marble\16_dots_x.png" + File "graphics\chroma-marble\16_dots_x_shadow.png" + File "graphics\chroma-marble\16_dots_y.png" + File "graphics\chroma-marble\16_dots_y_shadow.png" + File "graphics\chroma-marble\16_map_bottom_left.png" + File "graphics\chroma-marble\16_map_bottom_right.png" + File "graphics\chroma-marble\16_map_shadow.png" + File "graphics\chroma-marble\16_map_top_left.png" + File "graphics\chroma-marble\16_map_top_right.png" + File "graphics\chroma-marble\16_player_one.png" + File "graphics\chroma-marble\16_player_one_swapped.png" + File "graphics\chroma-marble\16_player_shadow.png" + File "graphics\chroma-marble\16_player_two.png" + File "graphics\chroma-marble\16_player_two_swapped.png" + File "graphics\chroma-marble\16_space.png" + File "graphics\chroma-marble\16_star.png" + File "graphics\chroma-marble\16_star_shadow.png" + File "graphics\chroma-marble\16_switch.png" + File "graphics\chroma-marble\16_switch_shadow.png" + File "graphics\chroma-marble\16_teleport.png" + File "graphics\chroma-marble\16_teleport_shadow.png" + File "graphics\chroma-marble\16_wall.png" + File "graphics\chroma-marble\16_wall_inside.png" + File "graphics\chroma-marble\16_wall_inside_shadow.png" + File "graphics\chroma-marble\16_wall_outside.png" + File "graphics\chroma-marble\16_wall_outside_shadow.png" + File "graphics\chroma-marble\16_wall_x.png" + File "graphics\chroma-marble\16_wall_x_shadow.png" + File "graphics\chroma-marble\16_wall_y.png" + File "graphics\chroma-marble\16_wall_y_shadow.png" + File "graphics\chroma-marble\20_arrow_blue_down.png" + File "graphics\chroma-marble\20_arrow_blue_left.png" + File "graphics\chroma-marble\20_arrow_blue_right.png" + File "graphics\chroma-marble\20_arrow_blue_up.png" + File "graphics\chroma-marble\20_arrow_green_down.png" + File "graphics\chroma-marble\20_arrow_green_left.png" + File "graphics\chroma-marble\20_arrow_green_right.png" + File "graphics\chroma-marble\20_arrow_green_up.png" + File "graphics\chroma-marble\20_arrow_red_down.png" + File "graphics\chroma-marble\20_arrow_red_left.png" + File "graphics\chroma-marble\20_arrow_red_right.png" + File "graphics\chroma-marble\20_arrow_red_up.png" + File "graphics\chroma-marble\20_arrow_shadow_down.png" + File "graphics\chroma-marble\20_arrow_shadow_left.png" + File "graphics\chroma-marble\20_arrow_shadow_right.png" + File "graphics\chroma-marble\20_arrow_shadow_up.png" + File "graphics\chroma-marble\20_bomb_blue_down.png" + File "graphics\chroma-marble\20_bomb_blue_left.png" + File "graphics\chroma-marble\20_bomb_blue_right.png" + File "graphics\chroma-marble\20_bomb_blue_up.png" + File "graphics\chroma-marble\20_bomb_green_down.png" + File "graphics\chroma-marble\20_bomb_green_left.png" + File "graphics\chroma-marble\20_bomb_green_right.png" + File "graphics\chroma-marble\20_bomb_green_up.png" + File "graphics\chroma-marble\20_bomb_red_down.png" + File "graphics\chroma-marble\20_bomb_red_left.png" + File "graphics\chroma-marble\20_bomb_red_right.png" + File "graphics\chroma-marble\20_bomb_red_up.png" + File "graphics\chroma-marble\20_bomb_shadow_down.png" + File "graphics\chroma-marble\20_bomb_shadow_left.png" + File "graphics\chroma-marble\20_bomb_shadow_right.png" + File "graphics\chroma-marble\20_bomb_shadow_up.png" + File "graphics\chroma-marble\20_circle.png" + File "graphics\chroma-marble\20_circle_double.png" + File "graphics\chroma-marble\20_circle_double_shadow.png" + File "graphics\chroma-marble\20_circle_shadow.png" + File "graphics\chroma-marble\20_door.png" + File "graphics\chroma-marble\20_door_shadow.png" + File "graphics\chroma-marble\20_dots.png" + File "graphics\chroma-marble\20_dots_double.png" + File "graphics\chroma-marble\20_dots_double_shadow.png" + File "graphics\chroma-marble\20_dots_shadow.png" + File "graphics\chroma-marble\20_dots_x.png" + File "graphics\chroma-marble\20_dots_x_shadow.png" + File "graphics\chroma-marble\20_dots_y.png" + File "graphics\chroma-marble\20_dots_y_shadow.png" + File "graphics\chroma-marble\20_map_bottom_left.png" + File "graphics\chroma-marble\20_map_bottom_right.png" + File "graphics\chroma-marble\20_map_shadow.png" + File "graphics\chroma-marble\20_map_top_left.png" + File "graphics\chroma-marble\20_map_top_right.png" + File "graphics\chroma-marble\20_player_one.png" + File "graphics\chroma-marble\20_player_one_swapped.png" + File "graphics\chroma-marble\20_player_shadow.png" + File "graphics\chroma-marble\20_player_two.png" + File "graphics\chroma-marble\20_player_two_swapped.png" + File "graphics\chroma-marble\20_space.png" + File "graphics\chroma-marble\20_star.png" + File "graphics\chroma-marble\20_star_shadow.png" + File "graphics\chroma-marble\20_switch.png" + File "graphics\chroma-marble\20_switch_shadow.png" + File "graphics\chroma-marble\20_teleport.png" + File "graphics\chroma-marble\20_teleport_shadow.png" + File "graphics\chroma-marble\20_wall.png" + File "graphics\chroma-marble\20_wall_inside.png" + File "graphics\chroma-marble\20_wall_inside_shadow.png" + File "graphics\chroma-marble\20_wall_outside.png" + File "graphics\chroma-marble\20_wall_outside_shadow.png" + File "graphics\chroma-marble\20_wall_x.png" + File "graphics\chroma-marble\20_wall_x_shadow.png" + File "graphics\chroma-marble\20_wall_y.png" + File "graphics\chroma-marble\20_wall_y_shadow.png" + File "graphics\chroma-marble\24_arrow_blue_down.png" + File "graphics\chroma-marble\24_arrow_blue_left.png" + File "graphics\chroma-marble\24_arrow_blue_right.png" + File "graphics\chroma-marble\24_arrow_blue_up.png" + File "graphics\chroma-marble\24_arrow_green_down.png" + File "graphics\chroma-marble\24_arrow_green_left.png" + File "graphics\chroma-marble\24_arrow_green_right.png" + File "graphics\chroma-marble\24_arrow_green_up.png" + File "graphics\chroma-marble\24_arrow_red_down.png" + File "graphics\chroma-marble\24_arrow_red_left.png" + File "graphics\chroma-marble\24_arrow_red_right.png" + File "graphics\chroma-marble\24_arrow_red_up.png" + File "graphics\chroma-marble\24_arrow_shadow_down.png" + File "graphics\chroma-marble\24_arrow_shadow_left.png" + File "graphics\chroma-marble\24_arrow_shadow_right.png" + File "graphics\chroma-marble\24_arrow_shadow_up.png" + File "graphics\chroma-marble\24_bomb_blue_down.png" + File "graphics\chroma-marble\24_bomb_blue_left.png" + File "graphics\chroma-marble\24_bomb_blue_right.png" + File "graphics\chroma-marble\24_bomb_blue_up.png" + File "graphics\chroma-marble\24_bomb_green_down.png" + File "graphics\chroma-marble\24_bomb_green_left.png" + File "graphics\chroma-marble\24_bomb_green_right.png" + File "graphics\chroma-marble\24_bomb_green_up.png" + File "graphics\chroma-marble\24_bomb_red_down.png" + File "graphics\chroma-marble\24_bomb_red_left.png" + File "graphics\chroma-marble\24_bomb_red_right.png" + File "graphics\chroma-marble\24_bomb_red_up.png" + File "graphics\chroma-marble\24_bomb_shadow_down.png" + File "graphics\chroma-marble\24_bomb_shadow_left.png" + File "graphics\chroma-marble\24_bomb_shadow_right.png" + File "graphics\chroma-marble\24_bomb_shadow_up.png" + File "graphics\chroma-marble\24_circle.png" + File "graphics\chroma-marble\24_circle_double.png" + File "graphics\chroma-marble\24_circle_double_shadow.png" + File "graphics\chroma-marble\24_circle_shadow.png" + File "graphics\chroma-marble\24_door.png" + File "graphics\chroma-marble\24_door_shadow.png" + File "graphics\chroma-marble\24_dots.png" + File "graphics\chroma-marble\24_dots_double.png" + File "graphics\chroma-marble\24_dots_double_shadow.png" + File "graphics\chroma-marble\24_dots_shadow.png" + File "graphics\chroma-marble\24_dots_x.png" + File "graphics\chroma-marble\24_dots_x_shadow.png" + File "graphics\chroma-marble\24_dots_y.png" + File "graphics\chroma-marble\24_dots_y_shadow.png" + File "graphics\chroma-marble\24_map_bottom_left.png" + File "graphics\chroma-marble\24_map_bottom_right.png" + File "graphics\chroma-marble\24_map_shadow.png" + File "graphics\chroma-marble\24_map_top_left.png" + File "graphics\chroma-marble\24_map_top_right.png" + File "graphics\chroma-marble\24_player_one.png" + File "graphics\chroma-marble\24_player_one_swapped.png" + File "graphics\chroma-marble\24_player_shadow.png" + File "graphics\chroma-marble\24_player_two.png" + File "graphics\chroma-marble\24_player_two_swapped.png" + File "graphics\chroma-marble\24_space.png" + File "graphics\chroma-marble\24_star.png" + File "graphics\chroma-marble\24_star_shadow.png" + File "graphics\chroma-marble\24_switch.png" + File "graphics\chroma-marble\24_switch_shadow.png" + File "graphics\chroma-marble\24_teleport.png" + File "graphics\chroma-marble\24_teleport_shadow.png" + File "graphics\chroma-marble\24_wall.png" + File "graphics\chroma-marble\24_wall_inside.png" + File "graphics\chroma-marble\24_wall_inside_shadow.png" + File "graphics\chroma-marble\24_wall_outside.png" + File "graphics\chroma-marble\24_wall_outside_shadow.png" + File "graphics\chroma-marble\24_wall_x.png" + File "graphics\chroma-marble\24_wall_x_shadow.png" + File "graphics\chroma-marble\24_wall_y.png" + File "graphics\chroma-marble\24_wall_y_shadow.png" + File "graphics\chroma-marble\32_arrow_blue_down.png" + File "graphics\chroma-marble\32_arrow_blue_left.png" + File "graphics\chroma-marble\32_arrow_blue_right.png" + File "graphics\chroma-marble\32_arrow_blue_up.png" + File "graphics\chroma-marble\32_arrow_green_down.png" + File "graphics\chroma-marble\32_arrow_green_left.png" + File "graphics\chroma-marble\32_arrow_green_right.png" + File "graphics\chroma-marble\32_arrow_green_up.png" + File "graphics\chroma-marble\32_arrow_red_down.png" + File "graphics\chroma-marble\32_arrow_red_left.png" + File "graphics\chroma-marble\32_arrow_red_right.png" + File "graphics\chroma-marble\32_arrow_red_up.png" + File "graphics\chroma-marble\32_arrow_shadow_down.png" + File "graphics\chroma-marble\32_arrow_shadow_left.png" + File "graphics\chroma-marble\32_arrow_shadow_right.png" + File "graphics\chroma-marble\32_arrow_shadow_up.png" + File "graphics\chroma-marble\32_bomb_blue_down.png" + File "graphics\chroma-marble\32_bomb_blue_left.png" + File "graphics\chroma-marble\32_bomb_blue_right.png" + File "graphics\chroma-marble\32_bomb_blue_up.png" + File "graphics\chroma-marble\32_bomb_green_down.png" + File "graphics\chroma-marble\32_bomb_green_left.png" + File "graphics\chroma-marble\32_bomb_green_right.png" + File "graphics\chroma-marble\32_bomb_green_up.png" + File "graphics\chroma-marble\32_bomb_red_down.png" + File "graphics\chroma-marble\32_bomb_red_left.png" + File "graphics\chroma-marble\32_bomb_red_right.png" + File "graphics\chroma-marble\32_bomb_red_up.png" + File "graphics\chroma-marble\32_bomb_shadow_down.png" + File "graphics\chroma-marble\32_bomb_shadow_left.png" + File "graphics\chroma-marble\32_bomb_shadow_right.png" + File "graphics\chroma-marble\32_bomb_shadow_up.png" + File "graphics\chroma-marble\32_circle.png" + File "graphics\chroma-marble\32_circle_double.png" + File "graphics\chroma-marble\32_circle_double_shadow.png" + File "graphics\chroma-marble\32_circle_shadow.png" + File "graphics\chroma-marble\32_door.png" + File "graphics\chroma-marble\32_door_shadow.png" + File "graphics\chroma-marble\32_dots.png" + File "graphics\chroma-marble\32_dots_double.png" + File "graphics\chroma-marble\32_dots_double_shadow.png" + File "graphics\chroma-marble\32_dots_shadow.png" + File "graphics\chroma-marble\32_dots_x.png" + File "graphics\chroma-marble\32_dots_x_shadow.png" + File "graphics\chroma-marble\32_dots_y.png" + File "graphics\chroma-marble\32_dots_y_shadow.png" + File "graphics\chroma-marble\32_map_bottom_left.png" + File "graphics\chroma-marble\32_map_bottom_right.png" + File "graphics\chroma-marble\32_map_shadow.png" + File "graphics\chroma-marble\32_map_top_left.png" + File "graphics\chroma-marble\32_map_top_right.png" + File "graphics\chroma-marble\32_player_one.png" + File "graphics\chroma-marble\32_player_one_swapped.png" + File "graphics\chroma-marble\32_player_shadow.png" + File "graphics\chroma-marble\32_player_two.png" + File "graphics\chroma-marble\32_player_two_swapped.png" + File "graphics\chroma-marble\32_space.png" + File "graphics\chroma-marble\32_star.png" + File "graphics\chroma-marble\32_star_shadow.png" + File "graphics\chroma-marble\32_switch.png" + File "graphics\chroma-marble\32_switch_shadow.png" + File "graphics\chroma-marble\32_teleport.png" + File "graphics\chroma-marble\32_teleport_shadow.png" + File "graphics\chroma-marble\32_wall.png" + File "graphics\chroma-marble\32_wall_inside.png" + File "graphics\chroma-marble\32_wall_inside_shadow.png" + File "graphics\chroma-marble\32_wall_outside.png" + File "graphics\chroma-marble\32_wall_outside_shadow.png" + File "graphics\chroma-marble\32_wall_x.png" + File "graphics\chroma-marble\32_wall_x_shadow.png" + File "graphics\chroma-marble\32_wall_y.png" + File "graphics\chroma-marble\32_wall_y_shadow.png" + File "graphics\chroma-marble\40_arrow_blue_down.png" + File "graphics\chroma-marble\40_arrow_blue_left.png" + File "graphics\chroma-marble\40_arrow_blue_right.png" + File "graphics\chroma-marble\40_arrow_blue_up.png" + File "graphics\chroma-marble\40_arrow_green_down.png" + File "graphics\chroma-marble\40_arrow_green_left.png" + File "graphics\chroma-marble\40_arrow_green_right.png" + File "graphics\chroma-marble\40_arrow_green_up.png" + File "graphics\chroma-marble\40_arrow_red_down.png" + File "graphics\chroma-marble\40_arrow_red_left.png" + File "graphics\chroma-marble\40_arrow_red_right.png" + File "graphics\chroma-marble\40_arrow_red_up.png" + File "graphics\chroma-marble\40_arrow_shadow_down.png" + File "graphics\chroma-marble\40_arrow_shadow_left.png" + File "graphics\chroma-marble\40_arrow_shadow_right.png" + File "graphics\chroma-marble\40_arrow_shadow_up.png" + File "graphics\chroma-marble\40_bomb_blue_down.png" + File "graphics\chroma-marble\40_bomb_blue_left.png" + File "graphics\chroma-marble\40_bomb_blue_right.png" + File "graphics\chroma-marble\40_bomb_blue_up.png" + File "graphics\chroma-marble\40_bomb_green_down.png" + File "graphics\chroma-marble\40_bomb_green_left.png" + File "graphics\chroma-marble\40_bomb_green_right.png" + File "graphics\chroma-marble\40_bomb_green_up.png" + File "graphics\chroma-marble\40_bomb_red_down.png" + File "graphics\chroma-marble\40_bomb_red_left.png" + File "graphics\chroma-marble\40_bomb_red_right.png" + File "graphics\chroma-marble\40_bomb_red_up.png" + File "graphics\chroma-marble\40_bomb_shadow_down.png" + File "graphics\chroma-marble\40_bomb_shadow_left.png" + File "graphics\chroma-marble\40_bomb_shadow_right.png" + File "graphics\chroma-marble\40_bomb_shadow_up.png" + File "graphics\chroma-marble\40_circle.png" + File "graphics\chroma-marble\40_circle_double.png" + File "graphics\chroma-marble\40_circle_double_shadow.png" + File "graphics\chroma-marble\40_circle_shadow.png" + File "graphics\chroma-marble\40_door.png" + File "graphics\chroma-marble\40_door_shadow.png" + File "graphics\chroma-marble\40_dots.png" + File "graphics\chroma-marble\40_dots_double.png" + File "graphics\chroma-marble\40_dots_double_shadow.png" + File "graphics\chroma-marble\40_dots_shadow.png" + File "graphics\chroma-marble\40_dots_x.png" + File "graphics\chroma-marble\40_dots_x_shadow.png" + File "graphics\chroma-marble\40_dots_y.png" + File "graphics\chroma-marble\40_dots_y_shadow.png" + File "graphics\chroma-marble\40_map_bottom_left.png" + File "graphics\chroma-marble\40_map_bottom_right.png" + File "graphics\chroma-marble\40_map_shadow.png" + File "graphics\chroma-marble\40_map_top_left.png" + File "graphics\chroma-marble\40_map_top_right.png" + File "graphics\chroma-marble\40_player_one.png" + File "graphics\chroma-marble\40_player_one_swapped.png" + File "graphics\chroma-marble\40_player_shadow.png" + File "graphics\chroma-marble\40_player_two.png" + File "graphics\chroma-marble\40_player_two_swapped.png" + File "graphics\chroma-marble\40_space.png" + File "graphics\chroma-marble\40_star.png" + File "graphics\chroma-marble\40_star_shadow.png" + File "graphics\chroma-marble\40_switch.png" + File "graphics\chroma-marble\40_switch_shadow.png" + File "graphics\chroma-marble\40_teleport.png" + File "graphics\chroma-marble\40_teleport_shadow.png" + File "graphics\chroma-marble\40_wall.png" + File "graphics\chroma-marble\40_wall_inside.png" + File "graphics\chroma-marble\40_wall_inside_shadow.png" + File "graphics\chroma-marble\40_wall_outside.png" + File "graphics\chroma-marble\40_wall_outside_shadow.png" + File "graphics\chroma-marble\40_wall_x.png" + File "graphics\chroma-marble\40_wall_x_shadow.png" + File "graphics\chroma-marble\40_wall_y.png" + File "graphics\chroma-marble\40_wall_y_shadow.png" + File "graphics\chroma-marble\64_arrow_blue_down.png" + File "graphics\chroma-marble\64_arrow_blue_left.png" + File "graphics\chroma-marble\64_arrow_blue_right.png" + File "graphics\chroma-marble\64_arrow_blue_up.png" + File "graphics\chroma-marble\64_arrow_green_down.png" + File "graphics\chroma-marble\64_arrow_green_left.png" + File "graphics\chroma-marble\64_arrow_green_right.png" + File "graphics\chroma-marble\64_arrow_green_up.png" + File "graphics\chroma-marble\64_arrow_red_down.png" + File "graphics\chroma-marble\64_arrow_red_left.png" + File "graphics\chroma-marble\64_arrow_red_right.png" + File "graphics\chroma-marble\64_arrow_red_up.png" + File "graphics\chroma-marble\64_arrow_shadow_down.png" + File "graphics\chroma-marble\64_arrow_shadow_left.png" + File "graphics\chroma-marble\64_arrow_shadow_right.png" + File "graphics\chroma-marble\64_arrow_shadow_up.png" + File "graphics\chroma-marble\64_bomb_blue_down.png" + File "graphics\chroma-marble\64_bomb_blue_left.png" + File "graphics\chroma-marble\64_bomb_blue_right.png" + File "graphics\chroma-marble\64_bomb_blue_up.png" + File "graphics\chroma-marble\64_bomb_green_down.png" + File "graphics\chroma-marble\64_bomb_green_left.png" + File "graphics\chroma-marble\64_bomb_green_right.png" + File "graphics\chroma-marble\64_bomb_green_up.png" + File "graphics\chroma-marble\64_bomb_red_down.png" + File "graphics\chroma-marble\64_bomb_red_left.png" + File "graphics\chroma-marble\64_bomb_red_right.png" + File "graphics\chroma-marble\64_bomb_red_up.png" + File "graphics\chroma-marble\64_bomb_shadow_down.png" + File "graphics\chroma-marble\64_bomb_shadow_left.png" + File "graphics\chroma-marble\64_bomb_shadow_right.png" + File "graphics\chroma-marble\64_bomb_shadow_up.png" + File "graphics\chroma-marble\64_circle.png" + File "graphics\chroma-marble\64_circle_double.png" + File "graphics\chroma-marble\64_circle_double_shadow.png" + File "graphics\chroma-marble\64_circle_shadow.png" + File "graphics\chroma-marble\64_door.png" + File "graphics\chroma-marble\64_door_shadow.png" + File "graphics\chroma-marble\64_dots.png" + File "graphics\chroma-marble\64_dots_double.png" + File "graphics\chroma-marble\64_dots_double_shadow.png" + File "graphics\chroma-marble\64_dots_shadow.png" + File "graphics\chroma-marble\64_dots_x.png" + File "graphics\chroma-marble\64_dots_x_shadow.png" + File "graphics\chroma-marble\64_dots_y.png" + File "graphics\chroma-marble\64_dots_y_shadow.png" + File "graphics\chroma-marble\64_map_bottom_left.png" + File "graphics\chroma-marble\64_map_bottom_right.png" + File "graphics\chroma-marble\64_map_shadow.png" + File "graphics\chroma-marble\64_map_top_left.png" + File "graphics\chroma-marble\64_map_top_right.png" + File "graphics\chroma-marble\64_player_one.png" + File "graphics\chroma-marble\64_player_one_swapped.png" + File "graphics\chroma-marble\64_player_shadow.png" + File "graphics\chroma-marble\64_player_two.png" + File "graphics\chroma-marble\64_player_two_swapped.png" + File "graphics\chroma-marble\64_space.png" + File "graphics\chroma-marble\64_star.png" + File "graphics\chroma-marble\64_star_shadow.png" + File "graphics\chroma-marble\64_switch.png" + File "graphics\chroma-marble\64_switch_shadow.png" + File "graphics\chroma-marble\64_teleport.png" + File "graphics\chroma-marble\64_teleport_shadow.png" + File "graphics\chroma-marble\64_wall.png" + File "graphics\chroma-marble\64_wall_inside.png" + File "graphics\chroma-marble\64_wall_inside_shadow.png" + File "graphics\chroma-marble\64_wall_outside.png" + File "graphics\chroma-marble\64_wall_outside_shadow.png" + File "graphics\chroma-marble\64_wall_x.png" + File "graphics\chroma-marble\64_wall_x_shadow.png" + File "graphics\chroma-marble\64_wall_y.png" + File "graphics\chroma-marble\64_wall_y_shadow.png" + SetOutPath "$INSTDIR\graphics" + File "graphics\chroma-marble.chroma" + SetOutPath "$INSTDIR\graphics\chroma-neon" + File "graphics\chroma-neon\16_arrow_blue_down.png" + File "graphics\chroma-neon\16_arrow_blue_down_shadow.png" + File "graphics\chroma-neon\16_arrow_blue_left.png" + File "graphics\chroma-neon\16_arrow_blue_left_shadow.png" + File "graphics\chroma-neon\16_arrow_blue_right.png" + File "graphics\chroma-neon\16_arrow_blue_right_shadow.png" + File "graphics\chroma-neon\16_arrow_blue_up.png" + File "graphics\chroma-neon\16_arrow_blue_up_shadow.png" + File "graphics\chroma-neon\16_arrow_green_down.png" + File "graphics\chroma-neon\16_arrow_green_down_shadow.png" + File "graphics\chroma-neon\16_arrow_green_left.png" + File "graphics\chroma-neon\16_arrow_green_left_shadow.png" + File "graphics\chroma-neon\16_arrow_green_right.png" + File "graphics\chroma-neon\16_arrow_green_right_shadow.png" + File "graphics\chroma-neon\16_arrow_green_up.png" + File "graphics\chroma-neon\16_arrow_green_up_shadow.png" + File "graphics\chroma-neon\16_arrow_red_down.png" + File "graphics\chroma-neon\16_arrow_red_down_shadow.png" + File "graphics\chroma-neon\16_arrow_red_left.png" + File "graphics\chroma-neon\16_arrow_red_left_shadow.png" + File "graphics\chroma-neon\16_arrow_red_right.png" + File "graphics\chroma-neon\16_arrow_red_right_shadow.png" + File "graphics\chroma-neon\16_arrow_red_up.png" + File "graphics\chroma-neon\16_arrow_red_up_shadow.png" + File "graphics\chroma-neon\16_bomb_blue_down.png" + File "graphics\chroma-neon\16_bomb_blue_down_shadow.png" + File "graphics\chroma-neon\16_bomb_blue_left.png" + File "graphics\chroma-neon\16_bomb_blue_left_shadow.png" + File "graphics\chroma-neon\16_bomb_blue_right.png" + File "graphics\chroma-neon\16_bomb_blue_right_shadow.png" + File "graphics\chroma-neon\16_bomb_blue_up.png" + File "graphics\chroma-neon\16_bomb_blue_up_shadow.png" + File "graphics\chroma-neon\16_bomb_green_down.png" + File "graphics\chroma-neon\16_bomb_green_down_shadow.png" + File "graphics\chroma-neon\16_bomb_green_left.png" + File "graphics\chroma-neon\16_bomb_green_left_shadow.png" + File "graphics\chroma-neon\16_bomb_green_right.png" + File "graphics\chroma-neon\16_bomb_green_right_shadow.png" + File "graphics\chroma-neon\16_bomb_green_up.png" + File "graphics\chroma-neon\16_bomb_green_up_shadow.png" + File "graphics\chroma-neon\16_bomb_red_down.png" + File "graphics\chroma-neon\16_bomb_red_down_shadow.png" + File "graphics\chroma-neon\16_bomb_red_left.png" + File "graphics\chroma-neon\16_bomb_red_left_shadow.png" + File "graphics\chroma-neon\16_bomb_red_right.png" + File "graphics\chroma-neon\16_bomb_red_right_shadow.png" + File "graphics\chroma-neon\16_bomb_red_up.png" + File "graphics\chroma-neon\16_bomb_red_up_shadow.png" + File "graphics\chroma-neon\16_circle.png" + File "graphics\chroma-neon\16_circle_double.png" + File "graphics\chroma-neon\16_circle_double_shadow.png" + File "graphics\chroma-neon\16_circle_shadow.png" + File "graphics\chroma-neon\16_door.png" + File "graphics\chroma-neon\16_door_shadow.png" + File "graphics\chroma-neon\16_dots.png" + File "graphics\chroma-neon\16_dots_double.png" + File "graphics\chroma-neon\16_dots_double_shadow.png" + File "graphics\chroma-neon\16_dots_shadow.png" + File "graphics\chroma-neon\16_dots_x.png" + File "graphics\chroma-neon\16_dots_x_shadow.png" + File "graphics\chroma-neon\16_dots_y.png" + File "graphics\chroma-neon\16_dots_y_shadow.png" + File "graphics\chroma-neon\16_map_bottom_left.png" + File "graphics\chroma-neon\16_map_bottom_left_shadow.png" + File "graphics\chroma-neon\16_map_bottom_right.png" + File "graphics\chroma-neon\16_map_bottom_right_shadow.png" + File "graphics\chroma-neon\16_map_top_left.png" + File "graphics\chroma-neon\16_map_top_left_shadow.png" + File "graphics\chroma-neon\16_map_top_right.png" + File "graphics\chroma-neon\16_map_top_right_shadow.png" + File "graphics\chroma-neon\16_player_one.png" + File "graphics\chroma-neon\16_player_one_shadow.png" + File "graphics\chroma-neon\16_player_one_swapped.png" + File "graphics\chroma-neon\16_player_one_swapped_shadow.png" + File "graphics\chroma-neon\16_player_two.png" + File "graphics\chroma-neon\16_player_two_shadow.png" + File "graphics\chroma-neon\16_player_two_swapped.png" + File "graphics\chroma-neon\16_player_two_swapped_shadow.png" + File "graphics\chroma-neon\16_star.png" + File "graphics\chroma-neon\16_star_shadow.png" + File "graphics\chroma-neon\16_switch.png" + File "graphics\chroma-neon\16_switch_shadow.png" + File "graphics\chroma-neon\16_teleport.png" + File "graphics\chroma-neon\16_teleport_shadow.png" + File "graphics\chroma-neon\16_wall.png" + File "graphics\chroma-neon\16_wall_inside.png" + File "graphics\chroma-neon\16_wall_outside.png" + File "graphics\chroma-neon\16_wall_shadow.png" + File "graphics\chroma-neon\16_wall_x.png" + File "graphics\chroma-neon\16_wall_y.png" + File "graphics\chroma-neon\20_arrow_blue_down.png" + File "graphics\chroma-neon\20_arrow_blue_down_shadow.png" + File "graphics\chroma-neon\20_arrow_blue_left.png" + File "graphics\chroma-neon\20_arrow_blue_left_shadow.png" + File "graphics\chroma-neon\20_arrow_blue_right.png" + File "graphics\chroma-neon\20_arrow_blue_right_shadow.png" + File "graphics\chroma-neon\20_arrow_blue_up.png" + File "graphics\chroma-neon\20_arrow_blue_up_shadow.png" + File "graphics\chroma-neon\20_arrow_green_down.png" + File "graphics\chroma-neon\20_arrow_green_down_shadow.png" + File "graphics\chroma-neon\20_arrow_green_left.png" + File "graphics\chroma-neon\20_arrow_green_left_shadow.png" + File "graphics\chroma-neon\20_arrow_green_right.png" + File "graphics\chroma-neon\20_arrow_green_right_shadow.png" + File "graphics\chroma-neon\20_arrow_green_up.png" + File "graphics\chroma-neon\20_arrow_green_up_shadow.png" + File "graphics\chroma-neon\20_arrow_red_down.png" + File "graphics\chroma-neon\20_arrow_red_down_shadow.png" + File "graphics\chroma-neon\20_arrow_red_left.png" + File "graphics\chroma-neon\20_arrow_red_left_shadow.png" + File "graphics\chroma-neon\20_arrow_red_right.png" + File "graphics\chroma-neon\20_arrow_red_right_shadow.png" + File "graphics\chroma-neon\20_arrow_red_up.png" + File "graphics\chroma-neon\20_arrow_red_up_shadow.png" + File "graphics\chroma-neon\20_bomb_blue_down.png" + File "graphics\chroma-neon\20_bomb_blue_down_shadow.png" + File "graphics\chroma-neon\20_bomb_blue_left.png" + File "graphics\chroma-neon\20_bomb_blue_left_shadow.png" + File "graphics\chroma-neon\20_bomb_blue_right.png" + File "graphics\chroma-neon\20_bomb_blue_right_shadow.png" + File "graphics\chroma-neon\20_bomb_blue_up.png" + File "graphics\chroma-neon\20_bomb_blue_up_shadow.png" + File "graphics\chroma-neon\20_bomb_green_down.png" + File "graphics\chroma-neon\20_bomb_green_down_shadow.png" + File "graphics\chroma-neon\20_bomb_green_left.png" + File "graphics\chroma-neon\20_bomb_green_left_shadow.png" + File "graphics\chroma-neon\20_bomb_green_right.png" + File "graphics\chroma-neon\20_bomb_green_right_shadow.png" + File "graphics\chroma-neon\20_bomb_green_up.png" + File "graphics\chroma-neon\20_bomb_green_up_shadow.png" + File "graphics\chroma-neon\20_bomb_red_down.png" + File "graphics\chroma-neon\20_bomb_red_down_shadow.png" + File "graphics\chroma-neon\20_bomb_red_left.png" + File "graphics\chroma-neon\20_bomb_red_left_shadow.png" + File "graphics\chroma-neon\20_bomb_red_right.png" + File "graphics\chroma-neon\20_bomb_red_right_shadow.png" + File "graphics\chroma-neon\20_bomb_red_up.png" + File "graphics\chroma-neon\20_bomb_red_up_shadow.png" + File "graphics\chroma-neon\20_circle.png" + File "graphics\chroma-neon\20_circle_double.png" + File "graphics\chroma-neon\20_circle_double_shadow.png" + File "graphics\chroma-neon\20_circle_shadow.png" + File "graphics\chroma-neon\20_door.png" + File "graphics\chroma-neon\20_door_shadow.png" + File "graphics\chroma-neon\20_dots.png" + File "graphics\chroma-neon\20_dots_double.png" + File "graphics\chroma-neon\20_dots_double_shadow.png" + File "graphics\chroma-neon\20_dots_shadow.png" + File "graphics\chroma-neon\20_dots_x.png" + File "graphics\chroma-neon\20_dots_x_shadow.png" + File "graphics\chroma-neon\20_dots_y.png" + File "graphics\chroma-neon\20_dots_y_shadow.png" + File "graphics\chroma-neon\20_map_bottom_left.png" + File "graphics\chroma-neon\20_map_bottom_left_shadow.png" + File "graphics\chroma-neon\20_map_bottom_right.png" + File "graphics\chroma-neon\20_map_bottom_right_shadow.png" + File "graphics\chroma-neon\20_map_top_left.png" + File "graphics\chroma-neon\20_map_top_left_shadow.png" + File "graphics\chroma-neon\20_map_top_right.png" + File "graphics\chroma-neon\20_map_top_right_shadow.png" + File "graphics\chroma-neon\20_player_one.png" + File "graphics\chroma-neon\20_player_one_shadow.png" + File "graphics\chroma-neon\20_player_one_swapped.png" + File "graphics\chroma-neon\20_player_one_swapped_shadow.png" + File "graphics\chroma-neon\20_player_two.png" + File "graphics\chroma-neon\20_player_two_shadow.png" + File "graphics\chroma-neon\20_player_two_swapped.png" + File "graphics\chroma-neon\20_player_two_swapped_shadow.png" + File "graphics\chroma-neon\20_star.png" + File "graphics\chroma-neon\20_star_shadow.png" + File "graphics\chroma-neon\20_switch.png" + File "graphics\chroma-neon\20_switch_shadow.png" + File "graphics\chroma-neon\20_teleport.png" + File "graphics\chroma-neon\20_teleport_shadow.png" + File "graphics\chroma-neon\20_wall.png" + File "graphics\chroma-neon\20_wall_inside.png" + File "graphics\chroma-neon\20_wall_outside.png" + File "graphics\chroma-neon\20_wall_shadow.png" + File "graphics\chroma-neon\20_wall_x.png" + File "graphics\chroma-neon\20_wall_y.png" + File "graphics\chroma-neon\24_arrow_blue_down.png" + File "graphics\chroma-neon\24_arrow_blue_down_shadow.png" + File "graphics\chroma-neon\24_arrow_blue_left.png" + File "graphics\chroma-neon\24_arrow_blue_left_shadow.png" + File "graphics\chroma-neon\24_arrow_blue_right.png" + File "graphics\chroma-neon\24_arrow_blue_right_shadow.png" + File "graphics\chroma-neon\24_arrow_blue_up.png" + File "graphics\chroma-neon\24_arrow_blue_up_shadow.png" + File "graphics\chroma-neon\24_arrow_green_down.png" + File "graphics\chroma-neon\24_arrow_green_down_shadow.png" + File "graphics\chroma-neon\24_arrow_green_left.png" + File "graphics\chroma-neon\24_arrow_green_left_shadow.png" + File "graphics\chroma-neon\24_arrow_green_right.png" + File "graphics\chroma-neon\24_arrow_green_right_shadow.png" + File "graphics\chroma-neon\24_arrow_green_up.png" + File "graphics\chroma-neon\24_arrow_green_up_shadow.png" + File "graphics\chroma-neon\24_arrow_red_down.png" + File "graphics\chroma-neon\24_arrow_red_down_shadow.png" + File "graphics\chroma-neon\24_arrow_red_left.png" + File "graphics\chroma-neon\24_arrow_red_left_shadow.png" + File "graphics\chroma-neon\24_arrow_red_right.png" + File "graphics\chroma-neon\24_arrow_red_right_shadow.png" + File "graphics\chroma-neon\24_arrow_red_up.png" + File "graphics\chroma-neon\24_arrow_red_up_shadow.png" + File "graphics\chroma-neon\24_bomb_blue_down.png" + File "graphics\chroma-neon\24_bomb_blue_down_shadow.png" + File "graphics\chroma-neon\24_bomb_blue_left.png" + File "graphics\chroma-neon\24_bomb_blue_left_shadow.png" + File "graphics\chroma-neon\24_bomb_blue_right.png" + File "graphics\chroma-neon\24_bomb_blue_right_shadow.png" + File "graphics\chroma-neon\24_bomb_blue_up.png" + File "graphics\chroma-neon\24_bomb_blue_up_shadow.png" + File "graphics\chroma-neon\24_bomb_green_down.png" + File "graphics\chroma-neon\24_bomb_green_down_shadow.png" + File "graphics\chroma-neon\24_bomb_green_left.png" + File "graphics\chroma-neon\24_bomb_green_left_shadow.png" + File "graphics\chroma-neon\24_bomb_green_right.png" + File "graphics\chroma-neon\24_bomb_green_right_shadow.png" + File "graphics\chroma-neon\24_bomb_green_up.png" + File "graphics\chroma-neon\24_bomb_green_up_shadow.png" + File "graphics\chroma-neon\24_bomb_red_down.png" + File "graphics\chroma-neon\24_bomb_red_down_shadow.png" + File "graphics\chroma-neon\24_bomb_red_left.png" + File "graphics\chroma-neon\24_bomb_red_left_shadow.png" + File "graphics\chroma-neon\24_bomb_red_right.png" + File "graphics\chroma-neon\24_bomb_red_right_shadow.png" + File "graphics\chroma-neon\24_bomb_red_up.png" + File "graphics\chroma-neon\24_bomb_red_up_shadow.png" + File "graphics\chroma-neon\24_circle.png" + File "graphics\chroma-neon\24_circle_double.png" + File "graphics\chroma-neon\24_circle_double_shadow.png" + File "graphics\chroma-neon\24_circle_shadow.png" + File "graphics\chroma-neon\24_door.png" + File "graphics\chroma-neon\24_door_shadow.png" + File "graphics\chroma-neon\24_dots.png" + File "graphics\chroma-neon\24_dots_double.png" + File "graphics\chroma-neon\24_dots_double_shadow.png" + File "graphics\chroma-neon\24_dots_shadow.png" + File "graphics\chroma-neon\24_dots_x.png" + File "graphics\chroma-neon\24_dots_x_shadow.png" + File "graphics\chroma-neon\24_dots_y.png" + File "graphics\chroma-neon\24_dots_y_shadow.png" + File "graphics\chroma-neon\24_map_bottom_left.png" + File "graphics\chroma-neon\24_map_bottom_left_shadow.png" + File "graphics\chroma-neon\24_map_bottom_right.png" + File "graphics\chroma-neon\24_map_bottom_right_shadow.png" + File "graphics\chroma-neon\24_map_top_left.png" + File "graphics\chroma-neon\24_map_top_left_shadow.png" + File "graphics\chroma-neon\24_map_top_right.png" + File "graphics\chroma-neon\24_map_top_right_shadow.png" + File "graphics\chroma-neon\24_player_one.png" + File "graphics\chroma-neon\24_player_one_shadow.png" + File "graphics\chroma-neon\24_player_one_swapped.png" + File "graphics\chroma-neon\24_player_one_swapped_shadow.png" + File "graphics\chroma-neon\24_player_two.png" + File "graphics\chroma-neon\24_player_two_shadow.png" + File "graphics\chroma-neon\24_player_two_swapped.png" + File "graphics\chroma-neon\24_player_two_swapped_shadow.png" + File "graphics\chroma-neon\24_star.png" + File "graphics\chroma-neon\24_star_shadow.png" + File "graphics\chroma-neon\24_switch.png" + File "graphics\chroma-neon\24_switch_shadow.png" + File "graphics\chroma-neon\24_teleport.png" + File "graphics\chroma-neon\24_teleport_shadow.png" + File "graphics\chroma-neon\24_wall.png" + File "graphics\chroma-neon\24_wall_inside.png" + File "graphics\chroma-neon\24_wall_outside.png" + File "graphics\chroma-neon\24_wall_shadow.png" + File "graphics\chroma-neon\24_wall_x.png" + File "graphics\chroma-neon\24_wall_y.png" + File "graphics\chroma-neon\32_arrow_blue_down.png" + File "graphics\chroma-neon\32_arrow_blue_down_shadow.png" + File "graphics\chroma-neon\32_arrow_blue_left.png" + File "graphics\chroma-neon\32_arrow_blue_left_shadow.png" + File "graphics\chroma-neon\32_arrow_blue_right.png" + File "graphics\chroma-neon\32_arrow_blue_right_shadow.png" + File "graphics\chroma-neon\32_arrow_blue_up.png" + File "graphics\chroma-neon\32_arrow_blue_up_shadow.png" + File "graphics\chroma-neon\32_arrow_green_down.png" + File "graphics\chroma-neon\32_arrow_green_down_shadow.png" + File "graphics\chroma-neon\32_arrow_green_left.png" + File "graphics\chroma-neon\32_arrow_green_left_shadow.png" + File "graphics\chroma-neon\32_arrow_green_right.png" + File "graphics\chroma-neon\32_arrow_green_right_shadow.png" + File "graphics\chroma-neon\32_arrow_green_up.png" + File "graphics\chroma-neon\32_arrow_green_up_shadow.png" + File "graphics\chroma-neon\32_arrow_red_down.png" + File "graphics\chroma-neon\32_arrow_red_down_shadow.png" + File "graphics\chroma-neon\32_arrow_red_left.png" + File "graphics\chroma-neon\32_arrow_red_left_shadow.png" + File "graphics\chroma-neon\32_arrow_red_right.png" + File "graphics\chroma-neon\32_arrow_red_right_shadow.png" + File "graphics\chroma-neon\32_arrow_red_up.png" + File "graphics\chroma-neon\32_arrow_red_up_shadow.png" + File "graphics\chroma-neon\32_bomb_blue_down.png" + File "graphics\chroma-neon\32_bomb_blue_down_shadow.png" + File "graphics\chroma-neon\32_bomb_blue_left.png" + File "graphics\chroma-neon\32_bomb_blue_left_shadow.png" + File "graphics\chroma-neon\32_bomb_blue_right.png" + File "graphics\chroma-neon\32_bomb_blue_right_shadow.png" + File "graphics\chroma-neon\32_bomb_blue_up.png" + File "graphics\chroma-neon\32_bomb_blue_up_shadow.png" + File "graphics\chroma-neon\32_bomb_green_down.png" + File "graphics\chroma-neon\32_bomb_green_down_shadow.png" + File "graphics\chroma-neon\32_bomb_green_left.png" + File "graphics\chroma-neon\32_bomb_green_left_shadow.png" + File "graphics\chroma-neon\32_bomb_green_right.png" + File "graphics\chroma-neon\32_bomb_green_right_shadow.png" + File "graphics\chroma-neon\32_bomb_green_up.png" + File "graphics\chroma-neon\32_bomb_green_up_shadow.png" + File "graphics\chroma-neon\32_bomb_red_down.png" + File "graphics\chroma-neon\32_bomb_red_down_shadow.png" + File "graphics\chroma-neon\32_bomb_red_left.png" + File "graphics\chroma-neon\32_bomb_red_left_shadow.png" + File "graphics\chroma-neon\32_bomb_red_right.png" + File "graphics\chroma-neon\32_bomb_red_right_shadow.png" + File "graphics\chroma-neon\32_bomb_red_up.png" + File "graphics\chroma-neon\32_bomb_red_up_shadow.png" + File "graphics\chroma-neon\32_circle.png" + File "graphics\chroma-neon\32_circle_double.png" + File "graphics\chroma-neon\32_circle_double_shadow.png" + File "graphics\chroma-neon\32_circle_shadow.png" + File "graphics\chroma-neon\32_door.png" + File "graphics\chroma-neon\32_door_shadow.png" + File "graphics\chroma-neon\32_dots.png" + File "graphics\chroma-neon\32_dots_double.png" + File "graphics\chroma-neon\32_dots_double_shadow.png" + File "graphics\chroma-neon\32_dots_shadow.png" + File "graphics\chroma-neon\32_dots_x.png" + File "graphics\chroma-neon\32_dots_x_shadow.png" + File "graphics\chroma-neon\32_dots_y.png" + File "graphics\chroma-neon\32_dots_y_shadow.png" + File "graphics\chroma-neon\32_map_bottom_left.png" + File "graphics\chroma-neon\32_map_bottom_left_shadow.png" + File "graphics\chroma-neon\32_map_bottom_right.png" + File "graphics\chroma-neon\32_map_bottom_right_shadow.png" + File "graphics\chroma-neon\32_map_top_left.png" + File "graphics\chroma-neon\32_map_top_left_shadow.png" + File "graphics\chroma-neon\32_map_top_right.png" + File "graphics\chroma-neon\32_map_top_right_shadow.png" + File "graphics\chroma-neon\32_player_one.png" + File "graphics\chroma-neon\32_player_one_shadow.png" + File "graphics\chroma-neon\32_player_one_swapped.png" + File "graphics\chroma-neon\32_player_one_swapped_shadow.png" + File "graphics\chroma-neon\32_player_two.png" + File "graphics\chroma-neon\32_player_two_shadow.png" + File "graphics\chroma-neon\32_player_two_swapped.png" + File "graphics\chroma-neon\32_player_two_swapped_shadow.png" + File "graphics\chroma-neon\32_star.png" + File "graphics\chroma-neon\32_star_shadow.png" + File "graphics\chroma-neon\32_switch.png" + File "graphics\chroma-neon\32_switch_shadow.png" + File "graphics\chroma-neon\32_teleport.png" + File "graphics\chroma-neon\32_teleport_shadow.png" + File "graphics\chroma-neon\32_wall.png" + File "graphics\chroma-neon\32_wall_inside.png" + File "graphics\chroma-neon\32_wall_outside.png" + File "graphics\chroma-neon\32_wall_shadow.png" + File "graphics\chroma-neon\32_wall_x.png" + File "graphics\chroma-neon\32_wall_y.png" + File "graphics\chroma-neon\40_arrow_blue_down.png" + File "graphics\chroma-neon\40_arrow_blue_down_shadow.png" + File "graphics\chroma-neon\40_arrow_blue_left.png" + File "graphics\chroma-neon\40_arrow_blue_left_shadow.png" + File "graphics\chroma-neon\40_arrow_blue_right.png" + File "graphics\chroma-neon\40_arrow_blue_right_shadow.png" + File "graphics\chroma-neon\40_arrow_blue_up.png" + File "graphics\chroma-neon\40_arrow_blue_up_shadow.png" + File "graphics\chroma-neon\40_arrow_green_down.png" + File "graphics\chroma-neon\40_arrow_green_down_shadow.png" + File "graphics\chroma-neon\40_arrow_green_left.png" + File "graphics\chroma-neon\40_arrow_green_left_shadow.png" + File "graphics\chroma-neon\40_arrow_green_right.png" + File "graphics\chroma-neon\40_arrow_green_right_shadow.png" + File "graphics\chroma-neon\40_arrow_green_up.png" + File "graphics\chroma-neon\40_arrow_green_up_shadow.png" + File "graphics\chroma-neon\40_arrow_red_down.png" + File "graphics\chroma-neon\40_arrow_red_down_shadow.png" + File "graphics\chroma-neon\40_arrow_red_left.png" + File "graphics\chroma-neon\40_arrow_red_left_shadow.png" + File "graphics\chroma-neon\40_arrow_red_right.png" + File "graphics\chroma-neon\40_arrow_red_right_shadow.png" + File "graphics\chroma-neon\40_arrow_red_up.png" + File "graphics\chroma-neon\40_arrow_red_up_shadow.png" + File "graphics\chroma-neon\40_bomb_blue_down.png" + File "graphics\chroma-neon\40_bomb_blue_down_shadow.png" + File "graphics\chroma-neon\40_bomb_blue_left.png" + File "graphics\chroma-neon\40_bomb_blue_left_shadow.png" + File "graphics\chroma-neon\40_bomb_blue_right.png" + File "graphics\chroma-neon\40_bomb_blue_right_shadow.png" + File "graphics\chroma-neon\40_bomb_blue_up.png" + File "graphics\chroma-neon\40_bomb_blue_up_shadow.png" + File "graphics\chroma-neon\40_bomb_green_down.png" + File "graphics\chroma-neon\40_bomb_green_down_shadow.png" + File "graphics\chroma-neon\40_bomb_green_left.png" + File "graphics\chroma-neon\40_bomb_green_left_shadow.png" + File "graphics\chroma-neon\40_bomb_green_right.png" + File "graphics\chroma-neon\40_bomb_green_right_shadow.png" + File "graphics\chroma-neon\40_bomb_green_up.png" + File "graphics\chroma-neon\40_bomb_green_up_shadow.png" + File "graphics\chroma-neon\40_bomb_red_down.png" + File "graphics\chroma-neon\40_bomb_red_down_shadow.png" + File "graphics\chroma-neon\40_bomb_red_left.png" + File "graphics\chroma-neon\40_bomb_red_left_shadow.png" + File "graphics\chroma-neon\40_bomb_red_right.png" + File "graphics\chroma-neon\40_bomb_red_right_shadow.png" + File "graphics\chroma-neon\40_bomb_red_up.png" + File "graphics\chroma-neon\40_bomb_red_up_shadow.png" + File "graphics\chroma-neon\40_circle.png" + File "graphics\chroma-neon\40_circle_double.png" + File "graphics\chroma-neon\40_circle_double_shadow.png" + File "graphics\chroma-neon\40_circle_shadow.png" + File "graphics\chroma-neon\40_door.png" + File "graphics\chroma-neon\40_door_shadow.png" + File "graphics\chroma-neon\40_dots.png" + File "graphics\chroma-neon\40_dots_double.png" + File "graphics\chroma-neon\40_dots_double_shadow.png" + File "graphics\chroma-neon\40_dots_shadow.png" + File "graphics\chroma-neon\40_dots_x.png" + File "graphics\chroma-neon\40_dots_x_shadow.png" + File "graphics\chroma-neon\40_dots_y.png" + File "graphics\chroma-neon\40_dots_y_shadow.png" + File "graphics\chroma-neon\40_map_bottom_left.png" + File "graphics\chroma-neon\40_map_bottom_left_shadow.png" + File "graphics\chroma-neon\40_map_bottom_right.png" + File "graphics\chroma-neon\40_map_bottom_right_shadow.png" + File "graphics\chroma-neon\40_map_top_left.png" + File "graphics\chroma-neon\40_map_top_left_shadow.png" + File "graphics\chroma-neon\40_map_top_right.png" + File "graphics\chroma-neon\40_map_top_right_shadow.png" + File "graphics\chroma-neon\40_player_one.png" + File "graphics\chroma-neon\40_player_one_shadow.png" + File "graphics\chroma-neon\40_player_one_swapped.png" + File "graphics\chroma-neon\40_player_one_swapped_shadow.png" + File "graphics\chroma-neon\40_player_two.png" + File "graphics\chroma-neon\40_player_two_shadow.png" + File "graphics\chroma-neon\40_player_two_swapped.png" + File "graphics\chroma-neon\40_player_two_swapped_shadow.png" + File "graphics\chroma-neon\40_star.png" + File "graphics\chroma-neon\40_star_shadow.png" + File "graphics\chroma-neon\40_switch.png" + File "graphics\chroma-neon\40_switch_shadow.png" + File "graphics\chroma-neon\40_teleport.png" + File "graphics\chroma-neon\40_teleport_shadow.png" + File "graphics\chroma-neon\40_wall.png" + File "graphics\chroma-neon\40_wall_inside.png" + File "graphics\chroma-neon\40_wall_outside.png" + File "graphics\chroma-neon\40_wall_shadow.png" + File "graphics\chroma-neon\40_wall_x.png" + File "graphics\chroma-neon\40_wall_y.png" + File "graphics\chroma-neon\64_arrow_blue_down.png" + File "graphics\chroma-neon\64_arrow_blue_down_shadow.png" + File "graphics\chroma-neon\64_arrow_blue_left.png" + File "graphics\chroma-neon\64_arrow_blue_left_shadow.png" + File "graphics\chroma-neon\64_arrow_blue_right.png" + File "graphics\chroma-neon\64_arrow_blue_right_shadow.png" + File "graphics\chroma-neon\64_arrow_blue_up.png" + File "graphics\chroma-neon\64_arrow_blue_up_shadow.png" + File "graphics\chroma-neon\64_arrow_green_down.png" + File "graphics\chroma-neon\64_arrow_green_down_shadow.png" + File "graphics\chroma-neon\64_arrow_green_left.png" + File "graphics\chroma-neon\64_arrow_green_left_shadow.png" + File "graphics\chroma-neon\64_arrow_green_right.png" + File "graphics\chroma-neon\64_arrow_green_right_shadow.png" + File "graphics\chroma-neon\64_arrow_green_up.png" + File "graphics\chroma-neon\64_arrow_green_up_shadow.png" + File "graphics\chroma-neon\64_arrow_red_down.png" + File "graphics\chroma-neon\64_arrow_red_down_shadow.png" + File "graphics\chroma-neon\64_arrow_red_left.png" + File "graphics\chroma-neon\64_arrow_red_left_shadow.png" + File "graphics\chroma-neon\64_arrow_red_right.png" + File "graphics\chroma-neon\64_arrow_red_right_shadow.png" + File "graphics\chroma-neon\64_arrow_red_up.png" + File "graphics\chroma-neon\64_arrow_red_up_shadow.png" + File "graphics\chroma-neon\64_bomb_blue_down.png" + File "graphics\chroma-neon\64_bomb_blue_down_shadow.png" + File "graphics\chroma-neon\64_bomb_blue_left.png" + File "graphics\chroma-neon\64_bomb_blue_left_shadow.png" + File "graphics\chroma-neon\64_bomb_blue_right.png" + File "graphics\chroma-neon\64_bomb_blue_right_shadow.png" + File "graphics\chroma-neon\64_bomb_blue_up.png" + File "graphics\chroma-neon\64_bomb_blue_up_shadow.png" + File "graphics\chroma-neon\64_bomb_green_down.png" + File "graphics\chroma-neon\64_bomb_green_down_shadow.png" + File "graphics\chroma-neon\64_bomb_green_left.png" + File "graphics\chroma-neon\64_bomb_green_left_shadow.png" + File "graphics\chroma-neon\64_bomb_green_right.png" + File "graphics\chroma-neon\64_bomb_green_right_shadow.png" + File "graphics\chroma-neon\64_bomb_green_up.png" + File "graphics\chroma-neon\64_bomb_green_up_shadow.png" + File "graphics\chroma-neon\64_bomb_red_down.png" + File "graphics\chroma-neon\64_bomb_red_down_shadow.png" + File "graphics\chroma-neon\64_bomb_red_left.png" + File "graphics\chroma-neon\64_bomb_red_left_shadow.png" + File "graphics\chroma-neon\64_bomb_red_right.png" + File "graphics\chroma-neon\64_bomb_red_right_shadow.png" + File "graphics\chroma-neon\64_bomb_red_up.png" + File "graphics\chroma-neon\64_bomb_red_up_shadow.png" + File "graphics\chroma-neon\64_circle.png" + File "graphics\chroma-neon\64_circle_double.png" + File "graphics\chroma-neon\64_circle_double_shadow.png" + File "graphics\chroma-neon\64_circle_shadow.png" + File "graphics\chroma-neon\64_door.png" + File "graphics\chroma-neon\64_door_shadow.png" + File "graphics\chroma-neon\64_dots.png" + File "graphics\chroma-neon\64_dots_double.png" + File "graphics\chroma-neon\64_dots_double_shadow.png" + File "graphics\chroma-neon\64_dots_shadow.png" + File "graphics\chroma-neon\64_dots_x.png" + File "graphics\chroma-neon\64_dots_x_shadow.png" + File "graphics\chroma-neon\64_dots_y.png" + File "graphics\chroma-neon\64_dots_y_shadow.png" + File "graphics\chroma-neon\64_map_bottom_left.png" + File "graphics\chroma-neon\64_map_bottom_left_shadow.png" + File "graphics\chroma-neon\64_map_bottom_right.png" + File "graphics\chroma-neon\64_map_bottom_right_shadow.png" + File "graphics\chroma-neon\64_map_top_left.png" + File "graphics\chroma-neon\64_map_top_left_shadow.png" + File "graphics\chroma-neon\64_map_top_right.png" + File "graphics\chroma-neon\64_map_top_right_shadow.png" + File "graphics\chroma-neon\64_player_one.png" + File "graphics\chroma-neon\64_player_one_shadow.png" + File "graphics\chroma-neon\64_player_one_swapped.png" + File "graphics\chroma-neon\64_player_one_swapped_shadow.png" + File "graphics\chroma-neon\64_player_two.png" + File "graphics\chroma-neon\64_player_two_shadow.png" + File "graphics\chroma-neon\64_player_two_swapped.png" + File "graphics\chroma-neon\64_player_two_swapped_shadow.png" + File "graphics\chroma-neon\64_star.png" + File "graphics\chroma-neon\64_star_shadow.png" + File "graphics\chroma-neon\64_switch.png" + File "graphics\chroma-neon\64_switch_shadow.png" + File "graphics\chroma-neon\64_teleport.png" + File "graphics\chroma-neon\64_teleport_shadow.png" + File "graphics\chroma-neon\64_wall.png" + File "graphics\chroma-neon\64_wall_inside.png" + File "graphics\chroma-neon\64_wall_outside.png" + File "graphics\chroma-neon\64_wall_shadow.png" + File "graphics\chroma-neon\64_wall_x.png" + File "graphics\chroma-neon\64_wall_y.png" + SetOutPath "$INSTDIR\graphics" + File "graphics\chroma-neon.chroma" + SetOutPath "$INSTDIR\graphics\chroma-zen" + File "graphics\chroma-zen\16_arrow_blue_down.png" + File "graphics\chroma-zen\16_arrow_blue_left.png" + File "graphics\chroma-zen\16_arrow_blue_right.png" + File "graphics\chroma-zen\16_arrow_blue_up.png" + File "graphics\chroma-zen\16_arrow_green_down.png" + File "graphics\chroma-zen\16_arrow_green_left.png" + File "graphics\chroma-zen\16_arrow_green_right.png" + File "graphics\chroma-zen\16_arrow_green_up.png" + File "graphics\chroma-zen\16_arrow_red_down.png" + File "graphics\chroma-zen\16_arrow_red_left.png" + File "graphics\chroma-zen\16_arrow_red_right.png" + File "graphics\chroma-zen\16_arrow_red_up.png" + File "graphics\chroma-zen\16_bomb_blue_down.png" + File "graphics\chroma-zen\16_bomb_blue_left.png" + File "graphics\chroma-zen\16_bomb_blue_right.png" + File "graphics\chroma-zen\16_bomb_blue_up.png" + File "graphics\chroma-zen\16_bomb_green_down.png" + File "graphics\chroma-zen\16_bomb_green_left.png" + File "graphics\chroma-zen\16_bomb_green_right.png" + File "graphics\chroma-zen\16_bomb_green_up.png" + File "graphics\chroma-zen\16_bomb_red_down.png" + File "graphics\chroma-zen\16_bomb_red_left.png" + File "graphics\chroma-zen\16_bomb_red_right.png" + File "graphics\chroma-zen\16_bomb_red_up.png" + File "graphics\chroma-zen\16_circle.png" + File "graphics\chroma-zen\16_circle_double.png" + File "graphics\chroma-zen\16_door.png" + File "graphics\chroma-zen\16_dots.png" + File "graphics\chroma-zen\16_dots_double.png" + File "graphics\chroma-zen\16_dots_x.png" + File "graphics\chroma-zen\16_dots_y.png" + File "graphics\chroma-zen\16_map_bottom_left.png" + File "graphics\chroma-zen\16_map_bottom_right.png" + File "graphics\chroma-zen\16_map_top_left.png" + File "graphics\chroma-zen\16_map_top_right.png" + File "graphics\chroma-zen\16_player_one.png" + File "graphics\chroma-zen\16_player_one_swapped.png" + File "graphics\chroma-zen\16_player_two.png" + File "graphics\chroma-zen\16_player_two_swapped.png" + File "graphics\chroma-zen\16_star.png" + File "graphics\chroma-zen\16_switch.png" + File "graphics\chroma-zen\16_teleport.png" + File "graphics\chroma-zen\16_wall_inside.png" + File "graphics\chroma-zen\16_wall_outside.png" + File "graphics\chroma-zen\16_wall_x.png" + File "graphics\chroma-zen\16_wall_y.png" + File "graphics\chroma-zen\20_arrow_blue_down.png" + File "graphics\chroma-zen\20_arrow_blue_left.png" + File "graphics\chroma-zen\20_arrow_blue_right.png" + File "graphics\chroma-zen\20_arrow_blue_up.png" + File "graphics\chroma-zen\20_arrow_green_down.png" + File "graphics\chroma-zen\20_arrow_green_left.png" + File "graphics\chroma-zen\20_arrow_green_right.png" + File "graphics\chroma-zen\20_arrow_green_up.png" + File "graphics\chroma-zen\20_arrow_red_down.png" + File "graphics\chroma-zen\20_arrow_red_left.png" + File "graphics\chroma-zen\20_arrow_red_right.png" + File "graphics\chroma-zen\20_arrow_red_up.png" + File "graphics\chroma-zen\20_bomb_blue_down.png" + File "graphics\chroma-zen\20_bomb_blue_left.png" + File "graphics\chroma-zen\20_bomb_blue_right.png" + File "graphics\chroma-zen\20_bomb_blue_up.png" + File "graphics\chroma-zen\20_bomb_green_down.png" + File "graphics\chroma-zen\20_bomb_green_left.png" + File "graphics\chroma-zen\20_bomb_green_right.png" + File "graphics\chroma-zen\20_bomb_green_up.png" + File "graphics\chroma-zen\20_bomb_red_down.png" + File "graphics\chroma-zen\20_bomb_red_left.png" + File "graphics\chroma-zen\20_bomb_red_right.png" + File "graphics\chroma-zen\20_bomb_red_up.png" + File "graphics\chroma-zen\20_circle.png" + File "graphics\chroma-zen\20_circle_double.png" + File "graphics\chroma-zen\20_door.png" + File "graphics\chroma-zen\20_dots.png" + File "graphics\chroma-zen\20_dots_double.png" + File "graphics\chroma-zen\20_dots_x.png" + File "graphics\chroma-zen\20_dots_y.png" + File "graphics\chroma-zen\20_map_bottom_left.png" + File "graphics\chroma-zen\20_map_bottom_right.png" + File "graphics\chroma-zen\20_map_top_left.png" + File "graphics\chroma-zen\20_map_top_right.png" + File "graphics\chroma-zen\20_player_one.png" + File "graphics\chroma-zen\20_player_one_swapped.png" + File "graphics\chroma-zen\20_player_two.png" + File "graphics\chroma-zen\20_player_two_swapped.png" + File "graphics\chroma-zen\20_star.png" + File "graphics\chroma-zen\20_switch.png" + File "graphics\chroma-zen\20_teleport.png" + File "graphics\chroma-zen\20_wall_inside.png" + File "graphics\chroma-zen\20_wall_outside.png" + File "graphics\chroma-zen\20_wall_x.png" + File "graphics\chroma-zen\20_wall_y.png" + File "graphics\chroma-zen\24_arrow_blue_down.png" + File "graphics\chroma-zen\24_arrow_blue_left.png" + File "graphics\chroma-zen\24_arrow_blue_right.png" + File "graphics\chroma-zen\24_arrow_blue_up.png" + File "graphics\chroma-zen\24_arrow_green_down.png" + File "graphics\chroma-zen\24_arrow_green_left.png" + File "graphics\chroma-zen\24_arrow_green_right.png" + File "graphics\chroma-zen\24_arrow_green_up.png" + File "graphics\chroma-zen\24_arrow_red_down.png" + File "graphics\chroma-zen\24_arrow_red_left.png" + File "graphics\chroma-zen\24_arrow_red_right.png" + File "graphics\chroma-zen\24_arrow_red_up.png" + File "graphics\chroma-zen\24_bomb_blue_down.png" + File "graphics\chroma-zen\24_bomb_blue_left.png" + File "graphics\chroma-zen\24_bomb_blue_right.png" + File "graphics\chroma-zen\24_bomb_blue_up.png" + File "graphics\chroma-zen\24_bomb_green_down.png" + File "graphics\chroma-zen\24_bomb_green_left.png" + File "graphics\chroma-zen\24_bomb_green_right.png" + File "graphics\chroma-zen\24_bomb_green_up.png" + File "graphics\chroma-zen\24_bomb_red_down.png" + File "graphics\chroma-zen\24_bomb_red_left.png" + File "graphics\chroma-zen\24_bomb_red_right.png" + File "graphics\chroma-zen\24_bomb_red_up.png" + File "graphics\chroma-zen\24_circle.png" + File "graphics\chroma-zen\24_circle_double.png" + File "graphics\chroma-zen\24_door.png" + File "graphics\chroma-zen\24_dots.png" + File "graphics\chroma-zen\24_dots_double.png" + File "graphics\chroma-zen\24_dots_x.png" + File "graphics\chroma-zen\24_dots_y.png" + File "graphics\chroma-zen\24_map_bottom_left.png" + File "graphics\chroma-zen\24_map_bottom_right.png" + File "graphics\chroma-zen\24_map_top_left.png" + File "graphics\chroma-zen\24_map_top_right.png" + File "graphics\chroma-zen\24_player_one.png" + File "graphics\chroma-zen\24_player_one_swapped.png" + File "graphics\chroma-zen\24_player_two.png" + File "graphics\chroma-zen\24_player_two_swapped.png" + File "graphics\chroma-zen\24_star.png" + File "graphics\chroma-zen\24_switch.png" + File "graphics\chroma-zen\24_teleport.png" + File "graphics\chroma-zen\24_wall_inside.png" + File "graphics\chroma-zen\24_wall_outside.png" + File "graphics\chroma-zen\24_wall_x.png" + File "graphics\chroma-zen\24_wall_y.png" + File "graphics\chroma-zen\32_arrow_blue_down.png" + File "graphics\chroma-zen\32_arrow_blue_left.png" + File "graphics\chroma-zen\32_arrow_blue_right.png" + File "graphics\chroma-zen\32_arrow_blue_up.png" + File "graphics\chroma-zen\32_arrow_green_down.png" + File "graphics\chroma-zen\32_arrow_green_left.png" + File "graphics\chroma-zen\32_arrow_green_right.png" + File "graphics\chroma-zen\32_arrow_green_up.png" + File "graphics\chroma-zen\32_arrow_red_down.png" + File "graphics\chroma-zen\32_arrow_red_left.png" + File "graphics\chroma-zen\32_arrow_red_right.png" + File "graphics\chroma-zen\32_arrow_red_up.png" + File "graphics\chroma-zen\32_bomb_blue_down.png" + File "graphics\chroma-zen\32_bomb_blue_left.png" + File "graphics\chroma-zen\32_bomb_blue_right.png" + File "graphics\chroma-zen\32_bomb_blue_up.png" + File "graphics\chroma-zen\32_bomb_green_down.png" + File "graphics\chroma-zen\32_bomb_green_left.png" + File "graphics\chroma-zen\32_bomb_green_right.png" + File "graphics\chroma-zen\32_bomb_green_up.png" + File "graphics\chroma-zen\32_bomb_red_down.png" + File "graphics\chroma-zen\32_bomb_red_left.png" + File "graphics\chroma-zen\32_bomb_red_right.png" + File "graphics\chroma-zen\32_bomb_red_up.png" + File "graphics\chroma-zen\32_circle.png" + File "graphics\chroma-zen\32_circle_double.png" + File "graphics\chroma-zen\32_door.png" + File "graphics\chroma-zen\32_dots.png" + File "graphics\chroma-zen\32_dots_double.png" + File "graphics\chroma-zen\32_dots_x.png" + File "graphics\chroma-zen\32_dots_y.png" + File "graphics\chroma-zen\32_map_bottom_left.png" + File "graphics\chroma-zen\32_map_bottom_right.png" + File "graphics\chroma-zen\32_map_top_left.png" + File "graphics\chroma-zen\32_map_top_right.png" + File "graphics\chroma-zen\32_player_one.png" + File "graphics\chroma-zen\32_player_one_swapped.png" + File "graphics\chroma-zen\32_player_two.png" + File "graphics\chroma-zen\32_player_two_swapped.png" + File "graphics\chroma-zen\32_star.png" + File "graphics\chroma-zen\32_switch.png" + File "graphics\chroma-zen\32_teleport.png" + File "graphics\chroma-zen\32_wall_inside.png" + File "graphics\chroma-zen\32_wall_outside.png" + File "graphics\chroma-zen\32_wall_x.png" + File "graphics\chroma-zen\32_wall_y.png" + File "graphics\chroma-zen\40_arrow_blue_down.png" + File "graphics\chroma-zen\40_arrow_blue_left.png" + File "graphics\chroma-zen\40_arrow_blue_right.png" + File "graphics\chroma-zen\40_arrow_blue_up.png" + File "graphics\chroma-zen\40_arrow_green_down.png" + File "graphics\chroma-zen\40_arrow_green_left.png" + File "graphics\chroma-zen\40_arrow_green_right.png" + File "graphics\chroma-zen\40_arrow_green_up.png" + File "graphics\chroma-zen\40_arrow_red_down.png" + File "graphics\chroma-zen\40_arrow_red_left.png" + File "graphics\chroma-zen\40_arrow_red_right.png" + File "graphics\chroma-zen\40_arrow_red_up.png" + File "graphics\chroma-zen\40_bomb_blue_down.png" + File "graphics\chroma-zen\40_bomb_blue_left.png" + File "graphics\chroma-zen\40_bomb_blue_right.png" + File "graphics\chroma-zen\40_bomb_blue_up.png" + File "graphics\chroma-zen\40_bomb_green_down.png" + File "graphics\chroma-zen\40_bomb_green_left.png" + File "graphics\chroma-zen\40_bomb_green_right.png" + File "graphics\chroma-zen\40_bomb_green_up.png" + File "graphics\chroma-zen\40_bomb_red_down.png" + File "graphics\chroma-zen\40_bomb_red_left.png" + File "graphics\chroma-zen\40_bomb_red_right.png" + File "graphics\chroma-zen\40_bomb_red_up.png" + File "graphics\chroma-zen\40_circle.png" + File "graphics\chroma-zen\40_circle_double.png" + File "graphics\chroma-zen\40_door.png" + File "graphics\chroma-zen\40_dots.png" + File "graphics\chroma-zen\40_dots_double.png" + File "graphics\chroma-zen\40_dots_x.png" + File "graphics\chroma-zen\40_dots_y.png" + File "graphics\chroma-zen\40_map_bottom_left.png" + File "graphics\chroma-zen\40_map_bottom_right.png" + File "graphics\chroma-zen\40_map_top_left.png" + File "graphics\chroma-zen\40_map_top_right.png" + File "graphics\chroma-zen\40_player_one.png" + File "graphics\chroma-zen\40_player_one_swapped.png" + File "graphics\chroma-zen\40_player_two.png" + File "graphics\chroma-zen\40_player_two_swapped.png" + File "graphics\chroma-zen\40_star.png" + File "graphics\chroma-zen\40_switch.png" + File "graphics\chroma-zen\40_teleport.png" + File "graphics\chroma-zen\40_wall_inside.png" + File "graphics\chroma-zen\40_wall_outside.png" + File "graphics\chroma-zen\40_wall_x.png" + File "graphics\chroma-zen\40_wall_y.png" + File "graphics\chroma-zen\64_arrow_blue_down.png" + File "graphics\chroma-zen\64_arrow_blue_left.png" + File "graphics\chroma-zen\64_arrow_blue_right.png" + File "graphics\chroma-zen\64_arrow_blue_up.png" + File "graphics\chroma-zen\64_arrow_green_down.png" + File "graphics\chroma-zen\64_arrow_green_left.png" + File "graphics\chroma-zen\64_arrow_green_right.png" + File "graphics\chroma-zen\64_arrow_green_up.png" + File "graphics\chroma-zen\64_arrow_red_down.png" + File "graphics\chroma-zen\64_arrow_red_left.png" + File "graphics\chroma-zen\64_arrow_red_right.png" + File "graphics\chroma-zen\64_arrow_red_up.png" + File "graphics\chroma-zen\64_bomb_blue_down.png" + File "graphics\chroma-zen\64_bomb_blue_left.png" + File "graphics\chroma-zen\64_bomb_blue_right.png" + File "graphics\chroma-zen\64_bomb_blue_up.png" + File "graphics\chroma-zen\64_bomb_green_down.png" + File "graphics\chroma-zen\64_bomb_green_left.png" + File "graphics\chroma-zen\64_bomb_green_right.png" + File "graphics\chroma-zen\64_bomb_green_up.png" + File "graphics\chroma-zen\64_bomb_red_down.png" + File "graphics\chroma-zen\64_bomb_red_left.png" + File "graphics\chroma-zen\64_bomb_red_right.png" + File "graphics\chroma-zen\64_bomb_red_up.png" + File "graphics\chroma-zen\64_circle.png" + File "graphics\chroma-zen\64_circle_double.png" + File "graphics\chroma-zen\64_door.png" + File "graphics\chroma-zen\64_dots.png" + File "graphics\chroma-zen\64_dots_double.png" + File "graphics\chroma-zen\64_dots_x.png" + File "graphics\chroma-zen\64_dots_y.png" + File "graphics\chroma-zen\64_map_bottom_left.png" + File "graphics\chroma-zen\64_map_bottom_right.png" + File "graphics\chroma-zen\64_map_top_left.png" + File "graphics\chroma-zen\64_map_top_right.png" + File "graphics\chroma-zen\64_player_one.png" + File "graphics\chroma-zen\64_player_one_swapped.png" + File "graphics\chroma-zen\64_player_two.png" + File "graphics\chroma-zen\64_player_two_swapped.png" + File "graphics\chroma-zen\64_star.png" + File "graphics\chroma-zen\64_switch.png" + File "graphics\chroma-zen\64_teleport.png" + File "graphics\chroma-zen\64_wall_inside.png" + File "graphics\chroma-zen\64_wall_outside.png" + File "graphics\chroma-zen\64_wall_x.png" + File "graphics\chroma-zen\64_wall_y.png" + SetOutPath "$INSTDIR\graphics" + File "graphics\chroma-zen.chroma" + File "graphics\curses.chroma" + File "graphics\fallback.chroma" + File "graphics\font.txt" + File "graphics\font.ttf" + File "graphics\icon.png" + SetOutPath "$INSTDIR" + File "jpeg.dll" + SetOutPath "$INSTDIR\levels\chroma-1" + File "levels\chroma-1\chroma-1-01.chroma" + File "levels\chroma-1\chroma-1-02.chroma" + File "levels\chroma-1\chroma-1-03.chroma" + File "levels\chroma-1\chroma-1-04.chroma" + File "levels\chroma-1\chroma-1-05.chroma" + File "levels\chroma-1\chroma-1-06.chroma" + File "levels\chroma-1\chroma-1-07.chroma" + File "levels\chroma-1\chroma-1-08.chroma" + File "levels\chroma-1\chroma-1-09.chroma" + File "levels\chroma-1\set.chroma" + SetOutPath "$INSTDIR\levels\chroma-2" + File "levels\chroma-2\chroma-2-01.chroma" + File "levels\chroma-2\chroma-2-02.chroma" + File "levels\chroma-2\chroma-2-03.chroma" + File "levels\chroma-2\chroma-2-04.chroma" + File "levels\chroma-2\chroma-2-05.chroma" + File "levels\chroma-2\chroma-2-06.chroma" + File "levels\chroma-2\chroma-2-07.chroma" + File "levels\chroma-2\chroma-2-08.chroma" + File "levels\chroma-2\chroma-2-09.chroma" + File "levels\chroma-2\chroma-2-10.chroma" + File "levels\chroma-2\chroma-2-11.chroma" + File "levels\chroma-2\chroma-2-12.chroma" + File "levels\chroma-2\set.chroma" + SetOutPath "$INSTDIR\levels\regression" + File "levels\regression\chroma-pieces.chroma" + File "levels\regression\chroma-regression.chroma" + File "levels\regression\enigma-regression.chroma" + File "levels\regression\set.chroma" + File "levels\regression\xor-regression.chroma" + SetOutPath "$INSTDIR" + File "libfreetype-6.dll" + File "libintl.dll" + File "libpng1.dll" + File "SDL.dll" + File "SDL_image.dll" + File "zlib.dll" + File "zlib1.dll" +SectionEnd + +Section -AdditionalIcons + CreateShortCut "$SMPROGRAMS\Chroma\Uninstall.lnk" "$INSTDIR\uninst.exe" +SectionEnd + +Section -Post + WriteUninstaller "$INSTDIR\uninst.exe" + WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\chroma.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\chroma.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" +SectionEnd + + +Function un.onUninstSuccess + HideWindow + MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer." +FunctionEnd + +Function un.onInit + MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2 + Abort +FunctionEnd + +Section Uninstall + Delete "$INSTDIR\uninst.exe" + Delete "$INSTDIR\zlib1.dll" + Delete "$INSTDIR\zlib.dll" + Delete "$INSTDIR\SDL_image.dll" + Delete "$INSTDIR\SDL.dll" + Delete "$INSTDIR\libpng1.dll" + Delete "$INSTDIR\libintl.dll" + Delete "$INSTDIR\libfreetype-6.dll" + Delete "$INSTDIR\levels\regression\xor-regression.chroma" + Delete "$INSTDIR\levels\regression\set.chroma" + Delete "$INSTDIR\levels\regression\enigma-regression.chroma" + Delete "$INSTDIR\levels\regression\chroma-regression.chroma" + Delete "$INSTDIR\levels\regression\chroma-pieces.chroma" + Delete "$INSTDIR\levels\chroma-2\set.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-12.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-11.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-10.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-09.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-08.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-07.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-06.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-05.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-04.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-03.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-02.chroma" + Delete "$INSTDIR\levels\chroma-2\chroma-2-01.chroma" + Delete "$INSTDIR\levels\chroma-1\set.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-09.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-08.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-07.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-06.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-05.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-04.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-03.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-02.chroma" + Delete "$INSTDIR\levels\chroma-1\chroma-1-01.chroma" + Delete "$INSTDIR\jpeg.dll" + Delete "$INSTDIR\graphics\icon.png" + Delete "$INSTDIR\graphics\font.txt" + Delete "$INSTDIR\graphics\font.ttf" + Delete "$INSTDIR\graphics\fallback.chroma" + Delete "$INSTDIR\graphics\curses.chroma" + Delete "$INSTDIR\graphics\chroma-zen.chroma" + Delete "$INSTDIR\graphics\chroma-zen\64_wall_y.png" + Delete "$INSTDIR\graphics\chroma-zen\64_wall_x.png" + Delete "$INSTDIR\graphics\chroma-zen\64_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-zen\64_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-zen\64_teleport.png" + Delete "$INSTDIR\graphics\chroma-zen\64_switch.png" + Delete "$INSTDIR\graphics\chroma-zen\64_star.png" + Delete "$INSTDIR\graphics\chroma-zen\64_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\64_player_two.png" + Delete "$INSTDIR\graphics\chroma-zen\64_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\64_player_one.png" + Delete "$INSTDIR\graphics\chroma-zen\64_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_dots_y.png" + Delete "$INSTDIR\graphics\chroma-zen\64_dots_x.png" + Delete "$INSTDIR\graphics\chroma-zen\64_dots_double.png" + Delete "$INSTDIR\graphics\chroma-zen\64_dots.png" + Delete "$INSTDIR\graphics\chroma-zen\64_door.png" + Delete "$INSTDIR\graphics\chroma-zen\64_circle_double.png" + Delete "$INSTDIR\graphics\chroma-zen\64_circle.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\64_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\40_wall_y.png" + Delete "$INSTDIR\graphics\chroma-zen\40_wall_x.png" + Delete "$INSTDIR\graphics\chroma-zen\40_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-zen\40_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-zen\40_teleport.png" + Delete "$INSTDIR\graphics\chroma-zen\40_switch.png" + Delete "$INSTDIR\graphics\chroma-zen\40_star.png" + Delete "$INSTDIR\graphics\chroma-zen\40_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\40_player_two.png" + Delete "$INSTDIR\graphics\chroma-zen\40_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\40_player_one.png" + Delete "$INSTDIR\graphics\chroma-zen\40_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_dots_y.png" + Delete "$INSTDIR\graphics\chroma-zen\40_dots_x.png" + Delete "$INSTDIR\graphics\chroma-zen\40_dots_double.png" + Delete "$INSTDIR\graphics\chroma-zen\40_dots.png" + Delete "$INSTDIR\graphics\chroma-zen\40_door.png" + Delete "$INSTDIR\graphics\chroma-zen\40_circle_double.png" + Delete "$INSTDIR\graphics\chroma-zen\40_circle.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\40_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\32_wall_y.png" + Delete "$INSTDIR\graphics\chroma-zen\32_wall_x.png" + Delete "$INSTDIR\graphics\chroma-zen\32_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-zen\32_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-zen\32_teleport.png" + Delete "$INSTDIR\graphics\chroma-zen\32_switch.png" + Delete "$INSTDIR\graphics\chroma-zen\32_star.png" + Delete "$INSTDIR\graphics\chroma-zen\32_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\32_player_two.png" + Delete "$INSTDIR\graphics\chroma-zen\32_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\32_player_one.png" + Delete "$INSTDIR\graphics\chroma-zen\32_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_dots_y.png" + Delete "$INSTDIR\graphics\chroma-zen\32_dots_x.png" + Delete "$INSTDIR\graphics\chroma-zen\32_dots_double.png" + Delete "$INSTDIR\graphics\chroma-zen\32_dots.png" + Delete "$INSTDIR\graphics\chroma-zen\32_door.png" + Delete "$INSTDIR\graphics\chroma-zen\32_circle_double.png" + Delete "$INSTDIR\graphics\chroma-zen\32_circle.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\32_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\24_wall_y.png" + Delete "$INSTDIR\graphics\chroma-zen\24_wall_x.png" + Delete "$INSTDIR\graphics\chroma-zen\24_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-zen\24_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-zen\24_teleport.png" + Delete "$INSTDIR\graphics\chroma-zen\24_switch.png" + Delete "$INSTDIR\graphics\chroma-zen\24_star.png" + Delete "$INSTDIR\graphics\chroma-zen\24_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\24_player_two.png" + Delete "$INSTDIR\graphics\chroma-zen\24_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\24_player_one.png" + Delete "$INSTDIR\graphics\chroma-zen\24_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_dots_y.png" + Delete "$INSTDIR\graphics\chroma-zen\24_dots_x.png" + Delete "$INSTDIR\graphics\chroma-zen\24_dots_double.png" + Delete "$INSTDIR\graphics\chroma-zen\24_dots.png" + Delete "$INSTDIR\graphics\chroma-zen\24_door.png" + Delete "$INSTDIR\graphics\chroma-zen\24_circle_double.png" + Delete "$INSTDIR\graphics\chroma-zen\24_circle.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\24_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\20_wall_y.png" + Delete "$INSTDIR\graphics\chroma-zen\20_wall_x.png" + Delete "$INSTDIR\graphics\chroma-zen\20_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-zen\20_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-zen\20_teleport.png" + Delete "$INSTDIR\graphics\chroma-zen\20_switch.png" + Delete "$INSTDIR\graphics\chroma-zen\20_star.png" + Delete "$INSTDIR\graphics\chroma-zen\20_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\20_player_two.png" + Delete "$INSTDIR\graphics\chroma-zen\20_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\20_player_one.png" + Delete "$INSTDIR\graphics\chroma-zen\20_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_dots_y.png" + Delete "$INSTDIR\graphics\chroma-zen\20_dots_x.png" + Delete "$INSTDIR\graphics\chroma-zen\20_dots_double.png" + Delete "$INSTDIR\graphics\chroma-zen\20_dots.png" + Delete "$INSTDIR\graphics\chroma-zen\20_door.png" + Delete "$INSTDIR\graphics\chroma-zen\20_circle_double.png" + Delete "$INSTDIR\graphics\chroma-zen\20_circle.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\20_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\16_wall_y.png" + Delete "$INSTDIR\graphics\chroma-zen\16_wall_x.png" + Delete "$INSTDIR\graphics\chroma-zen\16_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-zen\16_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-zen\16_teleport.png" + Delete "$INSTDIR\graphics\chroma-zen\16_switch.png" + Delete "$INSTDIR\graphics\chroma-zen\16_star.png" + Delete "$INSTDIR\graphics\chroma-zen\16_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\16_player_two.png" + Delete "$INSTDIR\graphics\chroma-zen\16_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-zen\16_player_one.png" + Delete "$INSTDIR\graphics\chroma-zen\16_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_dots_y.png" + Delete "$INSTDIR\graphics\chroma-zen\16_dots_x.png" + Delete "$INSTDIR\graphics\chroma-zen\16_dots_double.png" + Delete "$INSTDIR\graphics\chroma-zen\16_dots.png" + Delete "$INSTDIR\graphics\chroma-zen\16_door.png" + Delete "$INSTDIR\graphics\chroma-zen\16_circle_double.png" + Delete "$INSTDIR\graphics\chroma-zen\16_circle.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-zen\16_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon.chroma" + Delete "$INSTDIR\graphics\chroma-neon\64_wall_y.png" + Delete "$INSTDIR\graphics\chroma-neon\64_wall_x.png" + Delete "$INSTDIR\graphics\chroma-neon\64_wall_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-neon\64_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-neon\64_wall.png" + Delete "$INSTDIR\graphics\chroma-neon\64_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_teleport.png" + Delete "$INSTDIR\graphics\chroma-neon\64_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_switch.png" + Delete "$INSTDIR\graphics\chroma-neon\64_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_star.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_two_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_two_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_two.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_one_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_one_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_player_one.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_top_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_top_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_bottom_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_bottom_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_y.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_x.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots_double.png" + Delete "$INSTDIR\graphics\chroma-neon\64_dots.png" + Delete "$INSTDIR\graphics\chroma-neon\64_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_door.png" + Delete "$INSTDIR\graphics\chroma-neon\64_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_circle_double.png" + Delete "$INSTDIR\graphics\chroma-neon\64_circle.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\64_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\40_wall_y.png" + Delete "$INSTDIR\graphics\chroma-neon\40_wall_x.png" + Delete "$INSTDIR\graphics\chroma-neon\40_wall_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-neon\40_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-neon\40_wall.png" + Delete "$INSTDIR\graphics\chroma-neon\40_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_teleport.png" + Delete "$INSTDIR\graphics\chroma-neon\40_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_switch.png" + Delete "$INSTDIR\graphics\chroma-neon\40_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_star.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_two_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_two_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_two.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_one_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_one_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_player_one.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_top_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_top_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_bottom_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_bottom_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_y.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_x.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots_double.png" + Delete "$INSTDIR\graphics\chroma-neon\40_dots.png" + Delete "$INSTDIR\graphics\chroma-neon\40_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_door.png" + Delete "$INSTDIR\graphics\chroma-neon\40_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_circle_double.png" + Delete "$INSTDIR\graphics\chroma-neon\40_circle.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\40_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\32_wall_y.png" + Delete "$INSTDIR\graphics\chroma-neon\32_wall_x.png" + Delete "$INSTDIR\graphics\chroma-neon\32_wall_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-neon\32_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-neon\32_wall.png" + Delete "$INSTDIR\graphics\chroma-neon\32_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_teleport.png" + Delete "$INSTDIR\graphics\chroma-neon\32_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_switch.png" + Delete "$INSTDIR\graphics\chroma-neon\32_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_star.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_two_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_two_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_two.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_one_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_one_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_player_one.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_top_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_top_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_bottom_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_bottom_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_y.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_x.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots_double.png" + Delete "$INSTDIR\graphics\chroma-neon\32_dots.png" + Delete "$INSTDIR\graphics\chroma-neon\32_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_door.png" + Delete "$INSTDIR\graphics\chroma-neon\32_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_circle_double.png" + Delete "$INSTDIR\graphics\chroma-neon\32_circle.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\32_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\24_wall_y.png" + Delete "$INSTDIR\graphics\chroma-neon\24_wall_x.png" + Delete "$INSTDIR\graphics\chroma-neon\24_wall_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-neon\24_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-neon\24_wall.png" + Delete "$INSTDIR\graphics\chroma-neon\24_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_teleport.png" + Delete "$INSTDIR\graphics\chroma-neon\24_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_switch.png" + Delete "$INSTDIR\graphics\chroma-neon\24_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_star.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_two_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_two_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_two.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_one_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_one_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_player_one.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_top_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_top_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_bottom_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_bottom_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_y.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_x.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots_double.png" + Delete "$INSTDIR\graphics\chroma-neon\24_dots.png" + Delete "$INSTDIR\graphics\chroma-neon\24_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_door.png" + Delete "$INSTDIR\graphics\chroma-neon\24_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_circle_double.png" + Delete "$INSTDIR\graphics\chroma-neon\24_circle.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\24_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\20_wall_y.png" + Delete "$INSTDIR\graphics\chroma-neon\20_wall_x.png" + Delete "$INSTDIR\graphics\chroma-neon\20_wall_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-neon\20_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-neon\20_wall.png" + Delete "$INSTDIR\graphics\chroma-neon\20_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_teleport.png" + Delete "$INSTDIR\graphics\chroma-neon\20_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_switch.png" + Delete "$INSTDIR\graphics\chroma-neon\20_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_star.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_two_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_two_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_two.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_one_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_one_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_player_one.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_top_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_top_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_bottom_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_bottom_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_y.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_x.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots_double.png" + Delete "$INSTDIR\graphics\chroma-neon\20_dots.png" + Delete "$INSTDIR\graphics\chroma-neon\20_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_door.png" + Delete "$INSTDIR\graphics\chroma-neon\20_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_circle_double.png" + Delete "$INSTDIR\graphics\chroma-neon\20_circle.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\20_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\16_wall_y.png" + Delete "$INSTDIR\graphics\chroma-neon\16_wall_x.png" + Delete "$INSTDIR\graphics\chroma-neon\16_wall_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-neon\16_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-neon\16_wall.png" + Delete "$INSTDIR\graphics\chroma-neon\16_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_teleport.png" + Delete "$INSTDIR\graphics\chroma-neon\16_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_switch.png" + Delete "$INSTDIR\graphics\chroma-neon\16_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_star.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_two_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_two_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_two.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_one_swapped_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_one_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_player_one.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_top_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_top_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_bottom_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_bottom_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_y.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_x.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots_double.png" + Delete "$INSTDIR\graphics\chroma-neon\16_dots.png" + Delete "$INSTDIR\graphics\chroma-neon\16_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_door.png" + Delete "$INSTDIR\graphics\chroma-neon\16_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_circle_double.png" + Delete "$INSTDIR\graphics\chroma-neon\16_circle.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_up_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_right_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_left_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_down_shadow.png" + Delete "$INSTDIR\graphics\chroma-neon\16_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble.chroma" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_y.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_x.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_outside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_inside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-marble\64_wall.png" + Delete "$INSTDIR\graphics\chroma-marble\64_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_teleport.png" + Delete "$INSTDIR\graphics\chroma-marble\64_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_switch.png" + Delete "$INSTDIR\graphics\chroma-marble\64_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_star.png" + Delete "$INSTDIR\graphics\chroma-marble\64_space.png" + Delete "$INSTDIR\graphics\chroma-marble\64_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\64_player_two.png" + Delete "$INSTDIR\graphics\chroma-marble\64_player_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\64_player_one.png" + Delete "$INSTDIR\graphics\chroma-marble\64_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_map_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_y.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_x.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots_double.png" + Delete "$INSTDIR\graphics\chroma-marble\64_dots.png" + Delete "$INSTDIR\graphics\chroma-marble\64_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_door.png" + Delete "$INSTDIR\graphics\chroma-marble\64_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\64_circle_double.png" + Delete "$INSTDIR\graphics\chroma-marble\64_circle.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\64_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_y.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_x.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_outside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_inside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-marble\40_wall.png" + Delete "$INSTDIR\graphics\chroma-marble\40_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_teleport.png" + Delete "$INSTDIR\graphics\chroma-marble\40_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_switch.png" + Delete "$INSTDIR\graphics\chroma-marble\40_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_star.png" + Delete "$INSTDIR\graphics\chroma-marble\40_space.png" + Delete "$INSTDIR\graphics\chroma-marble\40_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\40_player_two.png" + Delete "$INSTDIR\graphics\chroma-marble\40_player_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\40_player_one.png" + Delete "$INSTDIR\graphics\chroma-marble\40_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_map_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_y.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_x.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots_double.png" + Delete "$INSTDIR\graphics\chroma-marble\40_dots.png" + Delete "$INSTDIR\graphics\chroma-marble\40_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_door.png" + Delete "$INSTDIR\graphics\chroma-marble\40_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\40_circle_double.png" + Delete "$INSTDIR\graphics\chroma-marble\40_circle.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\40_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_y.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_x.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_outside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_inside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-marble\32_wall.png" + Delete "$INSTDIR\graphics\chroma-marble\32_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_teleport.png" + Delete "$INSTDIR\graphics\chroma-marble\32_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_switch.png" + Delete "$INSTDIR\graphics\chroma-marble\32_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_star.png" + Delete "$INSTDIR\graphics\chroma-marble\32_space.png" + Delete "$INSTDIR\graphics\chroma-marble\32_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\32_player_two.png" + Delete "$INSTDIR\graphics\chroma-marble\32_player_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\32_player_one.png" + Delete "$INSTDIR\graphics\chroma-marble\32_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_map_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_y.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_x.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots_double.png" + Delete "$INSTDIR\graphics\chroma-marble\32_dots.png" + Delete "$INSTDIR\graphics\chroma-marble\32_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_door.png" + Delete "$INSTDIR\graphics\chroma-marble\32_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\32_circle_double.png" + Delete "$INSTDIR\graphics\chroma-marble\32_circle.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\32_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_y.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_x.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_outside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_inside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-marble\24_wall.png" + Delete "$INSTDIR\graphics\chroma-marble\24_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_teleport.png" + Delete "$INSTDIR\graphics\chroma-marble\24_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_switch.png" + Delete "$INSTDIR\graphics\chroma-marble\24_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_star.png" + Delete "$INSTDIR\graphics\chroma-marble\24_space.png" + Delete "$INSTDIR\graphics\chroma-marble\24_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\24_player_two.png" + Delete "$INSTDIR\graphics\chroma-marble\24_player_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\24_player_one.png" + Delete "$INSTDIR\graphics\chroma-marble\24_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_map_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_y.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_x.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots_double.png" + Delete "$INSTDIR\graphics\chroma-marble\24_dots.png" + Delete "$INSTDIR\graphics\chroma-marble\24_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_door.png" + Delete "$INSTDIR\graphics\chroma-marble\24_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\24_circle_double.png" + Delete "$INSTDIR\graphics\chroma-marble\24_circle.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\24_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_y.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_x.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_outside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_inside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-marble\20_wall.png" + Delete "$INSTDIR\graphics\chroma-marble\20_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_teleport.png" + Delete "$INSTDIR\graphics\chroma-marble\20_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_switch.png" + Delete "$INSTDIR\graphics\chroma-marble\20_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_star.png" + Delete "$INSTDIR\graphics\chroma-marble\20_space.png" + Delete "$INSTDIR\graphics\chroma-marble\20_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\20_player_two.png" + Delete "$INSTDIR\graphics\chroma-marble\20_player_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\20_player_one.png" + Delete "$INSTDIR\graphics\chroma-marble\20_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_map_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_y.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_x.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots_double.png" + Delete "$INSTDIR\graphics\chroma-marble\20_dots.png" + Delete "$INSTDIR\graphics\chroma-marble\20_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_door.png" + Delete "$INSTDIR\graphics\chroma-marble\20_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\20_circle_double.png" + Delete "$INSTDIR\graphics\chroma-marble\20_circle.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\20_arrow_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_y.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_x.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_outside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_outside.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_inside_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall_inside.png" + Delete "$INSTDIR\graphics\chroma-marble\16_wall.png" + Delete "$INSTDIR\graphics\chroma-marble\16_teleport_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_teleport.png" + Delete "$INSTDIR\graphics\chroma-marble\16_switch_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_switch.png" + Delete "$INSTDIR\graphics\chroma-marble\16_star_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_star.png" + Delete "$INSTDIR\graphics\chroma-marble\16_space.png" + Delete "$INSTDIR\graphics\chroma-marble\16_player_two_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\16_player_two.png" + Delete "$INSTDIR\graphics\chroma-marble\16_player_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_player_one_swapped.png" + Delete "$INSTDIR\graphics\chroma-marble\16_player_one.png" + Delete "$INSTDIR\graphics\chroma-marble\16_map_top_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_map_top_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_map_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_map_bottom_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_map_bottom_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_y_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_y.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_x_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_x.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots_double.png" + Delete "$INSTDIR\graphics\chroma-marble\16_dots.png" + Delete "$INSTDIR\graphics\chroma-marble\16_door_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_door.png" + Delete "$INSTDIR\graphics\chroma-marble\16_circle_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_circle_double_shadow.png" + Delete "$INSTDIR\graphics\chroma-marble\16_circle_double.png" + Delete "$INSTDIR\graphics\chroma-marble\16_circle.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_bomb_blue_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_shadow_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_shadow_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_shadow_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_shadow_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_red_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_red_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_red_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_red_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_green_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_green_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_green_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_green_down.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_blue_up.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_blue_right.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_blue_left.png" + Delete "$INSTDIR\graphics\chroma-marble\16_arrow_blue_down.png" + Delete "$INSTDIR\help\README" + Delete "$INSTDIR\colours\fallback.chroma" + Delete "$INSTDIR\colours\chroma-standard.chroma" + Delete "$INSTDIR\colours\chroma-reverse.chroma" + Delete "$INSTDIR\colours\chroma-monochrome.chroma" + Delete "$INSTDIR\colours\chroma-enigma.chroma" + Delete "$INSTDIR\colours\chroma-enhanced.chroma" + Delete "$INSTDIR\README" + Delete "$INSTDIR\COPYING" + Delete "$INSTDIR\chroma.exe" + Delete "$INSTDIR\chroma-curses.exe" + + Delete "$SMPROGRAMS\Chroma\Uninstall.lnk" + Delete "$DESKTOP\Chroma.lnk" + Delete "$SMPROGRAMS\Chroma\Chroma.lnk" + Delete "$SMPROGRAMS\Chroma\Chroma Curses.lnk" + + RMDir "$SMPROGRAMS\Chroma" + RMDir "$INSTDIR\levels\regression" + RMDir "$INSTDIR\levels\chroma-2" + RMDir "$INSTDIR\levels\chroma-1" + RMDir "$INSTDIR\levels" + RMDir "$INSTDIR\graphics\resources" + RMDir "$INSTDIR\graphics\chroma-zen" + RMDir "$INSTDIR\graphics\chroma-neon" + RMDir "$INSTDIR\graphics\chroma-marble" + RMDir "$INSTDIR\graphics" + RMDir "$INSTDIR\help" + RMDir "$INSTDIR\colours" + RMDir "$INSTDIR" + + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + SetAutoClose true +SectionEnd diff --git a/colours.c b/colours.c new file mode 100644 index 0000000..12d6be0 --- /dev/null +++ b/colours.c @@ -0,0 +1,408 @@ +/* + colours.c + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "chroma.h" +#include "level.h" +#include "util.h" +#include "colours.h" +#include "menu.h" +#include "xmlparser.h" + +struct colours* pdisplaycolours = NULL; + +extern char options_colours[]; +extern int options_debug; +extern char *piece_name[]; + +void colours_init() +{ + char filename[FILENAME_MAX]; + char directory[FILENAME_MAX]; + + if(pdisplaycolours != NULL) + colours_delete(pdisplaycolours); + + pdisplaycolours = colours_load(options_colours, 0); + + if(pdisplaycolours == NULL) + { + /* Revert to default */ + getfilename("colours", directory, 0, LOCATION_SYSTEM); + sprintf(filename, "%s%s%s", directory, "/", COLOURS_DEFAULT); + pdisplaycolours = colours_load(filename, 0); + + /* If we can't even load the default, use an emergency scheme */ + if(pdisplaycolours == NULL) + pdisplaycolours = colours_load(NULL, 0); + } +} + +struct colours* colours_load(char *filename, int partial) +{ + struct colours* pcolours; + struct parser* pparser = NULL; + int state; + int piece; + int i; + int foreground, background, bold, reverse; + char character; + char *text; + int colour; + + if(filename != NULL) + { + if(!isfile(filename)) + return NULL; + + pparser = parser_new(filename); + if(pparser == NULL) + return NULL; + } + + pcolours = (struct colours*)malloc(sizeof(struct colours)); + pcolours->title = NULL; + if(pcolours == NULL) + return NULL; + + /* Sensible defaults */ + if(!partial) + { + for(i = 0; i < PIECE_MAX; i ++) + { + pcolours->character[i] = piecetochar(i); + pcolours->foreground[i] = -1; + pcolours->background[i] = -1; + pcolours->bold[i] = 0; + pcolours->reverse[i] = 0; + } + } + + /* Emergency default colour scheme */ + if(filename == NULL) + return pcolours; + + /* Parse XML file */ + /* + + + title + + + + + + */ + + enum{ + COLOURSPARSER_BAD, /* End of bad file */ + COLOURSPARSER_END, /* End of good file */ + COLOURSPARSER_OUTSIDE, /* Outside */ + COLOURSPARSER_CHROMA, /* Inside */ + COLOURSPARSER_PIECES /* Inside */ + }; + + state = COLOURSPARSER_OUTSIDE; + piece = PIECE_UNKNOWN; + foreground = 7; background = 0; bold = 0; reverse = 0; character = ' '; + + while(state != COLOURSPARSER_BAD && state != COLOURSPARSER_END) + { + switch(parser_parse(pparser)) + { + case PARSER_END: + if(state == COLOURSPARSER_OUTSIDE) + state = COLOURSPARSER_BAD; + else + state = COLOURSPARSER_END; + break; + + case PARSER_ELEMENT_START: + switch(state) + { + case COLOURSPARSER_CHROMA: + if(parser_match(pparser, 0, "pieces")) + state = COLOURSPARSER_PIECES; + break; + + case COLOURSPARSER_PIECES: + if(parser_match(pparser, 0, "piece")) + { + piece = PIECE_UNKNOWN; + foreground = 7; background = -1; + bold = 0; reverse = 0; + character = ' '; + } + break; + + default: + break; + } + break; + + case PARSER_ELEMENT_END: + switch(state) + { + case COLOURSPARSER_CHROMA: /* If we're only partially loading the file, end parsing at */ + if(parser_match(pparser, 0, "head")) + { + if(partial) + state = COLOURSPARSER_END; + } + break; + + case COLOURSPARSER_PIECES: + if(parser_match(pparser, 0, "pieces")) + state = COLOURSPARSER_CHROMA; + if(parser_match(pparser, 0, "piece")) + { + if(piece != PIECE_UNKNOWN) + { + pcolours->character[piece] = character; + pcolours->foreground[piece] = foreground; + pcolours->background[piece] = background; + pcolours->bold[piece] = bold; + pcolours->reverse[piece] = reverse; + } + } + break; + + default: + break; + } + + break; + + case PARSER_CONTENT: + switch(state) + { + case COLOURSPARSER_CHROMA: + if(parser_match(pparser, 1, "title")) + { + pcolours->title = malloc(strlen(parser_text(pparser, 0)) + 1); + if(pcolours->title == NULL) + fatal(gettext("Out of memory in colours_load()")); + strcpy(pcolours->title, parser_text(pparser, 0)); + } + + break; + + default: + break; + } + break; + + case PARSER_ATTRIBUTE: + switch(state) + { + case COLOURSPARSER_OUTSIDE: if(parser_match(pparser, 2, "chroma") && parser_match(pparser, 1, "type")) + { + if(parser_match(pparser, 0, "colours") || parser_match(pparser, 0, "colors")) + state = COLOURSPARSER_CHROMA; + } + break; + + case COLOURSPARSER_CHROMA: + if(parser_match(pparser, 2, "chroma") && parser_match(pparser, 1, "hidden")) + { + if(parser_match(pparser, 0, "yes")) + { + if(partial && !(options_debug & DEBUG_HIDDEN)) + state = COLOURSPARSER_BAD; + } + } + if(parser_match(pparser, 2, "title") && parser_match(pparser, 1, "translate")) + { + if(parser_match(pparser, 0, "yes")) + pcolours->flags |= COLOURS_TRANSLATE; + } + break; + + case COLOURSPARSER_PIECES: + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "name")) + { + for(i = 0; i < PIECE_UNKNOWN; i ++) + { + if(strcasecmp(parser_text(pparser, 0), piece_name[i]) == 0) + piece = i; + } + } + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "character")) + { + text = parser_text(pparser, 0); + if(text[0] != 0) + character = text[0]; + } + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "bold")) + { + bold = 0; + if(strcmp(parser_text(pparser, 0), "yes") == 0) + bold = 1; + } + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "reverse")) + { + reverse = 0; + if(strcmp(parser_text(pparser, 0), "yes") == 0) + reverse = 1; + } + if(parser_match(pparser, 2, "piece") && (parser_match(pparser, 1, "background") || parser_match(pparser, 1, "foreground"))) + { + colour = -1; + if(strcmp(parser_text(pparser, 0), "black") == 0) + colour = 0; + if(strcmp(parser_text(pparser, 0), "red") == 0) + colour = 1; + if(strcmp(parser_text(pparser, 0), "green") == 0) + colour = 2; + if(strcmp(parser_text(pparser, 0), "yellow") == 0) + colour = 3; + if(strcmp(parser_text(pparser, 0), "blue") == 0) + colour = 4; + if(strcmp(parser_text(pparser, 0), "magenta") == 0) + colour = 5; + if(strcmp(parser_text(pparser, 0), "cyan") == 0) + colour = 6; + if(strcmp(parser_text(pparser, 0), "white") == 0) + colour = 7; + + if(parser_match(pparser, 1, "background")) + background = colour; + if(parser_match(pparser, 1, "foreground") && colour != -1) + foreground = colour; + } + break; + + default: + break; + } + break; + + case PARSER_ERROR: + default: + break; + } + } + + parser_delete(pparser); + + if(state == COLOURSPARSER_BAD) + { + colours_delete(pcolours); + return NULL; + } + + return pcolours; +} + +void colours_delete(struct colours* pcolours) +{ + if(pcolours->title != NULL) + free(pcolours->title); + + free(pcolours); +} + +struct menu* colours_menu() +{ + DIR *pdir; + struct dirent *dentry; + struct menu* pmenu; + struct menuentry* pentry; + char directory[FILENAME_MAX]; + char filename[FILENAME_MAX]; + struct colours* pcolours; + int location; + + pmenu = menu_new(gettext("Colour Schemes")); + + menuentry_new(pmenu, gettext("Quit and return to previous menu"), 'Q', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Current colour scheme:"), 0, MENU_NOTE); + + if(pdisplaycolours == NULL) + menuentry_new(pmenu, gettext("** NONE **"), 0, MENU_NOTE | MENU_RIGHT); + else if(pdisplaycolours->title == NULL) + menuentry_new(pmenu, gettext("[untitled colours]"), 0, MENU_NOTE | MENU_RIGHT); + else if(pdisplaycolours->flags & COLOURS_TRANSLATE) + menuentry_new(pmenu, gettext(pdisplaycolours->title), 0, MENU_NOTE | MENU_RIGHT); + else + menuentry_new(pmenu, pdisplaycolours->title, 0, MENU_NOTE | MENU_RIGHT); + /* Global, then user */ + for(location = 1; location >= 0; location --) + { + getfilename("colours", directory, 0, location); + + pdir = opendir(directory); + if(pdir == NULL) + continue; + + while((dentry = readdir(pdir)) != NULL) + { + if(strcmp(dentry->d_name, ".") == 0) + continue; + if(strcmp(dentry->d_name, "..") == 0) + continue; + + sprintf(filename, "%s%s%s", directory, "/", dentry->d_name); + + if(isfile(filename) && strlen(filename) > 7 && strcmp(filename + strlen(filename) - 7, ".chroma") == 0) + { + pcolours = colours_load(filename, 1); + if(pcolours != NULL) + { + if(pcolours->title == NULL) + pentry = menuentry_newwithvalue(pmenu, gettext("[untitled colours]"), 0, MENU_SORT, filename); + else if(pcolours->flags & COLOURS_TRANSLATE) + pentry = menuentry_newwithvalue(pmenu, gettext(pcolours->title), 0, MENU_SORT, filename); + else + pentry = menuentry_newwithvalue(pmenu, pcolours->title, 0, MENU_SORT, filename); + colours_delete(pcolours); + + if(strcmp(options_colours, filename) == 0) + pmenu->entry_selected = pentry; + } + } + } + + closedir(pdir); + + menu_unsort(pmenu); + + if(location == 1) + menuentry_new(pmenu, "", 0, MENU_SPACE); + } + + menu_assignletters(pmenu); + + return pmenu; +} diff --git a/colours.h b/colours.h new file mode 100644 index 0000000..3b1c1f5 --- /dev/null +++ b/colours.h @@ -0,0 +1,42 @@ +/* + colours.h + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#define COLOURS_DEFAULT "chroma-standard.chroma" + +#define COLOURS_TRANSLATE 1 + +struct colours +{ + char *title; + + char character[PIECE_MAX]; + int foreground[PIECE_MAX]; + int background[PIECE_MAX]; + int bold[PIECE_MAX]; + int reverse[PIECE_MAX]; + int flags; +}; + +void colours_init(); +struct colours* colours_load(char *filename, int partial); +void colours_delete(struct colours*); +struct menu* colours_menu(); + + diff --git a/colours/chroma-enhanced.chroma b/colours/chroma-enhanced.chroma new file mode 100644 index 0000000..ea91105 --- /dev/null +++ b/colours/chroma-enhanced.chroma @@ -0,0 +1,77 @@ + + + +Chroma Curses Enhanced + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/colours/chroma-enigma.chroma b/colours/chroma-enigma.chroma new file mode 100644 index 0000000..2c53f2c --- /dev/null +++ b/colours/chroma-enigma.chroma @@ -0,0 +1,77 @@ + + + +Chroma Curses Enigma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/colours/chroma-monochrome.chroma b/colours/chroma-monochrome.chroma new file mode 100644 index 0000000..125a77d --- /dev/null +++ b/colours/chroma-monochrome.chroma @@ -0,0 +1,77 @@ + + + +Chroma Curses Monochrome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/colours/chroma-reverse.chroma b/colours/chroma-reverse.chroma new file mode 100644 index 0000000..459e11c --- /dev/null +++ b/colours/chroma-reverse.chroma @@ -0,0 +1,77 @@ + + + +Chroma Curses Reverse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/colours/chroma-standard.chroma b/colours/chroma-standard.chroma new file mode 100644 index 0000000..717ee8c --- /dev/null +++ b/colours/chroma-standard.chroma @@ -0,0 +1,77 @@ + + + +Chroma Curses Standard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/colours/fallback.chroma b/colours/fallback.chroma new file mode 100644 index 0000000..68cbe51 --- /dev/null +++ b/colours/fallback.chroma @@ -0,0 +1,6 @@ + + diff --git a/configure b/configure new file mode 100755 index 0000000..df47484 --- /dev/null +++ b/configure @@ -0,0 +1,4298 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="main.c" +ac_subst_vars='LTLIBOBJS +LIBOBJS +TARGETSINSTALL +TARGETSCLEAN +TARGETS +CURSES +PKG_CONFIG +FREETYPE_CONFIG +SDLCONFIG +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_sdl +enable_curses +with_freetype_prefix +with_freetype_exec_prefix +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-sdl build SDL chroma + --enable-curses build curses chroma + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-freetype-prefix=PFX Prefix where FREETYPE is installed (optional) + --with-freetype-exec-prefix=PFX Exec prefix where FREETYPE is installed (optional) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Check whether --enable-sdl was given. +if test "${enable_sdl+set}" = set; then : + enableval=$enable_sdl; with_sdl=$enableval +else + with_sdl=yes +fi + + +# Check whether --enable-curses was given. +if test "${enable_curses+set}" = set; then : + enableval=$enable_curses; with_curses=$enableval +else + with_curses=yes +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +if test "$with_sdl" = "yes"; then + # Extract the first word of "sdl-config", so it can be a program name with args. +set dummy sdl-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SDLCONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SDLCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_SDLCONFIG="$SDLCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SDLCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_SDLCONFIG" && ac_cv_path_SDLCONFIG="no" + ;; +esac +fi +SDLCONFIG=$ac_cv_path_SDLCONFIG +if test -n "$SDLCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDLCONFIG" >&5 +$as_echo "$SDLCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$SDLCONFIG" = "no"; then + as_fn_error $? "*** Unable to find sdl-config" "$LINENO" 5 + else + CFLAGS="$CFLAGS "`sdl-config --cflags` + LDFLAGS="$LDFLAGS "`sdl-config --libs` + fi +fi + +if test "$with_sdl" = "yes"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IMG_LoadPNG_RW in -lSDL_image" >&5 +$as_echo_n "checking for IMG_LoadPNG_RW in -lSDL_image... " >&6; } +if ${ac_cv_lib_SDL_image_IMG_LoadPNG_RW+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lSDL_image $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IMG_LoadPNG_RW (); +int +main () +{ +return IMG_LoadPNG_RW (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_SDL_image_IMG_LoadPNG_RW=yes +else + ac_cv_lib_SDL_image_IMG_LoadPNG_RW=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_image_IMG_LoadPNG_RW" >&5 +$as_echo "$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" >&6; } +if test "x$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSDL_IMAGE 1 +_ACEOF + + LIBS="-lSDL_image $LIBS" + +fi + + if test "$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" != "yes"; then + as_fn_error $? "*** Unable to find SDL_image library with PNG support" "$LINENO" 5 + fi +fi + +if test "$with_sdl" = "yes"; then + +# Check whether --with-freetype-prefix was given. +if test "${with_freetype_prefix+set}" = set; then : + withval=$with_freetype_prefix; freetype_prefix="$withval" +else + freetype_prefix="" +fi + + +# Check whether --with-freetype-exec-prefix was given. +if test "${with_freetype_exec_prefix+set}" = set; then : + withval=$with_freetype_exec_prefix; freetype_exec_prefix="$withval" +else + freetype_exec_prefix="" +fi + + if test x$freetype_exec_prefix != x ; then + freetype_args="$freetype_args --exec-prefix=$freetype_exec_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_exec_prefix/bin/freetype-config + fi + fi + if test x$freetype_prefix != x ; then + freetype_args="$freetype_args --prefix=$freetype_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_prefix/bin/freetype-config + fi + fi + # Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FREETYPE_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no" + ;; +esac +fi +FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG +if test -n "$FREETYPE_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 +$as_echo "$FREETYPE_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + no_freetype="" + if test "$FREETYPE_CONFIG" = "no" ; then + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$PKG_CONFIG" = "no" ; then + as_fn_error $? "*** Unable to find FreeType2 library (http://www.freetype.org/)" "$LINENO" 5 + else + CFLAGS="$CFLAGS `$PKG_CONFIG freetype2 --cflags`" + LIBS="$LIBS `$PKG_CONFIG freetype2 --libs`" + fi + else + CFLAGS="$CFLAGS `$FREETYPE_CONFIG $freetypeconf_args --cflags`" + LIBS="$LIBS `$FREETYPE_CONFIG $freetypeconf_args --libs`" + fi +fi + +if test "$with_curses" = "yes"; then + CURSES="ncurses" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 +$as_echo_n "checking for initscr in -lncurses... " >&6; } +if ${ac_cv_lib_ncurses_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ncurses_initscr=yes +else + ac_cv_lib_ncurses_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_initscr" >&5 +$as_echo "$ac_cv_lib_ncurses_initscr" >&6; } +if test "x$ac_cv_lib_ncurses_initscr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNCURSES 1 +_ACEOF + + LIBS="-lncurses $LIBS" + +fi + + if test "$ac_cv_lib_ncurses_initscr" != "yes"; then + CURSES="curses" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lcurses" >&5 +$as_echo_n "checking for initscr in -lcurses... " >&6; } +if ${ac_cv_lib_curses_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_curses_initscr=yes +else + ac_cv_lib_curses_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_initscr" >&5 +$as_echo "$ac_cv_lib_curses_initscr" >&6; } +if test "x$ac_cv_lib_curses_initscr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCURSES 1 +_ACEOF + + LIBS="-lcurses $LIBS" + +fi + + if test "$ac_cv_lib_curses_initscr" != "yes"; then + CURSES="" + fi + fi + if test "$CURSES" = ""; then + as_fn_error $? "*** Unable to find curses / ncurses library" "$LINENO" 5 + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gettext" >&5 +$as_echo_n "checking for library containing gettext... " >&6; } +if ${ac_cv_search_gettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +for ac_lib in '' intl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_gettext=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_gettext+:} false; then : + break +fi +done +if ${ac_cv_search_gettext+:} false; then : + +else + ac_cv_search_gettext=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gettext" >&5 +$as_echo "$ac_cv_search_gettext" >&6; } +ac_res=$ac_cv_search_gettext +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +TARGETS="" +TARGETSCLEAN="" +TARGETSINSTALL="" +if test "$with_sdl" = "yes"; then +TARGETS="$TARGETS chroma-sdl" +TARGETSCLEAN="$TARGETSCLEAN clean-sdl"; +TARGETSINSTALL="$TARGETSINSTALL install-sdl"; +fi +if test "$with_curses" = "yes"; then +TARGETS="$TARGETS chroma-curses" +TARGETSCLEAN="$TARGETSCLEAN clean-curses"; +TARGETSINSTALL="$TARGETSINSTALL install-curses"; +fi +if test "$TARGETS" = ""; then +as_fn_error $? "*** Nothing to build - specify either --enable-sdl and/or --enable-curses" "$LINENO" 5 +fi + + + + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..68c5fa4 --- /dev/null +++ b/configure.ac @@ -0,0 +1,113 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(main.c) + +AC_ARG_ENABLE(sdl, + [ --enable-sdl build SDL chroma], + [with_sdl=$enableval], + [with_sdl=yes], +) + +AC_ARG_ENABLE(curses, + [ --enable-curses build curses chroma], + [with_curses=$enableval], + [with_curses=yes], +) + +dnl Check for programs +AC_PROG_CC +AC_PROG_INSTALL + +dnl Check for SDL +if test "$with_sdl" = "yes"; then + AC_PATH_PROG(SDLCONFIG, sdl-config, no) + if test "$SDLCONFIG" = "no"; then + AC_MSG_ERROR([*** Unable to find sdl-config]) + else + CFLAGS="$CFLAGS "`sdl-config --cflags` + LDFLAGS="$LDFLAGS "`sdl-config --libs` + fi +fi + +dnl Check for SDL_image library +if test "$with_sdl" = "yes"; then + AC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW) + if test "$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" != "yes"; then + AC_MSG_ERROR([*** Unable to find SDL_image library with PNG support]) + fi +fi + +dnl Check for the FreeType 2 library +if test "$with_sdl" = "yes"; then + AC_ARG_WITH(freetype-prefix,[ --with-freetype-prefix=PFX Prefix where FREETYPE is installed (optional)], freetype_prefix="$withval", freetype_prefix="") + AC_ARG_WITH(freetype-exec-prefix,[ --with-freetype-exec-prefix=PFX Exec prefix where FREETYPE is installed (optional)], freetype_exec_prefix="$withval", freetype_exec_prefix="") + if test x$freetype_exec_prefix != x ; then + freetype_args="$freetype_args --exec-prefix=$freetype_exec_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_exec_prefix/bin/freetype-config + fi + fi + if test x$freetype_prefix != x ; then + freetype_args="$freetype_args --prefix=$freetype_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_prefix/bin/freetype-config + fi + fi + AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) + no_freetype="" + if test "$FREETYPE_CONFIG" = "no" ; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + if test "$PKG_CONFIG" = "no" ; then + AC_MSG_ERROR([*** Unable to find FreeType2 library (http://www.freetype.org/)]) + else + CFLAGS="$CFLAGS `$PKG_CONFIG freetype2 --cflags`" + LIBS="$LIBS `$PKG_CONFIG freetype2 --libs`" + fi + else + CFLAGS="$CFLAGS `$FREETYPE_CONFIG $freetypeconf_args --cflags`" + LIBS="$LIBS `$FREETYPE_CONFIG $freetypeconf_args --libs`" + fi +fi + +dnl Check for curses library +if test "$with_curses" = "yes"; then + CURSES="ncurses" + AC_CHECK_LIB(ncurses, initscr) + if test "$ac_cv_lib_ncurses_initscr" != "yes"; then + CURSES="curses" + AC_CHECK_LIB(curses, initscr) + if test "$ac_cv_lib_curses_initscr" != "yes"; then + CURSES="" + fi + fi + if test "$CURSES" = ""; then + AC_MSG_ERROR([*** Unable to find curses / ncurses library]) + fi +fi + +dnl Check for gettext library +AC_SEARCH_LIBS(gettext, intl) + +dnl Determine targets to build +TARGETS="" +TARGETSCLEAN="" +TARGETSINSTALL="" +if test "$with_sdl" = "yes"; then +TARGETS="$TARGETS chroma-sdl" +TARGETSCLEAN="$TARGETSCLEAN clean-sdl"; +TARGETSINSTALL="$TARGETSINSTALL install-sdl"; +fi +if test "$with_curses" = "yes"; then +TARGETS="$TARGETS chroma-curses" +TARGETSCLEAN="$TARGETSCLEAN clean-curses"; +TARGETSINSTALL="$TARGETSINSTALL install-curses"; +fi +if test "$TARGETS" = ""; then +AC_MSG_ERROR([*** Nothing to build - specify either --enable-sdl and/or --enable-curses]) +fi + +AC_SUBST(CURSES) +AC_SUBST(TARGETS) +AC_SUBST(TARGETSCLEAN) +AC_SUBST(TARGETSINSTALL) +AC_OUTPUT(Makefile) + diff --git a/cursesdisplay.c b/cursesdisplay.c new file mode 100644 index 0000000..1c694ad --- /dev/null +++ b/cursesdisplay.c @@ -0,0 +1,1872 @@ +/* + cursesdisplay.c + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include + +#ifdef CHROMA_CURSES_HEADER +#include CHROMA_CURSES_HEADER +#else +#ifdef __WIN32__ +#include +#else +#include +#endif +#endif + +#include "chroma.h" +#include "menu.h" +#include "level.h" +#include "display.h" +#include "colours.h" +#include "actions.h" +#include "util.h" +#include "xmlparser.h" + +char options_colours[FILENAME_MAX] = COLOURS_DEFAULT; +int options_curses_delay = 1; +int options_curses_replay_delay = 1; +int options_debug = 0; +#ifdef XOR_COMPATIBILITY +int options_xor_options = 0; +int options_xor_mode = 1; +int options_xor_display = 0; +#endif +#ifdef ENIGMA_COMPATIBILITY +int options_enigma_options = 0; +int options_enigma_mode = 1; +#endif + + +extern struct colours* pdisplaycolours; +extern int *editor_piece_maps[]; +extern char *action_name[]; +extern char *action_shortname[]; + +/* Translation table for colours. + This is necessary as some versions of curses interchange red and blue. + */ +short colourtrans[] = {COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE}; + +int dp_attr[256], dp_col[256]; +char dp_char[256]; + +int actions[KEY_MAX]; + +int display_size_x, display_size_y; +int display_offset_x, display_offset_y; +int display_focus_x, display_focus_y; +int display_start_x, display_start_y; +int display_end_x, display_end_y; +int display_border = 7; + +void display_piece(struct level* plevel, int piece); + +int display_colourpairs = 0; +short display_cpfore[64]; +short display_cpback[64]; + +short colourpair_red; +short colourpair_green; +short colourpair_yellow; +short colourpair_blue; +short colourpair_cyan; +short colourpair_magenta; +short colourpair_cyan; +short colourpair_white; +short colourpair_menu; +short colourpair_menugrey; + +char *display_keyname(int i); +void display_addkeytomenu(struct menu* pmenu, int action, char *text); +void display_keys(); +void display_debug(); +void display_initcolours(); + +void display_options_othergames(); + +short display_newcolourpair(short foreground, short background) +{ + short i; + + for(i = 1; i <= display_colourpairs; i ++) + { + if(foreground == display_cpfore[i] && background == display_cpback[i]) + return i; + } + display_colourpairs ++; + display_cpfore[display_colourpairs] = foreground; + display_cpback[display_colourpairs] = background; + + init_pair(display_colourpairs, foreground, background); + + return display_colourpairs; +} + +void display_init() +{ + setlocale(LC_CTYPE, ""); + atexit(display_quit); + initscr(); + raw(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); + start_color(); + + getmaxyx(stdscr, display_size_y, display_size_x); + + colourpair_red = display_newcolourpair(COLOR_RED, COLOR_BLACK); + colourpair_green = display_newcolourpair(COLOR_GREEN, COLOR_BLACK); + colourpair_yellow = display_newcolourpair(COLOR_YELLOW, COLOR_BLACK); + colourpair_blue = display_newcolourpair(COLOR_BLUE, COLOR_BLACK); + colourpair_magenta = display_newcolourpair(COLOR_MAGENTA, COLOR_BLACK); + colourpair_cyan = display_newcolourpair(COLOR_CYAN, COLOR_BLACK); + colourpair_white = display_newcolourpair(COLOR_WHITE, COLOR_BLACK); + colourpair_menu = display_newcolourpair(COLOR_CYAN, COLOR_BLUE); + colourpair_menugrey = display_newcolourpair(COLOR_CYAN, COLOR_BLACK); + + display_options_load(); + colours_init(); + display_initcolours(); +} + +void display_initcolours() +{ + int i; + short fg, bg; + +#ifdef PDCURSES + short tg; +#endif + + for(i = 0; i < PIECE_MAX; i ++) + { + fg = pdisplaycolours->foreground[i]; + if(fg < 0 || fg > 7) + fg = 7; + + bg = pdisplaycolours->background[i]; + if(bg < 0 || bg > 7) + bg = 0; + +#ifdef PDCURSES + /* PDCurses doesn't handle reverse colours well; we swap them manually */ + if(pdisplaycolours->reverse[i]) + { + tg = fg; fg = bg; bg = tg; + } +#endif + + dp_attr[i] = COLOR_PAIR(display_newcolourpair(colourtrans[fg], colourtrans[bg])); + + if(pdisplaycolours->bold[i]) + dp_attr[i] |= A_BOLD; + +#ifndef PDCURSES + if(pdisplaycolours->reverse[i]) + dp_attr[i] |= A_REVERSE; +#endif + } + +} + +void display_quit() +{ + clear(); + refresh(); + endwin(); +} + +void display_hide() +{ + clear(); + refresh(); + getch(); +} + +void display_piece(struct level* plevel, int piece) +{ + int p; + + if(piece < 0 || piece >= PIECE_MAX) + return; + + /* Use the colours of PIECE_PLAYER_ONE for the active player, + and the colours of PIECE_PLAYER_TWO for the inactive one. */ + p = piece; + if(p == PIECE_PLAYER_ONE || p == PIECE_PLAYER_TWO) + { + if(plevel->player != 2) + { + if(plevel->player != (p & 1)) + p = PIECE_PLAYER_TWO; + else + p = PIECE_PLAYER_ONE; + } + else + p = PIECE_PLAYER_ONE; + } + + addch(pdisplaycolours->character[piece] | dp_attr[p]); +} + +void display_moves(struct level* plevel, struct level* plevelreplay) +{ + static int length = 0; + int i; + char buffer[256]; + int moves, moves2; + + moves = 0; + if(plevel->move_current != NULL) + { + /* If move_current->mover_first == NULL, we've actually undone all of + the current move, and are just about to move back to the previous + one; we treat it as the previous one for counting purposes */ + if(plevel->move_current->mover_first != NULL) + moves = plevel->move_current->count; + else + moves = plevel->move_current->count - 1; + } + + moves2 = -1; + if(plevelreplay != NULL) + { + moves2 = 0; + if(plevelreplay->move_last != NULL) + moves2 = plevelreplay->move_last->count; + } + /* Similarly, move_current->mover_first == NULL complicates things here */ + else if(plevel->move_current != plevel->move_last + || (plevel->move_current != NULL && plevel->move_current->mover_first == NULL)) + { + if(plevel->move_last != NULL) + moves2 = plevel->move_last->count; + } + + if(moves2 != -1) + sprintf(buffer, "%s%d/%d", + plevel->flags & LEVELFLAG_PAUSED ? gettext("paused ") : + plevelreplay != NULL ? gettext("replay ") : "", + moves, moves2); + else + sprintf(buffer, "%s%d", + plevel->flags & LEVELFLAG_PAUSED ? gettext("paused ") : "", + moves); + + if(plevel->flags & LEVELFLAG_FAILED) + sprintf(buffer, gettext("failed")); + + attron(COLOR_PAIR(colourpair_cyan)); + + /* Blank previous display only if necessary */ + if(utf8strlen(buffer) < length) + { + for(i = 0; i < length; i ++) + mvprintw(display_size_y - 1, display_size_x - 2 - length + i, " "); + } + + length = utf8strlen(buffer); + + mvprintw(display_size_y - 1, display_size_x - utf8strlen(buffer) - 2, "%s", buffer); + attroff(COLOR_PAIR(colourpair_cyan)); + + move(display_size_y - 1, display_size_x - 1); + display_piece(plevel, PIECE_PLAYER_ONE + plevel->player); + refresh(); +} + +void display_stars(struct level* plevel) +{ + static int length = 0; + char buffer[256]; + int i; + + sprintf(buffer, "%d/%d", plevel->stars_caught, plevel->stars_total); + + if(plevel->stars_exploded != 0) + sprintf(buffer, gettext("%d lost"), plevel->stars_exploded); + + if(plevel->flags & LEVELFLAG_SOLVED && !(plevel->flags & LEVELFLAG_FAILED)) + sprintf(buffer, gettext("solved")); + + attron(COLOR_PAIR(colourpair_yellow)); + + /* Blank previous display only if necessary */ + if(utf8strlen(buffer) < length) + { + for(i = 0; i < length; i ++) + mvprintw(display_size_y - 1, i + 2, " "); + } + + length = utf8strlen(buffer); + + mvprintw(display_size_y - 1, 2, "%s", buffer); + attroff(COLOR_PAIR(colourpair_yellow)); + + move(display_size_y - 1, 0); + display_piece(plevel, PIECE_STAR); +} + +int display_focus(struct level* plevel) +{ + int px, py; + int ox, oy; +#ifdef XOR_COMPATIBILITY + int redraw; +#endif + + getmaxyx(stdscr, display_size_y, display_size_x); + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR && options_xor_display) + { + if(display_start_x != plevel->view_x[plevel->player] || display_start_y != plevel->view_y[plevel->player]) + redraw = 1; + else + redraw = 0; + + display_start_x = plevel->view_x[plevel->player]; + display_start_y = plevel->view_y[plevel->player]; + display_end_x = display_start_x + 8; + display_end_y = display_start_y + 8; + + return redraw; + } +#endif + + ox = display_start_x; + oy = display_start_y; + px = plevel->player_x[plevel->player]; + py = plevel->player_y[plevel->player]; + + if(plevel->size_x < display_size_x) + { + display_start_x = 0; + display_end_x = plevel->size_x; + } + else + { + if(px < display_start_x + display_border) + display_start_x = px - display_border; + if(px >= display_start_x + display_size_x - display_border) + display_start_x = px - display_size_x + display_border; + if(display_start_x < 0) + display_start_x = 0; + if(display_start_x + display_size_x > plevel->size_x) + display_start_x = plevel->size_x - display_size_x; + display_end_x = display_start_x + display_size_x; + + } + if(plevel->size_y < display_size_y - 1) + { + display_start_y = 0; + display_end_y = plevel->size_y; + } + else + { + if(py < display_start_y + display_border) + display_start_y = py - display_border; + if(py >= display_start_y + display_size_y - 1 - display_border) + display_start_y = py - display_size_y + 1 + display_border; + if(display_start_y < 0) + display_start_y = 0; + if(display_start_y + display_size_y - 1 > plevel->size_y) + display_start_y = plevel->size_y - display_size_y + 1; + display_end_y = display_start_y + display_size_y - 1; + + } + + if(ox != display_start_x || oy != display_start_y) + return 1; + else + return 0; +} + +void display_level(struct level* plevel) +{ + int x, y; + int p; + + clear(); + + getmaxyx(stdscr, display_size_y, display_size_x); + + if(display_start_x < 0) + display_start_x = 0; + if(display_start_y < 0) + display_start_y = 0; + + if(display_end_x > plevel->size_x) + display_end_x = plevel->size_x; + if(display_end_y > plevel->size_y) + display_end_y = plevel->size_y; + + display_offset_x = (display_size_x - (display_end_x - display_start_x))/2; + display_offset_y = (display_size_y - (display_end_y - display_start_y))/2; + + for(y = display_start_y; y < display_end_y; y++) + { + move(y + display_offset_y - display_start_y, display_offset_x); + for(x = display_start_x; x < display_end_x; x++) + { + p = level_piece(plevel, x, y); +#ifdef XOR_COMPATIBILITY + if(plevel->switched && (p == PIECE_SPACE || p == PIECE_WALL)) + p = PIECE_DARKNESS; +#endif + display_piece(plevel, p); + } + } +} + +void display_play(struct level* plevel, struct level* plevelreplay) +{ + int key; + int quit; + struct mover* pmover; + int redraw; + int x, y; + int p; + int playermove; + int delay; + int fast; + int pass; + int c; + short cp; + char font_logo_colours[] = "1326454646644"; + char buffer[256]; + + quit = 0; + redraw = 1; + fast = 0; + + while(!quit) + { + redraw += display_focus(plevel); + + if(redraw) + { + display_level(plevel); + + if(plevel->title != NULL) + { + y = display_size_y - 1; + x = (display_size_x - utf8strlen(plevel->title) - (plevel->flags & LEVELFLAG_TESTING ? utf8strlen(gettext("testing: ")) : 0) ) / 2; + if(x < 0) + x = 0; + move(y, x); + + if(plevel->flags & LEVELFLAG_TESTING) + { + attron(COLOR_PAIR(colourpair_cyan)); + printw(gettext("testing: ")); + attroff(COLOR_PAIR(colourpair_cyan)); + } + if((strncmp(gettext(plevel->title), "chroma", 6) == 0)) + { + strcpy(buffer, gettext(plevel->title)); + + for(x = 0; x < strlen(buffer); x ++) + { + cp = colourpair_white; + if(x < strlen(font_logo_colours)) + c = font_logo_colours[x] - '0'; + else + { + printw(buffer + x); + x = strlen(buffer); + break; + } + switch(c) + { + case 1: + cp = colourpair_red; + break; + case 2: + cp = colourpair_green; + break; + case 3: + cp = colourpair_yellow; + break; + case 4: + cp = colourpair_blue; + break; + case 5: + cp = colourpair_magenta; + break; + case 6: + cp = colourpair_cyan; + break; + default: + cp = colourpair_white; + break; + } + addch((*(buffer + x)) | COLOR_PAIR(cp)); + } + } + else + printw("%s", plevel->title); + } + + display_moves(plevel, plevelreplay); + display_stars(plevel); + + refresh(); + curs_set(0); + redraw = 0; + } + + /* If there are movers, plot and then evolve them */ + if(plevel->mover_first != NULL && !(plevel->flags & LEVELFLAG_PAUSED)) + { + /* Plot movers in two passes - first spaces, then non-spaces. + This is counter-intuitive, but makes undoing the player work. */ + for(pass = 0; pass < 2; pass ++) + { + pmover = plevel->mover_first; + while(pmover != NULL) + { + if((pass == 0 && pmover->piece != PIECE_SPACE) || + (pass == 1 && pmover->piece == PIECE_SPACE)) + { + pmover = pmover->next; + continue; + } + x = pmover->x; + y = pmover->y;; + if(x >= display_start_x && x < display_end_x && y>= display_start_y && y < display_end_y) + { + move(display_offset_y - display_start_y + y, display_offset_x - display_start_x + x); + p = pmover->piece; + #ifdef XOR_COMPATIBILITY + if(plevel->switched && (p == PIECE_SPACE || p == PIECE_WALL)) + p = PIECE_DARKNESS; + #endif + if(p != PIECE_GONE) + display_piece(plevel, p); + } + pmover = pmover->next; + } + } + + /* Debug movers */ + if(options_debug & DEBUG_ORDER) + { + /* Display the movers */ + pmover = plevel->mover_first; + y = 0; + while(pmover != NULL && y < display_size_y - 1) + { + if(pmover->piece != PIECE_GONE) + { + move(y ++, 0); + display_piece(plevel, pmover->piece); + printw(" %2d,%2d ", pmover->x, pmover->y); + + } + pmover = pmover->next; + } + while(y < display_size_y - 1) + mvprintw(y++, 0, " "); + + /* Display the stack if our game engine uses it */ + if(0 + #ifdef XOR_COMPATIBILITY + || (plevel->mode == MODE_XOR && options_xor_mode) + #endif + #ifdef ENIGMA_COMPATIBILITY + || (plevel->mode == MODE_ENIGMA && options_enigma_mode) + #endif + ) + { + pmover = plevel->stack_first; + y = 0; + while(pmover != NULL && y < display_size_y - 1) + { + if(pmover->piece != PIECE_GONE) + { + move(y ++, display_size_x - 8); + display_piece(plevel, pmover->piece); + printw(" %2d,%2d ", pmover->x, pmover->y); + + } + pmover = pmover->next; + } + while(y < display_size_y - 1) + mvprintw(y++, display_size_x - 8, " "); + } + } + + refresh(); + + /* Evolve movers */ + if(!(plevel->flags & LEVELFLAG_UNDO)) + { + if(level_evolve(plevel)) + redraw += display_focus(plevel); + level_storemovers(plevel); + } + else + { + if(level_undo(plevel)) + plevel->flags |= LEVELFLAG_UNDO; + else + plevel->flags &= ~LEVELFLAG_UNDO; + } + } + + /* Determine which delay to use */ + delay = options_curses_delay; + if(plevelreplay != NULL) + { + if(plevel->mover_first == NULL && plevelreplay->move_current != NULL) + delay = options_curses_replay_delay; + + if(fast) + delay = 0; + + if(plevelreplay->flags & LEVELFLAG_UNDO) + { + if(plevel->move_current == NULL && plevel->mover_first == NULL) + { + if(options_curses_replay_delay != 0) + delay = options_curses_replay_delay; + else + delay = 1; + } + } + else + { + if(plevel->mover_first == NULL && plevelreplay->move_current == NULL) + delay = -1; + } + } + else + { + if(fast) + delay = 0; + + if(plevel->mover_first == NULL) + { + delay = -1; + fast = 0; + } + } + + if(delay > 0) + halfdelay(delay); + + if(delay != 0) + { + key = getch(); + if(key < 0 || key >= KEY_MAX) + key = 0; + if(key >= 'a' && key <='z') + key -= 32; + } + else + key = 0; + + if(delay > 0) + cbreak(); + + playermove = MOVE_NONE; + + switch(actions[key]) + { + case ACTION_REDRAW: + redraw = 1; + break; + + case ACTION_HIDE: + display_hide(); + redraw = 1; + break; + + case ACTION_QUIT: + quit = 1; + break; + + case ACTION_FAST: + fast = 1 - fast; + break; + + case ACTION_LEFT: + if(plevelreplay != NULL) + { + plevelreplay->flags |= LEVELFLAG_UNDO; + plevelreplay->flags &= ~LEVELFLAG_PAUSED; + } + else + playermove = MOVE_LEFT; + break; + + case ACTION_RIGHT: + if(plevelreplay != NULL) + { + plevelreplay->flags &= ~LEVELFLAG_UNDO; + plevelreplay->flags &= ~LEVELFLAG_PAUSED; + } + else + playermove = MOVE_RIGHT; + break; + + case ACTION_UP: + if(plevelreplay != NULL) + plevelreplay->flags |= LEVELFLAG_PAUSED; + else + playermove = MOVE_UP; + break; + + case ACTION_DOWN: + if(plevelreplay != NULL) + plevelreplay->flags |= LEVELFLAG_PAUSED; + else + playermove = MOVE_DOWN; + break; + + case ACTION_PAUSE: + if(plevelreplay != NULL) + { + if(plevelreplay->flags & LEVELFLAG_PAUSED) + plevelreplay->flags &= ~LEVELFLAG_PAUSED; + else + plevelreplay->flags |= LEVELFLAG_PAUSED; + } + else if(plevel->mover_first != NULL) + { + if(plevel->flags & LEVELFLAG_PAUSED) + plevel->flags &= ~LEVELFLAG_PAUSED; + else + plevel->flags |= LEVELFLAG_PAUSED; + plevel->flags |= LEVELFLAG_MOVES; + } + break; + + case ACTION_SWAP: + if(plevelreplay == NULL) + playermove = MOVE_SWAP; + break; + + case ACTION_UNDO: + if(plevelreplay == NULL) + { + if(plevel->mover_first == NULL && !(plevel->flags & LEVELFLAG_UNDO)) + { + if(level_undo(plevel)) + plevel->flags |= LEVELFLAG_UNDO; + else + plevel->flags &= ~LEVELFLAG_UNDO; + playermove = MOVE_NONE; + } + } + break; + + case ACTION_REDO: + playermove = MOVE_REDO; + break; + + default: + break; + } + + /* Are we replaying the level? */ + if(plevelreplay != NULL) + { + /* Is it time for another move? */ + if(plevel->mover_first == NULL && !(plevelreplay->flags & LEVELFLAG_PAUSED)) + { + /* Moving backwards through replay */ + if(plevelreplay->flags & LEVELFLAG_UNDO) + { + if(level_undo(plevel)) + { + plevel->flags |= LEVELFLAG_UNDO; + if(plevelreplay->move_current != NULL) + plevelreplay->move_current = plevelreplay->move_current->previous; + else + plevelreplay->move_current = plevelreplay->move_last; + } + else + plevel->flags &= ~LEVELFLAG_UNDO; + } + /* Moving forwards through replay */ + else + { + if(plevelreplay->move_current != NULL) + { + playermove = plevelreplay->move_current->direction; + plevelreplay->move_current = plevelreplay->move_current->next; + } + } + } + } + + /* Can't move if we've failed or solved the level */ + if(plevel->flags & (LEVELFLAG_FAILED | LEVELFLAG_SOLVED)) + playermove = MOVE_NONE; + + /* If we can move, make the move */ + if(playermove != MOVE_NONE && plevel->mover_first == NULL) + level_move(plevel, playermove); + + /* Display things changed by the move */ + if(plevel->flags & LEVELFLAG_MOVES) + { + display_moves(plevel, plevelreplay); + plevel->flags ^= LEVELFLAG_MOVES; + } + + if(plevel->flags & LEVELFLAG_STARS) + { + display_stars(plevel); + plevel->flags ^= LEVELFLAG_STARS; + } + + if(plevel->flags & LEVELFLAG_SWITCH) + { + redraw = 1; + plevel->flags ^= LEVELFLAG_SWITCH; + } + + #ifdef XOR_COMPATIBILITY + if(plevel->flags & LEVELFLAG_MAP) + { + /* No sensible way to handle this in curses */ + plevel->flags ^= LEVELFLAG_MAP; + } + #endif + + if(!(plevel->flags & LEVELFLAG_SOLVED) && plevel->flags & LEVELFLAG_EXIT) + { + plevel->flags |= LEVELFLAG_SOLVED; + display_stars(plevel); + } + + if(!(plevel->flags & LEVELFLAG_FAILED) && plevel->alive[0] == 0 && plevel->alive[1] ==0) + { + plevel->flags |= LEVELFLAG_FAILED; + display_moves(plevel, plevelreplay); + } + } +} + +void display_edit(struct level* plevel) +{ + int key; + int quit; + static int editor_piece = PIECE_SPACE; + int redraw, moved, pmoved; + int i; + int player; + int piece_count; + + redraw = 1; + moved = 1; + pmoved = 1; + + /* Store player */ + player = plevel->player; + plevel->player = 2; + + piece_count = 0; + while(editor_piece_maps[plevel->mode][piece_count] != PIECE_GONE) + piece_count ++; + + if(editor_piece > piece_count) + editor_piece = 0; + + quit = 0; + while(!quit) + { + redraw += display_focus(plevel); + + if(redraw) + { + redraw = 0; + + display_level(plevel); + + for(i = 0; i < piece_count; i ++) + { + move(display_size_y - 1, 1 + i * 2); + display_piece(plevel, editor_piece_maps[plevel->mode][i]); + } + + move(display_size_y - 1, display_size_x - 4); + printw("[ ]"); + + curs_set(1); + + pmoved = 1; + } + + if(pmoved) + { + pmoved = 0; + + move(display_size_y - 1, editor_piece * 2); + printw(">"); + move(display_size_y - 1, 2 + editor_piece * 2); + printw("<"); + move(display_size_y - 1, display_size_x - 3); + display_piece(plevel, editor_piece_maps[plevel->mode][editor_piece]); + moved = 1; + } + + if(moved) + { + moved = 0; + + move(display_offset_y - display_start_y + plevel->player_y[2], display_offset_x - display_start_x + plevel->player_x[2]); + refresh(); + } + + key = getch(); + if(key < 0 || key >= KEY_MAX) + key = 0; + if(key >= 'a' && key <='z') + key -= 32; + + switch(actions[key]) + { + case ACTION_REDRAW: + redraw = 1; + break; + + case ACTION_HIDE: + display_hide(); + redraw = 1; + break; + + case ACTION_QUIT: + quit = 1; + break; + + case ACTION_LEFT: + if(plevel->player_x[2] > 0) + { + plevel->player_x[2] --; moved = 1; + } + break; + + case ACTION_RIGHT: + if(plevel->player_x[2] < plevel->size_x - 1) + { + plevel->player_x[2] ++; moved = 1; + } + break; + + case ACTION_UP: + if(plevel->player_y[2] > 0) + { + plevel->player_y[2] --; moved = 1; + } + break; + + case ACTION_DOWN: + if(plevel->player_y[2] < plevel->size_y -1) + { + plevel->player_y[2] ++; moved = 1; + } + break; + + case ACTION_SWAP: + level_setpiece(plevel, plevel->player_x[2], plevel->player_y[2], editor_piece_maps[plevel->mode][editor_piece]); + display_piece(plevel, editor_piece_maps[plevel->mode][editor_piece]); + moved = 1; + break; + + case ACTION_PIECE_LEFT: + move(display_size_y - 1, editor_piece * 2); + printw(" "); + move(display_size_y - 1, 2 + editor_piece * 2); + printw(" "); + editor_piece --; + if(editor_piece < 0) + editor_piece = piece_count - 1; + pmoved = 1; + break; + + case ACTION_PIECE_RIGHT: + move(display_size_y - 1, editor_piece * 2); + printw(" "); + move(display_size_y - 1, 2 + editor_piece * 2); + printw(" "); + editor_piece ++; + if(editor_piece >= piece_count) + editor_piece = 0; + pmoved = 1; + break; + } + } + + /* Restore real player */ + plevel->player = player; +} + +int display_type() +{ + return DISPLAY_CURSES; +} + +void display_options() +{ + struct menu* pmenu; + struct menu* pcoloursmenu; + struct menuentry* pentrycolours; + struct menuentry* pentryspeed; + struct menuentry* pentryreplayspeed; + char buffer[256]; + int ok; + int result; + + pmenu = menu_new(gettext("Display Options")); + + menuentry_new(pmenu, gettext("Return to previous menu"), 'Q', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Save Options"), 'S', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + pentrycolours = menuentry_new(pmenu, gettext("Colour Scheme"), 'C', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + pentryspeed = menuentry_new(pmenu, gettext("Move Speed"), 'M', MENU_SCROLLABLE); + pentryreplayspeed = menuentry_new(pmenu, gettext("Replay Speed"), 'R', MENU_SCROLLABLE); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Change Keys"), 'K', 0); + + /* XOR and Enigma options are only visible once an appropriate level has + * been seen so as not to confuse those simply playing Chroma levels */ + if(0 +#ifdef XOR_COMPATIBILITY + || options_xor_options +#endif +#ifdef ENIGMA_COMPATIBILITY + || options_enigma_options +#endif + ) + { + menuentry_new(pmenu, "", 0, MENU_SPACE); + menuentry_new(pmenu, gettext("Other Games Options"), 'X', 0); + } + + if(options_debug & DEBUG_MENU) + { + menuentry_new(pmenu, "", 0, MENU_SPACE); + menuentry_new(pmenu, gettext("Debug Options"), 'D', 0); + } + + ok = 0; + while(!ok) + { + if(pdisplaycolours == NULL) + menuentry_extratext(pentrycolours, gettext("** NONE **"), NULL, NULL); + else if(pdisplaycolours->title == NULL) + menuentry_extratext(pentrycolours, gettext("[untitled colours]"), NULL, NULL); + else if(pdisplaycolours->flags & COLOURS_TRANSLATE) + menuentry_extratext(pentrycolours, gettext(pdisplaycolours->title), NULL, NULL); + else + menuentry_extratext(pentrycolours, pdisplaycolours->title, NULL, NULL); + + switch(options_curses_delay) + { + case -1: + sprintf(buffer, gettext("after a key is pressed")); + break; + case 0: + sprintf(buffer, gettext("instantaneous")); + break; + default: + sprintf(buffer, gettext("%d00 milliseconds"), options_curses_delay); + break; + } + menuentry_extratext(pentryspeed, buffer, NULL, NULL); + + switch(options_curses_replay_delay) + { + case -1: + sprintf(buffer, gettext("after a key is pressed")); + break; + case 0: + sprintf(buffer, gettext("instantaneous")); + break; + default: + sprintf(buffer, gettext("%d00 milliseconds"), options_curses_replay_delay); + break; + } + menuentry_extratext(pentryreplayspeed, buffer, NULL, NULL); + + result = menu_process(pmenu); + if(result == MENU_QUIT) + ok = 1; + + if(result == MENU_SELECT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'Q': + ok = 1; + break; + + case 'C': + pcoloursmenu = colours_menu(); + if(menu_process(pcoloursmenu) == MENU_SELECT) + { + if(pcoloursmenu->entry_selected != NULL && pcoloursmenu->entry_selected->value != NULL) + { + strcpy(options_colours, pcoloursmenu->entry_selected->value); + colours_init(); + display_initcolours(); + } + } + menu_delete(pcoloursmenu); + break; + + case 'S': + display_options_save(); + ok = 1; + break; + + case 'K': + display_keys(); + break; + + case 'X': + display_options_othergames(); + break; + + case 'D': + display_debug(); + break; + } + } + + if(result == MENU_SCROLLLEFT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'M': + options_curses_delay --; + if(options_curses_delay < -1) + options_curses_delay = 10; +#ifdef PDCURSES + if(options_curses_delay > 0) + options_curses_delay = 0; +#endif + break; + case 'R': + options_curses_replay_delay --; + if(options_curses_replay_delay < -1) + options_curses_replay_delay = 10; + +#ifdef PDCURSES + if(options_curses_replay_delay > 0) + options_curses_replay_delay = 0; +#endif + break; + } + } + + if(result == MENU_SCROLLRIGHT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'M': + options_curses_delay ++; + if(options_curses_delay > 10) + options_curses_delay = -1; +#ifdef PDCURSES + if(options_curses_delay > 0) + options_curses_delay = 0; +#endif + break; + case 'R': + options_curses_replay_delay ++; + if(options_curses_replay_delay > 10) + options_curses_replay_delay = -1; +#ifdef PDCURSES + if(options_curses_replay_delay > 0) + options_curses_replay_delay = 0; +#endif + break; + } + } + } + + menu_delete(pmenu); +} + +int display_keyfixed(int i) +{ + if(i == 0 || i == KEY_RESIZE || i == 27 || i == 'Q' || i == '\n' || i == '\r' || i == KEY_UP || i == KEY_DOWN || i == KEY_LEFT || i == KEY_RIGHT) + return 1; + + return 0; +} + +char *display_keyname(int i) +{ + static char buffer[4]; + + if(i == '\t') + return "TAB"; + if(i == '\n') + return "ENTER"; + if(i == 27) + return "ESCAPE"; + if(i == 32) + return "SPACE"; + if(i == KEY_DC) + return "DELETE"; + if(i == KEY_IC) + return "INSERT"; + + if(keyname(i) == NULL) + return "UNKNOWN"; + + if(strcmp(keyname(i), "NO KEY NAME") == 0) + { + if(i >= 0 && i < 32) + { + sprintf(buffer, "^%c", i + '@'); + return buffer; + } + if(i > 32 && i < 127) + { + sprintf(buffer, "%c", i); + return buffer; + } + + return "UNKNOWN"; + } + + if(strncmp(keyname(i), "KEY_", 4) == 0) + return (char *)(keyname(i) + 4); + + return (char *)keyname(i); +} + +void display_addkeytomenu(struct menu* pmenu, int action, char *text) +{ + struct menuentry *pentry; + char buffer[256]; + int i; + + sprintf(buffer, "%d", action); + pentry = menuentry_newwithvalue(pmenu, text, 0, MENU_DOUBLE, buffer); + + strcpy(buffer, ""); + for(i = 0; i < KEY_MAX; i ++) + { + if(actions[i] == action && i != KEY_RESIZE) + { + if(strlen(buffer) != 0) + strcat(buffer,", "); + strcat(buffer, "["); + strcat(buffer, display_keyname(i)); + strcat(buffer, "]"); + } + } + + if(strcmp(buffer, "") == 0) + strcpy(buffer, "(none)"); + + menuentry_extratext(pentry, NULL, NULL, buffer); + +} + +void display_keys() +{ + struct menu *pmenu; + struct menu *psubmenu; + struct menuentry *pentry; + int action; + int result; + int redraw; + int ok; + int subok; + char buffer[256]; + int i; + int key; + + ok = 0; + while(!ok) + { + pmenu = menu_new(gettext("Keys")); + + menuentry_new(pmenu, gettext("Quit and return to previous menu"), 'Q', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + display_addkeytomenu(pmenu, ACTION_LEFT, gettext(action_name[ACTION_LEFT])); + display_addkeytomenu(pmenu, ACTION_RIGHT, gettext(action_name[ACTION_RIGHT])); + display_addkeytomenu(pmenu, ACTION_UP, gettext(action_name[ACTION_UP])); + display_addkeytomenu(pmenu, ACTION_DOWN, gettext(action_name[ACTION_DOWN])); + display_addkeytomenu(pmenu, ACTION_SWAP, gettext(action_name[ACTION_SWAP])); + display_addkeytomenu(pmenu, ACTION_UNDO, gettext(action_name[ACTION_UNDO])); + display_addkeytomenu(pmenu, ACTION_REDO, gettext(action_name[ACTION_REDO])); + display_addkeytomenu(pmenu, ACTION_FAST, gettext(action_name[ACTION_FAST])); + display_addkeytomenu(pmenu, ACTION_PAUSE, gettext(action_name[ACTION_PAUSE])); + display_addkeytomenu(pmenu, ACTION_QUIT, gettext(action_name[ACTION_QUIT])); + display_addkeytomenu(pmenu, ACTION_REDRAW, gettext(action_name[ACTION_REDRAW])); + display_addkeytomenu(pmenu, ACTION_HIDE, gettext(action_name[ACTION_HIDE])); + display_addkeytomenu(pmenu, ACTION_PIECE_LEFT, gettext(action_name[ACTION_PIECE_LEFT])); + display_addkeytomenu(pmenu, ACTION_PIECE_RIGHT, gettext(action_name[ACTION_PIECE_RIGHT])); + + menu_assignletters(pmenu); + + result = menu_process(pmenu); + + if(result == MENU_QUIT) + ok = 1; + + if(result == MENU_SELECT) + { + if(pmenu->entry_selected->key == 'Q') + ok = 1; + else if(pmenu->entry_selected->value != NULL) + { + redraw = MENUREDRAW_ALL; + subok = 0; + while(!subok) + { + action = atoi(pmenu->entry_selected->value); + + sprintf(buffer, gettext("Set keys for '%s'"), gettext(action_name[action])); + psubmenu = menu_new(buffer); + + menuentry_new(psubmenu, gettext("Quit and return to previous menu"), 'Q', 0); + menuentry_new(psubmenu, "", 0, MENU_SPACE); + + for(i = 0; i < KEY_MAX; i ++) + { + if(actions[i] == action && i != KEY_RESIZE) + { + sprintf(buffer, "[%s]", display_keyname(i)); + pentry = menuentry_new(psubmenu, buffer, 0, MENU_GREY); + if(display_keyfixed(i)) + menuentry_extratext(pentry, gettext("(fixed)"), NULL, NULL); + } + } + menuentry_new(psubmenu, "", 0, MENU_SPACE); + + menuentry_new(psubmenu, gettext("Press a key to add or remove it from this list."), 0, MENU_NOTE | MENU_CENTRE); + + menu_display(psubmenu, redraw); + redraw = MENUREDRAW_ENTRIES; + menu_delete(psubmenu); + + key = getch(); + if(key == KEY_RESIZE) + { + getmaxyx(stdscr, display_size_y, display_size_x); + redraw = MENUREDRAW_ALL; + } + + if(key >= 'a' && key <='z') + key -=32; + + if(key == 27 || key == 'q' || key == 'Q' || key== '\n') + subok = 1; + else if(!display_keyfixed(key)) + { + if(actions[key] == action) + actions[key] = ACTION_NONE; + else + actions[key] = action; + } + } + } + } + + menu_delete(pmenu); + } +} + +void display_debug() +{ + struct menu* pmenu; + struct menuentry* pentrymovers; + struct menuentry* pentryhidden; + int ok; + int result; + + pmenu = menu_new(gettext("Debug Options")); + + menuentry_new(pmenu, gettext("Return to previous menu"), 'Q', 0); + + menuentry_new(pmenu, "", 0, MENU_SPACE); + + pentrymovers = menuentry_new(pmenu, gettext("Display order of movers"), 'O', MENU_SCROLLABLE); + pentryhidden = menuentry_new(pmenu, gettext("Show hidden items"), 'H', MENU_SCROLLABLE); + + ok = 0; + while(!ok) + { + menuentry_extratext(pentrymovers, options_debug & DEBUG_ORDER ? gettext("yes") : gettext("no"), NULL, NULL); + menuentry_extratext(pentryhidden, options_debug & DEBUG_HIDDEN ? gettext("yes") : gettext("no"), NULL, NULL); + + result = menu_process(pmenu); + if(result == MENU_QUIT) + ok = 1; + + if((result == MENU_SELECT || result == MENU_SCROLLLEFT || result == MENU_SCROLLRIGHT) && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'Q': + ok = 1; + break; + + case 'O': + options_debug ^= DEBUG_ORDER; + break; + + case 'H': + options_debug ^= DEBUG_HIDDEN; + break; + } + + pmenu->redraw = MENUREDRAW_CHANGED; + pmenu->entry_selected->redraw = 1; + } + + } + + menu_delete(pmenu); +} + +void display_options_othergames() +{ + struct menu* pmenu; +#ifdef XOR_COMPATIBILITY + struct menuentry* pentryxormode; + struct menuentry* pentryxordisplay; +#endif +#ifdef ENIGMA_COMPATIBILITY + struct menuentry* pentryenigmamode; +#endif + + int ok; + int result; + + pmenu = menu_new(gettext("Other Games Options")); + + menuentry_new(pmenu, gettext("Return to previous menu"), 'Q', 0); + + menuentry_new(pmenu, "", 0, MENU_SPACE); + +#ifdef XOR_COMPATIBILITY + pentryxormode = menuentry_new(pmenu, gettext("XOR Engine"), 'X', options_xor_options ? 0 : MENU_INVISIBLE | MENU_GREY); + pentryxordisplay = menuentry_new(pmenu, gettext("XOR Display"), 'D', options_xor_options ? 0 : MENU_INVISIBLE | MENU_GREY); + if(options_xor_options) + menuentry_new(pmenu, "", 0, MENU_SPACE); +#endif + +#ifdef ENIGMA_COMPATIBILITY + pentryenigmamode = menuentry_new(pmenu, gettext("Enigma Engine"), 'E', options_enigma_options ? 0 : MENU_INVISIBLE | MENU_GREY); +#endif + + ok = 0; + while(!ok) + { +#ifdef XOR_COMPATIBILITY + menuentry_extratext(pentryxormode, options_xor_mode ? gettext("exact") : gettext("approximate"), NULL, NULL); + menuentry_extratext(pentryxordisplay, options_xor_display ? gettext("partial") : gettext("full"), NULL, NULL); +#endif +#ifdef ENIGMA_COMPATIBILITY + menuentry_extratext(pentryenigmamode, options_enigma_mode ? gettext("exact") : gettext("approximate"), NULL, NULL); +#endif + + result = menu_process(pmenu); + if(result == MENU_QUIT) + ok = 1; + + if(result == MENU_SELECT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'Q': + ok = 1; + break; + +#ifdef XOR_COMPATIBILITY + case 'X': + options_xor_mode = 1 - options_xor_mode; + break; + + case 'D': + options_xor_display = 1 - options_xor_display; + break; +#endif + +#ifdef ENIGMA_COMPATIBILITY + case 'E': + options_enigma_mode = 1 - options_enigma_mode; + break; +#endif + } + + pmenu->redraw = MENUREDRAW_CHANGED; + pmenu->entry_selected->redraw = 1; + } + + } + + menu_delete(pmenu); +} + +void display_options_save() +{ + FILE *file; + char filename[FILENAME_MAX]; + int i; + + getfilename("curses.chroma", filename, 1, 0); + + file = fopen(filename, "w"); + if(file == NULL) + { + warning("Unable to save options"); + return; + } + + fprintf(file, "\n" + "\n" + "\n"); + + fprintf(file, " \n", options_colours); + + if(options_curses_delay == -1) + fprintf(file, " \n"); + else + fprintf(file, " \n", options_curses_delay * 100); + + if(options_curses_replay_delay == -1) + fprintf(file, " \n"); + else + fprintf(file, " \n", options_curses_replay_delay * 100); + +#ifdef XOR_COMPATIBILITY + if(options_xor_options) + fprintf(file, " \n", options_xor_mode ? "exact" : "approximate", options_xor_display ? "partial" : "full"); +#endif +#ifdef ENIGMA_COMPATIBILITY + if(options_enigma_options) + fprintf(file, " \n", options_enigma_mode ? "exact" : "approximate"); +#endif + + fprintf(file, " \n"); + fprintf(file, " \n"); + + fprintf(file, " \n"); + + for(i = 0; i < KEY_MAX; i ++) + { + if(actions[i] != ACTION_NONE && i != KEY_RESIZE) + fprintf(file, " \n", display_keyname(i), action_shortname[actions[i]]); + } + + fprintf(file, " \n"); + + fprintf(file, "\n"); + + fclose(file); +} + +void display_options_load() +{ + struct parser* pparser; + char filename[FILENAME_MAX]; + int state; + int i; + int key, action; + + /* Sensible defaults */ +#ifdef PDCURSES + /* halfdelay() is broken in PDCurses */ + options_curses_delay = 0; + options_curses_replay_delay = 0; +#else + options_curses_delay = 1; + options_curses_replay_delay = 1; +#endif +#ifdef XOR_COMPATIBILITY + options_xor_options = 0; + options_xor_mode = 1; + options_xor_display = 0; +#endif +#ifdef ENIGMA_COMPATIBILITY + options_enigma_options = 0; + options_enigma_mode = 1; +#endif + options_debug = 0; + + getfilename("colours", filename, 0, 1); + sprintf(options_colours, "%s/%s", filename, COLOURS_DEFAULT); + + getfilename("curses.chroma", filename, 0, 0); + + for(i = 0; i < KEY_MAX; i ++) + { + actions[i] = ACTION_NONE; + } + + /* Fixed keys */ + actions[KEY_RESIZE] = ACTION_REDRAW; + actions[KEY_UP] = ACTION_UP; + actions[KEY_DOWN] = ACTION_DOWN; + actions[KEY_LEFT] = ACTION_LEFT; + actions[KEY_RIGHT] = ACTION_RIGHT; + actions['\r'] = ACTION_SWAP; + actions['\n'] = ACTION_SWAP; + actions['Q'] = ACTION_QUIT; + actions[27] = ACTION_QUIT; + + /* Sensible default keys */ + if(!isfile(filename)) + { + actions[12] = ACTION_REDRAW; + actions[' '] = ACTION_SWAP; + actions['F'] = ACTION_FAST; + actions[KEY_BACKSPACE] = ACTION_UNDO; + actions[KEY_DC] = ACTION_UNDO; + actions['U'] = ACTION_UNDO; + actions[KEY_IC] = ACTION_REDO; + actions['Y'] = ACTION_REDO; + actions['Z'] = ACTION_PIECE_LEFT; + actions['X'] = ACTION_PIECE_RIGHT; + actions[KEY_PPAGE] = ACTION_PIECE_LEFT;; + actions[KEY_NPAGE] = ACTION_PIECE_RIGHT; + actions['P'] = ACTION_PAUSE; + return; + } + + /* Parse XML file */ + /* + + + + + + + + + + + */ + + pparser = parser_new(filename); + + enum { + OPTIONSPARSER_END, /* End of file */ + OPTIONSPARSER_OUTSIDE, /* Outside of */ + OPTIONSPARSER_CHROMA, /* Inside */ + OPTIONSPARSER_KEYS /* Inside */ + }; + + state = OPTIONSPARSER_OUTSIDE; + key = 0; + action = 0; + + while(state != OPTIONSPARSER_END) + { + switch(parser_parse(pparser)) + { + case PARSER_END: + state = OPTIONSPARSER_END; + break; + + case PARSER_ELEMENT_START: + switch(state) + { + case OPTIONSPARSER_CHROMA: + if(parser_match(pparser, 0, "keys")) + state = OPTIONSPARSER_KEYS; + break; + + case OPTIONSPARSER_KEYS: + if(parser_match(pparser, 0, "key")) + { + key = 0; + action = ACTION_NONE; + } + break; + + default: + break; + } + break; + + case PARSER_ELEMENT_END: + switch(state) + { + case OPTIONSPARSER_KEYS: + if(parser_match(pparser, 0, "keys")) + { + state = OPTIONSPARSER_CHROMA; + } + if(parser_match(pparser, 0, "key")) + { + if(key != 0 && !display_keyfixed(key)) + actions[key] = action; + } + break; + + default: + break; + } + break; + + case PARSER_CONTENT: + break; + + case PARSER_ATTRIBUTE: + switch(state) + { + case OPTIONSPARSER_OUTSIDE: + if(parser_match(pparser, 2, "chroma") && parser_match(pparser, 1, "type")) + { + if(parser_match(pparser, 0, "options")) + state = OPTIONSPARSER_CHROMA; + } + break; + + case OPTIONSPARSER_CHROMA: + if(parser_match(pparser, 2, "colour") && parser_match(pparser, 1, "scheme")) + { + strncpy(options_colours, parser_text(pparser, 0), FILENAME_MAX); + } + if(parser_match(pparser, 2, "move") && parser_match(pparser, 1, "speed")) + { + if(parser_match(pparser, 0, "key")) + options_curses_delay = -1; + else + options_curses_delay = atoi(parser_text(pparser, 0)) / 100; +#ifdef PDCURSES + if(options_curses_delay > 0) + options_curses_delay = 0; +#endif + } + if(parser_match(pparser, 2, "replay") && parser_match(pparser, 1, "speed")) + { + if(parser_match(pparser, 0, "key")) + options_curses_replay_delay = -1; + else + options_curses_replay_delay = atoi(parser_text(pparser, 0)) / 100; +#ifdef PDCURSES + if(options_curses_replay_delay > 0) + options_curses_replay_delay = 0; +#endif + } +#ifdef XOR_COMPATIBILITY + if(parser_match(pparser, 2, "xor") && parser_match(pparser, 1, "mode")) + { + options_xor_options = 1; + + if(parser_match(pparser, 0, "approximate")) + options_xor_mode = 0; + if(parser_match(pparser, 0, "exact")) + options_xor_mode = 1; + } + if(parser_match(pparser, 2, "xor") && parser_match(pparser, 1, "display")) + { + options_xor_options = 1; + + if(parser_match(pparser, 0, "full")) + options_xor_display = 0; + if(parser_match(pparser, 0, "partial")) + options_xor_display = 1; + } +#endif +#ifdef ENIGMA_COMPATIBILITY + if(parser_match(pparser, 2, "enigma") && parser_match(pparser, 1, "mode")) + { + options_enigma_options = 1; + + if(parser_match(pparser, 0, "approximate")) + options_enigma_mode = 0; + if(parser_match(pparser, 0, "exact")) + options_enigma_mode = 1; + } +#endif + if(parser_match(pparser, 2, "debug") && parser_match(pparser, 1, "menu")) + { + if(parser_match(pparser, 0, "yes")) + options_debug |= DEBUG_MENU; + } + if(parser_match(pparser, 2, "debug") && parser_match(pparser, 1, "order")) + { + if(parser_match(pparser, 0, "yes")) + options_debug |= DEBUG_ORDER; + } + if(parser_match(pparser, 2, "debug") && parser_match(pparser, 1, "hidden")) + { + if(parser_match(pparser, 0, "yes")) + options_debug |= DEBUG_HIDDEN; + } + break; + + case OPTIONSPARSER_KEYS: + if(parser_match(pparser, 2, "key") && parser_match(pparser, 1, "name")) + { + for(i = 0; i < KEY_MAX; i ++) + { + if(parser_match(pparser, 0, display_keyname(i))) + { + key = i; + i = KEY_MAX; + } + } + } + if(parser_match(pparser, 2, "key") && parser_match(pparser, 1, "action")) + { + for(i = ACTION_KEY_MIN; i < ACTION_KEY_MAX; i ++) + { + if(parser_match(pparser, 0, action_shortname[i])) + { + action = i; + i = ACTION_KEY_MAX; + } + } + } + break; + } + break; + + case PARSER_ERROR: + state = OPTIONSPARSER_END; + break; + } + } + + parser_delete(pparser); +} diff --git a/cursesmenudisplay.c b/cursesmenudisplay.c new file mode 100644 index 0000000..fdb36eb --- /dev/null +++ b/cursesmenudisplay.c @@ -0,0 +1,887 @@ +/* + cursesmenudisplay.c + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include + +#ifdef CHROMA_CURSES_HEADER +#include CHROMA_CURSES_HEADER +#else +#ifdef __WIN32__ +#include +#else +#include +#endif +#endif + +#include "chroma.h" +#include "menu.h" +#include "actions.h" +#include "level.h" +#include "display.h" +#include "util.h" + +#define MAX_WIDTH 65 + +extern int display_size_x, display_size_y; +extern int actions[KEY_MAX]; + +extern short colourpair_menu; +extern short colourpair_menugrey; +extern short colourpair_red; +extern short colourpair_green; +extern short colourpair_yellow; +extern short colourpair_blue; +extern short colourpair_cyan; +extern short colourpair_magenta; +extern short colourpair_cyan; +extern short colourpair_white; + +int menu_offset; +int menu_width; +int menu_height_notes; +int menu_height_entries; +int menu_y_min; +int menu_y_max; +int menu_y_logo_top; +int menu_y_logo_bottom; +int menu_scroll_y_min; +int menu_scroll_y_max; +int menu_scroll_top; +int menu_scroll_bottom; + +int menu_entryheight(struct menuentry *pentry) +{ + if(pentry->flags & MENU_INVISIBLE) + return 0; + if(pentry->flags & MENU_DOUBLE) + return 2; + return 1; +} + +void menu_displayentry(struct menu *pmenu, struct menuentry *pentry, int y, int selected) +{ + char buffer[MAX_WIDTH + 1]; + int x, i; + + if(menu_width < 1) + return; + + if(pentry->flags & MENU_INVISIBLE) + return; + + if(pentry->flags & (MENU_GREY | MENU_NOTE | MENU_TEXT)) + selected = 0; + + /* Plot first line, if visible */ + if((y >= menu_y_min && y < menu_y_max) || (pentry->flags & MENU_NOTE)) + { + /* Plot key press */ + attron(COLOR_PAIR(colourpair_white)); + if(pentry->key != 0 && pentry->key != MENU_KEY_ANY) + { + mvprintw(y, menu_offset - 4, "[ ] "); + attron(A_BOLD); + mvprintw(y, menu_offset - 3, "%c", pentry->key); + attroff(A_BOLD); + } + else + mvprintw(y, menu_offset - 4, " "); + attroff(COLOR_PAIR(colourpair_white)); + + /* Determine colour */ + if(pentry->flags & (MENU_GREY | MENU_SPACE)) + attron(COLOR_PAIR(colourpair_menugrey)); + else if(pentry->flags & MENU_NOTE) + { + if(pmenu->logo == 0) + attron(COLOR_PAIR(colourpair_menugrey)); + } + else if(pentry->flags & MENU_TEXT) + attron(COLOR_PAIR(colourpair_white)); + else + attron(COLOR_PAIR(colourpair_menu)); + if(selected) + attron(A_REVERSE); + + /* Blank line */ + move(y, menu_offset); + for(i = 0; i < menu_width; i ++) + addch(' '); + + /* Plot right hand side text */ + if(pentry->text2 != NULL) + { + utf8strncpy(buffer, pentry->text2, menu_width - 2); + x = menu_offset + menu_width - 1 - utf8strlen(buffer); + mvprintw(y, x, buffer); + } + + /* Plot main text */ + if(pentry->text != NULL) + { + utf8strncpy(buffer, pentry->text, menu_width - 2); + + x = menu_offset + 1; + if(pentry->flags & MENU_RIGHT) + x = menu_offset + menu_width - utf8strlen(buffer); + if(pentry->flags & MENU_CENTRE) + x = menu_offset + ((menu_width - utf8strlen(buffer))/2); + + if(pentry->flags & MENU_BOLD) + attron(A_BOLD); + mvprintw(y, x, buffer); + if(pentry->flags & MENU_BOLD) + attroff(A_BOLD); + } + + if(selected) + attroff(A_REVERSE); + if(pentry->flags & (MENU_GREY | MENU_NOTE | MENU_SPACE)) + attroff(COLOR_PAIR(colourpair_menugrey)); + else if(pentry->flags & MENU_TEXT) + attroff(COLOR_PAIR(colourpair_white)); + else + attroff(COLOR_PAIR(colourpair_menu)); + } + + if(!(pentry->flags & MENU_DOUBLE)) + return; + + y ++; + + /* Plot second line, if visible */ + if((y >= menu_y_min && y < menu_y_max) || (pentry->flags & MENU_NOTE)) + { + /* Blank key press area */ + attron(COLOR_PAIR(colourpair_white)); + mvprintw(y, menu_offset - 4, " "); + attroff(COLOR_PAIR(colourpair_white)); + + /* Determine colour */ + if(pentry->flags & (MENU_GREY | MENU_NOTE | MENU_SPACE)) + attron(COLOR_PAIR(colourpair_menugrey)); + else + attron(COLOR_PAIR(colourpair_menu)); + if(selected) + attron(A_REVERSE); + + /* Blank line */ + move(y, menu_offset); + for(i = 0; i < menu_width; i ++) + addch(' '); + + /* Plot right hand side text */ + if(pentry->text4 != NULL) + { + utf8strncpy(buffer, pentry->text4, menu_width - 2); + + x = menu_offset + menu_width - 1 - utf8strlen(buffer); + if(pentry->flags & MENU_EDITING) + attron(COLOR_PAIR(colourpair_white)); + mvprintw(y, x, buffer); + if(pentry->flags & MENU_EDITING) + attroff(COLOR_PAIR(colourpair_white)); + } + + /* Plot left hand side text */ + if(pentry->text3 != NULL) + { + utf8strncpy(buffer, pentry->text3, menu_width - 2); + + x = menu_offset + 1; + mvprintw(y, x, buffer); + } + + if(selected) + attroff(A_REVERSE); + if(pentry->flags & (MENU_GREY | MENU_SPACE)) + attroff(COLOR_PAIR(colourpair_menugrey)); + else if(pentry->flags & MENU_NOTE) + { + if(pmenu->logo == 0) + attroff(COLOR_PAIR(colourpair_menugrey)); + } + else + attroff(COLOR_PAIR(colourpair_menu)); + } +} + +void menu_display(struct menu *pmenu, int redraw) +{ + struct menuentry *pentry; + int x, y, selected; + char title[] = "chroma"; + char buffer[256]; + int i; + int state; + int y_editing; + short cp; + int j; + + /* 012345678901234567890123456789012345678901 */ + char logo[] = " 8 " + " 8 " + ".oPYo. 8oPYo. oPYo. .oPYo. ooYoYo. .oPYo. " + "8 ' 8 8 8 `' 8 8 8' 8 8 .oooo8 " + "8 . 8 8 8 8 8 8 8 8 8 8 " + "`YooP' 8 8 8 `YooP' 8 8 8 `YooP8 "; + +#define LOGO_HEIGHT 7 + + /* Calculate various widths */ + menu_width = display_size_x - 2; + if(menu_width > MAX_WIDTH) + menu_width = MAX_WIDTH; + + menu_offset = (display_size_x - menu_width) / 2; + if(menu_offset < 0) + menu_offset = 0; + + menu_width -= 5; + menu_offset += 4; + + /* Calculate various heights */ + menu_height_notes = 0; + menu_height_entries = 0; + + pentry = pmenu->entry_first; + while(pentry != NULL) + { + if(pentry->flags & MENU_NOTE) + menu_height_notes += menu_entryheight(pentry); + else + menu_height_entries += menu_entryheight(pentry); + pentry = pentry->next; + } + + /* Add an extra line to pad the notes out, if there are any */ + if(menu_height_notes != 0) + menu_height_notes += 1; + + if(pmenu->logo) + { + menu_y_logo_top = (display_size_y - menu_height_entries - LOGO_HEIGHT) / 2; + if(menu_y_logo_top < 0) + menu_y_logo_top = 0; + menu_y_logo_bottom = menu_y_logo_top + LOGO_HEIGHT; + menu_y_min = display_size_y - menu_height_entries - 1; + if(menu_y_min < menu_y_logo_bottom) + menu_y_min = menu_y_logo_bottom; + menu_y_max = display_size_y - 1; + } + else + { + menu_y_min = 4; + menu_y_max = display_size_y - menu_height_notes - 1; + if(pmenu->title != NULL) + menu_y_min += 2; + } + + /* If a full redraw, clear the screen and plot the title */ + if(redraw == MENUREDRAW_ALL) + { + clear(); + curs_set(0); + + if(pmenu->logo) + { + x = (display_size_x - 42) / 2; + y = menu_y_logo_top; + cp = colourpair_red; + + move(y, x); + + for(i = 0; i < strlen(logo); i ++) + { + addch(logo[i] | A_BOLD | COLOR_PAIR(cp)); + switch(i % 42) + { + case 6: + cp = colourpair_yellow; + break; + case 13: + cp = colourpair_green; + break; + case 18: + cp = colourpair_cyan; + break; + case 25: + cp = colourpair_blue; + break; + case 33: + cp = colourpair_magenta; + break; + case 41: + y ++; + move(y, x); + cp = colourpair_red; + break; + } + } + + y ++; + + } + else + { + /* Display game title */ + x = (display_size_x / 2) - strlen(title); + + attron(A_BOLD); + for(i = 0; i < strlen(title); i ++) + { + if(i == 0) attron(COLOR_PAIR(colourpair_red)); + if(i == 1) attron(COLOR_PAIR(colourpair_yellow)); + if(i == 2) attron(COLOR_PAIR(colourpair_green)); + if(i == 3) attron(COLOR_PAIR(colourpair_cyan)); + if(i == 4) attron(COLOR_PAIR(colourpair_blue)); + if(i == 5) attron(COLOR_PAIR(colourpair_magenta)); + + sprintf(buffer, "%c", title[i]); + mvprintw(2, x, buffer); + x +=2; + } + attroff(COLOR_PAIR(colourpair_red)); + attroff(A_BOLD); + + /* Display menu title */ + y = 4; + x = (display_size_x / 2) - utf8strlen(pmenu->title); + + attron(A_BOLD); + attroff(COLOR_PAIR(colourpair_white)); + /* If the title is too long, plot normally */ + if(x < 0) + { + x = (display_size_x - utf8strlen(pmenu->title)) / 2; + mvprintw(y, x, pmenu->title); + } + else + { + /* Otherwise, spread it out */ + for(i = 0; i < strlen(pmenu->title); i ++) + { + j = 0; + buffer[j] = pmenu->title[i]; j ++; + while((pmenu->title[i + j] & 0xc0) == 0x80) + { + buffer[j] = pmenu->title[i + j]; j ++; + } + buffer[j] = 0; + mvprintw(y, x, buffer); + x += 2; i += j - 1; + } + } + attroff(A_BOLD); + } + } + + /* Keep scroll bar within reasonable limits */ + if(pmenu->offset > (menu_height_entries - (menu_y_max - menu_y_min))) + pmenu->offset = menu_height_entries - (menu_y_max - menu_y_min); + if(pmenu->offset < 0) + pmenu->offset = 0; + + /* Display scrollbar, if needed */ + if(menu_height_entries > (menu_y_max - menu_y_min) || pmenu->offset != 0) + { + if(redraw >= MENUREDRAW_ENTRIES) + { + menu_scroll_y_min = menu_y_min + 1; + menu_scroll_y_max = menu_y_max - 1; + menu_scroll_top = menu_scroll_y_min + ((menu_scroll_y_max - menu_scroll_y_min) * pmenu->offset / menu_height_entries); + menu_scroll_bottom = menu_scroll_top + ((menu_scroll_y_max - menu_scroll_y_min) * (1 + menu_y_max - menu_y_min) / menu_height_entries); + + attron(COLOR_PAIR(colourpair_menugrey)); + x = menu_offset + menu_width + 1; + mvaddch(menu_y_min, x, '^'); + mvaddch(menu_y_max - 1, x, 'v'); + + attron(COLOR_PAIR(colourpair_white)); + for(y = menu_y_min + 1; y < menu_y_max - 1; y ++) + { + /* >= and <= to guarantee at least one character scrollbar */ + if(y >= menu_scroll_top && y <= menu_scroll_bottom) + { + attron(A_REVERSE); + mvaddch(y, x, '|'); + attroff(A_REVERSE); + } + else + mvaddch(y, x, '.'); + } + } + } + + /* Display notes */ + if((menu_height_notes != 0) && redraw >= MENUREDRAW_ENTRIES) + { + if(pmenu->logo) + y = menu_y_logo_bottom; + else + y = menu_y_max + 1; + + pentry = pmenu->entry_first; + while(pentry != NULL) + { + if(pentry->flags & MENU_NOTE) + { + menu_displayentry(pmenu, pentry, y, 0); + y += menu_entryheight(pentry); + } + pentry = pentry->next; + } + } + + /* Select an entry if the selected one is not on screen */ + if(pmenu->entry_selected == NULL) + pmenu->entry_selected = pmenu->entry_first; + y = menu_y_min - pmenu->offset; + pentry = pmenu->entry_first; + pmenu->display_first = NULL; + pmenu->display_last = NULL; + state = 1; + while(pentry != NULL) + { + /* Don't count notes */ + if(pentry->flags & MENU_NOTE) + { + pentry = pentry->next; + continue; + } + /* Is the entry off the top of the screen? */ + if(y < (menu_y_min - menu_entryheight(pentry))) + { + if(pentry == pmenu->entry_selected) + state = -1; + y += menu_entryheight(pentry); + pentry = pentry->next; + continue; + } + /* Stop processing once we hit the bottom of the screen */ + if(y > menu_y_max) + { + pentry = NULL; + continue; + } + if(pentry == pmenu->entry_selected) + state = 0; + + if(pmenu->display_first == NULL) + pmenu->display_first = pentry->next; + pmenu->display_last = pentry->previous; + + y += menu_entryheight(pentry); + pentry = pentry->next; + } + if(state == -1) + pmenu->entry_selected = pmenu->display_first; + if(state == 1) + pmenu->entry_selected = pmenu->display_last; + if(state != 0 && redraw < MENUREDRAW_ENTRIES) + redraw = MENUREDRAW_ENTRIES; + + /* Display entries */ + pentry = pmenu->entry_first; + y = menu_y_min - pmenu->offset; + y_editing = 0; + while(pentry != NULL) + { + /* Don't display notes */ + if(pentry->flags & MENU_NOTE) + { + pentry = pentry->next; + continue; + } + /* Don't display entries off the top of the screen */ + if(y < (menu_y_min - menu_entryheight(pentry))) + { + y += menu_entryheight(pentry); + pentry = pentry->next; + continue; + } + /* Stop processing once we hit the bottom of the screen */ + if(y > menu_y_max) + { + pentry = NULL; + continue; + } + selected = (pmenu->entry_selected == pentry) ? 1 : 0; + + if(redraw >= MENUREDRAW_ENTRIES || + (redraw >= MENUREDRAW_CHANGED && pentry->redraw)) + menu_displayentry(pmenu, pentry, y, selected); + if(pentry->flags & MENU_EDITING) + y_editing = y + 1; + + + pentry->redraw = 0; + y += menu_entryheight(pentry); + pentry = pentry->next; + } + + /* Display cursor if we're editing a text field */ + if(y_editing) + { + curs_set(1); + move(y_editing, menu_offset + menu_width - 2); + } + else + curs_set(0); + + /* Redraw the screen */ + refresh(); +} + +int menu_process(struct menu* pmenu) +{ + int ok; + int redraw; + int c; + struct menuentry* pentry; + char *buffer; + + redraw = pmenu->redraw; + + ok = 0; + while(!ok) + { + if(redraw != MENUREDRAW_NONE) + { + menu_display(pmenu, redraw); + redraw = MENUREDRAW_NONE; + } + + c = getch(); + + /* Are we editing a text field? */ + if(pmenu->entry_selected != NULL && pmenu->entry_selected->flags & MENU_EDITING) + { + switch(c) + { + case KEY_RESIZE: + getmaxyx(stdscr, display_size_y, display_size_x); + redraw = MENUREDRAW_ALL; + break; + + case '\n': + case '\r': + case 27: + case KEY_UP: + case KEY_DOWN: + case KEY_PPAGE: + case KEY_NPAGE: + pmenu->entry_selected->flags -= MENU_EDITING; + pmenu->entry_selected->redraw = 1; + redraw = MENUREDRAW_CHANGED; + break; + + case KEY_BACKSPACE: + case KEY_DC: + case 8: + if(strlen(pmenu->entry_selected->text4) == 0) + break; + + buffer = malloc(strlen(pmenu->entry_selected->text4) + 1); + if(buffer != NULL) + { + strcpy(buffer, pmenu->entry_selected->text4); + + /* not particularly efficient, but does the job of deleting one UTF8 character */ + while(strlen(buffer) > 0 && ((buffer[strlen(buffer) - 1] & 0xc0) == 0x80)) + buffer[strlen(buffer) - 1] = 0; + buffer[strlen(buffer) - 1] = 0; + } + menuentry_extratext(pmenu->entry_selected, NULL, NULL, buffer); + free(buffer); + + pmenu->entry_selected->redraw = 1; + redraw = MENUREDRAW_CHANGED; + break; + + default: + if(c > 31 && c != 127) + { + buffer = malloc(strlen(pmenu->entry_selected->text4) + 2); + if(buffer != NULL) + { + strcpy(buffer, pmenu->entry_selected->text4); + buffer[strlen(buffer) + 1] = 0; + buffer[strlen(buffer)] = c; + } + menuentry_extratext(pmenu->entry_selected, NULL, NULL, buffer); + free(buffer); + + pmenu->entry_selected->redraw = 1; + redraw = MENUREDRAW_CHANGED; + break; + } + break; + } + continue; + } + + /* Not a text field, but a regular entry */ + /* First, check if the key corresponds to an entry */ + if(c >= 0 && c < 127) + c = toupper(c); + pentry = pmenu->entry_first; + while(pentry != NULL) + { + if(pentry->key == c) + { + if(!(pentry->flags & (MENU_GREY | MENU_INVISIBLE | MENU_SPACE))) + { + if(pmenu->entry_selected != NULL) + pmenu->entry_selected->redraw = 1; + pmenu->entry_selected = pentry; + pentry->redraw = 1; + + if(pmenu->entry_selected->flags & MENU_EDITABLE) + { + pmenu->entry_selected->flags |= MENU_EDITING; + pmenu->entry_selected->redraw = 1; + redraw = MENUREDRAW_CHANGED; + } + else + ok = MENU_SELECT; + break; + } + } + pentry = pentry->next; + } + + if(ok == MENU_SELECT) + continue; + + if(c < 0) + continue; + + /* Otherwise, see if it corresponds to an action */ + switch(actions[c]) + { + case ACTION_UP: + pentry = pmenu->entry_selected; + while(pentry != NULL) + { + if(pentry == pmenu->display_first || pentry->flags & MENU_TEXT) + redraw = MENUREDRAW_ENTRIES; + + pentry = pentry->previous; + + if(pentry == NULL) + break; + if(redraw != MENUREDRAW_NONE) + pmenu->offset -= menu_entryheight(pentry); + if(!(pentry->flags & (MENU_GREY | MENU_NOTE | MENU_SPACE))) + break; + } + if(pentry != NULL) + { + pentry->redraw = 1; + pmenu->entry_selected->redraw = 1; + pmenu->entry_selected = pentry; + if(redraw == MENUREDRAW_NONE) + redraw = MENUREDRAW_CHANGED; + } + break; + + case ACTION_DOWN: + pentry = pmenu->entry_selected; + while(pentry != NULL) + { + if(pentry == pmenu->display_last || pentry->flags & MENU_TEXT) + redraw = MENUREDRAW_ENTRIES; + + pentry = pentry->next; + + if(pentry == NULL) + break; + if(redraw != MENUREDRAW_NONE) + pmenu->offset += menu_entryheight(pentry); + if(!(pentry->flags & (MENU_GREY | MENU_NOTE | MENU_SPACE))) + break; + } + if(pentry != NULL) + { + pentry->redraw = 1; + pmenu->entry_selected->redraw = 1; + pmenu->entry_selected = pentry; + if(redraw == MENUREDRAW_NONE) + redraw = MENUREDRAW_CHANGED; + } + break; + + case ACTION_LEFT: + if(pmenu->entry_selected != NULL && pmenu->entry_selected->flags & MENU_SCROLLABLE) + ok = MENU_SCROLLLEFT; + break; + + case ACTION_RIGHT: + if(pmenu->entry_selected != NULL && pmenu->entry_selected->flags & MENU_SCROLLABLE) + ok = MENU_SCROLLRIGHT; + break; + + case ACTION_PAGE_UP: + pmenu->offset -= (menu_y_max - menu_y_min); + redraw = MENUREDRAW_ENTRIES; + break; + + case ACTION_PAGE_DOWN: + pmenu->offset += (menu_y_max - menu_y_min); + redraw = MENUREDRAW_ENTRIES; + break; + + case ACTION_ENTER: + if(pmenu->entry_selected != NULL) + { + if(pmenu->entry_selected->flags & MENU_EDITABLE) + { + pmenu->entry_selected->flags |= MENU_EDITING; + pmenu->entry_selected->redraw = 1; + redraw = MENUREDRAW_CHANGED; + } + else + ok = MENU_SELECT; + } + break; + + case ACTION_DELETE: + if(pmenu->entry_selected != NULL && pmenu->entry_selected->flags & MENU_DELETABLE) + ok = MENU_DELETE; + break; + + case ACTION_QUIT: + ok = MENU_QUIT; + break; + + case ACTION_REDRAW: + getmaxyx(stdscr, display_size_y, display_size_x); + redraw = MENUREDRAW_ALL; + break; + + case ACTION_HIDE: + display_hide(); + redraw = MENUREDRAW_ALL; + break; + + default: + /* See if there is an "any key" entry */ + pentry = pmenu->entry_first; + while(pentry != NULL) + { + if(pentry->key == MENU_KEY_ANY) + { + if(!(pentry->flags & (MENU_GREY | MENU_INVISIBLE | MENU_SPACE))) + { + if(pmenu->entry_selected != NULL) + pmenu->entry_selected->redraw = 1; + pmenu->entry_selected = pentry; + pentry->redraw = 1; + + ok = MENU_SELECT; + break; + } + } + pentry = pentry->next; + } + break; + } + } + + /* Redraw the whole menu when we next process it */ + pmenu->redraw = MENUREDRAW_ALL; + + if(ok == MENU_SELECT) + { + if(pmenu->entry_selected->flags & MENU_SCROLLABLE) + ok = MENU_SCROLLRIGHT; + } + /* unless this is a scrollable entry */ + if(ok == MENU_SCROLLLEFT || ok == MENU_SCROLLRIGHT) + { + pmenu->redraw = MENUREDRAW_CHANGED; + pmenu->entry_selected->redraw = 1; + } + + return ok; +} + +int menu_addfile(struct menu *pmenu, char *filename) +{ + FILE *file; + char word[256], buffer[4096]; + char c; + int i; + int ok, wok; + + file = fopen(filename, "r"); + if(file == NULL) + return 0; + + ok = 0; + strcpy(buffer, ""); + while(!ok) + { + wok = 0; i = 0; + while(!wok) + { + c = fgetc(file); + if(c == 0 || c == 13 || c == 10 || c == 32 || c == 9 || feof(file) || i == 254) + wok = 1; + else + word[i++] = c; + } + word[i] = 0; + + /* We assume menu_width is defined by the time we get here - a safe + assumption provided this isn't the first menu we see. */ + if(utf8strlen(buffer) + utf8strlen(word) < menu_width - 2 && !(strcmp(word, "") == 0 && (c == 10 || c == 13)) && !(strncmp(word, "===", 3) == 0)) + { + if(buffer[0] != 0 && word[0] != 0) + strcat(buffer, " "); + strcat(buffer, word); + } + else + { + menuentry_new(pmenu, buffer, 0, MENU_TEXT); + if(strcmp(word, "") == 0 && (c == 10 || c ==13)) + menuentry_new(pmenu, "", 0, MENU_TEXT); + if(strncmp(word, "===", 3) == 0) + { + strcpy(buffer, ""); + pmenu->entry_last->flags |= MENU_GREY; + } + else + strcpy(buffer, word); + } + + if(feof(file)) + ok = 1; + } + + menuentry_new(pmenu, buffer, 0, MENU_TEXT); + + fclose(file); + + return 1; +} diff --git a/display.h b/display.h new file mode 100644 index 0000000..a7362d2 --- /dev/null +++ b/display.h @@ -0,0 +1,34 @@ +/* + display.h + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +enum { DISPLAY_NONE, DISPLAY_CURSES, DISPLAY_SDL }; + +void display_init(); +void display_quit(); +void display_play(struct level*, struct level*); +void display_edit(struct level*); +int display_type(); +void display_options(); + +void display_menuentry(struct menuentry *pentry, int y, int selected); +void display_menu(struct menu *pmenu, int all); +void display_options_save(); +void display_options_load(); +void display_hide(); diff --git a/editor.c b/editor.c new file mode 100644 index 0000000..0aa8107 --- /dev/null +++ b/editor.c @@ -0,0 +1,1118 @@ +/* + editor.c + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include +#include + +#include "chroma.h" +#include "level.h" +#include "menu.h" +#include "display.h" +#include "util.h" + +void export(struct level*, int); + +int editor_verify(struct level*); +struct level* editor_options(struct level* plevel); + +extern int move_x[]; +extern int move_y[]; +extern char* piece_name[]; +extern struct level* plevelcurrent; +extern int options_debug; + +#ifdef XOR_COMPATIBILITY +extern int options_xor_options; +#endif +#ifdef ENIGMA_COMPATIBILITY +extern int options_enigma_options; +#endif + +int editor_pieces_chroma[] = { + PIECE_SPACE, + PIECE_WALL, + PIECE_PLAYER_ONE, + PIECE_PLAYER_TWO, + PIECE_DOTS, + PIECE_ARROW_RED_LEFT, + PIECE_ARROW_RED_UP, + PIECE_ARROW_RED_RIGHT, + PIECE_ARROW_RED_DOWN, + PIECE_BOMB_RED_LEFT, + PIECE_BOMB_RED_UP, + PIECE_BOMB_RED_RIGHT, + PIECE_BOMB_RED_DOWN, + PIECE_ARROW_GREEN_LEFT, + PIECE_ARROW_GREEN_UP, + PIECE_ARROW_GREEN_RIGHT, + PIECE_ARROW_GREEN_DOWN, + PIECE_BOMB_GREEN_LEFT, + PIECE_BOMB_GREEN_UP, + PIECE_BOMB_GREEN_RIGHT, + PIECE_BOMB_GREEN_DOWN, + PIECE_ARROW_BLUE_LEFT, + PIECE_ARROW_BLUE_UP, + PIECE_ARROW_BLUE_RIGHT, + PIECE_ARROW_BLUE_DOWN, + PIECE_BOMB_BLUE_LEFT, + PIECE_BOMB_BLUE_UP, + PIECE_BOMB_BLUE_RIGHT, + PIECE_BOMB_BLUE_DOWN, + PIECE_CIRCLE, + PIECE_STAR, + PIECE_DOOR, + PIECE_GONE +}; + +#ifdef XOR_COMPATIBILITY +int editor_pieces_xor[] = { + PIECE_SPACE, + PIECE_WALL, + PIECE_PLAYER_ONE, + PIECE_PLAYER_TWO, + PIECE_DOTS_X, + PIECE_DOTS_Y, + PIECE_ARROW_RED_DOWN, + PIECE_ARROW_RED_LEFT, + PIECE_BOMB_RED_DOWN, + PIECE_BOMB_RED_LEFT, + PIECE_STAR, + PIECE_DOOR, + PIECE_CIRCLE, + PIECE_TELEPORT, + PIECE_SWITCH, + PIECE_MAP_TOP_LEFT, + PIECE_MAP_TOP_RIGHT, + PIECE_MAP_BOTTOM_LEFT, + PIECE_MAP_BOTTOM_RIGHT, + PIECE_GONE +}; +#endif + +#ifdef ENIGMA_COMPATIBILITY +int editor_pieces_enigma[] = { + PIECE_SPACE, + PIECE_WALL, + PIECE_PLAYER_ONE, + PIECE_DOTS, + PIECE_DOTS_DOUBLE, + PIECE_ARROW_RED_LEFT, + PIECE_ARROW_RED_UP, + PIECE_ARROW_RED_RIGHT, + PIECE_ARROW_RED_DOWN, + PIECE_BOMB_RED_LEFT, + PIECE_BOMB_RED_UP, + PIECE_BOMB_RED_RIGHT, + PIECE_BOMB_RED_DOWN, + PIECE_STAR, + PIECE_DOOR, + PIECE_CIRCLE, + PIECE_CIRCLE_DOUBLE, + PIECE_GONE +}; +#endif + +int *editor_piece_maps[] = +{ + editor_pieces_chroma, +#ifdef XOR_COMPATIBILITY + editor_pieces_xor, +#endif +#ifdef ENIGMA_COMPATIBILITY + editor_pieces_enigma, +#endif + NULL +}; + +void editor() +{ + char filename[FILENAME_MAX]; + char directory[FILENAME_MAX]; + struct level* plevelload; + struct level* pleveltest; + struct menu* pmenu; + struct menu* pmenuconfirm; + struct menuentry* pentryno; + int ok; + int result; + + plevelcurrent = NULL; + + ok = 0; + while(!ok) + { + pmenu = menu_new(gettext("Editing Menu")); + + if(plevelcurrent == NULL) + menuentry_new(pmenu, gettext("Return to Main Menu"), 'Q', 0); + else + { + menuentry_new(pmenu, gettext("Return to Editor"), 'Q', 0); + menuentry_new(pmenu, gettext("Abort Editor and Return to Main Menu"), 'A', 0); + } + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Load Level"), 'L', 0); + menuentry_new(pmenu, gettext("Save Level"), 'S', plevelcurrent == NULL ? MENU_GREY : 0); + menuentry_new(pmenu, gettext("Export Level"), 'E', plevelcurrent == NULL ? MENU_GREY : 0); + menuentry_new(pmenu, gettext("Test Level"), 'T', plevelcurrent == NULL ? MENU_GREY : 0); + menuentry_new(pmenu, gettext("Verify Level"), 'V', plevelcurrent == NULL ? MENU_GREY : 0); + + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Level Options"), 'O', plevelcurrent == NULL ? MENU_GREY : 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Display Options"), 'D', 0); + + menuentry_new(pmenu, gettext("Currently editing:"), 0, MENU_NOTE); + + if(plevelcurrent != NULL) + { + if(plevelcurrent->title == NULL || strcmp(plevelcurrent->title, "") == 0) + menuentry_new(pmenu, gettext("[untitled level]"), 0, MENU_NOTE | MENU_RIGHT); + else + menuentry_new(pmenu, gettext(plevelcurrent->title), 0, MENU_NOTE | MENU_RIGHT); + } + else + menuentry_new(pmenu, gettext("** NO LEVEL LOADED **"), 0, MENU_NOTE | MENU_RIGHT); + + result = menu_process(pmenu); + + if(result == MENU_SELECT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'A': + ok = 1; + break; + + case 'S': + getfilename("construct", directory, 1, 0); + if(menu_levelselector(directory, filename, gettext("Save Level"), LEVELMENU_RETURN | LEVELMENU_NEW | LEVELMENU_DELETE | LEVELMENU_FILENAMES) == MENU_SELECT) + { + + if(strcmp(filename, "") == 0) + { + /* Create new file */ + sprintf(filename, "%s/%x.chroma", directory, (int)time(NULL)); + level_save(plevelcurrent, filename, 1); + } + else + { + /* Check file we're trying to save over */ + pleveltest = level_load(filename, 1); + + if(pleveltest != NULL && pleveltest->title != NULL) + { + if(plevelcurrent->title == NULL || strcmp(plevelcurrent->title, pleveltest->title) != 0) + { + pmenuconfirm = menu_new(gettext("Confirm Save")); + + menuentry_new(pmenuconfirm, gettext("Do you wish to overwrite:"), 0, MENU_GREY); + + if(pleveltest->title == NULL || strcmp(pleveltest->title, "") == 0) + menuentry_new(pmenuconfirm, gettext("[untitled level]"), 0, MENU_GREY | MENU_RIGHT); + else + menuentry_new(pmenuconfirm, pleveltest->title, 0, MENU_GREY | MENU_RIGHT); + menuentry_new(pmenuconfirm, gettext("with:"), 0, MENU_GREY); + + if(plevelcurrent->title == NULL || strcmp(plevelcurrent->title, "") == 0) + menuentry_new(pmenuconfirm, gettext("[untitled level]"), 0, MENU_GREY | MENU_RIGHT); + else + menuentry_new(pmenuconfirm, plevelcurrent->title, 0, MENU_GREY | MENU_RIGHT); + + menuentry_new(pmenuconfirm, "", 0, MENU_SPACE); + + pentryno = menuentry_new(pmenuconfirm, gettext("No"), 'N', 0); + menuentry_new(pmenuconfirm, gettext("Yes"), 'Y', 0); + + pmenuconfirm->entry_selected = pentryno; + + result = menu_process(pmenuconfirm); + if(result == MENU_SELECT && pmenuconfirm->entry_selected != NULL && pmenuconfirm->entry_selected->key == 'Y') + level_save(plevelcurrent, filename, 1); + + menu_delete(pmenuconfirm); + + } + else + level_save(plevelcurrent, filename, 1); + } + else + level_save(plevelcurrent, filename, 1); + + level_delete(pleveltest); + } + } + break; + + case 'L': + getfilename("construct", directory, 1, 0); + if(menu_levelselector(directory, filename, gettext("Load Level"), LEVELMENU_RETURN | LEVELMENU_CREATE | LEVELMENU_DELETE | LEVELMENU_FILENAMES | LEVELMENU_IMPORT) == MENU_SELECT) + { + /* Create new level */ + if(strcmp(filename, "") == 0) + plevelload = level_create(32, 23); + /* Load existing level */ + else + plevelload = level_load(filename, 0); + + if(plevelload != NULL) + { + level_delete(plevelcurrent); + + plevelcurrent = plevelload; + + /* Set editor position */ + plevelcurrent->player_x[2] = 0; + plevelcurrent->player_y[2] = 0; + } + } + break; + + case 'E': + export(plevelcurrent, 0); + break; + + case 'T': + pleveltest = level_copy(plevelcurrent); + level_fix(pleveltest); + pleveltest->flags |= LEVELFLAG_TESTING; + display_play(pleveltest, NULL); + level_delete(pleveltest); + break; + + case 'O': + plevelcurrent = editor_options(plevelcurrent); + break; + + case 'D': + display_options(); + break; + + case 'V': + if(editor_verify(plevelcurrent)) + result = MENU_QUIT; + break; + + case 'Q': + result = MENU_QUIT; + break; + + } + } + + if(result == MENU_QUIT) + { + if(plevelcurrent != NULL) + display_edit(plevelcurrent); + else + ok = 1; + } + + menu_delete(pmenu); + + } + + if(plevelcurrent != NULL) + level_delete(plevelcurrent); + plevelcurrent = NULL; +} + +int editor_verify(struct level* plevel) +{ + struct menu* pmenu; + struct menuentry* pentry; + int result; + int ok; + int x, y; + int p, p2; + int d; + int errors; + int i; + int count_playerone, count_playertwo, count_exit, count_teleport; + int count_map_tl, count_map_tr, count_map_bl, count_map_br; + int entries; + char buffer[4096]; + int piece_ok[PIECE_MAX]; + + pmenu = menu_new(gettext("Verify Level")); + + menuentry_new(pmenu, gettext("Return to Previous Menu"), 'Q', 0); + + menuentry_new(pmenu, "", 0, MENU_SPACE); + + errors = 0; + count_playerone = 0; + count_playertwo = 0; + count_exit = 0; + count_teleport = 0; + count_map_tl = 0; + count_map_tr = 0; + count_map_bl = 0; + count_map_br = 0; + + for(i = 0; i < PIECE_MAX; i ++) + piece_ok[i] = 0; + + i = 0; + while(editor_piece_maps[plevel->mode][i] != PIECE_GONE) + { + piece_ok[editor_piece_maps[plevel->mode][i]] = 1; + i ++; + } + + for(y = 0; y < plevel->size_y; y ++) + { + for(x = 0; x < plevel->size_x; x ++) + { + p = level_piece(plevel, x, y); + + if(p == PIECE_PLAYER_ONE) + count_playerone ++; + if(p == PIECE_PLAYER_TWO) + count_playertwo ++; + if(p == PIECE_DOOR) + count_exit ++; +#ifdef XOR_COMPATIBILITY + if(p == PIECE_TELEPORT) + count_teleport ++; + if(p == PIECE_MAP_TOP_LEFT) + count_map_tl ++; + if(p == PIECE_MAP_TOP_RIGHT) + count_map_tr ++; + if(p == PIECE_MAP_BOTTOM_LEFT) + count_map_bl ++; + if(p == PIECE_MAP_BOTTOM_RIGHT) + count_map_br ++; +#endif + + if(!piece_ok[p]) + { + sprintf(buffer, gettext("Invalid piece %s at (%d,%d)"), gettext(piece_name[p]), x, y); + pentry = menuentry_new(pmenu, buffer, 0, 0); + sprintf(buffer, "%d %d", x, y); + menuentry_value(pentry, buffer); + errors ++; + } + + if(p >= PIECE_MOVERS_FIRST && p <= PIECE_MOVERS_LAST) + { + d = p % 4; + p2 = level_piece(plevel, x + move_x[d], y + move_y[d]); + + if(canfall(p, p2, d)) + { + sprintf(buffer, gettext("Unsupported %s resting on %s at (%d,%d)"), gettext(piece_name[p]), gettext(piece_name[p2]), x, y); + pentry = menuentry_new(pmenu, buffer, 0, 0); + sprintf(buffer, "%d %d", x, y); + menuentry_value(pentry, buffer); + errors ++; + } + } + } + } + + if(count_playerone == 0) + { + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_PLAYER_ONE])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_playertwo == 0) + { +#ifdef ENIGMA_COMPATIBILITY + if(plevel->mode != MODE_ENIGMA) + { +#endif + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_PLAYER_TWO])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; +#ifdef ENIGMA_COMPATIBILITY + } +#endif + } + + if(count_exit == 0) + { + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_DOOR])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_playerone > 1) + { + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_PLAYER_ONE])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_playertwo > 1) + { + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_PLAYER_TWO])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + { + if(count_teleport != 0 && count_teleport != 2) + { + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_TELEPORT])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_map_tl != 1) + { + if(count_map_tl == 0) + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_MAP_TOP_LEFT])); + else + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_MAP_TOP_LEFT])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_map_tr != 1) + { + if(count_map_tr == 0) + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_MAP_TOP_RIGHT])); + else + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_MAP_TOP_RIGHT])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_map_bl != 1) + { + if(count_map_bl == 0) + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_MAP_BOTTOM_LEFT])); + else + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_MAP_BOTTOM_LEFT])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + + if(count_map_br != 1) + { + if(count_map_br == 0) + sprintf(buffer, gettext("No %s"), gettext(piece_name[PIECE_MAP_BOTTOM_RIGHT])); + else + sprintf(buffer, gettext("Too many %s"), gettext(piece_name[PIECE_MAP_BOTTOM_RIGHT])); + pentry = menuentry_new(pmenu, buffer, 0, 0); + errors ++; + } + } +#endif + + entries = 1; + pentry = pmenu->entry_first; + while(pentry != NULL && entries < 11) + { + if(pentry->key == 0 && !(pentry->flags & (MENU_GREY | MENU_NOTE | MENU_SPACE))) + { + pentry->key = '0' + (entries % 10); + entries ++; + } + + pentry = pentry->next; + } + + if(errors == 1) + sprintf(buffer, gettext("%d error found"), errors); + else + sprintf(buffer, gettext("%d errors found"), errors); + menuentry_new(pmenu, buffer, 0, MENU_NOTE | MENU_CENTRE); + + ok = 0; + while(!ok) + { + result = menu_process(pmenu); + + if(result == MENU_SELECT && pmenu->entry_selected != NULL) + { + if(pmenu->entry_selected->value != NULL) + { + i = sscanf(pmenu->entry_selected->value, "%d %d", &x, &y); + if(i == 2) + { + plevel->player_x[2] = x; + plevel->player_y[2] = y; + ok = 2; + } + } + else + ok = 1; + } + + if(result == MENU_QUIT) + ok = 1; + } + + menu_delete(pmenu); + + if(ok == 2) + return 1; + + return 0; +} + +struct level* editor_options(struct level* plevel) +{ + struct level* plevel_new; + struct menu* pmenu; + struct menuentry* pentry_mode; + struct menuentry* pentry_left; + struct menuentry* pentry_right; + struct menuentry* pentry_top; + struct menuentry* pentry_bottom; + struct menuentry* pentry_width; + struct menuentry* pentry_height; + struct menuentry* pentry_rotate; + struct menuentry* pentry_title; + int result; + int padding_left; + int padding_right; + int padding_top; + int padding_bottom; + int width, height; + int delta_left, delta_right, delta_top, delta_bottom; + int x, y; + int ok; + int rotate = 0; + int p, d; + char buffer[256]; + + pmenu = menu_new(gettext("Level Options")); + + padding_left = 0; ok = 1; + for(x = 1; x <= plevel->size_x - 2; x ++) + { + for(y = 1; y <= plevel->size_y - 2; y ++) + { + if(level_piece(plevel, x, y) != PIECE_SPACE) + ok = 0; + } + if(ok == 1) + padding_left ++; + else + break; + } + + padding_right = 0; ok = 1; + for(x = plevel->size_x -2 ; x >= 1; x --) + { + for(y = 1; y <= plevel->size_y - 2; y ++) + { + if(level_piece(plevel, x, y) != PIECE_SPACE) + ok = 0; + } + if(ok == 1) + padding_right ++; + else + break; + } + + padding_top = 0; ok = 1; + for(y = 1; y <= plevel->size_y - 2; y ++) + { + for(x = 1; x <= plevel->size_x - 2; x ++) + { + if(level_piece(plevel, x, y) != PIECE_SPACE) + ok = 0; + } + if(ok == 1) + padding_top ++; + else + break; + } + + padding_bottom = 0; ok = 1; + for(y = plevel->size_y -2 ; y >= 1; y --) + { + for(x = 1; x <= plevel->size_x - 2; x ++) + { + if(level_piece(plevel, x, y) != PIECE_SPACE) + ok = 0; + } + if(ok == 1) + padding_bottom ++; + else + break; + } + + width = plevel->size_x; + height = plevel->size_y; + + delta_left = 0; + delta_right = 0; + delta_top = 0; + delta_bottom = 0; + + /* Create menu entries */ + menuentry_new(pmenu, gettext("Return to previous menu"), 'Q', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + pentry_title = menuentry_new(pmenu, gettext("Title"), 'I', MENU_DOUBLE | MENU_EDITABLE); + if(plevel->title != NULL) + menuentry_extratext(pentry_title, NULL, NULL, plevel->title); + else + menuentry_extratext(pentry_title, NULL, NULL, ""); + + menuentry_new(pmenu, "", 0, MENU_SPACE); + + if(MODE_CHROMA == MODE_MAX - 1) + pentry_mode = NULL; + else + { + pentry_mode = menuentry_new(pmenu, gettext("Level Mode"), 'M', MENU_SCROLLABLE); + menuentry_new(pmenu, "", 0, MENU_SPACE); + } + + pentry_width = menuentry_new(pmenu, gettext("Level width"), 0, MENU_GREY); + pentry_left = menuentry_new(pmenu, gettext("Padding on left edge"), 'L', MENU_SCROLLABLE); + pentry_right = menuentry_new(pmenu, gettext("Padding on right edge"), 'R', MENU_SCROLLABLE); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + pentry_height = menuentry_new(pmenu, gettext("Level height"), 0, MENU_GREY); + pentry_top = menuentry_new(pmenu, gettext("Padding on top edge"), 'T', MENU_SCROLLABLE); + pentry_bottom = menuentry_new(pmenu, gettext("Padding on bottom edge"), 'B', MENU_SCROLLABLE); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + pentry_rotate = menuentry_new(pmenu, gettext("Rotate"), 'O', MENU_SCROLLABLE); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + /* Menu loop */ + ok = 0; + while(ok == 0) + { + if(plevel->mode == MODE_CHROMA) + pentry_rotate->flags &= ~MENU_GREY; + else + pentry_rotate->flags |= MENU_GREY; + + /* Fill in values for menu entries */ + switch(plevel->mode) + { + case MODE_CHROMA: + if(pentry_mode != NULL) + menuentry_extratext(pentry_mode, gettext("Chroma"), NULL, NULL); + if(width != 32) + menuentry_text(pentry_width, gettext("Level width (Chroma standard is 32)")); + else + menuentry_text(pentry_width, gettext("Level width")); + + if(height != 23) + menuentry_text(pentry_height, gettext("Level height (Chroma standard is 23)")); + else + menuentry_text(pentry_height, gettext("Level height")); + break; + +#ifdef XOR_COMPATIBILITY + case MODE_XOR: + menuentry_extratext(pentry_mode, gettext("XOR"), NULL, NULL); + + if(width != 32) + menuentry_text(pentry_width, gettext("Level width (XOR standard is 32)")); + else + menuentry_text(pentry_width, gettext("Level width")); + + if(height != 32) + menuentry_text(pentry_height, gettext("Level height (XOR standard is 32)")); + else + menuentry_text(pentry_height, gettext("Level height")); + + break; +#endif + +#ifdef ENIGMA_COMPATIBILITY + case MODE_ENIGMA: + menuentry_extratext(pentry_mode, gettext("Enigma"), NULL, NULL); + + if(width != 36) + menuentry_text(pentry_width, gettext("Level width (Enigma standard is 36)")); + else + menuentry_text(pentry_width, gettext("Level width")); + + if(height != 20) + menuentry_text(pentry_height, gettext("Level height (Enigma standard is 20)")); + else + menuentry_text(pentry_height, gettext("Level height")); + + break; +#endif + + } + + sprintf(buffer, "%d", width); + menuentry_extratext(pentry_width, buffer, NULL, NULL); + + sprintf(buffer, "%d", padding_left); + menuentry_extratext(pentry_left, buffer, NULL, NULL); + + sprintf(buffer, "%d", padding_right); + menuentry_extratext(pentry_right, buffer, NULL, NULL); + + sprintf(buffer, "%d", height); + menuentry_extratext(pentry_height, buffer, NULL, NULL); + + sprintf(buffer, "%d", padding_top); + menuentry_extratext(pentry_top, buffer, NULL, NULL); + + sprintf(buffer, "%d", padding_bottom); + menuentry_extratext(pentry_bottom, buffer, NULL, NULL); + + if(plevel->mode == MODE_CHROMA) + { + sprintf(buffer, gettext("%d degrees"), rotate * 90); + menuentry_extratext(pentry_rotate, buffer, NULL, NULL); + } + else + menuentry_extratext(pentry_rotate, gettext("(only for Chroma levels)"), NULL, NULL); + + /* Display menu */ + result = menu_process(pmenu); + + /* Process results */ + if(result == MENU_QUIT) + ok = 1; + + if(result == MENU_SELECT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'Q': + ok = 1; + break; + } + } + + if(result == MENU_SCROLLLEFT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'M': + plevel->mode --; + if(plevel->mode < 0) + plevel->mode = MODE_MAX - 1; +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + options_xor_options = 1; +#endif +#ifdef ENIGMA_COMPATIBILITY + if(plevel->mode == MODE_ENIGMA) + options_enigma_options = 1; +#endif + pentry_height->redraw = 1; + pentry_width->redraw = 1; + pentry_mode->redraw = 1; + pentry_rotate->redraw = 1; + break; + + case 'L': + if(width > 2) + { + delta_left --; + padding_left --; + width --; + + pentry_left->redraw = 1; + pentry_width->redraw = 1; + } + break; + + case 'R': + if(width > 2) + { + delta_right --; + padding_right --; + width --; + + pentry_right->redraw = 1; + pentry_width->redraw = 1; + } + break; + + case 'T': + if(height > 2) + { + delta_top --; + padding_top --; + height --; + + pentry_top->redraw = 1; + pentry_height->redraw = 1; + } + break; + + case 'B': + if(height > 2) + { + delta_bottom --; + padding_bottom --; + height --; + + pentry_bottom->redraw = 1; + pentry_height->redraw = 1; + } + break; + + case 'O': + rotate -= 1; + if(rotate == -1) + rotate = 3; + break; + + } + + } + + if(result == MENU_SCROLLRIGHT && pmenu->entry_selected != NULL) + { + switch(pmenu->entry_selected->key) + { + case 'M': + plevel->mode ++; + if(plevel->mode == MODE_MAX) + plevel->mode = 0; +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + options_xor_options = 1; +#endif +#ifdef ENIGMA_COMPATIBILITY + if(plevel->mode == MODE_ENIGMA) + options_enigma_options = 1; +#endif + pentry_height->redraw = 1; + pentry_width->redraw = 1; + pentry_mode->redraw = 1; + pentry_rotate->redraw = 1; + break; + + case 'L': + if(width < 256) + { + delta_left ++; + padding_left ++; + width ++; + + pentry_left->redraw = 1; + pentry_width->redraw = 1; + } + break; + + case 'R': + if(width < 256) + { + delta_right ++; + padding_right ++; + width ++; + + pentry_right->redraw = 1; + pentry_width->redraw = 1; + } + break; + + case 'T': + if(height < 256) + { + delta_top ++; + padding_top ++; + height ++; + + pentry_top->redraw = 1; + pentry_height->redraw = 1; + } + break; + + case 'B': + if(height < 256) + { + delta_bottom ++; + padding_bottom ++; + height ++; + + pentry_bottom->redraw = 1; + pentry_height->redraw = 1; + } + break; + + case 'O': + rotate += 1; + if(rotate == 4) + rotate = 0; + break; + } + } + } + + /* Set new title */ + if(pentry_title->text4 != NULL) + { + level_settitle(plevel, pentry_title->text4); + /* Easier than editing the configuration file! */ + if(strcmp(pentry_title->text4, "debug") == 0) + options_debug |= DEBUG_MENU; + } + + /* Resize the level if necessary */ + if(delta_left != 0 || delta_right != 0 || delta_top != 0 || delta_bottom != 0 ) + { + + /* Create a new level */ + plevel_new = level_create(width, height); + + /* Copy pieces into it */ + for(x = 1; x <= plevel->size_x - 2; x ++) + { + for(y = 1; y <= plevel->size_y - 2; y ++) + { + level_setpiece(plevel_new, x + delta_left, y + delta_top, level_piece(plevel, x, y)); + } + } + + /* Force borders */ + for(x = 0; x<= plevel_new->size_x - 1; x ++) + { + level_setpiece(plevel_new, x, 0, PIECE_WALL); + level_setpiece(plevel_new, x, plevel_new->size_y - 1, PIECE_WALL); + } + for(y = 0; y<= plevel_new->size_y - 1; y ++) + { + level_setpiece(plevel_new, 0, y, PIECE_WALL); + level_setpiece(plevel_new, plevel_new->size_x - 1, y, PIECE_WALL); + } + + /* If the original padding on any edge was zero, add a wall */ + if(padding_left - delta_left == 0) + { + for(y = 1; y <= plevel->size_y - 2; y ++) + { + level_setpiece(plevel_new, padding_left, y, PIECE_WALL); + } + } + if(padding_right - delta_right == 0) + { + for(y = 1; y <= plevel->size_y - 2; y ++) + { + level_setpiece(plevel_new, plevel_new->size_x - 1 - padding_right, y, PIECE_WALL); + } + } + if(padding_top - delta_top == 0) + { + for(x = 1; x <= plevel->size_x - 2; x ++) + { + level_setpiece(plevel_new, x, padding_top, PIECE_WALL); + } + } + if(padding_bottom - delta_bottom == 0) + { + for(x = 1; x <= plevel->size_x - 2; x ++) + { + level_setpiece(plevel_new, x, plevel_new->size_y - 1 - padding_bottom, PIECE_WALL); + } + } + + /* Copy level options */ + plevel_new->mode = plevel->mode; + level_settitle(plevel_new, plevel->title); + + /* Delete old level */ + level_delete(plevel); + plevel = plevel_new; + } + + /* Rotate the level if necessary */ + if(rotate != 0) + { + if(rotate == 2) + { + width = plevel->size_x; + height = plevel->size_y; + } + else + { + width = plevel->size_y; + height = plevel->size_x; + } + + /* Create a new level */ + plevel_new = level_create(width, height); + + /* Copy pieces into it */ + for(x = 1; x <= plevel_new->size_x - 2; x ++) + { + for(y = 1; y <= plevel_new->size_y - 2; y ++) + { + switch(rotate) + { + case 1: + p = level_piece(plevel, y, plevel->size_y - 1 - x); + break; + case 2: + p = level_piece(plevel, plevel->size_x - 1 - x, plevel->size_y - 1 - y); + break; + case 3: + p = level_piece(plevel, plevel->size_x - 1 - y, x); + break; + default: + p = level_piece(plevel, x, y); + break; + } + if(p >= PIECE_MOVERS_FIRST && p <= PIECE_MOVERS_LAST) + { + d = p % 4; + p = p - d + ((d + rotate) % 4); + } + level_setpiece(plevel_new, x, y, p); + } + } + + /* Force borders */ + for(x = 0; x<= plevel_new->size_x - 1; x ++) + { + level_setpiece(plevel_new, x, 0, PIECE_WALL); + level_setpiece(plevel_new, x, plevel_new->size_y - 1, PIECE_WALL); + } + for(y = 0; y<= plevel_new->size_y - 1; y ++) + { + level_setpiece(plevel_new, 0, y, PIECE_WALL); + level_setpiece(plevel_new, plevel_new->size_x - 1, y, PIECE_WALL); + } + + /* Copy level options */ + plevel_new->mode = plevel->mode; + + level_settitle(plevel_new, plevel->title); + + /* Delete old level */ + level_delete(plevel); + plevel = plevel_new; + } + + return plevel; +} + diff --git a/engine.c b/engine.c new file mode 100644 index 0000000..394d183 --- /dev/null +++ b/engine.c @@ -0,0 +1,1528 @@ +/* + engine.c + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include + +#include "chroma.h" +#include "level.h" +#include "util.h" + +#ifdef XOR_COMPATIBILITY +int xor_move(struct level* plevel, int move); +int xor_evolve(struct level* plevel); +void xor_focus(struct level* plevel); +extern int options_xor_mode; +#endif +#ifdef ENIGMA_COMPATIBILITY +int enigma_move(struct level* plevel, int move); +int enigma_evolve(struct level* plevel); +extern int options_enigma_mode; +#endif + +extern int options_debug; +extern char* piece_name[]; + +/* l u r d n s w */ +int move_x[] = {-1, 0, 1, 0, 0, 0, 0}; +int move_y[] = {0, -1, 0, 1, 0, 0, 0}; + +#ifdef ENIGMA_COMPATIBILITY +int enigma_move_order[] = {MOVE_DOWN, MOVE_RIGHT, MOVE_LEFT, MOVE_UP}; +#endif +#ifdef XOR_COMPATIBILITY +int xor_teleport_order[] = {MOVE_RIGHT, MOVE_UP, MOVE_LEFT, MOVE_DOWN}; +#endif + +struct mover* mover_new(struct level* plevel, int x, int y, int d, int piece, int fast); +void mover_consider(struct level* plevel, int x, int y, int d); +struct mover* mover_explode(struct level *plevel, int x, int y, int d, int p); +void explode_sides(struct level* plevel, int x, int y, int p, int d); +int canfall(int p, int into, int d); +int canmove(int p, int into, int d, int fast); +int canexplode(int p, int into, int d, int fast, int mode); +int canbepushed(int p, int into, int d, int mode); + +int explosiontype(int p) +{ + switch(p) + { + case PIECE_ARROW_RED_LEFT: + case PIECE_ARROW_RED_RIGHT: + case PIECE_BOMB_RED_LEFT: + case PIECE_BOMB_RED_RIGHT: + return PIECE_EXPLOSION_NEW_RED_VERTICAL; + case PIECE_ARROW_RED_UP: + case PIECE_ARROW_RED_DOWN: + case PIECE_BOMB_RED_UP: + case PIECE_BOMB_RED_DOWN: + return PIECE_EXPLOSION_NEW_RED_HORIZONTAL; + + case PIECE_ARROW_GREEN_LEFT: + case PIECE_ARROW_GREEN_RIGHT: + case PIECE_BOMB_GREEN_LEFT: + case PIECE_BOMB_GREEN_RIGHT: + return PIECE_EXPLOSION_NEW_GREEN_VERTICAL; + case PIECE_ARROW_GREEN_UP: + case PIECE_ARROW_GREEN_DOWN: + case PIECE_BOMB_GREEN_UP: + case PIECE_BOMB_GREEN_DOWN: + return PIECE_EXPLOSION_NEW_GREEN_HORIZONTAL; + + case PIECE_ARROW_BLUE_LEFT: + case PIECE_ARROW_BLUE_RIGHT: + case PIECE_BOMB_BLUE_LEFT: + case PIECE_BOMB_BLUE_RIGHT: + return PIECE_EXPLOSION_NEW_BLUE_VERTICAL; + case PIECE_ARROW_BLUE_UP: + case PIECE_ARROW_BLUE_DOWN: + case PIECE_BOMB_BLUE_UP: + case PIECE_BOMB_BLUE_DOWN: + return PIECE_EXPLOSION_NEW_BLUE_HORIZONTAL; + + default: + /* This should never happen */ + return PIECE_GONE; + } +} + +void level_moved(struct level* plevel, int move) +{ + if(move != MOVE_REDO) + level_addmove(plevel, move); + else + { + if(plevel->move_current != NULL) + plevel->move_current = plevel->move_current->next; + else + plevel->move_current = plevel->move_first; + } + + plevel->moves ++; + plevel->flags |= LEVELFLAG_MOVES; + + level_storemovers(plevel); +} + +int level_move(struct level* plevel, int move) +{ + int x, y; + int tx, ty; + int px, py; + int p; + int ok; +#ifdef XOR_COMPATIBILITY + int dx, dy; + int teleport; + int td; + int i; +#endif + int realmove; + struct move* pmove; + + realmove = move; + + if(plevel == NULL || plevel->mover_first != NULL) + return 0; + + if(move == MOVE_REDO) + { + if(plevel->move_current == NULL) + pmove = plevel->move_first; + else + pmove = plevel->move_current->next; + + if(pmove == NULL) + return 0; + + move = pmove->direction; + } + + if(move == MOVE_SWAP) + { + if(plevel->alive[1 - plevel->player]) + { + plevel->player = 1 - plevel->player; + + /* Create new movers for the stationary swapped players to allow + the display to redraw them after the swap. */ + mover_new(plevel, plevel->player_x[plevel->player], plevel->player_y[plevel->player], MOVE_SWAP, PIECE_PLAYER_ONE + plevel->player, 0); + + /* Is the first player still alive? */ + if(plevel->alive[1 - plevel->player]) + mover_new(plevel, plevel->player_x[1 - plevel->player], plevel->player_y[1 - plevel->player], MOVE_SWAPPED, PIECE_PLAYER_ONE + 1 - plevel->player, 0); + + level_moved(plevel, realmove); + + return 1; + } + return 0; + } + + if(plevel->alive[plevel->player] == 0) + return 0; + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR && options_xor_mode == 1) + { + if(xor_move(plevel, move)) + { + level_moved(plevel, realmove); + xor_focus(plevel); + return 1; + } + return 0; + } +#endif +#ifdef ENIGMA_COMPATIBILITY + if(plevel->mode == MODE_ENIGMA && options_enigma_mode == 1) + { + if(enigma_move(plevel, move)) + { + level_moved(plevel, realmove); + return 1; + } + return 0; + } + +#endif + + /* Consider where we are moving to */ + x = plevel->player_x[plevel->player] + move_x[move]; + y = plevel->player_y[plevel->player] + move_y[move]; + + p = level_piece(plevel, x, y); + + ok = 0; + + /* Can we move into the piece in that direction? */ + switch(p) + { + case PIECE_DOOR: + if(plevel->stars_caught == plevel->stars_total) + { + plevel->flags |= LEVELFLAG_EXIT; + ok = 1; + } + break; + + case PIECE_STAR: + plevel->stars_caught ++; + plevel->flags |= LEVELFLAG_STARS; + ok = 1; + break; + +#ifdef XOR_COMPATIBILITY + case PIECE_TELEPORT: + /* Only XOR has teleports. We force the issue so as not to break + Chroma's rotational symmetry by introducing teleport order. */ + if(plevel->mode != MODE_XOR) + break; + + teleport = -1; + if(x == plevel->teleport_x[0] && y == plevel->teleport_y[0]) + teleport = 0; + if(x == plevel->teleport_x[1] && y == plevel->teleport_y[1]) + teleport = 1; + if(teleport != -1) + { + tx = plevel->teleport_x[1 - teleport]; + ty = plevel->teleport_y[1 - teleport]; + td = move; + + /* Does the other teleport still exist? */ + if(level_piece(plevel, tx, ty) == PIECE_TELEPORT) + { + ok = 0; + /* Find the first available exit from it */ + for(i = 0; i < 4; i ++) + { + dx = tx + move_x[xor_teleport_order[i]]; + dy = ty + move_y[xor_teleport_order[i]]; + if(!ok && level_piece(plevel, dx, dy) == PIECE_SPACE) + { + /* Change move to produce the effect of coming + out of the teleport */ + x = dx; y = dy; move = xor_teleport_order[i]; + ok = 1; + } + } + + if(ok) + { + /* Visual effects for the player going in one teleport */ + /* Store original player move direction in cosmetic mover */ + mover_new(plevel, plevel->teleport_x[teleport], plevel->teleport_y[teleport], td, PIECE_TELEPORT, 0); + level_setprevious(plevel, plevel->teleport_x[teleport], plevel->teleport_y[teleport], PIECE_PLAYER_ONE + plevel->player); + level_setpreviousmoving(plevel, plevel->teleport_x[teleport], plevel->teleport_y[teleport], realmove); + /* and out of the other teleport */ + mover_new(plevel, plevel->teleport_x[1 - teleport], plevel->teleport_y[1 - teleport], MOVE_NONE, PIECE_TELEPORT, 0); + + /* Change the viewpoint to that of the other teleport */ + plevel->view_x[plevel->player] = plevel->view_teleport_x[1 - teleport]; + plevel->view_y[plevel->player] = plevel->view_teleport_y[1 - teleport]; + + } + } + } + break; + + case PIECE_SWITCH: + plevel->switched = 1 - plevel->switched; + plevel->flags |= LEVELFLAG_SWITCH; + ok = 1; + break; + + case PIECE_MAP_TOP_LEFT: + plevel->mapped |= MAPPED_TOP_LEFT; + plevel->flags |= LEVELFLAG_MAP; + ok = 1; + break; + case PIECE_MAP_TOP_RIGHT: + plevel->mapped |= MAPPED_TOP_RIGHT; + plevel->flags |= LEVELFLAG_MAP; + ok = 1; + break; + case PIECE_MAP_BOTTOM_LEFT: + plevel->mapped |= MAPPED_BOTTOM_LEFT; + plevel->flags |= LEVELFLAG_MAP; + ok = 1; + break; + case PIECE_MAP_BOTTOM_RIGHT: + plevel->mapped |= MAPPED_BOTTOM_RIGHT; + plevel->flags |= LEVELFLAG_MAP; + ok = 1; + break; + + case PIECE_DOTS_X: + if(move == MOVE_LEFT || move == MOVE_RIGHT) + ok = 1; + break; + + case PIECE_DOTS_Y: + if(move == MOVE_UP || move == MOVE_DOWN) + ok = 1; + break; +#endif + +#ifdef ENIGMA_COMPATIBILITY + case PIECE_DOTS_DOUBLE: +#endif + case PIECE_DOTS: + case PIECE_SPACE: + ok = 1; + break; + } + + /* Is there a piece we can push? */ + if(!ok) + { + tx = x + move_x[move]; + ty = y + move_y[move]; + + if(canbepushed(p, level_piece(plevel, tx, ty), move, plevel->mode)) + { + mover_new(plevel, tx, ty, move, p, 0); + ok = 1; + } + } + + if(ok) + { + + /* Cosmetic mover for storing the player's direction in undo */ + mover_new(plevel, plevel->player_x[plevel->player], plevel->player_y[plevel->player], move, PIECE_GONE, 0); + + mover_new(plevel, x, y, move, PIECE_PLAYER_ONE + plevel->player, 0); + + px = plevel->player_x[plevel->player]; + py = plevel->player_y[plevel->player]; + +#ifdef XOR_COMPATIBILITY + /* XOR protects the players move */ + if(plevel->mode == MODE_XOR) + { + /* Blank the player's space first to avoid upsetting undo */ + level_setpiece(plevel, px, py, PIECE_SPACE); + mover_new(plevel, px, py, (move + 1) % 4, PIECE_SPACE, 1); + } + /* Chroma lets a piece follow in the player's trail */ + else + { +#endif + /* Blank the player's space first to avoid upsetting undo */ + level_setpiece(plevel, px, py, PIECE_SPACE); + mover_consider(plevel, px, py, move % 4); +#ifdef XOR_COMPATIBILITY + } +#endif + + plevel->player_x[plevel->player] = x; + plevel->player_y[plevel->player] = y; + + level_moved(plevel, realmove); + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + xor_focus(plevel); +#endif + + return 1; + } + + return 0; +} + +struct mover* mover_explode(struct level *plevel, int x, int y, int d, int p) +{ + /* Don't explode any of the edge wall */ + if(x == 0 || y == 0 || x == plevel->size_x - 1 || y == plevel->size_y - 1) + return NULL; + + /* What have we exploded? */ + switch(level_piece(plevel, x, y)) + { + case PIECE_STAR: + plevel->stars_exploded ++; + plevel->flags |= LEVELFLAG_STARS; + break; + +#ifdef XOR_COMPATIBILITY + case PIECE_SWITCH: + plevel->switched = 1 - plevel->switched; + plevel->flags |= LEVELFLAG_SWITCH; + break; +#endif + } + + return mover_new(plevel, x, y, d, p, 1); +} + +struct mover* mover_new(struct level* plevel, int x, int y, int d, int piece, int fast) +{ + struct mover* pmover; + int previous; + int data; + + /* Don't allow two movers in the same space, unless one is exploding */ + if(!isnewexplosion(piece) && level_moving(plevel, x, y) != MOVE_NONE) + return NULL; + + pmover = (struct mover*)malloc(sizeof(struct mover)); + if(pmover == NULL) + fatal("Out of memory in mover_new()"); + + previous = level_piece(plevel, x, y); + + pmover->x = x; + pmover->y = y; + pmover->direction = d; + pmover->piece = piece; + pmover->piece_previous = previous; + pmover->fast = fast; + pmover->next = NULL; + pmover->previous = plevel->mover_last; + + if(plevel->mover_first == NULL) + plevel->mover_first = pmover; + + if(plevel->mover_last != NULL) + plevel->mover_last->next = pmover; + + plevel->mover_last = pmover; + + /* Show pieces collected by players */ + if(piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + { + if((previous < PIECE_MOVERS_FIRST || previous > PIECE_MOVERS_LAST) + && previous != PIECE_CIRCLE +#ifdef ENIGMA_COMPATIBILITY + && previous != PIECE_CIRCLE_DOUBLE +#endif + && previous != PIECE_PLAYER_ONE + && previous != PIECE_PLAYER_TWO) + level_setprevious(plevel, x, y, previous); + } + + /* Show players squashed by movers */ + if(piece >= PIECE_MOVERS_FIRST && piece <= PIECE_MOVERS_LAST) + { + if(previous == PIECE_PLAYER_ONE || previous == PIECE_PLAYER_TWO) + level_setprevious(plevel, x, y, previous); + } + + /* Show pieces removed by movers or explosions */ + if(previous == PIECE_DOTS +#ifdef ENIGMA_COMPATIBILITY + || previous == PIECE_DOTS_DOUBLE +#endif +#ifdef XOR_COMPATIBILITY + || previous == PIECE_DOTS_X + || previous == PIECE_DOTS_Y +#endif + || isexplosion(previous)) + level_setprevious(plevel, x, y, previous); + + /* Show exploded pieces */ + if(isnewexplosion(piece) && !isnewexplosion(previous)) + { + level_setprevious(plevel, x, y, previous); + level_setpreviousmoving(plevel, x, y, level_moving(plevel, x, y)); + } + + /* Explosions occur later */ + if(!isnewexplosion(piece) && piece != PIECE_GONE) + { + level_setpiece(plevel, x, y, piece); + level_setmoving(plevel, x, y, d); + } + + /* Maintain piece graphic */ + if(d != MOVE_NONE) + { + data = level_data(plevel, x - move_x[d], y - move_y[d]) & 0xff00; + data = (level_data(plevel, x, y) & ~0xff00) | data; + level_setdata(plevel, x, y, data); + } + + return pmover; +} + +struct mover* mover_addtostack(struct level* plevel, int x, int y, int move) +{ + struct mover* pmover; + + pmover = (struct mover*)malloc(sizeof(struct mover)); + if(pmover == NULL) + fatal("Out of memory in mover_addtostack()"); + + pmover->x = x; + pmover->y = y; + pmover->direction = move; + pmover->piece = PIECE_SPACE; + pmover->fast = 0; + pmover->next = NULL; + + if(plevel->stack_first == NULL) + plevel->stack_first = pmover; + + if(plevel->stack_last != NULL) + plevel->stack_last->next = pmover; + + plevel->stack_last = pmover; + + return pmover; +} + +void level_storemovers(struct level* plevel) +{ + struct mover* pmover; + int previous; + + int count = 0; + + if(plevel->move_current == NULL || plevel->mover_first == NULL) + return; + + if((options_debug & DEBUG_MOVERS) && plevel->move_current->mover_first == NULL) + fprintf(stderr, "\n"); + + pmover = plevel->mover_first; + while(pmover != NULL) + { + /* If something is moving into an explosion, don't store it as the + previous piece for this space; it will have its own mover, and thus + will be stored elsewhere. */ + previous = pmover->piece_previous; + if(isexplosion(pmover->piece) && level_previousmoving(plevel, pmover->x, pmover->y) != MOVE_NONE) + previous = PIECE_SPACE; + + mover_newundo(plevel, pmover->x, pmover->y, + pmover->direction, pmover->piece, previous, + MOVER_STORE | (pmover->next == NULL ? 0 : MOVER_FAST)); + + if(options_debug & DEBUG_MOVERS) + fprintf(stderr, "[%d] Storing undo mover at (%d,%d) is %s was %s (direction=%c) (flags=%d)\n", + count ++, pmover->x, pmover->y, + piece_name[pmover->piece], piece_name[previous], + directiontochar(pmover->direction), + (pmover->next == NULL ? 0 : MOVER_FAST)); + + pmover = pmover->next; + } +} + +int level_evolve(struct level* plevel) +{ + struct mover* poldmovers; + struct mover* pmover; + int x, y; + int i; + int d; + int ad; + int ed; + int ax, ay; + int bp, bd; + int filled; + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR && options_xor_mode == 1) + { + return xor_evolve(plevel); + } +#endif +#ifdef ENIGMA_COMPATIBILITY + if(plevel->mode == MODE_ENIGMA && options_enigma_mode == 1) + { + return enigma_evolve(plevel); + } +#endif + + poldmovers = plevel->mover_first; + + plevel->mover_first = NULL; + plevel->mover_last = NULL; + + /* Chroma's engine isn't perfect. Pieces that appear to be in continuous + motion are actually momentarily stationary at the start of every cycle. + In pathological cases, this can give rise to some counterintuitive + situations, where the outcome depends on the order of the movers. + + See levels/regression/chroma-regression.chroma for some examples. + */ + + pmover = poldmovers; + while(pmover != NULL) + { + level_setmoving(plevel, pmover->x, pmover->y, MOVE_NONE); + level_setprevious(plevel, pmover->x, pmover->y, PIECE_SPACE); + level_setpreviousmoving(plevel, pmover->x, pmover->y, MOVE_NONE); + level_setdetonator(plevel, pmover->x, pmover->y, PIECE_SPACE); + level_setdetonatormoving(plevel, pmover->x, pmover->y, MOVE_NONE); + pmover = pmover->next; + } + + pmover = poldmovers; + while(pmover != NULL) + { + + /* Remove the mover if something has already moved into its space */ + if(level_moving(plevel, pmover->x, pmover->y) != MOVE_NONE + /* or it isn't what it should be */ + || level_piece(plevel, pmover->x, pmover->y) != pmover->piece + ) + pmover->piece = PIECE_GONE; + + switch(pmover->piece) + { + case PIECE_SPACE: + case PIECE_EXPLOSION_RED_LEFT: + case PIECE_EXPLOSION_RED_HORIZONTAL: + case PIECE_EXPLOSION_RED_RIGHT: + case PIECE_EXPLOSION_RED_TOP: + case PIECE_EXPLOSION_RED_VERTICAL: + case PIECE_EXPLOSION_RED_BOTTOM: + case PIECE_EXPLOSION_GREEN_LEFT: + case PIECE_EXPLOSION_GREEN_HORIZONTAL: + case PIECE_EXPLOSION_GREEN_RIGHT: + case PIECE_EXPLOSION_GREEN_TOP: + case PIECE_EXPLOSION_GREEN_VERTICAL: + case PIECE_EXPLOSION_GREEN_BOTTOM: + case PIECE_EXPLOSION_BLUE_LEFT: + case PIECE_EXPLOSION_BLUE_HORIZONTAL: + case PIECE_EXPLOSION_BLUE_RIGHT: + case PIECE_EXPLOSION_BLUE_TOP: + case PIECE_EXPLOSION_BLUE_VERTICAL: + case PIECE_EXPLOSION_BLUE_BOTTOM: + i = 0; + filled = 0; + + /* Consider the pieces around the space */ + for(i = 0; i < 4; i ++) + { + if(filled) + continue; + +#ifdef ENIGMA_COMPATIBILITY + /* Enigma has a fixed move order */ + if(plevel->mode == MODE_ENIGMA) + d = enigma_move_order[i]; + else +#endif + /* Chroma and XOR depend on how the space was emptied */ + d = (pmover->direction + i) % 4; + + ad = (d + 2) % 4; + ax = pmover->x + move_x[ad]; + ay = pmover->y + move_y[ad]; + + /* Can the piece move into the space? */ + if(canfall(level_piece(plevel, ax, ay), PIECE_SPACE, d) + /* and that piece isn't already moving */ + && level_moving(plevel, ax, ay) == MOVE_NONE + ) + { + x = pmover->x + move_x[d]; + y = pmover->y + move_y[d]; + + /* Can the piece from the opposite direction also + move into this space? */ + if(canfall(level_piece(plevel, x, y), PIECE_SPACE, ad) + /* and that piece isn't already moving */ + && level_moving(plevel, x, y) == MOVE_NONE + /* If so, can the two explode? */ + && canexplode(level_piece(plevel, ax, ay), level_piece(plevel, x, y), d, 1, plevel->mode) + /* (but not for XOR and Enigma) */ + && plevel->mode == MODE_CHROMA + ) + { + /* If so, detonate them in the middle */ + if((level_piece(plevel, x, y) & 4) == 4) + { + /* The first piece is the bomb */ + bp = level_piece(plevel, x, y); + bd = ad; + ed = level_piece(plevel, x, y) & 3; + + level_setdetonator(plevel, pmover->x, pmover->y, level_piece(plevel, ax, ay)); + level_setdetonatormoving(plevel, pmover->x, pmover->y, d); + } + else + { + /* The second piece is the bomb */ + bp = level_piece(plevel, ax, ay); + bd = d; + ed = level_piece(plevel, ax, ay) & 3; + + level_setdetonator(plevel, pmover->x, pmover->y, level_piece(plevel, x, y)); + level_setdetonatormoving(plevel, pmover->x, pmover->y, ad); + } + + /* and consider anything following them */ + mover_consider(plevel, x, y, ad); + mover_consider(plevel, ax, ay, d); + + /* Move the bomb into the space */ + level_setpiece(plevel, pmover->x, pmover->y, bp); + level_setmoving(plevel, pmover->x, pmover->y, bd); + + /* and explode it */ + mover_explode(plevel, pmover->x, pmover->y, ed, explosiontype(bp)); + + /* Create the central explosion now, to prevent the + piece there being processed as a later mover. */ + level_setpiece(plevel, pmover->x, pmover->y, explosiontype(bp)); + + explode_sides(plevel, pmover->x, pmover->y, bp, ed); + + filled = 1; + break; + } + + /* Otherwise, keep the piece moving */ + mover_new(plevel, pmover->x, pmover->y, d, level_piece(plevel, ax, ay), 1); + /* and see if anything is following in its trail */ + mover_consider(plevel, ax, ay, d); + + filled = 1; + break; + } + } + + /* If the explosion has not been filled */ + if(isexplosion(pmover->piece) && filled == 0 + /* and nothing else is moving into it */ + && level_moving(plevel, pmover->x, pmover->y) == MOVE_NONE + ) + /* then turn it into a space */ + mover_new(plevel, pmover->x, pmover->y, pmover->direction, PIECE_SPACE, 0); + + break; + + case PIECE_PLAYER_ONE: + case PIECE_PLAYER_TWO: + case PIECE_GONE: + /* These 'movers' are purely for cosmetic purposes */ + break; + +#ifdef XOR_COMPATIBILITY + case PIECE_TELEPORT: + /* These 'movers' are purely for cosmetic purposes */ + break; +#endif + + default: + /* A pushed arrow still falls in its natural direction */ + if(pmover->fast == 0 && pmover->piece >= PIECE_MOVERS_FIRST && pmover->piece <= PIECE_MOVERS_LAST) + pmover->direction = pmover->piece % 4; + + /* Consider the space in front of the mover */ + x = pmover->x + move_x[pmover->direction]; + y = pmover->y + move_y[pmover->direction]; + + /* Can the mover move into the space in front of it? */ + if(canmove(pmover->piece, level_piece(plevel, x, y), pmover->direction, pmover->fast) + /* and that space doesn't already have something + moving into it */ + && (level_moving(plevel, x, y) == MOVE_NONE) + ) + { + /* If so, keep it moving */ + mover_new(plevel, x, y, pmover->direction, pmover->piece, 1); + /* and see if anything is following in its trail */ + mover_consider(plevel, pmover->x, pmover->y, pmover->direction); + break; + } + + /* Can the mover explode the piece in front of it? */ + if(canexplode(pmover->piece, level_piece(plevel, x, y), pmover->direction, pmover->fast, plevel->mode) + /* and the piece in front isn't moving */ + && (level_moving(plevel, x, y) == MOVE_NONE + /* or it is moving towards us */ + || (level_moving(plevel, x, y) == ((pmover->direction + 2) % 4) + /* (but not for XOR or Enigma) */ + && plevel->mode==MODE_CHROMA)) + ) + { + bp = level_piece(plevel, x, y); + level_setdetonator(plevel, x, y, pmover->piece); + level_setdetonatormoving(plevel, x, y, pmover->direction); + + /* Explosion direction is bomb fall direction */ + if(bp & 4) + ed = bp & 3; + else + ed = pmover->piece & 3; + + mover_explode(plevel, x, y, ed, explosiontype(bp)); + + /* Create the central explosion now, to prevent the piece + there being processed as a later mover. */ + level_setpiece(plevel, x, y, explosiontype(bp)); + + mover_consider(plevel, pmover->x, pmover->y, pmover->direction); + + explode_sides(plevel, x, y, bp, ed); + + break; + } + } + + pmover = pmover->next; + } + + /* Create the side explosions at the end, rather than during the previous + loop. This allows multiple explosions to occur in parallel. Centre + explosions will have already been created earlier on. */ + pmover = plevel->mover_first; + while(pmover != NULL) + { + if(isnewexplosion(pmover->piece)) + { + if(!isnewexplosion(level_piece(plevel, pmover->x, pmover->y))) + { + level_setprevious(plevel, pmover->x, pmover->y, level_piece(plevel, pmover->x, pmover->y)); + level_setpreviousmoving(plevel, pmover->x, pmover->y, level_moving(plevel, pmover->x, pmover->y)); + } + + /* Use PIECE_EXPLOSION_NEW to allow detection of overlapping + explosions further down. */ + level_setpiece(plevel, pmover->x, pmover->y, pmover->piece); + level_setmoving(plevel, pmover->x, pmover->y, pmover->direction); + + pmover->piece += PIECE_EXPLOSION_FIRST - PIECE_EXPLOSION_NEW_FIRST; + } + + pmover = pmover->next; + } + + pmover = plevel->mover_first; + while(pmover != NULL) + { + if(isexplosion(pmover->piece)) + { + /* Remove any explosions that overlap other explosions */ + if(isexplosion(level_piece(plevel, pmover->x, pmover->y))) + pmover->piece = PIECE_GONE; + /* Otherwise, convert new explosions into explosions proper */ + else + level_setpiece(plevel, pmover->x, pmover->y, pmover->piece); + } + /* Remove any movers that have exploded, or aren't as they should be */ + if(level_piece(plevel, pmover->x, pmover->y) != pmover->piece) + { + pmover->piece = PIECE_GONE; + } + pmover = pmover->next; + } + + /* Is player one still alive? */ + if(level_piece(plevel, plevel->player_x[0], plevel->player_y[0]) != PIECE_PLAYER_ONE) + { + plevel->flags |= LEVELFLAG_MOVES; + plevel->alive[0] = 0; + } + + /* Is player two still alive? */ + if(level_piece(plevel, plevel->player_x[1], plevel->player_y[1]) != PIECE_PLAYER_TWO) + { + plevel->flags |= LEVELFLAG_MOVES; + plevel->alive[1] = 0; + } + + /* Free old movers */ + while(poldmovers != NULL) + { + pmover = poldmovers; + poldmovers = poldmovers->next; + free(pmover); + } + + return 0; +} + +void mover_consider(struct level* plevel, int x, int y, int d) +{ + int tx, ty; + int ad; + + /* Is there already a mover in this space? If so, don't allow another */ + if(level_moving(plevel, x, y) != MOVE_NONE) + return; + +#ifdef ENIGMA_COMPATIBILITY + /* Enigma doesn't consider the direction in which a space was emptied */ + if(plevel->mode == MODE_ENIGMA) + { + mover_new(plevel, x, y, d, PIECE_SPACE, 1); + return; + } +#endif + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + { + mover_new(plevel, x, y, d, PIECE_SPACE, 1); + return; + } +#endif + + ad = (d + 2) % 4; + tx = x + move_x[ad]; + ty = y + move_y[ad]; + + /* Can a piece follow in the trail of this one? */ + if(canfall(level_piece(plevel, tx, ty), PIECE_SPACE, d)) + { + /* If it's moving already, just clear this space (1.07) */ + if(level_moving(plevel, tx, ty) != MOVE_NONE) + { + mover_new(plevel, x, y, MOVE_NONE, PIECE_SPACE, 0); + return; + } + + /* Otherwise, set it moving */ + mover_new(plevel, x, y, d, level_piece(plevel, tx, ty), 1); + /* and see if there's anything following in its trail */ + mover_consider(plevel, tx, ty, d); + return; + } + + mover_new(plevel, x, y, d, PIECE_SPACE, 1); +} + +void explode_sides(struct level* plevel, int x, int y, int p, int d) +{ + /* Chroma is subtle. This may be too subtle to have any effect in practice, + but the principle elsewhere is that things should be rotationally + symmetric, and this carries through here. */ + if(plevel->mode == MODE_CHROMA) + { + switch(p % 4) + { + case 0: /* left */ + mover_explode(plevel, x, y - 1, d, explosiontype(p) - 1); + mover_explode(plevel, x, y + 1, d, explosiontype(p) + 1); + break; + + case 1: /* up */ + mover_explode(plevel, x + 1, y, d, explosiontype(p) + 1); + mover_explode(plevel, x - 1, y, d, explosiontype(p) - 1); + break; + + case 2: /* right */ + mover_explode(plevel, x, y + 1, d, explosiontype(p) + 1); + mover_explode(plevel, x, y - 1, d, explosiontype(p) - 1); + break; + + case 3: /* down */ + mover_explode(plevel, x - 1, y, d, explosiontype(p) - 1); + mover_explode(plevel, x + 1, y, d, explosiontype(p) + 1); + break; + } + } + else + { + switch(p % 2) + { + case 0: /* left / right */ + mover_explode(plevel, x, y - 1, d, explosiontype(p) - 1); + mover_explode(plevel, x, y + 1, d, explosiontype(p) + 1); + break; + case 1: /* up /down */ + mover_explode(plevel, x - 1, y, d, explosiontype(p) - 1); + mover_explode(plevel, x + 1, y, d, explosiontype(p) + 1); + break; + } + } +} + + +int canfall(int p, int into, int d) +{ + /* Determine whether a piece can start moving */ + + /* Arrows and bombs */ + if(p >= PIECE_MOVERS_FIRST && p<= PIECE_MOVERS_LAST) + { + /* can start falling in their natural direction */ + if(d == (p % 4)) + { + /* but only into empty space */ + if(into == PIECE_SPACE) + return 1; +#ifdef XOR_COMPATIBILITY + /* or into directional dots if appropriate */ + if(into == PIECE_DOTS_X && (d == MOVE_LEFT || d == MOVE_RIGHT )) + return 1; + if(into == PIECE_DOTS_Y && (d == MOVE_UP || d == MOVE_DOWN )) + return 1; +#endif + } + } + + return 0; +} + + +int canmove(int p, int into, int d, int fast) +{ + /* Determine whether a piece can continue moving */ + + /* Arrows and bombs */ + if(p >= PIECE_MOVERS_FIRST && p<= PIECE_MOVERS_LAST) + { + /* can continue moving in their natural direction */ + if(d == (p % 4)) + { + /* into empty space */ + if(into == PIECE_SPACE) + return 1; + /* into dots if they're already moving */ + if(into == PIECE_DOTS && fast) + return 1; +#ifdef XOR_COMPATIBILITY + /* into directional dots if appropriate */ + if(into == PIECE_DOTS_X && (d == MOVE_LEFT || d == MOVE_RIGHT )) + return 1; + if(into == PIECE_DOTS_Y && (d == MOVE_UP || d == MOVE_DOWN )) + return 1; +#endif + /* through dying explosions */ + if(isexplosion(into)) + return 1; + /* can kill players if already moving */ + if(into == PIECE_PLAYER_ONE && fast) + return 1; + if(into == PIECE_PLAYER_TWO && fast) + return 1; + } + return 0; + } + + /* Circles */ + if(p == PIECE_CIRCLE) + { + /* are stopped by everything other than empty space */ + if(into == PIECE_SPACE) + return 1; + /* and dying explosions */ + if(isexplosion(into)) + return 1; + return 0; + } + + return 0; +} + +int canbepushed(int p, int into, int d, int mode) +{ + /* Determine whether a piece can be pushed by the player */ + + /* Arrows and bombs */ + if(p >= PIECE_MOVERS_FIRST && p<= PIECE_MOVERS_LAST) + { + /* can be pushed, but not against their natural direction */ + if(d != ((p + 2) % 4)) + { + /* into empty space or through dots */ + if(into == PIECE_SPACE || into == PIECE_DOTS) + return 1; +#ifdef XOR_COMPATIBILITY + /* through directional dots if appropriate */ + if(into == PIECE_DOTS_X && (d == MOVE_LEFT || d == MOVE_RIGHT)) + return 1; + if(into == PIECE_DOTS_Y && (d == MOVE_UP || d == MOVE_DOWN)) + return 1; +#endif + } + return 0; + } + + /* Circles can be pushed in any direction */ + if(p == PIECE_CIRCLE +#ifdef ENIGMA_COMPATIBILITY + || p == PIECE_CIRCLE_DOUBLE +#endif + ) + { + /* into empty space */ + if(into == PIECE_SPACE) + return 1; +#ifdef XOR_COMPATIBILITY + /* XOR won't let circles (dolls) pass through dots */ + if(mode == MODE_XOR) + return 0; +#endif + /* pushed through dots */ + if(into == PIECE_DOTS) + return 1; + return 0; + } + + return 0; +} + +int canexplode(int p, int i, int d, int fast, int mode) +{ + /* Only an already moving arrow or bomb can act as a detonator */ + if(fast == 0) + return 0; + + /* Arrows can detonate bombs */ + if(p >= PIECE_ARROW_RED_LEFT && p<= PIECE_ARROW_RED_DOWN && + i >= PIECE_BOMB_RED_LEFT && i<= PIECE_BOMB_RED_DOWN) + return 1; + if(p >= PIECE_ARROW_GREEN_LEFT && p<= PIECE_ARROW_GREEN_DOWN && + i >= PIECE_BOMB_GREEN_LEFT && i<= PIECE_BOMB_GREEN_DOWN) + return 1; + if(p >= PIECE_ARROW_BLUE_LEFT && p<= PIECE_ARROW_BLUE_DOWN && + i >= PIECE_BOMB_BLUE_LEFT && i<= PIECE_BOMB_BLUE_DOWN) + return 1; + +#ifdef ENIGMA_COMPATIBILITY + /* Enigma requires a moving arrow to detonate a stationary bomb, and + does not permit bombs to detonate other bombs */ + if(mode == MODE_ENIGMA) + return 0; +#endif + + /* Bombs can be detonated by arrows pointing towards them */ + if(p >= PIECE_BOMB_RED_LEFT && p<= PIECE_BOMB_RED_DOWN && + i == (PIECE_ARROW_RED_LEFT + ((d + 2) % 4))) + return 1; + if(p >= PIECE_BOMB_GREEN_LEFT && p<= PIECE_BOMB_GREEN_DOWN && + i == (PIECE_ARROW_GREEN_LEFT + ((d + 2) % 4))) + return 1; + if(p >= PIECE_BOMB_BLUE_LEFT && p<= PIECE_BOMB_BLUE_DOWN && + i == (PIECE_ARROW_BLUE_LEFT + ((d + 2) % 4))) + return 1; + + /* Bombs can detonate other bombs */ + if(p >= PIECE_BOMB_RED_LEFT && p<= PIECE_BOMB_RED_DOWN && + i >= PIECE_BOMB_RED_LEFT && i<= PIECE_BOMB_RED_DOWN) + return 1; + if(p >= PIECE_BOMB_GREEN_LEFT && p<= PIECE_BOMB_GREEN_DOWN && + i >= PIECE_BOMB_GREEN_LEFT && i<= PIECE_BOMB_GREEN_DOWN) + return 1; + if(p >= PIECE_BOMB_BLUE_LEFT && p<= PIECE_BOMB_BLUE_DOWN && + i >= PIECE_BOMB_BLUE_LEFT && i<= PIECE_BOMB_BLUE_DOWN) + return 1; + + return 0; +} + +struct mover* mover_newundo(struct level* plevel, int x, int y, int d, int piece, int previous, int flags) +{ + struct mover* pmover; + + static int count = 0; + + if(plevel->flags & LEVELFLAG_NOUNDO) + return NULL; + + pmover = (struct mover*)malloc(sizeof(struct mover)); + if(pmover == NULL) + fatal("Out of memory in mover_newundo()"); + + pmover->x = x; + pmover->y = y; + pmover->direction = d; + pmover->piece = piece; + pmover->piece_previous = previous; + pmover->next = NULL; + pmover->previous = plevel->mover_last; + + if(flags & MOVER_FAST) + pmover->fast = 1; + else + pmover->fast = 0; + + if(flags & MOVER_UNDO) + { + level_setmoving(plevel, pmover->x, pmover->y, pmover->direction); + + if(options_debug & DEBUG_MOVERS) + { + if(plevel->mover_first == NULL) + count = 0; + + fprintf(stderr, "[%d] Cosmetic mover at (%d,%d) is %s was %s (direction=%c) (flags=%d)\n", + count ++, pmover->x, pmover->y, + piece_name[pmover->piece], piece_name[pmover->piece_previous], + directiontochar(pmover->direction), pmover->fast); + } + + if(plevel->mover_first == NULL) + plevel->mover_first = pmover; + + if(plevel->mover_last != NULL) + plevel->mover_last->next = pmover; + + plevel->mover_last = pmover; + + } + + if(flags & MOVER_STORE) + { + pmover->previous = plevel->move_current->mover_last; + pmover->next = NULL; + + if(plevel->move_current->mover_first == NULL) + plevel->move_current->mover_first = pmover; + if(plevel->move_current->mover_last != NULL) + plevel->move_current->mover_last->next = pmover; + plevel->move_current->mover_last = pmover; + + } + + return pmover; +} + + +int level_undo(struct level* plevel) +{ + struct mover* pmover; + struct mover* ptmp; + struct mover* pmoverfirst; + + int d, td; + + int count = 0; + + /* Can't undo if the level has no undo data (eg, a partial save) */ + if(plevel->move_first == NULL || (plevel->move_first->mover_first == NULL && plevel->move_current != plevel->move_first)) + return 0; + + /* Working backwards, undo any changes made to the map by movers in the + previous step. */ + pmoverfirst = NULL; + pmover = plevel->mover_first; + while(pmover != NULL) + { + pmoverfirst = pmover; + pmover = pmover->next; + } + pmover = pmoverfirst; + while(pmover != NULL) + { + /* Not setting SPACEs fixes a pathological case without apparently breaking anything (1.07) */ + if(pmover->piece != PIECE_SPACE) + { + level_setpiece(plevel, pmover->x, pmover->y, pmover->piece); + if(options_debug & DEBUG_MOVERS) + fprintf(stderr, "+ level_setpiece(%d, %d, %s)\n", pmover->x, pmover->y, piece_name[pmover->piece]); + } + + pmover = pmover->previous; + if(pmover == NULL) + break; + } + + /* Is player one still alive? */ + if(level_piece(plevel, plevel->player_x[0], plevel->player_y[0]) != PIECE_PLAYER_ONE) + plevel->alive[0] = 0; + /* Is player two still alive? */ + if(level_piece(plevel, plevel->player_x[1], plevel->player_y[1]) != PIECE_PLAYER_TWO) + plevel->alive[1] = 0; + + /* Tidy up any movers created in the previous step */ + pmover = plevel->mover_first; + while(pmover != NULL) + { + level_setmoving(plevel, pmover->x, pmover->y, MOVE_NONE); + level_setprevious(plevel, pmover->x, pmover->y, PIECE_SPACE); + ptmp = pmover; + pmover = pmover->next; + free(ptmp); + } + plevel->mover_first = NULL; + plevel->mover_last = NULL; + + /* Can't undo at very start of level */ + if(plevel->move_current == NULL) + return 0; + + /* If there is no previous step to undo, remove this move entirely */ + if(plevel->move_current->mover_last == NULL) + { + plevel->move_current = plevel->move_current->previous; + plevel->flags |= LEVELFLAG_MOVES; + + return 0; + } + + if(options_debug & DEBUG_MOVERS) + fprintf(stderr, "\n"); + + /* Start from the last mover for this step. */ + pmover = plevel->move_current->mover_last; + + pmoverfirst = NULL; + + td = MOVE_NONE; + + /* Working backwards, remove these pieces from the map */ + while(pmover != NULL) + { + pmoverfirst = pmover; + + level_setpiece(plevel, pmover->x, pmover->y, PIECE_SPACE); + + if(options_debug & DEBUG_MOVERS) + fprintf(stderr, "- level_setpiece(%d, %d, %s)\n", pmover->x, pmover->y, piece_name[PIECE_SPACE]); + + /* If the piece is the player, update position and status */ + if(pmover->piece_previous == PIECE_PLAYER_ONE || pmover->piece_previous == PIECE_PLAYER_TWO) + { + plevel->player_x[pmover->piece_previous - PIECE_PLAYER_ONE] = pmover->x; + plevel->player_y[pmover->piece_previous - PIECE_PLAYER_ONE] = pmover->y; + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + { + /* If a player is being resurrected in this move, and the + other player is alive, undo the automatic swap */ + if(plevel->alive[pmover->piece_previous - PIECE_PLAYER_ONE] == 0 && plevel->alive[plevel->player]) + { + /* Cosmetic mover to deactivate other player */ + mover_newundo(plevel, plevel->player_x[plevel->player], plevel->player_y[plevel->player], MOVE_SWAPPED, PIECE_PLAYER_ONE + plevel->player, PIECE_SPACE, MOVER_UNDO); + plevel->player = pmover->piece_previous - PIECE_PLAYER_ONE; + } + + /* The active player is the one which moves first + (last in undo */ + plevel->player = pmover->piece_previous - PIECE_PLAYER_ONE; + } +#endif + + plevel->alive[pmover->piece_previous - PIECE_PLAYER_ONE] = 1; + } + +#ifdef XOR_COMPATIBILITY + /* If the piece is a teleport, store the direction of the original move + into it for later use. */ + if(pmover->piece == PIECE_TELEPORT) + td = pmover->direction; +#endif + + /* until we reach the first mover for this step. */ + pmover = pmover->previous; + if(pmover != NULL && pmover->fast == 0) + break; + } + + pmover = pmoverfirst; + + /* Now, move forwards through the movers and create cosmetic effects. */ + while(pmover != NULL) + { + + if(options_debug & DEBUG_MOVERS) + fprintf(stderr, "[%d] Undo mover at (%d,%d) is %s was %s (direction=%c) (flags=%d)\n", + count++, pmover->x, pmover->y, + piece_name[pmover->piece], piece_name[pmover->piece_previous], + directiontochar(pmover->direction), pmover->fast); + + d = pmover->direction; + + if(d != MOVE_NONE && d != MOVE_SWAP && d != MOVE_SWAPPED) + d = (d + 2) % 4; + + if(isexplosion(pmover->piece)) + { + /* Explosions don't move. */ + d = MOVE_NONE; + /* Show dying explosion when undoing new explosion */ + if(options_debug & DEBUG_MOVERS) + fprintf(stderr, "* level_setprevious(%d, %d, %s)\n", pmover->x, pmover->y, piece_name[pmover->piece]); + level_setprevious(plevel, pmover->x, pmover->y, pmover->piece); + } + + /* Do we need to patch up the direction this piece is moving in? */ + /* Is it the player? */ + if((pmover->piece_previous == PIECE_PLAYER_ONE || pmover->piece_previous == PIECE_PLAYER_TWO) && (pmover->piece == PIECE_SPACE || pmover->piece == PIECE_GONE)) + { + /* If so, are they moving out of a teleport? Use original direction + of move if so. */ + if(td != MOVE_NONE) + d = (td + 2) % 4; + } + /* Otherwise, if the previous piece wasn't a move, it must have been a + static piece being eaten by a mover, and thus shouldn't move. */ + else if((pmover->piece_previous < PIECE_MOVERS_FIRST || pmover->piece_previous > PIECE_MOVERS_LAST) && pmover->piece_previous != PIECE_CIRCLE +#ifdef ENIGMA_COMPATIBILITY + && pmover->piece_previous != PIECE_CIRCLE_DOUBLE +#endif + ) + d = MOVE_NONE; + + /* Plot a cosmetic mover. */ + if(level_previous(plevel, pmover->x, pmover->y) != PIECE_SPACE) + d = MOVE_NONE; + /* but not if there are overlapping explosions */ + if(!(pmover->piece_previous >= PIECE_EXPLOSION_NEW_FIRST && pmover->piece_previous <= PIECE_EXPLOSION_NEW_LAST)) + mover_newundo(plevel, pmover->x, pmover->y, d, pmover->piece_previous, PIECE_SPACE, MOVER_UNDO); + + pmover = pmover->next; + } + + pmover = pmoverfirst->previous; + + /* If there is another step, set it up for the next iteration */ + if(pmover != NULL) + { + plevel->move_current->mover_last = pmover; + pmover = pmover->next; + } + else + { + pmover = plevel->move_current->mover_first; + plevel->move_current->mover_first = NULL; + plevel->move_current->mover_last = NULL; + + plevel->moves --; + } + + /* Remove the movers in the step we've just done */ + if(pmover != NULL) + { + while(pmover != NULL) + { + /* Undo any pieces exploded or caught */ + if(pmover->piece_previous == PIECE_STAR) + { + if(pmover->piece == PIECE_PLAYER_ONE || pmover->piece == PIECE_PLAYER_TWO) + plevel->stars_caught --; + else + plevel->stars_exploded --; + + plevel->flags |= LEVELFLAG_STARS; + } +#ifdef XOR_COMPATIBILITY + if(pmover->piece_previous == PIECE_SWITCH) + { + plevel->switched = 1 - plevel->switched; + plevel->flags |= LEVELFLAG_SWITCH; + } + if(pmover->piece_previous == PIECE_MAP_TOP_LEFT) + { + plevel->mapped ^= MAPPED_TOP_LEFT; + plevel->flags |= LEVELFLAG_MAP; + } + if(pmover->piece_previous == PIECE_MAP_TOP_RIGHT) + { + plevel->mapped ^= MAPPED_TOP_RIGHT; + plevel->flags |= LEVELFLAG_MAP; + } + if(pmover->piece_previous == PIECE_MAP_BOTTOM_LEFT) + { + plevel->mapped ^= MAPPED_BOTTOM_LEFT; + plevel->flags |= LEVELFLAG_MAP; + } + if(pmover->piece_previous == PIECE_MAP_BOTTOM_RIGHT) + { + plevel->mapped ^= MAPPED_BOTTOM_RIGHT; + plevel->flags |= LEVELFLAG_MAP; + } +#endif + + ptmp = pmover; + pmover = pmover->next; + free(ptmp); + } + } + + if(plevel->move_current->mover_last != NULL) + plevel->move_current->mover_last->next = NULL; + + /* If the move was a swap, revert to the previous player */ + if(plevel->move_current->direction == MOVE_SWAP) + plevel->player = 1 - plevel->player; + + /* Have we just undone failure? */ + if((plevel->flags & LEVELFLAG_FAILED) && (plevel->alive[0] != 0 || plevel->alive[1] != 0)) + { + plevel->flags &= ~LEVELFLAG_FAILED; + plevel->flags |= LEVELFLAG_MOVES; + } + + /* Have we just undone success? */ + if(plevel->flags & (LEVELFLAG_SOLVED | LEVELFLAG_EXIT)) + { + plevel->flags &= ~LEVELFLAG_SOLVED; + plevel->flags &= ~LEVELFLAG_EXIT; + plevel->flags |= LEVELFLAG_STARS; + } + +#ifdef XOR_COMPATIBILITY + if(plevel->mode == MODE_XOR) + xor_focus(plevel); +#endif + + /* If there are no more steps in this move, chroma-curses needs advanced + warning that the move counter is going to change. */ + if(plevel->move_current->mover_last == NULL) + { + plevel->flags |= LEVELFLAG_MOVES; + } + + return 1; +} diff --git a/enigma.c b/enigma.c new file mode 100644 index 0000000..274fdf2 --- /dev/null +++ b/enigma.c @@ -0,0 +1,312 @@ +/* + enigma.c + + A reverse engineering of the original Enigma game engine. This maintains + the usual list of movers, and a separate stack of spaces to be considered. + In each round, we examine this stack to generate fresh movers, then examine + those movers to determine whether newly exposed spaces should be added to + the stack, and also to generate further movers for the next round. + + See levels/regression/enigma-regression.chroma for some subtleties this + catches that aren't handled correctly by the Chroma game engine. Such + situations don't seem to occur in the original Enigma levels, however. + + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include + +#include "chroma.h" +#include "level.h" +#include "util.h" + +#ifdef ENIGMA_COMPATIBILITY + +extern int move_x[]; +extern int move_y[]; +extern int enigma_move_order[]; + +int enigma_move(struct level* plevel, int move) +{ + int px, py; + int dx, dy; + int p; + int into; + + if(plevel->alive[plevel->player] == 0) + return 0; + if(move == MOVE_SWAP) + return 0; + + px = plevel->player_x[plevel->player]; + py = plevel->player_y[plevel->player]; + + dx = px + move_x[move]; + dy = py + move_y[move]; + + /* Can we make the move? */ + p = level_piece(plevel, dx, dy); + switch(p) + { + /* Pieces that can be collected */ + case PIECE_SPACE: + case PIECE_DOTS: + case PIECE_DOTS_DOUBLE: + break; + case PIECE_STAR: + plevel->stars_caught ++; + plevel->flags |= LEVELFLAG_STARS; + break; + case PIECE_DOOR: + if(plevel->stars_caught == plevel->stars_total) + plevel->flags |= LEVELFLAG_EXIT; + else + return 0; + break; + /* Pieces that can be pushed */ + case PIECE_ARROW_RED_LEFT: + case PIECE_ARROW_RED_RIGHT: + case PIECE_ARROW_RED_UP: + case PIECE_ARROW_RED_DOWN: + case PIECE_BOMB_RED_LEFT: + case PIECE_BOMB_RED_RIGHT: + case PIECE_BOMB_RED_UP: + case PIECE_BOMB_RED_DOWN: + /* Can't push against gravity */ + if(((level_piece(plevel, dx, dy) + 2) % 4) == move) + return 0; + /* fallthrough */ + case PIECE_CIRCLE: + case PIECE_CIRCLE_DOUBLE: + /* Can't push into other pieces */ + into = level_piece(plevel, dx + move_x[move], dy + move_y[move]); + if(into != PIECE_SPACE && into != PIECE_DOTS) + return 0; + mover_new(plevel, dx + move_x[move], dy + move_y[move], move, p, 0); + break; + + /* Can't move */ + default: + return 0; + } + + mover_new(plevel, dx, dy, move, PIECE_PLAYER_ONE + plevel->player, 0); + mover_new(plevel, px, py, move, PIECE_SPACE, 0); + level_setmoving(plevel, px, py, MOVE_NONE); + plevel->player_x[plevel->player] = dx; + plevel->player_y[plevel->player] = dy; + mover_addtostack(plevel, px, py, move); + + return 1; +} + +int enigma_evolve(struct level* plevel) +{ + struct mover* pmover; + struct mover* ptmp; + + int into; + + int d; + int i, p, ep; + + int px, py; + int dx, dy; + + int ok; + + ok = 0; + while(!ok) + { + /* Examine the stack, and generate movers from it */ + pmover = plevel->stack_first; + while(pmover != NULL) + { + /* Can anything fall into this space? */ + for(i = 0; i < 4; i ++) + { + d = enigma_move_order[i]; + px = pmover->x - move_x[d]; + py = pmover->y - move_y[d]; + p = level_piece(plevel, px, py); + if(p >= PIECE_ARROW_RED_LEFT && p <= PIECE_BOMB_RED_DOWN && (p % 4 == d)) + { + if(level_moving(plevel, px, py) == MOVE_NONE) + { + mover_new(plevel, px, py, d, p, 1); + i = 4; + } + } + } + ptmp = pmover; + pmover = pmover->next; + free(ptmp); + } + plevel->stack_first = NULL; + plevel->stack_last = NULL; + + /* Examine the movers, adding new movers to a separate list */ + pmover = plevel->mover_first; + plevel->mover_first = NULL; + plevel->mover_last = NULL; + while(pmover != NULL) + { + level_setmoving(plevel, pmover->x, pmover->y, MOVE_NONE); + level_setprevious(plevel, pmover->x, pmover->y, PIECE_SPACE); + level_setpreviousmoving(plevel, pmover->x, pmover->y, MOVE_NONE); + level_setdetonator(plevel, pmover->x, pmover->y, PIECE_SPACE); + level_setdetonatormoving(plevel, pmover->x, pmover->y, MOVE_NONE); + + p = pmover->piece; + if(p == PIECE_EXPLOSION_RED_HORIZONTAL || p == PIECE_EXPLOSION_RED_VERTICAL) + { + mover_new(plevel, pmover->x, pmover->y, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(plevel, pmover->x, pmover->y, MOVE_NONE); + if(p == PIECE_EXPLOSION_RED_HORIZONTAL) + { + if(pmover->x - 1 > 0) + { + mover_new(plevel, pmover->x - 1, pmover->y, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(plevel, pmover->x - 1, pmover->y, MOVE_NONE); + } + if(pmover->x + 1 < plevel->size_x - 1) + { + mover_new(plevel, pmover->x + 1, pmover->y, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(plevel, pmover->x + 1, pmover->y, MOVE_NONE); + } + } + else + { + if(pmover->y - 1 > 0) + { + mover_new(plevel, pmover->x, pmover->y - 1, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(plevel, pmover->x, pmover->y - 1, MOVE_NONE); + } + if(pmover->y + 1 < plevel->size_y - 1) + { + mover_new(plevel, pmover->x, pmover->y + 1, MOVE_NONE, PIECE_SPACE, 0); + mover_addtostack(plevel, pmover->x, pmover->y + 1, MOVE_NONE); + } + } + } + if((p >= PIECE_ARROW_RED_LEFT && p <= PIECE_BOMB_RED_DOWN) || p == PIECE_CIRCLE) + { + if(p == PIECE_CIRCLE) + d = pmover->direction; + else + d = p % 4; + dx = pmover->x + move_x[d]; + dy = pmover->y + move_y[d]; + + into = level_piece(plevel, dx, dy); + /* Can it detonate something? */ + if(p >= PIECE_ARROW_RED_LEFT && p <= PIECE_ARROW_RED_DOWN && into >= PIECE_BOMB_RED_LEFT && into <= PIECE_BOMB_RED_DOWN && pmover->fast && level_moving(plevel, dx, dy) == MOVE_NONE) + { + /* Add the central explosion to the stack */ + mover_new(plevel, pmover->x, pmover->y, d, PIECE_SPACE, 0); + level_setprevious(plevel, dx, dy, into); + level_setdetonator(plevel, dx, dy, p); + level_setdetonatormoving(plevel, dx, dy, d); + mover_addtostack(plevel, pmover->x, pmover->y, MOVE_NONE); + + /* Generate cosmetic side explosions */ + if(into % 2) + { + if(dx - 1 > 0) + { + ep = level_piece(plevel, dx - 1, dy); + if(ep == PIECE_STAR) + { + plevel->stars_exploded ++; + plevel->flags |= LEVELFLAG_STARS; + } + level_setmoving(plevel, dx - 1, dy, MOVE_NONE); + mover_new(plevel, dx - 1, dy, level_moving(plevel, dx - 1, dy), PIECE_EXPLOSION_RED_LEFT, 1); + level_setprevious(plevel, dx - 1, dy, ep); + } + if(dx + 1 < plevel->size_x - 1) + { + ep = level_piece(plevel, dx + 1, dy); + if(ep == PIECE_STAR) + { + plevel->stars_exploded ++; + plevel->flags |= LEVELFLAG_STARS; + } + level_setmoving(plevel, dx + 1, dy, MOVE_NONE); + mover_new(plevel, dx + 1, dy, level_moving(plevel, dx + 1, dy), PIECE_EXPLOSION_RED_RIGHT, 0); + level_setprevious(plevel, dx + 1, dy, ep); + } + mover_new(plevel, dx, dy, MOVE_NONE, PIECE_EXPLOSION_RED_HORIZONTAL, 0); + } + else + { + if(dy - 1 > 0) + { + ep = level_piece(plevel, dx, dy - 1); + if(ep == PIECE_STAR) + { + plevel->stars_exploded ++; + plevel->flags |= LEVELFLAG_STARS; + } + level_setmoving(plevel, dx, dy - 1, MOVE_NONE); + mover_new(plevel, dx, dy - 1, level_moving(plevel, dx, dy - 1), PIECE_EXPLOSION_RED_TOP, 0); + level_setprevious(plevel, dx, dy - 1, ep); + } + if(dy + 1 < plevel->size_y - 1) + { + ep = level_piece(plevel, dx, dy + 1); + if(ep == PIECE_STAR) + { + plevel->stars_exploded ++; + plevel->flags |= LEVELFLAG_STARS; + } + level_setmoving(plevel, dx, dy + 1, MOVE_NONE); + mover_new(plevel, dx, dy + 1, level_moving(plevel, dx, dy + 1), PIECE_EXPLOSION_RED_BOTTOM, 0); + level_setprevious(plevel, dx, dy + 1, ep); + } + mover_new(plevel, dx, dy, MOVE_NONE, PIECE_EXPLOSION_RED_VERTICAL, 0); + } + } + /* Can it keep moving? */ + else if(into == PIECE_SPACE || ((into == PIECE_DOTS || into == PIECE_PLAYER_ONE) && p != PIECE_CIRCLE && pmover->fast == 1)) + { + mover_new(plevel, dx, dy, d, p, 1); + mover_new(plevel, pmover->x, pmover->y, d, PIECE_SPACE, 0); + level_setmoving(plevel, pmover->x, pmover->y, MOVE_NONE); + mover_addtostack(plevel, pmover->x, pmover->y, MOVE_NONE); + } + } + + ptmp = pmover->next; + free(pmover); + pmover = ptmp; + } + + if(plevel->mover_first != NULL || plevel->stack_first == NULL) + ok = 1; + } + + /* Is player one still alive? */ + if(level_piece(plevel, plevel->player_x[0], plevel->player_y[0]) != PIECE_PLAYER_ONE) + plevel->alive[0] = 0; + + return 0; +} + +#endif diff --git a/graphics.c b/graphics.c new file mode 100644 index 0000000..be2090d --- /dev/null +++ b/graphics.c @@ -0,0 +1,1746 @@ +/* + graphics.c + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "chroma.h" +#include "level.h" +#include "colours.h" +#include "graphics.h" +#include "util.h" +#include "sdlfont.h" +#include "menu.h" +#include "xmlparser.h" + +struct graphics* pdisplaygraphics = NULL; + +extern char *piece_name[]; +extern char options_graphics[]; +extern struct colours* pdisplaycolours; +extern struct level* plevelcurrent; + +extern int options_sdl_size_x; +extern int options_sdl_size_y; +extern int options_graphic_level; +extern int options_debug; +#ifdef XOR_COMPATIBILITY +extern int options_xor_display; +#endif +extern int screen_width; +extern int screen_height; +extern int screen_flags; + +extern int font_height; +extern int font_height_game; +extern int font_size_menu; +extern int font_size_game; + +void graphics_createfromfont(struct graphics *pgraphics); +SDL_Surface* graphics_scaleimage(SDL_Surface*, int, int); + +struct graphics* graphics_load(char *filename, int partial); + +#define SIZE_HUGE 1000000 + +void graphics_init() +{ + char filename[FILENAME_MAX]; + char directory[FILENAME_MAX]; + + if(pdisplaygraphics != NULL) + graphics_delete(pdisplaygraphics); + + pdisplaygraphics = graphics_load(options_graphics, 0); + + if(pdisplaygraphics == NULL) + { + /* Revert to default */ + getfilename("graphics", directory, 0, LOCATION_SYSTEM); + sprintf(filename, "%s%s%s", directory, "/", GRAPHICS_DEFAULT); + pdisplaygraphics = graphics_load(filename, 0); + + /* If we can't even load the default, use a curses based scheme */ + if(pdisplaygraphics == NULL) + pdisplaygraphics = graphics_load(NULL, 0); + } +} + +void graphics_delete(struct graphics* pgraphics) +{ + int i, j; + struct graphicssize* psize; + struct graphicssize* psizetmp; + struct shadow* pshadow; + struct shadow* pshadowtmp; + + for(i = 0; i < PIECE_MAX; i ++) + { + for(j = 0; j < IMAGE_MAX; j ++) + { + if(pgraphics->image[i][j] != NULL && !(pgraphics->image_flags[i] & GRAPHICS_CLONE)) + SDL_FreeSurface(pgraphics->image[i][j]); + } + } + + if(pgraphics->title != NULL) + free(pgraphics->title); + + psize = pgraphics->sizes; + while(psize != NULL) + { + psizetmp = psize; + psize = psize->next; + free(psizetmp); + } + + pshadow = pgraphics->shadows; + while(pshadow != NULL) + { + pshadowtmp = pshadow; + pshadow = pshadow->next; + free(pshadowtmp); + } + + free(pgraphics); +} + +void graphics_createfromfont(struct graphics* pgraphics) +{ + int piece; + struct SDL_Surface* psurface; + struct SDL_Surface* psurfacetmp; + SDL_Rect drect; + char buffer[4]; + int fg, bg, tg; + int size_x, size_y; + int reverse; + + /* Slightly smaller to ensure j's and g's fit within piece */ + font_set_size(pgraphics->size_y * 0.8); + + pgraphics->small_size_x = font_height_game; + pgraphics->small_size_y = font_height_game; + + if(pdisplaycolours == NULL) + return; + + /* Create pieces */ + for(piece = 0; piece < PIECE_MAX; piece ++) + { + size_x = pgraphics->size_x; + size_y = pgraphics->size_y; + + if(piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + size_x = pgraphics->size_x * 2; + +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + psurface = SDL_CreateRGBSurface(screen_flags, size_x, size_y, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + psurface = SDL_CreateRGBSurface(screen_flags, size_x, size_y, 32, 0xff, 0xff00, 0xff0000, 0xff000000); +#endif + SDL_FillRect(psurface, NULL, SDL_MapRGBA(psurface->format, 0, 0, 0, 255) ); + + fg = pdisplaycolours->foreground[piece]; + bg = pdisplaycolours->background[piece]; + reverse = pdisplaycolours->reverse[piece]; + + /* Player pieces are special. The swapped in piece always takes player + one's colours, which we force here */ + if(piece == PIECE_PLAYER_TWO) + { + fg = pdisplaycolours->foreground[PIECE_PLAYER_ONE]; + bg = pdisplaycolours->background[PIECE_PLAYER_ONE]; + reverse = pdisplaycolours->reverse[PIECE_PLAYER_ONE]; + } + + if(reverse) + { + tg = fg; fg = bg; bg = tg; + } + if(fg == -1) + fg = 0; + if(bg == -1 && (piece == PIECE_SPACE || isexplosion(piece))) + bg = 0; + + if(bg != -1) + { + drect.x = 0; + drect.y = 0; + drect.w = pgraphics->size_x; + drect.h = pgraphics->size_y; + SDL_FillRect(psurface, &drect, SDL_MapRGB(psurface->format, bg & 1 ? 255 : 0, bg & 2 ? 255 : 0, bg & 4 ? 255 : 0)); + } + sprintf(buffer, "%c", pdisplaycolours->character[piece]); + psurfacetmp = font_render(buffer, fg); + drect.x = (pgraphics->size_x - psurfacetmp->w) / 2; + drect.y = (pgraphics->size_y - psurfacetmp->h) / 2; + SDL_BlitSurface(psurfacetmp, NULL, psurface, &drect); + SDL_FreeSurface(psurfacetmp); + + /* Player pieces get a second image for when they're swapped out. + The swapped out piece always takes player two's colours. */ + if(piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + { + fg = pdisplaycolours->foreground[PIECE_PLAYER_TWO]; + bg = pdisplaycolours->background[PIECE_PLAYER_TWO]; + + if(pdisplaycolours->reverse[PIECE_PLAYER_TWO]) + { + tg = fg; fg = bg; bg = tg; + } + if(fg == -1) + fg = 0; + + if(bg != -1) + { + drect.x = pgraphics->size_x; + drect.y = 0; + drect.w = pgraphics->size_x; + drect.h = pgraphics->size_y; + SDL_FillRect(psurface, &drect, SDL_MapRGB(psurface->format, bg & 1 ? 255 : 0, bg & 2 ? 255 : 0, bg & 4 ? 255 : 0)); + } + sprintf(buffer, "%c", pdisplaycolours->character[piece]); + psurfacetmp = font_render(buffer, fg); + drect.x = pgraphics->size_x + ((pgraphics->size_x - psurfacetmp->w) / 2); + drect.y = (pgraphics->size_y - psurfacetmp->h) / 2; + SDL_BlitSurface(psurfacetmp, NULL, psurface, &drect); + SDL_FreeSurface(psurfacetmp); + + } + + if(bg == -1 || piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + pgraphics->image[piece][IMAGE_PIECE] = SDL_DisplayFormatAlpha(psurface); + else + pgraphics->image[piece][IMAGE_PIECE] = SDL_DisplayFormat(psurface); + SDL_FreeSurface(psurface); + + } + + /* Create small pieces */ + font_set_size(font_size_game); + + for(piece = 0; piece < PIECE_MAX; piece ++) + { + /* but only for the pieces we need */ + if(piece != PIECE_PLAYER_ONE && piece != PIECE_PLAYER_TWO && + piece != PIECE_STAR && piece != PIECE_DOOR) + continue; + + size_x = pgraphics->small_size_x; + size_y = pgraphics->small_size_y; + + if(piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + size_x = pgraphics->size_x * 2; + +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + psurface = SDL_CreateRGBSurface(screen_flags, size_x, size_y, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + psurface = SDL_CreateRGBSurface(screen_flags, size_x, size_y, 32, 0xff, 0xff00, 0xff0000, 0xff000000); +#endif + SDL_FillRect(psurface, NULL, SDL_MapRGBA(psurface->format, 0, 0, 0, 255) ); + + fg = pdisplaycolours->foreground[piece]; + bg = pdisplaycolours->background[piece]; + reverse = pdisplaycolours->reverse[piece]; + + /* Player pieces are special. The swapped in piece always takes player + one's colours, which we force here */ + if(piece == PIECE_PLAYER_TWO) + { + fg = pdisplaycolours->foreground[PIECE_PLAYER_ONE]; + bg = pdisplaycolours->background[PIECE_PLAYER_ONE]; + reverse = pdisplaycolours->reverse[PIECE_PLAYER_ONE]; + } + + if(reverse) + { + tg = fg; fg = bg; bg = tg; + } + if(fg == -1) + fg = 0; + if(bg == -1) + bg = 0; + + drect.x = 0; + drect.y = 0; + drect.w = font_height_game; + drect.h = font_height_game; + SDL_FillRect(psurface, &drect, SDL_MapRGB(psurface->format, bg & 1 ? 255 : 0, bg & 2 ? 255 : 0, bg & 4 ? 255 : 0)); + + sprintf(buffer, "%c", pdisplaycolours->character[piece]); + psurfacetmp = font_render(buffer, fg); + drect.x = (font_height_game - psurfacetmp->w) / 2; + drect.y = (psurface->h - psurfacetmp->h) / 2; + SDL_BlitSurface(psurfacetmp, NULL, psurface, &drect); + SDL_FreeSurface(psurfacetmp); + + /* Player pieces get a second image for when they're swapped out. + The swapped out piece always takes player two's colours. */ + if(piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + { + fg = pdisplaycolours->foreground[PIECE_PLAYER_TWO]; + bg = pdisplaycolours->background[PIECE_PLAYER_TWO]; + + if(pdisplaycolours->reverse[PIECE_PLAYER_TWO]) + { + tg = fg; fg = bg; bg = tg; + } + if(fg == -1) + fg = 0; + + if(bg != -1) + { + drect.x = font_height_game; + drect.y = 0; + drect.w = font_height_game; + drect.h = font_height_game; + SDL_FillRect(psurface, &drect, SDL_MapRGB(psurface->format, bg & 1 ? 255 : 0, bg & 2 ? 255 : 0, bg & 4 ? 255 : 0)); + } + sprintf(buffer, "%c", pdisplaycolours->character[piece]); + psurfacetmp = font_render(buffer, fg); + drect.x = font_height_game + ((font_height_game - psurfacetmp->w) / 2); + drect.y = (psurface->h - psurfacetmp->h) / 2; + SDL_BlitSurface(psurfacetmp, NULL, psurface, &drect); + SDL_FreeSurface(psurfacetmp); + + } + + if(bg == -1 || piece == PIECE_PLAYER_ONE || piece == PIECE_PLAYER_TWO) + pgraphics->image[piece][IMAGE_SMALL] = SDL_DisplayFormatAlpha(psurface); + else + pgraphics->image[piece][IMAGE_SMALL] = SDL_DisplayFormat(psurface); + SDL_FreeSurface(psurface); + + } +} + +struct menu* graphics_menu() +{ + DIR *pdir; + struct dirent *dentry; + struct menu* pmenu; + struct menuentry* pentry; + char directory[FILENAME_MAX]; + char filename[FILENAME_MAX]; + struct graphics* pgraphics; + int location; + + pmenu = menu_new(gettext("Graphics Schemes")); + + menuentry_new(pmenu, gettext("Quit and return to previous menu"), 'Q', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + + menuentry_new(pmenu, gettext("Current graphics scheme:"), 0, MENU_NOTE); + + if(pdisplaygraphics == NULL) + menuentry_new(pmenu, gettext("** NONE **"), 0, MENU_NOTE | MENU_RIGHT); + else if(pdisplaygraphics->title == NULL) + menuentry_new(pmenu, gettext("[untitled graphics]"), 0, MENU_NOTE | MENU_RIGHT); + else if(pdisplaygraphics->flags & GRAPHICS_TRANSLATE) + menuentry_new(pmenu, gettext(pdisplaygraphics->title), 0, MENU_NOTE | MENU_RIGHT); + else + menuentry_new(pmenu, pdisplaygraphics->title, 0, MENU_NOTE | MENU_RIGHT); + + /* Global, then user */ + for(location = 1; location >= 0; location --) + { + getfilename("graphics", directory, 0, location); + + pdir = opendir(directory); + + if(pdir == NULL) + continue; + + while((dentry = readdir(pdir)) != NULL) + { + if(strcmp(dentry->d_name, ".") == 0) + continue; + if(strcmp(dentry->d_name, "..") == 0) + continue; + + sprintf(filename, "%s%s%s", directory, "/", dentry->d_name); + + if(isfile(filename) && strlen(filename) > 7 && strcmp(filename + strlen(filename) - 7, ".chroma") == 0) + { + pgraphics = graphics_load(filename, 1); + if(pgraphics != NULL) + { + if(pgraphics->title == NULL) + pentry = menuentry_newwithvalue(pmenu, gettext("[untitled graphics]"), 0, MENU_SORT, filename); + else if(pgraphics->flags & GRAPHICS_TRANSLATE) + pentry = menuentry_newwithvalue(pmenu, gettext(pgraphics->title), 0, MENU_SORT, filename); + else + pentry = menuentry_newwithvalue(pmenu, pgraphics->title, 0, MENU_SORT, filename); + + graphics_delete(pgraphics); + + if(strcmp(options_graphics, filename) == 0) + pmenu->entry_selected = pentry; + } + } + } + + closedir(pdir); + + menu_unsort(pmenu); + + if(location == 1) + menuentry_new(pmenu, "", 0, MENU_SPACE); + } + + menu_assignletters(pmenu); + + return pmenu; +} + +SDL_Surface *graphics_loadimage(char *filename) +{ + char fullfilename[FILENAME_MAX]; + char directory[FILENAME_MAX]; + + getfilename("graphics", directory, 0, LOCATION_SYSTEM); + sprintf(fullfilename, "%s%s%s", directory, "/", filename); + + return IMG_Load(fullfilename); +} + +struct menu* graphics_error(struct menu *pmenu, char *filename, struct parser *pparser, char *error) +{ + char buffer[256]; + + if(pmenu == NULL) + { + pmenu = menu_new(gettext("Graphics Errors")); + + menuentry_new(pmenu, gettext("Return to previous menu"), 'Q', 0); + menuentry_new(pmenu, "", 0, MENU_SPACE); + } + + if(pparser != NULL) + sprintf(buffer, "%d: %s", pparser->line, error); + else + sprintf(buffer, "%s", error); + + fprintf(stderr, gettext("In file '%s':\n"), filename); + fprintf(stderr, "%s\n", buffer); + + menuentry_new(pmenu, buffer, 0, MENU_SORT); + + return pmenu; +} + +int graphics_translatecolour(char *text, int *red, int *green, int *blue, int *alpha) +{ + char buffer[8]; + + /* #rrggbb */ + if(strlen(text) == 7 && text[0] == '#') + { + strcpy(buffer, "0xff"); + buffer[2] = text[1]; buffer[3] = text[2]; *red = strtol(buffer, NULL, 0); + buffer[2] = text[3]; buffer[3] = text[4]; *green = strtol(buffer, NULL, 0); + buffer[2] = text[5]; buffer[3] = text[6]; *blue = strtol(buffer, NULL, 0); + *alpha = 255; + return 1; + } + + /* #rrggbbaa */ + if(strlen(text) == 9 && text[0] == '#') + { + strcpy(buffer, "0xff"); + buffer[2] = text[1]; buffer[3] = text[2]; *red = strtol(buffer, NULL, 0); + buffer[2] = text[3]; buffer[3] = text[4]; *green = strtol(buffer, NULL, 0); + buffer[2] = text[5]; buffer[3] = text[6]; *blue = strtol(buffer, NULL, 0); + buffer[2] = text[7]; buffer[3] = text[8]; *alpha = strtol(buffer, NULL, 0); + return 1; + } + + /* #rgb */ + if(strlen(text) == 4 && text[0] == '#') + { + strcpy(buffer, "0xff"); + buffer[2] = text[1]; buffer[3] = text[1]; *red = strtol(buffer, NULL, 0); + buffer[2] = text[2]; buffer[3] = text[2]; *green = strtol(buffer, NULL, 0); + buffer[2] = text[3]; buffer[3] = text[3]; *blue = strtol(buffer, NULL, 0); + *alpha = 255; + return 1; + } + + /* #rgba */ + if(strlen(text) == 5 && text[0] == '#') + { + strcpy(buffer, "0xff"); + buffer[2] = text[1]; buffer[3] = text[1]; *red = strtol(buffer, NULL, 0); + buffer[2] = text[2]; buffer[3] = text[2]; *green = strtol(buffer, NULL, 0); + buffer[2] = text[3]; buffer[3] = text[3]; *blue = strtol(buffer, NULL, 0); + buffer[2] = text[4]; buffer[3] = text[4]; *alpha = strtol(buffer, NULL, 0); + return 1; + } + + /* Couldn't make sense of it */ + return 0; +} + +void graphics_addimage(struct graphics* pgraphics, int piece, int type, SDL_Surface* psurface) +{ + SDL_Surface *psurfacetmp; + SDL_Rect drect; + + if(psurface == NULL) + return; + + if(piece >= 0 && piece < PIECE_MAX) + { + /* If this is the first image, create a new piece image */ + if(pgraphics->image[piece][type] == NULL) + { + if(psurface->flags & SDL_SRCALPHA) + pgraphics->image[piece][type] = SDL_DisplayFormatAlpha(psurface); + else + pgraphics->image[piece][type] = SDL_DisplayFormat(psurface); + } + else + { + /* Otherwise, create a larger piece image */ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + psurfacetmp = SDL_CreateRGBSurface(screen_flags, pgraphics->image[piece][type]->w + psurface->w, pgraphics->image[piece][type]->h, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + psurfacetmp = SDL_CreateRGBSurface(screen_flags, pgraphics->image[piece][type]->w + psurface->w, pgraphics->image[piece][type]->h, 32, 0xff, 0xff00, 0xff0000, 0xff000000); +#endif + if(psurfacetmp == NULL) + fatal("Out of memory in graphics_addimage()"); + + SDL_SetAlpha(pgraphics->image[piece][type], 0, 0); + + /* Copy the old piece image into it */ + if(pgraphics->image_flags[piece] & GRAPHICS_KEY) + /* Copy as is; we'll deal with the keying later */ + SDL_SetAlpha(psurfacetmp, 0, 0); + else + SDL_SetAlpha(psurfacetmp, SDL_SRCALPHA, 255); + + SDL_BlitSurface(pgraphics->image[piece][type], NULL, psurfacetmp, NULL); + + /* Copy the new piece image into it */ + drect.x = pgraphics->image[piece][type]->w; + drect.y = 0; + drect.w = psurface->w; + drect.h = pgraphics->size_y; + + SDL_SetAlpha(psurface, 0, 0); + SDL_BlitSurface(psurface, NULL, psurfacetmp, &drect); + + /* Free the old piece image */ + SDL_FreeSurface(pgraphics->image[piece][type]); + + if(psurfacetmp->flags & SDL_SRCALPHA) + pgraphics->image[piece][type] = SDL_DisplayFormatAlpha(psurfacetmp); + else + pgraphics->image[piece][type] = SDL_DisplayFormat(psurfacetmp); + + SDL_FreeSurface(psurfacetmp); + + } + } +} + +int graphics_evaluate(struct graphics *pgraphics, char *text) +{ + int v, e; + + if(strcmp(text, "true") == 0) + return 1; + if(strcmp(text, "false") == 0) + return 0; + + if(strlen(text) > 2) + { + if(text[1] == '=') + { + switch(text[0]) + { + case 'x': + v = pgraphics->size_x; + break; + case 'y': + v = pgraphics->size_y; + break; + case 's': + v = pgraphics->small_size_x; + break; + case 't': + v = pgraphics->small_size_y; + break; + case 'l': + v = pgraphics->level; + break; + default: + return 0; + } + e = atoi(text + 2); + if(v == e) + return 1; + else + return 0; + } + } + + return 0; +} + +int graphics_evaluatesize(char *text, int base) +{ + if(strlen(text) > 0 && text[strlen(text) - 1] == '%') + return (int)(atof(text) * base / 100); + else + return atoi(text); +} + +struct graphics* graphics_load(char *filename, int partial) +{ + struct graphics* pgraphics; + struct graphicssize* psize; + struct graphicssize* psizetmp; + struct shadow* pshadow; + struct shadow* pshadowtmp; + struct parser* pparser; + struct menu* pmenu; + int i, j, k; + int state; + int piece; + int clone; + + int width, height, offset_x, offset_y; + int size_x, size_y; + + char basepath[FILENAME_MAX]; + char path[FILENAME_MAX]; + char file[FILENAME_MAX]; + char buffer[256]; + char c; + + SDL_Surface *psurface; + SDL_Surface *psurfacetmp; + SDL_Rect drect; + int imagetype; + int red, green, blue, alpha; + + int tg, fg, bg; + SDL_Rect rect; + int x, y, z, w, h; + int failed; + int flags; + + int shadow_flags[9] = + { + SHADOW_TOP_LEFT, SHADOW_TOP, SHADOW_TOP_RIGHT, + SHADOW_LEFT, SHADOW_MIDDLE, SHADOW_RIGHT, + SHADOW_BOTTOM_LEFT, SHADOW_BOTTOM, SHADOW_BOTTOM_RIGHT + }; + + if(filename != NULL && !isfile(filename)) + return NULL; + + pgraphics = (struct graphics*)malloc(sizeof(struct graphics)); + if(pgraphics == NULL) + fatal(gettext("Out of memory in graphics_load()")); + + /* Initialise graphics structure */ + pgraphics->title = NULL; + pgraphics->sizes = NULL; + pgraphics->shadows = NULL; + + pgraphics->size_x = 0; + pgraphics->size_y = 0; + pgraphics->small_size_x = 0; + pgraphics->small_size_y = 0; + pgraphics->levels = 0; + pgraphics->flags = 0; + + pgraphics->level = 0; + + for(i = 0; i < PIECE_MAX; i ++) + { + for(j = 0; j < IMAGE_MAX; j ++) + pgraphics->image[i][j] = NULL; + + pgraphics->image_flags[i] = 0; + pgraphics->shadow_flags[i] = 0; + pgraphics->shadow_z[i] = 0; + + for(j = 0; j < 10; j ++) + { + pgraphics->shadow_offset_x[i][j] = 0; + pgraphics->shadow_offset_y[i][j] = 0; + pgraphics->shadow_start_x[i][j] = 0; + pgraphics->shadow_start_y[i][j] = 0; + pgraphics->shadow_width[i][j] = 0; + pgraphics->shadow_height[i][j] = 0; + } + } + for(i = 0; i < 3; i ++) + { + pgraphics->background[i] = 0; + } + + /* Emergency default graphics scheme */ + if(filename == NULL) + { + graphics_createfromfont(pgraphics); + return pgraphics; + } + + /* Determine base directory */ + strcpy(basepath, filename); + for(i = strlen(filename); i >= 0; i --) + { + if(basepath[i] == '/') + { + basepath[i] = 0; + break; + } + } + strcpy(path, ""); + + piece = PIECE_UNKNOWN; + psurface = NULL; + pmenu = NULL; + failed = 0; + psize = NULL; + imagetype = 0; + w = 0; h = 0; z = 0; + flags = 0; + clone = PIECE_UNKNOWN; + x = 0; y = 0; + + /* Parse XML file */ + /* + + + title + + + + + + + + + + + + + + + + + + + + */ + + pparser = parser_new(filename); + if(pparser == NULL) + { + graphics_delete(pgraphics); + return NULL; + } + + enum{ + GRAPHICSPARSER_BAD, /* End of bad file */ + GRAPHICSPARSER_END, /* End of good file */ + GRAPHICSPARSER_OUTSIDE, /* Outside of */ + GRAPHICSPARSER_CHROMA, /* Inside */ + GRAPHICSPARSER_PIECES, /* Inside */ + GRAPHICSPARSER_PIECE, /* Inside */ + GRAPHICSPARSER_SIZES, /* Inside */ + GRAPHICSPARSER_SHADOWS, /* Inside */ + GRAPHICSPARSER_IF /* Inside failed */ + }; + + /* Another state machine! */ + state = GRAPHICSPARSER_OUTSIDE; + + while(state != GRAPHICSPARSER_BAD && state != GRAPHICSPARSER_END) + { + switch(parser_parse(pparser)) + { + case PARSER_END: + if(state == GRAPHICSPARSER_OUTSIDE) + state = GRAPHICSPARSER_BAD; + else + state = GRAPHICSPARSER_END; + break; + + case PARSER_ELEMENT_START: + switch(state) + { + case GRAPHICSPARSER_CHROMA: + if(parser_match(pparser, 0, "pieces")) + { + state = GRAPHICSPARSER_PIECES; + strcpy(path, ""); + } + if(parser_match(pparser, 0, "sizes")) + { + state = GRAPHICSPARSER_SIZES; + } + if(parser_match(pparser, 0, "shadows")) + { + state = GRAPHICSPARSER_SHADOWS; + } + break; + + case GRAPHICSPARSER_PIECES: + if(parser_match(pparser, 0, "piece")) + { + piece = PIECE_UNKNOWN; + clone = PIECE_UNKNOWN; + } + break; + + case GRAPHICSPARSER_PIECE: + if(parser_match(pparser, 0, "image")) + { + psurface = NULL; + imagetype = IMAGE_PIECE; + x = 0; + y = 0; + z = 0; + w = pgraphics->size_x; + h = pgraphics->size_y; + } + break; + + case GRAPHICSPARSER_SIZES: + if(parser_match(pparser, 0, "size")) + { + x = -1; y = -1; + flags = SIZE_PIECES | SIZE_SMALL; + + } + break; + + case GRAPHICSPARSER_SHADOWS: + if(parser_match(pparser, 0, "shadow")) + { + x = 0; y = 0; + } + break; + + default: + break; + } + break; + + case PARSER_ELEMENT_END: + + /* */ + if(parser_match(pparser, 0, "if") && failed > 0) + { + failed --; + if(failed == 0) + state -= GRAPHICSPARSER_IF; + } + + switch(state) + { + case GRAPHICSPARSER_CHROMA: + /* If we're only partially loading the file, end parsing at */ + /* */ + if(parser_match(pparser, 0, "head")) + { + if(partial) + state = GRAPHICSPARSER_END; + /* If we haven't found a size... */ + if(!(pgraphics->flags & GRAPHICS_CURSES) && pgraphics->size_x == 0 && pgraphics->size_y == 0) + + { + pmenu = graphics_error(pmenu, filename, NULL, gettext("No size specified")); + /* Make it appear in the menu, but not be loadable */ + if(partial) + state = GRAPHICSPARSER_END; + else + state = GRAPHICSPARSER_BAD; + } + } + + /* */ + if(parser_match(pparser, 0, "curses")) + pgraphics->flags |= GRAPHICS_CURSES; + + break; + + case GRAPHICSPARSER_PIECES: + if(parser_match(pparser, 0, "pieces")) + state = GRAPHICSPARSER_CHROMA; + break; + + case GRAPHICSPARSER_PIECE: + if(parser_match(pparser, 0, "piece")) + { + if(piece != PIECE_UNKNOWN && pgraphics->image[piece][IMAGE_PIECE] != NULL) + { + /* Key transparency */ + if(pgraphics->image_flags[piece] & GRAPHICS_KEY) + { + SDL_SetAlpha(pgraphics->image[piece][IMAGE_PIECE], SDL_SRCALPHA, 255); + SDL_SetColorKey(pgraphics->image[piece][IMAGE_PIECE], SDL_SRCCOLORKEY, SDL_MapRGB(pgraphics->image[piece][IMAGE_PIECE]->format, red, green, blue)); + + if(pgraphics->image[piece][IMAGE_SMALL] != NULL) + { + SDL_SetAlpha(pgraphics->image[piece][IMAGE_SMALL], SDL_SRCALPHA, 255); + SDL_SetColorKey(pgraphics->image[piece][IMAGE_SMALL], SDL_SRCCOLORKEY, SDL_MapRGB(pgraphics->image[piece][IMAGE_SMALL]->format, red, green, blue)); + } + } + } + + state = GRAPHICSPARSER_PIECES; + } + if(parser_match(pparser, 0, "image") && psurface != NULL) + { + /* If this is the first shadow image for this + piece, make a note of its size and offset for + later use. */ + if(imagetype == IMAGE_SHADOW && piece >= 0 && pgraphics->image[piece][IMAGE_SHADOW] == NULL) + { + pgraphics->shadow_z[piece] = z; + pgraphics->shadow_offset_x[piece][9] = x; + pgraphics->shadow_offset_y[piece][9] = y; + pgraphics->shadow_width[piece][9] = psurface->w; + pgraphics->shadow_height[piece][9] = psurface->h; + } + graphics_addimage(pgraphics, piece, imagetype, psurface); + SDL_FreeSurface(psurface); + } + if(parser_match(pparser, 0, "clone") && piece >= 0) + { + if(clone != PIECE_UNKNOWN) + { + if(!(pgraphics->image_flags[clone] & GRAPHICS_CLONE) && clone != piece) + { + pgraphics->image_flags[piece] |= GRAPHICS_CLONE; + pgraphics->clone[piece] = clone; + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Clone loop")); + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid piece for clone")); + } + break; + + case GRAPHICSPARSER_SIZES: + /* : process available sizes */ + if(parser_match(pparser, 0, "sizes")) + { + /* Move out of into */ + state = GRAPHICSPARSER_CHROMA; + + /* Find an appropriate size for the pieces */ + /* First, is there an exact match? */ + pgraphics->size_x = 0; + pgraphics->size_y = 0; + psize = pgraphics->sizes; + while(psize != NULL) + { + if(psize->x == options_sdl_size_x && psize->y == options_sdl_size_y && psize->flags & SIZE_PIECES) + { + pgraphics->size_x = psize->x; + pgraphics->size_y = psize->y; + } + psize = psize->next; + } + /* If none matches, choose the largest that will + allow the level to be fully displayed */ + if(pgraphics->size_y == 0) + { + psize = pgraphics->sizes; + while(psize != NULL) + { + size_x = 32; + size_y = 24; + if(plevelcurrent != NULL) + { + size_x = plevelcurrent->size_x; + size_y = plevelcurrent->size_y; +#ifdef XOR_COMPATIBILITY + if(plevelcurrent->mode == MODE_XOR && options_xor_display) + { + size_x = 8; + size_y = 8; + } +#endif + } + + if(psize->y > pgraphics->size_y && psize->x <= screen_width / size_x && psize->y <= screen_height / size_y && psize->flags & SIZE_PIECES) + { + pgraphics->size_x = psize->x; + pgraphics->size_y = psize->y; + } + psize = psize->next; + } + } + /* If still no match, use the smallest */ + if(pgraphics->size_y == 0) + { + pgraphics->size_x = SIZE_HUGE; + pgraphics->size_y = SIZE_HUGE; + psize = pgraphics->sizes; + while(psize != NULL) + { + if(psize->y < pgraphics->size_y && psize->flags & SIZE_PIECES) + { + pgraphics->size_x = psize->x; + pgraphics->size_y = psize->y; + } + psize = psize->next; + } + } + if(pgraphics->size_y == SIZE_HUGE) + { + /* Something failed badly */ + /* An error will be generated at */ + pgraphics->size_x = 0; + pgraphics->size_y = 0; + } + + /* Find an appropriate size for the small pieces */ + pgraphics->small_size_x = 0; + pgraphics->small_size_y = 0; + psize = pgraphics->sizes; + while(psize != NULL) + { + if(psize->y < font_height_game && psize->flags & SIZE_SMALL) + { + pgraphics->small_size_x = psize->x; + pgraphics->small_size_y = psize->y; + } + psize = psize->next; + } + /* If no size was small enough, use the smallest */ + if(pgraphics->small_size_y == 0) + { + pgraphics->small_size_x = SIZE_HUGE; + pgraphics->small_size_y = SIZE_HUGE; + psize = pgraphics->sizes; + while(psize != NULL) + { + if(psize->y < pgraphics->small_size_y && psize->flags & SIZE_SMALL) + { + pgraphics->small_size_x = psize->x; + pgraphics->small_size_y = psize->y; + } + psize = psize->next; + } + if(pgraphics->small_size_y == SIZE_HUGE) + { + /* Something failed badly! */ + pgraphics->small_size_x = 0; + pgraphics->small_size_y = 0; + } + } + } + + /* : Store this size in the list of sizes */ + if(parser_match(pparser, 0, "size")) + { + if(x != -1 && y != -1) + { + psize = malloc(sizeof(struct graphicssize)); + if(psize == NULL) + fatal(gettext("Out of memory in graphics_load()")); + psize->x = x; + psize->y = y; + psize->flags = flags; + psize->next = NULL; + + if(pgraphics->sizes == NULL) + pgraphics->sizes = psize; + else + { + psizetmp = pgraphics->sizes; + while(psizetmp->next != NULL) + psizetmp = psizetmp->next; + psizetmp->next = psize; + } + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid size")); + } + break; + + case GRAPHICSPARSER_SHADOWS: + if(parser_match(pparser, 0, "shadow")) + { + if(x >= -1 && x <= 1 && y >= -1 && y <= 1) + { + pshadow = malloc(sizeof(struct shadow)); + if(pshadow == NULL) + fatal(gettext("Out of memory in graphics_load()")); + pshadow->x = x; + pshadow->y = y; + pshadow->next = NULL; + + if(pgraphics->shadows == NULL) + pgraphics->shadows = pshadow; + else + { + pshadowtmp = pgraphics->shadows; + while(pshadowtmp->next != NULL) + pshadowtmp = pshadowtmp->next; + pshadowtmp->next = pshadow; + } + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid shadow")); + } + if(parser_match(pparser, 0, "shadows")) + { + state = GRAPHICSPARSER_CHROMA; + } + break; + + default: + break; + } + + break; + + case PARSER_CONTENT: + switch(state) + { + case GRAPHICSPARSER_CHROMA: + if(parser_match(pparser, 1, "title")) + { + pgraphics->title = malloc(strlen(parser_text(pparser, 0)) + 1); + if(pgraphics->title == NULL) + fatal(gettext("Out of memory in graphics_load()")); + strcpy(pgraphics->title, parser_text(pparser, 0)); + } + + break; + + default: + break; + } + break; + + case PARSER_ATTRIBUTE: + if(parser_match(pparser, 2, "if") && parser_match(pparser, 1, "condition")) + { + if(state >= GRAPHICSPARSER_IF) + failed ++; + else + { + if(!graphics_evaluate(pgraphics, parser_text(pparser, 0))) + { + state += GRAPHICSPARSER_IF; + failed ++; + } + } + } + + switch(state) + { + case GRAPHICSPARSER_OUTSIDE: + if(parser_match(pparser, 2, "chroma") && parser_match(pparser, 1, "type")) + { + if(parser_match(pparser, 0, "graphics")) + state = GRAPHICSPARSER_CHROMA; + } + break; + + case GRAPHICSPARSER_CHROMA: + if(parser_match(pparser, 2, "chroma") && parser_match(pparser, 1, "hidden")) + { + if(parser_match(pparser, 0, "yes")) + { + if(partial && !(options_debug & DEBUG_HIDDEN)) + state = GRAPHICSPARSER_BAD; + } + } + if(parser_match(pparser, 2, "title") && parser_match(pparser, 1, "translate")) + { + if(parser_match(pparser, 0, "yes")) + pgraphics->flags |= GRAPHICS_TRANSLATE; + } + if(parser_match(pparser, 2, "background") && (parser_match(pparser, 1, "colour") || parser_match(pparser, 1, "color"))) + { + if(graphics_translatecolour(parser_text(pparser,0), &red, &green, &blue, &alpha)) + { + pgraphics->background[0] = red; + pgraphics->background[1] = green; + pgraphics->background[2] = blue; + pgraphics->flags |= GRAPHICS_BACKGROUND; + + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid colour")); + } + + break; + + case GRAPHICSPARSER_PIECES: + if(parser_match(pparser, 2, "pieces") && parser_match(pparser, 1, "path")) + strcpy(path, parser_text(pparser, 0)); + + if(parser_match(pparser, 2, "pieces") && parser_match(pparser, 1, "levels")) + { + pgraphics->levels = atoi(parser_text(pparser, 0)); + if(pgraphics->levels > 1) + { + if(options_graphic_level != 0) + pgraphics->level = options_graphic_level % (pgraphics->levels + 1); + else + { + if(plevelcurrent != NULL && plevelcurrent->level != 0) + pgraphics->level = plevelcurrent->level; + else + pgraphics->level = 1; + } + } + } + + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "name")) + { + for(i = 0; i < PIECE_UNKNOWN; i ++) + { + if(strcasecmp(parser_text(pparser, 0), piece_name[i]) == 0) + piece = i; + } + if(piece != PIECE_UNKNOWN) + state = GRAPHICSPARSER_PIECE; + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid piece name")); + } + break; + + case GRAPHICSPARSER_PIECE: + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "bevel")) + { + if(strcmp(parser_text(pparser, 0), "piece") == 0) + pgraphics->image_flags[piece] |= GRAPHICS_BEVEL; + else if(strcmp(parser_text(pparser, 0), "shadow") == 0) + pgraphics->image_flags[piece] |= GRAPHICS_BEVEL_SHADOW; + else if(strcmp(parser_text(pparser, 0), "piece shadow") == 0) + pgraphics->image_flags[piece] |= GRAPHICS_BEVEL | GRAPHICS_BEVEL_SHADOW; + else if(strcmp(parser_text(pparser, 0), "16") == 0) + pgraphics->image_flags[piece] |= GRAPHICS_BEVEL16; + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid bevel type")); + } + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "mover")) + pgraphics->image_flags[piece] |= GRAPHICS_MOVER; + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "random")) + pgraphics->image_flags[piece] |= GRAPHICS_RANDOM; + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "animate")) + pgraphics->image_flags[piece] |= GRAPHICS_ANIMATE; + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "level")) + pgraphics->image_flags[piece] |= GRAPHICS_LEVEL; + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "tile")) + pgraphics->image_flags[piece] |= GRAPHICS_TILE; + if(parser_match(pparser, 2, "piece") && parser_match(pparser, 1, "scale")) + pgraphics->image_flags[piece] |= GRAPHICS_SCALE; + + /* small_size_x; + h = pgraphics->small_size_y; + imagetype = IMAGE_SMALL; + } + } + + /* size_x); + if(parser_match(pparser, 2, "image") && parser_match(pparser, 1, "y")) + y = graphics_evaluatesize(parser_text(pparser, 0), pgraphics->size_y); + if(parser_match(pparser, 2, "image") && parser_match(pparser, 1, "z")) + z = atoi(parser_text(pparser, 0)); + if(parser_match(pparser, 2, "image") && (parser_match(pparser, 1, "w") || parser_match(pparser, 1, "width"))) + w = graphics_evaluatesize(parser_text(pparser, 0), pgraphics->size_x); + if(parser_match(pparser, 2, "image") && (parser_match(pparser, 1, "h") || parser_match(pparser, 1, "height"))) + h = graphics_evaluatesize(parser_text(pparser, 0), pgraphics->size_y); + + /* Create solid colour image */ + if(parser_match(pparser, 2, "image") && (parser_match(pparser, 1, "colour") || parser_match(pparser, 1, "color"))) + { + if(graphics_translatecolour(parser_text(pparser,0), &red, &green, &blue, &alpha)) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + psurface = SDL_CreateRGBSurface(screen_flags, w, h, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + psurface = SDL_CreateRGBSurface(screen_flags, w, h, 32, 0xff, 0xff00, 0xff0000, 0xff000000); + +#endif + if(alpha == 255) + { + SDL_SetAlpha(psurface, 0, 0); + SDL_FillRect(psurface, NULL, SDL_MapRGB(psurface->format, red, green, blue)); + } + else + { + SDL_FillRect(psurface, NULL, SDL_MapRGBA(psurface->format, red, green, blue, alpha)); + } + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid colour")); + } + + /* Load file from image */ + if(parser_match(pparser, 2, "image") && parser_match(pparser, 1, "file")) + { + /* Construct pathname */ + if(strcmp(path, "") == 0) + sprintf(file, "%s/", basepath); + else + sprintf(file, "%s/%s/", basepath, path); + + /* Substitute %s as necessary */ + j = strlen(file); + for(i = 0; i <= strlen(parser_text(pparser, 0)); i ++) + { + c = pparser->stack[pparser->depth - 1][i]; + if(c == '%') + { + i ++; + c = pparser->stack[pparser->depth - 1][i]; + file[j] = 0; + switch(c) + { + case '%': + strcat(file, "%"); + break; + case 'x': + sprintf(buffer, "%d", imagetype == IMAGE_SMALL ? pgraphics->small_size_x : pgraphics->size_x); + strcat(file, buffer); + break; + case 'y': + sprintf(buffer, "%d", imagetype == IMAGE_SMALL ? pgraphics->small_size_y : pgraphics->size_y); + strcat(file, buffer); + break; + case 'l': + if(pgraphics->levels != 0) + sprintf(buffer, "%d", pgraphics->level); + else + sprintf(buffer, "%d", 0); + strcat(file, buffer); + break; + default: + sprintf(buffer, "%%%c", c); + strcat(file, buffer); + break; + } + j = strlen(file); + } + else + file[j ++ ] = c; + } + + /* Load the file */ + if(isfile(file)) + psurface = IMG_Load(file); + else + { + sprintf(buffer, gettext("Invalid filename '%s'"), file); + pmenu = graphics_error(pmenu, filename, pparser, buffer); + } + if(psurface != NULL && (psurface->w != w || psurface->h != h) && (pgraphics->image_flags[piece] & GRAPHICS_SCALE)) + { + psurface = graphics_scaleimage(psurface, w, h); + + } + } + + /* Key transparency */ + if(parser_match(pparser, 2, "image") && parser_match(pparser, 1, "key")) + { + /* Store values in red, green, blue for use later */ + if(graphics_translatecolour(parser_text(pparser,0), &red, &green, &blue, &alpha)) + { + pgraphics->image_flags[piece] |= GRAPHICS_KEY; + } + else + pmenu = graphics_error(pmenu, filename, pparser, gettext("Invalid colour")); + } + + if(parser_match(pparser, 2, "clone") && parser_match(pparser, 1, "piece")) + { + for(i = 0; i < PIECE_UNKNOWN; i ++) + { + if(strcasecmp(parser_text(pparser, 0), piece_name[i]) == 0) + clone = i; + } + } + break; + + case GRAPHICSPARSER_SIZES: + if(parser_match(pparser, 2, "size") && parser_match(pparser, 1, "x")) + x = atoi(parser_text(pparser, 0)); + if(parser_match(pparser, 2, "size") && parser_match(pparser, 1, "y")) + y = atoi(parser_text(pparser, 0)); + if(parser_match(pparser, 2, "size") && parser_match(pparser, 1, "pieces")) + { + if(strcasecmp(parser_text(pparser, 0), "yes") == 0) + flags |= SIZE_PIECES; + if(strcasecmp(parser_text(pparser, 0), "no") == 0) + flags &= ~SIZE_PIECES; + } + if(parser_match(pparser, 2, "size") && parser_match(pparser, 1, "small")) + { + if(strcasecmp(parser_text(pparser, 0), "yes") == 0) + flags |= SIZE_SMALL; + if(strcasecmp(parser_text(pparser, 0), "no") == 0) + flags &= ~SIZE_SMALL; + } + break; + + case GRAPHICSPARSER_SHADOWS: + if(parser_match(pparser, 2, "shadow") && parser_match(pparser, 1, "x")) + x = atoi(parser_text(pparser, 0)); + if(parser_match(pparser, 2, "shadow") && parser_match(pparser, 1, "y")) + y = atoi(parser_text(pparser, 0)); + break; + + default: + break; + } + + break; + + case PARSER_ERROR: + pmenu = graphics_error(pmenu, filename, pparser, parser_text(pparser, 0)); + break; + + default: + break; + } + } + + parser_delete(pparser); + + /* If we failed to find , this isn't a valid graphics file */ + if(state == GRAPHICSPARSER_BAD) + { + graphics_delete(pgraphics); + return NULL; + } + + if(partial) + return pgraphics; + + /* If curses emulation, create graphics from the font */ + if(pgraphics->flags & GRAPHICS_CURSES) + graphics_createfromfont(pgraphics); + + /* Next, perform a sanity check on the graphics */ + + /* Patch up any pieces without an image with a random one */ + for(i = 0; i < PIECE_MAX; i ++) + { + if(pgraphics->image[i][IMAGE_PIECE] == NULL && !(pgraphics->image_flags[i] & GRAPHICS_CLONE)) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + psurface = SDL_CreateRGBSurface(screen_flags, pgraphics->size_x, pgraphics->size_y, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + psurface = SDL_CreateRGBSurface(screen_flags, pgraphics->size_x, pgraphics->size_y, 32, 0xff, 0xff00, 0xff0000, 0xff000000); +#endif + + fg = pdisplaycolours->foreground[i]; + bg = pdisplaycolours->background[i]; + + if(bg == -1) + bg = 0; + if(fg == -1) + fg = 7; + + if(pdisplaycolours->reverse[i]) + { + tg = fg; fg = bg; bg = tg; + } + + SDL_FillRect(psurface, NULL, SDL_MapRGB(psurface->format, bg & 1 ? 255 : 0, bg & 2 ? 255 : 0, bg & 4 ? 255 : 0)); + sprintf(buffer, "%c", pdisplaycolours->character[i]); + + psurfacetmp = font_render(buffer, fg); + drect.x = (psurface->w - psurfacetmp->w) / 2; + drect.y = (psurface->h - psurfacetmp->h) / 2; + SDL_BlitSurface(psurfacetmp, NULL, psurface, &drect); + SDL_FreeSurface(psurfacetmp); + + pgraphics->image[i][IMAGE_PIECE] = SDL_DisplayFormat(psurface); + SDL_FreeSurface(psurface); + } + } + + /* Set clones */ + for(i = 0; i < PIECE_MAX; i ++) + { + if(pgraphics->image_flags[i] & GRAPHICS_CLONE) + { + x = pgraphics->clone[i]; + pgraphics->image[i][IMAGE_PIECE] = pgraphics->image[x][IMAGE_PIECE]; + + pgraphics->image[i][IMAGE_SHADOW] = pgraphics->image[x][IMAGE_SHADOW]; + pgraphics->shadow_width[i][9] = pgraphics->shadow_width[x][9]; + pgraphics->shadow_height[i][9] = pgraphics->shadow_height[x][9]; + pgraphics->shadow_offset_x[i][9] = pgraphics->shadow_offset_x[x][9]; + pgraphics->shadow_offset_y[i][9] = pgraphics->shadow_offset_y[x][9]; + } + } + + /* Bevelling requires five images */ + if(pgraphics->image_flags[PIECE_SPACE] & GRAPHICS_BEVEL) + { + if(pgraphics->image[PIECE_SPACE][IMAGE_PIECE]->w < pgraphics->size_x * 5) + { + pgraphics->image_flags[PIECE_SPACE] ^= GRAPHICS_BEVEL; + sprintf(buffer, gettext("%s bevelling requires five images"), piece_name[PIECE_SPACE]); + pmenu = graphics_error(pmenu, filename, NULL, buffer); + } + } + if(pgraphics->image_flags[PIECE_WALL] & GRAPHICS_BEVEL) + { + if(pgraphics->image[PIECE_WALL][IMAGE_PIECE]->w < pgraphics->size_x * 5) + { + pgraphics->image_flags[PIECE_WALL] ^= GRAPHICS_BEVEL; + sprintf(buffer, gettext("%s bevelling requires five images"), piece_name[PIECE_WALL]); + pmenu = graphics_error(pmenu, filename, NULL, buffer); + } + } + + if(pgraphics->image_flags[PIECE_WALL] & GRAPHICS_BEVEL_SHADOW) + { + if(pgraphics->image[PIECE_WALL][IMAGE_SHADOW]->w < pgraphics->size_x * 5) + { + pgraphics->image_flags[PIECE_WALL] ^= GRAPHICS_BEVEL_SHADOW; + sprintf(buffer, gettext("%s bevelling requires five images"), piece_name[PIECE_WALL]); + pmenu = graphics_error(pmenu, filename, NULL, buffer); + } + } + + /* Create cursor */ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + psurface = SDL_CreateRGBSurface(screen_flags, pgraphics->size_x, pgraphics->size_y, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + psurface = SDL_CreateRGBSurface(screen_flags, pgraphics->size_x, pgraphics->size_y, 32, 0xff, 0xff00, 0xff0000, 0xff000000); +#endif + i = pgraphics->size_x / 16; + if(i < 1) + i = 1; + rect.x = i * 1; rect.y = i * 1; rect.w = pgraphics->size_x - i * 2; rect.h = pgraphics->size_y - i * 2; + SDL_FillRect(psurface, &rect, SDL_MapRGB(psurface->format, 0, 0, 0)); + rect.x = i * 2; rect.y = i * 2; rect.w = pgraphics->size_x - i * 4; rect.h = pgraphics->size_y - i * 4; + SDL_FillRect(psurface, &rect, SDL_MapRGB(psurface->format, 255, 255, 255)); + rect.x = i * 3; rect.y = i * 3; rect.w = pgraphics->size_x - i * 6; rect.h = pgraphics->size_y - i * 6; + SDL_FillRect(psurface, &rect, SDL_MapRGB(psurface->format, 0, 0, 0)); + rect.x = i * 4; rect.y = i * 4; rect.w = pgraphics->size_x - i * 8; rect.h = pgraphics->size_y - i * 8; + SDL_FillRect(psurface, &rect, SDL_MapRGBA(psurface->format, 0, 0, 0, 64)); + pgraphics->image[PIECE_CURSOR][IMAGE_PIECE] = psurface; + + /* Calculate quadrants for shadow images */ + for(i = 0; i < PIECE_MAX; i ++) + { + if(pgraphics->image[i][IMAGE_SHADOW] != NULL) + { + if(pgraphics->shadow_z[i] != 0) + pgraphics->flags |= GRAPHICS_ZORDER; + + width = pgraphics->shadow_width[i][9]; + height = pgraphics->shadow_height[i][9]; + offset_x = pgraphics->shadow_offset_x[i][9]; + offset_y = pgraphics->shadow_offset_y[i][9]; + + for(j = 0; j < 3; j ++) + { + for(k = 0; k < 3; k ++) + { + x = (j - 1) * pgraphics->size_x - offset_x; + y = (k - 1) * pgraphics->size_y - offset_y; + + /* Does the shadow fall into this square? */ + if(x > -(pgraphics->size_x) && x < width && y > -(pgraphics->size_y) && y < height) + { + if(x >= 0) + { + pgraphics->shadow_start_x[i][j+k*3]= x; + pgraphics->shadow_offset_x[i][j+k*3] = 0; + + if(x + pgraphics->size_x > width) + pgraphics->shadow_width[i][j+k*3] = width - x; + else + pgraphics->shadow_width[i][j+k*3] = pgraphics->size_x; + } + else + { + pgraphics->shadow_start_x[i][j+k*3] = 0; + pgraphics->shadow_offset_x[i][j+k*3] = -x; + + pgraphics->shadow_width[i][j+k*3] = pgraphics->size_x + x; + + } + + if(y >= 0) + { + pgraphics->shadow_start_y[i][j+k*3]= y; + pgraphics->shadow_offset_y[i][j+k*3] = 0; + + if(y + pgraphics->size_y > height) + pgraphics->shadow_height[i][j+k*3] = height - y; + else + pgraphics->shadow_height[i][j+k*3] = pgraphics->size_y; + } + else + { + pgraphics->shadow_start_y[i][j+k*3] = 0; + pgraphics->shadow_offset_y[i][j+k*3] = -y; + + pgraphics->shadow_height[i][j+k*3] = pgraphics->size_y + y; + } + + pgraphics->shadow_flags[i] |= shadow_flags[j+k*3]; + } + } + } + } + } + + /* Calcuate flags for shadows */ + pshadow = pgraphics->shadows; + while(pshadow != NULL) + { + pshadow->flag = shadow_flags[(pshadow->x + 1) + 3 * (pshadow->y + 1)]; + pshadow->shadow = (1 + pshadow->x) + 3 * (1 + pshadow->y); + pshadow->nextordered = pshadow->next; + pshadow = pshadow->next; + } + + /* Display any errors that have arisen */ + if(pmenu != NULL) + { + menu_process(pmenu); + menu_delete(pmenu); + } + + return pgraphics; +} + +void graphics_reload() +{ + struct graphics *pgraphicstmp; + int reload; + + /* Fixed size, so no automatic resizing */ + if(options_graphic_level != pdisplaygraphics->level) + reload = 1; + else if(options_sdl_size_x != 0 || options_sdl_size_y != 0) + reload = 0; + else + { + /* Partially load the graphics again and see if they're different */ + pgraphicstmp = graphics_load(options_graphics, 1); + + reload = 0; + if(pgraphicstmp == NULL || pdisplaygraphics == NULL || + pdisplaygraphics->size_x != pgraphicstmp->size_x || + pdisplaygraphics->size_y != pgraphicstmp->size_y || + pdisplaygraphics->small_size_x != pgraphicstmp->small_size_x || + pdisplaygraphics->small_size_y != pgraphicstmp->small_size_y) + reload = 1; + + if(pgraphicstmp != NULL) + graphics_delete(pgraphicstmp); + } + + if(reload) + graphics_init(); +} + +SDL_Surface *graphics_scaleimage(SDL_Surface* psurface, int width, int height) +{ + SDL_Surface* pnew; + Uint32 *src; + Uint32 *dst; + SDL_Color *colour; + int i, j; + Uint8 r, g, b, a; + +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + pnew = SDL_CreateRGBSurface(screen_flags, width, height, 32, 0xff000000, 0xff0000, 0xff00, 0xff); +#else + pnew = SDL_CreateRGBSurface(screen_flags, width, height, 32, 0xff, 0xff00, 0xff0000, 0xff000000); +#endif + + SDL_SetAlpha(pnew, 0, 0); + + /* This is probably not an optimal way of doing this! */ + for(j = 0; j < height; j ++) + { + for(i = 0; i < width; i ++) + { + src = psurface->pixels + + (j * psurface->h / height) * psurface->pitch + + (i * psurface->w / width) * psurface->format->BytesPerPixel; + dst = pnew->pixels + + j * pnew->pitch + + i * pnew->format->BytesPerPixel; + if(psurface->format->BitsPerPixel == 8) + { + colour = &(psurface->format->palette->colors[(Uint8)*src]); +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + *dst = colour->r * 0x1000000 + colour->g * 0x10000 + colour->b * 0x100 + 0xff; +#else + *dst = colour->r + colour->g * 0x100 + colour->b * 0x10000 + 0xff000000; +#endif + } + else + { + SDL_GetRGBA(*src, psurface->format, &r, &g, &b, &a); +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + *dst = r * 0x1000000 + g * 0x10000 + b * 0x100 + a; +#else + *dst = r + g * 0x100 + b * 0x10000 + a * 0x10000000; +#endif + } + } + } + + SDL_FreeSurface(psurface); + + return pnew; +} diff --git a/graphics.h b/graphics.h new file mode 100644 index 0000000..8f98509 --- /dev/null +++ b/graphics.h @@ -0,0 +1,130 @@ +/* + graphics.h + + Copyright (C) 2010-2019 Amf + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#define GRAPHICS_DEFAULT "chroma-zen.chroma" + +/* Flags for pieces */ +#define GRAPHICS_BEVEL 1 +#define GRAPHICS_BEVEL_SHADOW 2 +#define GRAPHICS_BEVEL16 4 +#define GRAPHICS_RANDOM 8 +#define GRAPHICS_KEY 16 +#define GRAPHICS_MOVER 32 +#define GRAPHICS_TILE 64 +#define GRAPHICS_ANIMATE 128 +#define GRAPHICS_LEVEL 256 +#define GRAPHICS_CLONE 512 +#define GRAPHICS_SCALE 1024 + +/* Flags for set */ +#define GRAPHICS_CURSES 1 +#define GRAPHICS_ZORDER 2 +#define GRAPHICS_BACKGROUND 4 +#define GRAPHICS_TRANSLATE 8 + +#define BEVEL_BASE 0x10000 +#define BEVEL_L (BEVEL_BASE * 1) +#define BEVEL_R (BEVEL_BASE * 2) +#define BEVEL_U (BEVEL_BASE * 4) +#define BEVEL_D (BEVEL_BASE * 8) +#define BEVEL_TL (BEVEL_BASE * 16) +#define BEVEL_TR (BEVEL_BASE * 32) +#define BEVEL_BL (BEVEL_BASE * 64) +#define BEVEL_BR (BEVEL_BASE * 128) +#define BEVEL_ALL (BEVEL_BASE * 255) + +#define SHADOW_BASE 0x1000000 +#define SHADOW_TOP_LEFT 1 +#define SHADOW_TOP 2 +#define SHADOW_TOP_RIGHT 4 +#define SHADOW_LEFT 8 +#define SHADOW_MIDDLE 16 +#define SHADOW_RIGHT 32 +#define SHADOW_BOTTOM_LEFT 64 +#define SHADOW_BOTTOM 128 +#define SHADOW_BOTTOM_RIGHT 256 + +#define IMAGE_PIECE 0 +#define IMAGE_SHADOW 1 +#define IMAGE_SMALL 2 +#define IMAGE_MAX 3 + +#define SIZE_PIECES 1 +#define SIZE_SMALL 2 + +struct graphicssize +{ + int x; + int y; + int flags; + struct graphicssize *next; +}; + +struct shadow +{ + int x; + int y; + int z; + int p; + int flag; + int shadow; + struct shadow *next; + struct shadow *nextordered; + struct shadow *previousordered; +}; + + +struct graphics +{ + int size_x; + int size_y; + int small_size_x; + int small_size_y; + int flags; + char *title; + int background[3]; + int level; + int levels; + + int image_flags[PIECE_MAX]; + SDL_Surface *image[PIECE_MAX][3]; + + int clone[PIECE_MAX]; + int shadow_z[PIECE_MAX]; + int shadow_offset_x[PIECE_MAX][10]; + int shadow_offset_y[PIECE_MAX][10]; + int shadow_start_x[PIECE_MAX][10]; + int shadow_start_y[PIECE_MAX][10]; + int shadow_width[PIECE_MAX][10]; + int shadow_height[PIECE_MAX][10]; + int shadow_flags[PIECE_MAX]; + + struct graphicssize *sizes; + struct shadow *shadows; + +}; + +void graphics_init(); +struct graphics* graphics_load(char *filename, int partial); +void graphics_delete(struct graphics*); +struct menu* graphics_menu(); +SDL_Surface *graphics_loadimage(char *filename); +void graphics_reload(); + diff --git a/graphics/chroma-marble.chroma b/graphics/chroma-marble.chroma new file mode 100644 index 0000000..8ff4f08 --- /dev/null +++ b/graphics/chroma-marble.chroma @@ -0,0 +1,323 @@ + + + + + +Chroma Marble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/chroma-marble/16_arrow_blue_down.png b/graphics/chroma-marble/16_arrow_blue_down.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b1c4ebd016a851ded4dfc5efbe820829d65602 GIT binary patch literal 692 zcmV;l0!#ggP)y{D4^000SZMn-c0003YB002M$BB%C|00009 za7bBm0006v0006v0rv((!TlDkjaP!xyn00RQ;5BR8^|f%DAN^p?2ali4Dkg8g=ODu@O>L zmGbzcBj0;{9zUIP$le}gRP~pZ&o@Kc+G=Ww;%kLM6RoA~?zXgC&ezt~JWZ1P@V_8< z=-a@1F+)Vr&kDj%Z*j2&Jl_PC^+A?@KtA7sg#|yf@o^8*>F=<*dhx!#?t>_P@C4yi zmIQE|W$?TMlaqCrpLbwlq6Sk_b?ELkfubr9i`l?&E-1=5Y;Sw8vho>bXP+A65{^5` za$L<#r|S@pS23uJ!C#@HqX_-|7AB}*@){~Qg-oUj4D-y5MDAzFpRlZHBoa1EPuHQV zs}u&ew;#jsunm!j35i4%BgpOuty}cF;43r_6 zETQxlE=4_5$iEmF`D9R(1#NA|Vc^)0000y{D4^000SZMn-c000000002M$DpUE(00009 za7bBm0006v0006v0rv((!Tlif?(U>LQIQP#F&U4NY@Jj9O zX1y#6L*eCztjD>~Pm;uD?DX*2fQ=2-)ilASRA}AZP4zJJ!1?#VlK|V!x-&Dx)wD{h z*(~)u&*1wRe1C{q?dRhFMaeov0oQRvD-4-#7%3JPD=3O7j*cQQb`H)zKLji-vCi%7 zw9h%2uhphH5P^^a)hdUg5Y+1;E-y0#!4R7EpM~{xw&VMyo9D#xyuvWe7;|$RX<8tP zrZCMaMxz{tAt4BIh~hO2<8&ZwZSl1<8i9l>#ee->6(-|dJZaS3TyNunE!$yivJ1*HU|QGxN8VLWD_lt2)GEc39uJbL)V z&CRc!$t3Qpsx@z#Z*;~g@Vp#l2}~vosw#pIV0Jb{9DjQ}#_jDN9ZF^Q{=Q;)o~S2@ z2*w07n^mZ41+pCD?CjIiMcUi@)jdA`?Z&avD$9A@aSW)cglaX#$;rpTv#ablZ@cw+ z&82j%Wf-y{D4^000SZMn-c0002M$002M$B@6SX00009 za7bBm0006v0006v0rv((!Tlgm#UQ542m=t84QBN`(EGbl_L8AM0X z861f-5!zs2%gXo*g8BIZR#!h!&~w}CeQc`ghmb28?Kyz4gSE9LM6uQWg{GZ*WcfNW$F5xyMLx+vbaYh-}^iN1*4-c Us1=nL(f|Me07*qoM6N<$f-58^e*gdg literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_blue_up.png b/graphics/chroma-marble/16_arrow_blue_up.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b84b662bbba932a62c735d8147cdf02df8ac04 GIT binary patch literal 651 zcmV;60(AX}P)y{D4^000SZMn-c0001BW002M$E&u%e00009 za7bBm0006v0006v0rv((!Th%nsn(xrw+VN{2(wQB$#*!29_>WRS;4erHX?c-|Kr>5E6oh_N?dVHyqfIvokwB zKVObFZEBm!t1J5!z5%?vZzJw24i5D3#f9x(U*Gk2cHSL78o0cy(&bVmRTU>d`Y52; zEGAhd`dTmWeV;4~`g?mHCJzRzb!JjlNxN;yGK-YYlRPhG4+4h6Vv^@#5QZ7ut{@C0 z#`uKc)4^cyX7XP^2$6QXRqXo}&1Q|kz+*HD$+9>GC*25)MtbV|qVKvZT-TtrWjOQ! zkTSs9q`$lSetItuh9>pAD)zhztt~+yn9mhTS)`P}vsfvW{u4Ml($h{y_M&Lb))s7U z`y@%7dR<_QrO~Jnh9PnMqPM^QY5EsX6gKsJ6GKH5Ny1QKEog1g8nUdy7=e`CxYcT= ze*ojLKJh%!Q)*48Q^R$|uS3D}1WFl{vQ!lWK|m11z0=b#C%*y5F|*~eij`8_+>~UQ z=JvK^u~5|O4oOnO7(=ru$#aX=VXTy%0m#F{)rm3r>nK{du3KPC&U`*6iY$&(;`kSqQiM16)v0^^I lA&Q#Z-4*2d7OmEky{D4^000SZMn-c0003YB003YBw($7oVU>FDR_n-$skEQVkB$^u9TJ0}t zwTW#|TTD_~Yqb}>_@9hzhh2B{G@paG!A9(+vvujOwM|sA)Uw0AqXA)z zxv3xc!pr-<&-1*8m+WIdRrpy@^S!*2?cTPk*os=}mDEzdr0(_i)SR7DH>?d+vL)wS zv_v)E&8t#HN|B76$%;QjYo)(}WG@Nc<{@9o$oKO|*a;^K)&j!c!$@DIo&8OF6Pb@0 zOMES6$$(H3%1I-MNGF12V;RAA5YbK)F5LyXL4$3w5KIBeg@PSx2kXb{h(C*$$ra&L z$O>)240potw!EP0G+bX@7^#e4sx}3-!6MR*Abplbs+B_EdBAi(aA(Qyc%3i%nm)uj zF^pBmoZ{h=VR)JzxOF#tEgz&a$(c?)q{`$^i`7NNTl1Q1i**`|R!2eUl#_|t1eiJl zf7Orp%eYBDq80Ktv!7?nbdAQ)$&gbx|7{+ghR0b48UawRD9jzqmC1D`KTImqr_<(m zeH=`K0dMdS3;~I50?aW3>IrrI^eg@&|KZ>jT$4k*8^^A_i$psC_6-a7efJ^xpU{_( z%;}st)0}~5ijdAF#A-2cDrZvnD4EI^`v3p{ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_green_left.png b/graphics/chroma-marble/16_arrow_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..32acea0f4412460916638a4bd3fe445d5b48ebef GIT binary patch literal 686 zcmV;f0#W^mP)y{D4^000SZMn-c000000003YBzt`Pq00009 za7bBm0006v0006v0rv((!TS_$=YSoLtz)O zh{v+ab`b{Kdg)#NqxP@ZO(wgI3WBhMc#<6y^&mRgc5q3nO|oRk%X^-NurW6MUVrd` zpMn2ul#hmaoX7O~a91Na8frt2(~Gn#&*b#pz`9)DaSeAu4Z1w9=3X4d(BC!g1iE>5 zhZ8{7PV!CNiDjm>i=)8(;=QA``gW{R^zgwXH}+lLAGMsmyQ3ZFF=8 zS(zcJ5;)93ScCw8LKSH77W|G6x~VrGXF7WkAqui8^J~9r=oB4T+CtN6!nIr|t#EdE z1^`H_6pS!XO2I7-5+nim502W$8rTT~&pBAdzzhbdC3?IE05A;`8XBB%6smyM8n$DD z?lyKm0Oj|2vZ=JIbwA^8^Bf5C)0!dhx?DX;?LzL`KA0?&a0$?fPf$ZoN^F@+`MpG zy_db6hSQjcj#&1)zE>-2IC*=rcW>aT!JENQ*karejqdE*Z2Hf@RfE@qp=-PGA7{As UWO|T2%K!iX07*qoM6N<$g47Kv(EtDd literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_green_right.png b/graphics/chroma-marble/16_arrow_green_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5a68465155f48b0aabde24e2a0c5d744861fb0 GIT binary patch literal 688 zcmV;h0#E&kP)y{D4^000SZMn-c0002M$003YBu#eXT00009 za7bBm0006v0006v0rv((!TlRHn_02GBYzyKm6ia`iFPaG>D4k3Yn zZA^r%#I1syH531)3uCuRRl9WX(xsI;RaMnWsk-zb;|P@`&BNqjCn8FkE4`UT``c_iK@?D&hg?mPBf4>4c` zGtWZ}Lzo3e=yft-M!G*yrrcYmD}z8gs!wwq-~i32I%%!RLdi&?uA& zw;vMOBekdy{D4^000SZMn-c0001BW003YBxO>=N00009 za7bBm0006v0006v0rv((!T#S44!o*w|bzHcM$3wwI+@XVg|E^jV-TOYO#pA4K==d-0+rd3js6rwFY4rlDtZ~yI*!EcYwkcGvD|L6+|*3lpz+2wi=Blt1^r*$c{{! zadUPH80pcGC%mp&E84X-u5kZEfhRnaQ7EgZs0f09APKt1-;R&|0*-N}%W9b@rMN1u z$aKbadCfvCs5^DiT8c4-SjOZwM~6C5T1^4u{%Zfo#r*!bG zk5~&DWdm7A$idMLUg`O*H?6O=*00ub{eAs8QW534Wc71Jaa~Y$OX`g}3%S5nmSR;f nznT-p5jVvR`9@CjS#$XtHTT+9&Y$M&00000NkvXXu0mjf_N5$C literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_red_down.png b/graphics/chroma-marble/16_arrow_red_down.png new file mode 100644 index 0000000000000000000000000000000000000000..8e75701d5d1852b7fe28da4d2247230b86b2878d GIT binary patch literal 696 zcmV;p0!RIcP)y{D4^000SZMn-c0003YB004jh>0Ke;00009 za7bBm0006v0006v0rv((!TlDkjaP!z`R00R zBo+?~+fhOYWPyeMq-r~K?Z{MhtUOif)UE1Lsj5_|m2nFtp>`fkVgqs=P=}r#8zEIy zX@Q?~Wc%KGzVG`@aj*UTMW(G=K zU19Q3dplG|M!=#dsNvp;qJ-`bY1$-zQktFB>}b@jp<5tO>g)uIro*s%d!alq040`% zmpt!2ibOQ>H$IP!nl_ey)YcXzew&zpN>Bm5S2zw{;d5_%+$7iWp|4Ln9vpPbJv~rC zM+a}j!R9sbCJyoY2~A(`e#HUH?gv#=83vj>5B~Nx)KTCK{@Q(t+9&_xOFXVx4C7XZ zhQO61IK{@<*jOFc?$NYLZbC60H-fqFHa6filY#d*6HgNfgWMD=nN(d>b-Y{-nmCm& zVln42!>Hso)K%3u%jdyDkv*0*$ZaXj%_+6zW#?0&;OK&&kh^fOv}C-?=M8dK3`yeN e$};z_Grs^CV=~nrEV$bM0000?~~n literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_red_left.png b/graphics/chroma-marble/16_arrow_red_left.png new file mode 100644 index 0000000000000000000000000000000000000000..504137baa8698d65ab196e4e3aaf011cab375be1 GIT binary patch literal 677 zcmV;W0$TlvP)y{D4^000SZMn-c000000004jh;i)c#00009 za7bBm0006v0006v0rv((!TlS@k*Q547jGnqVQ@|euzF)0I%s4HfIyO(h$2%k3@vsX#aC6N78fy#B1}$C(Tihz{-1() zX{k9I4B9+njai|fOvo1TJXj_JUXmabiwLf-(H)I&BFhhecw=KXv2BwNLoKo_)vZ>+ zYBfZ@kJ)5`4E@955NT2pQgB}oaG|Olj%{zRG2cIeZEMkZtWMHtgh2q7%_6Jo0LOtP z38q(9NXX8UoiT<10e)Aj9nLvCT(fU(j-1!JHH+S$nr07j63dEHa_}wnTe*do$ zp{M{(qjsm-}!&8$|5zx<>h~i z_;qWm>5j*3tyF5fsaBN~fkMjyD2;eLhEOU2R8%LQ$2Zq~yp7*?cA8mHG*i>5CRmmt zP+Aso zG;1`b?Zy7*Lm?WeOO=LlSHvC7K=I!(=qqjb$&kw$+GhYJRJB|$n>U500000 LNkvXXu0mjfRY@9V literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_red_right.png b/graphics/chroma-marble/16_arrow_red_right.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0796b26485e615ea6747fa27dbd160040be651 GIT binary patch literal 682 zcmV;b0#*HqP)y{D4^000SZMn-c0002M$004jh?(rn)00009 za7bBm0006v0006v0rv((!TleC#G_s;X+GR9*UzafC|ZCb7xGHxX9Sbm{4_7Y2lQ zTJmd@{f=lkyQ!O_unUsa#_9=rbS?~}ihehN1}e))rXH%hbqZ z^j|#xBlE?syDMH$*6j+OkV6ZIxF*T)s9Us3NG&npYgWX-QH#gxj8in@iD*T?D zgp08;&__pUnd8pBGmLU8;7Sz9@ZbPC>+5idx0~TGR1r{}n1BYuKn-_wW`^p4fL4x1 zZ-Sg$j{M2xJb)F6K!auBVr0ZCY$g(5a-0XU;&G@jjC~%9X{acFZ6c;H$Y!A#i$Q&M z7R+D}>eJI;1_EANHhR<9*nkFpyCC!j&gbUrQaG%ATUm+whQ*?%pp{I5847tmxGJpq zdFZUILBCk^05xo_?DxZ$g#|c8CC`IF?UN+MeZ6$r1GoyBOH0t=d9T=oQAvVsJ`Z&? zwuJv)`2F@Vdhv{9uUoJq5z-d~=*cp4-89^G5YonIyM+Q6Xz<%~nx3Rm+Hoj!(?px& zh=cA^Ea)i;v=Lz8uHgBns?zt0a`uwvZ;!E?NRTU(Pfe%mzK%EM@gcuaVA~~!u_AJAqeC{GU>e8+0oz0^23LzlFx7B&5s`E|7U71s9xt? QS^xk507*qoM6N<$f_fl3Q~&?~ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_red_up.png b/graphics/chroma-marble/16_arrow_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..848db56bc0bcfdc6ceda68f7cf1a2953cab4f6f5 GIT binary patch literal 654 zcmV;90&)F`P)y{D4^000SZMn-c0001BW004jh<^?OW00009 za7bBm0006v0006v0rv((!TizfM@%4Qja^FKA92~ogi~j2Ry8mHk=lIEhxxCC&QKZ6{6hQVQ zph}Vnk+Q$k8jLYSQuaUX?M)sHc+SlXrKxMT;iSY%O4F(=XO9A^;c!CAav(Ve>2^Um z2eTH>IUl?m3?}~t2qBs2c77jxBBhdNi66#`^0ZfDHmTt-*#v z06;`3Qs?>~cXy}v0+#d4grP8D2&Xkj6hY-VoKm2a;sqd-QrVq=K02DxPN%ntV_<6w zY09RF+WlR_VG>$N)T(&rBo!X zR(1=}KaYo2VE{YhW{YAVDIwDAZ7V(ZpA=40f-eC+@t22fdmUYB7uTT<{-@Yoz3MCP%zWe#WBR< z^wK^HHLA81M|BFQTtgPI{A+{ zu<8`#EVd0+RIAWl_RXX9#)r_2TdTENnu`My|DJ8#^exo&gxzWZ&U;-`YS#$ZTl|`4 ZBXdJ8^zz4F%Yc?Lc)I$ztaD0e0sz7qP|W}U literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_shadow_left.png b/graphics/chroma-marble/16_arrow_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7c034cb32e63ea7a7bc62796ecc3f8413fd07a GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpAgTe~DWM4f(7!%$ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_shadow_right.png b/graphics/chroma-marble/16_arrow_shadow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..333843087f479cd3739a3f10d779ab4eb2456310 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA>_0f-eC9KOu}(hQsh9+5ynCUX#G{Lbcb2q+lr>Eak- zaXL96Awhs4DUpqhk{+LN-2c$~}{becCvHsnnZ*vTf4DqzU=z_dez z`2z2wWxE+usvF-ps8~y#^z%qjPwg@icD*UdFl&um=(I)mHh?VkboFyt=akR{04}jT Ag8%>k literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_arrow_shadow_up.png b/graphics/chroma-marble/16_arrow_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..80a939035cd1cf2d595ab32d9ae8f1db1b295f39 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA=a0gOGErbmGU3p^r$f=uQh%=n$nV7gumOnn2b2oyOz}N`1aoG=Y7QkubH+S<5{@yoA-+qwX#dJ zx7fyRynR_T{#ya7WLd1^io0t+yvcJtk{9OkHqG_ezf~3U)Cvs3T~qxgR572~Bp1qZ S!hSQ*J_b)$KbLh*2~7ZD#Zhno literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_blue_down.png b/graphics/chroma-marble/16_bomb_blue_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f38678ab0760a83a84ffa32e9d6b72486119ec GIT binary patch literal 836 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 T^8>b)00000NkvXXu0mjfgmQkN literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_green_down.png b/graphics/chroma-marble/16_bomb_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..5d736cae5d0270e242621d0523229dbcbd0d9c24 GIT binary patch literal 836 zcmV-K1H1f*P)y{D4^000SZMn-c0007_s003YBsguU*00009 za7bBm0006v0006v0rv((!TyJ!n z0-y*5Hdv~$LPw1fMb4Qb7AR5ZUenw(EbWrr;|_glPHD@Q-uLLJNhV=~rAP%TE0ReR zsX&WH5c)&U_y4}LzF4zux9CmWaIBA6+9g98n57v2qJ&@rMJx~{=%lfG%fq(^RE6xS6A`d-9O^`t2*9|N2a+OUk08npNmab4jHttg_tA?s$xkq@2hq zLx!;$$&%T%JDOd?_{WGBPtKY7@f>~QZU6{5aBPlwU%%%mKVdM47HqJH7k)H9`10}# zlT6g6#zjZ;k)lf-MhsW8D`Jjx((!nB#FPeaJtP?0k)7=D*Pip@9F6Aa@`!%bqcfRK zI-EEvT>zdlsR7HhW8r`K1gW)MY5hT$1mP0(SOiPkW9NdBZ%RM5(i8*0R zBT*tD1&lEi&%<-3!$g%UthP*PqC0eyM@4D zjqAw5Eb!jb-}ktU!~g2}bpGi?5T=KzbG>8RZdsfx*bjTg`N-mY@%DdBDY{fOTXiV_ O0000y{D4^000SZMn-c0004jh003YBp=Zgl00009 za7bBm0006v0006v0rv((!T3Nf(g zf=U$+F%p~EA_Ni-Ht)b|z+zTxs!BysX-P=xIPvB9od0~E`Y0d&-j3T3!36*!B3fz5 zRSp_rVrpMAgaM@$xyo7j6|Z=89`EBX_I|wo(CO|Uk4K^K;yKpG^s48V{{=u38jLc` z^_)_dyp7*tTg%P;&7U?5fl-aoC5{FKYmIt7o=Zd&ZIIcCR>UV6IF zQJ8{dx8yRuD$|;OD_}CK7(lu=3H3--G`55oga978f7iGV=XX8;&)5G{xmY+|vw0f9DanY0sv3TQMz2duLwQP{#_zxH42>ZHQ8j@QfA%%(HWj?PGvl#m1> z7okOi0stK}!2}q=_a0mO8WRlVY03Bbcc!~3+aFtIvl+#tz+ypQG$TqB&N=|blM#RC zv4T*Cnlz+L&6G{PVe{993wOb@?K3hmtg)mv1qCQ@#v!rb2anBkhR2iY6c-%xcuqam z)LG4Ke#@kvu>NmN8I@ctF7TDdYmZn#DTS?l&5=D~H||JO!fIGCgn@>JshMI@!|mlQ z?x*AG{)(!tD9=ljS17BnXYP!?=}9Fe(het$6X{ z1xcJ>VuLM*^5602NMQK*Rd-a?CsORQz!^_#r^Rg_z Z{11$|aHgs^#!vtN002ovPDHLkV1h7%gkk^y literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_green_right.png b/graphics/chroma-marble/16_bomb_green_right.png new file mode 100644 index 0000000000000000000000000000000000000000..12fcdb9d565be9ee0edcefeea66c5e36c35c7c5b GIT binary patch literal 854 zcmV-c1F8IpP)y{D4^000SZMn-c0006)M003YBu0O-w00009 za7bBm0006v0006v0rv((!TxMy0&Sr+d2Jyndf7EF~wXDwTMX-uzh} z$`{MHyavd~=u*d6j6s6IunRj}bOo?%FZ-7)(~{3e zpJy5cAq9jGL>Y-PqLLzs1PQvlW7LiC(bKm*#cjdmKbI6;fj-k{EHJpU2r7`o|0z*M zw9|O&sg@NNe_yb18@~VkoolXnw0X4C1TfLi44S(WQ9=SI9adQE&a(QpqNoebpPUmP zMkJEQ^<(zm_h^B@M1zV7FFi!C(NecHRaa5p)_i^Nm7B#4K6w^m!A#8W*&TM2%aVQE)1I}ozqJ(mfpIRa&RN+N+Xq{=ziwGID^7MNL>UQrVA@YP zb7#2L5mUr!OV($M%m}^p+rJ7`yl_YE+EtGIw>`G7xL+LEIHOV(DJ1OPQf^A7vnjXj gE#0VN`qT97zpUA!##M35>;M1&07*qoM6N<$f`e^>Jpcdz literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_green_up.png b/graphics/chroma-marble/16_bomb_green_up.png new file mode 100644 index 0000000000000000000000000000000000000000..d721b40082775776ae9112e97bf30d15d81d519a GIT binary patch literal 841 zcmV-P1GfB$P)y{D4^000SZMn-c0005u>003YBrpwHS00009 za7bBm0006v0006v0rv((!TdSQvoe_k8ErvE#U|l(=e(#J~co zE{X(V&k7c3BsQ}}h)bJ$;2yXG#A-&ZrfR1OZJPKm=a=VEU(?q=H-7Uax(Gl<#+XJb zRnh3?K%#IHZ?-mClqf1yu?}mR(BL}vx4H2*UnZIU3Ir62kOGY~?A4wNeZlSZE#KSk zXr)=n3a1>0a>&pR`2Rc-ZN%?AYOm<}jyOfGch{K7aGZ`Q9t!H~n#xw>HYfKv-PrNC zeWbhX5F0Im5K|Vm-!*l4-4ciir8x!PRuuz5fl-C!`J zl$hc~t!tjjQ;y6L!)8DVVQH4sn;N4GnaWtZH7+>r*Z0UT|BHnz2q}DQEwjaXDSG3p;X^Gx>?4D3DT>jA;ZQq`-^p1uL`Sv3q2ck)Q)bQP8eh z%Da-C-(jQWusCGdE)gx7DNSs{mNATcT6}^8HdwszOtXn`F>-ov%A3nK^r0u0oZRFT zvjSP_C50-;RK}~~6>~kO?|XdokYFrE6be%sj;bS`?Ve$yC8flCF-Lw*KLK#b@p17H zNrDX)l@w7TnahwQh!&olJmLJ`b4pz@`3Y}5W*fHXsCheoix{CFdH`JEu$e_A1qrd1G; literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_red_down.png b/graphics/chroma-marble/16_bomb_red_down.png new file mode 100644 index 0000000000000000000000000000000000000000..49e2ce54422d921fbde83a378b3306981a3a7c43 GIT binary patch literal 835 zcmV-J1HAl+P)y{D4^000SZMn-c0007_s004jh_w6+Y00009 za7bBm0006v0006v0rv((!T{B$&s9ooB)(l zaFbjh66eSPxCjT}Yd%0S7%2<}^%(bT?OtBLH6K>$2vsHW>(_s$`TVcRd;TX2fdC{x z&O{&yfdoX(L?LkA(``2YX!qmCEAisRl~jt95?M;5bBL6PRRuuO8j&;7T0{uslvuCV z9Gd2p4y#q&UR_aKT#$@GdQVgep%m5_R0xO|nT;bV1Y`)@k0ZBtcd%O3GC4=};RA7+ z0PtGljbSWHf|Mj7$T<_VCJ8|=B{y}ASuWY{c1U%4O3^g9z9&eDiV<%NQERdgs2GV_ zlca={==z?2zkTCky{6f2kzunz9v@?tOX4sPXEOjqN*M16T0i-al7lgPeR$x{)rw#( zWmzIcRguRLRoB?VfsivvDO8LU&Y@y_s^UGXwxwRL`St#u^6ZSCE-#T%DYCW1wne>t zOYAyk-lJkfhrrBQs=jB)nXg~I@W-c5$f7_O1+%h5s>@46St5*Kc6UeE@5wPDawY@i zIFfRv+3ncXHNTA`$vJY)9M9)Sdvo(NkN2qKW2$%W$d8Yp6fz~eF}RedzklcD=g*{R zLRA&PT3iU|*tR64m|b0wLm;&+-F{D@6vjCs(2OH#x8vG5^!YhR$>q@ztG-8)GpTJ! z)*{Oifa?8w#5jTwgq&H|HNW59LP`jw(5I&qM@M*Tk+P~lN@Q7*yr+2f471x2hk=wc z<1nyk8h&XSa*W8TLRA&IED=&7W7~pKgvUpc_qe7ZbRBWI#Kws2I$jL!2hMw&kcO$lEQ$FmNFR)AcojbL5oJ*5Zw!n9tGf?Ci}t z1k_@IbB_DIXJaitJIDFQk0+$W!!)(MwKUr;CyNEc;lO+xIbST^{0BX?x>Ti@S7QJG N002ovPDHLkV1j}4bWH#N literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_red_left.png b/graphics/chroma-marble/16_bomb_red_left.png new file mode 100644 index 0000000000000000000000000000000000000000..46e39d94749f5c47c5afe147a0e2d9a4531d0041 GIT binary patch literal 846 zcmV-U1F`&xP)y{D4^000SZMn-c0004jh004jh{~0=600009 za7bBm0006v0006v0rv((!T)d`+91m$*w`75J(vHsMfU4Yan2{g$B%FAcKgA24**d_ zXj?>{BLU(VSJ(JqKnj7#bKGhLmzQUIrM_spTz-&U_ZQBA5CrFtM@NXh$Nl;RfNvUv zQpnj1S(e0a-q32z^7i&mJ$R3>mR?G1(;$-sw^$&wrn|pKjYbHq$!~5*uCI|%gwHb8 zyB+s+jrPNUl9J#(Aq323gKJyd;ecxzlGm>(-n}DA5`uFaoTC$hM_|)+XmxZ1yB(qL z@m+^13cAID`09%4(T9+z|=LtT4a`?twnf`6@pYLw8%0-+oE5-B!B-NRhGEpV|ME`;c&nRfm4duIfgiX zjw&Uo_nc%ITF>W`_~wSFEOAA_Zog-Ecpw-qBWX4XZiTZ z({@Wbn~^F-h$7VgVAi&@qY=V;kP_)VMr(o)jI~DhU%%GJRYhwIi_1&K(|S+9x8lKJ^Lm2*hv&>>#k!y4CGOS+HP?nuy{D4^000SZMn-c0006)M004jh@If#!00009 za7bBm0006v0006v0rv((!TA;@fdvVSc@!h+> z?Pl}JFBUfdBnh$W5Lt!CcPCnu!ezL6{z z$oU+x-{V&+07BCsltLaKBZdKac*w48xpEHOJBKm`ljro$pHnvt>dP0Bt1J4SKT(qj zLTg5k9-)ju8N;yIu&rxuV?>7-5zZlmKxG+mI>o+tK~+_#4uOQhDgwnd~VzG<*U zK~)q~2M1^sBg9A)0xu=ndxkt`oaYR0-_osCsE;3+lqEuIh>>Bv#yiKlEYVH~%rFp@ z0$@lILI_CUAj=48ihuKlZCT{qToy^bPtRkD3tg2#RnA` z0#<8!=eVva{=K-suGjo|c?mZ+te-yJY7Ycs7&Xnkzm!BkT8rp=wtdf!<&wH6_~ZPX zCn128)X$!Ax!a);f?y0mDWr1*AoM+LUDH(+cXiF<@88L9Z;8$!@*FjrVMZf{qIftl z1n?dk0{iWj>#`*5cAT{>zqc*Bq96Yt2-!>bX<&y33F){>F?-{03 z?AaNuwZst6eb102n8^g~%km#pmah)2y{W9_$8JZ__ncTumL#aE!pF$2?^%~6v+0!f h?v6><@ym4j{(tVqqr`KX5bgi~002ovPDHLkV1jwWdV~M~ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_red_up.png b/graphics/chroma-marble/16_bomb_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..723a625f883955b947cace24006cd3458af1ea20 GIT binary patch literal 841 zcmV-P1GfB$P)y{D4^000SZMn-c0005u>004jh__aT400009 za7bBm0006v0006v0rv((!TK`+vRI(DTjb<~ zAD5RjU%#TXMs{~m&LKNHbbZec?-3g#TkqK_Mc1~BF>-%?&S(s2f1lf;;Cwd2RuwkS z@p;bBwruY1xNKV_S_>ki7)dGNZf|kxHQC#@gt}(YG@QM7f$w{wwb-jGwwITz&(2ui z-XeOj0Aolg5yufdn<0-MWA^q~_dSIOX1QcNo1u(BWf^X@A~?tD<_7WC*GOHHLV%QT zH#f{bekA2Nsqaa7&f(!9{~aAMo}Lo!?@@V*S0@<@?nB864yE|kU z&>>J11-nhdRaxTi?}^q@?Cj7imxyRh8b`urLl_3?4xkZyfMOUxDN19g_V&1c@`PwDDJAOZ6dAvN zf0*wa_51fE5rVZOrH~kLSw<2;i*WGh5&s__qstOMj#%$8VY4A>&Ghwaj0k<#0Z=$c z_B$v6#(QdG*k3LgpFd|g44ifyLQ2HVhWzErhxQQA-lPARDFR9nj6pM0)?(Y19v*n4gx8w- z>C*#a=kqT=zkT~FguvE&ehvfIea~K1Q5l04A;d`M9IJ6;KAA9B%QVkv>iWws@923w T5Tb`{00000NkvXXu0mjfxI1rj literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_shadow_down.png b/graphics/chroma-marble/16_bomb_shadow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..96047381e0e1c4dd819e057a4a74d69528fe1aa7 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA?Q0T3%NM84{L2NEpshy)5UnS(IncQ%(pKtWYc7sn8b z)5!@52?A_Mx<-Z``ZE&!)vigICR}LYhW{YAVDIwDAZ7V(ZpA>l0f-eC0_EDafCLLXB7uTT<{-@Yoz3MCP*By=#WBR< zbaFyMf&g2Ru92aK{)|L_wQEwQ30E2dnO9^mxZadx_{3qk({9lQ8K4FRPgg&ebxsLQ E0FVYhW{YAVDIwDAZ7V(ZpA?Q01zuM#JTm{00|a&L;?kw%t4s(JDbZPprER!i(`nz z>Ewij1Oc`rT_Zye{TYe=YS*Mp6RtD_GOx&BaJ?zX@QK56r`@6rGC&Osp00i_>zopr E0LEP`)c^nh literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_bomb_shadow_up.png b/graphics/chroma-marble/16_bomb_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2de16999f7d77dd7ff6fc965f726aaf417a67f GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA=)0T3%Ngl%eW0tps)L;?kw%t4s(JDbZPprER!i(`nz z>Ewij1Oc`rT_Zye{TYe=YS*Mp6RtD_GOx&BaJ?zX@QK56r`@6rGC&Osp00i_>zopr E0KGFTx&QzG literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_circle.png b/graphics/chroma-marble/16_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..24294409fe895e113aafc5c70b6b840b7d49d633 GIT binary patch literal 832 zcmV-G1Hb%y{D4^000SZMn-c0001BW005u>bAb;L00009 za7bBm0006v0006v0rv((!TCZ&6mMMa%jnw)4vxa9-hT2`EAwFoq^<)^{VzmG3pzIX8C z!N>xbBuA>cIaySAqs(GUodi)OSVtp5)QmHRA{2-%HwVr92*CXM&0;H*;dIh8cPGmk zNi);7MS+fU7{C~Vx0YZnrSn|OD~?}08@%3K+wtn%t|+DCgrHdr@+KnIcgHXDq#pVS_anoRcR)k<3{gt(TY$kiQ zLq;`WRIlE27HpNwqpK?Yt1F+&fw?ZJJC`!jUvMQx>G`Z!i+jr|} z9G}<^KHokcPF|hXsg+*r+pn&E~Y%3|OJw15*$+-n!uKTfB4BOPQ z8Uo&2t>H>@(oE7!(>5%Zmn@d!VcGBP!?h@X|K;=h&hWJC^ftXKoVAwH2UdMxR4@2# zGGaC#%4l*vyw_WQ`0>{t{u|}L@xxa?Zj77i=;dUvv%S7mc8hL*wdgROUsi+aqJA~I zIBjgX|LDnsn`OF=!%x56>aN|{?fTAMN-ZMkcq;Ma;PFQ{>ij1x!GD=zYTl**0000< KMNUMnLSTX}0EP4b literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_circle_double.png b/graphics/chroma-marble/16_circle_double.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d008d5879b04fc370002d2867e53206186eaf8 GIT binary patch literal 890 zcmV-=1BLvFP)y{D4^000SZMn-c0002M$005u>dvyRy00009 za7bBm0006v0006v0rv((!TfWf;YO&wD>+Cet(~X{n?nRk~<4 zS{DOux)1~jWaTRVgV0Sd3w09|R~G+;E=$%@&|Ox7Fo=l@0}7_*qb8YToVj!Fo%?=0 zZj5LT95{<}R?qVjUeVyGuDa+q5{W$(?TJPz>-tUbeWLC>czo;NzkRt5x~=ADC2k^o znW^SNjALs}h#nha6u~6XTBG5!)#1|DvMmuHxgHV{JCF!J$+XVyvCwY=eo_2Ee<%Th6 z&xQ~o(tSN)>T60{Vw})&IcZ2xQL>Pb&$l?KezLLJFN ziiw8Ir{tQVqSUPh;|$|z!D7eLZFNnNWCT|Iv^EAcb%)`gU^1LQ z6A8g%gJn1x^7F6zoF1QXclH6IR=umNw|++ezWaRd zA7Ac~n*~;GzQtUgFqxdwH09R&Up#su*RQ;r?mzFgZ>-Javl*_Qa8e|z29YU_M-><%w}$Jr`+7jWL;T^U_{&dJ$<8x*Ho z``sVbuVIo`asK9$?^h2mUu@i&Tj+K2R!>8~2G<{zqyE|OeCN|=kN=1B-_Ov_zPtDE Qp8x;=07*qoM6N<$f)PTb*Z=?k literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_circle_double_shadow.png b/graphics/chroma-marble/16_circle_double_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..bbad610827af3cb08089c433ec56d03f50ea2865 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA>_0f-MU$aQ4D0SOj(L;?kw%t4s(JDbZPpkS4!i(`nz z>9vy`xfm2VTyOJi&b`PRRo$TU>fiQR=Mw~!Oeb^ZE6@5C`n+VfBf~__H_^9PIZ^@~ zlDU3&B!_%fXtYxC(mGzTwrG}$*Q7TsVpF&JWr*nf_jvb2FGrxMc4@&o>t)+KZ9X;p qYhW{YAVDIwDAZ7V(ZpA=a0f-MUh}EQQ0|^#*L;?kw%t4s(JDbZPpkS4!i(`nz z>9vy`xfm2VTyOJi&b`PRRo$TU>fiQR=Mw~!Oeb^ZE6@5C`n+VfBf~__H_^9PIZ^@~ zlDU3&B!_%fXtYxC(mGzTwrG}$*Q7TsVpF&JWr*nf_jvb2FGrxMc4@&o>t)+KZ9X;p qWP)y{D4^000SZMn-c0003YB007_sjG#(*00009 za7bBm0006v0006v0rv((!T~nx^^3IR}9Ep4n_hUDs^4TL4a{ z6H-dn>or~1u~;nF@ArIsd?1^qp)5=G`+aGQDUu}N_4O4gC7++400<$ty}d;#g_II& zZMNI(^k%d9SrCRHecu=N_xH+L+n{`7>0kfZObqWczPtY;he)-OHmXE zA(&35Bg(3(Xxo;$t`S1~H1T*mUO3C+@kpNMEEWr@s=|9eiqGdWP18tgZ6~E9%QB?a z`oUUDnx;>Ap8tA&evUVr4L3J8Os7+X5P0t~#*pVZTI+hd-M%zU^Lx2mKKu(=1cC$r SkIjGp0000YhW{YAVDIwDAZ7V(ZpA=40jP|D;j+x-#UQ}~k4T^(lQ{@8erIzz1Qhi1ba4!^ zIGvo3kRZU8q-$j8p+6(hU+tQc*#Wi=-OeLsH+UL6BLoi^bZ?MKaBbPV){R%fwBZ?B vgm7Ym=`O|%Z*YhW{YAVDIwDAZ7V(ZpA>l0f-kcWX+ZP4-zc!hy)5UnS(IncQ%(pK*2Ci7sn8b z)5!@8P5*yOv%FicFOYD6@x!V8@%I%zl*j))%`7Yww=SPUKp}MA!#{tR8dJ9()HnX? z8~;t+f@6XfKig++CKjmzPa#GBS@YX7XY?#<7M#z=P`q{D#$7fXXMr{_c)I$ztaD0e F0sw#$MbQ8N literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_dots_double.png b/graphics/chroma-marble/16_dots_double.png new file mode 100644 index 0000000000000000000000000000000000000000..983191f98e0fbcf8de338a4f9506362cdbb4c7b6 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA=)0T|~RN}mJ?7I;Jg1)0o2nDINC%ORlP7f%<*5R22v z2@FmDe@nBxTdyy`u(`af`2W4|`<2=s?*=k7Wlu{ z`taLo*D1a~|NUc`^C?x(?5RRHBd@0bgJ;tX>)pva)t^(c68GQ!& OpTX1B&t;ucLK6VvbD8P@ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_dots_double_shadow.png b/graphics/chroma-marble/16_dots_double_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..af5019cafa3690901cc3f746da7c3036c01b12ef GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA=)0T3Tx;5bu|2NEpshy)5UnS(IncQ%(pKtVfC7sn8b z)5!@93}PB=jA;sCO-X46Gi}rrIW450g2ltzFA3p^r$f=uQh%=n$nxWa#Dr*+ZXyvIq#k=4JcZhjGN88B^D~X#g85njg;Bb7kU9btLOSQx` zq9nN}HL)aBHw8#A7#SE?>KYp98X1Hb8d({bSQ(gW8yHv_7~ELZy&R??H$Npat&)I- zcIm$$Z%Kk|2+mI{DNig)WhgH%*UQYyE>2D?NY%?PN}v7CMhd8i!PC{xWt~$(69Awt BS^)q6 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_dots_x.png b/graphics/chroma-marble/16_dots_x.png new file mode 100644 index 0000000000000000000000000000000000000000..a5433ee52234d8a5a2505e41840dfcb7a76a7c5c GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA?Q0T3@>NXisk3KA^vhy)5UnS(IncQ%(pK*8glE{-7< zr;`&Hn$}yd_Sav@`6aP|Y0?k*?IAnm=TEEQQ}fiC|M2UvO>LpP3rnATl8npMiQlos z%%Ca8?(pWVs@&n`t?m;}r&sLRv?B3-%MYufpFG!}Kiv@@Kc%=Y#!li+)y_#rHSu=2ENlfz4rDUxvLI(^B=x^b*O_`SV(-*Y4&9s zCUw~E{m6atsd3G{u*mJ36xTEYt(@JP`dsZv#g55G>o@H>kzO6nV-w}^keT5gzs8xJ T6{Yn+FEMz!`njxgN@xNANz#Nv literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_dots_x_shadow.png b/graphics/chroma-marble/16_dots_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..03ab7e6843f4921deeca0ab990e62d9cd1bbbbc9 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oMi=$=|K7e0|R3LgWlfl7l9nM zByV>YhW{YAVDIwDAZ7V(ZpA?Q0T3TxV4qUO1QIOphy)5UnS(IncQ%(pK*11C7sn8b z(@Q5Baxp0IFn?xa4VRt!^?&{55Xb9PjXdrPw{&hXJrfzO==ba=&*C*{>l&_}Wi^Oz zh(DnCNUAh}q3mq&J^g9}-VNcG89%fBU=?{(-pd_uU7&D{WY#pG`3#<}elF{r5}E*O CFhuGA literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_dots_y.png b/graphics/chroma-marble/16_dots_y.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a37a29cfa808446912760264bcf95fb65fb297 GIT binary patch literal 305 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_map_top_right.png b/graphics/chroma-marble/16_map_top_right.png new file mode 100644 index 0000000000000000000000000000000000000000..2abfad8fbfee2e303bab6e6c45f0bbd37c6db6e7 GIT binary patch literal 878 zcmV-!1CjiRP)y{D4^000SZMn-c0005u>007_sok򪹩 za7bBm0006v0006v0rv((!TKd@3yRZneHsYMnDN(JS)g_JlX1d^15H-$u0>aiyus6<6C6@R2N;Z>=YM!Vjf z`M#NNW|e*}S2)dP4i|X9okbtV%&S0LNw1ENa>RL9r!;7~u9(ua#u%quYDp;YInIWf&7K5=%!SIf>xQ39Gw3iT5Ck3Sj-$3*H|YC*$oXlA z&XiV!-H(D@^aS(DGh3t42@@puIPBfuz8u#nOc z3W+w8O7$xD08PjMQZ1s84H#)0>-$HALV}>}D%^Mfd0@E0Yb}1zb*U^7Qg{y=V3m`a z7J?ojUch6LFqv{9nXJ7_B+9slQU>SndeK+D93C$G1t7k4$8kU=PXGV_07*qoM6N<$ Ef{i|fkN^Mx literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_player_one.png b/graphics/chroma-marble/16_player_one.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4222bfb360fe8aa2b00e8c1430561b35422360 GIT binary patch literal 715 zcmV;+0yO=JP)y{D4^000SZMn-c0001BW00AHXNx=PW00009 za7bBm0006v0006v0rv((!T>ro24j0Xp5ONZ0DzMemDRCW?~{m_ub4lb z>%I8seOLoP003vHFfG5hsd{djx#*fP z7&Dsi2JgDLoz|}I#n2!X02w$-g)$Ab?O4pnBi#vmbB@{^cBq$xL~h6A&!JC)0)mqi z{Zb7*3%lkssud59R2A6<+uMYS<$|I~RdIUC`Q>;2WP1(w)v;08^E4)p05lskGv@cC zL_$?Ef8ydBUl%=FTgREkYTvMt`?}`#j%rO^lSN`AC8{+caP^(jf4SPEbChe_Z;&Y0 zT(>CED~J(jHqf9*JkGd#;JQouR~92uQ>GJX24djZk8E~{kt|RrS{p!&bh>Q!sA^K8 z-I2MNk!lV%_^nGb5l|;$#%e{Kh>_<#US<4r&um7ykeS?lw!1DJc1R`Vk`O3zVniS% zvPeae2YGLvcVS zr!k^=#nS`BiyKET_VoKp2moM^3e&&7_;1v+`8F3bwpu*RXlM@6bC>a>-`}qR;D6R)1-`s~X|VtR002ovPDHLkV1ifQKHLBR literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_player_one_swapped.png b/graphics/chroma-marble/16_player_one_swapped.png new file mode 100644 index 0000000000000000000000000000000000000000..80d93e59fa4c155f2fa6260aa64e1726e3f61e95 GIT binary patch literal 740 zcmVy{D4^000SZMn-c0003YB00AHXMws^j00009 za7bBm0006v0006v0rv((!T=sZo@F*3He$ zTC3GkA08eAqTla}tE($Kw$ukHHT`(6sT!z_fR;7*S=jR#%@p$}?jaV28 zrl%trw_;eJ2Pi{OJVV5MJ}(C>5{c;S$luclkV2uLBN2i^EV$Edx8;qj6$OJqayT46 zi@%R_B9YM8Dg!@|s;W}l)6-K-pTU=Cs}cTfp)Zrkq_WR~1r|P^Pwrb=Tk%!T-_|E} W+(9?uFrwlB0000YhW{YAVDIwDAZ7V(ZpAbP0l+XkK DoxDI~ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_player_two.png b/graphics/chroma-marble/16_player_two.png new file mode 100644 index 0000000000000000000000000000000000000000..b15217209b88d4789ebe8d0a8f511d729f2ed859 GIT binary patch literal 709 zcmV;$0y_PPP)y{D4^000SZMn-c00000000AHXPHgyF00009 za7bBm0006v0006v0rv((!TVXDdnKm=7T%=1(>_Ano+8#Wu79XTVjT9Z3N3uC|jJoTa~AgXd< zm8Te6&WFl|FeJ6)Of1Nm-iRX7-y7QY$3EMidQla@tMtl2er~o3Hi_+Hk(pGv*$p-;-7ho&VjSl0-2yR?a2;_DHqrI*-8*acUc!&2L_ZK&5Y z4KWfB0-X{iy-d9!wd9sI)3%gBv{w)U0wEG2F%Sc7X3z&h079f~$t`EFw9SGP~}${;1WBR)Ogt0A2ZIg@t$b;;Ym*&7fe zy_nt2&Z9@Kk6iRmT|Zsge$UNQx_vqwAZK=o_wPv0XntVz#nNTx)a%YsG?^q9Z;x4> zsaH#*4ud`d5F>43wWgj^e_TqlGvD1EJDH>iPA19YUyiNr&)hyNZ4)sZ~vJ3cK=783);-yfYpNE|IFSzoO)Isn@kcw002-`g?9%p r4Vpu}l336*+}xl0&5@Hy0)YPk<9r}ordimI00000NkvXXu0mjf1uZb( literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_player_two_swapped.png b/graphics/chroma-marble/16_player_two_swapped.png new file mode 100644 index 0000000000000000000000000000000000000000..9caddd503e0ed570bcc1f133583193b760384fee GIT binary patch literal 726 zcmV;{0xA88P)y{D4^000SZMn-c0002M$00AHXK{WC=00009 za7bBm0006v0006v0rv((!TgEFYG~I)Q3RL9yAg~L`W?W zEzpV(O*0YHv{I`>WO-El2)`Bl3G)}u^V!Xsd-cNYUI&Ib>^*DE+H3D4Nq?^ z43x=a!bYPJn@*>!)9J86p`aiqZCki-b8{olW;1QIT2ZKnAog@VDLc7A>?|Ca=b ztE($Hl}f3vudnp+@j<0hiHgM{<#IVXIXNLtuHN3>{v<&llgY@JmzS#F?-#(QrzZi% zzPr04m&-+*oVW`0;NU>k>2y0Aa6X@x)9JJt2m~k+i3rJSf^xYm6d;$)W+|CWlG$ul z^?Lm;l18JUEEWrmp8_PyGU5B-;bEhI8%SKCIN#phM2r(@cDr4X;P8Atr&g;)^?F^9 z0DOOcPqkW2C;$LCu9o1>ZsT2313h@ zOyq48=jrJwx!rCig+d`E91d%-Sd604C?ygJQFpW1Bq;m(`VwA1vc+N{r_(7~>ht-u zy}dm}w2>#|v$Hc5%(#db0R#aQK#|R6qr<~PIzB!ISmh*tW&t1kbumaNrQL4Ra5$v# zcq~XD-()h8)oR7-s>kE`IgKFU<0|t(Qeocb=ci~b|CvPV3~oQmBh9r zHVNXVPyjyu`RAXXkB^V*x~}W{`}=x6pV#;I_jO&@_4D&{{rvn~A0HpDe_z*ieSCae zpP!$vpY8wu{rmU&{{DXb-t+l<{r=Uhv@wnDn*L7X5?|*-Pzy9QF_j+(=KGa?i7nTRI zKXiXczGna4-Vh4b{yYj+E;tu%Yuf9w&9MLP=bc`k-{<%8YYRvFS*~?I*FK={@9)?1 z?Zchcl|sbl-vYkZy7xK%@M5l9eEwp)$@^+9?7d)$P) zF}bG4^1M-<7L@bT};NRchuSIU@Ocgra8g2$P1P_SojCriRK@#dkF@ba4fbY0iAxLLVKsuvRI9nL6sUZk)CAmQdyf=E-s*fW6G}c) zu7%HT@15&89nQX`{LJ?Y3zvMoOs#P4NHz{rhXLX^t3mq3_d?U|1$w8DNP;oAZ_Dvqf&6VDBH{omFy7PAyYe;7rdVM%dD^RG@r0>_Kzm$&bY9SbjR91#R zmOE(XhBsvkQ)UGBM&|oWW+UVBy?6T%)>^-!A%oWUzVClqHq#=G6v7lb3u(CzhET3l zcjk-{2WLdU|JxxFiR0oZ#Ri6?5SZVPc8yM|#n~wY8E&;agV|yF1Pv9Wuy3@FDP_wU zwA6Q+Tqc29E`?Fa^ZEQ23T6nDxqC(dgk23S%n*+lc`i1Ei>4#hTdJ)L(@fnrzk?=f zM-uj26XItoIG-)mEkiVF%*k)D%az(W1)lrLJ#6d$`1tr&00^xzQ$~Dy-^MM)?GPGX zZntRybrKgh+?!gaMFP1lgLjEZ9$ia4Xm-7(s&Vu1m=O{jU-&&GM#4rk|$t}B-87bDI{(058VY&WH;`V{ENey0f}_HQ7PfknjfbFYn@!CRgO$b+7ePG4VNzgXA= z)m{Q%-X@(4qlcR|Ad7{j#7v8!XAEspWtm;KoO+8uOeOPKGPG^>bAp=bT(-<24=-=N z;V@?Qnh^6snlt?(gc!8QRHJ#~Ep=+XgAp-X2$`EPaqBX>X6a(H#~H6%I@(me<=;<) z(+RNQ1+q{(wFhH*{%M+kn#P3lmj@(6ntz zD_A*U0p^UEQ)nh(s!}o%>YqPI$gejsh0ibEvYgvYqGe1p@ zKp1r*Ri-01IaGWoTlhrWG;?GqpJ{_;k6YYs39Xh!&fiZJ%;XmR5`)Pta>)0#wbP+w zqHpbQ=B+o0Z}z=m?!5J8|LkyBsM0cYL?x|o(;O>$+7_Bk2_)kOTE@{TsO-H-achTf zS|uIj6Ew^)^;H@4cs$;C>Iw7m<~N&dw>Q;{5j6842yYT$OGl69f;QG_7Fu|@oy|?6 zYkS8Bg{sBcjjPt|RFW7em9$Sr1)r)}EP>K6g~n}UA?bAUnA0~#utC8@?-)Tf zB-6m2+)w%?h7Y6(x9s2>BPbarrV2@zwA;jdbxRMkfRt48N!v7*%#=wqkKKfJ0+=%D zvFM`F*pruU2`ejkZw0M}>Lpxn$RaTqBlap3ybsB~S}k460@55zA>35n)tEgkU*Ep+ zCNZPdZnTAjMxdq7!9oqPpP9b45ZttYJyWX?PR&Z{{wq~)ob)DbyzOT1D1nxXrxuw) ztX3~b$)*}?NfIkpBdXbMVxv_x+=8Eb;yv7t7Af4$^MpMCPzU zgofm0xWXHgHk(pwfDj!)qfnoCgBEU{vW#3uYEPO93w5mu%N)U}RnJt~&K5Hku72JL z;VdgREu3++A#7&X?2Ap0QVkmOrQrr-`!tT$)% zDAP8!UuI%WE9B3XapD{0$PUU{tK@5UKcJRAZb^+6Q(L@juyWo$Y6RPO19ckp%W@V? zLvEC>dFWQbWTwh;{CA3NTRGp06l!(kgn|viWF;y+X>)WkA!Pac#;-FQZVrvr_$63# z+9>l!?wByv51x1h)4!+a=v4I5(9s45zd^zD9H*vATzu;fU{1_*;OrS>$sqHvnc8hV z_?q+9P&?CthU!_ehat5QJerf-u=~bw;3YPH!m5Z~0zkTTmRsBAw}Y9Sx)#@;c!nn? zPW!zUtxPR$EK+HF`sp^FJog3l^c>VFgo& z%J(!=bSe^|DIgQ-loBThW`cI2)lW^h4Ekjq=fusNe2!)4QX@xFVwq>p(589LMiwy# zia#T{(r|w>QKk`C8qW7*vy7IDH$bLEBU1*mC3_}Xear6I`?r?4|I1pgw_DS?S~LeN z>jKOsoshib$TfguDomNwq?JfbjG0qUKEw$aeP_Vl}c+ucm&tRQpp6pQ+aDm|@vI6S7m)u@Ov9#MHZ*BcCHxf76Jj zG3azJCM5E9vi+Dzw$;X&FJLWXt$#h8N)t$Hqc-_3twSlnB_qXHE8A0qFfnl_h`rTY z5H@e5Tr+i3V(eEK*wT-wS9`^ z?aSg=-A55?|>@QboqYS26w_M zPW6a)dHndU~D!F(kJmEyFut=q;Piv_*kvy7e zZncmN4{4RY6fUB9Zw(yR`nB&TQ$4}pZLZO>HgJ|tCkN1g5KF~c{~;qnwD2htPi7y@ zTjuMh22{*VP(`0Wt%-rm##;Di`!klr?sOYUC$f6)?hG|{VCSJpxodU5 zrZvc7vDRjdZat-c8@FI`LK_-)V*9kB5$lI!DCqRLRzYMLR`W+1zTa{%t-Z~f^7pM^ zqJ=0^ZCy4ym?DbSfLhh)Av{eVXB%3K*6+rh(W zeE9%mj80QKPQ*oXtf=O!{b^?VS}V5}hP6I|4T3dbYBCek4YEmQtty&(V;ZX!bka07 z$Fr5FvCZCFHn7FeQ{(3;;n5mGPcv?fSUL%TN%eHl4UuE#F{{-(IhOWJC+>e%23wCt z+m}`skXo5%(jfSZP!`q5-Km_XpS5O;jFt0!$TOT898Ci)_TQX^z|ZDbx5oXalS`EH z6p>7~nS&`BcVO~mCKT5aa&NhSwCQ*3P(rWFQkj~WLc9I*oYtL^&ob!NaooCM8>xjV zc)vbdt)uaQ5p=_A=PoUdm^qBc;|I;SvCvA@6DySCf~E2*Yt6(;P~3y`@7 zP8=Qk1GGGMJD5}M*$_AbQ>;X~rKMXQzO}MzY#q|MTe(`Rw7Ekzoq(r2^r@7t5ldQx z(5j#;6kXOGv;iosX+#@k*3=;%VxpW`{rz-UtQBm6)NWdqds!4PfkRE@XL}mZf%S6=B%51H=v07lr&a8ohL0zwaGH_Vh!2g?oZfotn8BOe8euil zVv))OQZ=(TVG0xW-v}sV59i;j<%zAwk1<&+es1)nHk9eaa+z`w6ZM-~fqqG=4!%=e zGl5ME_e>}(k!4l9)`rGHJPIH+z&Ja2%CEPEL}pW_nzTk9b+fc<>zl+N+Dt&2(X0j$EuE}r2SIXceXW08oMi?Z9_dj7W_f5t61 zjbpn*Q$N}1iOWEU*S!B}bnKL1X|%Uf@n_4Vo~ETWjbn6u!!1_Z)YkfCs^)E`r11w% zhu5-N<_KEj=E-E4DQX=@%q&?i;!~oEbqq~V8vo%$j=7WA`{jeR6mPaxF(+$c2v3yc z<_NZ&`3W6NkmU|5XzD%K+Qjm;(`*1HeI}>T)@-ADCl<7^kEalwiLqsg70$hFov?XJ ztep!Vddi`P)%&X(H$ZMYjXBIN9vE-J}!W;4ZtT38{fg z6BEg%mGOOE^8%XcZv_UYW(<}hZfq8|l{o=U#s@f=9roiV_x{v%%zTkkv|+sk%>PL8 zMoTEQP|+e1>-Rh{l$YhCTf+hN5u{^hq|(OwpGYJv7hr7M+ziXpx8e{Uz?8t6rhDZW z93DQ4Med~88~Am?5?c3m^INhR#^==O(>zGtK5MXO9W8Ad=#(9t($LddPXx`@y`&9n zGL1O#AzJD>r--)s0F%>e=GM^76BmMA#THws+HE45lpnHN!CE0g!^Tr>H+4HXaa;JT z$B?}byMo=F3($CtZM`jz(Hcpbzj3N+YGZV))A__o+UNdhcHbm_x_P;Ph9I6sr5IRr z;tSZUoi?zt{d=n6Ge_)XwyfQ|C7ezN)HE>ZV)*Q3t2S8o_JhEHt%aSKk zT6KaW4M8JEpv@6HE1QF{N@uO~w`Cb%qr z(I%doNos|p42{i{G-o$U$y!3KRSE6iUp8Qno~*SkGyL894CD|9X8)KdG6F=~3{K2G z;rc8`XEyFmSvAw%Q`~Q9+(v96O+2F>Mq?Al;nX6|9Q-vMc;oi5*W9UDlMO($8pO=( zB~)uB$a)lSAH)vDZ~zMbiP)L2abq@FBxEV&MCCYPtZ6zM+-dA>;{djSS*uOtvXQ68 z1>_r=y|EcPDFo?6Zlb2W-l~4=2Bmgrq|&w4FPm@CLn}Ww3Rml^Ok(Knmd+$j6T(v$ z)D-S4b+;~S-22b9)~j{<eMWw;8aJ z@>2=d)I@vg5YmvmmfF3;=VOYPLfK4OUfN~EgqM0iqrx;1t;Vl;qUN=-;qz2yFqKPX zl4WvG8xm>ia^ef}^_fzis-9W_Zkr)6@&An#)g0G}v$=9U&O{%Y>H<%_acM7eBQ`JJ z!Y||F^KdzruN9?Q6DJEXTcf3R1FgK?*55jhHB@t|9cW!s8z^PXu=abemd>?&vXMVe zDzD}8lfFFF=uNo=+HM_7x`CC&~kK4@QJMH-=A-BqB z8yGbWsd&o;@Bz02NDsbs=;8)9M9L1SLBkE*Yat?4t;P9M7x6^nOud^=z!=_I*%+b3 z@D+yC=^x!u`?;3HawdUXQ^BQW^qAY8kV0!~dK#5t6E)0HGGx(4)wHlG^8`fPTAI0; zu_<3+zR8_=!KYI7Qxi*GRJN0Sol)cM872BO1Bh_tlmu$wSZgKIa0lx}I1weADr`w5 zdu9_B;}cry_f9S&wM~ZHjXcWzPfTC~UTsd|x*B!%1*82o9eXa#!9mdGM{*sMvj>%?^79Ct4(|(g<7|*2?#O!+QxDn@%}>oBDJ-mRHLw5FAv`l|*%FqUpADJGBe0OHwZT6zpxJijG&iV?)}tfI!!&f$ z{4{oMwR2e$<#{UDv}6O5F{g%-w(x0E2c6G0cfiaANh$d}7Be?r$jYlyO?%`fp4!#ltvMhAw-F+2=ATDKc+Q!$K^Ho>(mSJ7U-e{LFT zZ)TEANP(ZQ`u+T5@#O1M^Grf(;U1a1jo2|oS7!2l)dd)mH6?lI(Hfc4s)r_RU^aHD zP;Pkv_9f&{2CGhHh{a^iR_%t6wl?tmEOrcKKHwCQw3dC1Iz~<1ntQypi)TYc%T`&- z_xwGEMdrw4U7H=^seC;DztyDm0Ooqkw$o;lmQB(NHOQWJa>rJ0tbhv9 zfi<3PjWQdE)4X_c9!!gI|5Fh1cUP+^GiY~v(|H>h%eGp)hOIMZZix$~iD`E&VP)vx zRQSXqhV`2!n9#a50yZUZx=AO3i6MN} zF2-)j)NPb%zg0aou*V`6V;oK36bEs&aJe|*@zIB>WL$9-`(neOGGez~>)V{%) zRL$wwr7dn%&6%&C8cQ~noiztcM3ErE`U-|~R$|sDcHHyk*iHUYo4T?ZwW&2xAPn2; z-X>tB(WZ#rO)~-Pc3C;rDM^)|!`?^PT|CRLSbJb(OlyZnh`bGtwx*F&Qp!TWcCO4X zEJM0D=zvZa`Du;Ho%M!hgA>NR!@lABwg!sLSvAgqHBd@((()2C8-&mF&CMztJM#j#=K6@YHQ4Rssy_{)uo%9zPib*5%d%RxbMs-c zfmRF0c0`gU&Coq&GOa4w!f{qRWl7mIWYe;>=ESbnkB(}DNZP4Eq#fc!QshSEZBI6IfX|eVOLGwq)BBMYMKx30zINlvcZG6Gc}eWu9y+z3bM)yemr!1AJ^ScwZxLzY{aE&%@rX5Ce z)GRG*<5>+(rP)y{D4^000SZMn-c0003YB005u>eAxwk00009 za7bBm0006v0006v0rv((!Tl1)qFP!xv4IGw2`%}3K*6D>ssSKat0 z`~fcPzY$#fJKVXcAc|s<3Zk2C6omRwG=7C7wn>_=HZeVOl9|OI6G1N=xXI1?yyv_( z6!pOZkQe}pp}x8R*hAZ94!Ig6f1KLnkrv7Qb+naPSneZ?imY~;T4nFBF*HNrT z5eH#N!_yP1Yg$eh01HI`vNRr-SI6VZdK{DHWKw;J<6r15gKf*;x*YWT;>+vnT+_1T zb=NJgS{7MKwN#R@YX}IFgm`g04+wxDsDk5E!88}ZvgQyVVi5#Z!SfU>$I+gp}`Pzgtx@vp85txkt3{2hb(u4$z`U6(xH z=g^6ui2$Z%qL(i&xaGS$rh9uU+K-P4?Cez9xd2TQ)bsNhwcVa>yg$3VYhW{YAVDIwDAZ7V(ZpA=40f-MUNUG%B0tps)L;?kw%t4s(JDbZPpx|;(7sn8b z({m?!bGI1qwA}uxpdH6jEw<;>E6)!XAN~Iy?l#j&!#CFYgQKU><>^70q6*Q?P)y{D4^000SZMn-c0002M$007_siwsXr00009 za7bBm0006v0006v0rv((!T$omz!))AD5ux! z@nA4u1uSvZ!<|ltudlC312P&>&}cLyp^)WwsZ^44e}B*YeqV+Fd^8$yp-^Ct$3q(E z000GOe0X@^VzKz=l*?s)d3oXSc+9V_uUxO!`ReM5Efx!D(6?MJg=V!{Y(AGh8fTN?M|0cq$%gamoqQL9*ii~J9$_|I)7dVkfa5|lq zoT?%1>+1`9XCjhf-Naxp$QKtE{P_4N0J^l>+gnbhQXGrLI2;a>*6nshLakPlVr&9n zKA%sDG0keVa-~xFWdW9u5DJAzQ%wYCabbqTp=<*npqkBQIhjoI;o+ggz(T(x@Jku| z51`#{%YLyY+y{W%-Q95}li{128}|GC!T^)ej6t{;cDtQ46(DS2GMUIlfgfN5V?RDV zYhW{YAVDIwDAZ7V(ZpA>_0jP|D;mU?uP>Eak- zaXL96AwhsGN!Q5GLw`o1zuGk^(}XJxfy^s17+h~kGJN8&+-bLHgA7mugQu&X%Q~lo FCIH(TEgb*= literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_teleport.png b/graphics/chroma-marble/16_teleport.png new file mode 100644 index 0000000000000000000000000000000000000000..efe2bc97d8aa1f97638f08d54cbad9bfba8f3425 GIT binary patch literal 753 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 KMNUMnLSTaaV8X%x literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_wall_inside.png b/graphics/chroma-marble/16_wall_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..7780796eb3901e4a99034590b6f87bd26a5f0e3c GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=5({KMd?*Ob!7`bCm@7 z1v4;lv+*hf$Z#;$$DAqvipqMrIEHXsPhOG0z^vHj$I(2waozy|r%nSFCy6|U1v-pB T@0tsL2AS^Z>gTe~DWM4fr{N|c literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_wall_inside_shadow.png b/graphics/chroma-marble/16_wall_inside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..95430bfc84c14df59f9500df6e5725dec72db1f9 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f`EG8- zK)Qi}fzg4%RIyzJBv{}P2^3^92VutVY%YgDf@KAc=|K7eP-Ovw-rnsOfgEK|7sn8b z)5!@52?nf5)kcOM`Zs4KR$OTaWOn0SFpW_pHJu^&uiee7@wdBy%2i8TBTABsQWHy3 zbyI)@gOP!OrLLiou8~2Ap^=q=iIsu5wt<0_fx(Sc-OFJba`RI%(<%vQXqWyA@{c6Q uhT#0PlJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS7(8A5T-G@yGywnyx>WQ4 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_wall_outside.png b/graphics/chroma-marble/16_wall_outside.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5f3abdf32a25cd33bb330f4bebe6ae4240a3a3 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V1Q4EE087|{Kp0~A51X^nkZco z7g#1ET|j?bVJtkYIsFBv6pa9E2Iav$-4s36>Q&rUU5@K$QgydV9BD1aee8T^vI! zPA4ZMBnU7knHm{-=+8*>R|}IiO}Nq!$h;zh!S$vjgUfV_r>aR_D?l1bTq8=7i&7Iy zQgu^+1cQ-*fu*jYk*<+Jh@p{{fr*uYxwe6Um4U&HRo%;B8glbfGSeyvXlR%I3-Xa9 v$cEtjw370~qEv?R@^Zb*yzJuS#DY}4{G#;P?`))iiWody{an^LB{Ts5bb?fR literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_wall_x.png b/graphics/chroma-marble/16_wall_x.png new file mode 100644 index 0000000000000000000000000000000000000000..24383e320b9c4df944ed4ba8e29145f1e24518a3 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=7gi|Ns9FrrK`+3bB<0 z`2`CxFiCfE)J1e_14V>9T^vI=t|upmvM?$Nw;eplz;Miti!u08NE^rqPgg&ebxsLQ E0LeldkN^Mx literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_wall_x_shadow.png b/graphics/chroma-marble/16_wall_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..6311b40ff50e7835f3a5b8e2d230198310daeb7c GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f`EG8- zK>7d!1ET|jRb{USNU*>o5-7-I4#JGz*<22R1j`B>(}DB{pvnRUy}jEn0y(mtE{-7< zr;`&B5(1c$s*Mai-mhR>%+@1iV8g?}5D;$t(5{v-6{t|P#5JNMxhOTUBvm&BNH7=~ z7+C5W8tEDtgcurG8JJiZm}?stSQ!}HSk=88rXe>!B{Qv(fQEMIzaXDTf@}!RPb(=; nEJ|f4FE7{2%*!rLPAo{(%P&fw{mw=TsEEPS)z4*}Q$iB}!4FV~ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/16_wall_y.png b/graphics/chroma-marble/16_wall_y.png new file mode 100644 index 0000000000000000000000000000000000000000..016ca57291b81385d611607d3bba93d9d37c0835 GIT binary patch literal 128 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_blue_up.png b/graphics/chroma-marble/20_arrow_blue_up.png new file mode 100644 index 0000000000000000000000000000000000000000..5d46184e8c854ea1301e7fefb999f1665b66fc65 GIT binary patch literal 843 zcmV-R1GM~!P)y{D4^000SZMn-c0001Ze002+`i*9Ve00009 za7bBm0008T0008T0g2Xs?*IS-!AV3xR5;6})4ProM-;~Ke|1%L_4H+KJr-!11#9GB zgO!j-AvJQ)DJd`Gw4cDSGrxcn%dr!lfdCn6?1f==F4f)DRSrh7gcdJ@sQ9a&zH_7l zXS^3LLiO_Hp*kn4&Izs8{x|p&;PP|X=yQRqD_g&QEtYTJZk7)p{#<`G`2Ic3dhLqq z>!k2LG+za#>Av1{fK`phu zK}yHX%|H~5f%)?C@|XIH!LAdHloZoxPgyFo7Fa7W=G&t0ee*@&YGvyX)G|$XWLY3d zBFZvmJl1%hVQsctEPkrb2HTdVEJa~VhcSZ1B4##IJbE<37(*0Y6iTV)EO525^?0l* zt@kK3(D#A9_f(ZZDM1JV=W>K7t55Cn78u8((VAS!jt~L>Sti+R99`#eE|4S!?=SM* z?%3Q3K6zs6G?i5xTav_c|9;G3p-EFo*Le;HPnJp2RFS50CXEk6P$lc*Vu$dklT zmKvoZW;2Zt5XTYT2fPoottW~!QZDndESpb)k00AQNn|yd^k{whIGHHoSTGEMVF-i( zZF_1egh1;8DW}!*=YQ0kex@N(tuk)A&*fvP|L}cyAbnxO(>N_xe9D zgwS{&@+fM70p|v+?U2$FMV{laCj?KP3(7L$!2`u;6c`4F_k!cmoGkn9)xU`S VG_08{cs~FD002ovPDHLkV1jE2e@y@Y literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_green_down.png b/graphics/chroma-marble/20_arrow_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..578f26521e4c759cf35d731ea54679fbaa09e891 GIT binary patch literal 930 zcmV;T16}-yP)y{D4^000SZMn-c0004LZ004LZ+P%u000009 za7bBm0008T0008T0g2Xs?*IS;7)eAyR5;76liO<(K@^7v6z_^!p-DI0rq;Dd6O+cY zu^Vd>lXQ*SF&jgDQv4TuQhe}XA4CuYeG}hB@KsR%06|0$6;VgjCNcN4X}i0otw{Ol z4k#jC>g9vO;S4*6@661SlQ`LtTh8g3c1Bk%Ri_r!C)<-eXRHhlyFRgaLeI5xdfG_q zDI=vThQikqMnb0s)zzA+C(FqWqAV%nV;{$s<&QE(7e=vvVL#8w#U!*38t4*5Y$1lR zg)t1Zhp@N37m;=Zsl^nuB@Nl7EYemQnU|Sm<$*FzY~+H>MrKD4YK0J*2_ZTc#ZYSq z@%cFX(|+{Sd$7B?8)98Vf3qL*tc=6vVQB9)WQ+_(9*-b;J<7-zM&FLoNI7DKXTk_J zg77!|*j3xbLnsSapI?uTcO7t*T^MW*;?Vpd9_jfsVx<`N+}LAzE_f*UmdKk33)BL9 zgRkyGSGfxt3LCJouo0UIn|N(EbXVP9o5q`;C%ETF*V!&czQ?u<7K4`5kT5(wjP38X zWA)T(teRSd&4ta})=_dmtcVCS0^BZDO`+#%kJWjqlae3dd*NeJMdB7)id%TYb@_GJ zTHK1xQYW|Uu5`m&_aaaUVEExMyqCO;{0z@C5A{rWELY8iwfVI?Y^%O%A0OAYmTD5O zyPtQ%cim?Rrv*xWh2xQfxl3-W$*;k-;x@k7KGR?`2zSNJYauUS$E_XcJKx91?+_n} zRCpy=&Z?8!4b%q^n~fnp8|QhTHo)y1R~(jjPNZZdcwcy#SQ6o?xcG?CnJA98k0Uvk zgtz2{^NthFGfqZUO7LZn_P*{lg{r_Cj?ax_!kEB;)&WRNLhrR+^QSlaE6Z>r47nvk zGd12cTn%IJ{^xgk*~iGAV!z9M<$b1Vs>qsIOw3OpG!;VNM!=MGiITrTDJv{%WO2ke zf^;j*?fNhFGxE16MTKfD&CFRj9GyOD|Fh=Kb2};d7v#4xQ(G#I6^|iyGseijVxQ%~ z@TZgW|3%_SLP*?C2rK#a6Z}5WO2$P)YybcN07*qoM6N<$ Ef@@@}1poj5 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_green_left.png b/graphics/chroma-marble/20_arrow_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..cef1218385477c393729e8d4000c4a0f477a318f GIT binary patch literal 895 zcmV-_1AzRAP)y{D4^000SZMn-c000000004LZJ zFc@ZGWAN6SL7RR7zf0q-9wRT1fER(7Kvr=GCdniak7vkaV$02R)6=7C=~l9&jTgrF zs(&F0icfXU`RkX2uk;*52M@As_DuRx(7c?xsYpE<(mno?Kl*IoL3!Y+wd&P!?VO8q zCO?cP7s~5I7Pfmhu#vc!T1wfZ-b-4|KTWHUN(h;tZuBn-)`Kd4@G# zW0P(m|0zQ`Q9cYLF>wvq@TSVti4ZXwQ(UR8z*cOOqQr4>j3iIMpK`Dh_I{uhTW%_) zo}wtWCTUhL>Vf10q$FU3L6ubWN#IFMV|N8F&Z}OXNa}sYQuk4mPOolKE zvy+!p3C8Leq87;O9DUNqWqFB!2eAIOpr7e)f%|;l-D2w{B(XJUmLK>qa}%ScniE2i z64PzI=)s*4)*ABw?xu#nu^bwUw7iKNIrtxhc?HXt$qQ3%v^jgdOS zgig=|g1V_yzCu`qC`8doRwM;^k;6P{J|2t~(!=DTvtF&AoQLQ3g?eELO+cd>;wnai zg-&!#)CsQZ*Rjl(@G~FVa@(nDC3pKufvcxiG0SFeCExn~mYZj}Cy!;DI@Ah#A#yo~ zp%~cJcR^)}pbR=_S(lxkZ7`h$IS2iVVo%w7Hsr6FYd**@r_|oi(*ILK_U`t z$_=Wz>g2ZTrky%CttsReGNe=K{cUsqr~7VE72enx+jK;&LM`AIeg|w}t)C__VJQ~M zvV^s?;Q!)(xUuKI&)pKG*8rWRx@4)AB5bO)qD{GlHeCVnQsC_8vyZ=e^TWA&{O_?B z(7@qS&di|+hdG_MZD_BLUSsv!>eGkAjc;$byyD(?ckHlhjA=~6M4P}r@)7(IEIxaD z-TC2;+q^t|M|b+OKD+q;0{nz8zIedi`|(~kg$BLBUc8PUNnh(1aQC~r57>-7djnOV VWGjIDfG+?5002ovPDHLkV1mj*o?!q0 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_green_right.png b/graphics/chroma-marble/20_arrow_green_right.png new file mode 100644 index 0000000000000000000000000000000000000000..1f533cd9c1f7e18db21ef474b31e454120d1ce78 GIT binary patch literal 905 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_wall_inside_shadow.png b/graphics/chroma-marble/40_wall_inside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7f526e807be38f93317cffb5ce662df80ee281 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEY)RhkE)4%caKYZ?lYt_f`EG8- z3=E783=GT)3{Q^hz6A*uctipPSvx_PF*jrGFOXnafnz!Y15*T0{`IK|V&F~s8Z+p7!t4jG8F zKK%D)S?uN()is=(#M&Jbzr9${)~fEXK*4dM!mWu3f!l>HFWxUx$)_x1ki{^8&26=J zAH&^!jZ2)S`#GFHw?%*NN2ZS2b87k_7Ec+J?#;4Ud7-=E-q*=o+G{o(s&|;!Sn_Sv z%lBdtOCP4CiykZg9^rjpN5qW}(>S6VnD*!~KbpL_L|*zw4WpQdlvMC!lTuIwd%F6$ JtaD0e0sz;*oaF!j literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_wall_outside_shadow.png b/graphics/chroma-marble/40_wall_outside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..5acddeabf5d27776debaffa943a88fd739c7d816 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvRAvBFroeEI*J>k3u)re{D9G9g!i>2YbAJH^eLYf;SDh@g|PwLj;t)cv@V^eIq1;f}`uz){I f616VBD)z4*}Q$iB}lN358 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_wall_x.png b/graphics/chroma-marble/40_wall_x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8453568f14a3a8bbd0d308125611714f3853f7 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NV3?%C=ER6$F(g8jpu0R?S{0D;+uXW8pInI(G zzhF%v1{R0T&FqZlkIwlC6qNRKaSYKopPZnRALPV%N-2?NaT5qG;b3Aodak|lp54<5 Okhz|&elF{r5}E+T=_aNC literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_wall_x_shadow.png b/graphics/chroma-marble/40_wall_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..4cadc426cdefbc46b5656abf2feca2ad2bc17582 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`*zbs7!(3?`<1qkYIsFBv6pG6NDLaGv@vR3fg(P zIEF+VetXW4mq9^*VI%iGyC3C8n^=X~`0hq;UA6LC`m=j1tk^+33;&;oWeNg68~K4I OF?hQAxvXzopr0Hggb0RR91 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_wall_y_shadow.png b/graphics/chroma-marble/40_wall_y_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..acb084684c0b8f5e58f4334bf8b13aa58c727d50 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEY)RhkE)4%caKYZ?lYt_f`EG8- z3=E7D7#Nrp7{2{9JOmOf@Q4HovUY+nV{XRWUm(G<0>^X)2Brw0${7qd{bqaw3Oaha zIEF+VetUBx?*Rjb!v+iMS%3aty)ThPW=rw5)%!kLJuW@Y%z_2fh+Eh%^1m-&|L0+u zLeBlRoj}7>OI#yLl8aIkOHy@HfCPh)fq|v2p^>hUL5QJ|m4S(sk%6{>ft7(lyvC*w zn1-L1P+nfHmzkGcoSayYs+V7sKKq@G6i^X^ Mr>mdKI;Vst07>LvQUCw| literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/64_arrow_blue_down.png b/graphics/chroma-marble/64_arrow_blue_down.png new file mode 100644 index 0000000000000000000000000000000000000000..b024477c4f61df8e0059200da5c94b2ccdba6837 GIT binary patch literal 4265 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

=*DC&K7YSALI9%00000NkvXXu0mjfDKfEq literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_green_up.png b/graphics/chroma-marble/20_arrow_green_up.png new file mode 100644 index 0000000000000000000000000000000000000000..c764bfa77e1d07d3e96f0ddb87b3d4c5d6ff9a33 GIT binary patch literal 842 zcmV-Q1GW5#P)y{D4^000SZMn-c0001Ze004LZ)-%Fu00009 za7bBm0008T0008T0g2Xs?*IS-z)3_wR5;6})Vq!pM-+hJziwSUec8G6SfFVZtdWBa zkdR0rHFD4?DKF!+pTIGhU%-jw*a^=-fQ&Wv!Z16R>h9_)B5YZU%mOF=_37vY2W~J= zwlTKTEqzPsPN6fak=x35=spWki18hp#!cH=kYWqMhL z7}~D_vqRQw<#wg^3Y%M)vsyo2H(w0)qHi6p6i$%Y3}5@wN8f%CSRTp-&B|OElviAh zSI9F73sx6DUo@W$_M&eUs+dy{)uYmw)&)LOSU0@rTcoawXL91MEY z3~^ux1GTNuLK8*A7amcG`eV1e1|}kD4W>}NBE|?nu5z}1OCNfC^rSW=oQGn6+PD7; zK6DS8Ol5WA64H=zJGsr$EXhw&>@XPtyED}Rr^u!fqT%TDy^r(6cY_02BvySA`-?pGRBceqzfI# za6|}!DGh3->LeK0j^N#JX<(+@W<#5TS-{68n3(dkT5D1h|S#1JV&K_x5h=sQf}gwc-#5jfdXL8Ju`kG7A#KU^Jt zDRzal-XahjP6uB7^@>?J=Uk|aSQnfB9gJRX10={|j7 zH}=QOW#A!%!0yi-_HRqfB5vW(S|d_{J34&t*>Cr_y(3+wyxF}$YfUHu`FHt?_n3Gz Utdb5%A^-pY07*qoM6N<$g7KVl^Z)<= literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_red_down.png b/graphics/chroma-marble/20_arrow_red_down.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4ae7a760c85954538dcbbc4e64137f2133db63 GIT binary patch literal 909 zcmV;819JR{P)y{D4^000SZMn-c0004LZ005u>lU#+100009 za7bBm0008T0008T0g2Xs?*IS;14%?dR5;76R9j0MQ4l_$cvrkZZknhuniw@+qsB|3 zi801C(GZ^$|3aTy`ryMpltQ7|>t`5>&U2r%x^}|qE1l6x~bcpx$dWQUtFJ?2B=9@ifgq}x>R+721NfO60aJK;%$|R zAs1moF6SbsFj!Ck;i@X>GOcMEA1j9Y)DPlAJ+G~Wds;0={)G*-n)#$siE)KOQkQIN zgDk#e79W7F3G}JD$8x#2f@jHPu!VJrVDV#^CQWf4`!ct<2nX2g5v<=!40cDM;K*gM zZ89;R8ykf_sY5*ytHL6*v);G>-l{_TVGz2J*j< zre|P45ZrDMa9$5lVF1T+t+P{LbvlMz1yQGyy{D4^000SZMn-c000000005u>bS(-e00009 za7bBm0008T0008T0g2Xs?*IS-<4Ht8R5;76l}$?@l$Fh7o(32!v%w!z7RIIie_{AW7&utmx!&yFy~yRy-K&3$ANM^}69@GBk#QfU7{D0-!oO zODG881^MkZMS}sws47oc;0rDnzU-L$NkL zPa;wZ;T4A_s4n-D7lvEl!-B8)E>|koi}Dg)N}}kbJkNZR$ruI#wYfQp0SM7=2|VNJ z@@KTu1fC$~C;G512sgLQo6Su-3IfL}7R>?_D}V$@cLD^A`zgUU8PyE|ZQ}l}(YU>_ zKVkD@h6A9bG@E)FTa91`w}MxhL(vs<3LoE|oZNlu9RmETR&&&T-zqVt=K<0!YvL_0 z+R^zreQdYye>gl_T(l#`ocUtWda7eUU77=7$LD^3_rb^4tF<*7H)l@Mta3K1|LJz= z_#wyFzvK1B#^e-A<#Lsd=j{oP^%wAbeSNE}>j!@UWXWVJ#tRg@00000NkvXXu0mjf Dn7V%# literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_red_right.png b/graphics/chroma-marble/20_arrow_red_right.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0e4fde43e0975667be64ed12a171c695903142 GIT binary patch literal 1029 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkPZOi1q>C7nJ$0?3p^r$f=ow2n6dL({deko_l>OrA;uvCa zdhJwSf2l-)-Ntd`}oxK zrrwh|Q zlc$QV2oibnA(m^d>;l!c_J^|bD%*C}=4~}9+#j#G(rRuAGk;NX@&suqp<<0G{S0DL zxDI3~Fl;^Q`XDV`vGw))A9=$1nXyY(*{?(Jy}1*{|+avY&sf@;&3P9_O99x7OoaD0lhqQ=pr54?%D8yWVCb{gE?c;jsJ`UPQ^_Z($XW!WV0EnKJn zyPf?1Lk|08-nxGO3D+9QW?t2%k?tzvWt@w a3sUv+i_&MmvylQSV(@hJb6Mw<&;$TGcCf?% literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_red_up.png b/graphics/chroma-marble/20_arrow_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..b927ebbb848191415cc70c0b4732aae4d7450037 GIT binary patch literal 843 zcmV-R1GM~!P)y{D4^000SZMn-c0001Ze005u>pVEzd00009 za7bBm0008T0008T0g2Xs?*IS-!AV3xR5;6})Vq!pM-;~Kf8Dxz`m!^#Jr-!11#9GB z10*C;NR1qHO3KSP?I&X)q4J^to&5K-M`<6moJx_*RPk)@7`^`8szQU*00xP zdT~+45ZbQ-_gU7+&1Sh%iriY}uzbE+HD3&hzHf1^bV6XWjN1D$df$E#xG&2_!}8J? zyi$ypmz+q+DJ*|JKW{!86n)>KR5{FM=&C{(gK~~sM0QfuAb2z0Aeqfbui zy)leh6NiB?4A{CxXpM-G!h0$q>W|&>8Yq&a#h9X3iWnmRD$nto4WaLe-ec30vk;2o zZrA=V=pH_7RF>5)NeF35a{D%Bu|Q=Rq3;QY11itaS;lFWaWpB1wqjNE}Cq zkRy~K8D!I#ioCAv#F lUWB#1nCB&UBh35_lfpxN;ht0Hnt={r@O1TaS?83{1OOC6Q_lbZ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_shadow_left.png b/graphics/chroma-marble/20_arrow_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..2595078942639d0c662c7cedab7f259184521b5e GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXIX(`Is*fv4iKMVSnAf;3KV2Z z@^*J&_z!{$_AZ|cQkL)LRt%&;K!c&ZTp|U?;4JWn1PU@81!2a{YxVDef{C6kjv*GO zlM@!m39uxEWl5;;99ia&!+(V9ioprCEQy`B22V#}5_D&#oxHc#YT(sl3#&yo`fHEfeo4Gh^Pr5I?k38flX zvOO}LA;f%_E^~pnqPR))yA;xycH& zPqoA~q9nN}HL)aBHw8#A7#SE?>KYp98X1Hb8d({bSQ#2<8yHv_7+hSwbvsN$ZhlH; zS|tGuePV~3ff^)1HU#IVm6RtIr81P4m+NKbWfvzW7NqLs7p2dBXCnnv#Ng@b=d#Wz Gp$PzMbZR{S literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_arrow_shadow_up.png b/graphics/chroma-marble/20_arrow_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..053bb9a0f9d8d05157073b68218ff2a9028ce944 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXIX(`Is*fv4iKMVSnAf;3KV2Z z@^*J&_z!{$_AZ|cQkL)LRt%&yz&NL4zCB2=z#|eU$aEBh89T4lzXu8ydb&7y{D4^000SZMn-c0009^P002+`DPv&R00009 za7bBm0008T0008T0g2Xs?*IS;`AI}UR5;5;l-+6^M-YX-uI`x~tybEx91sL2Bm@G+ z7a;@!xymyc{2qA)zltvnz7trsEU)z!X;)s2R{J+IJ>Av07~#}qU7R{~&Z#o5UZvl6 zcjG@HG^CX1O918n5<~=5C8Yp>F#rzLfC#j0&D~x5(rq@~%jeI{-_{Q3x(;I?B~W#E zFBp@^bH$j1wIJe%5xPzY!Juj}reiw2r)^g+-SKffIXql(csRt`L`sPmEygG!mOSrp zE}|+Jql6%Ioulg!77LGR2N;Y=I2S33mMjaTWJpN>a4s+y_(vT* z4-aQtTzp|V&8ez6a&X|tbHj%ZBeq*lmh~%(C?blriZKv^#h8Rh!k9!#(6)ig%MVN@ zf3jR|@qUZU=Yi44aC4KfSk%NA$ny?kddF1_DH)s#fO%w=$g&Nq)fH8hxV`-mRsEI* zmP^Gs!`rt*HXDy~1`!1eUFYyVBc;9j;c$dNACvVua(e2h zswLj{*@{sJ!4jk3eg182Xt}-p%yc?uyZwbHPcnwXg0eh7_V*nr^`H+Afj4jV*lugO zZa|EJY7f?Rj=J7K)lk=4&d)EnxcCEWK^3eO^1MLG(lHtd#z0v*E-wq_bEWIzqb3Ov zrD+DJ8e$CG-kvj?t?>S5+E$4%k>?qs(FmDL8rn9|wh3zugMskw-H7$NMWi<&1WT3$ zL=^8g{QK_>XJ>!0*+i^0#F)6hUlD@hsw%L%tCXc>v+3{m>(>EycWd(8l9D4vi*pfZ zna?Zk?-O13E90>cLSlb^fXF^ob%tB711Twao*0iE-Y1NK_wP%_LX5E4C`BQR$BryB+}t>p%btNT{Yh5Ul-cZ#+3W|5 zfh;pv3*)hSl*adf0K=iswh7flS!Rqzj+2uN?*l0b-YeJFSDc;wMvMtn7!EC2CLA2( zbX~x?99b@vqUgo1>qyfmi$%x7L*V2jvE42KPhD?mnjO~bpRm@jyK4!dC!m^$QE|>8 z`}=}weEc#BC?Q0e#$&B=bTpu8YF4WiP4j}MPladC96LLS7z3)2x(ilnlGymJnQv>rdd-I-%(XdoO7s-D9i6({|9n5 Ve+D-WO6vds002ovPDHLkV1hHp`;!0w literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_blue_left.png b/graphics/chroma-marble/20_bomb_blue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1a8fa3b2669fc841e293cc0463cd778d885159 GIT binary patch literal 1162 zcmV;51ay{D4^000SZMn-c0005u>002+`d5!vX00009 za7bBm0008T0008T0g2Xs?*IS<07*naR5(vPl*?`tNf<^?UAx_O?2eranXv{GSOftp z1Pk7PB^#C~;zi~Wc!hZ*G!h6Q0U82=2{FcQyD#pp%PcyYZKipkV;`}_`DhhY* zT!V8UC8VjOX#!FLfVGk|l~h%rs@(tk#$(NL>Buse&;4mt6|eNSZ|=Nl^q*a4P%023 z2mwi=8I2^~N3N~{F-EEiLeOXp29t1Aa&hsU#o`^>xqwoEw)IHqaV}C6o~8+` zR#4ZT<+3Bo6oY}}{{4(6PlgNz3atgu(6%K_bBXsJEhU7|yXv}#l!6!oRpnW&972Fn zf`<=No;@3q=Y|j@>ve~7ElM>gRTE=LT`$nnsir6dQVMoEC`(VCYrcPPY1_b~M+q-q zj>)ow(MV8LC3WrTIt>Jpq}LQeg>w~pv2aYMhUKy+1h~5Dc<{jR;ziDEW-&&w-EJw0 z7UvuxD3Zhxg2a1;wH^q7?4Mi|0j&iw!ri-;r%zK(PI_m*epRei9U-(R<#Em+M8KGc za|*59buxxnJ3<4*2uDZo{P`Z!slgZl6#V?zQdQu+AVz~RAVfsUfRup{1R+RbGzgKB zWmEKgp6oq-Y{~P4gM+|kQ&N^YyzhXB_lCB$063?ywnd0Yi~=bmAqa#3kVu)LheOF? zamjkUq9`;;k|KmfYk>Zcl!2-mkR&b8Q$kOtlqZA;7?Na!e*3oGeEKvcgo@MC_snJ^ zj*m|m4il`EfW$e4F%BuiHJwCCk5Zl(#r4{T7&UsibPR`qEIZ)!>j~58iaU3{F_{Ps z4}ZfLi}w<(`vQ2ch_Mf@_mW;qf|O&*@*nhe>xeO6ZDcah)b)%vZ)W6q!F>Le*~~K< z3BX`XPuLFxLJ)Xwh|wWsj<~PI-7aD+i!O@5cr1YaBM3pV+XbpB&~<_B*0aBFP%7igmxnaXSI*AfbK}Mh4i0`t>k&d| zAfl8;kH?Y_JRx|D>8s~lq-i>=l}HJ7-H~O2(MV91N4$G?#N}ndty>rD@8^ui$HW-W zdVtRJhVAweYg>{;B7|VKt646u$n!lWlYN}?tk)VLAj?|X)^TxB^5ci)_;}0Bn@g-U zeXvI(_m{OBvdjU25CTQ#*C(!qP0edl%}b0u4TJj(KK7q^ni~a3qF6=+`c_K cwf6AUe{2je%zM5euK)l507*qoM6N<$f@13kr2qf` literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_blue_right.png b/graphics/chroma-marble/20_bomb_blue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..792a3e255d94d26e00cdd2d4c0f77e719cdaae7a GIT binary patch literal 1171 zcmV;E1Z?|>P)y{D4^000SZMn-c0008g+002+`bp!H)00009 za7bBm0008T0008T0g2Xs?*IS<2}wjjR5;5ul)G*lM-+y?x$G`?Ns$s|TSl%(03#`r z##I16fP24({UUh>%i+$}65t=6O|GnYRQrCg10uhHu^U@9m@%Qh)S5Hn) zSG;@I=jy6JDJTldV4#UHF`Ee~C7K3AEY`wssPSGg99o=<L1+EZ1AvecAi&Tyy^5e^4ozZZ5pkM~QeO0X#bBt$^#h*E~(uwpb) zJb19>=4QvMS3{=L0RYQo0O0H_$2noK@YHpS)=d{#YfFp@5rtAVZ_4S(9uXDb9DG^C11=cFI+dv2j=Nbls2AfjA`wXo?>jXfSc|eFUqEyE5aY0Sx#)l8X zBdfI~1clbnwicxzMuWAHl)AZUEi_F@QM5opsYnQc-L9doKXG~aneEn66yIV)aA@7T z1JcnJQKY0$D&2Kv$TE*o5fRUJyW{5OoQsP~=JSU0^IzEScRYIJH&!H&=fZy9MO6w? zQpA{u(ITSnpm@CBaC0+dGPz(ny=Jlajpg!diXu^#e^b|=I&HE{a4zA!#h64&AfkZ8 z;h<^TmZqthPXA&)-|*?vPpsEZ==Tlx?pZHeLTIr{nL7{~t>w;op=lP>^$h1ScDwIzZp3QU za5zL_>{hj^3|ZEF7Sn0K+8iqq2?0bR-Zw0lE9!dAY_?!JeMAV~aB`B-?<>aRjO{jJ zjH2H+gpjZ{A(Dtuu-0}RhHzjuyX5-%ip@rt&3@qO>Syv?-vRSfm0~bZoStg5)<7c0 zfQVtg2N3eShxLBX$B*ZH`BJl9Kg78KyWN_)KIi!Oh|%bT5F)Ep=V(>6v~6I$-qGvj z91aqhYb{FkaIPVQmhEy{D4^000SZMn-c00077U002+`oho-j00009 za7bBm0008T0008T0g2Xs?*IS;`$W9y`2`^@KnRJ&Volerk(--9RT)&bgaFsqJ(rgmlS$5MwIqaq zbCKb2%w#g6u5bDJwPijJ42Kr)BdQ9>R`Oz@IA=%+tTlw7yn8pID1_y*r)?c68S>n6 za&pG``6uq~0_$~TxeNf@yEmdND+C}VXqrgdDzjP7O)Va{^d(6)&fg|5qqF=IF! zad41P*Wd77aZb2@Kcg%M)b&0x9y?On4xP^fSth)FTauDxv+0P@&~-U|@7QdH7*lX^ z@_=X0J`qB~T2KXRg*+c1b-fL+F;Lfz%gdaq%GqpIgb)!)h$!9{s2Yqhj7AklMk%;&#XiT!OHNN`EEe|> z88e-JMw%wjG)f4G7cWXg3~d|ex(rpJ?=t{Y1!K~VP_Z^+GCAhy(-~!HnM`WB&Le|? z5F;EP3q|2*nw}UFDJ4R1JKqwpl`o<@>4u`%qpnL%Pura}-F6_r%a;X%fg#2~*Ev+( zj%Z7#YJv2NavQgtx<261qd?yWoXe5LLV5B;s47QF8;l7!*JEuU%X;#>+r2eI2pPt( zt1TjsWd*~bu(#LYoI}QA;ngccmOqN*6vlakW+2JeN<#t~xz0wRX0 zDmXi9$@2m3`Ez{?w|xG*pzFd;$_CYIU=M5WlTrlSj; zUEgosfBbm;TL?cJm8SW|dVPa)C1tsfh{M_eA*_k9!}}Rs*DxF&(6$Ri9D_jxoWB1b X@M%2sUX0GH00000NkvXXu0mjf*5nId literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_green_down.png b/graphics/chroma-marble/20_bomb_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..016cf89028a3ce92e18e2f54f6e4f611a6c4aaf5 GIT binary patch literal 1155 zcmV-}1bq96P)y{D4^000SZMn-c0009^P004LZbUw~<00009 za7bBm0008T0008T0g2Xs?*IS;`AI}UR5%d@!QW~eM;5^0-#Jy?(;AI5ZDm0alCaCd zg2~0QEG*?`C|av8{-A$DX(kz_^E$fMS1{&rVaos;jAAN+^^9GBz&=RV`^ z0HA;Y000WAikacr0T2WtST+=8I1D@uPjBLG+`V}%ufGqIz&MTwg5y{;k|xB3+G@mw zKtQ8XD2zIiC1b&mQFwTMVAu?A;=9AU%k#}S=hJh72i%lBvlC)M@=bO5EII(aQFKiA76h2V17JjI-8;ZjyDHYic++Y zL#AjU)rlN3;sOIa{{G0r@`3$7_q?iJF>R)_XDxafPjMW_dC4#Qbn+AX!=7<6QnX-d zq&hLik;Bme6XUQyaD8*l&3|tQ1Pmi+pl)ikjV&{sAqZ`3`P6)3X-md3f`YoDru35@ z6Qkt97&UOHNo_ywM`$QdTJUS&5Vu>)ovRm@( z&y4>Xnd_YFnbXNBda86+9dVntxH+}g%;TKo2|@U^{gwGRr#`9yFfmGBxWB#U`rB(1 zB}kyHT5`^uv?tv4cW9#xg~HBuG}xiyxO(P8ehjO5|p4GVGCBJat7wp%2NO0I6=#P4~f8P=$a2$@wo-sGfjbeouBYLW* zSTU>^Y6=FqWct(-Ebw;nmj2MQ*=*>)?fF8#;H&r*M}9=f1uMoOAHbk)YGT{BY!_SV zR5Q^DBEoPO=stI}CoP*-8#+2xk1ICk8>ZcqloRXSnx<|Ts(~k-nCCg#C~=l&Kh~R? zX`X_CnX!IYGg(gXsnehJygPb#5~@J|N59D_vt4cJw>{0@8oG5yj1ij|?U(J3e*t4G Ve+G2|>~{bF002ovPDHLkV1hrK4JQBq literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_green_left.png b/graphics/chroma-marble/20_bomb_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e4679e445fdcfea1d6cb2f3e6465e0fecc41abde GIT binary patch literal 1168 zcmV;B1aJF^P)y{D4^000SZMn-c0005u>004LZB+yje00009 za7bBm0008T0008T0g2Xs?*IS<21!IgR5;5;lg(}$WfX>=?{8*2cASZwGz~;hMP0Ni zT~)B)4!Z27%PQhVxP;yUcT^#PN+m!Ls+Kga>x@0)@yz#~!@>x*N9VkH&--I8_3~aF z>&w_hA`y$FumzoTSS$dU%_wX^D=lqo|J$4TDa*K|q~tuEUv%s4rGFRSU3R|veh33j z9ExHv6MKw;!Y z+{!Jd$d34`{EBbK-!gI|yz$UM-}H3X9TEj^u?Padpaa%eRFpQgtl|oT z!5PPs;t9{j&!|F$SmAcKCH4{5Io#HvjnXb!{LIg&O^r2{9Xp!TQ2C1Y{d;=p`8xla z@21~T<|Pv|p>0~WY0KaT5XfT=3epO(jrc`eFbgx5EE#kF;AXhtad^y&>IL&`PH=(E zW<%ZA#267LkHN)P7<$tdL%C$q_@u zh#_box`>baJ2N(9lMD}_D0jHS^MmKi!i-=7)bO$YNJ~pH2@OghVANp6V#Ojx5G!a< zOkpTzCH_1+Klmp5hAOW(mSfhJoeAo@twXBai8QLOGk4F)W@!r{ku z%;I{%?dq1=*W^Wx$qXJ32CVMcw4;{1&jB!Mz<}7j459)7@=1>Wx%+wj`|Nk56)xUf zFrUmhJv(KbkI8HX7NU!U7_egZ?5tvw#U+Ot-Otv#Z_zR?8OxaRxa8I0D`u-1_ut*; z&>V8|*$E*FB%AQ!apFiWp`rjJ`>!l{!cHyC9}RvJH>fC?W*quMw(~7N&3~e*E6(4Z zGf#6SW�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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_red_down.png b/graphics/chroma-marble/20_bomb_red_down.png new file mode 100644 index 0000000000000000000000000000000000000000..087b7cbebb515e0cd01db6835f8d43f905076e08 GIT binary patch literal 1147 zcmV->1cdvEP)y{D4^000SZMn-c0009^P005u>J>P+400009 za7bBm0008T0008T0g2Xs?*IS;@kvBMR5;5;l-+6@M-<0@b7poW%d)j`3Wk!FmO>%q zqLf0RSAC{H-lMOOSIK1{cZN7|9L07VTXN*JwEEcH*_kuFkeUvhyE*5~|7%Qo@#6Qm zzyD7Y0x2Z`1W^7z0*DBzO4!}O7#t8(L4>+(Y47i!yKcRHZk|56HI zo@5M~=OkmmTAT>Ph;$t$1gt8ZF+5BrEZg?Et4~kI%j07P$HydVNhx7tM2*3U(B(PN zIYbpT1_=Szb-1oWVk83N#exsxG2Q$3W6==UKRIEu*^p8qs^UfP)>7v=t+mw7(OA2M z8v^1zni9bnsu(%DzD7QLKmkF7-gJte&*@Y#Kr)8t9Bsc($TCby$d0?<9KP2Bz#GHG zV!@}YEAq*NSy>|P=m?YN4Bx%OZ#JYX+d>xEmbG9EHUyF}B#|wjDG}P1cb`A==XlJf zs@QmsgxL%;9FpDMQqSjv80r2K0WhkVlnBmYcB&_1SZ5j6%O$BS`SI=!Ro%J)5wxl> z&M|oX8oyp+oI^!0fa^Lk?=dN%BFIj#d5nC#x#8*gIRN{k5yQa%*{)2))e3ihPF0o! z?_t+$LqK9A_x>B~7WjB~$80j;m(7Ok(IfhU0Y^oFxWhw8Y0JrC!NIFn)SC^xoh?L_ z+^0W77+md1=%X5aqA<~S;q_!osEyh};*JJqR4ee@$ku4)O1VWafBCNgV z_RAOky0{>&*BEO_F|vGkKtsTVvPAdyu|c)V=|&^=^8A~9ni#phz2({EC5T|G zB`XR-2owhgG&eVh^!pGax?UswK5jI^WEt-E7O5)IPT8o+q%66gPWfRv1!FK-w*4?h zqiu3R*bM|^FxYabN>&uO;gIa?jNm@sDsB0AH=Q*w^3Z|$1tES<*exIr=an3PR<@=&|`7cx=e+HTh(ZB!z N002ovPDHLkV1nd%5q|&x literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_red_left.png b/graphics/chroma-marble/20_bomb_red_left.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd15d25fbf4ffb35716c431ec37de840a69b34f GIT binary patch literal 1164 zcmV;71atd|P)y{D4^000SZMn-c0005u>005u>Z800k00009 za7bBm0008T0008T0g2Xs?*IS<0!c(cR5(vflg*A3R}h82d;4~`-S&8T?D=65D?tN` zLBI;Zf;V8vh9w&DB6$Q}A#a2tfe;d)Fd)b<#@KE5kGt=!%EDHZZK>+$oKxo*y|}pP zi{hg39=r!@vArJBG+-?NHc7U#s=`;*e|v5;!q4ZBWrXSUtf;D&&VT)S;hN@;xa*K8 z0#z^um!{a^5DfvjzD8A{s&FFU9CkFqbRF^88JwT90)D=K|C_7YmbB~GsN%~K1)_c* zSuTk}pqtGIs}(j)k*2}+`?&F#bUG!zdl#E!=wQIN%S+zQW;pR4i6TPV60AkNCltk2 z@?t@#Yr6TID9f<@KH0r{3?4rw>i03u(Ew%Ja@9115O7!vA^>RDVXQ?|2~~w(EWj8{ z6w!O|fWgzJ#CeVtp<6C#y{CyH>L{XAWmeZXHy&e(0%I*~HiWXoucis_sO3>Cz(u$;+XY% zO0a{a5ow+yhliA_6`Qi83jqb<5J=h<0OvhzlAy+5RM8zM#$bV-wKzK% za5bB;ST1ozK`%{7i~;8`fbQ7ztBN*Fw}Onp0Cs1CiVy?CG{x0#-mJzSKT?VC?(B@= zWWwpm3F%<4tsHEy{D4^000SZMn-c0008g+005u>VZReT00009 za7bBm0008T0008T0g2Xs?*IS<1xZ9fR5;5ulgn-sNfd^^x^%a@?bwL}1kDZ2NN8p` zvtcz755S)HfESrp;3-(LV8H^G3_@ZEA|$et*zWk+E_YR(nuWuW&gSS}{I{dh^XGqg z@1O0?&b|-=XpQc45a&Q^0Cb-3Z%spJ8ouLfzfY)Zs4AQYjmQfdd%b_ug9ncn$H#Qv zzo)po1f{S=f$sH4F(Q)*DJ5tctO!_(?)OpNWBYxgbFA{5sdL!1_jHY+Iyqt0>oHp_ z=zsWt`SuMHBYrw1u2$%xK%7IDC3ZN(W*HhtBDndSORf3j95w;Ld(fKd;DD^#r8zpH zxw)Zw^9Fl!gRg5$RiVq0ye!fEJ|cqbcF1;%-)xwBk5m zdu*<+>A!qQZ#)Jd%;x~)Cntz=_}PrMu4%O1OSW30Vnm66Qbc30-lMx+dUx-VA05%2 zoUpvQB7gOY^8B21i&fSV)@xD-G|tiVdf1Q>*{$Sso2t(;1c)(`DMfjBNGwZsPoGjx zrwrb{h0zFI6qvFk)-@u6hP`Ad3Y7N%C?IN$XpI6)+oEGcX^lBPrdyV{;gH2_#^BvM z^sN=$!GK;_V!54Y45BsB7)*>Lr7$sKLO_e4L%^qmHimLI#0&=b<72ju9?^OIn$Bp% za4^_=_XET1B&q+nWe`U$ny584DvW(;$)_amMkP=FS1nAw4wr#1KhJVLn zR?{iJfBnkiv zlL>LPf~rDg85o1@c0q(T1gudCltRadXiW+MagJHjFsW-Y=lEr_Vc;CiVnN*PNHK!Q z{=c&fI~)?mV{&V;Q3OIDiqLq^Vm@bD*UTmp9*)QS6av}N5vtoI8xD!91RA<5U`5{C`DUUgtld~T#|P>WV;>A zW`x0jj@DSI>u1Go_w3$g^CbXvo^!ceGA#4PVuSzy002ovPDHLkV1g^AA6x(c literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_red_up.png b/graphics/chroma-marble/20_bomb_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..cc631dfd204fcf31826a215195919fb4ebad04e5 GIT binary patch literal 1160 zcmV;31b6$1P)y{D4^000SZMn-c00077U005u>iI$fB00009 za7bBm0008T0008T0g2Xs?*IS;{z*hZR5;5$l+A7wM-+v>x>emh)6zxs5~(K*N2#l??l zxx9!eK}sNkj7DgTAOb*faIlAS>}RoSZk9@3{z7a_*qieW&# z2QzSvP*q6NU^x?>KIP+o|1o>_j-U!5Ak!&s7zooTIYw4x$yJPmZQoN31DzRZv%vsA z9;3In_?)q}WqNePe6e6H!r^K~*xx4<1p=5Vak1dD2!F?jXiBK}WL2^VS(Sddq+cx9 zef&uI@+G-#DQ7eOdh!IuV`Mr-RY_gPaC^(J*|3<;Q9!=>1YpB}a}F~jZ@1XV3I6Da z^=8AQEU6C;_*|CsU%mjKF*00V(_de+U9Y*C&ylddk1I>uXavrYHyeCiqcPH4Tp)XU z#J;C8^Bzr!$(uJwRWYnqgs#Jx;meY< zlM~)QeoVT#A#b;&)e3;gci+*}HFpM@k=JXq>lhXbs`GQo!$a1q71nh~&Xj#mku#I= znBw4o&uxpwh=f4#-~pq$X1{HbFrD6I&x~|?ixdU*>(_WQ`rQt94-3PnAfmJ)ams)+ZD$`T1}i!{w$nA?`}{G76B*z9)XlrRxggepdyD$Y5Y$%M(#5sR}k zwCk{(Daw+jX^{BuzgX8{U5E3Y$*Wg5@9Db^GXubCao%G& zv%0xKQzE4K9Gy(?ZHpWpQcNbq7}1<5Q$kenIg>*`y~pQ_6JfuqSREg;I6dXTa>-PL z5A!*a)@$@WOZ6|m;6zAWN746)D#d-2L=|%ma}E`u@Sfw@jK$NZ_`0T@&4_)E$Y=yP zBge;ts$y8Lv79k8LQ1%=p!+uIy{FDO_Nt1yZRt)=0q9e@2Ljcvzv4zCQqF|FC)|T@ z?oPHU2H(B}D9t!%ThgOPq+y^80nz0W`T1u;)37rmImZwJ$$N&Ppf5|*dz=|XN_Ukr z!{2XWRTRj0Oux5B2mz7l6!+o<6a`(^-K~yu^v29c393Nz==>b z4c*xpqp~FE^XETZ1IrH|NPQ2$&WuY{_J9Z8lg$VK&e5BZ%-EPwI!EaonBj|py+@CJ z3cF!=d-=y7KlCY)%uq8vuh(2{x6~o9U)KZ?M&7eci9Tl*F|zJ^4#s1aT}Ke18I3rF axBmm|BRurte&b;P0000 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_shadow_down.png b/graphics/chroma-marble/20_bomb_shadow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..643191923f6e1743bf6be68038322d0e72310fe9 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy z0|TQ3kgdURu642+NU*>o5-7-Y6oeT&uhqW?36>Q&rUO;#0Pz`yrEZO_KtU}}7sn8b z)5!@52@e>OShW%-L?*P^PTg>5MdM<&J}HZ=2P+y)OeU-fWnkFZ6>(SNVE!ARF4Yp( zh?3-@)Wnih-4r0fU}RumscUGYYh(~&Xk=wzVr6KcZD3$!U~qBy*6lD2x%nxXX_W*t z^obpA25OK5*$|wcR#Ki=l*&+EUaps!mtCBkSdglhUz9%kosASw5re0zpUXO@geCwY CfLW&i literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_shadow_left.png b/graphics/chroma-marble/20_bomb_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..886239a1d565556fc5dd40244d13ca5f17fc5fce GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkX``98VvKYIlDlD1s;(=L8hZ1%-DIY{yj*rtiUmyfq_v6h|e%Ab!%(|3Tk<}IEGl9 zPEJTjc)*avs+Bk)GNH|O>V`ur8W*$mNm*n)SkY)=GGSFH1H;a)h`SmG^WOkcpt0bVI zPwa3rP=h4MhT#0PlJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS7(8A5T-G@yGywoR C+*!T= literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_shadow_right.png b/graphics/chroma-marble/20_bomb_shadow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..d3fa4a0fbf0adc003776a7c3fa8a044fba575d95 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkp2L~8Vr-3GS-3w3p^r$f=ow2n6dL({deko_6x8x`aSX9I zot%)6@PHwSRV#5qWI~(m)D4GLG%jZAld{Nqu%gk#WWuUY28Nwo5qC8X=Dz{zQY~?f zC`m3#O)N>(O#u=NMg|6!x`sx&Mg}2BuF?hQAxvX Ch+1a= literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_bomb_shadow_up.png b/graphics/chroma-marble/20_bomb_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd933c2586245140b30a5e3f7861f6613d16ac8 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkUjy#8VpruTK0kj3p^r$f=ow2n6dL({deko_6x8x`aSX9I zot%)6@PHwSRV#5qWI~(m)D4GLG%jZAld{Nqu%gk#WWuUY28Nwo5qC8X=Dz{zQY~?f zC`m3#O)N>(O#u=NMg|6!x`sx&Mg}2BuF?hQAxvXy{D4^000SZMn-c0001Ze0077UGWKlK00009 za7bBm0008T0008T0g2Xs?*IS;yGcYrR5;6xl|648u zA{V%_ls|wdsF0{a>jD=}MU#R)iR2V6C`dX=egcwPHx?2CIU>S=#7?wc+q=GB^KmHF zHi{q-ryR|^=gf27IU~F!bW4lFe!T)_)ez}?*lql1Z+S!7H=U9HT0HpP-y+6sE4mD( z>0)vr1)9(WAAGOr&i4zKt$(ul!OmL+pWWB88TxyLwYQ_v*Vr=kEsc*@fuM>rLPo@D zsD$|VG|HW|%^UT<1fSj4GK|vCYGkSPT{&xJ#OUc#Fq`tH`1V5Vt1 zLI1otCu(FCJSiyv)(9d(69Wc8fvCz!JFk9_m5he(_D^T0+W@k^wO^Rt(wQLn_sasr3BWJVsS5Rr1*yUamT?}N_ zqN)_ulG}MRde%_|kE-I+9ETObiZJYzTpzyE3@BEd%XBrWxD=Esc#4Z^7A`uO8N)Ek z0Vthg>N}z;R)nOAkvWDk>pN@Hs>uLL0+haU7!gY6u*|auRe~lKivnxrE{m#wkQswd ziI@`B7#6Y;b5xz}wjqR|in*|d6}ieR3dIGh5ED_AObm+B#)tu8iX4m&Lg%|(H`t%; zO+S*}ATPl=^x_(sRR+f4j3Kv{E=IbPD2yda0wA}BkP>}s7#98BVR*V{mLD#+$Fs?P z8(K>DPZI_%!x}^1WeDKJpgQ+pNC^=z2z_g)n+ewkqy3GC8?6CoQn!9QJFe^nKVt+% zDXqhqIsAm8aAlu4k3`*0@$Fe9#;ji%`?I?%J7|1dwN;%oF>o0@>rfO`uwuxKomZzy zOo^xgf@d;4s;`x!$6r49eCM^doR_C}j!qAskEi4MtgWenXV!Vnx(=TrBG9*vloBy| z>iUGIN59ptPX2mshVjm8Zy8{1bFChnv^P&?<41>+Kda;Em=IcG?5KT9j1emdlUlm^ z6$gjERL@@h{;22V=Gx|3{ni2d<2OIu`t`+=?Zv^u@`u-MG>COpgf2AUq?+_5v&sH= zI$6K_!{*Nan%I}I_4QWqp8I%3jII`0#`Ju;JEqv%c=+iXzkt614-`8FG}KN000000 LNkvXXu0mjf6>0cu literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_circle_double.png b/graphics/chroma-marble/20_circle_double.png new file mode 100644 index 0000000000000000000000000000000000000000..cec2c07e7aec34f87e3975d6d9a0d4126bf60faf GIT binary patch literal 1217 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_door_shadow.png b/graphics/chroma-marble/20_door_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..7c35cac748d4f59bb7124d5b1a679fb146e60c84 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkgi~0V02(O^FSs5Bv{}P2^3^H3c`$?*XrMc1j`B>(}AjVfcOlEwijga-^stXhc^A`{wdr*2?6%WJ}tR4cSm(T@4+$%3i>Rx~bV>yxs`dT>CZBZl?E zv zLPJyfZ0Q{m6Arw$-8xPG`t-7Sb0+3>>iA9BrEi@*jhXfT`dqGfzDM=e5#|L((U|K;a>c)H8Xe)ofeU5Dl? zZ2TwFKVNm?HCBb`v9S|+!($ygQW z4{%?*zjIz&)RGm<%oBP~Bwn8TE^+3I%nOpQ)^rQCxvc!XclpUrUypq{w>U%a!+)MC z7J-F)mI>xt7P%c*&3i+cVfL=8yom{=JmDvL7)nZ87f$;xeW~H##hNS)78&qol`;+08Gfe%K!iX literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_dots_double_shadow.png b/graphics/chroma-marble/20_dots_double_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..21673141c614980aa899e4025a51c2e0d4bbd60a GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXIX(`Is*fv4iKMVSnAf;3KV2Z z@^*J&_z!{$_AZ|cQkL)LRt%(10PzO~W8KrMK!ODxkw8JFqae)Kd9D6EP%zTd#WBR< zbaH|NgBn}N0rn$a0kaxIN@qFb@Go_2;6Amz`BKc170FFS2@*%9I|ik&KNVix_e*by zr$o>a$ynK?_ngDs16dM+-D|~zYs@YhL4pMykw8JFqae)Kd9D6EP|(8D#WBR< zbaH|NgBsf-hQL=QjW^`Hg4gtMuHtB$sS)B{D}G6Z=Vj8#43~-P@=TcAice*@JPcxI YkZj<$tkiy%3p9hl)78&qol`;+0F?$d5C8xG literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_dots_x.png b/graphics/chroma-marble/20_dots_x.png new file mode 100644 index 0000000000000000000000000000000000000000..2e42a7c49765c1743a4fcae01f054193b79695d1 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXIX(`Is*fv4iKMVSnAf;3KV2Z z@^*J&_z!{$_AZ|cQkL)LRt!`k0c4+GnD9H{6iBeZBN8acbQFXcJFnHh2dXgeba4!^ zIGvop(3HP>Rrj~ANB8G=e14kLz_jV8oc!y@fA;MCRT(!SQqo6IHHoMHx=3a0jL9Fh zwL@mNOC|B}hd+D1Hk)tv!3Gu$!Q_fPyD}a7?RyFyt!ldfX7AFl&M%LD z!<*G zgoI5*WWi$HvzGl)K=+1;=FOV$+HfL}z20m}-m7y3vpsYT+sdO)=Z74>^*qq^&DB*p z^PXpS*QfrTT@mQq^YHMqPn)*-K0MFutZS($R=sU!=&TIAWfr2HTE{-7< zr`KLG6lyl$ak*$-z#OG6tD4IdQ}91|X@|t5DHYrQeDj$0_2-kuzLQgL=N#&LetoH6 z+QCN4BPM(Pq_sqDWR2XHQ1j$R(4$*Nj@ns&wem4|b@O-pa>2B9{Bce_K?_)Cu1)dX lSaa~jiH}QNwsv;@W!t|?%CP-(vm?-c22WQ%mvv4FO#nX-T`~Xw literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_dots_y.png b/graphics/chroma-marble/20_dots_y.png new file mode 100644 index 0000000000000000000000000000000000000000..94d23515a473133ab80ff58ad77442e4b57ffe34 GIT binary patch literal 393 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_map_top_left.png b/graphics/chroma-marble/20_map_top_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e67b24fe9698b280cb0bf3a972979f0a6ef01506 GIT binary patch literal 1045 zcmV+w1nT>VP)y{D4^000SZMn-c0005u>009^PK<`yf00009 za7bBm0008T0008T0g2Xs?*IS;i%CR5R5(v{RNGG5Kos<6@J2v@Fks_2&ds?HzQFx} zil;tQeW*}XsS-lfR#gj>LIhbBQUqy$G~7$dO(>%5r*&q*QmN>}k#~>1vuEbau~n(u zB`TF$Q7oQ|a{2l{(G@on6Y8u`key;tT$js_;s$XNhGO0G5>~NzDRQ|(?fW%6+ai##%`$i_ioL=*NVeydbE(qVR+F^Ji!thvS zv(2bfx{L~ij&$8c;W+co?8t}^i2X2(I;eCPAdIT#iFzvK5SW*t!j7pbpFeY0Z5VcR zHhUl^CTS#jU72IT_tmD)O>e)TEE9)UxMAJHBrtCvHk5=9Ps*Dw$l>p0@(c zTBt@z&s&ayU?WNA%3!e(Yz*isbXQY* z>gIV>eVa`} zXxpAq3u9w;6I~_Xyz8p>xcMW%022L%w%5?`J2kuqY#UGp_xD}jb4Z(w86RJgq(z&6 zmVP%pEN2G?ZRTKT1s(MoJZdzg!^xjo(3m{LJ;kOSPM^??GIJk_UO_sY)#-%?-GX?q?%*(rHNzx6^4A z|4ldvtnBPT%eWzNrNkkqMLHaGQzbqiO`4Qi@euRu?iD71evB;>{}1^c_uE0B-wX{2 zYYxBd*8>CM6=E8R7kz#5d2g?J+21eTV$a}*%uoH3kAvr?5()9Frzi0T_&sU)^Aizr P00000NkvXXu0mjfWKz`T literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_map_top_right.png b/graphics/chroma-marble/20_map_top_right.png new file mode 100644 index 0000000000000000000000000000000000000000..46bd9ec27a683cc0433452962d1db7f4e7a28a68 GIT binary patch literal 1062 zcmV+>1ljwEP)y{D4^000SZMn-c00077U009^Pq)6C#00009 za7bBm0008T0008T0g2Xs?*IS;oJmAMR5;6RRNHRTKorcMG(@zGQ#&}0?buGzgfH+9 zAjAVIhzC?51QLqSBE(%#(Jos;1yNE$dZz)>s;XM{)0lB>E)@?)*-Lgjb7ppPKilp6 zNxLn+HyYw_e*V98jB2%xRK3108;!A;pFccTMA3qa}xk<1%Y0195D(4vF`g~ z&2>c|znhqU#F*v#16`@CXxHtEAlO8Wl5*XT*z0kuOQnY*$3rj5WwGQq#%>geohVZM zS}mS5oAJ0_m#?t*+_J1vsUu1y0VW%9y*`${zb;s|y(FsDu0`Nt@t(+y!H}%>!_Xqz zaTMvzT1_6cT8iUm09?bzf?&f4!->^uov0`pYsXmy*xLj!2!0rp%@5}Gz+yWLHRTfg zgX`+2<+AEJj>L!bYPG6{V0`)VY20rAL=PvL^1({k_M6yo1_stdvw5gzXYZ;U4yolz zMZdLeF$Aar&>P#1-@9%sD-|^aD5aBGqw!7K_A-{2mG2M1^1TehEh`9y!g0E~P`Dup zC{|&}MieDIqZy;rj9#^Bft}off*|;!J+GfItJQ{a816{V>*;d&6?)i157)%Z%pH-V z5u0an72MTq1pBrG#y^6$!Lg~)joHET9hVSqIFv}l-Ip-KMEy|`buPgXkXJ-E7kTNG}7THr?MP5nf5w7bF8pIDA;Tn!oCA^kj)0Po~|M{ImF7VI0 z7$pF literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_player_one.png b/graphics/chroma-marble/20_player_one.png new file mode 100644 index 0000000000000000000000000000000000000000..336c33435bd6b3efbc1e19246ed7e732538a46bf GIT binary patch literal 972 zcmV;-12g=IP)y{D4^000SZMn-c0001Ze00C$Koin-(00009 za7bBm0008T0008T0g2Xs?*IS;LPD;;J z_#!WQ-Hd4u`f! zrYB3@J9!lVAOHZk)hs$<+3E@pGY@NaCX|sTadwI`HU0m1KD=c9)D-}T0N_@$=vc8V z28zhkbE+rww^<)?y2~5Wl##m2jAh^avIqbLfFGJgM~Y=JvANE848)goYhInQI$TO%VcZ zraxf&B)iU$QA9emXu6~m3Fwu~>|u5t}_UvVDjwaD&s){|+qLm?& zM3XtwF}G7u08nh7b9GgZaGgB;&sZk3$qZ!noCtq*B&W{THpw2Zb$nNEioDGE|c znH`orWJQWT4H_Q%3PL+hjXh_af6(LYWQcFfoLr71x(M{+rykIb3($FT_L`FMd@RHGx&@8#Oa5n(Bc5l(~ zUCZY7(dp8RS?}|5jp2T(F5Q2b-Ajn1mf;3Z9#S8;vdnk@0000y{D4^000SZMn-c0004LZ00C$Kk-f6|00009 za7bBm0008T0008T0g2Xs?*IS;9!W$&R5;6(RaZ+iK@i*@bw5A^UwrTcBO-zU6?N5f zjUd`8Cd`WIP%-D6bHacK;=kF)va4l9KR!hdhMC!!sj05&o^zaUeoISBA#Jj-upnz| zYqGbuCo3x}GCn>oy}i95=P$qg{e5?RecjiF#l=O8jg4V+bQC>3J!oxh#mLBrKRY|? z{t9eoXUBVZc)-TS2BOg@8X6i9i9}FaTWdYP-QC^c;NSprb93I0V7t4!9yj0K-a^AO zM%C5TC@U+oHZ(MZ`}=#myu9G*>I$o?tLX3V_kIN90oBVwot~aXcXv0Mo0~B(Fo5&( zbDW-@;_&d$E@iKJqNu3oE9mj@vHSG&WT9+tZ(BG7WYe&)yu6H)lN0DZs6n=efMiL1 zOG`_Uo16QtseTA4fKOJ`jiCl$LE|?X6s&PfP}LiKeSJtuNWFh7HBZf+Wz zV9s^!%gD$;dU`raN=lHHmPT-K^d_MW?d|R6Bn{An{s@mU(2R?V3+p+jSv55^$jZus z=XnN5@XX9iVcyC7{Jb&bBE#UpAgKvVGhSa`ad~-Z-^q{!Dl03E1Oe3)l$V!_qts<` zauOl}hJJm0ZH+lbK=zz71J2IQ>;gtWmISS;sxm-osOck)Ca!RSH?u-`kc>E|^Bg}u zJ{qW&q-jY_2}(Wba${p7!-cvmPEJlvNCABUJwHF2R!rU?fp2bZ5LAyQzokpyG{;+8 zTP9asU7a5j6Z8IPs1fee)YM041SK=}M@L6?m}ZbQ6FbnBOqp_IsQQ0>Ec6zSV$%>- z4Z*12@bEBrnLcAy%hZm5%tL}HGnU`~>zSb3NbR`UbzM6^Kr-VK*4f!nuinI_rY4uQnVp>t9izU!9xW{` z*7zpsWxlSve|ohwuR@85iK1B``T6;xY$Y!*Pqfq|E-vodzkoNDhfwcm^pjiw0000< KMNUMnLSTaZIHKAB literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_player_shadow.png b/graphics/chroma-marble/20_player_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbe4ed1405b37674ec88e780fb8f8df5e131fa0 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXIX(`Is*fv4iKMVSnAf;3KV2Z z@^*J&_z!{$_AZ|cQkL)LRt%(pfN=uDs+D1nfh^7fk4T^((@_v+?7UY09w?aP>Eak- zaXLBS0B=iUggm=gnu6d5=8dufw;vxU3ovz&PHR4HAhAvHSU?i5@~MCz-ox1%JKGXX zLuNRz2z0+q*tp)G^>9K&{gnfbSqfJt^IjD;^W7xp%f&uRB;G_bL30%o1OF+vx3!nH Q$Aets>FVdQ&MBb@0Ne&fWdHyG literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_player_two.png b/graphics/chroma-marble/20_player_two.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd5996c5cbdc402148ecd82fe20b40b3be7ac5b GIT binary patch literal 934 zcmV;X16lluP)y{D4^000SZMn-c00000000C$KcFa9i00009 za7bBm0008T0008T0g2Xs?*IS;97#k$R5%d@!99o^RR93s@4cCw-OFw6!~}vUC^i;$ zVxh1ga@7@SL~H~L3$e4%MzF9@(Bcq_6c*Nk2o@>U!hph+78cs5Ax1;U&zbw1y_=mk z^Pb-q0002|P_DX=-j{n~ppNtdt22(eJ#RjJ9RL6V008(pEj$%&c(!WfL>ed ztyQnz-0{Kl`v3qD0Km1hkmJ&-Z=^N-ivEPLB^`5kpQ6z;OV@5L001HYxRw@TTw0g8 zcEwqu?>IZ>yki`g)NF0iY|o8(>9b!K01yFul@>x=Vs3pxH_(p^BQX#o(5^T*p_&lp zbEnL3{({b(+fBe7w7gDaVQKq zMRI1$R5e|oZkRO;g>}#EoBVO}=UVE>2p!hsOpFX2AyC&;k*X#n0%jQ$a+mxkw;=hDa6R60VXwlPaescVITy?k(_B7(X6J5z@#Pys+tgpfm|q=*_03{ zD1{IRk(?=oX2RB7^yrLnBqeetXA~45AXcP-oXH~!Ln5uoBPnroOd8aVj`{mOrDL@s z1U5FAUF7l>b)>EsM}~ovxOc$eBbu6Fq>7}D2PbNGj`rL>e%Zx&W46sOFrD#u&0~=Z z6AD5kXC6G_w|_}m+xMWVDHs^b=cJ&w1&h+&Blxv2?&v@q7?d$To~5$2b|t+U3z@i z=dbNU1n}{T`_5OpP9C;S&*%~<(8fz}z9teQvl-`SbY~o#@A=~G>i_`oKOu#P&EfeGUH||907*qo IM6N<$f=CdY1^@s6 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_player_two_swapped.png b/graphics/chroma-marble/20_player_two_swapped.png new file mode 100644 index 0000000000000000000000000000000000000000..b5547df740d28ef584328240e457fa4978bcedab GIT binary patch literal 932 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_star.png b/graphics/chroma-marble/20_star.png new file mode 100644 index 0000000000000000000000000000000000000000..3da1bdfa2ebeafb0cfdc105276e9e5378e4bbfef GIT binary patch literal 857 zcmV-f1E&0mP)y{D4^000SZMn-c0004LZ0077UK6qp#00009 za7bBm0008T0008T0g2Xs?*IS-&q+iXT4G!Aq_6R;gBdP1_{Xp>1;ZB$b6_UF+h)1`e5X znEB2BpE;Sfw*T?yx@#eycP;!A7=Z8%fYCA;hZc`JzkL|kXt1k>!PiSAXZ`%#vHC%E zQopVXq+VyCQeh#HaFWwgNB;-ZdDjest5M1TrCpH8Fg3Kj_E!*16QpWY8rF6Hgkkhn zDeZxBS%OkYM3o#oJ~Gu*il4}4rQuvokY2GR4j6{GNvU{Eh>sE?YLo_wy53i*)%uKL zu@AD@FHkH75bVR?jeOo;k>#FZsT9<(MrGM^b9X0f-rqY0+HluFMd9kG3d~TH5U6Sp z-$7K>4Y`~N{EEOJD)d@VSq|aY%tKZ!mEz#+th0V`(K%?Tyt!eXN=vFAkv0_H5# zYBmd~syx;`2;>lKLuH@UXtaIg)dPvg-9za#qm;`WE_5TzV_7oCio#pDxlys`gWFp- zY;D<ZX4?rv?!NvwV_a5LGr9M>Rf|C;$ z-Q0ALNTh4>@UUw#nY5E+lBZ8k0Z1kTFh9?qwFFiwB1t5;+TNa>92|7aL?ZT|zgH|~ zmyV8{Gtnqd&dgk`fHM;_$N^i00000NkvXXu0mjfh3<-Y literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_star_shadow.png b/graphics/chroma-marble/20_star_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..6369d64ca1440acd92843c7fccabe9af76b48ade GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXIX(`Is*fv4iKMVSnAf;3KV2Z z@^*J&_z!{$_AZ|cQkL)LRt%&ofcOK0=JOl(L4pMykw8JFqae)Kd9D6EQ1G;;i(`nz z>7!E)ay1(WxahVj$gP@JtRu4eOGdRv(*OVKcTMG7lDVnV>_TI^!sJ5rz}2t(cQq+x zaWKykY82ksu<}ZY|A)_0%B-Y!WP3SoY5B6Oc=?nM9T97#3(L*o1+4_qE`Esk&n)@6 zY|fsj>c|OOSM^^xeN^GGbL=9u@crGg9=i=gl6hC#8HcoIwOx7065QCe`juCj+=N>B z$x=$)&is-^OwS!INd7oj?6=^c_pg0%d(L}5nD;ud^hjF2%h?}U6(ZL*SmpefSW_9V Xp{gkteDQrO&|3_iu6{1-oD!My{D4^000SZMn-c0002+`009^PReelX00009 za7bBm0008T0008T0g2Xs?*IS;H%UZ6R5;6Jl-EjiK@5fWqxeRa3-Q8+7b0GW*t=0t zu`3o78=}~I@4a{N0eqDF`Er~C$NwVC-ZPVxtYl@PpP!$k@9%GUczBSzyE|WBUS52~ zo}QlM?d?szzP^0_=H^DOuC9D#|Kj4p{Z39!WMg9^DPr^E<3nvzZ*OnaF8ccT_^9l^ zzrXt#X3lzkey*37mui9h{PXkEzxVg|b$EDKqTdL5c6O$FdwaUOyQ>yW4-O6-U~6kj zmzI`vZEelh_4RcFn&RR#a4IN=k}E6rHr8 z4B+zevQx)#W@bkF`}?)KyIcGE`n0XBO(!QO{T_gngnJ2qP^P#<3v~*a045?@U0to^ z<>i{4o$ZcL1eCz|BmhGB{{G&hameKWNM?X>xu~c}Q&Us5w6s(g7Z?3JlqLYCr>DmN z=@^|_SXfA?RaaM+*4EZ)LqmgGa&od37Z=CR12BMfb#<{W{|ef5)Y;joWo2avfX&U# zIy5w-0|NtEQ&Xc=RaNnG?(+{IT{d5dn1I*USI>~coSd9EZ2*bf+uQ4U#Hq5fG7iXD zR#uh+(y*467Kx6Ij=alAVP$0{UU29GSYKbS@c5%cJ> zLD(460`SDdgj1cHn`5jHu4hRz0A&qHw70iwety10CKG`!;{>Q>?B5uGgM))^9UUEX z(P<(r8UhpUlK}cOSxICOgocn=co+a?a+qm^j=-T!r=bo_K=I)Y3;}f6Sg{3x5{Z|D z31H}%S6&rUf&XKSS*RP70mFx;j*gCMW@cuLa-axxvcp2wWJ>1t7Wy=Wh5#P!KR-Wv zjq~#IVokw07{Gu~Z~$>46EY-w={*o26I`)WFr+}vDAOG^{p jzl@9wp>||v(nKYp98X1Hb8d({bSQ#2<8yHv_7+hSwbvsN$ZhlH;S|tGu zePV~3ff^)1HU#IVm6RtIr81P4m+NKbWfvzW7NqLs7p2dBXCnnv#Ng@b=d#Wzp$Pz6 Cy{D4^000SZMn-c0001Ze009^PvJAuf00009 za7bBm0008T0008T0g2Xs?*IS;J4r-AR5;6Rl-EjhK@fz`gZU(0DJZNWqL_0|YsQ=v zb6PR1IkY)qz-ynS|NeTJMd80_X3m_MnyTvViT3yRGmegqWM^kb5{ZP5dwY9661%&* zVteH9@X*({x3^_;bJIuGH#Ro>-0JG8OiWBFw>Uk55le%KH2J zyZ+6$<8`yksaG>4Y-P+sRt7BthIyg9}Gcz;V z+1aVJwYA#Z-0Wj(Ypafqj_S(FiW*BbLYhn_eXY2-SR$yx2!N835V z<$r<;=I7@&OCn6iuc@giZEtUPS!HEqT3TBAhuLqoU0q#j=k(&@!X+a=4TxmS zot&K1rluyXtE+QBJYmysrq$Ke+Sb$y}7w@hCylo4j$Im*Gn`vHz%|dUIE(E)06I) z+1XidGpd00y1u^lmL$7$7D-`lwrNL4hZYtVN@VpXEYfa(QZD1;<1UQ^Q1mY^FZ%fS z=zhVFb^ZfN?{l6i$;-==$R@lb&WbGJ3zA?45Y5j6fn*Aq!|X@?`T4m&8ZZaY%VuF= zLAZHjWF##S^Ep5u6)+&sO@sGy)Al@uhfi9iOMF+6yNR2T+8)(}AjVfcOlEwijga-^stXhc^A`{wdr*1g3qH!@>pOi(`gB6V?CKFbLGBE7yinyzBF#ioumuiV? zL`iZ{YGO&MZVHfKFfuT()HO8HH8Kb>G_o=voui-29Zxv`PXR z`os=512ss3YzWRzD=AMbN@XZ7FW1Y=%Pvk%EJ)SMFG`>N&PEETh{4m<&t;ucLK6Td CaapVY literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall.png b/graphics/chroma-marble/20_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..488a902930c82e6b44ec5b8ba4eb5d8cf148f580 GIT binary patch literal 11939 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall_inside.png b/graphics/chroma-marble/20_wall_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..0ddc0456eeed0e8cea78ca52905fb3e2a1df65d0 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzs^#Gp`S0IfG{6_+^aR&l`>Uc|n z{DK)+gqXP5BsCLcc=(vvC%AS-O_7l&fhUbET|&EO dp~SH>3=Ccg%u2HuuX2Fw^K|udS?83{1OP1H@+-mbx{z0tGcZT^vI! zPA4ZMBwS!ms@6)J5E)|3)8@`AV_I;uCbrY;Paqh$k&CkCXyA;G9uTW@HSpOup sOvF)afr7Pol)`@Tq!f{47h#r9jMmjEyd@FWkAXbz>FVdQ&MBb@00!AuRsaA1 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall_outside_shadow.png b/graphics/chroma-marble/20_wall_outside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..494daa735e05c9d65e25623ca4abf9126fb53c75 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy z0|TQ35Kmxu9DR2oNU*>o5-7-Y6oeT&uhqW?36>Q&rUO;!0Pz`yrEZO_KtU}}7sn8b z)5!@52?7jBtXhc^A`{wdr*1g3qH!@>pOi(`gB6V?CKFbLGBC)kjQAVcv||!bmuiV? zL`iZ{YGO&MZVHfKFfuT()HO8HH8Kb>G_o=voui-29Zxv`PXR z`os=512ss3YzWRzD=AMbN@XZ7FW1Y=%Pvk%EJ)SMFG`>N&PEETh{4m<&t;ucLK6T? Cidk_0 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall_x.png b/graphics/chroma-marble/20_wall_x.png new file mode 100644 index 0000000000000000000000000000000000000000..fd11b0c88de7593e42f9bfc4d1b0ebbf0c56e94f GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzs(Ey(iS0IfH{)53IDIa#AD0@ke zU$7(ti_vrrMt`P_E* literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall_x_shadow.png b/graphics/chroma-marble/20_wall_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..ab75efdef4e4d2c451399b097c6f0db9b7ff4d50 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkp95Hz&L?nzqS7_kYIsFBv6p)CmmtT}V`<;yxP!WTttDnm{r-UW|vRYN7 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall_y.png b/graphics/chroma-marble/20_wall_y.png new file mode 100644 index 0000000000000000000000000000000000000000..06beed286038ce49cc42acc82ee0f10f3e3bf7e3 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzs(Ey(iS0D`s|6xF0gJ%{{l)WU# zFPMSFVKbvJbHdZ?9H5Z6r;B3<$Mxir#0Ew&$DA_@ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/20_wall_y_shadow.png b/graphics/chroma-marble/20_wall_y_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..101cb5ee1d19df2ac6829e485f7c6f03675f2dee GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVzMESy zkUqh{z&L>+To5-7-Y6oeT&uhqW?36>Q&rUO;!0Pz`yrEZO_KtUBx7sn8b z)5!@52>}a?(l#tNk~1y1av+e|oma+mLKs`nR-k*ErERK(!v>gTe~DWM4fJL6QH literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_arrow_blue_down.png b/graphics/chroma-marble/24_arrow_blue_down.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0e519855d84e3a59f9a6306a99a542e74d6ae5 GIT binary patch literal 1200 zcmV;h1W)^kP)y{D4^000SZMn-c00058x003YBqOr>=00009 za7bBm000A0000A00T2KrN&o-^CP_p=R7l5_l|64AMHGggGqZDN*Vj(CAt*#bqKdE( z5<-FqrJz8frJ$tZZ`|}qREP>8(NNMrT&19(fQBzcAOSH>ZXm=VIEL$Md%fPBotZ;% zF<*&e^Hx*rd7pRAoTC+hS6+#)h0vA8WO4=o@1g7F=Y<7B-)EdNcn?jJsq4f)wYccm z+Ujv`UK?ZGUcUU;d-Bpt;n@)6%NXg3B4qD{rpXv10E|WkV}!QNgrKAZF)AS_U8kHn zWwBORT$I1Qv$i)P>psT%IRTXm7uHu(I(aTNaDn&2U?4ar?Cf-O-A#q>u6^>!tIGw5TDx|!>(cwf;mKk;4HzTjY}wq5RFy#$ zHa0p!$ecJ)08o~O6DJ0U^c01~d&6uN=(-tQx0*s&zX<5O52&0!|HG;=qjUTFBE~?| zB)U$CF(V>uZU%}%7!EDQ2&Ydw9(t&tsw_FrZ`8IOTU+1g?(Rp|Zryrw8Bj9^h>GaN zvWzKbFh+3BkdiW+MSlA&pbAAH6op_dY;FcNH+!bj9_NIdm8RKdd;9Cub-Nb<1uzFw z@cHM@2skGg1J)*XcGk4-Z{E0j_uUT< ze9hm3CYn+lLz7a1-+%Avy198u%3vUXP}lKKLzvAXZJXKH=&0*$oLf)U%J?Ate*o~= zXUmtMx#3*WzMmWCtaxu2joe=kzPFc9g~dh7Y}QlP`?T#Xjq&!4J9pl`^iR)!0YEh8 zH17L49n5sjFdSM=otgudmgbKv0^S??KG8H&LRd>V_y0-{AlxIBvuD3pEz7g#W-~-p zSzNR{^2h*~_k4dple4nB8)@5yoWD}y{D4^000SZMn-c000000003YBzt`Pq00009 za7bBm000A0000A00T2KrN&o-@;7LS5R7l6QR$Xh{MijkQqpw}klOmG%wibbadbI>|qpXq%lX=&A@d9EG_9INd*T7vibt5Y5{rv1MhUA_YnwW zEZAU-`2g0?aTv3#gx+yL%%LnR==V)v3_;hCIw;`eB&RV2!}yW6T8noPNGTQ@WSSqx zrUI_lPl3xaqiPGFcTlf0l0$%HX<*wLgkeDvWkeRz^A2b1=-&ha*VYyzGR@C(bM@s* zjTJ?V{eB9aj({vHsB(bmv>U3G zP(03aHk?dAKR%ApaS|m(Rh3jRs`h1tl0*_nz~kdwX)Xz5SJH=5@=|rsXzcNB7q{^4 zU13iqhmWHu9tMG?pPcA~Y0xAFaa<{Yc3Y>aG?kW%7i|T8bd*9Am8uJAaI?wOvy_P{ zhi>;d@AcR}CHi(0hI79xTdSJ3OfhsZju}ZLD+cnwfD0EasuZX@fEOpzcbQpfD_{2v9Og zl027^#nkohw34HD$MnXH?>FL@(~5P5uKO9qw2k$;r9fZ3$|zAnX)np7d~XS)7q%^< z{2Nb_{r4}l>({^AaGa*!Y<7o9Ql~wqhSRAaZ-kOa>fUPUf2RmhCMqXyp7J+ue);gN zVsmqsI!b)R`fxfm*lcFgwI=3V9+O=;s4WqU#gfr-LmRS`2nbEj^?uY)B wD_^Ozx!pGD(C7E?Q~kEAuYY}YXJ_>AFUU3&Fed76^#A|>07*qoM6N<$f^qr_0{{R3 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_arrow_blue_right.png b/graphics/chroma-marble/24_arrow_blue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..223d4e2ebb31068788a60021734bbd4762233478 GIT binary patch literal 1153 zcmV-{1b+L8P)y{D4^000SZMn-c0003YB003YBw`fK<<5=q3+Q54n)nfnUjb@DWz)nZ8-5L*DFn(w?LcRG=g$3i z&g)`GAqGtWd6#GL{LcG4?|X6pxOlOAA4KsMN?*88f3~xuR?nW@-Z*z|^Wy&v(s`c7 zRYg(Pt%WqTmrtKw-&kDy<$nWdYr&Y(*EK3hrh=kqEx^R(GiNq8PMx~_$(w?7ntF@@ zW1uV@#)Qh4si4J!x8#B$}ddFCk5^%Ey<|0_s08k#)!6on8)3h&1tts&1n z-b1r#n4KM4IXS7(T2Lxf*3JY~_0F;3FkCu$^4H(y=Wl)VPf$=*ATsV^FsK=g9L|jc zpPUR35rRMw$C^0SgrOoy4BiWaK}A^_<$Wt~u0Gyqbd4fPt3XF-A_fg=zJ}%NOy=L^{jMA1;HEgFbdanmXcGktB*Ns}QLuijpk*Q?jh< zwBFtF-gH)0K3_h_jbCb!_k#BoW%-mS>WTMHT%K=l)%9LyZSBj~65a>Q%s{_C(jpI~ z+3Y#!ZyCd-8#lhV`X<8rfJP(Box5-2`0-|vv@Wfze0ud&JU&pJKY#PBeOvwpkYp$y TibeCQ00000NkvXXu0mjf5~d5k literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_arrow_blue_up.png b/graphics/chroma-marble/24_arrow_blue_up.png new file mode 100644 index 0000000000000000000000000000000000000000..c03a832da801b7afad628e1bf30eee32e187c3bf GIT binary patch literal 1134 zcmV-!1d;oRP)y{D4^000SZMn-c0001xm003YByRF*900009 za7bBm000A0000A00T2KrN&o-@gt~Enc0!OyT(R|jH6wH zAmCea0SR&8?6rSD=-B!s^K$hQE=DphLL_IrEz{`2SDKRq4yuU-3P zf7Lp*>hvckGJN(-^lTRCvaE-I&=&)2Z%_Bn&&_UK=TsDqsw&&v+xvb03ju^)zQj<3 zS?e5HM_|6fr>AEtS$q<}JRSgcw=8oasu9N;-nWTpWB105UkCpaAVj2w-ZMwh96-Qq z=Ao1W^A#SCXP>nAC?LzmgAiQb+6A@Sf;d(X0p{}nkq)(5+x?xLp9lXDAhcMhVF=7= zTA`VufN!%AHNb3g9F`QE{h7iY$5CoG+LRFRZ zyWO7#qY)l_hJjFBtD&{balC*rf~FC)+Xn5n!R5;ltX0t3LF*lM&VA70LO`!KJ6Kz@ zeQOH}p@K045uj-THZ}~H2~8s)QfQhsiEQ+*U;pi3MSzgCJOmU23s?)}xd##89OLY) zMhHM%3q$~B2a&IMI-Or=@gCsTt;GSe>BVtL&UqvWBTX4e!iZx9?}5prfid(t6Nc6s zlq6sGF0xSXPQSUShMkV$G;NS1geW3xZCSM28qCY4AqbQrSgT-+LaUXc)%u3hwDq3F zTY$TF7YBgu0W~#E1LqXdlo3VC%~>owsww~gLJ;J+M_C3C5rB-G+w9%B^XI__07A@a zXszP)b&oV9XiZ3x<$3~u2tWi75sD%}1n?dJ2wGb(U*aT*-?DfExOsDNXpHVH78Ny( zN0w>CF~fU72mm06V}^5#qF9<#mB9OD*v@GHDP`GaZ!mar_zplQj_EkhiR-#TS$e#B zRbxD^Q4|5wX@j$~2Hp#l!kf_RIza2CXr>d5j6-w zP!t|bBM3oImH{Gy^Ya?az}lKdnlf4~MyI1+Z`U%5x{hcz3%%R7|2TXN5K;=qBA(N9 z24e~+Rl?dDMKQ%>GJ&-fw63633GXXd+aSvtY;6T}y8%@-2T=i_#AuYm+74T5j{zaN zcklGO>2&;;bK`P-T?LV4c%#u7Uc5Mg){Jhqi?y{3^LY;E9GDemvm7D;Wm%#qN<@)? z)*2xM7^Btty4b3c@Abonmmc50|K!J3t8suwS>_;O7&Ar`ox)lNVy{D4^000SZMn-c00058x0058xwhbzm00009 za7bBm000A0000A00T2KrN&o-^B}qgfQDZ}AOSH>E+NDrI1cBtyf(8-lJ+NH1_E&wV3DDuj$udJGpIlC|WVlXtRq0^3- z=dCxxCWRCX?GPh|lkOx>6i-muimVw`rR`d_e%#XC&v&ohdhgaUp!16sR8%gMu}qna z5rZ?1q={LaaWC9MQ3@$2q`+d?44Z8Bn@syDP8?Y?&341~58J8R?JfWcU=F6>>*cRM z>zn?12tn&qQ<;h`ceJ?$pvxVCP}zz^LPQV*Ck}(bCdvuo8``H2az5qc} zOk)~SBJo%M7hRr@Y0|_%1|U$!dJe=gi!<8Xve9i&Z`ZhWm#oCK6r9Bj7(JnIUXVm*O?X6bh?Rfpp2X`+1llg!EL37IEzV6e( zOlLAfJLH5rL1ikI>=H%{g5Zs(Pd&}FA*_Xz`}{!rIr868oYoi{x- zI0b+c$9~=?Yi2j@(l#ymyR7~jfA#kJx0nAdF#izw4aj6^tng36?@Gl4SHz%hYNr!FI-tELpfQ< z3py-@EZ7AqGv9%oeg_vF<=s-<%uVimcxUBdoQDb!bZCd;K|4sN{b@$U2rHJ-lw{4A z+Tb^Qa)o|E24tz3GHh8$h$w90J!|j<(1s$Yh<*t6(uF@@2!Sg;o90eYb%fY{;>iC-QC+A zPj{y&X~G1!mj@J$Dp=Ig&t7CvI$N z6Vo)sfgc>H{r`(1=e|65<@HZrzk(j|&w=8|0zn5i1~2BA4>tWs`5Q2|OB6Lm9R2_R N002ovPDHLkV1krtBR>ED literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_arrow_green_left.png b/graphics/chroma-marble/24_arrow_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7c886d1badbff1458a7e69ca86e704ec7018fed9 GIT binary patch literal 1152 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 WJ748Ew^Re@Kn71&KbLh*2~7Y$Nn$Dh literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_arrow_shadow_left.png b/graphics/chroma-marble/24_arrow_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..d541bbed6cd67ee19855608671475e72eb6a2e6e GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?SGzb_lu;w(_0vVhI9+5ynW}v~$L5u}7qs1G+9+bmBj#v)V_uZl1EU#9+#HfV+gKHv zeLD?iq;Pwf&dA_CVLD?0>lCS;%S>64J&BCMQ+b!|XEoth+U06=car8^BdNPxT)RZe qO0?I#410KC?WrZvOZ&IpWMT;4<$U$qRF(N4CwjX2xvXs?HgP^F1A#8N@d*Z)RL` z;G@!V#-#_QI!!CocVEx*!w~Lq`J$Amz_k8~`pc@!GUHx3vIVCg!0OIaYkN^Mx literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_arrow_shadow_up.png b/graphics/chroma-marble/24_arrow_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa36589f53b2053310957caf74b0f895d545f34 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?Sv;i11inUJw2^M%n0tK0Y1~UgS3NWa60R?+JT^vI^ zj&D70&DCHa;Ciup@7$&x{Fhh$zCZOWhhy*0y^4%qFX!a z>rqkLUpYtbtnAlL)34p+wA4RLbP0l+XkKAWdc% literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_blue_down.png b/graphics/chroma-marble/24_bomb_blue_down.png new file mode 100644 index 0000000000000000000000000000000000000000..96f6233dc1679f28597cb0280aefa76af0a327c7 GIT binary patch literal 1511 zcmVy{D4^000SZMn-c000B?{003YB6)xT?00009 za7bBm000A0000A00T2KrN&o-_T}ebiR7l57mCJ4;#}$UZx^*{i(u@UoY%k&gCa|{# zg1{>~$V2!6vdc^4J+k+^cw=uIjFFKr89UNQlt_^xMY7p-Jy~>HliqYyHTqPYzrOz* z_1$+;eep&9XG*>iDJTU1N`c7lV@>}}59@`TGynf+?IC_Er2?DHfBE&-b2&e6 zZ>)33>(?$$ChMwcPO&zSvm$4MwF#y4Ad??XXAyy%HQrZt$RKIPxqyi0{{Dh@@BYnl zX|ne%+Brx`_~n-wU6+PSRETJl5}Zp^Rd`x2r9VJj2kJWFT%?qKvks@4sTR z*|J{Wqfbs8qmgE_8MEDXloD_*Q;Nozg4SiY*#4cf8A$6l`W=RpGRx%!H#b`z9$w+S z??G6tBF-s5@%nW`*Bwy`oQo(`2K{BoN?~mp0)w>)V+vK}iE+!_-3^PyUuoMsK#S+nVQA+OvV|owdYzB#rtX5at-tL&sU(qy%$z<01V?5S$ zUBP?7ImM4ZPVxSLQVOlhQ=k~#fMw4;Kq(rLOxLZsy?x7K@ikSY8ILWaQNyR7{sA3h zpKb`kW|MgH#<5uJ2qBWQ9k5hGa7ze|3&~-aR3_16V_pWus=x+m` z*A4pgR5KoHtcCGdb8=$1yqvID6ueIu^MMqt3n4f_4Weom z%?SP5Z=Mi@<537fsB2AKYkvA^M%%Unt{*P7s^WlY;c(b;b@h(<{2TWBf=FL7x-QeU zEjbtLb{p~DF&-;I=(QGs`};A=<&L^8SZhhikaO=1Ya=lx7K;U|m2ful@YUYrGyXy>-Cn$$G;GxV6DPh zMT|nu@+4P(VAq%HQiM{35DH55N4E2dM!M;}>6BTdfz zzcCi}`-pQ6=Pdg9bAwV5kt35y!nuIfp1O{7-Hyk{N2)4taZ%B>2lo31LU_q+mU;1_ zaCTM*;eb*d;90GDwCmd8T!U?zW6XI~HBEaQk4K2~n(lUM4u=KS8oWPavzc*wo0`q$ zfrkg*9gi&{1@ArHdqf;LTS_UUWH>#QYCN7q`{Kpn`|UO{nOFxM-nS@aaBf3YEvf4U z=PFX_I6pUTG@6q0DvInWC9>Vl0YlR~XSG_OwPrk?Au^4hfBvWM{|CJ!j_CN_5vu?I N002ovPDHLkV1iU<(2f8A literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_blue_left.png b/graphics/chroma-marble/24_bomb_blue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..aba8db2a9900bbd58344e7289c9de7fadb438179 GIT binary patch literal 1550 zcmV+p2J!icP)y{D4^000SZMn-c0006)M003YBu0O-w00009 za7bBm000A0000A00T2KrN&o-_gh@m}R7l57l}nEt)fLBo=RWGuuc_{F+nzCljbw`r z%EBTFk|lQRSg>IUd>B4O*7-W1h$vDv*knO6Fw^ts>F#>ms(Vis)mXW!x~HU5^?#iI zk*~kjEXMdv2%R@3krDvpIdt9lJee5!KH%VCl``2MG!8s+*4RxI`MgUkY4Sg@Pt?=-m#0bM6gkb49Wwo+cE5s-)mjzXY z{rF?`DK+x*&*7PC+uHYi9%7^nA+p;=hC!LnE#3=ln`qm_-Q8Fh5kgQ@mC3{a2Jd0L z7GAzItX2k*$h&v{VYB&H;qn|}jC5UOI*r`k_823iWVyZ`C`*GX{Qi4K2#LkQ0Z&lhX@qKfQTZZq|{-p#ogTWRFxwHVHidvF)BAVJs~7M z`^@w0w=*s-N>Xw(P0PbWL*MtPCPXswJdu*1Y5>970Z?L$IDiloYoYJQ4`i9)`E%i` zuO_^BQIL}3aA;}U9VrD=2UIOFTD%{K(I8?FNmv_6$>Q7$*x@D<-qtCjVif1VX5Cyx0X zjH%gfTT%+76j2pY8coo38L9#(S=M7r!df}Bj+7XaXqw{Ke6%hoAV<35(M2GVRbh|!W|{jtH=NL3I4Ysc_Y1(8UMHL4TbcH7f+p2_49KmGIpD*I)x165dQdQ5%^9&J)QSe?-m7_lCh|T~o42}>0JY9E(>-&gviMkfNA4OADHk%V} zZeCMWcRYW7M^#0p(~_bnQB^>(HZkrHg9r?RJ!)bArET{(?=2xH#*FatT$s%)bsg!t zMAtpy*IysA+ci|xf0@rc^SNWOD9Ezx*pT;5QZ=OXhm#_1+)(4yd!cC(BEo#`FeVa0 zB1SkICe-ySCX)kM_IFNCdrnW!sHz1bb5imE^u0qh9TDcZ{XS9@LRkuRJ)jC*m#FJV zT}O-&VpI+X;pD{8G*f>0<1*D(W94?v7Aa zWxMTBjZCNG;EY-*4-X9~!FpZboI!Qm$$75K=L2P#P(9^`ALcxM{J@JBmsHgalgSz2 zM~aG~>0`XfilS~NlhGlnu-n~oI9%bJrRz>9iaCcv&D~vrwT7mtQB8DRN85J%_M7MC z#!*$#e)!>)cg{5$>DF??Z9;EJhXIOjflnjd$R1BJTLG*BgU32gQ5`HwnlYN zN Ay{D4^000SZMn-c000AHX003YB9t_j#00009 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_green_down.png b/graphics/chroma-marble/24_bomb_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..037d405b3efb0bd2ab998941ba9065ed54d9c68e GIT binary patch literal 1524 zcmVy{D4^000SZMn-c000B?{0058x0g^wL00009 za7bBm000A0000A00T2KrN&o-_YDq*vR7l57mCJ4;#}$UZx^*{i(u@UoY%k&gCa|{# zf*`9n$V2!6vdc^4J+k+^cw=uIjFFKr89UNQlt_^xMY7p-Jz3OPaj#BS0jKKxw^HB8 zH_aFMi+?7cIw^ue0iaL_QfsY{A}FoudJ%HY{PxpMQ(}4gkB2y1Z?6At&*IrXUa41q zlSc5tQ&hnegQ(g(=l}|gGAOABD5WsQphXi*-A^hZouG>*#>i^3!W_)Cz34A)KI=b| zPo|%!R<%eGj2NPcWR-EnVTz&6ElL!k>OKNlXOd22G8#=Lqk>}d-wi*X|19VI`Hgir zdF@`u$$HXsryVv}vdUzWvB{$J2gtmtx3dvJ$U5U2k3=DvM9~EsEd8eE=KO}scp05` zqW5Lba=gszw5Egt3IxFhi_V(HH@M)i(Lw=}4XP-z${jb z?>*Y#NRs$z_7g)IDv3%EEhtgA-#nO#GNqGBR1m=+hI!y1(zK~SF&}{mDo}V&L&r-eVFuDF{GSWUM#uU-th410q=bk z!YZzC%7KE{-D`$pox(+jDj)FwK&~jkCR-a*Yf}u3Z;0E--OU|~zb@!=Uqz5J8X!o( zV7O|oSPTn74rnx5G)fd%XMzh9T~H`YHUMOkD@4b_>T1R9?w0whIi2a4%qGns;c?5QFO7&(j-23k)jKdg<(B#`}UT_pB6N_VQj~Yx)GoL?o)K6 z$}UJ?lQz6@Z&>UWgc!&+S6Qkm%VZP51&-~JWD_nr@{qZCbHnBQlEd#0bf%-x4b#aK z*E;mnOtH%1lp~Wllmp+Le8;dG5F=!hDY{hGx7mR~O^6pGZi z5E0t0MW5$Bp?~qe5F~JvBS8YKZfSMP53?WW`@YKcH>5VPdV&In?SZRzSIqxBXJ7URf<`ms zfxhp_C1ba7i+7%}8WU6?>x>}WkMCLTmb9hCT1zsCtTUz_^W08O@|2sj8l=Ggd5z{ek6T$^F;& zOzo6TcW5-m8ag_BSy<(YlP#7r>C@b=^_A%&+$2!Y`+Fu#~{ z_s6>$dVp0HqYNW6Vq{14mKk(Q`}A@-zhA#r$#3 z!^;P0NK znkgUIj~M9@xnz_mVu|eI9_Jj+I`nh%92FIE6eekc3l8lyZEP8K1CNi7G@;?5xu8Gv z>>u`omw{QH@uIxoteg=J0W~P_u-dI?OH1ooT<5Uev5R??o38JUF=B zH5Py7*~~WFrrU1wu;IZ!49EV66v2Cs_a1RVwwY22$s|tYv>8vv(Y`pm_;#DNOzgxl zfbTuZDBQ-;EF0Rc#WjvJB+kvb8%;;#RgSV3N-S*WTQJZ)?^rEXXssE~#>iCS=YRP8 a+y4QW!H(#mElx@R0000 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_green_left.png b/graphics/chroma-marble/24_bomb_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..5d330d05ce0e91a0afde229eb789cdf58e4b86ee GIT binary patch literal 1556 zcmV+v2J88WP)y{D4^000SZMn-c0006)M0058xx`QHM00009 za7bBm000A0000A00T2KrN&o-_ib+I4R7l57l}nGD)e(lDI+yR#x9RS2W6zkuMzX~Q zWnmEo$r3wuEZDFFehj}N>--&1L=-6-Y_cF3nCZFnboX~ZRatzNm9sq3c~$kiRqv5+ z?3*m5^ljI6(WygG0CI9#S^y?)La#m1MRIZ~tvI9u|9@t2#$A6$BvMk!rrVs~U*G=_ z_Wl0b+Sh*_+|UIJo7AWZUPP>k&SG4 z;a;$IYa|J8|MQmZzqUol$w?{Erj}`%a@*hH#Gzif9JmdY;A@Y&cMR1)S9gR+Bw2c2)iE6j5{NER4HfspJ;@S=5hd~} zd&O7fSDY8;^uFiV9XX@}(hI)#_|AjEa6fR|9tn%Mpm7b(9KH2)+Pz0{rB^iCkV(d? z@QUx}-?N&oC|yZgw;a18jWwi@5QJhV5EH}%Z58i5;ikV~8J2X?G1ve=vcye)L#G{| z$Itn0_8k}H1sasPsd=a$==&a1Loy-P92Lc!fq)-87^IX40G*BOd+PznT*fnb#@Cat zd0sq6gK}(+H2Vha6dMflM)HX`M3PI06GR1{JnEG&3$TYUaT6MCFf($=c^aPbW&R~+ z#TiStq_28z_qR0GzyJtDi2$h6k-Pc#3#X!JP^1)A7b`-~SoKqR%Io|!=lMCA�P; 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_red_right.png b/graphics/chroma-marble/24_bomb_red_right.png new file mode 100644 index 0000000000000000000000000000000000000000..1918e543065d1cab577ac99423554c0c9f15facb GIT binary patch literal 1540 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_shadow_left.png b/graphics/chroma-marble/24_bomb_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef63e9cd4f6567ada67ad2a97a67ec5657cae6a GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S^Z_6?U=V4U*9j6V@Q4HoG6M}}4q_BwQ1Jo^x_G)c zhIkxLP5=UyBu<5Ci;Si<%;HVE!MIU(>PFcsIU8~n7^}6CqgUKqEY=fckachcD}=#V iD0X4brRABMSs9va>SHTjwAcg9WAJqKb6Mw<&;$TX>^UF+ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_bomb_shadow_right.png b/graphics/chroma-marble/24_bomb_shadow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd132f0c45cc8234f9e80738d265002a97e76c2 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S$`pWX1BNBr`}PAFoCO|{KtX1p!OTI70t_l%KtUHz z7sn8f>tNFl~|1w1!!{X*U=*>Q3D#dnIQ>t^#AVR&w-;n~TMIq71SQu3&{Q j7z@QN?76f&b2BSLlTCeW#fuhupm_|Qu6{1-oD!MQw1bg;1LNFWCj|{9Ky{D4^000SZMn-c0001xm008g+%Ir|y00009 za7bBm000A0000A00T2KrN&o-^+(|@1R7l5_mQ9EyR~5&9=iItg@Abz-#+hhmKq5jf zYy_cU#J!6^U^dwW+$p_K7-bfN8+j{bvYISANI=2fWiudg;Z`IAy$XXmMlxWuGn2MI z-e=YQIxgz<8zw|)FBH_JZk_)<|NsBobA?NeC;PLlfoB(>jU2wZw|;b)|Kz`Yu#xGL z8{J+bcFVAvso2$og`6@Wcl9EMlQy;whn0JYYIE)$DZKgZJKuQxKLN~4KKfO68*%q)=VaamUrI+ViIc^GSPH|+ z0Z^-Bqpqn$5X;eWXUEgiyWjoU&f6kl7cr|Bcz!qDR`qWQ_|y4>MQDjRA|lLFL`8^2 z5QJeRfT5z8I3G(zu=3V#@4OFi|01Sdy!`#0cDoY22l%#~l2S`5iFry)W55iY2r7aK zj6+}&BC`~6A~^Nbe#4Ku#l2tr@YmZf0NBX1QaLbGCW|SPu)vEFOCgqm86+z!YKnm% zi1eU>;8ZB;xw3Ixa%c}mqmixv{`s}Ir|Nb>4nC%iVue|Xq|yg1W;hW*XmdgYRA8PG zF&D-m(B@2~6<@yc6_33C*$N79hn-j&rJ7pddU^LFLS=V6TREVWe%xF_4T3Kc3 zog?H-*G>57ABSuXhObm2c~?zCF{_IiAs3p;k#eC@K}2!dQ?}`AoCt<7i;Q@Vz#=7_2woLOUwnSKrdFY(7AJD@#{JihDu7v- zKU`~uuWi;1*)qlGEw`+JwW_9eiXy%E$qBHxBkivuW*|<$5 zug<@+bVlPGl?t^wV#%xGGmMa*&oQV(NMX)wan`0>9;^WVnBUt!Tbw?MIYckYu&St? zL+JxoOHIuBKp@M)f{P{~0yzg}vy&(#Kbm~~>HZ7H_3uU>Y=3qA+J{ZEQLp(1?;PE7 zhxIZGSuTIJn6pR;5uwYOHRl*A9FISx#AygAeCzdJe(&)Mr|IjX?>s(RjPD*#p2k@> zXA(MQDH2Pe&52n|D{D5+QM;ZpN+zb3qtj1#^7OAUr+D`w_!l;u_kaGU+l{a9dA}x& z-|&rZ5D~mOMBs|AX>(>0I>zmswwrK1c^W@C{@A?8-5+UU}(dnySWt&AK6##L0Zj+4SF>PLA8ZefpP2>wfs=o!|WU@ui#oXf)Eb zk8kXS5^in1bnWKL8`rK*!aNMCno@H8Z2asbrucB$P9KDW^ZgN{@_*ebK0n_3$?vzK ohTS#Sa2}_J-@pIHrLHai0qkGPQ7nH@;{X5v07*qoM6N<$f+m)S&;S4c literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_circle_double.png b/graphics/chroma-marble/24_circle_double.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc20f1383a4c5c8fe4247b6373ed2fc195efc40 GIT binary patch literal 1581 zcmV+|2GaS7P)y{D4^000SZMn-c0003YB008g+#$s4000009 za7bBm000A0000A00T2KrN&o-_qe(c16leUNN_QlAI)Mn{Vg6anxt;)27)fD3`fH3;5^wz||i>@FTT zbEN%RfV=OsM?*~S^^93nDG{T?1yAlAJ_aBWQbHkE5xQCtd`*b$O|5zL$k}h)cq+gb z@3ybkLA_0>u5r)R%+;l$;y0Nj12 zJ!+7TqexcQIYnFHVjz*|EgM45(Ora4wbZ-N^BA0*qIw4ZcMwz^Zzh`z<82t8Oi+9m4=N(mC7$!nUbA+K}l$2E4g%t!{bF;cje z&$d42?xWi`U!3(%p84=hD*&Tud%mO1YV8`Twx$lA{m(7%tyh*A?jHb&!sX=oj93T6 z3X8)<_Us#>h7+9RXr*XEWH{K%p27arKgrs80QL8`^OcTd4lt}l(-|6GJh?>b zE4GUr>Z&4!fC&ak3WY*NNCI&ZSYLa{&>zJ64yAXj?X2SYSTs)%(NDk+jmPii3qluPWEQ$k9lln^2v zZIR7lcHIS!OA#L~#PII%?X?krc##>7bIrdB^(BBSzi*Cyo4p0>(<)q-*;R|%M#sJP$ z?99ejP2=OW($!?9&!V*iuL-*~KDOxYoTAKIOq99UQD{vt_KKIh*wAj5gDR)tTQHq{gz!U?v9&J#JbA0Xa-Vl_LedjOy{*S-q`O$Y-?jM-1a^FyvW9qiL^t1QRZ5n{@*u{(Y%ju6+21~1s z45bt!Sw?%yqm9p4uw91TAx3LL@Z8$I!~OMpwg70fs3!)aPzFmsn?w6v;F-|@Tuf*M&NXaJx5%pr8@ua% zd%At8XSsOc!wc>IbyfU3e)-z3S5j(D?O$9vZnZt(gFn{Ky3FeQ`ff3~>VmuWp!xF3 fuiiiR)U)NE7zs9qQpxdJ00000NkvXXu0mjfA+7P7 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_circle_double_shadow.png b/graphics/chroma-marble/24_circle_double_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f1e7a924127342a270e7f0900899aa1cfc27d6 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?SbOKPR0)yL(?~FhWXMsl~P>>mDFmn*20E3DbP;j27 zi(`n#@x9Xyavf0MXtQRWySsO<)AV&0YyNMa#lvi_bY~gY{nQix`>*J*RJy1L8)_VF z6Ir6zAj5KDyOZU5Wku1KD%%zX=S}K*-)}$F;8XcZi<*?oNp)StlV28wx;9(Ap0-Zm z9C!Web&E9YH0~^rlrXVdm~h1OW8}&mo0HPTnLjHV>2LC$J&S+V&(McOH)qCQ*W*5( hnz~D;c5C`+&X4mFzs^y8Z3T2GgQu&X%Q~loCIG2jXOI8@ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_circle_shadow.png b/graphics/chroma-marble/24_circle_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1ab707bc27555a71aa608085c65c5142a418f2 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?Sv;k150)v;>|8F3{0*^?bAT!Wl<{(A^1{E)$;5<(k z#}JR>d#4@bI-tPOX3aWxckf=O>FX}m{NFx{huK`|&N8n1sVDyTU(sQybWssD)HvEE zvP7{#hULO`C(HH9ilQ%7wk-bi<2zbp)OZMJ$nZJok7 z?)um37HQaN+*u$gVPdy1;fU$S$dx-bC#8!se^xfq-{d`e7XPfDp%060&WyjV$9+6C gb(c=<*7VbyALk{0oum5N3g}V>Pgg&ebxsLQ0Ohe~-v9sr literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_door.png b/graphics/chroma-marble/24_door.png new file mode 100644 index 0000000000000000000000000000000000000000..4542c85c380628b972441fe98e95ab3d88fe85f0 GIT binary patch literal 1363 zcmV-Z1+4msP)y{D4^000SZMn-c00058x00B?{d^MNu00009 za7bBm000A0000A00T2KrN&o-^$w@>(R7l5#R>w|VNff**|BIJw5E~W-B!mHp90f=` zLW2=GiXbwGY)m#e+2out$tDURHf+4QU(vEGq%&2G?;AYKj2A~Yy*|~aPMzv!Jv=h!%rn;v z3=FuctE*pGGcz+TBzo-Y>(l-H{TlbWr>93d&seAz78W!X>5m^j>cPQ5-P_x%J32aa zQ&W>hLJa^tKR<7NH#Ie-u~FuDtf{GSSw!W6uC6X=Zf=(P`g*CVs*?8hcELA60_pDV zHt)*H%A~x!TnY;drJ$g|yh9=x9v&7X7J!(0=E8R!8XBrBmP7z1udS{95g8dNAt51> zl$0a^0Ra*n9W7B&QR3z0^;`J)`AJGjiezVJ8=%h4PHAjx6jb)3p`k(I*+t`f_TK+T84|`{4$38kbvJVap?A6s(8z6HfB_;Ci-8%^m z4%TnqzE#%y_wU^m@BNAxSwqJCl=> z6Qd%&e-7YOz=(;7(dp^w%7VP;K}JO!Fam6DZo127u;F}$-sS%O-he>&W_s)D>ZG{1 z*i5g#zrO*XR564a)BL0&dI>4Q58O?D4&d;8dU`5fzkW4W%94%6F49?Y{QO+LeEDLU%0#4wv~a>NE-nnX({w6}f}kn7TrQiHkZ#zHMn%fP zSQ`L@D5Yo-27p!23LHCNa?(Q}RzqNC7ui=bl{ zkRQ=t4hGBpj-)@SEGi)*BSVuyNKa!k=CF6}QMKmgFjyK2{0aa0&LP9_Y2~U|K+$V>ERqTu8@%W>B8>Wn^_#yfe*tP= V+wlzzc-sH~002ovPDHLkV1koCYjgkr literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_door_shadow.png b/graphics/chroma-marble/24_door_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..01dec54cab349738876c361919635d28670b1854 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S^aP;N28O@9K_5Ya1s;(=L1v)A%t4F-3@Tng!D3Gr z#}JR>$q7KflEkSnZIRKmhFQF6HyAhSPTeSbC1*pf0%NsSa`cLu8e%tsPA1F|YuF$r zFne<6R*s(sJJef`7tKW|FbOAE=I3y8Ko zylmSEEamT zaXdNU0Q0~3nGdRV?^Jqv>(HAi#>SU-NN_OBdA0xDDzl$E_I^6E^QL6_wJk0)8btr+ zC;Zy5_0_HKv8Mmu>z@C=e}U46C}(G8Var#N^VaCuea??ReE;)i<9}vqmh%`p??#8c z`BhPR@&ET|t$+6;r+wdVdGlp`XwP2lh`&*fu86lsHD5K($?CS*yj%TUzW=h{@%GuJ z8`_wIgJSx9Jb%^K2A=zWc=F_b%YRAy?=LhiP<5?cvYGEl(>@vf$tCuWjr-cV(qqm} zIS|KIxnB9~*Qm-VXa8H2|NSo(waG!>*kIyfIrR*W&riL+8F_r%6yW{wtErmANsFt^ zN&hcj>zXpVyVGCSWwrX0D7*aiZA+%HJqi-vRn->V{aMpb_r?`-6^n+e#xgS|I22|b zTz2m`*P?l=Rh^rN7~Q(&-aB$q5JeXEa0zb**pfK}Q zWrJ$Y66>Ajx;XV>Mx@DvR6&NYOO^*0YOyB( Ptz+bP0l+XkKD-1`A literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_dots_shadow.png b/graphics/chroma-marble/24_dots_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..f23fb5b2f93fc53d631d1b7ad7917b6be27cd16d GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S^Z}q!1%~*RXYYX=&H|4}pdd5QVCEo30R|N>prDzj zi(`n#@#KUB!Vg%Jlr^3$ZLHehRIOpQsIlr+w8LiwseK71rM=76UA$s6E6OeSdd90o aKo@>}D#o}h`KCS41O`u6KbLh*2~7YD>^8vw literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_dots_x.png b/graphics/chroma-marble/24_dots_x.png new file mode 100644 index 0000000000000000000000000000000000000000..7642ec576c0c028fb606fa89dd3d3a170c20089d GIT binary patch literal 527 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S$^wAw4-6^!AqF790*^?bAT!Wl<{(A^1{E)$idIh- z#}JR>$q5Wi+i#yrse8NfZ=h77Z7U;ZfcKn-XP;fld_7ya&h5s_6G5?m-mNP7S3X<2 zF73yxb8cZix`l1Cy+8TNuh;t}|8kAA12>T0y-E4pIj{fnZ`Z7K1@c#OZ_?gg?)smT z_iEbWR*S&GCXA^M}4e~EMKPQPn)fydqnb@nak-rQL}z0d(FEp64lYn zXwd1)=ys*wbLTvxEduE`E(j@Bmq-3P-?{VMS%Kw_kU;VBPe9M83y&AeONB`RNKbjmH*DPtZhag5RhvQnes^h)=IQL_dKSwUCj)|I7_3>tg1OePtO3RngQu&X%Q~lo FCIBPA;p+eZ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_dots_x_shadow.png b/graphics/chroma-marble/24_dots_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..67df7832004662f45963d51db2e58cdd5f7035da GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S$^w8`f#J#2-ynlH3p^r$g3LgJnS&Sw7*xD~f-Rmd zjv*e$_fE0qYH;9Tbr)bc=%@SkTJ(zV`=_>^cRHANe9B}8JAKZWYmCwX6;Zl=jNe#7 zp65RJ#kKCJWCOE=>Ny#A{laNmu6f+?U(oL%9vL6}_d;EzX!*Cdi&sg_(R(Y}>CAFV zdB#D>%~{PyUOt|o;y3x4Sm$rfFM=zopr E08Ld{(EtDd literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_dots_y.png b/graphics/chroma-marble/24_dots_y.png new file mode 100644 index 0000000000000000000000000000000000000000..6524375d99a9c923a907dd0184155a002995ea12 GIT binary patch literal 477 zcmV<30V4j1P)y{D4^000SZMn-c000AHX008g+Z%tY800009 za7bBm000A0000A00T2KrN&o->Q%OWYR7l5TU?3B`Th+n;W>baf>y70RuQrxdK3QE- zd4EM-#N8G7rgvwS^OI{X!?$e>GT(RBO#8XJ_UDWBCI3%MPx-&LIqc86mheBPW~Baq zy|L{7+fC&^FVD-Ic4Bsl48zNH#ZxZN%aSE%@Xl)4AG>O%{Mu9dV?|xa&nRcT*`8*~ z0iNb6TA`uZY+&rHt(D+r5KtOvJ$p-g)X$4^Gk-8#n49tA&BpSdx0mM4zPUIj;P$Fq zt*fgV*sfk}V0*i*SnK`fvViZqYG;F7ysS3(N3fmd6gN|4f(|P3HQn~VYE^n$sYQ5LshNfv8ut-G!O#N3g T7BMeT00000NkvXXu0mjf3{}!? literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_dots_y_shadow.png b/graphics/chroma-marble/24_dots_y_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..e04585387d5db63765a57a6540bed0dac19344f4 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S$`ru({q}D+L4pMykw8Iapux;Ri~SVPZ!4! zkK@S+3i2Bm4D|)N88^y^bUPl6&@h%49C%!07KIiQWK&knNE16aA~j23#D8W(cWc?E{2%Q>T(Odn4u;0Yb6JRh?;8Q Uqa$rAfc7zXy85}Sb4q9e0F3NLPXGV_ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_map_bottom_left.png b/graphics/chroma-marble/24_map_bottom_left.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e093a5f1eb60789cc509ffa04a2e956b204416 GIT binary patch literal 1634 zcmV-o2A%ndP)y{D4^000SZMn-c000AHX00B?{z=)4800009 za7bBm000A0000A00T2KrN&o-_*hxe|R7l5-R$ELIXB6Jr#-zTqjS;ght1GbVmD!n{ z-MP>1tfpyd)r2N!qaij~FH@6}ikhk`38<_U5WLYHxv7X$cSYs0aw*~^t#6H+G(5;F zFKr-wgv3Ptp0lhJBF1iVGT}e}%y<6p`_B0>jhB_J91Vq{y|S!h^uH(4vV15dit)RG z@Xr0X-pO&%Bz)U6Aj{FwaCo-f=ga(5Qj)2Mz-Qd+&Bo%jgx{aJCrOhxIBurK<5|eP ziF3JqT^yIW$@8;^9FC~z8pr8pVbSzIf7NcczJKG!_wN6hVKTd|R^0?>dLvYiivy}U z@hBW7X+P)@FDm*S_m73cukK3{!GM#IE}kc~ zUhf3vU@h~l&8C}v0WQ0FJ`2zzNgJ*OgEUZ(I_`3{!6y2yD3YUgJN={6Swc*v4<2jU zNB1@DQ`|qOswC!e?L6V}(EDt*Y@DO0e9Qsu^8j6f5F1dGDT8GbBcV{@R|u$h{0F&B4Ie?$Wu*A^vN=5VcAqt6#MEas-l0}wpF95dVWmP3=n&I zm(^NjYGv7~OAIr;ub{xF@p_HZ5S4a&?_Qg&BF=HEkGWjWfcFHPa;h~Dhyg8C@Zo8o z!Z=V^`24WL(SAJ`96#xF_V%;vDk$_qgU^?^$S_l-7E8?3&a(Pxa0DK!m*=SwO{3F5 z4bp?pHlQs>-=B9S=?qYG1}yrr1*kL_M#LPPpsgbiNa5P8-2SWJxE&}m_*HMB=_~*o zeGceAfyrftAs1+xoOHXhqTLdNf52^|vbdNWEG#5YHPS;KC<>pFr04h!=s`}nT=OE! za!vyPxR?XLm$q0e^m4WXXJx*@iWdE@KoNB`O}7LBMieMsoEuvZc@Y3Q1|2b^DCJ$E zxC_MpY(!OmLq~uOXATq;#Crt64@UT7I23vTjYkd@7prHz-sYnY2b#qGBog@>Xv_ee zGeA-NEdZ06NKA;Ii1HR4;B@@h&i1#xo#!3Kq*j?NC`r7dJ(|AH=Qg9cXX(3$!yWI#{ke| zNK%>(g@&^)sOnJ0YTdm=WSE*+N}(?d=p_SB(3S&O7!@3My%7KiR8H_IN%sg;Pi(e5 z&nT*%_xTzLhSPbBSgkv1Z}EKOp`yG-y(;W>a?0rxVSF1+pxLqjEPM4km#gZf#j=IA z*>=$uOBp=(3QlKyHE!g%q=>qBJg4NcvgC&-{B1??VdZg(;&BhS=iLAt*Qxt_^;wD( zC0!|s$&Y1uKt-Cu;jwn0=(#A~F=V;VP?SLfnz0*(+-MI}4K_A#?!a@r%I)q;0zm8A z04VasEI>H?h|qK$Ez7+TzdvCF0_`b|yFna|qlVjk5}Z|Qv;~9D8YpTSy4ip(&(5yH zFuRV}?G?%8Pw*cA3hMV?-U-zT6xEp*47Sib-<<^ojeKZZ7-IV2;^O)7&hzIuy{D4^000SZMn-c000B?{00B?{%c_Fz00009 za7bBm000A0000A00T2KrN&o-_%1J~)R7l5-Rc%aDXB6(-Vlw}1ixE=+sg!=va(i!Y zd%tgct67#gHPM7=FhrA1y>l7Ss+ki>K&4JV@nf!6pel+^EQlZoGQ^K;{#(4s!Vme& zpDmF6gv3PNozqs*O^IuA@}}?m-us;MJkL4TGErH%bSxZ>^~tG^)8&f zj#IgNT^wg#=lQw)E?3NQh2!*-uxa_9zxwiWefOF*@4WvL!1QB&+#FQZ z$%l~$8B!E-F%Y=_BphZQYubFbAdn`Cnr~v52vk-5ZCTlGcz-++dD$mP1OqA~T|7@3 zeZEONgFSPn&8Ay^1}<;%dTcT<#c;6SPQh&!HZ{r z3S*Dm{_KFumAV=VO&oQ*`|q*rGD!4ni{GC-$1u~I3kz#4DVEibgCnr4ex9dBHH{tu zYLFgWJAk$veSh>w(g~pG1X%P%8&GL5jEHAYLC57_FpYaRa`!KRoYqt}~8tEZ-6@^br(ldMp^dLt(o~+2S zoYMdR&gB5`q4kA@^xJF)&N8=QMtQ#Fd=m@ak?4HunM6VzOzzDxT2#23T`7HgNh8m9M-}D%D^ctLdTNN}}tD|E4taJ!dh znuy~>)a97hE5m$$zrLOq(2heESb;}uwih+~nE{8(qFbuQ@;CE=MX&7WP0B+)t z!@x6`OQs~Gd|uty=X(3~5Ku zpIfc9(Sm}y&vJXO1JA71_3;%e)+GuGKGh2gH$iNEBdpd9`pT8-VqS0M(tiNu()fD` S(&rce0000}M{P)y{D4^000SZMn-c0006)M00Dpi@q=0h00009 za7bBm000A0000A00T2KrN&o->u1Q2eR7l6ImRU~%K@fyL2m}es@q!={l^`O-V+m?- z4ebB_SH4sy&18=;xJi>`rh00orjG?^08?NVX>(u^ftzY=roa){N7^A0f7IH{G!Xm5 z;`hRyIeY=R>=j7d{~QR8myjdqCxC1g^ zeoE#CI!V+e+l5w!oqG&#($d-*q{ZS4s4& z&@=+?@U30#fro&=B&sE_r-&ftk_++6lJHAiCYvoJSs1331T&X7iA$iifCG&Ut-c31 zVhBv4xzc?ohqaQ(mywNXksq^CQA=Q&j^wy?#m+3Ps9jM6V<(X>*GWOc=>*b_>j-=U zc~|iZ8%|k+GCTbxO#h{27B&6M)s%~ye$i)(HI|D%TYdqMct%45bMj{Z0000y{D4^000SZMn-c0006)M00B?{aJ!!w00009 za7bBm000A0000A00T2KrN&o-_&PhZ;R7l5-RclNXR}|jb#-#pf8v}-b?z%ASd-l%G z?(DpFcUIFhHMNONsEH{t&H9*{ln837APK%!T@YWTJ5}(3NEJloDXvJ>wEk=xp%&EzVDoKZBG>vE-Rf^b<61df}w|M_e3di5P^*S>XsHWV_qJDoZJ zbm_rht92k28=6cc9#T~urlC;VNId?S)3itPqIi?CY-XP0GKsX`U;S-G#jm)3Jdt>D zN0uoXWJbH9QF_eppF|(5nY9d~+eGmvJsRz{0A#t(9*JBgf^fCh<2leS%Xf$*-J%S$ zkGS361#C9@&d-|m-W^T*5cl7U#b|@av$@{qBikJg%TBUv8TuY366PM43jw+sRCQ>Y z=Z$PUo&$T3g@`8@X7@le+9g5&6aWp#bW9Mk>&BDG1RTyi*0k(^qRC_`~#9)}ZeuraQjUc2~dOZ7| zc)d+o$Z|Rq$~FKkjqu?apu*T$Uj7uK?6?w%OdNE(`v-Y`g~9V@T7tps_Z&A}ZMQc7 zK!@)09kD2iM*CS!%Mn=~CP>f1v)!Jj?{`t`ISLdVg%W*!Arc`5$4Tge4B9V+!@an6 zU6!r=klCWhojM_>EdUUB9_T=UDaW0sgq)#X??Fp6QM~?FAdseYm6a4yrw}#LL+`3; zv{#m&wuM5d2d(#b7DQH*1(C6e2svv3L?TycY3T;CRM|mgnX6ZSsTZyR4KzatxeyK; zDW}sY^o=iyTnK;_O>{ztJ`?iXl8QqF|{cZbPu52zIXC5V!e*%prWH7ta=}f-{06YUN84{1*Hv)l-(bPnjK{r=> zy^T80XQwJEYU+OE`43tM*?|pr#P6qD*R0`>6XMAD{pHsHyc>D}eHoUW`pRyvvq4+y zt%O(r$m21n={`v^;IKiPnwE_!N)mn0NR#I|t{ZsQ+rwc2*Diw&yBUUztXo%pPtzRG zT%;o$rg@*a6GcXV(|G_8sq-Ai6(PW>V9*#%CWA1%UZU@YDE_hE?Vj3IQSq$7?LL(6 zRx2Q&B-<;BZNmisw--D4CQLq3FxfN>fC@Bnaa9T<(p%xZ_@HIZRzS|USV7!a6& z8MNmCURBW*L1@KDV8g4K0@2g04#yMd&S)#Vqe1j^i`{c}k&l zCvhgh1f|&3pcDO~tn9@BAbRmHUr=$2yYqsa^SlQmwuM#XK@@at`8R&{>PqyZ05A0q7>4y94>~` zXC)>2rqWXVbFfcKN*a>I#f_ij*A@+Z8%j#*))y6}KQ1n|{%=~s@LTIwtx8qFxBmuH Wg!%~nzyi+z0000y{D4^000SZMn-c0008g+00B?{bitUk00009 za7bBm000A0000A00T2KrN&o-_zDYzuR7l5-Ra;CHXB6IEVp3n)#)v^cR+eRFcXnsz zvOCwk%xapZwl=ZJ)&@grvQ?)hB^5QbAPIO`74TN2J96=YNOc!PKm-x-lGeAzO&T8L zm6tYn|Gw{>u}#L~%f=&-#DJz57(;IeO&i{&D4C=z z_rm=E#LyBkV2EN@A|6jKv)$CR#CSA1-|Y8ikNSMsW(d3{y<9-%*I>yf|j9iDGwFk}l7?T)Pss3!-QofroAX^XKu@8*A5Ye`7w!{hTc+*<#qb z0pJ8wkBc|M;iaigNGs3ZdJu_l_jP^YnkqL^eiPw903in_wYqxJTY`@5|(IZI~K%c6XUI+%+OQM+h(e3W&S5>xGQOI7W zll_6Be8gsZOV{tctLyzAV176}Lfr1U%`{!h+U?t{V3=dYi{Rsn0Nt`&cQX{4F$Ezt z7Kx$DgTafF6t#aq5Qdfuf_cjCZ%J|7>6xOUO?9?T zK`;)|v_;W?Br#ALI}FqyJ$UT^+H&;$(W|P5fTBZS(I>%R8_RK~f_rd+jzHji2G>;e zij~jv=Ro8y4O-4(&}>UO+_MO&RFdJUqB-?WbYhMlzauCiDlW_k%$SMZIXtDw_E)FDiGN? zCkWFu<>fVkaPEDduW7r-(_nbL2g#Z>l>$XI*x}wG%a?gc>LIuX9X$;q*DN+#4gk47 z3@7MQ6w6HrFsf-W+=CNLfi695Uu${AJRsSHSbVYa{n=1Bm+2Y@c?fzfa{TZIqg{b2f9ln!c|35A(>f{q+O|8szg zqId!;fdqnAKqgQ<`Py!O*vv2z%qfBa)sxE7(!*CIDRwIqdWL#cJDubJMJdqARzXVw zfOy~5yWLOFo|Sex8;2`&v7Dr+6_}V7MFnX%K+{?}9)AaQxf%-jvGODofH^Q?UJrnc z)|{KB;PslcqPz#+h%nLwQ>POsdUOpcL>kat(2PAJFmO;Ou(3G-d2pSq_jm@=0MPz2 zK)y|JRAXhpZ45pxCJ2_n&fe>Cnb6T@(&sZfg29I^3^Tja;jq@wZM$K1?QuG*(@UKo z9{>eC!}FV=TDgm13ff?F!;rH;K_frXbDHCf-4zv!<6V-9pU*A~IQ3?5sPK!epFCk{ok}i;JenZT9t^yyZ-_B^Y}`*vO$Od0000y{D4^000SZMn-c0001xm00FQ7J6Cn=00009 za7bBm000A0000A00T2KrN&o-^Vo5|nR7l5_mP>CORS<>0zWtiFd)kSK3?Yh>fCvx8 zvLI4^K_apDBFnHsO4cmdu`fNhB#k&+FPc^DSJIF7O7M`F+PjNLQ+x|c=u zID*6hMrzHg@2NVcPF1zV>t0L7=OCNM%4%p0N`VU`8b%rDEGF$Qa_>rV8iaK!_yf~s zYqX4ZW}zs^G!zC3KpV(%IO^F<=BrG*xA^oz_rC{tWI}3L2P+C#w_vXVaV`NYOWuuv zD+=CsU~8{O=3V0E`NMxgsaJwmvkrk1pd6@egR>2XM{qEJ;}}LmxNN~(6Fd)sYJit@ zSXm2SAK(Ps4M-EnGN{y`z5~t^&>FG=-tl3sC1=tUJRd3q42B&RR>D^Ycw|DFd55+e zkS7qwkmq1K5Kh9(F`Q4}Y6Y$bB2zySHjWMTCbVk-aq_ny)=5EwY@L=9kR%WvfwCYT z3JZWNg=R~F8DP){Q-I@u>w?h`^9apZ#~2d*uwg9VKYkDXCopvbDsDm8s5xi=4Y`KBCUgg&ci{ZnqAy13VW~2JB|(f46Qrqt zuRfB@r#=E=Xw*TCQ24e0*cNEu`5EX=gX2l@lr1B|7-8YKQV&%cP-_@O;C>ACYo)Yh zw^u4CY6^S>HsC3!+R&PSAbi2VvR;6Bu6#EoGo_%_hA`x0oEX6O!LOp&Peh*7KyKh_ z4X(FEX01hSrGM00}^}w$} z;~A*IDlHb}uWx>8<0k98H5Jfm%KRzH!^#r9hsO~0pjrd3B8)5x@rN1Coo-xGHzIJQx+A_Mx>0)vCy{@i@Y1%<$!BhyT7ZSJpxf zyB*el2#7Dh8*^e&W1!(nP2vRneW>if+Ak5+_DkTeU;1A^X!G;tGPyHL7!y{D4^000SZMn-c00058x00FQ7B1>cf00009 za7bBm000A0000A00T2KrN&o-^MM*?KR7l62R@X{oK@h!f^E`f!k18e*Oc-zwOs!xJ z7%=CYbIv*E9MLg=`X$$=hIy*3Q@eN2b#>JX&5U!q|fs#?SNl6T3T9Co12?zetupJ3=F95?ruj%M~BV$$+NY!Wgi)Ht*xc>^z=8Yr>BP=9v3Q*wl;|z1lQNsbbNda0%~q< zHnXy_JU#@!xVSKJ@bdDKxR^+tSYIKjtE&?tj#2=zum@RUKjh>ZA%OQJyup5cer_UN zM83ARCIF4KXGuX!twxElbxCNUK+27#* zS{4yVQLnPHGV<~9p`f53^7i(2d3t&}3^WWoLU(p{qDWLzQ$y_kcVHkzR>;EoZFO~3 zK1W7IJ0&;z(Q>R%(BYw$h@km z3V;+H9ZhLzX_S(ZLXnY?IwmGY8N5NEJ6S5q&CL}X!Yzo@iWV{el$(#(X>@jW=62cW z=qRyk1RTLx1Q8Jtnln+x`ue)!Xf+xKz#!oE7cgiG0_Y0@xaaBVNl0J@NQMk>E+ZpD z&VoQGMe*_RnhBM`zE&BISnHNVcfL_W&f*yp)len(E*m zUC{IS`I#Oc9|Z(*pr`=CcgS*kdn=;>g|>>0ED!{~BM_dnGP}42E-x=H2MBDem2-c8 zUjPt2x*1Voh+&~i0gSppI%ET409qEd8V(l6k4={ita(rUp zFeF4>U{QcuHNrVIi@1t$FwRYu=j|PV0mV&cB4v;u8%uBe24`WIq0=$&FaRz6@gCsl zC|!x$Zj ziHSmhI{?jS-4T!ile4|Oo$~VXp!rK&T-?`gHIT3q%<%AVii(ONwy_W(a*Pl}4awk^ zl9Cck&X=&TFpqED%Y4}WXXLsP5)yF1YaRibqm}R6Oq%D7i{CqWpZ!PwS-@t2fq@Rb tKosT*6DcN8+(?Rju6Qgv+*bVH`2~Rg(rAhCz={9>002ovPDHLkV1fr@FdYB@ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_player_shadow.png b/graphics/chroma-marble/24_player_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..df688ace3b22b8ea020df08ca70089d21dcc5fbd GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?SG!QU8U}&ADFA8LF7I;Jg1(|^cGY2sWFsOI|1)Drw z978;gCnp@>pV1J(+F@FlAi6?o6NATML4n)C2i%@SFkM=}f27PMB7r^hw9Bf8+gv30 z4sSaW<<$4kCEBU;A&c(9wuctFjZ4L>wIupvK7P2e)XBB^qTz|0g0_WIS!XR4>k;72 znCFu@?_x$=$c3dF7JC=^PUmXZ3ssBNs$FFo%`mqu^`_zp%QYa^db;|#taD0e0suo7 BRQ><} literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_player_two.png b/graphics/chroma-marble/24_player_two.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba56cbf31a110334c43d48d25daa21078224dfa GIT binary patch literal 1208 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 Qng9R*07*qoM6N<$f@Wg?xBvhE literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_star_shadow.png b/graphics/chroma-marble/24_star_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..8edbf98c8305426075c196d2ca079b2a0303b2ed GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S^aP+%1%_a*cOZi}3p^r$g3LgJnS&Sw7*xD~g1HvIg%Kh)gf*o2$^Ocoz}fAntkxxKeT zn;)FNCYiHID2eH$7@Mi0!`o<^X{+XU)=I^2=yev`d=A?iP@+&%adQ z)csssw;WLjwOVWNp7+Gc1rtwCE}PJ_(=Fh5(Bq}DZ#v$2Cr%AyfBQXh`#c|(Ei+y@ z&7R6_+Und~J8RbL#hmWz%2qi&%E~-6QFzw5`d1emvpzRX<&&MV?S5^drDfRv&SMWd zq@NEtpIf=)^xwI^ aPJPueYiCxe#$;eHFnGH9xvXy{D4^000SZMn-c0003YB00B?{X{V0&00009 za7bBm000A0000A00T2KrN&o-^N=ZaPR7l5tmbpqiTM))iyNtH`z9$C0h7aH)2$T3n z9K@&tW1pb&e|!TGL=h8FL{V^G5ph>gR228E-M#fIsbMC#x8Ts-(^d6VeP5l^&s=jW$;d3kZEmY0|3B!~L49v&V( z8X6k@@m5w={>b~klI)!%ynKIucNrNO$w1HZ+{edjH$8pP#Sqb8>R@%5V6c zpP$DrE-pH}iHV7XybR@qPh#mv9ddJX(<**`e%9YD2^NdRTtPvB`mpeiqR2fyKDy1# z&1h$5C-A1GrV!=dfejTVsv|Z8+aol zBZZc!!?1w>PEbzs&c2rHABDMiKZ^;Pv&j+t}EM?(XgaZ+v__A?TqX`vih+ zIso>6M%7SBC-~C=04zE*DdaiVUR)Y#O8ipg~DVNhlNIizq6r zX<)Xrw4_uJjFCtZxbE(5XQK^W#PXa5z?e$gp;YVRV6@<9Ha|b_N=r*sAHYRC1?cJN z(WDrZL6cFmy1E+4eY(g5!Z+HT5<;m2P#%`b8|9qVPV0QmzV1TfU3vF#$0P_YqAJpPft%>Q&W=;h-|V* z3JtuqwY7vKSCMfT9v)T^2{z89T~}08q^q&9(Vd)}xS^pT*VfjS9EA1tb=9h+rA7V3 zClcy^r-+RvZTav|dkBgd02EbLR=Voy>g2Ta_xHQb&dwx&O&1#w4Ys$pBLND$fq?;? zB0*CP5Eo}VP2m(lNnTY|r3IXwow=Er8Q0O#k(@Sw833E2!^6W!u7M|&BxJLMg6!j9 zr=e9uh2pGj+oXtqN*f&j$mU~ADaJsUBH1f}*W25x9moqmwF-a;Fn(zr3IRMiI?~nE z)un&{({bvNErSt>CV|)2*Ow60LrLz#J&pj;I*wGw)UfQNy}G*6Ykhsa`jD7dy0DMa z^z?KjAio;0(a?Z%#R5zNdj`lll8;H+7mdUmco{_Ni1N(6fzpBKr3pATOkg^+$>Z=t zE7|GM{{DX8$;L`ZqL4yJf{_RwIs6DDDT%m;0=i56grbd267T4S500D)fj2lf_($gY zuT=F8I)>Bb<)v$q7KflEkSnZIRKmhFQF6HyAhSPTeSbC1*pf0%NsSa`cLui^Y1P46+WcV1+Ok i3&k$%xwJfUGb=-rO?_;|ixzvJc?_PeelF{r5}E+EnK}#r literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_teleport.png b/graphics/chroma-marble/24_teleport.png new file mode 100644 index 0000000000000000000000000000000000000000..b5908282353b08955a19477313bbc764bd8a885e GIT binary patch literal 1245 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_wall_inside.png b/graphics/chroma-marble/24_wall_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..f78191d1c45b86670ca1d73f4f477fa52febab17 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA83*`;xB_YX;6DcVd0IOYs7J6Q z$S;_IiA_w1g;(83B~M0>S(u&i6W7~^KuHTv7sn8d^T`jMJxo2o(BpH4r{)jO4F-MY z^$cO0Zx$_1&|q|PTeHZAM`z8ABR6kITFltsVNh7a$ezopr E0Or6yR{#J2 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_wall_inside_shadow.png b/graphics/chroma-marble/24_wall_inside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..4dffde74752f2c2b034f6409e8702a7c610c4cba GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f`EG8- zK>7d!1LFgRDRqVmL4pMykw8Iapc%|Ti~^Zqstg7OCJhG8+m3!fL0wN5 z#}JR>$q5Mw7g&<2r4lFHG%=QGbJvyFnsB8lklPKyn3%-qJ6o5*zp6L$z>envK#i&; zt`Q~4MX8A;sk$jZg2BkZz*5)HNY}_9#L&pfz{JYXSlhtB%D~`(|9UN$hTQy=%(O}Z z8utIYDF@Ub39=zLKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpdtoOS3j3^P6Ty1 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_wall_outside.png b/graphics/chroma-marble/24_wall_outside.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee606048fdf33f6402221bbe2542e6f45a770f2 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAwFLNtxB_W9fd6jGI-zN6-n?D=4jkv>VU&>&=3r-KHf;EC z9jGtF)5S4F<9u>RQp%pg4SW)f4UVE67Z1L7@9FXB;#nhMRNiQ1A-X~0Xp{3JadG9# zD~=rS*s#Lz-oIA8!{4WOPW-=^LHXJdg;PJKw+hZ~;ZasLljUL1SJX}t?7egm6gZx) KelF{r5}E*SSYyfn literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_wall_outside_shadow.png b/graphics/chroma-marble/24_wall_outside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..30be7a404477f33995bb830dc45c9a8346cfaa11 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S$^wA+0fTGU`d>wsA24tA0tDnm{ Hr-UW|ewQ9R literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_wall_x_shadow.png b/graphics/chroma-marble/24_wall_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea59b66a409aa999c50bc8216f77658a8485576 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoMi=$=?n~v84L_e8VsDb9sPiU zY)RhkE)4%caKYZ?lR?Vz-Q0?S$`pY30fUOK;&hN;fkz}zkQrz&a}c8dgNheWP{Y&3 zF~s9|azaAF1g4~Fsl*947mM{o8Dt$?!3t+MA7o;PscE}-Tky>ypdJQKS3j3^P6QPZ!4!iOb0;4op1@Ps}k%>3dM{Y(Yz-kkN68nU9-}Ffy!v V#MJljNd6;`sh+NWF6*2UngEFXC!hcT literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/24_wall_y_shadow.png b/graphics/chroma-marble/24_wall_y_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..ff82c2ca79b8f43a2334b147d32e7a4fda69804e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f`EG8- zK>7m%1LFgR2`pwjAi)BUNT47y&y{D4^000SZMn-c0006)M004jh@If#!00009 za7bBm000DT000DT0nnqeXaE2PTuDShR9M5kS8HffXBa-F-lxoKFERFF+B9i2ZEe%* zX-pfFYHT&BjV38|jA3;;oEHpIS2ZP~04mJag zjrS42ECQOtf#z_4IWU>h@6^@J@U^OH26Vb<&}yflvNGLgHqRosS$^N?ds^{5>Q;qBsP#wLeSc<)8W}r|@JnHuiSa*7`VMb#;^hR8~e%))17G zj3dh+vJP^hty_m-?OH#)`DOrtjBump^uE!U;DlD|1YcWQQ{1Q52a(8SC@lO4N=r|7 z2~USd*3i)76UCsU(?xkO0-{!jV8@P8X1ZxpfSIpb=jTR16pGP#1qdJkuc?Wm2a;&Q z6ztoVK-I#Sybtp8&r5lEZ#~U^L517sg#jK!r;D)MBtI#zWy?b1HEaB=z>@&7vq$*8 zv~-+H(cGNiGPJZL&|BjOt{ZZ4-oy8fcL~o5kB3y~_33m0NuvovSy>3Biz4zd*tl^B zR<0am04r7uz^YY)IN%5r7mssdx~Ho~6Ji21?MQyAeOZ|oa&y0uva?;!W}k`r`rB@; zwg+o9#_|(;Vz++%5D3BmWMvI95SeU{`{nYq0%S}o6@k#{!dyNwEwL{v`x8lgh^Fmu z3(pUaOryEhr&jwVtv157-Ml%#3J~iJ8;00?xw&cc(UkyXfD{%6SvhJI6(Mx}AS&{s zR8VlT@44(Vq1FE7R;zF0ybj`^K~BDUwVwfy5h)qDo|4l&0U?i2AE`#yw1NTj!xb#c z7g!>vTX^yC$cl@v_9>MEh2i-Vk;`bjM^EqNw4H-OK3P>BoZ zrw?A7eJ14cZns>19S0dhw~wF#Y4%j>jL~R~pqZjljdP{LWuC5sdKnf55rE(O3-gwOZnOc3VPo)}=ii*;k5;3I>hM3ceN9#TTP^reS-9_oo zOS!r3*Jr=5E?jqMGt64Q0+T9rtq{g$?_8*+VQHY{=;4L2dT95eea^N&x9!UxahnJTjxv>$O^=QfKEh9yX^K0GW^ut>xuD^u~8mNy(YTXP*hP z+2?9+A7kmM{2TvQMlm@H&B>(^b07*qo IM6N<$g1}=+zyJUM literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_blue_left.png b/graphics/chroma-marble/32_arrow_blue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7e73a2b2b0017ec28585ca0219462e92c361a986 GIT binary patch literal 1690 zcmV;L24(q)P)y{D4^000SZMn-c000000004jh;i)c#00009 za7bBm000DT000DT0nnqeXaE2P5J^NqR9M5sS6y!tM--i}-SyhB6Jy6gDhL%ChmQwH zC3pg)ko$o^$V=S&_h`2ZL^7Wo5R_j}tfyjd=1TzU%vW(C=@a6Cygpj|=$e z)A;UiXaXVBJY!>)rt2(8I*a@`fQ8_}Xe8#NNa{S-g7epGJpLYI`(qI>;`Z%$St%ZR zo}Ay?lNy(ZV~RXsar_5!-Jh7_q(@D_h?_U#W!Ghal(Ly+N^`D7lB8^ZKW0&sve9S^ z@HW67vtm&m6#*m8o*gV3!-8tnYbxdF>1iXR%mA7IG=<+e8w@fikOBM^D-<4K9{*PY zMw~h|SmvAsN#ZnJ*VCnv7OtDHdR-$z1_C)dILKM2Gq$raIY_*K3M;Hq5g$sx0HoVG zal#3wro3hxyE;vC;W#lXms95ZhRw|>rZr=EZrJ8#!ghC4`@hyXlJ7YP+-Fl$&ifJ| zS-UOHMX0sctk-?5RE~Qw%d&_Gku!MCKnwr^gIiFNel*IF2QH|05-69C16CQ z(rZPL2|TZ`Af>AjrO5M`5xC=Ih*aZmZbz{w>{~>_^8_TNsMw~u9X!ZL!JoXlhapAEM#bONh$uq zksk4TqT}KnfHJTlj5_?jI5`;>L|=39N(RP@Uh| zakS&)LhBeFQui8Lj|HrC90BH%O;0N;GkK0y3qXx1Gh229L<&&kM1Y78S+dFV=w1hF z{DOc`1-EXQ5*~k~wYrRct#@`Z(d$KcDaOJX$Z1QF7Nw{v6@@6cB|w9ur)y^?WqW&> z&2&`#FEUdKP#!Lu!UI**^ifXAX@_YA8VRv_PJ&NLsqmkAJ2MUr4$TK*F`j zMYe2hjVf1 z5k(4Bpe=ZsGE0cOuU3^MK>m|$REC8D2f=OZ4fl}~uRm-%rm9(Af7}|6<4~#TCLOuD zU00-O5n!(MpURgA(0)J)cpkTwC`GNijq&w|6ZkukXV2D_H#Rnc{e9jXjVdVLIVe&D zpa%l3ZCrHGOzoRG>h^XU74t3frGHdMvQS*P^4W46$HCqnZ>H%Sw(HZPR;xh)&)QHf zPdXXoXku70`oCk3ZwIPb2Sx&QzG07*qoM6N<$g7m!$#Q*>R literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_blue_right.png b/graphics/chroma-marble/32_arrow_blue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e2503d0e9f60bf43959efcaa083adc139ca317d0 GIT binary patch literal 1710 zcmV;f22uHmP)y{D4^000SZMn-c0004jh004jh{~0=600009 za7bBm000DT000DT0nnqeXaE2PBuPX;R9M5sS6ypd*A-o7pL6b~X2z0bMM~pZ$Wn+A zff7UGd{8KfaZ?C15SP|@=^rVKoOnauV7q@kb8K!wlTnYp=c5I{N|u-g(DOoIUF#et<)7zwLgUWoBc0`_A$k zZ>+x8?RM#@0w~LDtgcyE+nLLAI{(o}zg~ImwST?`JRKlpOb+G())JgMgsN&Eud49; z$&o#o|*aUV+TS(05pvQ5g?_2lt5iGoMT8yur{VVAA_|M zv)kKr;mDDnEywX69~%(T8gLG<*8d;`pp<~M4$e6!1tf_=uNP5OO`_jFGRxe)5Jf*- z9v}bHBLkr{)rcZO7zzY|0JCSr7>A-@#4(|&7{*u_BLK9iu73n;pPQ9(^up}yFP4uU z{mXB^FA#e0z(7g?+I!qu2Wx$CX5hht24%^x7HAqqU0X;gVQrh7n?jzC&H}BAQ&T@* ze)ie#4utC37fliYrTnwZKok+A1ehI+VMqyREfB|qG$l+-NH{0JJVL-T5Mpvx%GSl{ z>C@Ne=RY|x5DEe>x}tEyV#1pO#yHfqL(@1^l>^}Qk){$!A|WL}6)KM>M-Uw~ERE$Bt*M?vH@!R!G<5g|z=(o`ajC6a_-twRtv2tiP4 zgqr3E%5r?Js)CF2^S``);>6#7^WT7wF@SRpdG5RI^%@j~MZa%R6bvGPB#|Hj(o{kS z0j>QfNeG>e!uYsGyRD!U(CZmg6=2K=mE}0{d~{CAk;P-j-n@SF=%2p@gp$PDkjPum zIiM)~%m*iq35O2{NK=V0BuFU`#}e(fLL5s>PKFpC*B}xQ0tiC^tsR)XMyhHI&P~iQ zw-#q+PA{D}@wXum6$Bb_3@{5ABVdfDe&7sac$g2yIK;6)(|BEUI%=4rTU$JApsE;B zdX|)O@GPe!goY6P=Y`l>Jay{S@1yARlPXCxm@SIJ7fBL{rg6hSl2V|q8BODcaXrw3 z5J0D+u(Q()g{zbpYDnurs8uj#2h5w$`YVKCg(w;^L9i>;-McxY)DQwFONKFwAP^w( zf5hyD9Rom?S){2Pg1djefl{71W^ZAod}dhNAkQ;2%?60pnE3`()$V6mHnwo>TIULI zj@8|}HCin~6g?yi^7J_eNJ$Vv>{)c58Lj<@2BGEigP}FRY+&sUnr0JGbc==f7fHFZ z3iP|TZy&z`ba_xq8ROIL&>@FbOG2srZU>Zm8od~qy&GCB2|%D}7TVpjcH(c9)i(xdQxwziC5N*9KZkRFy-T3XG2Gy^F}x=$zjd2D<2U6ylhm zwfBD<6MDT8N@W1HKy-_Zxj|vLxf(_3!qU>n<%c`|7JxhlMn)X6%mJ`SQ!!NhAeOZj z2tz{CI4C8cl-EXG*Kn?eQg_hrFS8K0$(YU6JioVa>(;UVS$GH_N%k+HEVGCrg?3wl zd0&)(pLZM!M3F!o1J;%R?t^HXwO%JFZ`^E}UUy}sbs2b{4|*A?K?H{(5XTZhAch)f zwIu3V>?I-~rG=CReviDz)^3p2eAAda-A_NoW#9w;uGg^&0u5`urJQph62o~{mEQ-N z#(=p5^DeCIu~IoHRo{%Fcwv72%%yHu@b_Iv_Cy#$2tR9M7GRr$>*N)}#!{dbqTUBMrI_-HGcn4bRpCsGF2lB9z;t{^3Y*&vP^5beU44X&zn z5~BB6)07KWubN8-5!ZnkNK-!oW(HsY6wrDHLTs^f_sH6>)~xMyA9vxexgg6Nlq$fy zfi&G=A+|`VdaW#X7e4-Yd+|vWeux3U+6+WrA`I7|6s-v%7G8bz+~T8%>%ba#>#Z-I z>-Yb?uJspdVJH_~e)-*}Quu4<%$a{oojrTy2YEgJ4~%qErJQTrH2?qr07*qoM6N<$ Ef@I(alK=n! literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_blue_up.png b/graphics/chroma-marble/32_arrow_blue_up.png new file mode 100644 index 0000000000000000000000000000000000000000..10d2efd69ee4fd4d36a358717d08775208b53bbb GIT binary patch literal 1704 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 BUCaOg literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_green_left.png b/graphics/chroma-marble/32_arrow_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..762411c9f841e5942c4c22f24ae92e599fa8118c GIT binary patch literal 1744 zcmV;>1~2)EP)y{D4^000SZMn-c000000006)M5zt|P00009 za7bBm000DT000DT0nnqeXaE2PMoC0LR9M5sSKE$U#T8w3Ik!H2nRd^`Qfyg)Opn12 zFp=QNNa2MC9wT{X{KlVje^0&uM@b-wFw!V?1c*0~L5^qKGd+Dh-REAFy(>6END1KB zlPVpZZgrnpYp=EUt~vt$hjGW=QH$|n``*^QQ*oKVLpziYvxj%1IvUJQX0OUr-Vm1s z{8{$d-KAX)q?WrVfbv0!e3b8t%K(-_4icH{rYbeHsik--Q2e<-abCP60v7W9?ENDx z^e|At?p)0c4Ve`g%DhDOj|~3be0Zhzf(a1tyV<)(KKy}Fs$c2K2qR=(=2&Gbq-Bbv zNZ_9m_@^Eks_}vd5b!IDSB@;~pc{1i+S8_EJ5p5&X-=SJg1pYLs1_)z65bOJ;U^)y z;(t|ufUhmC9SMj*?&WE}K+%_bT&(>levUSm{@+}+j|<)ae*Js)k^eog`e z?2rA!E8dl1GidfRKQm=rN-y)!DqDzbgdM#DL$kIuPVy5>%8C035(Ra!yT6686E7<@^YAbbbP(kFF-RlUNhSV28fXnoW| zi0~&8AmH}2eVE#G5QM>=@|B?|Wu4VvaIf+}>x=7$vwAkjgM82W*2FfJjjVyN2(ixBkXE9!rIUI?Z#dAx6fo8x zRFr7KLuD&W%PH1o4Q&YgG=}<L2C+0pD8OIv}Tpl+}B} z7bdWQT&x#Zu9j%j4F}AT^1`{v5y}wDdg&ggYCvW(cX8CL2LH~)metY`UVOmn~Ul~PSYv;%!jNbXe~E* zQI4vu+n^Tf2=K+y^SCH4Ft6q=(^&x~#{TnvYn}vdt#t%~QGoWBZCvSH*%u$!55mdG zvf$Ko8G1a<~rvr=SbNSwu7VRE4Mka zI&(q9G&d$2=zP^dqxD@Y=3VRlU+*8BKRqAhD!*B8)<$kgX=4)6v&ihfJY`9FVfJ*( z-*O7@V4|n_sRL#Le7PJTb%YS^Ge5_7Z8e&sCaylZisr@-lW++6+O^jX$m*fj^Y-kf zHEK)AEFkutaSHH)9M!hJ?bKjtd0~#8mEgey*oJ2+aO7->D^Kc#@hHa5*E|1ZGa@4U zyZZ-1iJ@qTy?i4#b+?v&n>w2||5kw3chYiwCspFUGa+s~oC}<=tODPe6z4=;*NDau z{J;CKh5eC6L_}`?`u1U#XM-xN_QaMjt*b2=H6z4+?2?OZIV;W_=(A+yO@~$CKER+{ zJxq@8T*kNnlE2UnIsK_8A|~?2?L)F)5O2qO(RO6KjwdN!V3lFRL^4sOl+l+?8p*;T0@nO`ChLjU-7bJ^hs#8qN#DViomoF3G z{eTq+MBpsZG$*GMOnyIkegfYo^7--SM~@#r9<0QwpR^Mrcce@kDS{wC*YCQ<#e?tM zzPY2GpPpm>$2rW*yr3f)<;a`Adh;mDvcX);`{hn)qU(|D^?C?{(Am(^E!Q{rXm;}W z1nEa9bgEzQp_GW+=-xQefgVIVQ9t-aU__VD>3Gm<^qdO3S4>Z*NIp(bEvuJwEGHsw zzy9_S?bJilFuQ77nf7*DMltQ6G?$|#>f;*8D0#UrCQRh5TW{T!N)EzaxNA0y>1=i6 zI$0w-rgwySxqmtDhD_up5%J}Ks%E#ztor0XGG{6FwmL)rD%&+FPFfx m*Yn@qQBU-f-u>U+Kl>*m4rVy{U7Ys-0000 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_green_right.png b/graphics/chroma-marble/32_arrow_green_right.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd1d767f97404b804f794a544c6c0b78198c867 GIT binary patch literal 1730 zcmV;z20i(SP)y{D4^000SZMn-c0004jh006)M4`6jz00009 za7bBm000DT000DT0nnqeXaE2PI7vi7R9M5smrIWp#}$U3I#tzQU*^JPz~GpGV2ErX zOOcUcd{LyxM#PaU#gefSdy_vB>6>+wb^ZW%FSE(UiWi9$q#)!-Fkm1K!e9){z+Apd zcXgf0;)5oZm6+HVcdvTU{XXZ^d)}%B;H~u5*2C$r<$Ji~&GhCE2Vro1`PTB{YnNVo zuix*>69pI##+w>#T%3)2hcZ0!!8;#Zc;z3jyhooW0wQ4;(2)`)k~SpjnR-v%tB>se z<^BsVoO$6p2N93Qs3En9NF=Xv2^#`wQ`!@Yc;uzGU%K%8>F3}5u0UkKfXrl*2ZW#j zFCI!nHVdm$t9!=z_~`C~yBBx=W%pwTk&KKswFrVW7K^3PhNKBAmRLj?ZWLiguQPfy|4F_$_oumU z4I-7V$R(#|dSoU;QQFiJQedPb3Mr_yCd5E60cMcq2MzI=IBz%Fqw_zXU)=HGj$eOM z5V;rbVU0!ZzaLX1rpQP~D9XL|9%CI7iL~0%#0G0EaVARIo)~T%&NI!i?LXVT`1FTQ z|KA|e&=6CkG$l?P0E&`Jj>V!$2^z3iyzvxLP)WsByOm@TI;Fx>V78fgJ8h5cI=Jin zzSH|28ALKN8f_S*Q72|F0E851QbU_s>Qn>ZjH9v@r7f{oBnjg*W?YTMZ}a5a^Sz^N zbZpn_yUss*`q{4q5s&W-SZj@!`=-3V6oSyE7EKC3E;*$wscc1I3rZ=8DUziOBL+9+ zq}|doo*VD2v-;S+U+g>o+~1!2)qew#Kp>^WFb!!^!&D2`Z<>x^`S7@@Q!f>7BC zV+`JSyz!J$GV5lU^K;C&861wautrTymlJip`5JH7%UB_)Z3 zAQ%jZ#7IY29&V0>6l~5mQ`w51^svTK*n$~1LtzWH^|mqR=MXdbM$h!{$)iTmDV2It zP1>6F>a-r;eQ@`==l=SzBQEn91qEu9U;-fpVv5~l1Pxt2gcK-DL7Q6I)H3U4yA)m0 zrLKTlYpj`=)+I+Ekg6oc8_c@-ky$dw4;(n~+x*jfzbk!-MrFhZgQ2t~ZECwfvSyNu zZECx?e&7d#Vb;yE(ynyIb;flb^7u)p)se6g(3^_?!qcmJUJQ|d^5@~O? z?PLe-`I2G6n*r8mJ0;#wfESNHZX0camjVnK4`f!j!2}C0!688#k8FU z1Fg0U9{l>{g zM55J}M8c@)d@<{0DWt%QC#DJ1+IS5&aIge&O*C8#(!1Halvnw}xv6s}|Fhz+01O#2 zm8KY^0Ys=w)j9q_EPLbWNsl(QIOA|QG$~EfkeY9>XN# zg9aLH$R$UjurgYqS!$@S*6NqN)WiC6Ugit0{^r#aebd+XdH-7-$;_@#cm3FA_G~#@ zQq%=jEgF=fEs#|qTn}1bt;MXFPug+2a3-8N@hIkc;M&U5RuP?-qjvX z+!bTY!prZzeEi#(>ybV1#%FIlv;MF3tNt^8rDuB!FTVZa6A}K>b?EPhwjVzA{rsN) Y8;9dlrSGA9tN;K207*qoM6N<$f-F8nF8}}l literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_green_up.png b/graphics/chroma-marble/32_arrow_green_up.png new file mode 100644 index 0000000000000000000000000000000000000000..ca75d4985903c6debafae414c83eb05e20e208ce GIT binary patch literal 1722 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 XKy_v~F-R4P00000NkvXXu0mjfLB;`q literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_red_right.png b/graphics/chroma-marble/32_arrow_red_right.png new file mode 100644 index 0000000000000000000000000000000000000000..2b33987564f43b2906fc64304545be37b74cbace GIT binary patch literal 1700 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 N22WQ%mvv4FO#o@6c%=XU literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_arrow_shadow_left.png b/graphics/chroma-marble/32_arrow_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..25e26f2caa0d42ef267b00fd392f141e5c3393a5 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDxXl-IA}tfQQ9WWx;}H$}*~d{)g{y6i`f=bmM04majciPDh8%2=%rSshE^ADfW`` zf#b@`TyOLiG~Q*=`>?9vENjxiG^UjgavEa_HZ_P^L>-X&6McYt4Od08J*!t^Jk!#H zjSku~xtp0A-8Lz(K8SWGbOr{-2Mi2M4;X$(ckKlV zvL$)DyD zHuzlnc|ztB+YDzX24fGN2e-2vgBY(W>|`kQ&~)JaB>F*e5vxX92JxHuMYp=H1xLVcoUyG{^3~jg2hQCpRnbOr{-2Mi2M4;X$(ckKlV zvL$)DyDo5-7-$2f~aO7H`S`3hwfBaSVw# zeDs1PUxNXU%S8sEfPiAbX+rPnwRyY*1)aohPxes0`0#(v!@bk4&GcHoaP5|(b%*c! zSigNH^>udffwr)M*AKbgSM4|yZtJ5M!XNx&b$EEk)z#WduB_Hva&5KdlPlfYPp)-q zPr1^qIptcnX2GkQTz9IrHM!JoYzhJ5l-g}gB|z*}yXjEv!*vx0DS7*?k+0u z)sZ!%Hh?kmz2<_~wypEZLM$F^_+NL=WA*{*ck=O{ge%@v3mJU}`hvmJ)z4*}Q$iB} D>~4T9 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_blue_down.png b/graphics/chroma-marble/32_bomb_blue_down.png new file mode 100644 index 0000000000000000000000000000000000000000..7442a995b54db98cacd15a62088d126d34594921 GIT binary patch literal 2251 zcmV;+2sHPJP)y{D4^000SZMn-c000F=N004jhRyI3@00009 za7bBm000DT000DT0nnqeXaE2RK}keGR9M4Zm)mM2*A<4peX6dmR!bV&69#f17j{Cx zCibNvgb+wB`~Z0pgWtnX&pt~ZdEfjl1jqmXqy#r!Rw|#zn2-6IAp}Q^5MzEYM$p%h~eeu zpa1$_;?qylAK!b={ac8HwH+x1LXe~+P$~cdArdhPyw{|Z&!vnAkq`nPA!R~{h?J2S zB_SwM62z#E_fyK?`rcF5uUM_h5A?U+w(9Jx;n}lOPEKYx=f{9xOu~CH1{WxmSsRm3 zDj`G~fgS)r2!ap<&WVw&z&VLh31cF|FtFcWaC!M77Z<6}P1D5Z&pngLHS_r?LI@x) zZY_APMy7(41X4z%3@8-QAv|=+JtG)}9y{(+f(4aS@3S5v43bM6}KT4?(RzC5SzTZG8L08#>DJW@uq_LQYX>%(~f5=upsilb!3m<5Fp zpj3V@Yon)WuDH1PlGW-rG|dj@9I`0D`^0KBqpl;vV2=t1am;`aiK1{AO8TsGA8FL7?5ZEK`4nW^`JmoHDoPDmq&bY!G;7}FmR z;-Ngi$To~j!?8nhMj(X9{rwe}m;YtG{xjRH<^KK#Ya8TjW++R^WFpvXD(>$c)^j4#^CW0xGY*8l_BdTx1MwNWAMO!{~;knLI^kqvaTIUiIK73#fuqzze5O* z5FBfs13$FhAz&_tIO--ppUb6`M~H##cEf6Q#d`f$cDq0b@xiF9g%A=|CD2-OeOAdmcJ>tM9Hf+J+suBq^R#W`%P(j2{Vg#@V$`Fps$;zm?dP1vT7&l* z5TgbHF%H!ACD+&AvfF)3Q79%8i7|q*G$S#PRmIq^9BbKikyo!ySS}rX-w~r?7>bd# zJZ>`Caut0)VHnI&h~5kK`<9D~@7Qbt+wHsKMwBgG2$)Q!6vYf#6o%Gug5B;fSeuEx=^s)`s_GnBRoMp) zH>*l9pKHoea(#WqYNcq~9*{?d*#iy+rbky~)JURjcU)Y&;N~Xb-1`7H7qK=AeKOIM zq@32wjQLAIUUT}9OiSa{bGlenP<|h-4lrWuYpk%*y z3`31<+bo=>Ni#i zzXK%BDPj~jw`aM$V7+#1w|{sf;-U~^?bXQs;Jhk3VHRNyV2r@INY_PT%n#n*JGw5i z-Fmt%@cs7+?{_HW#)&wv+ud_}yP@y@M&GBSh=q7?R_`;p7-1OlkZO#{n^C@b_-Kg7 z3^*5YE@5pp5^EEemlNu`Cxl_#?*rSdV;J6|>wb?hg0nNt*_lSEytcLJky94MVICll zWX5DXpSliIHEzW(&d~SI1#Bg?|sVa$5hoM#wV=n2T zyUMb9*bSuwts^l;%2H4iU<||<(K=zR$NNCrdL|RW&CP_mP7Fg!+ivMP0sM;jTyl0M znaw0pCi>owgG|KQz}=l4w_}M?lB$}aXEO+)MarJZ#G$nwYn7-f$<0ke*R@z1m`)AO zRg~p~SFZx^zPsS|cERoKGpxNCfo31+dxy0ir3__hXqtdhlDj*Y&j*BL_5E^3i3`0lL zY$=KfFvVKUeqW=trm9Zpx&p2JZB_kZApk!47#0NS>uuGcu{Fs7oa z&Y8{50mpPYnNFvtVYh2-+txHq4M1J5Y1^9f^QRbNsOuW%TB_=tqR6#>`t-MpFTVK4 Z;(t9I@9Jo$bx8mK002ovPDHLkV1f#1A`Ack literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_blue_left.png b/graphics/chroma-marble/32_bomb_blue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..87c3df0cd2a357b36c2d10f4b45d691d7ca1c887 GIT binary patch literal 2328 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_blue_right.png b/graphics/chroma-marble/32_bomb_blue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2bf94f3d6b6399da9293cf329f6734fa1c050c GIT binary patch literal 2319 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 Z{{_{sb literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_green_down.png b/graphics/chroma-marble/32_bomb_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..9d7f12c74384514ccddf53491c7d7a2a03c0a597 GIT binary patch literal 2322 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_green_left.png b/graphics/chroma-marble/32_bomb_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc9654ebf4dd2c3f671a99a9e9a499bb91a6949 GIT binary patch literal 2376 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_green_up.png b/graphics/chroma-marble/32_bomb_green_up.png new file mode 100644 index 0000000000000000000000000000000000000000..cd53edd16047923c4a3d242e35a7f7b171fbf3cd GIT binary patch literal 2356 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 KMNUMnLSTYuW;h%G literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_red_left.png b/graphics/chroma-marble/32_bomb_red_left.png new file mode 100644 index 0000000000000000000000000000000000000000..47f2a01b8c8d0f067398afebff1e6ed52a404c4f GIT binary patch literal 2325 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_red_up.png b/graphics/chroma-marble/32_bomb_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..0575d378c829cae685c7ab702acdf85bf2be97d4 GIT binary patch literal 2293 zcmVy{D4^000SZMn-c000BS%00961a>v~v00009 za7bBm000DT000DT0nnqeXaE2RYe_^wR9M4Rm&=bNH4?^u4%_+c>PK}~Pt)wosF_6q z4dMbL5C?=-TtJ8e5=eXJALO$C!?K5c32C*`id}(VM$HU0^~#6S_8#o28S-R1opyW? zUwjd%0OFTlUTvMba^zugE7R-236OnqCi;-(*#NpHyh$BuTWfFu^vYT;Of~k@ILKT3Z)c;fC>R=8e-oQ zHXEV{%dX>zbMxoJaAkJRVM0L1NFO6%7$5}VFaV&HA`Sy;no!mf`X0aCVn6?!x@qv% z^5^q&{_y?xhzMc~Mg&m`DN9faReW9Y^a=RHa(W=+G%=_&ubcaLeeBXk{cnht=JwfOCp zFbqWR8P;o_K7Y=391+{LNL8WAGKC@p;xwhS>N=#ZQ+hdvdGv_p=7u1`E+3}7#~8ya z7Z=FoB|k3~C~J|bI(T+kt?*r!fQE437S17VxlFDW0Z7QbCv+Wzz_eTv`W|AW{OT); zqM++K#_Ta~3<4ZC4cF)A{O!&ig7>)FTc-6Izu6=@6$R0Irp<=nJ=U1C&NwEaX&NLi z5&}|Hpmh=*=dka+M{{#S97p=?7Tx#BU_dEFp*2_YIpv)@{B(Sb-|Yyy9mJT<0-|#% zq}F1zX6GD+q99}=_Lrd)#7K0GIF7^+D8BfDQfqcyM;HdQ_js*QF%m?GN^x9O+?&t& z?)sX`AAiJzkj|Z^MC|N|s%X3@5pgxQ^87?4cLeJBt?zw-|D%}rwdZijLX?L9gK zBm|;TNC;T1xjZ=`TwL(|$;p9q`$wt@ojpB2K4x)pg5Vr6M&fQq9LE&5uETFOgswvw zL-WNKl*Z6+Hn?d*#h4`4dyI3~al}j$S}BUzjKzG;-*0a4!;sF<8Y#IkudayOZ9<<7&>>*5C(6FZ4g)GitO&2p=Tui${CBZ96fSb1 zQ%ZqS)MZIq6o@SfbX})36iIRS9zp+N#0=vb()a3{{HI_o)^X1ya|PAAXor&pBKODerS= zRE($?nXFA-QR)yz4b0k>J7;J7JzeI5+jAyTx4DN;rjYOz?iwXF^>TyB9{ry6`Qjjw z*7CDAMq;Eb3QmrWSYBTvMM20J03;z&xf_xP53t9_1f_5>;sL$CI5#W2gibq$}~o&bk3dmx%pM5XX~ z-5Zmt;5fc81~AifP{=4k6hTC&tBTmR>=p}*)~O@1ZHp>P;s+mKv`&}5EUy{CUIC+0 z2oN&Ts8mYR5HQnpsEp!$O35tGN(5~!P1Eq~@{*>mQ?a9IF!%3c&(8^f>$=n-?PKdb zQzldp!RE{W2w4eZZffPF3HVh0Q&=|vcQBY`2DZ&r}wbq1;a63&*G17U@$~j7{ zskO!cOXsj6v|7`M5WMH??p?0{{_^$L?`-=1_W%ySd$zgsE{B2J?H1=8jkTOs6{l6j z{#X9As&L-3-0fKAM)fw27fpk;mgRcQE(A`iiYB*!cTZ3M{l{;<`Ro4yZzgropzyzi P00000NkvXXu0mjfuS!Cb literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_shadow_down.png b/graphics/chroma-marble/32_bomb_shadow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9e03067d1965ae173a6b1b589f9e25ee723f1c GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDW^X4>2u)re{D9Dlr!i*OdZ^{4)dU(1x zhD02GdwnA(g8_$2p!Vw7C)9rDi#oRWEYRHdAv?Z0t#n?d#rEfwDd{^hTEym+GXZrW gfp~^%$6vm(*)LM@=%#tiLo1M!r>mdKI;Vst0Q{joy#N3J literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_shadow_left.png b/graphics/chroma-marble/32_bomb_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee628a22f8759af67cb833e72d4c2c3957ba16f GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDI{r~^~ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_shadow_right.png b/graphics/chroma-marble/32_bomb_shadow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..7791182eafe264477258b82ebcfd8e5fc8df9a8f GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDG gKs>{><1b&?>=&tcbkn@%p%qBV)78&qol`;+0ICc=5C8xG literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_bomb_shadow_up.png b/graphics/chroma-marble/32_bomb_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..959bdd998aa10e43feb7cffac538b4f64704c32e GIT binary patch literal 210 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 b9nb#@Zga*|SmI!X00000NkvXXu0mjfIMLpU literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_circle_double.png b/graphics/chroma-marble/32_circle_double.png new file mode 100644 index 0000000000000000000000000000000000000000..2f328a2478207caa7b34886448c403595ec3cc34 GIT binary patch literal 2431 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 U^6TMhpobVdUHx3vIVCg!0Fe59-2eap literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_circle_shadow.png b/graphics/chroma-marble/32_circle_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..39c2886204fc04eea233461cc58b8e1d16367e66 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDDT%uZE1IE!za zWsy&ckhA(Eo8nJ-#5YH z|9iFwZ$JL9zGU9dA3;K9#sPVMWHt2fi!2w#6JxSd?TEY&_?m)x7m0yEblp U^6TMhpobVdUHx3vIVCg!01o_pSO5S3 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_door.png b/graphics/chroma-marble/32_door.png new file mode 100644 index 0000000000000000000000000000000000000000..0724c5a653663372660dc1b35328f2ffe1811f7b GIT binary patch literal 1955 zcmV;U2VD4xP)y{D4^000SZMn-c0006)M00F=N0s0jK00009 za7bBm000DT000DT0nnqeXaE2Q8A(JzR9M56m)TB~OB99sF}U@@D-zQ;CWZ^6fMUSN zBqBl-Wl$7FK|}^oQBe^A2L=alLUCdSrNyzt0VReTAA={*WS{-*wmN;`3HR^c58k?U%f|KV*X_!?==Y4rj~_>_jM352$UDAcba!`0?wRAc zv$Hd@@2@opoE^{w33u+?S-N@irszw#eEG86xN$=U1_tc8x3^cWUcD;Uu3eL%p&`-r zcGZn+9q$=@cj3YXId$rkUHkg_Z2rN62XgP;J?Zc77d^-B`M#y4W$DC;6A1y(u$T=w zsHdk#u3Wid8?X`Ybd3xS4$8xa59QILM*>*ZT)K40uB>ZqZMDPO+S=?L``x~M+tyD` zP8x7P@Sgd~%1S9NE)E8uhK;bay}jKwQgm|s_;G1!YLfHk&&%1fXKmxIt}eSja^#5Y z*|SFu95^6{4jq!cd-uw|efy-Us!HnX>+KuZ<3K>b0!DDo#fuk3Etk!kH_MteYk~p% z!vr62xPJVzyu2KAvUTfLDJv_J+}vEr&(F6*i;9Z)@VAkgnrfQ@1nW+oJZbykn$xFG ziyF%K2{?deWo0pf0kzCr0Dv=R&dA}zhdJ=OS|3uRuBN8Osim%>qQWTvrw6#*yLbOK zm~UukaB88`y`1X8u8ec%&V_W}?~RR(a`50mDJdzDwQJYPx^?TqF2K)#fL_oYJ$f|s z{{4G-_wJocOiaj=Cr|!&3=a>>)2C16`Sa%z3WbF4=jP^QYHG^dr~8IDyt=wt3JVKm z)v8sJl#~>90ipl|l=-VDO=B20u2```5)%`H0pgNyLD>idKiAdOIX1%*HY9BRYxuDA117K<>z#8lK0YqH zcI}ev>}<#3zX8Anga&aB07Qr1p_RkAqT;_9V`F0m0_%B3(3zQ;@c|%0tS4S^1pw4f z4&*Sv`@aPM3k-m0Cbck)2VnW~}|(*uH(ctY5!AoCjb4 z%ZUP#2ML0>20cQIXDL>aUIEFKwTLlRFVK&1h|mM5t*teor=_KZ0ZBrk!{NzD65t533<$T9x9Kto41)upmfW^f{1K=58 zEsSy))sZ3>4FDIA4N1p(9~L1>rD{?AbRlWeq5!L~Hr56B8yAplNV#M^vL$OVhH6Qr zOi4*G7eIHk2un*#O_&Bi)2?X%7kB_f0TFmlleM&L zj0QLyt-!|JyLZhfrJp9n8dJiZhQx{y0BAz+4+Ai&2M4v^zI`)mIRMM?H@*iLSHjS< zgyqog0r;v&E`VVG_>LF`XyXik`aFmz@Jn-Zvo)1Um5a8NgWtS)W5d(W91REaL_lm3 z@&EvYuGIgQTS#QEO%G|s2nM_cpawA7nwbbW1j~I_M6%%?AbuV&XapC;<_rLE#kJaP zIWz%FoR^%O9PWw{A%~I$VS$cVDRNltHGudSL<3iV01OZd3kwl9_+sR%qSpW-)cvi( z^8W%?Q;aMM$OGDhMxuantgW*FKnHB>bAbnf7|h?4hQIUJ@~&pYNBUKgmIZkXgo#{~m4zto)c z^z?8`hDgYU_=boe5qWDtOs`0@Lf^o%Pc+;kGA}OZ_WdQ9mBdD?PyJWdIvB>y46>t@ zWB#S885>Y;LT8QlMe*kGnNXBBcE_46@002ovPDHLkV1jdLiFg12 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_door_shadow.png b/graphics/chroma-marble/32_door_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7aedbbbd6ee80ed9b05abf796d6efec38838e2 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDkh>%4SW;d*1|==1*98}20^uKXhjQtavK=d#Wzp$Py`i&s_v literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_dots.png b/graphics/chroma-marble/32_dots.png new file mode 100644 index 0000000000000000000000000000000000000000..b07974eb25492a4c7277f617bdbc2bb330b25609 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDd22NS`Yd*8-{+l7+{#@R6>VLR+%K!PnufEp= zty`|K_lt2%+=S3SDZUr~%kR$qcRyy%@BNx5Kh}3`FEj*7=H&G2+`B6L`~R6WTmEOy zKJ?$+>h-^JvoM`y)9czQr!HJH)o|PS%YS|TRnJ=e@A?Gc%Dn6qN?!VZ6DCM!X}`)_ z6_c|mdKI;Vst0IMI1`v3p{ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_dots_double.png b/graphics/chroma-marble/32_dots_double.png new file mode 100644 index 0000000000000000000000000000000000000000..8e200a33304a206f90299a6c3e9e785bbd4a57bc GIT binary patch literal 673 zcmV;S0$%-zP)y{D4^000SZMn-c000BS%00BS%g1(X@00009 za7bBm000DT000DT0nnqeXaE2L7fD1xR9M4fU?2fJTUBgxb#9go1DOD?{?FSgMW3%N zEfBxHh}WPmgN)p93`m6+Hj6t@8iX z1=;`Sl=?lNlr4J`?~3_f8Ev~C*>XzsGhAMfRs3X4(f=R2 zYyRI{ocq5i$?<=hpK&o*Zh4XH#d(?kK5wu34^ne?S^och{qg@3Jq`b5`J2ju)LdOe zp8iBPh<=8R?UBX1dSd^dnU(f`ZBzLFNN3&uuBOUh0}l2k%5Lk7{&#Ch?*BW>^1wb^ zS`+-=%|!WMgq;r9fGzFOWa;;Z>Svf&87f*CWBWYa&*Z{m)N=Np;vXsy@BXu!7YU(En1lnlZ*yziVoec@dM2AH78wt#H?#O3og(UW2dtV)W9+00000NkvXX Hu0mjf^5sSc literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_dots_double_shadow.png b/graphics/chroma-marble/32_dots_double_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..44f8741cff911984af9e119c09ebdd1f69b36e8d GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDESr`noWMX^lx?CYEvvW{gSI8fJ}Mfxh-0&8m}_yiJ_HOnj0MF~95A z!F6uo3d~cJk1MeseiL%Z{sW)H2Mvi2E*2V_6k~M`u)YvH^5e^8n~4vv`uFFw`Tsv) zop4}rLV(I4#`A59-!@+Sb|9lVVT-N7Ejfu?{+?~@Zh6%V3?j*C54Vb4-VJmXgQu&X J%Q~loCIC9^UQGZ1 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_dots_shadow.png b/graphics/chroma-marble/32_dots_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..576ffa243c9459a12212c468df9969f68c470383 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDy{D4^000SZMn-c000F=N00BS%oDPQk00009 za7bBm000DT000DT0nnqeXaE2LG)Y83R9M4fV1R-rYl~z5?5q2q>}_+2j{cou)9fz)&*76K@mlZ^Q*-`aB$WHTCXlN)iz2zD1EXzA|aAM+r zD;>EQ1}uQq@(j0^=Dul4a{TXLtR_Nt`AgF>1@A4-|DWb-{0W<8TFWz>pOt0$WKGfk z7#H1(10m0Fa%Ni8i}fY{W8L*O41_$x!HEe`&)1dwPxUq4Fc9(#dwLQ~AFeF?pBrR; zaUkRwwzOvoURjX!zbw-F(?H0B!I3FRZzkk;fKsZ+K*%#}Y>hZ{YDVh+qA;tNfskid zTpb*Fb8+tfo=mq}tFRQ6w3cURXlP(s-x7Y~=#=FDRWWvP^p*#MIb{K{Hx}po@5yqz zjm?#`mS+G70$q6At==eX%TUT%(%s%AP6@(j0@tW3%w3cVMy(~ZG&8D*d z?qq~DfsSX16;bbG}Ezj_9MSdKp4;N^w0jw+-nCL3Me}4lDFm>LZ kUlH)%TvHmOx}=pn09I{(3h~m;_W%F@07*qoM6N<$f>=LB&Hw-a literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_dots_x_shadow.png b/graphics/chroma-marble/32_dots_x_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..5b11f6b04a230f7645fefb73029dd6e2a7ad0cc1 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyD{l_f3=Ca@)U-vh7%`cKi66NX0NT}wkif~1LoH6 zUQbmINcEN%w{d^HIp?L%UEVpWQdZ67jPu#sH(S=4gmjuW_XvGwec``gc7Xih^&CpJ zU0+j|tbhDpwbOr{-2Mi2M4;X$(ckKlV zvL$)DyDgQtsQ zNW|gfgawQhJC-_qxY(6+nSC|a;ym4xox6;iOZ2Ks`3AS=^1hPt2%0SZ+vs% zw(rw?yPUN@{-?TM{lDIN)xj^zbEp1~U#I`KKELwc?BdOr`DN!#k>I?VT&-?4?cv2$hiM~n=j?d z&YdH~Tq5bmJTF&Ita9^4m1n2Vy^7xd?aIIS5YZp^&$|5Fwrx>Fj0Q9FML7;$-c-Kw zi+$Y%mv)|=@E}iOws=lma;^7~|K_t#{o8*p;@kg+s}A{>Pk$O;vtw1l;mfA3(s8*O zdw-M#-&7Bn)AXn~Z|47cap9%X4)Vt*B^g>}6cjYL)H^dX2hZ4Bma?Mx+QN+RyXH3= z)BfMS9P>|q1;-D2`Htw|IscdclKB69V@P%KI?ZB_Xh$2N6}_ElD{r}l`(3!{aPrDI z2fI^2(Q2ncd=G_)YaBBOIgnv#5XILsjd}4?Y)t1>G7JnSuGOs5jbm;DCI|*kS3j3^ HP6bOr{-2Mi2M4;X$(ckKlV zvL$)DyDBQuy|7jP_WI@#W5t} zaB{)|-UQa9I0dohq_`ClXBm{QDAg)#V@j%)xxux{jb|16x|u@VM;mX5oK?zJFk?%~ z)i7)8Qe17=`YP3+*+}B#h8sNHjcZsIvE4l=BJHq}U4zfbYw?6nE+#sgE@oI7MDg`Z kV_y9902Ze5b{PhSf=^C?HaGsv2D*sB)78&qol`;+0H#+~s{jB1 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_map_bottom_left.png b/graphics/chroma-marble/32_map_bottom_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1eea29d2a8753fb1f68212d1104ec27985ddf6b1 GIT binary patch literal 2270 zcmV<42qE{0P)y{D4^000SZMn-c000Dpi00F=NsMQqP00009 za7bBm000DT000DT0nnqeXaE2RR7pfZR9M5ES7~rl*A;dH$XQOcm37CYE7{A7u1k#iVC8mmT$sS^Y@xuw2nAj|)PKfPb7GoyiN1JKu zH`CJP4}VOijLl4c(BVh_+%W z>gtZSJRbIFdHDe8J*w*5DnG?Mt*tkiq&MB}{+Dew)}Yr5MO}g*41~jsK3H@IzpTq8 z?5wF_bof&DyzBK!ue)5VuC!Dr>VXA*2h$NsT7-EnUVvH0VJez$ce(yb^QY74!)Iag z&oFlc=6=oLn0~|UF2-%#beqTZ`WCL2N?j*YlRLkJsmVR`emE3j0Q(K;90&xY4}HFy z0KR}SnT8hM6NJ{6tE=U#(AyW$pOj53||q z_qW_)newQZ|!os<%M)$73l*($N`Xjz9?DXfGAFV8VXIqT$5+h=}AQQByN4< zF}?m<+SKLuj~qv^LPvoc{sHq}%?1J`6FCK8LSexA*Jr#>ZN8n?`!W8WTYi8=S+RMMR*_8fp_y)dr zh4zDO54Jg-f8K(5SZE6KEKLB21s?;z%KsyZ!C{F&@5Wx-h`aFB>gqZBWxrq9X16Q1 z&TogiDR4970s=sJ;7OGQi2gp@==e}PF2gl4qFJW#(QsJa>-V>k&i-I3NDimiQ)tzypi-^fy>ajw%hBK4+ev?`+LBG-T4@xAS7ySR9QgrfR8Xj_=45S zo?o$o{Q~lw*-UbgbUqFQb`h;$a<c_#;E&4^iLZ-uI=xadImT*gUSC7i6e-%7_b&w@ z>H^Hn=U*BmyFREAm!hv0FX^@1|b1R zB!+S84IF^W)h^m>*%BJZVna$*)n*PLkr*K>G8I^>-@lKQmS#FK)C1^rO<9xaM|m3O zU5J2F5Nv$^KmhxVS!d9cj!?$8a=^s^W%~r>;{0?92%ZS z8P5kX=&DfaT@ZlJw>L#D2nG+ZQ0OpABt{tlN~g~=Q9Q_Wx`r9raPCDUmKO-O& z6>9+?okVmOqcyuqJp{E|?|Z$}+)SvYc{Yd_0PtauOlvf*{z{{HK-OyOxo9-Ca!E;Y z1ky&E?Dp-Am6c5sI^DzFWn~S$m_JuuzUi+0fxt2pmz|qncB=oVaO0~ChDMc9ivtjZ zE&)NsG@80QYRMM*!5vDg)w(zUGO5w{BnJS~cY!etG)|??yhL%3OrC~}Tt-mNL?R~? z1SDjXKanf`axxzOHwxO{5rFiroJR1$B?=1JjmHg!Z&iBEAB2T@Ad|VkoX*#H5CwxD zZFV}_6sL2CB8t7&1fi3e&CLoJqf}O|=g)UMo_|s~$4#f6Lf&7G)Jr|XI<=ojmzEAK z$^rslu{3i4$>f&+keySE-0oen+x_O8mJB`?C@aQGN)~h>npGLS!E7Fw*8;=@$R&u3 zh#&QOJKJ)Za3AW_AOmY;WJ}rWeS2phuzwk)auh5^eZQJ~TFz%OGF-v?39v+_ceG=d zoGJrAI}FbK))RaIN&m=MWlHWSYGLm?CBe~1^Ws+PIe4ZQ!z4{kTY#}e<;)^#p5SYXwFEK?b7M-DM8pX<@0r7eh4yLASd|~tyu@PXK#Bv z1HHHz7$FVMBeX{S#D#Raf3_!dxw2(Qx6>BOCgyN#M}c{t3Bm^qHGu*X^jrh$yvSWb zEGQJxMQNqt!_asz>Xa!HQnxgpkb6-2S+KZx8US+tA)8FA%P6leUoL(}?zzVuB|+yk sXDu)IBY5t;x7L+Y62v74*HaJw9}60*GBg13O8@`>07*qoM6N<$g8Lyh^#A|> literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_map_bottom_right.png b/graphics/chroma-marble/32_map_bottom_right.png new file mode 100644 index 0000000000000000000000000000000000000000..32ccc370bdcc4aeab22c6a89ec1bb2354332a159 GIT binary patch literal 2263 zcmV;|2q^c7P)y{D4^000SZMn-c000F=N00F=Nr;Q%B00009 za7bBm000DT000DT0nnqeXaE2RO-V#SR9M5ES6y%u*A;d+&AIW6K&!yAs<5Y^Bt*>8@3_~ttGHgr~*$DQYjK|rj zWOCj;m$F$#-|ASjX#6FswW{n8&GA~TY3*sNReIO&@7?5dvZW>ySJusOTwg54=!Iq9;mY}Z z-1bF_7=3)9d;Sm%N^kpoY_U$qmFSKc*fuH`zvr7Kb_`Dlc`nJ%Vh45smYz6!qns*dOjMBGJyS(bPhx!(w{=1 zDFB~9nM^~A?{Qq)CYMXjdA;(7(dg~x>*}u4{K-UO;212mwx*^B=Ir@dRaFOG_`_T- z_x;UIXM4Ndu2b~@uG8ncw%THmpMw0{Xq1}_234ACYE+OofYcKXPXVBl;e#_wcs7+% zo~f->XbdnixoST1(z|x}{qkHou!{6Yjw=F?L!ks&;D8_$jzyz+m@9uVo6RG-^Emb0 z$4#bhXj6AMJk*b1g^mI@d=2y8%ta!VW5q1`*Kj)h6JtUg33@i#6)?iLyNaaDeC83pQI}h1smEvs#t)b#+QJPQJuoxRH4H zVf6)Y%hpw9^R4Hw-W>`Rws<^jtJ|G8mrN#x;A6x>f%YM5ZY?$#uK(KURC;5vyLjIX z+K+5oveoPT`$o*eLIupTECHY__y7PJzC{!xhb02N3wv=Q)rD`kTr>8|;jq%~b}Q58 zx4_*LxFWfL01yxSQp*BF{}G(1|5Pd^!!(IHqD;Sgy^8Dof{m6n{6EQ$RNU8O_mIV|KcnKqfFWc?x zrAHoNzk<9_S4VP{bUuhgc2HWuyO4_|D}04{XyJ8 zK7XM-&>2CEI7ef|)m187^erMQ32sdr42?4Y5dE&V*;D}F1Z9K6p`IWoia%(rs|z+m z-t>4nw|Tv6jn%5UAm?^lSHc=Cct$$1pBN1LX#TZ8;C>R-8j;9;T3fB{r??Vl3qm@@ zGnxhZ<8kFhn@t7q*GS|(oT5T|nMC{!H>?(fUM?0p=AH0wJbsc{EUVQ0O-<+TZ)!TC z0*FRGlzqOpS#f+w3I^Y2I^E(a0Bf~01X29w@#^Z`Drd)H3e2cz?${2~-J~(h-9_1g zs>TH2Fmt=xna{WLQCdqR2AS2mP6Z%}W9J0n;0TQYQuca(qX9T3g+hC#08q2APO|`l zL&!Oum0CPZx&Wt_5!Fls*0vXE1QT}Z^$n8IxUAV~&HaehQmIdv&9+_zkWP;%K3|7Y z1kg7LARa$1g~NNN01&CboHLk=c)Lxr01?q3GDIaSQB;eG>ceSQHhUQscup>UXi#xF zH_iD~GuCE`e$Yjpn6vZnn zo4v%yw?^Y*W5ti2P#lg8a{~Zv@?_eT7RzUk>h+Vg85zkkPeo2^AQnVyvO`o>YSdAUl($>c}#1E5+!Is9!}s)b%~ zhhn$CJU@WJl41nYcgsA#l*Z_KU!^!WpH3@7>GX93oK;&E}`RDMtR$dk0}D4^Th&7TPfy|C#4EpoS|T9R>CLHt~N8 zYCiQ0PlIA5a6}-m^J|_z!0h(6LQTz@d~I!W9zlrv+PuNAHa_?Yv0x3S8~)SNDaRb=9e2_Cqo1t=3B*B~+?ez+?bRD*DDB+^fP1G0vi zRT(6-eIMA7;OJ4>59R8cM$FD z_xQ6x!0T3b{tiYQK$Pp3JlRKH4F$$wbgpX;ZR*dSx_qPLD%DXlZp>R z^kck5WkQbYx~GtPKw7M#f*%Kf;y>h-_?MaluTzUvD*gu^NRV*T=1T=X?!gBGjpgM& lbzEL9EI>F;rz`$F{~tWntBj(z=12el002ovPDHLkV1gTaKZyVU literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_map_shadow.png b/graphics/chroma-marble/32_map_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff01e685b1394b6a533e85bf4f8ed06cf473460 GIT binary patch literal 688 zcmV;h0#E&kP)y{D4^000SZMn-c00096100IC2f7xji00009 za7bBm000DT000DT0nnqeXaE2LCP_p=R9M5sR}D|XFc94Yi3%tfKQasoi69U@#f1;S z{r`Vu8())`+IC$Rw8;yhyVt$lU9Z0d;?=+v`-A)0#z>Bu9T0rNku<0LgYZFj5i(PyUq4zEr;j2waq-?t2Oei^* zuvrM)!)^nQ=zOODSM^%Lrk`Ushuz-7&lNB%Qb@F&!~CES@B)`Wgp5y2rBsYNdX^!K zx_~QqF1Hl3fEBr|i;BlCZDSiAEfsGDm@2H|I|c9;#FX`Y%>x(Oj!^sxz=iA=zleaU z7Q+Yd>xN2b6Ofw&@-TTd2OaD)2~;ICCn+r9)75 z1PK`6=#=A$7TM5o%#bbHC-noie!^P-ClL$SQ$xZ?J^P6u0X%FinQsUS2~bVtjFNCd z;)Y1P*uYOLy+m5166)=@t1Z|0E60{Tl-jgJ WzVt literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_map_top_left.png b/graphics/chroma-marble/32_map_top_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5848cf457b7c6521c4940c2a447a8ba4b58e47 GIT binary patch literal 2281 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 D=^tqw literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_map_top_right.png b/graphics/chroma-marble/32_map_top_right.png new file mode 100644 index 0000000000000000000000000000000000000000..00c12d8b6a976ae5f6f11305a5d742053028ece6 GIT binary patch literal 2269 zcmV<32qO21P)y{D4^000SZMn-c000BS%00F=NxjhPR00009 za7bBm000DT000DT0nnqeXaE2RQ%OWYR9M5ES8Y&K=M|=%w$o`QlbEpVE|-P7eC!98 z-M#y9_mkbdk%1<(HAWI`6;l&6+=NV{wsC@nbc@uO*3@W3u2jWfzz8X^1tO>fC-q00 zY0I5y?Z+SgV5SZ@(;s&H(LZmWbGZv!zNEP`XZF4CecyYZ_nhZE=WJdct`S+b^vC1k z7qNJ}Ukr!))`mjo{gTwH-`~$@og{Tw^0FTvO{JzUC6nx8BEg2Lt5;^a6{=2U&IX&4=Ssx)w% zve9PKf9r9-)I8nO*y;RHyVv^`D=b{sS5Q!^aNIh@X4|;PIPNL^8P9K3Jf1_n4#ytG zarI(ehbW4DkqDy~=6!)n5cY{xRR}@G8Z!yt2;({Qw->}&>sW#iws@3`} z)oiZQt+=?cX?D$dB@pPG2S6vo2N$_;D3Q>fEh*7x3@|E%>VED`rLHiK=b*aM8hAw! z#dl@_sD6KpJaAf)rrr;SC&BK?E9vy)ge*_u)c2m`xX)=*M<6iV53*v7hA{jc?!TQ0 z2J>Zk#F9#l{xg{z`Kv5nncy(7hjHpdQ+E4y&1$WmF`H{|IvhXLB9Y#EJiqN0?U$tP$15va|KxD& z*5IKj%mY9=rf0z^09cDuTP=&*s;U$MeFS@D`LalEcRF8Nv_B9~HJ7VJTR2}?xnCjT znoRO+8j=ot*T@2}zh}6*x_>Z{P!Spx;-u2}gGfX@9tbqknvUg8ZnF#vZC5YyrI zPh+tQswADA0K*$-9XxO|66w3+^Bqw`p)+bAaJ+do3%bC8Bl9Gr)Oy~?0^-A2Nn(2( z4)$_+IeV$BjJ*ikVYicAr!}X7!Gq_*VTMpKu$@^fPw2mX|8YIt%FACFr*)ywsTq&w zO;%jIneqH{%x>SI?+=H2{x=HTVl| zM)y)^$Vd+;JnK2G23b%5m;MK_XLNc=I>R77zo$LrOM4 zDa>q6)+_=*^1HpXR0jY}&~{Z+=qJd?@>iPdc3&fGpWEI3Mr9@2%=3B(T&`U_$E_E6 zey50Z#EWZA(!AHZ^#QWkaHw7M%x>T0bG!GomzBLZn*|F=NE~?9@IZews=ZKJsss2# zF!)tu#~K=|!JtCr7-85%)f5t4nT;=za|6fe`^W0)9_WG5_)I9IwgNPbPx$=`gpAdi zO!EM?7-_iM;rREHg@wmxd_EG<;A+hX$AJsc=xrJ!3`Z$j4*Prz3dvq`x!7BR@R&|e zD(&+jymUsAMrjO?>W>WoP*Vj0I1hjtjBSPoQ2nHg!;x?BVJ-wXz1kHFG6Pui34B;K znc8It*gC7VF~jp;&!%xUgrmu%hWF|F`*HxFnkuw^4giS?+_^}}a00E_@Bj%BolX}k zSyn(!0bh2J;{avt<}4uGuc)6fs>8(&{k)L>-P{Q*!d zpxmzgKZ?<6FL-e-gewC0FsB${QwJ(XJ&oboSBM8=Ak%O%c@w0Zp}4~B+Q_{9`PYfW zzfjQr1_J7Hv>qYRP{{6WC@T8gNYCX-n5zR6%h%D4(fF64&@SYz2GP-w?{`T5ccNFI zo?$Ec1qB-MbFcRwRL*hIsqfir`aJavTa11pZ88nsHw$u=@MHWx$QS@}FT`0r1o2on zj~I)jii!OE6+<|dN~tZ-i>wYT>jBCH*bQQ_D~9sj1=|^1tGD2|pQia1x4Vbt zHzWNN^amK3IGz}qP)ajCvk<3EFiI{AY z%|@rwLqb`QYj0yMN;B0F3d!95h3j&S!b9&3tywb-0JHy)pW%5+9B8P;$~Dh}55~yE r1@pN^&%6&kR3jK;X%(igGd})be$T4%AB8)m00000NkvXXu0mjf&a_kX literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_player_one.png b/graphics/chroma-marble/32_player_one.png new file mode 100644 index 0000000000000000000000000000000000000000..7987db345ec41d46a67727d1b0de85c4133359f8 GIT binary patch literal 1893 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_player_two.png b/graphics/chroma-marble/32_player_two.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f13fa02c50e114eb7605a0754e36b98f7b639b GIT binary patch literal 1730 zcmV;z20i(SP)y{D4^000SZMn-c00000000KY&Dc3Ef00009 za7bBm000DT000DT0nnqeXaE2PI7vi7R9M5Um(6Y*#}$RYs{Wgv8FFONvV#~&xCydV z0AheF9YC|wGI<2&5yB;x;v-OxATPBWFP!zj3wvWgNMtakA(0|QvFE2}y1Ra|xYcYb zwq?c+fd-p1#X9$%d+xbairfBt?qizGL$pn48c4$DNdip+4Nx~wyPEeue9Fhl+-6&K zEAS_N#IXL7-|1ak1IEhZJa_;P)a6#6L)Gw5gXd8S}F2ea5k=_!xC82z#UjxI;2dN%JtG)rg} z^6pl!UVw@q8;;4cDM!yoKQDlz%Mn#?ib}^+9@ZP7-CCi#u3=MwY2-8SKq(jwC4j+Q z3BuWTGNFGIyy;CzG67#LB>U0`nDY{h54Cqrw4gM^G4ylLG3WtQj4@`)qt8aS3*bq} zJj%u>V6%jBEg%~!fYt^HE6@tG7CF}y6a~Dw0_!18A=(0yj5#w?K6x^FcK}D1Bd&7E z+<9nL;A==#07nA(p&x7IyVV-XjRc?-BpGaf2=vEnn(qan-)glepQ2L%UoT<3hD1T* zq^|99=Y)Q(Ku3gL6h_h%dO0Mz3!;f3`xWH(#;i7P1);COSG9n9pjyIaEwwI<1d#M0 z%>`Hm`|u%ilss_)I)k(i%LXbV%mL&B*!~UZ(U|kgDStT{i4h(6m_OD3Byqb`M$}$b zvbk2^6u1=b4I$I;-W%xxb;HB7mM*XszMaFyfZ2vY4oL*Y%bu%7x~4pX;`Er=v){-3 zasH4Gdb>mk)DEf?Od^?r1VAPwa4P}PS{`d9khUaA0w3%^>4c3eg-FYHn?wTf4pzYP z7rX3z^e`rJDRl)q1Ly%RZ0y_gyqJx(61~?DMV;~i8Y6)y1@A>L^3sy23TqUYP$mzY z81NPJ;xuN{fC)bCH?mo)XhNGA3)TdxRo8w5CT?oNn9dhW9oULOQa;R$2AT?NL`*_Q zw-4{e3V`=r5Gn~;3xL-wC@~-JLhxaY4`uPbd&hUo<~gW@m^6X-hTyIj2KsLHecO88 zONYd9U;^os>vgVUNhw+T-!oWixO0b?B!MKw(L&@4)^SB3oc0VUD_+;>mwcr6gB6QH|6uL|t>0PI|+6X#`+IU9^< zRYPSvioL&)4HAe7Vr$>8>1_`qw(FSo|D5lrS9GOn{lXYnToKb)SS%q2sG+Ifu36h& zQ7nD#fjE)}6^7G|ES-}hTD1;=MgnfF2)8kSg>nUNJTa@X=Hd;U*ARzs>e`Xpgbgy- z-ht6J+)ab}wPYMcogsM#uS+;Nfy;Ao!6fO#s5SI5C>Ky%!b;UK7pG5oT^(bVyY%}o z+?K_S1)^Xm31m)8s%^dN_6jUnC+wYk2VXw}zXjX9j;($!%q$yN%;8me%&~eJbMUd@ z@1Nag-J4=}#teQ7gMKg)CyxW%8nQ$fy4K5$5@{s>#RaTW_~_3th{N|@I<3Bd@+Dl9 zGgg}k|2Q-<4G$j_nfO^!mF=g zemX-(6ZRhz?>-am?-k_vgz`$5s5jw6L`SQ2-ONy0lpckXQ4+&w3sNg{|HW5u{>==X zeh>V|PsRIt1xYfYDrS@y&}^W#-8gMk-_8vkoHI>f=Pqmyp}By|XRv%RV-Qa`{A=;Q z-3#{j3Zi&|SEq)6b2|n&_&mm*J|uQ2gT9nR16z0G{pt!9S29qB=TA8}xYhOi YKM&_~u-}s23;+NC07*qoM6N<$g2>4m6#xJL literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_player_two_swapped.png b/graphics/chroma-marble/32_player_two_swapped.png new file mode 100644 index 0000000000000000000000000000000000000000..be0b4d8daae3f4e9ab48d0c3f679bebb876bc4f2 GIT binary patch literal 1677 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 B5;*_> literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_star.png b/graphics/chroma-marble/32_star.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d76e99159ec085fd63ea647a9a6869897edd8b GIT binary patch literal 1594 zcmV-A2F3Y_P)y{D4^000SZMn-c0006)M00BS%I(dyq00009 za7bBm000DT000DT0nnqeXaE2Out`KgR9M5+SIbXRc@%DpRBrG4(tBIl3OKr(Kf%Rh zG%j4an_0OslQEIaEM~99g~poE7!p^C$^s*(kp*f9#!&)RC>YA4q=b|*rO->CP}<&m z=A3)mjx(7U!I7D1a&q6l?>px^k6#^*|MSlw=5jR31on(Txh&l<3gyg+?)=o+;SSVS_J05+cv%ZP+c zpcTPeY9us_h#$}C{dP=Jde%yk8TmZPCL=KgOP7V&S?*g$KF_JClpM)s6$J63`A}2( zz>i@jKz}XVezX9j(+44yI)rxEBB1MjO9CQ5MF?9yv!rG(+q|7PmPZ|)Ia6H^t7Oa!{T@>CYz)ofziiwBm#93q&F>0-ViY6 zi&X^_ejCu!hzOA?6eJ5=*PCHx#%WGW>>H2A9m?M(7x}fJL~3WX86|_ z31r>!!J=BtJJq@_7G;YB5wzb?tiDhuN~Y@y#9{&r4KeWGLDTEUj~)Cc)&JzAhmFP9 z;Y30}Z^Z`KA7tE(YkFo!$lZ_ydk5x;hV5B_M~_&zdGo+O)nB`^Rd7;3g zmx={c_mpHHK>OS#U^gV21m(@rk{<>KWw?0J^*k7KFuUr6IAo4)ZE>ivj3n%Eliqg8 z*>?6=F$k0b)PS=FGYhg;tjcs}pZip3TTzlNSlmZ!Sz#zEpnePtLK z;f=R%U07-iPCmv+r-_h?X18oz_rdgZE0&-HSFY@0lY&WhtXR~r)2Y^&)pZdkn1tId z*68bF;QoE**zMcR$A^ZRkB7s|*!;YUo*RjThJr6s?%k8%!UgfzjtQWyoir6` zyi!-3o^}~;-W-5|fu@<>UgxR5zK{FCQ)6T7%;>0y@2Up%frW(t^!F=p^{UjlV*;6s z`xfbm+br|hvu5mQ&ZQSGnoi>mXWvJ5Q2Rzk*wZgx3QMD-66Szv4i8Ik{W^bZ#{^bZ zl$YVKfF2)6-MQ0ruD93W{M2uId%t$}_ey4-W3I shkx)J9Q3dcAM!u-^swLmXa8aU4huU>hdA6JIRF3v07*qoM6N<$f(onhV*mgE literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_star_shadow.png b/graphics/chroma-marble/32_star_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..51a9a07d0797e232ac18afe3f0a4c8d8d0d4f9cd GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDAn=*j1_MR?| zArXhKPP@(5WWdvAE5FVq*~DsZ;FnV!O;X89`~F8qPC93j@<`|I1-1LUIe-5XA z`|}Lu&8v=7J9K?nWw3!!?!>X}72@IRc$fS*6W!txBm7I~JwthOqxHUGx$Nd0X>X(U z{7w7%MSDxERD@_pcG#q*(gplI3||w0Vj6QUAD0Qcoz+|r#n`$%(zQ+S?{ptVSU_mNVQ#>LDZm7i_v z%1KbskgHW*x0vw_>yhs>x<#28nVXH=Kl&VSSUJy7#2{c*U}p>01X*)N=Iusj+pn0V zm})j2U1{c$G&}nJ?Eu#8H*Ofz#T2a8>TAr^J1IIN>dfp%5mx1=4GR=pm*hliUpl23 rbcDUHk#ob7IS+SQr#9}aGoE*$FLPeRbbP0l+XkK??}9a literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_switch.png b/graphics/chroma-marble/32_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c693b20219a5f5c31fb26762c90121a11681b3 GIT binary patch literal 1744 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 WQu-msw~ONd0000bOr{-2Mi2M4;X$(ckKlV zvL$)DyDgTe~DWM4fkd!^% literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_wall.png b/graphics/chroma-marble/32_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..43d0c6820ecd4e03a0d89b437d3148d60ca6d3cd GIT binary patch literal 24258 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%0Dc*XMt=Bs+I3_k8u* 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_wall_outside.png b/graphics/chroma-marble/32_wall_outside.png new file mode 100644 index 0000000000000000000000000000000000000000..93d614cb46bbbceaaa77f0230aaad89bc53cdfcb GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dys{?#OT!Hj}ga5>V9dkE42D;U< zB*-tAjZ;9~n}Nx)QY?Iql4Ry86&8iObp^ad2C|ykE=^mbTiYieoww)ssWa!UUgY6o z6cy*^lM)u>U}Y9JZ_xxA((LKt7-Dhy?PWu*Lk=P>4}V^te)MR^T){n!FaG)`CM#dN zCKM2vbZv$Bhs5lOna`V7w&}`D5N^m~meWu-sCMPIxv%Q@_r^@-8~z8^Xc@}y@0Q{S znsoWHmc|QrH-n~n=4D|w_r}dnF+a4k{KzLG>4?Jfz07RPId_kCZa-M+Xk323w}F2K Wmvl(BysSDX{5@U$T-G@yGywn+nukjO literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_wall_outside_shadow.png b/graphics/chroma-marble/32_wall_outside_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..29ed0e91cdacdcae5ccc7e3a0e72fed13444be9a GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&awi>bOr{-2Mi2M4;X$(ckKlV zvL$)DyDHTYvV1Y*@P>>}Lgc&a^-jo3pwDNRu z42d}W_WD9z1_c3@gS@lmz1XkKV{4OiL{0s8+|^az0#=)!3y=mXMSus~2VU6juXyrU TwRw|)5J=q9)z4*}Q$iB}QW7`y literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/32_wall_x.png b/graphics/chroma-marble/32_wall_x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e89a47e2de38ae28356c07b7c48c5fea8a6e582 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKS0IfQ{09SfW95@TX|9qW zzhD&>1|~Lzf^{6sj9+Ya0Y$|bOr{-2Mi2M4;X$(ckKlV zvL$)DyDt^9UUMF9nTkhS2mc<<=^EO9VS)S0IfB{=>k`ig$8AInI(G zzhF)VChhi9e1fcE8iBz;K{Zbo#}JM4$q5e3J((FyI!!Gs5*Jx#NVu`S&~FgbmuR>+ co=IEOiZybd3x`42`S|Osovev<(cb3=B4vH}t|Zy{D4^000SZMn-c0008g+005u>VZReT00009 za7bBm000Gv000Gv0c~iV`Tzh2@JU2LR9M61n7fV~#}$UZy7XmscFDCEh=3p)Fd>6b z;K-4)jg&Yr960c6I91?a5*zR{7zR3ZXh7jSfMCOcZ=~9iNQt7TU2-{>?yl;pIu5F5 zC|V-9mwN922Wmpz9*5RbaafI2Remgi?amaB!fR&o$OE!Ls+^IOcgm zh#2Du;Y*zRlo+Be_4*6g_S?#*&}5{zMC ztwZa8QhI{P3you9yN$${{qp#6V7ra1*I6;G6#!M0k8t;Qj$)zj^9EDO8yItd8_n05o&sDhPeN7Mh4*W$4WtAq$#mR` zg9AN9>67D0DIb{#d&pfR15*~reoZNVmUC$a^}c5q{zV8aDftCFQSTdoJ1=TIwlQuA zA<_53FeK_aANe@uw6jYgyZ2h>1YVXJr80!bw8&(W*(^UxDL>n89p0bf++Tt7_Wu3z z=0AD90k~YAgc!pjgf-r~eJWV30?ws<=HD4TtCT&pt14P6lu}c2&Yl&4zE7N=XYclX zK*XW-J*>Tt_p1dg!wUg-UKAPHsv0N?0Tj*&eV_JfSgWY29GQoQhWXs!{Vr|f(zgSR zG23A0+q}_{qS#PXUs4pVJwH#)x3PRHV2)_DNNI(&ffxZ~AB8#3<-9hZ8|qqf<%*q- zPxir-11RUbl!VPD?(<$s4y7K@b^oO6PQO*XX95CTyEZh&_*P`gI3_}1f|Gsvu~zLB zEQ+jbRq6e4$0$={q4$=^3XTlJL%Qx3F+OO|&W7e$9M1$?E>A)Tei7pe@ED`_^>r7q zb*-tYtllmN>RRtBMoOSHD5ds+ky66@4v~9^e2!B3nd&_k5a9N0n)Ui|JC19V5@s`l z);X2r2H=T`MWL9@4D-3==qP*g$`!Nsp7)7ih&boz`v*988*6=gna`!2%?6CgH-)0eb$1sqyP7! z-a_QOee133%|+I}5a4oo5=7!cWJQdQs>Z>AVe>L;z7$~Y7xhBxEg~a_hjyyL zIS}#<&XAH!&4Qq{N9zZ~_!*!s?7de41UNn(nu7z{qHvQJcV#X2g)s_MrHL^SV<3b_ z48uo+@YRJQ_fmk%Y(vnWePSthC~|H2R>Q^e*{nBhIn-9_Xc&aGZry;lOvd;>ghU~H{*7$b-{%5tDARa@6TZZ13jr2+E|P%lI} zoEs2XdL_^LV!b*Y^EatX6l3an-KZZ#1uC=GOwaT&fV`uz*uU&KZXF wYf`v3p{07*qoM6N<$f~g-J2><{9 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_blue_left.png b/graphics/chroma-marble/40_arrow_blue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d72e9aee83d5bb2d9edbb8f704a448e581a413 GIT binary patch literal 2186 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 M07*qoM6N<$f}elmfB*mh literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_green_down.png b/graphics/chroma-marble/40_arrow_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..1947ac097766c84c19e29813654efacf305288e2 GIT binary patch literal 2242 zcmV;z2tD_SP)y{D4^000SZMn-c0008g+008g++XPN(00009 za7bBm000Gv000Gv0c~iV`Tzh3I7vi7R9M61n7fV~#}$UZy7Xmsc1c<87z`sL07D)a!hn0=(6u68%6cB=ONth-I$b4i{DM8C zm}qQ+YVjfpSu(0xZY1RuBrwXzCT-|)$0lvqr#&H;&y5zPj_eV0JICV-EN=4QC?i1v zDJNWXq^}a;vq0|iV)gzieWM`Y?z^R4()Vm{uZJq&j4OUQ_fX7nQpRH0-FnbUtb=$?BUJo zbd?-#;e*E}i?OD_7>hHGQAYN8Pu5JAJ07J+?DL*&-ZILFHRV=~ZSclV-$#i=jr6%E zX+l&Ggh2-OdC!ms`h8FLNyqTfK!4Ux>OBSs&~Dmg>eIR&YhsS5Q4~d0OMw7E0-bd1 z^PVnuWX(8Jw(amcjcpJW9*hs@q-_5tZ`kH7)>!QMvRO0xuqWIP^ndNq2fF_B`lri( zXL<~9b-GH8Zx(SI@yR0yqEfco6hCFnj51E!BPt|KC^|tNDj6tUKq8}*j!>Gfp)wT~ zOY9@VKL^q}AyF2*PkJig!HagZ>%7k-N%Yz?$Utjbl9omsHBK$$@ZMsnZ1I{o|5CIp za&D8EonbHtf}-rho_H@3{u1Df^_{aj%m3v0FTmC5D&>?HX`6^4POV^*HUtS%=RX)7 zm^^hz6>BWUn9`h8=yHdm^wM*d&e-QYed^Jm*xMF=#}hYk!Rm4Ko(OpGq7J%lhK5Qj zFc37*OFyaMji<2s}dUBykRR-p8!5c;hDpD^uZ&qp{7j-C1)PEbMHu zM3+0l7#JQ5bRTu(yLo+oxW9ZF$5R1Ur>m4=TI5ZJ2+q1GUk?@A+Lp#PT=JKuB4}+p zC5BM4)|hV!Lqv#OL~kqlg<`CEs(Q}^1h~PC<@V8bJ#I^M&D;!2QEp~ukEvLhGJ?(h zoD+A#+|9Y(HoJYs+A8J_H<6L{ymB8CU!jX09~kL59-M75daO><0X8Pj#=N zKB^zf+?NLg-m2bO&ULfjE~KGuLKa_ zTE4b4!K~}9#^G?bv=T+9f)QkjzNF`863MvisLm?%W5w;<`qtaGme0HHa|5nUSIIlS z@OzIRJ*{u4Y-umGscCE(P)8jZ@-Ut5JRToC_DhTZ%9pdZ@W# zuW;f|xa==;*j9D)iT~6#;ueR@j-;oAm7U`RJj)hT%E3xiY{!lkeQ|xW6D`$ z%p+qzBA*NCW_(QaF+wt6Y=T^R6i0^IJl>)1y^4g?L<)SQeb zT<$L8gMX>YePw_LFOIvBZP+s80TMJ_L*3W3^Y%jOT^JCcJ!_YYtbOn}b!brPp{6$V zy8Usxyy*Qe47fU7C1>42J0%PO-74{3#MXAPI=z^BuLKZ)cUTfw_h0vHZf?k%yxzXH zUA~H2zY@TeS*1MW1@}PDlwmu(67?SY|KLS0w|C20>YqE~Z1{dy^8a%E3y&_PoE|w& QD*ylh07*qoM6N<$f)cewJOBUy literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_green_left.png b/graphics/chroma-marble/40_arrow_green_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ee7426280e59133f211a8927a2c0f1c50a5910 GIT binary patch literal 2248 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 Qy#N3J07*qoM6N<$g4VzjF#rGn literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_green_up.png b/graphics/chroma-marble/40_arrow_green_up.png new file mode 100644 index 0000000000000000000000000000000000000000..c6219be4101ea37144a04afd9c8e32eb8a860f87 GIT binary patch literal 2127 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 TPcA>800000NkvXXu0mjf7u6^O literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_red_left.png b/graphics/chroma-marble/40_arrow_red_left.png new file mode 100644 index 0000000000000000000000000000000000000000..4b44fdddf016a61c31a8d61012bc6ab655d96989 GIT binary patch literal 2193 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_red_up.png b/graphics/chroma-marble/40_arrow_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..49ac75a7562a851c635d6cccb501aacb8b0b0e15 GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_shadow_left.png b/graphics/chroma-marble/40_arrow_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4c028b447ef9fe24a7f6548379abb1e5232238 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvq(LBnAz|X{SwIG7fkz}zkhK$p8FMq{{sIaf^mK6y zi8y@qrYE0+gGfu_VbvJNHyf6|uh;g!#N9bl?$z`w$6j$?{JTq}^qX zXq=bG7Ix-DzokiH-`p9^*2{h!nBqR;7jJMvlGX$5jQ7iHb}p;`E}g{qDr3(t-D1BN PAisLL`njxgN@xNA0k?ht literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_arrow_shadow_right.png b/graphics/chroma-marble/40_arrow_shadow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4aa57dac49e8f5f1ed454fd894f06a5498423c GIT binary patch literal 329 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_blue_left.png b/graphics/chroma-marble/40_bomb_blue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..9070a7734d45cb6be2d8b4b1a6a6b78aea67ed71 GIT binary patch literal 2938 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_blue_right.png b/graphics/chroma-marble/40_bomb_blue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a516e412359e7b6873d58e0fa010adac97edfbc3 GIT binary patch literal 2983 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_blue_up.png b/graphics/chroma-marble/40_bomb_blue_up.png new file mode 100644 index 0000000000000000000000000000000000000000..733113233a4702c0df0acfc394b85e80d9fbead3 GIT binary patch literal 2902 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 A>;M1& literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_green_down.png b/graphics/chroma-marble/40_bomb_green_down.png new file mode 100644 index 0000000000000000000000000000000000000000..7d0ee2becb91d9ed97d60dd0ef140219c24759f0 GIT binary patch literal 2974 zcmV;P3t{w$P)y{D4^000SZMn-c000J-o008g+U2{SA00009 za7bBm000Gv000Gv0c~iV`Tzh66iGxuR9M5+nCp%s$#I3h$jmAh$?mzV7Hjoya5lyDWjQ;#eF`=W<-FIx>Y`DL_r}N#+CJ-aM{p>A$*OR7< z5DG~Xs+u{bij5YN3?`YvEf*Xn8eDMLU~|By`x7Z6cS`Myn4;$ero2Euc^+;b*nYd^ z@ry@{HRk{;Q*nK9%|7iJhcP1}xr9V>x?OZReaT>>rS>&0y7RSDVDlp8lnZi3QPO#g zU`uLc5{}y=AO7nD+x?b@%LihJ=K!ZTVa4+LS#I%2`V0Am`tT%$)c-SG6Fen!^y-e7)iN%{34I z@<5+@y1rxV#&dv;ZE)haG?#2v8xDG4>Ly4O8JUACx^3Bh^7 z`MXIb%ZQNwD%fbtwJKDZ9>L;A&*o~w-OU~M|9nqNOVo%a#a8wlpjXd@xhO0Cu=>C* z?ih{(Q6mVY`sMP7hS3Hg+Qu zlFgIZWQ#>J!4TTO=4!*o?MJ46pO~2NnpGldcJd<4RGb&adtlPXRDubw!+HR8mvFpG?&5q|glcl7(7Fb1%cPBJ^^xs6q!Du{~a%Gacf zg;eJa#PJ>u2Vr=FyFXBIUwY2FSfiox*k;(@)}a~zLlBQ#g> z+^5xKYo$RMb_2J6y5%80(EX?@5*9U{#aSF8xu7b^0sEsrBRFf{m_{@y6`2=Hvt&wB z=`xVT`I{HtaM@kvR90EopStQSE+R%9hUP z({ahE;-kirYSBD@iis4T1gM$^b>ebWNkt;j#~u-(F%62+$3B}^F}z>BXFaX+uFjne zs*2{WF$6w-_mR!J4UhlynA1*n-HMhmopIDsv$88xl?Q#u2tMVYGg-Bhrb1q?o~RLn zArh%fl^eNnOgeG5yrYX<7H-XEA=q3n1ZejyH*arv&1pPQchr+%_}_byN~+Quhcx7ZITg;7CVcYwVHAtyn2ua8uQ?0{!VoYq z@Ae{*!4K^FJwr2a_|c)zW^LCj&9XR`Suui!vVcUQu4+W&%)vRmL9-q{-7*S-h|tH} zo&+J1i9PAWo69#`wwJkBYD0{XuJ7oFp78U)%B>jEKw}!LSXOogz@$?-t^@GN)5jiF z#aYK>rgMOeZO#t%)Z(7Xk80Mg*>#5$SlJaK!p-`ILw}$iYh2~`q*;_2ON&ZHdL;{Rql-7f(6#+Gn7hm zFI2LZL$fA!zGL(wt#7kFI!CM`3%g*q*s*`yv%XvNaQnaz2HMYB#0x2=;*gH%$PfpT zCY;M=VVLs&YLw1&G_fIuNWG}f0ovA5?JL|dZ~N-1&W<7mRFz>I2wgxs#f>g|#$_a~ zBS&|nu4>+(TUktRkdK0WwAe0BW}X?$_Y63QE^;S#tiM<@ zG7|0s{=LU|1Ch+j!@#f~(4;h%4d%kojrovh>_;v>yMP*WsYDl9EEm7x|HJEl015{^ Uny{D4^000SZMn-c000BS%008g+XSr6Z00009 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 LNkvXXu0mjfS37`C literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_red_left.png b/graphics/chroma-marble/40_bomb_red_left.png new file mode 100644 index 0000000000000000000000000000000000000000..b6768d2a5eb786980e644edb03218b4f97689f42 GIT binary patch literal 2942 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_red_right.png b/graphics/chroma-marble/40_bomb_red_right.png new file mode 100644 index 0000000000000000000000000000000000000000..c136b462192b755a2dd06014abea4c6fef13e7eb GIT binary patch literal 3017 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 LNkvXXu0mjf_+`K+ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_red_up.png b/graphics/chroma-marble/40_bomb_red_up.png new file mode 100644 index 0000000000000000000000000000000000000000..dc05c2116da131bfc05f6485219a8d997f145879 GIT binary patch literal 2922 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 U^DGZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvRAvBV2QYjt`6~w!Ebxc~3bJ;BFk^1U++RS!5KkA! zkch)?Zyw}iP~>qvm|=ZQ;oJSIT(6r{Yo>AT@%AhBTXipUw_Mn2Zu2tZH6Im!N3PlM mY$GER7VuA8qTZ#y&e_IsXR^v!*FIsO`3#<}elF{r5}E*xi$8P# literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_shadow_left.png b/graphics/chroma-marble/40_bomb_shadow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..abe7a656a55b405b531e2188e9e53c50d70c7790 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`*DLWCt*u-1o`}Bv{}P2^3`Q1YyS9jJdynf+3zR zjv*0;-`+gP$)L#NdN9NKn!>mHSGis{sn$&6+~e(6?6>M(=5D#L)!gP~#%n$*{*GL; o;n_w;CM@8exJ126f1R_9GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`*zb$PQq*u;}+1kYIsFBv6pG6NDLaGv@vR3Wj*P zIEF+VetYvECxar7>%k1`YYN})U*&q;q*^nLbC0)QvEQnDnY-n}R&$$|8L#=M_&ajV ohG!cYnXrI=;u7^P{dLYZjysc8&bsyq1I=gfboFyt=akR{06INDx&QzG literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_bomb_shadow_up.png b/graphics/chroma-marble/40_bomb_shadow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..546e5f46b1122c1aae33a39fdb6b21cc4f9c9289 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`!^G$PQq*-S7>px42YbAJJ4Lp)s^ zLn02py?Kz6L6OJxV21TIg>Uz-a=mU+t(nHT$J?*iZ`Hlb-Ev{8xy{Rr*L+m`9l2)1 nvyF^QSinDViF%j*I%gZloyjU^UHgQA<}-M@`njxgN@xNA;9x)x literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_circle.png b/graphics/chroma-marble/40_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab03d895883213304d7f7ba16ba592afff61e0a GIT binary patch literal 2739 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_circle_shadow.png b/graphics/chroma-marble/40_circle_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..d048c9225f0a124bd6f988c63605908929cddcbf GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvqyrcj7#}cnN~k{q2^M%n0tHz+L6|W&W9~1Ytf{Aq zV@Sl|t1}(>nhXS7H7~MEU!(GcX$^;tf{Me=|7&F?#a~wF;@D>Fd(Ul4?aWJMR&EzJ zE|Yo0`p$U$S-x2UmVpAQ7X@rHK14RYSFuZZeontdEh|ZdXU4sR`Tak7-Q<^dp9`KQ z__pnW7+Y=1i_cTalvgz;WiJx_WoNQf^Wt2MZA%VIyb|AOZTKhfoKeD>*hwqZEyIoO zem++!_w>%oeYKmTRx=b$dv*C$Sj0cI1q&JvzxrKqRL+!jS?g)_;MPMSDp>6Ru#A)maa-n(0pQx4u? zsSa#fvwX&1CBcnnH{4rsQ@&Jb66?2@V!vBLT~3|zopr0AKmLp8x;= literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_door.png b/graphics/chroma-marble/40_door.png new file mode 100644 index 0000000000000000000000000000000000000000..b132005c99a1a8aba57cc5fa015f4d61b1e8aa83 GIT binary patch literal 2139 zcmV-h2&DIkP)y{D4^000SZMn-c0008g+00J-o6M9Wb00009 za7bBm000Gv000Gv0c~iV`Tzh2(Md!>R9M5+SV?jeOBVEqjGVJXNrpCHY`{1Sral1| zVaZ)MLu<)BV8uogDr(F*Gcuz$_#;Y)!G3SL(+rbPRz6O>X2!w^MLAPhq|=j8o3ju^)gK@h-Ni@xvWpVk`7 zvU!pu&|1S7 zgD8qn6a~g{#4rq!JlEN7w-*3l0HEtS0D!d?)>;h1AREu~jK1%YWf{US#57Hq=NWZf zW1eTUZHuxjVXc+-{5})T^Bi#;!#M}%ob08w1^_tc&@>H-8F+KYxY<$hHi_ z0Oy=+-1j|k0|40X_d*^+mKH@J0B+kBo6QFA-o3lD)?UrxJX^Q*%dn8GMvMiBh z8316KCXi77ib9F^;1Md!FZi4v^|^j5z`}$K9XW z`p1F)9dljRVH`&(fKp1d_O}5Nu$;rpmKA-hZI6-QSD1|B_y~KPzg1QJmiZDO=OS^( zapY(EyC=&s!O}xak-a`cDQS=CsZt6>QQ+CLXU8%#O%vL-Mb~xM?RMB~Hn7%8kiV;3 z5CoD)7=}V9GMWMTcpS$OVHp0Dd>DqJl@j1IP2xP*hQDDfSS%J|gOpN|5i#j+MC?(Lk|YrYAVIX& zsHzHAS6A5Wc6j;nC6>$OPt~RNW?3eQX_lI}qpPM3@@MD6%F=N9ZKgr0Y z+{cd}AFZx)4s~6_S}W@r0N8G~I6FHN{8?+|%d8+lPuBUt8e@*2!It|6t=(>i^?Hpj zU%vbnmux$olLmmYECtZ4S`Y+3wTX=7PoG?27>Zo+bjWu>5a89TS2!FF2!a4_-n@~M z9HHbhnbuz_I1B@trom#dz+$n$>FFuX&dw0W@sVKDOb}~aFwb)dj-HY-!d5+h{v2=L zzLj;xaYUZyh@uF2p5x@?M7~GoeH7q0j;QMzQ550){2WzPAx%@HX^LSOgfI`s5k-{& z@_C>kuiUL`dVYysl7zW(k-3b|uf3{Uh9c53sV8&W&WLYMa^4rfK zSXG|veD*U)+AWSX3N+=%KkFFZO!6GuwyoSOP;`9)a8iU}D2p>_dOYHnOlL*>qm2tjn@YZUo3u-2Pd;ieb`ZkVI#Dv(* zqq`Xj?KqAo%Th)b1NBX&5B|1ok1D}y4Xrimy8dZ)M^Pl}@ICR*s`DHz0s4_sXdlj9 zR*&P5x<`f*J9IRJ3q2u8##S~>b96-I5to-v#JBPL%@(i{bU2g_W;;#OkwE*>;?HKD zMSO?M#F-!fv~7zl%Z}VrQ544*BoR2qPEJnb3;y8uF_@;QFq)FVs!{LKG!>%o+#?$I zT`Q}ql98FFsSs5HOp@fN0=~9!vQ$-tx~|3RB}sCG7m|TN5+<~9{)GV7R!U*J-J~i^V+8@#M)9krxKSR!!3+B%t%=O)RUq z+wHJgt>mhY?uP{QTYS0QZZCNC_Pqj^U%!6EX0y4tySu~f?Jc(3t+4y#rj>@cDo&%b0~@ed7fjt-QsXKT*h$>YwZOuuf98+OZ-1P{{dJw=8a7n ReQy8&002ovPDHLkV1i_FGZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvq(12YbAJH^3p`yM zLn02pz3IqxK!L~Q;*r-bdm1bLM~7y#1YL<$ouYr{n6F%lx!}(E-oUNNT zGZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`*DL#1j~p+rq6uf(0ItKta|{5N6EHnEMMTE9U9q z7!q+fIYA=p!Np@TD~pSZm$1#P%)dVEq)l}6p4b1n{?x0dFZmOFQ(#wi+05l<5)Atv ze%rJscK-J8zyCL{fA|0KRoDO1uebiu@7-|ARO5`bxw+@7FK4dQ%Wn_+SHFGdpZ|NG z{!Cy#EVJdm>yB04yjv=Hq^*^ggqgSfv$od$`+sZe&Hw$rzW?q|dGh1FkMpnjs~4`h z;xLy{D4^000SZMn-c000EEy00EEy5x7ef00009 za7bBm000Gv000Gv0c~iV`Tzg|Y)M2xR9M4fU?3Ab+L$ACZf=eg1C;>L<`Gi(W^(zm07Xn-^9Gn9+|-i|9|$?{eQf= z=>PJ%kpHC-R=beZTv?Fa|9WHD|KEG-{)1?cx{Gr&fd;z&PxdmJKr{2s%}tU51@FhL zmH*#uF8>b1*GlaL zt;}QC*cl<|E46z|7IG}|6C1a;Rdd53VU&WPR9QSD#lbit(dF$&>=` z{w38xU_(GYJvAfs|GaYl|L&$L|CObMCeYG6hO%e}nLr!OU6$H1|CFT!|B3Q*?NX5z zLP^w}SuUDok=Ebp6CD2cX1V{bin0CgYN8CX_?xP{uqG|dg9A_$7^;ilEEbY|Ow8QP zl(&GQ3v96f*Jc?BKAgo2wap_MKrEJ}T0u>;d5<=hN!?gZ%^HGA=8;}Qlu^0H!DAjd zH3YC|fYcCmAylbx@R>JoH3X674Ok6<-#m3hbPrSwL9BTLT0;ut oNvx?{Ls%2rCm~uPk$_V30GQ=5XnTp2^Z)<=07*qoM6N<$f?vjQUjP6A literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_dots_double_shadow.png b/graphics/chroma-marble/40_dots_double_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..e0543ed1bc362f9c2fa0c6837dcf1eefb0bf98fd GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`!^Gh#xT6wHrMG2^M%n0tHz+L6|W&W9~1Y;89N( z$B>A_Z^KV>H5l;RE(;R)!_ogvkK^+H|JvOp0WO6<7RWA{;4QwXH?Ps+`x={ti51`X zb$xA8XyaZu&p=2h`N_Qh(d$)R9DD9ezABh@sOrF(?ENoU#UfZTAI1r6m*tZ=DSKq? z{%g10C-`-AUjMZ0GN*d7(CqrP>Hiy^x##?w9Fk}pDzWv}F;%Boi+5iRuKlyUYSy>F zMa#1es8)UB&!{`{%-&PfEcxDwiJlX%LX(~<=HILf7HZyh>HvC(!PC{xWt~$(696nZ BgFpZP literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_dots_shadow.png b/graphics/chroma-marble/40_dots_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..f551127ef89daf8768de56818f767a6c028944e4 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`*DL#19yBcIur42^M%n0tHz+L6|W&W9~1YV4Bf(u31KQ#AOPZ9`ksz0rB=jxZJ?hA94DKEcy#^`xT-oKeq#nI2Moa~zI zXk~h2%b&~hS1vt0$;7k?T!eDIxeIorVA7wC1ah zXAe!UzB9umAc&ABne5T7MOL z7AL$7oVCCAYJ!yg9X{zJ(R^!SmtMQ-Xv&r3^xU)L!>;W)wcFMT2rp{(IkHndx9I-% z>)IRQ=eK?gSSHPLc_s+QJ ze!8ry#ia?&Gk+`bEU`2*7EgVB-n#pv$00u9PCm6+OLBJ03%i_~{NlmE%Fdg%MO~MY z-l$kfn8>8w`#$%`=1nfkpD^@$&teXKo0zq0DZ}yEp8{q|E>}Lg@#W=iaXa4Zk8^BJ z9@EI=%jCOtRq1Gmx7{u)?rhbMZkJ>XcphJlo0%55GqiJV)WpSMyXGsM+?W}(EP(lI zB;WTQlM_O^@1}be<;*%A+&fKMHDi_VVyo`;3TGYpi#sl_7r#A?J!HknXZjPK{d@F^ zXYTL1EDbNGogK?OiVZ^aAKL9zDd(Ge^4OgeIp4o) zKl@`v(UPey?8&{AYQIlp>Ik^4o%|xQa-z@X*yw#euDnH=f^mDsi6MMELo=*sBG(GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvRA#`y!1#bctk`lQNU*>o5-7;p3BruI8FPODWkoz) z977@wU%j@Q>yU#$>qGn93nEn3Msy@7n`JHL*tzF_^36Fb7DNVF9={@=sK42mJuaT@ z+yRCy4rjmX9|=9c_JZ}hgHch+1EmsHvDUk87Fi2~?_{N$tz#;4lHD-tN8}V`M)!lW z`|h5cc<IhI!WS zz;t=Be@b~b*{|ha+-+EV{@p#U`P};2rzV!1Y3{2v4%`vQ7qTM!p?9KrV4s(N-5dX{ zGnq}#S~lC9nrK?b*1I_6nTOPaWLp(u_aGK2ky{D4^000SZMn-c000H0t00EEy8k$Dc00009 za7bBm000Gv000Gv0c~iV`Tzg|$4Nv%R9M69)$dDFVH5}O%U&wN)ZxWV#i`S!UFkN% zR5Ub_G&TD1qLJCArOn)2x|=^*a{Ga_jFQ9`nRpG;nVPPa+Q`HPHQ2CFB*Drt6}J|7JG$H&QN`LmrG+4Oyt>>Z=vW7~Na`YsSoqn38| zRvMj;wDyI*D)-{!YFHZ5!9sr(eC*M{`_2mYbcf15*;ZvN(0Fz~v{MBzcDo4X9;(6pvmfMpW}w^Z4XpBn4kBNed;;t*?WcrYUo z1?#2Z0(oK-E+-|SdhU)%Bf_oONil3mF6n(xcLdmhYT%{{rt2qc*e7G9hf8ZP-z)Xo zXs|^y?Z8z&)?6nnT}2BA>6;fC|`WqwD~ zcNmWEOYmTdgQU&355AFp9@KHWqV~=(=h>+am36ZH9P_rVOh468E}!jE%jde)dT!zj z*N~O%uVzH5z*TBkfEvydL!H?(l@biTpe2ee9voxK8E6PmBNtQrNSg=DF6rkj4^0xF3 z%#cM9sqta--UN{`orth!kz#jVN-P}9h=;>zQpnmZ25za{L=GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(v_z`*zbj7^u?D}w|JJR*UDteqgtn42;87f|qqr;B4q z#NoG74Y`{Q1X}lptgv_yCDUawRqs`jrpep?|084PDLlGztmzBuy`qzMRi{6;yHUsb zKq1wEFC<9s_7?dc7rDG*n0O0V*>@JkWH#$u>9h$>iM1n>;I~nlP;w^%ak~-Ti5; zXm`-lzh$yta{nq-vgA3i$Am1MeC5Qomp(Bzi`Xj|bPN7$SmU^FZIUmi+XEgE?OLjks|%!PL`7Xz~#iLmbqkzr5GX6Ad$Fu9069 Q3G^d_r>mdKI;Vst0QOdcb^rhX literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_map_bottom_left.png b/graphics/chroma-marble/40_map_bottom_left.png new file mode 100644 index 0000000000000000000000000000000000000000..aa25c6c1c06a9806cd411dff8f3c5c08fa62a294 GIT binary patch literal 1762 zcmV<81|9i{P)y{D4^000SZMn-c000H0t00J-ow%bHy00009 za7bBm000Gv000Gv0c~iV`Tzh1SV=@dR9M5+nd?&%R~W|m<}f1y0m3y=QXzy8LIMf7 zkc%j4Z?;~zRPBB2w^l7Py^fA!>u75`UaHc10hCs&Hj28A7OeW;@MpYzpF?&zyX8xxwR1MWb}Rw|B|o z-RAbcc6ZZ(mKH@5h`~^~ckNo*Tw6;6Ts9jD?rqAK0h2nEolQ-2xV>FW^oPz)8gjX4 zOI@9=J+9?q?0>}X7Zcpx*hredv2d8)WpOJNk#BuI@xbNw|B)xB>wl@IN2p&Zfj zw3Xk^a{K?rA>P)|u+V=z5}{p^KqZ;X&8E|&^!3pl4*eCLz^KY*Wt*i^}AiJTu)`C_P}f0{uZ~#c&|#_ZFD+m1D81W=c4tWWIeiw;>JFY z$1)`Nsi2wX~gOkVc}5yCTFU6unp$z;UL)$5Ba7$S>(;0)t(lEE*w z{ZoG48};=I?Jw}d?lTV%iEx4u=7t`pQuI8VCA@)%!=ZIJ9ta4J!^9A}%lyl4NMm$5 z&m6{h#{I!EIK#x$_6Mc*D)WDH`G>{fH!Cq*a*Bl=>*x?n^m9>t3!ay(t|s4_HPldA zstq{ecF*BH+QU*Hc87sc2-)Lyi;pE(Q9=wHZ3@y3R1+As1!qrfXmWD?f!rp%0que~n$ z8eYJ*0_}A^XcRbUNPP^wayl5y+4)w#^wp{LGx>V>sa${9B3HvVO?}Wzpd5ln{D3dK zUhVoD_N@;j--2zx7wvp4A^F+}=jv`LS6|Kh=4agYtF|^Vp3Vo&1j^UQE_-d(izhg< z=$J9_HTex1|KJMmN#lQS^ub7Ef?Td)?M8R^MQUu^K@0Vh)YP=g@&S>^ICXWMvGujL zY?y-$$q~C~^uc+7L)wk@_QT|KZZHTO)UH#h86^}tt1%f4k5MvtUx>8wHJRy|R7&CO zm9vW2q|pbB0$r{>xys5OMHVR6r&5oot?g^=8p1j{j`5`WEq%?%G+46}sB;kr@ObuF zh9DlltrHlF{Yfn?2ej*G^r{XKGhZ7rF#SG%L`4hi>A7OdP$u(~8XC5d%v>mRj^z6K z`qylIO=b!h*nO0X1ct*GG=^fa8=9N(k9z6Z?b9p?0=;1Ucb5;?)FTJGf6k?Pruybo6QIK?n&5IAAt zb6;xLKHnjwx%nedB}SeuviR}wgTsUu8+CeoM-L^uWq)}VjqlBO--7; zG66rd%)RPa4_4js+2DW;lZym;JfB#G1aHu8xn;%_1igq)>Q*xdl^t`L%oFnaj}-kt zgcG~A7x78?EU3iqKgulqE?C3LWj+_*<6Qh$Ka___Zz8IUM zTlq6;^*qq57@5ST4aX&#KsIRwIhWUff~onOJfD}Vs$x`L-XZdFMMcO^zqnv6*unc^ zZ&?|I_#s#y_UF%h3KeXWqWrPEvU)Yuu3DwM6#oP9FCplM5bPr`hX4Qo07*qoM6N<$ Eg3lLa0RR91 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_map_bottom_right.png b/graphics/chroma-marble/40_map_bottom_right.png new file mode 100644 index 0000000000000000000000000000000000000000..691b315edbccafa33c1928b2a964a03c799307b8 GIT binary patch literal 1686 zcmV;H25I?;P)y{D4^000SZMn-c000J-o00J-ol?_7I00009 za7bBm000Gv000Gv0c~iV`Tzh13`s;mR9M5+S!q)gR}|%&MU^bFGc1CUWdOlJ7-puK zVToWYBbA_nL9<%Pw=Bj~Vq!t1l339!MIj5n&kmb5;L-*=QCUe7O-;r`ueP?*NL3Xb zDJygM<6fHD|KsLnV}j3DRFDmDy1kuVWNKy^hk<^l0Dj%p zM$ho-Y`6c99O9usV6*>?&Q3Zh0P32STuUTK@9w5M9Qqlaz=ei}4XgbxP1~?I3%ec) z(Rsm{aSn4&aWT31Crz#`Ynox;DEeQhuebZ(WIV$%#CUK@02~hn^>ekgM%X`b;RHAf zGJ~@SMXa!px(W)CR{L00RkCBx9{YvAvi~CcW4xn+cTbm;P#;^A`?J~oXBm$pqImH7 zzI`b}g0Jd`2pKs0ZhgJ)5CUK({+PUD1rfq)2M?wk;NPAeW9HWVPYf6!{l0LO>GCBL z->?5ee&4g@<(vNB^ULlr9{>{J1V@-R^dKImN4>p-73eG|useKy;DDiVm>5F$3;*&8 z*&JOqIfpUUxj(oJo?&8^|9RnWasD5+{}>#8dj*HHCK=e}mKK8({cM(QLG!etA`0f_ zQXo6q9`JN^^#-29ACdyF!wN?MU7fMo z;H3?4if4z$?aBfMl>O(^aPBLXp;I2R_9-tGCbMHYh|o<64zH!*9Q>h`8R_7NSOGWP zlDYCb=B(7MX_Lbk2b{a_!a1p<(}MGJyxP8WPz@2ljWLI09!{lO*GvwBzY%V0&C8=^ z<{bQyo54A$qtZXY9F3&YK@}io2!i_!@vPE6osMF~Mm+qt=%5O4CPPj_8jefOxait3 zp=(%xp)~#u9aI6%Dyff2uYc3lmh{rCe(}{=?W<-x^i;M_q{!9KO;;Us11LkV!Y_Eg zp~1fYh;{1~p<9p*=%Sad#e}Y%=3IS9X>2UUQO2l>KTr5wvt*E&0IQf1{y&-SXSQQEwpW&aaSfHI`u zh@64S$<=sV=j@Yo)3s=HkwT&CRA2v|?tI}XyMH{ss)s^TN!gwez%xoc=f=qonJaF( zR#MVOg@sX=0$@Y{T%pFsi{u+%x_S`0Bmw@xoa9{>Ns@c%U^Keq02qnfrka|U{R2!_ z4?>ruZXu;XY*Xo+diC@?q(ETEZV!j&wgB=3=vEJ6zp!G~gYzlsLD;%kFESq#Px8KaW4LLcEdhi9a9t3FKi%_G|9t>X6 zYirL@dHFFaD$*!7H%Qspl^fdzIF%+h?)0T{GA+QJ-WR94R8FP^c*AGzy>IT57sT0% zS}(?8cPJ8BFnHJ1b&KzlY8z?^*Ki<6!@h>zm~p>xQsukk(^^`Uk4g8a%k z)i^%YSol`GppqFkU)k%(Rhm)QmzT&d)m3s>4;P2dyA_2eODtn5Kju}UBplQ0Hi{0IS z8(j3mNl$>#xo*}u>_-qz^=!t{!7yte_7pK?Pod`CU~t^f#X#UVm6aW_4Kzr_$t?ii z@W{nj!IK%t5I6-ukE4?n6~pAH=e#(Fvl*Ox`h5Yy+0t^E9!Dq3%8qXK#}V6a%q6VU zl6j_Voz2L7F6zETv)wx1gUQ^D+zYPZLuqfHHtIu*bE!<_BsiR(FA885X&pHi2_Ky5 zH_vGL%zbVP?{krlLwv>}+f{>qVPS;w@>(b-r-5G*qT=EN*NFYTthl(BKbA1<-u)Eq g+EuDQ5&wbsACn}9c|=9WJ^%m!07*qoM6N<$f*M*lKL7v# literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_map_shadow.png b/graphics/chroma-marble/40_map_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..19660a5eb0804f6f7705e3a1464da2b7571bcdbd GIT binary patch literal 559 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 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_map_top_right.png b/graphics/chroma-marble/40_map_top_right.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4052800d80afaaf046123a1a2b96786b79a205 GIT binary patch literal 1741 zcmV;;1~U1HP)y{D4^000SZMn-c000EEy00J-oz4=L`00009 za7bBm000Gv000Gv0c~iV`Tzh1LrFwIR9M5+S!r_s{pNMgc;39X;WLp+X%A8cqX$HyoT*rS;MZzdAr<~tf2X?1lq4YI9P48Ogr+n|jPw%O;SmX^Z| z@D8=L9Vfqkh-zxqP<8bn+iGFBmhH{&gTj2i&D7d@M7&^q{YEkYUW~M|=Ka#?hm+tJQV)*e?{s=X7&zL| zagKt)Q8T`)Yn)TO$pSde0Jlm24~4_p=S!E0wExiBO1Bxr#`=1aIeU*66F3X*r79|@ zySzMa`2GHod|6qi`M^Zt1_QZEjg32bX4jd#tEyVXwvs9;lCZo5FemtE0?aYMFP1GU znv$`2oYvITkj&YA!Jy|90$?z>&+~Y!L_tOndX;*o<8SwLp6?Ch+TX6F( zr}_$i^NdbfoST?@!?TCf-~XC=do{tcc>JT04yph#BO?sXYl?G9{M3|z^l{bS3D~$zVZ7RDdIXf4;M+k_weE{t}$y)I;h5j)4O<)c?Rg#558h4kvV~q zhBV6l^|iI0z0-)LGWI;EB zR5@`DXER6ml*{V_kWN&l+32Kv7Bmk>Y=1D9FjM#RGiu{(2DKFWhlPQ@@2>6#hYXWz zH^x798LyhkNpL?}T517gz0y!~QSia30sV{ybs4=~WbtBAk2^R>_NzAC@v8OnSn&Ft jg$t>A{(SAN_z%SYdu@j-Px87a00000NkvXXu0mjf7sFbm literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_player_one.png b/graphics/chroma-marble/40_player_one.png new file mode 100644 index 0000000000000000000000000000000000000000..a5548409b798a4083993d39f9e16322ba5743126 GIT binary patch literal 2502 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 IM6N<$g1|Q@y#N3J literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_player_two_swapped.png b/graphics/chroma-marble/40_player_two_swapped.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ff9535654c56c138e245a95f015e940a81f9cc GIT binary patch literal 2108 zcmV-C2*dY@P)y{D4^000SZMn-c0005u>00PheL5j9f00009 za7bBm000Gv000Gv0c~iV`Tzh2vPnciR9M5^*w=~`OBBZO^Af_o^vWASP*4yRR7{8$ zDhA9s=bUrSIp>^n&N&Cf3;QwV5$e>hpk}t?j5Eih95@>myLa#I>VJJJ)T;jLum9WU z$dMzZXV0EheERe$ynFX9yng*UJbn5!Jb(T?JbwH*Jb3URJbLsf+`oT6+`4ruT)K2A z?BBmXEL*m$V(HSQr9TR{YuB#Qp+kp?w{PEuZ{NO!uV23gps!xNN(S=f%a;ilECac1 z+qN)a!h|qy-n`eZ_YZrQqZYl53LZCbK}2M?wg15g*> zsZ*!YBUkoH@S)7~L2;bm$N^ZroT2 zNX6)-RDOE&=n*=0>{vG>xIKIJ6mB+KGXyn%{`>?wW5$dGc=+()S^;Hlb-=lE=Ta%f zp5F%!90+^&?hQ+pED4h)O$sAMjHnyZ3K4HC1hJb}u3T9O1Td?|WU;ze9|hyMDY5$W z>5~-X6>%-Id1dk^fC{rE?c&9Ybpjqg zemvDa_fd@T23xUWMVh?-GGzDe-9x)}?Y@V6`0!!Hn>TM#;k626WdJL*zPXihR*JlO zC?P+CW3rfv3OwZqU~Dy#`JIjHV~C}gA2euCMJ1p$)Y6sLRiFUClrLS}N;&^szI-_W zXOQya>M@zGb!_D^W?mMJo9)`QYw4QUSR{8>0=n?ShYx{@Po6wU-AFFP%%D_d+)BA} zAlFc%rX+FR{Ta~xuFsRso0sa1#IDDQG4yUc3k~7Q@Y(H`8qDimhy*ObVoXg#mNUxLMiSR+@58fTp1G z)~{c`DnJA4-!+vI@RXt$K%t@<7&9kM zZ6&BClO&3`g`pA0- zx9y_FGI!O?f4MkwBjo{#;p|?}0D)04xBa>oU9<)P1f{ZBe{tv$hYlSY+O%m?1vqiy z#0pDGuU@^vfB^$i6B%3abYWby)3KIaTo{M~6ql*sxL4-peX#@qmO}-cv0Aro9a^+# zk-Fm6Vo^+2p*J)*CC!e)`Zx-L z00S()VGw_Sxj8GyZGygK%a*CF(!S|6vue4^$=iyNBS(hj&6^hu8#esDCj=R1RE!!m zDqSp_6iuy?4m%G7(1XPs1IVbDUxD}*d(@*gsHRPuCO|F*$ZTPasfpDmjvF^FM2;c? z*4$M`HF1|eS4k`CKl(q zcX;E+k1s{3y+cWAX(Fj8%fK@3%V1eWu-TNDTmyN+s*nL~TLB6g1zEyq`|XiEyIwmx zFL>fi3-L(F3?>%2gF4xjRC5gMRtx4eChRUqErgCF7|!(SFZZUYl&#d-DWJX zxkd2nymR~SJJ&>jK=W#1g@_YPb{u}n6L1uRwT(&740I9^CESDXC zT%G$%lQFRv{7F4E)gBpKt=amkkY+B9#1+Lrf&d5BZ+&I%3H_&_O9%y7GEgoS;UD+D z|MnwJ6m$DlbusVq#2{G5&QUY3$NrBUswTTv*gL^ zw}R`~dqk^{bLw0!z?QehjT;xy{_J~dkg+sWaM_R{Ly~zTz@o}21SExJbKt;%Y5PdI mX3d&aG-%M^&%*r|pT7ZdsI-9!tc9Wg0000?mYDVhKdvaN^-dn~ED zx+;@N0wnP3fBxrxet&#?eEj*M_T{rmUF$H&LVfB*gW@%#7hKmWb{fBw$v`|8Vm z@AW#LpPxT|?)C4#e*OCK_w%~GzrTOH_x3*j{rBJcey`V^udlxU_4W1RH9kK-*ZVN< z+4*m;pWW`){GHeDz20NHH|mZ{CCL=g#}??%(|W`5a$=e|_H9 z-_LtD@9TD7&gVUUcHXaTt!$rnJ~Q`w>hG_$vOV+pEMMzvyN_xe&)1&oZhmiDNAvf# z{rkFJ_1|1GYQL+`^7@*4YkLOUK2y&|z5k;E#|$d-4d()yucH>`b}_$y|NayF&exs+ zV=jpE_0)$a*R|aw7aY#_J6~@e3@Vs!KQ}kE3ViBXU-xiZtY?5Z7w79eUW;}Hv278m z>p5R8`s1-|Y2)HR=bXeCrd1o2o@Van=XIUWds}!ad)yY%eD5tI zcAtOCe%#`A&p5qjdM@W{z7B-6cGGiqpL=`G=ik4-zt?Aw?xjjF)E;nI+V;HX{iYco z%|J;I-7;NuPgC%Gwv*Te!t}iqU}kFVO4XSSok1@x4t2e1L%&}0EOWP?Pn#!|`dhG` z8)GYPQ!q@~=ggK}rjUZ(nX%7*Z?g*mji@X~ZA!P1)oX1qi>oBmXC=YkW%t{)Z<&{? zcvPm=tW9!&%!7hH+XOw(-yxqT{rp2-+}&u0FKnA~+l=l*%*FD`6gPZ81=5r*lk9Jn z@hZ@`K$U_YDcv0IqdxEJnkT%lm8m4)yCAxi88i!5*~Y|%Rlrjirz>R@ys`z~6gY3P z!ujkcWRXgES6)vjg9NrMv!9=PuKz7Kszb`{4;KIleBkhDwdS6NxHtpS41gQBO*T@> z(6)b@8Q^?hhf}%oik?37=Vn>8ZO)YSs7;zO40R}M8Scz1)aE=llDi&74yBXY-IoM+ zkpG|L)wXuYCR79z#h?-apaQ)kJKX)7hqgO#)SoHg!2n%#`ubeY z79mv@;20(KP}GJ|7SpUKX4QG@W{>EUg!1aRxYRVOc5vZXU-De1*Ej; z=f*y>3YQV242uv%4y318lPX{7HMsI?;+=Ejs`a9>@RVUDh=Oe7dHB$>k{q5X`=1%O zIs^!QxBc#U|I;CMX8Ee}+CJk}75*VX97{U!sYE0srmro1HwNm=^0p1HHeMnaQgE4> z71@00)KB%g9Eg zr1d&sCv}+7WMDf0wo*D}e(CwASmCf;S~fo^V9nCX1;Clr%@4Je0P6HfxZ-P}o*9jL zFZDp&LRXm6Mw~dhUV+*q+j7~RI{8TEtq2BEX5YdY4%c46(*Z%gHT*XoPxzo ziJT7K`B@0TFf+%5RnCK%;F>h!OP_}%NhA=`-}wszO#NA;fm1DD)%v0^5z+&9W{9sK zID_t%x~B)a1?nw8obNfWS2dSzeSV2Nxgi1wz}$e-Zc!&v=)?rKAgeH%E%=f47!~YD zBXJ5Q=k?Cu;@HfazPoK>Zvils;WI(Fy&n2IDeG-8VFGQCOw+}HM@4>`cB;}>1-^9Z zrKVZ6@V>vl5wqn2xJt{n&+EYArq60-s;czd+8by)1z|+ff=WPsDvwgO=U|l7YLyNT znz^{cg#Tyi^4cOs+WqTs5lp6z%GGnvzRBG{Tyx zi#^}NWo(W>n52PYH`R4hCQpIID(i58gq*hS0dDt81u8YU;Ku9D-GN` zb6oHvq@62y-L)l1z_t3g!+>N~1jlMH-&Y3cCV~=PzpXnL^eNNb21&IZ+%r!1_t_$6 z69}8ELZ$FC_>o|wPDXVCspewRSEX*^b{z?{ZhFQXCbwacE`y-ugj>V}r#hQsx3R{V zwUX|EhA~w=m(5|T^@UKz)wehJE)wso9#`6IE7kM4Zc1w}Ud3!tH_iM-8TF z3{IeVQVVfe7zw0gm^-ECH!U%4Qxo8pWKk+W5ul$;zNnr-wYZY>RhpidnWq~4o6M@( z5F0bB4z-l=DQq}x_5>3tQbJWLiS1Oqk+)ea5jRK~=)?dU7=dJes@2Y6eW{doG2q#N zUvl%+o23D1auZeWnk$>g!rD69$tjsw+U=y?Hi9B~&YwG5YZACVTWPlYuEZl8gGNgk zwRzMmEg?`+8SJKOw)QGFvrGbtdcF?dQbD?zL^}6~n+a9}0j|7u&y57oL|CdlPWvHU zl|q`HNgwB*0H{*Q1W-3=IN5Bj)K)-l0>RaFY?OLBAt#QaN>qgf5;9|B`bb+!OG<5+ z6fK`rhNH4ZmsM;HtO+im_dV@D(nq{0 zIk#-@&D!4H=b>XqO`nj;R9qCN4cLjTR1bF(Tb&Q3k?>YoAXywP8{S$)RK}GUXA(R~ zKyc5AY@T#&RK2;yoNgFP*Sg|H#gq&b&FGs0V3Vv*iAoYaR`3(ea?`q3DpDyUR7nb% zVj}nQaR9RmbQ9NdctXOyn$w1=iG_B-FR_MBxu(gsiEZn4O_Mx&myDzuh1BoG8EK_i z?t}+Y7M_wgKS&U|u+$CMS{dA6H0hq-0*VSG1dCH(J7EgR^^>MpRd$@;o6WLnv(1BN z_WEtv(HSJk0!as(%Q)NFQuX^=Fjdc{ZG3M^-HkwV9>BMmQDRKVfkDWj&2qNc`{_A2 z)g%@0=DnD5cMV?JkhBj~U`^N&{rl@fPv295n~@U1l@?@bg!U#*e9$dyh2uH#&V)0b znds|!6egHhUz!OulK6>XbU{b8|G11hVbwQ=IjKUK<#*B?bW&L)D^dZ+t(Vy(?j)u* ziw8=$ZTDt_X3|=5SZ8}Z1oC)NO`WU>o4}F$Xx(YD^#G}qJu!@`ogpbFZ$Xfjglew! zwNP42YI<61&TpF>dh!)^<9O=+t6_R-mFigG1QVR!pGq_;_$!ID(|GC3%GKI)=HO|a zZ%jP}{AuN~U01@(n+YvPgs2fuVzJ?Rkg2eR^XB=H0je99RtXUCf1;9-=xK z{-r(U3^MK>s=%yDVlp|RO0|RLn5N?8xDovh2BL9htJtUY`MU zmV!jslvF#)HiFz|7ZAyPq$CQF+Mf_m8jEvk&P3_kiMFcjoa~byBnS-->VvAmXQ#-# z1uz%EC)l5qJZ>e_>7ttVEKQq`;JB4U%Bf75o4;PijSeMc4dR^VJYEvakdSl=Hzye3`SXub7D>zw!OO_# zmwJtf#V97!m6d6BmICRGFGeCn9LuT#vP$t4DWHs$Tn3S{_!NMs;ArYM+}6p~DBYTj zyPrD=xr8Nc8+*e6RmPh}x|;D)mr%5?K_*>pNC?%2b(X&g(Si7Cis|AoJlMpE!*dF*t|g| zkw7!KcAQYP6)DWJ@uqc?LJiaC$bojGOA#=M<)%jF>RG$Qgk+=JVNWvDW~Mx4sKlS- zPX?GIgBpi;5)51HWc$!cBaH%~sx-fmPEW?wTT?4x2px#)0P5{orLi;@EGN<6GSMWH zm9zjUPT1gZ@8HkQv(`0~CxHNZz^PHvt&DejV7o5&J;m(OvUkHe8&xUtMGm^8LjRl# zduupUFO+26-8}F%?xet1CpOw*N2Hf=KBVcT;BMxb+N(^$0r)CQP534u8k~ug+6?bV zB$4@27wlVXh-B1M0CdAC9pvEtodiDWyS=qE%{}GXeMrWa0=RpP?eI$mYouhq6>wEm zr5Cyn;Y-<7 z64fOAl#~r~%ya_B9rjBY(G(yQ^guvvil-&gO<}WYEpJ%i*2wOjV`B!T0{6TQ*IJW& zdI$_gvc7HqBwK|PJi9m6t;$L51AK%~KC}5J4 z-np$23H!7$XTQ~r%N+SRTB3e_e*U?CsXTD^<=l8KNT#+CRf;&)-<4I(M3NfIBxI6f z-nU*@I+8~-{4HbLvM<6mJIu8)lu~kaJE3GNP!!b3nfSI7Q#jrsqEDm`Xt6rmHr89a)FH;niL0A z?I=k)eyc*}zuk~#r0s@!eQc$ATGOrh7uf@8QcL0HBv7|a;tmoyUke4mB>%mg=)^IM zl!rI!wi{bXN{_jqn~4NBzqqMyI88()ukJ)F=k;u}!S0^6EeYG_JRu4-Ca9#696>{Z zNKyeNUc^p9O(~$e17cejQ|B&`2aRxW!a|!lddl>YHAArYCVRiNu-)Rp<4WAb+@(@M zUBp&ys}Hgb+s~5e{N9HBkcQ@-9t-L z!n%-+=3LRHiAvfSTSnu|Uy{SwHvI0&oka1g_6c|Lt9#TMqi;Vu#|XEDOH^P|LpiZ> zOeJmVS4$lTY8KgLb2RW1f`%xc%;2ZybrZzkFzaMQo+dz=DHA8CK>}k_Vcpu3&abEK zjZ$?y1)d$t)u!R3JWn8VGRY<-yeqR4uuo3v*Kqy}GIUa53$_$bA^xwf>GvHK-^MkN zwkpm0*s$R)I5*i}Dj^%MX4M7I%=FUN-{7s}N8;9sYuZlzgf!DrjpaW`5EYEb8@OQkqq09_@h2}@+I~WtE!B0nq3#rDZ-D%CdaF}b*$>k9B-0Yjm>;<>sbz?g38_@3 z((mq?ZjH;`!AW2imry9L8={ZsrmPe*O)_OCBSvt=b|1NM+UF*_dY5TUi$`hI&R77Bo=S^dmMB22ZkrQH7jBnaRwB@J8Aa7s8wa=&qcNP3q=11kH2t%v_hZFs5 z2`81!+>yZ};YD28!FVH?==B&9@};OM;E5Y@0f9gk4kQ z0U<{S=6W;o*Oa`eG*5?FW3cWrN(!H-#%^Nztq6uZ?(|~nT-X||)2k5&DhPIEm@x3vR){u;+|7G zIpzXk>l^Y{21rbl(+QzE;?x&6rffY$nW#%2&Cz9D-k|#W3HSLJz6Db|-f7 zOKGy4IafaKtIJlD7^!NtpxOSd*n^W&+f;qXGjGhm(psl#OlJ^O_mLb#6Gl+-a}LjI zDofYub7NLNKgUDM6LG-Y26V6DCsrso1*lkO9Ttu*10 zn%5ms^Ul{~yx(~}h4HpT(7Vq&-S%y z((l^{2gkfNql7e|rc!XrN^eL%VuN~PP`0h#SMZxbrN!yD&zvTm+|<(yf}}%%CP@ji zeF)%w3qIZivvv-VF1~~n{HrMWLACLo#UBZbHiD6!=`QQO(6SI*V=TL;?&waGL8)Vj0OI zA}Quf&zW})Kw6zCIA-&|*(AnDX07!9RIGZa4=x4l(+TQ=W+F3g%S_kz=On;flkd%_ z(6nGontASL+z6s$`luaaDvJpFxi!IW3M($CkzP8o2HsV?ekYhJtc_r)jje104V`O8 zRV8VPq{$>n0^@??<}c)krdI$>>-cGJW@9!^hs~85%0`k&ir+1iwAd)LksRd6A(x(IVpMNR_?GomszM|vs@4!12x(v=V!7(ylJQg`GhAS! zdr5T(oJ7gyfkJyWQ>FD#jlJd+BE3`;2P5-|n@-y%xakar+;~p%G*$sN{o8h}u2FaE z$855hWc)4Z`6)$^|W%XOoTc`uBd}sfP%YU zWbBO|a3t`m17=opsn3w~Nd6!}wqTGN8tDhRVRUB3qon4Qzb`Ezw-Y~QR?g*a8cJ=O zNikki^4poZC@Ck`59Zoml9L?qgI3_ZQ%|A9g&T=dGpgFn^`K;#}O{P;V zEJaL%(&4;~2PS5h1XFk5B$CI?z;Bsdf{cD-fVAg^1i*xA{EPX*ZSyKqCv|;_<)$9F z3ExVKQJrKnc&ZL|I-QfSm}K0YKg-+FNnzFpHSWIM(E2l{hWkbrSmMF)pr+cPa zsMLGT?h04oxoYdy#!@9@G$T|8%DjgU4P=B-a&wywgPElUS>!1rn@yFjByxd=%5tj` z%ALYgzbz3eYQd?6tL_DDOGq1C8DFW4-HDB+49tlYsOO)uESGVsdo!DJTQZ6~1KJx$ zGr)G7E{T2+jJ2`1NWLa?K3Or`5d(B5q+<`2rz$NwTS9`$Y`+7Vwu?>my}7=?#2OO# zpt*0G{U*gT-FRaot>&7>6K?1l?l*`akqd5p5pmY7*EIb}=5`5zkva{?Tx`njT0xU$ zFQqmZio=rkKcCxk!<4FxNthwU1UgI0ZQ~JvM~4f2et!NDWNnx|T6PgFKbHxr(r4@V zzf};SfwPrla;25J7Y@55JzZ+u662s7H5(ON5)Mm)1DUrb!nLU{ZY#Hy+!eh}Rd(Kz zIF0jLlO_Ma0BNMA(me@)-pVy1$k?Xet>~m1K_ew0u>_b8Mu{Vk(I%JK(Xz`e@FYP` zGso>75YG^z`0NzK-Dhet+w@r!W}Zkq_e`B~j|+sP@<>?dhAGo8GW$-~Od?Me)=n$6 zhp7E3MpTg&jiI@dIzNBT&2uW&dShXy>a5GwlI5cU`U%d`7(=_@-^%c(KEqbWPcexp zNVL#I8hNA2B@L|726AVK>Ke&O;CTI8>UDKl-xPO93M?+uN|vSsqa-7Ygj^!yf~rz` zPW?aE?vYGr)c4YdOf4`}s5IGgQg7l0oNWPUhod@RfBU-=RhT8grtaJjI}STjJzv!1 zDK$hZm}UF9Bn6gAu=%^6pPwtsoyZfaG))6vD#4Q~51FdjrY{^}s1Aze09EA3t%7=6 z&HnKOp=FIq>9>&8G>AD^KQoOdL>UNAvsV|4+4!WFoU|^bIpT ze|}S>af&MHwHqa1qJ*L{yi}$u);IkdnSECGV#8!xh3f{-Qe`Xg=%8hzW1-d9;l%xj zrL5YAO^KUIXXihY+LqLz^QcnCH9pcHnKlzK)SiJXo$N_gC!HW^Xn)(R>I9}IXwnQ! zB?&p{l-hD4cU%Bd0bE&rl6y~Pmp7q#Y*ecn8q?}7)r!HVB9EB`)B|fU~Qc`9S zf{Ty|u8&b27OCuOH;4QD1j|jmhROpsWqeAdh6rcS?08ld3CngBgG*Q%HKx?`oPrc3 z!(3x@t3mi910=)8q!doA7Y(`KPBhp3-)4K;&2zFtl({8s4ynC}JXAL_cwYC}U)jzy z({d$EcBp3DB+E`RU@GcK*T6faE-@oghjUV?A(*P$cg>8xbGoCS+pPsR)890!6Ymt4 z1U5EZqi$g(G^h%Pc!(miX*>Eaq~p-5r;g&C%7!x?UU!s3RK5; z)0^bV;)bkf1E0e{8lQ;9X-b`jO_}6M7$TKKp3fP$rdHo}zh`Nk)PzsMgp7{8zP`S` zqRDvkyj3PdO?9>gXO$%;@m5vIkXEmhg`fW^ThT;j-mFm-#1;) zA0@D=yJ-XMmS&PVKAqf~CrG0WNM)rG!{&zGoj0;N2-4`?&BAp$Z)cM`&7fT=vrQCC z;vktpIo2`>o01;COH!<0)+uCsZP08G!77D6;MIA8I94eL94(~k^1Bc}j zheIb2qSjg}sh_RxKQSX>crtweNEVbbpkyO?21M!;KmxgA@Z9D|r)1Jm+*0*M?9q`( z&2&QgtefG}JhU9GlljVC1~HNSlG^(eJwqOV3XC~^vslglk=>RRR`x8}x7V^7E$M1~+nM-or*(e`~(qdg>gTdS+{M zeNY@u;ikz3AsJN>7>A6(I%eM`H*VU7ik~L?aw}xFCSt7l*YQ?eTq&jlg>I_sg+ak@(=^9`Ab*s1stgMIB?EBzuUtw)&pRsHdb>lB#mD{^b6=(}dn&EDFj$hDyqbHr8Ct- zOLm9qnkK>EO235ZP|L?O5kjzBQlh!C%w_v&ZKjqB(w;@vvD1B|EO*n&v>kRNXp?)> zSa7P=xrV(Z4s=e+KfwlT2~5)J?R0j{i|=T&Z8vcCVQm223sUG2nl)bJuiBiuF%W$QUnr$Sfw0bWWxK#GH{as;o zN)l?5p>ktJ>GUEC)iIc^Y;dnf4$Ar5oT<>ZVN?6lEfKJF7Py0f%)b)iPX(nWKyAr^ zvX`a7iDu`{zJUs-Cb@feXe4o8#~HYa@Y(3}?FN2-e@h7-s_~_0Z7PiE{ngF*`q@QKLX$;AnHbw8cfG6epl+Hg_dxcgzu3+NiYZ1w|Lt}w=GPE-#Ha& z>N}grB^pSZshQNnx8XQs7L^hzBnT2rEV&al2ObeLNPEVuA(9~`A=Y$IBw7BnhbOK) z-`n|tlQyF*a6V}vk?e2V7_ZaXO>;O;i;d-?*rE!sDf4Nx;!@T}m_t%_D`JUcfGYSY z@@mUe9LDH+2~)P(DtnWxF2Mn*a%cf|waMCkRY#08-2tQ;Xc+BxW`ZdhlrrX&`6)GdkI65AtGAxx@r9Mdlr??7$j=v@Ou$1*Rnw$wIbWC_UpvgGyUnQ_R zb#G*7ROw0#6+YrjU>2}&-W_8WMmI#CG^SkG!JX+Eq zz0>?lWq3=(+*ATvkEl~p--3)P?^SZ4*7*kRyXI(8I+Mf1F~cn^;FNTnTw7{{PfhF( z$?O`yp0;dIiG51axc4Da-?Y4cr&PWnAxQ5f!TcN!azjuk;%HOrZfp*32spxKHY_MT zU{ml@tv^X7iX23#dH9AbazhE^{wJ?$l3}_%)66E*_3=2?>1H9RDUGI=M~Q1HT&R&& zawi@c+;(0Qw-07hwb&*cR4MFA+S3;#mAr0-)0N!hq$PgC?KDU#shc((C*S2-s_5E# z!7($qsBVaPkGE+j(#P3YMv%kxyf1Egh{6Ljwlvd5%~aEqhWj1uOah==piapZ8_wwvZ4H<2hF z)9Y09_coECK1=G>pR(x*tZrDeWQ~|iXy|)7Ldj+Qgw>;fw=&MzGQjWe?}}w^TSy$9 zw+Uf1sz2)95KOGm!z2NMw2LJolU8oGS$soUCRik4flmVrlcr1hAsY{p_9kqvqxuq? z;dzQBH3UdH-ES9q3W9`DbBfj~i=ibU$qtlQZ*mAso1$?_Q@+o%U27g7#O^cU<5UK$ zxlV`mr9*~PKrOLE;RP2!Q}y(t5jugpq@Rr}gbn{A*^4_hTO39;MUp_|vMzNJrfWNK zKSJuH60RW-&SqvuxXc;bDU#9ncBl=Nlz&u-=LA1nQ3a>7w-FKQ_uSfQRn8R==&~&b zIg!JG1|G@|JGjPWo~_;McJEHLsQEfiN?WP+pW2+sZ&op8DI1&{;$)jAv9P`WWaS(- zH3`}M80TfNeSXzFkko`oW|xe1%Ib-Wi%6G&x z-~FN|=Jt%$XKOMXQl6$m@|}B?WVD+5N3m#?fo=cIIbG^2yzQyR(!z~N(iRkTh|)}r zV0X6%;l=>Zdv$*AA+ky53p#&_#vCb4PY_k-jjePN+-FaqW0;z;wG+!Cn zN~gG)KOj z5KN@TJ2)i8xTwfQL)wr`*mX2GT%P=XA{ZNiUu8Gz4m0;`ACfLohSUiSs6~+m|5drU z%?36e0|~g@Hf>ApklwA7vb(bJ9SoJ)lO~5W^>gZkKi}^pT~7SfjmD8#*rYmiBdygC zekr3(Z7j6>Zxmg&Yjbc`662r*NvkAJ`~7ZOV74{%kOf2=J!!_69`4*2TbZ2#m&)i| zK-vTylI+jc%uF+|v>0e`a`(G=&qQX>Ls4x|8t7@`a`U-VHql^Oiio%=m*2@E6{OLs zG!eFybO5Ab2g0h8pCN%SwQ|jP@X&FT8DyLpw9BL#rQg{w>oQGMGEjh<$XB_WKQmHS zer*A6l1vGgQ}<(@>do{AWpY!tuKEfoK%K_DNXe7>A8!aA>T7$0XQkQn=DxWyko5U& z0k0u%6mH&PmS@$K0$>AsoY(X;Jw{1gIAKSw9B>PABUe-@+?IqJi$)gfl$)o3tqPnf zvuGQ>x9@FPbL(72F`Gu+x6uns2Y_=k+|+@H&g0oJpk}2BJd^?_(ROTKHw7%}2}6Z` zw}9tFjU9`t+G(%{3_VBn@#mNZPNtpur%pCOFeLel2@g23c?MT zO@QB|^wO4GluS?~hNMJu<6c|!;HDAO&pHTU_Ohm|A_X014M6%%UG_t-jlw30^h)9% zs!x%Qv=N=mhVV;&KCOywlSL%SDAmF+d-b+5Qz#EJd}ySmL3T+0vviYc2( z+Z(u?7P19xs-3sN5ek!5YirA-6c$aM4e6wCB{VgrQUSY}+;DAL z8W&Uf)9{ep;reVKJ#lz}8E&36gHvTf!_Imf$jE*ZWA@4OGA)qNJ&TG;RJC ze5bf%!sAlIdunka2eUGhcaR6cwYJx7n0Yt8nX;fQA)weLJxsP|L2Mz?8gTcMl7b{5 zIVaX!cKTNasBT^=N8LiE(;x~@IOXh9HnGX@t4-jtzpWQ#53acJdzR&onCp})6EBEyH97YbS)~R`f$O|t+jcGJw#Gl1&;Y|s+rX>nhm~4H%Gz^NcNJl$TJ|&(jxgT zq@F6uwknNBrL3G7w6q44%88p;IWq&-x2epv9L}|2#y2dz^3QM?ohsKFe4RA@Ce6$Q zx!kNDMec8{rw$FhBN}>SShNikwi{!HpdOt z*B&q`GgS9zeomK#(jxC$nMXO@mu!?EcH=XuW33n15sVq5zplZJ%3vkPp8ZXxA(~(YA zw-{U2x%q5OYs>6Rm~Br)48jRaG{LF~Bt-TpZTiIKljre{icL~+Y4F1alYAHdyM2aF zN?%Diu*ndSO`>Gb+YQ$~XtDqtK%4H7O3l+@(qyNJc~+<7=CR=*4_czrY(gDKPR&Ja zsx&R5%BcpgB7_#fXOkuC7W_7Hi>|pXlR6JcS|YplEXs&CLKY3QL<7C+eSF9m5-F1u zd+eGOX(O(}1nAst`fO@Y+BIj=a!+jnb*~)$mI7xg73k<$`aRmfOib0)SYcvyRS;FB z8p$e%{FpOkqQm;mLuLzp?SbPeAljxx)`o+D2pmHXC2FHU$L7xWe#i|@hDS78QxRWz zHPAqrMz@?KwoB=6<~~(0a-yJ#;dBR03hM4Topz!w(5Gul*|sAiXvyDZ4{gOj0!ShZ zn@WI`lLYrl6_8qQBy*#U(e0#=(`{@6J^5_z{ya_jM0`V=&TksY8&)u-%S|ICvB^x$ zt@FK=ixBnwi>lt-lvRXi zxFK5Tcw0K9Z=~TVaY9+jIa#9qzRj-R3W3st-oXu9nMs<-se9V3gB>ktT{fG1Q|S6m z`!2yMPKJ-HXP1CI&4zWENg8ISy=_f!Q9;94yXBPib2V1+3GN~4ahdiYZU zH;bV025G=n;s-*41s$)WnSoOLpdzy8hTUd2DdFM%KW%>EH=C4N)IFnioQaKV<*#PX zWovpwu;PD3u8;|agkQRYGvSqllv2+v9U!SRR~1N;*fg0Uh01zSC7BzACrDtU4bmDG|5)UB2 zK9OrvB`wLuiLPE6rBs~{#Dj)ZdTC9jvbqskcxb(y8Y?N5Lj_bxS*d=H3MW$5jBHZU z3PLyCI~b|MKB*b?ZI4(|Jf^S+8Q0nlAo}?dhSZuUscr{%h@|gtYdUo%sORFI=}qsQ zvkJY%5Z%GJ$-5;oB#A2j8GmhD*U60RwgHl1x|0;5Cgg1&7F|%pbXzUb1~+oA)3~>( z>vyHA`}_@lo3P6pA%o_1nlhE*+774O`bJ4B$<10Jc;c2}lK*cGy?+5aD5twk!?MvL zy-~h?NZFb|bt+Mlem14h>Gd`oj4nuJE2$nBok=8RE@?p^<#EcCT13Td-8fj+G- zY9yYBw3dt?=no4MzeGwiH%>+--u*qowtu zIp3F>X(@9ax1n7i-|qR$9_PX3a4%=*HGl4uxN`y%s_gxNu`TY6DPV6uyBQr(M?pk_ zkmlc(F{4?V^KNbIBvYx9hOcj3z7)$zvz(UbXrBuyS1EDjN|syu(QR}u1$0`HHGs8oHa-JYmq|=p7jUdHs3lH_pAcR#~1IZ0;+t|skI%Q=uL*M+N8!JlED&qS7XcvZ( zOmhbZ6`-Y!{bcHiRx3m}xJgo8ulW#$?qtJK218O;r65h2=euI= zB|+LW?lihl<#ptWVvyfyP9=l-t#em<-x6j^%J41gX=a5L{6Hj`+`;CEwJp%ngSMH! zZz~?hiqpX6@X}^>TH*Uu_d~)zT3m-ngOkOx^-Hy)jkHPAHAN?#!WQIyXV%(fPfhSk z5WvAHV|Q?DAaz)aX56;^d{LHm_(KV?Ikh)+^A-W<9F zLYP1QG;_0UU{bijW_x(c7;c0H8C!EVg`UI|du!!=2rkq5_&UsHmRs*^nw0U}dSVdE z&iR`2V4)g%>6+C>Z}yN2g8$;4H+p;2Nb9!wJ_W&MHascCwCn33o!iN>Fm1eTF})*u zLjm+;cJ9gsYG%{O{cjAV3jVLnduH2P+0|^2ZR{@{I*mGZDt%|>t478e42m+8BoHSF z{l}od-e#2@OIi<8uK} zEs9NH*DV-z^11dR^#GgRMHh(LuWi!8P28v;nzE(_R41fU(w}T}^yV`@?`N`)P3v-! zAg*F)@kNzQH$m`R2eZ$XOd=_)n-E&WCnyO(%-4I|0&#{q1{eNr$o9^y)sPpsDU5 z@is{7P!s;*qPXh?B)CB8v1{q^v^ch*^zHqdhD~y> z6dBSgfsjq#D3fg1u{#Wiu!L%pAZAY~b8uC|c3)eY$$xQ}H%u`}Vzz94-lsH;K}I}@ zYhSA(l_rQ>w&|*lA1v^V;nB_Ml^%4SC*I(o};BLNnXi-j5QSZV$TB*S(j!S58WQz838e zAPl{`{|^PU$tjx%kVc`{wad6tr(rVb%}wQ7>Sm|d5hZ&l(X(MA^d2b;Z_|Twf$v<< zsYPKb`80q&-L&L+sD}7dS`l@Vq?Ud&1VFk8l7h=ELFtranu_j5(n{f}q~G`Tb59x; zSHY(-EN@v`=YEwMsNH1B1l@1Jf7SM|rTEhhvl&IAqk9CvZ+q4#9!g+{rhM7vJJbDX zB-@ply(`y|lD1#Tq_;aY7d^Gr)z z7yKLnqC9)k#(FnnV-{Qjp({nZV3Y3B*d zs%BINj!&G(Eq)cO9dO<-c=Q3jPGLfLxQ%gZ^x`(guV24DzP`R<*{GORHKDMP25ECD z{7+q9`t0iSe|>%7mYeNa606ImYk(dCDvMJ9kw9+0ncvI+Cl;;x;AW5ARtl4l>V1b0NZgHUU79dara~n9bBBi` z<&+qMyC+FC-nq@u!1^w%F<I)Or*pBkkaf-ySjucoJO%j`B# zUIpD|xO=|WoYEj>Rn0-z$eF#q|NZ?Py@6>pLR`v7piWG4dsrz_p%F=NUla040npvM z?X#SRJH@vfokh1Nn~Zd82B)4XzkmP!KVRTPO*i&_l)`o;&uyb*GPHKBGET~S_70vC z1RLXgvccN|Qu1O%4~;?zvTegF)hXRLPEl~4jN_=_n)(tO zd&`+kIjqXDt0~)Xkib@+Y+1PTeNBPS2_q!K8Fx>W^nb$1(k7bOH1&FREVv5@#CtX! ztR$dsq=z~*8XVv4qqO!~LTADrZFb%!S45fSM+SI1#?>@Qk_eto4MpE4gJxpwmo_@} z%$*>#D_baocxJR)R;j@M?Y&g*T*|5vPDY6lnn`U30`-!;5#mUY11Wz=W~V9@)y}l- z4|N@lEM0;}+?rJwXX^{(vc^`?#g)D3xjclaRjKg5@Q$Dk@&9Us%%$vU(W=ZeWqdAU zY^*?&e3Uy3npTzukD+*B@|Z}^m54-;L$D=S+<{E0h$Mqg{!1Avm9bKU6V>Qz^eCIm zK21S6=_^vfxWo3@ZVJT(2>7X5O}52EFe!)WsbICudZtXV#WV>6dE}?Lv1~ws?1$n3q#&P36P3c^vN2Y!+hH?5@u>024LlR_-fp+=Rbw&FK!uBI8zsIB3j# zXhy6u#5RaE&&Z9}xwfO$i-p=QY!ei>OfWb=^Vfv3TV z-c=H5PZ^p~sgWIr*`*Q~iaM?ZhrX$*{Rf%(a{m8{BmNogxfXKvxHxQ^roo!TB?fvk!D9WgEnt z8G71CH;c3hG>(Z%*yK&S0mbQDpi`w{gFmHvnnnT>+efthT!ux~BEdqb(_V8xtJ!AP zla~5h6}IZ0wcDSG>>&M=PI0E$Qw?F3RNHCUONgB(Erw?PHi4Tds1Qc9IrSZr)THsQ z+}WmJHjIv7AuZn1&UDgd_GTQ6LITaqZQ9@@lU13Os~*(nZKp~cfUo{vHIO@u^!9LV zaK3lGR1kOMND9u|eM^U_J4l|U93U62($=k9Xc^WfJ8VFES1P-*!Sz590n`Lgr;MC_ zUXra5+=;X+H1p3StDhYSO`n%qr`xkmiYHE@U$OI>)SScp=vX0zLYmB;3S&5ONM&gR z<0XR%N!U1%vD?o*1n+C71stY9aYi*NMwMlWqKkWtwBVg{nhV;loq`?$bfK#Sdy`eF zOl6ylNC9yhQ&a>>(x4=82Q_u4m>ltGA-)uJyt9Ev(psnH>o-IisWuv@h3foK)2!|1 zp2l=1&G)76-!|j6$|Q}qEoC%QpleFE2D5T3raJj=`UU5~Lz%Ws`G?HCCelRx8X4!BE_5F?Yg<7Ys$cd`21ppb#Dpdz8+VEm)`tXU z+IvLHW6}US$qpy%NgjFv?3;x#4-bd^ZCK1Ejqc>vUB;n;R|2q8&z)YodQ};aetQ|H=wI5YQ_(^9Fi4CLj#&Cf!Wf)1>A!Vc6 zuz9*+H(nid5hon0`L}dR)Au;(dSHtj4cC@iMOfZ1+QQnBG4f|7b-cDslHS)U5jgDR>G0=HEY6f1BDh|g=P=QnC zAwm*2csW&Gr=BSaHX$u%PK7D?zoeEpDyaMM@$tWs_^I@2Yzvhy0R^GAu{FmCs_S#5 z5()P1cL_s#6C~RcjbN~<3`uZ;D?KK*;xe{PWjJA-+ceF*RyC)dSmoQV6NjdF8eJ=? zaI zsT4}sVhc34W1NCE7PGBkO&nXR(v22^U)h26B7lJ?Dh)O61xG{#I z!P5zW-h8Q(+WE>jM>T@8QS9qR6PFDHJ(Td+<6=9Ycjf}q3TsH#TO@3{Tk>qC(p zYB9S&*o*+G1DPIh%><1L9F9Or!Hy zNT){3BW2u<9VOX#+XI@k_K1i;TFb=oFFixj+oz^BTvI!h^KZW%D#Ypf$EetW!X4vie+pi0%NA`FQO|!i z8qdRpm_4O+NF=9-?{Okp2$7VkLPchg5kRUd`s>%PJpgVQ1ZC({;7LZtYH^%k_4)tX z?{2=cM9{zm`j!QBn9nvx>J+Qhb8#bNY5_Xj^t`rqEUY1U5_!?|Pd42O1guXwl_?0) z))EInY(!w{$4du2^~ZIumnt@u6{j{Ja$u9BEL9TQXM6qsL(<@F6Dd>lM#Ac5E_XWt zlUX?>Vb0I7d50vtw7Kpy5pXNC&;$&XiT^9>(@nfW-K*qp;czg=1`=GVnPRwMjGOZR zCOc0;7G&>{UfZOg<6xyG2_aS5_HXCGk%%i90F$1VYI;^)80xi@I00e4NMK69cT#F@ ze1a80MA~@%#ngx^Wzzj_+ZXj(##F@s4;Toi`>Y z=k|c<2BGX6A!?chtPX}o;iCz9WQvAr29hk>;c3mYAO|oBdhzD?>T;%g`?wpT zGCL>t-ik7&l2(04GSKff-1%=OFzw0+Vg>2mn@oJ%er=1-sp+J0%wadwMlpE}Q^jki z@J%x~f|t6r;j$Sg8Ag>=NZ@L`esA_$t1i8LmNa2PoCH-8qdsRMmYk&C^P=B3{7Tsz zx+tE8lxgFy`ke+(X@W{}r%xrZ>V+dET?#legP|n{2@VN_Cr#$bkmqKD&M~zcEL7d& zt>uJd4Yz^-RDC+F!L}u;v4C)gWGYW-x^$oBvwi05qLMgDjn71-HwCVw z3QZo$7L3wDApz74%%@D4G-;Dkls2z!wt-2Nn*^4IpdpQ`DWhp+^GS(M#@FW0oEe4! z+8gFrVQ*=A$}y|yz9kIWWr7r{NiZ6T7j$2c=c)G1ne;s;Elh&nWNeyJjy7SEvN%bj zw{kffKIx>n6EXAOfB(scLs|x?GDuPddAD3@;0(8@Tc{%8aEknDAcAJos6&+EymS2| zRcMO0HT#ZOTO`7R;B^F-y|H^}CS270dIi7NpUM}j0)z_4o3Di6z^mgO7?)auW zpbLe_1yP@33gS0G@MeTdsmf5r@5I6p^&gjwIGsG#$LKc1=5Mk+!!%Yn`^^a4Kz*rG z>8vV}nVq`N*=ElPgH0G4!4O>>P;tX`e2^0S%-Wx?udg4OpWDPv;dz!@@1C%)zkhvw zeSCj^|Fvles7gf=DE2U0c}^^ewDu&yhell_xsz?c{DvX6+2MHz(a}c|e4J9x=~qJV zSoh3de|~*^S;Zh%-LxbF6`4(k!(30QYG}F^QWn|}O=Oa*StE4atG&9x6cZkL=0Z-> z9Jl&fR~Cr_8J? zZz;I1u8owaje6KEV&Eq<20lDu~{Qr?_@Dcc{9A;N#=}%VFJ&DXA0N^@q7` z?JfAZQ7WP++_=b-($|qPX#>yfOI_oQZD0#j6A#~38tFFho!R6q4%x`AZO!=&8Rmit z35W!iR07Dp$< z4awA96a71Qp<{v1Yj{+2o<>3r$aHLC8h|GKOU-HJFtx42hQyO9&iVIEhp;WP{zWiK8B1eW-5eHF zC1wjID%&7VWCX)&NH&!j-C$a-Tq8j=9q@EEn`E&q6qHK(?YWW)gldh_p4{2{x4q`$ zd|A_%Vt`yU-yWuO2;1g#6;9F^LZ`*PwYjK_)wKrEOh#oHbpDfM;&gMRtaV$=jYvRJ zgrTs6>ItJFu?gdQ1(q{=xb=K)1wmVEj@kz#?2?dZt|LROqixV4b)UE~T0&Y9nB;K) zc54FE0`w#mci4prti%*$yY_RDe|>#f{EEDfDpzUQ+c@+!&q8gc#uH-0%#!?AI=pD( ztiz3{u~akOmoTy$j91+g!uUIdn#PSS33HIFk-EH*N};t@NF-A-H~anj_s3@fu-lWM zT?ABg;lKa>`}1F0j$@Hd=aytxE-yv;CcI`s6q;#KMl^nEmC#^N9|MNx= zbo>8_8>s`Jxo=8bbnC{rff~sDxIH)plEgRmKqB(U`qrbo1 zpjWVSB_>s!-cEkUN}co3MC)*C%Sd*M>h~P}m`>j9Ua4zwcv=dGuFIa{sHwp{>F6o2 zJe7lLIwL)wcZ`=DjNouH*Ic~aOZU0Sl#yH84$q`P*|pQrF;4Y!YA?+-KmU7_u&E1D zYQZVxX!ig~S&#zhe7G%Rwr$YuH7P!GQxY}I-b-k~HLAMypc}V2(!$i}0=BFt#VFkz zvO4fw;3pomNp{_lXOu0c##y9_N&DJml3VjXi4%lWb@#d*K}%0YY$?PGxc&kiJyf~b8XG(I?8f~m|6ZTC-ZC!wUk{1K*vcGw_?xIyt zQNcA$Iw++NH?v86D$>bJT6mlsKRLnY{c#@7DF6|@x%qWkm2Tf_)S?>&8ESQqHdiyM zcH06&D=QcHD27ap!L~!}X0j@=wP}*9xtH#9w7kQgMrhX>L0U;@w%|56b%Ix$kxn|e zOl`BroB>W5HMy)n1)d48JH_R#mx{KNr2acvzHjF4O}mb3bZ?n$=Vj5ll%?A zBWfOQK_zdE^gCNnPR332Kp_F6ZE9An5h-h#5?M)!CSjcEly{81QUW0i@~wLQ8B%EWx!L%cCxq9apjkexO- zH+_go5hs;U?->6yeO3+8aF)AdKAW8MDxfRS`(5H`l3(r+xltP;4(C03IJCb%s{ zX=b-USIv9fs^_Gv@~;4>BD(YXC1tVO(8L>;p1vgLw!tqg5LZHPNy=JMPSYmoW;Sy&y$#{iPKA(r z;AV{zhBkkPm~$umF5P$X`bp-U=rp<@NHTNkW|m6be~}TVQkak;DHEf9-}JM$!S9bJ zh|2D$S@rqnxu6qnH3zz9IYlLdk{E-+iQ4h26x8Wraze7({Ufu$EtW!6iyMHP1i$UQ zrv+v^RkUS|Zcd#vKs%DhN$IDmp;2y0@>A5GcpjSnVjj6oIvOH%JM5LOOTxKRss2ek zI?{jJ!fJva9d14!-fZBeCs8}|7@q<}F2ebse7=O|AgeH$-oJa!W!oUow=gGjxDiTQOBU9+#O z6_Zs#@GMtf_u3tvEgrkcp>2Vn-SAE3zYWqiwh&GOlgLIndAJ+zWvXE0K3{^g8lq(j zTq#zZ>zUx^RBZR5T5~l0rLJh_zY%}ol##lLLKX&q#lq%TUwL+?YqD zA$PKP&mc(3?*uo@0e&ZBK(aNW8saj+R2Di5giQ~R2DQ{GMB8&zHwOt8DkwF6(v!fW zIKB#!GghQI>2w%ABmg8TJY_DfB-um_sM(S7)=j0@yIBg!VB8$6n(I`C&omfq!9AH} ztBtPM*{u|DEU?p^qh|Fjw&f1HB!Zxz3D+97Wm#?G`fGDL5e|j3CgF%AAgr=PdXT!V z4w@x4&C<^Dat>E)2hh3K9#uZ667a@#Ez#YnEx-j5ig&0Xec~d28!XQmSyE;u(x_>$ zCMRm^ZIQ^BtsJHb9&YL**?%@u1vBGQL1p5u4W>&o?$qA%&Ox1A<{F%Mlizn^kvCjH z+Ouxor{L!jfTvYWes_`}fx58LTd<@YCinE6-bj*tCK)l8 z{iTNIP0KFbhwZa(zO|06CKW@gTI{k*n$@>^i>@6iltJ6YNEVvliT2-|n1*ZO|NZ;- z|7Czl0ffpCHQ;BP!L%$h30A7*!v(S%fy`FUpAsolHeZno#M~-nZE3wENu|wTJAED^ z^x(?vcNC3Nz;i+YjdSbwtrdE~U9~cb`aR(I{S%Oy{;- zC3~aENU5|HA>&ejqGO%&b)2p498PEso+RmZUfTvoJ?iGTheS%SG((vlyjqAf`*K+b zk;+#f`NR&Bc{wRDsquN6oixqT)TWW(GHTN%v5R?M-FqpLtI-hLh#oTak}}%18X*Kw zI^gHMal*k0^P~7VS=$Z4;(|CKf9N_t#XA0AfCQtO4U&%PS8XE-(@BHpCy_v1zX-6J zSS1CfZW9W`kxQ{!DXZNGpnqY8-L^ZW&zBtI=5udHEJ?GzJ0Q2o3dOvq1Jn@>j$Nf$ z{Wb!)ok*aC+V>P#xhjyfmfRIYSai+1Zd z+)nfcvm`-*lv7h#Iblgjgn+Vigy~n$x(TE-<8`v@im6SchP(H3%7(11hIk;^va3|w z&(caE;d-=xl<)=43WAb$jn6g_<52JO(DYNC9Pcn#n+O2iKrYQrH=DMAIL*6+9ks!4 z;w0`fxe1SEMD6_k)+0qS!PL{YVSYCT>dpgYUe~-gj(kyv1?r&u5V-4 ziREZ2rCxuZ8MoRq8YQgArH17ry9E7Wr3Y8p2Hl|8ddvmTVLD3 z`p#!jSl~_RNl2{J!bFlT*POjhf^3Un8{IhpqKKfc8WtR*&vPO*o<}gVka^GZjU6BwWtnQ>|@7`<2>DDE8TS*N`@*NhB&V zk|;8hcCsygxapVeaH68FuGx9J=D&zJmtH5pe`=9!U^H#q-7?JP_Z+>Ru!il=$$Tlz zx|d#D+88N)rz*PY-y2cZ#4r;ue=7DQ#$4S$6#$e5-?lMc+JDaG)Ey{Wk6Oy68=^sZ zTvIq?3k*&Phd$5${`>DQ5~;DlZOFdu*}N0{C~32;xpS>NZrWjjl%In(Vz>sHwy830h37oLkD`nF6T}hpOo@8QM08dOI!RR(JB#l_5%yjEmZ%^vf1GTl%FdzWQlZ>ZkPkvWGek9ehf|(B%SDLGJrUp zxi%cqGv-K=gxNUp&=W&d>yG-*sL!jsXkCCL+2nRes5Ov$Ox$&m?0P#mlGb5jksFh& zbSQj%ec?cs5}lNA(YtyGyr~plD)b)5)hq7+l{Xk!9Z+ zkZ;+?l=W?mu1e!>YXnx=aHH#(n8Gc)o)a;yYv4wasL6s<`8?r}8|+p+$88);DLvDv z5=x}a*QVLyc1Sna^42Xt52kkS{FnsUNR9-GlBQY$=(`i0;5144$Mvugp@mmq-^3$l zYk~6V*t|^CD4Q#FTy{m+HFb@OTxfba(=>zI3`w|iBQvO(IK@blHs$yCx5W>WaO(EC z(m2=FpuhdBV)9eQ>&7b`W=VTUTPd}TR88$Ou78+JGktsvK~#bRk;Z0vkz0w7gas69 zMm-^#EWzPOTkx7JTxuy%Y#kAJP2l>Jam z>ulS5R0frd#?|j6{Cp}Hr4d5+xgEry)^1W-NmE^}WytwbCo?q%g(zdNdH6hyM?h+s zNCq|=I8RRw(uqzQYl)bn+xXjOPF9F1Fr||;3CJe5y(SAvrEjAIlE%`gm?u$SzRhOR z=V_Xq9ros`8A3p97^tgG-tq29&(f9TY40aLV0S>Lz1#}3{8a*{6RXKw+=PkS6lo)q z432=XH|cefe0Pg4;am;i+q(9-q5Kpen^SjdMcIN|${rF_LO|}DpQjrrZC(dEsP&#O zT{mOzpd&>9wk0m{0C7yV3arF-;r7`Q|DcCzZzYVurLrnWsch1XAJMYdi5a*uAu--( zdaZ(rBSw;MLjr|Wd67npT5n;;+&V+0wD7436zLqG8@0uK=kuaagd!8tA(#UFlxj=+ zQUyt8oJ8P=rk|0R%+o}rAyw4pR8`aCG6OOcKZDC_b5M4ZmZtQ?ZluR)`al2u`}_MZ z+>vB9YAng6`R!@gr2o{f#7(Uvb~35+qyv_ghVNJcB>^e8 zxRvkv^v?k?)l5e82fP8*;I6rEU(Uu8<0a4TAl=i0bfrw6$a%5%`)J#ZiwyiN* z9R!L1P@`dPlRJeG*G}P1@R|9lK-(OmuB4n}XSWuij#i`-8;CWLnkWx9#&pP%wVW-JcH=Smw zw~LgTL>ZZa&TW~u&7-?AR?UB>!)Y@@ay@ut95WFmE#tbu3A3k7%?96KzFVtKx_08! zM!%<~S6r6d9H42vKQvM*KwN2*sdRtCtCXCMis;l|mbOo%ndD|uw`Dw;j&b)wVN*`% zlgy!RWyrP}Tlm5O)LS6g#3EduAbCDiUotg0JE9=rUTuZq7|uj6szcPxiBmEntu2Z( zD)C{*P-CP0`36Qw^!=IbTbq>)U>PCa_xCL>;Oy6vlR<}@3TusUuCA&r0V#+qt zjJh!aclYK7+^5Xn2A#bA-)Zc*``$38DVt6>l_H1IT1`YsGuxdQ+|)DLG~y@q`MHly z`_v|x`jG+Ba*-M}JC$FOrKGNNI!d%{id0rMqdSz%a;0Rl5TIF*T7Xm`_!i$(0U_NF z8axsdLdPCcRYNr>iJG*Um2aBc30Xp0lH6xjiH#d=O!uw{_@qKp?tf&8%YC+o=xsH@ zgG7Gfp`cnV6jL>YOOuNfDa#WGo(L0#6>d^MX|Zk$nQJ27h^mBh()&XMFA_d836@sB z&M8JG99yl0mXM%Xm}?j(rJuuvn+%v@#A(fw`%a*nM)`SDil+{IvkLfOH<5e{NEzhP zROJ(LdVQ$hrC_Ry^jjI^JT_X8m8wq=ne9Se8BUrDR;@D%M@&*wbc5b}IcAo6k2unWOwUlT-QkXEajMKe;e;~?B>U7> ze%+BC35ZW#ABl-2P5th7$Y)ApW9L-Jzw$mw_$F0_BCTcrf&ri-nS`f}e-Y8^><^HrjJeSQ74xi<0Il(ji= zj_rL3ewNr%^1R8EgbFB)#MzdC-X7p;-KVLcE$F1|tDPVrm8Bwx+ELxt_a3+C+7=kP zsK{%jjKhJrvd;C0 zgGta}d*<_Z+@ZOdBc=AB8@;>KML|DX@&idMHG#u6=%69kl6OdoAqlhm+-|^TqD=!| zDsvNFgynwHs=q;S_u%hh&dF5RD|DtsJhnL4WzF5}8M^>h7#c0- z2w?AUJY}lw@JH2pKs-^@WdIw?q&l1iPD-^s!7^&@m&6RJh51(ocyoHDzN9&A;7%DQ2%~Go?=Av@Y{)vY^dp<#k^u*|L#Un~$?P>4`);X$^9n1f&!s_bwg!%EaCU zhcq^t4zqWKM7R631!M)$Y|qWvL8KnoZK|wwJp4-$x(yOeg_z>h)`y z?+NLUx&mB(towcoUAT2<6`>Qck%qxt5F!0r>1R){{YK%Wo#7?orzz8L?4pv#azMXZ zbgtZMyZKeN@35cqb4>hfJH=bP?j5D>G?78DZDQy}2opE#e`0Jm9yv}kPiY>~GMem< z<{)eKi;FWfFFM*1-6g>|Q>mhY^VUB}0?F(5 z(lETc)*CDSM@f%FXEMZBuvy=Sg4S zCAgqVn}Z#eOMG{mncFs4vTI}bZE?+iJ$Ja2)4}W>+1`h z{OOcb8RYp|gsDyjIt14sxDa8qxAC>DymA5NU3KCn!*wu5A{|m6p6Ve?fqEmY607;b z>5{D1Tr+O%6AJ~>hnRXZn{t!}NH@+$0vrjJ>9Z1ScK-Y0L_pOq5`Wm__v!NHFuN@{klE%2yjB_2mVqdCJ4xv$&)Mb>Cm7(? zkLUvWynjh2(cySxUl6;@1RszQ)&!lAvYU#VP<_%wSZ-_aAu>m#6{Z<~aX(M21W9I; zN}A-3m0a>#EUh6rQ~)3b@hafB`Q)TX;$-I4iR+X+=td(Ob@MJJ80FT-IV*u}-KA#k zWK+<#3Z)I6rgKOjx+ygY22WYz=0IrHXo@ete*OA*oD}+op*cq^(y2{S;MX;6;+ZNC zkk*Ve3Z|NARpz>Fy15vYMx0~t)O}0Vi!N9>F;M~_D^CU$1gUcI+3u4{UOKPs)U#qEq6{wX?JaR?Qfh(i7Yoz*FBG!6+L=7&?NP$RTxal;ZUZ&wpIM8DZ9(JX8WE z-FVy-DcHm*mC3b>`rC$ctn_y6^Cl|Y#4RY^T6=C{o(`5cCDcv8%&6O57s7Pa{)4%lF* z%KR!>v64A!GO^N#y^?k=Cl7b_sBR;avpL*VO|;kZnO*v6Tq^|(Wmo7xe8&P(Tw{L! zyn$(AH> z6P9pUrYe^D|tTVmy)qLkTDW3u^vj|*_K>~%Hz zR5od+1(Gq&ys}Y_Ym=m3OS8Lq8wj*BLeQ)Nf)8}>9->7HP1cDlQxga=S^HFbprqmR~ z-%7%UwsvaIDcyA&XA4xsXIE{w^u8|p-JHr&#^W$5_4|p;XdJ&bCOfgNX=E<>Ww=9h zdluAwln`ajrX;17T6c=5a*f#zS|J|3jiPchrbe6_6&Bi5IqDEi@1Zi!XLGneGe1%; zwZV^oy$yKU3|EuX+RY!5w4P*sE&y$Ks%w#%Sdh9;6e!<*HnmH=3xE?GN0m^nZG@;u z(`T#5G^ZXzAO=SqB`a4NoC*0uDz%i6Q~Z&Z{Ru;Egb%i7@+dnzmH8=S;uLh$tgH%r zn;+|~uc~|a6W3B3LiyRM8|@mDC$8k&(rAe>pP$Nl6Pv0IiS+)h1!=;Ow~nA}B#ZxeytvzluP6c(EtBlm$8X^vhiJT*Db?Tly&JQ$|oHXlF;B)de zAflxW3v_O-ZDfqH#7YQ(2zH)5gYRhCZPzyKLusi_F(jhmtH9=lnWeu&y-!*xD6$5q zAOayo=;TP6P)f${sf1O}Q>}L*%kKm{6pWVE=MCGh5{74H55)9_0JRB_-e~k!pAR{` zs4g8<_)v>PHRBRCHkDaUWHdGVZUlwfT**gSWiup;P@9902NbeM*P^-vh>vV5TG6Zn z*H%V8rwfP)*G{6TtqO~q#vq>|N#W7MijEK_a`A^Tdh35m$`3ccINx`I!33apa_;U_ zZCI}@jZbPg1dP9B`&=MU{t_t&HBN7{yjE>33Q{2Q@MO#^4bk5;@7|X4M3sAHYAr@h zL{`)Nq1QJLlth%cs>4~|l2V*tl$7||4&{f)NGG->xjc~>Q39N+Y-tlIrNOFIr==uK z0=vm(Y(!`0INlcgrs9h0qfB7*d=8VfB*saEH70tAty)OZ2~3-bGOURKP7E%!`)m|g zX!fMCNVor+K-IGH?)f+qF_)45{{8#^CP656(HQ3_fS07q1fwA~hshOHqB%xhL!eGV!Io8 zFH#A$#Ntf`noR7~Z1b%m)1M5GmYO7rCm#)^*i3_6vLigN-^tQbuUwj)(v3*eHg0v| zwoFjnE9VHNO3S3YdxNV)r(ge_=^>@dkxb*Ovh)+5QJsB@v4ac;e`Zv#aBdUnpLlPa#b0Fp9jiuX0_GF9nufrXZZNt=+i_7Jo8TWml5yBaSg-6HR@^oBF-Q`oA`;OQ(Fa43`>y!M0nR(Jy6ojmDY}kqor{Bd$gS@ z1;2##rsV8tf>!#F#IIovOrK>_b6OBKDP<*z;dS(UVv}jvg{7UjEHM5f}Z%#wa%D|0=rgg9htJ2^|GskxzC}OeE z;@>0z+A5x>NikLVwx##4|Ns8}uF}~}rFaIjDaYO}4x-RPNRQP2r6l8TN41EYky|kB z@3eSOvspKx&s0UY!_Q&0NyNdij;^uV^?%arYQh1ng(iVUsEIwDHKv$cGnUwzAQ4`| zWq+^Vd75bM7VWK@lllOPc|7q$Dhs4=HmWw_MuX1mVP-6?NW<2=>?Rl7K)w20%@BMd zESf;7us;fWDE&sKnBz*eN!+B0#_47%oR^e$x7Ae&w$9a%!dcGrtWkt-v&GvULN}44 zUh~{VT zP1SqSn%m;WwwE9G0aR(*Y$nPYZh=+>mgIfvu(ZwHEa3(>z&{!J+D6PyY>2e0&{H=# zuQh#jwB^H12;5E%xSqVNVYn5XXy%{QxFN}ST$!7chPL(WOrV;wmI|ZLs)5`WnkAA$ zMBP7ifIN<%Z~@B!$!fDGTf?bnqMB)yRM%XPo6m#`@Cp1+*$$a6CcTd5JtU4_ip1H1 zUZYEwT;3*AohB$!mQNI&o-6+8@ZGwn6|*F{9Y0+ytR5I z4j@f6xiXpry|i~pMWJ5%xdFtt4={s>^7BaY^-7gSZG74nqzr=GWQy`DNwb_=d7QFJ z>gRAvqTFQdL`RS=a$0UHt+?APuNgU{Ao^w%k+A4?W70BrVyh=Xs1C{G0_pbH$&{1E z<9AwRT3F>q2JJ~{c>`WYZXGOu%Ug-h#@D3d5NrX(Or*lH&<(+<%9yh4$FYg3bXAJB+ew{z@@Uqhf?;A^m66iM1d{Tw6TL?1~f8F4nMwWMM<)7=l^eqr^^6cl0k(> zh^AwsG3fq{nrr>l2dGX4x1h-|ePfxO57+6 zb_0+%EK)7{?a)h&z^c{5398ZzYhH`Hmk!g~u)btC)sP;PJiAdzBHrF=PbI1P29Kp# zpdvV0-(p$;y{`L7pyCz;XK9i~$&w^CkwJ2cgyL#s4l>O@yPmofoL%OpM)Hzha{`xB z|5hs;O0u3C>@Ts9E*n$##fdZ|OgqW?Cp?SXr$h+dynd<_T8jdgIXg0vV8^Y^W&7ot z^nZvU5L)>L??{xs%LG&tbPE)x3}I$l8r-*13adVgvzTu&gINQymW$5P0HhcYC ziA_B>CbmYs8YX`C_4O5l$yr{Vy;CZ{5GCW+qNZ&!lmuu>sCf@b;M=gqWTdVRJ~ysN zH+d?j)ZBWyuc?Ajq{`W>oLt^!U?T?zT_Y3+O#7Es6K;N)1i=;ybcd>XpJ(1sr=r}F z4DLe_VO7%ZKuhFJ4qkbRqzoeUpq;%~Hv!3&z)p>Zg6u9x5VdAkqHG6SBd6t6i&)E!isu_I31!v|*gfWspsmfS3 z0KV~-o%ejJJY3a78g#e&LI@=l1UDRUg9WyE{$@;%XeTyM3CSjjXUwf0r`s2Qi6PJp zmih)20KQFSG-lE>NYEzDc`}~(;9s-C+WW|b~bHEP&4q;7$4juN&QVHztW z&FHC&yR~qg2c4R|COu>cpL6@*gjqH$Z#$$^g0dM@se`2T;7$9Q#sGrtQK5$knGqaZ zb(=hGGa+4I2eBkv*Htu-bS)9qXEy;xfe;0B1?p zjAz||yig3~)=G z-?8AMn=+LhN`5@4^-=(P!~ITyQ-y17$`kI-l>NCzXjf{G%#UQ3?s+x>rs>+~^u!Ea zjR;19M~Frp$!6N-Xo}Ca2bt=bO)Pq=$w#y?9ZuN>PU8QpFnnciF!#WdKKM3D)Yv<^ z5`=8#*$YU@+(vn0V_Ubt`pOEo3~WvuknVODAezNaCp3saTr0Od;P21CDfS(~r9b!yO#1C=?au8edlv-<~)FfqU97;`wV0LN-xHZg5he+GC;h+sVhDHP) z+?bxit4UCG3P?`Pd;4t9^h2E?Wn$^FQy|Gkd|dvPlIxm#NV9k7P8S%432p64i)J z!A6z3v!UAw6u3Zx&gufJ^w+H>A5@Hw!>4+`l@G`1U!|Bj&d|} z(2nXtpa%qzd~=7`%#!EzO@-=IYSS72Tjh3o&@?Q!s$!a~k{ryhq~Vz=$qBdG$|(w1 z&kVD{2Z=ReiufB&lW@+dYQ3q(xB%)JZBzeOnvLB`-L#=oBkOtHikxUNLANN=aK19b zYFNixg(JsEl4qEvXk3|3y9nIAO@{Jkdl#J`A{_`WxuH->WA2{*O^sf@{{8;}BZ3mI T0)G>}00000NkvXXu0mjfIUr&) literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_star.png b/graphics/chroma-marble/40_star.png new file mode 100644 index 0000000000000000000000000000000000000000..727e289f812390689a36bf41573b7d51c00b378f GIT binary patch literal 2115 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 B5t;x1 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_switch.png b/graphics/chroma-marble/40_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..2393f1a4c45d462686b307247adc085cecd64809 GIT binary patch literal 2227 zcmV;k2u$~hP)y{D4^000SZMn-c0005u>00J-oAM{1N00009 za7bBm000Gv000Gv0c~iV`Tzh3DM>^@R9M5!nMaEiO%#Ufnsd%5BKS`P5p?g)o#OJYLQ#FkHVkZm6t@09oA#f$L#`SYd;6DEv_0Qc?NSMAcJ zOZf8TOB4tIIx>J~fbmX22=|$9jH3yTNmYisvQUb5^brtaxajBDyLaz~D_5?BnKNfr zBEW6iwpF`#?;bm5mW%?q5XPNBg5r)~Cq@APsswlXD}$?DyLJ(r0O==4Nn95Ms~F#31s&>_A9n99=t zg$&+tzkK;}IDGhU*tBU=4zRJYvD%|Yk2u-4Z{MQE{1%{bgCGIY2PNLWe_uDi0R=dK zA%ii<(Rx}QMRhfK0Kn6yPlpW~Hq>0)xpU_t28}20x(Z=Dr`p@ErKaVOoyMHaaByA> z!1IL*7sADh7x8S(#l3pZiLB`Cl^-KE;A{;q#q{f52d-pELGEEYiLERES z0w10u-WZGf^Z)>H^Q>93Vw|d^%N@^Ufb@e0uV23&Hg4Ql{!g=a$}ySPoIX@uV05DLxx28SQUVG?%at5!|K(mYdnaX0LDOs zV`3Us0PNVYWB)hF(W6JBdvPmP^fwv(^5x5Dy>sWzg=y2KH810{X^Bs*tb7Yr-eH_Y zix%Yo_wL;ri5h^UJ)Ll0R(3~iAlUKa#}_4$4eKzD3!cLYgbFeMn60JZ?Afzn>eQ*t zk_>rd$C5t<$l(3^_eU3u962%!9z3|9 zlQahV^yw30i4ehpt`q>o!j~>xiZNJb0hHgfXHN{FQKLqMp+kojNkZo1{(1A})o6x^ zFgbt(QprCTMQge&0YrcRgAcKydyZ$%o<%<6%Jvq;7U53~BVoPAj~|DH3m4`H)~{b* z9XN1c6aYm?s@8&*?!31~L`(0 z1R}henws*NmoHx)Etu}OQa9@!2Fv{PgM>*8`bfG=O#HwE@EO*aG-*=d6?b{glM=V9 z5ZRA+vLYr2xNO<7DtzVu1h}@kr%m^+zK5$=NqFZv&cq}dNrsDAO{Pql(oA7WFn+to zPJz>prrQTY#f`g}>lo&tAC(R3cjn$253XFfGRB~T(j`tnZaYne^e8Po z)bzbEhy~O5Oj}B69!3EW2EfI|;nAv9t71j1Wzt=j=P2BnOkPBwntQm!Z!%Q6vbgX< zrUyi3vGt>wOjvmQwr<_J9N^luYh$^k1&ys#b6mw>EW<3JUG2>_;t+uY<}DT@Rtg2~de7ZfttkZ-Mt zOivmN1+y7TG7p7vw!-BA7c5xNnAKmSO%f(Fz!?ZY3QS1UQ!i>js7YE%&ja0%Tm5)Q zL~+VD_Agw#M+xR3#IU?)i5Z5bjQ++{{`G%D{0G2Bo}s1=ZmR$Q002ovPDHLkV1mPq B8H)e_ literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_switch_shadow.png b/graphics/chroma-marble/40_switch_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..4017091bb46d99465582dd2a51824468cbb4c435 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvq!$2{HZc4)e9a0HEbxc~3bJ;BFk^1U++RS!5KkA! zkch)?Zyw}iP~>qvm|=ZQ;oJSIT(6r{Yo>AT@%AhBTXipUw_Mn2Zu2tZH6Im!N3PlM mY$GER7VuA8qTZ#y&e_IsXR^v!*FIsO`3#<}elF{r5}E+8S3j-* literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_teleport.png b/graphics/chroma-marble/40_teleport.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0f2805a82f433ba8ea5ca5e516999754d55bff GIT binary patch literal 2349 zcmV+|3DWk7P)y{D4^000SZMn-c0002+`00J-o3T9lS00009 za7bBm000Gv000Gv0c~iV`Tzh3qe(-@SYHe!Y0{BK@Az zty{P9xO3-Ddid~R9-i;sy_;^|zMY@%-@l)pJ$sg3y?T{izI>UUJb9AeA3b`Mf3qiO zUA=lWUA%ZPUAlCsM91&eKYsi;uQxnDfBrmww|4vX?Y~L@ef;$4Q)c+|>C*(P#jjt# z&Km&m9^XEE_>ew-{+!3hj~_Eg!&-Z-2NqLc9z1xEzuEid&71V@-Mh^1+qZ9-2711k z{eJfB*|c=&(o_OSGMf<(f~1O><~(C)4I)MD*-u-c-=1e+& z{(PRjpF4LhUAS-|)37!y5t=j`AtWAzTC-+N>d~V|1;86OZe;0b3xF9jW~5fFTBWva z+orBvyQc2lyJv|yb?TJbwQHBUbm@}cd-m*^>ej9M$I-lb^VF?dw={I<&@_Db@HA=C zq%?Q#+_Y%XqO^MT>NIoa%*<=foH=RFo;_I+1X{j)dFtJ}ce#m42B1Yi4I4Hr6I-xg zK_2tw&C3L*PMw;jPoJJ=W5R?9e;l)C&rXXMFXr%R@7}%X@ZrO0-@bim|Ni}X?B2aQ zo732~ZClp-i4!L>V1kvIm~SvKHTUb+FU_AnKNDmoEOYG>CmA=d9KO8?BvOl z*&kU6ebHTvaNoHS;HOTV%KIpyef#$1CJqhqvymf5W`O)C99`%m@Hc~>0!etmU;qmw z-V{Wm0g(3V)vH$l&_X_l0FVO*4$NV018@L0ZQ3+7Y0@OssZ*y~zpHArXwf43?w~<~ zvUXOkT$zp?J5~w`;13))PzKPx5u{x zL_Vxlt5&LAyLPoc$lAi&0t`U{S-~SwrsCEGQObc~F1G2bH>-0_1n1QB<#5wJPt8Rx0|z zsx$~RQ&t8X&BC%}%d%BU0QF4y6?u+Tssad55n%L`BA!c?07@;oT0m{qNvN5mp`n&7Tjsv4GC&$-CjFk@ zXz$CHFX_jRA6eKiUuA%QGI<1vUXg;z(oEE1k)?9z`63UBYKa>NM2mS5z^z-i=2?m& zBzFN2t*9PR?*0p)bsCkiW5-qiL_AJZq?Lqe&<2sFgSIJ3A0H(lX)(~1$fE`t1eJ_K zdwes5D*|F20u%vSr|OItF`@#XA4G683;p}|&w#>TBKWG$SWK#7U2v$fpih z(UhVKFu^E-z`m;_5k!Q60YB@UN$@BEZLtNR?hR12ld1B+njoGJw;&ZA9=0FKB zz6YeHqj*O4OaMSaW55H;^q#E+F3v=vSY{{zq*i8NDnp_LfcCuW0|6v4f;)Ha%qEG# zPbfg*&`vO#pe3LpnpuF5_AqyJHZ)ALapV9{u_ytQ9082>o5p|$t*W~UK7a_sc^N1g z6cpiq5(^%n zK@2dOiz|@uKi}di1f!s51Xwf)!L-%@OE@#S1OQMUS>}U5NJQym1c}9@;ya{`8wTs* z5-2W?;_fCAw5ZgvutW@sh{IBx>{y6Uz!~@eSmuNB8Rh`-EoDaX1%w8RN5!}ri4&mT z0SoQXj_+YwK@$EK*C8RGb+pY20nl%Xf?QnYgH(^XF>2JPTw6T{0E4!G4D*<2G0YPt zkE%oveiw~t2+I zrG{}tC8lw==v(o6&Ythzzh~{EMe`DMSsqlv0w6-#bAB0D6A|IGz#rp0K_k}04H%}y zvkh9(Or)9^@ovV~9@^(dXbH-)%Oea!dr>`#nu>f#x*+V?_b_uLY#NFC!??h-E_^QT zV(>Ej9sw7(8(X$)$>p{LkX9lUMD>XKx)_KOL?nvNNV>t8V39_c&>RsT_d5hbBigvQ zgA7Z=^)n3)88V~-pcLSCNqJ*l0HlMs$?{!?p=lN2hU27$L4}c$HgDdXpC$CTR?~Ru zw9VE!DWaiMiaSErbHzJD;6$({TJbDaA>G+at)fSqduMxQ=?vUz{E{J;Je|AF`ydie|^ T1{V&000000NkvXXu0mjf&LLB8 literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_teleport_shadow.png b/graphics/chroma-marble/40_teleport_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..724ecd8d2ccf6f0a5dd93324aff83235db0ad137 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoMi=$=?n}^5ey8>GZ=3A&G-lu zWJ~gPcVYMsf(!O8pA1r#@8(tvqyvCT8yMa#{v-nuEbxc~3bJ;BFk^1U++RS!5KkA! zkch)?Zyw}iP~>qvm|=ZQ;oJSIT(6r{Yo>AT@%AhBTXipUw_Mn2Zu2tZH6Im!N3PlM mY$GER7VuA8qTZ#y&e_IsXR^v!*FIsO`3#<}elF{r5}E+WF+bq| literal 0 HcmV?d00001 diff --git a/graphics/chroma-marble/40_wall.png b/graphics/chroma-marble/40_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..150a460c66b3e17a887f058b0f1d216000920cbb GIT binary patch literal 33733 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