AddMaterial()
=============

FUNKTION
--------
::

     private static varargs void AddMaterial(string mat, int gender,
                                             mixed names, mixed groups,
                                             mixed dif) {

DEFINIERT IN
------------
::

     /p/daemon/materialdb.c (MATERIALDB)

ARGUMENTE
---------
::

     string mat
       Materialstring, definiert in <thing/material.h>

     int gender
       Geschlecht des einzutragenden Materials

     mixed names
       Name des Materials:
       - "<Nominativ>" oder (meist nur Nom. und Gen. noetig)
       - ({"<Nominativ>","<Genitiv>","<Dativ>","<Akkusativ>"})

     mixed groups
       Eingruppierung des Materials:
       - MATGROUP_XXX oder ({MATGROUP_XXX,...})
       - ([MAT_GROUP_XXX:xx,MATGROUP_YYY:yy,...])

     mixed dif
       Schwierigkeiten bei der Erkennbarkeit:
       - int x oder ({MINMAT,x1,MATPOS1,x2,MATPOS2 ...})
       - xn: Erkennbarkeitsschwierigkeit (100=100%) -100..100
       - MINMAT: Erkennung zumindest als _dieses_ Material
                 moeglich
       - MATPOSn: moegliches Material, erkennbar, wenn
                  Erkennbarkeitfaehigkeit>=xn
                  -> das letzte MATPOS muss natuerlich
                     string mat entsprechen

BESCHREIBUNG
------------
::

     Es wird in die Materialiendatenbank eine neues Material aufgenommen,
     die Stringkonstante dafuer wird vorher in <thing/material.h> fest-
     gelegt. Falls der Genitiv nicht Nominativ+"s" entspricht (z.B. "Seide"),
     sollte dieser explizit angegeben werden.
     Nach Neuladen der Datenbank ist dieses Material auch per MaterialName(),
     'erkennbar' (siehe mixed dif, siehe Beispiel) bzw. seinen einzelnen
     Gruppen zuordnbar.

BEISPIELE
---------
::

     AddMaterial(MAT_NITROGLYCERINE,NEUTER,"Nitroglycerin",
                 ({MATGROUP_EXPLOSIVE,MATGROUP_FLUID}),
                 ({MAT_OIL,25,MAT_MISC_EXPLOSIVE,50,MAT_NITROGLYCERINE}));

     Damit wird das Material Nytroglycerin aufgenommen, ein explosiver
     (damit entflammbarer) sowie fluessiger Stoff. Liegt die Erkennungs-
     faehigkeit (MaterialName()) unter 25, wird es nur als Oel erkannt,
     liegt sie unter 50, wird es zumindest als explosives Material erkannt,
     liegt sie ueber 49, so wird es korrekt erkannt (wie schade :) ).

BEMERKUNGEN
-----------
::

     Wird in der create() der Datenbank aufgerufen. Zu beachten:
     - vor Eintrag eines _neuen_ Materials die Datenbank durchsuchen!
     - bei den Materialiengruppen die automatischen Abhaengigkeiten in
       AddMaterial() durchsehen!
     - bitte Datenbank neu laden

SIEHE AUCH
----------
::

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

7. Mai 2004 Gloinson

