#include <sys_debug.h>#include <thing/properties.h>#include <thing/commands.h>#include <thing/description.h>#include <language.h>#include <combat.h>#include <attributes.h>#include <defines.h>#include <moving.h>#include <new_skills.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
Funktionen | |
| void | create () |
| void | doWieldMessage () |
| void | doUnwieldMessage (object wielded_by) |
| protected void | InformWield (object pl, int silent) |
| protected void | InformUnwield (object pl, int silent) |
| varargs int | wield_me (int silent) |
| varargs int | DoWield (int silent) |
| varargs int | DoUnwield (int silent) |
| varargs int | wield (string str, int silent) |
| int | unwield (string str) |
| int | QueryDamage (object enemy) |
| int | QueryDefend (string *dam_type, mixed spell, object enemy) |
| int | _set_nr_hands (int arg) |
| mixed | _set_dam_type (mixed arg) |
| mixed | _set_item_damaged (mixed arg) |
| mixed | _set_hit_func (mixed arg) |
| mixed | _set_defend_func (mixed arg) |
| int | _query_max_wc () |
| int | Damage (int new_dam) |
| varargs void | TakeFlaw (object enemy) |
| mixed * | QueryFlaw () |
Variablen | |
| int | ftime |
| int | flaw |
| static private int | logged |
| static private closure | defend_cl |
| static private closure | hit_cl |
| int _query_max_wc | ( | ) |
Definiert in Zeile 693 der Datei combat.c.
Benutzt P_DAMAGED, P_EFFECTIVE_WC, P_WC und QueryProp().
00694 { int a,b; 00695 00696 a=QueryProp(P_WC)+QueryProp(P_DAMAGED); 00697 b=QueryProp(P_EFFECTIVE_WC); 00698 if (b>a) 00699 return b; 00700 return a; 00701 }

| mixed _set_dam_type | ( | mixed | arg | ) |
Definiert in Zeile 645 der Datei combat.c.
Benutzt F_VALUE, P_DAM_TYPE, Query() und Set().
00646 { 00647 if (pointerp(arg)) 00648 { 00649 return Set(P_DAM_TYPE, arg, F_VALUE); 00650 } 00651 else if (stringp(arg)) 00652 { 00653 return Set(P_DAM_TYPE, ({ arg }), F_VALUE); 00654 } 00655 return Query(P_DAM_TYPE, F_VALUE); 00656 }

| mixed _set_defend_func | ( | mixed | arg | ) |
Definiert in Zeile 684 der Datei combat.c.
Benutzt defend_cl, F_VALUE, P_DEFEND_FUNC und Set().
00685 { 00686 defend_cl=0; 00687 return Set(P_DEFEND_FUNC, arg, F_VALUE); 00688 }

| mixed _set_hit_func | ( | mixed | arg | ) |
Definiert in Zeile 676 der Datei combat.c.
Benutzt F_VALUE, hit_cl, P_HIT_FUNC und Set().
00677 { 00678 hit_cl=0; 00679 return Set(P_HIT_FUNC, arg, F_VALUE); 00680 }

| mixed _set_item_damaged | ( | mixed | arg | ) |
Definiert in Zeile 660 der Datei combat.c.
Benutzt F_VALUE, P_DAMAGED, Query(), QueryProp() und Set().
00661 { 00662 if (arg && !intp(arg)) 00663 { 00664 return Query(P_DAMAGED, F_VALUE); 00665 } 00666 00667 if (previous_object(1)) 00668 call_other("/secure/awmaster","RegisterDamager", 00669 previous_object(1),QueryProp(P_DAMAGED),arg); 00670 00671 return Set(P_DAMAGED,arg,F_VALUE); 00672 }

| int _set_nr_hands | ( | int | arg | ) |
| void create | ( | ) |
Definiert in Zeile 33 der Datei combat.c.
Benutzt AddCmd(), defend_cl, DT_BLUDGEON, F_MODE_AS, F_VALUE, flaw, ftime, hit_cl, logged, P_AC, P_DAM_TYPE, P_DAMAGED, P_LAST_USE, P_PARRY, P_RESTRICTIONS, P_WEAPON_TYPE, P_WIELDED, PARRY_NOT, PROTECTED, Set(), SetProp() und WT_CLUB.
00034 { 00035 // Variablen initialisieren 00036 logged=ftime=flaw=0; 00037 defend_cl=0; 00038 hit_cl=0; 00039 00040 // Einige Grundwerte setzen 00041 SetProp(P_WEAPON_TYPE, WT_CLUB); 00042 SetProp(P_DAM_TYPE, ({DT_BLUDGEON})); 00043 SetProp(P_NR_HANDS, 2); 00044 SetProp(P_PARRY,PARRY_NOT); 00045 SetProp(P_AC,0); 00046 Set(P_RESTRICTIONS,([]),F_VALUE); 00047 Set(P_LAST_USE,time(),F_VALUE); 00048 00049 // Einige Properties sollten nicht von aussen gesetzt werden koennen 00050 Set(P_PARRY, PROTECTED, F_MODE_AS); 00051 Set(P_WIELDED, PROTECTED, F_MODE_AS); 00052 Set(P_LAST_USE,PROTECTED, F_MODE_AS); 00053 00054 // Diese kann von aussen gesetzt werden (noch), aber bitte nur ueber die 00055 // hier definierte Setmethode. 00056 Set(P_DAMAGED, PROTECTED, F_MODE_AS); 00057 00058 // Eine Waffe benoetigt Kommandos, mit denen man sie zuecken 00059 // und wegstecken kann 00060 AddCmd( ({"zueck","zuecke","zieh","ziehe"}), "wield" ); 00061 AddCmd( ({"steck","stecke"}), "unwield" ); 00062 }

| int Damage | ( | int | new_dam | ) |
Definiert in Zeile 707 der Datei combat.c.
Benutzt F_VALUE, MAX_PARRY_CLASS, MAX_WEAPON_CLASS, MIN_PARRY_CLASS, MIN_WEAPON_CLASS, P_AC, P_DAMAGED, P_PARRY, P_TOTAL_AC, P_TOTAL_WC, P_WC, P_WIELDED, PARRY_ONLY, QueryProp(), Set() und SetProp().
00708 { int wc,old_dam; 00709 object w; 00710 00711 // Uebergebenes Argument pruefen 00712 if (!new_dam || !intp(new_dam)) 00713 { 00714 return 0; 00715 } 00716 00717 // Bei Waffen, die nicht ausschliesslich zur Parade eingesetzt werden, 00718 // geht die Beschaedigung auf die Kampfkraft, sprich: P_WC 00719 if (QueryProp(P_PARRY)<PARRY_ONLY) 00720 { 00721 if ((wc=QueryProp(P_WC))<=MIN_WEAPON_CLASS && new_dam>0) 00722 { 00723 // Sonst wuerde Beschaedigung zur Reparatur fuehren 00724 return 0; 00725 } 00726 00727 // Min-WC und Max-WC beachten 00728 if ((wc-new_dam) < MIN_WEAPON_CLASS) 00729 { 00730 new_dam = wc-MIN_WEAPON_CLASS; 00731 } 00732 else if ((wc-new_dam) > MAX_WEAPON_CLASS) 00733 { 00734 new_dam = wc-MAX_WEAPON_CLASS; 00735 } 00736 00737 // Nie mehr als 100% reparieren 00738 if (((old_dam=QueryProp(P_DAMAGED))<-new_dam) && new_dam<0) 00739 { 00740 new_dam=-old_dam; 00741 } 00742 00743 // Aenderungen an der Waffenklasse und der dem Beschaedigungswert 00744 // durchfuehren 00745 SetProp(P_WC,(wc-new_dam)); 00746 // Ausnahmeweise Set, um die loggende Setmethode zu umgehen. 00747 // TODO: SetProp, sobald direktes Beschaedigen raus ist. 00748 Set(P_DAMAGED, old_dam+new_dam, F_VALUE); 00749 00750 // P_TOTAL_WC im Traeger updaten, so vorhanden 00751 if (objectp(w=QueryProp(P_WIELDED))) 00752 w->QueryProp(P_TOTAL_WC); 00753 00754 // Rueckgabewert: Durchgefuehrte Aenderung an P_DAMAGE 00755 return new_dam; 00756 } 00757 00758 // Bei reinen Parierwaffen geht die Beschaedigung auf die 00759 // Schutzwirkung, sprich: P_AC 00760 00761 if ((wc=QueryProp(P_AC))<=0 && new_dam>0) 00762 { 00763 // Sonst wuerde Beschaedigung zur Reparatur fuehren 00764 return 0; 00765 } 00766 00767 // Min-AC=0 und Max-AC beachten 00768 if ((wc-new_dam) < MIN_PARRY_CLASS) 00769 { 00770 new_dam = wc-MIN_PARRY_CLASS; 00771 } 00772 else if ((wc-new_dam) > MAX_PARRY_CLASS) 00773 { 00774 new_dam = wc-MAX_PARRY_CLASS; 00775 } 00776 00777 // Nie mehr als 100% reparieren 00778 if (((old_dam=QueryProp(P_DAMAGED))<-new_dam) && new_dam<0) 00779 { 00780 new_dam=-old_dam; 00781 } 00782 00783 // Aenderungen an der Ruestungsklasse und dem Beschaedigungswert 00784 // durchfuehren 00785 SetProp(P_AC,wc-new_dam); 00786 // Ausnahmeweise Set, um die loggende Setmethode zu umgehen. 00787 // TODO: SetProp, sobald direktes Beschaedigen raus ist. 00788 Set(P_DAMAGED,old_dam+new_dam, F_VALUE); 00789 00790 // P_TOTAL_AC im Traeger updaten, so vorhanden 00791 if (objectp(w=QueryProp(P_WIELDED))) 00792 w->QueryProp(P_TOTAL_AC); 00793 00794 // Rueckgabewert: Durchgefuehrte Aenderung an P_DAMAGE 00795 return new_dam; 00796 }

| varargs int DoUnwield | ( | int | silent | ) |
Definiert in Zeile 403 der Datei combat.c.
Benutzt break_string(), cl, doUnwieldMessage(), InformUnwield(), M_NOCHECK, ME, name, P_CURSED, P_PARRY, P_PARRY_WEAPON, P_TOTAL_AC, P_TOTAL_WC, P_UNWIELD_FUNC, P_UNWIELD_TIME, P_WEAPON, P_WIELDED, PARRY_NOT, PARRY_ONLY, QueryProp(), SetProp() und WEN.
Wird benutzt von move(), remove() und unwield().
00404 { closure cl; 00405 int parry; 00406 mixed res; 00407 object wielded_by; 00408 00409 // Waffen, die nicht gezueckt sind, kann man natuerlich nicht 00410 // wegstecken 00411 if (!objectp(wielded_by=QueryProp(P_WIELDED))) 00412 { 00413 return 0; 00414 } 00415 00416 // Ist eine UnwieldFunc gesetzt, wird diese aufgerufen 00417 if ( objectp(res=QueryProp(P_UNWIELD_FUNC)) && 00418 !(res->UnwieldFunc(ME,silent,wielded_by)) ) 00419 { 00420 // Eine Meldung muss die UnwieldFunc schon selbst ausgeben. 00421 return 1; 00422 } 00423 00424 // Eine verfluchte Waffe kann man natuerlich nicht wegstecken - aber 00425 // auch da gibts Ausnahmefaelle, wie z.B. den Tod eines Spielers 00426 if ((res=QueryProp(P_CURSED)) && !(silent&M_NOCHECK)) 00427 { 00428 if (stringp(res)) 00429 { 00430 // Stand in P_CURSED ein String? Dann diesen ausgeben 00431 tell_object(wielded_by, 00432 (res[<1]=='\n' ? res : break_string(res,78))); 00433 } 00434 else 00435 { 00436 // Sonst eine Standard-Meldung ausgeben 00437 tell_object(wielded_by, break_string( 00438 "Du kannst "+name(WEN)+" nicht wegstecken.",78)); 00439 } 00440 return 1; 00441 } 00442 00443 // Ok, jetzt ist alles klar, die (Parier)Waffe wird weggesteckt 00444 parry=QueryProp(P_PARRY); 00445 cl=symbol_function("SetProp",wielded_by); 00446 00447 if (parry<PARRY_ONLY) 00448 { 00449 // Eintrag als Waffe im Spieler loeschen 00450 funcall(cl,P_WEAPON, 0); 00451 } 00452 if (parry>PARRY_NOT) 00453 { 00454 // Eintrag als Parierwaffe im Spieler loeschen 00455 funcall(cl,P_PARRY_WEAPON, 0); 00456 } 00457 00458 // Im Spieler die Zeit setzen, zu der er zuletzt eine Waffe weggesteckt 00459 // hat. 00460 funcall(cl,P_UNWIELD_TIME,time()); 00461 00462 // Meldung ausgeben, wenn silent-Flag nicht gesetzt ist 00463 if (!silent) 00464 { 00465 doUnwieldMessage(wielded_by); 00466 } 00467 00468 // Die Haende, die bisher von der Waffe benutzt wurden, freigeben 00469 wielded_by->FreeHands(ME); 00470 SetProp(P_WIELDED, 0); 00471 00472 // Waffen koennen Attribute aendern/blockieren. Also muessen diese 00473 // nach dem Wegstecken aktualisiert werden 00474 wielded_by->deregister_modifier(ME); 00475 wielded_by->UpdateAttributes(); 00476 00477 // P_TOTAL_AC/P_TOTAL_WC im Spieler aktualisieren. Da dort Attribute 00478 // eingehen, kann das erst hier gemacht werden. 00479 if (parry<PARRY_ONLY) 00480 { 00481 wielded_by->QueryProp(P_TOTAL_WC); 00482 } 00483 if (parry>PARRY_NOT) 00484 { 00485 wielded_by->QueryProp(P_TOTAL_AC); 00486 } 00487 00488 // Inform-Funktion aufrufen 00489 InformUnwield(wielded_by, silent); 00490 00491 // Fertig mit dem Wegstecken 00492 return 1; 00493 }


| void doUnwieldMessage | ( | object | wielded_by | ) |
Definiert in Zeile 138 der Datei combat.c.
Benutzt break_string(), BS_LEAVE_MY_LFS, name, P_UNWIELD_MSG, QueryProp(), replace_personal(), WEN und WER.
Wird benutzt von DoUnwield().
00139 { 00140 string *str,s1; 00141 00142 if(!objectp(wielded_by)) // Hoops! Gar nicht gezueckt? Abbruch! 00143 { 00144 return; 00145 } 00146 00147 if(QueryProp(P_UNWIELD_MSG)) // Hier gibt es eine UnwieldMsg. 00148 { 00149 if(closurep(QueryProp(P_UNWIELD_MSG))) // Sogar als Closure, wow :-) 00150 { 00151 str = funcall(QueryProp(P_UNWIELD_MSG),wielded_by); 00152 00153 if(interactive(wielded_by)) 00154 { 00155 tell_object(wielded_by,break_string(str[0],78, 0, BS_LEAVE_MY_LFS)); 00156 } 00157 //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player() 00158 //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen, 00159 //obwohl die laengst woanders sind (z.B. Sequenzen) 00160 //Daher nun Ausgabe an das Env vom Env (es ist fuer tell_room() egal, 00161 //ob das nen Raum ist oder nicht, daher keine Pruefung, ob es wirklich 00162 //ein Raum ist. ;-) 00163 //say(break_string(str[1],78,0, BS_LEAVE_MY_LFS),({ wielded_by })); 00164 if ( objectp(environment()) && objectp(environment(environment())) ) 00165 tell_room(environment(environment()), 00166 break_string(str[1],78,0, BS_LEAVE_MY_LFS),({ wielded_by }) ); 00167 00168 return; 00169 } 00170 00171 else if(interactive(wielded_by)) 00172 { 00173 s1 = replace_personal(sprintf(QueryProp(P_UNWIELD_MSG)[0],"@WEN2"), 00174 ({this_player(),this_object()}), 1); 00175 00176 tell_object(wielded_by,break_string(s1,78, 0 , BS_LEAVE_MY_LFS)); 00177 } 00178 00179 s1 = replace_personal(sprintf(QueryProp(P_UNWIELD_MSG)[1],"@WEN1","@WEN2"), 00180 ({wielded_by, this_object()}), 1); 00181 00182 //s.o., ersetzt durch tell_toom() 00183 //say(break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({ wielded_by })); 00184 if ( objectp(environment()) && objectp(environment(environment())) ) 00185 tell_room(environment(environment()), 00186 break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({ wielded_by }) ); 00187 00188 return; 00189 } 00190 /* 00191 * Keine UnwieldMsg, also Default-Meldungen ausgeben. 00192 */ 00193 else if(interactive(wielded_by)) 00194 { 00195 tell_object(wielded_by,break_string("Du steckst " 00196 +name(WEN,1)+" zurueck.",78)); 00197 } 00198 //s.o., ersetzt durch tell_room() 00199 //say(break_string(wielded_by->Name(WER)+" steckt " 00200 // +name(WEN,0)+" zurueck.",78),({ wielded_by })); 00201 if ( objectp(environment()) && objectp(environment(environment())) ) 00202 tell_room(environment(environment()),break_string(wielded_by->Name(WER) 00203 +" steckt "+name(WEN,0)+" zurueck.",78), 00204 ({wielded_by }) ); 00205 }


| varargs int DoWield | ( | int | silent | ) |
Definiert in Zeile 229 der Datei combat.c.
Benutzt _notify_fail(), A_DEX, break_string(), cl, doWieldMessage(), InformWield(), logged, MAX_PARRY_CLASS, MAX_WEAPON_CLASS, ME, name, notify_fail(), P_AC, P_EQUIP_TIME, P_M_ATTR_MOD, P_PARRY, P_PARRY_WEAPON, P_RESTRICTIONS, P_TOTAL_AC, P_TOTAL_WC, P_WC, P_WEAPON, P_WIELD_FUNC, P_WIELDED, PARRY_NOT, PARRY_ONLY, PL, QueryProp(), SetProp(), WEM und WEN.
Wird benutzt von wield().
00230 { int dex, parry; 00231 closure cl; 00232 mixed res; 00233 00234 // Man kann nur Waffen zuecken, die man auch im Inventory hat. 00235 if (environment()!=PL) 00236 { 00237 _notify_fail( break_string( 00238 "Du musst "+name(WEN,1)+" schon erst nehmen!",78) ); 00239 return 0; 00240 } 00241 00242 // Eine gezueckte Waffe kann man natuerlich nicht nochmal zuecken 00243 if (QueryProp(P_WIELDED)) 00244 { 00245 notify_fail("Das hast Du schon gemacht!\n"); 00246 return 0; 00247 } 00248 00249 // Waffen, die ein oder mehrere Attribut veraendern und gegen 00250 // das gesetzte Limit verstossen, haben keine Wirkung bezueglich der 00251 // Attribute. 00252 if ( mappingp(res=QueryProp(P_M_ATTR_MOD)) && PL->TestLimitViolation(res) ) 00253 { 00254 write(break_string( 00255 "Irgendetwas an Deiner Ausruestung verhindert, dass Du Dich mit "+ 00256 name(WEM,1)+" so richtig wohl fuehlst.",78)); 00257 } 00258 00259 // Ueber P_RESTRICTIONS kann man einige Restriktionen definieren, ohne 00260 // gleich auf eine WieldFunc zurueckgreifen zu muessen. 00261 // Die Auswertung erfolgt ueber den RestrictionChecker 00262 if ( (res=QueryProp(P_RESTRICTIONS)) && mappingp(res) && 00263 (res=(string)call_other("/std/restriction_checker","check_restrictions", 00264 PL,res)) && stringp(res) ) 00265 { 00266 notify_fail(res); 00267 return 0; 00268 } 00269 00270 parry=(int)QueryProp(P_PARRY); 00271 dex=(int)PL->QueryAttribute(A_DEX); 00272 00273 // Testen, ob der Spieler die noetige Geschicklichkeit besitzt, um 00274 // mit dieser (Parier)Waffe umgehen zu koennen 00275 if ( ((parry<PARRY_ONLY) && ((dex+8)*10)<QueryProp(P_WC)) || 00276 ((parry>PARRY_NOT) && ((dex+5)*2 )<QueryProp(P_AC)) ) 00277 { 00278 notify_fail( 00279 "Du bist nicht geschickt genug, um mit dieser Waffe umzugehen.\n"); 00280 return 0; 00281 } 00282 00283 // Eine Gezueckte Waffe muss natuerlich erst mal weggesteckt werden. 00284 if ( (parry<PARRY_ONLY) && objectp(res=(object)PL->QueryProp(P_WEAPON)) ) 00285 { 00286 if ( (res->DoUnwield(silent)) && !((object)PL->QueryProp(P_WEAPON)) ) 00287 { 00288 // Wenn die alte Waffe weggesteckt werden konnte, nochmal 00289 // versuchen zu zuecken 00290 return DoWield(silent); 00291 } 00292 else 00293 { 00294 // Sonst Meldung ausgeben 00295 notify_fail("Das geht nicht, solange Du noch eine andere "+ 00296 "Waffe gezueckt hast.\n"); 00297 return 0; 00298 } 00299 } 00300 // Das gleiche gilt natuerlich fuer Parierwaffen 00301 if ( (parry>PARRY_NOT) && objectp(res=(object)PL->QueryProp(P_PARRY_WEAPON)) ) 00302 { 00303 if ( (res->DoUnwield(silent)) && !(PL->QueryProp(P_PARRY_WEAPON)) ) 00304 { 00305 // Wenn die alte Parierwaffe weggesteckt werden konnte, nochmal 00306 // versuchen zu zuecken 00307 return DoWield(silent); 00308 } 00309 else 00310 { 00311 // Sonst Meldung ausgeben 00312 notify_fail("Das geht nicht, solange Du noch eine andere "+ 00313 "Paierwaffe gezueckt hast.\n"); 00314 return 0; 00315 } 00316 } 00317 00318 // Ist eine WieldFunc gesetzt, wird diese aufgerufen. 00319 if (objectp(res=QueryProp(P_WIELD_FUNC)) 00320 && !(res->WieldFunc(ME,silent,environment()))) 00321 { 00322 // Eine Meldung sollte schon von der WieldFunc ausgegeben werden. 00323 return 1; 00324 } 00325 00326 // Die zulaessigen Hoechstwerte duerfen natuerlich nicht 00327 // ueberschritten werden. 00328 if ( (parry<PARRY_ONLY) && (QueryProp(P_WC)>MAX_WEAPON_CLASS) ) 00329 { 00330 notify_fail( 00331 "Ungueltige Waffenklasse, bitte Erzmagier verstaendigen.\n"); 00332 return 0; 00333 } 00334 if ( (parry>PARRY_NOT) && (QueryProp(P_AC)>MAX_PARRY_CLASS) ) 00335 { 00336 notify_fail( 00337 "Ungueltige Parierklasse, bitte Erzmagier verstaendigen.\n"); 00338 return 0; 00339 } 00340 00341 // Testen, ob der Zuecker genug Haende frei hat. 00342 if (!(PL->UseHands(ME,QueryProp(P_NR_HANDS)))) 00343 { 00344 notify_fail("Du hast keine Hand mehr frei.\n"); 00345 return 0; 00346 } 00347 00348 // Ok, jetzt ist alles klar, die (Parier)Waffe wird gezueckt 00349 SetProp(P_WIELDED, PL); 00350 SetProp(P_EQUIP_TIME,time()); 00351 00352 cl=symbol_function("SetProp",PL); 00353 00354 if (parry<PARRY_ONLY) 00355 { 00356 // Dieses Objekt als Waffe setzen 00357 funcall(cl,P_WEAPON, ME ); 00358 } 00359 if (parry>PARRY_NOT) 00360 { 00361 // Dieses Objekt als Parierwaffe setzen 00362 funcall(cl,P_PARRY_WEAPON, ME ); 00363 } 00364 00365 // Waffen koennen Attribute aendern/blockieren. Also muessen diese 00366 // nach dem Zuecken aktualisiert werden 00367 PL->register_modifier(ME); 00368 PL->UpdateAttributes(); 00369 00370 // P_TOTAL_AC/P_TOTAL_WC im Spieler aktualisieren. Da dort Attribute 00371 // eingehen, kann das erst hier gemacht werden. 00372 if (parry<PARRY_ONLY) 00373 { 00374 PL->QueryProp(P_TOTAL_WC); 00375 } 00376 if (parry>PARRY_NOT) 00377 { 00378 PL->QueryProp(P_TOTAL_AC); 00379 } 00380 00381 // Zueck-Meldung ausgeben, wenn das silent-Flag nicht gesetzt ist 00382 if (!silent) 00383 { 00384 doWieldMessage(); 00385 } 00386 00387 // Alle Waffen werden im awmaster registriert, sobald sie von einem 00388 // Spieler gezueckt werden 00389 if (!logged && query_once_interactive(PL)) 00390 { 00391 call_other("/secure/awmaster","RegisterWeapon",ME); 00392 logged=1; 00393 } 00394 00395 // Inform-Funktion aufrufen 00396 InformWield(PL,silent); 00397 00398 // Fertig mit dem Zuecken 00399 return 1; 00400 }


| void doWieldMessage | ( | ) |
Definiert in Zeile 68 der Datei combat.c.
Benutzt break_string(), BS_LEAVE_MY_LFS, Name(), name, P_WIELD_MSG, QueryProp(), replace_personal(), WEN und WER.
Wird benutzt von DoWield().
00069 { 00070 string *str, s1; 00071 00072 if(QueryProp(P_WIELD_MSG)) // Ist eine WieldMsg gesetzt? 00073 { 00074 if(closurep(QueryProp(P_WIELD_MSG))) // Sogar als eigene Fkt.? 00075 { 00076 str = funcall(QueryProp(P_WIELD_MSG),this_player()); 00077 00078 if(interactive(this_player())) 00079 { 00080 write(break_string(str[0],78, 0, BS_LEAVE_MY_LFS)); 00081 } 00082 00083 //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player() 00084 //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen, 00085 //obwohl die laengst woanders sind (z.B. Sequenzen) 00086 //Daher nun Ausgabe an das Env vom Env (es ist fuer tell_room() egal, 00087 //ob das nen Raum ist oder nicht, daher keine Pruefung, ob es wirklich 00088 //ein Raum ist. ;-) 00089 //say(break_string(str[1],78, 0, BS_LEAVE_MY_LFS),({ this_player() })); 00090 if ( objectp(environment()) && objectp(environment(environment())) ) 00091 tell_room(environment(environment()), 00092 break_string(str[1],78, 0, BS_LEAVE_MY_LFS),({ this_player()}) ); 00093 00094 return; 00095 } 00096 00097 else if(interactive(this_player())) 00098 { 00099 s1 = replace_personal(sprintf(QueryProp(P_WIELD_MSG)[0],"@WEN2"), 00100 ({this_player(),this_object()}), 1); 00101 00102 write(break_string(s1,78, 0, BS_LEAVE_MY_LFS)); 00103 } 00104 00105 // Abwaertskompatibel: Das erste %s wird zu WEN1, das zweite zu WEN2 00106 s1 = replace_personal(sprintf(QueryProp(P_WIELD_MSG)[1],"@WEN1","@WEN2"), 00107 ({this_player(), this_object()}), 1); 00108 00109 //s.o., ersetzt durch tell_room() 00110 //say(break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({ this_player() })); 00111 if ( objectp(environment()) && objectp(environment(environment())) ) 00112 tell_room(environment(environment()), 00113 break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({this_player()}) ); 00114 00115 return; 00116 } 00117 /* 00118 * Keine WieldMsg gesetzt, Ausgabe der Default-Meldungen. 00119 */ 00120 else if(interactive(this_player())) 00121 { 00122 write(break_string("Du zueckst "+name(WEN,1)+".",78)); 00123 } 00124 00125 //s.o. ersetzt durch tell_room() 00126 //say(break_string(this_player()->Name(WER)+" zueckt " 00127 // +name(WEN,0)+".",78),({ this_player() })); 00128 if ( objectp(environment()) && objectp(environment(environment())) ) 00129 tell_room(environment(environment()),break_string( 00130 this_player()->Name(WER)+" zueckt "+name(WEN,0) 00131 +".",78),({ this_player() })); 00132 }


| protected void InformUnwield | ( | object | pl, | |
| int | silent | |||
| ) |
Definiert in Zeile 215 der Datei combat.c.
Wird benutzt von DoUnwield().

| protected void InformWield | ( | object | pl, | |
| int | silent | |||
| ) |
| int QueryDamage | ( | object | enemy | ) |
Definiert in Zeile 556 der Datei combat.c.
Benutzt A_STR, hit_cl, P_HIT_FUNC, P_LAST_USE, P_WC, P_WIELDED, QueryProp() und SetProp().
Wird benutzt von Attack().
00557 { int dam; 00558 mixed hit_func; 00559 object wielder; 00560 00561 // Nur gezueckte Waffen machen Schaden 00562 if (!objectp(wielder=QueryProp(P_WIELDED))) 00563 return 0; 00564 00565 // Den Basis-Schaden berechnen. Die Staerke des Benutzers wird 00566 // hier beruecksichtigt. 00567 dam = (2*QueryProp(P_WC)+10*((int)wielder->QueryAttribute(A_STR)))/3; 00568 00569 // Wie gut man getroffen hat, wird ueber ein random() simuliert 00570 dam = random(1+dam); 00571 00572 // Ist eine HitFunc gesetzt, dann wird diese ausgewertet. Der 00573 // Rueckgabe-Wert wird zum Schaden addiert 00574 if (!hit_cl || !get_type_info(hit_cl,2)) 00575 { 00576 if (objectp(hit_func=QueryProp(P_HIT_FUNC))) 00577 { 00578 hit_cl=symbol_function("HitFunc",hit_func); 00579 } 00580 } 00581 if (hit_cl && get_type_info(hit_cl,2)) 00582 { 00583 dam += funcall(hit_cl,enemy); 00584 } 00585 00586 // Zeitpunkt der letzten Benutzung ausgeben 00587 SetProp(P_LAST_USE,time()); 00588 00589 // Berechneten Schaden zurueckgeben 00590 return dam; 00591 }


| int QueryDefend | ( | string * | dam_type, | |
| mixed | spell, | |||
| object | enemy | |||
| ) |
Definiert in Zeile 594 der Datei combat.c.
Benutzt defend_cl, P_AC, P_DEFEND_FUNC, P_LAST_USE, P_WIELDED, PHYSICAL_DAMAGE_TYPES, pl, QueryProp(), SetProp() und SP_PHYSICAL_ATTACK.
00595 { int prot; 00596 mixed def_func; 00597 object pl; 00598 00599 prot = 0; 00600 00601 // Ruestungen schuetzen nur gegen physikalischen Schaden 00602 if (!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) 00603 { 00604 if (sizeof(filter(dam_type,PHYSICAL_DAMAGE_TYPES))) 00605 { 00606 prot = random(1+QueryProp(P_AC)); 00607 } 00608 } 00609 00610 // Ist eine DefendFunc gesetzt, wird diese ausgewertet 00611 if (!defend_cl || !get_type_info(defend_cl,2)) 00612 { 00613 if (objectp(def_func=QueryProp(P_DEFEND_FUNC))) 00614 { 00615 defend_cl=symbol_function("DefendFunc",def_func); 00616 } 00617 } 00618 //Bei Netztoten keine (zurueckschlagende) DefendFunc 00619 if (defend_cl && get_type_info(defend_cl,2) && 00620 objectp(pl=QueryProp(P_WIELDED)) && (!query_once_interactive(pl) || 00621 interactive(pl)) ) 00622 { 00623 // Der Rueckgabewert der DefendFunc wird zum Schutz addiert 00624 prot += funcall(defend_cl, dam_type, spell, enemy); 00625 } 00626 00627 // Zeitpunkt der letzten Benutzung ausgeben 00628 SetProp(P_LAST_USE,time()); 00629 00630 // Berechneten Schutz zurueckgeben 00631 return prot; 00632 }

| mixed* QueryFlaw | ( | ) |
| varargs void TakeFlaw | ( | object | enemy | ) |
Definiert in Zeile 800 der Datei combat.c.
Benutzt c, Damage(), flaw, ftime, P_QUALITY und QueryProp().
00801 { int c; 00802 00803 // Flaw-Wert erhoehen 00804 flaw++; 00805 00806 // Ist der Waffe eine Qualitaet gesetzt worden, so kann es zu einer 00807 // allmaehlichen Beschaedigung der Waffe kommen 00808 if ((c=QueryProp(P_QUALITY)) && !(flaw%c)) 00809 Damage(1); 00810 00811 // Zeitpunkt des ersten Aufrufes festhalten 00812 if (!ftime) 00813 ftime=time(); 00814 }

| int unwield | ( | string | str | ) |
Definiert in Zeile 514 der Datei combat.c.
Benutzt _notify_fail(), DoUnwield(), ME, P_PARRY, P_PARRY_WEAPON, P_WEAPON, P_WIELDED, PARRY_NOT, PARRY_ONLY, PL und QueryProp().
00515 { int parry; 00516 string dummy; 00517 00518 // Erstmal die Eingabe auswerten. Ist dies wirklich ein Kommando 00519 // zum Wegstecken? 00520 if ( !stringp(str) || (sscanf(str,"%s weg", dummy)!=1 && 00521 sscanf(str,"%s ein", dummy)!=1 && 00522 sscanf(str,"%s zurueck", dummy)!=1 ) ) 00523 { 00524 return 0; 00525 } 00526 00527 str = dummy; 00528 parry=QueryProp(P_PARRY); 00529 00530 // Ist wirklich diese Waffe gemeint? 00531 if ( !stringp(str) || !id(str) || 00532 ((parry<PARRY_ONLY)&&((object)PL->QueryProp(P_WEAPON)!=ME)) || 00533 ((parry>PARRY_NOT)&&((object)PL->QueryProp(P_PARRY_WEAPON)!=ME)) ) 00534 { 00535 return 0; 00536 } 00537 00538 // Man kann nur Waffen wegstecken, die man auch bei sich hat 00539 if (environment() != PL) 00540 { 00541 _notify_fail("Diese Waffe gehoert Dir nicht!\n"); 00542 return 0; 00543 } 00544 00545 // Und natuerlich geht das auch nur, wenn die Waffe gezueckt ist. 00546 if (!QueryProp(P_WIELDED)) 00547 { 00548 _notify_fail("Diese Waffe hast Du gar nicht gezueckt ...\n"); 00549 return 0; 00550 } 00551 00552 return DoUnwield(); 00553 }

| varargs int wield | ( | string | str, | |
| int | silent | |||
| ) |
Definiert in Zeile 496 der Datei combat.c.
Benutzt _notify_fail() und DoWield().
00497 { 00498 if ( !stringp(str) || 00499 (query_verb()[0..3]=="zieh" && sscanf(str,"%s hervor",str)!=1) ) 00500 { 00501 return 0; 00502 } 00503 00504 if (!id(str)) 00505 { 00506 _notify_fail("Du hast sowas nicht.\n"); 00507 return 0; 00508 } 00509 00510 return DoWield(silent); 00511 }

| varargs int wield_me | ( | int | silent | ) |
private closure hit_cl [static] |
Definiert in Zeile 31 der Datei combat.c.
Wird benutzt von _set_hit_func(), create() und QueryDamage().
1.6.3