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.18 by root, Tue Sep 12 20:55:40 2006 UTC vs.
Revision 1.24 by root, Sat Sep 16 22:24:12 2006 UTC

16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 20
21 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 22*/
23 23
24#include <cassert> 24#include <cassert>
25 25
26#include <tr1/unordered_map> 26#include <tr1/unordered_map>
75 * - the archetype found or null if nothing was found. 75 * - the archetype found or null if nothing was found.
76 */ 76 */
77archetype * 77archetype *
78find_archetype_by_object_name (const char *name) 78find_archetype_by_object_name (const char *name)
79{ 79{
80 archetype * 80 archetype *at;
81 at;
82 81
83 if (name == NULL) 82 if (name == NULL)
84 return (archetype *) NULL; 83 return (archetype *) NULL;
85 84
86 for (at = first_archetype; at != NULL; at = at->next) 85 for (at = first_archetype; at != NULL; at = at->next)
97 * except that it considers only items of the given type. 96 * except that it considers only items of the given type.
98 */ 97 */
99archetype * 98archetype *
100find_archetype_by_object_type_name (int type, const char *name) 99find_archetype_by_object_type_name (int type, const char *name)
101{ 100{
102 archetype * 101 archetype *at;
103 at;
104 102
105 if (name == NULL) 103 if (name == NULL)
106 return NULL; 104 return NULL;
107 105
108 for (at = first_archetype; at != NULL; at = at->next) 106 for (at = first_archetype; at != NULL; at = at->next)
182 { 180 {
183 tmpname[i] = 0; 181 tmpname[i] = 0;
184 at = find_archetype_by_object_name (tmpname); 182 at = find_archetype_by_object_name (tmpname);
185 183
186 if (at != NULL) 184 if (at != NULL)
187 {
188 return arch_to_object (at); 185 return arch_to_object (at);
189 }
190 } 186 }
191 187
192 return create_singularity (name); 188 return create_singularity (name);
193} 189}
194 190
210 * Last, make a check on the full name. 206 * Last, make a check on the full name.
211 */ 207 */
212int 208int
213item_matched_string (object *pl, object *op, const char *name) 209item_matched_string (object *pl, object *op, const char *name)
214{ 210{
215 char *
216 cp,
217 local_name[MAX_BUF]; 211 char *cp, local_name[MAX_BUF];
218 int 212 int count, retval = 0;
219 count,
220 retval = 0;
221 213
222 strcpy (local_name, name); /* strtok is destructive to name */ 214 strcpy (local_name, name); /* strtok is destructive to name */
223 215
224 for (cp = strtok (local_name, ","); cp; cp = strtok (NULL, ",")) 216 for (cp = strtok (local_name, ","); cp; cp = strtok (NULL, ","))
225 { 217 {
277 retval = 15; 269 retval = 15;
278 else if (!strncasecmp (cp, query_base_name (op, 0), strlen (cp))) 270 else if (!strncasecmp (cp, query_base_name (op, 0), strlen (cp)))
279 retval = 14; 271 retval = 14;
280 else if (!strncasecmp (cp, query_base_name (op, 1), strlen (cp))) 272 else if (!strncasecmp (cp, query_base_name (op, 1), strlen (cp)))
281 retval = 14; 273 retval = 14;
282
283 /* Do substring checks, so things like 'Str+1' will match. 274 /* Do substring checks, so things like 'Str+1' will match.
284 * retval of these should perhaps be lower - they are lower 275 * retval of these should perhaps be lower - they are lower
285 * then the specific strcasecmp aboves, but still higher than 276 * then the specific strcasecmp aboves, but still higher than
286 * some other match criteria. 277 * some other match criteria.
287 */ 278 */
289 retval = 12; 280 retval = 12;
290 else if (strstr (query_base_name (op, 0), cp)) 281 else if (strstr (query_base_name (op, 0), cp))
291 retval = 12; 282 retval = 12;
292 else if (strstr (query_short_name (op), cp)) 283 else if (strstr (query_short_name (op), cp))
293 retval = 12; 284 retval = 12;
294
295 /* Check against plural/non plural based on count. */ 285 /* Check against plural/non plural based on count. */
296 else if (count > 1 && !strcasecmp (cp, op->name_pl)) 286 else if (count > 1 && !strcasecmp (cp, op->name_pl))
297 {
298 retval = 6; 287 retval = 6;
299 }
300 else if (count == 1 && !strcasecmp (op->name, cp)) 288 else if (count == 1 && !strcasecmp (op->name, cp))
301 {
302 retval = 6; 289 retval = 6;
303 }
304 /* base name matched - not bad */ 290 /* base name matched - not bad */
305 else if (strcasecmp (cp, op->name) == 0 && !count) 291 else if (strcasecmp (cp, op->name) == 0 && !count)
306 retval = 4; 292 retval = 4;
307 /* Check for partial custom name, but give a real low priority */ 293 /* Check for partial custom name, but give a real low priority */
308 else if (op->custom_name && strstr (op->custom_name, cp)) 294 else if (op->custom_name && strstr (op->custom_name, cp))
310 296
311 if (retval) 297 if (retval)
312 { 298 {
313 if (pl->type == PLAYER) 299 if (pl->type == PLAYER)
314 pl->contr->count = count; 300 pl->contr->count = count;
301
315 return retval; 302 return retval;
316 } 303 }
317 } 304 }
305
318 return 0; 306 return 0;
319} 307}
320 308
321/* 309/*
322 * Initialises the internal linked list of archetypes (read from file). 310 * Initialises the internal linked list of archetypes (read from file).
327void 315void
328init_archetypes (void) 316init_archetypes (void)
329{ /* called from add_player() and edit() */ 317{ /* called from add_player() and edit() */
330 if (first_archetype != NULL) /* Only do this once */ 318 if (first_archetype != NULL) /* Only do this once */
331 return; 319 return;
320
332 arch_init = 1; 321 arch_init = 1;
333 load_archetypes (); 322 load_archetypes ();
334 arch_init = 0; 323 arch_init = 0;
335 empty_archetype = find_archetype ("empty_archetype"); 324 empty_archetype = archetype::find ("empty_archetype");
336 325
337/* init_blocksview();*/ 326/* init_blocksview();*/
338} 327}
339 328
340/* 329/*
364 */ 353 */
365 354
366void 355void
367init_archetable (void) 356init_archetable (void)
368{ 357{
369 archetype * 358 archetype *at;
370 at;
371 359
372 LOG (llevDebug, " Setting up archetable...\n"); 360 LOG (llevDebug, " Setting up archetable...\n");
373 361
374 for (at = first_archetype; at != NULL; at = (at->more == NULL) ? at->next : at->more) 362 for (at = first_archetype; at != NULL; at = (at->more == NULL) ? at->next : at->more)
375 add_arch (at); 363 add_arch (at);
394 */ 382 */
395 383
396void 384void
397dump_all_archetypes (void) 385dump_all_archetypes (void)
398{ 386{
399 archetype * 387 archetype *at;
400 at;
401 388
402 for (at = first_archetype; at != NULL; at = (at->more == NULL) ? at->next : at->more) 389 for (at = first_archetype; at != NULL; at = (at->more == NULL) ? at->next : at->more)
403 { 390 {
404 dump_arch (at); 391 dump_arch (at);
405 fprintf (logfile, "%s\n", errmsg); 392 fprintf (logfile, "%s\n", errmsg);
407} 394}
408 395
409void 396void
410free_all_archs (void) 397free_all_archs (void)
411{ 398{
412 archetype * 399 archetype *at, *next;
413 at, *
414 next;
415 int
416 i = 0, f = 0; 400 int i = 0, f = 0;
417 401
418 for (at = first_archetype; at != NULL; at = next) 402 for (at = first_archetype; at != NULL; at = next)
419 { 403 {
420 if (at->more) 404 if (at->more)
421 next = at->more; 405 next = at->more;
446 * of archetype-structures. 430 * of archetype-structures.
447 */ 431 */
448void 432void
449first_arch_pass (object_thawer & fp) 433first_arch_pass (object_thawer & fp)
450{ 434{
451 archetype *
452 at, *
453 head = NULL, *last_more = NULL; 435 archetype *at, *head = NULL, *last_more = NULL;
454 436
455 at->clone.arch = first_archetype = at = new archetype; 437 at->clone.arch = first_archetype = at = new archetype;
456 438
457 while (int i = load_object (fp, &at->clone, 0)) 439 while (int i = load_object (fp, &at->clone, 0))
458 { 440 {
527 */ 509 */
528 510
529void 511void
530second_arch_pass (object_thawer & thawer) 512second_arch_pass (object_thawer & thawer)
531{ 513{
532 char
533 buf[MAX_BUF], *
534 variable = buf, *argument, *cp; 514 char buf[MAX_BUF], *variable = buf, *argument, *cp;
535 archetype *
536 at = NULL, *other; 515 archetype *at = NULL, *other;
537 516
538 while (fgets (buf, MAX_BUF, thawer) != NULL) 517 while (fgets (buf, MAX_BUF, thawer) != NULL)
539 { 518 {
540 if (*buf == '#') 519 if (*buf == '#')
541 continue; 520 continue;
549 cp--; 528 cp--;
550 } 529 }
551 } 530 }
552 if (!strcmp ("Object", variable)) 531 if (!strcmp ("Object", variable))
553 { 532 {
554 if ((at = find_archetype (argument)) == NULL) 533 if ((at = archetype::find (argument)) == NULL)
555 LOG (llevError, "Warning: failed to find arch %s\n", argument); 534 LOG (llevError, "Warning: failed to find arch %s\n", argument);
556 } 535 }
557 else if (!strcmp ("other_arch", variable)) 536 else if (!strcmp ("other_arch", variable))
558 { 537 {
559 if (at != NULL && at->clone.other_arch == NULL) 538 if (at != NULL && at->clone.other_arch == NULL)
560 { 539 {
561 if ((other = find_archetype (argument)) == NULL) 540 if ((other = archetype::find (argument)) == NULL)
562 LOG (llevError, "Warning: failed to find other_arch %s\n", argument); 541 LOG (llevError, "Warning: failed to find other_arch %s\n", argument);
563 else if (at != NULL) 542 else if (at != NULL)
564 at->clone.other_arch = other; 543 at->clone.other_arch = other;
565 } 544 }
566 } 545 }
567 else if (!strcmp ("randomitems", variable)) 546 else if (!strcmp ("randomitems", variable))
568 { 547 {
569 if (at != NULL) 548 if (at != NULL)
570 { 549 {
571 treasurelist *
572 tl = find_treasurelist (argument); 550 treasurelist *tl = find_treasurelist (argument);
573 551
574 if (tl == NULL) 552 if (tl == NULL)
575 LOG (llevError, "Failed to link treasure to arch (%s): %s\n", &at->name, argument); 553 LOG (llevError, "Failed to link treasure to arch (%s): %s\n", &at->name, argument);
576 else 554 else
577 at->clone.randomitems = tl; 555 at->clone.randomitems = tl;
582 560
583#ifdef DEBUG 561#ifdef DEBUG
584void 562void
585check_generators (void) 563check_generators (void)
586{ 564{
587 archetype * 565 archetype *at;
588 at;
589 566
590 for (at = first_archetype; at != NULL; at = at->next) 567 for (at = first_archetype; at != NULL; at = at->next)
591 if (QUERY_FLAG (&at->clone, FLAG_GENERATOR) && at->clone.other_arch == NULL) 568 if (QUERY_FLAG (&at->clone, FLAG_GENERATOR) && at->clone.other_arch == NULL)
592 LOG (llevError, "Warning: %s is generator but lacks other_arch.\n", &at->name); 569 LOG (llevError, "Warning: %s is generator but lacks other_arch.\n", &at->name);
593} 570}
601 */ 578 */
602 579
603void 580void
604load_archetypes (void) 581load_archetypes (void)
605{ 582{
606 char
607 filename[MAX_BUF]; 583 char filename[MAX_BUF];
608 584
609#if TIME_ARCH_LOAD 585#if TIME_ARCH_LOAD
610 struct timeval 586 struct timeval
611 tv1, 587 tv1,
612 tv2; 588 tv2;
650 */ 626 */
651 627
652object * 628object *
653arch_to_object (archetype *at) 629arch_to_object (archetype *at)
654{ 630{
655 object * 631 object *op;
656 op;
657 632
658 if (at == NULL) 633 if (at == NULL)
659 { 634 {
660 if (warn_archetypes) 635 if (warn_archetypes)
661 LOG (llevError, "Couldn't find archetype.\n"); 636 LOG (llevError, "Couldn't find archetype.\n");
678 */ 653 */
679 654
680object * 655object *
681create_singularity (const char *name) 656create_singularity (const char *name)
682{ 657{
683 object * 658 object *op;
684 op;
685 char
686 buf[MAX_BUF]; 659 char buf[MAX_BUF];
687 660
688 sprintf (buf, "%s (%s)", ARCH_SINGULARITY, name); 661 sprintf (buf, "%s (%s)", ARCH_SINGULARITY, name);
689 op = get_object (); 662 op = get_object ();
690 op->name = op->name_pl = buf; 663 op->name = op->name_pl = buf;
691 SET_FLAG (op, FLAG_NO_PICK); 664 SET_FLAG (op, FLAG_NO_PICK);
698 */ 671 */
699 672
700object * 673object *
701get_archetype (const char *name) 674get_archetype (const char *name)
702{ 675{
703 archetype * 676 archetype *at = archetype::find (name);
704 at;
705 677
706 at = find_archetype (name); 678 if (!at)
707 if (at == NULL)
708 return create_singularity (name); 679 return create_singularity (name);
709 680
710 return arch_to_object (at); 681 return arch_to_object (at);
711} 682}
712 683
715 */ 686 */
716 687
717unsigned long 688unsigned long
718hasharch (const char *str, int tablesize) 689hasharch (const char *str, int tablesize)
719{ 690{
720 unsigned long 691 unsigned long hash = 0;
721 hash = 0;
722 unsigned int 692 unsigned int i = 0;
723 i = 0;
724 const char * 693 const char *p;
725 p;
726 694
727 /* use the one-at-a-time hash function, which supposedly is 695 /* use the one-at-a-time hash function, which supposedly is
728 * better than the djb2-like one used by perl5.005, but 696 * better than the djb2-like one used by perl5.005, but
729 * certainly is better then the bug used here before. 697 * certainly is better then the bug used here before.
730 * see http://burtleburtle.net/bob/hash/doobs.html 698 * see http://burtleburtle.net/bob/hash/doobs.html
747 * Finds, using the hashtable, which archetype matches the given name. 715 * Finds, using the hashtable, which archetype matches the given name.
748 * returns a pointer to the found archetype, otherwise NULL. 716 * returns a pointer to the found archetype, otherwise NULL.
749 */ 717 */
750 718
751archetype * 719archetype *
752find_archetype (const char *name) 720archetype::find (const char *name)
753{ 721{
754#if USE_UNORDERED_MAP
755 name = shstr::find (name);
756
757 if (!name) 722 if (!name)
758 return 0; 723 return 0;
759 724
760 HT::const_iterator i = ht.find ((size_t) name); 725#if USE_UNORDERED_MAP
726 AUTODECL (i, ht.find ((size_t) name));
761 727
762 if (i == ht.end ()) 728 if (i == ht.end ())
763 return 0; 729 return 0;
764 else 730 else
765 return i->second; 731 return i->second;
766#endif 732#endif
767 733
768 archetype * 734 archetype *at;
769 at;
770 unsigned long 735 unsigned long index;
771 index;
772
773 if (name == NULL)
774 return (archetype *) NULL;
775 736
776 index = hasharch (name, ARCHTABLE); 737 index = hasharch (name, ARCHTABLE);
777 arch_search++; 738 arch_search++;
778 for (;;) 739 for (;;)
779 { 740 {
780 at = arch_table[index]; 741 at = arch_table[index];
742
781 if (at == NULL) 743 if (at == NULL)
782 { 744 {
783 if (warn_archetypes) 745 if (warn_archetypes)
784 LOG (llevError, "Couldn't find archetype %s\n", name); 746 LOG (llevError, "Couldn't find archetype %s\n", name);
747
785 return NULL; 748 return NULL;
786 } 749 }
750
787 arch_cmp++; 751 arch_cmp++;
752
788 if (!strcmp ((const char *) at->name, name)) 753 if (!strcmp ((const char *) at->name, name))
789 return at; 754 return at;
755
790 if (++index >= ARCHTABLE) 756 if (++index >= ARCHTABLE)
791 index = 0; 757 index = 0;
792 } 758 }
793} 759}
794 760
801{ 767{
802#if USE_UNORDERED_MAP 768#if USE_UNORDERED_MAP
803 ht.insert (std::make_pair ((size_t) (const char *) at->name, at)); 769 ht.insert (std::make_pair ((size_t) (const char *) at->name, at));
804#endif 770#endif
805 771
806 int
807 index = hasharch ((const char *) at->name, ARCHTABLE), org_index = index; 772 int index = hasharch ((const char *) at->name, ARCHTABLE), org_index = index;
808 773
809 for (;;) 774 for (;;)
810 { 775 {
811 if (arch_table[index] == NULL) 776 if (arch_table[index] == NULL)
812 { 777 {
828 */ 793 */
829 794
830archetype * 795archetype *
831type_to_archetype (int type) 796type_to_archetype (int type)
832{ 797{
833 archetype * 798 archetype *at;
834 at;
835 799
836 for (at = first_archetype; at != NULL; at = (at->more == NULL) ? at->next : at->more) 800 for (at = first_archetype; at; at = at->more == 0 ? at->next : at->more)
837 if (at->clone.type == type) 801 if (at->clone.type == type)
838 return at; 802 return at;
803
839 return NULL; 804 return 0;
840} 805}
841 806
842/* 807/*
843 * Returns a new object copied from the first archetype matching 808 * Returns a new object copied from the first archetype matching
844 * the given type. 809 * the given type.
846 */ 811 */
847 812
848object * 813object *
849clone_arch (int type) 814clone_arch (int type)
850{ 815{
851 archetype * 816 archetype *at;
852 at;
853 object *
854 op = get_object (); 817 object *op = get_object ();
855 818
856 if ((at = type_to_archetype (type)) == NULL) 819 if ((at = type_to_archetype (type)) == NULL)
857 { 820 {
858 LOG (llevError, "Can't clone archetype %d\n", type); 821 LOG (llevError, "Can't clone archetype %d\n", type);
859 free_object (op); 822 free_object (op);
860 return NULL; 823 return NULL;
861 } 824 }
825
862 copy_object (&at->clone, op); 826 copy_object (&at->clone, op);
863 op->instantiate (); 827 op->instantiate ();
864 return op; 828 return op;
865} 829}
866 830
869 */ 833 */
870 834
871object * 835object *
872object_create_arch (archetype *at) 836object_create_arch (archetype *at)
873{ 837{
874 object * 838 object *op, *prev = 0, *head = 0;
875 op, *
876 prev = NULL, *head = NULL;
877 839
878 while (at) 840 while (at)
879 { 841 {
880 op = arch_to_object (at); 842 op = arch_to_object (at);
881 op->x = at->clone.x; 843 op->x = at->clone.x;
882 op->y = at->clone.y; 844 op->y = at->clone.y;
845
883 if (head) 846 if (head)
884 op->head = head, prev->more = op; 847 op->head = head, prev->more = op;
848
885 if (!head) 849 if (!head)
886 head = op; 850 head = op;
851
887 prev = op; 852 prev = op;
888 at = at->more; 853 at = at->more;
889 } 854 }
855
890 return (head); 856 return (head);
891} 857}
892 858
893/*** end of arch.c ***/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines