// $Id: objects.c 8848 2014-06-11 22:05:04Z Zesstra $
#pragma strict_types
#pragma save_types
#pragma range_check
#pragma no_clone
#pragma pedantic

#include <wizlevels.h>
#include <moving.h>
#define NEED_PROTOTYPES
#include <thing/language.h>
#include <thing/properties.h>
#include <thing/description.h>
#include <living/put_and_get.h>
#include <player.h>
#include <magier.h>

//                        ###################
//######################### INITIALISIERUNG #############################
//                        ###################


static mixed _query_localcmds()
{
  return ({({"clone","_clone",0,WIZARD_LVL}),
           ({"setcmsg","_setcmsg",0,WIZARD_LVL}),
           ({"setdmsg","_setdmsg",0,WIZARD_LVL}),
           ({"destruct","_destruct",0,WIZARD_LVL}),
          });
}

//                              #########
//############################### CLONE ##############################
//                              #########

static int _clone(string cmdline)
{
  mixed *tmp;
  int flags;
  object ob;
  string *args,*args2,err;
  
  cmdline=_unparsed_args();
  args=parseargs(cmdline,&flags,CLONE_OPTS,1);
  if (flags==-1||sizeof(args)!=1)
    return USAGE("clone [-" CLONE_OPTS "] <objektname>");
  if (flags&CLONE_F)
    cmdline=args[0];
  else
  {
    // etwas umstaendlich, aber so kann man auch Dateien clonen,
    // wenn man keine Leserechte hat. Man muss aber im Verzeichnis
    // lesen koennen
    args2=explode(args[0],"/");
    if (args2[<1][<1]=='.') args2[<1]+="c";
    else if (args2[<1][<2..<1]!=".c") args2[<1]+=".c";
    tmp=file_list(({implode(args2[0..<2],"/")+"/*"}),MODE_CLONE,0,"",
                  args2[<1]);
    if (!sizeof(tmp)||tmp[0][FILESIZE]<0)
      return printf("clone: %s: Datei existiert nicht.\n",args[0]),1;
    cmdline=tmp[0][FULLNAME];
  }

  if (err=catch(ob=clone_object(cmdline))||!ob)
    return printf("clone: %s: Objekt konnte nicht erzeugt werden.\n"
                  "Grund: %O\n",
                  args[0], regreplace(err, "\n$", "", 1)||"unbekannt"),1;
  if (!objectp(ob))
    return printf("clone: %s: Objekt beim Erzeugen zerstoert.\n",
                  args[0]),1;
  if ((ob->move(this_object(),M_GET)>0) || 
      (!objectp(ob)||ob->move(environment(),M_NOCHECK)>0)||!objectp(ob))
  {
    if (!objectp(ob))
      return printf("clone: %s: Objekt beim Erzeugen zerstoert.\n",
                  args[0]),1;
    printf("Clone: %s erzeugt.\n",object_name(ob));
    tell_room(environment(this_object()),
              sprintf("%s %s.\n",Name(WER,1),QueryProp(P_CLONE_MSG)),
                      ({ this_object()}));
    return 1;
  }
  tell_room(environment(this_object()),
            sprintf("%s malt wilde Zeichen in die Luft und "
                    "murmelt vor sich hin, aber nichts "
                    "passiert...\n",Name(WER,1)),
            ({ this_object()}));
  destruct(ob);
  printf("Clone: %s: Objekt konnte nicht bewegt werden.",args[0]);
  return 1;
}


//                            ############
//############################# DESTRUCT ##############################
//                            ############

//
// _destruct: Objekte zerstoeren
//

static int _destruct(string cmdline)
{
  int flags;
  mixed *args;
  object ob;

  if (!sizeof(cmdline=_unparsed_args()))
    return USAGE(query_verb()+" <objektname>");
  args=find_obs(lower_case(cmdline),PUT_GET_NONE);
  if (!args||!sizeof(args))
  {
    if (!(ob=find_object(cmdline)))
    {
      notify_fail(query_verb()+": Objekt \"" +cmdline+
                  "\" nicht gefunden.\n");
      return 0;
    }
  }
  else
    ob=args[0];
  cmdline=capitalize(to_string(ob->name(WER)));
  flags=(int)ob->QueryProp(P_PLURAL); // Missbrauch von flags :o)
  if (query_verb()=="destruct")
  {
    if (!ob->remove())
    {
      notify_fail(cmdline+" will nicht zerstoert werden!\n");
      return 0;
    }
  }
  else destruct(ob);
  if (!ob)
  {
    if (!QueryProp(P_INVIS))
    {
      tell_room(environment(this_object()),
                sprintf("%s %s.\n",cmdline,QueryProp(P_DESTRUCT_MSG)),
                ({ this_object() }));
    }
    printf("%s w%s von Dir zerstaeubt.\n",cmdline,(flags?"erden":"ird"));
  }
  else
    printf("%s kann nicht zerstoert werden.\n",cmdline);
  return 1;
}

//                        ####################
//######################### SetCMsg, SetDMsg ############################
//                        ####################

static int _setcmsg(string str)
{
  printf("Beim Clonen von Objekten sehen die Anderen nun:\n"
         "<Dein Name> %s.\n",
         (SetProp(P_CLONE_MSG, _unparsed_args()||"zaubert etwas aus "
          + QueryPossPronoun(MALE,WEM) + " Aermel hervor")));
  return 1;
}

static int _setdmsg(string str)
{
  printf("Beim Zerstoeren von Objekten sehen die Anderen nun:\n"
         "<Objekt> %s.\n",
         SetProp(P_DESTRUCT_MSG, _unparsed_args()||"wird von " + name(WER,1)
          + " zerstaeubt"));
  return 1;
}
