--- deliantra/server/common/arch.C 2007/04/16 15:41:26 1.51 +++ deliantra/server/common/arch.C 2007/04/17 18:40:31 1.53 @@ -318,14 +318,18 @@ op->destroy (); } -bool -archetype::load (object_thawer &f) +archetype * +archetype::read (object_thawer &f) { assert (f.kw == KW_object); + loading_arch = true; // hack to tell parse_kv et al. to behave + typedef std::pair part; std::vector parts; + coroapi::cede_to_tick_every (100); + for (;;) { archetype *at = get (f.get_str ()); @@ -403,78 +407,30 @@ prev = at; } - } - return true; + loading_arch = false; + return head; + } fail: for (auto (p, parts.begin ()); p != parts.end (); ++p) p->second->destroy (true); - return false; -} - -/* - * Reads/parses the archetype-file, and copies into a linked list - * of archetype-structures. - */ -static bool -load_archetypes (object_thawer &f) -{ - for (;;) - { - switch (f.kw) - { - case KW_object: - loading_arch = true; - if (!archetype::load (f)) - { - loading_arch = false; - return false; - } - - loading_arch = false; - continue; - - case KW_EOF: - return true; - - default: - if (!f.parse_error ("archetypes file")) - return false; - } - - f.next (); - } + loading_arch = false; + return 0; } /* - * First initialises the archtype hash-table (init_archetable()). - * Reads and parses the archetype file (with the first and second-pass - * functions). + * Initialize global archtype pointers: */ -bool -load_archetype_file (const char *filename) +void +init_archetype_pointers () { - object_thawer f (filename); - - f.next (); - - // make sure the next - long - step is only done after a tick - coroapi::wait_for_tick_begin (); - - if (!load_archetypes (f)) - return false; - - warn_archetypes = 1; - + ring_arch = archetype::find ("ring"); + amulet_arch = archetype::find ("amulet"); + staff_arch = archetype::find ("staff"); + crown_arch = archetype::find ("crown"); empty_archetype = archetype::find ("empty_archetype"); - if (!empty_archetype) - return false; - - coroapi::cede (); - - return true; } /* @@ -486,15 +442,14 @@ { if (!at) { - if (warn_archetypes) - LOG (llevError, "Couldn't find archetype.\n"); - - return NULL; + LOG (llevError, "Couldn't find archetype.\n"); + return 0; } object *op = at->clone.clone (); op->arch = at; op->instantiate (); + return op; }