Re: Newbie EQ... Class/Race affected:)

From: Admin of The Keep (
Date: 10/21/96

On Mon, 21 Oct 1996, Marie J. Myers wrote:

> Anyone have any code that would make it so when a new player logged on
> it would give them Eq accordin to there Class/Race???
> Its not that hard to code I guess... but I would apprecite it a lot :)

  Here's one way to do it.  I've written the equip-newbie code several
  times to the list in this form (where it actually will equip_char,
  put the eq in a bag, load multiples, etc.) but not with the ability
  to make the eq class/race selective.  Each time I've written it in
  my mailer, as with this time, and since this is always a popular
  requset for code, I think I'll make a patch for it.

  The below uses bitvectors to make your class/race selective.  You can't
  just put: CLASS_WARRIOR, to make something for just warriors.  You have
  to put "BIT(CLASS_WARRIOR)."  The reason for this is so you can "or" on
  other classes.  An example list follows the code.

    #define BIT(x)	(1 << (x))
    #define RACE_SET	(eq[j][3] != -1 && IS_SET(eq[j][3], race))
    #define CLASS_SET   (eq[j][4] != -1 && IS_SET(eq[j][4], cls))
    #define VALID_VNUM  (real_number(eq[j][0]) >= 0)
    #define CHECK_BAG   (!bag && bag[j][2] == BAG)

    void give_eq(struct char_data * ch) {
      int race = BIT(GET_RACE(ch)), cls = BIT(GET_CLASS(ch)), j, rnum;
      struct obj_data * bag = NULL, * obj;
      const int INVENTORY = -1, BAG = -2;
      int bag_vnum = <vnum of bag>;

      int eq[][5] = {
        { <vnum>, <quantity>, <where>, <raceBV>, <classBV> },
        { -1, -1, -1, -1, -1 }

      if ((rnum = real_object(bag_vnum)) >= 0)
        bag = read_object(rnum, REAL);

      for (j = 0; eq[j][0] != -1; j++) {
        if (!VALID_VNUM || CHECK_BAG || !RACE_SET || !CLASS_SET)
        obj = read_object(rnum, REAL);
        if (eq[j][1] > 1 && eq[j][2] <= INVENTORY) {
          for (k = 0; k < eq[j][1]; k++) {
            if (eq[j][2] == BAG) obj_to_obj(obj, bag);
            else		       obj_to_char(obj, ch);
        if (eq[j][2] == BAG) 		obj_to_obj(obj, bag);
        else if (eq[j][2] == INVENTORY) obj_to_char(obj, ch);
        else				equip_char(ch, obj, eq[j][2]);

  For instance, the 'eq' list might look like:

    { -1, -1, -1, -1, -1 }

  If -1 for either race or class indicates that it should load no matter
  what the race or class is.  This permits you to make general eq without
  the hassle, and it also allows you to give all Dwarves an axe, or all
  clerics a cross.  The list must end with -1 for vnum (as shown above),
  otherwise you'll get a crash.

  The quantity loading thing is especially nice if you want to load four
  things (eg., four rations); I often put one in the inventory and three
  in the bag so the person has quick access to one if they need it before
  they figure out how to 'get ration [from] bag'; this would work like

    { 15, 1, INVENTORY, -1, -1 }, // 1 of #15 in INV for any class/race
    { 15, 3, BAG, -1, -1 }, // 3 of #15 in BAG for any class/race

  Sorry for the C++ style comments, but I've been converting my MUD from
  scratch (known as "Project TUME" to some, and now "Darkstar++" to me)
  to C++ and it's grown to be a bad habbit.  While I'm thinking about it,
  anyone ever convert CircleMUD to C++?  It seems realitively easy to do
  save for a possible obfusicated error with how signals are set (It
  looks like, to me, that gnu c++ would report a problem with how you
  pass functions to 'my_signal' as it did with my code and regular old
  'signal' -- which I finally figured out after fooling about for some
  time).  Although it probably wouldn't be all that advantageous anyways,
  unless someone wrote some good, sturdy classes.

  "Forgive me father, for I am sin."

| Ensure that you have read the CircleMUD Mailing List FAQ: |
|   |

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