[NEWBIE][CODE][LONG] Skillset command

From: Jared H. Rowe (jared.h.rowe@LMCO.COM)
Date: 07/04/02


Was messing around with imm commands the other day, and I noticed that the
display from the skillset command (no args)(ACMD(do_skillset) in modify.c
stock 30bpl21) leaves a little to be desired. So I cleaned it up a bit.
Figured why not throw it out on the list and see what people think.

Here is what the display from the old code looks like:

500H 100M 82V > skillset
Syntax: skillset <name> '<skill>' <value>
Skill being one of the following:
             armor          teleport             bless         blindness
     burning hands    call lightning      charm person       chill touch
             clone       color spray   control weather       create food
      create water        cure blind       cure critic        cure light
             curse  detect alignmentdetect invisibility      detect magic
     detect poison       dispel evil        earthquake    enchant weapon
      energy drain          fireball              harm              heal
      invisibility    lightning bolt     locate object     magic missile
            poisonprotection from evil      remove curse         sanctuary
    shocking grasp             sleep          strength            summon
    word of recall     remove poison        sense life      animate dead
       dispel good       group armor        group heal       infravision
         waterwalk          backstab              bash              hide
              kick         pick lock            rescue             sneak
             steal             track          identify       fire breath
        gas breath      frost breath       acid breath  lightning breath

500H 100M 82V >


Heres what the display from the new code looks like:

500H 100M 82V > skillset
Syntax: skillset <name> '<skill>' <value>
Skill being one of the following:
armor               teleport            bless               blindness
burning hands       call lightning      charm person        chill touch
clone               color spray         control weather     create food
create water        cure blind          cure critic         cure light
curse               detect alignment    detect invisibili~  detect magic
detect poison       dispel evil         earthquake          enchant weapon
energy drain        fireball            harm                heal
invisibility        lightning bolt      locate object       magic missile
poison              protection from e~  remove curse        sanctuary
shocking grasp      sleep               strength            summon
word of recall      remove poison       sense life          animate dead
dispel good         group armor         group heal          infravision
waterwalk           backstab            bash                hide
kick                pick lock           rescue              sneak
steal               track               identify            fire breath
gas breath          frost breath        acid breath         lightning breath

500H 100M 82V >

As you can see, the spells protection from evil and detect invisibility have
been truncated, and a '~' has been added to the end of each spell.

This was accomplished by using snprintf() to limit (truncate) the length of
each spell name. Then we do a check to see if spell_info[i].name is longer
than 17 chars - if it is we add the '~' to the end of the string and print
it. I'll let the code explain itself.

New code for the display part of the function:

ACMD(do_skillset)
{
  struct char_data *vict;
  char name[MAX_INPUT_LENGTH], help[MAX_STRING_LENGTH];
  char buf[MAX_INPUT_LENGTH], buf1[40], buf2[20];
  int skill, value, i, qend;
  int max_spellname_length = 18;

  argument = one_argument(argument, name);

  if (!*name) {  /* no arguments. print an informative text */
    send_to_char(ch, "Syntax: skillset <name> '<skill>' <value>\r\n"
  "Skill being one of the following:\r\n");
    for (qend = 0, i = 0; i <= TOP_SPELL_DEFINE; i++) {
      if (spell_info[i].name == unused_spellname) /* This is valid. */
 continue;
      snprintf(buf2, max_spellname_length, "%s", spell_info[i].name);
      if (strlen(spell_info[i].name) > 17)
        strcat(buf2, "~");
      sprintf(buf1, "%-20s", buf2);
      send_to_char(ch, buf1);
      if (qend++ % 4 == 3)
 send_to_char(ch, "\r\n");
    }
    if (qend % 4 != 0)
      send_to_char(ch, "\r\n");
    return;
  }...

Well I'm sure there are probably more efficient ways of doing this, but this
is what I came up with. Fell free to make comments/suggestions, or point out
any problems. Also feel free to use/change it in any way you like.

Jared

--
   +---------------------------------------------------------------+
   | 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/25/03 PDT