Materialerkennung
=================
Bei MaterialName(mat,casus,idinf) und MaterialList(casus,idinf)
ist der Parameter <idinf> als Angabe dafuer gedacht, wie gut Materialien
erkannt werden sollen. Diese Funktionen sind in materialdb.c zu finden
und werden benoetigt um die Objekt-Funktionen MaterialList auszufuehren
und dem Koennen in der Materialerkennung des Spielers anzupassen.
Die Materialerkennung erfolgt fuer Spieler automatisch. Beim
Aufruf von objekt->MaterialList(casus) wird fuer jedes einzelne
Material aus welchem das <objekt> besteht:
MaterialName(mat,casus,PL->QueryProp(P_MATERIAL_KNOWLEDGE))
ausgefuehrtt und danach als Text aufbereitet. Dies uebernimmt die
Funktion ConvMaterialList(mat_liste,casus,idinf) in der materialdb.c
Es sind folgende Arten von Angaben fuer den Parameter <idinf> moeglich:
(zum Verstaendnis folgen Beispiele)
1. Ein Array
Die einzelnen Arrayelemente werden nach untenstehenden Regeln behandelt
und deren Ergebnisse addiert.
2. Ein Objekt
In diesem Fall wird
Objekt->QueryProp(P_MATERIAL_KNOWLEDGE)
nach untenstehenden Regeln behandelt.
Diese Property ist fuer rassenabhaengige Faehigkeiten gedacht.
3. Eine Zahl
In diesem Fall wird der Wert direkt als Faehigkeit angesehen,
das Material erkennen zu koennen.
4. Eine Closure
In diesem Fall wird der Returnwert von
funcall(closure,material,gruppen_in_denen_diese_material_ist) genommen.
5. Ein Mapping
In einem Mapping sind 3 Arten von Eintraegen moeglich:
3a. Ist im Mapping unter <mat> eine Zahl eingetragen, wird diese genommen
und die weiteren Eintraege nicht weiter ausgewertet.
3b. Die Werte von allen Gruppen im Mapping, zu denen das Material
gehoert, werden addiert.
3c. 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.
Der so ermittelte Wert ist die Erkennungsfaehigkeit fuer dieses Material.
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.
Aufrufe waeren dann wie folgt:
(1) MaterialName(MAT_PLATINUM,WEM,0) == "Silber"
(2) MaterialName(MAT_PLATINUM,WEM,([MATGROUP_METAL])) == "Metall"
(3) MaterialName(MAT_PLATINUM,WEM,30) == "Platin"
(4) MaterialName(MAT_PLATINUM,WEM,([MAT_PLATINUM:30])) == "Platin"
(5) MaterialName(MAT_PLATINUM,WEM,([MAT_PLATINUM:30,MATGROUP_METAL:-20]))
== "Silber",
Erklaerung: Platin ist ein Metall --> Erkennung -20,
doch Platin selber erkennt man +30 --> Zusammen 10
Es ist hierdurch moeglich einzelne Materialen aus einer Gruppe
auszuzeichnen/abzuwerten.
P_MATERIAL_KNOWLEDGE koennte z.B. fuer Rassen wie folgt gesetzt werden:
Elf: ([MATGROUP_WOOD:30])
Zwerg: ([MATGROUP_STONE:30])
SIEHE AUCH:
P_MATERIAL(WL), materialliste(WL), materialgruppen(WL),
material(WL), QueryMaterial(L), QueryMaterialGroup(L),
MaterialList(WL), materialdb(WL)
|