// Ich fand es ein wenig langweilig in der Gilde, also habe ich ein wenig daran
// gebastelt.
//  Hate.
// 2002-12-06 Mandragons Projektbrett eingebaut, Humni.
// 2003-07-11 Bugfix
// 2005-08-19 Miril Arks Bienen eingebaut
// 2007-08-03 Zesstra, PFad fuers Vereinsbuero angepasst.
inherit  "/std/gilden_room";

#include <properties.h>
#include <rooms.h>
#include <wizlevels.h>
#include <language.h>
#include <defines.h>
#include <moving.h>
#include <new_skills.h>
#include <events.h>
#include <player/fao.h>

#define P_ANFAENGER_BIENENORT_ "anfaenger_bienenort_"
#define P_ANFAENGER_BIENENZIEL_ "anfaenger_bienenziel_"

string Funktion(); // Funktion der Gilde
string Schmutz();  // Wohl bald ein Zaubertrank

int _query_light() {return 20;}

void create() {
  ::create();

  SetProp(P_GUILD_DEFAULT_SPELLBOOK,"ab_spells");
  SetProp(P_LIGHT,20);
  SetProp(P_INDOORS,1);
  AddSpell("steinschlag");
  AddSpell("licht");
  AddSpell("kampfschrei");
  AddSpell("ausweichen");
  AddSpell("schaetz");
  AddSpell("pfeil");
  AddSpell("identifiziere");
  AddSpell("feuerball");
  AddSpell("schnell");
  AddSpell("saeurestrahl");

  SetProp(P_GUILD_MALE_TITLES, ([
       1 : "der hoffnungsvolle Anfaenger",
       2 : "der Landstreicher",
       3 : "der Streuner",
       4 : "der Wandergeselle",
       5 : "der Waldlaeufer",
       6 : "der Faehrtensucher",
       7 : "der Wegekundige",
       8 : "der Jaeger",
       9 : "der Kundschafter",
      10 : "der Reisende",
      11 : "der Abenteurer",
      12 : "der Weltenbummler",
      13 : "der Draufgaenger",
      14 : "der Schatzsucher",
      15 : "der Feuerbaendiger",
      16 : "der Entdecker",
      17 : "der Eroberer",
      18 : "der Held",
      19 : "der angehende Seher",
      20 : "der Seher",
      ]) );
  SetProp(P_GUILD_FEMALE_TITLES, ([
       1 : "die hoffnungsvolle Anfaengerin",
       2 : "die Landstreicherin",
       3 : "die Streunerin",
       4 : "die Wandergesellin",
       5 : "die Waldlaeuferin",
       6 : "die Faehrtensucherin",
       7 : "die Wegekundige",
       8 : "die Jaegerin",
       9 : "die Kundschafterin",
      10 : "die Reisende",
      11 : "die Abenteurerin",
      12 : "die Weltenbummlerin",
      13 : "die Draufgaengerin",
      14 : "die Schatzsucherin",
      15 : "die Feuerbaendigerin",
      16 : "die Entdeckerin",
      17 : "die Erobererin",
      18 : "die Heldin",
      19 : "die angehende Seherin",
      20 : "die Seherin",
      ]) );

  SetProp(P_INT_SHORT,"Die beruehmte Abenteurergilde");
  SetProp(P_INT_LONG,
 "Der grosse Raum mit seiner niedrigen Decke und den grob geschnittenen\n"
+"Querbalken hat Platz fuer sehr viele Personen. Knarrende Dielen erzaehlen\n"
+"ueber Heldentaten laengst vergessener Abenteurer, beruehmter als mancher\n"
+"Weise unserer Zeit.\n"
+"Abenteurer, aber auch andere Bewohner dieser Welt kommen hierher, um\n"
+"sich zu informieren, ihre Erfahrungen auszutauschen oder sich in den\n"
+"verschiedensten Wissenschaften zu verbessern.\n"
+"Durch die immer offene Tuer scheint die aufgehende Sonne herein und fuellt\n"
+"den Raum mit ihrem goldenen Licht. Sonst gibt es hier nur noch den Ausgang\n"
+"im Norden, welcher auf die Hafenstrasse fuehrt und Bilder an den Waenden,\n"
+"mit Zeichnungen und Gemaelden vom MorgenGrauen. Eins der Bilder erlaeutert\n"
+"die Funktion der Gilde und eine grosse Uhr an der Wand zeigt, was die\n"
//+"Stunde schlaegt. In einer Ecke steht ein kleines Projektbrett.\n"
+"Stunde schlaegt.\n"
+"Nach oben fuehrt eine Treppe in das Buero des Foerdervereins Projekt\n"
+"MorgenGrauen e.V., das Du unbedingt besuchen solltest.\n");

  AddDetail(({"raum", "gilde", "abenteurergilde", "haus", "gildenhaus",
              "gildehaus"}),
  "Du stehst mitten in der Abenteurergilde. Hier trifft man sich und kann\n"
 +"auch seine persoenlichen Werte verbessern.\n");
  AddDetail(({"tuer", "ausgang"}),
  "Der immer offenstehende Ausgang fuehrt hinaus auf die Hafenstrasse.\n"
 +"Goldenes Licht einer ewig aufgehenden Sonne scheint herein.\n");
  AddSpecialDetail(({"bild", "bilder", "zeichnungen", "gemaelde", "karten",
              "landschaftsbilder"}),"det_bild");
  AddDetail(({"funktion", "schild"}), #'Funktion);
  AddDetail(({"wand", "waende"}),
  "Aus fein saeuberlich geschlagenen Steinen sind die Waende der Gilde\n"+
 "zusammengesetzt. Viele interessante Bilder haengen daran.\n");
  AddDetail(({"stein", "steine"}), "Es sind ganz einfache Sandsteine.\n");
  AddDetail(({"fenster"}),
  "Eine wundervolle Welt eroeffnet sich Dir, genannt Realitaet. Aber gibt es\n"
 +"diese wirklich? Ist sie nicht voller Gefahren und Stress?\n");
  AddDetail(({"seite", "suedseite"}),
  "Am Suedende des Raumes ist ein eigenartiges Fenster auszumachen.\n");
  AddDetail(({"balken", "querbalken", "holzbalken", "deckenbalken"}),
  "Diese Balken halten das Obergeschoss des Gildenhauses, wohin nur Magier\n"
 +"kommen und sind an manchen Stellen ganz schoen durchgebogen. Das grob ge-\n"
 +"schnittene Holz ist teilweise von Schwertstreichen zernarbt.\n");
  AddDetail(({"hafen", "hafenstrasse", "strasse"}),
  "Zur Tuer hinaus gelangt man ueber die Hafenstrasse zum Hafen von Port Vain"
 +"\n");
  AddDetail(({"boden", "fussboden", "dielen"}),
  "Die knarrenden Dielen der Gilde sind schon alt und abgeschabt. In den\n"
 +"Ritzen zwischen ihnen ist viel Dreck von den Stiefeln der Abenteurer.\n");
  AddDetail(({"decke"}),
  "Die Decke des Raumes wird von Holzbalken gehalten.\n");
  AddDetail(({"licht", "sonnenlicht", "sonne"}),
  "Warmes Sonnenlicht scheint durch den Ausgang zur Strasse herein. Jedesmal\n"
 +"wenn jemand hereinkommt wird er vom Licht umspuelt und erscheint Gott-\n"
 +"gleich mit dieser Aura.\n");
  AddDetail(({"ebene"}),
  "Du betrachtest das Bild der Ebene und denkst, welche Schaetze in dieser\n"
 +"flachen, gruenen Landschaft verborgen sein muessen.\n");
  AddDetail(({"gebirge", "huegel", "berge", "berg"}),
  "Das Bild der Huegel und Berge betrachtend, schleicht sich ein wenig Sehn-\n"
 +"sucht nach dieser herrlichen, aber gefaehrlichen Landschaft ein.\n");
  AddDetail(({"perspektiven", "perspektive", "darstellung", "landschaft"}),
  "Manche der Landschaftsbilder sind aus der Vogelperspektive oder von\n"
 +"hohen Bergen aus oder von Zwergen gemalt worden.\n");
  AddDetail(({"see", "meer", "wellen"}),
  "Die Wellen auf dem Meer glitzern wie tausend Edelsteine.\n");
  AddDetail(({"spritzer", "lichtspritzer"}),
  "Wie tausend kleine Edelsteine verteilen sich diese winzigen, gluehenden\n"
 +"Lichtspritzer ueber das wundervolle Gemaelde\n");
  AddDetail(({"geschoss", "obergeschoss"}),
  "Ins obere Geschoss der Gilde kommen nur Magier, mittels eines besonderen\n"
 +"Zauberspruchs, der die Decke durchlaessig fuer sie macht.\n");
  AddDetail(({"ritzen", "fugen"}),
  "In den Fugen zwischen den Dielen befindet sich eine Menge Schmutz und\n"
 +"Dreck von den Besuchern der Gilde.\n");
  AddDetail(({"fugen", "dreck", "schmutz"}), #'Schmutz);
  AddDetail(({"holz"}), "Die Dielen und die Deckenbalken sind aus Holz.\n");
  AddDetail(({"kartograph", "kartographen"}),
  "Dieselben laufen hier zwar im Moment nicht herum, aber ihre Karten sehen\n"
 +"ziemlich verwirrend aus mit den ganzen Linien, welche diese Welt "
  "darstellen.\n");
  AddDetail(({"stellen", "stelle"}),
  "Nichts sieht aus wie das andere, und die Ecken sind da keine Ausnahmen.\n");
  AddDetail(({"ecken","ecke"}),
  "In einer der Ecken, gleich neben der Treppe, steht ein kleines braunes\n"
 +"Holzbrett, das sofort Deine Aufmerksamkeit erregt. Wozu es wohl dient?\n");
  AddDetail("aufmerksamkeit",
  "Du beschliesst, Dir das Brett sofort naeher zu betrachten, um sie zu\n"
      +"befriedigen.\n");
/*
  AddDetail(({"brett","holzbrett"}),
  "Ein unscheinbares kleines Brett steht in der Ecke des Raumes. Wenn man\n"
 +"bedenkt, wie viele kleine Zettel daran befestigt wurden, kann es sich\n"
 +"nur um ein schwarzes Brett handeln. Welche Informationen hier wohl\n"
 +"ausgetauscht werden? Du koenntest natuerlich anfangen, die Zettel zu\n"
 +"lesen, um das herauszufinden ...\n");
  AddDetail("zettel",
  "Viele verschiedene Zettel stecken an dem Brett. Rote, gelbe, blaue,\n"
 +"jeder scheint eine andere Farbe zu haben. Auf jedem von ihnen scheint\n"
 +"etwas geschrieben zu sein.\n");
  AddDetail(({"farbe","farben"}),
  "Es sind so viele, Du wuerdest bestimmt jahrelang zaehlen.\n");
  AddDetail("informationen",
  "Wenn Du die Zettel liest, findest Du bestimmt welche.");
*/
  AddDetail(({"wissenschaften", "eigenschaften"}), #'Funktion); //');
  AddDetail(({"narben", "schwertstreich"}),
  "Die Narben in den Holzbalken sind schon recht alt. Es ist lange her, dass\n"
   +"hier richtig gekaempft wurde.\n");
  AddDetail(({"aura"}),
 "Eine Aura von Licht umgibt jeden, der von der Strasse ins Haus kommt.\n");
  AddDetail(({"bewohner", "abenteurer"}),
 "Hier, im Gildenhaus, ist jeder gern willkommen.\n");
  AddDetail(({"weise", "weiser", "recken"}),
  "Die Weisen dieses Landes sind beruehmt, kommen aber nicht an die Be-\n"
  +"ruehmtheit ihrer Vorfahren, die grossen Recken der ersten Jahre, heran.\n");
  AddDetail(({"realitaet"}), "Was ist schon real?\n");
  AddSpecialDetail("uhr","zeige_reboot");


  AddDetail(({"buero","foerderverein"}),
    "Wichtige Informationen warten auf Dich im Buero des Foerdervereins!\n");
  AddDetail("informationen", "Du musst schon ins Buero gehen, wenn Du "
      "die Informationen erhalten willst.\n");
  AddDetail("treppe","Die Treppe fuehrt nach Oben in das Buero des "
      "Foerdervereins Projekt MorgenGrauen e.V.\n");
  AddExit("norden", "/d/ebene/room/PortVain/po_haf1");
  AddExit("oben","/p/verein/room/buero");

  AddCmd("gehe|geh&\ngehtnicht",0,"Um Dich hier fortzubewegen, "
      "solltest Du direkt das Kommando der Richtung eingeben,"
      " wie ,,norden'' oder ,,suedwesten''. Du kannst das auch "
      "abkuerzen, durch ,,n'' oder ,,sw''.");

  AddItem("/obj/zeitungsautomat", REFRESH_REMOVE);

  AddSpecialDetail("karte","karte");
  AddSpecialDetail("brett","brett_fun");

  EVENTD->RegisterEvent(EVT_LIB_ADVANCE, "handle_advance", this_object());

  // nur auf dem Mudrechner laden (Stichwort: oeffentlich Mudlib)
#if MUDHOST == __HOST_NAME__
  AddItem("/p/service/troy/obj/buchautomat", REFRESH_REMOVE);
//  AddItem("/p/service/mandragon/projektbrett/board", REFRESH_REMOVE);
  // Die Biene fuer den Transport zur Wonnewichtlichtung.
  // Ark, 19.08.05
  AddItem("/d/anfaenger/ark/mon/mantisbiene",REFRESH_DESTRUCT,
   ([P_ANFAENGER_BIENENORT_:"Mensch",
     P_ANFAENGER_BIENENZIEL_:({"/d/anfaenger/ark/rooms/wald16",
                               "zum Wald der Wonnewichte",
                               "/gilden/abenteurer"})]));
#endif
}

string det_bild()
{
  return
   "Die Zeichnung und Gemaelde stellen MorgenGrauen aus den verschiedensten\n"
   "Perspektiven dar. Einige davon zeigen abstrakte Darstellungen, wie sie\n"
   "gerne von Kartographen gemacht werden, und andere zeigen wunderschoene\n"
   "Darstellungen von Landschaften, wie dem Gebirge oder der Ebene. Besonders\n"
   "schoen ist ein Bild der See. Tausende von Lichtspritzern verteilen sich\n"
   "ueber die Wellen.\n"
   "Ein kleines Schild zeigt folgendes:\n"+Funktion();
}

string brett_fun()
{
  if (present("party\nbrett",this_object()))
    return "Welches Brett meinst Du denn? Das Partybrett oder das Holzbrett?\n";
  return GetDetail("holzbrett");
}

int beitreten()
{
  if (::beitreten()<1)
    return 1; // Meldung vom Gildenmaster oder Gildenobjekt
  write("Du bist jetzt ein Abenteurer.\n");
  adjust_title(PL);
  return 1;
}

varargs int austreten(int loss)
{
  if (::austreten()<1)
    return 1; // Meldung kommt vom Gildenmaster
  write("Du bist nun kein Abenteurer mehr.\n");
  return 1;
}

string Funktion()
{   string re;
  re = ("Moegliche Befehle sind:\n"
        +"                liste\n"
        +"                erhoehe (stufe)\n"
        +"                kosten\n"
        +"                lerne\n");
  if (this_player()->QueryProp(P_GUILD)!="abenteurer")
  re += ("                trete in gilde ein\n"+
         "                trete aus gilde aus\n");
  return re;
}

string Schmutz()
{
  // hier sollte sich doch glatt ein Zaubertrank lohnen!!
  return "In den Fugen befindet sich viel Schmutz.\n";
}

// Fuer Spielerstufenaufstiege gerufen - egal in welcher Gilde.
public void handle_advance(string eid, object trigob, mixed data) {

  object pl = data[E_OBJECT];
  if (!pl || !IsGuildMember(pl) || !interactive(pl))
    return;

  int lvl=pl->QueryProp(P_LEVEL);
  // nicht fuer Level 1, da ist genug scroll...
  if (lvl == 1) return;

  // Alle Spells raussuchen, die der Spieler lernen kann.
  string *spells=filter(m_indices(Query(P_GUILD_SKILLS,F_VALUE)), 
      function int (string sp)
      {
        mapping ski = QuerySpell(sp);
        if (!ski) return 0; // kein Spell
        if (pl->QuerySkillAbility(sp) > 0
            || check_restrictions(pl, ski[SI_SKILLRESTR_LEARN]))
          return 0; // Vorraussetzungen nicht erfuellt oder schon gelernt.
        return 1; // offenbar ist sp lernbar.
      }
      );

  int count=sizeof(spells);
  if (!count)
    return;
  
  if (count == 1) {
    tell_object(pl, break_string("Dir faellt auf einmal auf, dass Du "
       "versuchen koenntest, den Zauberspruch \"" + spells[0] 
       + "\" in der Abenteurergilde zu erlernen.",78));
  }
  else {
     tell_object(pl, break_string("Dir faellt auf einmal auf, dass Du "
       "versuchen koenntest, die folgenden Zaubersprueche in der "
       "Abenteurergilde zu erlernen:",78));
     tell_object(pl, CountUp(spells) + "\n");
  }
}

// wird aus Spielerobjekt, /std/gilde.c und Gildenmaster gerufen (mindestens)
// aktualisiert den Gildenlevel auf den Spielerlevel und setzt den per
// get_new_title() aus den Gildentiteln ermittelten Gildentitel.
void adjust_title(object pl) {
  int lv;

  // bei P_LEVEL < 0 ist der Spieler noch "nicht fertig".
  // Der Titel wird anschliessend noch korrekt gesetzt.
  if (!pl || !IsGuildMember(pl) || (lv=pl->QueryProp(P_LEVEL)) < 0)
    return;

  pl->SetProp(P_GUILD_LEVEL,lv);
  if (!lv) lv=1;
  pl->SetProp(P_GUILD_TITLE, get_new_title(lv,pl));
  // Spielertitel nullen, damit der Gildentitel angezeigt wird.
  if (!IS_SEER(pl) && !FAO_HAS_TITLE_GIFT(pl))
    pl->SetProp(P_TITLE,0);
}

string karte() {
  if (this_player() && present("karte",this_player())) return 0;
  return GetDetail("karten");
}

public varargs void init(object origin) {
  int res;
  object ob;

  ::init(origin);

  // Von Ark, an alle Rassenstartpunkte
  if (ob=present("\nentdecker_obj",this_player()))
      ob->Check_And_Update(this_player(),"Menschen");
}

