#include <thing/properties.h>#include <wizlevels.h>#include <combat.h>#include <new_skills.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | ME this_object() |
| #define | STATMASTER "/p/service/rochus/guildstat/master" |
| #define | CLASS_MASK 0x1fffffff |
Funktionen | |
| protected void | create () |
| public int | RegisterHelperNPC (object npc, int flags) |
| registriert den NPC als Helfer von diesem Spieler. | |
| public int | UnregisterHelperNPC (object npc) |
| de-registriert den NPC als Helfer von diesem Spieler. | |
| public int | QueryPlAttacked (object pl) |
| Hat dieser Spieler den Spieler pl angegriffen?. | |
| public int | Kill (object ob) |
| kill - Kampf starten. | |
| int | Defend (int dam, mixed dam_type, mixed spell, object enemy) |
| static mixed | _query_no_attack () |
Variablen | |
| inherit std living | combat |
| inherit std player | pklog |
| private nosave closure | mod_def_stat |
| private nosave string * | plAttacked = ({}) |
| #define CLASS_MASK 0x1fffffff |
Definiert in Zeile 38 der Datei combat.c.
Wird benutzt von RegisterHelperNPC().
| static mixed _query_no_attack | ( | ) | [static] |
Definiert in Zeile 186 der Datei combat.c.
Benutzt P_GHOST, P_NO_ATTACK, Query() und QueryProp().
00187 { 00188 if ( QueryProp(P_GHOST) ) 00189 return 1; 00190 00191 return Query(P_NO_ATTACK); 00192 }

| protected void create | ( | ) |
Definiert in Zeile 27 der Datei combat.c.
Benutzt create(), F_MODE, F_MODE_AS, NOSETMETHOD, P_HELPER_NPC, P_NO_ATTACK, PROTECTED, SECURED, Set() und SetProp().
00027 { 00028 combat::create(); 00029 // P_NO_ATTACK ist nicht fuer Spieler gedacht. Ausnahme: Spieler ist 00030 // Geist, dann setzt das Spielerobjekt aber selber. 00031 Set(P_NO_ATTACK, SECURED|NOSETMETHOD, F_MODE_AS); 00032 00033 Set(P_HELPER_NPC, PROTECTED, F_MODE); 00034 SetProp(P_HELPER_NPC, ([]) ); 00035 }

| int Defend | ( | int | dam, | |
| mixed | dam_type, | |||
| mixed | spell, | |||
| object | enemy | |||
| ) |
Definiert in Zeile 149 der Datei combat.c.
Benutzt Defend(), IS_LEARNER, ME, mod_def_stat, P_GUILD, P_GUILD_LEVEL, P_HP, QueryProp() und STATMASTER.
00149 { 00150 int delta_hp,res; 00151 00152 if (query_once_interactive(ME) 00153 && !IS_LEARNER(ME) 00154 && !objectp(get_type_info(mod_def_stat,2))) { 00155 object ma; 00156 if (!objectp(ma=find_object(STATMASTER))) 00157 return ::Defend(dam,dam_type,spell,enemy); 00158 // Statistik nur aufrufen falls Master geladen 00159 mod_def_stat=symbol_function("ModifyDefendStat",ma); 00160 } 00161 00162 if (closurep(mod_def_stat)) 00163 delta_hp=QueryProp(P_HP); 00164 00165 res=::Defend(dam,dam_type,spell,enemy); 00166 00167 if (closurep(mod_def_stat)) { 00168 delta_hp-=QueryProp(P_HP); 00169 if (delta_hp<0) 00170 delta_hp=0; 00171 funcall(mod_def_stat, 00172 QueryProp(P_GUILD), 00173 QueryProp(P_GUILD_LEVEL), 00174 dam-10*delta_hp, 00175 dam_type, 00176 spell); 00177 } 00178 00179 return res; 00180 }

| public int Kill | ( | object | ob | ) |
kill - Kampf starten.
Fuegt ob der Feindesliste hinzu.
Definiert in Zeile 126 der Datei combat.c.
Benutzt CheckPlayerAttack(), IsEnemy(), Kill(), ME, plAttacked und QueryPlAttacked().
00126 { 00127 00128 if (!objectp(ob)) return 0; 00129 00130 // dies dient nur dazu, das plAttacked mapping zu bereinigen. 00131 // TODO: besser machen. ;-) 00132 if ( query_once_interactive(ob) && !IsEnemy(ob)) { 00133 QueryPlAttacked(ME); 00134 ob->QueryPlAttacked(ob); // aktualisieren ... 00135 } 00136 00137 int res = combat::Kill(ob); 00138 00139 // falls Feind neu eingetragen wurde, pruefen, ob es ein 00140 // Spieler-Spieler-Angriff ist. 00141 // TODO: Weg finden, dies in InsertEnemy() zu tun. Schwierigkeit ist, zu 00142 // TODO::ermitteln, von welchem Spieler der urspruengliche Angriff ausging. 00143 if (res==1 && CheckPlayerAttack(ME, ob, 0)) 00144 plAttacked += ({ getuid(ob) }); 00145 00146 return res; 00147 }

| public int QueryPlAttacked | ( | object | pl | ) |
Hat dieser Spieler den Spieler pl angegriffen?.
| [in] | pl | object zu pruefender Spieler |
Definiert in Zeile 109 der Datei combat.c.
Benutzt find_netdead(), find_player(), IsEnemy(), ME, ob() und plAttacked.
Wird benutzt von Kill().
00109 { 00110 object ob; 00111 00112 if ( !objectp(pl) ) 00113 return 0; 00114 00115 foreach(string plname: plAttacked) { 00116 if ( !( ob=(find_player(plname)||find_netdead(plname)) ) 00117 || ( !IsEnemy(ob) && !(ob->IsEnemy(ME)) ) ) 00118 plAttacked -= ({plname}); // ja, das geht. ;-) 00119 } 00120 return (member( plAttacked, getuid(pl) ) >= 0); 00121 }


| public int RegisterHelperNPC | ( | object | npc, | |
| int | flags | |||
| ) |
registriert den NPC als Helfer von diesem Spieler.
| [in] | npc | object Helfer-NPC |
| [in] | flags | int Bitfeld von Flags |
Definiert in Zeile 47 der Datei combat.c.
Benutzt CLASS_MASK, EXCLUSIVE_HELPER, P_HELPER_NPC und QueryProp().
00047 { 00048 if (!objectp(npc)) 00049 raise_error(sprintf( "Wrong argument 1 in RegisterHelperNPC(). " 00050 "Expected <object>, got %.100O\n", npc)); 00051 if (!intp(flags) || flags < 1) 00052 raise_error(sprintf( "Wrong argument 2 in RegisterHelperNPC(). " 00053 "Expected positive <int>, got %O\n", flags)); 00054 00055 mapping helpers = QueryProp(P_HELPER_NPC); 00056 00057 // schon registrierte sind witzlos. 00058 if (member(helpers, npc)) 00059 return 0; 00060 00061 // auf exklusive Helfer pruefen. 00062 foreach(object helper, int fl: helpers) { 00063 // flags identisch? Dann Klasse und Exklusivitaet identisch 00064 if (fl == flags) 00065 return 0; 00066 // oder einer von beiden exklusiv und beide in der gleichen Klasse? 00067 else if ( ((fl & EXCLUSIVE_HELPER) || (flags & EXCLUSIVE_HELPER)) 00068 && ((fl & CLASS_MASK) == (flags & CLASS_MASK)) ) 00069 return 0; 00070 } 00071 // scheint wohl ok zu sein. Registrieren und Prop im NPC setzen. 00072 helpers += ([ npc: flags ]); 00073 npc->SetProp(P_HELPER_NPC, ({ this_object(), flags }) ); 00074 // momentan unnoetig, da helpers keine Kopie ist. 00075 // SetProp(P_HELPER_NPC, helpers); 00076 00077 return 1; 00078 }

| public int UnregisterHelperNPC | ( | object | npc | ) |
de-registriert den NPC als Helfer von diesem Spieler.
| [in] | npc | object Helfer-NPC |
Definiert in Zeile 87 der Datei combat.c.
Benutzt m_delete(), P_HELPER_NPC und QueryProp().
00087 { 00088 if (!objectp(npc)) 00089 raise_error(sprintf("Wrong argument in UnregisterHelpernNPC(). " 00090 "Expected <object>, got %.100O\n", npc)); 00091 00092 mapping helpers = QueryProp(P_HELPER_NPC); 00093 if (member(helpers, npc)) { 00094 efun::m_delete(helpers, npc); 00095 // momentan unnoetig, da helpers keine Kopie ist. 00096 // SetProp(P_HELPER_NPC, helpers); 00097 npc->SetProp(P_HELPER_NPC, 0); 00098 return 1; 00099 } 00100 return 0; 00101 }

| private nosave closure mod_def_stat |
| private nosave string* plAttacked = ({}) |
Definiert in Zeile 25 der Datei combat.c.
Wird benutzt von Kill() und QueryPlAttacked().
1.6.3