#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

#define NEED_PROTOTYPES
#include <thing/properties.h>
#include <properties.h>
#include <wizlevels.h>
#include <new_skills.h>
#include <events.h>

string *valid_guilds = ({});

void create() {
  seteuid(getuid(this_object()));
  restore_object(GUILD_SAVEFILE);
  if (!pointerp(valid_guilds)) 
    valid_guilds=({});
}

//noetig, da nun valid_guilds eine Variable ist
public mixed QueryProp( string name )
{
  if (name==P_VALID_GUILDS) 
      return copy(valid_guilds);
  return 0;
}

nomask int beitreten() {
  object pl,gilde;
  string gname,ogname;

  if (!(pl=this_player()) || !(gilde=previous_object()))
      return 0;
  // Gilden sind Blueprints.
  gname=object_name(gilde);

  if ((GUILD_DIR+ogname)==gname) {
    write("Du bist schon in dieser Gilde.\n");
    return -4;
  }

  if ((ogname=({string})pl->QueryProp(P_GUILD)) && 
      (ogname!=((({string})pl->QueryProp(P_DEFAULT_GUILD)) || DEFAULT_GUILD))) {
    write("Du bist noch in einer anderen Gilde.\n");
    return -1;
  }
  if (gname[0..7]!=GUILD_DIR ||
        member(valid_guilds,(gname=gname[8..]))<0) {
      write("Diese Gilde ist leider nicht zugelassen.\n"+
              "Bitte verstaendige einen Erzmagier.\n");
      return -2;
  }
  pl->SetProp(P_GUILD,gname);
  // Event Gildenwechsel triggern
  EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
      E_OBJECT: pl, E_PLNAME: getuid(pl),
      E_ENVIRONMENT: environment(pl),
      E_GUILDNAME: gname,
      E_LAST_GUILDNAME: ogname ]) );

  return 1;
}

static nomask void loose_ability(mixed key, mixed dat, int loss) {
  mixed val;

  val=mappingp(dat)?dat[SI_SKILLABILITY]:dat;
  if (!intp(val) || val<=0) return;
  val-=(val*loss)/100;if (val<=0) val=1;
  if (mappingp(dat))
      dat[SI_SKILLABILITY]=val;
  else
      dat=val;
}

varargs nomask int austreten(int loss) {
  object pl,gilde;
  string gname;
  mapping skills;

  if (!(pl=this_player()) || !(gilde=previous_object()))
      return 0;
  // Gilden muessen Blueprints sein, so. ;-)
  gname=object_name(gilde);
  if (gname[0..7]!=GUILD_DIR ||
      (({string})pl->QueryProp(P_GUILD))!=gname[8..]) {
      write("Du kannst hier nicht aus einer anderen Gilde austreten.\n");
      return -1;
  }
  if (gname[8..]==(pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
  {
        write("Aus dieser Gilde kannst Du nicht austreten.\n");
        return -1;
  }
  if (loss<=0) loss=20;
  skills=({mapping})pl->QueryProp(P_NEWSKILLS);
  walk_mapping(skills,"loose_ability",this_object(),loss);
  pl->SetProp(P_NEWSKILLS,skills);
  pl->SetProp(P_GUILD,0);
  // Event Gildenwechsel triggern
  EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
      E_OBJECT: pl, E_PLNAME: getuid(pl),
      E_ENVIRONMENT: environment(pl),
      E_GUILDNAME: pl->QueryProp(P_GUILD),
      E_LAST_GUILDNAME: gname ]) );

  // Defaultgilde ggf. neuen Titel setzen lassen.
  gname = ({string})pl->QueryProp(P_GUILD);
  (GUILD_DIR+"/"+gname)->adjust_title(pl);

  return 1;
}

nomask static int security_check()
{
  if (previous_object() && geteuid(previous_object())==ROOTID)
    return 1;
  if (!process_call() && previous_object() && ARCH_SECURITY)
    return 1;
  return 0;
}

nomask int AddGuild(string gildob) {
  object tp;

  if (!stringp(gildob) || !sizeof(gildob) || !security_check() 
      || file_size(GUILD_DIR+gildob+".c")<0)
      return 0;
  if (member(valid_guilds, gildob) != -1)
      return 0;
  valid_guilds+=({gildob});
  save_object(GUILD_SAVEFILE);
  return 1;
}

nomask int RemoveGuild(string gildob) {
  object tp;

  if (!stringp(gildob) || !sizeof(gildob) 
      || !security_check())
      return 0;
  if (member(valid_guilds, gildob) == -1)
      return 0;
  valid_guilds-=({gildob});
  
  save_object(GUILD_SAVEFILE);
  return 1;
}

nomask int ValidGuild(string gildenob) {
  if (!stringp(gildenob)) 
      return 0;

  return (member(valid_guilds,gildenob)>=0);
}

nomask string *_query_valid_guilds() {return copy(valid_guilds); }

