--- deliantra/server/common/loader.C 2006/09/15 00:31:36 1.18 +++ deliantra/server/common/loader.C 2006/12/15 19:59:19 1.23 @@ -28,7 +28,6 @@ #include #include -#include #include /* Maps the MOVE_* values to names */ @@ -558,7 +557,7 @@ tmp = arch_to_object (arch); else { - tmp = get_object (); + tmp = object::create (); /* record the name of the broken object */ tmp->name = str; } @@ -595,7 +594,7 @@ else { LOG (llevDebug, "Discarding object without arch: %s\n", tmp->name ? (const char *) tmp->name : "(null)"); - free_object (tmp); + tmp->destroy (); } } else @@ -603,8 +602,8 @@ /* This is the actual archetype definition then */ op->arch = archetype::find (str); - if (op->arch != NULL) - copy_object (&op->arch->clone, op); + if (op->arch) + op->arch->clone.copy_to (op); else if (!arch_init) /* record the name of the broken object */ op->name = str; @@ -866,6 +865,7 @@ case KW_can_use_weapon: GET_FLAG (op, FLAG_USE_WEAPON); break; case KW_can_use_ring: GET_FLAG (op, FLAG_USE_RING); break; case KW_has_ready_bow: GET_FLAG (op, FLAG_READY_BOW); break; + case KW_has_ready_range: GET_FLAG (op, FLAG_READY_RANGE); break; case KW_xrays: GET_FLAG (op, FLAG_XRAYS); break; case KW_is_floor: GET_FLAG (op, FLAG_IS_FLOOR); break; case KW_lifesave: GET_FLAG (op, FLAG_LIFESAVE); break; @@ -1082,65 +1082,11 @@ int set_variable (object *op, char *buf) { - return 0; -#if 0 - int retval; - object_thawer thawer (0); + object_thawer thawer (buf, (AV *)0); - strcpy (msgbuf, ""); - strcpy (lorebuf, ""); - retval = parse_object (op, thawer, 0); - yy_switch_to_buffer (yycurbuf); - yy_delete_buffer (yybufstate); - yy_pop_state (); - return retval; -#endif + return parse_object (op, thawer, 0); } -/* This array equates the FLAG_ values with the V_ values. Use -1 to - * put gaps in the array that should not be processed. - * The order matches the order of the define values in 'define.h'. - */ - -/* This is a list of pointers that correspond to the FLAG_.. values. - * This is a simple 1:1 mapping - if FLAG_FRIENDLY is 15, then - * the 15'th element of this array should match that name. - * If an entry is NULL, that is a flag not to loaded/saved. - */ -static const char *const flag_names[NUM_FLAGS + 1] = { - "alive", "wiz", NULL, NULL, "was_wiz", "applied", "unpaid", - "can_use_shield", "no_pick", NULL /* walk_on */ , NULL /* no_pass */ , /* 10 */ - "is_animated", NULL /* slow_move */ , - NULL /* flying */ , "monster", "friendly", "generator", - "is_thrown", "auto_apply", "treasure", "player sold", /* 20 */ - "see_invisible", "can_roll", "overlay_floor", - "is_turnable", NULL /* walk_off */ , NULL /* fly_on */ , - NULL /*fly_off */ , "is_used_up", "identified", "reflecting", /* 30 */ - "changing", "splitting", "hitback", "startequip", - "blocksview", "undead", "scared", "unaggressive", - "reflect_missile", "reflect_spell", /* 40 */ - "no_magic", "no_fix_player", "is_lightable", "tear_down", - "run_away", NULL /*pass_thru */ , NULL /*can_pass_thru */ , - "pick_up", "unique", "no_drop", /* 50 */ - NULL /* wizcast */ , "can_cast_spell", "can_use_scroll", "can_use_range", - "can_use_bow", "can_use_armour", "can_use_weapon", - "can_use_ring", "has_ready_range", "has_ready_bow", /* 60 */ - "xrays", NULL, "is_floor", "lifesave", "no_strength", "sleep", - "stand_still", "random_move", "only_attack", "confused", /* 70 */ - "stealth", NULL, NULL, "cursed", "damned", - "see_anywhere", "known_magical", "known_cursed", - "can_use_skill", "been_applied", /* 80 */ - "has_ready_scroll", "can_use_rod", NULL, - "can_use_horn", "make_invisible", "inv_locked", "is_wooded", - "is_hilly", "has_ready_skill", "has_ready_weapon", /* 90 */ - "no_skill_ident", "is_blind", "can_see_in_dark", "is_cauldron", - "is_dust", "no_steal", "one_hit", NULL, "berserk", "neutral", /* 100 */ - "no_attack", "no_damage", NULL, NULL, "activate_on_push", - "activate_on_release", "is_water", "use_content_on_gen", NULL, "is_buildable", /* 110 */ - NULL -}; - - /* * Initialises the array of variable-names. Needed before any * objects can be loaded. Called by init_library(). @@ -1206,6 +1152,142 @@ void put (object_freezer &f, object *op, object *tmp) { + static const keyword resist_save[NROFATTACKS] = { +# define def(uc, lc, name, plus, change) KW_resist_ ## lc, +# include "attackinc.h" +# undef def + }; + + /* This is a list of keywords that correspond to the FLAG_.. values. + * This is a simple 1:1 mapping - if FLAG_FRIENDLY is 15, then + * the 15'th element of this array should match that name. + * If an entry is NULL, that is a flag not to loaded/saved. + */ + static const keyword flag_names [NUM_FLAGS] = { + KW_alive, + KW_wiz, + KW_NULL, + KW_NULL, + KW_was_wiz, + KW_applied, + KW_unpaid, + KW_can_use_shield, + KW_no_pick, + KW_NULL, // walk_on + KW_NULL, // no_pass + /* 10 */ + KW_is_animated, + KW_NULL, // slow_move + KW_NULL, // flying + KW_monster, + KW_friendly, + KW_generator, + KW_is_thrown, + KW_auto_apply, + KW_treasure, + KW_player_sold, + /* 20 */ + KW_see_invisible, + KW_can_roll, + KW_overlay_floor, + KW_is_turnable, + KW_NULL, // walk_off + KW_NULL, // fly_on + KW_NULL, // fly_off + KW_is_used_up, + KW_identified, + KW_reflecting, + /* 30 */ + KW_changing, + KW_splitting, + KW_hitback, + KW_startequip, + KW_blocksview, + KW_undead, + KW_scared, + KW_unaggressive, + KW_reflect_missile, + KW_reflect_spell, + /* 40 */ + KW_no_magic, + KW_no_fix_player, + KW_is_lightable, + KW_tear_down, + KW_run_away, + KW_NULL, // pass_thru + KW_NULL, // an_pass_thru + KW_pick_up, + KW_unique, + KW_no_drop, + /* 50 */ + KW_NULL, // wizcast + KW_can_cast_spell, + KW_can_use_scroll, + KW_can_use_range, + KW_can_use_bow, + KW_can_use_armour, + KW_can_use_weapon, + KW_can_use_ring, + KW_has_ready_range, + KW_has_ready_bow, + /* 60 */ + KW_xrays, + KW_NULL, + KW_is_floor, + KW_lifesave, + KW_no_strength, + KW_sleep, + KW_stand_still, + KW_random_move, + KW_only_attack, + KW_confused, + /* 70 */ + KW_stealth, + KW_NULL, + KW_NULL, + KW_cursed, + KW_damned, + KW_see_anywhere, + KW_known_magical, + KW_known_cursed, + KW_can_use_skill, + KW_been_applied, + /* 80 */ + KW_has_ready_scroll, + KW_can_use_rod, + KW_NULL, + KW_can_use_horn, + KW_make_invisible, + KW_inv_locked, + KW_is_wooded, + KW_is_hilly, + KW_has_ready_skill, + KW_has_ready_weapon, + /* 90 */ + KW_no_skill_ident, + KW_is_blind, + KW_can_see_in_dark, + KW_is_cauldron, + KW_NULL, + KW_no_steal, + KW_one_hit, + KW_NULL, + KW_berserk, + KW_neutral, + /* 100 */ + KW_no_attack, + KW_no_damage, + KW_NULL, + KW_NULL, + KW_activate_on_push, + KW_activate_on_release, + KW_is_water, + KW_use_content_on_gen, + KW_NULL, + KW_is_buildable, + /* 110 */ + }; + int i; /* This saves the key/value lists. We do it first so that any @@ -1217,12 +1299,12 @@ key_value *arch_field = get_ob_key_link (tmp, my_field->key); /* If there's no partnering field, or it's got a different value, save our field. */ - if (arch_field == NULL || my_field->value != arch_field->value) + if (!arch_field || my_field->value != arch_field->value) f.put (my_field->key, my_field->value); } /* We don't need to worry about the arch's extra fields - they - * will get taken care of the copy_object function. + * will get taken care of the copy_to method. */ { @@ -1249,9 +1331,6 @@ CMP_OUT (other_arch); CMP_OUT (face); - if (!op->face || !op->face->name) - printf ("ERRFACE<%s,%s, face %p,%p, fname%s>\n", &tmp->name, &op->name, tmp->face, op->face, op->face ? &op->face->name : ""); //D - if (op->animation_id != tmp->animation_id) if (op->animation_id) { @@ -1420,10 +1499,7 @@ } if (!(flag & 2)) - { - remove_ob (op); - free_object (op); - } + op->destroy (); fp.put (op); fprintf (fp, "end\n");