Materialerkennung
=================

     Bei MaterialName(mat,casus,idinf) und MaterialList(casus,idinf) id der 
     Parameter <idinf> als Angabe dafuer gedacht, wie gut Materialien 
     erkannt werden sollen. Es sind folgende Arten von Angaben moeglich:

      - Ein Array
	Die einzelnen Arrayelemente werden nach untenstehenden Regeln 
	behandelt und deren Ergebnisse addiert.
      - Ein Objekt
	In diesem Fall wird
	ob->QueryProp(P_MATERIAL_KNOWLEDGE)
	nach untenstehenden Regeln behandelt.
	Diese Property ist fuer rassenabhaengige Faehigkeiten gedacht.
      - Eine Zahl
	In diesem Fall wird der Wert direkt als Faehigkeit angesehen, das 
	Material erkennen zu koennen.
      - Eine Closure
	In diesem Fall wird der Returnwert von
	funcall(closure,material,gruppen_in_denen_diese_material_ist)
	genommen.
      - Ein Mapping
	In einem Mapping sind 3 Arten von Eintraegen moeglich:
	- Ist im Mapping unter <mat> eine Zahl eingetragen, wird diese 
	  genommen und die weiteren Eintraege nicht weiter ausgewertet.
        - Die Werte von allen Gruppen im Mapping, zu denen das Material
          gehoert, werden addiert.
        - Falls das Mapping einen Eintrag MATERIAL_SYMMETRIC_RECOGNIZABILITY 
          hat, der ein Array von der 	  Form
		({gruppe1, wert1, gruppe2, wert2, ...})
	  ist, wird fuer jede dieser Gruppen der zugehoerige Wert 
	  addiert, falls das Material in der Gruppe ist, und sonst 
	  abgezogen.
          Im Beispiel: ({MATGROUP_BIO: 5}) gibt einen Erkennbonus von 5% auf 
          alle biologischen Materialien, aber einen Malus von -5% auf alle 
          nichtbiologischen Materialien.

     Schwer erkennbare Materialien haben in der Materialdatenbank eine 
     zusaetzliche Angabe der Form
	({mat1, wert2, mat3, wert4, mat5, ... wert(n-1), mat(n)})
     wobei mat(n) das Material selber ist.

     Das erkannte Material ist das Material mat(k), bei dem die
	wert(k-1) <= Erkennungsfaehigkeit < wert(k+1)
     ist. Bei Erkennungsfaehigkeit 100 oder mehr wird das Material auf jeden 
     Fall erkannt.

     Der Wert fuer Durchschnittsspieler ist 0.

BEISPIEL:
     Angenommen, bei Platin waere die Angabe in der Datenbank
	({Metall, -20, Silber, 20, Platin})
     Ein Spieler ohne besondere Erkennungsfaehigkeiten (also Wert 0) wuerde 
     also Platin fuer Silber halten, jemand, der von Metallen keine Ahnung 
     hat (beispielsweise mit der Angabe ([MATGROUP_METAL:-25]) in 
     P_MATERIAL_KNOWLEDGE) sieht nur noch, dass es ein Metall ist und jemand 
     mit ueberdurchschnittlicher Faehigkeit erkennt Platin als das, was es 
     ist.

     P_MATERIAL_KNOWLEDGE koennte z.B. fuer Rassen wie folgt gesetzt werden:
	Elf:   ([MATGROUP_WOOD:30])
	Zwerg: ([MATGROUP_STONE:30])
     oder etwas komplexer
	Zwerg: ([MATGROUP_STONE:30,
		 MATERIAL_SYMMETRIC_RECOGNIZABILITY: ({MATGROUP_BIO: -5})])

SIEHE AUCH:
     Konzepte:	  material
     Grundlegend: P_MATERIAL, /sys/thing/material.h
     Methoden:    QueryMaterial(), QueryMaterialGroup(), MaterialList(),
     Listen:	  AllMaterials(), AllGroups(), Dump()
		  materialliste, materialgruppen
     Master:	  AddMaterial(), ConvMaterialList(), MaterialGroup(),
		  GroupName(), MaterialName(),
		  GetGroupMembers(), GetMatMembership()
     Sonstiges:	  P_MATERIAL_KNOWLEDGE

7. Mai 2004 Gloinson