#include <living/skills.h>#include <living/skill_attributes.h>#include <player/life.h>#include <thing/properties.h>#include <new_skills.h>#include <wizlevels.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
| #define | SMUL(x, y) ((x<0 && y<0)?(-1*x*y):(x*y)) |
Funktionen | |
| private void | expire_spell_fatigues () |
| Loescht abgelaufene Keys aus dem spell_fatigue mapping. | |
| protected void | create () |
| nomask protected int | security_check () |
| public int | is_deactivated_skill (string sname, string gilde) |
| static string | _set_guild (string gildenname) |
| static string | _query_guild () |
| static string | _query_visible_guild () |
| static string | _query_visible_subguild_title () |
| static int | _set_guild_level (int num) |
| static int | _query_guild_level () |
| static mixed | _query_guild_prepareblock () |
| static mixed | _set_guild_prepareblock (mixed arg) |
| static string | _set_guild_title (string t) |
| static string | _query_guild_title () |
| static string | _query_title () |
| nomask private int | valid_setskills (string gilde) |
| private mapping | internal_set_newskills (mapping value, string gilde) |
| private mapping | internal_query_newskills (string gilde) |
| static varargs mapping | _set_newskills (mapping value, string gilde) |
| static varargs mapping | _query_newskills (string gilde) |
| private mapping | InternalQuerySkill (string sname, string gilde) |
| public varargs mapping | QuerySkill (string sname, string gilde) |
| public varargs int | QuerySkillAbility (mixed sname, mixed argl) |
| protected varargs mixed | LimitAbility (mixed sinfo, int diff) |
| public varargs void | ModifySkill (string sname, mixed val, int diff, string gilde) |
| public varargs void | LearnSkill (string sname, int add, int diff) |
| public varargs int | UseSpell (string str, string spell) |
| public varargs mixed | UseSkill (string skill, mapping args) |
| public varargs int | CheckSpellFatigue (string key) |
| public varargs int | SetSpellFatigue (int duration, string key) |
| Speichert eine Spellfatigue von <duration> Sekunden fuer <key>. | |
| public void | DeleteSpellFatigue (string key) |
| static int | _set_next_spell (int fatigue) |
| Setmethode fuer P_NEXT_SPELL_TIME. | |
| static int | _query_next_spell () |
| Querymethode fuer P_NEXT_SPELL_TIME. | |
Variablen | |
| inherit std living | std_skills |
| private mapping | spell_fatigues = ([]) |
| private nosave int | valid_setskills_override |
Definiert in Zeile 427 der Datei skills.c.
Wird benutzt von SpellSuccess().
| static string _query_guild | ( | ) | [static] |
Definiert in Zeile 74 der Datei skills.c.
00075 { string res; 00076 00077 if ( !(res=Query(P_GUILD)) && query_once_interactive(this_object()) ) 00078 { 00079 // Spieler, die keiner Gilde angehoeren, gehoeren zur Abenteurergilde 00080 if ( !(res=QueryProp(P_DEFAULT_GUILD)) ) 00081 return DEFAULT_GUILD; 00082 else 00083 Set(P_GUILD,res); 00084 return res; 00085 } 00086 00087 return res; 00088 }
| static int _query_guild_level | ( | ) | [static] |
Definiert in Zeile 124 der Datei skills.c.
00125 { string gilde; 00126 mapping levels; 00127 00128 if ( !(gilde=QueryProp(P_GUILD)) ) 00129 return 0; 00130 00131 if ( gilde=="abenteurer" || gilde=="katzenkrieger" ) 00132 return _set_guild_level(QueryProp(P_LEVEL)); 00133 00134 if ( !mappingp(levels=Query(P_GUILD_LEVEL)) ) 00135 return 0; 00136 00137 return levels[gilde]; 00138 }
| static mixed _query_guild_prepareblock | ( | ) | [static] |
| static string _query_guild_title | ( | ) | [static] |
Definiert in Zeile 183 der Datei skills.c.
00184 { string gilde,t; 00185 object g; 00186 mapping titles; 00187 00188 if ( !(gilde=QueryProp(P_GUILD)) ) 00189 return 0; 00190 00191 if ( !mappingp(titles=Query(P_GUILD_TITLE)) ) 00192 titles=([]); 00193 00194 t=titles[gilde]; 00195 if ( !t && query_once_interactive(this_object()) 00196 && objectp(g=find_object("/gilden/"+gilde)) ) 00197 { 00198 g->adjust_title(this_object()); 00199 SetProp(P_TITLE,0); 00200 00201 if ( !mappingp(titles=Query(P_GUILD_TITLE)) ) 00202 return 0; 00203 00204 t=titles[gilde]; 00205 } 00206 00207 return t; 00208 }
| static varargs mapping _query_newskills | ( | string | gilde | ) | [static] |
Definiert in Zeile 357 der Datei skills.c.
00357 { 00358 00359 // sonst Kopie des spellmappings liefern! Kostet zwar, aber verhindert 00360 // einige andere Bugs und versehentliche Aenderungen an den Skills! 00361 return(deep_copy(internal_query_newskills(gilde))); 00362 }
| static int _query_next_spell | ( | ) | [static] |
Querymethode fuer P_NEXT_SPELL_TIME.
Definiert in Zeile 750 der Datei skills.c.
00750 { 00751 return CheckSpellFatigue(); 00752 }
| static string _query_title | ( | ) | [static] |
| static string _query_visible_guild | ( | ) | [static] |
| static string _query_visible_subguild_title | ( | ) | [static] |
Definiert in Zeile 99 der Datei skills.c.
00100 { string res; 00101 00102 if ( stringp(res=Query(P_VISIBLE_SUBGUILD_TITLE)) ) 00103 return res; 00104 00105 return QueryProp(P_SUBGUILD_TITLE); 00106 }
| static string _set_guild | ( | string | gildenname | ) | [static] |
Definiert in Zeile 58 der Datei skills.c.
00059 { object pre; 00060 00061 if (!objectp(pre=previous_object())) 00062 return 0; 00063 00064 if ( pre!=this_object() // Das Lebewesen selber darf die Gilde setzen, 00065 && object_name(pre)!=GUILDMASTER // der Gildenmaster auch 00066 && !security_check() ) // und auch Erzmagier. 00067 return 0; 00068 00069 Set(P_GUILD,gildenname); 00070 00071 return gildenname; 00072 }
| static int _set_guild_level | ( | int | num | ) | [static] |
Definiert in Zeile 108 der Datei skills.c.
00109 { string gilde; 00110 mapping levels; 00111 00112 if ( !(gilde=QueryProp(P_GUILD)) ) 00113 return 0; 00114 00115 if ( !mappingp(levels=Query(P_GUILD_LEVEL)) ) 00116 levels=([]); 00117 00118 levels[gilde]=num; 00119 Set(P_GUILD_LEVEL,levels); 00120 00121 return num; 00122 }
| static mixed _set_guild_prepareblock | ( | mixed | arg | ) | [static] |
Definiert in Zeile 152 der Datei skills.c.
00153 { mapping res; 00154 string gilde; 00155 00156 if ( !stringp(gilde=QueryProp(P_GUILD)) ) 00157 return 0; 00158 if ( !mappingp(res=Query(P_GUILD_PREPAREBLOCK)) ) 00159 res=([]); 00160 00161 res[gilde]=arg; 00162 Set(P_GUILD_PREPAREBLOCK,res); 00163 00164 return arg; 00165 }
| static string _set_guild_title | ( | string | t | ) | [static] |
Definiert in Zeile 167 der Datei skills.c.
00168 { string gilde; 00169 mapping titles; 00170 00171 if ( !(gilde=QueryProp(P_GUILD)) ) 00172 return 0; 00173 00174 if ( !mappingp(titles=Query(P_GUILD_TITLE)) ) 00175 titles=([]); 00176 00177 titles[gilde]=t; 00178 Set(P_GUILD_TITLE,titles); 00179 00180 return t; 00181 }
| static varargs mapping _set_newskills | ( | mapping | value, | |
| string | gilde | |||
| ) | [static] |
Definiert in Zeile 339 der Datei skills.c.
00339 { 00340 00341 // value auf Mappings normalisieren, ggf. Kopieren 00342 if ( !mappingp(value) ) 00343 value=([]); 00344 else 00345 //zur Sicherheit, wer weiss, was der setzende noch damit macht... 00346 value=deep_copy(value); 00347 00348 // und setzen... 00349 internal_set_newskills(value, gilde); 00350 00351 // und noch ne Kopie von dem Liefern, was wir gesetzt haben (keine Referenz, 00352 // sonst koennte der Aufrufende ja noch im Nachhinein aendern). 00353 return(_query_newskills(gilde)); 00354 }
| static int _set_next_spell | ( | int | fatigue | ) | [static] |
Setmethode fuer P_NEXT_SPELL_TIME.
Definiert in Zeile 745 der Datei skills.c.
00745 { 00746 return SetSpellFatigue(fatigue - time()); 00747 }
| public varargs int CheckSpellFatigue | ( | string | key | ) |
Definiert in Zeile 699 der Datei skills.c.
00699 { 00700 // key==0 is the (default) global spellfatigue. 00701 if (spell_fatigues[key] > time()) 00702 return spell_fatigues[key]; // Ablaufzeit zurueckgeben. 00703 00704 return 0; // ok, keine Sperre. 00705 }
| protected void create | ( | ) |
Definiert in Zeile 31 der Datei skills.c.
Benutzt call_out().
00032 { 00033 // mainly necessary for players, but there may be some NPC with savefiles. 00034 // Additionally, it simplifies expiration of old keys to have it here. 00035 call_out(#'expire_spell_fatigues, 4); 00036 }

| public void DeleteSpellFatigue | ( | string | key | ) |
Definiert in Zeile 729 der Datei skills.c.
00729 { 00730 // key==0 is the (default) global spellfatigue. 00731 efun::m_delete(spell_fatigues, key); 00732 }
| private void expire_spell_fatigues | ( | ) |
Loescht abgelaufene Keys aus dem spell_fatigue mapping.
Definiert in Zeile 736 der Datei skills.c.
00736 { 00737 foreach(string key, int endtime: spell_fatigues) { 00738 if (endtime <= time()) 00739 efun::m_delete(spell_fatigues, key); 00740 } 00741 }
| private mapping internal_query_newskills | ( | string | gilde | ) |
Definiert in Zeile 323 der Datei skills.c.
00323 { 00324 mapping skills; 00325 00326 // richtige Gilde abfragen. 00327 if ( !gilde && !(gilde=QueryProp(P_GUILD)) ) 00328 gilde="ANY"; 00329 00330 skills=Query(P_NEWSKILLS); 00331 00332 if (!mappingp(skills) || !mappingp(skills=skills[gilde]) ) 00333 return ([]); 00334 00335 return(skills); 00336 }
| private mapping internal_set_newskills | ( | mapping | value, | |
| string | gilde | |||
| ) |
Definiert in Zeile 296 der Datei skills.c.
00296 { 00297 mapping skills; 00298 00299 // in der richtigen Gilde setzen. 00300 if ( !gilde && !(gilde=QueryProp(P_GUILD)) ) 00301 gilde="ANY"; 00302 00303 // Query(), hier ist eine Kopie nicht sinnvoll. 00304 if ( !mappingp(skills=Query(P_NEWSKILLS,F_VALUE)) ) { 00305 skills=([]); 00306 Set(P_NEWSKILLS, skills, F_VALUE); 00307 } 00308 00309 // Falls dies hier mal ausgewertet werden sollte, nicht vergessen, dass 00310 // einige Funktion hier im File die Prop evtl. via 00311 // internal_query_newskills() abrufen und direkt aendern... 00312 valid_setskills(gilde); // Sicherheitsueberpruefung 00313 00314 // Skills setzen. Set() unnoetig, weil wir das von Query() gelieferte 00315 // Mapping aendern und das ja via Referenz bekommen haben. 00316 skills[gilde]=value; 00317 //Set(P_NEWSKILLS,skills); 00318 00319 return(value); 00320 }
| private mapping InternalQuerySkill | ( | string | sname, | |
| string | gilde | |||
| ) |
Definiert in Zeile 364 der Datei skills.c.
00364 { 00365 mixed skill, skills; 00366 // In is_any wird gespeichert, ob es ein gildenunabhaengier Skill ist, 00367 // fuer die is_deactivate_skill-Abfrage. 00368 int is_any; 00369 00370 // Skills komplett abfragen, keine spez. Gilde 00371 if (!mappingp(skills=Query(P_NEWSKILLS,F_VALUE))) 00372 return 0; 00373 00374 if (stringp(gilde) && strlen(gilde)) { 00375 //bestimmte Gilde angegeben, gut, dort gucken. 00376 if (mappingp(skills[gilde])) 00377 skill=skills[gilde][sname]; 00378 } 00379 else { 00380 gilde=QueryProp(P_GUILD); //reale Gilde holen 00381 if (gilde && mappingp(skills[gilde]) && 00382 (skill=skills[gilde][sname])) { 00383 // gibt es den Spell in der Gilde des Spielers? 00384 // dann hier nix machen... 00385 } 00386 else if (mappingp(skills["ANY"])) { 00387 // Zum Schluss: Gibt es den Skill vielleicht Gildenunabhaengig? 00388 skill=skills["ANY"][sname]; 00389 // wenn man hier reinkommt, dann spaeter mit is_deactivated_skill() 00390 // pruefen! 00391 is_any=1; 00392 } 00393 } 00394 00395 // wenn kein Skill gefunden, mit 0 direkt raus 00396 if (!skill) return 0; 00397 00398 // ggf. Skills auf Mappings normalisieren und auch direkt im Skillmapping 00399 // 'upgraden' 00400 if ( !mappingp(skill) ) { 00401 skill=([SI_SKILLABILITY:skill]); 00402 skills[gilde][sname]=skill; 00403 } 00404 00405 // Bei gildenunabhaengigen auch im Skillmapping vermerken 00406 if ( is_any ) { 00407 skill+=([SI_GUILD:"ANY"]); 00408 // Ist er vielleicht in der Gilde des Spielers deaktiviert? 00409 // Dies kann nur der Fall sein, wenn es kein Gildenskill ist. 00410 if (is_deactivated_skill(sname,gilde)) { 00411 return 0; 00412 } 00413 } 00414 00415 return(skill); 00416 }
| public int is_deactivated_skill | ( | string | sname, | |
| string | gilde | |||
| ) |
| public varargs void LearnSkill | ( | string | sname, | |
| int | add, | |||
| int | diff | |||
| ) |
Definiert in Zeile 566 der Datei skills.c.
00567 { mapping skill; 00568 string skill2,gilde; 00569 int val; 00570 00571 00572 // Spieler sollen nur lernen, wenn sie interactive sind. Das soll 00573 // natuerlich nur fuer Spieler gelten. 00574 if (query_once_interactive(this_object()) && !interactive()) 00575 return; 00576 00577 if ( add>MAX_SKILLEARN ) 00578 add=MAX_SKILLEARN; 00579 else if ( add<1 ) 00580 add=1; 00581 00582 // Skillmapping ermitteln (hier kommt keine Kopie zurueck) 00583 skill=InternalQuerySkill(sname, 0); 00584 00585 if (mappingp(skill)) 00586 { 00587 val=skill[SI_SKILLABILITY]; 00588 gilde=skill[SI_GUILD]; 00589 } 00590 else 00591 { 00592 val=0; 00593 gilde=0; 00594 } 00595 00596 val+=add; 00597 00598 // Faehigkeit soll durch Erhoehung nicht verschwinden. 00599 if ( !val && add ) 00600 val=1; 00601 00602 ModifySkill(sname,val,diff,gilde); 00603 if ( mappingp(skill) && skill2=skill[SI_INHERIT] ) 00604 LearnSkill(skill2,add/3,diff); 00605 }
| protected varargs mixed LimitAbility | ( | mixed | sinfo, | |
| int | diff | |||
| ) |
Definiert in Zeile 452 der Datei skills.c.
00453 { mixed abil; 00454 int max,old,d2; 00455 00456 abil=(mappingp(sinfo)?sinfo[SI_SKILLABILITY]:sinfo); 00457 00458 if ( !intp(abil) ) 00459 return sinfo; 00460 old=abil; 00461 00462 // Beim Spieler eingetragene Schwierigkeit gilt vor angegebener. 00463 if ( mappingp(sinfo) && (d2=sinfo[SI_DIFFICULTY]) ) 00464 diff=d2; 00465 00466 // diff <-100 soll nicht hemmen und macht keinen Sinn 00467 diff=(diff<(-100))?(-100):diff; 00468 00469 max=MAX_ABILITY-(diff+100)*(35-QueryProp(P_LEVEL)); 00470 00471 // diff|lvl 1:| 3:| 7:| 10:| 13:| 16:| 19:| 22:| 25:| 28:| 31:| 34:| 00472 // ----+------+-----+-----+----+----+----+----+----+----+----+----+----+ 00473 // -50| 83%| 84%| 86%| 87%| 89%| 90%| 92%| 93%| 95%| 96%| 98%| 99%| 00474 // -10| 69%| 72%| 74%| 77%| 80%| 82%| 85%| 88%| 91%| 93%| 96%| 99%| 00475 // 0| 66%| 69%| 72%| 75%| 78%| 81%| 84%| 87%| 90%| 93%| 96%| 99%| 00476 // 10| 62%| 65%| 69%| 72%| 75%| 79%| 82%| 85%| 89%| 92%| 95%| 98%| 00477 // 20| 59%| 62%| 66%| 70%| 73%| 77%| 80%| 84%| 88%| 91%| 95%| 98%| 00478 // 30| 55%| 59%| 63%| 67%| 71%| 75%| 79%| 83%| 87%| 90%| 94%| 98%| 00479 // 40| 52%| 56%| 60%| 65%| 69%| 73%| 77%| 81%| 86%| 90%| 94%| 98%| 00480 // 50| 49%| 53%| 58%| 62%| 67%| 71%| 76%| 80%| 85%| 89%| 94%| 98%| 00481 // 100| 32%| 38%| 44%| 50%| 56%| 62%| 68%| 74%| 80%| 86%| 92%| 98%| 00482 // 150| 15%| 22%| 30%| 37%| 45%| 52%| 60%| 67%| 75%| 82%| 90%| 97%| 00483 // 200| -2%| 7%| 16%| 25%| 34%| 43%| 52%| 61%| 70%| 79%| 88%| 97%| 00484 // 250| -19%| -8%| 2%| 12%| 23%| 33%| 44%| 54%| 65%| 75%| 86%| 96%| 00485 // 300| -36%| -24%| -12%| 0%| 12%| 24%| 36%| 48%| 60%| 72%| 84%| 96%| 00486 // 400| -70%| -55%| -40%|-25%|-10%| 5%| 20%| 35%| 50%| 65%| 80%| 95%| 00487 // 500| -104%| -86%| -68%|-50%|-32%|-14%| 4%| 22%| 40%| 58%| 76%| 94%| 00488 // 600| -138%|-117%| -96%|-75%|-54%|-33%|-12%| 9%| 30%| 51%| 72%| 93%| 00489 00490 if ( abil>max ) 00491 abil=max; 00492 if ( abil>MAX_ABILITY 00493 ) abil=MAX_ABILITY; 00494 else if ( abil<-MAX_ABILITY ) 00495 abil=-MAX_ABILITY; 00496 00497 if ( old && !abil ) 00498 abil=1; 00499 // Faehigkeiten sollen nicht durch die Begrenzung verschwinden 00500 00501 if ( !mappingp(sinfo) ) 00502 return abil; 00503 00504 sinfo[SI_SKILLABILITY]=abil; 00505 00506 return sinfo; 00507 }
| public varargs void ModifySkill | ( | string | sname, | |
| mixed | val, | |||
| int | diff, | |||
| string | gilde | |||
| ) |
Definiert in Zeile 509 der Datei skills.c.
Wird benutzt von FinalSetup(), set_weapon_skills() und StdSkill_Nightvision().
00510 { 00511 mapping skills; 00512 mixed skill; 00513 00514 if ( !stringp(sname) || !strlen(sname) ) 00515 return; 00516 00517 // internal_query_newskills() macht keine Kopie 00518 skills=internal_query_newskills(gilde); 00519 00520 // Skill ermitteln, wenn nicht existiert, wird er angelegt. 00521 if (!skill=skills[sname]) { 00522 skill=([]); 00523 } 00524 00525 // Zur Sicherheit mal das Mapping kopieren, wer weiss, was der 00526 // Aufrufende dieer Funktion selber spaeter damit noch macht. 00527 // ist ok, wenn val kein Mapping ist, dann macht deep_copy nix. 00528 val=deep_copy(val); 00529 00530 // Skill und val normalisieren und vereinigen 00531 if ( mappingp(skill) ) 00532 { 00533 if ( mappingp(val) ) 00534 skill+=val; 00535 else 00536 skill[SI_SKILLABILITY]=val; 00537 } 00538 else 00539 { 00540 if ( mappingp(val) ) 00541 skill=([SI_SKILLABILITY:skill])+val; 00542 else 00543 if (!diff) 00544 skill=([SI_SKILLABILITY:val]); 00545 else 00546 skill=([SI_SKILLABILITY:val,SI_DIFFICULTY:diff]); 00547 } 00548 00549 // Lernen entsprechend SI_DIFFICULTY begrenzen. 00550 if(diff && !member(skill,SI_DIFFICULTY)) 00551 skill[SI_DIFFICULTY]=diff; 00552 skill=LimitAbility(skill,diff || skill[SI_DIFFICULTY]); 00553 00554 // schliesslich im Skillmapping vermerken. Im Normalfall ist der Skill jetzt 00555 // schon geaendert, nicht erst nach dem internal_set_newskills(). 00556 skills[sname]=skill; 00557 00558 // explizites Abspeichern fast ueberfluessig, weil wir oben eine Referenz 00559 // auf das Skillmapping gekriegt haben... 00560 // Aber es koennte sein, dass dies der erste Skill fuer diese Gilde ist, 00561 // dann ist es noetig. Zum anderen wird internal_set_newskills() nochmal 00562 // geloggt. 00563 internal_set_newskills(skills,gilde); 00564 }

| public varargs mapping QuerySkill | ( | string | sname, | |
| string | gilde | |||
| ) |
Definiert in Zeile 418 der Datei skills.c.
00418 { 00419 00420 if (!stringp(sname) || !strlen(sname)) 00421 return 0; 00422 00423 //Kopie zurueckliefern 00424 return(deep_copy(InternalQuerySkill(sname,gilde))); 00425 }
| public varargs int QuerySkillAbility | ( | mixed | sname, | |
| mixed | argl | |||
| ) |
Definiert in Zeile 428 der Datei skills.c.
Wird benutzt von set_weapon_skills().
00429 { mapping skill; 00430 string skill2; 00431 mixed val; 00432 00433 if ( objectp(sname) && stringp(argl) ) 00434 sname = argl; 00435 00436 if ( !(skill=InternalQuerySkill(sname, 0)) ) 00437 return 0; 00438 00439 if ( !intp(val=skill[SI_SKILLABILITY]) ) 00440 return deep_copy(val); 00441 00442 if (skill2=skill[SI_INHERIT]) 00443 { 00444 int val2; 00445 val2=QuerySkillAbility(skill2); 00446 val=(val*MAX_ABILITY+SMUL(val,val2))/(2*MAX_ABILITY); 00447 } 00448 00449 return val; 00450 }

| nomask protected int security_check | ( | ) |
| public varargs int SetSpellFatigue | ( | int | duration, | |
| string | key | |||
| ) |
Speichert eine Spellfatigue von <duration> Sekunden fuer <key>.
<key> darf 0 sein und bezeichnet das globale Spellfatigue. Rueckgabewert: Ablaufzeit der gesetzten Sperre -1, wenn noch eine nicht-abgelaufene Sperre auf dem <key> lag. 0, wenn duration 0 ist.
Definiert in Zeile 713 der Datei skills.c.
Wird benutzt von SetSpellFatigue().
00713 { 00714 // aktuelle Sperre abgelaufen? 00715 if (CheckSpellFatigue(key)) 00716 return -1; // alte Sperre noch aktiv. 00717 00718 duration += time(); 00719 // 0 is OK for <key>, it is the key for global spell fatigues 00720 spell_fatigues[key] = duration; 00721 return duration; 00722 }

| public varargs mixed UseSkill | ( | string | skill, | |
| mapping | args | |||
| ) |
Definiert in Zeile 645 der Datei skills.c.
Wird benutzt von _query_max_weight(), Attack(), CannotSee(), DefendOther(), drink_alcohol(), InformDefend() und SpellDefend().
00646 { mapping sinfo; 00647 string gilde, func,skill2; 00648 mixed res; 00649 closure cl; 00650 00651 if ( !skill || 00652 QueryProp(P_GHOST)) 00653 return 0; 00654 00655 skill=capitalize(skill); 00656 // QuerySkill() liefert eine Kopie des Skillmappings 00657 if ( !(sinfo=QuerySkill(skill,0)) ) 00658 return 0; 00659 00660 if (args) 00661 sinfo+=args; 00662 00663 if ( !closurep(cl=sinfo[SI_CLOSURE]) ) 00664 { 00665 if ( !(func=sinfo[SI_SKILLFUNC]) // Keine Funktion angegeben? 00666 || !(gilde=QueryProp(P_GUILD))) // Keine Gilde angegeben? 00667 { 00668 // Dann Standard-Funktion nehmen, wenn es die nicht gibt, den 00669 // Ability-Wert zurueckliefern. 00670 if (!closurep(cl = symbol_function("StdSkill_"+skill,this_object()))) 00671 cl=symbol_function("QuerySkillAbility",this_object()); 00672 } 00673 else 00674 { 00675 // Sonst diese Funktion im Gildenobjekt aufrufen 00676 cl=symbol_function(func,GUILD_DIR+gilde); 00677 } 00678 00679 sinfo[SI_CLOSURE]=cl; 00680 valid_setskills_override=1; 00681 ModifySkill(skill,([SI_CLOSURE:cl]),0,sinfo[SI_GUILD]); 00682 valid_setskills_override=0; 00683 } 00684 00685 res=funcall(cl,this_object(),skill,sinfo); 00686 if ( (skill2=sinfo[SI_INHERIT]) && mappingp(res) ) 00687 res=UseSkill(skill2,res); // Fuer Skills, die von anderen abhaengen 00688 00689 return res; 00690 }

| public varargs int UseSpell | ( | string | str, | |
| string | spell | |||
| ) |
Definiert in Zeile 607 der Datei skills.c.
00608 { string gilde,sbook; 00609 mapping sinfo; 00610 closure cl; 00611 00612 if ( !spell && !(spell=query_verb()) ) 00613 return 0; 00614 00615 spell=lower_case(spell); 00616 00617 // QuerySkill() liefert eine Kopie des Skillmappings. 00618 if ( !(sinfo=QuerySkill(spell,0)) ) 00619 return 0; 00620 00621 sinfo[SI_SKILLARG]=str; // Argument eintragen 00622 00623 if ( !closurep(cl=sinfo[SI_CLOSURE]) ) 00624 { 00625 // Wenn ein Spellbook angegeben ist wird der Spell direkt ausgefuehrt 00626 if ( stringp(sbook=sinfo[SI_SPELLBOOK]) ) 00627 cl=symbol_function("UseSpell",SPELLBOOK_DIR+sbook); 00628 00629 // Wenn der Spieler in einer Gilde ist, so weiss diese, in welchem 00630 // Spellbook der Spell zu finden ist... 00631 else if ( (gilde=QueryProp(P_GUILD)) && 00632 ( find_object(GUILD_DIR+gilde) || file_size(GUILD_DIR+gilde+".c")>-1)) 00633 cl=symbol_function("UseSpell",GUILD_DIR+gilde); 00634 else 00635 cl=function int () {return 0;}; 00636 00637 sinfo[SI_CLOSURE]=cl; 00638 valid_setskills_override=1; 00639 ModifySkill(spell,([SI_CLOSURE:cl]),0,sinfo[SI_GUILD]); 00640 valid_setskills_override=0; 00641 } 00642 return funcall(cl,this_object(),spell,sinfo); 00643 }
| nomask private int valid_setskills | ( | string | gilde | ) |
Definiert in Zeile 222 der Datei skills.c.
00223 { string fn; 00224 00225 if ( !query_once_interactive(this_object()) ) 00226 return 1; // Monster duerfen sich selber Skills setzen :) 00227 00228 if ( QueryProp(P_TESTPLAYER) || IS_WIZARD(this_object()) ) 00229 return 1; // Testspieler und Magier sind schutzlose Opfer ;-) 00230 00231 if ( previous_object() ) 00232 { 00233 if ( previous_object()==this_object() 00234 && this_interactive()==this_object() ) 00235 return 1; 00236 00237 fn=object_name(previous_object()); 00238 if ( fn[0..7]=="/gilden/" 00239 || fn[0..11]=="/spellbooks/" 00240 || fn[0..7]=="/secure/" 00241 || fn[0..11]=="/p/zauberer/" ) 00242 return 1; // Die sollten problemlos aendern duerfen 00243 00244 if ( file_size("/gilden/access_rights")>0 00245 && call_other("/gilden/access_rights", 00246 "access_rights", 00247 getuid(previous_object()), 00248 gilde+".c")) 00249 return 1; // Setzendes Objekt kommt vom Gildenprogrammierer 00250 00251 if ( file_size("/gilden/"+gilde+".c")>0 00252 && call_other("/gilden/"+gilde, 00253 "valid_setskills", 00254 explode(fn,"#")[0]) ) 00255 return 1; // Die Gilde selber kann Ausnahmen zulassen 00256 } 00257 00258 if (valid_setskills_override) 00259 { 00260 valid_setskills_override=0; 00261 return 1; // Fuers Setzen der Closure 00262 } 00263 00264 if ( this_interactive() ) 00265 { 00266 if ( IS_ARCH(this_interactive()) ) 00267 return 1; // Erzmagier duerfen immer aendern 00268 00269 if ( call_other("/gilden/access_rights", 00270 "access_rights", 00271 getuid(this_interactive()), 00272 gilde+".c")) 00273 return 1; // Der Gildenprogrammierer selber auch 00274 } 00275 00276 // Fuer die Waffenskills, die sollen sich selbst auch setzen duerfen 00277 if (!this_interactive() && this_object()==previous_object()) 00278 return 1; 00279 00280 00281 log_file("SETSKILLS",sprintf("*****\n%s PO:%O->TO:%O TI:%O\n GUILD:%s VERB_ARGS:'%s'\n", 00282 ctime(time())[4..15], 00283 previous_object(), 00284 this_object(), 00285 this_interactive(), 00286 gilde, 00287 ( this_interactive() ? query_verb() + " " + 00288 this_interactive()->_unparsed_args() : "") )); 00289 00290 return 0; 00291 }
| private mapping spell_fatigues = ([]) |
| inherit std living std_skills |
| private nosave int valid_setskills_override |
1.6.3