X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_em%2Freademc.c;h=d377faec89fd98e68a1becbb6748561839b18af9;hb=baf962d5e9f3e6622a5575a6f1d57676199f91b5;hp=ed86409be6b36cb92cb6dfa944128cd105b2396b;hpb=5b0c9b194a5a219450d09a84131d4feaba5c4ff1;p=rocksndiamonds.git diff --git a/src/game_em/reademc.c b/src/game_em/reademc.c index ed86409b..d377faec 100644 --- a/src/game_em/reademc.c +++ b/src/game_em/reademc.c @@ -41,366 +41,314 @@ */ #define GET_BE16(x) ((&x)[0] << 8 | (&x)[1]) -#define PUT_BE16(x, y) {(&x)[0] = (y) >> 8; (&x)[1] = (y) & 0xff;} static const short map_emc[256] = { - Xstone, Xstone, Xdiamond, Xdiamond, - Xalien, Xalien, Xblank, Xblank, - Xtank_1_n, Xtank_1_e, Xtank_1_s, Xtank_1_w, - Xtank_2_n, Xtank_2_e, Xtank_2_s, Xtank_2_w, - - Xbomb, Xbomb, Xemerald, Xemerald, - Xbug_1_n, Xbug_1_e, Xbug_1_s, Xbug_1_w, - Xbug_2_n, Xbug_2_e, Xbug_2_s, Xbug_2_w, - Xdrip, Xdrip, Xdrip, Xdrip, - - Xstone, Xbomb, Xdiamond, Xemerald, - Xwonderwall, Xnut, Xnut, Xnut, - Xwheel, Xeater_n, Xeater_s, Xeater_w, - Xeater_e, Xsand_stone, Xblank, Xblank, - - Xblank, Xsand, Xsand, Xsand, - Xsand_stone, Xsand_stone, Xsand_stone, Xsand, - Xstone, Xslide_ew, Xslide_ns, Xdynamite_1, - Xdynamite_2, Xdynamite_3, Xdynamite_4, Xacid_s, - - Xexit_1, Xexit_2, Xexit_3, Xballoon, - Xplant, Xspring, Xspring_fall, Xspring_w, - Xspring_e, Xball_1, Xball_2, Xandroid, - Xblank, Xandroid, Xandroid, Xandroid, - - Xandroid, Xandroid, Xandroid, Xandroid, - Xandroid, Xblank, Xblank, Xblank, - Xblank, Xblank, Xblank, Xblank, - Xblank, Xblank, Xblank, Xblank, - - Xblank, Xblank, Xblank, Xpush_spring_w, - Xpush_spring_e, Xacid_1, Xacid_2, Xacid_3, - Xacid_4, Xacid_5, Xacid_6, Xacid_7, - Xacid_8, Xblank, Xblank, Xblank, - - Xblank, Xblank, Xpush_nut_w, Xpush_nut_e, - Xsteel_1, Xblank, Xblank, Xpush_bomb_w, - Xpush_bomb_e, Xpush_stone_w, Xpush_stone_e, Xblank, - Xblank, Xblank, Xblank, Xblank, - - Xblank, Xroundwall_1, Xgrass, Xsteel_1, - Xwall_1, Xkey_1, Xkey_2, Xkey_3, - Xkey_4, Xdoor_1, Xdoor_2, Xdoor_3, - Xdoor_4, Xfake_amoeba, Xfake_door_1, Xfake_door_2, - - Xfake_door_3, Xfake_door_4, Xwonderwall, Xwheel, - Xsand, Xacid_nw, Xacid_ne, Xacid_sw, - Xacid_se, Xfake_blank, Xamoeba_1, Xamoeba_2, - Xamoeba_3, Xamoeba_4, Xexit, Xalpha_arrow_w, - - Xfake_grass, Xlenses, Xmagnify, Xfake_blank, - Xfake_grass, Xswitch, Xswitch, Xblank, - Xdecor_8, Xdecor_9, Xdecor_10, Xdecor_5, - Xalpha_comma, Xalpha_quote, Xalpha_minus, Xdynamite, - - Xsteel_3, Xdecor_6, Xdecor_7, Xsteel_2, - Xroundwall_2, Xdecor_2, Xdecor_4, Xdecor_3, - Xwind_any, Xwind_e, Xwind_s, Xwind_w, - Xwind_n, Xdirt, Xplant, Xkey_5, - - Xkey_6, Xkey_7, Xkey_8, Xdoor_5, - Xdoor_6, Xdoor_7, Xdoor_8, Xbumper, - Xalpha_a, Xalpha_b, Xalpha_c, Xalpha_d, - Xalpha_e, Xalpha_f, Xalpha_g, Xalpha_h, - - Xalpha_i, Xalpha_j, Xalpha_k, Xalpha_l, - Xalpha_m, Xalpha_n, Xalpha_o, Xalpha_p, - Xalpha_q, Xalpha_r, Xalpha_s, Xalpha_t, - Xalpha_u, Xalpha_v, Xalpha_w, Xalpha_x, - - Xalpha_y, Xalpha_z, Xalpha_0, Xalpha_1, - Xalpha_2, Xalpha_3, Xalpha_4, Xalpha_5, - Xalpha_6, Xalpha_7, Xalpha_8, Xalpha_9, - Xalpha_perio, Xalpha_excla, Xalpha_colon, Xalpha_quest, - - Xalpha_arrow_e, Xdecor_1, Xfake_door_5, Xfake_door_6, - Xfake_door_7, Xfake_door_8, Xblank, Xblank, - Xblank, Xblank, Xblank, Xblank, - Xblank, Xblank, Xalpha_copyr, Xfake_acid_1 + Cstone, Cstone, Cdiamond, Cdiamond, + Calien, Calien, Cblank, Cblank, + Ctank_1_n, Ctank_1_e, Ctank_1_s, Ctank_1_w, + Ctank_2_n, Ctank_2_e, Ctank_2_s, Ctank_2_w, + + Cbomb, Cbomb, Cemerald, Cemerald, + Cbug_1_n, Cbug_1_e, Cbug_1_s, Cbug_1_w, + Cbug_2_n, Cbug_2_e, Cbug_2_s, Cbug_2_w, + Cdrip, Cdrip, Cdrip, Cdrip, + + Cstone, Cbomb, Cdiamond, Cemerald, + Cwonderwall, Cnut, Cnut, Cnut, + Cwheel, Ceater_n, Ceater_s, Ceater_w, + Ceater_e, Csand_stone, Cblank, Cblank, + + Cblank, Csand, Csand, Csand, + Csand_stone, Csand_stone, Csand_stone, Csand, + Cstone, Cslide_ew, Cslide_ns, Cdynamite_1, + Cdynamite_2, Cdynamite_3, Cdynamite_4, Cacid_s, + + Cexit_1, Cexit_2, Cexit_3, Cballoon, + Cplant, Cspring, Cspring, Cpush_spring_w, + Cpush_spring_e, Cball_1, Cball_2, Candroid, + Cblank, Candroid, Candroid, Candroid, + + Candroid, Candroid, Candroid, Candroid, + Candroid, Cblank, Cblank, Cblank, + Cblank, Cblank, Cblank, Cblank, + Cblank, Cblank, Cblank, Cblank, + + Cblank, Cblank, Cblank, Cpush_spring_w, + Cpush_spring_e, Cacid_1, Cacid_2, Cacid_3, + Cacid_4, Cacid_5, Cacid_6, Cacid_7, + Cacid_8, Cblank, Cblank, Cblank, + + Cblank, Cblank, Cpush_nut_w, Cpush_nut_e, + Csteel_1, Cblank, Cblank, Cpush_bomb_w, + Cpush_bomb_e, Cpush_stone_w, Cpush_stone_e, Cblank, + Cblank, Cblank, Cblank, Cblank, + + Cblank, Croundwall_1, Cgrass, Csteel_1, + Cwall_1, Ckey_1, Ckey_2, Ckey_3, + Ckey_4, Cdoor_1, Cdoor_2, Cdoor_3, + Cdoor_4, Cfake_amoeba, Cfake_door_1, Cfake_door_2, + + Cfake_door_3, Cfake_door_4, Cwonderwall, Cwheel, + Csand, Cacid_nw, Cacid_ne, Cacid_sw, + Cacid_se, Cfake_blank, Camoeba_1, Camoeba_2, + Camoeba_3, Camoeba_4, Cexit, Calpha_arrow_w, + + Cfake_grass, Clenses, Cmagnify, Cfake_blank, + Cfake_grass, Cswitch, Cswitch, Cblank, + Cdecor_8, Cdecor_9, Cdecor_10, Cdecor_5, + Calpha_comma, Calpha_apost, Calpha_minus, Cdynamite, + + Csteel_3, Cdecor_6, Cdecor_7, Csteel_2, + Croundwall_2, Cdecor_2, Cdecor_4, Cdecor_3, + Cwind_any, Cwind_e, Cwind_s, Cwind_w, + Cwind_n, Cdirt, Cplant, Ckey_5, + + Ckey_6, Ckey_7, Ckey_8, Cdoor_5, + Cdoor_6, Cdoor_7, Cdoor_8, Cbumper, + Calpha_a, Calpha_b, Calpha_c, Calpha_d, + Calpha_e, Calpha_f, Calpha_g, Calpha_h, + + Calpha_i, Calpha_j, Calpha_k, Calpha_l, + Calpha_m, Calpha_n, Calpha_o, Calpha_p, + Calpha_q, Calpha_r, Calpha_s, Calpha_t, + Calpha_u, Calpha_v, Calpha_w, Calpha_x, + + Calpha_y, Calpha_z, Calpha_0, Calpha_1, + Calpha_2, Calpha_3, Calpha_4, Calpha_5, + Calpha_6, Calpha_7, Calpha_8, Calpha_9, + Calpha_perio, Calpha_excla, Calpha_colon, Calpha_quest, + + Calpha_arrow_e, Cdecor_1, Cfake_door_5, Cfake_door_6, + Cfake_door_7, Cfake_door_8, Cblank, Cblank, + Cblank, Cblank, Cblank, Cblank, + Cblank, Cblank, Calpha_copyr, Cfake_acid_1 }; -static void init_android_clone_table(short android_clone_bits) +static struct { - boolean android_emerald = (android_clone_bits & 1) != 0; - boolean android_diamond = (android_clone_bits & 2) != 0; - boolean android_stone = (android_clone_bits & 4) != 0; - boolean android_bomb = (android_clone_bits & 8) != 0; - boolean android_nut = (android_clone_bits & 16) != 0; - boolean android_tank = (android_clone_bits & 32) != 0; - boolean android_eater = (android_clone_bits & 64) != 0; - boolean android_bug = (android_clone_bits & 128) != 0; - boolean android_alien = (android_clone_bits & 256) != 0; - boolean android_spring = (android_clone_bits & 512) != 0; - boolean android_balloon = (android_clone_bits & 1024) != 0; - boolean android_amoeba = (android_clone_bits & 2048) != 0; - boolean android_dynamite = (android_clone_bits & 4096) != 0; - int i; - - for (i = 0; i < TILE_MAX; i++) - lev.android_array[i] = Xblank; - - if (android_eater) - { - lev.android_array[Xeater_n] = Xeater_n; - lev.android_array[Yeater_nB] = Xeater_n; - - lev.android_array[Xeater_e] = Xeater_e; - lev.android_array[Yeater_eB] = Xeater_e; - - lev.android_array[Xeater_s] = Xeater_s; - lev.android_array[Yeater_sB] = Xeater_s; - - lev.android_array[Xeater_w] = Xeater_w; - lev.android_array[Yeater_wB] = Xeater_w; - } - - if (android_alien) - { - lev.android_array[Xalien] = Xalien; - lev.android_array[Xalien_pause] = Xalien; - lev.android_array[Yalien_nB] = Xalien; - lev.android_array[Yalien_eB] = Xalien; - lev.android_array[Yalien_sB] = Xalien; - lev.android_array[Yalien_wB] = Xalien; - } - - if (android_bug) - { - lev.android_array[Xbug_1_n] = Xbug_2_n; - lev.android_array[Xbug_2_n] = Xbug_2_n; - lev.android_array[Ybug_nB] = Xbug_2_n; - lev.android_array[Ybug_n_e] = Xbug_2_n; - lev.android_array[Ybug_n_w] = Xbug_2_n; - - lev.android_array[Xbug_1_e] = Xbug_2_e; - lev.android_array[Xbug_2_e] = Xbug_2_e; - lev.android_array[Ybug_eB] = Xbug_2_e; - lev.android_array[Ybug_e_s] = Xbug_2_e; - lev.android_array[Ybug_e_n] = Xbug_2_e; - - lev.android_array[Xbug_1_s] = Xbug_2_s; - lev.android_array[Xbug_2_s] = Xbug_2_s; - lev.android_array[Ybug_sB] = Xbug_2_s; - lev.android_array[Ybug_s_w] = Xbug_2_s; - lev.android_array[Ybug_s_e] = Xbug_2_s; - - lev.android_array[Xbug_1_w] = Xbug_2_w; - lev.android_array[Xbug_2_w] = Xbug_2_w; - lev.android_array[Ybug_wB] = Xbug_2_w; - lev.android_array[Ybug_w_n] = Xbug_2_w; - lev.android_array[Ybug_w_s] = Xbug_2_w; - } - - if (android_tank) - { - lev.android_array[Xtank_1_n] = Xtank_1_n; - lev.android_array[Xtank_2_n] = Xtank_1_n; - lev.android_array[Ytank_nB] = Xtank_1_n; - lev.android_array[Ytank_n_e] = Xtank_1_n; - lev.android_array[Ytank_n_w] = Xtank_1_n; - - lev.android_array[Xtank_1_e] = Xtank_1_e; - lev.android_array[Xtank_2_e] = Xtank_1_e; - lev.android_array[Ytank_eB] = Xtank_1_e; - lev.android_array[Ytank_e_s] = Xtank_1_e; - lev.android_array[Ytank_e_n] = Xtank_1_e; - - lev.android_array[Xtank_1_s] = Xtank_1_s; - lev.android_array[Xtank_2_s] = Xtank_1_s; - lev.android_array[Ytank_sB] = Xtank_1_s; - lev.android_array[Ytank_s_w] = Xtank_1_s; - lev.android_array[Ytank_s_e] = Xtank_1_s; - - lev.android_array[Xtank_1_w] = Xtank_1_w; - lev.android_array[Xtank_2_w] = Xtank_1_w; - lev.android_array[Ytank_wB] = Xtank_1_w; - lev.android_array[Ytank_w_n] = Xtank_1_w; - lev.android_array[Ytank_w_s] = Xtank_1_w; - } - - if (android_emerald) - { - lev.android_array[Xemerald] = Xemerald; - lev.android_array[Xemerald_pause] = Xemerald; - lev.android_array[Xemerald_fall] = Xemerald; - lev.android_array[Yemerald_sB] = Xemerald; - lev.android_array[Yemerald_eB] = Xemerald; - lev.android_array[Yemerald_wB] = Xemerald; - } - - if (android_diamond) - { - lev.android_array[Xdiamond] = Xdiamond; - lev.android_array[Xdiamond_pause] = Xdiamond; - lev.android_array[Xdiamond_fall] = Xdiamond; - lev.android_array[Ydiamond_sB] = Xdiamond; - lev.android_array[Ydiamond_eB] = Xdiamond; - lev.android_array[Ydiamond_wB] = Xdiamond; - } - - if (android_stone) - { - lev.android_array[Xstone] = Xstone; - lev.android_array[Xstone_pause] = Xstone; - lev.android_array[Xstone_fall] = Xstone; - lev.android_array[Ystone_sB] = Xstone; - lev.android_array[Ystone_eB] = Xstone; - lev.android_array[Ystone_wB] = Xstone; - } - - if (android_bomb) - { - lev.android_array[Xbomb] = Xbomb; - lev.android_array[Xbomb_pause] = Xbomb; - lev.android_array[Xbomb_fall] = Xbomb; - lev.android_array[Ybomb_sB] = Xbomb; - lev.android_array[Ybomb_eB] = Xbomb; - lev.android_array[Ybomb_wB] = Xbomb; - } - - if (android_nut) - { - lev.android_array[Xnut] = Xnut; - lev.android_array[Xnut_pause] = Xnut; - lev.android_array[Xnut_fall] = Xnut; - lev.android_array[Ynut_sB] = Xnut; - lev.android_array[Ynut_eB] = Xnut; - lev.android_array[Ynut_wB] = Xnut; - } - - if (android_spring) - { - lev.android_array[Xspring] = Xspring; - lev.android_array[Xspring_pause] = Xspring; - lev.android_array[Xspring_fall] = Xspring; - lev.android_array[Xspring_e] = Xspring; - lev.android_array[Xspring_w] = Xspring; - lev.android_array[Yspring_sB] = Xspring; - lev.android_array[Yspring_eB] = Xspring; - lev.android_array[Yspring_wB] = Xspring; - lev.android_array[Yspring_alien_eB] = Xspring; - lev.android_array[Yspring_alien_wB] = Xspring; - } - - if (android_dynamite) - { - lev.android_array[Xdynamite] = Xdynamite; - } - - if (android_balloon) - { - lev.android_array[Xballoon] = Xballoon; - lev.android_array[Yballoon_nB] = Xballoon; - lev.android_array[Yballoon_eB] = Xballoon; - lev.android_array[Yballoon_sB] = Xballoon; - lev.android_array[Yballoon_wB] = Xballoon; - } - - if (android_amoeba) - { - lev.android_array[Xfake_amoeba] = Xdrip; - lev.android_array[Yfake_amoeba] = Xdrip; - lev.android_array[Xamoeba_1] = Xdrip; - lev.android_array[Xamoeba_2] = Xdrip; - lev.android_array[Xamoeba_3] = Xdrip; - lev.android_array[Xamoeba_4] = Xdrip; - lev.android_array[Xamoeba_5] = Xdrip; - lev.android_array[Xamoeba_6] = Xdrip; - lev.android_array[Xamoeba_7] = Xdrip; - lev.android_array[Xamoeba_8] = Xdrip; - } + int bit_nr; + int clone_from; + int clone_to; } +android_clone_table[] = +{ + { 0, Xemerald, Cemerald }, + { 0, Xemerald_pause, Cemerald }, + { 0, Xemerald_fall, Cemerald }, + { 0, Yemerald_sB, Cemerald }, + { 0, Yemerald_eB, Cemerald }, + { 0, Yemerald_wB, Cemerald }, + + { 1, Xdiamond, Cdiamond }, + { 1, Xdiamond_pause, Cdiamond }, + { 1, Xdiamond_fall, Cdiamond }, + { 1, Ydiamond_sB, Cdiamond }, + { 1, Ydiamond_eB, Cdiamond }, + { 1, Ydiamond_wB, Cdiamond }, + + { 2, Xstone, Cstone }, + { 2, Xstone_pause, Cstone }, + { 2, Xstone_fall, Cstone }, + { 2, Ystone_sB, Cstone }, + { 2, Ystone_eB, Cstone }, + { 2, Ystone_wB, Cstone }, + + { 3, Xbomb, Cbomb }, + { 3, Xbomb_pause, Cbomb }, + { 3, Xbomb_fall, Cbomb }, + { 3, Ybomb_sB, Cbomb }, + { 3, Ybomb_eB, Cbomb }, + { 3, Ybomb_wB, Cbomb }, + + { 4, Xnut, Cnut }, + { 4, Xnut_pause, Cnut }, + { 4, Xnut_fall, Cnut }, + { 4, Ynut_sB, Cnut }, + { 4, Ynut_eB, Cnut }, + { 4, Ynut_wB, Cnut }, + + { 5, Xtank_1_n, Ctank_1_n }, + { 5, Xtank_2_n, Ctank_1_n }, + { 5, Ytank_nB, Ctank_1_n }, + { 5, Ytank_n_e, Ctank_1_n }, + { 5, Ytank_n_w, Ctank_1_n }, + { 5, Xtank_1_e, Ctank_1_e }, + { 5, Xtank_2_e, Ctank_1_e }, + { 5, Ytank_eB, Ctank_1_e }, + { 5, Ytank_e_s, Ctank_1_e }, + { 5, Ytank_e_n, Ctank_1_e }, + { 5, Xtank_1_s, Ctank_1_s }, + { 5, Xtank_2_s, Ctank_1_s }, + { 5, Ytank_sB, Ctank_1_s }, + { 5, Ytank_s_w, Ctank_1_s }, + { 5, Ytank_s_e, Ctank_1_s }, + { 5, Xtank_1_w, Ctank_1_w }, + { 5, Xtank_2_w, Ctank_1_w }, + { 5, Ytank_wB, Ctank_1_w }, + { 5, Ytank_w_n, Ctank_1_w }, + { 5, Ytank_w_s, Ctank_1_w }, + + { 6, Xeater_n, Ceater_n }, + { 6, Yeater_nB, Ceater_n }, + { 6, Xeater_e, Ceater_e }, + { 6, Yeater_eB, Ceater_e }, + { 6, Xeater_s, Ceater_s }, + { 6, Yeater_sB, Ceater_s }, + { 6, Xeater_w, Ceater_w }, + { 6, Yeater_wB, Ceater_w }, + + { 7, Xbug_1_n, Cbug_2_n }, + { 7, Xbug_2_n, Cbug_2_n }, + { 7, Ybug_nB, Cbug_2_n }, + { 7, Ybug_n_e, Cbug_2_n }, + { 7, Ybug_n_w, Cbug_2_n }, + { 7, Xbug_1_e, Cbug_2_e }, + { 7, Xbug_2_e, Cbug_2_e }, + { 7, Ybug_eB, Cbug_2_e }, + { 7, Ybug_e_s, Cbug_2_e }, + { 7, Ybug_e_n, Cbug_2_e }, + { 7, Xbug_1_s, Cbug_2_s }, + { 7, Xbug_2_s, Cbug_2_s }, + { 7, Ybug_sB, Cbug_2_s }, + { 7, Ybug_s_w, Cbug_2_s }, + { 7, Ybug_s_e, Cbug_2_s }, + { 7, Xbug_1_w, Cbug_2_w }, + { 7, Xbug_2_w, Cbug_2_w }, + { 7, Ybug_wB, Cbug_2_w }, + { 7, Ybug_w_n, Cbug_2_w }, + { 7, Ybug_w_s, Cbug_2_w }, + + { 8, Xalien, Calien }, + { 8, Xalien_pause, Calien }, + { 8, Yalien_nB, Calien }, + { 8, Yalien_eB, Calien }, + { 8, Yalien_sB, Calien }, + { 8, Yalien_wB, Calien }, + + { 9, Xspring, Cspring }, + { 9, Xspring_pause, Cspring }, + { 9, Xspring_fall, Cspring }, + { 9, Xspring_e, Cspring }, + { 9, Xspring_w, Cspring }, + { 9, Yspring_sB, Cspring }, + { 9, Yspring_eB, Cspring }, + { 9, Yspring_wB, Cspring }, + { 9, Yspring_alien_eB, Cspring }, + { 9, Yspring_alien_wB, Cspring }, + + { 10, Xballoon, Cballoon }, + { 10, Yballoon_nB, Cballoon }, + { 10, Yballoon_eB, Cballoon }, + { 10, Yballoon_sB, Cballoon }, + { 10, Yballoon_wB, Cballoon }, + + { 11, Xfake_amoeba, Cdrip }, + { 11, Yfake_amoeba, Cdrip }, + { 11, Xamoeba_1, Cdrip }, + { 11, Xamoeba_2, Cdrip }, + { 11, Xamoeba_3, Cdrip }, + { 11, Xamoeba_4, Cdrip }, + { 11, Xamoeba_5, Cdrip }, + { 11, Xamoeba_6, Cdrip }, + { 11, Xamoeba_7, Cdrip }, + { 11, Xamoeba_8, Cdrip }, + + { 12, Xdynamite, Cdynamite }, + + { -1, -1, -1 }, +}; + +static int eater_offset[8] = +{ + 2048, 2057, 2066, 2075, + 2112, 2121, 2130, 2139 +}; void convert_em_level(unsigned char *src, int file_version) { - static int eater_offset[8] = - { - 2048, 2057, 2066, 2075, - 2112, 2121, 2130, 2139 - }; int i, x, y, temp; /* common to all emc caves */ - lev.time_seconds = GET_BE16(src[2110]); - if (lev.time_seconds > 9999) - lev.time_seconds = 9999; + cav.width = 64; + cav.height = 32; + + cav.time_seconds = MIN(GET_BE16(src[2110]), 9999); + cav.gems_needed = src[2095]; - lev.required_initial = src[2095]; + cav.infinite = TRUE; + cav.testmode = FALSE; + cav.teamwork = (src[2150] & 128) != 0; /* scores */ - lev.emerald_score = src[2084]; - lev.diamond_score = src[2085]; - lev.alien_score = src[2086]; - lev.tank_score = src[2087]; - lev.bug_score = src[2088]; - lev.eater_score = src[2089]; - lev.nut_score = src[2090]; - lev.dynamite_score = src[2091]; - lev.key_score = src[2092]; - lev.exit_score = src[2093] * 8 / 5; - - lev.lenses_score = src[2151]; - lev.magnify_score = src[2152]; - lev.slurp_score = src[2153]; + cav.emerald_score = src[2084]; + cav.diamond_score = src[2085]; + cav.alien_score = src[2086]; + cav.tank_score = src[2087]; + cav.bug_score = src[2088]; + cav.eater_score = src[2089]; + cav.nut_score = src[2090]; + cav.dynamite_score = src[2091]; + cav.key_score = src[2092]; + cav.exit_score = src[2093] * 8 / 5; + + cav.lenses_score = src[2151]; + cav.magnify_score = src[2152]; + cav.slurp_score = src[2153]; /* times */ - lev.android_move_time = GET_BE16(src[2164]); - lev.android_clone_time = GET_BE16(src[2166]); - lev.ball_time = GET_BE16(src[2160]); + cav.android_move_time = MIN(GET_BE16(src[2164]), 9999); + cav.android_clone_time = MIN(GET_BE16(src[2166]), 9999); + cav.ball_time = MIN(GET_BE16(src[2160]), 9999); - lev.lenses_time = GET_BE16(src[2154]); - lev.magnify_time = GET_BE16(src[2156]); - lev.wheel_time = GET_BE16(src[2104]); + cav.lenses_time = MIN(GET_BE16(src[2154]), 9999); + cav.magnify_time = MIN(GET_BE16(src[2156]), 9999); + cav.wheel_time = MIN(GET_BE16(src[2104]), 9999); - temp = GET_BE16(src[2100]) * 28; - if (temp > 9999) - temp = 9999; - lev.amoeba_time = temp; + cav.amoeba_time = MIN(GET_BE16(src[2100]) * 28, 9999); + cav.wonderwall_time = MIN(GET_BE16(src[2102]), 9999); - lev.wonderwall_time_initial = GET_BE16(src[2102]); - - lev.wind_cnt_initial = src[2149] & 15 ? lev.wind_time : 0; + cav.wind_time = 9999; temp = src[2149]; - lev.wind_direction_initial = (temp & 8 ? 0 : - temp & 1 ? 1 : - temp & 2 ? 2 : - temp & 4 ? 3 : 0); + cav.wind_direction = (temp & 8 ? 0 : + temp & 1 ? 1 : + temp & 2 ? 2 : + temp & 4 ? 3 : 4); + /* global flags */ - lev.ball_random = src[2162] & 1 ? 1 : 0; - lev.ball_state_initial = src[2162] & 128 ? 1 : 0; + cav.ball_random = (src[2162] & 1) != 0; + cav.ball_active = (src[2162] & 128) != 0; + + cav.wonderwall_active = FALSE; + cav.wheel_active = FALSE; + cav.lenses_active = FALSE; + cav.magnify_active = FALSE; for (temp = 1; temp < 2047; temp++) { switch (src[temp]) { case 36: /* wonderwall */ - lev.wonderwall_state_initial = 1; - lev.wonderwall_time_initial = 9999; + cav.wonderwall_active = TRUE; + cav.wonderwall_time = 9999; break; case 40: /* wheel */ - lev.wheel_x_initial = temp & 63; - lev.wheel_y_initial = temp >> 6; - lev.wheel_cnt_initial = lev.wheel_time; + cav.wheel_active = TRUE; + cav.wheel_x = temp % 64; + cav.wheel_y = temp / 64; break; case 163: /* fake blank */ - lev.lenses_cnt_initial = 9999; + cav.lenses_active = TRUE; break; case 164: /* fake grass */ - lev.magnify_cnt_initial = 9999; + cav.magnify_active = TRUE; break; } } @@ -409,13 +357,19 @@ void convert_em_level(unsigned char *src, int file_version) temp = GET_BE16(src[2168]); - init_android_clone_table(temp); + for (i = 0; i < GAME_TILE_MAX; i++) + cav.android_array[i] = Cblank; + + for (i = 0; android_clone_table[i].bit_nr != -1; i++) + if (temp & (1 << android_clone_table[i].bit_nr)) + cav.android_array[android_clone_table[i].clone_from] = + android_clone_table[i].clone_to; /* eaters */ for (i = 0; i < 8; i++) for (x = 0; x < 9; x++) - lev.eater_array[i][x] = map_emc[src[eater_offset[i] + x]]; + cav.eater_array[i][x] = map_emc[src[eater_offset[i] + x]]; /* ball */ @@ -426,18 +380,18 @@ void convert_em_level(unsigned char *src, int file_version) if (src[2162] & 1) { for (x = 0; x < 8; x++) - lev.ball_array[y][x] = temp; + cav.ball_array[y][x] = temp; } else { - lev.ball_array[y][1] = (src[2163] & 1) ? temp : Xblank; /* north */ - lev.ball_array[y][6] = (src[2163] & 2) ? temp : Xblank; /* south */ - lev.ball_array[y][3] = (src[2163] & 4) ? temp : Xblank; /* west */ - lev.ball_array[y][4] = (src[2163] & 8) ? temp : Xblank; /* east */ - lev.ball_array[y][7] = (src[2163] & 16) ? temp : Xblank; /* southeast */ - lev.ball_array[y][5] = (src[2163] & 32) ? temp : Xblank; /* southwest */ - lev.ball_array[y][2] = (src[2163] & 64) ? temp : Xblank; /* northeast */ - lev.ball_array[y][0] = (src[2163] & 128)? temp : Xblank; /* northwest */ + cav.ball_array[y][1] = (src[2163] & 1) ? temp : Cblank; /* north */ + cav.ball_array[y][6] = (src[2163] & 2) ? temp : Cblank; /* south */ + cav.ball_array[y][3] = (src[2163] & 4) ? temp : Cblank; /* west */ + cav.ball_array[y][4] = (src[2163] & 8) ? temp : Cblank; /* east */ + cav.ball_array[y][7] = (src[2163] & 16) ? temp : Cblank; /* southeast */ + cav.ball_array[y][5] = (src[2163] & 32) ? temp : Cblank; /* southwest */ + cav.ball_array[y][2] = (src[2163] & 64) ? temp : Cblank; /* northeast */ + cav.ball_array[y][0] = (src[2163] & 128)? temp : Cblank; /* northwest */ } } @@ -447,27 +401,22 @@ void convert_em_level(unsigned char *src, int file_version) { temp = GET_BE16(src[2096 + i * 2]); - lev.player_x[i] = (temp & 63); - lev.player_y[i] = (temp >> 6 & 31); + cav.player_x[i] = (temp & 63); + cav.player_y[i] = (temp >> 6 & 31); } /* cave */ - /* first fill the complete playfield with the default border element */ + /* first fill the complete playfield with the empty space element */ for (y = 0; y < CAVE_HEIGHT; y++) for (x = 0; x < CAVE_WIDTH; x++) - lev.cave_raw[x][y] = Zborder; + cav.cave[x][y] = Cblank; /* then copy the real level contents from level file into the playfield */ temp = 0; - for (y = 0; y < lev.height; y++) - for (x = 0; x < lev.width; x++) - lev.cave_raw[x][y] = map_emc[src[temp++]]; - - /* at last, set the two players at their positions in the playfield */ - /* (native EM[C] levels always have exactly two players in a level) */ - for (i = 0; i < 2; i++) - lev.cave_raw[lev.player_x[i]][lev.player_y[i]] = Zplayer; + for (y = 0; y < cav.height; y++) + for (x = 0; x < cav.width; x++) + cav.cave[x][y] = map_emc[src[temp++]]; native_em_level.file_version = file_version; } @@ -501,6 +450,9 @@ void convert_em_level(unsigned char *src, int file_version) * - object code 130 (V6 grass) is changed to 189 (V6 dirt) * - object codes are changed in both cave and eater arrays * - only graphical change, as both objects behave the same + * + * acid with no base beneath it is converted to fake acid + * - required for downunder mine 16, level 0 (and others) */ static const unsigned char map_v6[256] = @@ -599,7 +551,7 @@ static boolean filename_has_v1_format(char *filename) int cleanup_em_level(unsigned char *src, int length, char *filename) { int file_version = FILE_VERSION_EM_UNKNOWN; - int i; + int i, j; if (length >= 2172 && src[2106] == 255 && /* version id: */ @@ -611,11 +563,11 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) file_version = FILE_VERSION_EM_V6; /* remap elements to internal EMC level format */ - for (i = 0; i < 2048; i++) + for (i = 0; i < 2048; i++) /* cave */ src[i] = map_v6[src[i]]; - for (i = 2048; i < 2084; i++) + for (i = 2048; i < 2084; i++) /* eaters */ src[i] = map_v6[src[i]]; - for (i = 2112; i < 2148; i++) + for (i = 2112; i < 2148; i++) /* eaters */ src[i] = map_v6[src[i]]; } else if (length >= 2110 && @@ -628,11 +580,11 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) file_version = FILE_VERSION_EM_V5; /* remap elements to internal EMC level format */ - for (i = 0; i < 2048; i++) + for (i = 0; i < 2048; i++) /* cave */ src[i] = map_v5[src[i]]; - for (i = 2048; i < 2084; i++) + for (i = 2048; i < 2084; i++) /* eaters */ src[i] = map_v5[src[i]]; - for (i = 2112; i < 2148; i++) + for (i = 2112; i < 2148; i++) /* eaters */ src[i] = src[i - 64]; } else if (length >= 2106 && @@ -693,18 +645,18 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) } /* remap elements to internal EMC level format */ - for (i = 0; i < 2048; i++) + for (i = 0; i < 2048; i++) /* cave */ src[i] = map_v4[src[i]]; - for (i = 2048; i < 2084; i++) - src[i] = map_v4_eater[src[i] >= 28 ? 0 : src[i]]; - for (i = 2112; i < 2148; i++) + for (i = 2048; i < 2084; i++) /* eaters */ + src[i] = map_v4_eater[src[i] % 32]; + for (i = 2112; i < 2148; i++) /* eaters */ src[i] = src[i - 64]; if (fix_copyright) /* fix "(c)" sign in Emerald Mine II levels */ { for (i = 0; i < 2048; i++) if (src[i] == 241) - src[i] = 254; /* replace 'Xdecor_1' with 'Xalpha_copyr' */ + src[i] = 254; /* replace 'Cdecor_1' with 'Calpha_copyr' */ } } else @@ -756,10 +708,10 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) /* fix acid */ for (i = 64; i < 2048; i++) - if (src[i] == 63) /* replace element above 'Xacid_s' ... */ - src[i - 64] = 101; /* ... with 'Xacid_1' */ + if (src[i] == 63) /* replace element above 'Cacid_s' ... */ + src[i - 64] = 101; /* ... with 'Cacid_1' */ - /* fix acid with no base beneath it (see below for details (*)) */ + /* fix acid with no base beneath it (see comment above for details) */ for (i = 64; i < 2048 - 1; i++) { if (file_version <= FILE_VERSION_EM_V2 && @@ -767,74 +719,24 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) { if (src[i - 1] == 101 || /* remove acid over acid row */ src[i + 1] == 101) - src[i - 64] = 6; /* replace element above with 'Xblank' */ + src[i - 64] = 6; /* replace element above with 'Cblank' */ else - src[i - 64] = 255; /* replace element above with 'Xfake_acid_1' */ + src[i - 64] = 255; /* replace element above with 'Cfake_acid_1' */ } } - /* fix acid in eater 1 */ - for (i = 2051; i < 2057; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 2 */ - for (i = 2060; i < 2066; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 3 */ - for (i = 2069; i < 2075; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 4 */ - for (i = 2078; i < 2084; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 5 */ - for (i = 2115; i < 2121; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 6 */ - for (i = 2124; i < 2130; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 7 */ - for (i = 2133; i < 2139; i++) - if (src[i] == 63) - src[i - 3] = 101; - - /* fix acid in eater 8 */ - for (i = 2142; i < 2148; i++) - if (src[i] == 63) - src[i - 3] = 101; + /* fix acid in eaters */ + for (i = 0; i < 8; i++) + for (j = 0; j < 6; j++) + if (src[eater_offset[i] + j + 3] == 63) + src[eater_offset[i] + j] = 101; /* old style time */ src[2094] = 0; - /* player 1 pos */ - src[2096] &= 7; - src[GET_BE16(src[2096])] = 128; - - /* player 2 pos */ - src[2098] &= 7; - src[GET_BE16(src[2098])] = 128; - - /* amoeba speed */ - if (GET_BE16(src[2100]) > 9999) - PUT_BE16(src[2100], 9999); - - /* time wonderwall */ - if (GET_BE16(src[2102]) > 9999) - PUT_BE16(src[2102], 9999); - - /* time */ - if (GET_BE16(src[2110]) > 9999) - PUT_BE16(src[2110], 9999); + /* set cave tile at player position to blank */ + for (i = 0; i < 2; i++) + src[GET_BE16(src[2096 + i * 2]) % 2048] = 128; /* wind direction */ i = src[2149]; @@ -842,35 +744,15 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) i &= -i; src[2149] = i; - /* time lenses */ - if (GET_BE16(src[2154]) > 9999) - PUT_BE16(src[2154], 9999); - - /* time magnify */ - if (GET_BE16(src[2156]) > 9999) - PUT_BE16(src[2156], 9999); - /* ball object */ src[2158] = 0; src[2159] = map_v6[src[2159]]; - /* ball pause */ - if (GET_BE16(src[2160]) > 9999) - PUT_BE16(src[2160], 9999); - /* ball data */ src[2162] &= 129; if (src[2162] & 1) src[2163] = 0; - /* android move pause */ - if (GET_BE16(src[2164]) > 9999) - PUT_BE16(src[2164], 9999); - - /* android clone pause */ - if (GET_BE16(src[2166]) > 9999) - PUT_BE16(src[2166], 9999); - /* android data */ src[2168] &= 31;