--- deliantra/server/common/loader.C 2006/09/12 19:20:06 1.14 +++ deliantra/server/common/loader.C 2006/09/13 02:05:19 1.15 @@ -502,941 +502,957 @@ switch (kw) { - case KW_Object: // uppercase alias - case KW_object: - thawer.get (op->name); - - if (op->arch != NULL) - op->arch->name = op->name; - - break; - - case KW_oid: - thawer.get (op, thawer.get_sint32 ()); - break; - - case KW_name: - thawer.get (op->name); - break; - case KW_name_pl: - thawer.get (op->name_pl); - break; - case KW_title: - thawer.get (op->title); - break; - case KW_custom_name: - thawer.get (op->custom_name); - break; - case KW_attach: - thawer.get_ornull (op->attach); - break; - case KW_skill: - thawer.get_ornull (op->skill); - break; - case KW_race: - thawer.get_ornull (op->race); - break; - case KW_slaying: - thawer.get_ornull (op->slaying); - break; + case KW_Object: // uppercase alias + case KW_object: + thawer.get (op->name); - case KW_arch: + if (op->arch != NULL) + op->arch->name = op->name; + + break; + + case KW_uuid: + if (const char *s = thawer.get_str ()) { - const char *str = thawer.get_str (); + unsigned int version; + unsigned long long seq; - if (op->arch) - { - /* If op->arch has been set, then this new object - * must be part of the inventory. So process - * appropriately. - */ - archetype *arch = find_archetype (str); - - object *tmp; - - if (arch != NULL) - tmp = arch_to_object (arch); - else - { - tmp = get_object (); - /* record the name of the broken object */ - tmp->name = str; - } - - parse_object (tmp, thawer, map_flags); - - if (tmp->arch) - { - // was: insert_ob_in_ob (tmp, op); - // but manually adding it can improve map loading times a lot - // also, appending instead of prepending keeps the - // save ordering the same between repeated load/saves. - CLEAR_FLAG (tmp, FLAG_OBJ_ORIGINAL); - CLEAR_FLAG (tmp, FLAG_REMOVED); - - if (!op_inv) - { - op->inv = tmp; - tmp->above = 0; - } - else - { - while (op_inv->below) - op_inv = op_inv->below; - - op_inv->below = tmp; - tmp->above = op_inv; - } - - tmp->below = 0; - tmp->env = op; - op_inv = tmp; - } - else - { - LOG (llevDebug, "Discarding object without arch: %s\n", tmp->name ? (const char *) tmp->name : "(null)"); - free_object (tmp); - } - } - else + if (2 == sscanf (s, "<%d.%llx>", &version, &seq) && version == 1) { - /* This is the actual archetype definition then */ - op->arch = find_archetype (str); - - if (op->arch != NULL) - copy_object (&op->arch->clone, op); - else if (!arch_init) - /* record the name of the broken object */ - op->name = str; + op->uuid.seq = seq; + break; } } - break; - case KW_other_arch: - op->other_arch = find_archetype (thawer.get_str ()); - break; + op->uuid = gen_uuid (); + break; - case KW_animation: - { - const char *str = thawer.get_str (); + case KW_oid: + thawer.get (op, thawer.get_sint32 ()); + break; - if (!str) - { - op->animation_id = 0; - CLEAR_FLAG (op, FLAG_ANIMATE); - } - else - { - op->animation_id = find_animation (str); - SET_FLAG (op, FLAG_ANIMATE); - } - } + case KW_name: + thawer.get (op->name); + break; + case KW_name_pl: + thawer.get (op->name_pl); + break; + case KW_title: + thawer.get (op->title); + break; + case KW_custom_name: + thawer.get (op->custom_name); + break; + case KW_attach: + thawer.get_ornull (op->attach); + break; + case KW_skill: + thawer.get_ornull (op->skill); + break; + case KW_race: + thawer.get_ornull (op->race); + break; + case KW_slaying: + thawer.get_ornull (op->slaying); + break; - break; + case KW_arch: + { + const char *str = thawer.get_str (); - case KW_last_heal: - thawer.get (op->last_heal); - break; - case KW_last_sp: - thawer.get (op->last_sp); - break; - case KW_last_grace: - thawer.get (op->last_grace); - break; - case KW_last_eat: - thawer.get (op->last_eat); - break; - case KW_speed_left: - thawer.get (op->speed_left); - break; + if (op->arch) + { + /* If op->arch has been set, then this new object + * must be part of the inventory. So process + * appropriately. + */ + archetype *arch = find_archetype (str); + + object *tmp; + + if (arch != NULL) + tmp = arch_to_object (arch); + else + { + tmp = get_object (); + /* record the name of the broken object */ + tmp->name = str; + } - case KW_speed: - thawer.get (op->speed); + parse_object (tmp, thawer, map_flags); - //TODO: maybe do in check_object - if (!(map_flags & MAP_STYLE)) + if (tmp->arch) + { + // was: insert_ob_in_ob (tmp, op); + // but manually adding it can improve map loading times a lot + // also, appending instead of prepending keeps the + // save ordering the same between repeated load/saves. + CLEAR_FLAG (tmp, FLAG_OBJ_ORIGINAL); + CLEAR_FLAG (tmp, FLAG_REMOVED); + + if (!op_inv) + { + op->inv = tmp; + tmp->above = 0; + } + else + { + while (op_inv->below) + op_inv = op_inv->below; + + op_inv->below = tmp; + tmp->above = op_inv; + } + + tmp->below = 0; + tmp->env = op; + op_inv = tmp; + } + else + { + LOG (llevDebug, "Discarding object without arch: %s\n", tmp->name ? (const char *) tmp->name : "(null)"); + free_object (tmp); + } + } + else { - if (op->speed < 0) - op->speed_left = op->speed_left - RANDOM () % 100 / 100.0; + /* This is the actual archetype definition then */ + op->arch = find_archetype (str); - update_ob_speed (op); + if (op->arch != NULL) + copy_object (&op->arch->clone, op); + else if (!arch_init) + /* record the name of the broken object */ + op->name = str; } + } + break; - break; + case KW_other_arch: + op->other_arch = find_archetype (thawer.get_str ()); + break; - case KW_slow_move: - op->move_slow |= MOVE_WALK; - thawer.get (op->move_slow_penalty); - break; - - case KW_face: - op->face = &new_faces[FindFace (thawer.get_str (), 0)]; - break; - - case KW_x: - thawer.get (op->x); - break; - case KW_y: - thawer.get (op->y); - break; - case KW_Str: // uppercase alias - case KW_str: - thawer.get (op->stats.Str); - break; - case KW_Dex: // uppercase alias - case KW_dex: - thawer.get (op->stats.Dex); - break; - case KW_Con: // uppercase alias - case KW_con: - thawer.get (op->stats.Con); - break; - case KW_Wis: // uppercase alias - case KW_wis: - thawer.get (op->stats.Wis); - break; - case KW_Cha: // uppercase alias - case KW_cha: - thawer.get (op->stats.Cha); - break; - case KW_Int: // uppercase alias - case KW_int: - thawer.get (op->stats.Int); - break; - case KW_Pow: // uppercase alias - case KW_pow: - thawer.get (op->stats.Pow); - break; - case KW_hp: - thawer.get (op->stats.hp); - break; - case KW_maxhp: - thawer.get (op->stats.maxhp); - break; - case KW_sp: - thawer.get (op->stats.sp); - break; - case KW_maxsp: - thawer.get (op->stats.maxsp); - break; - case KW_grace: - thawer.get (op->stats.grace); - break; - case KW_maxgrace: - thawer.get (op->stats.maxgrace); - break; - - case KW_exp: - thawer.get (op->stats.exp); - break; - case KW_perm_exp: - thawer.get (op->perm_exp); - break; - case KW_food: - thawer.get (op->stats.food); - break; - case KW_dam: - thawer.get (op->stats.dam); - break; - case KW_wc: - thawer.get (op->stats.wc); - break; - case KW_ac: - thawer.get (op->stats.ac); - break; - case KW_nrof: - thawer.get (op->nrof); - break; - case KW_level: - thawer.get (op->level); - break; - case KW_direction: - thawer.get (op->direction); - break; - case KW_type: - thawer.get (op->type); - break; - case KW_subtype: - thawer.get (op->subtype); - break; - case KW_value: - thawer.get (op->value); - break; - case KW_weight: - thawer.get (op->weight); - break; - case KW_carrying: - thawer.get (op->carrying); - break; - case KW_attacktype: - thawer.get (op->attacktype); - break; - case KW_path_attuned: - thawer.get (op->path_attuned); - break; - case KW_path_repelled: - thawer.get (op->path_repelled); - break; - case KW_path_denied: - thawer.get (op->path_denied); - break; - case KW_invisible: - thawer.get (op->invisible); - break; - case KW_magic: - thawer.get (op->magic); - break; - case KW_state: - thawer.get (op->state); - break; - case KW_move_slow_penalty: - thawer.get (op->move_slow_penalty); - break; - case KW_material: - thawer.get (op->material); - break; - case KW_materialname: - thawer.get (op->materialname); - break; - - /* These are the new values */ - case KW_move_block: - set_move (op->move_block, thawer.get_str ()); - break; - case KW_move_allow: - set_move (op->move_allow, thawer.get_str ()); - break; - case KW_move_type: - set_move (op->move_type, thawer.get_str ()); - break; - case KW_move_on: - set_move (op->move_on, thawer.get_str ()); - break; - case KW_move_off: - set_move (op->move_off, thawer.get_str ()); - break; - case KW_move_slow: - set_move (op->move_slow, thawer.get_str ()); - break; + case KW_animation: + { + const char *str = thawer.get_str (); - /* These are all legacy - any new objects should use the move_ .. values */ - case KW_no_pass: - { - if (thawer.get_sint32 ()) - op->move_block = MOVE_ALL; - else - op->move_block = 0; - } + if (!str) + { + op->animation_id = 0; + CLEAR_FLAG (op, FLAG_ANIMATE); + } + else + { + op->animation_id = find_animation (str); + SET_FLAG (op, FLAG_ANIMATE); + } + } - break; + break; - /* These are all legacy - any new objects should use the move_ .. values */ - case KW_walk_on: - { - if (thawer.get_sint32 ()) - op->move_on |= MOVE_WALK; - else - op->move_on &= ~MOVE_WALK; - } + case KW_last_heal: + thawer.get (op->last_heal); + break; + case KW_last_sp: + thawer.get (op->last_sp); + break; + case KW_last_grace: + thawer.get (op->last_grace); + break; + case KW_last_eat: + thawer.get (op->last_eat); + break; + case KW_speed_left: + thawer.get (op->speed_left); + break; - break; + case KW_speed: + thawer.get (op->speed); - /* These are all legacy - any new objects should use the move_ .. values */ - case KW_walk_off: + //TODO: maybe do in check_object + if (!(map_flags & MAP_STYLE)) { - if (thawer.get_sint32 ()) - op->move_off |= MOVE_WALK; - else - op->move_off &= ~MOVE_WALK; - } - break; + if (op->speed < 0) + op->speed_left = op->speed_left - RANDOM () % 100 / 100.0; - /* These are all legacy - any new objects should use the move_ .. values */ - case KW_fly_on: - { - if (thawer.get_sint32 ()) - op->move_on |= MOVE_FLY_LOW; - else - op->move_on &= ~MOVE_FLY_LOW; + update_ob_speed (op); } - break; - /* These are all legacy - any new objects should use the move_ .. values */ - case KW_fly_off: - { - if (thawer.get_sint32 ()) - op->move_off |= MOVE_FLY_LOW; - else - op->move_off &= ~MOVE_FLY_LOW; - } - break; + break; - //TODO: remove these after convertign archetypes - case KW_can_use_wand: - GET_FLAG (op, FLAG_USE_RANGE); - break; + case KW_slow_move: + op->move_slow |= MOVE_WALK; + thawer.get (op->move_slow_penalty); + break; - /* These are all legacy - any new objects should use the move_ .. values */ - case KW_flying: - { - if (thawer.get_sint32 ()) - op->move_type |= MOVE_FLY_LOW; - else - op->move_type &= ~MOVE_FLY_LOW; - } - break; + case KW_face: + op->face = &new_faces[FindFace (thawer.get_str (), 0)]; + break; + + case KW_x: + thawer.get (op->x); + break; + case KW_y: + thawer.get (op->y); + break; + case KW_Str: // uppercase alias + case KW_str: + thawer.get (op->stats.Str); + break; + case KW_Dex: // uppercase alias + case KW_dex: + thawer.get (op->stats.Dex); + break; + case KW_Con: // uppercase alias + case KW_con: + thawer.get (op->stats.Con); + break; + case KW_Wis: // uppercase alias + case KW_wis: + thawer.get (op->stats.Wis); + break; + case KW_Cha: // uppercase alias + case KW_cha: + thawer.get (op->stats.Cha); + break; + case KW_Int: // uppercase alias + case KW_int: + thawer.get (op->stats.Int); + break; + case KW_Pow: // uppercase alias + case KW_pow: + thawer.get (op->stats.Pow); + break; + case KW_hp: + thawer.get (op->stats.hp); + break; + case KW_maxhp: + thawer.get (op->stats.maxhp); + break; + case KW_sp: + thawer.get (op->stats.sp); + break; + case KW_maxsp: + thawer.get (op->stats.maxsp); + break; + case KW_grace: + thawer.get (op->stats.grace); + break; + case KW_maxgrace: + thawer.get (op->stats.maxgrace); + break; + + case KW_exp: + thawer.get (op->stats.exp); + break; + case KW_perm_exp: + thawer.get (op->perm_exp); + break; + case KW_food: + thawer.get (op->stats.food); + break; + case KW_dam: + thawer.get (op->stats.dam); + break; + case KW_wc: + thawer.get (op->stats.wc); + break; + case KW_ac: + thawer.get (op->stats.ac); + break; + case KW_nrof: + thawer.get (op->nrof); + break; + case KW_level: + thawer.get (op->level); + break; + case KW_direction: + thawer.get (op->direction); + break; + case KW_type: + thawer.get (op->type); + break; + case KW_subtype: + thawer.get (op->subtype); + break; + case KW_value: + thawer.get (op->value); + break; + case KW_weight: + thawer.get (op->weight); + break; + case KW_carrying: + thawer.get (op->carrying); + break; + case KW_attacktype: + thawer.get (op->attacktype); + break; + case KW_path_attuned: + thawer.get (op->path_attuned); + break; + case KW_path_repelled: + thawer.get (op->path_repelled); + break; + case KW_path_denied: + thawer.get (op->path_denied); + break; + case KW_invisible: + thawer.get (op->invisible); + break; + case KW_magic: + thawer.get (op->magic); + break; + case KW_state: + thawer.get (op->state); + break; + case KW_move_slow_penalty: + thawer.get (op->move_slow_penalty); + break; + case KW_material: + thawer.get (op->material); + break; + case KW_materialname: + thawer.get (op->materialname); + break; + /* These are the new values */ + case KW_move_block: + set_move (op->move_block, thawer.get_str ()); + break; + case KW_move_allow: + set_move (op->move_allow, thawer.get_str ()); + break; + case KW_move_type: + set_move (op->move_type, thawer.get_str ()); + break; + case KW_move_on: + set_move (op->move_on, thawer.get_str ()); + break; + case KW_move_off: + set_move (op->move_off, thawer.get_str ()); + break; + case KW_move_slow: + set_move (op->move_slow, thawer.get_str ()); + break; - case KW_identified: - GET_FLAG (op, FLAG_IDENTIFIED); - //TODO: move to check_object or so - if (QUERY_FLAG (op, FLAG_IDENTIFIED)) - CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL); + /* These are all legacy - any new objects should use the move_ .. values */ + case KW_no_pass: + { + if (thawer.get_sint32 ()) + op->move_block = MOVE_ALL; + else + op->move_block = 0; + } - break; + break; - case KW_wiz: - GET_FLAG (op, FLAG_WIZ); - //TODO: move to check_object - if (QUERY_FLAG (op, FLAG_WIZ)) - { - SET_FLAG (op, FLAG_WAS_WIZ); - SET_FLAG (op, FLAG_WIZPASS); - SET_FLAG (op, FLAG_WIZCAST); - } + /* These are all legacy - any new objects should use the move_ .. values */ + case KW_walk_on: + { + if (thawer.get_sint32 ()) + op->move_on |= MOVE_WALK; else - { - CLEAR_FLAG (op, FLAG_WIZPASS); - CLEAR_FLAG (op, FLAG_WIZCAST); - } - break; + op->move_on &= ~MOVE_WALK; + } - case KW_friendly: - GET_FLAG (op, FLAG_FRIENDLY); - //TODO: move to check_object or so - if (op->type != PLAYER && QUERY_FLAG (op, FLAG_FRIENDLY)) - add_friendly_object (op); - break; - - case KW_monster: - GET_FLAG (op, FLAG_MONSTER); - break; - case KW_neutral: - GET_FLAG (op, FLAG_NEUTRAL); - break; - case KW_no_attack: - GET_FLAG (op, FLAG_NO_ATTACK); - break; - case KW_no_damage: - GET_FLAG (op, FLAG_NO_DAMAGE); - break; - case KW_generator: - GET_FLAG (op, FLAG_GENERATOR); - break; - case KW_use_content_on_gen: - GET_FLAG (op, FLAG_CONTENT_ON_GEN); - break; - case KW_is_thrown: - GET_FLAG (op, FLAG_IS_THROWN); - break; - case KW_auto_apply: - GET_FLAG (op, FLAG_AUTO_APPLY); - break; - case KW_treasure: - GET_FLAG (op, FLAG_TREASURE); - break; - case KW_see_invisible: - GET_FLAG (op, FLAG_SEE_INVISIBLE); - break; - case KW_can_roll: - GET_FLAG (op, FLAG_CAN_ROLL); - break; - case KW_overlay_floor: - GET_FLAG (op, FLAG_OVERLAY_FLOOR); - break; - case KW_is_turnable: - GET_FLAG (op, FLAG_IS_TURNABLE); - break; - case KW_is_used_up: - GET_FLAG (op, FLAG_IS_USED_UP); - break; - case KW_alive: - GET_FLAG (op, FLAG_ALIVE); - break; - case KW_applied: - GET_FLAG (op, FLAG_APPLIED); - break; - case KW_unpaid: - GET_FLAG (op, FLAG_UNPAID); - break; - case KW_is_animated: - GET_FLAG (op, FLAG_ANIMATE); - break; - case KW_no_pick: - GET_FLAG (op, FLAG_NO_PICK); - break; - case KW_reflecting: - GET_FLAG (op, FLAG_REFLECTING); - break; - case KW_changing: - GET_FLAG (op, FLAG_CHANGING); - break; - case KW_splitting: - GET_FLAG (op, FLAG_SPLITTING); - break; - case KW_hitback: - GET_FLAG (op, FLAG_HITBACK); - break; - case KW_startequip: - GET_FLAG (op, FLAG_STARTEQUIP); - break; - case KW_blocksview: - GET_FLAG (op, FLAG_BLOCKSVIEW); - break; - case KW_undead: - GET_FLAG (op, FLAG_UNDEAD); - break; - case KW_scared: - GET_FLAG (op, FLAG_SCARED); - break; - case KW_unaggressive: - GET_FLAG (op, FLAG_UNAGGRESSIVE); - break; - case KW_reflect_missile: - GET_FLAG (op, FLAG_REFL_MISSILE); - break; - case KW_reflect_spell: - GET_FLAG (op, FLAG_REFL_SPELL); - break; - case KW_no_magic: - GET_FLAG (op, FLAG_NO_MAGIC); - break; - case KW_no_drop: - GET_FLAG (op, FLAG_NO_DROP); - break; - case KW_random_movement: - GET_FLAG (op, FLAG_RANDOM_MOVE); - break; - case KW_was_wiz: - GET_FLAG (op, FLAG_WAS_WIZ); - break; - case KW_no_fix_player: - GET_FLAG (op, FLAG_NO_FIX_PLAYER); - break; - case KW_is_lightable: - GET_FLAG (op, FLAG_IS_LIGHTABLE); - break; - case KW_tear_down: - GET_FLAG (op, FLAG_TEAR_DOWN); - break; - case KW_can_use_shield: - GET_FLAG (op, FLAG_USE_SHIELD); - break; - case KW_can_cast_spell: - GET_FLAG (op, FLAG_CAST_SPELL); - break; - case KW_can_use_scroll: - GET_FLAG (op, FLAG_USE_SCROLL); - break; - case KW_can_use_range: - GET_FLAG (op, FLAG_USE_RANGE); - break; - case KW_can_use_bow: - GET_FLAG (op, FLAG_USE_BOW); - break; - case KW_can_use_armour: - GET_FLAG (op, FLAG_USE_ARMOUR); - break; - 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_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; - case KW_no_strength: - GET_FLAG (op, FLAG_NO_STRENGTH); - break; - case KW_sleep: - GET_FLAG (op, FLAG_SLEEP); - break; - case KW_stand_still: - GET_FLAG (op, FLAG_STAND_STILL); - break; - case KW_random_move: - GET_FLAG (op, FLAG_RANDOM_MOVE); - break; - case KW_only_attack: - GET_FLAG (op, FLAG_ONLY_ATTACK); - break; - case KW_activate_on_push: - GET_FLAG (op, FLAG_ACTIVATE_ON_PUSH); - break; - case KW_activate_on_release: - GET_FLAG (op, FLAG_ACTIVATE_ON_RELEASE); - break; - case KW_confused: - GET_FLAG (op, FLAG_CONFUSED); - break; - case KW_stealth: - GET_FLAG (op, FLAG_STEALTH); - break; - case KW_cursed: - GET_FLAG (op, FLAG_CURSED); - break; - case KW_damned: - GET_FLAG (op, FLAG_DAMNED); - break; - case KW_see_anywhere: - GET_FLAG (op, FLAG_SEE_ANYWHERE); - break; - case KW_known_magical: - GET_FLAG (op, FLAG_KNOWN_MAGICAL); - break; - case KW_known_cursed: - GET_FLAG (op, FLAG_KNOWN_CURSED); - break; - case KW_can_use_skill: - GET_FLAG (op, FLAG_CAN_USE_SKILL); - break; - case KW_been_applied: - GET_FLAG (op, FLAG_BEEN_APPLIED); - break; - case KW_has_ready_scroll: - GET_FLAG (op, FLAG_READY_SCROLL); - break; - case KW_can_use_rod: - GET_FLAG (op, FLAG_USE_ROD); - break; - case KW_can_use_horn: - GET_FLAG (op, FLAG_USE_HORN); - break; - case KW_unique: - GET_FLAG (op, FLAG_UNIQUE); - break; - case KW_make_invisible: - GET_FLAG (op, FLAG_MAKE_INVIS); - break; - case KW_inv_locked: - GET_FLAG (op, FLAG_INV_LOCKED); - break; - case KW_is_wooded: - GET_FLAG (op, FLAG_IS_WOODED); - break; - case KW_is_hilly: - GET_FLAG (op, FLAG_IS_HILLY); - break; - case KW_is_water: - GET_FLAG (op, FLAG_IS_WATER); - break; - case KW_has_ready_skill: - GET_FLAG (op, FLAG_READY_SKILL); - break; - case KW_has_ready_weapon: - GET_FLAG (op, FLAG_READY_WEAPON); - break; - case KW_no_skill_ident: - GET_FLAG (op, FLAG_NO_SKILL_IDENT); - break; - case KW_is_blind: - GET_FLAG (op, FLAG_BLIND); - break; - case KW_can_see_in_dark: - GET_FLAG (op, FLAG_SEE_IN_DARK); - break; - case KW_is_cauldron: - GET_FLAG (op, FLAG_IS_CAULDRON); - break; - case KW_no_steal: - GET_FLAG (op, FLAG_NO_STEAL); - break; - case KW_one_hit: - GET_FLAG (op, FLAG_ONE_HIT); - break; - case KW_berserk: - GET_FLAG (op, FLAG_BERSERK); - break; - case KW_is_buildable: - GET_FLAG (op, FLAG_IS_BUILDABLE); - break; - - case KW_armour: - thawer.get (op->resist[ATNR_PHYSICAL]); - break; - case KW_resist_physical: - thawer.get (op->resist[ATNR_PHYSICAL]); - break; - case KW_resist_magic: - thawer.get (op->resist[ATNR_MAGIC]); - break; - case KW_resist_fire: - thawer.get (op->resist[ATNR_FIRE]); - break; - case KW_resist_electricity: - thawer.get (op->resist[ATNR_ELECTRICITY]); - break; - case KW_resist_cold: - thawer.get (op->resist[ATNR_COLD]); - break; - case KW_resist_confusion: - thawer.get (op->resist[ATNR_CONFUSION]); - break; - case KW_resist_acid: - thawer.get (op->resist[ATNR_ACID]); - break; - case KW_resist_drain: - thawer.get (op->resist[ATNR_DRAIN]); - break; - case KW_resist_weaponmagic: - thawer.get (op->resist[ATNR_WEAPONMAGIC]); - break; - case KW_resist_ghosthit: - thawer.get (op->resist[ATNR_GHOSTHIT]); - break; - case KW_resist_poison: - thawer.get (op->resist[ATNR_POISON]); - break; - case KW_resist_slow: - thawer.get (op->resist[ATNR_SLOW]); - break; - case KW_resist_paralyze: - thawer.get (op->resist[ATNR_PARALYZE]); - break; - case KW_resist_turn_undead: - thawer.get (op->resist[ATNR_TURN_UNDEAD]); - break; - case KW_resist_fear: - thawer.get (op->resist[ATNR_FEAR]); - break; - case KW_resist_cancellation: - thawer.get (op->resist[ATNR_CANCELLATION]); - break; - case KW_resist_deplete: - thawer.get (op->resist[ATNR_DEPLETE]); - break; - case KW_resist_death: - thawer.get (op->resist[ATNR_DEATH]); - break; - case KW_resist_chaos: - thawer.get (op->resist[ATNR_CHAOS]); - break; - case KW_resist_counterspell: - thawer.get (op->resist[ATNR_COUNTERSPELL]); - break; - case KW_resist_godpower: - thawer.get (op->resist[ATNR_GODPOWER]); - break; - case KW_resist_holyword: - thawer.get (op->resist[ATNR_HOLYWORD]); - break; - case KW_resist_blind: - thawer.get (op->resist[ATNR_BLIND]); - break; - case KW_resist_internal: - thawer.get (op->resist[ATNR_INTERNAL]); - break; - case KW_resist_life_stealing: - thawer.get (op->resist[ATNR_LIFE_STEALING]); - break; - case KW_resist_disease: - thawer.get (op->resist[ATNR_DISEASE]); - break; - - case KW_luck: - thawer.get (op->stats.luck); - break; - case KW_run_away: - thawer.get (op->run_away); - break; - case KW_pick_up: - thawer.get (op->pick_up); - break; - case KW_item_power: - thawer.get (op->item_power); - break; - case KW_gen_sp_armour: - thawer.get (op->gen_sp_armour); - break; - case KW_anim_speed: - thawer.get (op->anim_speed); - break; - case KW_container: - thawer.get (op->weight_limit); - break; - case KW_will_apply: - thawer.get (op->will_apply); - break; - case KW_attack_movement: - thawer.get (op->attack_movement); - break; - case KW_move_state: - thawer.get (op->move_status); - break; - case KW_expmul: - thawer.get (op->expmul); - break; - case KW_glow_radius: - thawer.get (op->glow_radius); - break; - case KW_weapontype: - thawer.get (op->weapontype); - break; - case KW_tooltype: - thawer.get (op->tooltype); - break; - case KW_casting_time: - thawer.get (op->casting_time); - break; - case KW_elevation: - thawer.get (op->elevation); - break; - case KW_smoothlevel: - thawer.get (op->smoothlevel); - break; - case KW_client_type: - thawer.get (op->client_type); - break; - case KW_duration: - thawer.get (op->duration); - break; - case KW_range: - thawer.get (op->range); - break; - case KW_range_modifier: - thawer.get (op->range_modifier); - break; - case KW_dam_modifier: - thawer.get (op->dam_modifier); - break; - case KW_duration_modifier: - thawer.get (op->duration_modifier); - break; - - //TODO: mechanism to ensure that KW_xxx is consecutive needed from include/preprocess - //TODO: parse from other include files - case KW_body_range: - thawer.get (op->body_info[0]); - break; - case KW_body_arm: - thawer.get (op->body_info[1]); - break; - case KW_body_torso: - thawer.get (op->body_info[2]); - break; - case KW_body_head: - thawer.get (op->body_info[3]); - break; - case KW_body_neck: - thawer.get (op->body_info[4]); - break; - case KW_body_skill: - thawer.get (op->body_info[5]); - break; - case KW_body_finger: - thawer.get (op->body_info[6]); - break; - case KW_body_shoulder: - thawer.get (op->body_info[7]); - break; - case KW_body_foot: - thawer.get (op->body_info[8]); - break; - case KW_body_hand: - thawer.get (op->body_info[9]); - break; - case KW_body_wrist: - thawer.get (op->body_info[10]); - break; - case KW_body_waist: - thawer.get (op->body_info[11]); - break; - case KW_can_apply: - break; - - case KW_connected: - add_button_link (op, op->map, thawer.get_sint32 ()); - break; - - case KW_randomitems: - op->randomitems = find_treasurelist (thawer.get_str ()); - break; + break; + + /* These are all legacy - any new objects should use the move_ .. values */ + case KW_walk_off: + { + if (thawer.get_sint32 ()) + op->move_off |= MOVE_WALK; + else + op->move_off &= ~MOVE_WALK; + } + break; + + /* These are all legacy - any new objects should use the move_ .. values */ + case KW_fly_on: + { + if (thawer.get_sint32 ()) + op->move_on |= MOVE_FLY_LOW; + else + op->move_on &= ~MOVE_FLY_LOW; + } + break; - case KW_msg: + /* These are all legacy - any new objects should use the move_ .. values */ + case KW_fly_off: + { + if (thawer.get_sint32 ()) + op->move_off |= MOVE_FLY_LOW; + else + op->move_off &= ~MOVE_FLY_LOW; + } + break; + + //TODO: remove these after convertign archetypes + case KW_can_use_wand: + GET_FLAG (op, FLAG_USE_RANGE); + break; + + /* These are all legacy - any new objects should use the move_ .. values */ + case KW_flying: + { + if (thawer.get_sint32 ()) + op->move_type |= MOVE_FLY_LOW; + else + op->move_type &= ~MOVE_FLY_LOW; + } + break; + + + case KW_identified: + GET_FLAG (op, FLAG_IDENTIFIED); + //TODO: move to check_object or so + if (QUERY_FLAG (op, FLAG_IDENTIFIED)) + CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL); + + break; + + case KW_wiz: + GET_FLAG (op, FLAG_WIZ); + //TODO: move to check_object + if (QUERY_FLAG (op, FLAG_WIZ)) { - thawer.get_ml (KW_endmsg, op->msg); - //TODO: allow longer messages - if (strlen (op->msg) >= HUGE_BUF) - { - LOG (llevDebug, "\n\tError message length >= %d: %d\n>%.80s<\n", HUGE_BUF, strlen (op->msg), &op->msg); - op->msg = "ERROR, please report: string too long, winged.\n"; - } + SET_FLAG (op, FLAG_WAS_WIZ); + SET_FLAG (op, FLAG_WIZPASS); + SET_FLAG (op, FLAG_WIZCAST); } - break; - - case KW_lore: + else { - shstr msgbuf; - - thawer.get_ml (KW_endlore, op->lore); - //TODO: allow longer messages - /* Just print a warning so we can be reasonably safe - * about not overflowing the buffer. - */ - if (strlen (op->lore) > (HUGE_BUF / 2)) - LOG (llevDebug, "\n\tWarning lore length > %d (max allowed=%d): %d\n>%.80s<\n", - HUGE_BUF / 2, HUGE_BUF, strlen (op->lore), &op->lore); + CLEAR_FLAG (op, FLAG_WIZPASS); + CLEAR_FLAG (op, FLAG_WIZCAST); } - break; + break; + + case KW_friendly: + GET_FLAG (op, FLAG_FRIENDLY); + //TODO: move to check_object or so + if (op->type != PLAYER && QUERY_FLAG (op, FLAG_FRIENDLY)) + add_friendly_object (op); + break; + + case KW_monster: + GET_FLAG (op, FLAG_MONSTER); + break; + case KW_neutral: + GET_FLAG (op, FLAG_NEUTRAL); + break; + case KW_no_attack: + GET_FLAG (op, FLAG_NO_ATTACK); + break; + case KW_no_damage: + GET_FLAG (op, FLAG_NO_DAMAGE); + break; + case KW_generator: + GET_FLAG (op, FLAG_GENERATOR); + break; + case KW_use_content_on_gen: + GET_FLAG (op, FLAG_CONTENT_ON_GEN); + break; + case KW_is_thrown: + GET_FLAG (op, FLAG_IS_THROWN); + break; + case KW_auto_apply: + GET_FLAG (op, FLAG_AUTO_APPLY); + break; + case KW_treasure: + GET_FLAG (op, FLAG_TREASURE); + break; + case KW_see_invisible: + GET_FLAG (op, FLAG_SEE_INVISIBLE); + break; + case KW_can_roll: + GET_FLAG (op, FLAG_CAN_ROLL); + break; + case KW_overlay_floor: + GET_FLAG (op, FLAG_OVERLAY_FLOOR); + break; + case KW_is_turnable: + GET_FLAG (op, FLAG_IS_TURNABLE); + break; + case KW_is_used_up: + GET_FLAG (op, FLAG_IS_USED_UP); + break; + case KW_alive: + GET_FLAG (op, FLAG_ALIVE); + break; + case KW_applied: + GET_FLAG (op, FLAG_APPLIED); + break; + case KW_unpaid: + GET_FLAG (op, FLAG_UNPAID); + break; + case KW_is_animated: + GET_FLAG (op, FLAG_ANIMATE); + break; + case KW_no_pick: + GET_FLAG (op, FLAG_NO_PICK); + break; + case KW_reflecting: + GET_FLAG (op, FLAG_REFLECTING); + break; + case KW_changing: + GET_FLAG (op, FLAG_CHANGING); + break; + case KW_splitting: + GET_FLAG (op, FLAG_SPLITTING); + break; + case KW_hitback: + GET_FLAG (op, FLAG_HITBACK); + break; + case KW_startequip: + GET_FLAG (op, FLAG_STARTEQUIP); + break; + case KW_blocksview: + GET_FLAG (op, FLAG_BLOCKSVIEW); + break; + case KW_undead: + GET_FLAG (op, FLAG_UNDEAD); + break; + case KW_scared: + GET_FLAG (op, FLAG_SCARED); + break; + case KW_unaggressive: + GET_FLAG (op, FLAG_UNAGGRESSIVE); + break; + case KW_reflect_missile: + GET_FLAG (op, FLAG_REFL_MISSILE); + break; + case KW_reflect_spell: + GET_FLAG (op, FLAG_REFL_SPELL); + break; + case KW_no_magic: + GET_FLAG (op, FLAG_NO_MAGIC); + break; + case KW_no_drop: + GET_FLAG (op, FLAG_NO_DROP); + break; + case KW_random_movement: + GET_FLAG (op, FLAG_RANDOM_MOVE); + break; + case KW_was_wiz: + GET_FLAG (op, FLAG_WAS_WIZ); + break; + case KW_no_fix_player: + GET_FLAG (op, FLAG_NO_FIX_PLAYER); + break; + case KW_is_lightable: + GET_FLAG (op, FLAG_IS_LIGHTABLE); + break; + case KW_tear_down: + GET_FLAG (op, FLAG_TEAR_DOWN); + break; + case KW_can_use_shield: + GET_FLAG (op, FLAG_USE_SHIELD); + break; + case KW_can_cast_spell: + GET_FLAG (op, FLAG_CAST_SPELL); + break; + case KW_can_use_scroll: + GET_FLAG (op, FLAG_USE_SCROLL); + break; + case KW_can_use_range: + GET_FLAG (op, FLAG_USE_RANGE); + break; + case KW_can_use_bow: + GET_FLAG (op, FLAG_USE_BOW); + break; + case KW_can_use_armour: + GET_FLAG (op, FLAG_USE_ARMOUR); + break; + 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_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; + case KW_no_strength: + GET_FLAG (op, FLAG_NO_STRENGTH); + break; + case KW_sleep: + GET_FLAG (op, FLAG_SLEEP); + break; + case KW_stand_still: + GET_FLAG (op, FLAG_STAND_STILL); + break; + case KW_random_move: + GET_FLAG (op, FLAG_RANDOM_MOVE); + break; + case KW_only_attack: + GET_FLAG (op, FLAG_ONLY_ATTACK); + break; + case KW_activate_on_push: + GET_FLAG (op, FLAG_ACTIVATE_ON_PUSH); + break; + case KW_activate_on_release: + GET_FLAG (op, FLAG_ACTIVATE_ON_RELEASE); + break; + case KW_confused: + GET_FLAG (op, FLAG_CONFUSED); + break; + case KW_stealth: + GET_FLAG (op, FLAG_STEALTH); + break; + case KW_cursed: + GET_FLAG (op, FLAG_CURSED); + break; + case KW_damned: + GET_FLAG (op, FLAG_DAMNED); + break; + case KW_see_anywhere: + GET_FLAG (op, FLAG_SEE_ANYWHERE); + break; + case KW_known_magical: + GET_FLAG (op, FLAG_KNOWN_MAGICAL); + break; + case KW_known_cursed: + GET_FLAG (op, FLAG_KNOWN_CURSED); + break; + case KW_can_use_skill: + GET_FLAG (op, FLAG_CAN_USE_SKILL); + break; + case KW_been_applied: + GET_FLAG (op, FLAG_BEEN_APPLIED); + break; + case KW_has_ready_scroll: + GET_FLAG (op, FLAG_READY_SCROLL); + break; + case KW_can_use_rod: + GET_FLAG (op, FLAG_USE_ROD); + break; + case KW_can_use_horn: + GET_FLAG (op, FLAG_USE_HORN); + break; + case KW_unique: + GET_FLAG (op, FLAG_UNIQUE); + break; + case KW_make_invisible: + GET_FLAG (op, FLAG_MAKE_INVIS); + break; + case KW_inv_locked: + GET_FLAG (op, FLAG_INV_LOCKED); + break; + case KW_is_wooded: + GET_FLAG (op, FLAG_IS_WOODED); + break; + case KW_is_hilly: + GET_FLAG (op, FLAG_IS_HILLY); + break; + case KW_is_water: + GET_FLAG (op, FLAG_IS_WATER); + break; + case KW_has_ready_skill: + GET_FLAG (op, FLAG_READY_SKILL); + break; + case KW_has_ready_weapon: + GET_FLAG (op, FLAG_READY_WEAPON); + break; + case KW_no_skill_ident: + GET_FLAG (op, FLAG_NO_SKILL_IDENT); + break; + case KW_is_blind: + GET_FLAG (op, FLAG_BLIND); + break; + case KW_can_see_in_dark: + GET_FLAG (op, FLAG_SEE_IN_DARK); + break; + case KW_is_cauldron: + GET_FLAG (op, FLAG_IS_CAULDRON); + break; + case KW_no_steal: + GET_FLAG (op, FLAG_NO_STEAL); + break; + case KW_one_hit: + GET_FLAG (op, FLAG_ONE_HIT); + break; + case KW_berserk: + GET_FLAG (op, FLAG_BERSERK); + break; + case KW_is_buildable: + GET_FLAG (op, FLAG_IS_BUILDABLE); + break; + + case KW_armour: + thawer.get (op->resist[ATNR_PHYSICAL]); + break; + case KW_resist_physical: + thawer.get (op->resist[ATNR_PHYSICAL]); + break; + case KW_resist_magic: + thawer.get (op->resist[ATNR_MAGIC]); + break; + case KW_resist_fire: + thawer.get (op->resist[ATNR_FIRE]); + break; + case KW_resist_electricity: + thawer.get (op->resist[ATNR_ELECTRICITY]); + break; + case KW_resist_cold: + thawer.get (op->resist[ATNR_COLD]); + break; + case KW_resist_confusion: + thawer.get (op->resist[ATNR_CONFUSION]); + break; + case KW_resist_acid: + thawer.get (op->resist[ATNR_ACID]); + break; + case KW_resist_drain: + thawer.get (op->resist[ATNR_DRAIN]); + break; + case KW_resist_weaponmagic: + thawer.get (op->resist[ATNR_WEAPONMAGIC]); + break; + case KW_resist_ghosthit: + thawer.get (op->resist[ATNR_GHOSTHIT]); + break; + case KW_resist_poison: + thawer.get (op->resist[ATNR_POISON]); + break; + case KW_resist_slow: + thawer.get (op->resist[ATNR_SLOW]); + break; + case KW_resist_paralyze: + thawer.get (op->resist[ATNR_PARALYZE]); + break; + case KW_resist_turn_undead: + thawer.get (op->resist[ATNR_TURN_UNDEAD]); + break; + case KW_resist_fear: + thawer.get (op->resist[ATNR_FEAR]); + break; + case KW_resist_cancellation: + thawer.get (op->resist[ATNR_CANCELLATION]); + break; + case KW_resist_deplete: + thawer.get (op->resist[ATNR_DEPLETE]); + break; + case KW_resist_death: + thawer.get (op->resist[ATNR_DEATH]); + break; + case KW_resist_chaos: + thawer.get (op->resist[ATNR_CHAOS]); + break; + case KW_resist_counterspell: + thawer.get (op->resist[ATNR_COUNTERSPELL]); + break; + case KW_resist_godpower: + thawer.get (op->resist[ATNR_GODPOWER]); + break; + case KW_resist_holyword: + thawer.get (op->resist[ATNR_HOLYWORD]); + break; + case KW_resist_blind: + thawer.get (op->resist[ATNR_BLIND]); + break; + case KW_resist_internal: + thawer.get (op->resist[ATNR_INTERNAL]); + break; + case KW_resist_life_stealing: + thawer.get (op->resist[ATNR_LIFE_STEALING]); + break; + case KW_resist_disease: + thawer.get (op->resist[ATNR_DISEASE]); + break; - case KW_editable: - case KW_editor_folder: - break; - - case KW_More: // uppercase alias - case KW_more: - /* We need to record that this is a multipart object, - * so the calling function can glue things back together + case KW_luck: + thawer.get (op->stats.luck); + break; + case KW_run_away: + thawer.get (op->run_away); + break; + case KW_pick_up: + thawer.get (op->pick_up); + break; + case KW_item_power: + thawer.get (op->item_power); + break; + case KW_gen_sp_armour: + thawer.get (op->gen_sp_armour); + break; + case KW_anim_speed: + thawer.get (op->anim_speed); + break; + case KW_container: + thawer.get (op->weight_limit); + break; + case KW_will_apply: + thawer.get (op->will_apply); + break; + case KW_attack_movement: + thawer.get (op->attack_movement); + break; + case KW_move_state: + thawer.get (op->move_status); + break; + case KW_expmul: + thawer.get (op->expmul); + break; + case KW_glow_radius: + thawer.get (op->glow_radius); + break; + case KW_weapontype: + thawer.get (op->weapontype); + break; + case KW_tooltype: + thawer.get (op->tooltype); + break; + case KW_casting_time: + thawer.get (op->casting_time); + break; + case KW_elevation: + thawer.get (op->elevation); + break; + case KW_smoothlevel: + thawer.get (op->smoothlevel); + break; + case KW_client_type: + thawer.get (op->client_type); + break; + case KW_duration: + thawer.get (op->duration); + break; + case KW_range: + thawer.get (op->range); + break; + case KW_range_modifier: + thawer.get (op->range_modifier); + break; + case KW_dam_modifier: + thawer.get (op->dam_modifier); + break; + case KW_duration_modifier: + thawer.get (op->duration_modifier); + break; + + //TODO: mechanism to ensure that KW_xxx is consecutive needed from include/preprocess + //TODO: parse from other include files + case KW_body_range: + thawer.get (op->body_info[0]); + break; + case KW_body_arm: + thawer.get (op->body_info[1]); + break; + case KW_body_torso: + thawer.get (op->body_info[2]); + break; + case KW_body_head: + thawer.get (op->body_info[3]); + break; + case KW_body_neck: + thawer.get (op->body_info[4]); + break; + case KW_body_skill: + thawer.get (op->body_info[5]); + break; + case KW_body_finger: + thawer.get (op->body_info[6]); + break; + case KW_body_shoulder: + thawer.get (op->body_info[7]); + break; + case KW_body_foot: + thawer.get (op->body_info[8]); + break; + case KW_body_hand: + thawer.get (op->body_info[9]); + break; + case KW_body_wrist: + thawer.get (op->body_info[10]); + break; + case KW_body_waist: + thawer.get (op->body_info[11]); + break; + case KW_can_apply: + break; + + case KW_connected: + add_button_link (op, op->map, thawer.get_sint32 ()); + break; + + case KW_randomitems: + op->randomitems = find_treasurelist (thawer.get_str ()); + break; + + case KW_msg: + { + thawer.get_ml (KW_endmsg, op->msg); + //TODO: allow longer messages + if (strlen (op->msg) >= HUGE_BUF) + { + LOG (llevDebug, "\n\tError message length >= %d: %d\n>%.80s<\n", HUGE_BUF, strlen (op->msg), &op->msg); + op->msg = "ERROR, please report: string too long, winged.\n"; + } + } + break; + + case KW_lore: + { + shstr msgbuf; + + thawer.get_ml (KW_endlore, op->lore); + //TODO: allow longer messages + /* Just print a warning so we can be reasonably safe + * about not overflowing the buffer. */ - ismore = 1; - break; + if (strlen (op->lore) > (HUGE_BUF / 2)) + LOG (llevDebug, "\n\tWarning lore length > %d (max allowed=%d): %d\n>%.80s<\n", + HUGE_BUF / 2, HUGE_BUF, strlen (op->lore), &op->lore); + } + break; - case KW_end: - check_loaded_object (op); + case KW_editable: + case KW_editor_folder: + break; - if (!arch_init) - op->instantiate (); + case KW_More: // uppercase alias + case KW_more: + /* We need to record that this is a multipart object, + * so the calling function can glue things back together + */ + ismore = 1; + break; - return ismore ? LL_MORE : LL_NORMAL; + case KW_end: + check_loaded_object (op); - case KW_EOF: - return LL_EOF; + if (!arch_init) + op->instantiate (); - case KW_ERROR: - set_ob_key_value (op, thawer.line, thawer.last_value, true); - //printf ("addkv(%s,%s)\n", thawer.line, thawer.get_str());//D + return ismore ? LL_MORE : LL_NORMAL; - //TODO: skip line, ugly, factor parsing better - if (thawer.last_value) - thawer.line = thawer.last_value; + case KW_EOF: + return LL_EOF; - thawer.line += strlen (thawer.line) + 1; + case KW_ERROR: + set_ob_key_value (op, thawer.line, thawer.last_value, true); + //printf ("addkv(%s,%s)\n", thawer.line, thawer.get_str());//D - break; + //TODO: skip line, ugly, factor parsing better + if (thawer.last_value) + thawer.line = thawer.last_value; - default: - LOG (llevError, "UNSUPPORTED KEYWORD IN MAP: \"%s\", bug in normaliser. skipping.\n", keyword_str[kw]); - break; + thawer.line += strlen (thawer.line) + 1; + + break; + + default: + LOG (llevError, "UNSUPPORTED KEYWORD IN MAP: \"%s\", bug in normaliser. skipping.\n", keyword_str[kw]); + break; } } } @@ -1594,7 +1610,7 @@ // compare *op against *tmp and output differences void -put (object_freezer & f, object *op, object *tmp) +put (object_freezer &f, object *op, object *tmp) { int i; @@ -1615,6 +1631,12 @@ * will get taken care of the copy_object function. */ + { + char uids[64]; + snprintf (uids, sizeof (uids), "<1.%llx>", (unsigned long long)op->uuid.seq); + f.put (KW_uuid, (const char *)uids); + } + #define CMP_OUT(v) if (op->v != tmp->v) f.put (KW_ ## v, op->v) #define CMP_OUT2(k,v) if (op->v != tmp->v) f.put (KW_ ## k, op->v) @@ -1812,3 +1834,4 @@ fp.put (op); fprintf (fp, "end\n"); } +