forked from github/server
Neues Handling für familiar-spelllists.
Export von spells an lua
This commit is contained in:
parent
dc2fd6ec7d
commit
687c4507d6
|
@ -365,43 +365,17 @@ void
|
||||||
updatespelllist(unit * u)
|
updatespelllist(unit * u)
|
||||||
{
|
{
|
||||||
int max = eff_skill(u, SK_MAGIC, u->region);
|
int max = eff_skill(u, SK_MAGIC, u->region);
|
||||||
int i, sk = max;
|
int sk = max;
|
||||||
|
spell * sp;
|
||||||
magic_t gebiet = find_magetype(u);
|
magic_t gebiet = find_magetype(u);
|
||||||
|
boolean ismonster = u->faction->no==MONSTER_FACTION;
|
||||||
|
|
||||||
if (u->faction->no==MONSTER_FACTION) return;
|
|
||||||
|
|
||||||
|
|
||||||
/* Magier mit keinem bzw M_GRAU bekommen weder Sprüche angezeigt noch
|
|
||||||
* neue Sprüche in ihre List-of-known-spells. Das sind zb alle alten
|
|
||||||
* Drachen, die noch den Skill Magie haben */
|
|
||||||
/* if (gebiet == M_GRAU) return; */
|
|
||||||
|
|
||||||
for (i = 0; spelldaten[i].id != SPL_NOSPELL; i++) {
|
|
||||||
boolean know = getspell(u, spelldaten[i].id);
|
|
||||||
if (know || (spelldaten[i].magietyp == gebiet && spelldaten[i].level <= sk)) {
|
|
||||||
if (!know) addspell(u, spelldaten[i].id);
|
|
||||||
|
|
||||||
if (!already_seen(u->faction, spelldaten[i].id)) {
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_reportspell))->data.i = spelldaten[i].id;
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_seenspell))->data.i = spelldaten[i].id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Nur Orkmagier bekommen den Keuschheitsamulettzauber */
|
/* Nur Orkmagier bekommen den Keuschheitsamulettzauber */
|
||||||
if (old_race(u->race) == RC_ORC
|
if (old_race(u->race) == RC_ORC
|
||||||
&& !getspell(u, SPL_ARTEFAKT_CHASTITYBELT)
|
&& !getspell(u, SPL_ARTEFAKT_CHASTITYBELT)
|
||||||
&& find_spellbyid(SPL_ARTEFAKT_CHASTITYBELT)->level <= max)
|
&& find_spellbyid(SPL_ARTEFAKT_CHASTITYBELT)->level <= max)
|
||||||
{
|
{
|
||||||
addspell(u, SPL_ARTEFAKT_CHASTITYBELT);
|
addspell(u, SPL_ARTEFAKT_CHASTITYBELT);
|
||||||
|
|
||||||
if (!already_seen(u->faction, spelldaten[i].id)) {
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_reportspell))->data.i = SPL_ARTEFAKT_CHASTITYBELT;
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_seenspell))->data.i = SPL_ARTEFAKT_CHASTITYBELT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Nur Wyrm-Magier bekommen den Wyrmtransformationszauber */
|
/* Nur Wyrm-Magier bekommen den Wyrmtransformationszauber */
|
||||||
|
@ -410,12 +384,6 @@ updatespelllist(unit * u)
|
||||||
&& find_spellbyid(SPL_BECOMEWYRM)->level <= max)
|
&& find_spellbyid(SPL_BECOMEWYRM)->level <= max)
|
||||||
{
|
{
|
||||||
addspell(u, SPL_BECOMEWYRM);
|
addspell(u, SPL_BECOMEWYRM);
|
||||||
if (!already_seen(u->faction, spelldaten[i].id)) {
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_reportspell))->data.i = SPL_BECOMEWYRM;
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_seenspell))->data.i = SPL_BECOMEWYRM;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Transformierte Wyrm-Magier bekommen Drachenodem */
|
/* Transformierte Wyrm-Magier bekommen Drachenodem */
|
||||||
|
@ -424,51 +392,41 @@ updatespelllist(unit * u)
|
||||||
switch (urc) {
|
switch (urc) {
|
||||||
/* keine breaks! Wyrme sollen alle drei Zauber können.*/
|
/* keine breaks! Wyrme sollen alle drei Zauber können.*/
|
||||||
case RC_WYRM:
|
case RC_WYRM:
|
||||||
{
|
sp = find_spellbyid(SPL_WYRMODEM);
|
||||||
if(!getspell(u, SPL_WYRMODEM) &&
|
if (sp!=NULL && !getspell(u, sp->id) && sp->level<=max) {
|
||||||
find_spellbyid(SPL_WYRMODEM)->level <= max) {
|
addspell(u, sp->id);
|
||||||
|
|
||||||
addspell(u, SPL_WYRMODEM);
|
|
||||||
if (!already_seen(u->faction, spelldaten[i].id)) {
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_reportspell))->data.i = SPL_WYRMODEM;
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_seenspell))->data.i = SPL_WYRMODEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case RC_DRAGON:
|
case RC_DRAGON:
|
||||||
{
|
sp = find_spellbyid(SPL_DRAGONODEM);
|
||||||
if(!getspell(u, SPL_DRAGONODEM) &&
|
if (sp!=NULL && !getspell(u, sp->id) && sp->level<=max) {
|
||||||
find_spellbyid(SPL_DRAGONODEM)->level <= max) {
|
addspell(u, sp->id);
|
||||||
|
|
||||||
addspell(u, SPL_DRAGONODEM);
|
|
||||||
if (!already_seen(u->faction, spelldaten[i].id)) {
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_reportspell))->data.i = SPL_DRAGONODEM;
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_seenspell))->data.i = SPL_DRAGONODEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case RC_FIREDRAGON:
|
case RC_FIREDRAGON:
|
||||||
{
|
sp = find_spellbyid(SPL_FIREDRAGONODEM);
|
||||||
if(!getspell(u, SPL_FIREDRAGONODEM) &&
|
if (sp!=NULL && getspell(u, sp->id) && sp->level<=max) {
|
||||||
find_spellbyid(SPL_FIREDRAGONODEM)->level <= max) {
|
addspell(u, sp->id);
|
||||||
|
|
||||||
addspell(u, SPL_FIREDRAGONODEM);
|
|
||||||
if (!already_seen(u->faction, spelldaten[i].id)) {
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_reportspell))->data.i = SPL_FIREDRAGONODEM;
|
|
||||||
a_add(&u->faction->attribs,
|
|
||||||
a_new(&at_seenspell))->data.i = SPL_FIREDRAGONODEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
/* Magier mit keinem bzw M_GRAU bekommen weder Sprüche angezeigt noch
|
||||||
|
* neue Sprüche in ihre List-of-known-spells. Das sind zb alle alten
|
||||||
|
* Drachen, die noch den Skill Magie haben */
|
||||||
|
|
||||||
|
for (sp = spelldaten; sp->id != SPL_NOSPELL; ++sp) {
|
||||||
|
boolean know = getspell(u, sp->id);
|
||||||
|
|
||||||
|
if (know || (gebiet!=M_GRAU && sp->magietyp == gebiet && sp->level <= sk)) {
|
||||||
|
faction * f = u->faction;
|
||||||
|
|
||||||
|
if (!know) addspell(u, sp->id);
|
||||||
|
if (!ismonster && !already_seen(u->faction, sp->id)) {
|
||||||
|
a_add(&f->attribs, a_new(&at_reportspell))->data.i = sp->id;
|
||||||
|
a_add(&f->attribs, a_new(&at_seenspell))->data.i = sp->id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
|
@ -3173,3 +3131,12 @@ spell_name(const struct spell * sp, const struct locale * lang)
|
||||||
}
|
}
|
||||||
return sp->sname;
|
return sp->sname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
add_spelllist(spell_list ** lspells, spell * sp)
|
||||||
|
{
|
||||||
|
spell_list * entry = malloc(sizeof(spell_list));
|
||||||
|
entry->data = sp;
|
||||||
|
entry->next = *lspells;
|
||||||
|
*lspells = entry;
|
||||||
|
}
|
|
@ -34,10 +34,6 @@ struct building;
|
||||||
#define IRONGOLEM_CRUMBLE 15 /* monatlich Chance zu zerfallen */
|
#define IRONGOLEM_CRUMBLE 15 /* monatlich Chance zu zerfallen */
|
||||||
#define STONEGOLEM_CRUMBLE 10 /* monatlich Chance zu zerfallen */
|
#define STONEGOLEM_CRUMBLE 10 /* monatlich Chance zu zerfallen */
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
typedef struct spell_ptr spell_ptr;
|
|
||||||
typedef struct castorder castorder;
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
/* Spruchparameter
|
/* Spruchparameter
|
||||||
* Wir suchen beim Parsen des Befehls erstmal nach lokalen Objekten,
|
* Wir suchen beim Parsen des Befehls erstmal nach lokalen Objekten,
|
||||||
|
@ -112,6 +108,11 @@ extern const char *magietypen[MAXMAGIETYP];
|
||||||
* - Spruchliste
|
* - Spruchliste
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef struct spell_ptr {
|
||||||
|
struct spell_ptr *next;
|
||||||
|
spellid_t spellid;
|
||||||
|
} spell_ptr;
|
||||||
|
|
||||||
typedef struct sc_mage {
|
typedef struct sc_mage {
|
||||||
magic_t magietyp;
|
magic_t magietyp;
|
||||||
int spellpoints;
|
int spellpoints;
|
||||||
|
@ -121,14 +122,9 @@ typedef struct sc_mage {
|
||||||
int combatspelllevel[MAXCOMBATSPELLS];
|
int combatspelllevel[MAXCOMBATSPELLS];
|
||||||
int precombataura; /* Merker, wieviel Aura in den Präcombatzauber
|
int precombataura; /* Merker, wieviel Aura in den Präcombatzauber
|
||||||
gegangen ist. Nicht speichern. */
|
gegangen ist. Nicht speichern. */
|
||||||
spell_ptr *spellptr;
|
struct spell_ptr *spellptr;
|
||||||
} sc_mage;
|
} sc_mage;
|
||||||
|
|
||||||
struct spell_ptr {
|
|
||||||
spell_ptr *next;
|
|
||||||
spellid_t spellid;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
/* Spruchstukturdefinition:
|
/* Spruchstukturdefinition:
|
||||||
* id:
|
* id:
|
||||||
|
@ -144,7 +140,23 @@ struct spell_ptr {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* typedef struct fighter fighter; */
|
/* ------------------------------------------------------------- */
|
||||||
|
/* Zauberliste */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct castorder {
|
||||||
|
struct castorder *next;
|
||||||
|
void *magician; /* Magier (kann vom Typ struct unit oder fighter sein) */
|
||||||
|
struct unit *familiar; /* Vertrauter, gesetzt, wenn der Spruch durch
|
||||||
|
den Vertrauten gezaubert wird */
|
||||||
|
struct spell *sp; /* Spruch */
|
||||||
|
int level; /* gewünschte Stufe oder Stufe des Magiers */
|
||||||
|
double force; /* Stärke des Zaubers */
|
||||||
|
struct region *rt; /* Zielregion des Spruchs */
|
||||||
|
int distance; /* Entfernung zur Zielregion */
|
||||||
|
char *order; /* Befehl */
|
||||||
|
struct spellparameter *par; /* für weitere Parameter */
|
||||||
|
} castorder;
|
||||||
|
|
||||||
/* irgendwelche zauber: */
|
/* irgendwelche zauber: */
|
||||||
typedef void (*spell_f) (void*);
|
typedef void (*spell_f) (void*);
|
||||||
|
@ -170,25 +182,12 @@ typedef struct spell {
|
||||||
void (*patzer) (castorder*);
|
void (*patzer) (castorder*);
|
||||||
} spell;
|
} spell;
|
||||||
|
|
||||||
|
typedef struct spell_list {
|
||||||
|
struct spell_list * next;
|
||||||
|
spell * data;
|
||||||
|
} spell_list;
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
extern void add_spelllist(spell_list ** lspells, spell * sp);
|
||||||
/* Zauberliste */
|
|
||||||
|
|
||||||
|
|
||||||
struct castorder {
|
|
||||||
castorder *next;
|
|
||||||
void *magician; /* Magier (kann vom Typ struct unit oder fighter sein) */
|
|
||||||
struct unit *familiar; /* Vertrauter, gesetzt, wenn der Spruch durch
|
|
||||||
den Vertrauten gezaubert wird */
|
|
||||||
struct spell *sp; /* Spruch */
|
|
||||||
int level; /* gewünschte Stufe oder Stufe des Magiers */
|
|
||||||
double force; /* Stärke des Zaubers */
|
|
||||||
struct region *rt; /* Zielregion des Spruchs */
|
|
||||||
int distance; /* Entfernung zur Zielregion */
|
|
||||||
char *order; /* Befehl */
|
|
||||||
struct spellparameter *par; /* für weitere Parameter */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
|
|
||||||
/* besondere Spruchtypen */
|
/* besondere Spruchtypen */
|
||||||
|
|
|
@ -391,7 +391,7 @@ racename(const struct locale *loc, const unit *u, const race * rc)
|
||||||
static void
|
static void
|
||||||
oldfamiliars(unit * familiar)
|
oldfamiliars(unit * familiar)
|
||||||
{
|
{
|
||||||
sc_mage * m;
|
sc_mage * m = NULL;
|
||||||
race_t frt = old_race(familiar->race);
|
race_t frt = old_race(familiar->race);
|
||||||
|
|
||||||
switch(frt) {
|
switch(frt) {
|
||||||
|
@ -432,9 +432,6 @@ oldfamiliars(unit * familiar)
|
||||||
/* Magie+1, Spionage, Tarnung, Wahrnehmung, Ausdauer */
|
/* Magie+1, Spionage, Tarnung, Wahrnehmung, Ausdauer */
|
||||||
m = create_mage(familiar, M_GRAU);
|
m = create_mage(familiar, M_GRAU);
|
||||||
set_level(familiar, SK_MAGIC, 1);
|
set_level(familiar, SK_MAGIC, 1);
|
||||||
addspell(familiar, SPL_FLEE);
|
|
||||||
addspell(familiar, SPL_SLEEP);
|
|
||||||
addspell(familiar, SPL_FRIGHTEN);
|
|
||||||
m->combatspell[0] = SPL_FLEE;
|
m->combatspell[0] = SPL_FLEE;
|
||||||
m->combatspell[1] = SPL_SLEEP;
|
m->combatspell[1] = SPL_SLEEP;
|
||||||
break;
|
break;
|
||||||
|
@ -452,10 +449,6 @@ oldfamiliars(unit * familiar)
|
||||||
set_level(familiar, SK_ENTERTAINMENT, 1);
|
set_level(familiar, SK_ENTERTAINMENT, 1);
|
||||||
set_level(familiar, SK_OBSERVATION, 1);
|
set_level(familiar, SK_OBSERVATION, 1);
|
||||||
m = create_mage(familiar, M_GRAU);
|
m = create_mage(familiar, M_GRAU);
|
||||||
addspell(familiar, SPL_SEDUCE);
|
|
||||||
addspell(familiar, SPL_CALM_MONSTER);
|
|
||||||
addspell(familiar, SPL_SONG_OF_CONFUSION);
|
|
||||||
addspell(familiar, SPL_DENYATTACK);
|
|
||||||
m->combatspell[0] = SPL_SONG_OF_CONFUSION;
|
m->combatspell[0] = SPL_SONG_OF_CONFUSION;
|
||||||
break;
|
break;
|
||||||
case RC_UNICORN:
|
case RC_UNICORN:
|
||||||
|
@ -464,12 +457,6 @@ oldfamiliars(unit * familiar)
|
||||||
set_level(familiar, SK_STEALTH, 1);
|
set_level(familiar, SK_STEALTH, 1);
|
||||||
set_level(familiar, SK_OBSERVATION, 1);
|
set_level(familiar, SK_OBSERVATION, 1);
|
||||||
m = create_mage(familiar, M_GRAU);
|
m = create_mage(familiar, M_GRAU);
|
||||||
addspell(familiar, SPL_RESISTMAGICBONUS);
|
|
||||||
addspell(familiar, SPL_SONG_OF_PEACE);
|
|
||||||
addspell(familiar, SPL_CALM_MONSTER);
|
|
||||||
addspell(familiar, SPL_HERO);
|
|
||||||
addspell(familiar, SPL_HEALINGSONG);
|
|
||||||
addspell(familiar, SPL_DENYATTACK);
|
|
||||||
break;
|
break;
|
||||||
case RC_WARG:
|
case RC_WARG:
|
||||||
/* Spi, Tak, Tar, Wahri+2, Aus */
|
/* Spi, Tak, Tar, Wahri+2, Aus */
|
||||||
|
@ -481,9 +468,6 @@ oldfamiliars(unit * familiar)
|
||||||
/* Mag+1, Rei-2, Hie, Sta, Spi, Tar, Wahr, Aus */
|
/* Mag+1, Rei-2, Hie, Sta, Spi, Tar, Wahr, Aus */
|
||||||
set_level(familiar, SK_MAGIC, 1);
|
set_level(familiar, SK_MAGIC, 1);
|
||||||
m = create_mage(familiar, M_GRAU);
|
m = create_mage(familiar, M_GRAU);
|
||||||
addspell(familiar, SPL_STEALAURA);
|
|
||||||
addspell(familiar, SPL_FRIGHTEN);
|
|
||||||
addspell(familiar, SPL_SUMMONUNDEAD);
|
|
||||||
break;
|
break;
|
||||||
case RC_IMP:
|
case RC_IMP:
|
||||||
/* Mag+1,Rei-1,Hie,Sta,Spi+1,Tar+1,Wahr+1,Steu+1,Aus*/
|
/* Mag+1,Rei-1,Hie,Sta,Spi+1,Tar+1,Wahr+1,Steu+1,Aus*/
|
||||||
|
@ -493,7 +477,6 @@ oldfamiliars(unit * familiar)
|
||||||
set_level(familiar, SK_OBSERVATION, 1);
|
set_level(familiar, SK_OBSERVATION, 1);
|
||||||
set_level(familiar, SK_TAXING, 1);
|
set_level(familiar, SK_TAXING, 1);
|
||||||
m = create_mage(familiar, M_GRAU);
|
m = create_mage(familiar, M_GRAU);
|
||||||
addspell(familiar, SPL_STEALAURA);
|
|
||||||
break;
|
break;
|
||||||
case RC_DREAMCAT:
|
case RC_DREAMCAT:
|
||||||
/* Mag+1,Hie,Sta,Spi+1,Tar+1,Wahr+1,Steu+1,Aus*/
|
/* Mag+1,Hie,Sta,Spi+1,Tar+1,Wahr+1,Steu+1,Aus*/
|
||||||
|
@ -503,16 +486,11 @@ oldfamiliars(unit * familiar)
|
||||||
set_level(familiar, SK_OBSERVATION, 1);
|
set_level(familiar, SK_OBSERVATION, 1);
|
||||||
set_level(familiar, SK_TAXING, 1);
|
set_level(familiar, SK_TAXING, 1);
|
||||||
m = create_mage(familiar, M_GRAU);
|
m = create_mage(familiar, M_GRAU);
|
||||||
addspell(familiar, SPL_ILL_SHAPESHIFT);
|
|
||||||
addspell(familiar, SPL_TRANSFERAURA_TRAUM);
|
|
||||||
break;
|
break;
|
||||||
case RC_FEY:
|
case RC_FEY:
|
||||||
/* Mag+1,Rei-1,Hie-1,Sta-1,Spi+2,Tar+5,Wahr+2,Aus */
|
/* Mag+1,Rei-1,Hie-1,Sta-1,Spi+2,Tar+5,Wahr+2,Aus */
|
||||||
set_level(familiar, SK_MAGIC, 1);
|
set_level(familiar, SK_MAGIC, 1);
|
||||||
m = create_mage(familiar,M_GRAU);
|
m = create_mage(familiar,M_GRAU);
|
||||||
addspell(familiar, SPL_DENYATTACK);
|
|
||||||
addspell(familiar, SPL_CALM_MONSTER);
|
|
||||||
addspell(familiar, SPL_SEDUCE);
|
|
||||||
break;
|
break;
|
||||||
case RC_OWL:
|
case RC_OWL:
|
||||||
/* Spi+1,Tar+1,Wahr+5,Aus */
|
/* Spi+1,Tar+1,Wahr+5,Aus */
|
||||||
|
@ -535,6 +513,13 @@ oldfamiliars(unit * familiar)
|
||||||
m = create_mage(familiar,M_GRAU);
|
m = create_mage(familiar,M_GRAU);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (m!=NULL) {
|
||||||
|
spell_list * fspells = familiarspells(familiar->race);
|
||||||
|
while (fspells!=NULL) {
|
||||||
|
addspell(familiar, fspells->data->id);
|
||||||
|
fspells=fspells->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static item *
|
static item *
|
||||||
|
@ -578,6 +563,7 @@ elf_spoil(const struct race * rc, int size)
|
||||||
}
|
}
|
||||||
return itm;
|
return itm;
|
||||||
}
|
}
|
||||||
|
|
||||||
static item *
|
static item *
|
||||||
demon_spoil(const struct race * rc, int size)
|
demon_spoil(const struct race * rc, int size)
|
||||||
{
|
{
|
||||||
|
@ -587,6 +573,7 @@ demon_spoil(const struct race * rc, int size)
|
||||||
}
|
}
|
||||||
return itm;
|
return itm;
|
||||||
}
|
}
|
||||||
|
|
||||||
static item *
|
static item *
|
||||||
goblin_spoil(const struct race * rc, int size)
|
goblin_spoil(const struct race * rc, int size)
|
||||||
{
|
{
|
||||||
|
@ -988,3 +975,90 @@ register_races(void)
|
||||||
sprintf(zBuffer, "%s/races.xml", resourcepath());
|
sprintf(zBuffer, "%s/races.xml", resourcepath());
|
||||||
xml_register(&xml_races, "eressea races", 0);
|
xml_register(&xml_races, "eressea races", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** familiars **/
|
||||||
|
typedef struct familiar_spells {
|
||||||
|
struct familiar_spells * next;
|
||||||
|
spell_list * spells;
|
||||||
|
const race * familiar_race;
|
||||||
|
} familiar_spells;
|
||||||
|
|
||||||
|
static familiar_spells * racespells;
|
||||||
|
|
||||||
|
spell_list *
|
||||||
|
familiarspells(const race * rc)
|
||||||
|
{
|
||||||
|
familiar_spells * fspells = racespells;
|
||||||
|
while (fspells && rc!=fspells->familiar_race) {
|
||||||
|
fspells = fspells->next;
|
||||||
|
}
|
||||||
|
if (fspells!=NULL) return fspells->spells;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
familiar_spells *
|
||||||
|
mkspells(const race * rc)
|
||||||
|
{
|
||||||
|
familiar_spells * fspells;
|
||||||
|
|
||||||
|
fspells = malloc(sizeof(familiar_spells));
|
||||||
|
fspells->next = racespells;
|
||||||
|
racespells = fspells;
|
||||||
|
fspells->familiar_race = rc;
|
||||||
|
fspells->spells = NULL;
|
||||||
|
return fspells;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_familiarspells(void)
|
||||||
|
{
|
||||||
|
familiar_spells * fspells;
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_PSEUDODRAGON]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_FLEE));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SLEEP));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_FRIGHTEN));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_NYMPH]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SEDUCE));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_CALM_MONSTER));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SONG_OF_CONFUSION));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_DENYATTACK));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_NYMPH]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SEDUCE));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_CALM_MONSTER));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SONG_OF_CONFUSION));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_DENYATTACK));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_UNICORN]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_RESISTMAGICBONUS));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SONG_OF_PEACE));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_CALM_MONSTER));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_HERO));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_HEALINGSONG));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_DENYATTACK));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_WRAITH]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_STEALAURA));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_FRIGHTEN));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SUMMONUNDEAD));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_IMP]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_STEALAURA));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_DREAMCAT]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_ILL_SHAPESHIFT));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_TRANSFERAURA_TRAUM));
|
||||||
|
|
||||||
|
fspells = mkspells(new_race[RC_FEY]);
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_DENYATTACK));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_CALM_MONSTER));
|
||||||
|
add_spelllist(&fspells->spells, find_spellbyid(SPL_SEDUCE));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_races(void)
|
||||||
|
{
|
||||||
|
init_familiarspells();
|
||||||
|
}
|
|
@ -156,7 +156,9 @@ extern const char * racename(const struct locale *lang, const struct unit *u, co
|
||||||
extern boolean allowed_dragon(const struct region * src, const struct region * target);
|
extern boolean allowed_dragon(const struct region * src, const struct region * target);
|
||||||
|
|
||||||
extern void register_races(void);
|
extern void register_races(void);
|
||||||
|
extern void init_races(void);
|
||||||
extern boolean r_insectstalled(const struct region *r);
|
extern boolean r_insectstalled(const struct region *r);
|
||||||
|
extern spell_list * familiarspells(const struct race * rc);
|
||||||
|
|
||||||
|
|
||||||
extern const char *race_prefixes[];
|
extern const char *race_prefixes[];
|
||||||
|
|
|
@ -314,6 +314,9 @@
|
||||||
DisableLanguageExtensions="FALSE"/>
|
DisableLanguageExtensions="FALSE"/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\lua\spell.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\lua\unit.cpp">
|
RelativePath=".\lua\unit.cpp">
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
#include <config.h>
|
||||||
|
#include <eressea.h>
|
||||||
|
#include "list.h"
|
||||||
|
|
||||||
|
// Atributes includes
|
||||||
|
#include <attributes/racename.h>
|
||||||
|
|
||||||
|
// kernel includes
|
||||||
|
#include <kernel/magic.h>
|
||||||
|
|
||||||
|
// lua includes
|
||||||
|
#include <lua.hpp>
|
||||||
|
#include <luabind/luabind.hpp>
|
||||||
|
#include <luabind/iterator_policy.hpp>
|
||||||
|
|
||||||
|
using namespace luabind;
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
spell_getschool(const spell& sp)
|
||||||
|
{
|
||||||
|
return magietypen[sp.magietyp];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bind_spell(lua_State * L)
|
||||||
|
{
|
||||||
|
module(L)[
|
||||||
|
class_<struct spell>("spell")
|
||||||
|
.def_readonly("name", &spell::sname)
|
||||||
|
.def_readonly("level", &spell::level)
|
||||||
|
.def("school", &spell_getschool)
|
||||||
|
];
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <eressea.h>
|
#include <eressea.h>
|
||||||
|
#include "list.h"
|
||||||
|
|
||||||
// Atributes includes
|
// Atributes includes
|
||||||
#include <attributes/racename.h>
|
#include <attributes/racename.h>
|
||||||
|
@ -11,6 +12,7 @@
|
||||||
#include <kernel/faction.h>
|
#include <kernel/faction.h>
|
||||||
#include <kernel/skill.h>
|
#include <kernel/skill.h>
|
||||||
#include <kernel/unit.h>
|
#include <kernel/unit.h>
|
||||||
|
#include <kernel/magic.h>
|
||||||
|
|
||||||
// lua includes
|
// lua includes
|
||||||
#include <lua.hpp>
|
#include <lua.hpp>
|
||||||
|
@ -19,6 +21,32 @@
|
||||||
|
|
||||||
using namespace luabind;
|
using namespace luabind;
|
||||||
|
|
||||||
|
class bind_spell_ptr {
|
||||||
|
public:
|
||||||
|
static spell_ptr * next(spell_ptr * node) { return node->next; }
|
||||||
|
static spell * value(spell_ptr * node) { return find_spellbyid(node->spellid); }
|
||||||
|
};
|
||||||
|
|
||||||
|
static eressea::list<spell, spell_ptr, bind_spell_ptr>
|
||||||
|
unit_spells(const unit& u) {
|
||||||
|
sc_mage * mage = get_mage(&u);
|
||||||
|
if (mage==NULL) return eressea::list<spell, spell_ptr, bind_spell_ptr>(NULL);
|
||||||
|
spell_ptr * splist = mage->spellptr;
|
||||||
|
return eressea::list<spell, spell_ptr, bind_spell_ptr>(splist);
|
||||||
|
}
|
||||||
|
|
||||||
|
class bind_spell_list {
|
||||||
|
public:
|
||||||
|
static spell_list * next(spell_list * node) { return node->next; }
|
||||||
|
static spell * value(spell_list * node) { return node->data; }
|
||||||
|
};
|
||||||
|
|
||||||
|
static eressea::list<spell, spell_list, bind_spell_list>
|
||||||
|
unit_familiarspells(const unit& u) {
|
||||||
|
spell_list * spells = familiarspells(u.race);
|
||||||
|
return eressea::list<spell, spell_list, bind_spell_list>(spells);
|
||||||
|
}
|
||||||
|
|
||||||
static unit *
|
static unit *
|
||||||
add_unit(faction * f, region * r)
|
add_unit(faction * f, region * r)
|
||||||
{
|
{
|
||||||
|
@ -135,6 +163,8 @@ bind_unit(lua_State * L)
|
||||||
.def("eff_skill", &unit_effskill)
|
.def("eff_skill", &unit_effskill)
|
||||||
.def("set_skill", &unit_setskill)
|
.def("set_skill", &unit_setskill)
|
||||||
.def("set_racename", &unit_setracename)
|
.def("set_racename", &unit_setracename)
|
||||||
|
.property("spells", &unit_spells, return_stl_iterator)
|
||||||
|
.property("familiarspells", &unit_familiarspells, return_stl_iterator)
|
||||||
.property("number", &unit_getnumber, &unit_setnumber)
|
.property("number", &unit_getnumber, &unit_setnumber)
|
||||||
.property("race", &unit_getrace, &unit_setrace)
|
.property("race", &unit_getrace, &unit_setrace)
|
||||||
];
|
];
|
||||||
|
|
|
@ -173,6 +173,7 @@ game_init(void)
|
||||||
init_attributes();
|
init_attributes();
|
||||||
init_resources();
|
init_resources();
|
||||||
init_items();
|
init_items();
|
||||||
|
init_races();
|
||||||
init_economy();
|
init_economy();
|
||||||
#if NEW_RESOURCEGROWTH
|
#if NEW_RESOURCEGROWTH
|
||||||
init_rawmaterials();
|
init_rawmaterials();
|
||||||
|
|
|
@ -186,6 +186,7 @@ game_init(void)
|
||||||
|
|
||||||
init_attributes();
|
init_attributes();
|
||||||
init_resources();
|
init_resources();
|
||||||
|
init_races();
|
||||||
init_items();
|
init_items();
|
||||||
init_economy();
|
init_economy();
|
||||||
#if NEW_RESOURCEGROWTH
|
#if NEW_RESOURCEGROWTH
|
||||||
|
|
Loading…
Reference in New Issue