#include <container.h>#include <properties.h>#include <defines.h>#include <wizlevels.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
Funktionen | |
| void | create () |
| varargs string | long (int mode) |
| private void | stringenize (mixed obj, int flags, mixed objs, mixed info) |
| private string | collect (mixed obj) |
| varargs mixed | make_invlist (object viewer, mixed inv, int flags) |
| static mixed | _query_light_transparency () |
| static int | _query_total_light () |
| static int | _query_int_light () |
| static int | _set_light (int light) |
Variablen | |
| inherit std thing | description |
| private nosave int | last_light_calc |
| #define NEED_PROTOTYPES |
Definiert in Zeile 15 der Datei description.c.
| static int _query_int_light | ( | ) | [static] |
Definiert in Zeile 150 der Datei description.c.
Benutzt _query_last_content_change(), _query_total_light(), last_light_calc, light(), P_INT_LIGHT, P_LIGHT_TRANSPARENCY, Query() und QueryProp().
Wird benutzt von _query_player_light().
00151 { 00152 int tmp; 00153 if ( _query_last_content_change() != last_light_calc ) 00154 _query_total_light(); 00155 00156 // P_INT_LIGHT des environments kann sich natuerlich aendern _ohne_ das 00157 // etwas an einem container geaendert wird. Daher Auswertung jedes mal 00158 // neu aktualisieren. 00159 if (!environment() || !(tmp=(int)environment()->QueryProp(P_INT_LIGHT))) 00160 return Query(P_INT_LIGHT)[2]; 00161 else { 00162 int light, dark, reduce; 00163 00164 light=Query(P_INT_LIGHT)[0]; 00165 dark =Query(P_INT_LIGHT)[1]; 00166 // bei einem offenen Container kann natuerlich das Licht des 00167 // environments den Container auch ausleuchten.... 00168 reduce=QueryProp(P_LIGHT_TRANSPARENCY); // Lichtdurchlaessigkeit 00169 if (tmp>0 && light<tmp-reduce) 00170 light=tmp-reduce; 00171 else if (dark>tmp+reduce) dark=tmp+reduce; 00172 else if (light+dark==0) return tmp; 00173 return light+dark; 00174 } 00175 }


| static mixed _query_light_transparency | ( | ) | [static] |
Definiert in Zeile 108 der Datei description.c.
Benutzt P_LIGHT_TRANSPARENCY, P_TRANSPARENT, Query() und QueryProp().
00109 { 00110 if (QueryProp(P_TRANSPARENT)) return Query(P_LIGHT_TRANSPARENCY); 00111 return 999; 00112 }

| static int _query_total_light | ( | ) | [static] |
Definiert in Zeile 114 der Datei description.c.
Benutzt _query_last_content_change(), i, inv(), last_light_calc, light(), P_INT_LIGHT, P_LIGHT, P_LIGHT_TRANSPARENCY, P_TOTAL_LIGHT, Query(), QueryProp() und SetProp().
Wird benutzt von _query_int_light().
00115 { 00116 int i, tmp, light, dark; 00117 object *inv; 00118 00119 if ( _query_last_content_change() == last_light_calc ) 00120 return Query(P_TOTAL_LIGHT); 00121 00122 for (i=sizeof(inv=all_inventory())-1; i>=0; i--) { 00123 tmp=(int)inv[i]->QueryProp(P_TOTAL_LIGHT); 00124 if (tmp>0 && light<tmp) 00125 light=tmp; 00126 else if (dark>tmp) dark=tmp; 00127 } 00128 00129 // P_INT_LIGHT berechnen... 00130 tmp=QueryProp(P_LIGHT); 00131 if (tmp>0 && light<tmp) 00132 SetProp(P_INT_LIGHT, ({ tmp, dark, tmp+dark })); 00133 else if (dark>tmp) SetProp(P_INT_LIGHT, ({ light, tmp, light+tmp })); 00134 else SetProp(P_INT_LIGHT, ({ light, dark, light+dark })); 00135 00136 // Container schlucken ggf. Licht nach aussen hin... 00137 light+=dark; // Licht verrechnen 00138 if (light>=0) 00139 i=light-QueryProp(P_LIGHT_TRANSPARENCY); // Lichtdurchlaessigkeit 00140 else i=light+QueryProp(P_LIGHT_TRANSPARENCY); 00141 // wenn sich das Vorzeichen geaendert hat auf 0 setzen. 00142 light=((i^light) & 0x80000000 ? 0 : i); 00143 // wenn das eigene Licht dasselbe vorzeichen hat nur das staerkere nehmen 00144 light=((tmp^light) & 0x80000000 ? light+tmp : (tmp>light ? tmp : light)); 00145 00146 last_light_calc = _query_last_content_change(); 00147 return SetProp(P_TOTAL_LIGHT, light); 00148 }


| static int _set_light | ( | int | light | ) | [static] |
Definiert in Zeile 177 der Datei description.c.
Benutzt env(), last_light_calc, ME, P_LIGHT und Set().
00178 { 00179 object env; 00180 last_light_calc=-1; 00181 env=ME; 00182 while (objectp(env)) { 00183 // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf. 00184 // Aber das Lichtsystem ist schon *so* rechenintensiv und gerade der 00185 // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir 00186 // da um jedes bisschen Rechenzeit geht. 00187 // Der Zweck heiligt ja bekanntlich die Mittel. ;-) 00188 // 00189 // Tiamak 00190 env->_set_last_content_change(); 00191 env=environment(env); 00192 } 00193 return Set(P_LIGHT, light); 00194 }

| private string collect | ( | mixed | obj | ) |
Definiert in Zeile 82 der Datei description.c.
| void create | ( | ) |
Definiert in Zeile 24 der Datei description.c.
Benutzt AddId(), create(), last_light_calc, P_LIGHT_TRANSPARENCY, P_TRANSPARENT und SetProp().
00025 { 00026 ::create(); 00027 SetProp(P_TRANSPARENT, 1); 00028 // wieviel Licht schluckt der Container _muss_ > 0 sein! 00029 SetProp(P_LIGHT_TRANSPARENCY, 2); 00030 AddId("Container"); 00031 last_light_calc=-1; 00032 }

| varargs string long | ( | int | mode | ) |
Definiert in Zeile 34 der Datei description.c.
Benutzt make_invlist(), ME, P_LONG, P_TRANSPARENT, PL, process_string(), QueryPronoun(), QueryProp() und WER.
00034 { 00035 string descr, inv_descr; 00036 00037 descr = process_string(QueryProp(P_LONG)); 00038 if(!QueryProp(P_TRANSPARENT)) return descr; 00039 00040 inv_descr = make_invlist(PL, all_inventory(ME), mode ); 00041 if ( inv_descr != "" ) 00042 descr += capitalize(QueryPronoun(WER)) + " enthaelt:\n" + inv_descr; 00043 return descr; 00044 }

| varargs mixed make_invlist | ( | object | viewer, | |
| mixed | inv, | |||
| int | flags | |||
| ) |
Definiert in Zeile 93 der Datei description.c.
Benutzt IS_LEARNER und P_WANTS_TO_LEARN.
00094 { 00095 int iswiz; 00096 mixed objs, info; 00097 00098 iswiz = IS_LEARNER( viewer ) && viewer->QueryProp(P_WANTS_TO_LEARN); 00099 objs = ({}); info = ({}); 00100 map(inv, #'stringenize/*'*/, iswiz | (flags & 2) | (flags & 4), &objs, &info); 00101 if(flags & 1) return info; 00102 inv = map(info, #'collect/*'*/) - ({ 0 }); 00103 if(!sizeof(inv)) return ""; 00104 return sprintf("%"+(sizeof(inv) > 6 ? "#" : "=")+"-78s", 00105 implode(inv, "\n")) + "\n"; 00106 }
| private void stringenize | ( | mixed | obj, | |
| int | flags, | |||
| mixed | objs, | |||
| mixed | info | |||
| ) |
Definiert in Zeile 48 der Datei description.c.
00049 { 00050 string id, tmp; 00051 int idx; 00052 00053 if ( (!(flags & 4) && (flags & 1))) { 00054 //wenn Magier und Magierinfos angehaengt werden sollen: 00055 tmp = capitalize(obj->short()||"")[0..<2] 00056 + " ["+object_name(obj)+"]"; 00057 } 00058 else if (obj->QueryProp(P_INVIS)) { 00059 //keine Ausgabe bzw. leerer String, wird dann von collect rausgeschmissen 00060 tmp=""; 00061 } 00062 else { 00063 //Spieler, Magier ohne P_WANTS_TO_LEARN etc. 00064 tmp = capitalize(obj->short()||"")[0..<2]; 00065 } 00066 //wenn wizard und 'dont collect equal objects': id ist object_name() 00067 if(flags & 3 || living(obj)) 00068 id = object_name(obj); 00069 //sonst nehmen wir den Namen der Blueprint ->zusammenfassen der Objekte 00070 else 00071 id = BLUE_NAME(obj) + tmp; 00072 // Anzahl des jeweiligen Objekts (anhand von id) zaehlen. 00073 if((idx = member(objs, id)) == -1) 00074 { 00075 objs += ({ id }); 00076 info += ({ ({ tmp, 1, obj}) }); 00077 } 00078 else 00079 info[idx][1]++; 00080 }

| inherit std thing description |
Definiert in Zeile 7 der Datei description.c.
| private nosave int last_light_calc |
Definiert in Zeile 22 der Datei description.c.
Wird benutzt von _query_int_light(), _query_total_light(), _set_light() und create().
1.6.3