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.71 by root, Thu Nov 8 19:43:23 2007 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software: you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * 20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */ 22 */
23 23
24#include <cassert> 24#include <cassert>
25 25
26#include <global.h> 26#include <global.h>
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:
512 op->instantiate (); 516 op->instantiate ();
513 517
514 return op; 518 return op;
515} 519}
516 520
521object *
522archetype::instance ()
523{
524 return arch_to_object (this);
525}
526
517/* 527/*
518 * Creates an object. This function is called by get_archetype() 528 * Creates an object. This function is called by get_archetype()
519 * if it fails to find the appropriate archetype. 529 * if it fails to find the appropriate archetype.
520 * Thus get_archetype() will be guaranteed to always return 530 * Thus get_archetype() will be guaranteed to always return
521 * an object, and never NULL. 531 * an object, and never NULL.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines