--- deliantra/server/common/loader.C 2006/09/03 22:45:55 1.1 +++ deliantra/server/common/loader.C 2006/09/08 16:51:42 1.10 @@ -501,9 +501,10 @@ else \ CLEAR_FLAG (op, flag) \ -int parse_object (object * op, object_thawer & thawer, int map_flags) +int parse_object (object *op, object_thawer &thawer, int map_flags) { bool ismore = 0; + object *op_inv = op->inv; for (;;) { @@ -511,6 +512,7 @@ switch (kw) { + case KW_Object: // uppercase alias case KW_object: thawer.get (op->name); @@ -556,7 +558,32 @@ parse_object (tmp, thawer, map_flags); if (tmp->arch) - insert_ob_in_ob (tmp, op); + { + // 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", @@ -627,16 +654,22 @@ 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; @@ -967,6 +1000,7 @@ 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 @@ -986,16 +1020,20 @@ return LL_EOF; case KW_ERROR: - set_ob_key_value(op, thawer.line, thawer.last_value, true); + set_ob_key_value (op, thawer.line, thawer.last_value, true); //printf ("addkv(%s,%s)\n", thawer.line, thawer.get_str());//D - // skip line, ugly - thawer.line = thawer.last_value + strlen (thawer.last_value) + 1; + //TODO: skip line, ugly, factor parsing better + if (thawer.last_value) + thawer.line = thawer.last_value; + + thawer.line += strlen (thawer.line) + 1; + break; default: - printf ("kw abort %d\n", kw);//D - abort (); + LOG (llevError, "UNSUPPORTED KEYWORD IN MAP: \"%s\", bug in normaliser. skipping.\n", keyword_str [kw]); + break; } } } @@ -1026,7 +1064,10 @@ * This function appears to be used in only 2 places - in crossedit to * override values and in c_wiz to mutate values. */ -int set_variable(object *op,char *buf) { +int +set_variable(object *op, char *buf) +{ + return 0; #if 0 int retval; object_thawer thawer (0); @@ -1093,6 +1134,8 @@ } /* This returns a string of the integer movement type */ +#if 0 +// unused function static char* get_string_move_type(MoveType mt) { static char retbuf[MAX_BUF], retbuf_all[MAX_BUF]; @@ -1130,7 +1173,7 @@ if (all_count <=1) return retbuf_all+1; else return retbuf+1; } - +#endif // compare *op against *tmp and output differences void @@ -1171,16 +1214,19 @@ 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) { f.put (KW_animation, animations[GET_ANIM_ID (op)].name); if (!QUERY_FLAG (op, FLAG_ANIMATE)) - f.put (KW_is_animated, 0); + f.put (KW_is_animated, (sint32)0); } else - f.put (KW_animation, "NONE"); + f.put (KW_animation, (const char *)0); CMP_OUT2 (str , stats.Str); CMP_OUT2 (dex , stats.Dex); @@ -1274,7 +1320,7 @@ for (i = 0; i <= NUM_FLAGS; i++) if (flag_names [i] && (QUERY_FLAG (op, i) != QUERY_FLAG (tmp, i))) - f.put (flag_names [i], QUERY_FLAG (op, i) ? "1" : 0); + f.put (flag_names [i], QUERY_FLAG (op, i) ? "1" : "0"); /* Save body locations */ for (i = 0; i < NUM_BODY_LOCATIONS; i++)