// MorgenGrauen MUDlib
//
// gilde.c -- Standardgilde
//
// $Id: gilde.c 8388 2013-02-16 17:28:31Z Zesstra $
#pragma strict_types
#pragma save_types
#pragma range_check
#pragma no_clone

#include <properties.h>
#include <defines.h>
#include <rooms.h>
#include <wizlevels.h>
#include <language.h>
#include <new_skills.h>
#include <exploration.h>
#include <ansi.h>
#include "/secure/questmaster.h"
#include "/secure/lepmaster.h"
#include "/secure/config.h"
#include <events.h>

#define NEED_PROTOTYPES
#include <thing/commands.h>
#include <thing/properties.h>
#undef NEED_PROTOTYPES


#define kosten_0 \
  ([0:                "Bis Du Dich das naechste Mal hier blicken laesst, solltest Du eine Menge Stufenpunkte sammeln. Sonst wird das nix!",\
    "zauberer":       "Jetzt fang hier ja nicht an zu jammern. Du hast doch grade erst erhoeht. Fuer die naechste Stufe musst Du erstmal Leistung zeigen!",\
    "kaempfer":       "Hat grade erst erhoeht und faengt schon an zu jammern wie ein altersschwacher Zauberer. Nimm gefaelligst Haltung an!",\
    "klerus":         "Wer hat Dir denn das Gehirn gelaeutert? Zeig erstmal was von Deinem Koennen, bevor Du schon wieder erhoehen willst!",\
    "chaos":          "So chaotisch kannst Du doch nicht sein zu glauben, dass Du schon wieder erhoehen kannst!",\
    "karate":         "Ruh Deine Knochen erstmal ein bisschen aus. Bis zur naechsten Stufe werden sie noch genug leiden muessen!",\
    "katzenkrieger":  "Da hilft kein Maunzen und kein Schnurren. Du hast grade erst erhoeht und dabei bleibt das!",\
    "tanjian":        "Jetzt schrei nicht gleich nach Siamil. Du musst noch eine Menge leisten bis zur naechsten Stufe!",\
    "bierschuettler": "Du hast das Bier auf Deinen letzten Erfolg noch nicht einmal ausgetrunken. Werd jetzt ja nicht groessenwahnsinnig!",\
    "werwoelfe" :     "Und wenn Du noch so grimmig guckst und den Mond anheulst. Du hast gerade erst erhoeht. Nun musst Du erstmal wieder etwas tun!",\
  ])
#define kosten_20 \
  ([0:                "Da liegt aber noch ein weiter Weg vor Dir. Aber Du schaffst es ganz sicher!",\
    "zauberer":       "Du kannst zwar zaubern, aber nicht hexen. Fuer die naechste Stufe musst Du schon noch einiges tun!",\
    "kaempfer":       "Oh weh, da hast Du aber noch ne Menge vor Dir. Beiss die Zaehne zusammen und los gehts!",\
    "klerus":         "Du wirst bestimmt noch einige Heiltraenke brauchen bis zur naechsten Stufe!",\
    "chaos":          "Hast Du versucht Dein Chaos zu beseitigen, oder was hast Du gemacht? Sehr weit gekommen biste jedenfalls noch nicht. Musst Dich schon ein bisschen anstrengen!",\
    "karate":         "Ganz schoen anstrengend immer nur mit Hand und Fuss zu metzeln, oder? Aber es hat Dich schon etwas naeher an die naechste Stufe rangebracht!",\
    "katzenkrieger":  "Bisschen weniger Fellpflege betreiben, und ein bisschen mehr Stufenpunkte sammeln. Du hast naemlich noch ein gutes Stueck vor Dir!",\
    "tanjian":        "Du hast noch ne Menge zu tun bis zur naechsten Stufe. Sterb nicht so oft, aber sowas tun Tanjian ja eh nicht!",\
    "bierschuettler": "Bier trinken alleine wird Dich nicht weiter bringen, obwohl Du schon ein Stueck weit gekommen bist!",\
    "werwoelfe" :     "Staerke Deine Willenskraft. Du hast noch einiges vor Dir!",\
  ])
#define kosten_40 \
  ([0:                "Also die Haelfte hast Du schon ungefaehr geschafft. Aber ruh Dich jetzt ja nicht darauf aus. Sieh mal zu, dass Du die zweite Haelfte zur naechsten Stufe auch noch schaffst. Auf einem Bein kann man schliesslich nicht lange stehn!",\
    "zauberer":       "Teile Llystrathe mit Hilfe. Och schade scheint nicht zu funktionieren, dann musst Du eben selber noch ne Menge Stufenpunkte sammeln!",\
    "kaempfer":       "Kaempfer schnell an die Waffen! Die Haelfte hast Du ungefaehr geschafft, aber es gibt noch viel zu tun!",\
    "klerus":         "Beeile Dich! Das Boese sitzt Dir im Nacken und Du hast noch ungefaehr die Haelfte vor Dir!",\
    "chaos":          "Schnapp Dir Deinen Daemon und teil Dir die zweite Haelfte der Arbeit mit ihm!",\
    "karate":         "Du scheinst eingesehen zu haben, dass hirnloses Draufhauen nix nutzt. Die Haelfte haste ungefaehr schon geschafft!",\
    "katzenkrieger":  "So ungefaehr bis zur Haelfte hast Du Dich schon an die neue Stufe herangeschlichen!",\
    "tanjian":        "Man kann den Wert zwischen den beiden Stufen durchaus als ausgewogen bezeichnen. Trotzdem hast Du noch ein Stueck des Weges vor Dir!",\
    "bierschuettler": "War das Fass nu halb voll oder halb leer? Jedenfalls biste ungefaehr bei der Haelfte angekommen!",\
    "werwoelfe" :     "Noch einige Gegner werden sich vor Dir fuerchten muessen, obwohl Du schon viel geschafft hast!",\
  ])
#define kosten_60 \
  ([0:                "Also ein bisschen was musst Du noch tun, aber es sieht schon ziemlich gut aus!",\
    "zauberer":       "Ein bisschen Wille und Magie und Du schaffst es wieder ein Stueck naeher an die neue Stufe heranzukommen!",\
    "kaempfer":       "Staerke Deinen Kampfwillen. Die groessten Anstrengungen hast Du schon hinter Dir!",\
    "klerus":         "So nah am Ziel wirst Du doch nicht aufgeben wollen. Hol Dir noch ein bisschen goettliche Unterstuetzung und weiter gehts!",\
    "chaos":          "Chaotisch sein alleine hilft nicht. Ein bisschen was musst Du schon noch tun!",\
    "karate":         "Die Handkanten geschaerft, den Gi fest zugebunden. Bald hast Du es geschafft!",\
    "katzenkrieger":  "Auf Samtpfoten schleichst Du mit grossen Schritten ans Ziel heran. Aber ein bisschen fehlt noch!",\
    "tanjian":        "Eine Quest hier, ein paar Monster da. Aber immer schoen ausgeglichen bleiben, dann klappts auch weiterhin!",\
    "bierschuettler": "Noch ein paar kraeftige Schlucke und Du hast es fast geschafft!",\
    "werwoelfe" :     "Verlass Dein Rudel und zieh hinaus ins Abenteuer. Dann wirst Du bald siegreich heimkehren!",\
  ])
#define kosten_80 \
  ([0:                "Huch na sowas, Du hast die naechste Stufe ja schon fast erreicht. Na also! Der Rest ist ja wirklich nur noch Kleinkram!",\
    "zauberer":       "Die paar fehlenden Puenktchen haste Dir doch rasch zusammengezaubert!",\
    "kaempfer":       "Das fehlende bisschen machst Du als gnadenlos guter Kaempfer doch mit Links. Jetzt halt Dich aber mal ran. Oder willst Du Dich auf dem letzten Stueck noch von so einem luschigen Zauberer ueberrunden lassen?",\
    "klerus":         "Bei Saphina, Kandri und Lembold, Du bist fast bei der naechsten Stufe angekommen!",\
    "chaos":          "Boese waehrt am laengsten. Fast hast Du es geschafft!",\
    "karate":         "So viele blaue Flecken wie Du an Armen und Beinen hast, kann die naechste Stufe nicht mehr weit sein!",\
    "katzenkrieger":  "Pass bloss auf, dass Dich auf den letzten Zentimetern nicht noch ein Hund erwischt!",\
    "tanjian":        "Siamil wird stolz auf Dich sein. Du hast Dich gegen Gut und Boese durchgesetzt und das Ziel fast erreicht!",\
    "bierschuettler": "Lange musst Du nicht mehr warten. Kannst ruhig schon mal ein frisches Bier in Auftrag geben!",\
    "werwoelfe" :     "Noch ein letztes Mal die fuerchterlichen Krallen schaerfen, dann hast Du Deinen neuen Level erreicht!",\
  ])

void create()
{
  if (object_name(this_object()) == __FILE__[0..<3]) {
      set_next_reset(-1);
      return;
  }

  AddCmd("kosten","kosten");
  AddCmd("liste","liste");
  AddCmd("erhoehe","advance");
  AddCmd(({"treff"}), "GotoMagierTreff");
 }

public varargs void init(object origin)
{
  int lvl;

  if (PL && query_once_interactive(PL)
      && (lvl=PL->QueryProp(P_LEVEL)) <= 6
      && LEPMASTER->QueryLevel(PL->QueryProp(P_LEP)) > lvl)
  {
    tell_object(PL,
      "\nDu koenntest Deine Stufe mit \"erhoehe spieler\" hier in der Gilde "
      "erhoehen.\n\n");
  }
}

string zeige_reboot()
{
  string str;
  int t,t2;

  t=time()-last_reboot_time();
  t2=t;
  str="Seit dem letzten Shutdown sind "+t+" Sekunden vergangen.\n";
  if (t<60) return str;
  str+="Das sind ";
  if (t>=86400)
  {
    str+=t/86400+" Tag";
    if (t>=86400*2)
      str+="e";
    str+=", ";
    t2=t2%86400;
  }
  if (t>=3600)
  {
    str+=t2/3600+" Stunde";
    if (t2/3600!=1)
      str+="n";
    str+=", ";
    t2=t2%3600;
  }
  if (t>=60)
  {
    str+=t2/60+" Minute";
    if (t2/60!=1)
      str+="n";
    str+=" und ";
    t2=t2%60;
  }
  str+=t2+" Sekunde";
  if (t2!=1)
    str+="n";
  str+=".\n";
  return str;
}

int seer_cond(int silent)
{
  int cond;

  cond=LEPMASTER->QueryReadyForWiz(this_player());

  if (!silent)
    write(break_string(LEPMASTER->QueryReadyForWizText(this_player()),
          78, 0, 1));

  return cond;
}

varargs int kosten(string str)
{
  string tmp;

  int lep = PL->QueryProp(P_LEP);
  int lvl = PL->QueryProp(P_LEVEL);
  int diff = LEPMASTER->QueryNextLevelLEP(lvl, lep);

  switch ( diff ) {
    case 101..__INT_MAX__:
      // Falls mal LEPs abhandengekommen sind...
      tmp = "Wie bist Du ueberhaupt an Deinen Level gekommen?\n"
      "Sei froh, dass Du nicht wieder abgestuft wirst.";
      break;

    case 81..100:
      tmp=kosten_0[PL->QueryProp(P_GUILD)] || kosten_0[0];
      break;

    case 61..80:
      tmp=kosten_20[PL->QueryProp(P_GUILD)] || kosten_20[0];
      break;

    case 41..60:
      tmp=kosten_40[PL->QueryProp(P_GUILD)] || kosten_40[0];
      break;

    case 21..40:
      tmp=kosten_60[PL->QueryProp(P_GUILD)] || kosten_60[0];
      break;

    case 1..20:
      tmp=kosten_80[PL->QueryProp(P_GUILD)] || kosten_80[0];
      break;

    default:
      if ( lvl < 9 )
        tmp = "Probier mal den Befehl 'erhoehe'.";
      else
        tmp = "Den Befehl 'erhoehe' kennst Du aber, ja?";
      break;
  }

  write( break_string( tmp, 78, 0, BS_LEAVE_MY_LFS ) );

  if (!IS_SEER(this_player()) 
      && ( (str == "lang") ||
        (this_player()->QueryProp(P_LEVEL) > 12 && str != "kurz"))) {
    seer_cond(0);
    write (break_string("\nMit 'kosten kurz' kannst Du die Angabe der "
          "Seher-Anforderungen unterdruecken.", 78,0,1));
  }

  return 1;
}

// ermittelt Gildentitel zum Level <lev>.
// Der letzte verfuegbare Gildentitel wird nur fuer Seher vergeben.
// TODO: mit dem entsprechenden Code aus gilden_ob.c vereinigen?
string get_new_title(int lev, object pl)
{
  mapping titles;

  if (!pl) return 0;

  if (lev<0) lev=0;

  if (pl->QueryProp(P_GENDER) == MALE)
    titles=QueryProp(P_GUILD_MALE_TITLES);
  else
    titles=QueryProp(P_GUILD_FEMALE_TITLES);

  if (!mappingp(titles) || !sizeof(titles)) return 0;

  int maxlevel = max(m_indices(titles));

  // Level begrenzen. Max-Level fuer Seher.
  if (lev >= maxlevel)
    lev = IS_SEER(pl) ? maxlevel : maxlevel-1;

  return titles[lev];
}

// versucht das Spielerlevel zu erhoehen. Macht nicht den ganzen Krams
// drumrum, den advance() aus hysterischen Gruenden tut.
int try_player_advance(object pl) {

  if (PL->QueryProp(P_KILLS)>0)
    return -1;

  int level = pl->QueryProp( P_LEVEL );
  if (level == -1) level = 0;

  if (LEPMASTER->QueryNextLevelLEP(level, pl->QueryProp(P_LEP)) > 0)
      return 0;
  else
      ++level;

  pl->SetProp( P_LEVEL, level );

  // Aufstiegs-Event ausloesen
  EVENTD->TriggerEvent(EVT_LIB_ADVANCE, ([
        E_OBJECT: PL, E_PLNAME: getuid(PL),
        E_ENVIRONMENT: environment(PL),
        E_GUILDNAME: PL->QueryProp(P_GUILD),
        P_LEVEL: PL->QueryProp(P_LEVEL),
        ]) );

  // Falls die konkrete Gilde des Spielern irgedwas mit dem Titel in
  // ABhaengigkeit des Spielerlevels tun will. Ausnahmsweise per call_other,
  // die Funktion kommt eigentlich aus /std/gilden_ob.c.
  string gname=({string})pl->QueryProp(P_GUILD);
  (GUILD_DIR+"/"+gname)->adjust_title(pl);

  return 1;
}

// "erhoehe"-Kommando.
// erhoeht das Spielerlevel, falls moeglich. Setzt den passenden
// Abenteurergildentitel.
int advance(string arg)
{

  if (arg &&
      arg != "stufe" && arg != "spielerstufe" && arg != "spieler"
      && arg != "spielerlevel")
    return 0;

  int res = try_player_advance(PL);

  if (!res)
    return kosten("kurz");
  else if (res < 0) {
    notify_fail(break_string(
        "Du hast einen Mitspieler umgebracht!\n"+
        "In diesem Fall kannst Du Deine Stufe nicht erhoehen.\n"+
        "Bitte wende Dich an den Sheriff (oder einen Erzmagier) und bring "
        "das in Ordnung.\n",78,BS_LEAVE_MY_LFS));
    say(break_string(PL->Name(WER) 
          + " hat soeben auf schmerzliche Weise erfahren muessen, dass "
          "es wirklich nicht foerderlich ist, Mitspieler umzubringen.\n",
          78), PL);
    return 0;
  }

  string name_of_player = PL->name(WER);
  int level = PL->QueryProp(P_LEVEL);
  say( name_of_player + " hat jetzt Stufe " + level + " erreicht.\n");

  string title = PL->QueryProp(P_TITLE);

  switch(random(3)) {
    case 0:
      write("Du bist jetzt " + name_of_player + " " + title +
        " (Stufe " + level + ").\n");
      break;

    case 1:
      write("Gut gemacht, " + name_of_player + " " + title +
        " (Stufe " + level + ").\n");
      break;

    default:
      write("Willkommen auf Deiner neuen Stufe.\n" +
        "Du bist jetzt " + name_of_player+" "+ title +
        " (Stufe " + level + ").\n");
      break;
  }

  return 1;
}

// Spielerkommando fuer Abenteurerliste
varargs int liste(string arg)
{
  if (!this_player())
    return 0;
  int geloest_filter;
  switch(arg)
  {
    case "geloest":
      geloest_filter = 1;
      break;
    case "ungeloest":
      geloest_filter = 2;
      break;
  }

  string str = QM->liste(this_player(), geloest_filter);

  this_player()->More( str, 0 );
  return 1;
}

int GotoMagierTreff()
{
  if(IS_LEARNER(this_player()))
  {
    write("Ein Zauberspruch zieht vor Deinem geistigen Auge vorbei und Du\n"
    "sprichst ihn nach.\n");
    say(PL->name()+" murmelt einen geheimen Zauberspruch und schwebt langsam\n"
    "zur Decke hinauf und verschwindet durch die Wand.\n");
    write("Du schwebst langsam zur Decke hinauf und als ob diese nicht da\n"
    "waere mitten hindurch in den Magiertreff.\n");
    return (PL->move("/secure/merlin", M_TPORT | M_SILENT ) >= 0);
  }
  write("Du springst zur Decke hinauf und nix passiert.\n");
  return 1;
}

