/*
**   Objekt-Tester - Mischung aus Rikus' Detailtester und Rochus' Test-NPC.
**
*****************************************************************************
**
**    Urspruengliche Objekte:
**    ~~~~~~~~~~~~~~~~~~~~~~~
**    /players/rikos/obj/rdet.c           Rikus@MorgenGrauen         25.05.96
**
**    /players/rochus/mon/tester.c        Rochus@MorgenGrauen        18.10.94
**
*****************************************************************************
**
**    Dieses Objekt:                                          [ Version 0.8 ]
**    ~~~~~~~~~~~~~~
**    /players/paracelsus/tools/otest.c   Paracelsus@Morgengrauen    28.02.98
**
**    Die Weitergabe, Verwendung oder Veraenderung ist nur erlaubt, wenn
**    diese Meldung nicht geaendert wird.
**    Die Benutzung erfolgt auf eigene Gefahr, jede Verantwortung wird
**    abgelehnt. Es wird keine Garantie gegeben, dass der Objekttester
**    einwandfrei, vollstaendig oder gar zufriedenstellend arbeitet.
**
*****************************************************************************
**
**    ChangeLog:
**    ~~~~~~~~~~
**    V 0.1    28.02.98 11:00:00   Paracelsus
**
**                                   Rikus' Raumtester kopiert, optimiert.
**
**    V 0.2    28.02.98 11:30:00   Paracelsus
**
**                                   Keine direkte Ausgabe mehr sondern
**                                   stattdessen ein More().
**
**    V 0.3    28.02.98 13:00:00   Paracelsus
**
**                                   Testen nicht mehr auf Raeume beschraenkt.
**
**    V 0.4    28.02.98 16:00:00   Paracelsus
**
**                                   Funktionen aus Rochus' Tester uebernommen
**
**    V 0.5    28.02.98 18:00:00   Paracelsus
**
**                                   Funktionalitaeten von Rikus und Rochus
**                                   aneinander angepasst.
**
**    V 0.6    28.02.98 19:00:00   Paracelsus
**
**                                   Gerueche und Geraeusche eingebaut,
**                                   erste Tests erfolgreich.
**
**    V 0.7    28.02.98 19:30:00   Paracelsus
**
**                                   Spaltenzahl einstellbar.
**
**    V 0.8    01.03.98 19:30:00   Paracelsus
**
**                                   Scannen ganzer Verzeichnisse. Geht jetzt
**                                   zumindest bei Raeumen.
**
**    V 0.9    20.09.98 20:45:00   Paracelsus
**
**                                   Umgestellt von heart_beat() auf
**                                   call_out(), damit this_player()
**                                   erhalten bleibt.
**	       13.10.08		   Chagall
**
**				     _query_details() und
**				     _query_special_details auf
**				     QueryProp() umgestellt
**
****************************************************************************
**
**   Eventuell auftretende Probleme:
**   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**   - Zu hohe eval_cost, wenn zu viele Details vorhanden sind.
**     Groesster bisher getesteter Raum (ohne Fehler) : 63907
**     Scheint also wohl doch kein Problem zu sein.
**
****************************************************************************
**
**   Ideen/ToDo:
**   ~~~~~~~~~~~
**
**   - NPC-Infos testen.
**
****************************************************************************
*/

#include <defines.h>
#include <properties.h>
#include <wizlevels.h>
#include <terminal.h>

#define DATAFILE     "test.dat"
#define DEFAULT_DATA "/obj/tools/tester/test.dat"

#define P_OTEST_TYP "ob-test:typ"
#define P_OTEST_SPL "ob-test:spalten"

#define T_ROCHUS 1
#define T_RIKUS  2

#define T_PAUSE  4

#pragma strong_types

inherit "/std/thing";

// Allgemein benoetigte globale Variablen

int     scantyp,spalten;
mapping all_dets;
mixed   output;
object  master;

// Globale Variablen fuer das scannen ganzer Directories

int     scanrun,scancount,scanpause,*scanerr;
string  scandir,*scanfiles;
object  testob;

string x_long()
{   string re,PRE,END;

    switch (PL->QueryProp(P_TTY))
    {
        case "ansi"  :
        case "vt100" : PRE=BOLD; END=NORMAL; break;
        default      : PRE="";   END="";     break;
    }

    re = break_string(
         "Mit diesem Objektpruefer kannst Du feststellen, welche Details, "+
         "Gerueche oder Geraeusche in einem Raum bzw an einem Objekt noch "+
         "nicht beschrieben sind.",78)+
         "\n"+
         "Syntax: %sotest [detail|smell|sound] {<objekt>[in mir|im raum]|"+
             "hier}\n\n"+
         "        otype [rikus|rochus]\n\n"+
         "        ocolm [1|2|3|4|5|6|7|8|auto]\n\n"+
         "        otdir <verzeichnis> <ausgabefile>%s\n\n"+
         break_string(
         "Mit %sotype%s kann man festlegen, ob man im 'Rikus'- oder im "+
         "'Rochus'-Modus scannen will, mit %socolm%s die anzahl der Ausgabe"+
         "spalten und mit %sotest%s wird dann die Auswertung gestartet. "+
         "Mit dem Kommando %sotdir%s kann man sogar ganze Verzeichnisse "+
         "auf einmal testen lassen. Das dauert natuerlich eine Weile. "+
         "Ausserdem muss ein Verzeichnis '/log/<magiername>/' bestehen.",78)+
         "Derzeitiger Scantyp:    %s'"+(scantyp==T_ROCHUS?"ROCHUS":"RIKUS")+
         "'%s\n"+
         "Derzeitige Spaltenzahl: %s%s%s\n%s";
    return sprintf(re,PRE,END,PRE,END,PRE,END,PRE,END,PRE,END,PRE,END,PRE,
           (spalten>0?sprintf("%d",spalten):"'AUTO'"),END,
           (scanrun?sprintf(
               "\nDerzeit Dirscan in:     %s%s%s\n"+
               "Angenommene Restzeit:   %s(%s) [Fi:%d/%d|Er:%d|Sk:%d]%s\n",
               PRE,scandir,END,PRE,
               time2string("%h:%02m:%02s",(scanrun-1)*4*T_PAUSE),
               (sizeof(scanfiles)-scanrun+1),(sizeof(scanfiles)),
               scanerr[0],scanerr[1],END):""));
}

protected void create()
{
    if (!clonep(ME))
        return;

    ::create();

// Allgemeine globale Variablen initialisieren

    scantyp   = T_ROCHUS;
    spalten   = 4;
    all_dets  = ([]);
    output    = 0;

// Globale Variablen fuer den Directoryscan initialisieren

    scandir   = 0;
    scanrun   = 0;
    scanfiles = ({});
    scancount = 0;
    scanpause = 0;
    scanerr   = ({0,0});

// Properties

    SetProp(P_SHORT,"Ein Objektpruefer") ;
    Set(P_LONG,#'x_long,F_QUERY_METHOD);
    SetProp(P_NAME,"Objektpruefer");
    SetProp(P_GENDER,MALE);
    SetProp(P_AUTOLOADOBJ,1);
    SetProp(P_VALUE,0);
    SetProp(P_WEIGHT,0);
    SetProp(P_NODROP,1);
    SetProp(P_NEVERDROP,1);

    AddId( ({"pruefer","objektpruefer"}) );

    AddCmd( "otest","search" );
    AddCmd( "otype","scanart" );
    AddCmd( "ocolm","spaltenzahl" );
    AddCmd( "otdir","dirtesten" );
}

public varargs void init(object origin)
{
    ::init();
    if (PL->QueryProp(P_TESTPLAYER) || IS_LEARNER(PL))
    {
        scantyp=(PL->QueryProp(P_OTEST_TYP)||T_ROCHUS);
        spalten=(PL->QueryProp(P_OTEST_SPL)||4);
        return;
    }
    if (find_call_out("removen") == -1)
      call_out("removen",0);
}

/***************************************************************************
**
**  Die Hilfsfunktionen des Objekttesters.
**
****************************************************************************
*/

void Output(string text)
{
    if (!text || !stringp(text))
        return;
    if (objectp(output))
        output->More(text);
    else if (stringp(output))
        write_file(output,text);
    else
        write(text);
}

int removen()
{
    write("Dieses Tool ist nur fuer Testies und Magier!\n");
    remove();
    return 1;
}

string *gross(string s)
{
    return regexp(regexplode(s,"[^A-Za-z0-9]"),"\\<[A-Z]");
}

string *det_auswerten(string input)
{   string *words,str,*re;
    int    anf,n,i;

    if (scantyp==T_RIKUS)
        return gross(input);

    re = ({});
    if (!input || !stringp(input))
        return re;

    words=regexplode(input,"[^A-Za-z0-9]");
        n=sizeof(words);
    if (!n)
        return re;

    anf=1;
    for (i=0;i<n;i++)
    {
        str=words[i];
        if (str=="" || str==" ")
            continue;
        if (str=="." || str==":" || str=="?" || str=="!")
        {
            anf=1;
            continue;
        }
        if (sizeof(regexp(({str}),"[^A-Za-z0-9]")))
            continue;
        if (sizeof(regexp(({str}),"\\<[0-9]*\\>")))
            continue;
        if (str!=capitalize(str))
            continue;
        if (anf)
        {
            anf=0;
            continue;
        }
        re += ({ str });
    }
    return re;
}

varargs mixed test_details(string str, string def)
{   string *strs,ostr,*strs2,suf;
    int    i;

    if (!str || !stringp(str) || !mappingp(all_dets))
        return 0;

    strs = ({str});
    ostr = str;

    if ((suf=str[<1..<1])=="s" || suf=="n" || suf=="e")
    {
        ostr  = str[0..<2];
        strs += ({ ostr });
        ostr += ("("+suf+")");
    }
    if ((suf=str[<2..<1])=="es" || suf=="en")
    {
        ostr  = str[0..<3];
        strs += ({ ostr });
        ostr += ("("+suf+")");
    }
    for ( strs2=({}),i=sizeof(strs)-1 ; i>=0 ; i--)
        if (member(all_dets,strs[i]))
        {
            if (stringp(def) && all_dets[strs[i]]==def && str!=SENSE_DEFAULT)
                continue;
            strs2 += ({ strs[i] });
	}
    if (sizeof(strs2)>0)
        return strs2;
    return ostr;
}

string *eval_detail_entry(mixed key)
{   mixed  re,h;
    string *ra;
    int    i;

    if (!key || !stringp(key) || !mappingp(all_dets) || !member(all_dets,key))
        return ({});

    re=all_dets[key];
    if (closurep(re))
        re=funcall(re,key);
    if (mappingp(re))
    {
        ra=filter(m_indices(re),#'stringp);
        for ( h=({ re[0] }),i=sizeof(ra)-1 ; i>=0 ; i-- )
            if (stringp(re[ra[i]]))
                h += ({ re[ra[i]] });
            else if (pointerp(re[ra[i]]))
                h += re[ra[i]];
        re=h;
    }
    if (pointerp(re))
        return filter(re,#'stringp);
    if (stringp(re))
        return ({ re });
    return ({});
}

/***************************************************************************
**
**  Die Funktion, die die (Special)Details im Raum untersucht.
**
****************************************************************************
*/

int search_d(object r)
{   int     i,j,room;
    mapping m;
    string  *s,s1,*s2,PRE,END,*special,*zufinden,*details,re,*uebergehen;
    mixed   mi;

    if (!r || !objectp(r))
    {
        write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
        return 1;
    }

// Die Ausgaben erfolgen zunaechst in einen String.

    re="\n";

// Handelt es sich um einen Raum?

    room = (function_exists("int_long",r) ? 1 : 0 );

// Terminaltyp des Magiers feststellen.

    if (objectp(output))
        switch (output->QueryProp(P_TTY))
        {
            case "ansi"  :
            case "vt100" : PRE=BOLD; END=NORMAL; break;
            default      : PRE="";   END="";     break;
        }
    else
    {
        PRE="";
        END="";
    }

//  Liste der zu uebergehenden Details erzeugen. Die verwendete Methode hat den
//  Vorteil, dass man nach einer Ergaenzung der Liste nicht das Tool neu laden
//  und clonen muss. Das Tool erwartet, die Liste DATAFILE im gleichen
//  Verzeichnis zu finden, in dem auch das Tool liegt.

    s1=implode(explode(old_explode(object_name(ME),"#")[0],"/")[0..<2],"/")+"/"
       DATAFILE;
    if (file_size(s1)<1)
        s1=DEFAULT_DATA;

    uebergehen = regexp(regexplode(read_file(s1),"[^A-Za-z0-9]"),"\\<[a-z]");

// Satz an Details, die auf jeden Fall vorhanden sein sollten, je nachdem
// ob P_INDOORS gesetzt ist oder nicht.

    if (room && r->QueryProp(P_INDOORS))
        zufinden = ({"Boden","Decke","Wand","Waende","Raum"});
    else if (room)
        zufinden = ({"Boden","Himmel","Sonne","Wolke","Wolken"});
    else
        zufinden = ({});

// Alle vorhandenen Details anzeigen.

//    details = sort_array(m_indices(r->_query_details()||([])),#'<);
    details = sort_array(m_indices(r->QueryProp(P_DETAILS)||([])),#'<);

    if (scanrun<1)
    {
        if ((i=sizeof(details))>0)
        {
            for ( s1="",--i; i>=0 ; i-- )
                s1 += (details[i]+(i?"\n":""));

            re += sprintf(sprintf("%sListe der vorhandenen Details:%s\n\n"+
                          "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
                          sprintf(".%d",spalten))+"s")),s1);
        }
        else
            re += sprintf("%sKeine Details gefunden.%s\n\n",PRE,END);
    }

// Alle vorhandenen SpecialDetails anzeigen.

//    special=sort_array(m_indices(r->_query_special_details()||([])),#'<);
    special=sort_array(m_indices(r->QueryProp(P_SPECIAL_DETAILS)||([])),#'<);

    if (scanrun<1)
    {
        if ((i=sizeof(special))>0)
        {
            for ( s1="",--i ; i>=0 ; i-- )
                s1 += (special[i]+(i?"\n":""));

            re += sprintf(sprintf(
                          "%sListe der vorhandenen SpecialDetails:%s\n\n"+
                          "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
                          sprintf(".%d",spalten))+"s")),s1);
        }
        else
            re += sprintf("%sKeine SpecialDetails gefunden.%s\n\n",PRE,END);
    }

//  Die Listen der vorhandenen Details und SpecialDetails vereinigen.

    details += special;

//  Details und SpecialDetails auswerten - gar nicht so einfach.

    all_dets = r->Query(P_DETAILS);

    for ( s=({}),i=sizeof(details)-1 ; i>=0 ; i--)
        s += eval_detail_entry(details[i]);

    for ( s2=({}),i=sizeof(s)-1 ; i>=0 ; i-- )
        if (stringp(s[i]))
            if (member(s2,s[i])==-1)
            {
                s2 += ({ s[i] });
                zufinden+=det_auswerten(s[i]);
            }

//  Grossgeschriebene Woerter aus der Langbeschreibung hinzufuegen.

    if (function_exists("int_long",r))
        zufinden += det_auswerten(
            old_explode(r->int_long(master,master),"Es gibt ")[0]);
    else
        zufinden += det_auswerten(old_explode(r->long(),"enthaelt:")[0]);

// Doppelte Eintraege eliminieren.

    for ( s2=({}), i=sizeof(zufinden)-1 ; i>=0 ; i--)
        if (member(s2,zufinden[i])==-1)
            s2 += ({ zufinden[i] });

// Alles klein machen.

    zufinden=map(s2,#'lower_case);

// Bei NPCs/Objekten die IDs rausfiltern.

    if (!room)
        zufinden -= r->QueryProp(P_IDS);

// Die zu uebergehenden Details rausfiltern.

    zufinden=filter((zufinden-uebergehen),#'stringp);

// Schauen, welche Details fehlen und diese Ausgeben.

    for ( s=({}),s2=({}),i=sizeof(zufinden)-1;i>=0;i--)
    {
        if (!(mi=test_details(zufinden[i])))
            continue;
        if (pointerp(mi))
        {
           for (j=sizeof(mi)-1 ; j>=0 ; j--)
               if (member(s,mi[j])==-1)
                   s += ({ mi[j] });
        }
        else if (stringp(mi) && member(s2,mi)==-1)
            s2 += ({ mi });
    }

    s  = sort_array(s, #'<);
    s2 = sort_array(s2,#'<);

    if (scanrun<1)
    {
        if ((i=sizeof(s))>0)
        {
            for ( s1="",--i ; i>=0 ; i-- )
                s1 += (s[i]+(i?"\n":""));

            re += sprintf(sprintf("%sListe der gefundenen Details:%s\n\n"+
                          "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
                          sprintf(".%d",spalten))+"s")),s1);
        }
        else
            re += sprintf("%sEs gibt keine Details.%s\n\n",PRE,END);
    }

    if ((i=sizeof(s2))>0)
    {
        for ( s1="",--i ; i>=0 ; i-- )
           s1 += (s2[i]+(i?"\n":""));

        re += sprintf(sprintf("%sListe der fehlenden Details:%s\n\n"+
                      "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
                      sprintf(".%d",spalten))+"s")),s1);
    }
    else
        re += sprintf("%sEs fehlen keine Details.%s\n\n",PRE,END);

    if (scanrun<1)
        re += sprintf("%sFERTIG.%s\n",PRE,END);

// Die eigentliche Textausgabe.

    Output(re);

    return 1;
}

/***************************************************************************
**
**  Hauptfunktion fuer das Testen von Geraeuschen und Geruechen.
**
****************************************************************************
*/

int search_sense(object r, int sense)
{   string re,PRE,END,WAS,*senses,s1,*zufinden,*s2,*s3,def;
    int    i,j;
    mixed  mi;

    if (!r || !objectp(r))
    {
        write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
        return 1;
    }
    if (sense==SENSE_SMELL)
    {
        all_dets=r->Query(P_SMELLS)||([]);
        WAS="Gerueche";
    }
    else if (sense==SENSE_SOUND)
    {
        all_dets=r->Query(P_SOUNDS)||([]);
        WAS="Geraeusche";
    }
    else
    {
        write("OTEST-ERROR: Illegaler sense-Wert in search_sense()\n");
        return 1;
    }

    re = "\n";

    zufinden = ({SENSE_DEFAULT});

    def = all_dets[SENSE_DEFAULT];

// Terminaltyp des Magiers feststellen.

    if (objectp(output))
        switch (output->QueryProp(P_TTY))
        {
            case "ansi"  :
            case "vt100" : PRE=BOLD; END=NORMAL; break;
            default      : PRE="";   END="";     break;
        }
    else
    {
        PRE="";
        END="";
    }

    senses = sort_array(m_indices(all_dets),#'<);

// Alle vorhandenen Sense-Details anzeigen.

    if (scanrun<1)
    {
        if ((i=sizeof(senses))>0)
        {
            for ( s1="",--i; i>=0 ; i-- )
                s1 += ((senses[i]==SENSE_DEFAULT?"DEFAULT":
                        senses[i])+(i?"\n":""));

            re += sprintf(sprintf("%sListe der vorhandenen %s:%s\n\n"+
                          "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"":
                          sprintf(".%d",spalten))+"s")),s1);
        }
        else
            re += sprintf("%sKeine %s gefunden.%s\n\n",PRE,WAS,END);
    }


//  Sense-Details auswerten - geht wie bei Details.

    for ( s2=({}),i=sizeof(senses)-1 ; i>=0 ; i--)
        s2 += eval_detail_entry(senses[i]);

    for ( s3=({}),i=sizeof(s2)-1 ; i>=0 ; i-- )
        if (stringp(s2[i]))
            if (member(s3,s2[i])==-1)
            {
                s3 += ({ s2[i] });
                zufinden+=det_auswerten(s2[i]);
            }

// Testen, welche Sense-Details fehlen und anzeigen

    for ( s2=({}),s3=({}),i=sizeof(zufinden)-1;i>=0;i--)
    {
        if (!(mi=test_details(zufinden[i],def)))
            continue;
        if (pointerp(mi))
        {
            for (j=sizeof(mi)-1 ; j>=0 ; j--)
                if (member(s2,mi[j])==-1)
                    s2 += ({ mi[j] });
        }
        else if (stringp(mi) && member(s3,mi)==-1)
            s3 += ({ mi });
    }
    s2 = sort_array(s2,#'<);
    s3 = sort_array(s3,#'<);

    if (scanrun<1)
    {
        if ((i=sizeof(s2))>0)
        {
            for ( s1="",--i ; i>=0 ; i-- )
                s1 += ((s2[i]==SENSE_DEFAULT?"DEFAULT":s2[i])+(i?"\n":""));

            re += sprintf(sprintf("%sListe der gefundenen %s:%s\n\n"+
                          "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"":
                          sprintf(".%d",spalten))+"s")),s1);
        }
        else
            re += sprintf("%sEs gibt keine %s.%s\n\n",PRE,WAS,END);
    }

    if ((i=sizeof(s3))>0)
    {
        for ( s1="",--i ; i>=0 ; i-- )
           s1 += ((s3[i]==SENSE_DEFAULT?"DEFAULT":s3[i])+(i?"\n":""));

        re += sprintf(sprintf("%sListe der fehlenden %s:%s\n\n"+
                      "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"":
                      sprintf(".%d",spalten))+"s")),s1);
    }
    else
        re += sprintf("%sEs fehlen keine %s.%s\n\n",PRE,WAS,END);

    if (scanrun<1)
        re += sprintf("%sFERTIG.%s\n",PRE,END);

// Die eigentliche Textausgabe.

    Output(re);

    return 1;
}

/***************************************************************************
**
**  Die Funktion, die die Geraeusche im Raum untersucht.
**
****************************************************************************
*/

int search_n(object r)
{
    if (!r || !objectp(r))
    {
        write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
        return 1;
    }

    return search_sense(r,SENSE_SOUND);
}

/***************************************************************************
**
**  Die Funktion, die die Gerueche im Raum untersucht.
**
****************************************************************************
*/

int search_m(object r)
{
    if (!r || !objectp(r))
    {
        write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
        return 1;
    }

    return search_sense(r,SENSE_SMELL);
}

/***************************************************************************
**
**  Die Funktion, die das eingegebene Kommando zerlegt und interpretiert.
**
****************************************************************************
*/

int search(string arg)
{   string *in,dum;
    object targ;
    int    wo;

    if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
        return removen();

    if (scanrun)
    {
        write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
        return 1;
    }

    notify_fail("OTEST-Syntax: otest [detail|smell|sound] "+
                 "{<objekt>[in mir|im raum]|hier}\n");

    if (!arg || !stringp(arg) || sizeof(in=old_explode(arg," "))<1)
    {
        output=PL;
        scanrun=0;
        master=PL;
        return search_d(environment(PL));
    }

    if (sizeof(in)>1)
    {
        arg=implode(in[1..]," ");
        if (member(({"hier","raum",""}),arg)!=-1)
            targ=environment(PL);
        else
        {
            if (sscanf(arg,"%s in mir",dum))
            {
                wo=1;
                arg=dum;
            }
            else if (sscanf(arg,"%s im raum",dum))
            {
                wo=-1;
                arg=dum;
            }
            else wo=0;
            if (wo!=-1)
                targ=present(arg,PL);
            if (!objectp(targ) && wo!=1)
                targ=present(arg,environment(PL));
        }
    }
    else
        targ=environment(PL);
    if (!objectp(targ))
    {
        write("OTEST-ERROR: Gewuenschtes Ziel nicht gefunden.\n");
        return 0;
    }

    output=PL;
    scanrun=0;
    master=PL;

    switch(in[0])
    {
        case "de" :
        case "detail" :
        case "details" :
            return search_d(targ);
        case "sm" :
        case "smell" :
        case "smells" :
            return search_m(targ);
        case "so" :
        case "sound" :
        case "sounds" :
            return search_n(targ);
    }
    return 0;
}

/***************************************************************************
**
**  Hier kann man den 'Scantyp' einstellen.
**
****************************************************************************
*/

int scanart(string arg)
{   int h;

    if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
        return removen();

    if (scanrun)
    {
        write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
        return 1;
    }

    notify_fail("OTEST-Syntax: otype [rikus|rochus]\n");
    if (!arg || !stringp(arg))
    {
        if (h=PL->QueryProp(P_OTEST_TYP))
            scantyp=h;
        if (!h)
        {
            PL->SetProp(P_OTEST_TYP,scantyp);
            PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS);
        }
        printf("OTEST: Eingestellter Scantyp ist '%s'\n",
            (scantyp==T_ROCHUS?"ROCHUS":"RIKUS"));
        return 1;
    }
    if (member(({"rikus","rochus"}),arg)==-1)
        return 0;
    if (arg=="rochus")
    {
        scantyp=T_ROCHUS;
        PL->SetProp(P_OTEST_TYP,scantyp);
        PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS);
        write("OTEST: Eingestellter Scantyp ist 'ROCHUS'\n");
        return 1;
    }
    scantyp=T_RIKUS;
    PL->SetProp(P_OTEST_TYP,scantyp);
    PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS);
    write("OTEST: Eingestellter Scantyp ist 'RIKUS'\n");
    return 1;
}

/***************************************************************************
**
**  Hier kann man die Spaltenzahl einstellen.
**
****************************************************************************
*/

int spaltenzahl(string arg)
{   int h;

    if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
        return removen();

    if (scanrun)
    {
        write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
        return 1;
    }

    notify_fail("OTEST-Syntax: ocolm [1|2|3|4|5|6|7|8|auto]\n");

    if (!arg || !stringp(arg))
    {
        if (h=PL->QueryProp(P_OTEST_SPL))
            spalten=h;
        if (!h)
        {
            PL->SetProp(P_OTEST_SPL,spalten);
            PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS);
        }
        printf("OTEST: Eingestellte Spaltenzahl ist '%s'\n",
            (spalten>0?sprintf("%d",spalten):"'AUTO'"));
        return 1;
    }
    if (arg=="auto")
    {
        spalten=-1;
        PL->SetProp(P_OTEST_SPL,spalten);
        PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS);
        write("OTEST: Eingestellte Spaltenzahl ist 'AUTO'\n");
        return 1;
    }
    h = to_int(arg);
    if (h<1 || h>8)
        return 0;
    spalten=h;
    PL->SetProp(P_OTEST_SPL,spalten);
    PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS);
    printf("OTEST: Eingestellte Spaltenzahl ist %d\n",spalten);
    return 1;
}

/***************************************************************************
**
**  Hier kann man ganze Verzeichnisse durchscannen lassen
**
****************************************************************************
*/

int dirtesten(string arg)
{   string vz,af,u,*dir;
    int    i,si;

    if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
        return removen();

    if (scanrun)
    {
        write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
        return 1;
    }

    if (object_name(ME)[0..2]=="/p/")
    {
        write(break_string("Ein Dirscan kann nur durchgefuehrt werden, "+
              "wenn man den Pruefer in sein /players/-Verzeichnis kopiert "+
              "hat oder von einem dort liegenden Objekt inherited.",78,
              "OTEST: "));
        return 1;
    }

    notify_fail("OTEST-Syntax: otdir <verzeichnis> <ausgabefile>\n");
    if (!arg || !stringp(arg) || sscanf(arg,"%s %s",vz,af)!=2)
        return 0;

// Zielfilename testen/festlegen.

    u=getuid(PL);
    if (file_size("/log/"+u+"/")!=-2)
    {
        printf("OTEST: Es existiert kein Verzeichnis '/log/%s/'\n",u);
        return 1;
    }
    for (i=sizeof(af)-1;i>=0;i--)
        if (((si=af[i])<48 && si!=46) || (si>57 && si<65) || si>122 ||
            (si>90 && si<97))
        {
            write("OTEST: Illegaler Filename fuer Ausgabefile.\n");
            return 1;
        }
    u=sprintf("/log/%s/%s",u,af);

// Zu untersuchendes Verzeichnis pruefen/einlesen.

    if (!vz || !stringp(vz) || sizeof(vz)<3 || vz[0]!='/' || vz[<1]!='/')
    {
        write("OTEST: Verzeichnisname muss mit '/' beginnen und aufhoeren.\n");
        return 1;
    }
    for (i=sizeof(af)-1;i>=0;i--)
        if (((si=af[i])<46) || (si>57 && si<65) || si>122 || (si>90 && si<97))
        {
            write("OTEST: Illegaler Filename fuer Verzeichnis.\n");
            return 1;
        }
    dir = get_dir(vz+"*.c");
    if ((si=sizeof(dir))<1)
    {
        write("OTEST: Das gewuenschte Verzeichnis existiert nicht oder ist "+
              "leer.\n");
        return 1;
    }

    output    = u;

    if (stringp(catch
          (i=write_file(output, sprintf("Teststart: %s\n\n",dtime(time())))))
        && i!=1)
    {
        write(break_string(
            sprintf("Fehler beim Schreiben in das File %s:\n%sAborting.",
                output,u),78,"OTEST: ",1));
        output = 0;
        return 1;
    }

    scanrun   = si+1;
    scanfiles = dir;
    scandir   = vz;
    scancount = 0;
    master    = PL;
    scanerr   = ({0,0});

    call_out("x_heart_beat",T_PAUSE);

    printf("OTEST: Scanne %d Files:\n"+
           "       %s => %s\n"+
           "Zeit:  etwa %s\n",si,vz,output,
               time2string("%h:%02m:%02s",si*4*T_PAUSE));

    return 1;
}

/***************************************************************************
**
**  Das Scannen von Verzeichnissen wird ueber x_heart_beat() erledigt.
**
****************************************************************************
*/

void x_heart_beat()
{   int    nr;
    string fn,er;

    call_out("x_heart_beat",T_PAUSE);

    if ((++scancount)>4)
    {
        scancount = 1;
        testob    = 0;
        scanrun--;
    }

    nr=scanrun-2;
    if (nr<0)
    {
        if (environment() && interactive(environment()))
            environment()->Message(break_string("'otdir' beendet.\n"+
                sprintf("Files: %d - Fehler: %d - Skips: %d",
                sizeof(scanfiles),scanerr[0],scanerr[1]),
                78,"OTEST: ",1),MSGFLAG_TELL);

        scanrun   = 0;
        scancount = 0;
        output    = 0;
        scanfiles = ({});
        scandir   = 0;
        testob    = 0;
        scanerr   = ({0,0});

        while(remove_call_out("x_heart_beat")!=-1);

        return;
    }
    fn=scandir+scanfiles[nr];
    if (fn[<2..]==".c")
        fn=fn[0..<3];

    if (scancount==1) // Testen, ob File ladbar
    {
        Output(sprintf("File: %s\n\n",fn));
        er=catch(call_other(fn,"???"));
        if (er && stringp(er))
        {
            Output(sprintf("Error: %s->Abort@Load\n\n",er));
            scanrun--;
            scancount  = 0;
            testob     = 0;
            scanerr[0] = scanerr[0]+1;
        }
        else
            testob = find_object(fn);
        return;
    }
    if (!objectp(testob))
    {
        Output("Objekt nicht gefunden\n-> Abort@Object.\n\n");
        scanrun--;
        scancount  = 0;
        scanerr[0] = scanerr[0]+1;
        return;
    }
    if (!function_exists("int_long",testob))
    {
        Output("Objekt ist kein Raum -> SKIPPING.\n\n");
        scanrun--;
        scancount  = 0;
        testob     = 0;
        scanerr[1] = scanerr[1]+1;
        return;
    }
    switch(scancount)
    {
        case 2 :
            if ((er=catch(search_d(testob))) && stringp(er))
            {
                Output(sprintf("Error: %s-> Abort@Detail.\n\n",er));
                scanrun--;
                scancount  = 0;
                testob     = 0;
                scanerr[0] = scanerr[0]+1;
            }
            return;
        case 3 :
            if ((er=catch(search_sense(testob,SENSE_SMELL))) && stringp(er))
            {
                Output(sprintf("Error: %s-> Abort@Smell.\n\n",er));
                scanrun--;
                scancount  = 0;
                testob     = 0;
                scanerr[0] = scanerr[0]+1;
            }
            return;
        case 4 :
            if ((er=catch(search_sense(testob,SENSE_SOUND))) && stringp(er))
            {
                Output(sprintf("Error: %s-> Abort@Sound.\n\n",er));
                scanrun--;
                scancount  = 0;
                testob     = 0;
                scanerr[0] = scanerr[0]+1;
            }
            return;
    }
    return;
}
