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

Comparing deliantra/server/common/object.C (file contents):
Revision 1.32 by root, Mon Sep 11 23:53:30 2006 UTC vs.
Revision 1.40 by root, Thu Sep 14 00:07:15 2006 UTC

29#include <stdio.h> 29#include <stdio.h>
30#include <sys/types.h> 30#include <sys/types.h>
31#include <sys/uio.h> 31#include <sys/uio.h>
32#include <object.h> 32#include <object.h>
33#include <funcpoint.h> 33#include <funcpoint.h>
34#include <skills.h>
35#include <loader.h> 34#include <loader.h>
36 35
37int nrofallocobjects = 0; 36int nrofallocobjects = 0;
37static UUID uuid;
38const uint64 UUID_SKIP = 1<<19;
38 39
39object *objects; /* Pointer to the list of used objects */ 40object *objects; /* Pointer to the list of used objects */
40object *active_objects; /* List of active objects that need to be processed */ 41object *active_objects; /* List of active objects that need to be processed */
41 42
42short freearr_x[SIZEOFFREE] = { 0, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1, 43short freearr_x[SIZEOFFREE] = { 0, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1,
50}; 51};
51int freedir[SIZEOFFREE] = { 52int freedir[SIZEOFFREE] = {
52 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 53 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8,
53 1, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8 54 1, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8
54}; 55};
56
57static void
58write_uuid (void)
59{
60 char filename1[MAX_BUF], filename2[MAX_BUF];
61
62 sprintf (filename1, "%s/uuid", settings.localdir);
63 sprintf (filename2, "%s/uuid~", settings.localdir);
64
65 FILE *fp;
66
67 if (!(fp = fopen (filename2, "w")))
68 {
69 LOG (llevError, "ERROR: cannot open %s for writing, unable to write UUID!\n", filename2);
70 return;
71 }
72
73 fprintf (fp, "<1,%llx>\n", (unsigned long long)uuid.seq + UUID_SKIP * 2);
74 fclose (fp);
75 rename (filename2, filename1);
76}
77
78static void
79read_uuid (void)
80{
81 char filename[MAX_BUF];
82
83 sprintf (filename, "%s/uuid", settings.localdir);
84
85 FILE *fp;
86
87 if (!(fp = fopen (filename, "r")))
88 {
89 if (errno == ENOENT)
90 {
91 LOG (llevInfo, "RESET uid to 1\n");
92 uuid.seq = 0;
93 write_uuid ();
94 return;
95 }
96
97 LOG (llevError, "FATAL: cannot open %s for reading!\n", filename);
98 _exit (1);
99 }
100
101 int version;
102 unsigned long long uid;
103 if (2 != fscanf (fp, "<%d,%llx>\n", &version, &uid) || version != 1)
104 {
105 LOG (llevError, "FATAL: error reading uid from %s!\n", filename);
106 _exit (1);
107 }
108
109 uuid.seq = uid;
110 write_uuid ();
111 LOG (llevDebug, "read UID: %lld\n", uid);
112 fclose (fp);
113}
114
115UUID
116gen_uuid ()
117{
118 UUID uid;
119
120 uid.seq = ++uuid.seq;
121
122 if (!(uuid.seq & (UUID_SKIP - 1)))
123 write_uuid ();
124
125 return uid;
126}
127
128void
129init_uuid ()
130{
131 read_uuid ();
132}
55 133
56/* Returns TRUE if every key_values in wants has a partner with the same value in has. */ 134/* Returns TRUE if every key_values in wants has a partner with the same value in has. */
57static int 135static int
58compare_ob_value_lists_one (const object *wants, const object *has) 136compare_ob_value_lists_one (const object *wants, const object *has)
59{ 137{
255 { 333 {
256 if (inv->inv) 334 if (inv->inv)
257 sum_weight (inv); 335 sum_weight (inv);
258 sum += inv->carrying + inv->weight * (inv->nrof ? inv->nrof : 1); 336 sum += inv->carrying + inv->weight * (inv->nrof ? inv->nrof : 1);
259 } 337 }
338
260 if (op->type == CONTAINER && op->stats.Str) 339 if (op->type == CONTAINER && op->stats.Str)
261 sum = (sum * (100 - op->stats.Str)) / 100; 340 sum = (sum * (100 - op->stats.Str)) / 100;
341
262 if (op->carrying != sum) 342 if (op->carrying != sum)
263 op->carrying = sum; 343 op->carrying = sum;
344
264 return sum; 345 return sum;
265} 346}
266 347
267/** 348/**
268 * Return the outermost environment object for a given object. 349 * Return the outermost environment object for a given object.
417 */ 498 */
418 499
419object * 500object *
420find_object_name (const char *str) 501find_object_name (const char *str)
421{ 502{
422 const char *name = shstr::find (str); 503 shstr_cmp str_ (str);
423 object *op; 504 object *op;
424 505
425 for (op = objects; op != NULL; op = op->next) 506 for (op = objects; op != NULL; op = op->next)
426 if (&op->name == name) 507 if (op->name == str_)
427 break; 508 break;
428 509
429 return op; 510 return op;
430} 511}
431 512
837 if (op->more != NULL) 918 if (op->more != NULL)
838 update_object (op->more, action); 919 update_object (op->more, action);
839} 920}
840 921
841static unordered_vector<object *> mortals; 922static unordered_vector<object *> mortals;
842static std::vector<object *> freed; 923static std::vector<object *, slice_allocator <object *> > freed;
843 924
844void object::free_mortals () 925void object::free_mortals ()
845{ 926{
846 for (unordered_vector<object *>::iterator i = mortals.begin (); i != mortals.end ();) 927 for (unordered_vector<object *>::iterator i = mortals.begin (); i != mortals.end ();)
847 if ((*i)->refcnt) 928 if ((*i)->refcnt)
848 ++i; // further delay freeing 929 ++i; // further delay freeing
849 else 930 else
850 { 931 {
851 freed.push_back (*i);//D 932 //freed.push_back (*i);//D
852 //delete *i; 933 delete *i;
853 mortals.erase (i); 934 mortals.erase (i);
854 } 935 }
855 936
856 if (mortals.size())//D 937 if (mortals.size() && 0)//D
857 LOG (llevDebug, "%d objects in mortal queue\n", mortals.size());//D 938 LOG (llevDebug, "%d objects in mortal queue\n", mortals.size());//D
858} 939}
859 940
860object::object () 941object::object ()
861{ 942{
885} 966}
886 967
887void object::unlink () 968void object::unlink ()
888{ 969{
889 count = 0; 970 count = 0;
971 uuid = gen_uuid ();
972
973 if (this == objects)
974 objects = next;
890 975
891 /* Remove this object from the list of used objects */ 976 /* Remove this object from the list of used objects */
892 if (prev) 977 if (prev)
893 { 978 {
894 prev->next = next; 979 prev->next = next;
898 if (next) 983 if (next)
899 { 984 {
900 next->prev = prev; 985 next->prev = prev;
901 next = 0; 986 next = 0;
902 } 987 }
903
904 if (this == objects)
905 objects = next;
906} 988}
907 989
908object *object::create () 990object *object::create ()
909{ 991{
910 object *op; 992 object *op;
1223 * This function goes through all objects below and including top, and 1305 * This function goes through all objects below and including top, and
1224 * merges op to the first matching object. 1306 * merges op to the first matching object.
1225 * If top is NULL, it is calculated. 1307 * If top is NULL, it is calculated.
1226 * Returns pointer to object if it succeded in the merge, otherwise NULL 1308 * Returns pointer to object if it succeded in the merge, otherwise NULL
1227 */ 1309 */
1228
1229object * 1310object *
1230merge_ob (object *op, object *top) 1311merge_ob (object *op, object *top)
1231{ 1312{
1232 if (!op->nrof) 1313 if (!op->nrof)
1233 return 0; 1314 return 0;
2721 * The returned string is shared. 2802 * The returned string is shared.
2722 */ 2803 */
2723const char * 2804const char *
2724get_ob_key_value (const object *op, const char *const key) 2805get_ob_key_value (const object *op, const char *const key)
2725{ 2806{
2726 key_value * 2807 key_value *link;
2727 link; 2808 shstr_cmp canonical_key (key);
2728 const char *
2729 canonical_key;
2730 2809
2731 canonical_key = shstr::find (key);
2732
2733 if (canonical_key == NULL) 2810 if (!canonical_key)
2734 { 2811 {
2735 /* 1. There being a field named key on any object 2812 /* 1. There being a field named key on any object
2736 * implies there'd be a shared string to find. 2813 * implies there'd be a shared string to find.
2737 * 2. Since there isn't, no object has this field. 2814 * 2. Since there isn't, no object has this field.
2738 * 3. Therefore, *this* object doesn't have this field. 2815 * 3. Therefore, *this* object doesn't have this field.
2739 */ 2816 */
2740 return NULL; 2817 return 0;
2741 } 2818 }
2742 2819
2743 /* This is copied from get_ob_key_link() above - 2820 /* This is copied from get_ob_key_link() above -
2744 * only 4 lines, and saves the function call overhead. 2821 * only 4 lines, and saves the function call overhead.
2745 */ 2822 */
2746 for (link = op->key_values; link != NULL; link = link->next) 2823 for (link = op->key_values; link; link = link->next)
2747 {
2748 if (link->key == canonical_key) 2824 if (link->key == canonical_key)
2749 {
2750 return link->value; 2825 return link->value;
2751 } 2826
2752 }
2753 return NULL; 2827 return 0;
2754} 2828}
2755 2829
2756 2830
2757/* 2831/*
2758 * Updates the canonical_key in op to value. 2832 * Updates the canonical_key in op to value.
2844 shstr key_ (key); 2918 shstr key_ (key);
2845 2919
2846 return set_ob_key_value_s (op, key_, value, add_key); 2920 return set_ob_key_value_s (op, key_, value, add_key);
2847} 2921}
2848 2922
2923object::depth_iterator::depth_iterator (object *container)
2924: iterator_base (container)
2925{
2926 while (item->inv)
2927 item = item->inv;
2928}
2929
2849void 2930void
2850object::deep_iterator::next () 2931object::depth_iterator::next ()
2851{ 2932{
2852 if (item->inv)
2853 item = item->inv;
2854 else if (item->below) 2933 if (item->below)
2934 {
2855 item = item->below; 2935 item = item->below;
2936
2937 while (item->inv)
2938 item = item->inv;
2939 }
2856 else 2940 else
2857 item = item->env->below; 2941 item = item->env;
2858} 2942}
2943
2944// return a suitable string describing an objetc in enough detail to find it
2945const char *
2946object::debug_desc (char *info) const
2947{
2948 char info2[256 * 3];
2949 char *p = info;
2950
2951 p += snprintf (p, 256, "%d=\"%s%s%s\"",
2952 count,
2953 &name,
2954 title ? " " : "",
2955 title ? (const char *)title : "");
2956
2957 if (env)
2958 p += snprintf (p, 256, "(in %s)", env->debug_desc (info2));
2959
2960 if (map)
2961 p += snprintf (p, 256, "(on %s@%d+%d)", map->path, x, y);
2962
2963 return info;
2964}
2965
2966const char *
2967object::debug_desc () const
2968{
2969 static char info[256 * 3];
2970 return debug_desc (info);
2971}
2972

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines