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.76 by root, Wed Apr 30 06:40:28 2008 UTC vs.
Revision 1.85 by root, Mon Sep 29 10:32:50 2008 UTC

102{ 102{
103 shstr_cmp skill_cmp (skill); 103 shstr_cmp skill_cmp (skill);
104 104
105 for_all_archetypes (at) 105 for_all_archetypes (at)
106 if (at->skill == skill_cmp && (type == -1 || type == at->type)) 106 if (at->skill == skill_cmp && (type == -1 || type == at->type))
107 return arch_to_object (at); 107 return at->instance ();
108 108
109 return 0; 109 return 0;
110} 110}
111 111
112/* similiar to above - this returns the first archetype 112/* similiar to above - this returns the first archetype
133 * - name: The name we're searching for (ex: "writing pen"); 133 * - name: The name we're searching for (ex: "writing pen");
134 * Return value: 134 * Return value:
135 * - a corresponding object if found; a singularity object if not found. 135 * - a corresponding object if found; a singularity object if not found.
136 * Note by MSW - it appears that it takes the full name and keeps 136 * Note by MSW - it appears that it takes the full name and keeps
137 * shortening it until it finds a match. I re-wrote this so that it 137 * shortening it until it finds a match. I re-wrote this so that it
138 * doesn't malloc it each time - not that this function is used much, 138 * doesn't allocate it each time - not that this function is used much,
139 * but it otherwise had a big memory leak. 139 * but it otherwise had a big memory leak.
140 */ 140 */
141object * 141object *
142get_archetype_by_object_name (const char *name) 142get_archetype_by_object_name (const char *name)
143{ 143{
149 for (i = strlen (tmpname); i > 0; i--) 149 for (i = strlen (tmpname); i > 0; i--)
150 { 150 {
151 tmpname[i] = 0; 151 tmpname[i] = 0;
152 152
153 if (archetype *at = find_archetype_by_object_name (tmpname)) 153 if (archetype *at = find_archetype_by_object_name (tmpname))
154 return arch_to_object (at); 154 return at->instance ();
155 } 155 }
156 156
157 return create_singularity (name); 157 return create_singularity (name);
158} 158}
159 159
440 return new_head; 440 return new_head;
441 } 441 }
442 442
443fail: 443fail:
444 for (auto (p, parts.begin ()); p != parts.end (); ++p) 444 for (auto (p, parts.begin ()); p != parts.end (); ++p)
445 (*p)->destroy (true); 445 (*p)->destroy ();
446 446
447 return 0; 447 return 0;
448} 448}
449 449
450void 450void
511 if (at->refcnt_cnt () > 1) // all arches have ONE refcount from their object 511 if (at->refcnt_cnt () > 1) // all arches have ONE refcount from their object
512 ++idx; 512 ++idx;
513 else 513 else
514 { 514 {
515 LOG (llevDebug, "garbage collect arch %s", at->debug_desc ()); 515 LOG (llevDebug, "garbage collect arch %s", at->debug_desc ());
516 assert (at->arch == at); // verify that refcnt == 1 is truely valid 516 assert (at->arch == at); // verify that refcnt == 1 is truly valid
517 allarch.erase (idx); 517 allarch.erase (idx);
518
519 // break chain
520 for (object *op = at->head_ (); op; )
521 {
522 object *next = op->more;
523 op->head = 0;
524 op->more = 0;
525 op = next;
526 }
527
528 at->destroy ();
518 at->arch = 0; 529 at->arch = 0;
519 at->more = 0;
520 at->destroy ();
521 } 530 }
522 } 531 }
523 while (--cnt); 532 while (--cnt);
524} 533}
525 534
526/*
527 * Creates and returns a new object which is a copy of the given archetype.
528 * This function returns NULL on failure.
529 */
530object * 535object *
531arch_to_object (archetype *at) 536archetype::instance ()
532{ 537{
533 if (!at)
534 {
535 LOG (llevError, "Couldn't find archetype.\n");
536 return 0;
537 }
538
539 object *op = at->clone (); 538 object *op = clone ();
540 op->arch = at;
541 op->instantiate (); 539 op->instantiate ();
542
543 return op; 540 return op;
544}
545
546object *
547archetype::instance ()
548{
549 return arch_to_object (this);
550} 541}
551 542
552/* 543/*
553 * Creates an object. This function is called by get_archetype() 544 * Creates an object. This function is called by get_archetype()
554 * if it fails to find the appropriate archetype. 545 * if it fails to find the appropriate archetype.
561 LOG (llevError | logBacktrace, "FATAL: creating singularity for '%s'.\n", name); 552 LOG (llevError | logBacktrace, "FATAL: creating singularity for '%s'.\n", name);
562 553
563 if (!strcmp (name, "bug")) 554 if (!strcmp (name, "bug"))
564 abort (); 555 abort ();
565 556
566 char buf[MAX_BUF];
567 sprintf (buf, "bug, please report (%s)", name);
568
569 object *op = get_archetype ("bug"); 557 object *op = archetype::get (shstr_bug);
570 op->name = op->name_pl = buf; 558 op->name = op->name_pl = format ("bug, please report (missing archetype %s)", name);
571 559
572 return op; 560 return op;
573} 561}
574 562
575/* 563/*
577 * object containing a copy of the archetype. 565 * object containing a copy of the archetype.
578 */ 566 */
579object * 567object *
580get_archetype (const char *name) 568get_archetype (const char *name)
581{ 569{
570 return archetype::get (name);
571}
572
573object *
574archetype::get (const char *name)
575{
582 archetype *at = archetype::find (name); 576 archetype *at = find (name);
583 577
584 if (!at) 578 if (!at)
585 return create_singularity (name); 579 return create_singularity (name);
586 580
587 return arch_to_object (at); 581 return at->instance ();
588}
589
590object *
591archetype::get (const char *name)
592{
593 return get_archetype (name);
594} 582}
595 583
596/* 584/*
597 * Returns the first archetype using the given type. 585 * Returns the first archetype using the given type.
598 * Used in treasure-generation. 586 * Used in treasure-generation.
613 * Used in treasure-generation. 601 * Used in treasure-generation.
614 */ 602 */
615object * 603object *
616clone_arch (int type) 604clone_arch (int type)
617{ 605{
618 archetype *at; 606 archetype *at = type_to_archetype (type);
619 607
620 if ((at = type_to_archetype (type)) == NULL) 608 if (!at)
621 { 609 {
622 LOG (llevError, "Can't clone archetype %d\n", type); 610 LOG (llevError, "Can't clone archetype %d\n", type);
623 return 0; 611 return 0;
624 } 612 }
625 613
626 object *op = at->clone (); 614 return at->instance ();
627 op->instantiate ();
628 return op;
629} 615}
630 616
631/* 617/*
632 * member: make instance from class 618 * member: make instance from class
633 */ 619 */
636{ 622{
637 object *op, *prev = 0, *head = 0; 623 object *op, *prev = 0, *head = 0;
638 624
639 while (at) 625 while (at)
640 { 626 {
641 op = arch_to_object (at); 627 op = at->instance ();
642 628
643 op->x = at->x; 629 op->x = at->x;
644 op->y = at->y; 630 op->y = at->y;
645 631
646 if (head) 632 if (head)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines