Re: [NEWBIE][LONG] Skills learnable by all

From: Welcor (
Date: 01/29/02

That's quite a list of changes you want there. Some are quite easy,
others will take a lot of coding to get in. I'll give you some ideas...

----- Original Message -----
From: Nick Shaw
> I was wondering if someone could help me by pointing out whats files i
> should change or even what i should do if i wanted to make all the player
> skills available to any class (not spells though). Ive been fiddling
> around but havent managed to do it. e.g. a warrior could go to a thief
> teacher and learn thief skills etc.

Change the init_spell_levels call to initialise skills for all classes;

for (i = 0;i<NUM_CLASSES;i++) {
  spell_level(SKILL_SNEAK, i, 1);

> and how can i set it up that the
> thief teacher will only teach and list thief skills, warrior warrior
> skills and so on.

You'll need to change the spell_info_type() structure in spells.h, so
it includes a class bitvector, and properly initialise it in
spell_parser.c by changing the spello calls;

in spells.h:
  int allowed_classes; /* classes allowed to learn this */

change spello to:
void spello(int spl, const char *name, int max_mana, int min_mana,
 int mana_change, int minpos, int targets, int violent, int routines,
 const char *wearoff, int classes)
  int i;

  for (i = 0; i < NUM_CLASSES; i++)
    spell_info[spl].min_level[i] = LVL_IMMORT;
  spell_info[spl].mana_max = max_mana;
  spell_info[spl].mana_min = min_mana;
  spell_info[spl].mana_change = mana_change;
  spell_info[spl].min_position = minpos;
  spell_info[spl].targets = targets;
  spell_info[spl].violent = violent;
  spell_info[spl].routines = routines;
  spell_info[spl].name = name;
  spell_info[spl].wear_off_msg = wearoff;
  spell_info[spl].allowed_classes = classes;
(Fix unused_spell() too)

Change skillo() to this definition instead:
#define skillo(skill, name) spello(skill, name, 0, 0, 0, 0, 0, 0, 0, NULL, \

Then change all of your spello calls like this example:
 spello(SPELL_ANIMATE_DEAD, "animate dead", 35, 10, 3, POS_STANDING,
Of course only add the classes you wish to be able to learn the spell.

Having initialised the spell_info[] array, your next task will be
to change the guild spec proc in spec_procs.c

Make an array for guildmasters:

struct guild_master_type {
  mob_vnum my_vnum;   /* vnum of guildmaster */
  int classes_taught; /* which classes will he teach */
} guild_masters = {
  {3020, (1<<CLASS_MAGIC_USER)},
  {3021, (1<<CLASS_CLERIC)},
  {-1, 0}

list_skills(struct char_data *ch)
list_skills(struct char_data *ch, struct char_data *gm)
and add a check like this:
  int i, classes_taught = -1;

  if (gm) {
    for (i=0;guild_masters[i]!=-1;i++) {
      if (GET_MOB_VNUM(gm) == guild_masters[i].my_vnum)
        classes_taught = guild_masters[i].classes_taught;
  for (sortpos = 1; sortpos <= MAX_SKILLS; sortpos++) {
    i = spell_sort_info[sortpos];
    if (strlen(buf2) >= MAX_STRING_LENGTH - 32) {
      strcat(buf2, "**OVERFLOW**\r\n");
    if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)] &&
       ((classes_taught == -1) ||  /* all classes taught here / no gm */
       ((1<<GET_CLASS(ch)) & spell_info[i].classes_allowed)) {
      sprintf(buf, "%-20s %s\r\n", spell_info[i].name,
how_good(GET_SKILL(ch, i)));
      strcat(buf2, buf); /* The above, ^ should always be safe to do. */

Now list_skills will only list skill taught to the class specified in
the struct above.

Finally, in SPECIAL(guild)
make sure list_skills is called as list_skills(ch, (struct char_data *)me);
and in do_practice, it should be called as list_skills(ch, NULL)

add a final check:

  if (!((1<<GET_CLASS(ch)) & spell_info[skill_num].allowed_classes) {
    sprintf(buf, "You do not know of that %s.\r\n", SPLSKL(ch));
    send_to_char(buf, ch);
    return (1);

> Also how do i  get it to only list the skills you
> have learnt when you type practice rather than all the skills available
> to you.

in the above (list_skills) make a check for whether you're at a gm
and list all in that case, or are typing 'prac' and then only list
those with GET_SKILL(ch, skill_num);

    if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)] &&
       ((classes_taught == -1) ||  /* all classes taught here / no gm */
       ((1<<GET_CLASS(ch)) & spell_info[i].classes_allowed)) {


    if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)] &&
       ((classes_taught == -1) ||  /* all classes taught here / no gm */
       ((1<<GET_CLASS(ch)) & spell_info[i].classes_allowed) &&
       ((gm) || GET_SKILL(ch, i))) {

> It seems a bit silly to me that you have it on your list if you
> havent learned it. And one last thing (since ive been asking so much),
> how can i make it so that the magicuser class can practice both spells
> and skills, not just one or the other.

That's primarily a cosmetic issue. I'll leave it as an excercise :P

Mind you, the above is VERY much mailer code (and if you have trouble
understanding what it does, tinker with it :)

Paranoid schizophrenics outnumber their enemies at least two to one.

   | FAQ: |
   | Archives: |
   | Newbie List:   |

This archive was generated by hypermail 2b30 : 06/25/03 PDT