Der Scoremaster
===============

BESCHREIBUNG

  Funktion: Verwaltung der Erstkill-Stufenpunkte, die fuer das Toeten von
  NPCs vergeben werden. Fuer alle NPCs, die mehr als 200000 XP
  (SCORE_LOW_MARK) geben, wird ein Stufenpunkt vergeben. Ab 600000 XP
  (SCORE_HIGH_MARK) sind es 2 Stufenpunkte. Ueber diese Werte hinausgehende
  Punkte muessen beantragt und manuell ueber den Scoremaster eingetragen
  werden.

  Jeder NPC, der mindestens einen Stufenpunkt gibt, wird automatisch in
  eine Liste temporaerer EKs eingetragen, die vom EK-Maintainer einzeln
  bestaetigt werden muessen. Dieses Verfahren ist erforderlich, weil der
  bis vor einiger Zeit eingesetzte Mechanismus, EKs automatisch einzutragen,
  dazu gefuehrt hat, dass eigentlich nicht als EK vorgesehene oder erlaubte,
  aber auch laengst wieder abgehaengte oder gar nie angeschlossene NPCs
  eingetragen waren. Da aus dem Scoremaster auch die von Brumni in der
  Fraternitas ausgegebenen EK-Tips abgefragt werden, ist das natuerlich fatal
  fuer Spieler, wenn sie Tips bekommen, die sie nicht erreichen koennen.

  Die Liste der Erstkills ist ein Mapping, das als Keys eine fortlaufende
  Nummer enthaelt, zu der jeweils die Daten des NPCs zugeordnet sind. Diese
  Nummer dient vor allem auch zur Indizierung des Bitstrings im Spieler,
  in dem die Erstkills gespeichert werden.

  Diese Datei dokumentiert die Funktionalitaet des Scoremasters fuer die
  Benutzung durch EM und EK-Maintainer, jedoch nicht die vollstaendige
  interne Arbeitsweise und Verwaltung der Daten.

  Inhaltsverzeichnis dieser Dokumentation
  1) Neueintragung von EKs
  2) Verwaltung der unbestaetigten EKs
  3) Aenderungen an bestehenden EKs
  4) Spielerbezogene Daten verwalten
  5) Daten von NPCs abfragen
  6) Permanentes Loeschen von EKs
  7) Verwaltung der EK-Tips von Brumni
  8) Sonstige Funktionen (nur von NPCs gerufen)


RUECKGABEWERTE:

  SCORE_INVALID_ARG   -1
  SCORE_NO_PERMISSION -2


FUNKTIONEN

1) Neueintragung von EKs

  NewNPC(string key, int score)
  AddNPC(string key, int score) [veraltet, leitet an NewNPC weiter]
        Neuen NPC eintragen, key ist hierbei der Pfad, score die Punktzahl
        Die ID des EKs wird automatisch ausgewaehlt, indem der naechste
        freie Platz im Mapping belegt wird.


2) Verwaltung der unbestaetigten EKs

  ConfirmScore(mixed key)
        unbestaetigten EK mit der Nummer oder dem Pfad "key" genehmigen
    =>  EK in den Spielern setzen und Statistik hochzaehlen,
    =>  EK aus der Liste der unbestaetigten EKs in die Liste der aktiven
        uebertragen,

  RejectScore(mixed key)
        unbestaetigten EK mit der Nummer oder dem Pfad "key" ablehnen
    =>  Eintrag aus der Liste der unbestaetigten EKs loeschen
    =>  Bit-Nr. in die Liste der freien Nummern eintragen

  DumpUnconfirmedScores()
        unbestaetigte NPCs an den abfragenden Magier ausgeben


3) Aenderungen an bestehenden EKs

  SetScore(mixed key, int score)
        Punktzahl fuer bereits eingetragenen NPC aendern, key ist der Pfad
        oder die NPC-Nummer, score die neue Punktzahl

  RemoveScore(mixed key)
        Setzt die Punktzahl auf 0. Solche EKs koennen spaeter durch Angabe
        einer neuen Punktzahl reaktiviert werden.
        Alternativ kann fuer diese Funktion auch SetScore(mixed key, 0)
        verwendet werden.
        key kann hierbei der Pfad oder die NPC-Nummer sein

  MoveScore(mixed oldkey, string newpath)
        Verlegt einen EK
        oldkey ist der aktuelle Pfad oder die Nummer
        newpath ist der neue Pfad


4) Spielerbezogene Daten verwalten

  HasKill(mixed pl, mixed npc)
        fragt ab, ob der Spieler "pl" den Kill "npc" hat
        pl kann hierbei der Spielername oder das Spielerobjekt sein,
        npc der Pfad oder dessen Nummer

  SetScoreBit(string pl, int bit)
        Mit dieser Funktion wird dem Spieler "pl" der EK mit der Nummer
        "bit" gutgeschrieben.

  ClearScoreBit(string pl, int bit)
        Mit dieser Funktion wird dem Spieler "pl" der EK mit der Nummer
        "bit" permanent ausgetragen.

  QueryKillPoints(mixed pl)
        liefert die Anzahl der Stufenpunkte zurueck, die dem Spieler pl
        durch die aktiven EKs gutgeschrieben wurden

  getFreeEKsForPlayer(object player)
        liefert alle EKs, die aktiv sind, und die der Spieler noch nicht
        hat, in einem Mapping entsprechend der Liste "npcs" zurueck.

  QueryAllKills(string pl)
        liefert alle Kills des Spielers als Bitstring zurueck, auch solche,
        die momentan ausgetragen/deaktiviert sind
        pl ist hierbei der Spielername als String

  QueryKills(string pl)
        liefert die aktiven Kills des Spielers als Bitstring zurueck
        pl ist hierbei der Spielername als String


5) Daten von NPCs abfragen

  QueryNPCbyNumber(int num)
        liefert die Daten des NPCs mit der Nummer "num" als Array zurueck

  QueryNPCbyObject(object o)
        liefert die Daten des NPCs mit dem Objekt "o" als Array zurueck


6) Permanentes Loeschen von EKs

  MarkEKForLiquidation(mixed key)
        entfernt einen EK endgueltig und unwiderruflich und gibt die Nr.
        wieder frei.
        Technisch wird der EK erstmal in eine Liste eingetragen. Im Reset
        iteriert der Master ueber alle Spieler-Savefiles und loescht den EK
        aus allen Spielern. Nach Abschluss wird der Eintrag in "npcs"
        geloescht und seine Nr. in die Liste freier Nummern eingetragen.

  UnmarkEKForLiquidation(mixed key)
        Entfernt die Loeschmarkierung von einem EK
    =>  Dies geht nur, solange nach einem MarkEKForLiquidation() noch kein
        reset() gelaufen ist!

  QueryLiquidationMarks()
        Fragt die fuer Loeschung vorgesehenen EKs ab.

  RestoreEK(string key, int bit, int score)
        restauriert die Daten eines frueher geloeschten, in den Spielern noch
        enthaltenen EKs. Moeglich nur dann, wenn der EK frueher mal geloescht
        wurde, aber in den Bitstrings in den Spielern noch eingetragen ist.
        Es werden Pfad, Nr. und Punkte benoetigt.
        Fuer nach dem Umbau des Scoremasters geloeschte EKs nicht mehr
        moeglich, weil diese permanent aus den Bitstrings ausgetragen wird.


7) Verwaltung der EK-Tips von Brumni

  addTip(mixed key,string tip)
        Traegt fuer den NPC mit der Nummer oder dem Pfad "key" einen EK-Tip-
        Text fuer Brumni ein.

  changeTip(mixed key,string tip)
        Aendert den durch Brumni auszugebenden EK-Tip fuer den NPC mit der
        Nummer oder dem Pfad "key". Der neue Tip wird dabei als 2. Parameter
        "tip" uebergeben.

  removeTip(mixed key)
        Loescht den durch Brumni auszugebenden EK-Tip-Spruch. Der Tip als
        solcher bleibt bestehen - anschliessend wird wieder der Standard-
        Spruch ausgegeben.

  getTip(mixed key)
        Gibt den Tip-Spruch fuer den NPC mit der Nummer oder dem Pfad
        "key" zurueck, oder den Standard-Spruch. Liefert fuer nicht
        eingetragenen "key" den Leerstring zurueck.

  QueryTipObjects(mixed player)
        Gibt die Objektnamen der EK-Tips des jeweiligen Spielers zurueck.

  allTipsForPlayer(object player)
        Gibt den Gesamtstring aller Tips des Spielers "player" zurueck.

  playerMayGetTip(object player)
        Fragt ab, ob der Spieler "player" einen Tip bekommen kann.

  giveTipForPlayer(object player)
        Waehlt einen zufaelligen EK aus, den der Spieler noch nicht hat, und
        traegt diesen im Master in die Liste ein, die mit allTipsForPlayer()
        abgefragt werden kann.


8) Sonstige Funktionen (nur von NPCs gerufen)

  GiveKill(object pl, int bit)
        schreibt dem Spieler "pl" den EK mit der Nummer "bit" gut.
        Diese Funktion wird ausschliesslich aus NPCs heraus gerufen.

  QueryNPC(int score)
        Wird vom getoeteten NPC gerufen, um zu ermitteln, ob dieser einen
        Erstkill gibt. Wenn der EK noch nicht existiert, wird dieser im
        Master zunaechst in der Liste der unbestaetigten EKs eingetragen
        Direkte Abfrage dieser Funktion von aussen z.B. durch Magier nicht
         moeglich, weil nicht sinnvoll.

