// MorgenGrauen MUDlib
//
// awmaster.c -- Armours- and Weapons-Master
//
#pragma strict_types
#pragma no_clone
#pragma no_shadow
#pragma no_inherit
#pragma verbose_errors
#pragma combine_strings
#pragma pedantic
#pragma range_check
#pragma warn_deprecated

#include <combat.h>
#include <language.h>
#include <properties.h>
#include <wizlevels.h>

#define SAVEFILE  "/secure/ARCH/awmaster"
#define ADUMPFILE "/log/ARCH/RUESTUNGEN"
#define DDUMPFILE "/log/ARCH/DAMAGERS"
#define WDUMPFILE "/log/ARCH/WAFFEN"

#define AWF_PUTON  1
#define AWF_PUTOFF 2
#define AWF_BOOST  4
#define AWF_ZAUBER 8
#define AWF_RESIST 16

#define AWM_TYPE      0
#define AWM_CLASS     1
#define AWM_EFF_CLASS 2
#define AWM_FLAGS     3
#define AWM_WEIGHT    4
#define AWM_VALUE     5
#define AWM_HANDS     6
#define AWM_D_TYPE    7
#define AWM_X_CLASS   8
#define AWM_TIME      9

mapping armours,weapons,damagers;
private int save_me_soon;

private int allowed()
{
  if (previous_object() && geteuid(previous_object())==ROOTID)
    return 1;
  if (!process_call() && previous_object() && this_interactive() && ARCH_SECURITY)
    return 1;
  return 0;
}

void create()
{
    seteuid(getuid(this_object()));

    if (!restore_object(SAVEFILE))
    {
        armours = ([]);
        weapons = ([]);
        damagers = ([]);
    }
    if (widthof(damagers) == 1) {
      mapping tmp = damagers;
      damagers = m_allocate(sizeof(tmp),2);
      foreach(string r, int flag: tmp) {
        damagers[r,0]=flag;
      }
    }
}

void save_me(int now)
{
  if (now)
    save_object(SAVEFILE);
  else
    save_me_soon=1;
}

void reset() {
  if (save_me_soon)
  {
    save_me_soon=0;
    save_me(1);
  }
}

public varargs int remove(int silent) {
  save_me(1);
  destruct(this_object());
  return 1;
}

int xflags(object ob){
    int re;
    mapping m;
    if (!ob || !objectp(ob))
        return 0;
    re=0;
    if ((({object})ob->QueryProp(P_WEAR_FUNC))==ob  ||
        (({object})ob->QueryProp(P_WIELD_FUNC))==ob )
        re += AWF_PUTON;
    if ((({object})ob->QueryProp(P_REMOVE_FUNC))==ob  ||
        (({object})ob->QueryProp(P_UNWIELD_FUNC))==ob )
        re += AWF_PUTOFF;
    if ((({object})ob->QueryProp(P_DEFEND_FUNC))==ob ||
        (({object})ob->QueryProp(P_HIT_FUNC))==ob    )
        re += AWF_BOOST;
    // ists nen Mapping und nicht leer?
    if (mappingp(m=({mapping})ob->QueryProp(P_RESISTANCE_STRENGTHS))
        && sizeof(m))
        re += AWF_RESIST;
    return re;
}

void RegisterArmour()
{   object  ob;
    string  id;
    int     flag,h;

    if (!objectp(ob=previous_object()) || 
      member(inherit_list(ob),"/std/armour.c")==-1)
      return;
    id = explode(object_name(ob),"#")[0];
    if (member(armours,id))
    {
        armours[id][AWM_TIME]=time();
        flag=0;
        if ((h=({int})ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
        {
            armours[id][AWM_CLASS]=h;
            flag=1;
        }
        if ((h=({int})ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
        {
            armours[id][AWM_EFF_CLASS]=h;
            flag=1;
        }
        if ((h=({int})ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
        {
            armours[id][AWM_HANDS]=h;
            flag=1;
        }
        if ((h=xflags(ob)) != armours[id][AWM_FLAGS])
        {
            armours[id][AWM_FLAGS]=h;
            flag=1;
        }
    }
    else
    {
      armours += ([ id : 
        ([
            AWM_TYPE      : ob->QueryProp(P_ARMOUR_TYPE) ,
            AWM_CLASS     : ob->QueryProp(P_AC) ,
            AWM_EFF_CLASS : ob->QueryProp(P_EFFECTIVE_AC) ,
            AWM_FLAGS     : xflags(ob),
            AWM_WEIGHT    : ob->QueryProp(P_WEIGHT) ,
            AWM_VALUE     : ob->QueryProp(P_VALUE) ,
            AWM_HANDS     : ob->QueryProp(P_NR_HANDS) , // Fuer Schilde
            AWM_D_TYPE    : ob->QueryProp(P_DAM_TYPE) ,
            AWM_X_CLASS   : ob->QueryProp(P_EFFECTIVE_WC) ||
                            ob->QueryProp(P_WC),
            AWM_TIME      : time()
        ]) ]);
    }
    save_me(0);
}

void RegisterWeapon()
{   object  ob;
    string  id;
    int     flag,h;

    if (!objectp(ob=previous_object()) ||
      member(inherit_list(ob),"/std/weapon.c")==-1)
      return;
    id = explode(object_name(ob),"#")[0];
    if (member(weapons,id))
    {
        weapons[id][AWM_TIME] = time();
        flag=0;
        if ((h=({int})ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
        {
            weapons[id][AWM_CLASS]=h;
            flag=1;
        }
        if ((h=({int})ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
        {
            weapons[id][AWM_EFF_CLASS]=h;
            flag=1;
        }
        if ((h=({int})ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
        {
            weapons[id][AWM_HANDS]=h;
            flag=1;
        }
        if ((h=xflags(ob)) != weapons[id][AWM_FLAGS])
        {
            weapons[id][AWM_FLAGS]=h;
            flag=1;
        }
    }
    else
    {
      weapons += ([ id :
        ([
            AWM_TYPE      : ob->QueryProp(P_WEAPON_TYPE) ,
            AWM_CLASS     : ob->QueryProp(P_WC) ,
            AWM_EFF_CLASS : ob->QueryProp(P_EFFECTIVE_WC) ,
            AWM_FLAGS     : xflags(ob),
            AWM_WEIGHT    : ob->QueryProp(P_WEIGHT) ,
            AWM_VALUE     : ob->QueryProp(P_VALUE) ,
            AWM_HANDS     : ob->QueryProp(P_NR_HANDS) ,
            AWM_D_TYPE    : ob->QueryProp(P_DAM_TYPE) ,
            AWM_X_CLASS   : ob->QueryProp(P_EFFECTIVE_AC) || 
                            ob->QueryProp(P_AC),
            AWM_TIME      : time()
        ]) ]);
    }
    save_me(0);
}

void RegisterDamager(object dam_ob,int old_dam, int new_dam)
{   object ob;
    int flag;
    string fn;

    if (!objectp(ob=previous_object()) ||
      (member(inherit_list(ob),"/std/weapon.c")==-1 &&
       member(inherit_list(ob),"/std/armour.c")==-1 ))
      return;
    if (old_dam>new_dam) // Repair
        flag=2;
    else if (new_dam>old_dam) // Damage
        flag=1;
    else
        return;
    if (!objectp(dam_ob))
        return;
    if (!(fn=old_explode(object_name(dam_ob),"#")[0]) || !stringp(fn))
        return;
    damagers[fn,0]=damagers[fn,0]|flag;
    damagers[fn,1]=time(); 
    save_me(0);
}

string dtdump(mixed arg)
{   string re;
    int i,w;

    if (stringp(arg))
        return capitalize(arg);
    if (!pointerp(arg) || !stringp(arg[0]))
        return "<NONE>";
    if ((i=sizeof(arg))==1)
        return capitalize(arg[0]);
    w = (31-i)/i;
    if (w--<1)
        return "<MANY>";
    for (re="",--i;i>=0;i--)
    {
        if (!stringp(arg[i]))
            re += "-";
        else
            re += capitalize(arg[i][0..w]);
        if (i)
            re += "|";
    }
    return re;
}

int Dump(mixed what, int sortidx)
{   string  file,*ind;
    mapping dump;

    if (!allowed())
        return -1;

    if (!what)
    {
        write("Nimm doch mal einen richtigen Parameter!\n");
        return 0;
    }
    if (stringp(what) && sizeof(what)>0)
    {
        what==what[0..0];
        if (what=="a")
            what=1;
        else if (what=="w")
            what=2;
        else if (what=="d")
            what=3;
        else
        {
            write("Nimm doch mal einen richtigen Parameter!\n");
            return 0;
        }
    }
    if (!intp(what) || what<1 || what>3)
    {
        write("Nimm doch mal einen richtigen Parameter!\n");
        return 0;
    }
    if (what==3) // Die 'damagers' haben ein anderes Ausgabeformat
    {
        printf("AWM: Dumping 'damagers' to '%s'\n",DDUMPFILE);
        if (sizeof(damagers) < 1) {
            write("AWM: Dump aborted, mapping empty.\n");
            return 1;
        }
        if (file_size(DDUMPFILE)>1)
            rm(DDUMPFILE);
        
        // nach letzter Aktualisierung sortieren.
        mixed sorted = sort_array(m_indices(damagers),
            function int (string a, string b) {
                return damagers[a,1] < damagers[b,1];
            } );

        string ausgabe = sprintf(
            "--- Damagers-Dump --- %s --- %s ---\n\n"+
            "%:15s D R [Filename]\n",
            dtime(time()),capitalize(getuid(this_interactive())),
            "Datum/Zeit");
        foreach(string rue : sorted) {
            ausgabe += sprintf("%:15s %1s %1s %s\n",
                strftime("%y%m%d-%H:%M:%S",damagers[rue,1]),
                (damagers[rue,0]&1?"+":"-"),
                (damagers[rue,0]&2?"+":"-"),
                rue);
        }
        
        write_file(DDUMPFILE, ausgabe);
        return 1;
    }
    if (what==2)
        what=0;
    file=(what?ADUMPFILE:WDUMPFILE);

    printf("AWM: Dumping '%s' to '%s'\n",
        (what?"armours":"weapons"),file);
    
    dump=(what?armours:weapons);
    
    if (sortidx) {
      ind = sort_array(m_indices(dump),
          function int (string a, string b)
          {return dump[a][sortidx] < dump[b][sortidx];} );
    }
    else
      ind = sort_array(m_indices(dump),#'>);
    
    if (sizeof(ind) < 1)
    {
        write("AWM: Dump aborted, mapping empty.\n");
        return 1;
    }

    if (file_size(file)>1)
        rm(file);
    
    string ausgabe = sprintf(
        "--- %s-Dump --- %s --- %s ---\n\n"+
        "[Filename], Datum/Zeit\n"+
        "    ____Typ___ CLS ECL XCL NFBR WGHT. VALUE H %30.30'_'|s\n",
        (what?"Ruestungs":"Waffen"),dtime(time()),
        capitalize(getuid(this_interactive())),"DamType(s)");

    foreach(string index : ind)
    {
        ausgabe += sprintf(
            "[%s] %s\n    %10s %3d %3d %3d %1s%1s%1s%1s %5d %5d %1d %-30.30s\n",
            index, strftime("%y%m%d-%H:%M:%S",dump[index][AWM_TIME]),
            dump[index][AWM_TYPE],
            dump[index][AWM_CLASS],
            dump[index][AWM_EFF_CLASS],
            dump[index][AWM_X_CLASS],
           (dump[index][AWM_FLAGS]&AWF_PUTON?"+":"-"),
           (dump[index][AWM_FLAGS]&AWF_PUTOFF?"+":"-"),
           (dump[index][AWM_FLAGS]&AWF_BOOST?"+":"-"),
           (dump[index][AWM_FLAGS]&AWF_RESIST?"+":"-"),
            dump[index][AWM_WEIGHT],
            dump[index][AWM_VALUE],
            dump[index][AWM_HANDS],
            dtdump(dump[index][AWM_D_TYPE]) );
    }
    write_file(file,ausgabe);
    write("AWM: Done.\n");
    return 1;
}

int Unregister(string what)
{
    if (!allowed())
        return -1;
    if (!what)
    {
        write("Du solltest schon einen Filenamen angeben!\n");
        return 0;
    } 
    if (member(armours,what))
    {
        m_delete(armours,what);
        write("Unregistered "+what+" from 'armours'.\n");
        return 1;
    }
    if (member(weapons,what))
    {
        m_delete(weapons,what);
        write("Unregistered "+what+" from 'weapons'.\n");
        return 1;
    }
    if (member(damagers,what))
    {
        m_delete(damagers,what);
        write("Unregistered "+what+" from 'damagers'.\n");
        return 1;
    }
    save_me(0);
    return 0;
}

int ResetDamagers()
{
    if (!allowed())
        return -1;
    damagers = m_allocate(0,2);
    save_me(1);
    return 1;
}

