[Code] Show Percentage Levels for skills/spells

From: Michael Timothy Donovan (donovan@engin.umich.edu)
Date: 10/07/96


For all those who asked, below is my code for displaying percentage 
levels for skills and spells.  Someone asked a question on how to allow a 
person to have both spells and skills, the answer is that Circle really 
doesn't differentiate between the two, and you just assign skills to a 
spell caster as you would assign spells, in class.c.

All the code below goes in spec_procs.c.  I make no warrenty to the code 
being the most efficient, but it seems to work rather well.

replace:

int spell_sort_info....

with:

int spell_sort_info[MAX_SPELLS+1];  /* sorted list of spells */
int skill_sort_info[MAX_SKILLS-MAX_SPELLS+1];  /* sorted list of skills */

replace:

void sort_spells.....

with:

void sort_spells(void)
{
  int a, b, tmp;

  /* First sort the spells */

  /* initialize array */
  for (a = 1; a < MAX_SPELLS; a++)
    spell_sort_info[a] = a;

  /* Sort.  'a' starts at 1, not 0, to remove 'RESERVED' */
  for (a = 1; a < MAX_SPELLS - 1; a++)
    for (b = a + 1; b < MAX_SPELLS; b++)
      if (strcmp(spells[spell_sort_info[a]], spells[spell_sort_info[b]]) 
> 0) {
        tmp = spell_sort_info[a];
        spell_sort_info[a] = spell_sort_info[b];
        spell_sort_info[b] = tmp;
      }

  /* Now sort the skills */

  /* initialize array */
  for (a = 1; a < MAX_SKILLS - MAX_SPELLS; a++)
    skill_sort_info[a] = a + MAX_SPELLS;

  for (a = 1; a < MAX_SKILLS - MAX_SPELLS - 1; a++)
    for (b = a + 1; b < MAX_SKILLS - MAX_SPELLS; b++)
      if (strcmp(spells[skill_sort_info[a]], spells[skill_sort_info[b]]) > 0) {
        tmp = skill_sort_info[a];
        skill_sort_info[a] = skill_sort_info[b];
        skill_sort_info[b] = tmp;
      }
}

replace:

void list_skills...

with:

void list_skills(struct char_data * ch)
{
  extern char *spells[];
  extern struct spell_info_type spell_info[];
  int counter, i, sortpos;

  if (!GET_PRACTICES(ch))
    strcpy(buf, "You have no practice sessions remaining.\r\n\r\n");
  else
    sprintf(buf, "You have %d practice session%s remaining.\r\n\r\n",
            GET_PRACTICES(ch), (GET_PRACTICES(ch) == 1 ? "" : "s"));

  strcpy(buf2, buf);

  counter = 1;   /* Used to display spells and skills in two columns */

  for (sortpos = 1; sortpos < MAX_SPELLS; sortpos++) {
    i = spell_sort_info[sortpos];
    if (strlen(buf2) >= MAX_STRING_LENGTH - 32) {
      strcat(buf2, "**OVERFLOW**\r\n");
      break;
    }
    if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)]) {
      counter++;
      if (counter == 2){
        sprintf(buf, "You know of the following spells:\r\n");
        sprintf(buf,"%s+------------------------------------",buf);
        sprintf(buf,"%s+------------------------------------+\r\n", buf);
        strcat(buf2,buf);
      }
      sprintf(buf, "| %-30s %3d ", spells[i], GET_SKILL(ch, i));
      if (counter % 2) sprintf(buf, "%s|\r\n",buf);
      strcat(buf2, buf);
    }
  }
  if (counter != 1){
    if (!(counter % 2))
      strcat(buf2,"|                                    |\r\n");
    sprintf(buf,"+------------------------------------");
    sprintf(buf,"%s+------------------------------------+\r\n\r\n", buf);
    strcat(buf2, buf);
  }
  else
    strcat(buf2,"You do not know any spells.\r\n\r\n");

  counter = 1;

  for (sortpos = 1; sortpos < MAX_SKILLS - MAX_SPELLS; sortpos++) {
    i = skill_sort_info[sortpos];
    if (strlen(buf2) >= MAX_STRING_LENGTH - 32) {
      strcat(buf2, "**OVERFLOW**\r\n");
      break;
    }
    if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)]) {
      counter++;
      if (counter == 2){
        sprintf(buf, "You know of the following skills:\r\n");
        sprintf(buf,"%s+------------------------------------",buf);
        sprintf(buf,"%s+------------------------------------+\r\n", buf);
        strcat(buf2,buf);
      }
      sprintf(buf, "| %-30s %3d ", spells[i], GET_SKILL(ch, i));
      if (counter % 2) sprintf(buf, "%s|\r\n",buf);
      strcat(buf2, buf);
    }
  }
  if (counter != 1){
    if (!(counter % 2))
      strcat(buf2,"|                                    |\r\n");
      sprintf(buf,"+------------------------------------");
      sprintf(buf,"%s+------------------------------------+\r\n", buf);
      strcat(buf2, buf);
    }
  else
    strcat(buf2,"You do not know any skills.");

  page_string(ch->desc, buf2, 1);
}

And that is all.  I hope I got everything right, if you have problems let 
me know, I could have made and error in copying it.  Hope this is what 
people have been looking for.

----------------------------------------------------------------------
Michael Donovan                      |  If you are expecting to find
University of Michigan               |  something witty here, you are
donovan@engin.umich.edu              |  looking in the wrong place.
----------------------------------------------------------------------

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



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