// (c) by Padreic (Padreic@mg.mud.de)

#pragma no_inherit,no_clone,strong_types,rtt_checks

#include <defines.h>
#include <properties.h>
#include <v_compiler.h>
#include <items/kraeuter/kraeuter.h>
#include <wizlevels.h>

inherit "/std/virtual/v_compiler";
inherit "/std/thing/language";
inherit "/std/thing/description";

// mit Hilfe dieses mappings kommt man sowohl an die ID und die Eigenschaften,
// als auch an die Liste der Raeume in denen das Kraut mit dem filenamen room
// gefunden werden kann.
// ([ "key": ({ ({eigenschaften}), ([raeume]) }) ])
private mapping krautdaten;

// AN: enthaelt die Liste der gueltigen Kraeuter-Dateinamen ohne .c
// am Ende. Ich vermute, dass es deswegen ein Mapping ist, damit in 
// Validate() einfach member() drauf gemacht werden kann und man nur 0/1
// als Rueckgabewerte pruefen muss, statt -1 bei nem member() auf ein Array.
private mapping validfiles;

public void update(mapping data)
{
  if (previous_object() == find_object(PLANTMASTER))
  {
    krautdaten = data;
    validfiles = mkmapping(m_indices(krautdaten));
  }
}

// Wird benutzt, um kurze IDs von Kraeutern zu raten. Diese IDs werden
// eingetragen, wenn der Krautname die ID als Teilstring enthaelt.
#define IDLIST ({ "klee", "rebe", "hahnenfuss", "rettich", "kraut", "wurz",\
                     "moos", "enzian", "rautenwicke", "pilz", "nelke",\
                     "lichtnelke", "wicke", "zwiebel", "hanf", "kresse"})

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

   v_compiler::create();
   description::create();

   SetProp(P_COMPILER_PATH, __DIR__);
   SetProp(P_STD_OBJECT, PLANTITEM);
   
   PLANTMASTER->UpdateVC();
}

string Validate(string file)
{
   if (!stringp(file)) return 0;
   file = ::Validate(explode(file, "#")[0]);
#if MUDNAME == "MorgenGrauen"
   return (member(validfiles, file) ? file : 0);
#else
   return file;
#endif
}

private nosave object simul_efun;

// fuer SIMUL_EFUN_FILE
#include <config.h>

// AN: Funktion liefert das clonende Objekt als dessen Blueprint-Namen,
// indem es den Caller-Stack durchlaeuft und nach einem Objekt sucht,
// das weder der Master, noch ein Simul-Efun-Objekt, noch dieser VC selbst
// ist. Der Name des gefundenen Objekts wird zurueckgegeben, oder 0.
nomask private string get_cloner()
{
   int i;
   object po;

   if (!simul_efun)
   {
      if (!(simul_efun=find_object(SIMUL_EFUN_FILE)))
         simul_efun=find_object(SPARE_SIMUL_EFUN_FILE);
   }
   // wenn sie jetzt nicht existiert - auch gut, dann gibt es halt keine
   // sefuns.

   for (i=0; po=previous_object(i); i++)
   {
      if (po==master() || po==simul_efun || po==ME || po==previous_object())
         continue;
      return BLUE_NAME(po);
   }
   return 0;
}

// Konfiguriert das erzeugte Objekt entsprechend der dafuer im Kraeutermaster
// bekannten Daten. Vergibt auf die Plant-ID.
varargs string CustomizeObject(string file)
{
   if (previous_object()->QueryPlantId()) return 0; // bereits initialisiert
   
   if (stringp(file))
      file=Validate(file);
   else file=::CustomizeObject();
   if (!file) return 0;

   closure sp=symbol_function("SetProp", previous_object());
   mixed arr=krautdaten[file];
   if (pointerp(arr))
   {
      // Welches Objekt clont das File?
      string cloner = get_cloner();
      mapping rooms = arr[1];
      mixed props = arr[0];
      // Wird das Kraut legal von einem eingetragenen Cloner erzeugt? Nur dann
      // bekommt es eine gueltige Plant-ID.
     int legal=member(rooms, get_cloner()) || cloner==PLANTMASTER;
     if (!legal && this_interactive() && IS_ARCH(this_interactive()))
        legal=1;
     
      // Konfiguriert wird das Objekt dann, wenn es per VC erzeugt wird oder
      // ein Clone einer per VC erzeugten BP ist - d.h. wenn es nicht aus
      // einem real existierenden File auf der Platte existiert. Das ist dann
      // der Fall, wenn der Loadname gleich dem Standardplantobjekt des VC
      // ist.
      if (load_name(previous_object())==PLANTITEM)
      {
        if ((props[INGREDIENT_NAME]=="Klee") ||
            (props[INGREDIENT_NAME][<4..]=="klee")) {
           funcall(sp, P_NAME, ({ props[INGREDIENT_NAME],
                                  props[INGREDIENT_NAME]+"s",
                                  props[INGREDIENT_NAME],
                                  props[INGREDIENT_NAME]}));
        }
        else funcall(sp, P_NAME,     props[INGREDIENT_NAME]);
        funcall(sp, P_NAME_ADJ, props[INGREDIENT_ADJ]);
        funcall(sp, P_GENDER,   props[INGREDIENT_GENDER]);
        funcall(sp, P_LONG,     props[INGREDIENT_LONG]);
        funcall(sp, PLANT_ROOMDETAIL, props[INGREDIENT_ROOMDETAIL]);
        if (props[INGREDIENT_DEMON]==RAW) {
           funcall(sp, P_ARTICLE, 0);
           funcall(sp, P_SHORT, previous_object()->Name(WER));
           funcall(sp, P_ARTICLE, 1);
        }
        else funcall(sp, P_SHORT,
             previous_object()->Name(WER,props[INGREDIENT_DEMON]));
        previous_object()->AddId(lowerstring(props[INGREDIENT_NAME]));
        // bei zusammengesetzten Namen, auch den hauptnamen akzeptieren
        string str=lowerstring(props[INGREDIENT_NAME]);
        string *names=explode(str, "-");
        if (sizeof(names)>1) previous_object()->AddId(names[<1]);
        names=explode(str, " ");
        if (sizeof(names)>1) previous_object()->AddId(names[<1]);
        foreach(string id: IDLIST)
        {
          if (strstr(str, id)==-1) continue;
          previous_object()->AddId(id);
          break;
        }
        // Adjective vorher deklinieren
        str=props[INGREDIENT_ADJ];
        if (stringp(str))
        {
          str = lowerstring(str);
          string* adj = ({});
          foreach(int casus : ({WER,WESSEN,WEM,WEN})) {
            adj += ({ trim(previous_object()->DeclAdj(str, casus, 0)) });
          }
          previous_object()->AddAdjective(adj);
        }
      }  // Ende Konfiguration eines VC-erzeugten Objekts
      // Plant-ID wird fuer alle Objekte auf irgendwas gesetzt.
      previous_object()->SetPlantId(legal ? props[INGREDIENT_ID] : -1);
   }
   // Keine Krautdaten bekannt...
   else
   {
     funcall(sp, P_NAME,     "Kraut");
     funcall(sp, P_GENDER,   NEUTER);
     funcall(sp, P_SHORT,    "Ein Testkraut ("+capitalize(file)+")");
     funcall(sp, P_LONG,     "Ein nicht naeher spezifiziertes Testkraut.\n");
     funcall(sp, PLANT_ROOMDETAIL,
         "Ein nicht naeher spezifiziertes Testkraut ("
         +capitalize(file)+").\n");
     previous_object()->AddId("kraut");
     previous_object()->SetPlantId(-1);
   }
   return file;
}

int NoParaObjects()
{   return 1;   }

// AN: Funktion erzeugt aus den vorliegenden Daten der Kraeuterliste ein
// physikalisch existierendes File in diesem Verzeichnis, zB wenn die Daten
// erweitert werden sollen. Die Kraeuterliste stellt nur generische Objekte
// zur Verfuegung, die keine Details haben. Wenn die Objekte ausgeschmueckt
// werden sollen, koennen diese auch als Datei hier liegen.
// Wird vom Plantmaster aus gerufen. Die Existenz von Klartext-
// Fehlermeldungen laesst darauf schliessen, dass diese Funktion dafuer
// vorgesehen war, vom Planttool aus gerufen zu werden. Dies wird dadurch
// bestaetigt, dass dort wie hier alle von Magiern benutzbaren Kommando-
// funktionen mit _ beginnen (_showplant(), _addroom() etc.), und die
// Kommandofunktion im Planttool generell in der Lage ist, alle _*() 
// im Plantmaster zu rufen, sofern existent und fuer den Magier freigegeben.
// AN/TODO: ggf. sollte man hier noch pruefen, ob die VC-Blueprint des
// angeforderten Krautes gerade existiert, denn sonst wuerde das auf der
// Platte liegende, scheinbar (nicht) geladene Objekt nicht mit dem
// VC-Objekt uebereinstimmen. Evtl. reicht es aus, die Blueprint einfach
// zu zerstoeren und neuzuladen.
int _createfile(string filename)
{
   int i;
   string str, short, long, gender, *name, roomdetail;
   string *ids;
   string plantfile;

/*   if (object_name(previous_object())!=PLANTMASTER) {
      write("Illegal usage of _createfile()!\n");
      return 1;   
   }*/
// ^^^ Zook, ggf.spaeter wieder Kommentar entfernen. 

   mixed arr;
   if (!pointerp(arr=krautdaten[filename])) {
      write("Unknown plant '"+filename+"'.\n");
      return 1;
   }
   if (file_size(PLANTDIR+filename+".c")>=0) {
      write("error: file "+PLANTDIR+filename+".c already exists.\n");
      return 1;
   }
   mixed props = arr[0];

   // Kurzbeschreibung erzeugen
   SetProp(P_NAME,     props[INGREDIENT_NAME]);
   SetProp(P_NAME_ADJ, props[INGREDIENT_ADJ]);
   SetProp(P_GENDER,   props[INGREDIENT_GENDER]);
   if (props[INGREDIENT_DEMON]==RAW) {
       SetProp(P_ARTICLE, 0);
       short=Name(WER);
       SetProp(P_ARTICLE, 1);
   }
   else short=Name(WER,props[INGREDIENT_DEMON]);
   ids = ({ lowerstring(props[INGREDIENT_NAME]) });
   // bei zusammengesetzten Namen, auch den hauptnamen akzeptieren
   str=lowerstring(props[INGREDIENT_NAME]);
   name=explode(str, "-");
   if (sizeof(name)>1) ids += ({ name[<1] });
   name=explode(str, " ");
   if (sizeof(name)>1) ids += ({ name[<1] });
   for (i=sizeof(IDLIST)-1; i>=0; i--) {
       if (strstr(str, IDLIST[i], 0)==-1) continue;
       ids += ({ IDLIST[i] });
       break;
   }
   switch(props[INGREDIENT_GENDER]) {
     case MALE:   gender="MALE"; break;
     case FEMALE: gender="FEMALE"; break;
     case NEUTER: gender="NEUTER"; break;
     default: gender=props[INGREDIENT_GENDER];
   }
   long="    \""+implode(old_explode(props[INGREDIENT_LONG], "\n"), 
                   "\\n\"\n   +\"")+"\\n\"";
   roomdetail="    \""+implode(
      old_explode(props[INGREDIENT_ROOMDETAIL], "\n"), "\\n\"\n   +\"")+
      "\\n\"";
   plantfile=
    "#pragma strong_types,rtt_checks\n\n"
    "#include <properties.h>\n"
    "#include <items/kraeuter/kraueter.h>\n"
    "#include <items/kraeuter/kraeuterliste.h>\n\n"
    "inherit STDPLANT;\n\n"
    "protected void create()\n"
    "{\n"
    "  ::create();\n";
   plantfile+="  customizeMe("+upperstring(filename)+");\n";
   plantfile+=
    "  SetProp(P_NAME,     \""+props[INGREDIENT_NAME]+"\");\n"
    "  SetProp(P_NAME_ADJ, \""+(props[INGREDIENT_ADJ]||"")+"\");\n"
    "  SetProp(P_GENDER,   "+gender+");\n"
    "  SetProp(P_LONG,     \n"+
    long+");\n"
    "  SetProp(PLANT_ROOMDETAIL, \n"+
    roomdetail+");\n"
    "  SetProp(P_SHORT,    \""+short+"\");\n";
   plantfile+="  AddId(({";
   for (i=sizeof(ids)-1; i>=0; i--)
     plantfile+=" \""+ids[i]+"\",";
   plantfile[<1]=' ';
   plantfile+="}));\n";
   // Adjective vorher deklinieren
   if (stringp(short=props[INGREDIENT_ADJ])) {
     short=DeclAdj(lowerstring(short), WEN, 0)[0..<2];
     plantfile+="  AddAdjective(\""+short+"\");\n";
   }
   plantfile+="}\n";
   write(plantfile);
   //write_file(PLANTDIR+filename+".c", plantfile);
   write("Filename: "+PLANTDIR+filename+".c\n");
   return 1;
}

