2010-08-08 10:06:34 +02:00
|
|
|
|
/*
|
|
|
|
|
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
|
|
|
|
|
Katja Zedel <katze@felidae.kn-bremen.de
|
|
|
|
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
|
|
|
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
|
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
#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;
|
2012-05-09 12:14:54 +02:00
|
|
|
|
struct region;
|
|
|
|
|
struct unit;
|
2010-08-08 10:06:34 +02:00
|
|
|
|
|
|
|
|
|
/* Prototypen */
|
|
|
|
|
|
2011-03-07 08:02:35 +01:00
|
|
|
|
int use_item_power(struct region *r, struct unit *u);
|
|
|
|
|
int use_item_regeneration(struct region *r, struct unit *u);
|
2010-08-08 10:06:34 +02:00
|
|
|
|
void showspells(struct region *r, struct unit *u);
|
|
|
|
|
int sp_antimagiczone(struct castorder *co);
|
|
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
extern struct attrib_type at_unitdissolve;
|
|
|
|
|
extern struct attrib_type at_wdwpyramid;
|
|
|
|
|
|
2011-03-07 08:02:35 +01:00
|
|
|
|
extern struct quicklist *spells;
|
2012-05-09 12:14:54 +02:00
|
|
|
|
|
|
|
|
|
extern struct spell * create_spell(const char * name);
|
2011-03-07 08:02:35 +01:00
|
|
|
|
extern void register_spell(struct spell *sp);
|
2012-05-09 12:14:54 +02:00
|
|
|
|
extern struct spell *find_spell(const char *name);
|
|
|
|
|
extern struct spell *find_spellbyid(unsigned int i);
|
2012-05-09 22:06:16 +02:00
|
|
|
|
extern struct spell *get_spellfromtoken(struct sc_mage *mage, const char *s,
|
2011-03-07 08:02:35 +01:00
|
|
|
|
const struct locale *lang);
|
2010-08-08 10:06:34 +02:00
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
2011-03-07 08:02:35 +01:00
|
|
|
|
/* ------------------------------------------------------------- *//* Erl<72>uterungen zu den Spruchdefinitionen
|
2010-08-08 10:06:34 +02:00
|
|
|
|
*
|
|
|
|
|
* 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<EFBFBD>ft
|
|
|
|
|
*
|
|
|
|
|
* sptyp:
|
|
|
|
|
* besondere Spruchtypen und Flags
|
|
|
|
|
* (Regionszauber, Kampfzauber, Farcastbar, Stufe variable, ..)
|
|
|
|
|
*
|
|
|
|
|
* rank:
|
|
|
|
|
* gibt die Priorit<EFBFBD>t und damit die Reihenfolge an, in der der Spruch
|
|
|
|
|
* gezaubert wird.
|
|
|
|
|
* 1: Aura <EFBFBD>bertragen
|
|
|
|
|
* 2: Antimagie
|
|
|
|
|
* 3: Magierver<EFBFBD>ndernde Spr<EFBFBD>che (Magic Boost, ..)
|
|
|
|
|
* 4: Monster erschaffen
|
|
|
|
|
* 5: Standartlevel
|
|
|
|
|
* 7: Teleport
|
|
|
|
|
*
|
|
|
|
|
* Komponenten[Anzahl m<EFBFBD>gl. Items][Art:Anzahl:Kostentyp]
|
|
|
|
|
*
|
|
|
|
|
* R_AURA:
|
|
|
|
|
* Grundkosten f<EFBFBD>r einen Zauber. Soviel Mp m<EFBFBD>ssen mindestens investiert
|
|
|
|
|
* werden, um den Spruch zu wirken. Zus<EFBFBD>tzliche Mp k<EFBFBD>nnen unterschiedliche
|
|
|
|
|
* Auswirkungen haben, die in der Spruchfunktionsroutine definiert werden.
|
|
|
|
|
*
|
|
|
|
|
* R_PERMAURA:
|
|
|
|
|
* Kosten an permantenter Aura
|
|
|
|
|
*
|
|
|
|
|
* Komponenten Kostentyp:
|
|
|
|
|
* SPC_LEVEL == Spruch mit Levelabh<EFBFBD>ngigen Magiekosten. Die angegeben
|
|
|
|
|
* Kosten m<EFBFBD>ssen f<EFBFBD>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> <Gebaeude-Nr> [<Gebaeude-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<EFBFBD>ude- oder Burgnummer
|
|
|
|
|
* s : Schiffsnummer
|
|
|
|
|
* c : String, wird ohne Weiterverarbeitung <EFBFBD>bergeben
|
|
|
|
|
* i : Zahl (int), wird ohne Weiterverarbeitung <EFBFBD>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<EFBFBD>r das Objekt gefolgt
|
|
|
|
|
* werden.
|
|
|
|
|
* Ein gutes Beispiel sind hierf<EFBFBD>r die Spr<EFBFBD>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<EFBFBD>r das Parsing:
|
|
|
|
|
* TESTRESISTANCE : alle Zielobjekte, also alle Parameter vom Typ Unit,
|
|
|
|
|
* Burg, Schiff oder Region, werden auf ihre
|
|
|
|
|
* Magieresistenz <EFBFBD>berpr<EFBFBD>ft
|
|
|
|
|
* TESTCANSEE : jedes Objekt vom Typ Einheit wird auf seine
|
|
|
|
|
* Sichtbarkeit <EFBFBD>berpr<EFBFBD>ft
|
|
|
|
|
* SEARCHLOCAL : die Zielobjekte werden nur regional gesucht
|
|
|
|
|
* REGIONSPELL : Ziel ist die Region, auch wenn kein Zielobjekt
|
|
|
|
|
* angegeben wird. Ist TESTRESISTANCE gesetzt, so wird
|
|
|
|
|
* die Magieresistenz der Region <EFBFBD>berpr<EFBFBD>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<EFBFBD>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
|
|
|
|
|
*
|
2011-03-07 08:02:35 +01:00
|
|
|
|
*//* ------------------------------------------------------------- */
|