Crossfire Server, Branch 1.12  R12190
holy.c
Go to the documentation of this file.
00001 /*
00002  * static char *rcsid_holy_c =
00003  *   "$Id: holy.c 11578 2009-02-23 22:02:27Z lalo $";
00004  */
00005 
00006 /*
00007     CrossFire, A Multiplayer game for X-windows
00008 
00009     Copyright (C) 2006 Mark Wedel & Crossfire Development Team
00010     Copyright (C) 1992 Frank Tore Johansen
00011 
00012     This program is free software; you can redistribute it and/or modify
00013     it under the terms of the GNU General Public License as published by
00014     the Free Software Foundation; either version 2 of the License, or
00015     (at your option) any later version.
00016 
00017     This program is distributed in the hope that it will be useful,
00018     but WITHOUT ANY WARRANTY; without even the implied warranty of
00019     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020     GNU General Public License for more details.
00021 
00022     You should have received a copy of the GNU General Public License
00023     along with this program; if not, write to the Free Software
00024     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00025 
00026     The authors can be reached via e-mail at crossfire-devel@real-time.com
00027 */
00028 
00034 #include <stdlib.h>
00035 #include <global.h>
00036 #include <living.h>
00037 #include <spells.h>
00038 
00039 static void add_god_to_list(archetype *god_arch);
00040 
00047 static godlink *init_godslist(void) {
00048     godlink *gl = (godlink *)malloc(sizeof(godlink));
00049     if (gl == NULL)
00050         fatal(OUT_OF_MEMORY);
00051     gl->name = NULL;    /* how to describe the god to the player */
00052     gl->arch = NULL;    /* pointer to the archetype of this god */
00053     gl->id = 0;         /* id of the god */
00054     gl->next = NULL;    /* next god in this linked list */
00055 
00056     return gl;
00057 }
00058 
00063 void init_gods(void) {
00064     archetype *at = NULL;
00065 
00066     LOG(llevDebug, "Initializing gods...\n");
00067     for (at = first_archetype; at != NULL; at = at->next)
00068         if (at->clone.type == GOD)
00069             add_god_to_list(at);
00070 
00071     LOG(llevDebug, "done.\n");
00072 }
00073 
00080 static void add_god_to_list(archetype *god_arch) {
00081     godlink *god;
00082 
00083     if (!god_arch) {
00084         LOG(llevError, "ERROR: Tried to add null god to list!\n");
00085         return;
00086     }
00087 
00088     god = init_godslist();
00089 
00090     god->arch = god_arch;
00091     god->name = add_string(god_arch->clone.name);
00092     if (!first_god)
00093         god->id = 1;
00094     else {
00095         god->id = first_god->id+1;
00096         god->next = first_god;
00097     }
00098     first_god = god;
00099 
00100 #ifdef DEBUG_GODS
00101     LOG(llevDebug, "Adding god %s (%d) to list\n", god->name, god->id);
00102 #endif
00103 }
00104 
00111 godlink *get_rand_god(void) {
00112     godlink *god = first_god;
00113     int i;
00114 
00115     if (god)
00116         for (i = RANDOM()%(god->id)+1; god; god = god->next)
00117             if (god->id == i)
00118                 break;
00119 
00120     if (!god)
00121         LOG(llevError, "get_rand_god(): can't find a random god!\n");
00122     return god;
00123 }
00124 
00133 const object *pntr_to_god_obj(godlink *godlnk) {
00134     if (godlnk && godlnk->arch)
00135         return &godlnk->arch->clone;
00136     return NULL;
00137 }
00138 
00142 void free_all_god(void) {
00143     godlink *god, *godnext;
00144 
00145     LOG(llevDebug, "Freeing god information\n");
00146     for (god = first_god; god; god = godnext) {
00147         godnext = god->next;
00148         if (god->name)
00149             free_string(god->name);
00150         free(god);
00151     }
00152     first_god = NULL;
00153 }
00154 
00161 void dump_gods(void) {
00162     godlink *glist;
00163 
00164     fprintf(stderr, "\n");
00165     for (glist = first_god; glist; glist = glist->next) {
00166         const object *god = pntr_to_god_obj(glist);
00167         char tmpbuf[HUGE_BUF];
00168         int tmpvar, gifts = 0;
00169 
00170         fprintf(stderr, "GOD: %s\n", god->name);
00171         fprintf(stderr, " avatar stats:\n");
00172         fprintf(stderr, "  S:%d C:%d D:%d I:%d W:%d P:%d\n", god->stats.Str, god->stats.Con, god->stats.Dex, god->stats.Int, god->stats.Wis, god->stats.Pow);
00173         fprintf(stderr, "  lvl:%d speed:%4.2f\n", god->level, god->speed);
00174         fprintf(stderr, "  wc:%d ac:%d hp:%d dam:%d\n", god->stats.wc, god->stats.ac, god->stats.hp, god->stats.dam);
00175         fprintf(stderr, " enemy: %s\n", god->title ? god->title : "NONE");
00176         if (god->other_arch) {
00177             object *serv = &god->other_arch->clone;
00178             fprintf(stderr, " servant stats: (%s)\n", god->other_arch->name);
00179             fprintf(stderr, "  S:%d C:%d D:%d I:%d W:%d P:%d\n", serv->stats.Str, serv->stats.Con, serv->stats.Dex, serv->stats.Int, serv->stats.Wis, serv->stats.Pow);
00180             fprintf(stderr, "  lvl:%d speed:%4.2f\n", serv->level, serv->speed);
00181             fprintf(stderr, "  wc:%d ac:%d hp:%d dam:%d\n", serv->stats.wc, serv->stats.ac, serv->stats.hp, serv->stats.dam);
00182         } else
00183             fprintf(stderr, " servant: NONE\n");
00184         fprintf(stderr, " aligned_race(s): %s\n", god->race);
00185         fprintf(stderr, " enemy_race(s): %s\n", (god->slaying ? god->slaying : "none"));
00186         describe_resistance(god, 1, tmpbuf, HUGE_BUF);
00187         fprintf(stderr, "%s", tmpbuf);
00188         snprintf(tmpbuf, sizeof(tmpbuf), " attacktype:");
00189         if ((tmpvar = god->attacktype)) {
00190             strcat(tmpbuf, "\n  ");
00191             DESCRIBE_ABILITY(tmpbuf, tmpvar, "Attacks");
00192         }
00193         strcat(tmpbuf, "\n aura:");
00194 
00195         strcat(tmpbuf, "\n paths:");
00196         if ((tmpvar = god->path_attuned)) {
00197             strcat(tmpbuf, "\n  ");
00198             DESCRIBE_PATH(tmpbuf, tmpvar, "Attuned");
00199         }
00200         if ((tmpvar = god->path_repelled)) {
00201             strcat(tmpbuf, "\n  ");
00202             DESCRIBE_PATH(tmpbuf, tmpvar, "Repelled");
00203         }
00204         if ((tmpvar = god->path_denied)) {
00205             strcat(tmpbuf, "\n  ");
00206             DESCRIBE_PATH(tmpbuf, tmpvar, "Denied");
00207         }
00208         fprintf(stderr, "%s\n", tmpbuf);
00209         fprintf(stderr, " Desc: %s", god->msg ? god->msg : "---\n");
00210         fprintf(stderr, " Priest gifts/limitations: ");
00211         if (!QUERY_FLAG(god, FLAG_USE_WEAPON)) { gifts = 1; fprintf(stderr, "\n  weapon use is forbidden"); }
00212         if (!QUERY_FLAG(god, FLAG_USE_ARMOUR)) { gifts = 1; fprintf(stderr, "\n  no armour may be worn"); }
00213         if (QUERY_FLAG(god, FLAG_UNDEAD)) { gifts = 1; fprintf(stderr, "\n  is undead"); }
00214         if (QUERY_FLAG(god, FLAG_SEE_IN_DARK)) { gifts = 1; fprintf(stderr, "\n  has infravision "); }
00215         if (QUERY_FLAG(god, FLAG_XRAYS)) { gifts = 1; fprintf(stderr, "\n  has X-ray vision"); }
00216         if (QUERY_FLAG(god, FLAG_REFL_MISSILE)) { gifts = 1; fprintf(stderr, "\n  reflect missiles"); }
00217         if (QUERY_FLAG(god, FLAG_REFL_SPELL)) { gifts = 1; fprintf(stderr, "\n  reflect spells"); }
00218         if (QUERY_FLAG(god, FLAG_STEALTH)) { gifts = 1; fprintf(stderr, "\n  is stealthy"); }
00219         if (QUERY_FLAG(god, FLAG_MAKE_INVIS)) { gifts = 1; fprintf(stderr, "\n  is (permanently) invisible"); }
00220         if (QUERY_FLAG(god, FLAG_BLIND)) { gifts = 1; fprintf(stderr, "\n  is blind"); }
00221         if (god->last_heal) { gifts = 1; fprintf(stderr, "\n  hp regenerate at %d", god->last_heal); }
00222         if (god->last_sp) { gifts = 1; fprintf(stderr, "\n  sp regenerate at %d", god->last_sp); }
00223         if (god->last_eat) { gifts = 1; fprintf(stderr, "\n  digestion is %s (%d)", god->last_eat < 0 ? "slowed" : "faster", god->last_eat); }
00224         if (god->last_grace) { gifts = 1; fprintf(stderr, "\n  grace regenerates at %d", god->last_grace); }
00225         if (god->stats.luck) { gifts = 1; fprintf(stderr, "\n  luck is %d", god->stats.luck); }
00226         if (!gifts) fprintf(stderr, "NONE");
00227         fprintf(stderr, "\n\n");
00228     }
00229 }