#include <defines.h>#include <properties.h>#include <wizlevels.h>#include <terminal.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | DATAFILE "test.dat" |
| #define | DEFAULT_DATA "/obj/tools/tester/test.dat" |
| #define | P_OTEST_TYP "ob-test:typ" |
| #define | P_OTEST_SPL "ob-test:spalten" |
| #define | T_ROCHUS 1 |
| #define | T_RIKUS 2 |
| #define | T_PAUSE 4 |
Funktionen | |
| string | x_long () |
| void | create () |
| void | init () |
| void | Output (string text) |
| int | removen () |
| string * | gross (string s) |
| string * | det_auswerten (string input) |
| varargs mixed | test_details (string str, string def) |
| string * | eval_detail_entry (mixed key) |
| int | search_d (object r) |
| int | search_sense (object r, int sense) |
| int | search_n (object r) |
| int | search_m (object r) |
| int | search (string arg) |
| int | scanart (string arg) |
| int | spaltenzahl (string arg) |
| int | dirtesten (string arg) |
| void | x_heart_beat () |
Variablen | |
| inherit std | thing |
| int | scantyp |
| int | spalten |
| mapping | all_dets |
| mixed | output |
| object | master |
| int | scanrun |
| int | scancount |
| int | scanpause |
| int * | scanerr |
| string | scandir |
| string * | scanfiles |
| object | testob |
| #define P_OTEST_SPL "ob-test:spalten" |
Definiert in Zeile 102 der Datei test.c.
Wird benutzt von spaltenzahl().
| #define P_OTEST_TYP "ob-test:typ" |
| #define T_PAUSE 4 |
Definiert in Zeile 107 der Datei test.c.
Wird benutzt von dirtesten(), x_heart_beat() und x_long().
| #define T_ROCHUS 1 |
| void create | ( | ) |
Definiert in Zeile 167 der Datei test.c.
Benutzt all_dets, create(), ME, output, P_LONG, P_SHORT, scancount, scandir, scanerr, scanfiles, scanpause, scanrun, scantyp, Set(), SetProp(), spalten und T_ROCHUS.
00168 { 00169 if (!clonep(ME)) 00170 return; 00171 00172 ::create(); 00173 00174 // Allgemeine globale Variablen initialisieren 00175 00176 scantyp = T_ROCHUS; 00177 spalten = 4; 00178 all_dets = ([]); 00179 output = 0; 00180 00181 // Globale Variablen fuer den Directoryscan initialisieren 00182 00183 scandir = 0; 00184 scanrun = 0; 00185 scanfiles = ({}); 00186 scancount = 0; 00187 scanpause = 0; 00188 scanerr = ({0,0}); 00189 00190 // Properties 00191 00192 SetProp(P_SHORT,"Ein Objektpruefer") ; 00193 Set(P_LONG,#'x_long,F_QUERY_METHOD); 00194 SetProp(P_NAME,"Objektpruefer"); 00195 SetProp(P_GENDER,MALE); 00196 SetProp(P_AUTOLOADOBJ,1); 00197 SetProp(P_VALUE,0); 00198 SetProp(P_WEIGHT,0); 00199 SetProp(P_NODROP,1); 00200 SetProp(P_NEVERDROP,1); 00201 00202 AddId( ({"pruefer","objektpruefer"}) ); 00203 00204 AddCmd( "otest","search" ); 00205 AddCmd( "otype","scanart" ); 00206 AddCmd( "ocolm","spaltenzahl" ); 00207 AddCmd( "otdir","dirtesten" ); 00208 }

| string* det_auswerten | ( | string | input | ) |
Definiert in Zeile 254 der Datei test.c.
00255 { string *words,str,*re; 00256 int anf,n,i; 00257 00258 if (scantyp==T_RIKUS) 00259 return gross(input); 00260 00261 re = ({}); 00262 if (!input || !stringp(input)) 00263 return re; 00264 00265 words=regexplode(input,"[^A-Za-z0-9]"); 00266 n=sizeof(words); 00267 if (!n) 00268 return re; 00269 00270 anf=1; 00271 for (i=0;i<n;i++) 00272 { 00273 str=words[i]; 00274 if (str=="" || str==" ") 00275 continue; 00276 if (str=="." || str==":" || str=="?" || str=="!") 00277 { 00278 anf=1; 00279 continue; 00280 } 00281 if (sizeof(regexp(({str}),"[^A-Za-z0-9]"))) 00282 continue; 00283 if (sizeof(regexp(({str}),"\\<[0-9]*\\>"))) 00284 continue; 00285 if (str!=capitalize(str)) 00286 continue; 00287 if (anf) 00288 { 00289 anf=0; 00290 continue; 00291 } 00292 re += ({ str }); 00293 } 00294 return re; 00295 }
| int dirtesten | ( | string | arg | ) |
Definiert in Zeile 940 der Datei test.c.
Benutzt break_string(), call_out(), dtime(), IS_LEARNER, master, ME, notify_fail(), output, P_TESTPLAYER, PL, removen(), scancount, scandir, scanerr, scanfiles, scanrun, T_PAUSE und time2string().
00941 { string vz,af,u,*dir; 00942 int i,si; 00943 00944 if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL)) 00945 return removen(); 00946 00947 if (scanrun) 00948 { 00949 write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n"); 00950 return 1; 00951 } 00952 00953 if (object_name(ME)[0..2]=="/p/") 00954 { 00955 write(break_string("Ein Dirscan kann nur durchgefuehrt werden, "+ 00956 "wenn man den Pruefer in sein /players/-Verzeichnis kopiert "+ 00957 "hat oder von einem dort liegenden Objekt inherited.",78, 00958 "OTEST: ")); 00959 return 1; 00960 } 00961 00962 notify_fail("OTEST-Syntax: otdir <verzeichnis> <ausgabefile>\n"); 00963 if (!arg || !stringp(arg) || sscanf(arg,"%s %s",vz,af)!=2) 00964 return 0; 00965 00966 // Zielfilename testen/festlegen. 00967 00968 u=getuid(PL); 00969 if (file_size("/log/"+u+"/")!=-2) 00970 { 00971 printf("OTEST: Es existiert kein Verzeichnis '/log/%s/'\n",u); 00972 return 1; 00973 } 00974 for (i=strlen(af)-1;i>=0;i--) 00975 if (((si=af[i])<48 && si!=46) || (si>57 && si<65) || si>122 || 00976 (si>90 && si<97)) 00977 { 00978 write("OTEST: Illegaler Filename fuer Ausgabefile.\n"); 00979 return 1; 00980 } 00981 u=sprintf("/log/%s/%s",u,af); 00982 00983 // Zu untersuchendes Verzeichnis pruefen/einlesen. 00984 00985 if (!vz || !stringp(vz) || strlen(vz)<3 || vz[0]!='/' || vz[<1]!='/') 00986 { 00987 write("OTEST: Verzeichnisname muss mit '/' beginnen und aufhoeren.\n"); 00988 return 1; 00989 } 00990 for (i=strlen(af)-1;i>=0;i--) 00991 if (((si=af[i])<46) || (si>57 && si<65) || si>122 || (si>90 && si<97)) 00992 { 00993 write("OTEST: Illegaler Filename fuer Verzeichnis.\n"); 00994 return 1; 00995 } 00996 dir = get_dir(vz+"*.c"); 00997 if ((si=sizeof(dir))<1) 00998 { 00999 write("OTEST: Das gewuenschte Verzeichnis existiert nicht oder ist "+ 01000 "leer.\n"); 01001 return 1; 01002 } 01003 01004 output = u; 01005 01006 if (u=catch(write_file(output, 01007 sprintf("Teststart: %s\n\n",dtime(time())))) && stringp(u)) 01008 { 01009 write(break_string( 01010 sprintf("Fehler beim Schreiben in das File %s:\n%sAborting.", 01011 output,u),78,"OTEST: ",1)); 01012 output = 0; 01013 return 1; 01014 } 01015 01016 scanrun = si+1; 01017 scanfiles = dir; 01018 scandir = vz; 01019 scancount = 0; 01020 master = PL; 01021 scanerr = ({0,0}); 01022 01023 call_out("x_heart_beat",T_PAUSE); 01024 01025 printf("OTEST: Scanne %d Files:\n"+ 01026 " %s => %s\n"+ 01027 "Zeit: etwa %s\n",si,vz,output, 01028 time2string("%h:%02m:%02s",si*4*T_PAUSE)); 01029 01030 return 1; 01031 }

| string* eval_detail_entry | ( | mixed | key | ) |
Definiert in Zeile 331 der Datei test.c.
00332 { mixed re,h; 00333 string *ra; 00334 int i; 00335 00336 if (!key || !stringp(key) || !mappingp(all_dets) || !member(all_dets,key)) 00337 return ({}); 00338 00339 re=all_dets[key]; 00340 if (closurep(re)) 00341 re=funcall(re,key); 00342 if (mappingp(re)) 00343 { 00344 ra=filter(m_indices(re),#'stringp); 00345 for ( h=({ re[0] }),i=sizeof(ra)-1 ; i>=0 ; i-- ) 00346 if (stringp(re[ra[i]])) 00347 h += ({ re[ra[i]] }); 00348 else if (pointerp(re[ra[i]])) 00349 h += re[ra[i]]; 00350 re=h; 00351 } 00352 if (pointerp(re)) 00353 return filter(re,#'stringp); 00354 if (stringp(re)) 00355 return ({ re }); 00356 return ({}); 00357 }
| string* gross | ( | string | s | ) |
| void init | ( | ) |
Definiert in Zeile 210 der Datei test.c.
00211 { 00212 ::init(); 00213 if (PL->QueryProp(P_TESTPLAYER) || IS_LEARNER(PL)) 00214 { 00215 scantyp=(PL->QueryProp(P_OTEST_TYP)||T_ROCHUS); 00216 spalten=(PL->QueryProp(P_OTEST_SPL)||4); 00217 return; 00218 } 00219 if (find_call_out("removen") == -1) 00220 call_out("removen",0); 00221 }
| void Output | ( | string | text | ) |
Definiert in Zeile 230 der Datei test.c.
Wird benutzt von x_heart_beat().
00231 { 00232 if (!text || !stringp(text)) 00233 return; 00234 if (objectp(output)) 00235 output->More(text); 00236 else if (stringp(output)) 00237 write_file(output,text); 00238 else 00239 write(text); 00240 }

| int removen | ( | ) |
Definiert in Zeile 242 der Datei test.c.
Wird benutzt von dirtesten(), scanart(), search() und spaltenzahl().
00243 { 00244 write("Dieses Tool ist nur fuer Testies und Magier!\n"); 00245 remove(); 00246 return 1; 00247 }

| int scanart | ( | string | arg | ) |
Definiert in Zeile 838 der Datei test.c.
Benutzt F_MODE_AS, h, IS_LEARNER, notify_fail(), P_OTEST_TYP, P_TESTPLAYER, PL, removen(), SAVE, scanrun, scantyp, T_RIKUS und T_ROCHUS.
00839 { int h; 00840 00841 if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL)) 00842 return removen(); 00843 00844 if (scanrun) 00845 { 00846 write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n"); 00847 return 1; 00848 } 00849 00850 notify_fail("OTEST-Syntax: otype [rikus|rochus]\n"); 00851 if (!arg || !stringp(arg)) 00852 { 00853 if (h=PL->QueryProp(P_OTEST_TYP)) 00854 scantyp=h; 00855 if (!h) 00856 { 00857 PL->SetProp(P_OTEST_TYP,scantyp); 00858 PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS); 00859 } 00860 printf("OTEST: Eingestellter Scantyp ist '%s'\n", 00861 (scantyp==T_ROCHUS?"ROCHUS":"RIKUS")); 00862 return 1; 00863 } 00864 if (member(({"rikus","rochus"}),arg)==-1) 00865 return 0; 00866 if (arg=="rochus") 00867 { 00868 scantyp=T_ROCHUS; 00869 PL->SetProp(P_OTEST_TYP,scantyp); 00870 PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS); 00871 write("OTEST: Eingestellter Scantyp ist 'ROCHUS'\n"); 00872 return 1; 00873 } 00874 scantyp=T_RIKUS; 00875 PL->SetProp(P_OTEST_TYP,scantyp); 00876 PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS); 00877 write("OTEST: Eingestellter Scantyp ist 'RIKUS'\n"); 00878 return 1; 00879 }

| int search | ( | string | arg | ) |
Definiert in Zeile 752 der Datei test.c.
Benutzt IS_LEARNER, master, notify_fail(), old_explode(), output, P_TESTPLAYER, PL, removen(), scanrun, search_d(), search_m() und search_n().
Wird benutzt von eval_command().
00753 { string *in,dum; 00754 object targ; 00755 int wo; 00756 00757 if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL)) 00758 return removen(); 00759 00760 if (scanrun) 00761 { 00762 write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n"); 00763 return 1; 00764 } 00765 00766 notify_fail("OTEST-Syntax: otest [detail|smell|sound] "+ 00767 "{<objekt>[in mir|im raum]|hier}\n"); 00768 00769 if (!arg || !stringp(arg) || sizeof(in=old_explode(arg," "))<1) 00770 { 00771 output=PL; 00772 scanrun=0; 00773 master=PL; 00774 return search_d(environment(PL)); 00775 } 00776 00777 if (sizeof(in)>1) 00778 { 00779 arg=implode(in[1..]," "); 00780 if (member(({"hier","raum",""}),arg)!=-1) 00781 targ=environment(PL); 00782 else 00783 { 00784 if (sscanf(arg,"%s in mir",dum)) 00785 { 00786 wo=1; 00787 arg=dum; 00788 } 00789 else if (sscanf(arg,"%s im raum",dum)) 00790 { 00791 wo=-1; 00792 arg=dum; 00793 } 00794 else wo=0; 00795 if (wo!=-1) 00796 targ=present(arg,PL); 00797 if (!objectp(targ) && wo!=1) 00798 targ=present(arg,environment(PL)); 00799 } 00800 } 00801 else 00802 targ=environment(PL); 00803 if (!objectp(targ)) 00804 { 00805 write("OTEST-ERROR: Gewuenschtes Ziel nicht gefunden.\n"); 00806 return 0; 00807 } 00808 00809 output=PL; 00810 scanrun=0; 00811 master=PL; 00812 00813 switch(in[0]) 00814 { 00815 case "de" : 00816 case "detail" : 00817 case "details" : 00818 return search_d(targ); 00819 case "sm" : 00820 case "smell" : 00821 case "smells" : 00822 return search_m(targ); 00823 case "so" : 00824 case "sound" : 00825 case "sounds" : 00826 return search_n(targ); 00827 } 00828 return 0; 00829 }


| int search_d | ( | object | r | ) |
Definiert in Zeile 366 der Datei test.c.
Wird benutzt von search() und x_heart_beat().
00367 { int i,j,room; 00368 mapping m; 00369 string *s,s1,*s2,PRE,END,*special,*zufinden,*details,re,*uebergehen; 00370 mixed mi; 00371 00372 if (!r || !objectp(r)) 00373 { 00374 write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n"); 00375 return 1; 00376 } 00377 00378 // Die Ausgaben erfolgen zunaechst in einen String. 00379 00380 re="\n"; 00381 00382 // Handelt es sich um einen Raum? 00383 00384 room = (function_exists("int_long",r) ? 1 : 0 ); 00385 00386 // Terminaltyp des Magiers feststellen. 00387 00388 if (objectp(output)) 00389 switch (output->QueryProp(P_TTY)) 00390 { 00391 case "ansi" : 00392 case "vt100" : PRE=BOLD; END=NORMAL; break; 00393 default : PRE=""; END=""; break; 00394 } 00395 else 00396 { 00397 PRE=""; 00398 END=""; 00399 } 00400 00401 // Liste der zu uebergehenden Details erzeugen. Die verwendete Methode hat den 00402 // Vorteil, dass man nach einer Ergaenzung der Liste nicht das Tool neu laden 00403 // und clonen muss. Das Tool erwartet, die Liste DATAFILE im gleichen 00404 // Verzeichnis zu finden, in dem auch das Tool liegt. 00405 00406 s1=implode(explode(old_explode(object_name(ME),"#")[0],"/")[0..<2],"/")+"/" 00407 DATAFILE; 00408 if (file_size(s1)<1) 00409 s1=DEFAULT_DATA; 00410 00411 uebergehen = regexp(regexplode(read_file(s1),"[^A-Za-z0-9]"),"\\<[a-z]"); 00412 00413 // Satz an Details, die auf jeden Fall vorhanden sein sollten, je nachdem 00414 // ob P_INDOORS gesetzt ist oder nicht. 00415 00416 if (room && r->QueryProp(P_INDOORS)) 00417 zufinden = ({"Boden","Decke","Wand","Waende","Raum"}); 00418 else if (room) 00419 zufinden = ({"Boden","Himmel","Sonne","Wolke","Wolken"}); 00420 else 00421 zufinden = ({}); 00422 00423 // Alle vorhandenen Details anzeigen. 00424 00425 // details = sort_array(m_indices(r->_query_details()||([])),#'<); 00426 details = sort_array(m_indices(r->QueryProp(P_DETAILS)||([])),#'<); 00427 00428 if (scanrun<1) 00429 { 00430 if ((i=sizeof(details))>0) 00431 { 00432 for ( s1="",--i; i>=0 ; i-- ) 00433 s1 += (details[i]+(i?"\n":"")); 00434 00435 re += sprintf(sprintf("%sListe der vorhandenen Details:%s\n\n"+ 00436 "%s\n\n",PRE,END,("%-#78"+(spalten<1?"": 00437 sprintf(".%d",spalten))+"s")),s1); 00438 } 00439 else 00440 re += sprintf("%sKeine Details gefunden.%s\n\n",PRE,END); 00441 } 00442 00443 // Alle vorhandenen SpecialDetails anzeigen. 00444 00445 // special=sort_array(m_indices(r->_query_special_details()||([])),#'<); 00446 special=sort_array(m_indices(r->QueryProp(P_SPECIAL_DETAILS)||([])),#'<); 00447 00448 if (scanrun<1) 00449 { 00450 if ((i=sizeof(special))>0) 00451 { 00452 for ( s1="",--i ; i>=0 ; i-- ) 00453 s1 += (special[i]+(i?"\n":"")); 00454 00455 re += sprintf(sprintf( 00456 "%sListe der vorhandenen SpecialDetails:%s\n\n"+ 00457 "%s\n\n",PRE,END,("%-#78"+(spalten<1?"": 00458 sprintf(".%d",spalten))+"s")),s1); 00459 } 00460 else 00461 re += sprintf("%sKeine SpecialDetails gefunden.%s\n\n",PRE,END); 00462 } 00463 00464 // Die Listen der vorhandenen Details und SpecialDetails vereinigen. 00465 00466 details += special; 00467 00468 // Details und SpecialDetails auswerten - gar nicht so einfach. 00469 00470 all_dets = r->Query(P_DETAILS); 00471 00472 for ( s=({}),i=sizeof(details)-1 ; i>=0 ; i--) 00473 s += eval_detail_entry(details[i]); 00474 00475 for ( s2=({}),i=sizeof(s)-1 ; i>=0 ; i-- ) 00476 if (stringp(s[i])) 00477 if (member(s2,s[i])==-1) 00478 { 00479 s2 += ({ s[i] }); 00480 zufinden+=det_auswerten(s[i]); 00481 } 00482 00483 // Grossgeschriebene Woerter aus der Langbeschreibung hinzufuegen. 00484 00485 if (function_exists("int_long",r)) 00486 zufinden += det_auswerten( 00487 old_explode(r->int_long(master,master),"Es gibt ")[0]); 00488 else 00489 zufinden += det_auswerten(old_explode(r->long(),"enthaelt:")[0]); 00490 00491 // Doppelte Eintraege eliminieren. 00492 00493 for ( s2=({}), i=sizeof(zufinden)-1 ; i>=0 ; i--) 00494 if (member(s2,zufinden[i])==-1) 00495 s2 += ({ zufinden[i] }); 00496 00497 // Alles klein machen. 00498 00499 zufinden=map(s2,#'lower_case); 00500 00501 // Bei NPCs/Objekten die IDs rausfiltern. 00502 00503 if (!room) 00504 zufinden -= r->QueryProp(P_IDS); 00505 00506 // Die zu uebergehenden Details rausfiltern. 00507 00508 zufinden=filter((zufinden-uebergehen),#'stringp); 00509 00510 // Schauen, welche Details fehlen und diese Ausgeben. 00511 00512 for ( s=({}),s2=({}),i=sizeof(zufinden)-1;i>=0;i--) 00513 { 00514 if (!(mi=test_details(zufinden[i]))) 00515 continue; 00516 if (pointerp(mi)) 00517 { 00518 for (j=sizeof(mi)-1 ; j>=0 ; j--) 00519 if (member(s,mi[j])==-1) 00520 s += ({ mi[j] }); 00521 } 00522 else if (stringp(mi) && member(s2,mi)==-1) 00523 s2 += ({ mi }); 00524 } 00525 00526 s = sort_array(s, #'<); 00527 s2 = sort_array(s2,#'<); 00528 00529 if (scanrun<1) 00530 { 00531 if ((i=sizeof(s))>0) 00532 { 00533 for ( s1="",--i ; i>=0 ; i-- ) 00534 s1 += (s[i]+(i?"\n":"")); 00535 00536 re += sprintf(sprintf("%sListe der gefundenen Details:%s\n\n"+ 00537 "%s\n\n",PRE,END,("%-#78"+(spalten<1?"": 00538 sprintf(".%d",spalten))+"s")),s1); 00539 } 00540 else 00541 re += sprintf("%sEs gibt keine Details.%s\n\n",PRE,END); 00542 } 00543 00544 if ((i=sizeof(s2))>0) 00545 { 00546 for ( s1="",--i ; i>=0 ; i-- ) 00547 s1 += (s2[i]+(i?"\n":"")); 00548 00549 re += sprintf(sprintf("%sListe der fehlenden Details:%s\n\n"+ 00550 "%s\n\n",PRE,END,("%-#78"+(spalten<1?"": 00551 sprintf(".%d",spalten))+"s")),s1); 00552 } 00553 else 00554 re += sprintf("%sEs fehlen keine Details.%s\n\n",PRE,END); 00555 00556 if (scanrun<1) 00557 re += sprintf("%sFERTIG.%s\n",PRE,END); 00558 00559 // Die eigentliche Textausgabe. 00560 00561 Output(re); 00562 00563 return 1; 00564 }

| int search_m | ( | object | r | ) |
Definiert in Zeile 734 der Datei test.c.
Benutzt search_sense() und SENSE_SMELL.
Wird benutzt von search().
00735 { 00736 if (!r || !objectp(r)) 00737 { 00738 write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n"); 00739 return 1; 00740 } 00741 00742 return search_sense(r,SENSE_SMELL); 00743 }


| int search_n | ( | object | r | ) |
Definiert in Zeile 716 der Datei test.c.
Benutzt search_sense() und SENSE_SOUND.
Wird benutzt von search().
00717 { 00718 if (!r || !objectp(r)) 00719 { 00720 write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n"); 00721 return 1; 00722 } 00723 00724 return search_sense(r,SENSE_SOUND); 00725 }


| int search_sense | ( | object | r, | |
| int | sense | |||
| ) |
Definiert in Zeile 573 der Datei test.c.
Wird benutzt von search_m(), search_n() und x_heart_beat().
00574 { string re,PRE,END,WAS,*senses,s1,*zufinden,*s2,*s3,def; 00575 int i,j; 00576 mixed mi; 00577 00578 if (!r || !objectp(r)) 00579 { 00580 write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n"); 00581 return 1; 00582 } 00583 if (sense==SENSE_SMELL) 00584 { 00585 all_dets=r->Query(P_SMELLS)||([]); 00586 WAS="Gerueche"; 00587 } 00588 else if (sense==SENSE_SOUND) 00589 { 00590 all_dets=r->Query(P_SOUNDS)||([]); 00591 WAS="Geraeusche"; 00592 } 00593 else 00594 { 00595 write("OTEST-ERROR: Illegaler sense-Wert in search_sense()\n"); 00596 return 1; 00597 } 00598 00599 re = "\n"; 00600 00601 zufinden = ({SENSE_DEFAULT}); 00602 00603 def = all_dets[SENSE_DEFAULT]; 00604 00605 // Terminaltyp des Magiers feststellen. 00606 00607 if (objectp(output)) 00608 switch (output->QueryProp(P_TTY)) 00609 { 00610 case "ansi" : 00611 case "vt100" : PRE=BOLD; END=NORMAL; break; 00612 default : PRE=""; END=""; break; 00613 } 00614 else 00615 { 00616 PRE=""; 00617 END=""; 00618 } 00619 00620 senses = sort_array(m_indices(all_dets),#'<); 00621 00622 // Alle vorhandenen Sense-Details anzeigen. 00623 00624 if (scanrun<1) 00625 { 00626 if ((i=sizeof(senses))>0) 00627 { 00628 for ( s1="",--i; i>=0 ; i-- ) 00629 s1 += ((senses[i]==SENSE_DEFAULT?"DEFAULT": 00630 senses[i])+(i?"\n":"")); 00631 00632 re += sprintf(sprintf("%sListe der vorhandenen %s:%s\n\n"+ 00633 "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"": 00634 sprintf(".%d",spalten))+"s")),s1); 00635 } 00636 else 00637 re += sprintf("%sKeine %s gefunden.%s\n\n",PRE,WAS,END); 00638 } 00639 00640 00641 // Sense-Details auswerten - geht wie bei Details. 00642 00643 for ( s2=({}),i=sizeof(senses)-1 ; i>=0 ; i--) 00644 s2 += eval_detail_entry(senses[i]); 00645 00646 for ( s3=({}),i=sizeof(s2)-1 ; i>=0 ; i-- ) 00647 if (stringp(s2[i])) 00648 if (member(s3,s2[i])==-1) 00649 { 00650 s3 += ({ s2[i] }); 00651 zufinden+=det_auswerten(s2[i]); 00652 } 00653 00654 // Testen, welche Sense-Details fehlen und anzeigen 00655 00656 for ( s2=({}),s3=({}),i=sizeof(zufinden)-1;i>=0;i--) 00657 { 00658 if (!(mi=test_details(zufinden[i],def))) 00659 continue; 00660 if (pointerp(mi)) 00661 { 00662 for (j=sizeof(mi)-1 ; j>=0 ; j--) 00663 if (member(s2,mi[j])==-1) 00664 s2 += ({ mi[j] }); 00665 } 00666 else if (stringp(mi) && member(s3,mi)==-1) 00667 s3 += ({ mi }); 00668 } 00669 s2 = sort_array(s2,#'<); 00670 s3 = sort_array(s3,#'<); 00671 00672 if (scanrun<1) 00673 { 00674 if ((i=sizeof(s2))>0) 00675 { 00676 for ( s1="",--i ; i>=0 ; i-- ) 00677 s1 += ((s2[i]==SENSE_DEFAULT?"DEFAULT":s2[i])+(i?"\n":"")); 00678 00679 re += sprintf(sprintf("%sListe der gefundenen %s:%s\n\n"+ 00680 "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"": 00681 sprintf(".%d",spalten))+"s")),s1); 00682 } 00683 else 00684 re += sprintf("%sEs gibt keine %s.%s\n\n",PRE,WAS,END); 00685 } 00686 00687 if ((i=sizeof(s3))>0) 00688 { 00689 for ( s1="",--i ; i>=0 ; i-- ) 00690 s1 += ((s3[i]==SENSE_DEFAULT?"DEFAULT":s3[i])+(i?"\n":"")); 00691 00692 re += sprintf(sprintf("%sListe der fehlenden %s:%s\n\n"+ 00693 "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"": 00694 sprintf(".%d",spalten))+"s")),s1); 00695 } 00696 else 00697 re += sprintf("%sEs fehlen keine %s.%s\n\n",PRE,WAS,END); 00698 00699 if (scanrun<1) 00700 re += sprintf("%sFERTIG.%s\n",PRE,END); 00701 00702 // Die eigentliche Textausgabe. 00703 00704 Output(re); 00705 00706 return 1; 00707 }

| int spaltenzahl | ( | string | arg | ) |
Definiert in Zeile 888 der Datei test.c.
Benutzt F_MODE_AS, h, IS_LEARNER, notify_fail(), P_OTEST_SPL, P_TESTPLAYER, PL, removen(), SAVE, scanrun und spalten.
00889 { int h; 00890 00891 if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL)) 00892 return removen(); 00893 00894 if (scanrun) 00895 { 00896 write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n"); 00897 return 1; 00898 } 00899 00900 notify_fail("OTEST-Syntax: ocolm [1|2|3|4|5|6|7|8|auto]\n"); 00901 00902 if (!arg || !stringp(arg)) 00903 { 00904 if (h=PL->QueryProp(P_OTEST_SPL)) 00905 spalten=h; 00906 if (!h) 00907 { 00908 PL->SetProp(P_OTEST_SPL,spalten); 00909 PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS); 00910 } 00911 printf("OTEST: Eingestellte Spaltenzahl ist '%s'\n", 00912 (spalten>0?sprintf("%d",spalten):"'AUTO'")); 00913 return 1; 00914 } 00915 if (arg=="auto") 00916 { 00917 spalten=-1; 00918 PL->SetProp(P_OTEST_SPL,spalten); 00919 PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS); 00920 write("OTEST: Eingestellte Spaltenzahl ist 'AUTO'\n"); 00921 return 1; 00922 } 00923 h = to_int(arg); 00924 if (h<1 || h>8) 00925 return 0; 00926 spalten=h; 00927 PL->SetProp(P_OTEST_SPL,spalten); 00928 PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS); 00929 printf("OTEST: Eingestellte Spaltenzahl ist %d\n",spalten); 00930 return 1; 00931 }

| varargs mixed test_details | ( | string | str, | |
| string | def | |||
| ) |
Definiert in Zeile 297 der Datei test.c.
00298 { string *strs,ostr,*strs2,suf; 00299 int i; 00300 00301 if (!str || !stringp(str) || !mappingp(all_dets)) 00302 return 0; 00303 00304 strs = ({str}); 00305 ostr = str; 00306 00307 if ((suf=extract(str,-1,-1))=="s" || suf=="n" || suf=="e") 00308 { 00309 ostr = extract(str,0,-2); 00310 strs += ({ ostr }); 00311 ostr += ("("+suf+")"); 00312 } 00313 if ((suf=extract(str,-2,-1))=="es" || suf=="en") 00314 { 00315 ostr = extract(str,0,-3); 00316 strs += ({ ostr }); 00317 ostr += ("("+suf+")"); 00318 } 00319 for ( strs2=({}),i=sizeof(strs)-1 ; i>=0 ; i--) 00320 if (member(all_dets,strs[i])) 00321 { 00322 if (stringp(def) && all_dets[strs[i]]==def && str!=SENSE_DEFAULT) 00323 continue; 00324 strs2 += ({ strs[i] }); 00325 } 00326 if (sizeof(strs2)>0) 00327 return strs2; 00328 return ostr; 00329 }
| void x_heart_beat | ( | ) |
Definiert in Zeile 1040 der Datei test.c.
Benutzt break_string(), call_out(), MSGFLAG_TELL, Output(), output, scancount, scandir, scanerr, scanfiles, scanrun, search_d(), search_sense(), SENSE_SMELL, SENSE_SOUND, T_PAUSE und testob.
01041 { int nr; 01042 string fn,er; 01043 01044 call_out("x_heart_beat",T_PAUSE); 01045 01046 if ((++scancount)>4) 01047 { 01048 scancount = 1; 01049 testob = 0; 01050 scanrun--; 01051 } 01052 01053 nr=scanrun-2; 01054 if (nr<0) 01055 { 01056 if (environment() && interactive(environment())) 01057 environment()->Message(break_string("'otdir' beendet.\n"+ 01058 sprintf("Files: %d - Fehler: %d - Skips: %d", 01059 sizeof(scanfiles),scanerr[0],scanerr[1]), 01060 78,"OTEST: ",1),MSGFLAG_TELL); 01061 01062 scanrun = 0; 01063 scancount = 0; 01064 output = 0; 01065 scanfiles = ({}); 01066 scandir = 0; 01067 testob = 0; 01068 scanerr = ({0,0}); 01069 01070 while(remove_call_out("x_heart_beat")!=-1); 01071 01072 return; 01073 } 01074 fn=scandir+scanfiles[nr]; 01075 if (fn[<2..]==".c") 01076 fn=fn[0..<3]; 01077 01078 if (scancount==1) // Testen, ob File ladbar 01079 { 01080 Output(sprintf("File: %s\n\n",fn)); 01081 er=catch(call_other(fn,"???")); 01082 if (er && stringp(er)) 01083 { 01084 Output(sprintf("Error: %s->Abort@Load\n\n",er)); 01085 scanrun--; 01086 scancount = 0; 01087 testob = 0; 01088 scanerr[0] = scanerr[0]+1; 01089 } 01090 else 01091 testob = find_object(fn); 01092 return; 01093 } 01094 if (!objectp(testob)) 01095 { 01096 Output("Objekt nicht gefunden\n-> Abort@Object.\n\n"); 01097 scanrun--; 01098 scancount = 0; 01099 scanerr[0] = scanerr[0]+1; 01100 return; 01101 } 01102 if (!function_exists("int_long",testob)) 01103 { 01104 Output("Objekt ist kein Raum -> SKIPPING.\n\n"); 01105 scanrun--; 01106 scancount = 0; 01107 testob = 0; 01108 scanerr[1] = scanerr[1]+1; 01109 return; 01110 } 01111 switch(scancount) 01112 { 01113 case 2 : 01114 if ((er=catch(search_d(testob))) && stringp(er)) 01115 { 01116 Output(sprintf("Error: %s-> Abort@Detail.\n\n",er)); 01117 scanrun--; 01118 scancount = 0; 01119 testob = 0; 01120 scanerr[0] = scanerr[0]+1; 01121 } 01122 return; 01123 case 3 : 01124 if ((er=catch(search_sense(testob,SENSE_SMELL))) && stringp(er)) 01125 { 01126 Output(sprintf("Error: %s-> Abort@Smell.\n\n",er)); 01127 scanrun--; 01128 scancount = 0; 01129 testob = 0; 01130 scanerr[0] = scanerr[0]+1; 01131 } 01132 return; 01133 case 4 : 01134 if ((er=catch(search_sense(testob,SENSE_SOUND))) && stringp(er)) 01135 { 01136 Output(sprintf("Error: %s-> Abort@Sound.\n\n",er)); 01137 scanrun--; 01138 scancount = 0; 01139 testob = 0; 01140 scanerr[0] = scanerr[0]+1; 01141 } 01142 return; 01143 } 01144 return; 01145 }

| string x_long | ( | ) |
Definiert in Zeile 126 der Datei test.c.
Benutzt BOLD, break_string(), END, NORMAL, P_TTY, PL, scandir, scanerr, scanfiles, scanrun, scantyp, spalten, T_PAUSE, T_ROCHUS und time2string().
00127 { string re,PRE,END; 00128 00129 switch (PL->QueryProp(P_TTY)) 00130 { 00131 case "ansi" : 00132 case "vt100" : PRE=BOLD; END=NORMAL; break; 00133 default : PRE=""; END=""; break; 00134 } 00135 00136 re = break_string( 00137 "Mit diesem Objektpruefer kannst Du feststellen, welche Details, "+ 00138 "Gerueche oder Geraeusche in einem Raum bzw an einem Objekt noch "+ 00139 "nicht beschrieben sind.",78)+ 00140 "\n"+ 00141 "Syntax: %sotest [detail|smell|sound] {<objekt>[in mir|im raum]|"+ 00142 "hier}\n\n"+ 00143 " otype [rikus|rochus]\n\n"+ 00144 " ocolm [1|2|3|4|5|6|7|8|auto]\n\n"+ 00145 " otdir <verzeichnis> <ausgabefile>%s\n\n"+ 00146 break_string( 00147 "Mit %sotype%s kann man festlegen, ob man im 'Rikus'- oder im "+ 00148 "'Rochus'-Modus scannen will, mit %socolm%s die anzahl der Ausgabe"+ 00149 "spalten und mit %sotest%s wird dann die Auswertung gestartet. "+ 00150 "Mit dem Kommando %sotdir%s kann man sogar ganze Verzeichnisse "+ 00151 "auf einmal testen lassen. Das dauert natuerlich eine Weile. "+ 00152 "Ausserdem muss ein Verzeichnis '/log/<magiername>/' bestehen.",78)+ 00153 "Derzeitiger Scantyp: %s'"+(scantyp==T_ROCHUS?"ROCHUS":"RIKUS")+ 00154 "'%s\n"+ 00155 "Derzeitige Spaltenzahl: %s%s%s\n%s"; 00156 return sprintf(re,PRE,END,PRE,END,PRE,END,PRE,END,PRE,END,PRE,END,PRE, 00157 (spalten>0?sprintf("%d",spalten):"'AUTO'"),END, 00158 (scanrun?sprintf( 00159 "\nDerzeit Dirscan in: %s%s%s\n"+ 00160 "Angenommene Restzeit: %s(%s) [Fi:%d/%d|Er:%d|Sk:%d]%s\n", 00161 PRE,scandir,END,PRE, 00162 time2string("%h:%02m:%02s",(scanrun-1)*4*T_PAUSE), 00163 (sizeof(scanfiles)-scanrun+1),(sizeof(scanfiles)), 00164 scanerr[0],scanerr[1],END):"")); 00165 }

| object master |
Definiert in Zeile 118 der Datei test.c.
Wird benutzt von _addguildmaster(), _addmaster(), _ed(), _in_room(), _removeguildmaster(), _removemaster(), access_check(), AddItem(), again_password(), call_out(), call_out_info(), check_all_player(), check_illegal(), check_password(), check_player(), copy_file(), dirtesten(), dumpEPObjects(), dumphists(), get_hc_answer(), get_uids(), getFreeEKsForPlayer(), getuuid(), hl(), is_guild_master(), is_region_master(), is_region_member(), load_player_object(), LogCompileProblem(), LogError(), logon2(), LogWarning(), new_logon(), new_password(), NotifyDestruct(), QueryTipObjects(), RemoveItem(), renew_player(), search(), set_object_living_name(), ShowEPObjects(), spielpause(), spielpause2(), to_filename(), update() und versende_mail().
| static nomask public string output |
Definiert in Zeile 117 der Datei test.c.
Wird benutzt von _inventory(), _todo_anzeigen(), create(), dirtesten(), GetList(), MagierListe(), parsecommand(), printep(), search(), ShowPlayerEPs(), shutdown() und x_heart_beat().
| int scancount |
Definiert in Zeile 122 der Datei test.c.
Wird benutzt von create(), dirtesten() und x_heart_beat().
| string scandir |
Definiert in Zeile 123 der Datei test.c.
Wird benutzt von create(), dirtesten(), x_heart_beat() und x_long().
| int * scanerr |
Definiert in Zeile 122 der Datei test.c.
Wird benutzt von create(), dirtesten(), x_heart_beat() und x_long().
| string * scanfiles |
Definiert in Zeile 123 der Datei test.c.
Wird benutzt von create(), dirtesten(), x_heart_beat() und x_long().
| int scanrun |
Definiert in Zeile 122 der Datei test.c.
Wird benutzt von create(), dirtesten(), scanart(), search(), spaltenzahl(), x_heart_beat() und x_long().
| int scantyp |
| int spalten |
Definiert in Zeile 115 der Datei test.c.
Wird benutzt von create(), spaltenzahl() und x_long().
| object testob |
Definiert in Zeile 124 der Datei test.c.
Wird benutzt von x_heart_beat().
1.6.3