#include <language.h>#include <thing/description.h>#include <thing/material.h>#include <player/description.h>#include <rtlimits.h>
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 |
| #define _SKIP_MATERIALS_ |
Definiert in Zeile 26 der Datei materialdb.c.
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, | |||
| y | ) | LOG_ERROR(sprintf("Materialbeschreibung '%s': %s\n", x, y)) |
Definiert in Zeile 607 der Datei materialdb.c.
| #define MDESC_WARN | ( | x, | |||
| y | ) |
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.
| private void addGroupLine | ( | string | s, | |
| mapping | g | |||
| ) |
Definiert in Zeile 748 der Datei materialdb.c.
| 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.
| 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 }

| 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.
| 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 }

| 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 }

| 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.
| 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 }

| 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 }

| 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 }


| 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 }

| 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 }

| 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.
| 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 }

| 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 }


| private string matKey2Defstr | ( | string | key, | |
| mapping | mats | |||
| ) |
| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| private status initialized |
Definiert in Zeile 77 der Datei materialdb.c.
Wird benutzt von AllGroups(), AllMaterials(), ConvMaterialList(), create(), GetGroupMembers(), MaterialGroup() und MaterialName().
| 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.
1.6.3