Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/obj/werliste.c b/obj/werliste.c
new file mode 100644
index 0000000..f25043d
--- /dev/null
+++ b/obj/werliste.c
@@ -0,0 +1,351 @@
+#pragma strong_types
+
+inherit "/std/user_filter";
+
+#include <properties.h>
+#include <wizlevels.h>
+#include <ansi.h>
+#include <werliste.h>
+
+mixed *erwarte;
+
+#define MIN(a,b) (((a) > (b)) ? (b) : (a))
+#define ABS(a) (((a) < 0) ? -(a) : (a))
+
+
+// als Funktion statt als define, da als lfun-Closure genutzt
+private int is_alph_greater( object a, object b )
+{
+ return geteuid(a) > geteuid(b);
+}
+
+
+// keine Ahnung, wer sich _die_ Berechnungsgrundlage ausgedacht hat.
+// Aber da sie schon uralt ist, bleibt sie auch drin ;-)
+private int is_greater( object a, object b )
+{
+ int a1, b1;
+
+ a1 = 26000 * query_wiz_level(a) +
+ 26 * MIN( 2121, ABS(a->QueryProp(P_LEVEL)) ) + getuid(a)[0]-'a';
+
+ b1 = 26000 * query_wiz_level(b) +
+ 26 * MIN( 2121, ABS(b->QueryProp(P_LEVEL)) ) + getuid(b)[0]-'a';
+
+ return a1 > b1;
+}
+
+
+private string stat( object ob, int ist_magier )
+{
+ int l;
+
+ l = query_wiz_level(ob);
+
+ if ( ob->Query(P_TESTPLAYER) ){
+ if ( l < SEER_LVL )
+ return "t";
+ else if ( l < LEARNER_LVL )
+ return "T";
+ }
+
+ if ( ob->Query(P_SECOND)) {
+ if (ob->Query(P_SECOND_MARK) > -1 ){
+ if ( l < SEER_LVL )
+ return "z";
+ else if ( l < LEARNER_LVL )
+ return "Z";
+ } else
+ if (ist_magier) {
+ if ( l < SEER_LVL )
+ return "n";
+ else if ( l < LEARNER_LVL )
+ return "N";
+ }
+ }
+
+ switch(l){
+ case GOD_LVL .. 666:
+ return "G";
+ case ARCH_LVL .. GOD_LVL-1:
+ return "E";
+ case ELDER_LVL .. ARCH_LVL-1:
+ return "W";
+ case LORD_LVL .. ELDER_LVL-1:
+ return "R";
+ case SPECIAL_LVL .. LORD_LVL-1:
+ return "H";
+ case DOMAINMEMBER_LVL .. SPECIAL_LVL-1:
+ return "M";
+ case WIZARD_LVL+1 .. DOMAINMEMBER_LVL-1:
+ return "m";
+ case LEARNER_LVL .. WIZARD_LVL:
+ return "L";
+ case SEER_LVL .. LEARNER_LVL-1:
+ return "S";
+ default:
+ return "s";
+ }
+ return "s";
+}
+
+
+private string idlestat( object ob )
+{
+ switch( query_idle(ob) ){
+ case 1800 .. 7199:
+ return "j";
+ case 600 .. 1799:
+ return "I";
+ case 120 .. 599:
+ return "i";
+ case 0 .. 119:
+ return ".";
+ default:
+ return "J";
+ }
+ return ".";
+}
+
+
+private string wegstat( object ob )
+{
+ if ( ob->QueryProp(P_AWAY) )
+ return "w";
+
+ return ".";
+}
+
+
+private string hcstat( object ob )
+{
+ int hcstat;
+
+ hcstat=ob->query_hc_play();
+
+ if(!hcstat)
+ {
+ return ".";
+ }
+
+ if(hcstat>1)
+ return "+";
+
+ return "c";
+
+}
+
+
+private string get_location( object ob )
+{
+ string res;
+
+ if ( stringp(res = ob->Query(P_LOCATION)) )
+ res = capitalize(res) + " (ueber " + country(ob) + ")";
+ else
+ res = country(ob);
+
+ return res;
+}
+
+
+varargs private mixed
+QueryView( object ob, int ist_magier, int sh,
+ int obs, string tty, string opt )
+{
+ string race, ret, tmp, prefix, a_prefix, normal;
+
+ if ( !ist_magier && ob->QueryProp(P_INVIS) )
+ return "";
+
+ prefix = "";
+ a_prefix = "";
+
+ ret = capitalize(getuid(ob));
+
+ switch(tty){
+ case "ansi":
+ if ( IS_LEARNER(ob) )
+ a_prefix = ANSI_UNDERL;
+
+ if ( ob->QueryProp(P_FROG) )
+ a_prefix += ANSI_GREEN;
+
+ if ( pointerp(erwarte) && member( erwarte, ret ) != -1 )
+ a_prefix += ANSI_RED;
+
+ normal = ANSI_NORMAL;
+ break;
+
+ default:
+ if ( pointerp(erwarte) && member( erwarte, ret ) != -1 )
+ prefix = "*";
+ else
+ prefix = "";
+
+ normal = "";
+ }
+
+ if ( ret == ROOTID )
+ ret = "Logon";
+
+ if ( sh ){ // kwer
+ if ( ob->QueryProp(P_INVIS) )
+ ret = sprintf( "%s(%-11'.'s).%s%s", a_prefix, prefix + ret,
+ hcstat(ob) + idlestat(ob) + wegstat(ob) + stat(ob,ist_magier), normal );
+ else
+ ret = sprintf( "%s%-13'.'s.%s%s", a_prefix, prefix + ret,
+ hcstat(ob) + idlestat(ob) + wegstat(ob) + stat(ob,ist_magier), normal );
+ }
+ else if ( opt == "k" ){ // wer -k
+ ret = sprintf( "[%s] %-13s %15s / %-20s %22s", stat(ob,ist_magier),
+ ob->QueryProp(P_INVIS) ? "(" + ret + ")" : ret,
+ stringp(race = ob->QueryProp(P_RACE)) ?
+ capitalize(race)[0..14] : "<keine Rasse>",
+ stringp(race = ob->QueryProp(P_GUILD)) ?
+ capitalize(race)[0..19] : "<keine Gilde>",
+ "[" + country(ob)[0..19] + "]" );
+ }
+ else { // wer, wer -o, wer -s
+ if ( tmp = ob->short() ){
+ ret = tmp[0..<3];
+
+ if ( ob->QueryProp(P_TEAM) )
+ ret = ob->TeamPrefix() + ret;
+ }
+ else
+ ret = "(" + ret + ")";
+
+ if ( !IS_LEARNER(ob) && ob->Query(P_TESTPLAYER) )
+ tmp = " <TestSpieler>";
+ else
+ tmp = "";
+
+ if ( !IS_LEARNER(ob) && ob->QueryProp(P_SECOND) &&
+ ob->QueryProp(P_SECOND_MARK) > -1 )
+ tmp += " <Zweitie>";
+
+ ret = sprintf( "%s%s - %s%s%s",
+ (opt == "o") ? "" : "[" + stat(ob,ist_magier) + "] ", ret,
+ stringp(race = ob->QueryProp(P_RACE)) ?
+ capitalize(race) : "<keine Rasse>",
+ (opt == "s") ? " - [" + get_location(ob) + "]" :
+ (stringp(race = ob->QueryProp(P_GUILD)) ?
+ "/" + capitalize(race) : "/<keine Gilde>"),
+ (opt == "o") ? tmp : "" );
+ }
+
+ if ( obs )
+ return ({ ob, ret });
+ else
+ return ret;
+}
+
+
+private object *make_unique( object* arr )
+{
+ int i;
+
+ // muss ueber eine Schleife gemacht werden, um die Reihenfolge zu erhalten!
+ for ( i = sizeof(arr); i-- > 1; )
+ if( arr[i] == arr[i-1] )
+ arr[i] = 0;
+
+ return arr - ({ 0 });
+}
+
+
+#define OFFSET(sp) ((maxi/4) * sp + ((sp <= maxi%4) ? sp : maxi%4))
+
+// diese Funktion wird von aussen aufgerufen fuer die Befehle "wer" & Co
+public varargs string
+*QueryWhoListe( int ist_magier, int short, int obs, string arg, int old )
+{
+ object *pl;
+ string *pls, *s, opt;
+ int i, j, k, l, *t, maxi;
+
+ erwarte = 0;
+
+ if ( short & WHO_SHORT ){
+ if ( previous_object() )
+ erwarte = previous_object()->QueryProp(P_WAITFOR);
+
+ if ( !pointerp(erwarte) )
+ erwarte = ({});
+ }
+
+ // Wer Spielersicht moechte, soll Spielersicht bekommen
+ if ( short & WHO_PLAYER_VIEW )
+ {
+ ist_magier = 0;
+ }
+
+
+ if ( old ){
+ opt = "o";
+ arg = 0;
+ }
+ else if ( arg == "k" || arg == "s" ){
+ opt = arg;
+ arg = 0;
+ }
+ else if ( sizeof(arg) == 1 ) // (noch) unbekannte Option
+ arg = 0;
+
+ pl = filter_users(arg);
+
+ if ( short & WHO_ALPHA )
+ pl = sort_array( pl, #'is_alph_greater/*'*/ );
+ else
+ pl = sort_array( pl, #'is_greater/*'*/ );
+
+ pl = make_unique( pl );
+
+ pls = map( pl, #'QueryView/*'*/, ist_magier, short, obs,
+ previous_object()->QueryProp(P_TTY), opt ) - ({""});
+
+ if ( !(short & WHO_SHORT) )
+ return pls;
+
+ maxi = sizeof(pls);
+ s = allocate( maxi / 4 + (maxi % 4 ? 1 : 0) );
+
+ if ( short & WHO_VERTICAL ) { // senkrecht sortieren !
+ // wird so nur einmal berechnet
+ t = ({ 0, OFFSET(1), OFFSET(2), OFFSET(3), maxi });
+
+ for ( i = 0, l = sizeof(s); i < l; i++ ) {
+ s[i] = "";
+
+ for ( j = 0; j < 4; j++ ) {
+ if ( (k = i+t[j]) < t[j+1] && pls[k] != "" )
+ s[i] += pls[k];
+
+ if( j < 3 )
+ s[i] += " ";
+ }
+ }
+ }
+ else {
+ for ( i = 0; i < maxi; i++ ) {
+ if ( !s[i/4] )
+ s[i/4] = "";
+
+ if ( pls[i] != "" )
+ s[i/4] += pls[i];
+
+ if ( (i%4 != 3) && i < maxi-1 )
+ s[i/4] += " ";
+ }
+ }
+
+ return ({ sprintf( "%|78s", "Liste der Mitspieler vom " + dtime(time()) +
+ sprintf( " (%d Teilnehmer)", maxi )), "" }) + s;
+}
+
+
+public varargs int query_prevent_shadow( object ob )
+{
+ return 1;
+}