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

Comparing deliantra/server/server/spell_effect.C (file contents):
Revision 1.123 by root, Sun Apr 4 04:10:47 2010 UTC vs.
Revision 1.131 by root, Fri Apr 23 04:32:47 2010 UTC

58} 58}
59 59
60int 60int
61recharge (object *op, object *caster, object *spell_ob) 61recharge (object *op, object *caster, object *spell_ob)
62{ 62{
63 object *wand, *tmp;
64 int ncharges; 63 int ncharges;
65 64
66 wand = find_marked_object (op); 65 object *wand = op->mark ();
66
67 if (!wand || wand->type != WAND) 67 if (!wand || wand->type != WAND)
68 { 68 {
69 new_draw_info (NDI_UNIQUE, 0, op, "You need to mark the wand you want to recharge."); 69 op->failmsg ("You need to mark the wand you want to recharge.");
70 return 0; 70 return 0;
71 } 71 }
72
72 if (!(random_roll (0, 3, op, PREFER_HIGH))) 73 if (!(random_roll (0, 3, op, PREFER_HIGH)))
73 { 74 {
74 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s vibrates violently, then explodes!", query_name (wand)); 75 op->failmsgf ("The %s vibrates violently, then explodes!", query_name (wand));
75 op->play_sound (sound_find ("ob_explode")); 76 op->play_sound (sound_find ("ob_explode"));
76 wand->destroy (); 77 wand->destroy ();
77 tmp = get_archetype (shstr_fireball); 78 object *tmp = get_archetype (shstr_fireball);
78 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10; 79 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10;
79 80
80 if (!tmp->stats.dam) 81 if (!tmp->stats.dam)
81 tmp->stats.dam = 1; 82 tmp->stats.dam = 1;
82 83
93 94
94 if (wand->inv && wand->inv->level) 95 if (wand->inv && wand->inv->level)
95 ncharges /= wand->inv->level; 96 ncharges /= wand->inv->level;
96 else 97 else
97 { 98 {
98 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is broken.", query_name (wand)); 99 op->failmsgf ("Your %s is broken.", query_name (wand));
99 return 0; 100 return 0;
100 } 101 }
101 102
102 if (!ncharges) 103 if (!ncharges)
103 ncharges = 1; 104 ncharges = 1;
104 105
105 wand->stats.food += ncharges; 106 wand->stats.food += ncharges;
106 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s glows with power.", query_name (wand)); 107 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s glows with power.", query_name (wand));
107 108
108 if (wand->arch && QUERY_FLAG (wand->arch, FLAG_ANIMATE)) 109 if (wand->arch && wand->arch->flag [FLAG_ANIMATE])
109 { 110 {
110 SET_FLAG (wand, FLAG_ANIMATE); 111 wand->set_flag (FLAG_ANIMATE);
111 wand->set_speed (wand->arch->speed); 112 wand->set_speed (wand->arch->speed);
112 } 113 }
113 114
114 return 1; 115 return 1;
115} 116}
129{ 130{
130 int bonus_plus = 0; 131 int bonus_plus = 0;
131 const char *missile_name = "arrow"; 132 const char *missile_name = "arrow";
132 133
133 for (object *tmp = op->inv; tmp; tmp = tmp->below) 134 for (object *tmp = op->inv; tmp; tmp = tmp->below)
134 if (tmp->type == BOW && QUERY_FLAG (tmp, FLAG_APPLIED)) 135 if (tmp->type == BOW && tmp->flag [FLAG_APPLIED])
135 missile_name = tmp->race; 136 missile_name = tmp->race;
136 137
137 int missile_plus = spell->stats.dam + SP_level_dam_adjust (caster, spell); 138 int missile_plus = spell->stats.dam + SP_level_dam_adjust (caster, spell);
138 139
139 archetype *missile_arch = archetype::find (missile_name); 140 archetype *missile_arch = archetype::find (missile_name);
158 break; 159 break;
159 160
160 if (!al) 161 if (!al)
161 { 162 {
162 missile->destroy (); 163 missile->destroy ();
163 new_draw_info_format (NDI_UNIQUE, 0, op, "No such object %ss of %s", missile_name, spellparam); 164 op->failmsgf ("No such object %ss of %s", missile_name, spellparam);
164 return 0; 165 return 0;
165 } 166 }
166 167
167 if (al->item->slaying) 168 if (al->item->slaying)
168 { 169 {
169 missile->destroy (); 170 missile->destroy ();
170 new_draw_info_format (NDI_UNIQUE, 0, op, "You are not allowed to create %ss of %s", missile_name, spellparam); 171 op->failmsgf ("You are not allowed to create %ss of %s", missile_name, spellparam);
171 return 0; 172 return 0;
172 } 173 }
173 174
174 give_artifact_abilities (missile, al->item); 175 give_artifact_abilities (missile, al->item);
175 /* These special arrows cost something extra. Don't have them also be magical - 176 /* These special arrows cost something extra. Don't have them also be magical -
193 194
194 missile->magic = missile_plus; 195 missile->magic = missile_plus;
195 /* Can't get any money for these objects */ 196 /* Can't get any money for these objects */
196 missile->value = 0; 197 missile->value = 0;
197 198
198 SET_FLAG (missile, FLAG_IDENTIFIED); 199 missile->set_flag (FLAG_IDENTIFIED);
199 200
200 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !missile->destroyed ()) 201 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !missile->destroyed ())
201 pick_up (op, missile); 202 pick_up (op, missile);
202 203
203 return 1; 204 return 1;
257 /* Pretty unlikely (there are some very low food items), but you never 258 /* Pretty unlikely (there are some very low food items), but you never
258 * know 259 * know
259 */ 260 */
260 if (!at) 261 if (!at)
261 { 262 {
262 new_draw_info (NDI_UNIQUE, 0, op, "You don't have enough experience to create any food."); 263 op->failmsgf ("You don't have enough experience to create any food.");
263 return 0; 264 return 0;
264 } 265 }
265 266
266 food_value /= at->stats.food; 267 food_value /= at->stats.food;
267 new_op = at->instance (); 268 new_op = at->instance ();
297 mflags = get_map_flags (m, &m, x, y, &x, &y); 298 mflags = get_map_flags (m, &m, x, y, &x, &y);
298 299
299 if (mflags & P_OUT_OF_MAP) 300 if (mflags & P_OUT_OF_MAP)
300 break; 301 break;
301 302
302 if (!QUERY_FLAG (op, FLAG_WIZCAST) && (mflags & P_NO_MAGIC)) 303 if (!op->flag [FLAG_WIZCAST] && (mflags & P_NO_MAGIC))
303 { 304 {
304 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your magic."); 305 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your magic.");
305 return 0; 306 return 0;
306 } 307 }
307 308
308 if (mflags & P_IS_ALIVE) 309 if (mflags & P_IS_ALIVE)
309 { 310 {
310 for (tmp = GET_MAP_OB (m, x, y); tmp; tmp = tmp->above) 311 for (tmp = GET_MAP_OB (m, x, y); tmp; tmp = tmp->above)
311 if (QUERY_FLAG (tmp, FLAG_ALIVE) && (tmp->type == PLAYER || QUERY_FLAG (tmp, FLAG_MONSTER))) 312 if (tmp->flag [FLAG_ALIVE] && (tmp->type == PLAYER || tmp->flag [FLAG_MONSTER]))
312 { 313 {
313 new_draw_info (NDI_UNIQUE, 0, op, "You detect something."); 314 new_draw_info (NDI_UNIQUE, 0, op, "You detect something.");
314 if (tmp->head != NULL) 315 if (tmp->head != NULL)
315 tmp = tmp->head; 316 tmp = tmp->head;
316 examine_monster (op, tmp); 317 examine_monster (op, tmp);
339 if (pl->type == PLAYER) 340 if (pl->type == PLAYER)
340 { 341 {
341 /* If race isn't set, then invisible unless it is undead */ 342 /* If race isn't set, then invisible unless it is undead */
342 if (!pl->contr->invis_race) 343 if (!pl->contr->invis_race)
343 { 344 {
344 if (QUERY_FLAG (mon, FLAG_UNDEAD)) 345 if (mon->flag [FLAG_UNDEAD])
345 return 0; 346 return 0;
346 347
347 return 1; 348 return 1;
348 } 349 }
349 350
380int 381int
381cast_invisible (object *op, object *caster, object *spell_ob) 382cast_invisible (object *op, object *caster, object *spell_ob)
382{ 383{
383 if (op->invisible > 1000) 384 if (op->invisible > 1000)
384 { 385 {
385 new_draw_info (NDI_UNIQUE, 0, op, "You can not extend the duration of your invisibility any further"); 386 op->failmsg ("You can not extend the duration of your invisibility any further");
386 return 0; 387 return 0;
387 } 388 }
388 389
389 /* Remove the switch with 90% duplicate code - just handle the differences with 390 /* Remove the switch with 90% duplicate code - just handle the differences with
390 * and if statement or two. 391 * and if statement or two.
396 397
397 if (op->type == PLAYER) 398 if (op->type == PLAYER)
398 { 399 {
399 op->contr->invis_race = spell_ob->race; 400 op->contr->invis_race = spell_ob->race;
400 401
401 if (QUERY_FLAG (spell_ob, FLAG_MAKE_INVIS)) 402 if (spell_ob->flag [FLAG_MAKE_INVIS])
402 op->contr->tmp_invis = 0; 403 op->contr->tmp_invis = 0;
403 else 404 else
404 op->contr->tmp_invis = 1; 405 op->contr->tmp_invis = 1;
405 406
406 op->contr->hidden = 0; 407 op->contr->hidden = 0;
448 // earth to dust tears down everything that can be torn down 449 // earth to dust tears down everything that can be torn down
449 for (object *next, *tmp = m->at (sx, sy).bot; tmp; tmp = next) 450 for (object *next, *tmp = m->at (sx, sy).bot; tmp; tmp = next)
450 { 451 {
451 next = tmp->above; 452 next = tmp->above;
452 453
453 if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN)) 454 if (tmp->flag [FLAG_TEAR_DOWN])
454 hit_player (tmp, 9998, op, AT_PHYSICAL, 0); 455 hit_player (tmp, 9998, op, AT_PHYSICAL, 0);
455 } 456 }
456 } 457 }
457 458
458 return 1; 459 return 1;
460 461
461void 462void
462execute_word_of_recall (object *op) 463execute_word_of_recall (object *op)
463{ 464{
464 if (object *pl = op->in_player ()) 465 if (object *pl = op->in_player ())
465 {
466 if (pl->ms ().flags () & P_NO_CLERIC && !QUERY_FLAG (pl, FLAG_WIZCAST)) 466 if (pl->ms ().flags () & P_NO_CLERIC && !pl->flag [FLAG_WIZCAST])
467 new_draw_info (NDI_UNIQUE, 0, pl, "You feel something fizzle inside you."); 467 new_draw_info (NDI_UNIQUE, 0, pl, "You feel something fizzle inside you.");
468 else 468 else
469 pl->player_goto (op->slaying, op->stats.hp, op->stats.sp); 469 pl->player_goto (op->slaying, op->stats.hp, op->stats.sp);
470 }
471 470
472 op->destroy (); 471 op->destroy ();
473} 472}
474 473
475/* Word of recall causes the player to return 'home'. 474/* Word of recall causes the player to return 'home'.
477 * time delay effect. 476 * time delay effect.
478 */ 477 */
479int 478int
480cast_word_of_recall (object *op, object *caster, object *spell_ob) 479cast_word_of_recall (object *op, object *caster, object *spell_ob)
481{ 480{
482 object *dummy; 481 if (!op->is_player ())
483 int time;
484
485 if (op->type != PLAYER)
486 return 0; 482 return 0;
487 483
488 if (find_obj_by_type_subtype (op, SPELL_EFFECT, SP_WORD_OF_RECALL)) 484 if (find_obj_by_type_subtype (op, SPELL_EFFECT, SP_WORD_OF_RECALL))
489 { 485 {
490 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you."); 486 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you.");
491 return 1; 487 return 1;
492 } 488 }
493 489
494 dummy = get_archetype (FORCE_NAME); 490 object *dummy = get_archetype (FORCE_NAME);
495 491
496 if (!dummy)
497 {
498 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
499 LOG (llevError, "cast_word_of_recall: get_archetype(force) failed!\n");
500 return 0;
501 }
502
503 time = spell_ob->duration - SP_level_duration_adjust (caster, spell_ob); 492 int time = max (1, spell_ob->duration - SP_level_duration_adjust (caster, spell_ob));
504 if (time < 1)
505 time = 1;
506 493
507 /* value of speed really doesn't make much difference, as long as it is 494 /* value of speed really doesn't make much difference, as long as it is
508 * positive. Lower value may be useful so that the problem doesn't 495 * positive. Lower value may be useful so that the problem doesn't
509 * do anything really odd if it say a -1000 or something. 496 * do anything really odd if it say a -1000 or something.
510 */ 497 */
511 dummy->set_speed (0.002); 498 dummy->set_speed (0.002);
512 dummy->speed_left = -dummy->speed * time; 499 dummy->speed_left = -dummy->speed * time;
513 dummy->type = SPELL_EFFECT; 500 dummy->type = SPELL_EFFECT;
514 dummy->subtype = SP_WORD_OF_RECALL; 501 dummy->subtype = SP_WORD_OF_RECALL;
515 502 dummy->slaying = op->contr->savebed_map;
516 /* If we could take advantage of enter_player_savebed() here, it would be 503 dummy->stats.hp = op->contr->bed_x;
517 * nice, but until the map load fails, we can't. 504 dummy->stats.sp = op->contr->bed_y;
518 */
519 EXIT_PATH (dummy) = op->contr->savebed_map;
520 EXIT_X (dummy) = op->contr->bed_x;
521 EXIT_Y (dummy) = op->contr->bed_y;
522 505
523 op->insert (dummy); 506 op->insert (dummy);
524 507
525 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you."); 508 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you.");
526 509
645 628
646 if ((spell_ob->move_block || x != op->x || y != op->y) && 629 if ((spell_ob->move_block || x != op->x || y != op->y) &&
647 (get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE) || 630 (get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE) ||
648 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) == spell_ob->move_block))) 631 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) == spell_ob->move_block)))
649 { 632 {
650 new_draw_info (NDI_UNIQUE, 0, op, "Something is in the way."); 633 op->failmsg ("Something is in the way.");
651 return 0; 634 return 0;
652 } 635 }
653 636
654 if (spell_ob->other_arch) 637 if (spell_ob->other_arch)
655 tmp = spell_ob->other_arch->instance (); 638 tmp = spell_ob->other_arch->instance ();
679 tmp->attacktype = spell_ob->attacktype; 662 tmp->attacktype = spell_ob->attacktype;
680 tmp->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 663 tmp->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
681 tmp->stats.dam = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob); 664 tmp->stats.dam = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob);
682 tmp->range = 0; 665 tmp->range = 0;
683 } 666 }
684 else if (QUERY_FLAG (tmp, FLAG_ALIVE)) 667 else if (tmp->flag [FLAG_ALIVE])
685 { 668 {
686 tmp->stats.hp = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 669 tmp->stats.hp = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
687 tmp->stats.maxhp = tmp->stats.hp; 670 tmp->stats.maxhp = tmp->stats.hp;
688 } 671 }
689 672
690 if (QUERY_FLAG (spell_ob, FLAG_IS_USED_UP) || QUERY_FLAG (tmp, FLAG_IS_USED_UP)) 673 if (spell_ob->flag [FLAG_IS_USED_UP] || tmp->flag [FLAG_IS_USED_UP])
691 { 674 {
692 tmp->stats.food = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 675 tmp->stats.food = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
693 SET_FLAG (tmp, FLAG_IS_USED_UP); 676 tmp->set_flag (FLAG_IS_USED_UP);
694 } 677 }
695 678
696 if (QUERY_FLAG (spell_ob, FLAG_TEAR_DOWN)) 679 if (spell_ob->flag [FLAG_TEAR_DOWN])
697 { 680 {
698 tmp->stats.hp = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob); 681 tmp->stats.hp = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob);
699 tmp->stats.maxhp = tmp->stats.hp; 682 tmp->stats.maxhp = tmp->stats.hp;
700 SET_FLAG (tmp, FLAG_TEAR_DOWN); 683 tmp->set_flag (FLAG_TEAR_DOWN);
701 SET_FLAG (tmp, FLAG_ALIVE); 684 tmp->set_flag (FLAG_ALIVE);
702 } 685 }
703 686
704 /* This can't really hurt - if the object doesn't kill anything, 687 /* This can't really hurt - if the object doesn't kill anything,
705 * these fields just won't be used. Do not set the owner for 688 * these fields just won't be used. Do not set the owner for
706 * earthwalls, though, so they survive restarts. 689 * earthwalls, though, so they survive restarts.
771 } 754 }
772 else 755 else
773 negblocked = 1; 756 negblocked = 1;
774 } 757 }
775 758
776 if (QUERY_FLAG (tmp, FLAG_BLOCKSVIEW)) 759 if (tmp->flag [FLAG_BLOCKSVIEW])
777 update_all_los (op->map, op->x, op->y); 760 update_all_los (op->map, op->x, op->y);
778 761
779 return 1; 762 return 1;
780} 763}
781 764
805 { 788 {
806 int count = atoi (spellparam); 789 int count = atoi (spellparam);
807 790
808 if (count > maxdist) 791 if (count > maxdist)
809 { 792 {
810 new_draw_info (NDI_UNIQUE, 0, op, "You can't dimension door that far!"); 793 op->failmsg ("You can't dimension door that far!");
811 return 0; 794 return 0;
812 } 795 }
813 796
814 for (dist = 0; dist < count; dist++) 797 for (dist = 0; dist < count; dist++)
815 { 798 {
876 break; 859 break;
877 860
878 } 861 }
879 if (!dist) 862 if (!dist)
880 { 863 {
881 new_draw_info (NDI_UNIQUE, 0, op, "Your spell failed!\n"); 864 op->failmsg ("Your spell failed!\n");
882 return 0; 865 return 0;
883 } 866 }
884 } 867 }
885 868
886 /* Actually move the player now */ 869 /* Actually move the player now */
1062 break; 1045 break;
1063 } 1046 }
1064 else if (spell_ob->race && spell_ob->race == tmp2->name) 1047 else if (spell_ob->race && spell_ob->race == tmp2->name)
1065 { 1048 {
1066 if (!silent) 1049 if (!silent)
1067 new_draw_info_format (NDI_UNIQUE, 0, op,
1068 "You can not cast %s while %s is in effect", 1050 op->failmsgf ("You can not cast %s while %s is in effect",
1069 &spell_ob->name, &tmp2->name_pl); 1051 &spell_ob->name, &tmp2->name_pl);
1070 1052
1071 return 0; 1053 return 0;
1072 } 1054 }
1073 } 1055 }
1074 } 1056 }
1103 1085
1104 force->name_pl = spell_ob->name; 1086 force->name_pl = spell_ob->name;
1105 1087
1106 force->speed = 1.0; 1088 force->speed = 1.0;
1107 force->speed_left = -1.0; 1089 force->speed_left = -1.0;
1108 SET_FLAG (force, FLAG_APPLIED); 1090 force->set_flag (FLAG_APPLIED);
1109 1091
1110 /* Now start processing the effects. First, protections */ 1092 /* Now start processing the effects. First, protections */
1111 for (i = 0; i < NROFATTACKS; i++) 1093 for (i = 0; i < NROFATTACKS; i++)
1112 { 1094 {
1113 if (spell_ob->resist[i]) 1095 if (spell_ob->resist[i])
1143 } 1125 }
1144 } 1126 }
1145 1127
1146 force->move_type = spell_ob->move_type; 1128 force->move_type = spell_ob->move_type;
1147 1129
1148 if (QUERY_FLAG (spell_ob, FLAG_SEE_IN_DARK)) 1130 if (spell_ob->flag [FLAG_SEE_IN_DARK])
1149 SET_FLAG (force, FLAG_SEE_IN_DARK); 1131 force->set_flag (FLAG_SEE_IN_DARK);
1150 1132
1151 if (QUERY_FLAG (spell_ob, FLAG_XRAYS)) 1133 if (spell_ob->flag [FLAG_XRAYS])
1152 SET_FLAG (force, FLAG_XRAYS); 1134 force->set_flag (FLAG_XRAYS);
1153 1135
1154 /* Haste/bonus speed */ 1136 /* Haste/bonus speed */
1155 if (spell_ob->stats.exp) 1137 if (spell_ob->stats.exp)
1156 { 1138 {
1157 if (op->speed > 0.5f) 1139 if (op->speed > 0.5f)
1238 return 0; 1220 return 0;
1239 } 1221 }
1240 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50; 1222 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50;
1241 force->speed = 1.0; 1223 force->speed = 1.0;
1242 force->speed_left = -1.0; 1224 force->speed_left = -1.0;
1243 SET_FLAG (force, FLAG_APPLIED); 1225 force->set_flag (FLAG_APPLIED);
1244 1226
1245 if (!god) 1227 if (!god)
1246 { 1228 {
1247 new_draw_info (NDI_UNIQUE, 0, op, "Your blessing seems empty."); 1229 new_draw_info (NDI_UNIQUE, 0, op, "Your blessing seems empty.");
1248 } 1230 }
1302 * the nuggets, alchemy the gold from that, etc. 1284 * the nuggets, alchemy the gold from that, etc.
1303 * Otherwise, give 9 silver on the gold for other objects, 1285 * Otherwise, give 9 silver on the gold for other objects,
1304 * so that it would still be more affordable to haul 1286 * so that it would still be more affordable to haul
1305 * the stuff back to town. 1287 * the stuff back to town.
1306 */ 1288 */
1307 if (QUERY_FLAG (obj, FLAG_UNPAID)) 1289 if (obj->flag [FLAG_UNPAID])
1308 value = 0; 1290 value = 0;
1309 else if (obj->type == MONEY || obj->type == GEM) 1291 else if (obj->type == MONEY || obj->type == GEM)
1310 value /= 3; 1292 value /= 3;
1311 else 1293 else
1312 value = value * 9 / 10; 1294 value = value * 9 / 10;
1366 1348
1367 for (object *next, *tmp = mp->at (nx, ny).bot; tmp; tmp = next) 1349 for (object *next, *tmp = mp->at (nx, ny).bot; tmp; tmp = next)
1368 { 1350 {
1369 next = tmp->above; 1351 next = tmp->above;
1370 1352
1371 if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) && 1353 if (tmp->weight > 0 && !tmp->flag [FLAG_NO_PICK] &&
1372 !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON)) 1354 !tmp->flag [FLAG_ALIVE] && !tmp->flag [FLAG_IS_CAULDRON])
1373 { 1355 {
1374 if (tmp->inv) 1356 if (tmp->inv)
1375 { 1357 {
1376 object *next1, *tmp1; 1358 object *next1, *tmp1;
1377 1359
1378 for (tmp1 = tmp->inv; tmp1; tmp1 = next1) 1360 for (tmp1 = tmp->inv; tmp1; tmp1 = next1)
1379 { 1361 {
1380 next1 = tmp1->below; 1362 next1 = tmp1->below;
1381 if (tmp1->weight > 0 && !QUERY_FLAG (tmp1, FLAG_NO_PICK) && 1363 if (tmp1->weight > 0 && !tmp1->flag [FLAG_NO_PICK] &&
1382 !QUERY_FLAG (tmp1, FLAG_ALIVE) && !QUERY_FLAG (tmp1, FLAG_IS_CAULDRON)) 1364 !tmp1->flag [FLAG_ALIVE] && !tmp1->flag [FLAG_IS_CAULDRON])
1383 alchemy_object (tmp1, value, weight); 1365 alchemy_object (tmp1, value, weight);
1384 } 1366 }
1385 } 1367 }
1386 1368
1387 alchemy_object (tmp, value, weight); 1369 alchemy_object (tmp, value, weight);
1421remove_curse (object *op, object *caster, object *spell) 1403remove_curse (object *op, object *caster, object *spell)
1422{ 1404{
1423 int success = 0, was_one = 0; 1405 int success = 0, was_one = 0;
1424 1406
1425 for (object *tmp = op->inv; tmp; tmp = tmp->below) 1407 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1426 if (QUERY_FLAG (tmp, FLAG_APPLIED) && 1408 if (tmp->flag [FLAG_APPLIED] &&
1427 ((QUERY_FLAG (tmp, FLAG_CURSED) && QUERY_FLAG (spell, FLAG_CURSED)) || 1409 ((tmp->flag [FLAG_CURSED] && spell->flag [FLAG_CURSED]) ||
1428 (QUERY_FLAG (tmp, FLAG_DAMNED) && QUERY_FLAG (spell, FLAG_DAMNED)))) 1410 (tmp->flag [FLAG_DAMNED] && spell->flag [FLAG_DAMNED])))
1429 { 1411 {
1430 was_one++; 1412 was_one++;
1431 1413
1432 if (tmp->level <= casting_level (caster, spell)) 1414 if (tmp->level <= casting_level (caster, spell))
1433 { 1415 {
1434 success++; 1416 success++;
1435 if (QUERY_FLAG (spell, FLAG_DAMNED)) 1417 if (spell->flag [FLAG_DAMNED])
1436 CLEAR_FLAG (tmp, FLAG_DAMNED); 1418 tmp->clr_flag (FLAG_DAMNED);
1437 1419
1438 CLEAR_FLAG (tmp, FLAG_CURSED); 1420 tmp->clr_flag (FLAG_CURSED);
1439 CLEAR_FLAG (tmp, FLAG_KNOWN_CURSED); 1421 tmp->clr_flag (FLAG_KNOWN_CURSED);
1440 tmp->value = 0; /* Still can't sell it */ 1422 tmp->value = 0; /* Still can't sell it */
1441 1423
1442 if (object *pl = tmp->visible_to ()) 1424 if (object *pl = tmp->visible_to ())
1443 esrv_update_item (UPD_FLAGS, pl, tmp); 1425 esrv_update_item (UPD_FLAGS, pl, tmp);
1444 } 1426 }
1469 1451
1470 int num_ident = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell)); 1452 int num_ident = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell));
1471 1453
1472 for (tmp = op->inv; tmp; tmp = tmp->below) 1454 for (tmp = op->inv; tmp; tmp = tmp->below)
1473 { 1455 {
1474 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) 1456 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && tmp->need_identify ())
1475 { 1457 {
1476 identify (tmp); 1458 identify (tmp);
1477 1459
1478 if (op->type == PLAYER) 1460 if (op->type == PLAYER)
1479 { 1461 {
1493 * was not fully used. 1475 * was not fully used.
1494 */ 1476 */
1495 if (num_ident) 1477 if (num_ident)
1496 { 1478 {
1497 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above) 1479 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above)
1498 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) 1480 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && tmp->need_identify ())
1499 { 1481 {
1500 identify (tmp); 1482 identify (tmp);
1501 1483
1502 if (object *pl = tmp->visible_to ()) 1484 if (object *pl = tmp->visible_to ())
1503 { 1485 {
1552 * floor. But this is not true for show invisible. 1534 * floor. But this is not true for show invisible.
1553 * Basically, we just go and find the top object and work 1535 * Basically, we just go and find the top object and work
1554 * down - that is easier than working up. 1536 * down - that is easier than working up.
1555 */ 1537 */
1556 1538
1557 for (last = NULL, tmp = m->at (nx, ny).bot; tmp; tmp = tmp->above) 1539 for (last = 0, tmp = m->at (nx, ny).bot; tmp; tmp = tmp->above)
1558 last = tmp; 1540 last = tmp;
1559 1541
1560 /* Shouldn't happen, but if there are no objects on a space, this 1542 /* Shouldn't happen, but if there are no objects on a space, this
1561 * would happen. 1543 * would happen.
1562 */ 1544 */
1563 if (!last) 1545 if (!last)
1564 continue; 1546 continue;
1565 1547
1566 done_one = 0; 1548 done_one = 0;
1567 floor = 0; 1549 floor = 0;
1568 detect = NULL; 1550 detect = 0;
1569 for (tmp = last; tmp; tmp = tmp->below) 1551 for (tmp = last; tmp; tmp = tmp->below)
1570 { 1552 {
1571 /* show invisible */ 1553 /* show invisible */
1572 if (QUERY_FLAG (spell, FLAG_MAKE_INVIS) 1554 if (spell->flag [FLAG_MAKE_INVIS]
1573 /* Might there be other objects that we can make visible? */ 1555 /* Might there be other objects that we can make visible? */
1574 && (tmp->invisible && (QUERY_FLAG (tmp, FLAG_MONSTER) 1556 && (tmp->invisible && (tmp->flag [FLAG_MONSTER]
1575 || (tmp->type == PLAYER && !QUERY_FLAG (tmp, FLAG_WIZ)) 1557 || (tmp->type == PLAYER && !tmp->flag [FLAG_WIZ])
1576 || tmp->type == T_HANDLE 1558 || tmp->type == T_HANDLE
1577 || tmp->type == TRAPDOOR 1559 || tmp->type == TRAPDOOR
1578 || tmp->type == EXIT 1560 || tmp->type == EXIT
1579 || tmp->type == HOLE 1561 || tmp->type == HOLE
1580 || tmp->type == BUTTON 1562 || tmp->type == BUTTON
1581 || tmp->type == TELEPORTER 1563 || tmp->type == TELEPORTER
1582 || tmp->type == GATE 1564 || tmp->type == GATE
1583 || tmp->type == LOCKED_DOOR 1565 || tmp->type == LOCKED_DOOR
1584 || tmp->type == WEAPON 1566 || tmp->type == WEAPON
1585 || tmp->type == ALTAR 1567 || tmp->type == ALTAR
1586 || tmp->type == SIGN 1568 || (tmp->type == SIGN && tmp->face != magicmouth_face)
1587 || tmp->type == TRIGGER_PEDESTAL 1569 || tmp->type == TRIGGER_PEDESTAL
1588 || tmp->type == SPECIAL_KEY 1570 || tmp->type == SPECIAL_KEY
1589 || tmp->type == TREASURE 1571 || tmp->type == TREASURE
1590 || tmp->type == BOOK 1572 || tmp->type == BOOK
1591 || tmp->type == HOLY_ALTAR 1573 || tmp->type == HOLY_ALTAR
1592 || tmp->type == CONTAINER))) 1574 || tmp->type == CONTAINER)))
1593 { 1575 {
1576 printf ("show inv %s\n", tmp->debug_desc());//D
1594 if (random_roll (0, skill->level - 1, op, PREFER_HIGH) > level / 4) 1577 if (random_roll (0, skill->level - 1, op, PREFER_HIGH) > level / 4)
1595 { 1578 {
1596 tmp->invisible = 0; 1579 tmp->invisible = 0;
1597 done_one = 1; 1580 done_one = 1;
1598 } 1581 }
1599 } 1582 }
1600 1583
1601 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) 1584 if (tmp->flag [FLAG_IS_FLOOR])
1602 floor = 1; 1585 floor = 1;
1603 1586
1604 /* All detections below this point don't descend beneath the floor, 1587 /* All detections below this point don't descend beneath the floor,
1605 * so just continue on. We could be clever and look at the type of 1588 * so just continue on. We could be clever and look at the type of
1606 * detection to completely break out if we don't care about objects beneath 1589 * detection to completely break out if we don't care about objects beneath
1615 * difficult to see what object is magical/cursed, so the 1598 * difficult to see what object is magical/cursed, so the
1616 * effect wouldn't be as apparent. 1599 * effect wouldn't be as apparent.
1617 */ 1600 */
1618 1601
1619 /* detect magic */ 1602 /* detect magic */
1620 if (QUERY_FLAG (spell, FLAG_KNOWN_MAGICAL) && 1603 if (spell->flag [FLAG_KNOWN_MAGICAL]
1621 !QUERY_FLAG (tmp, FLAG_KNOWN_MAGICAL) && !QUERY_FLAG (tmp, FLAG_IDENTIFIED) && is_magical (tmp)) 1604 && !tmp->flag [FLAG_KNOWN_MAGICAL]
1605 && !tmp->flag [FLAG_IDENTIFIED]
1606 && tmp->need_identify ()
1607 && is_magical (tmp))
1622 { 1608 {
1623 SET_FLAG (tmp, FLAG_KNOWN_MAGICAL); 1609 tmp->set_flag (FLAG_KNOWN_MAGICAL);
1624 /* make runes more visible */ 1610 /* make runes more visible */
1625 if (tmp->type == RUNE && tmp->attacktype & AT_MAGIC) 1611 if (tmp->type == RUNE && tmp->attacktype & AT_MAGIC)
1626 tmp->stats.Cha /= 4; 1612 tmp->stats.Cha /= 4;
1627 1613
1628 done_one = 1; 1614 done_one = 1;
1629 } 1615 }
1630 1616
1631 /* detect monster */ 1617 /* detect monster */
1632 if (QUERY_FLAG (spell, FLAG_MONSTER) && (QUERY_FLAG (tmp, FLAG_MONSTER) || tmp->type == PLAYER)) 1618 if (spell->flag [FLAG_MONSTER] && (tmp->flag [FLAG_MONSTER] || tmp->type == PLAYER))
1633 { 1619 {
1634 done_one = 2; 1620 done_one = 2;
1635 1621
1636 if (!detect) 1622 if (!detect)
1637 detect = tmp; 1623 detect = tmp;
1639 1625
1640 /* Basically, if race is set in the spell, then the creatures race must 1626 /* Basically, if race is set in the spell, then the creatures race must
1641 * match that. if the spell race is set to GOD, then the gods opposing 1627 * match that. if the spell race is set to GOD, then the gods opposing
1642 * race must match. 1628 * race must match.
1643 */ 1629 */
1644 if (spell->race && QUERY_FLAG (tmp, FLAG_MONSTER) && tmp->race && 1630 if (spell->race && tmp->flag [FLAG_MONSTER] && tmp->race &&
1645 ((spell->race == shstr_GOD && god && god->slaying.contains (tmp->race)) || 1631 ((spell->race == shstr_GOD && god && god->slaying.contains (tmp->race)) ||
1646 spell->race.contains (tmp->race))) 1632 spell->race.contains (tmp->race)))
1647 { 1633 {
1648 done_one = 2; 1634 done_one = 2;
1649 1635
1650 if (!detect) 1636 if (!detect)
1651 detect = tmp; 1637 detect = tmp;
1652 } 1638 }
1653 1639
1654 if (QUERY_FLAG (spell, FLAG_KNOWN_CURSED) && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED) && 1640 if (spell->flag [FLAG_KNOWN_CURSED]
1655 (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) 1641 && !tmp->flag [FLAG_KNOWN_CURSED]
1642 && tmp->need_identify ()
1643 && (tmp->flag [FLAG_CURSED] || tmp->flag [FLAG_DAMNED]))
1656 { 1644 {
1657 SET_FLAG (tmp, FLAG_KNOWN_CURSED); 1645 tmp->set_flag (FLAG_KNOWN_CURSED);
1658 done_one = 1; 1646 done_one = 1;
1659 } 1647 }
1660 1648
1661 // Do mining detection spell: 1649 // Do mining detection spell:
1662 if (spell->last_sp == 1) // 1 - detect any vein 1650 if (spell->last_sp == 1) // 1 - detect any vein
1688 detect_ob->face = detect->face; 1676 detect_ob->face = detect->face;
1689 detect_ob->animation_id = detect->animation_id; 1677 detect_ob->animation_id = detect->animation_id;
1690 detect_ob->anim_speed = detect->anim_speed; 1678 detect_ob->anim_speed = detect->anim_speed;
1691 detect_ob->last_anim = 0; 1679 detect_ob->last_anim = 0;
1692 /* by default, the detect_ob is already animated */ 1680 /* by default, the detect_ob is already animated */
1693 if (!QUERY_FLAG (detect, FLAG_ANIMATE)) 1681 if (!detect->flag [FLAG_ANIMATE])
1694 CLEAR_FLAG (detect_ob, FLAG_ANIMATE); 1682 detect_ob->clr_flag (FLAG_ANIMATE);
1695 } 1683 }
1696 1684
1697 m->insert (detect_ob, nx, ny, op, INS_ON_TOP); 1685 m->insert (detect_ob, nx, ny, op, INS_ON_TOP);
1698 } 1686 }
1699 } /* for processing the surrounding spaces */ 1687 } /* for processing the surrounding spaces */
1700 1688
1701 1689
1702 /* Now process objects in the players inventory if detect curse or magic */ 1690 /* Now process objects in the players inventory if detect curse or magic */
1703 if (QUERY_FLAG (spell, FLAG_KNOWN_CURSED) || QUERY_FLAG (spell, FLAG_KNOWN_MAGICAL)) 1691 if (spell->flag [FLAG_KNOWN_CURSED] || spell->flag [FLAG_KNOWN_MAGICAL])
1704 { 1692 {
1705 done_one = 0; 1693 done_one = 0;
1706 1694
1707 for (tmp = op->inv; tmp; tmp = tmp->below) 1695 for (tmp = op->inv; tmp; tmp = tmp->below)
1708 { 1696 {
1709 if (!tmp->invisible && !QUERY_FLAG (tmp, FLAG_IDENTIFIED)) 1697 if (!tmp->invisible && !tmp->flag [FLAG_IDENTIFIED])
1710 { 1698 {
1711 if (QUERY_FLAG (spell, FLAG_KNOWN_MAGICAL) && is_magical (tmp) && !QUERY_FLAG (tmp, FLAG_KNOWN_MAGICAL)) 1699 if (spell->flag [FLAG_KNOWN_MAGICAL] && is_magical (tmp) && !tmp->flag [FLAG_KNOWN_MAGICAL])
1712 { 1700 {
1713 SET_FLAG (tmp, FLAG_KNOWN_MAGICAL); 1701 tmp->set_flag (FLAG_KNOWN_MAGICAL);
1714 1702
1715 if (object *pl = tmp->visible_to ()) 1703 if (object *pl = tmp->visible_to ())
1716 esrv_update_item (UPD_FLAGS, pl, tmp); 1704 esrv_update_item (UPD_FLAGS, pl, tmp);
1717 } 1705 }
1718 1706
1719 if (QUERY_FLAG (spell, FLAG_KNOWN_CURSED) && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED) && 1707 if (spell->flag [FLAG_KNOWN_CURSED] && !tmp->flag [FLAG_KNOWN_CURSED] &&
1720 (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) 1708 (tmp->flag [FLAG_CURSED] || tmp->flag [FLAG_DAMNED]))
1721 { 1709 {
1722 SET_FLAG (tmp, FLAG_KNOWN_CURSED); 1710 tmp->set_flag (FLAG_KNOWN_CURSED);
1723 1711
1724 if (object *pl = tmp->visible_to ()) 1712 if (object *pl = tmp->visible_to ())
1725 esrv_update_item (UPD_FLAGS, pl, tmp); 1713 esrv_update_item (UPD_FLAGS, pl, tmp);
1726 } 1714 }
1727 } /* if item is not identified */ 1715 } /* if item is not identified */
1787 mflags = get_map_flags (m, &m, x, y, &x, &y); 1775 mflags = get_map_flags (m, &m, x, y, &x, &y);
1788 1776
1789 if (!(mflags & P_OUT_OF_MAP) && mflags & P_IS_ALIVE) 1777 if (!(mflags & P_OUT_OF_MAP) && mflags & P_IS_ALIVE)
1790 { 1778 {
1791 for (plyr = GET_MAP_OB (m, x, y); plyr != NULL; plyr = plyr->above) 1779 for (plyr = GET_MAP_OB (m, x, y); plyr != NULL; plyr = plyr->above)
1792 if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) 1780 if (plyr != op && plyr->flag [FLAG_ALIVE])
1793 break; 1781 break;
1794 } 1782 }
1795 1783
1796 1784
1797 /* If we did not find a player in the specified direction, transfer 1785 /* If we did not find a player in the specified direction, transfer
1798 * to anyone on top of us. This is used for the rune of transference mostly. 1786 * to anyone on top of us. This is used for the rune of transference mostly.
1799 */ 1787 */
1800 if (plyr == NULL) 1788 if (plyr == NULL)
1801 for (plyr = GET_MAP_OB (op->map, op->x, op->y); plyr != NULL; plyr = plyr->above) 1789 for (plyr = GET_MAP_OB (op->map, op->x, op->y); plyr != NULL; plyr = plyr->above)
1802 if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) 1790 if (plyr != op && plyr->flag [FLAG_ALIVE])
1803 break; 1791 break;
1804 1792
1805 if (!plyr) 1793 if (!plyr)
1806 { 1794 {
1807 new_draw_info (NDI_BLACK, 0, op, "There is no one there."); 1795 op->failmsg ("There is no one there.");
1808 return 0; 1796 return 0;
1809 } 1797 }
1810 /* give sp */ 1798 /* give sp */
1811 if (spell->stats.dam > 0) 1799 if (spell->stats.dam > 0)
1812 { 1800 {
1824 if (rate > 95) 1812 if (rate > 95)
1825 rate = 95; 1813 rate = 95;
1826 1814
1827 sucked = (plyr->stats.sp * rate) / 100; 1815 sucked = (plyr->stats.sp * rate) / 100;
1828 plyr->stats.sp -= sucked; 1816 plyr->stats.sp -= sucked;
1829 if (QUERY_FLAG (op, FLAG_ALIVE)) 1817 if (op->flag [FLAG_ALIVE])
1830 { 1818 {
1831 /* Player doesn't get full credit */ 1819 /* Player doesn't get full credit */
1832 sucked = (sucked * rate) / 100; 1820 sucked = (sucked * rate) / 100;
1833 op->stats.sp += sucked; 1821 op->stats.sp += sucked;
1834 if (sucked > 0) 1822 if (sucked > 0)
1885 * monsters either. 1873 * monsters either.
1886 */ 1874 */
1887 1875
1888 if (head->attacktype & AT_MAGIC 1876 if (head->attacktype & AT_MAGIC
1889 && !(head->attacktype & AT_COUNTERSPELL) 1877 && !(head->attacktype & AT_COUNTERSPELL)
1890 && !QUERY_FLAG (head, FLAG_MONSTER) 1878 && !head->flag [FLAG_MONSTER]
1891 && (op->level > head->level)) 1879 && (op->level > head->level))
1892 head->destroy (); 1880 head->destroy ();
1893 else 1881 else
1894 switch (head->type) 1882 switch (head->type)
1895 { 1883 {
1896 case SPELL_EFFECT: 1884 case SPELL_EFFECT:
1897 // XXX: Don't affect floor spelleffects. See also XXX comment 1885 // XXX: Don't affect floor spelleffects. See also XXX comment
1898 // about sanctuary in spell_util.C 1886 // about sanctuary in spell_util.C
1899 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) 1887 if (tmp->flag [FLAG_IS_FLOOR])
1900 continue; 1888 continue;
1901 1889
1902 if (op->level > head->level) 1890 if (op->level > head->level)
1903 head->destroy (); 1891 head->destroy ();
1904 1892
1927 1915
1928 object *tmp, *god = find_god (determine_god (op)); 1916 object *tmp, *god = find_god (determine_god (op));
1929 1917
1930 if (!god) 1918 if (!god)
1931 { 1919 {
1932 new_draw_info (NDI_UNIQUE, 0, op, "You can't consecrate anything if you don't worship a god!"); 1920 op->failmsg ("You can't consecrate anything if you don't worship a god!");
1933 return 0; 1921 return 0;
1934 } 1922 }
1935 1923
1936 for (tmp = op->below; tmp; tmp = tmp->below) 1924 for (tmp = op->below; tmp; tmp = tmp->below)
1937 { 1925 {
1938 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) 1926 if (tmp->flag [FLAG_IS_FLOOR])
1939 break; 1927 break;
1940 if (tmp->type == HOLY_ALTAR) 1928 if (tmp->type == HOLY_ALTAR)
1941 { 1929 {
1942 1930
1943 if (tmp->level > casting_level (caster, spell)) 1931 if (tmp->level > casting_level (caster, spell))
1944 { 1932 {
1945 new_draw_info_format (NDI_UNIQUE, 0, op, "You are not powerful enough to reconsecrate the %s", &tmp->name); 1933 op->failmsgf ("You are not powerful enough to reconsecrate the %s", &tmp->name);
1946 return 0; 1934 return 0;
1947 } 1935 }
1948 else 1936 else
1949 { 1937 {
1950 /* If we got here, we are consecrating an altar */ 1938 /* If we got here, we are consecrating an altar */
1959 new_draw_info_format (NDI_UNIQUE, 0, op, "You consecrated the altar to %s!", &god->name); 1947 new_draw_info_format (NDI_UNIQUE, 0, op, "You consecrated the altar to %s!", &god->name);
1960 return 1; 1948 return 1;
1961 } 1949 }
1962 } 1950 }
1963 } 1951 }
1964 new_draw_info (NDI_UNIQUE, 0, op, "You are not standing over an altar!"); 1952
1953 op->failmsg ("You are not standing over an altar!");
1965 return 0; 1954 return 0;
1966} 1955}
1967 1956
1968/* animate_weapon - 1957/* animate_weapon -
1969 * Generalization of staff_to_snake. Makes a golem out of the caster's weapon. 1958 * Generalization of staff_to_snake. Makes a golem out of the caster's weapon.
1976 * player checks. MSW 2003-01-06 1965 * player checks. MSW 2003-01-06
1977 */ 1966 */
1978int 1967int
1979animate_weapon (object *op, object *caster, object *spell, int dir) 1968animate_weapon (object *op, object *caster, object *spell, int dir)
1980{ 1969{
1981 object *weapon, *tmp;
1982 char buf[MAX_BUF]; 1970 char buf[MAX_BUF];
1983 int a, i; 1971 int a, i;
1984 sint16 x, y; 1972 sint16 x, y;
1985 maptile *m; 1973 maptile *m;
1986 1974
2011 1999
2012 /* if there's no place to put the golem, abort */ 2000 /* if there's no place to put the golem, abort */
2013 if (dir < 0 || (get_map_flags (m, &m, x, y, &x, &y) & P_OUT_OF_MAP) 2001 if (dir < 0 || (get_map_flags (m, &m, x, y, &x, &y) & P_OUT_OF_MAP)
2014 || ((spell->other_arch->move_type & GET_MAP_MOVE_BLOCK (m, x, y)) == spell->other_arch->move_type)) 2002 || ((spell->other_arch->move_type & GET_MAP_MOVE_BLOCK (m, x, y)) == spell->other_arch->move_type))
2015 { 2003 {
2016 new_draw_info (NDI_UNIQUE, 0, op, "There is something in the way."); 2004 op->failmsg ("There is something in the way.");
2017 return 0; 2005 return 0;
2018 } 2006 }
2019 2007
2020 /* Use the weapon marked by the player. */ 2008 /* Use the weapon marked by the player. */
2021 weapon = find_marked_object (op); 2009 object *weapon = op->mark ();
2022 2010
2023 if (!weapon) 2011 if (!weapon)
2024 { 2012 {
2025 new_draw_info (NDI_BLACK, 0, op, "You must mark a weapon to use with this spell!"); 2013 op->failmsg ("You must mark a weapon to use with this spell!");
2026 return 0; 2014 return 0;
2027 } 2015 }
2028 2016
2029 if (spell->race && weapon->arch->archname != spell->race) 2017 if (spell->race && weapon->arch->archname != spell->race)
2030 { 2018 {
2031 new_draw_info (NDI_UNIQUE, 0, op, "The spell fails to transform your weapon."); 2019 op->failmsg ("The spell fails to transform your weapon.");
2032 return 0; 2020 return 0;
2033 } 2021 }
2034 2022
2035 if (weapon->type != WEAPON) 2023 if (weapon->type != WEAPON)
2036 { 2024 {
2037 new_draw_info (NDI_UNIQUE, 0, op, "You need to wield a weapon to animate it."); 2025 op->failmsg ("You need to wield a weapon to animate it.");
2038 return 0; 2026 return 0;
2039 } 2027 }
2040 2028
2041 if (QUERY_FLAG (weapon, FLAG_APPLIED)) 2029 if (weapon->flag [FLAG_APPLIED])
2042 { 2030 {
2043 new_draw_info_format (NDI_BLACK, 0, op, "You need to unequip %s before using it in this spell", query_name (weapon)); 2031 op->failmsgf ("You need to unequip %s before using it in this spell", query_name (weapon));
2044 return 0; 2032 return 0;
2045 } 2033 }
2046 2034
2047 weapon = weapon->split (); 2035 weapon = weapon->split ();
2048 2036
2049 /* create the golem object */ 2037 /* create the golem object */
2050 tmp = spell->other_arch->instance (); 2038 object *tmp = spell->other_arch->instance ();
2051 2039
2052 /* if animated by a player, give the player control of the golem */ 2040 /* if animated by a player, give the player control of the golem */
2053 CLEAR_FLAG (tmp, FLAG_MONSTER); 2041 tmp->clr_flag (FLAG_MONSTER);
2054 tmp->stats.exp = 0; 2042 tmp->stats.exp = 0;
2055 add_friendly_object (tmp); 2043 add_friendly_object (tmp);
2056 tmp->type = GOLEM; 2044 tmp->type = GOLEM;
2057 tmp->set_owner (op); 2045 tmp->set_owner (op);
2058 op->contr->golem = tmp; 2046 op->contr->golem = tmp;
2060 2048
2061 /* Give the weapon to the golem now. A bit of a hack to check the 2049 /* Give the weapon to the golem now. A bit of a hack to check the
2062 * removed flag - it should only be set if weapon->split was 2050 * removed flag - it should only be set if weapon->split was
2063 * used above. 2051 * used above.
2064 */ 2052 */
2065 if (!QUERY_FLAG (weapon, FLAG_REMOVED)) 2053 if (!weapon->flag [FLAG_REMOVED])
2066 weapon->remove (); 2054 weapon->remove ();
2067 2055
2068 tmp->insert (weapon); 2056 tmp->insert (weapon);
2069 2057
2070 /* To do everything necessary to let a golem use the weapon is a pain, 2058 /* To do everything necessary to let a golem use the weapon is a pain,
2071 * so instead, just set it as equipped (otherwise, we need to update 2059 * so instead, just set it as equipped (otherwise, we need to update
2072 * body_info, skills, etc) 2060 * body_info, skills, etc)
2073 */ 2061 */
2074 SET_FLAG (tmp, FLAG_USE_WEAPON); 2062 tmp->set_flag (FLAG_USE_WEAPON);
2075 SET_FLAG (weapon, FLAG_APPLIED); 2063 weapon->set_flag (FLAG_APPLIED);
2076 tmp->update_stats (); 2064 tmp->update_stats ();
2077 2065
2078 /* There used to be 'odd' code that basically seemed to take the absolute 2066 /* There used to be 'odd' code that basically seemed to take the absolute
2079 * value of the weapon->magic an use that. IMO, that doesn't make sense - 2067 * value of the weapon->magic an use that. IMO, that doesn't make sense -
2080 * if you're using a crappy weapon, it shouldn't be as good. 2068 * if you're using a crappy weapon, it shouldn't be as good.
2167 success = op->map->change_map_light (spell->stats.dam); 2155 success = op->map->change_map_light (spell->stats.dam);
2168 2156
2169 if (!success) 2157 if (!success)
2170 { 2158 {
2171 if (spell->stats.dam < 0) 2159 if (spell->stats.dam < 0)
2172 new_draw_info (NDI_UNIQUE, 0, op, "It can be no brighter here."); 2160 op->failmsg ("It can be no brighter here.");
2173 else 2161 else
2174 new_draw_info (NDI_UNIQUE, 0, op, "It can be no darker here."); 2162 op->failmsg ("It can be no darker here.");
2175 } 2163 }
2176 2164
2177 return success; 2165 return success;
2178} 2166}
2179 2167
2284 for (object *tmp = op->ms ().bot; tmp; tmp = tmp->above) 2272 for (object *tmp = op->ms ().bot; tmp; tmp = tmp->above)
2285 { 2273 {
2286 int atk_lev, def_lev; 2274 int atk_lev, def_lev;
2287 object *victim = tmp->head_ (); 2275 object *victim = tmp->head_ ();
2288 2276
2289 if (!QUERY_FLAG (victim, FLAG_MONSTER)) 2277 if (!victim->flag [FLAG_MONSTER])
2290 continue; 2278 continue;
2291 2279
2292 if (QUERY_FLAG (victim, FLAG_UNAGGRESSIVE)) 2280 if (victim->flag [FLAG_UNAGGRESSIVE])
2293 continue; 2281 continue;
2294 2282
2295 if (victim->stats.exp == 0) 2283 if (victim->stats.exp == 0)
2296 continue; 2284 continue;
2297 2285
2313 victim->stats.sp = 0; 2301 victim->stats.sp = 0;
2314 victim->stats.grace = 0; 2302 victim->stats.grace = 0;
2315 victim->stats.Pow = 0; 2303 victim->stats.Pow = 0;
2316#endif 2304#endif
2317 victim->attack_movement = RANDO2; 2305 victim->attack_movement = RANDO2;
2318 SET_FLAG (victim, FLAG_UNAGGRESSIVE); 2306 victim->set_flag (FLAG_UNAGGRESSIVE);
2319 SET_FLAG (victim, FLAG_RUN_AWAY); 2307 victim->set_flag (FLAG_RUN_AWAY);
2320 SET_FLAG (victim, FLAG_RANDOM_MOVE); 2308 victim->set_flag (FLAG_RANDOM_MOVE);
2321 CLEAR_FLAG (victim, FLAG_MONSTER); 2309 victim->clr_flag (FLAG_MONSTER);
2322 2310
2323 if (victim->name) 2311 if (victim->name)
2324 new_draw_info_format (NDI_UNIQUE, 0, op->owner, "%s no longer feels like fighting.", &victim->name); 2312 new_draw_info_format (NDI_UNIQUE, 0, op->owner, "%s no longer feels like fighting.", &victim->name);
2325 } 2313 }
2326 } 2314 }
2332int 2320int
2333write_mark (object *op, object *spell, const char *msg) 2321write_mark (object *op, object *spell, const char *msg)
2334{ 2322{
2335 if (!msg || msg[0] == 0) 2323 if (!msg || msg[0] == 0)
2336 { 2324 {
2337 new_draw_info (NDI_UNIQUE, 0, op, "Write what?"); 2325 op->failmsg ("Write what?");
2338 return 0; 2326 return 0;
2339 } 2327 }
2340 2328
2341 if (!msg_is_safe (msg)) 2329 if (!msg_is_safe (msg))
2342 { 2330 {
2343 new_draw_info (NDI_UNIQUE, 0, op, "Trying to cheat are we?"); 2331 op->failmsg ("Trying to cheat are we? H<@-signs are not allowed in marking runes.>");
2344 LOG (llevInfo, "write_mark: player %s tried to write bogus rune %s\n", &op->name, msg); 2332 LOG (llevInfo, "write_mark: player %s tried to write bogus rune %s\n", &op->name, msg);
2345 return 0; 2333 return 0;
2346 } 2334 }
2347 2335
2348 if (!spell->other_arch) 2336 if (!spell->other_arch)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines