Re: Spells..

From: ShadowLord (
Date: 06/25/96

On Mon, 24 Jun 1996, Joshua Mentzer wrote:

> > > you type "cast 'spell'" <like word of recall, say it needs no target>.. 
> > > and it goes Casting: #######, then a few seconds, then Casting: #####
> > > etc etc.. like WAIT(ch, PULSE_VIOLENCE); send_to_char ("Casting", nums, 
> > > ch); or something.. ? and each spell have different num of nums? i.e. 
> > > num++ fer every pulse violence, each pulse violence, the nums goes down 
> > > one, and once nums = 0, the spell is cast? thank ye fer any help
>   Well, I think I understand what he's saying, though it is a little 
> messy...instead of just having it cast 'blah' <target> and it then say 
> Okay, and have the wait after it's cast, have it wait before it's cast 
> and for each wait 'tick' send_to_char "Casting: <spellname>" and after 
> the wait state cast the spell...

Ah-hah, with your help I think I cought on to what he was trying to say.
While in my MUD I use messages for delayed spells, what he essentially
wanted to do was have a "graphical" representation of the countdown until
the spell is cast, like:

  > cast 'freeze' bob
  Casting: ########
  Casting: #######
  Casting: ######
  Casting: #####
  Casting: ####
  Casting: ###
  Casting: ##
  Casting: #
  (the spell is finally cast)

Whereas I decided upon special messages for the spell routines, he wants
it to just count down, display pound signs (#) as it goes.

Spell delays, overall, is not very difficult.  Here's a general outline of
what I did:

  * Add in an 'int delay;' cast into the spell structure in spells.h

  * Change spello to include the delay, this is a little time consuming
    depending upon how many spells you have.  Make sure you add the
    extra zero into the skillo macro and the zeroing of the delay var in
    unused_skill (or was it unused_spell?).  This is all done in the
    spell_parser.c file.

  * Add three temporary variables where 'struct char_data *hunting;' is
    (wherever that structure is in stock CircleMUD):

      int cast_spellnum;
      int cast_timer;
      char *cast_target;

  * In spell_parser.c again, write a function that updates the spell
    timer for a character.  Essentially, check if they have a spell,
    if they do, then decrease the timer.  Check the target by essentially
    copying and appropriately removing/reworking the code from do_cast
    to get the target (this does require a bit of reworking on it).  If
    cast_timer is positive then you'll want to do something like:

      for (i = 0; i < cast_timer; i++)
        *(tmp + i) = '#';

    Assuming you have 'i' cast as an integer and 'tmp' cast as a char
    pointer.  Then sprintf 'i' into 'buf', and send it out.

That probably didn't make much sense at all, but then, neither did his
original message.  I hope you can derive something out of that useful.  I
did a lot more (including making characters that are casting added onto a
caster list [like the in room list] and things).  It works alright, but is
kind of a pain when it comes to some combat spells that loose their
effectiveness because of the delays.

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