blob: f25043dfb916ee5097992ed72ea748ffea2c7949 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#pragma strong_types
2
3inherit "/std/user_filter";
4
5#include <properties.h>
6#include <wizlevels.h>
7#include <ansi.h>
8#include <werliste.h>
9
10mixed *erwarte;
11
12#define MIN(a,b) (((a) > (b)) ? (b) : (a))
13#define ABS(a) (((a) < 0) ? -(a) : (a))
14
15
16// als Funktion statt als define, da als lfun-Closure genutzt
17private int is_alph_greater( object a, object b )
18{
19 return geteuid(a) > geteuid(b);
20}
21
22
23// keine Ahnung, wer sich _die_ Berechnungsgrundlage ausgedacht hat.
24// Aber da sie schon uralt ist, bleibt sie auch drin ;-)
25private int is_greater( object a, object b )
26{
27 int a1, b1;
28
29 a1 = 26000 * query_wiz_level(a) +
30 26 * MIN( 2121, ABS(a->QueryProp(P_LEVEL)) ) + getuid(a)[0]-'a';
31
32 b1 = 26000 * query_wiz_level(b) +
33 26 * MIN( 2121, ABS(b->QueryProp(P_LEVEL)) ) + getuid(b)[0]-'a';
34
35 return a1 > b1;
36}
37
38
39private string stat( object ob, int ist_magier )
40{
41 int l;
42
43 l = query_wiz_level(ob);
44
45 if ( ob->Query(P_TESTPLAYER) ){
46 if ( l < SEER_LVL )
47 return "t";
48 else if ( l < LEARNER_LVL )
49 return "T";
50 }
51
52 if ( ob->Query(P_SECOND)) {
53 if (ob->Query(P_SECOND_MARK) > -1 ){
54 if ( l < SEER_LVL )
55 return "z";
56 else if ( l < LEARNER_LVL )
57 return "Z";
58 } else
59 if (ist_magier) {
60 if ( l < SEER_LVL )
61 return "n";
62 else if ( l < LEARNER_LVL )
63 return "N";
64 }
65 }
66
67 switch(l){
68 case GOD_LVL .. 666:
69 return "G";
70 case ARCH_LVL .. GOD_LVL-1:
71 return "E";
72 case ELDER_LVL .. ARCH_LVL-1:
73 return "W";
74 case LORD_LVL .. ELDER_LVL-1:
75 return "R";
76 case SPECIAL_LVL .. LORD_LVL-1:
77 return "H";
78 case DOMAINMEMBER_LVL .. SPECIAL_LVL-1:
79 return "M";
80 case WIZARD_LVL+1 .. DOMAINMEMBER_LVL-1:
81 return "m";
82 case LEARNER_LVL .. WIZARD_LVL:
83 return "L";
84 case SEER_LVL .. LEARNER_LVL-1:
85 return "S";
86 default:
87 return "s";
88 }
89 return "s";
90}
91
92
93private string idlestat( object ob )
94{
95 switch( query_idle(ob) ){
96 case 1800 .. 7199:
97 return "j";
98 case 600 .. 1799:
99 return "I";
100 case 120 .. 599:
101 return "i";
102 case 0 .. 119:
103 return ".";
104 default:
105 return "J";
106 }
107 return ".";
108}
109
110
111private string wegstat( object ob )
112{
113 if ( ob->QueryProp(P_AWAY) )
114 return "w";
115
116 return ".";
117}
118
119
120private string hcstat( object ob )
121{
122 int hcstat;
123
124 hcstat=ob->query_hc_play();
125
126 if(!hcstat)
127 {
128 return ".";
129 }
130
131 if(hcstat>1)
132 return "+";
133
134 return "c";
135
136}
137
138
139private string get_location( object ob )
140{
141 string res;
142
143 if ( stringp(res = ob->Query(P_LOCATION)) )
144 res = capitalize(res) + " (ueber " + country(ob) + ")";
145 else
146 res = country(ob);
147
148 return res;
149}
150
151
152varargs private mixed
153QueryView( object ob, int ist_magier, int sh,
154 int obs, string tty, string opt )
155{
156 string race, ret, tmp, prefix, a_prefix, normal;
157
158 if ( !ist_magier && ob->QueryProp(P_INVIS) )
159 return "";
160
161 prefix = "";
162 a_prefix = "";
163
164 ret = capitalize(getuid(ob));
165
166 switch(tty){
167 case "ansi":
168 if ( IS_LEARNER(ob) )
169 a_prefix = ANSI_UNDERL;
170
171 if ( ob->QueryProp(P_FROG) )
172 a_prefix += ANSI_GREEN;
173
174 if ( pointerp(erwarte) && member( erwarte, ret ) != -1 )
175 a_prefix += ANSI_RED;
176
177 normal = ANSI_NORMAL;
178 break;
179
180 default:
181 if ( pointerp(erwarte) && member( erwarte, ret ) != -1 )
182 prefix = "*";
183 else
184 prefix = "";
185
186 normal = "";
187 }
188
189 if ( ret == ROOTID )
190 ret = "Logon";
191
192 if ( sh ){ // kwer
193 if ( ob->QueryProp(P_INVIS) )
194 ret = sprintf( "%s(%-11'.'s).%s%s", a_prefix, prefix + ret,
195 hcstat(ob) + idlestat(ob) + wegstat(ob) + stat(ob,ist_magier), normal );
196 else
197 ret = sprintf( "%s%-13'.'s.%s%s", a_prefix, prefix + ret,
198 hcstat(ob) + idlestat(ob) + wegstat(ob) + stat(ob,ist_magier), normal );
199 }
200 else if ( opt == "k" ){ // wer -k
201 ret = sprintf( "[%s] %-13s %15s / %-20s %22s", stat(ob,ist_magier),
202 ob->QueryProp(P_INVIS) ? "(" + ret + ")" : ret,
203 stringp(race = ob->QueryProp(P_RACE)) ?
204 capitalize(race)[0..14] : "<keine Rasse>",
205 stringp(race = ob->QueryProp(P_GUILD)) ?
206 capitalize(race)[0..19] : "<keine Gilde>",
207 "[" + country(ob)[0..19] + "]" );
208 }
209 else { // wer, wer -o, wer -s
210 if ( tmp = ob->short() ){
211 ret = tmp[0..<3];
212
213 if ( ob->QueryProp(P_TEAM) )
214 ret = ob->TeamPrefix() + ret;
215 }
216 else
217 ret = "(" + ret + ")";
218
219 if ( !IS_LEARNER(ob) && ob->Query(P_TESTPLAYER) )
220 tmp = " <TestSpieler>";
221 else
222 tmp = "";
223
224 if ( !IS_LEARNER(ob) && ob->QueryProp(P_SECOND) &&
225 ob->QueryProp(P_SECOND_MARK) > -1 )
226 tmp += " <Zweitie>";
227
228 ret = sprintf( "%s%s - %s%s%s",
229 (opt == "o") ? "" : "[" + stat(ob,ist_magier) + "] ", ret,
230 stringp(race = ob->QueryProp(P_RACE)) ?
231 capitalize(race) : "<keine Rasse>",
232 (opt == "s") ? " - [" + get_location(ob) + "]" :
233 (stringp(race = ob->QueryProp(P_GUILD)) ?
234 "/" + capitalize(race) : "/<keine Gilde>"),
235 (opt == "o") ? tmp : "" );
236 }
237
238 if ( obs )
239 return ({ ob, ret });
240 else
241 return ret;
242}
243
244
245private object *make_unique( object* arr )
246{
247 int i;
248
249 // muss ueber eine Schleife gemacht werden, um die Reihenfolge zu erhalten!
250 for ( i = sizeof(arr); i-- > 1; )
251 if( arr[i] == arr[i-1] )
252 arr[i] = 0;
253
254 return arr - ({ 0 });
255}
256
257
258#define OFFSET(sp) ((maxi/4) * sp + ((sp <= maxi%4) ? sp : maxi%4))
259
260// diese Funktion wird von aussen aufgerufen fuer die Befehle "wer" & Co
261public varargs string
262*QueryWhoListe( int ist_magier, int short, int obs, string arg, int old )
263{
264 object *pl;
265 string *pls, *s, opt;
266 int i, j, k, l, *t, maxi;
267
268 erwarte = 0;
269
270 if ( short & WHO_SHORT ){
271 if ( previous_object() )
272 erwarte = previous_object()->QueryProp(P_WAITFOR);
273
274 if ( !pointerp(erwarte) )
275 erwarte = ({});
276 }
277
278 // Wer Spielersicht moechte, soll Spielersicht bekommen
279 if ( short & WHO_PLAYER_VIEW )
280 {
281 ist_magier = 0;
282 }
283
284
285 if ( old ){
286 opt = "o";
287 arg = 0;
288 }
289 else if ( arg == "k" || arg == "s" ){
290 opt = arg;
291 arg = 0;
292 }
293 else if ( sizeof(arg) == 1 ) // (noch) unbekannte Option
294 arg = 0;
295
296 pl = filter_users(arg);
297
298 if ( short & WHO_ALPHA )
299 pl = sort_array( pl, #'is_alph_greater/*'*/ );
300 else
301 pl = sort_array( pl, #'is_greater/*'*/ );
302
303 pl = make_unique( pl );
304
305 pls = map( pl, #'QueryView/*'*/, ist_magier, short, obs,
306 previous_object()->QueryProp(P_TTY), opt ) - ({""});
307
308 if ( !(short & WHO_SHORT) )
309 return pls;
310
311 maxi = sizeof(pls);
312 s = allocate( maxi / 4 + (maxi % 4 ? 1 : 0) );
313
314 if ( short & WHO_VERTICAL ) { // senkrecht sortieren !
315 // wird so nur einmal berechnet
316 t = ({ 0, OFFSET(1), OFFSET(2), OFFSET(3), maxi });
317
318 for ( i = 0, l = sizeof(s); i < l; i++ ) {
319 s[i] = "";
320
321 for ( j = 0; j < 4; j++ ) {
322 if ( (k = i+t[j]) < t[j+1] && pls[k] != "" )
323 s[i] += pls[k];
324
325 if( j < 3 )
326 s[i] += " ";
327 }
328 }
329 }
330 else {
331 for ( i = 0; i < maxi; i++ ) {
332 if ( !s[i/4] )
333 s[i/4] = "";
334
335 if ( pls[i] != "" )
336 s[i/4] += pls[i];
337
338 if ( (i%4 != 3) && i < maxi-1 )
339 s[i/4] += " ";
340 }
341 }
342
343 return ({ sprintf( "%|78s", "Liste der Mitspieler vom " + dtime(time()) +
344 sprintf( " (%d Teilnehmer)", maxi )), "" }) + s;
345}
346
347
348public varargs int query_prevent_shadow( object ob )
349{
350 return 1;
351}