EmlenMud2005-2006LOC/
EmlenMud2005-2006LOC/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"

struct int_apply_type int_app[37];
struct wis_apply_type wis_app[37];
struct con_apply_type con_app[37];

int lne = 1;
char line[40960];

int 
grab_num_2 (char *txt)
{
  int n = 0;
  char *t;
  for (t = txt; *t != '\0'; t++)
    {
      if (*t >= '0' && *t <= '9')
	{
	  n *= 10;
	  n += (*t) - '0';
	  continue;
	}
    }
  return n;
}

bool prmpt=FALSE;

char *
interpret_line (char *inlne, CHAR_DATA * ch)
{
  char tmpcd[100];
  int gpos;
  int pos;
  char *t;
  line[0] = '\0';
  lne = 1;
  gpos = 0;
  if (inlne == NULL)
    return "(type prompt all)";
  for (t = inlne; *t != '\0'; t++)
    {
      tmpcd[0] = '\0';
      pos = 0;
      if (*t == '\n')
	lne++;
      if (*t == '*')
	{
	  for (t++; *t != '*'; t++)
	    {
	      if (pos >= 10)
		{
		  fprintf (stderr, "Bad interpret * code.. '%s'.\n", inlne);
		  line[0] = '\0';
		  return line;
		}
	      tmpcd[pos] = *t;
	      pos++;
	    }
	  tmpcd[pos] = '\0';
	  line[gpos] = '\0';
	  strcat (line, parse_txt (tmpcd, ch));
	  gpos = strlen (line);
	  continue;
	}
      line[gpos] = *t;
      gpos++;
    }
  line[gpos] = '\0';
  return line;
}



char *
parse_txt (char *code, CHAR_DATA * ch)
{
  static char bf[5550];
  int sl = 0;
  int pad = 0;
  int i;
  char *tt;
  bf[0] = '\0';
  pad = grab_num_2 (code);
  if (pad > 20) pad = 20;
  for (tt = code; *tt != '\0'; tt++)
    if (!is_digit(*tt))
      break;
  
  switch (UPPER(*tt))
    {
    case 'A':
      if (!str_infix ("aff", code))
	{
	  if (ch->affected != NULL)
	    {
	      SPELL_DATA *spell;
	      AFFECT_DATA *paf;
	      char buf[500];
	      strcat (bf, "\n\rYou are affected by:");
	      lne++;
	      for (paf = ch->affected; paf != NULL; paf = paf->next)
		{
		  if ((spell = skill_lookup (NULL, paf->type)) == NULL)
		    continue;
		  lne++;
		  sprintf (buf, "\n\r%s", capitalize (spell->spell_funky_name));
		  strcat (bf, buf);
		  if (IS_MOB (ch) || (LEVEL (ch) > 100))
		    sprintf (buf,
			     " (modifies %s by %d for %d mud hours)",
			     affect_loc_name (paf->location),
			     paf->modifier,
			     paf->duration);
		  else
		    {
		      if (paf->duration > 50)
			sprintf (buf, ", which won't wear off for many days!");
		      else if (paf->duration > 30)
			sprintf (buf, ", which will wear off in a day or two.");
		      else if (paf->duration > 20)
			sprintf (buf, ", which will wear off in about a day.");
		      else if (paf->duration > 10)
			sprintf (buf, ", which will wear off in about half a day.");
		      else if (paf->duration > 6)
			sprintf (buf, ", which will wear off in about a quarter of a day.");
		      else if (paf->duration > 3)
			sprintf (buf, ", which will wear off in a few hours.");
		      else if (paf->duration > 1)
			sprintf (buf, ", which will wear off soon.");
		      else if (paf->duration == 1)
			sprintf (buf, ", which will wear off very soon.");
		      else
			sprintf (buf, ", which will wear off at any moment.");
		    }
		  strcat (bf, buf);
		}
	    }
	} 
      else if (!str_infix ("al", code))
	{
	  sprintf (bf, "%d", ALIGN (ch));
	} 
      else if (!str_infix ("ap", code))
	{
	  if (!ch->ced)
	    sprintf (bf, "0");
	  else
	    sprintf (bf, "%d", GET_DAMROLL (ch)); 
	}
      else if (!str_infix ("a", code))
	{
	  sprintf (bf, "%d", get_age (ch));
	}
      break;
    case 'C':
      if (!str_infix ("con", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", get_curr_con (ch));
	  else
	    sprintf(bf, "XX");
	  
	}
      else if (!str_infix ("cond", code))
	{
	  char tbf[100];
	  tbf[0] = '\0';
	  if (ch->pcdata->condition[COND_DRUNK] > 10)
	    strcat (tbf, "You are drunk.\n\r");
	  if (ch->pcdata->condition[COND_FULL] < 10 &&
	      ch->pcdata->condition[COND_FULL] > 5)
	    strcat (tbf, "You are starting to get hungry.\n\r");
	  if (ch->pcdata->condition[COND_THIRST] < 10 &&
	      ch->pcdata->condition[COND_THIRST] > 5)
	    strcat (tbf, "You are beginning to get thirsty.\n\r");
	  if (ch->pcdata->condition[COND_FULL] < 5 &&
	      ch->pcdata->condition[COND_FULL] > 0)
	    strcat (tbf, "You are hungry.\n\r");
	  if (ch->pcdata->condition[COND_THIRST] < 5 &&
	      ch->pcdata->condition[COND_THIRST] > 0)
	    strcat (tbf, "You are thirsty.\n\r");
	  if (ch->pcdata->condition[COND_THIRST] < 1)
	    strcat (tbf, "You are totally dehydrated!\n\r");
	  if (ch->pcdata->condition[COND_FULL] < 1)
	    strcat (tbf, "You are STARVING!\n\r");
	  if (tbf[0] != '\0')
	    {
	      lne++;
	      strcat (bf, "\n\r");
	      strcat (bf, tbf);
	    }
	}
      else if (!str_infix("cskl", code))
	{
  	  sprintf(bf, "%d", (race_info[ch->pcdata->race].max_skills +
align_info[ch->pcdata->alignment].max_skills+
(ch->pcdata->remort_times+1)/2) - tally_spsk(ch, 0));
	}
      else if (!str_infix("cspl", code))
	{
 	  sprintf(bf, "%d", (race_info[ch->pcdata->race].max_spells +
align_info[ch->pcdata->alignment].max_spells+ (ch->pcdata->remort_times)- tally_spsk(ch, 1)));
	}
      else if (!str_infix("cprf", code))
	{
       sprintf(bf, "%d", (race_info[ch->pcdata->race].max_profs +
align_info[ch->pcdata->alignment].max_profs+ (ch->pcdata->remort_times+1)/2) - tally_spsk(ch, 2));
	} 
      else if (!str_infix ("clan", code))
	{
	  int ii;
	  if (IS_PLAYER (ch))
	    {
	      ii = clan_number (ch);
	      if (ii > 0)
		{
		  sprintf (bf, "\n\rMember of \x1B[1;36m%s\x1B[37;0m clan.", get_clan_index (ii)->name);
		  lne++;
		}
	    }
	}
      else if (!str_infix ("cv", code))
	{
	  if (LEVEL (ch) > 100)
	    sprintf (bf, "%d", ch->in_room->vnum);
	  else
	    bf[0] = '\0';
	} 
      else if (!str_infix ("cr", code))
	{
	  sprintf (bf, "%d", ch->pcdata->carry_number);
	}
      else if (!str_infix ("cn", code))
	{
	  sprintf (bf, "%d", (ch->gold * 100) + ch->copper);
	}
      else if (!str_infix ("cb", code))
	{
	  sprintf (bf, "%ld", ch->pcdata->bank);
	}
      break;
    case 'D':
      if (!str_infix ("dex", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", get_curr_dex (ch));
	  else 
	    sprintf(bf, "XX");
	}
      else if (!str_infix ("dth", code))
	{
	  sprintf(bf, "%d", ch->pcdata->deaths);
	}
      break;
    case 'E':
      if (!str_infix ("eb", code))
	{
	  int evasion;
	  if (!ch->ced)
	    sprintf (bf, "0");
	  else
	    {
	      evasion = get_curr_dex (ch) + (LEVEL (ch) / 5) + (is_member (ch, GUILD_THIEFG) ? 5 : 0) +
		(ch->pcdata->learned[gsn_parry] == -100 ? 0 : ch->pcdata->learned[gsn_parry] / 7) +
		(ch->pcdata->learned[gsn_dodge] == -100 ? 0 : ch->pcdata->learned[gsn_dodge] / 6) +
		(ch->pcdata->learned[gsn_evade] == -100 ? 0 : ch->pcdata->learned[gsn_evade] / 6) +
		(ch->pcdata->learned[gsn_shield_block] == -100 ? 0 : ch->pcdata->learned[gsn_shield_block] / 9) +
		(IS_SET (ch->ced->fight_ops, F_AGGRESSIVE) ? 0 : 4);
	      sprintf (bf, "%d", evasion);
	    }
	}
      break;
    case 'F':
      if (!str_infix ("fi", code))
	{
	  if (!FIGHTING (ch))
	    bf[0] = '\0';
	  else
	    sprintf (bf, "[Oppnt: %s] ", capitalize (STRING_HITS (FIGHTING (ch))));
	}
      break;
    case 'G':
      if (!str_infix ("guil", code) && ch->pcdata->guilds != 0 && IS_PLAYER (ch))
	{
	  int i=0;
	  bool prev= FALSE;
	  lne++;
	  strcat(bf, "\n\rGuild(s): \x1b[1;37m");
	  for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list"); i++)
	    {
	      if (is_member(ch, guild_data[i].mob_guildmaster_bit))
		{
		  if (prev)
		    strcat(bf, ",");
		  strcat(bf, guild_data[i].what_you_see);
		  prev = TRUE;
		}
	    }
	  
	  strcat (bf, "\x1B[0;37m.");
	}
      else if (!str_infix ("g", code))
	{
	  int i, j;
	  char *t;
	  i = 0;
	  for (t = line + (strlen (line)); t != line && *t != '\r' && *t != '\n'; t--)
	    {
	      i++;
	    }
	  for (j = pad - i; j > 0; j--)
	    {
	      strcat (bf, " ");
	      if (strlen(bf)>80) break;
	    }
	  return bf;
	}
      break;
    case 'H':
      if (!str_infix ("hn", code))
	{
	  sprintf (bf, "%ld", ch->hit);
	}
      else if (!str_infix ("hm", code))
	{
	  sprintf (bf, "%ld", ch->max_hit);
	}
      else if (!str_infix ("hw", code))
	{
	  sprintf (bf, "%s", capitalize (STRING_HITS (ch)));
	}
      else if (!str_infix ("ht", code))
	{
	  sprintf (bf, "%d' %2d\"",
		   ch->height / 12, ch->height % 12);
	}
      
      break;
    case 'I':
      if (!str_infix ("int", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", get_curr_int (ch));
	  else 
	    sprintf(bf, "XX");
	}
      break;
    case 'J':
      
      break;  
    case 'K':
      if (!str_infix ("kw", code))
	{
	  sprintf (bf, "%d Stn., %d Peb.", ch->pcdata->carry_weight/WGT_MULT, ch->pcdata->carry_weight % WGT_MULT);
	}
      else if (!str_infix ("kp", code))
	{
	  sprintf (bf, "%d", ch->pcdata->killpoints);
	}
      
      break;
    case 'L':
      if (!str_infix ("lea", code))
	{
	  sprintf (bf, "%d", (IS_MOB (ch) ? 0 : ch->pcdata->learn));
	}
      else if (!str_infix ("lvl", code))
	{
	  sprintf (bf, "%d", LEVEL (ch));
	}
      else if (!str_infix ("lnme", code))
	{
	  int offset = strlen(NAME(ch))/2;
	  int backset = (strlen(NAME(ch))+1)/2;
	  char buff[100];
	  int i;
	  sprintf(buff, " ");
	  for (i = 0; i < (20-offset); i++)
	    strcat(buff, " ");
	  strcat(buff, NAME(ch));
	  for (i = 0; i < (20-backset); i++)
	    strcat(buff, " "); 
	  
	  sprintf (bf, buff);
	}
      
      break;
    case 'M':
      if (!str_infix ("mnn", code))
	{
	  sprintf (bf, "%d", mana_now (ch));
	} 
      else if (!str_infix ("mmm", code))
	{
	  sprintf (bf, "%d", max_mana (ch));
	} 
      else if (!str_infix ("mn", code))
	{
	  sprintf (bf, "%d", ch->move);
	}
      else if (!str_infix ("mm", code))
	{
	  sprintf (bf, "%d", ch->max_move);
	}
      else if (!str_infix ("mw", code))
	{
	  sprintf (bf, "%s", capitalize (STRING_MOVES (ch)));
	}
      break;
    case 'N':
      if (!str_infix ("npkl", code))
	{
	  sprintf (bf, "%ld", ch->pcdata->pklevels);
	}
      else if (!str_infix ("npkh", code))
	{
	  sprintf (bf, "%ld", ch->pcdata->pkhelpers);
	}
      else if (!str_infix ("npks", code))
	{
	  sprintf (bf, "%d", ch->pcdata->pkills);
	}
      else if (!str_infix ("npkd", code))
	{
	  sprintf (bf, "%d", ch->pcdata->pkilled);
	} 
      else if (!str_infix ("npkr", code))
	{
	  sprintf (bf, "%ld", ch->pcdata->pkers);
	} 
      break;
    case 'O':
      if (!str_infix ("ob", code))
	{
	  int bonushit, offensive;
	  bonushit = 0;
	  if (!ch->ced)
	    sprintf (bf, "0");
	  else
	    {
	      SINGLE_OBJECT *objt;
	      objt = get_item_held(ch, ITEM_WEAPON);
	      if (objt != NULL)
		bonushit = addoffense2 (ch, objt);
	      offensive = bonushit + GET_HITROLL (ch);
	      sprintf (bf, "%d", offensive);
	    }
	}
      break;  
    case 'P':
      if (!str_infix ("pos", code))
	{
	  char tbf[100];
	  tbf[0] = '\0';
	  switch (ch->position)
	    {
	    case POSITION_DEAD:
	      strcpy (tbf, "You are DEAD!!           ");
	      break;
	    case POSITION_MORTAL:
	      strcpy (tbf, "You are mortally wounded.");
	      break;
	    case POSITION_INCAP:
	      strcpy (tbf, "You are incapacitated.   ");
	      break;
	    case POSITION_STUNNED:
	      strcpy (tbf, "You are stunned.         ");
	      break;
	    case POSITION_SLEEPING:
	      strcpy (tbf, "You are sleeping.        ");
	      break;
	    case POSITION_RESTING:
	      strcpy (tbf, "You are resting.         ");
	      break;
	    case POSITION_MEDITATING:
	      strcpy (tbf, "You are meditating.      ");
	      break;
	    }
	  if (tbf[0] != '\0')
	    {
	      strcat (bf, "\n\r");
	      lne++;
	      strcat (bf, tbf);
	    }
	}
      else if (!str_infix ("pra", code))
	{
	  sprintf (bf, "%d", (IS_MOB (ch) ? 0 : ch->pcdata->practice));
	}
      
      else if (!str_infix ("pt", code))
	{
	  int hours = ((ch->pcdata->played) + (((int) (current_time - ch->pcdata->logon)))) / 3600;
	  sprintf (bf, "%d", hours);
	}
      break;
    case 'Q':
      if (!str_infix ("qstr", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", ch->pcdata->stat[0]);
	  else 
	    sprintf(bf, "XX");  
	}
      else if (!str_infix ("qint", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", ch->pcdata->stat[1] );
	  else 
	    sprintf(bf, "XX");  
	}
      else if (!str_infix ("qwis", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", ch->pcdata->stat[2]);
	  else 
	    sprintf(bf, "XX");  
	}
      else if (!str_infix ("qdex", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", ch->pcdata->stat[3]);
	  else 
	    sprintf(bf, "XX");
     }
      else if (!str_infix ("qcon", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", ch->pcdata->stat[4]);
	  else 
	    sprintf(bf, "XX");  
	}
      break;
    case 'R':
      if (!str_infix ("rank", code))
	{
	  if (LEVEL (ch) < 4)
	    sprintf (bf, "Inexperienced");
	  else if (LEVEL (ch) < 12)
	    sprintf (bf, "Knowledgable ");
	  else if (LEVEL (ch) < 27)
	    sprintf (bf, "Experienced  ");
	  else if (LEVEL (ch) < 45)
	    sprintf (bf, "Well-Known   ");
	  else if (LEVEL (ch) < 70)
	    sprintf (bf, "Famous       ");
	  else if (LEVEL (ch) < 100)
	    sprintf (bf, "LEGEND       ");
	  else
	    sprintf (bf, "A God        ");
	}
      else if (!str_infix ("rmt", code))
	{
	  sprintf (bf, "%d", ch->pcdata->remort_times);
	}
      else if (!str_infix ("r", code))
	{
	  sprintf (bf, "%s", race_info[ch->pcdata->race].name);
	}
      break;
      
    case 'S':
      if (!str_infix ("str", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", get_curr_str (ch));
	  else 
	    sprintf(bf, "XX");
	}
      else if (!str_infix ("sex", code))
	{
	  if (ch->pcdata->sex == SEX_MALE) sprintf (bf, "Male   ");
	  else if (ch->pcdata->sex == SEX_FEMALE) sprintf (bf, "Female ");
	  else 
	    {
	      ch->pcdata->sex = SEX_NEUTRAL;
	      sprintf(bf, "Neutral");
	    }
	} 
      else if (!str_infix("snme", code))
	{
	  sprintf (bf, NAME(ch));
	}
      else if (!str_infix ("sect", code))
	{
	  int ii;
	  if (IS_PLAYER (ch))
	    {
	      ii = clan_number_2 (ch);
	      if (ii > 0)
		{
		  sprintf (bf, "\n\rMember of \x1B[1;36m%s\x1B[37;0m sect.", get_clan_index_2 (ii)->name);
		  lne++;
		}
	    }
	}
      break;
    case 'T':
      if (!str_infix("tskl", code))
	{
	  sprintf(bf, "%d", (race_info[ch->pcdata->race].max_skills + align_info[ch->pcdata->alignment].max_skills + (ch->pcdata->remort_times+1)/2));
	}
      else if (!str_infix("tspl", code))
	{
 	  sprintf(bf, "%d", (race_info[ch->pcdata->race].max_spells +
align_info[ch->pcdata->alignment].max_spells+
(ch->pcdata->remort_times)));
	} 
      else if (!str_infix("tprf", code))
	{
	  sprintf(bf, "%d", (race_info[ch->pcdata->race].max_profs + align_info[ch->pcdata->alignment].max_profs+ (ch->pcdata->remort_times+1)/2));
	} 
      
      else if (!str_infix ("tk", code))
	{
	  if (!FIGHTING (ch) || !FIGHTING (FIGHTING (ch)) || FIGHTING (FIGHTING (ch)) == ch)
	    bf[0] = '\0';
	  else
	    sprintf (bf, "[%s: %s] ", NAME (FIGHTING (FIGHTING (ch))), capitalize (STRING_HITS (FIGHTING (FIGHTING (ch)))));
	}
      else if (!str_infix ("twp", code))
	{
	  sprintf (bf, "%ld", ch->pcdata->total_wps);
	} 
      else if (!str_infix ("tc", code))
	{
	  sprintf (bf, "%d", ch->pcdata->totalkills);
        }
   /*  Heres what structure tried to add else if (!str_infix ("sha", 
code))
        { 
        sprintf (bf, "%sd", ch->pcdata->elemental_alignment);
	} */
      break;
    case 'W':
      if (!str_infix ("wis", code))
	{
	  if( LEVEL(ch) >= pow.level_to_see_numeric_stats)
	    sprintf (bf, "%d", get_curr_wis (ch));
	  else 
	    sprintf(bf, "XX");
	}
      else if (!str_infix ("warm", code) && IS_PLAYER (ch))
	{
	  if (cur_temp (ch) < 50)
	    {
	      if (ch->pcdata->warmth > 0)
		{
		  switch (ch->pcdata->warmth / 10)
		    {
		    case 0:
		    case 1:
		      strcat (bf, "\n\rYour clothing doesn't protect you too well in cold weather.");
		      break;
		    case 2:
		    case 3:
		      strcat (bf, "\n\rYour clothing protects you moderately well in cold weather.");
		      break;
		    case 4:
		      strcat (bf, "\n\rYour clothing protects you quite well in cold weather.");
		      break;
		    case 5:
		      strcat (bf, "\n\rYour clothing would keep you warm in some of the most frigid conditions.");
		      break;
		    default:
		      strcat (bf, "\n\rYour clothing would keep you very warm even in the middle of a blizzard!");
		      break;
		    }
		  lne++; 
		}
	    }
	}
      else if (!str_infix ("wim", code))
	{
	  sprintf (bf, "%d", (!ch->ced ? 0 : ch->ced->wimpy));
	}
      else if (!str_infix ("wm", code))
	{
	  sprintf (bf, "%s", capitalize (string_mana (mana_now (ch))));
	}
      else if (!str_infix ("ww", code))
	{
	  int weightmult = (get_curr_str(ch)+
			    (IS_AUGMENTED(ch, AUG_BODY_POWER) ? 2 : 0)+
			    (IS_AUGMENTED(ch, AUG_LEG_POWER) ? 2 : 0)+ 
			    (IS_AUGMENTED(ch, AUG_FOOT_POWER) ? 1 : 0))* WGT_MULT;
	  
	  if (ch->pcdata->carry_weight < weightmult *1)
	    sprintf (bf, "You are unburdened.");
	  else if (ch->pcdata->carry_weight < (weightmult * 2))
	    sprintf (bf, "No problem.        ");
	  else if (ch->pcdata->carry_weight < (weightmult * 3))
	    sprintf (bf, "It is a tad heavy. ");
	  else if (ch->pcdata->carry_weight < (weightmult * 4))
	    sprintf (bf, "It is heavy now.   ");
	  else if (ch->pcdata->carry_weight < (weightmult * 5))
	    sprintf (bf, "VERY heavy!        ");
	  else
	    sprintf (bf, "YOU ARE IN PAIN!   ");
	  
	}
      else if (!str_infix ("wp", code))
	{
	  sprintf (bf, "%ld", ch->pcdata->warpoints);
	}
      break;
      
    case 'X':
      if (!str_infix ("xp", code))
	{
	  sprintf (bf, "%ld", ch->exp);
	}
      else if (!str_infix ("xl", code))
	{
	  sprintf (bf, "%ld", ((FIND_EXP (LEVEL (ch), ch->race)) - ch->exp));
	}
      break;
    }
  
  
  sl = strlen (bf);
  if (pad > sl)
    {
      for (i = pad - sl; i > 0; i--)
	{
	  strcat (bf, " ");
	  if (strlen(bf)>80) break;
	}
    }
  
  if (pad > 1 && pad < sl)
    {
      bf[pad] = '\0';
    }
  
  return bf;
}