[PROBABLY IDIOTIC] Prompt System

From: Phillip A Ames (kirk47@juno.com)
Date: 01/22/00


Hey all,
I wrote a function to replace the stock circle prompt one.  I added
variables(char * and char[256]) in the player data and file structure,
then changed do_display to allow the player to enter a series of letters,
numbers, and symbols in order to create their own prompt(i.e. $h/$HHP or
$%h%H would yield 500/500HP or
100%H).  The initial symbol that would start a search for recognized
variables is the '$'. I ran into a
problem when I re-compiled and connected.  Foof.  Game crashes.  I threw
in a couple log statements, but I can't give you any GDB output
because..well.. I don't run Linux(ducks).  However, I can tell you that
the program seems to be dying in the last use of strlen() in the
function(line reading   sprintf(prompt + strlen(prompt), "> "); )  just
before return(prompt);.  I believe that this crash is being caused by my
lack of knowledge about indirections and how to use them, which we
haven't covered in the C++ class I am currently taking.  Here is the log
output:

Jan 20 21:25:25 :: New connection.  Waking up.
Jan 20 21:25:25 :: make_prompt called, desc data: connected = 2
has_prompt = 1
Jan 20 21:25:25 :: if d->connected is true
[crash]
The entire MUD is stock, except for this modification.  If anyone can
spot any problems with the following code(of which I'm sure there are
many), I'd appreciate a response detailing whats wrong, and if its not
too much to ask, a possible fix for it or suggestions. Thanks in advance!

char *make_prompt(struct descriptor_data *d)
{
  char *pprompt;// prompt string w/vars
  char *prompt; // actual prompt string
  char c[3];
  struct char_data *enemy = NULL, *tank = NULL, *ch = NULL;
  int percent, i, var, p = 0, len;
  log("make_prompt called, desc data: connected = %d has_prompt = %d",
d->connected, d->has_prompt);
 if(!d->character){
  if(d->connected)
     log("if d->connected is true");
  else
     log("false");
  /* Note, prompt is truncated at MAX_PROMPT_LENGTH chars (structs.h ) */
  if (d->str)
    strcpy(prompt, "] ");

  else if (d->showstr_count)
    sprintf(prompt, "\r\n[ Return to continue, (q)uit, (r)efresh, (b)ack,
or page number (%d/%d) ]",
            d->showstr_page, d->showstr_count);
  else if (!d->connected) {
    log("!d->connected");
    *prompt = '\0';
    log("assigning ch");
    ch = d->character;
    log("ch assigned");
    enemy = FIGHTING(ch);
    pprompt = GET_PROMPT(d->character);
    skip_spaces(&pprompt);
    len = strlen(pprompt);
    log(len);

    for(i = 0; i < len; i++){
        c[0] = pprompt[i];
        if(c[0] == '$'){
          c[1] = pprompt[i++];
          var = 1;
        }
        else
          sprintf(prompt + strlen(prompt), "%c", c[0]);
        if(c[1] == '%'){
          c[2] = pprompt[i++];
          p = 1;
        }
        else
          sprintf(prompt + strlen(prompt), "%c", c[1]);
        if(c[0] == '$'){
          if(p){
            switch(c[2]){
                  case 'h': case 'H':
                  percent = ((float) (GET_HIT(ch) /
GET_MAX_HIT(ch))*100);
                  sprintf(prompt + strlen(prompt), "%d%%", percent);
                  break;
                  case 'm': case 'M':
                  percent = ((float) (GET_MANA(ch) /
GET_MAX_MANA(ch))*100);
                  sprintf(prompt + strlen(prompt), "%d%%", percent);
                  break;
                  case 'v': case 'V':
                  percent = ((float) (GET_MOVE(ch) /
GET_MAX_MOVE(ch))*100);
                  sprintf(prompt + strlen(prompt), "%d%%", percent);
                  break;
                  case 'x': case 'X':
                  percent = ((float) (GET_EXP(ch) /
(level_exp(GET_CLASS(ch), (GET_LEVEL(ch)+1))*100)));
                  sprintf(prompt + strlen(prompt), "%d%%", percent);
                  break;
            } // switch(c[2]
          } // if(p)

          switch(c[1]){
                case 'h': // curr. health
                  sprintf(prompt + strlen(prompt), "%d", GET_HIT(ch));
                break;
                case 'H': // max health
                  sprintf(prompt + strlen(prompt), "%d",
GET_MAX_HIT(ch));
                break;
                case 'm': // curr. mana
                  sprintf(prompt + strlen(prompt), "%d", GET_MANA(ch));
                break;
                case 'M': // max mana
                  sprintf(prompt + strlen(prompt), "%d",
GET_MAX_MANA(ch));
                break;
                case 'v': // curr. move
                  sprintf(prompt + strlen(prompt), "%d", GET_MOVE(ch));
                break;
                case 'V': // max move
                  sprintf(prompt + strlen(prompt), "%d",
GET_MAX_MOVE(ch));
                break;
                case 'c': case 'C': // credits(money) attributed to them
                  sprintf(prompt + strlen(prompt), "%d", GET_GOLD(ch));
                break;
                case 'a': case 'A':  // AC
                  sprintf(prompt + strlen(prompt), "%d/10", GET_AC(ch));
                break;
                case 'x': // curr. exp.
                  sprintf(prompt + strlen(prompt), "%d", GET_EXP(ch));
                break;
                case 'X': // exp. to level
                  sprintf(prompt + strlen(prompt), "%d",
level_exp(GET_CLASS(ch), (GET_LEVEL(ch)+1)) - GET_EXP(ch));
                break;
                case 'e': case 'E': [clipped for space reasons] break; //
enemy cond.
                case 't': case 'T': [clipped for space reasons] break; //
tank cond.
                case '_': // new line
                sprintf(prompt + strlen(prompt), "\r\n");
                break;
          } // switch(c[1])
        } // if(c[0] == '$')
      } // for(...)
        } // else if(!d->...

  sprintf(prompt + strlen(prompt), "> ");
  return(prompt);
 } else // if(!d->char...
  return("> "); // return > if there is no character linked to the desc
}

________________________________________________________________
YOU'RE PAYING TOO MUCH FOR THE INTERNET!
Juno now offers FREE Internet Access!
Try it today - there's no risk!  For your FREE software, visit:
http://dl.www.juno.com/get/tagj.


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



This archive was generated by hypermail 2b30 : 04/10/01 PDT