Re: [Suggestion] BPL 12 -Skills- from Thomas Pedersen on Wed, Aug 27, 1997 at 01:18:25AM -0400

From: Ric Klaren (j.klaren@STUDENT.UTWENTE.NL)
Date: 08/27/97


On Wed, Aug 27, 1997 at 01:18:25AM -0400, Thomas Pedersen wrote:
Thomas Pedersen> Not that I care (since I've changed things so much), but I think
Thomas Pedersen> this is a not-such-a-great idea.  All you get is one really long function
Thomas Pedersen> which will not look very neat.   I don't even like the spell system
Thomas Pedersen> really...one function per skill..nice and neat...(ok, some of the same
Thomas Pedersen> code is repeated in each function..but still..easier to work with).

I kindoff have to disagree. By letting a call to a skill run through a
central point one can make the real skill code a lot smaller.

From the code we use... (similar setup as Rasdan described only a bit
simpler, though with the addition that we incorporated parts of class.c in
the structures):

typedef struct skill_info
{
   const char *name;
   int levels[NUM_CLASSES];
   int flags;
   void (*command_pointer) (CHAR_DATA *ch, CHAR_DATA *vict,
                                 char * argument, int cmd, int subcmd);
   sh_int subcmd;
   byte minimum_position;
} SKILL_INFO;

#define XX -1

const SKILL_INFO skills[] = { .....
//name     when a class gets it     several flags for generic checks
//       {Mu,Cl,Th,Wa,Ra,Ba,No,Al}
{"kick", {XX,XX,XX, 1,XX, 5,XX,XX}, SK_FIGHT_VICT|SK_VIOLENT|SK_NOT_BLIND,
// the func a subcmd  minimum position
   do_kick,        0, POS_FIGHTING},
}

The do_kick function:

void do_kick(CHAR_DATA *ch, CHAR_DATA *vict, char *arg, int cmd, int subcmd)
{
   if (!ability_success(((10 - (GET_AC(vict) / 10)) << 1) +
                                                                number(1, 101),
                                                                GET_SKILL(ch, SKILL_KICK),
                                                                dex_app[GET_DEX(ch)].reaction,
                                                                GET_SKILL(vict, SKILL_KICK),
                                                                dex_app[GET_DEX(vict)].reaction))
                damage(ch, vict, 0, get_skill(ch, SKILL_KICK), NULL);
        else
                damage(ch, vict, GET_LEVEL(ch) >> 1, get_skill(ch, SKILL_KICK), NULL);

   add_wait(ch, PULSE_VIOLENCE * 3);
}

This against the 3 pages the old version was. Inside the damage function the
appropriate messages are printed. It could be that this looks a bit strange
to a standard circle guru, our mud is heavily modified and uses C++ ability
classes for a lot of message generating and more. But I'm sidetracking i guess
:) ... IMHO using these kind of structures you can make it a lot easier to
add new skills.

A few more details.... In the command_interpreter the
skill/command/spell/social is handled by their appropriate handler, for a
skill do_skill. do_skill then checks all the standard boring dribble. You
can also circumvent this procedure and use an old style ACMD(do_xxx) so it
won't be limiting in any way. In the advance stuff we use the same
skill_info struct for checking if a player should get new skills. Thus a
new skill is defined much more in a new place....

We use similar but more extended structures for spells. With these we use a
lot of C++ classes, to provide a very flexible magic core, with as much code
reuse as possible eg put as many 'standard' checks in one place. If there's
interest in it I could post a bit about them.. how we set them up.... see if
we did something stupid ;) (it was one of our first C++ rewrites of a part of
circle)





--
-----+++++*****************************************************+++++++++-------
- Ric Klaren - ia_ric@cs.utwente.nl ------- klaren@cs.utwente.nl --------------
-----+++++*****************************************************+++++++++-------
``Why don't we just invite them to dinner and massacre them all when
they're drunk?''
``You heard the man. There's seven hundred thousand of them.''
``Ah? So it'd have to be something simple with pasta, then.''
-------------------------------------------------------------------------------


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



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