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

Comparing deliantra/server/server/resurrection.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:04 2006 UTC vs.
Revision 1.11 by root, Tue Dec 12 20:53:03 2006 UTC

1/*
2 * static char *rcsid_resurrection_c =
3 * "$Id: resurrection.C,v 1.1 2006/08/13 17:16:04 elmex Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 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
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 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>
27*/ 22*/
28 23
29/* the contents of this file were create solely by peterm@soda.berkeley.edu 24/* the contents of this file were create solely by peterm@soda.berkeley.edu
30 all of the above disclaimers apply. */ 25 all of the above disclaimers apply. */
31 26
32#include <global.h> 27#include <global.h>
33#ifndef __CEXTRACT__ 28#ifndef __CEXTRACT__
34#include <sproto.h> 29# include <sproto.h>
35#endif 30#endif
36#include <spells.h> 31#include <spells.h>
37#include <errno.h> 32#include <errno.h>
38#ifdef sequent 33#ifdef sequent
34
39/* stoopid sequent includes don't do this like they should */ 35/* stoopid sequent includes don't do this like they should */
40extern char * sys_errlist[]; 36extern char *sys_errlist[];
41extern int sys_nerr; 37extern int sys_nerr;
42#endif 38#endif
43extern char **classname; 39extern char **classname;
44extern object *objects; 40extern object *objects;
45 41
46 42
47 43
48/* name of the person to resurrect and which spell was used 44/* name of the person to resurrect and which spell was used
49 * to resurrect 45 * to resurrect
50 */ 46 */
47static int
51static int resurrect_player(object *op,char *playername,object *spell) 48resurrect_player (object *op, char *playername, object *spell)
52{ 49{
53 FILE *deadplayer,*liveplayer; 50 FILE *deadplayer, *liveplayer;
54 51
55 char oldname[MAX_BUF]; 52 char oldname[MAX_BUF];
56 char newname[MAX_BUF]; 53 char newname[MAX_BUF];
57 char path[MAX_BUF]; 54 char path[MAX_BUF];
58 char buf[MAX_BUF]; 55 char buf[MAX_BUF];
59 char buf2[MAX_BUF]; 56 char buf2[MAX_BUF];
60 const char *race=NULL; 57 const char *race = NULL;
61 sint64 exp; 58 sint64 exp;
62 int Con; 59 int Con;
63 60
64 61
65 /* reincarnation, which changes the race */ 62 /* reincarnation, which changes the race */
66 if (spell->race) { 63 if (spell->race)
64 {
67 treasurelist *tl = find_treasurelist(spell->race); 65 treasurelist *tl = find_treasurelist (spell->race);
68 treasure *t; 66 treasure *t;
69 int value; 67 int value;
70 if (!tl) { 68
69 if (!tl)
70 {
71 LOG(llevError,"resurrect_player: race set to %s, but no treasurelist of that name!\n", spell->race); 71 LOG (llevError, "resurrect_player: race set to %s, but no treasurelist of that name!\n", &spell->race);
72 return 0; 72 return 0;
73 } 73 }
74 value = RANDOM() % tl->total_chance; 74 value = RANDOM () % tl->total_chance;
75 for (t=tl->items; t; t=t->next) { 75 for (t = tl->items; t; t = t->next)
76 {
76 value -= t->chance; 77 value -= t->chance;
77 if (value<0) break; 78 if (value < 0)
78 } 79 break;
79 if (!t) { 80 }
81 if (!t)
82 {
80 LOG(llevError,"resurrect_player: got null treasure from treasurelist %s!\n", spell->race); 83 LOG (llevError, "resurrect_player: got null treasure from treasurelist %s!\n", &spell->race);
81 return 0; 84 return 0;
82 } 85 }
83 race = t->item->name; 86 race = t->item->name;
84 } 87 }
85 88
86 /* set up our paths/strings... */ 89 /* set up our paths/strings... */
87 sprintf(path,"%s/%s/%s/%s",settings.localdir,settings.playerdir,playername, 90 sprintf (path, "%s/%s/%s/%s", settings.localdir, settings.playerdir, playername, playername);
88 playername);
89 91
90 strcpy(newname,path); 92 strcpy (newname, path);
91 strcat(newname,".pl"); 93 strcat (newname, ".pl");
92 94
93 strcpy(oldname,newname); 95 strcpy (oldname, newname);
94 strcat(oldname,".dead"); 96 strcat (oldname, ".dead");
95 97
96 if(! (deadplayer=fopen(oldname,"r"))) { 98 if (!(deadplayer = fopen (oldname, "r")))
97 new_draw_info_format(NDI_UNIQUE, 0, op,
98 "The soul of %s cannot be reached.",playername);
99 return 0;
100 } 99 {
101 100 new_draw_info_format (NDI_UNIQUE, 0, op, "The soul of %s cannot be reached.", playername);
102 if(!access(newname,0)) { 101 return 0;
103 new_draw_info_format(NDI_UNIQUE, 0, op,
104 "The soul of %s has already been reborn!",playername);
105 fclose(deadplayer);
106 return 0;
107 }
108
109 if(! (liveplayer=fopen(newname,"w"))) {
110 new_draw_info_format(NDI_UNIQUE, 0, op,
111 "The soul of %s cannot be re-embodied at the moment.",playername);
112 LOG(llevError,"Cannot write player in resurrect_player!\n");
113 fclose(deadplayer);
114 return 0;
115 }
116
117 while (!feof(deadplayer)) {
118 fgets(buf,255,deadplayer);
119 sscanf(buf,"%s",buf2);
120 if( ! (strcmp(buf2,"exp"))) {
121#ifndef WIN32
122 sscanf(buf,"%s %lld",buf2,&exp);
123#else
124 sscanf(buf,"%s %I64d",buf2,&exp);
125#endif
126 if (spell->stats.exp) {
127 exp-=exp/spell->stats.exp;
128#ifndef WIN32
129 sprintf(buf,"exp %lld\n",exp);
130#else
131 sprintf(buf,"exp %I64d\n",exp);
132#endif
133 } 102 }
134 } 103
135 if(! (strcmp(buf2,"Con"))) { 104 if (!access (newname, 0))
136 sscanf(buf,"%s %d",buf2,&Con);
137 Con -= spell->stats.Con;
138 if (Con < 1) Con = 1;
139 sprintf(buf,"Con %d\n",Con);
140 }
141 if(race && !strcmp(buf2,"race")) {
142 sprintf(buf,"race %s\n",race);
143 }
144 fputs(buf,liveplayer);
145 } 105 {
146 fclose(liveplayer); 106 new_draw_info_format (NDI_UNIQUE, 0, op, "The soul of %s has already been reborn!", playername);
147 fclose(deadplayer); 107 fclose (deadplayer);
108 return 0;
109 }
110
111 if (!(liveplayer = fopen (newname, "w")))
112 {
113 new_draw_info_format (NDI_UNIQUE, 0, op, "The soul of %s cannot be re-embodied at the moment.", playername);
114 LOG (llevError, "Cannot write player in resurrect_player!\n");
115 fclose (deadplayer);
116 return 0;
117 }
118
119 while (!feof (deadplayer))
120 {
121 fgets (buf, 255, deadplayer);
122 sscanf (buf, "%s", buf2);
123 if (!(strcmp (buf2, "exp")))
124 {
125 sscanf (buf, "%s %" SCNd64, buf2, &exp);
126 if (spell->stats.exp)
127 {
128 exp -= exp / spell->stats.exp;
129 sprintf (buf, "exp %" PRId64 "\n", exp);
130 }
131 }
132 if (!(strcmp (buf2, "Con")))
133 {
134 sscanf (buf, "%s %d", buf2, &Con);
135 Con -= spell->stats.Con;
136 if (Con < 1)
137 Con = 1;
138 sprintf (buf, "Con %d\n", Con);
139 }
140 if (race && !strcmp (buf2, "race"))
141 {
142 sprintf (buf, "race %s\n", race);
143 }
144 fputs (buf, liveplayer);
145 }
146 fclose (liveplayer);
147 fclose (deadplayer);
148 unlink(oldname); 148 unlink (oldname);
149 new_draw_info_format(NDI_UNIQUE, 0, op, 149 new_draw_info_format (NDI_UNIQUE, 0, op, "%s lives again!", playername);
150 "%s lives again!",playername);
151 150
152 return 1; 151 return 1;
153} 152}
154 153
155 154
156/* raise_dead by peterm and mehlhaff@soda.berkeley.edu 155/* raise_dead by peterm and mehlhaff@soda.berkeley.edu
157 * op -- who is doing the resurrecting 156 * op -- who is doing the resurrecting
158 * spell - spell object 157 * spell - spell object
159 * dir -- direction the spell is cast 158 * dir -- direction the spell is cast
160 * corpseobj - corpse to raise - can be null, in which case this function will find it 159 * corpseobj - corpse to raise - can be null, in which case this function will find it
161 */ 160 */
161int
162int cast_raise_dead_spell(object *op, object *caster, object *spell, int dir, const char *arg) 162cast_raise_dead_spell (object *op, object *caster, object *spell, int dir, const char *arg)
163{ 163{
164 object *temp, *newob; 164 object *temp, *newob;
165 char name_to_resurrect[MAX_BUF]; 165 char name_to_resurrect[MAX_BUF];
166 int leveldead=25, mflags, clevel; 166 int leveldead = 25, mflags, clevel;
167 sint16 sx, sy; 167 sint16 sx, sy;
168 mapstruct *m; 168 maptile *m;
169 169
170 clevel = caster_level(caster, spell); 170 clevel = caster_level (caster, spell);
171 171
172 if (spell->last_heal) { 172 if (spell->last_heal)
173 if (!arg) { 173 {
174 if (!arg)
175 {
174 new_draw_info_format(NDI_UNIQUE, 0,op,"Cast %s on who?", spell->name); 176 new_draw_info_format (NDI_UNIQUE, 0, op, "Cast %s on who?", &spell->name);
175 return 0; 177 return 0;
176 } 178 }
177 strcpy(name_to_resurrect, arg); 179 strcpy (name_to_resurrect, arg);
178 temp = NULL; 180 temp = NULL;
179 } else { 181 }
182 else
183 {
180 sx = op->x+freearr_x[dir]; 184 sx = op->x + freearr_x[dir];
181 sy = op->y+freearr_y[dir]; 185 sy = op->y + freearr_y[dir];
182 m = op->map; 186 m = op->map;
183 mflags = get_map_flags(m, &m, sx, sy, &sx, &sy); 187 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy);
184 if (mflags & P_OUT_OF_MAP) 188 if (mflags & P_OUT_OF_MAP)
185 temp=NULL; 189 temp = NULL;
186 else { 190 else
191 {
187 /* First we need to find a corpse, if any. */ 192 /* First we need to find a corpse, if any. */
188 /* If no object, temp will be set to NULL */ 193 /* If no object, temp will be set to NULL */
189 for(temp=get_map_ob(m, sx, sy); temp!=NULL; temp=temp->above) 194 for (temp = get_map_ob (m, sx, sy); temp != NULL; temp = temp->above)
190 /* If it is corpse, this must be what we want to raise */ 195 /* If it is corpse, this must be what we want to raise */
191 if(temp->type == CORPSE) 196 if (temp->type == CORPSE)
192 break; 197 break;
193 } 198 }
194 199
195 if(temp == NULL) { 200 if (temp == NULL)
201 {
196 new_draw_info(NDI_UNIQUE, 0,op, "You need a body for this spell."); 202 new_draw_info (NDI_UNIQUE, 0, op, "You need a body for this spell.");
197 return 0; 203 return 0;
198 } 204 }
199 strcpy(name_to_resurrect, temp->name ); 205 strcpy (name_to_resurrect, temp->name);
200 } 206 }
201 207
202 /* no matter what, we fry the corpse. */ 208 /* no matter what, we fry the corpse. */
203 if( temp && temp->map){ 209 if (temp && temp->map)
210 {
204 /* replace corpse object with a burning object */ 211 /* replace corpse object with a burning object */
205 newob = arch_to_object(find_archetype("burnout")); 212 newob = arch_to_object (archetype::find ("burnout"));
206 if(newob != NULL){ 213 if (newob != NULL)
214 {
207 newob->x = temp->x; 215 newob->x = temp->x;
208 newob->y = temp->y; 216 newob->y = temp->y;
209 insert_ob_in_map( newob, temp->map, op,0); 217 insert_ob_in_map (newob, temp->map, op, 0);
210 } 218 }
211 leveldead=temp->level; 219 leveldead = temp->level;
212 remove_ob(temp); 220 temp->remove ();
213 free_object(temp); 221 temp->destroy (0);
214 } 222 }
215 223
216 if(resurrection_fails(clevel,leveldead)) { 224 if (resurrection_fails (clevel, leveldead))
225 {
217 if (spell->randomitems) { 226 if (spell->randomitems)
227 {
218 treasure *t; 228 treasure *t;
219 229
220 for (t=spell->randomitems->items; t; t=t->next) { 230 for (t = spell->randomitems->items; t; t = t->next)
231 {
221 summon_hostile_monsters(op, t->nrof, t->item->name); 232 summon_hostile_monsters (op, t->nrof, t->item->name);
233 }
234
235 }
236 return 1;
237
222 } 238 }
223 239 else
224 } 240 {
225 return 1;
226
227 } else {
228 return resurrect_player(op,name_to_resurrect,spell); 241 return resurrect_player (op, name_to_resurrect, spell);
229 } 242 }
230 243
231 return 1; 244 return 1;
232} 245}
233 246
234 247
248int
235int resurrection_fails(int levelcaster,int leveldead) 249resurrection_fails (int levelcaster, int leveldead)
236{ 250{
237 int chance=9; 251 int chance = 9;
252
238 /* scheme: equal in level, 50% success. 253 /* scheme: equal in level, 50% success.
239 * +5 % for each level below, -5% for each level above. 254 * +5 % for each level below, -5% for each level above.
240 * minimum 20% 255 * minimum 20%
241 */ 256 */
242 chance+=levelcaster-leveldead; 257 chance += levelcaster - leveldead;
243 if(chance<4) chance=4; 258 if (chance < 4)
244 if(chance>rndm(0, 19)) return 0; /* resurrection succeeds */ 259 chance = 4;
260 if (chance > rndm (0, 19))
261 return 0; /* resurrection succeeds */
245 return 1; 262 return 1;
246} 263}
247 264
265void
248void dead_player(object *op) 266dead_player (object *op)
249{ 267{
250 char filename[MAX_BUF]; 268 char filename[MAX_BUF];
251 char newname[MAX_BUF]; 269 char newname[MAX_BUF];
252 char path[MAX_BUF]; 270 char path[MAX_BUF];
253 271
254 /* set up our paths/strings... */ 272 /* set up our paths/strings... */
255 sprintf(path,"%s/%s/%s/%s",settings.localdir,settings.playerdir,op->name, 273 sprintf (path, "%s/%s/%s/%s", settings.localdir, settings.playerdir, &op->name, &op->name);
256 op->name);
257 274
258 strcpy(filename,path); 275 strcpy (filename, path);
259 strcat(filename,".pl"); 276 strcat (filename, ".pl");
260 strcpy(newname,filename); 277 strcpy (newname, filename);
261 strcat(newname,".dead"); 278 strcat (newname, ".dead");
262 279
263 if(rename(filename,newname) != 0) { 280 if (rename (filename, newname) != 0)
281 {
264 LOG(llevError, "Cannot rename dead player's file %s into %s: %s\n", filename, newname, strerror_local(errno)); 282 LOG (llevError, "Cannot rename dead player's file %s into %s: %s\n", filename, newname, strerror (errno));
265 } 283 }
266} 284}
267 285
268 286
269 287
288void
270void dead_character(const char *name) { 289dead_character (const char *name)
290{
271 char buf[MAX_BUF]; 291 char buf[MAX_BUF];
272 char buf2[MAX_BUF]; 292 char buf2[MAX_BUF];
273 293
274 sprintf(buf,"%s/%s/%s/%s.pl",settings.localdir,settings.playerdir,name, name); 294 sprintf (buf, "%s/%s/%s/%s.pl", settings.localdir, settings.playerdir, name, name);
275 /* peterm: create a .dead filename.... ***.pl.dead */ 295 /* peterm: create a .dead filename.... ***.pl.dead */
276 strcpy(buf2,buf); 296 strcpy (buf2, buf);
277 strcat(buf,".dead"); 297 strcat (buf, ".dead");
278 if(rename(buf2,buf)== -1){ 298 if (rename (buf2, buf) == -1)
299 {
279 LOG(llevError, "Cannot rename dead player's file %s into %s: %s\n", buf2, buf, strerror_local(errno)); 300 LOG (llevError, "Cannot rename dead player's file %s into %s: %s\n", buf2, buf, strerror (errno));
280 } 301 }
281} 302}
282 303
283 304
305int
284int dead_player_exists(const char *name) { 306dead_player_exists (const char *name)
307{
285 char buf[MAX_BUF]; 308 char buf[MAX_BUF];
286 309
287 sprintf(buf,"%s/%s/%s/%s",settings.localdir,settings.playerdir,name, name); 310 sprintf (buf, "%s/%s/%s/%s", settings.localdir, settings.playerdir, name, name);
288 strcat(buf,".pl.dead"); 311 strcat (buf, ".pl.dead");
289 return !(access(buf,0)); 312 return !(access (buf, 0));
290} 313}
291
292

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines