ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/holy.C
Revision: 1.3
Committed: Thu Aug 31 17:54:14 2006 UTC (17 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.2: +0 -78 lines
Log Message:
rewrote object serialiser, parser is next

File Contents

# User Rev Content
1 elmex 1.1
2     /* Started file Sept 1996 - initialization of gods in form of a
3     * linked list -b.t.
4     */
5    
6     #include <global.h>
7     #include <living.h>
8     #include <spells.h>
9    
10     static godlink *init_godslist(void) {
11     godlink *gl = (godlink *) malloc(sizeof(godlink));
12     if(gl==NULL)
13     fatal(OUT_OF_MEMORY);
14     gl->name=NULL; /* how to describe the god to the player */
15     gl->arch=NULL; /* pointer to the archetype of this god */
16     gl->id=0; /* id of the god */
17     gl->pantheon=NULL; /* the group to which the god belongs (not implemented) */
18     gl->next=NULL; /* next god in this linked list */
19    
20     return gl;
21     }
22    
23     /* init_gods() - this takes a look at all of the archetypes to find
24     * the objects which correspond to the GODS (type GOD) */
25    
26     void init_gods (void) {
27     archetype *at=NULL;
28    
29     LOG(llevDebug, "Initializing gods...");
30     for(at=first_archetype;at!=NULL;at=at->next)
31     if(at->clone.type==GOD) add_god_to_list(at);
32    
33     LOG(llevDebug,"done.\n");
34     }
35    
36     /* add_god_to_list()- called only from init_gods */
37     void add_god_to_list (archetype *god_arch) {
38     godlink *god;
39    
40     if(!god_arch) {
41     LOG(llevError,"ERROR: Tried to add null god to list!\n");
42     return;
43     }
44    
45     god = init_godslist();
46    
47     god->arch = god_arch;
48     god->name=add_string(god_arch->clone.name);
49     if(!first_god)
50     god->id = 1;
51     else {
52     god->id = first_god->id + 1;
53     god->next = first_god;
54     }
55     first_god = god;
56    
57     #ifdef DEBUG_GODS
58     LOG(llevDebug,"Adding god %s (%d) to list\n",god->name,god->id);
59     #endif
60     }
61    
62     /* baptize_altar() - (cosmetically) change the name to that of the
63     * god in question, then set the title for later use. -b.t.
64     */
65    
66     int baptize_altar(object *op) {
67     char buf[MAX_BUF];
68    
69     /* if the title field is pre-set, then that altar is
70     * already dedicated. */
71     if(!op->title) {
72     godlink *god=get_rand_god();
73     if(!god||!god->name) {
74     LOG(llevError,"baptise_altar(): bizarre nameless god!\n");
75     return 0;
76     }
77     /* if the object name hasnt' been changed, we tack on the gods name */
78     if(!strcmp(op->name,op->arch->clone.name)) {
79     if(op->name!=NULL) free_string(op->name);
80     sprintf(buf,"%s of %s",op->name,god->name);
81     op->name = add_string(buf);
82     }
83     op->title=add_string(god->name);
84     return 1;
85     }
86     return 0;
87     }
88    
89     godlink * get_rand_god ( void ) {
90     godlink *god=first_god;
91     int i;
92    
93     if(god)
94     for(i=RANDOM()%(god->id)+1;god;god=god->next)
95     if(god->id==i) break;
96    
97     if(!god) LOG(llevError,"get_rand_god(): can't find a random god!\n");
98     return god;
99     }
100    
101     /* pntr_to_god_obj() - returns a pointer to the object
102     * We need to be VERY carefull about using this, as we
103     * are returning a pointer to the CLONE object. -b.t.
104     */
105     object *pntr_to_god_obj(godlink *godlnk) {
106     object *god=NULL;
107    
108     if(godlnk && godlnk->arch)
109     god=&godlnk->arch->clone;
110     return god;
111     }
112    
113     void free_all_god(void) {
114     godlink *god, *godnext;
115    
116     LOG(llevDebug,"Freeing god information\n");
117     for (god=first_god; god; god=godnext) {
118 root 1.2 godnext=god->next;
119     if (god->name) free_string(god->name);
120     free(god);
121 elmex 1.1 }
122     }
123    
124