materialdb.c-Dateireferenz

#include <language.h>
#include <thing/description.h>
#include <thing/material.h>
#include <player/description.h>
#include <rtlimits.h>
Include-Abhängigkeitsdiagramm für materialdb.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define _SKIP_MATERIALS_
#define MAT_DIR   "/doc/materials"
#define DOC_DIR(x)   ("/doc/materials/"+x)
#define HEADERFILE   "/sys/materials.h"
#define SAVEFILE   DOC_DIR("materialdb")
#define P_RECOC   "recognizability"
#define P_ID   "id"
#define P_DEFSTR   "defstr"
#define P_MEMBERS   "members"
#define P_MG_FRACTIONS   "mg_fractions"
#define LOG_ERROR(x)   if(find_player("raschaua")&&find_player("raschaua")->QueryProp("mdb-debug"))tell_object(find_player("raschaua"),"MDB-Error:"+x)
#define LOG_WARN(x)   if(find_player("raschaua")&&find_player("raschaua")->QueryProp("mdb-debug"))tell_object(find_player("raschaua"),"MDB-Warn:"+x)
#define MDESC_ERROR(x, y)   LOG_ERROR(sprintf("Materialbeschreibung '%s': %s\n", x, y))
#define MDESC_WARN(x, y)

Funktionen

int MaterialGroup (mapping mats, string grp)
varargs string ConvMaterialList (mixed mats, int casus, mixed idinf)
varargs string MaterialName (string mat, int casus, mixed idinf)
string GroupName (string grp)
string * AllMaterials ()
string * AllGroups ()
string * GetMatMembership (string mat)
string * GetGroupMembers (string grp)
void Update ()
varargs void GenHeaderFile (string fn)
void create ()
private string getMatId (string key)
private string getMatGroupId (string key)
private string matKey2Defstr (string key, mapping mats)
private string groupKey2Defstr (string key)
string GroupDescription (string grp)
private string * get_ordered_groups ()
private string gen_material_h_head ()
private string gen_material_h_material (string mat, string last_grp)
private string gen_material_h_materials_grp (string grp, string *left)
private string gen_material_h_materials ()
private string gen_material_h_group (string grp)
private string gen_material_h_groups ()
private string gen_material_h_foot ()
private int dump_material_h (string fn)
private string gen_material_list_material (string mat)
private string gen_material_list_materials_grp (string grp, string *left)
private void dump_material (string fn)
private void dump_group (string grp, string fn)
private string gen_doc_foot (string other)
varargs void GenMatList (string fn)
varargs void GenMatGroupList (string fn)
private void updateGroupMembers (mapping groups, string mat_id, mapping mat)
private mapping getDescParts (string s)
private varargs int isFile (string fn, string path)
private varargs mixed readGroupDesc (string id)
private mapping convMatId (string s)
private string * convMatNames (string s)
private int convMatGender (string s)
private string convMatDesc (string s)
private void addRecocLine (string s, mixed *r)
private mixed convMatRec (string s)
private void addGroupLine (string s, mapping g)
private mapping convMatGroups (string s)
private mapping convMaterialDesc (string id, mapping desc)
private varargs mixed readMaterialDesc (string id)
public int GetUpdateTicks ()
private void scanFinished ()
public int IsScanning ()
private varargs void doScanMaterials (string *mats, int i, int step)
private mapping ScanGroups ()
private void ScanMaterials ()

Variablen

mapping materials
mapping material_groups
private status initialized
mapping old_mat_keys
nosave mapping new_materials
nosave mapping new_material_groups
private nosave status isScanning
private nosave int updateTicks

Makro-Dokumentation

#define _SKIP_MATERIALS_

Definiert in Zeile 26 der Datei materialdb.c.

#define DOC_DIR ( x   )     ("/doc/materials/"+x)

Definiert in Zeile 35 der Datei materialdb.c.

#define HEADERFILE   "/sys/materials.h"

Definiert in Zeile 38 der Datei materialdb.c.

#define LOG_ERROR ( x   )     if(find_player("raschaua")&&find_player("raschaua")->QueryProp("mdb-debug"))tell_object(find_player("raschaua"),"MDB-Error:"+x)

Definiert in Zeile 50 der Datei materialdb.c.

#define LOG_WARN ( x   )     if(find_player("raschaua")&&find_player("raschaua")->QueryProp("mdb-debug"))tell_object(find_player("raschaua"),"MDB-Warn:"+x)

Definiert in Zeile 51 der Datei materialdb.c.

#define MAT_DIR   "/doc/materials"

Definiert in Zeile 32 der Datei materialdb.c.

Wird benutzt von ScanGroups() und ScanMaterials().

#define MDESC_ERROR ( x,
 )     LOG_ERROR(sprintf("Materialbeschreibung '%s': %s\n", x, y))

Definiert in Zeile 607 der Datei materialdb.c.

#define MDESC_WARN ( x,
 ) 

Definiert in Zeile 608 der Datei materialdb.c.

#define P_DEFSTR   "defstr"

Definiert in Zeile 46 der Datei materialdb.c.

Wird benutzt von matKey2Defstr().

#define P_ID   "id"

Definiert in Zeile 45 der Datei materialdb.c.

#define P_MEMBERS   "members"

Definiert in Zeile 47 der Datei materialdb.c.

Wird benutzt von GetGroupMembers().

#define P_MG_FRACTIONS   "mg_fractions"

Definiert in Zeile 48 der Datei materialdb.c.

Wird benutzt von MaterialGroup() und MaterialName().

#define P_RECOC   "recognizability"

Definiert in Zeile 44 der Datei materialdb.c.

Wird benutzt von MaterialName().

#define SAVEFILE   DOC_DIR("materialdb")

Definiert in Zeile 41 der Datei materialdb.c.


Dokumentation der Funktionen

private void addGroupLine ( string  s,
mapping  g 
)

Definiert in Zeile 748 der Datei materialdb.c.

00748                                                {
00749   // Die weitere Bewertung der Zugehoerigkeit passiert spaeter.
00750   string grp;
00751   int val;
00752   if (sscanf(s, "%s:%d", grp, val)) {
00753     g += ([grp:val]);
00754   } else {
00755     g += ([grp:100]);
00756   }
00757 }

private void addRecocLine ( string  s,
mixed *  r 
)

Definiert in Zeile 723 der Datei materialdb.c.

00723                                               {
00724   // Die weitere Bewertung der Schwierigkeit kann erst vorgenommen werden,
00725   // wenn alle Materialien bekannt sind und passiert spaeter. Zuerst werden
00726   // nur die Elemente des Arrays konvertiert und eingetragen
00727   string mat;
00728   int val;
00729   if (sscanf(s, "%s:%d", mat, val)) {
00730     r += ({mat,val});
00731   } else if (sscanf(s, "%d", val)) {
00732     r += ({val});
00733   } else {
00734     r += ({s});
00735   }
00736 }

string * AllGroups (  ) 

Definiert in Zeile 272 der Datei materialdb.c.

Benutzt initialized und material_groups.

00272                     {
00273   if (initialized) {
00274     // Aus Kompatibilitaetsgruenden die alten Schluessel (#define-String)
00275     // zurueckgeben
00276     return map(m_indices(material_groups), #'groupKey2Defstr);
00277   }
00278   return 0;
00279 }

string * AllMaterials (  ) 

Definiert in Zeile 263 der Datei materialdb.c.

Benutzt initialized und old_mat_keys.

00263                        {
00264   if (initialized) {
00265     // Aus Kompatibilitaetsgruenden die alten Schluessel (#define-String)
00266     // zurueckgeben
00267     return m_indices(old_mat_keys);
00268   }
00269   return 0;
00270 }

private string convMatDesc ( string  s  ) 

Definiert in Zeile 714 der Datei materialdb.c.

00714                                      {
00715   if (sizeof(regexp( ({s}), "- nicht vorhanden -"))) {
00716     s = 0;
00717   } else {
00718     // Mehrzeilige Beschreibungen zu einer Zeile zusammenfassen
00719     s = implode(explode(s, "\n"), " ");
00720   }
00721   return s;
00722 }

private mapping convMaterialDesc ( string  id,
mapping  desc 
)

Definiert in Zeile 767 der Datei materialdb.c.

00767                                                           {
00768   /* Struktur Materialmapping:
00769      P_GENDER,
00770      P_NAME:({name_nom, name_gen, name_dativ, name_akkusativ}),
00771      (P_RECOC:({mat1,faehigkeit1,mat2,faehigkeit2,...}),)
00772      (P_DEFSTR: bei bedarf),
00773      P_DESCRIPTION,
00774      (grupp1:anteil1,
00775      gruppe2:anteil2,
00776      ...)
00777   */
00778   mapping m;
00779   mixed val, val2;
00780   m = ([]);
00781   // Der string fuer das #define zuerst:
00782   val = convMatId(desc["Materialid"]);
00783   if (mappingp(val)) {
00784     if (val[P_ID] != id)
00785       LOG_WARN(sprintf("Unstimmigkeit Materialid bei '%s':%O\n", id, val[P_ID]));
00786     if (member(val, P_DEFSTR)) {
00787       m += ([P_DEFSTR:val[P_DEFSTR]]);
00788     } else {
00789       // Wenn kein String fuers #define angegeben wurde, dann direkt ID verwenden
00790       //m += ([P_DEFSTR:lowerstring(id)[4..]]);
00791     }
00792   }
00793   // Die Namen
00794   if (val = convMatNames(desc["Name"])) {
00795     m += ([P_NAME:val]);
00796   } else {
00797     MDESC_WARN(id, "keine Namen");
00798     m += ([P_NAME:({"", "", "", ""})]);
00799   }
00800   // Das Geschlecht, standard ist NEUTER
00801   m += ([P_GENDER:convMatGender(desc["Geschlecht"]) ]);
00802   // Die Beschreibung
00803   val = convMatDesc(desc["Beschreibung"]);
00804   if (strlen(val)) {
00805     m += ([P_DESCRIPTION:val]);
00806   } else {
00807     MDESC_WARN(id, "keine Beschreibung");
00808   }
00809   // Die Erkennbarkeit
00810   val = convMatRec(desc["Erkennbarkeit"]);
00811   if (sizeof(val)) {
00812     m += ([P_RECOC:val]);
00813   }
00814   // und zum Schluss die Gruppenzugehoerigkeit
00815   val = convMatGroups(desc["Gruppenzugehoerigkeit"]);
00816   if (mappingp(val) && sizeof(val)) {
00817     m += ([P_MG_FRACTIONS:val]);
00818   }
00819   return m;
00820 }

varargs string ConvMaterialList ( mixed  mats,
int  casus,
mixed  idinf 
)

Definiert in Zeile 214 der Datei materialdb.c.

Benutzt i, initialized und MaterialName().

00214                                                                     {
00215   if (initialized) {
00216     string *ms,ml;
00217     int i;
00218 
00219     ml="";
00220     if (mappingp(mats))
00221       ms=m_indices(mats);
00222     else if (stringp(mats))
00223       ms=({mats});
00224     else if (pointerp(mats))
00225       ms=mats;
00226     else
00227       ms=({});
00228     i=sizeof(ms);
00229     while(i) {
00230       ml+=MaterialName(ms[--i],casus,idinf);
00231       if (i)
00232         ml+=((i>1)?", ":" und ");
00233     }
00234     return ml;
00235   }
00236 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private int convMatGender ( string  s  ) 

Definiert in Zeile 698 der Datei materialdb.c.

00698                                     {
00699   int gender;
00700   s = lowerstring(s);
00701   // Ein Buchstabe reicht zur Bestimmung. Wenn nur weiblich|female
00702   // bzw. maennlich|male verwendet wird. Dabei ist dann allerdings die
00703   // Reihenfolge der Auswertung wichtig, damit das m bei MALE nicht mehr bei
00704   // female passt.
00705   if (sizeof(regexp( ({s}), "f|w"))) {
00706     gender = FEMALE;
00707   } else if (sizeof(regexp( ({s}), "m"))) {
00708     gender = MALE;
00709   } else {
00710     gender = NEUTER;
00711   }
00712   return gender;
00713 }

private mapping convMatGroups ( string  s  ) 

Definiert in Zeile 758 der Datei materialdb.c.

00758                                         {
00759   mapping groups;
00760   if (!sizeof(regexp( ({s}), "- keine -"))) {
00761     groups = ([]);
00762     // Jede Zeile enthaelt eine Bedingung
00763     map(explode(s, "\n"), #'addGroupLine, groups);
00764   }
00765   return groups;
00766 }

private mapping convMatId ( string  s  ) 

Definiert in Zeile 667 der Datei materialdb.c.

00667                                     {
00668   mapping m;
00669   string* parts;
00670   parts = explode(s, "\"");
00671   if (sizeof(parts)) {
00672     int ende;
00673     ende = strstr(parts[0]," ")-1;
00674     if (ende < 0)
00675       ende = strlen(parts[0]);
00676     m = ([P_ID:parts[0][0..ende]]);
00677     if (sizeof(parts) > 1)
00678       m += ([P_DEFSTR:parts[1]]);
00679   }
00680   return m;
00681 }

private string* convMatNames ( string  s  ) 

Definiert in Zeile 682 der Datei materialdb.c.

00682                                        {
00683   string* names;
00684   names = filter(explode(s, "\""),
00685                        lambda( ({'x}), ({#'>, ({#'strlen, 'x}), 1}) ));
00686   if (sizeof(names)<1)
00687     names=0;
00688   else {
00689     if (sizeof(names)<2)
00690       names+=({names[0]+"s"});
00691     if (sizeof(names)<3)
00692       names+=({names[0]});
00693     if (sizeof(names)<4)
00694       names+=({names[0]});
00695   }
00696   return names;
00697 }

private mixed convMatRec ( string  s  ) 

Definiert in Zeile 737 der Datei materialdb.c.

00737                                    {
00738   mixed difficulties;
00739   if (sizeof(regexp( ({s}), "- keine Einschraenkung -"))) {
00740     difficulties = 0;
00741   } else {
00742     difficulties = ({});
00743     // Jede Zeile enthaelt eine Bedingung
00744     map(explode(s, "\n"), #'addRecocLine, &difficulties);
00745   }
00746   return difficulties;
00747 }

void create (  ) 

Definiert in Zeile 84 der Datei materialdb.c.

Benutzt GenHeaderFile(), initialized, restore_object(), SAVEFILE und Update().

00084               {
00085   seteuid(getuid());
00086   // Savefile einlesen, falls moeglich, damit die DB direkt initialisert ist,
00087   // wenn auch ggf. mit alten Daten.
00088   restore_object(SAVEFILE);
00089   if (initialized) {
00090     // falls erfolgreich, direkt Header fuer die Mudlib schreiben
00091     GenHeaderFile();
00092   }
00093   // jetzt Update der Daten durchfuehren.
00094   Update();
00095 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private varargs void doScanMaterials ( string *  mats,
int  i,
int  step 
)

Definiert in Zeile 861 der Datei materialdb.c.

Benutzt call_out(), LIMIT_EVAL, new_material_groups, new_materials, readMaterialDesc(), scanFinished() und updateGroupMembers().

00861                                                                     {
00862   int ticks, start;
00863   string matid;
00864   start = get_eval_cost();
00865   if (step < 2) {
00866     while ( (i < sizeof(mats)) &&
00867             ((start - get_eval_cost()) < query_limits()[LIMIT_EVAL]/3 ) ) {
00868       matid = mats[i];
00869       switch (step) {
00870       case 0:
00871         // Erster Schritt: Einlesen der Dateien
00872         new_materials[matid] = readMaterialDesc(matid);
00873         break;
00874       case 1:
00875         // Zweiter Schritt: Bearbeiten der Erkennung und Gruppenzugehoerigkeit
00876         updateGroupMembers(new_material_groups, matid, new_materials[matid]);
00877         break;
00878       default:
00879         break;
00880       }
00881       i++;
00882     }
00883   }
00884   if (i < sizeof(mats)) {
00885     catch(raise_error(sprintf("MaterialDB: Initialisierung noch nicht beendet,"
00886                               " fehlende Materialbeschreibungen moeglich"
00887                               " (Phase %d:%d/%d)\n",
00888                               step, i, sizeof(mats)));publish);
00889     call_out(#'doScanMaterials, 2, mats, i, step);
00890   } else {
00891     // Zweite Stufe ausloesen oder beenden
00892     if (step < 1) {
00893       if ((start - get_eval_cost()) < query_limits()[LIMIT_EVAL]/2 )
00894           doScanMaterials(mats, 0, step+1);
00895       else
00896           call_out(#'doScanMaterials, 2, mats, 0, step+1);
00897     }
00898     else
00899       scanFinished();
00900   }
00901   updateTicks += start - get_eval_cost();
00902 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private void dump_group ( string  grp,
string  fn 
)

Definiert in Zeile 436 der Datei materialdb.c.

00437 {
00438   // upperstring langsame simul_efun, warum?
00439   write_file(fn, sprintf("  %-28s%=-48s\n", (grp),
00440                          GroupName(grp))) ||
00441     raise_error(sprintf("Konnte Liste nicht weiter in Datei %s schreiben,"
00442                         " Abbruch\n", fn));
00443 }

private void dump_material ( string  fn  ) 

Definiert in Zeile 420 der Datei materialdb.c.

00421 {
00422   string txt;
00423   string *grps, *mats;
00424   // Gruppenweise ordnen
00425   grps = get_ordered_groups();
00426   mats = AllMaterials();
00427   txt = sprintf("%@s", map(grps, #'gen_material_list_materials_grp,
00428                                  &mats));
00429   // Übriggebliene Materialien ausgeben
00430   txt += "sonstige Materialien:\n";
00431   txt += sprintf("%@s", map(mats, #'gen_material_list_material));
00432   write_file(fn, txt) ||
00433     raise_error(sprintf("Konnte Liste nicht weiter in Datei %s schreiben,"
00434                         " Abbruch\n", fn));
00435 }

private int dump_material_h ( string  fn  ) 

Definiert in Zeile 398 der Datei materialdb.c.

00399 {
00400   return (write_file(fn, gen_material_h_head()) &&
00401           write_file(fn, gen_material_h_materials()) &&
00402           write_file(fn, gen_material_h_groups()) &&
00403           write_file(fn, gen_material_h_foot()));
00404 }

private string gen_doc_foot ( string  other  ) 

Definiert in Zeile 444 der Datei materialdb.c.

00445 {
00446   return sprintf("\nSIEHE AUCH:\n"
00447                  "     Konzepte:    material, materialerkennung\n"
00448                  "     Grundlegend: P_MATERIAL, /sys/materials.h, /sys/thing/material.h\n"
00449                  "     Methoden:    QueryMaterial(), QueryMaterialGroup(), MaterialList(),\n"
00450                  "     Listen:      AllMaterials(), AllGroups()\n"
00451                  "                  %s\n"
00452                  "     Master:      ConvMaterialList(), MaterialGroup(),\n"
00453                  "                  GroupName(), MaterialName(),\n"
00454                  "                  GetGroupMembers(), GetMatMembership()\n"
00455                  "     Sonstiges:   P_MATERIAL_KNOWLEDGE\n\n"
00456                  "%s generiert aus /secure/materialdb\n", other, dtime(time()));
00457 }

private string gen_material_h_foot (  ) 

Definiert in Zeile 393 der Datei materialdb.c.

00394 {
00395   return
00396     "#endif // __THING_MATERIAL_H__\n";
00397 }

private string gen_material_h_group ( string  grp  ) 

Definiert in Zeile 378 der Datei materialdb.c.

00379 {
00380   return sprintf("#define %-27s\"%-18s // %s\n",
00381                  grp, groupKey2Defstr(grp)+"\"", GroupName(grp));
00382 }

private string gen_material_h_groups (  ) 

Definiert in Zeile 383 der Datei materialdb.c.

00384 {
00385   string txt;
00386   txt = "\n// **************************** Materialgruppen ****************************\n\n"
00387     "#ifndef _IS_MATERIALDB_\n";
00388   txt += sprintf("%@s\n", map(sort_array(m_indices(material_groups), #'>),
00389                                     #'gen_material_h_group));
00390   txt += "\n#endif // _IS_MATERIALDB_\n";
00391   return txt;
00392 }

private string gen_material_h_head (  ) 

Definiert in Zeile 336 der Datei materialdb.c.

00337 {
00338   return
00339     "// MorgenGrauen MUDlib\n//\n"
00340     "// materials.h -- material definitions\n//\n"
00341     "// This file is generated by /secure/materialdb.c\n//\n"
00342     "// DO NOT EDIT!\n//\n"
00343     "// $Id: materialdb.c 7209 2009-04-06 21:20:44Z Zesstra $\n\n"
00344     "#ifndef __MATERIALS_H__\n"
00345     "#define __MATERIALS_H__\n\n";
00346 }

private string gen_material_h_material ( string  mat,
string  last_grp 
)

Definiert in Zeile 347 der Datei materialdb.c.

00348 {
00349   mat = old_mat_keys[mat];
00350   return sprintf("#define %-24s\"%-20s // %s\n", mat,
00351                 (member(materials[mat], P_DEFSTR)?materials[mat][P_DEFSTR]:mat)+"\"",
00352                 materials[mat][P_DESCRIPTION]||materials[mat][P_NAME][WER]);
00353 }

private string gen_material_h_materials (  ) 

Definiert in Zeile 363 der Datei materialdb.c.

00364 {
00365   string txt, last_grp;
00366   string *grps, *mats;
00367   txt = "// ****************************** Materialien ******************************\n";
00368   // Gruppenweise ordnen
00369   grps = get_ordered_groups();
00370   mats = AllMaterials();
00371   txt += sprintf("%@s", map(grps, #'gen_material_h_materials_grp,
00372                                   &mats));
00373   // Übriggebliene Materialien ausgeben
00374   txt += "// sonstige Materialien:\n";
00375   txt += sprintf("%@s", map(mats, #'gen_material_h_material));
00376   return txt;
00377 }

private string gen_material_h_materials_grp ( string  grp,
string *  left 
)

Definiert in Zeile 354 der Datei materialdb.c.

00355 {
00356   string txt, *mats;
00357   txt = sprintf("\n// Gruppe: %s\n", GroupName(grp));
00358   mats = GetGroupMembers(grp) - (GetGroupMembers(grp) - left);
00359   txt += sprintf("%@s", map(sort_array(mats, #'>), #'gen_material_h_material));
00360   left -= GetGroupMembers(grp);
00361   return txt;
00362 }

private string gen_material_list_material ( string  mat  ) 

Definiert in Zeile 405 der Datei materialdb.c.

00406 {
00407   mat = old_mat_keys[mat];
00408   return sprintf("  %-28s%=-45s\n", mat,
00409                  materials[mat][P_DESCRIPTION]||materials[mat][P_NAME][WER]);
00410 }

private string gen_material_list_materials_grp ( string  grp,
string *  left 
)

Definiert in Zeile 411 der Datei materialdb.c.

00412 {
00413   string txt, *mats;
00414   txt = sprintf("%s:\n", capitalize(GroupName(grp)));
00415   mats = sort_array(GetGroupMembers(grp) - (GetGroupMembers(grp) - left), #'>);
00416   txt += sprintf("%@s\n", map(mats, #'gen_material_list_material));
00417   left -= GetGroupMembers(grp);
00418   return txt;
00419 }

varargs void GenHeaderFile ( string  fn  ) 

Definiert in Zeile 510 der Datei materialdb.c.

Wird benutzt von create().

00511 {
00512   if (initialized) {
00513     string txt;
00514     if (!stringp(fn) || !strlen(fn))
00515       fn = HEADERFILE;
00516     if (file_size(fn) >= 0) {
00517       printf("Datei %s existiert bereits, loesche sie\n", fn);
00518       rm(fn);
00519     }
00520     if (dump_material_h(fn))
00521       printf("Headerdatei erfolgreich in %s geschrieben\n", fn);
00522     else
00523       printf("Konnte Headerdatei nicht in Datei %s schreiben, Abbruch\n", fn);
00524   }
00525 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

varargs void GenMatGroupList ( string  fn  ) 

Definiert in Zeile 486 der Datei materialdb.c.

00487 {
00488   if (initialized) {
00489     string txt;
00490     if (!stringp(fn) || !strlen(fn))
00491       fn = DOC_DIR("materialgruppen");
00492     if (file_size(fn) >= 0) {
00493       printf("Datei %s existiert bereits, loesche sie\n", fn);
00494       rm(fn);
00495     }
00496     if (write_file(fn, "Materialgruppen\n===============\n")) {
00497       map(sort_array(m_indices(material_groups), #'>), #'dump_group, fn);
00498       write_file(fn, gen_doc_foot("materialliste"));
00499       printf("Materialliste erfolgreich in Datei %s geschrieben\n", fn);
00500     } else
00501       printf("Konnte Liste nicht in Datei %s schreiben, Abbruch\n", fn);
00502   }
00503 }

varargs void GenMatList ( string  fn  ) 

Definiert in Zeile 463 der Datei materialdb.c.

00464 {
00465   if (initialized) {
00466     string txt;
00467     if (!stringp(fn) || !strlen(fn))
00468       fn = DOC_DIR("materialliste");
00469     if (file_size(fn) >= 0) {
00470       printf("Datei %s existiert bereits, loesche sie\n", fn);
00471       rm(fn);
00472     }
00473     if (write_file(fn, "Material Liste\n==============\n\n")) {
00474       dump_material(fn);
00475       write_file(fn, gen_doc_foot("materialgruppen"));
00476       printf("Materialliste erfolgreich in Datei %s geschrieben\n", fn);
00477     } else
00478       printf("Konnte Liste nicht in Datei %s schreiben, Abbruch\n", fn);
00479   }
00480 }

private string* get_ordered_groups (  ) 

Definiert in Zeile 326 der Datei materialdb.c.

00327 {
00328   return ({"MATGROUP_WOOD", "MATGROUP_JEWEL", "MATGROUP_STONE", "MATGROUP_MAGNETIC",
00329            "MATGROUP_METAL", "MATGROUP_DRUG", "MATGROUP_HERBAL", "MATGROUP_FLEXIBLE",
00330            "MATGROUP_BIO", "MATGROUP_ACIDIC", "MATGROUP_BASIC", "MATGROUP_POISONOUS",
00331            "MATGROUP_EXPLOSIVE", "MATGROUP_INFLAMMABLE",
00332            "MATGROUP_ELEMENTAL", "MATGROUP_ELECTRICAL", "MATGROUP_MAGIC",
00333            "MATGROUP_HOLY", "MATGROUP_UNHOLY", "MATGROUP_INVIS",
00334            "MATGROUP_SOLID", "MATGROUP_FLUID", "MATGROUP_GAS"});
00335 }

private mapping getDescParts ( string  s  ) 

Definiert in Zeile 610 der Datei materialdb.c.

00610                                        {
00611   string* lines;
00612   string key, val;
00613   int i, n;
00614   mapping m;
00615   m = ([]);
00616   val = "";
00617   lines = explode(s, "\n");
00618   n = sizeof(lines);
00619   if (n > 0) {
00620     while (i < n) {
00621       if (sscanf(lines[i], "%s:", key)) {
00622         status multiline;
00623         multiline = 0;
00624         // Schluessel gefunden, Wert auslesen
00625         while ( (++i < n) && strlen(lines[i])) {
00626           // Mehrzeilige Werte mit newline verketten
00627           if (multiline) {
00628             val += "\n";
00629           }
00630           val += lines[i];
00631           multiline = 1;
00632         }
00633         m += ([key:val]);
00634         val = "";
00635       }
00636       i++;
00637     }
00638   }
00639   return m;
00640 }

string * GetGroupMembers ( string  grp  ) 

Definiert in Zeile 294 der Datei materialdb.c.

Benutzt getMatGroupId(), initialized, material_groups und P_MEMBERS.

00294                                     {
00295   if (initialized) {
00296     string *mats;
00297     // Anpassen der Materialid
00298     grp = getMatGroupId(grp);
00299     if (!member(material_groups, grp) ||
00300                 !pointerp(mats=material_groups[grp][P_MEMBERS]))
00301       return ({});
00302     return map(mats, #'matKey2Defstr, materials);
00303   }
00304   return 0;
00305 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private string getMatGroupId ( string  key  ) 

Definiert in Zeile 104 der Datei materialdb.c.

Benutzt material_groups und upperstring().

Wird benutzt von GetGroupMembers() und MaterialGroup().

00104                                          {
00105   // Alte Bezeichner umwandeln
00106   if (!member(material_groups, key))
00107     key = "MATGROUP_"+upperstring(key[3..]);
00108   return key;
00109 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private string getMatId ( string  key  ) 

Definiert in Zeile 98 der Datei materialdb.c.

Benutzt materials und old_mat_keys.

Wird benutzt von MaterialGroup() und MaterialName().

00098                                     {
00099   // Alte Bezeichner umwandeln
00100   if (!member(materials, key))
00101     key = old_mat_keys[key];
00102   return key;
00103 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

string * GetMatMembership ( string  mat  ) 

Definiert in Zeile 281 der Datei materialdb.c.

00281                                      {
00282   if (initialized) {
00283     mapping props;
00284     // Anpassen der Materialid
00285     mat = getMatId(mat);
00286 
00287     if (!mappingp(props=materials[mat]))
00288       return ({});
00289     return map(m_indices(props[P_MG_FRACTIONS]), #'groupKey2Defstr);
00290   }
00291   return 0;
00292 }

public int GetUpdateTicks (  ) 

Definiert in Zeile 836 der Datei materialdb.c.

00836                             {
00837   return updateTicks;
00838 }

string GroupDescription ( string  grp  ) 

Definiert in Zeile 316 der Datei materialdb.c.

00316                                     {
00317   if (initialized) {
00318     if (member(material_groups, getMatGroupId(grp)))
00319       return material_groups[getMatGroupId(grp)][P_DESCRIPTION];
00320     else
00321       return "Gruppe unbekannt";
00322   }
00323 }

private string groupKey2Defstr ( string  key  ) 

Definiert in Zeile 118 der Datei materialdb.c.

Benutzt lowerstring().

00118                                            {
00119   if (strlen(key) > 9)
00120     key = "mg_"+lowerstring(key[9..]);
00121   else
00122     key = "";
00123   return key;
00124 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string GroupName ( string  grp  ) 

Definiert in Zeile 307 der Datei materialdb.c.

00307                              {
00308   if (initialized) {
00309     if (member(material_groups, getMatGroupId(grp)))
00310       return material_groups[getMatGroupId(grp)][P_NAME];
00311     else
00312       return "Unbekanntes";
00313   }
00314 }

private varargs int isFile ( string  fn,
string  path 
)

Definiert in Zeile 641 der Datei materialdb.c.

00641                                                    {
00642   if (stringp(path) && strlen(path))
00643     fn = path+"/"+fn;
00644   return (file_size(fn) >= 0);
00645 }

public int IsScanning (  ) 

Definiert in Zeile 857 der Datei materialdb.c.

Benutzt isScanning.

00857                         {
00858   return isScanning;
00859 }

int MaterialGroup ( mapping  mats,
string  grp 
)

Definiert in Zeile 238 der Datei materialdb.c.

Benutzt getMatGroupId(), getMatId(), i, initialized, materials und P_MG_FRACTIONS.

00238                                             {
00239    if (initialized) {
00240      string *ms;
00241      int i,res;
00242 
00243      res=0;
00244      if (!mappingp(mats) || !stringp(grp))
00245        return res;
00246      ms=m_indices(mats);
00247      i=sizeof(ms);
00248      while(i--) {
00249        string mat;
00250        mapping props;
00251        mat=ms[i];
00252        if (mappingp(props=materials[getMatId(mat)]))
00253          res+=(mats[mat]*props[P_MG_FRACTIONS][getMatGroupId(grp)])/100;
00254      }
00255      if (res<-100) // Vielleicht noch Antimaterie zulassen
00256        res=-100;   // (noch nicht sicher ob das so bleiben wird oder 0 sein wird)
00257      if (res>100)
00258        res=100;
00259      return res;
00260    }
00261 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs string MaterialName ( string  mat,
int  casus,
mixed  idinf 
)

Definiert in Zeile 127 der Datei materialdb.c.

Benutzt getMatId(), i, initialized, MATERIAL_SYMMETRIC_RECOGNIZABILITY, materials, P_MATERIAL_KNOWLEDGE, P_MG_FRACTIONS, P_NAME, P_RECOC und x.

Wird benutzt von ConvMaterialList().

00127                                                                 {
00128   if (initialized) {
00129     string *names;
00130     mapping props;
00131     mixed *dif;
00132     // Anpassen der Materialid
00133     mat = getMatId(mat);
00134 
00135     if (!mappingp(props=materials[mat]))
00136       props=([]);
00137 
00138     // Je nach Koennen des Spielers kann man das exakte Material
00139     // mehr oder weniger gut erkennen:
00140     if (pointerp(dif=props[P_RECOC])
00141 && (!intp(idinf)||idinf<100) ) { // 100=exakte Erkennung
00142       int i, n, recval;
00143       mixed *grps, tmp, x;
00144 
00145       recval=0;
00146       grps=props[P_MG_FRACTIONS];
00147       if (!pointerp(idinf))
00148         idinf=({idinf});
00149 
00150       // Zunaechst die Faehigkeit des Spielers (da koennen noch
00151       // Gildenfaehigkeiten hinzu kommen) ermitteln, dieses
00152       // Material zu erkennen:
00153       i=sizeof(idinf);
00154       while(i--) {
00155         tmp=idinf[i];
00156         if (objectp(tmp)) // Diese Property ist hauptsaechlich fuer Rassen:
00157           tmp=tmp->QueryProp(P_MATERIAL_KNOWLEDGE);
00158         if (intp(tmp)) {
00159           recval+=tmp; // Allgemeine Erkennungsfaehigkeit
00160           break;
00161         }
00162         if (closurep(tmp) && intp(x=funcall(tmp,mat,grps))) {
00163           recval+=x;
00164           break; // Closures koennen immer nuetzlich sein :)
00165         }
00166         if (mappingp(tmp)) {
00167           int j;
00168           if ((x=tmp[mat]) && intp(x)){
00169             // Erkennung von speziell diesem Material
00170             recval+=x;
00171             break;
00172           }
00173           // Erkennung von Gruppen
00174           j=sizeof(grps);
00175           while(j--)
00176             if((x=tmp[grps[j]]) && intp(x))
00177               recval+=x;
00178           if (pointerp(tmp=tmp[MATERIAL_SYMMETRIC_RECOGNIZABILITY])) {
00179             for (j=sizeof(tmp)-2;j>=0;j-=2) {
00180               if (!intp(x=tmp[j+1]))
00181                 raise_error("materialdb: illegal sym.recoc. format\n");
00182               if (props[tmp[j]])
00183                 recval+=x;
00184               else // bei passenden Gruppen +, bei anderen -
00185                 recval-=x;
00186             }
00187           }
00188         }
00189       }
00190 
00191       // Jetzt wird ermittelt, ob vielleicht eine ungenauere
00192       // Beschreibung gegeben werden soll:
00193       x=dif[0];
00194       n = sizeof(dif)-1;
00195       for (i=2;i<=n;i+=2) {
00196         if (recval>=dif[i-1])
00197           x=dif[i];
00198       }
00199       // Wenn die Faehigkeiten des Spielers nicht fuer den echten Klarnamen
00200       // ausreichen, gib die Alternative zurueck:
00201       if (x!=mat)
00202         return MaterialName(x, casus, 100);
00203     }
00204 
00205     if (!pointerp(names=props[P_NAME]) || sizeof(names)<4)
00206       names=({"unbekanntes Material", "unbekannten Materials",
00207               "unbekanntem Material", "unbekannten Material"});
00208     if (casus<0 || casus>3)
00209       casus=0;
00210     return names[casus];
00211   }
00212 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private string matKey2Defstr ( string  key,
mapping  mats 
)

Definiert in Zeile 110 der Datei materialdb.c.

Benutzt id() und P_DEFSTR.

00110                                                        {
00111   string id;
00112   if (member(mats[key], P_DEFSTR))
00113     id = mats[key][P_DEFSTR];
00114   else
00115     id = key;
00116   return id;
00117 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private varargs mixed readGroupDesc ( string  id  ) 

Definiert in Zeile 647 der Datei materialdb.c.

Wird benutzt von ScanGroups().

00647                                                {
00648   mixed m;
00649   string fn;
00650   fn = MAT_DIR+"/groups/"+id;
00651   if (file_size(fn) > 0) {
00652     mapping parts;
00653     string desc;
00654     parts = getDescParts(read_file(fn));
00655     m = ([P_NAME:parts["Name"],
00656           P_MEMBERS:({})]);
00657     if (member(parts,"Beschreibung"))
00658       m += ([P_DESCRIPTION:parts["Beschreibung"]]);
00659     if (parts["Gruppenid"] != id)
00660       LOG_WARN(sprintf("Unstimmigkeit Gruppenid bei '%s'\n", id));
00661   } else {
00662     LOG_ERROR(sprintf("Kann Gruppenbeschreibung %s nicht laden\n", fn));
00663   }
00664   return m;
00665 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private varargs mixed readMaterialDesc ( string  id  ) 

Definiert in Zeile 821 der Datei materialdb.c.

Wird benutzt von doScanMaterials().

00821                                                   {
00822   mixed m;
00823   string fn;
00824   fn = MAT_DIR+"/materials/"+id;
00825   if (file_size(fn) > 0) {
00826     mapping parts;
00827     string desc;
00828     parts = getDescParts(read_file(fn));
00829     m = convMaterialDesc(id, parts);
00830   } else {
00831     LOG_ERROR(sprintf("MDB:Kann Materialbeschreibung %s nicht laden\n", fn));
00832   }
00833   return m;
00834 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private void scanFinished (  ) 

Definiert in Zeile 840 der Datei materialdb.c.

Wird benutzt von doScanMaterials().

00840                             {
00841   isScanning = 0;
00842   initialized = 1;
00843   // Mappings umkopieren
00844   materials = new_materials;
00845   material_groups = new_material_groups;
00846   // Letzter Schritt: Mapping mit alten Schluesseln anlegen
00847   old_mat_keys = mkmapping(map(m_indices(materials), #'matKey2Defstr, materials),
00848                            m_indices(materials));
00849   // Generieren der Doku und des Materialheaders
00850   GenHeaderFile();
00851   GenMatList();
00852   GenMatGroupList();
00853   // Savefile schreiben
00854   save_object(SAVEFILE);
00855 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private mapping ScanGroups (  ) 

Definiert in Zeile 904 der Datei materialdb.c.

Benutzt MAT_DIR und readGroupDesc().

00904                              {
00905   mapping groups;
00906   string* grpfiles;
00907   groups = ([]);
00908   grpfiles = filter(get_dir(MAT_DIR+"/groups/MATGROUP_*"),
00909                           #'isFile, MAT_DIR+"/groups");
00910   groups = mkmapping(grpfiles, map(grpfiles, #'readGroupDesc, 1));
00911   return groups;
00912 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private void ScanMaterials (  ) 

Definiert in Zeile 914 der Datei materialdb.c.

Benutzt MAT_DIR.

00914                              {
00915   string *matfiles;
00916   matfiles = filter(get_dir(MAT_DIR+"/materials/MAT_*"),
00917                           #'isFile, MAT_DIR+"/materials");
00918   doScanMaterials(matfiles);
00919 }

void Update (  ) 

Definiert in Zeile 921 der Datei materialdb.c.

Wird benutzt von create().

00921               {
00922   int start;
00923   updateTicks = 0;
00924   start = get_eval_cost();
00925   if (!isScanning) {
00926     if (sizeof(get_dir(MAT_DIR))) {
00927       isScanning = 1;
00928       new_material_groups = ScanGroups();
00929       new_materials = ([]);
00930       updateTicks = start - get_eval_cost();
00931       ScanMaterials();
00932     } else {
00933       LOG_ERROR("Kann Materialverzeichnis nicht finden, keine Materialien angelegt!\n");
00934     }
00935   }
00936 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private void updateGroupMembers ( mapping  groups,
string  mat_id,
mapping  mat 
)

Definiert in Zeile 528 der Datei materialdb.c.

Wird benutzt von doScanMaterials().

00528                                                                             {
00529   mixed *addgrps; // Array zum Ableiten von Gruppenzugehoerigkeiten
00530   string *h;
00531   int i, val;
00532   mapping fractions; // Mapping mit Anteilen an Gruppen
00533   fractions = mat[P_MG_FRACTIONS];
00534   if (!mappingp(fractions))
00535     fractions = ([]);
00536   addgrps=({ // Reihenfolge wird rueckwaerts abgearbeitet
00537     // Ableitungen sind z.T. abenteuerlich gewesen, mal ordentlich
00538     // ausmisten. Die Zugehoerigkeit gehoert explizit in die
00539     // Materialdefinition
00540     // Gase sieht man normalerweise nicht:
00541     ({"MATGROUP_INVIS", "MATGROUP_GAS"}),
00542     // Mineralien sind auch Steine
00543     ({"MATGROUP_STONE","MATGROUP_MINERAL"}),
00544     // Edelmetalle sind Metalle:
00545     ({"MATGROUP_METAL","MATGROUP_PRECIOUS_METAL"}),
00546     // Lebewesen und deren Ueberreste, Paiere und Stoffe sind biologisch
00547     ({"MATGROUP_BIO","MATGROUP_LIVING","MATGROUP_DEAD",
00548       "MATGROUP_PAPER"}),
00549     // Holz ist pflanzlich:
00550     ({"MATGROUP_HERBAL", "MATGROUP_WOOD"}),
00551     // Holz ist meistens tot:
00552     ({"MATGROUP_DEAD","MATGROUP_WOOD"}),
00553     // Holz, Papier und Stoffe brennen:
00554     ({"MATGROUP_INFLAMMABLE","MATGROUP_WOOD","MATGROUP_PAPER"}),
00555     // Laubhoelzer, Nadelhoelzer und Tropenhoelzer sind Holz
00556     ({"MATGROUP_WOOD","MATGROUP_TROPICAL_WOOD","MATGROUP_DECIDUOUS_WOOD",
00557       "MATGROUP_CONIFER_WOOD"}),
00558     // Explosive Dinge sind immer entzuendlich:
00559     ({"MATGROUP_INFLAMMABLE","MATGROUP_EXPLOSIVE"})
00560   });
00561   i=sizeof(addgrps);
00562   while(i--) {
00563     int j;
00564     h=addgrps[i];
00565     if (member(fractions,h[0])) // Existiert schon eigener Eintrag?
00566       continue; // Automatische Eintragung unnoetig
00567     val=0;
00568     for (j=sizeof(h)-1;j>=1;j--)
00569       val+=fractions[h[j]];
00570     if (!val)
00571       continue;
00572     if (val>100)
00573       val=100;
00574     else if (val<-100)
00575       val=-100;
00576     fractions[h[0]]=val;
00577   }
00578   if (fractions["MATGROUP_LIVING"]) // Im Falle von lebendem Holz, tot loeschen
00579     efun::m_delete(fractions,"MATGROUP_DEAD");
00580   // Alles, was nicht als gasfoerming, fluessig oder fest eingeordnet ist, ist
00581   // sonstwas:
00582   if (!member(fractions, "MATGROUP_FLUID")
00583       && !member(fractions, "MATGROUP_GAS")
00584       && !member(fractions, "MATGROUP_SOLID"))
00585     fractions["MATGROUP_MISC"]=100;
00586   // Materialien als Mitglieder in die Gruppen eintragen
00587   addgrps=m_indices(fractions);
00588   i=sizeof(addgrps);
00589   while(i--) {
00590     mixed ind;
00591     ind=addgrps[i];
00592     if (!fractions[ind] || !member(groups, ind)) {
00593       // Unbekannte Gruppe und Gruppe ohne Anteil aus Mapping loeschen
00594       efun::m_delete(fractions,ind);
00595       continue;
00596     }
00597     if (!pointerp(h=groups[ind][P_MEMBERS]))
00598       h=({});
00599     h+=({mat_id});
00600     groups[ind][P_MEMBERS]=h;
00601   }
00602   mat[P_MG_FRACTIONS] = fractions;
00603 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:


Variablen-Dokumentation

private status initialized
private nosave status isScanning

Definiert in Zeile 81 der Datei materialdb.c.

Wird benutzt von IsScanning().

mapping material_groups

Definiert in Zeile 76 der Datei materialdb.c.

Wird benutzt von AllGroups(), GetGroupMembers() und getMatGroupId().

mapping materials

Definiert in Zeile 75 der Datei materialdb.c.

Wird benutzt von getMatId(), MaterialGroup() und MaterialName().

nosave mapping new_material_groups

Definiert in Zeile 80 der Datei materialdb.c.

Wird benutzt von doScanMaterials().

nosave mapping new_materials

Definiert in Zeile 79 der Datei materialdb.c.

Wird benutzt von doScanMaterials().

mapping old_mat_keys

Definiert in Zeile 78 der Datei materialdb.c.

Wird benutzt von AllMaterials() und getMatId().

private nosave int updateTicks

Definiert in Zeile 82 der Datei materialdb.c.

Erzeugt am Thu Jun 3 14:41:39 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3