X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=6b6ed64e88fd46f06ea5e5f64aafb95b0fc3a223;hb=fbe0eaa3234fb6a69a65136f764922e24943501d;hp=9224bb64fd5958983e155f303c083852431e8ef2;hpb=b98c54e042b8dd87b4a42f0a038a600bdd23ffd4;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 9224bb64..6b6ed64e 100644 --- a/src/init.c +++ b/src/init.c @@ -363,7 +363,7 @@ void InitFontGraphicInfo() /* ---------- initialize font bitmap array ---------- */ if (font_bitmap_info != NULL) - free(font_bitmap_info); + FreeFontInfo(font_bitmap_info); font_bitmap_info = checked_calloc(num_font_bitmaps * sizeof(struct FontBitmapInfo)); @@ -1078,10 +1078,8 @@ static void ReinitializeMusic() /* currently nothing to do */ } -void InitElementProperties() +void InitElementPropertiesStatic() { - int i, j; - static int ep_amoebalive[] = { EL_AMOEBA_WET, @@ -1101,16 +1099,7 @@ void InitElementProperties() -1 }; - static int ep_can_be_crumbled[] = - { - EL_SAND, - EL_LANDMINE, - EL_TRAP, - EL_TRAP_ACTIVE, - -1 - }; - - static int ep_pforte[] = + static int ep_keygate[] = { EL_GATE_1, EL_GATE_2, @@ -1128,29 +1117,19 @@ void InitElementProperties() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, - EL_SWITCHGATE_OPEN, - EL_SWITCHGATE_OPENING, - EL_SWITCHGATE_CLOSED, - EL_SWITCHGATE_CLOSING, - EL_TIMEGATE_OPEN, - EL_TIMEGATE_OPENING, - EL_TIMEGATE_CLOSED, - EL_TIMEGATE_CLOSING, - EL_TUBE_ANY, - EL_TUBE_VERTICAL, - EL_TUBE_HORIZONTAL, - EL_TUBE_VERTICAL_LEFT, - EL_TUBE_VERTICAL_RIGHT, - EL_TUBE_HORIZONTAL_UP, - EL_TUBE_HORIZONTAL_DOWN, - EL_TUBE_LEFT_UP, - EL_TUBE_LEFT_DOWN, - EL_TUBE_RIGHT_UP, - EL_TUBE_RIGHT_DOWN, -1 }; - static int ep_solid[] = + static int ep_can_be_crumbled[] = + { + EL_SAND, + EL_LANDMINE, + EL_TRAP, + EL_TRAP_ACTIVE, + -1 + }; + + static int ep_historic_solid[] = { EL_WALL, EL_EXPANDABLE_WALL, @@ -1449,7 +1428,7 @@ void InitElementProperties() -1 }; - static int ep_mauer[] = + static int ep_historic_wall[] = { EL_STEELWALL, EL_GATE_1, @@ -1949,15 +1928,21 @@ void InitElementProperties() { EL_EMPTY_SPACE, EL_SP_EMPTY_SPACE, - /* !!! EL_GATE_[1-4], EL_GATE_[1-4]_GRAY !!! */ - /* !!! EL_EM_GATE_[1-4], EL_EM_GATE_[1-4]_GRAY !!! */ EL_SOKOBAN_FIELD_EMPTY, EL_EXIT_OPEN, EL_SP_EXIT_OPEN, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, -1 }; - static int ep_walkable_through[] = + static int ep_walkable_inside[] = { EL_TUBE_ANY, EL_TUBE_VERTICAL, @@ -1993,7 +1978,7 @@ void InitElementProperties() -1 }; - static int ep_passable_through[] = + static int ep_passable_inside[] = { EL_SP_PORT_LEFT, EL_SP_PORT_RIGHT, @@ -2023,8 +2008,9 @@ void InitElementProperties() EL_TRAP, EL_INVISIBLE_SAND, EL_INVISIBLE_SAND_ACTIVE, -#if 0 +#if 1 EL_LANDMINE, + EL_TRAP_ACTIVE, EL_SP_BUGGY_BASE_ACTIVE, #endif -1 @@ -2063,33 +2049,6 @@ void InitElementProperties() -1 }; - static int ep_over_player[] = - { - EL_SP_PORT_LEFT, - EL_SP_PORT_RIGHT, - EL_SP_PORT_UP, - EL_SP_PORT_DOWN, - EL_SP_GRAVITY_PORT_LEFT, - EL_SP_GRAVITY_PORT_RIGHT, - EL_SP_GRAVITY_PORT_UP, - EL_SP_GRAVITY_PORT_DOWN, - EL_SP_PORT_HORIZONTAL, - EL_SP_PORT_VERTICAL, - EL_SP_PORT_ANY, - EL_TUBE_ANY, - EL_TUBE_VERTICAL, - EL_TUBE_HORIZONTAL, - EL_TUBE_VERTICAL_LEFT, - EL_TUBE_VERTICAL_RIGHT, - EL_TUBE_HORIZONTAL_UP, - EL_TUBE_HORIZONTAL_DOWN, - EL_TUBE_LEFT_UP, - EL_TUBE_LEFT_DOWN, - EL_TUBE_RIGHT_UP, - EL_TUBE_RIGHT_DOWN, - -1 - }; - static int ep_active_bomb[] = { EL_DYNAMITE_ACTIVE, @@ -2212,6 +2171,22 @@ void InitElementProperties() -1 }; + static int ep_tube[] = + { + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN, + EL_TUBE_HORIZONTAL, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, + EL_TUBE_VERTICAL, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_ANY, + -1 + }; + static struct { int *elements; @@ -2220,13 +2195,13 @@ void InitElementProperties() { { ep_amoebalive, EP_AMOEBALIVE }, { ep_amoeboid, EP_AMOEBOID }, + { ep_keygate, EP_KEYGATE }, { ep_can_be_crumbled, EP_CAN_BE_CRUMBLED }, - { ep_pforte, EP_PFORTE }, - { ep_solid, EP_SOLID }, + { ep_historic_solid, EP_HISTORIC_SOLID }, { ep_indestructible, EP_INDESTRUCTIBLE }, { ep_slippery, EP_SLIPPERY }, { ep_enemy, EP_ENEMY }, - { ep_mauer, EP_MAUER }, + { ep_historic_wall, EP_HISTORIC_WALL }, { ep_can_fall, EP_CAN_FALL }, { ep_can_smash, EP_CAN_SMASH }, { ep_can_change, EP_CAN_CHANGE }, @@ -2244,24 +2219,40 @@ void InitElementProperties() { ep_pushable, EP_PUSHABLE }, { ep_player, EP_PLAYER }, { ep_walkable_over, EP_WALKABLE_OVER }, - { ep_walkable_through, EP_WALKABLE_THROUGH }, + { ep_walkable_inside, EP_WALKABLE_INSIDE }, { ep_walkable_under, EP_WALKABLE_UNDER }, { ep_passable_over, EP_PASSABLE_OVER }, - { ep_passable_through, EP_PASSABLE_THROUGH }, + { ep_passable_inside, EP_PASSABLE_INSIDE }, { ep_passable_under, EP_PASSABLE_UNDER }, { ep_diggable, EP_DIGGABLE }, { ep_collectible, EP_COLLECTIBLE }, - { ep_over_player, EP_OVER_PLAYER }, { ep_active_bomb, EP_ACTIVE_BOMB }, { ep_belt, EP_BELT }, { ep_belt_active, EP_BELT_ACTIVE }, { ep_belt_switch, EP_BELT_SWITCH }, { ep_sp_element, EP_SP_ELEMENT }, { ep_has_content, EP_HAS_CONTENT }, + { ep_tube, EP_TUBE }, { NULL, -1 } }; + int i, j; + + /* always start with reliable default values (element has no properties) */ + for (i=0; i < MAX_NUM_ELEMENTS; i++) + for (j=0; j < NUM_ELEMENT_PROPERTIES; j++) + SET_PROPERTY(i, j, FALSE); + + /* set all base element properties from above array definitions */ + for (i=0; element_properties[i].elements != NULL; i++) + for (j=0; (element_properties[i].elements)[j] != -1; j++) + SET_PROPERTY((element_properties[i].elements)[j], + element_properties[i].property, TRUE); +} + +void InitElementPropertiesEngine(int engine_version) +{ #if 0 static int active_properties[] = { @@ -2284,7 +2275,7 @@ void InitElementProperties() EP_PLAYER, EP_HAS_CONTENT, EP_DIGGABLE, - EP_PASSABLE_THROUGH, + EP_PASSABLE_INSIDE, EP_OVER_PLAYER, EP_ACTIVE_BOMB, @@ -2297,38 +2288,92 @@ void InitElementProperties() }; #endif - /* always start with reliable default values (no properties) */ - for (i=0; i= EL_CHAR_START && i <= EL_CHAR_END) + SET_PROPERTY(i, EP_INACTIVE, TRUE); + + /* ---------- WALKABLE, PASSABLE, ACCESSIBLE --------------------------- */ + if (IS_WALKABLE_OVER(i) || IS_WALKABLE_INSIDE(i) || IS_WALKABLE_UNDER(i)) SET_PROPERTY(i, EP_WALKABLE, TRUE); - if (IS_PASSABLE_OVER(i) || IS_PASSABLE_THROUGH(i) || IS_PASSABLE_UNDER(i)) + if (IS_PASSABLE_OVER(i) || IS_PASSABLE_INSIDE(i) || IS_PASSABLE_UNDER(i)) SET_PROPERTY(i, EP_PASSABLE, TRUE); if (IS_WALKABLE_OVER(i) || IS_PASSABLE_OVER(i)) - SET_PROPERTY(i, EP_PLAYER_OVER, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE_OVER, TRUE); - if (IS_WALKABLE_THROUGH(i) || IS_PASSABLE_THROUGH(i)) - SET_PROPERTY(i, EP_PLAYER_INSIDE, TRUE); + if (IS_WALKABLE_INSIDE(i) || IS_PASSABLE_INSIDE(i)) + SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, TRUE); if (IS_WALKABLE_UNDER(i) || IS_PASSABLE_UNDER(i)) - SET_PROPERTY(i, EP_PLAYER_UNDER, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, TRUE); + + if (IS_WALKABLE(i) || IS_PASSABLE(i)) + SET_PROPERTY(i, EP_ACCESSIBLE, TRUE); + + /* ---------- WALL ----------------------------------------------------- */ + SET_PROPERTY(i, EP_WALL, TRUE); /* default: element is wall */ + + for (j=0; no_wall_properties[j] != -1; j++) + if (HAS_PROPERTY(i, no_wall_properties[j]) || + i >= EL_FIRST_RUNTIME_UNREAL) + SET_PROPERTY(i, EP_WALL, FALSE); + + if (IS_HISTORIC_WALL(i)) + SET_PROPERTY(i, EP_WALL, TRUE); + + /* ---------- SOLID ---------------------------------------------------- */ + if (engine_version < VERSION_IDENT(2,2,0)) + SET_PROPERTY(i, EP_SOLID, IS_HISTORIC_SOLID(i)); + else + SET_PROPERTY(i, EP_SOLID, (!IS_WALKABLE(i) && + !IS_DIGGABLE(i) && + !IS_COLLECTIBLE(i))); + + /* ---------- DRAGONFIRE_PROOF ----------------------------------------- */ + if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION) + SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, TRUE); + + /* ---------- EXPLOSION_PROOF ------------------------------------------ */ + if (i == EL_FLAMES) + SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE); + else if (engine_version < VERSION_IDENT(2,2,0)) + SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i)); + else + SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && + !IS_WALKABLE_OVER(i) && + !IS_WALKABLE_UNDER(i))); } #if 0 @@ -2350,26 +2395,29 @@ void InitElementProperties() } #endif -#if 0 - for (i=0; i < MAX_NUM_ELEMENTS; i++) + /* dynamically adjust element properties according to game engine version */ { - boolean element_is_solid = TRUE; - - if (IS_DIGGABLE(i) || - IS_COLLECTIBLE(i) || - CAN_FALL(i) || - CAN_MOVE(i) || - IS_PUSHABLE(i)) - element_is_solid = FALSE; - - if (IS_INDESTRUCTIBLE(i)) - element_is_solid = TRUE; - - if (element_is_solid != HAS_PROPERTY(i, EP_SOLID)) - printf("::: '%s' should %s solid\n", element_info[i].token_name, - (HAS_PROPERTY(i, EP_SOLID) ? "NOT be" : "be")); + static int ep_em_slippery_wall[] = + { + EL_STEELWALL, + EL_WALL, + EL_EXPANDABLE_WALL, + EL_EXPANDABLE_WALL_HORIZONTAL, + EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_WALL_ANY, + -1 + }; + + /* special EM style gems behaviour */ + for (i=0; ep_em_slippery_wall[i] != -1; i++) + SET_PROPERTY(ep_em_slippery_wall[i], EP_EM_SLIPPERY_WALL, + level.em_slippery_gems); + + /* "EL_EXPANDABLE_WALL_GROWING" wasn't slippery for EM gems in 2.0.1 */ + SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL, + (level.em_slippery_gems && + engine_version > VERSION_IDENT(2,0,1))); } -#endif } static void InitGlobal() @@ -2906,7 +2954,7 @@ void OpenAll() InitEventFilter(FilterMouseMotionEvents); - InitElementProperties(); + InitElementPropertiesStatic(); InitGfx();