// invmaster.c by Nachtwind@MG V1.1 (5.3.2001)
// A small master that provides a graphical display of the player´s
// equipment. 
#pragma strong_types
#pragma save_types,rtt_checks
#pragma range_check
#pragma no_clone

#include <input_to.h>
#include <properties.h>
#include <ansi.h>
#include <combat.h>
#include <language.h>
#include "invmaster.h"


mapping data;
closure abbreviate;


// i'm aware this can be determined with m_indices(VALID_ARMOUR_TYPE),
// but the position in the arrays is important for the drawing order.
// first item in the array is drawn last
static string *armour_types = 
({AT_BELT,
  AT_SHIELD,
  AT_HELMET,
  AT_BOOT,
  AT_TROUSERS,
  AT_AMULET,
  AT_RING,
  AT_GLOVE,
  AT_QUIVER,
  AT_CLOAK,
  AT_ARMOUR});

static mapping colors = 
([0:ANSI_BLACK,
  1:ANSI_RED, 
  2:ANSI_GREEN,
  3:ANSI_YELLOW,
  4:ANSI_BLUE,
  5:ANSI_PURPLE,
  6:ANSI_CYAN,
  7:ANSI_WHITE,
  8:""]);
  
static mapping bgcolors = 
([0:ANSI_BG_BLACK,
  1:ANSI_BG_RED, 
  2:ANSI_BG_GREEN,
  3:ANSI_BG_YELLOW,
  4:ANSI_BG_BLUE,
  5:ANSI_BG_PURPLE,
  6:ANSI_BG_CYAN,
  7:ANSI_BG_WHITE,
  8:""]);
  


static string Mapping2ColoredText(mapping pic, object player);
static string Mapping2PlainText(mapping pic);
static void AddDescription(mapping pic, string type, object item);
static string ComposeDesc(object item);
static void ConfigureColors(string text);

void ShowInv(object player, string arg);

// ok, let´s just read in the graphics...
// really takes some time (~250 eval ticks) but is only done
// once in an uptime
void create()
{
  mapping pic;
  string *files, *lines, text;
  int i,j,k, indentx,indenty, color;

  data=([]);
  
  DB("Trying to fire up master, path is '"+INVPATH+"'...");
  files=get_dir(INVPATH+"gfx/*")-({".", ".."});
  DB(sprintf("Files found in 'gfx/': \n%O", files));
  for (i=sizeof(files)-1;i>=0;i--)
  {
    DB("Reading '"+files[i]+"' ...");
    text=read_file(INVPATH+"gfx/"+files[i]);
    if (!stringp(text))
    {
      DB("Failed to read file.");
      continue;
    }
    lines=explode(text, "\n");
    if (sizeof(lines) < 4)
    {
      DB("File corrupt.");
      continue;
    }
    indentx=to_int(lines[1]);
    indenty=to_int(lines[2]);
    color=to_int(lines[0]);
    pic=([]);
    for (j=sizeof(lines)-1;j>2;j--)
    {
      for (k=sizeof(lines[j])-1;k>=0;k--)
      {
        if (lines[j][k..k]!="?")
          pic+=([(j-3+indenty)*80+k+indentx:lines[j][k..k];color]);
      }
    }
    data+=([files[i]:pic]);
    DB("File successfully read.");
  }
  DB(sprintf("Types covered:\n%O\n", m_indices(data)));

  // create closure only once to save time
  // needed by ComposeDesc()
  // the closure ist not as complicated as it seems ;)
  // it just checks every word of the name, if it does not begin
  // with a capital letter, it is abbreviated
  // this happens only if the name length exceeds 20 chars...
  abbreviate = function string (string x) {
      if ( member(({"der","des"}), x) > 0 )
        return "d.";
      else if ( sizeof(x) > 3)
        return regreplace(x, "^[a-z].+", x[0..0]+".", 0x1);
      else
        return x;
    };
}

// function that tries to guess a good item name and use abbrevations
// where possible
static string ComposeDesc(object item)
{
  int i;
  string text, *buff;
  
  text=regreplace(item->QueryProp(P_SHORT)
                ||item->name(RAW)
                ||"<?>",
                "^(Ein Paar|Ein|Eine|Der|Die|Das) ","",0);
                
// try to shorten the name with the closure
  if (sizeof(text) > 20)
    return implode(map(explode(text, " "), abbreviate), " ");
  else      
    return text;
}

// converts a mapping with characters and color info into a
// text. data in the mapping is stored in a one-dimensional 
// order with the position as key (ypos is pos/80, xpos pos%80)
// this setup has a huge advantage: combining several
// graphics just takes a "+" operator, the rest is handled
// by the game driver. freakin' fast, much better than doing an
// iteration over one or more array in lpc.
static string Mapping2ColoredText(mapping pic, object player)
{
  string text;
  mapping configmap;
  int i,j,color;
  
  configmap=default_config+(player->QueryProp(P_INVMASTER_CONFIG)||([]));

  text="";
  color=0;
  for (i=0;i<22;i++)
  {
    text+=bgcolors[configmap[8]];
    for (j=0;j<78;j++)
    { 
      if (pic[i*80+j,1]!=color)
      {
        color=pic[i*80+j,1];
        text+=colors[configmap[color]];
      }
      text+=pic[i*80+j];
    }
    text+=ANSI_NORMAL+"\n";
    color=0;
  }
  return text;
}

static string Mapping2PlainText(mapping pic)
{
  string text;
  int i,j;
  
  text="";

  for (i=0;i<22;i++)
  {
    for (j=0;j<78;j++)
      text+=pic[i*80+j];
    text+="\n";
  }
  return text;
}
static void AddDescription(mapping pic, string type, object item)
{
  int indentx, indenty, i;
  string text;

  switch(type)
  {
   case AT_HELMET:
      indentx=47;
      indenty=0;
      text=sprintf("%-30s",ComposeDesc(item)[0..30]);break;
    case AT_QUIVER:
      indentx=49;
      indenty=2;
      text=sprintf("%-28s",ComposeDesc(item)[0..28]);break;     
    case AT_AMULET:
      indentx=49;
      indenty=4;     
      text=sprintf("%-27s",ComposeDesc(item)[0..28]);break;     
    case AT_ARMOUR:
      indentx=53;
      indenty=7;
      text=sprintf("%-24s",ComposeDesc(item)[0..25]);break;          
    case AT_SHIELD:
      indentx=54;
      indenty=10;   
      text=sprintf("%-20s",ComposeDesc(item)[0..24]);break;
    case AT_CLOAK:
      indentx=53;
      indenty=15;
      text=sprintf("%-20s",ComposeDesc(item)[0..25]);break;
    case AT_TROUSERS:
      indentx=49;
      indenty=17;
      text=sprintf("%-20s",ComposeDesc(item)[0..20]);break;     
    case AT_RING:
      indentx=0;
      indenty=9;
      text=sprintf("%14s",ComposeDesc(item)[0..17]);break;
    case AT_GLOVE:
      indentx=0;
      indenty=11;
      text=sprintf("%14s",ComposeDesc(item)[0..17]);break;
    case AT_BELT:
      indentx=1;
      indenty=13;
      text=sprintf("%14s",ComposeDesc(item)[0..18]);break;     
    case AT_BOOT:
      indentx=1;
      indenty=20;
      text=sprintf("%18s",ComposeDesc(item)[0..18]);break;
    case "Waffe":
      indentx=1;
      indenty=1;
      text=sprintf("%18s",ComposeDesc(item)[0..25]);
      if (item->QueryProp(P_NR_HANDS) > 1 &&
          this_player() &&
          !(this_player()->QueryArmorByType(AT_SHIELD)))
        AddDescription(pic, AT_SHIELD, item);break;
    default: return;
  }
  for (i=0;i<sizeof(text);i++)
    pic+=([(80*indenty+indentx+i):text[i..i];2]);
}

varargs static void ConfigureColors(string text)
{ 
  mapping config, display;
  string *strs;
  
  if (!objectp(this_player())) return;
  
  if (this_player()->InFight())
  {
    write(break_string(
      "Im Kampf? Na Du hast Nerven, das lassen wir doch mal lieber! "
      "Probier es danach nochmal...", 78));
    return;
  }
  
  if (stringp(text)) text=lower_case(text);
  
  if (text=="ok")
  {
    write("Farbkonfiguration beendet.\n");
    return;
  }

  //"ansi_config", def in invmaster.h
  config=this_player()->QueryProp(P_INVMASTER_CONFIG)||([]);
  display=default_config+config;
  
  if (!text || text=="")
  {
    write( 
    "*** Farbkonfiguration fuer den Ausruestungsbefehl ***\n\n"
    " Farbe:                     wird dargestellt mit:\n"
    "------------------          --------------------\n"
    " Hintergrund                 "+COLORNAMES[display[8]]+"\n"
    " Schwarz                     "+COLORNAMES[display[0]]+"\n"
    " Rot                         "+COLORNAMES[display[1]]+"\n"
    " Gruen                       "+COLORNAMES[display[2]]+"\n"
    " Gelb                        "+COLORNAMES[display[3]]+"\n"
    " Blau                        "+COLORNAMES[display[4]]+"\n"
    " Magenta                     "+COLORNAMES[display[5]]+"\n"
    " Tuerkis                     "+COLORNAMES[display[6]]+"\n"
    " Weiss                       "+COLORNAMES[display[7]]+"\n\n"
    "Farbe aendern mit '<farbe> <gewuenschte farbe>'.\n"
    "Beispiel: 'gelb rot'.\n"
    "Alles, was standardmaessig gelb waere, wuerde dann mit der ANSI-Farbe \n"
    "Rot dargestellt.\n"
    "Der Hintergrund kann zusaetzlich die Farbe 'keine' haben, bei der der \n"
    "Hintergrund eben ueberhaupt nicht gefaerbt wird.\n"
    "Beispiel: 'hintergrund keine'. Schaltet die Hintergrundfarbe aus.\n\n"
    "Beenden mit 'ok'. \n"
    "Wiederholung der Farbliste mit <Return>.\n"
    "Farbliste auf Standard zuruecksetzen mit 'reset'.\n");
  }
  else
  if (text=="reset")
  {
    this_player()->Set(P_INVMASTER_CONFIG, SAVE, F_MODE_AD);    
    this_player()->SetProp(P_INVMASTER_CONFIG, 0);
    write("Farben zurueckgesetzt!\n");    
  }
  else
  {
    if ( sizeof(strs=explode(text, " ")-({""})) !=2 
      || !member((COLORCODES-(["keine"])), strs[0])
      || !member((COLORCODES-(["hintergrund"])), strs[1])
      || ((strs[0]!="hintergrund") && (strs[1]=="keine")) ) 
    {
      write("Falsche Eingabe.\n"
            "Format: <farbe|hintergrund> <zugewiesene Farbe>\n"
            "Abbrechen mit 'ok'.\n");
    }
    else
    {
      if (COLORCODES[strs[1]]==default_config[COLORCODES[strs[0]]])
        config-=([COLORCODES[strs[0]]]);
      else
        config+=([COLORCODES[strs[0]]:COLORCODES[strs[1]]]);
      if (!sizeof(config))
      {
        this_player()->Set(P_INVMASTER_CONFIG, SAVE, F_MODE_AD);    
        this_player()->SetProp(P_INVMASTER_CONFIG, 0);
      }
      else
      {
        this_player()->SetProp(P_INVMASTER_CONFIG, deep_copy(config));
        this_player()->Set(P_INVMASTER_CONFIG, SAVE, F_MODE_AS);        
      }
      write("Ok, Farbe gewaehlt!\n");
    }
  }
  input_to("ConfigureColors", INPUT_PROMPT, "\nEingabe: ");
}


string* armour_order=({ 
    AT_HELMET, AT_AMULET, AT_QUIVER, AT_ARMOUR, AT_CLOAK,
  AT_GLOVE, AT_RING, AT_BELT,
  AT_TROUSERS, AT_BOOT, AT_SHIELD, AT_MISC}); 

mapping weapon_names=([
		       WT_SPEAR : "Speer",
		       WT_SWORD : "Schwert",
		       WT_STAFF : "Kampfstab",
		       WT_WHIP  : "Peitsche",
		       WT_CLUB  : "Keule",
		       WT_KNIFE : "Messer",
		       WT_MISC  : "Irgendwas",
		       WT_MAGIC : "Artefakt",
		       WT_AXE   : "Axt",
	         WT_RANGED_WEAPON : "Fernwaffe"
		       ]);

string SimpleInv(object player) {
  object* armours=player->QueryProp(P_ARMOURS);
  int count=sizeof(armour_order);
  string* list=allocate(count);
  string result="Ausruestung\n";
  int i;

  foreach(object ob: armours) {
    if (!objectp(ob)) continue;
      int idx = member(armour_order, ob->QueryProp(P_ARMOUR_TYPE));	      
      if (idx>=0)
        list[idx]=ob->QueryProp(P_SHORT)||ob->name(RAW);
  }

  // AT_MISC (letztes Element in list und armour_order) weglassen.
  for (i=0;i<count-1;i++) {
    result+=sprintf("%-20s %-57s\n",armour_order[i],list[i] || "");
  }

  object ob=player->QueryProp(P_WEAPON);
  if (objectp(ob)) 
  {
    string waffentyp;
    if ( ob->QueryProp(P_WEAPON_TYPE)!=WT_HANDS ) 
    { 
      waffentyp = (ob->QueryProp(P_NR_HANDS)==1 ? "Einhand-":"Zweihand-")
		               +weapon_names[ob->QueryProp(P_WEAPON_TYPE)];
    }
    else
    {
      waffentyp = "Waffe";
    }
    result+=sprintf("%-20s %-57s\n", waffentyp,
		    ob->QueryProp(P_SHORT)||ob->name(RAW));
  } 
  else 
    result+="Keine Waffe\n";

  return result;
}
// the main function called by the player object.
// determines gender, then adds armor/weapon graphics
// dynamically. still very fast due to the use of the "+" operator,
// see above.
void ShowInv(object player, string arg)
{
  string gender, type;
  mapping pic;
  int i;
  object item;

  if (!objectp(player)||!interactive(player)) return;

  // split args.
  string *args;
  if (stringp(arg))
    args = explode(lower_case(arg), " ") - ({" "});
  else
    args = ({});

  if (member(args, "farben") > -1) {
      ConfigureColors();
      return;
  }

  if (member(args, "-k") > -1 || player->QueryProp(P_NO_ASCII_ART)) {
    tell_object(player, SimpleInv(player));
    return;
  }

  gender=player->QueryProp(P_GENDER)==FEMALE?"_female":"_male";
  pic=deep_copy(data["base"+gender]);
  pic+=data["Beschriftung"];
  for (i=sizeof(armour_types)-1;i>=0;i--)
    if (objectp(item=player->QueryArmourByType(armour_types[i])))
    {
      pic+=data[armour_types[i]+gender];
      AddDescription(pic, armour_types[i], item);
    }
  if (item=player->QueryProp(P_WEAPON))
  {
    pic+=data[(VALID_WEAPON_TYPE(type=item->QueryProp(P_WEAPON_TYPE)))?
      type:WT_MISC];
    AddDescription(pic, "Waffe", item);
  }      
  if (player->QueryProp(P_TTY)!="ansi")
    player->More(Mapping2PlainText(pic));
  else
    player->More(Mapping2ColoredText(pic, player));
  DB(geteuid(player)+" eval cost: "+(1000000-get_eval_cost())+" ticks.\n");
}

