toc/
toc/account/a/
toc/area/backup/
toc/area/imc/
toc/caste/
toc/caste/backup/
toc/clans/
toc/classes/
toc/crash/
toc/gods/
toc/guilds/
toc/lname/s/
toc/maps/backup/
toc/player/a/
toc/src/
toc/system/backup/
toc/tableprog/
/******************************************************
            Desolation of the Dragon MUD II
      (C) 1997, 1998  Jesse DeFer and Heath Leach
 http://dotd.mudservices.com  dotd@dotd.mudservices.com 
 ******************************************************/

/*
*** DaleMUD	ANSI_PARSER.C
***		Parser ansi colors for act();
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "mud.h"
#include "ansi.h"

/*	
    $CMBFG, where M is modier, B is back group color and FG is fore 
    $C0001 would be normal, black back, red fore.
    $C1411 would be bold, blue back, light yellow fore 
*/

char *ansi_parse(char *code)
{
   static char m[MSL];
   char b[512], f[512];

   if (!code)
      return ("");
   /* do modifier */
   switch (code[0])
   {
      case '0':
         sprintf(m, "%s", MOD_NORMAL);
         break;
      case '1':
         sprintf(m, "%s", MOD_BOLD);
         break;
      case '2':
         sprintf(m, "%s", MOD_FAINT);
         break;
         /* not used in ansi that I know of */
      case '3':
         sprintf(m, "%s", MOD_NORMAL);
         break;
      case '4':
         sprintf(m, "%s", MOD_UNDERLINE);
         break;
      case '5':
         sprintf(m, "%s", MOD_BLINK);
         break;

      case '6':
         sprintf(m, "%s", MOD_REVERSE);
         break;

      default:
         sprintf(m, "%s", MOD_NORMAL);
         break;
   }

   /* do back ground color */
   switch (code[1])
   {
      case '0':
         sprintf(b, "%s", BK_BLACK);
         break;
      case '1':
         sprintf(b, "%s", BK_RED);
         break;
      case '2':
         sprintf(b, "%s", BK_GREEN);
         break;
      case '3':
         sprintf(b, "%s", BK_BROWN);
         break;
      case '4':
         sprintf(b, "%s", BK_BLUE);
         break;
      case '5':
         sprintf(b, "%s", BK_MAGENTA);
         break;
      case '6':
         sprintf(b, "%s", BK_CYAN);
         break;
      case '7':
         sprintf(b, "%s", BK_LT_GRAY);
         break;
      default:
         sprintf(b, "%s", BK_BLACK);
         break;
   }

   /* do foreground color */
   switch (code[2])
   {
      case '0':
         switch (code[3])
         { /* 00-09 */
            case '0':
               sprintf(f, "%s", FG_BLACK);
               break;
            case '1':
               sprintf(f, "%s", FG_RED);
               break;
            case '2':
               sprintf(f, "%s", FG_GREEN);
               break;
            case '3':
               sprintf(f, "%s", FG_BROWN);
               break;
            case '4':
               sprintf(f, "%s", FG_BLUE);
               break;
            case '5':
               sprintf(f, "%s", FG_MAGENTA);
               break;
            case '6':
               sprintf(f, "%s", FG_CYAN);
               break;
            case '7':
               sprintf(f, "%s", FG_LT_GRAY);
               break;
            case '8':
               sprintf(f, "%s", FG_DK_GRAY);
               break;
            case '9':
               sprintf(f, "%s", FG_LT_RED);
               break;
            default:
               sprintf(f, "%s", FG_DK_GRAY);
               break;
         }
         break;

      case '1':
         switch (code[3])
         { /* 10-15 */
            case '0':
               sprintf(f, "%s", FG_LT_GREEN);
               break;
            case '1':
               sprintf(f, "%s", FG_YELLOW);
               break;
            case '2':
               sprintf(f, "%s", FG_LT_BLUE);
               break;
            case '3':
               sprintf(f, "%s", FG_LT_MAGENTA);
               break;
            case '4':
               sprintf(f, "%s", FG_LT_CYAN);
               break;
            case '5':
               sprintf(f, "%s", FG_WHITE);
               break;
            default:
               sprintf(f, "%s", FG_LT_GREEN);
               break;
         }
         break;

      default:
         sprintf(f, "%s", FG_LT_RED);
         break;
   }


   strcat(m, b); /* add back ground */
   strcat(m, f); /* add foreground */

   return (m);
}

void str2ansi(char *p2, char *p1, int start, int stop)
{
   int i, j;

   if ((start > stop) || (start < 0))
      p2[0] = '\0'; /* null terminate string */
   else
   {
      if (start == stop)
      {
         p2[0] = p1[start];
         p2[1] = '\0';
      }
      else
      {
         j = 0;

         /* start or (start-1) depends on start index */
         /* if starting index for arrays is 0 then use start */
         /* if starting index for arrays is 1 then use start-1 */

         for (i = start; i <= stop; i++)
            p2[j++] = p1[i];
         p2[j] = '\0'; /* null terminate the string */
      }
   }

   if (strlen(p2) + 1 > 5)
      bug("DOH!"); /* remove this after test period */
}

char *ParseAnsiColors(int UsingAnsi, char *txt)
{
   static char buf[MSL * 4] = "";
   char tmp[MIL * 4];

   register int i, l, f = 0;

   buf[0] = 0;
   for (i = 0, l = 0; *txt;)
   {
      if (*txt == '$' && (toupper(*(txt + 1)) == 'C' || (*(txt + 1) == '$' && toupper(*(txt + 2)) == 'C')))
      {
         if (*(txt + 1) == '$')
            txt += 3;
         else
            txt += 2;
         str2ansi(tmp, txt, 0, 3);

         /* if using ANSI */
         if (UsingAnsi)
            strcat(buf, ansi_parse(tmp));
         else
            /* if not using ANSI   */
            strcat(buf, "");

         txt += 4;
         l = strlen(buf);
         f++;
      }
      else
      {
         buf[l++] = *txt++;
      }
      buf[l] = 0;
   }
/*  if(f && UsingAnsi)
    strcat(buf,ansi_parse("0007")); */
   return buf;
}

char *color_str(sh_int AType, CHAR_DATA * ch)
{
   CHAR_DATA *och;

   if (!ch)
      return (atcode_color_str(AType));

   if (!ch->desc)
      return ("");

   och = (ch->desc->original ? ch->desc->original : ch);
   if (IS_NPC(och) || !xIS_SET(och->act, PLR_ANSI))
      return ("");

   switch (och->pcdata->colors[AType])
   {
      case 0:
         return (FG_BLACK);
         break;
      case 1:
         return (FG_RED);
         break;
      case 2:
         return (FG_GREEN);
         break;
      case 3:
         return (FG_BROWN);
         break;
      case 4:
         return (FG_BLUE);
         break;
      case 5:
         return (FG_MAGENTA);
         break;
      case 6:
         return (FG_CYAN);
         break;
      case 7:
         return (FG_LT_GRAY);
         break;
      case 8:
         return (FG_DK_GRAY);
         break;
      case 9:
         return (FG_LT_RED);
         break;
      case 10:
         return (FG_LT_GREEN);
         break;
      case 11:
         return (FG_YELLOW);
         break;
      case 12:
         return (FG_LT_BLUE);
         break;
      case 13:
         return (FG_LT_MAGENTA);
         break;
      case 14:
         return (FG_LT_CYAN);
         break;
      case 15:
         return (FG_WHITE);
         break;

      case 16 + 0:
         return (FG_BLNK_BLACK);
         break;
      case 16 + 1:
         return (FG_BLNK_RED);
         break;
      case 16 + 2:
         return (FG_BLNK_GREEN);
         break;
      case 16 + 3:
         return (FG_BLNK_BROWN);
         break;
      case 16 + 4:
         return (FG_BLNK_BLUE);
         break;
      case 16 + 5:
         return (FG_BLNK_MAGENTA);
         break;
      case 16 + 6:
         return (FG_BLNK_CYAN);
         break;
      case 16 + 7:
         return (FG_BLNK_LT_GRAY);
         break;
      case 16 + 8:
         return (FG_BLNK_DK_GRAY);
         break;
      case 16 + 9:
         return (FG_BLNK_LT_RED);
         break;
      case 16 + 10:
         return (FG_BLNK_LT_GREEN);
         break;
      case 16 + 11:
         return (FG_BLNK_YELLOW);
         break;
      case 16 + 12:
         return (FG_BLNK_LT_BLUE);
         break;
      case 16 + 13:
         return (FG_BLNK_LT_MAGENTA);
         break;
      case 16 + 14:
         return (FG_BLNK_LT_CYAN);
         break;
      case 16 + 15:
         return (FG_BLNK_WHITE);
         break;

      default:
         return ("\033[m");
         break;
   }
}

char *def_color_str(sh_int AType)
{
   switch (default_set[AType])
   {
      case 0:
         return (FG_BLACK);
         break;
      case 1:
         return (FG_RED);
         break;
      case 2:
         return (FG_GREEN);
         break;
      case 3:
         return (FG_BROWN);
         break;
      case 4:
         return (FG_BLUE);
         break;
      case 5:
         return (FG_MAGENTA);
         break;
      case 6:
         return (FG_CYAN);
         break;
      case 7:
         return (FG_LT_GRAY);
         break;
      case 8:
         return (FG_DK_GRAY);
         break;
      case 9:
         return (FG_LT_RED);
         break;
      case 10:
         return (FG_LT_GREEN);
         break;
      case 11:
         return (FG_YELLOW);
         break;
      case 12:
         return (FG_LT_BLUE);
         break;
      case 13:
         return (FG_LT_MAGENTA);
         break;
      case 14:
         return (FG_LT_CYAN);
         break;
      case 15:
         return (FG_WHITE);
         break;

      case 16 + 0:
         return (FG_BLNK_BLACK);
         break;
      case 16 + 1:
         return (FG_BLNK_RED);
         break;
      case 16 + 2:
         return (FG_BLNK_GREEN);
         break;
      case 16 + 3:
         return (FG_BLNK_BROWN);
         break;
      case 16 + 4:
         return (FG_BLNK_BLUE);
         break;
      case 16 + 5:
         return (FG_BLNK_MAGENTA);
         break;
      case 16 + 6:
         return (FG_BLNK_CYAN);
         break;
      case 16 + 7:
         return (FG_BLNK_LT_GRAY);
         break;
      case 16 + 8:
         return (FG_BLNK_DK_GRAY);
         break;
      case 16 + 9:
         return (FG_BLNK_LT_RED);
         break;
      case 16 + 10:
         return (FG_BLNK_LT_GREEN);
         break;
      case 16 + 11:
         return (FG_BLNK_YELLOW);
         break;
      case 16 + 12:
         return (FG_BLNK_LT_BLUE);
         break;
      case 16 + 13:
         return (FG_BLNK_LT_MAGENTA);
         break;
      case 16 + 14:
         return (FG_BLNK_LT_CYAN);
         break;
      case 16 + 15:
         return (FG_BLNK_WHITE);
         break;

      default:
         return ("\033[m");
         break;
   }
}

/* Very simular to above and below functions, used to get the text output of
   a set color for use in a string -- Xerves 12/00 */
char *char_color_str(sh_int AType, CHAR_DATA * ch)
{
   if (!ch)
      return (atcode_color_str(AType));

   if (!ch->desc)
      return ("");
      
   if (IS_NPC(ch))
      return("");

   switch (ch->pcdata->colors[AType])
   {
      case 0:
         return ("&w");
         break;
      case 1:
         return ("&r");
         break;
      case 2:
         return ("&g");
         break;
      case 3:
         return ("&O");
         break;
      case 4:
         return ("&b");
         break;
      case 5:
         return ("&p");
         break;
      case 6:
         return ("&c");
         break;
      case 7:
         return ("&c&w");
         break;
      case 8:
         return ("&z");
         break;
      case 9:
         return ("&R");
         break;
      case 10:
         return ("&G");
         break;
      case 11:
         return ("&Y");
         break;
      case 12:
         return ("&B");
         break;
      case 13:
         return ("&P");
         break;
      case 14:
         return ("&C");
         break;
      case 15:
         return ("&G&W");
         break;

      default:
         return ("&w");
         break;
   }
}

char *atcode_color_str(sh_int AType)
{
   switch (default_set[AType])
   {
      case 0:
         return ("&w");
         break;
      case 1:
         return ("&r");
         break;
      case 2:
         return ("&g");
         break;
      case 3:
         return ("&O");
         break;
      case 4:
         return ("&b");
         break;
      case 5:
         return ("&p");
         break;
      case 6:
         return ("&c");
         break;
      case 7:
         return ("&w");
         break;
      case 8:
         return ("&z");
         break;
      case 9:
         return ("&R");
         break;
      case 10:
         return ("&G");
         break;
      case 11:
         return ("&Y");
         break;
      case 12:
         return ("&B");
         break;
      case 13:
         return ("&P");
         break;
      case 14:
         return ("&C");
         break;
      case 15:
         return ("&W");
         break;

      default:
         return ("&w");
         break;
   }
}

char *uncolorify(const char *arg)
{
   static char retbuf[MSL];
   const char *c;
   char buf[8];

   retbuf[0] = '\0';

   for (c = arg; *c;)
   {
      if (*c == '&')
         strcat(retbuf, "&");
      sprintf(buf, "%c", *c++);
      strcat(retbuf, buf);
   }

   return (retbuf);
}