// MorgenGrauen MUDlib
//
// lepmaster.c -- Master, welcher aus scoremaster, explorationmaster,
//                questmaster und dem Spielerobjekt Informationen
//                ausliest und aus diesen die Levelpunkte des Spieler
//                berechnet
//                Weiters derjenige, der die Seheranforderungen 
//                prueft. 
//
// $Id: lepmaster.c 9168 2015-03-05 00:04:22Z Zesstra $

// Hier kommen Funktionen fuer die Levelpunkte
#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

#include <config.h>
#include <properties.h>
#include <new_skills.h>
#include <exploration.h>
#include <questmaster.h>
#include <scoremaster.h>
#include <wizlevels.h>

#include "lepmaster.h"

// Das Programm zur Foerderung der kleinen Level aktivieren. ;-)
#define __PFOERKL__ 1

// die ersten 8 Level, d.h. Level 1 bis 8 entsprechen diesen LEPs.
int *LOW_LEVEL_LEP_LIST = ({100,120,140,180,220,300,360,420}); // 9. Level: 500 LEP

#define REQ_TEXT1  ([0:"unglaublich viel", \
                  1:"unglaublich viel", \
		  2:"enorm viel", \
		  3:"sehr viel", \
		  4:"viel", \
		  5:"einiges", \
		  6:"etwas", \
		  7:"wenig", \
                  8:"sehr wenig", \
                  9:"kaum etwas" ])

#define REQ_TEXT2  ([0:"unglaublich viele", \
                  1:"unglaublich viele", \
		  2:"enorm viele", \
		  3:"sehr viele", \
		  4:"viele", \
		  5:"einige", \
		  6:"ein paar", \
		  7:"wenige", \
                  8:"sehr wenige", \
                  9:"kaum" ])

#define DEBUG(x,y)
//#define DEBUG(x,y) if (find_player("zook")) tell_object(find_player("zook"),sprintf(x,y))


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

int QueryLEPForPlayer(object pl)
{
  int ret, val, i, l;

  if (extern_call() && !IS_ARCH(geteuid(previous_object())))
    return -1;
  if (!pl || !query_once_interactive(pl))
    return -2;

  //  Grundoffset 100, da man mit Level 1 statt 0 startet
  ret = 100;

  // Beitrag A: Stupse von NPC-Erstkills
  ret += ({int})SCOREMASTER->QueryKillPoints(pl);

  DEBUG("Nach KP: ret = %d\n", ret);

  // Beitrag B: Stupse von geloesten Miniquests
  ret += ({int})QM->QueryMiniQuestPoints(pl);

  DEBUG("Nach MQP: ret = %d\n", ret);

  // Beitrag C: Questpunkte
  //  werden 1:1 uebernommen;
  ret += ({int})pl->QueryProp(P_QP);

  DEBUG("Nach QP: ret = %d\n", ret);

  // Beitrag D: Erfahrungspunkte
  //  Stupse = XPs ^ 0.32
  val = ({int})pl->QueryProp(P_XP);

  if (val<1) l=0;
  else l=to_int(exp(log(to_float(val))*0.32));

  ret += l;

  DEBUG("Nach XP: ret = %d\n", ret);

  // Beitrag E: Zaubertraenke
  //  Gefundene Traenke geben 5 LEP
  //  Die Heiltraenke geben zusaetzlich 10+20+30+40 LEP
  i = 80 - (val = sizeof(({int *})pl->QueryProp(P_POTIONROOMS)));

  ret += 5*i + ([ 0: 100, 1: 60, 2: 30, 3: 10])[val];

  // Beitrag F: Forscherpunkte
  //  Pro FP gibt es 6 Stufenpunkte
  ret += 6 * ({int})EPMASTER->QueryExplorationPoints(pl);

  DEBUG("Nach FP: ret = %d\n", ret);

  // Beitrag G: Gildeneinstufung
  //  Maximale Gildeneinstufung (10000) entspricht vier Leveln
  ret += (({int})pl->QueryProp(P_GUILD_RATING))/25;

  DEBUG("Nach GR: ret = %d\n", ret);

  // Ausgabe gibt es nur in 20er-Schritten
  ret -= ret%20;

  return (ret > 100) ? ret : 100;

}

nomask int QueryLEP()
{
  if (!previous_object())
    return 0;
  return QueryLEPForPlayer(previous_object());
}

nomask int QueryLevel(int lep) {
  if (lep<=0)
    lep=QueryLEP();

  if (lep<=0)
    return 0;

#ifdef __PFOERKL__
  // normale Level alle 100 LEP
  if (lep >= 500)
    return lep/100 + 4;
  else {
    // level mit weniger LEP am Anfang (1-8)
    // Level aus der LOW_LEVEL_LEP_LIST raussuchen.
    int lev = sizeof(LOW_LEVEL_LEP_LIST) - 1;
    for ( ; lev >= 0; --lev) {
      if (LOW_LEVEL_LEP_LIST[lev] <= lep)
        break;  // gefunden
    }
    return lev+1;
  }
#else
  return lep/100;
#endif // __PFOERKL__
  return 0;
}

// Wieviele LEP fehlen zum naechsten Level?
nomask int QueryNextLevelLEP(int lvl, int lep) {
  int needed;

  if (QueryLevel(lep) > lvl)
    return 0;

#ifdef __PFOERKL__
  if (lvl < sizeof(LOW_LEVEL_LEP_LIST))
    needed = LOW_LEVEL_LEP_LIST[lvl];
  else
    needed = (lvl-3) * 100; // (lvl + 1 - 4) * 100
#else
  needed = (lvl+1) * 100;
#endif // __PFOERKL__

  // needed sind jetzt die insgesamt benoetigten LEP. Vorhandene abziehen.
  needed -= lep;
  // nix < 0 zurueckliefern
  return max(needed,0);
}

string QueryForschung()
{
  int max, my, avg;
  string ret;

  if ((my=({int})EPMASTER->QueryExplorationPoints(getuid(previous_object()))) < MIN_EP)
    return "Du kennst Dich im "MUDNAME" so gut wie gar nicht aus.\n";

  my *= 100;
  max = my/({int})EPMASTER->QueryMaxEP();
  avg = my/({int})EPMASTER->QueryAverage();

  ret = "Verglichen mit Deinen Mitspielern, kennst Du Dich im "MUDNAME" ";
  switch(avg) {
  case 0..10:
    ret += "kaum";
    break;
  case 11..40:
    ret += "aeusserst schlecht";
    break;
  case 41..56:
    ret += "sehr schlecht";
    break;
  case 57..72:
    ret += "schlecht";
    break;
  case 73..93:
    ret += "unterdurchschnittlich";
    break;
  case 94..109:
    ret += "durchschnittlich gut";
    break;
  case 110..125:
    ret += "besser als der Durchschnitt";
    break;
  case 126..145:
    ret += "recht gut";
    break;
  case 146..170:
    ret += "ziemlich gut";
    break;
  case 171..210:
    ret += "gut";
    break;
  case 211..300:
    ret += "sehr gut";
    break;
  case 301..400:
    ret += "ausserordentlich gut";
    break;
  case 401..500:
    ret += "unheimlich gut";
    break;
  default:
    ret += "einfach hervorragend";
    break;
  }
  ret += " aus.\nAbsolut gesehen ";

  switch(max) {
  case 0..5:
    ret += "kennst Du nur wenig vom "MUDNAME".";
    break;
  case 6..10:
    ret += "solltest Du Dich vielleicht noch genauer umsehen.";
    break;
  case 11..17:
    ret += "bist Du durchaus schon herumgekommen.";
    break;
  case 18..25:
    ret += "hast Du schon einiges gesehen.";
    break;
  case 26..35:
    ret += "bist Du schon weit herumgekommen.";
    break;
  case 36..50:
    ret += "koenntest Du eigentlich einen Reisefuehrer herausbringen.";
    break;
  case 51..75:
    ret += "hast Du schon sehr viel gesehen.";
    break;
  default:
    ret += "besitzt Du eine hervorragende Ortskenntnis.";
  }
  return break_string(ret, 78, 0, 1);
}


nomask mixed QueryWizardRequirements(object player)
{
  // Diese Funktion gibt ein 2-elementiges Array zurueck, in dem im ersten
  // Element steht, ob der Spieler Seher werden kann (1) oder
  // nicht (0) und im zweiten Element steht, was genau ihm noch 
  // fehlt. 
  // Fehlercode ist ({-1, ""})

  // Die Umrechnungsfaktoren wurden einfach aus QueryLEP uebernommen; ggf.
  // kann man das einmal in Unterfunktionen auslagern. 

  mixed ret;
  string s; 
  int i,z,val; 

  ret = ({-1, "Hier ist etwas schief gelaufen. Bitte einen Erzmagier\n"
	    +"benachrichtigen.\n"});
  s = "";
  i = 0; 

  if(!player || !objectp(player))
    player=(this_player()?this_player():this_interactive());

  if(!player)
    return ({-1,""});

  DEBUG("Es geht um: %O\n", player);

  // Abenteuerpunkte
  DEBUG("Abenteuerpunkte: %d ("+REQ_QP+")\n", player->QueryProp(P_QP));
  if (player->QueryProp(P_QP) < REQ_QP) {
    s += sprintf(" * Dir fehlen noch mindestens %d Abenteuerpunkte.\n", 
		 REQ_QP - ({int})player->QueryProp(P_QP));
    i--;
  }

  // Forscherpunkte
  z = 6 * ({int})EPMASTER->QueryExplorationPoints(player);
  DEBUG("Forscherpunkte: %d ("+REQ_EP+")\n", z);
  if (z < REQ_EP) {
    s += sprintf(" * Du kennst Dich im "MUDNAME" noch nicht genug aus, "
		 +"genau genommen\n   musst Du Dir noch %s ansehen.\n", 
		 REQ_TEXT1[(z*10/REQ_EP)] );
    i--;
  }

  // Zaubertraenke
  z = 80 - (val = sizeof(({int*})player->QueryProp(P_POTIONROOMS)));
  z = z*5 + ([0:100, 1:60, 2:30, 3:10])[val];
  DEBUG("Zaubertraenke: %d ("+REQ_P+")\n", z);
  if (z < REQ_P) {
    s += sprintf(" * Du musst noch einige Zaubertraenke (ca. %d) suchen.\n",
		 (REQ_P - z)/5 );
    i--;
  }

  // Erstkills
  z = ({int})SCOREMASTER->QueryKillPoints(player);
  DEBUG("Erstkills: %d ("+REQ_K+")\n", z);
  if (z < REQ_K) {
        s += sprintf(" * Du hast noch nicht genuegend wuerdige Gegner erlegt, genau "
    	 +"genommen\n   musst Du noch %s wuerdige Monster toeten.\n",
    	 REQ_TEXT2[(z*10/REQ_K)] );;
    i--;
  }

  int minlevel = QueryLevel(REQ_LEP);

  // Restliche Stufenpunkte 
  DEBUG("Stufenpunkte: %d ("+REQ_LEP+")\n", player->QueryProp(P_LEP));
  if (({int})(player->QueryProp(P_LEP)) < REQ_LEP) {
    s += sprintf(" * Du musst mindestens %d Stufenpunkte, entspricht Stufe %d, "
        "erreichen.\n", REQ_LEP, minlevel);
    i--;
  }
  
  // Demnach mindestens REQ/100-Level 
  DEBUG("Level: %d ("+REQ_LEP/100+")\n", player->QueryProp(P_LEVEL));
  if (({int})player->QueryProp(P_LEVEL) < minlevel) {
    s += sprintf(" * Du musst mindestens Stufe %d erreichen.\n", minlevel);
    i--;
  }
  
  if(i<0) {
    ret = ({-1, 
	 sprintf("Du hast noch nicht alle Seher-Anforderungen erfuellt.\n"
		+"Im einzelnen fehlt Dir folgendes:\n\n%s\n"
		 +break_string("Falls Du Dir nun dennoch unsicher bist, "
  +"welche Anforderungen Du erfuellen musst, dann "
  +"schaue bei 'hilfe seher' und 'hilfe stufenpunkte' doch einfach noch "
  +"einmal nach. Sind dann "
  +"immer noch Dinge offen oder unklar, so sprich einfach einen "
				  +"der Erzmagier an.", 78,0,1),s) });
  } 
    
  if (i==0) {
    ret = ({1, break_string(
	       "Du hast alle Seher-Anforderungen erfuellt. Wende Dich doch "
	       +"einmal an Merlin und frage ihn, ob er Dich befoerdert.", 
	       78,0,1) });
  }

  return ret; 
}

nomask int QueryReadyForWiz(object player)
{
  mixed r;
  
  r = QueryWizardRequirements(player);
  
  if (!pointerp(r) && sizeof(r)!=2 && !intp(r[0]))
    return -1;

  return r[0];
}

nomask string QueryReadyForWizText(object player)
{
  mixed r;

  r = QueryWizardRequirements(player);

  if (!pointerp(r) && sizeof(r)!=2 && !stringp(r[1]))
    return "Hier ist etwas schief gegangen, bitte verstaendige einen "
      +"Erzmagier.";

  return r[1];
}

