--- deliantra/server/common/loader.C 2009/11/09 19:17:58 1.143 +++ deliantra/server/common/loader.C 2009/11/11 18:06:46 1.147 @@ -332,8 +332,8 @@ name_pl = name; /* objects now have a materialname. try to patch it in */ - if (!(is_weapon () && level > 0)) - set_materialname (this, map ? map->difficulty : 5, 0); + if (material == MATERIAL_NULL && !(is_weapon () && level > 0)) + select_material (this, map ? map->difficulty : 5); /* only do these when program is first run - a bit * excessive to do this at every run - most of this is @@ -727,7 +727,14 @@ case KW_state: f.get (state); break; case KW_move_slow_penalty: f.get (move_slow_penalty); break; case KW_material: f.get (materials); break; //TODO: nuke - case KW_materialname: f.get (materialname); break; + + case KW_materialname: + { + shstr sh; + f.get (sh); + material = name_to_material (sh); + } + break; /* These are the new values */ case KW_move_block: set_move (move_block, f.get_str ()); break; @@ -854,7 +861,6 @@ case KW_no_magic: GET_FLAG (this, FLAG_NO_MAGIC); break; case KW_no_drop: GET_FLAG (this, FLAG_NO_DROP); break; case KW_random_movement: GET_FLAG (this, FLAG_RANDOM_MOVE); break; - case KW_no_fix_player: GET_FLAG (this, FLAG_NO_FIX_PLAYER); break; case KW_is_lightable: GET_FLAG (this, FLAG_IS_LIGHTABLE); break; case KW_tear_down: GET_FLAG (this, FLAG_TEAR_DOWN); break; case KW_can_use_shield: GET_FLAG (this, FLAG_USE_SHIELD); break; @@ -1170,7 +1176,7 @@ /* 40 */ KW_reflect_spell, KW_no_magic, - KW_no_fix_player, + KW_NULL, KW_is_lightable, KW_tear_down, KW_run_away, @@ -1297,7 +1303,24 @@ CMP_OUT (name_pl); CMP_OUT (speed); - CMP_OUT (speed_left); + + // speed_left is a major time-burner, and has good locality, so + // we use a simple lookup-cache to avoid the very slow printf. + if (op->speed_left != arch->speed_left) + { + static double last_speed_left = 0.; + static char last_speed_left_str [256] = "speed_left 0\n"; + static int last_speed_left_len = sizeof ("speed_left 0\n") - 1; + + if (last_speed_left != op->speed_left) + { + last_speed_left = op->speed_left; + last_speed_left_len = sizeof ("speed_left ") - 1 + + sprintf (last_speed_left_str + sizeof ("speed_left ") - 1, "%.7g\n", last_speed_left); + } + + f.add (last_speed_left_str, last_speed_left_len); + } CMP_OUT (title); CMP_OUT (race); @@ -1361,7 +1384,7 @@ CMP_OUT (level); CMP_OUT (attacktype); - // using memcmp here seems to be a loss - us gcc vectorising? + // using memcmp here seems to be a loss - is gcc vectorising? for (int i = 0; i < NROFATTACKS; i++) if (expect_false (op->resist[i] != arch->resist[i])) f.put (resist_save[i], op->resist[i]); @@ -1369,8 +1392,11 @@ CMP_OUT (path_attuned); CMP_OUT (path_repelled); CMP_OUT (path_denied); + CMP_OUT2 (material, materials);//TODO: nuke - CMP_OUT (materialname); + if (op->material != arch->material) + f.put (KW_materialname, op->material->name); + CMP_OUT (value); CMP_OUT (carrying); CMP_OUT (weight);