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

Comparing deliantra/server/server/disease.C (file contents):
Revision 1.6 by root, Sat Sep 16 22:24:13 2006 UTC vs.
Revision 1.10 by root, Wed Dec 13 00:42:04 2006 UTC

170 170
171 if (disease->env == NULL) 171 if (disease->env == NULL)
172 { /* we're outside of someone */ 172 { /* we're outside of someone */
173 if (disease->stats.maxhp > 0) 173 if (disease->stats.maxhp > 0)
174 disease->value--; 174 disease->value--;
175
175 if (disease->value == 0) 176 if (disease->value == 0)
176 { 177 {
177 remove_ob (disease); 178 disease->destroy ();
178 free_object (disease);
179 return 1; 179 return 1;
180 } 180 }
181 } 181 }
182 else 182 else
183 { 183 {
184 /* if we're inside a person, have the disease run its course */ 184 /* if we're inside a person, have the disease run its course */
185 /* negative foods denote "perpetual" diseases. */ 185 /* negative foods denote "perpetual" diseases. */
186 if (disease->stats.food > 0) 186 if (disease->stats.food > 0)
187 { 187 {
188 disease->stats.food--; 188 disease->stats.food--;
189
189 if (disease->stats.food == 0) 190 if (disease->stats.food == 0)
190 { 191 {
191 remove_symptoms (disease); /* remove the symptoms of this disease */ 192 remove_symptoms (disease); /* remove the symptoms of this disease */
192 grant_immunity (disease); 193 grant_immunity (disease);
193 remove_ob (disease); 194 disease->destroy ();
194 free_object (disease);
195 return 1; 195 return 1;
196 } 196 }
197 } 197 }
198 } 198 }
199
199 /* check to see if we infect others */ 200 /* check to see if we infect others */
200 check_infection (disease); 201 check_infection (disease);
201 202
202 /* impose or modify the symptoms of the disease */ 203 /* impose or modify the symptoms of the disease */
203 if (disease->env && is_susceptible_to_disease (disease->env, disease)) 204 if (disease->env && is_susceptible_to_disease (disease->env, disease))
220 221
221 while ((symptom = find_symptom (disease)) != NULL) 222 while ((symptom = find_symptom (disease)) != NULL)
222 { 223 {
223 if (!victim) 224 if (!victim)
224 victim = symptom->env; 225 victim = symptom->env;
225 remove_ob (symptom); 226
226 free_object (symptom); 227 symptom->destroy ();
227 } 228 }
229
228 if (victim) 230 if (victim)
229 fix_player (victim); 231 fix_player (victim);
230 return 0; 232 return 0;
231} 233}
232 234
248check_infection (object *disease) 250check_infection (object *disease)
249{ 251{
250 int x, y, range, mflags; 252 int x, y, range, mflags;
251 maptile *map, *map2; 253 maptile *map, *map2;
252 object *tmp; 254 object *tmp;
253 sint16 i, j, i2, j2;
254 255
255 range = abs (disease->magic); 256 range = abs (disease->magic);
257
256 if (disease->env) 258 if (disease->env)
257 { 259 {
258 x = disease->env->x; 260 x = disease->env->x;
259 y = disease->env->y; 261 y = disease->env->y;
260 map = disease->env->map; 262 map = disease->env->map;
261 } 263 }
262 else 264 else
263 { 265 {
264 x = disease->x; 266 x = disease->x;
265 y = disease->y; 267 y = disease->y;
266 map = disease->map; 268 map = disease->map;
267 } 269 }
268 270
269 if (map == NULL) 271 if (!map)
270 return 0; 272 return 0;
273
271 for (i = x - range; i <= x + range; i++) 274 for (int i = x - range; i <= x + range; i++)
272 {
273 for (j = y - range; j <= y + range; j++) 275 for (int j = y - range; j <= y + range; j++)
274 { 276 {
277 sint16 i2, j2;
275 mflags = get_map_flags (map, &map2, i, j, &i2, &j2); 278 mflags = get_map_flags (map, &map2, i, j, &i2, &j2);
279
276 if (!(mflags & P_OUT_OF_MAP) && (mflags & P_IS_ALIVE)) 280 if (!(mflags & P_OUT_OF_MAP) && (mflags & P_IS_ALIVE))
277 {
278 for (tmp = get_map_ob (map2, i2, j2); tmp; tmp = tmp->above) 281 for (tmp = get_map_ob (map2, i2, j2); tmp; tmp = tmp->above)
279 {
280 infect_object (tmp, disease, 0); 282 infect_object (tmp, disease, 0);
281 }
282 }
283 } 283 }
284 } 284
285 return 1; 285 return 1;
286} 286}
287 287
288 288
289/* check to see if an object is infectable: 289/* check to see if an object is infectable:
333 else if (tmp->type == DISEASE && !strcmp (tmp->name, disease->name)) 333 else if (tmp->type == DISEASE && !strcmp (tmp->name, disease->name))
334 return 0; /* already diseased */ 334 return 0; /* already diseased */
335 } 335 }
336 336
337 /* If we've gotten this far, go ahead and infect the victim. */ 337 /* If we've gotten this far, go ahead and infect the victim. */
338 new_disease = get_object (); 338 new_disease = disease->clone ();
339 copy_object (disease, new_disease);
340 new_disease->stats.food = disease->stats.maxgrace; 339 new_disease->stats.food = disease->stats.maxgrace;
341 new_disease->value = disease->stats.maxhp; 340 new_disease->value = disease->stats.maxhp;
342 new_disease->stats.wc -= disease->last_grace; /* self-limiting factor */ 341 new_disease->stats.wc -= disease->last_grace; /* self-limiting factor */
343 342
344 /* Unfortunately, set_owner does the wrong thing to the skills pointers 343 /* Unfortunately, set_owner does the wrong thing to the skills pointers
570 object *new_ob; 569 object *new_ob;
571 int sp_reduce; 570 int sp_reduce;
572 571
573 if (victim == NULL || victim->map == NULL) 572 if (victim == NULL || victim->map == NULL)
574 { /* outside a monster/player, die immediately */ 573 { /* outside a monster/player, die immediately */
575 remove_ob (symptom); 574 symptom->destroy ();
576 free_object (symptom);
577 return 0; 575 return 0;
578 } 576 }
579 577
580 if (symptom->stats.dam > 0) 578 if (symptom->stats.dam > 0)
581 hit_player (victim, symptom->stats.dam, symptom, symptom->attacktype, 1); 579 hit_player (victim, symptom->stats.dam, symptom, symptom->attacktype, 1);
671 */ 669 */
672 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW)))) 670 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW))))
673 { 671 {
674 672
675 remove_symptoms (disease); 673 remove_symptoms (disease);
676 remove_ob (disease);
677 cure = 1; 674 cure = 1;
675
678 if (caster) 676 if (caster)
679 change_exp (caster, disease->stats.exp, caster->chosen_skill ? &caster->chosen_skill->skill : (const char *) 0, 0); 677 change_exp (caster, disease->stats.exp, caster->chosen_skill ? &caster->chosen_skill->skill : (const char *) 0, 0);
680 free_object (disease); 678
679 disease->destroy ();
681 } 680 }
682 } 681 }
683 } 682 }
684 if (cure) 683 if (cure)
685 { 684 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines