Re: [CODE]problem with a manual area spell.

From: Thomas Arp (t_arp@stofanet.dk)
Date: 02/25/03


From: "Christian Ejlertsen" <chr.ejlertsen@HAS.DK>
> I've run into a problem with a manual spell I created. It's intended as
> an area spell and it's working wonderfully until one mob dies then the
> spell breaks out of it's loop and exits after that death I can't see
> where this should since all it does is call the damage function and then
> continues on which is exactly the same as mag_damage does in the end
> therefor I can't see why it should stop Executing the spell.
>
<snip>
> int ray_color = 0, doubleup = 0, dam = 0, rounds = 0, dead_yesno = 0;
<snip>
>         for (vict = world[IN_ROOM(ch)].people; vict; vict = temp_ch) {
>                 temp_ch = vict->next_in_room;
++                dead_yesno = 0;

<snip>
>                 for(rounds = 0; rounds < doubleup; rounds++) {
>                         if (dead_yesno < 0)
>                                 continue;
>                         switch(ray_color) {
>                                 case 1:
<snip>
>                                         dead_yesno = damage(ch, vict,
> dam, SPELL_PRISMATIC_SPRAY);
>                                         break;
<snip>

Here you set dead_yesno to -1 if the victim dies. You never restore it,
so all following loops just skip the casting and damage.

Add the (++) line above to have it the way you want.

If you wish to have the loops cleaner, you might consider removing the
switch statement fom the middle of it. Here's a short rewrite;

struct prismatic_info_t
{
  const char *to_char;
  const char *to_room;
  const char *to_vict;
  int affect;
  int div;
  int mult;
  int add;
} prismatic_info[] = {
  { "You hit $N with a spray of gleaming red.",
    "$N is hit by $n's spray of gleaming red.",
    "You are hit by a ray of gleaming red.",
    SPELL_WEAKEN, 5, 4, 10 },
  { "You hit $N with a spray of bright orange.",
    "$N is hit by $n's spray of bright orange.",
    "You are hit by a ray of bright orange.",
    SPELL_BLINDNESS, 5, 6, 20 },
  { "You hit $N with a spray of sparkling yellow.",
    "$N is hit by $n's spray of sparkling yellow.",
    "You are hit by a ray of sparkling yellow.",
    0, 4, 8, 30 },
  { "You hit $N with a spray of dark green.",
    "$N is hit by $n's spray of dark green.",
    "You are hit by a ray of dark green.",
    SPELL_POISON, 5, 4, 10 },
  { "You hit $N with a spray of amazing blue.",
    "$N is hit by $n's spray of amazing blue.",
    "You are hit by a ray of amazing blue.",
    SPELL_HOLD_MONSTER, 5, 4, 10 },
  { "You hit $N with a spray of gleaming indigo.",
    "$N is hit by $n's spray of gleaming indigo.",
    "You are hit by a ray of gleaming indigo.",
    SPELL_SILENCE, 5, 4, 10 },
  { "You hit $N with a spray of murky violet.",
    "$N is hit by $n's spray of murky violet.",
    "You are hit by a ray of murky violet.",
    0, 5, 4, 10 }
};

ASPELL(spell_prismatic_spray)
{
  struct char_data *vict, *temp_ch;
  int ray_color = 0, doubleup = 0, dam = 0, rounds = 0, dead_yesno;

  act("$n hand issues a spray of prismatic colors.",
FALSE, ch, 0, 0, TO_ROOM);
  act("Your hand issues a spray of prismatic colors.",
FALSE, ch, 0, 0, TO_CHAR);

  for (vict = world[IN_ROOM(ch)].people; vict; vict = temp_ch) {
    temp_ch = vict->next_in_room;
    dead_yesno = 0;

    if (vict == ch)
      continue;

    if (!IS_NPC(vict) && AFF_FLAGGED(vict, AFF_GROUP) &&
       (vict->master == ch->master || vict->master == ch))
      continue;

    if (AFF_FLAGGED(vict, AFF_CHARM) && vict->master == ch->master)
      continue;

    ray_color = number(0, 7);

    if (ray_color == 7) {
      doubleup = 2;
      ray_color = number(0, 6);
    }
    else
      doubleup = 1;

    for(rounds = 0; rounds < doubleup; rounds++) {
      if (dead_yesno < 0)
        continue;

      act(prismatic_info[ray_color].to_char, FALSE, ch, 0, vict, TO_CHAR);
      act(prismatic_info[ray_color].to_room, FALSE, ch, 0, vict, TO_ROOM);
      act(prismatic_info[ray_color].to_vict, FALSE, ch, 0, vict, TO_VICT);
      if (prismatic_info[ray_color].affect)
        mag_affects(GET_LEVEL(ch), ch, vict,
prismatic_info[ray_color].affect, 0);

      dam = ((GET_LEVEL(ch)/prismatic_info[ray_color].div) *
             prismatic_info[ray_color].mult) +
prismatic_info[ray_color].add;
      dead_yesno = damage(ch, vict, dam, SPELL_PRISMATIC_SPRAY);

      ray_color = number(0, 6);
    }
  }
}

Welcor

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   | Newbie List:  http://groups.yahoo.com/group/circle-newbies/   |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 06/26/03 PDT