// 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     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();
        if ((h=({int})ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
        {
            armours[id][AWM_CLASS]=h;
        }
        if ((h=({int})ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
        {
            armours[id][AWM_EFF_CLASS]=h;
        }
        if ((h=({int})ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
        {
            armours[id][AWM_HANDS]=h;
        }
        if ((h=xflags(ob)) != armours[id][AWM_FLAGS])
        {
            armours[id][AWM_FLAGS]=h;
        }
    }
    else
    {
      armours += ([ id : 
        ([
            AWM_TYPE      : ({string})ob->QueryProp(P_ARMOUR_TYPE) ,
            AWM_CLASS     : ({int})ob->QueryProp(P_AC) ,
            AWM_EFF_CLASS : ({int})ob->QueryProp(P_EFFECTIVE_AC) ,
            AWM_FLAGS     : xflags(ob),
            AWM_WEIGHT    : ({int})ob->QueryProp(P_WEIGHT) ,
            AWM_VALUE     : ({int})ob->QueryProp(P_VALUE) ,
            AWM_HANDS     : ({int})ob->QueryProp(P_NR_HANDS) , // Fuer Schilde
            AWM_D_TYPE    : ({string*})ob->QueryProp(P_DAM_TYPE) ,
            AWM_X_CLASS   : ({int})ob->QueryProp(P_EFFECTIVE_WC) ||
                            ({int})ob->QueryProp(P_WC),
            AWM_TIME      : time()
        ]) ]);
    }
    save_me(0);
}

void RegisterWeapon()
{   object  ob;
    string  id;
    int     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();
        if ((h=({int})ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
        {
            weapons[id][AWM_CLASS]=h;
        }
        if ((h=({int})ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
        {
            weapons[id][AWM_EFF_CLASS]=h;
        }
        if ((h=({int})ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
        {
            weapons[id][AWM_HANDS]=h;
        }
        if ((h=xflags(ob)) != weapons[id][AWM_FLAGS])
        {
            weapons[id][AWM_FLAGS]=h;
        }
    }
    else
    {
      weapons += ([ id :
        ([
            AWM_TYPE      : ({string})ob->QueryProp(P_WEAPON_TYPE) ,
            AWM_CLASS     : ({int})ob->QueryProp(P_WC) ,
            AWM_EFF_CLASS : ({int})ob->QueryProp(P_EFFECTIVE_WC) ,
            AWM_FLAGS     : xflags(ob),
            AWM_WEIGHT    : ({int})ob->QueryProp(P_WEIGHT) ,
            AWM_VALUE     : ({int})ob->QueryProp(P_VALUE) ,
            AWM_HANDS     : ({int})ob->QueryProp(P_NR_HANDS) ,
            AWM_D_TYPE    : ({string*})ob->QueryProp(P_DAM_TYPE) ,
            AWM_X_CLASS   : ({int})ob->QueryProp(P_EFFECTIVE_AC) || 
                            ({int})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;
}

