--- deliantra/server/common/loader.C 2007/04/16 06:23:39 1.68 +++ deliantra/server/common/loader.C 2007/04/17 18:59:05 1.71 @@ -475,13 +475,6 @@ bool object::parse_kv (object_thawer &f) { - assert (f.kw == KW_object || f.kw == KW_arch); - - if (f.kw == KW_object) - f.get (name); // preset name from object name - - f.next (); - object *op_inv = inv; for (;;) @@ -992,6 +985,8 @@ assert (arch); //D maybe use exception handling of sorts? + f.next (); + object *op = object::create (); op->map = map; @@ -1019,7 +1014,7 @@ { object_thawer f (buf, (AV *)0); - f.kw = KW_arch; // special hack so that parse_kv skips + f.next (); return op->parse_kv (f); } @@ -1401,10 +1396,15 @@ ///////////////////////////////////////////////////////////////////////////// +// generic resource file load, +// currently supports: region, treasures, archetypes bool load_resource_file (const char *filename) { object_thawer f (filename); + bool success = false; + bool seen_arch = false; + f.next (); for (;;) @@ -1413,18 +1413,35 @@ { case KW_region: if (!region::read (f)) - return false; + goto finish; + break; + + case KW_treasure: + case KW_treasureone: + if (!treasurelist::read (f)) + goto finish; + break; + + case KW_object: + seen_arch = true; + if (!archetype::read (f)) + goto finish; break; case KW_EOF: - return true; + success = true; + goto finish; default: if (!f.parse_error ("resource file")) - return false; + goto finish; } - - f.next (); } + +finish: + if (seen_arch) + init_archetype_pointers (); + + return success; }