skills.c-Dateireferenz

#include <living/skills.h>
#include <living/skill_attributes.h>
#include <player/life.h>
#include <thing/properties.h>
#include <new_skills.h>
#include <wizlevels.h>
Include-Abhängigkeitsdiagramm für skills.c:

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

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 14 der Datei skills.c.

#define SMUL ( x,
 )     ((x<0 && y<0)?(-1*x*y):(x*y))

Definiert in Zeile 427 der Datei skills.c.

Wird benutzt von SpellSuccess().


Dokumentation der Funktionen

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]

Definiert in Zeile 140 der Datei skills.c.

00141 { mapping res;
00142   string  gilde;
00143 
00144   if ( !stringp(gilde=QueryProp(P_GUILD)) )
00145     return 0;
00146   if ( !mappingp(res=Query(P_GUILD_PREPAREBLOCK)) 
00147       || !member(res,gilde) )
00148     return 0;
00149   return res[gilde];
00150 }

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]

Definiert in Zeile 210 der Datei skills.c.

00211 { string ti;
00212 
00213   if ( stringp(ti=Query(P_TITLE)) )
00214     return ti;
00215 
00216   return QueryProp(P_GUILD_TITLE);
00217 }

static string _query_visible_guild (  )  [static]

Definiert in Zeile 90 der Datei skills.c.

00091 { string res;
00092 
00093   if ( stringp(res=Query(P_VISIBLE_GUILD)) )
00094     return res;
00095 
00096   return QueryProp(P_GUILD);
00097 }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 
)

Definiert in Zeile 53 der Datei skills.c.

00054 {
00055                 return 0;
00056 }

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

nomask protected int security_check (  ) 

Definiert in Zeile 38 der Datei skills.c.

00039 { object tp;
00040 
00041   if ( !objectp(tp=this_player())
00042       || tp!=this_interactive()
00043       || !interactive(tp)
00044       || !IS_ARCH(tp) )
00045     return 0;
00046 
00047   return 1;
00048 }

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }


Variablen-Dokumentation

private mapping spell_fatigues = ([])

Definiert in Zeile 26 der Datei skills.c.

inherit std living std_skills

Definiert in Zeile 12 der Datei skills.c.

private nosave int valid_setskills_override

Definiert in Zeile 219 der Datei skills.c.

Erzeugt am Thu Jun 3 14:42:35 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3