energy drain

From: Edward J Glamkowski (eglamkowski@angelfire.com)
Date: 06/12/99


There is an energy drain snippet available from
Chris Rehbein that I was looking at - I started
modifying it for my own purposes, but ended up
re-writing about 99% of it ;)
Here's my version, intended to be a VERY high level
spell, and I also strongly recommend you use
mag_materials for this spell, requiring some hard to
get item.  Alternately, just allow a saving throw ;)

I'm assuming you know how to add a manual spell...

-- spells.c --
/* The bad things that happen to the caster when casting energy drain... */
void do_drain_stuff(struct char_data *ch) {

  /* Immorts can use the spell with impunity */
  if (GET_LEVEL(ch) >= LVL_IMMORT)
    return;


  GET_ALIGNMENT(ch) -= 100; /* This is an EVIL spell! */

  if (dice(1, 20) == 1) {
    GET_CON(ch) -= 1;
    send_to_char("The exposure to such negative energies has over-taxed "
                 "your body!\r\n", ch);

    if (GET_CON(ch) <= 0) {
      send_to_char("Your body was unable to handle the massive influx of "
                   "negative energy!\r\n", ch);
      die(ch);
    }
  }

  return;
}

ASPELL(spell_energy_drain) {
  int hp_loss = 0;

  /* No saving throw! */

  /* drain 2 levels and caster has 5% chance of losing 1 point of con */
  GET_LEVEL(victim) -= 2;

  if (GET_LEVEL(victim) <= 0) {
    act("$n drains away the last of your life energy...",
        FALSE, ch, 0, victim, TO_VICT);

    die(victim);

    act("$N collapses, dead!", FALSE, ch, 0, victim, TO_ROOM);
    act("$N collapses, dead from your energy draining!",
        FALSE, ch, 0, victim, TO_CHAR);

    do_drain_stuff(ch);

    return;
  }

  /* We could keep track of how many hp a player gained at each level,
     but what a pain!  And what to do about NPCs?!  Just find the
     average HP per level and subtract HP based on this average.  */
  hp_loss = ((float)GET_MAX_HIT(victim) / (float)GET_LEVEL(victim)) * 2.0;

  GET_MAX_HIT(victim) -= hp_loss;
  GET_HIT(victim) -= hp_loss;

  if (GET_HIT(victim) > 0) {
    act("A cold chill comes over you as you feel $n drain away your life "
        "energy!", FALSE, ch, 0, victim, TO_VICT);

    act("You drain the life energy from $N!", FALSE, ch, 0, victim, TO_CHAR);

    do_drain_stuff(ch);
    if (IS_NPC(victim))
      hit(victim, ch, TYPE_UNDEFINED);

    return;
  } else {
    act("$n drains away the last of your life energy...",
        FALSE, ch, 0, victim, TO_VICT);

    die(victim);

    act("$N collapses, dead!", FALSE, ch, 0, victim, TO_ROOM);
    act("$N collapses, dead from your energy draining!",
        FALSE, ch, 0, victim, TO_CHAR);

    do_drain_stuff(ch);

    return;
  }

  return;
}

---
eglamkowski@angelfire.com
http://www.angelfire.com/nj/eglamkowski/null.html <- Null webring
http://www.angelfire.com/nj/eglamkowski/eia.html  <- EiA webring


Angelfire for your free web-based e-mail. http://www.angelfire.com


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST