#include <unit.h>#include <properties.h>#include <defines.h>#include <language.h>#include <moving.h>#include <wizlevels.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
| #define | ZDEBUG(x) |
Funktionen | |
| protected void | create () |
| protected void | create_super () |
| static void | check_leave () |
| static int | _set_amount (int am) |
| static int | _query_u_req () |
| static int | _query_value () |
| static int | _set_value (int num) |
| static int | _query_weight () |
| static int | _set_weight (int num) |
| static int | _query_total_weight () |
| static int | _query_plural () |
| static mixed | _query_name () |
| static mixed | _set_name (mixed names) |
| void | AddSingularId (mixed str) |
| void | RemoveSingularId (mixed str) |
| void | AddPluralId (mixed str) |
| void | RemovePluralId (mixed str) |
| void | SetCoinsPerUnits (int coins, int units) |
| void | SetGramsPerUnits (int grams, int units) |
| int * | QueryCoinsPerUnits () |
| int * | QueryGramsPerUnits () |
| void | AddAmount (int am) |
| int | IsUnit () |
| int | IsEqual (object ob) |
| varargs string | name (int fall, int demo) |
| varargs string | QueryPronoun (int casus) |
| string | short () |
| varargs string | long () |
| varargs int | id (string str, int lvl) |
| varargs int | move (mixed dest, int method) |
| void | reset () |
| varargs int | remove () |
| protected void | NotifyMove (object dest, object oldenv, int method) |
| private void | _call_DoDecay (object *klone) |
| public int | DoDecay (int silent) |
| protected void | DoDecayMessage (int oldamount, int zerfall) |
| static int | _query_unit_decay_interval () |
| static int | _set_unit_decay_interval (int zeit) |
| static int | _query_unit_decay_quota () |
| static int | _set_unit_decay_quota (int quota) |
| static int | _query_unit_decay_min () |
| static int | _query_unit_decay_flags () |
Variablen | |
| inherit std | thing |
| private nosave string | lastverb |
| private void _call_DoDecay | ( | object * | klone | ) |
Definiert in Zeile 469 der Datei unit.c.
Benutzt call_out(), i, ME, NO_DECAY, P_UNIT_DECAY_FLAGS, QueryProp() und ZDEBUG.
00469 { 00470 ZDEBUG(sprintf("call_DoDecay() in %O\n",ME)); 00471 // Clone oder kein Decay konfiguriert? 00472 if (clonep() 00473 || QueryProp(P_UNIT_DECAY_FLAGS) & NO_DECAY) 00474 return; 00475 00476 if (!pointerp(klone)) 00477 klone = clones(2); 00478 // Klone da? 00479 int i=sizeof(klone); 00480 if (!i) 00481 return; 00482 00483 // in allen Klonen DoDecay rufen 00484 while(get_eval_cost() > __MAX_EVAL_COST__/2 && i--) { 00485 if (objectp(klone[i])) 00486 catch(call_other(klone[i],"DoDecay", 0);publish); 00487 } 00488 // das i ist schon abgearbeitet. 00489 i--; 00490 // noch was uebrig? 00491 if (i >= 0) 00492 call_out(#'_call_DoDecay, 4, klone[0..i]); 00493 }

| static mixed _query_name | ( | ) | [static] |
| static int _query_plural | ( | ) | [static] |
| static int _query_total_weight | ( | ) | [static] |
Definiert in Zeile 99 der Datei unit.c.
Benutzt MAX, P_AMOUNT, Query() und U_GPU.
00100 { 00101 mixed gpu, amount; 00102 if ((amount=Query(P_AMOUNT))<1) return 0; 00103 gpu=Query(U_GPU); 00104 if (intp(gpu)) 00105 return amount*(int)gpu; 00106 if (!pointerp(gpu)) return 0; 00107 return MAX(1,(amount*gpu[0])/gpu[1]); 00108 }

| static int _query_u_req | ( | ) | [static] |
| static int _query_unit_decay_flags | ( | ) | [static] |
Definiert in Zeile 690 der Datei unit.c.
00690 { 00691 if (clonep()) { 00692 // hat dieses Objekt einen eigenen wert gespeichert? 00693 int flags=Query(P_UNIT_DECAY_FLAGS, F_VALUE); 00694 if (flags) 00695 return flags; 00696 // sonst den Wert aus der Blueprint 00697 if (objectp(blueprint())) 00698 return blueprint()->QueryProp(P_UNIT_DECAY_FLAGS); 00699 else 00700 return load_object(load_name())->QueryProp(P_UNIT_DECAY_FLAGS); 00701 } 00702 // Die BP liefert den Wert auf jeden Fall ohne NO_DECAY_UNTIL_MOVE zurueck, 00703 // weil dieses Flag im Falle der BP nicht zurueckgesetzt wird und bei Clients 00704 // ohne eigene Flags der Zerfall stoppen wuerde. 00705 return Query(P_UNIT_DECAY_FLAGS, F_VALUE) & ~NO_DECAY_UNTIL_MOVE; 00706 }
| static int _query_unit_decay_interval | ( | ) | [static] |
Definiert in Zeile 604 der Datei unit.c.
00604 { 00605 if (clonep()) { 00606 // fuer clones den Wert aus der BP liefern, der Wert in Clones ist eh 00607 // uninteressant. 00608 if (objectp(blueprint())) 00609 return blueprint()->QueryProp(P_UNIT_DECAY_INTERVAL); 00610 else 00611 return load_object(load_name())->QueryProp(P_UNIT_DECAY_INTERVAL); 00612 } 00613 return Query(P_UNIT_DECAY_INTERVAL); 00614 }
| static int _query_unit_decay_min | ( | ) | [static] |
Definiert in Zeile 675 der Datei unit.c.
00675 { 00676 if (clonep()) { 00677 // hat dieses Objekt einen eigenen wert gespeichert? 00678 int minimum=Query(P_UNIT_DECAY_MIN, F_VALUE); 00679 if (minimum) 00680 return minimum; 00681 // sonst den Wert aus der Blueprint 00682 if (objectp(blueprint())) 00683 return blueprint()->QueryProp(P_UNIT_DECAY_MIN); 00684 else 00685 return load_object(load_name())->QueryProp(P_UNIT_DECAY_MIN); 00686 } 00687 return Query(P_UNIT_DECAY_MIN, F_VALUE); 00688 }
| static int _query_unit_decay_quota | ( | ) | [static] |
Definiert in Zeile 652 der Datei unit.c.
00652 { 00653 if (clonep()) { 00654 // hat dieses Objekt einen eigenen wert gespeichert? 00655 int quota=Query(P_UNIT_DECAY_QUOTA, F_VALUE); 00656 if (quota) 00657 return quota; 00658 // sonst den Wert aus der Blueprint 00659 if (objectp(blueprint())) 00660 return blueprint()->QueryProp(P_UNIT_DECAY_QUOTA); 00661 else 00662 return load_object(load_name())->QueryProp(P_UNIT_DECAY_QUOTA); 00663 } 00664 return Query(P_UNIT_DECAY_QUOTA, F_VALUE); 00665 }
| static int _query_value | ( | ) | [static] |
Definiert in Zeile 68 der Datei unit.c.
Benutzt Query(), U_CPU und U_REQ.
00069 { 00070 mixed cpu; 00071 cpu=Query(U_CPU); 00072 if (intp(cpu)) return Query(U_REQ)*(int)cpu; 00073 if (!pointerp(cpu)) return 0; 00074 return (Query(U_REQ)*cpu[0])/cpu[1]; 00075 }

| static int _query_weight | ( | ) | [static] |
Definiert in Zeile 83 der Datei unit.c.
Benutzt MAX, Query(), U_GPU und U_REQ.
00084 { 00085 mixed gpu, req; 00086 if ((req=Query(U_REQ))<1) return 0; 00087 gpu=Query(U_GPU); 00088 if (intp(gpu)) return req*(int)gpu; 00089 if (!pointerp(gpu)) return 0; 00090 return MAX(1,(req*gpu[0])/gpu[1]); 00091 }

| static int _set_amount | ( | int | am | ) | [static] |
| static mixed _set_name | ( | mixed | names | ) | [static] |
Definiert in Zeile 126 der Datei unit.c.
Benutzt P_NAME, QueryProp() und Set().
00127 { 00128 if(!names) 00129 return Set(P_NAME,({"",""})); 00130 if(stringp(names)) 00131 return Set(P_NAME,({names,names})); 00132 if(pointerp(names)) 00133 switch(sizeof(names)) { 00134 case 0: return Set(P_NAME,({"",""})); 00135 case 1: if(!stringp(names[0])) 00136 names[0]=""; 00137 return Set(P_NAME,({names[0],names[0]})); 00138 default: if(!stringp(names[0])) 00139 names[0]=""; 00140 if(!stringp(names[1])) 00141 names[1]=""; 00142 return Set(P_NAME,names[0..1]); 00143 } 00144 return QueryProp(P_NAME); 00145 }

| static int _set_unit_decay_interval | ( | int | zeit | ) | [static] |
Definiert in Zeile 616 der Datei unit.c.
00616 { 00617 // fuer Clones ist die Prop sinnlos und kann nicht gesetzt werden. 00618 if (clonep()) { 00619 if (objectp(blueprint())) 00620 return blueprint()->QueryProp(P_UNIT_DECAY_INTERVAL); 00621 else 00622 return load_object(load_name())->QueryProp(P_UNIT_DECAY_INTERVAL); 00623 } 00624 // ueber diese Prop liesse sich der Reset relativ beliebig veraendern, 00625 // verhindern, etc. Daher darf sie nur von diesem Objekt gesetzt werden, von 00626 // Weisen+ oder eines Objektes, das die gleiche UID hat wie dieses hier oder 00627 // des Programmieres dieses Objekts oder eines Magiers, der berechtigt fuer 00628 // die jeweilige UID ist. Letztere beiden werden ueber den Ruf von 00629 // QueryUIDsForWizard() ermittelt. 00630 // erstes fremdes Objekt finden und pruefen. 00631 foreach(object po: caller_stack(1)) { 00632 if (po != ME) { 00633 // fremden Aufrufer gefunden 00634 if (getuid(po) != getuid(ME) 00635 && member(master()->QueryUIDsForWizard(getuid(po)),getuid(ME)) == -1 00636 && (!this_interactive() || !IS_ELDER(this_interactive()) ) ) 00637 // unberechtigt, Abbruch 00638 return QueryProp(P_UNIT_DECAY_INTERVAL); 00639 else 00640 // nur das erste ext. Objekt in der Callkette wird geprueft, raus. 00641 break; 00642 } 00643 } 00644 set_next_reset(zeit); 00645 // falls dies aus dem create() gesetzt wird, muss zeitverzoegert eine 00646 // Funktion von aussen am Objekt gerufen werden, da nach einem create() das 00647 // Objekt als resettet gilt und sonst keinen Reset kriegt. 00648 call_out("_query_unit_decay_interval",1); 00649 return Set(P_UNIT_DECAY_INTERVAL, zeit, F_VALUE); 00650 }
| static int _set_unit_decay_quota | ( | int | quota | ) | [static] |
Definiert in Zeile 667 der Datei unit.c.
00667 { 00668 // momentan nur quota zwischen 0 und 10000 00669 if (quota >= 0 && quota <=10000) 00670 return Set(P_UNIT_DECAY_QUOTA, quota, F_VALUE); 00671 else 00672 return Query(P_UNIT_DECAY_QUOTA, F_VALUE); 00673 }
| static int _set_value | ( | int | num | ) | [static] |
Definiert in Zeile 77 der Datei unit.c.
Benutzt P_VALUE, Query(), QueryProp(), SetCoinsPerUnits() und U_REQ.
00077 { 00078 // Setzt den Wert fuer die derzeitige Anzahl 00079 SetCoinsPerUnits(num, Query(U_REQ)); 00080 return QueryProp(P_VALUE); 00081 }

| static int _set_weight | ( | int | num | ) | [static] |
Definiert in Zeile 93 der Datei unit.c.
Benutzt P_WEIGHT, Query(), QueryProp(), SetGramsPerUnits() und U_REQ.
00093 { 00094 // Setzt das Gewicht fuer die derzeitige Anzahl 00095 SetGramsPerUnits(num, Query(U_REQ)); 00096 return QueryProp(P_WEIGHT); 00097 }

| void AddAmount | ( | int | am | ) |
| void AddPluralId | ( | mixed | str | ) |
Definiert in Zeile 166 der Datei unit.c.
Benutzt ids, Query(), Set() und U_IDS.
Wird benutzt von create().
00167 { 00168 string *ids; 00169 00170 if (!pointerp(str)) 00171 str=({str}); 00172 ids=Query(U_IDS); 00173 Set(U_IDS,({ids[0],ids[1]+str})); 00174 }


| void AddSingularId | ( | mixed | str | ) |
Definiert in Zeile 149 der Datei unit.c.
Benutzt ids, Query(), Set() und U_IDS.
Wird benutzt von create().
00150 { 00151 string *ids; 00152 if (!pointerp(str)) 00153 str=({str}); 00154 ids=Query(U_IDS); 00155 Set(U_IDS,({ids[0]+str,ids[1]})); 00156 }


| static void check_leave | ( | ) | [static] |
| protected void create | ( | ) |
Definiert in Zeile 31 der Datei unit.c.
Benutzt create(), F_MODE_AS, P_AMOUNT, P_GENDER, P_UNIT_DECAY_INTERVAL, P_UNIT_DECAY_QUOTA, PROTECTED, Set(), SetProp() und U_IDS.
00032 { 00033 ::create(); 00034 SetProp(U_IDS,({({}),({})})); 00035 SetProp(P_GENDER, 1); 00036 SetProp(P_AMOUNT, 1); 00037 // Props sollten nicht direkt manipuliert werden, nur ueber Set-Methoden 00038 Set(P_UNIT_DECAY_INTERVAL, PROTECTED, F_MODE_AS); 00039 Set(P_UNIT_DECAY_QUOTA, PROTECTED, F_MODE_AS); 00040 }

| protected void create_super | ( | ) |
Definiert in Zeile 42 der Datei unit.c.
Benutzt set_next_reset().
00042 { 00043 set_next_reset(-1); 00044 }

| public int DoDecay | ( | int | silent | ) |
Definiert in Zeile 497 der Datei unit.c.
00497 { 00498 // nur fuer Clones 00499 if (!clonep()) 00500 return 0; 00501 ZDEBUG(sprintf("DoDecay() in %O\n",ME)); 00502 00503 // wenn das Objekt NO_DECAY oder NO_DECAY_UNTIL_MOVE in den Flags 00504 // zerfaellt nix. 00505 int flags = QueryProp(P_UNIT_DECAY_FLAGS); 00506 if ((flags & NO_DECAY) || (flags & NO_DECAY_UNTIL_MOVE) ) 00507 return QueryProp(P_AMOUNT); 00508 00509 int quota = QueryProp(P_UNIT_DECAY_QUOTA); 00510 00511 // Zugewinn ist nicht. Ausserdem kann nicht mehr zerfallen, als da ist... 00512 // Also ohne gueltiges Quota raus. Nur bei abs. Zerfall sind Zahlen > 10000 00513 // erlaubt, bei relativen Zerfall waere das sinnlos. 00514 if (quota <= 0 || 00515 (quota > 10000 && !(flags & ABSOLUTE_DECAY) ) ) 00516 return QueryProp(P_AMOUNT); 00517 00518 int amount = QueryProp(P_AMOUNT); 00519 int minimum = QueryProp(P_UNIT_DECAY_MIN); 00520 // Zerfall nur, wenn man mehr als das Minimum hat. 00521 if (amount > minimum) { 00522 int zerfall; 00523 if (flags & ABSOLUTE_DECAY) { 00524 // Decay Quota soll einfach als abs. Zahl aufgefasst werden: 00525 zerfall = quota; 00526 } 00527 else if (flags & INACCURATE_DECAY) { 00528 // Rundungsfehler ignorieren und dafuer immer min. eine Einheit 00529 // zerfallen lassein 00530 zerfall = (amount * quota) / 10000; 00531 if (zerfall <= 0) zerfall = 1; 00532 } 00533 else { 00534 // Standardfall: 00535 // nicht-ganzzahligen Rest als Wahrscheinlichkeit fuer den Zerfall einer 00536 // Einheit auffassen 00537 float tmp = amount * quota / 10000.0; 00538 zerfall = to_int(tmp); 00539 tmp -= zerfall; // Rest in tmp 00540 // tmp*n ist eine Zahl zwischen 0 und n, wenn tmp*n > random(n)+1, 00541 // dann zerfaellt eine Einheit extra. Da das Random fuer grosse Zahlen 00542 // besser verteilt ist, nehm ich n = __INT_MAX__ 00543 if (ceil(tmp * __INT_MAX__) > random(__INT_MAX__) + 1) 00544 zerfall++; 00545 } 00546 00547 // nicht unter Minimum zerfallen 00548 if (amount - zerfall < minimum) 00549 zerfall = amount - minimum; 00550 00551 // erst ggf. Meldung ausgeben. 00552 if (!silent) 00553 DoDecayMessage(amount, zerfall); 00554 // dann runtersetzen. 00555 SetProp(P_AMOUNT, amount - zerfall); 00556 ZDEBUG(sprintf("%O decayed by %d\n",ME, zerfall)); 00557 return amount-zerfall; 00558 } 00559 else if (amount < 0) 00560 return 0; // neg. Anzahl gilt als "0 uebrig". 00561 00562 // sonst ists wohl zwischen 0 und minimum, nix aendert sich. 00563 return amount; 00564 }
| protected void DoDecayMessage | ( | int | oldamount, | |
| int | zerfall | |||
| ) |
Definiert in Zeile 571 der Datei unit.c.
00571 { 00572 string msg; 00573 if (oldamount == zerfall) { 00574 if (living(environment())) { 00575 tell_object(environment(), break_string(sprintf( 00576 "Auf einmal %s%s zu Staub!", 00577 (oldamount>1?"zerfallen Deine ":"zerfaellt D"), name(WER)),78)); 00578 } 00579 // das tell_room() muss auf jeden fall sein, weil es "lebende" Raeume 00580 // gibt. Liegt der KRam in einem solchen wuerden die Livings in diesem Raum 00581 // sonst keine meldung kriegen. 00582 tell_room(environment(), break_string(sprintf( 00583 "Auf einmal %s %s zu Staub!", 00584 (oldamount>1?"zerfallen":"zerfaellt"), name(WER)),78), 00585 ({environment()})); 00586 } 00587 else { 00588 if (living(environment())) { 00589 tell_object(environment(), break_string(sprintf( 00590 "Auf einmal %s %d Deiner %s zu Staub!", 00591 (zerfall>1?"zerfallen":"zerfaellt"), 00592 zerfall, Query(P_NAME)[1]),78)); 00593 } 00594 // das tell_room() muss auf jeden fall sein, weil es "lebende" Raeume 00595 // gibt. Liegt der KRam in einem solchen wuerden die Livings in diesem Raum 00596 // sonst keine meldung kriegen. 00597 tell_room(environment(), break_string(sprintf( 00598 "Auf einmal %s %d %s zu Staub!", 00599 (zerfall>1?"zerfallen":"zerfaellt"), 00600 zerfall, Query(P_NAME)[1]),78), ({environment()}) ); 00601 } 00602 }
| varargs int id | ( | string | str, | |
| int | lvl | |||
| ) |
Definiert in Zeile 291 der Datei unit.c.
00292 { 00293 int i,amount; 00294 string s1,s2,*ids; 00295 00296 if (!str) return 0; 00297 if (lastverb!=query_verb()) lastverb=0; 00298 if (::id(str)) { 00299 Set(U_REQ, Query(P_AMOUNT)); 00300 lastverb=query_verb(); 00301 return 1; 00302 } 00303 amount=Query(P_AMOUNT); 00304 //die casts auf 'mixed' sind absicht. Sonst geht der Driver offenbar davon 00305 //aus, dass ids[1] ein String ist. Es ist aber aber ein Array von Strings 00306 //und genau das will auch match_item() haben. ;-) Zesstra 00307 if (!amount || !(ids=Query(U_IDS))) return 0; 00308 if (match_item(str,(mixed)ids[1] )) { 00309 Set(U_REQ, amount); 00310 lastverb=query_verb(); 00311 return 1; 00312 } 00313 if (match_item(str,(mixed)ids[0] )) { 00314 Set(U_REQ,1); 00315 lastverb=query_verb(); 00316 return 1; 00317 } 00318 if (sscanf(str,"%s %s",s1,s2) && s1[0..3]=="alle" && 00319 match_item(s2,(mixed)ids[1] )) { 00320 Set(U_REQ, amount); 00321 lastverb=query_verb(); 00322 return 1; 00323 } 00324 if (sscanf(str,"%d %s",i,s1)==2 && i==1 && match_item(s1,(mixed)ids[0] )) { 00325 Set(U_REQ,1); 00326 lastverb=query_verb(); 00327 return 1; 00328 } 00329 if (sscanf(str,"%d %s",i,s1)==2 && match_item(s1,(mixed)ids[1] ) && 00330 i<=amount && i>0) { 00331 Set(U_REQ,i); 00332 lastverb=query_verb(); 00333 return 1; 00334 } 00335 return 0; 00336 }
| int IsEqual | ( | object | ob | ) |
| int IsUnit | ( | ) |
Definiert in Zeile 220 der Datei unit.c.
Wird benutzt von cmd_shoot().

| varargs string long | ( | ) |
| varargs int move | ( | mixed | dest, | |
| int | method | |||
| ) |
Definiert in Zeile 338 der Datei unit.c.
00339 { 00340 int i, j, amount, req; 00341 string fname; 00342 mixed env; 00343 00344 amount = QueryProp(P_AMOUNT); 00345 req = QueryProp(U_REQ); 00346 fname = BLUE_NAME(ME); 00347 00348 if ( !(method & (M_MOVE_ALL|M_FORCE_SPLIT)) && amount != req ){ 00349 env = environment(); // wird nur benoetigt bei amount!=U_REQ 00350 00351 if ( env ) 00352 env->query_weight_contents(); 00353 // wenn in einem alten Paket das Gewicht noch nicht neu berechnet 00354 // wurde muss dies geschehn solange die Muenzen im Paket noch das 00355 // volle Gewicht haben... 00356 Set( P_AMOUNT, req ); 00357 } 00358 00359 i = ::move( dest, method ); 00360 00361 if ( i != 1 ){ 00362 if (env){ 00363 Set( P_AMOUNT, amount ); // verfruehte Aenderung rueckgaengig machen 00364 // ohne move auch keine Aenderung an P_LAST_CONTENT_CHANGE noetig 00365 } 00366 00367 return i; 00368 } 00369 00370 if (env) { // schliesst automatisch amount != req mit ein! 00371 if ( env == environment() && !(method & M_NOCHECK) ){ 00372 // Objekt wurde nur an den Anfang des inventory bewegt, sonst nichts. 00373 Set( P_AMOUNT, amount ); // verfruehte Aenderung rueckgaengig machen. 00374 env = this_object(); 00375 00376 while ( env = environment(env) ) 00377 // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf. 00378 // Aber das move() ist schon *so* rechenintensiv und gerade der 00379 // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir 00380 // da um jedes bisschen Rechenzeit geht. 00381 // Der Zweck heiligt ja bekanntlich die Mittel. ;-) 00382 // 00383 // Tiamak 00384 env->_set_last_content_change(); // wurde beim ::move veraendert 00385 } 00386 else{ // verbleibende Muenzen zurueck moven 00387 object temp; 00388 temp = clone_object(fname); 00389 temp->SetProp( P_AMOUNT, amount-req ); 00390 temp->move( env, M_NOCHECK ); 00391 } 00392 } 00393 00394 // wenn man in frisch geclonten Muenzen die noch kein environment haben 00395 // per Hand U_REQ auf einen Wert != P_AMOUNT setzt, so gehen die 00396 // Restmuenzen verloren (man behaelt ja eh keinen Zeiger darauf). 00397 if ( method & M_NOCHECK || !environment() ) 00398 return 1; 00399 00400 foreach(object item: all_inventory(environment())) { 00401 if ( IS_EQUAL(item) ) { // feature, bitte nicht ausbauen!!! 00402 amount = Query(P_AMOUNT) + item->Query(P_AMOUNT); 00403 item->Set( P_AMOUNT, 0 ); 00404 item->remove(); 00405 00406 Set( P_AMOUNT, amount ); 00407 if ( req < 0 ) 00408 Set( U_REQ, amount ); 00409 } 00410 } 00411 00412 if ( amount < 1 ) 00413 call_out( "check_leave", 1 ); 00414 00415 return 1; 00416 }
| varargs string name | ( | int | fall, | |
| int | demo | |||
| ) |
Definiert in Zeile 233 der Datei unit.c.
Benutzt name, P_NAME_ADJ, Query(), QueryProp(), RAW und U_REQ.
00234 { 00235 int req; 00236 mixed n_adj; 00237 string adj; 00238 00239 if ((req=Query(U_REQ))<1) return 0; 00240 if (fall!=RAW && 00241 pointerp(n_adj=QueryProp(P_NAME_ADJ)) && sizeof(n_adj) ) 00242 adj = implode(map(n_adj, #'DeclAdj, fall, demo && req==1), ""); 00243 else 00244 adj = ""; 00245 00246 if (req==1) 00247 return sprintf(QueryProp(P_NAME), 00248 (fall==RAW || !QueryProp(P_ARTICLE) 00249 ? "" : QueryArticle(fall,demo,1)), adj) /* +korrektur */; 00250 00251 if (fall!=WEM) 00252 return sprintf(QueryProp(P_NAME), req, adj); 00253 else { 00254 int last; 00255 last=Query(P_NAME)[1][<1]; 00256 return sprintf(QueryProp(P_NAME), req, adj) 00257 +(last!='s' && last!='n' ? "n" : ""); 00258 } 00259 }

| protected void NotifyMove | ( | object | dest, | |
| object | oldenv, | |||
| int | method | |||
| ) |
Definiert in Zeile 455 der Datei unit.c.
Benutzt NO_DECAY_UNTIL_MOVE, NotifyMove(), P_UNIT_DECAY_FLAGS, QueryProp() und SetProp().
00455 { 00456 //TODO: Kram aus dem move() hierher verlagern. 00457 00458 // wenn NO_DECAY_UNTIL_MOVE an ist und dieses ein Move ist, was von einem 00459 // Env in ein anderes Env geht, loeschen. Nicht geloescht wird 00460 // hingegen, wenn das move() in das allererste Env erfolgt (nach dem Clonen) 00461 if ( (QueryProp(P_UNIT_DECAY_FLAGS) & NO_DECAY_UNTIL_MOVE) 00462 && objectp(dest) && objectp(oldenv) && dest != oldenv) 00463 SetProp(P_UNIT_DECAY_FLAGS, 00464 QueryProp(P_UNIT_DECAY_FLAGS) & ~NO_DECAY_UNTIL_MOVE ); 00465 ::NotifyMove(dest, oldenv, method); 00466 }

| int* QueryCoinsPerUnits | ( | ) |
| int* QueryGramsPerUnits | ( | ) |
| varargs string QueryPronoun | ( | int | casus | ) |
| varargs int remove | ( | ) |
Definiert in Zeile 445 der Datei unit.c.
Benutzt lastverb, P_AMOUNT, Query(), remove(), SetProp() und U_REQ.
00446 { 00447 if (lastverb==query_verb() && Query(P_AMOUNT)>Query(U_REQ)) { 00448 SetProp(P_AMOUNT, Query(P_AMOUNT)-Query(U_REQ)); 00449 return 1; 00450 } 00451 return ::remove(); 00452 }

| void RemovePluralId | ( | mixed | str | ) |
| void RemoveSingularId | ( | mixed | str | ) |
| void reset | ( | void | ) |
Definiert in Zeile 418 der Datei unit.c.
00418 { 00419 if (!clonep(ME)) { 00420 // Blueprint ist Master fuer zerfallende Unitobjekte 00421 // das Decay sollte besser nicht durch manuellen Aufruf in der BP 00422 // ausgeloest werden, daher Pruefung hier (PO == ME, falls der Reset vom 00423 // Driver kommt). 00424 if (previous_object() && previous_object() != ME) 00425 return; 00426 int zeit = QueryProp(P_UNIT_DECAY_INTERVAL); 00427 if (zeit > 0) { 00428 set_next_reset(zeit); 00429 // Das Callout muss auf jeden Fall gemacht werden, wenn ein Decay 00430 // Intervall gesetzt ist, damit die Blueprint auch den naechsten Reset 00431 // kriegt, auch wenn es jetzt keine Clone gibt. Wenn es kein Quota gibt, 00432 // kann der Callout wegfallen, beim Setzen eines Quota wird ja eine 00433 // Funktion an diesem Objekt gerufen. 00434 if (QueryProp(P_UNIT_DECAY_QUOTA) > 0) 00435 call_out(#'_call_DoDecay, 1, 0); 00436 } 00437 } 00438 else { 00439 // Clones 00440 if (Query(P_AMOUNT)<1) remove(); 00441 else ::reset(); 00442 } 00443 }
| void SetCoinsPerUnits | ( | int | coins, | |
| int | units | |||
| ) |
Definiert in Zeile 184 der Datei unit.c.
Wird benutzt von _set_value() und create().
00185 { 00186 if (coins<0||units<=0) return; 00187 if (units==1) 00188 Set(U_CPU, coins); 00189 else Set(U_CPU,({coins,units})); 00190 }


| void SetGramsPerUnits | ( | int | grams, | |
| int | units | |||
| ) |
Definiert in Zeile 192 der Datei unit.c.
Wird benutzt von _set_weight() und create().
00193 { 00194 if (grams<0||units<=0) return; 00195 if (units==1) 00196 Set(U_GPU, grams); 00197 else Set(U_GPU,({grams,units})); 00198 }


| string short | ( | ) |
Definiert in Zeile 273 der Datei unit.c.
00274 { 00275 int req; 00276 if (!lastverb||query_verb()!=lastverb) Set(U_REQ, Query(P_AMOUNT)); 00277 if ((req=Query(U_REQ))<1 || QueryProp(P_INVIS)) return 0; 00278 return capitalize(name(WER,0))+".\n"; 00279 /* 00280 if (req>1) return sprintf(QueryProp(P_NAME), req)+".\n"; 00281 return capitalize(sprintf(QueryProp(P_NAME), QueryArticle(WER,0,1)))+".\n"; 00282 */ 00283 }
| private nosave string lastverb |
Definiert in Zeile 29 der Datei unit.c.
Wird benutzt von _query_u_req() und remove().
1.6.3