MaterialList()
**************


MaterialList(L)
===============


FUNKTION
========

   varargs string MaterialList(int casus, mixed idinf)


DEFINIERT IN
============

   /std/thing/description.c


ARGUMENTE
=========

   int casus   - der Fall, in dem die Materialien dekliniert werden sollen
   mixed idinf - Dinge, welche die Faehigkeiten des Erkennens beeinflussen:
                 Einzelne Werte:
                 * x: allgemeine Erkennung -100 ... 100
                 * who: der Spieler - P_MATERIAL_KNOWLEDGE wird abgefragt
                 * fun: wird evaluiert
                 * what, kann folgendes enthalten:
                   - Eintrag fuer Materialien ([MAT_XXX:-100...100])
                   - Eintrag fuer Materialiengruppen (dito)
                   - ([MATERIAL_SYMMETRIC_RECOGNIZABILITY: mixed mg])
                     * mg ein Array:
                       ({MATGROUP_X1,int z1, MATGROUP_X2, int z2, ...})
                       wobei bei Zugehoerigkeit von string mat zu Gruppe
                       z<n> auf die Faehigkeit addiert, andernfalls davon
                       subtrahiert wird
                 Array mit obigen Werten:
                 - alle Parameter des Arrays sind optional und additiv
                 - ({int x, object who, mapping what, closure fun})


BESCHREIBUNG
============

   Listet die Materialien auf, aus denen ein Objekt besteht.
   Dabei haengt die Genauigkeit der Materialerkennung von idinf ab. D.h.
   je nach den Faehigkeiten/der angegebenen Faehigkeit wird zB Wolfram
   als "Wolfram" oder nur als "Metall" erkannt.

   Wenn ein Spieler etwas identifiziert, sollte auch TP uebergeben werden,
   bei NPCs koennte das anders aussehen.


RUECKGABEWERT
=============

   String mit Liste der Materialien.


BEMERKUNGEN
===========

   - es werden nur die Materialien angegeben, nicht die Menge.
   - ruft ConvMaterialList() an der MATERIALDB


BEISPIELE
=========

   // simpel
   write("Der Gegenstand besteht aus"+ob->MaterialList(WEM,TP)+".\n")
   // -> "Der Gegenstand besteht aus Gold, Silber und Rubin.\n"

   // komplexer
   ob->SetProp(P_MATERIAL, ([P_NITROGLYCERINE:90,P_GUNPOWDER:10]));
   write("Das enthaelt "+ob->MaterialList(WER,TP)+".\n");
   // -> "Das enthaelt Schwarzpulver und Nitroglycerin."


SIEHE AUCH
==========

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

7. Mai 2004 Gloinson
