ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/arch.C
(Generate patch)

Comparing deliantra/server/common/arch.C (file contents):
Revision 1.68 by root, Sun Jul 1 05:00:17 2007 UTC vs.
Revision 1.69 by root, Tue Sep 4 18:20:35 2007 UTC

36 * return an object. Perhaps those should be called 'archob' functions 36 * return an object. Perhaps those should be called 'archob' functions
37 * to denote they return an object derived from the archetype. 37 * to denote they return an object derived from the archetype.
38 * MSW 2003-04-29 38 * MSW 2003-04-29
39 */ 39 */
40 40
41bool loading_arch; // ugly flag to object laoder etc. to suppress/request special processing 41archetype *loading_arch; // ugly flag to object laoder etc. to suppress/request special processing
42 42
43// the hashtable 43// the hashtable
44typedef std::tr1::unordered_map 44typedef std::tr1::unordered_map
45 < 45 <
46 const char *, 46 const char *,
299 299
300void 300void
301archetype::unlink () 301archetype::unlink ()
302{ 302{
303 ht.erase (archname); 303 ht.erase (archname);
304 if (!strcmp (&archname, "Gaea")) fprintf (stderr, "oI\n");//D 304
305 if (archetypes.contains (this)) 305 if (archetypes.contains (this))
306 archetypes.erase (this); 306 archetypes.erase (this);
307} 307}
308 308
309/* 309/*
331 { 331 {
332 LOG (llevError, "null archetype requested\n"); 332 LOG (llevError, "null archetype requested\n");
333 name = "(null)"; 333 name = "(null)";
334 } 334 }
335 335
336 if (loading_arch && !strcmp (&loading_arch->archname, name))
337 return loading_arch;
338
336 archetype *at = find (name); 339 archetype *at = find (name);
337 340
338 if (!at) 341 if (!at)
339 { 342 {
340 at = new archetype (name); 343 at = new archetype (name);
346 349
347archetype * 350archetype *
348archetype::read (object_thawer &f) 351archetype::read (object_thawer &f)
349{ 352{
350 assert (f.kw == KW_object); 353 assert (f.kw == KW_object);
351
352 loading_arch = true; // hack to tell parse_kv et al. to behave
353 354
354 std::vector<archetype *> parts; 355 std::vector<archetype *> parts;
355 356
356 coroapi::cede_to_tick_every (10); 357 coroapi::cede_to_tick_every (10);
357 358
381 382
382 f.next (); 383 f.next ();
383 } 384 }
384#endif 385#endif
385 386
387 loading_arch = at; // hack to tell parse_kv et al. to behave
388 bool parse_ok = at->parse_kv (f);
389 loading_arch = 0;
390
386 if (!at->parse_kv (f)) 391 if (!parse_ok)
387 goto fail; 392 goto fail;
388 393
394 loading_arch = at; // hack to tell parse_kv et al. to behave
389 at->post_load_check (); 395 at->post_load_check ();
396 loading_arch = 0;
390 397
391 parts.push_back (at); 398 parts.push_back (at);
392 399
393 if (f.kw != KW_more) 400 if (f.kw != KW_more)
394 break; 401 break;
399 { 406 {
400 f.parse_error ("more object"); 407 f.parse_error ("more object");
401 goto fail; 408 goto fail;
402 } 409 }
403 } 410 }
404
405 loading_arch = false;
406 411
407 { 412 {
408 auto (at, parts.begin ()); 413 auto (at, parts.begin ());
409 414
410 archetype *new_head = parts.front (); 415 archetype *new_head = parts.front ();
475 480
476fail: 481fail:
477 for (auto (p, parts.begin ()); p != parts.end (); ++p) 482 for (auto (p, parts.begin ()); p != parts.end (); ++p)
478 (*p)->destroy (true); 483 (*p)->destroy (true);
479 484
480 loading_arch = false;
481 return 0; 485 return 0;
482} 486}
483 487
484/* 488/*
485 * Initialize global archtype pointers: 489 * Initialize global archtype pointers:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines