server/src/common/kernel/spell.h
Enno Rehling 4dc1339ec3 New: familiars are initialized with an equipment-set.
New: familiars can have a LUA initialization function.

Moved the spell implementations from spell.c to spells.c where they "belong".

Spell ids moved to a separate header (to phase them out eventually)
2005-10-23 09:05:11 +00:00

160 lines
5.1 KiB
C

/* vi: set ts=2:
*
*
* Eressea PB(E)M host Copyright (C) 1998-2003
* Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de)
* Henning Peters (faroul@beyond.kn-bremen.de)
* Enno Rehling (enno@eressea-pbem.de)
* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
*
* This program may not be used, modified or distributed without
* prior permission by the authors of Eressea.
*/
#ifndef H_KRNL_SPELL
#define H_KRNL_SPELL
#ifdef __cplusplus
extern "C" {
#endif
struct fighter;
struct spell;
struct border_type;
struct attrib_type;
struct curse_type;
struct castorder;
struct curse;
/* Prototypen */
void do_shock(struct unit *u, const char *reason);
int use_item_power(struct region * r, struct unit * u);
int use_item_regeneration(struct region * r, struct unit * u);
void showspells(struct region *r, struct unit *u);
int sp_antimagiczone(struct castorder *co);
extern double destr_curse(struct curse* c, int cast_level, double force);
/* ------------------------------------------------------------- */
extern struct attrib_type at_unitdissolve;
#ifdef WDW_PYRAMIDSPELL
extern struct attrib_type at_wdwpyramid;
#endif
extern struct spell_list * spells;
extern void init_spells(void);
extern void register_spell(struct spell * sp);
extern struct spell * find_spell(magic_t mtype, const char * name);
#ifdef __cplusplus
}
#endif
#endif
/* ------------------------------------------------------------- */
/* Erläuterungen zu den Spruchdefinitionen
*
* Spruchstukturdefinition:
* spell{
* id, name,
* beschreibung,
* syntax,
* parameter,
* magietyp,
* sptyp,
* rank,level,
* costtyp, aura,
* komponenten[5][2][faktorart],
* &funktion, patzer}
*
* id:
* SPL_NOSPELL muss der letzte Spruch in der Liste spelldaten sein,
* denn nicht auf die Reihenfolge in der Liste sondern auf die id wird
* geprüft
*
* sptyp:
* besondere Spruchtypen und Flags
* (Regionszauber, Kampfzauber, Farcastbar, Stufe variable, ..)
*
* rank:
* gibt die Priorität und damit die Reihenfolge an, in der der Spruch
* gezaubert wird.
* 1: Aura übertragen
* 2: Antimagie
* 3: Magierverändernde Sprüche (Magic Boost, ..)
* 4: Monster erschaffen
* 5: Standartlevel
* 7: Teleport
*
* Komponenten[Anzahl mögl. Items][Art:Anzahl:Kostentyp]
*
* R_AURA:
* Grundkosten für einen Zauber. Soviel Mp müssen mindestens investiert
* werden, um den Spruch zu wirken. Zusätzliche Mp können unterschiedliche
* Auswirkungen haben, die in der Spruchfunktionsroutine definiert werden.
*
* R_PERMAURA:
* Kosten an permantenter Aura
*
* Komponenten Kostentyp:
* SPC_LEVEL == Spruch mit Levelabhängigen Magiekosten. Die angegeben
* Kosten müssen für Stufe 1 berechnet sein.
* SPC_FIX == Feste Kosten
*
* Wenn keine spezielle Syntax angegeben ist, wird die
* Syntaxbeschreibung aus sptyp generiert:
* FARCASTING: ZAUBER [REGION x y]
* SPELLLEVEL: ZAUBER [STUFE n]
* UNITSPELL : ZAUBER <spruchname> <Einheit-Nr> [<Einheit-Nr> ..]
* SHIPSPELL : ZAUBER <spruchname> <Schiff-Nr> [<Schiff-Nr> ..]
* BUILDINGSPELL: ZAUBER <spruchname> <Gebäude-Nr> [<Gebäude-Nr> ..]
* ONETARGET : ZAUBER <spruchname> <target-nr>
* PRECOMBATSPELL : KAMPFZAUBER [STUFE n] <spruchname>
* COMBATSPELL : KAMPFZAUBER [STUFE n] <spruchname>
* POSTCOMBATSPELL: KAMPFZAUBER [STUFE n] <spruchname>
*
* Das Parsing
*
* Der String spell->parameter gibt die Syntax an, nach der die
* Parameter des Spruches in add_spellparameter() geparst werden sollen.
*
* u : eine Einheitennummer
* r : hier kommen zwei Regionskoordinaten x y
* b : Gebäude- oder Burgnummer
* s : Schiffsnummer
* c : String, wird ohne Weiterverarbeitung übergeben
* i : Zahl (int), wird ohne Weiterverarbeitung übergeben
* k : Keywort - dieser String gibt den Paramter an, der folgt. Der
* Parameter wird mit findparam() identifiziert.
* k muss immer von einem c als Platzhalter für das Objekt gefolgt
* werden.
* Ein gutes Beispiel sind hierfür die Sprüche zur Magieanalyse.
* + : gibt an, das der vorherige Parameter mehrfach vorkommen kann. Da
* ein Ende nicht definiert werden kann, muss dies immer am Schluss
* kommen.
*
* Flags für das Parsing:
* TESTRESISTANCE : alle Zielobjekte, also alle Parameter vom Typ Unit,
* Burg, Schiff oder Region, werden auf ihre
* Magieresistenz überprüft
* TESTCANSEE : jedes Objekt vom Typ Einheit wird auf seine
* Sichtbarkeit überprüft
* SEARCHGLOBAL : die Zielobjekte werden global anstelle von regional
* gesucht
* REGIONSPELL : Ziel ist die Region, auch wenn kein Zielobjekt
* angegeben wird. Ist TESTRESISTANCE gesetzt, so wird
* die Magieresistenz der Region überprüft
*
* Bei fehlendem Ziel oder wenn dieses dem Zauber widersteht, wird die
* Spruchfunktion nicht aufgerufen.
* Sind zu wenig Parameter vorhanden, wird der Zauber ebenfalls nicht
* ausgeführt.
* Ist eins von mehreren Zielobjekten resistent, so wird das Flag
* pa->param[n]->flag == TARGET_RESISTS
* Ist eins von mehreren Zielobjekten nicht gefunden worden, so ist
* pa->param[n]->flag == TARGET_NOTFOUND
*
*/
/* ------------------------------------------------------------- */