--- deliantra/server/common/loader.C 2009/11/09 17:39:05 1.142 +++ deliantra/server/common/loader.C 2009/11/09 19:17:58 1.143 @@ -1134,8 +1134,8 @@ KW_can_use_shield, KW_no_pick, KW_NULL, // walk_on - KW_NULL, // no_pass /* 10 */ + KW_NULL, // no_pass KW_is_animated, KW_NULL, // slow_move KW_NULL, // flying @@ -1145,8 +1145,8 @@ KW_is_thrown, KW_auto_apply, KW_treasure_env, - KW_player_sold, /* 20 */ + KW_player_sold, KW_see_invisible, KW_can_roll, KW_overlay_floor, @@ -1156,8 +1156,8 @@ KW_NULL, // fly_off KW_is_used_up, KW_identified, - KW_reflecting, /* 30 */ + KW_reflecting, KW_changing, KW_splitting, KW_hitback, @@ -1167,8 +1167,8 @@ KW_scared, KW_unaggressive, KW_reflect_missile, - KW_reflect_spell, /* 40 */ + KW_reflect_spell, KW_no_magic, KW_no_fix_player, KW_is_lightable, @@ -1178,8 +1178,8 @@ KW_NULL, // an_pass_thru KW_pick_up, KW_unique, - KW_no_drop, /* 50 */ + KW_no_drop, KW_NULL, // wizcast KW_can_cast_spell, KW_can_use_scroll, @@ -1189,8 +1189,8 @@ KW_can_use_weapon, KW_can_use_ring, KW_has_ready_range, - KW_has_ready_bow, /* 60 */ + KW_has_ready_bow, KW_xrays, KW_NULL, KW_is_floor, @@ -1200,8 +1200,8 @@ KW_stand_still, KW_random_move, KW_only_attack, - KW_confused, /* 70 */ + KW_confused, KW_stealth, KW_NULL, KW_NULL, @@ -1211,8 +1211,8 @@ KW_known_magical, KW_known_cursed, KW_can_use_skill, - KW_been_applied, /* 80 */ + KW_been_applied, KW_has_ready_scroll, KW_can_use_rod, KW_precious, @@ -1222,8 +1222,8 @@ KW_is_wooded, KW_is_hilly, KW_has_ready_skill, - KW_has_ready_weapon, /* 90 */ + KW_has_ready_weapon, KW_no_skill_ident, KW_is_blind, KW_can_see_in_dark, @@ -1233,8 +1233,8 @@ KW_one_hit, KW_NULL, KW_berserk, - KW_neutral, /* 100 */ + KW_neutral, KW_no_attack, KW_no_damage, KW_obj_original, @@ -1244,12 +1244,24 @@ KW_is_water, KW_use_content_on_gen, KW_NULL, - KW_is_buildable, /* 110 */ + KW_is_buildable, KW_destroy_on_death, KW_NULL, }; + // obj_original is the only commonly differing flag between archetype + // and object, so special-case it here to be able to skip the loop + static const struct flagmask : object::flags_t + { + flagmask () + { + for (int i = 0; i < NUM_FLAGS; i++) + if (flag_names [i]) + set (i); + } + } flagmask; + /* This saves the key/value lists. We do it first so that any * keys that match field names will be overwritten by the loader. */ @@ -1400,25 +1412,18 @@ CMP_OUT (move_slow); CMP_OUT (move_slow_penalty); - // obj_original is the only commonly differing flag between archetype - // and object, so special-case it here to be able to skip the loop - object::flags_t diff = op->flag ^ arch->flag; + object::flags_t diff = (op->flag ^ arch->flag) & flagmask; + if (diff [FLAG_OBJ_ORIGINAL]) + f.put (flag_names [FLAG_OBJ_ORIGINAL], op->flag [FLAG_OBJ_ORIGINAL] ? "1" : "0"); + + diff.reset (FLAG_OBJ_ORIGINAL); + + // quickly test whether any other flags differ if (expect_true (diff.any ())) - { - if (expect_false (diff.reset (FLAG_OBJ_ORIGINAL).any ()) || 1) - { - // some other flags differ, too - for (int i = 0; i < NUM_FLAGS; i++) - if (expect_false (flag_names [i] && op->flag [i] != arch->flag [i])) - f.put (flag_names [i], op->flag [i] ? "1" : "0"); - } - else - { - // only obj_original differs - f.put (flag_names [FLAG_OBJ_ORIGINAL], op->flag [FLAG_OBJ_ORIGINAL] ? "1" : "0"); - } - } + for (int i = 0; i < NUM_FLAGS; i++) + if (expect_false (diff [i])) + f.put (flag_names [i], op->flag [i] ? "1" : "0"); // save body locations. gcc's memcmp does an abysmal job when used for (int i = 0; i < NUM_BODY_LOCATIONS; i++)