forked from github/server
Merge pull request #660 from ennorehling/develop
remove shadowcall spell
This commit is contained in:
commit
8d963fefda
|
@ -3819,10 +3819,6 @@
|
|||
<text locale="de">Meteorregen</text>
|
||||
<text locale="en">Meteor Shower</text>
|
||||
</string>
|
||||
<string name="shadowcall">
|
||||
<text locale="de">Schattenruf</text>
|
||||
<text locale="en">Shadow Call</text>
|
||||
</string>
|
||||
<string name="create_ror">
|
||||
<text locale="de">Erschaffe einen Ring der Regeneration</text>
|
||||
<text locale="en">Create A Ring of Regeneration</text>
|
||||
|
@ -4503,10 +4499,6 @@
|
|||
<text locale="de">Verletzt alle Gegner.</text>
|
||||
<text locale="en">Injures all enemies.</text>
|
||||
</string>
|
||||
<string name="shadowcall">
|
||||
<text locale="de">Ruft Schattenwesen.</text>
|
||||
<text locale="en">Calls beings from shadow.</text>
|
||||
</string>
|
||||
<string name="aura_of_fear">
|
||||
<text locale="de">Panik.</text>
|
||||
<text locale="en">Panic.</text>
|
||||
|
|
|
@ -7521,16 +7521,6 @@
|
|||
<text locale="en">"$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories."</text>
|
||||
</message>
|
||||
|
||||
<message name="sp_shadowcall_effect" section="magic">
|
||||
<type>
|
||||
<arg name="mage" type="unit"/>
|
||||
<arg name="amount" type="int"/>
|
||||
<arg name="race" type="race"/>
|
||||
</type>
|
||||
<text locale="de">"$unit($mage) ruft $int($amount) $race($race, 0) zu Hilfe."</text>
|
||||
<text locale="en">"$unit($mage) calls upon the help of $int($amount) $race($race, 0)."</text>
|
||||
</message>
|
||||
|
||||
<message name="battle::killed" section="battle">
|
||||
<type>
|
||||
<arg name="unit" type="unit"/>
|
||||
|
|
|
@ -885,35 +885,4 @@
|
|||
<attack type="8" damage="1d10"/>
|
||||
</race>
|
||||
|
||||
<!-- for the shadowcall spell -->
|
||||
<race name="shadowbat" magres="80" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="1" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||
<ai splitsize="5000" killpeasants="yes"/>
|
||||
<function name="name" value="namegeneric"/>
|
||||
<attack type="4" damage="1d6"/>
|
||||
<attack type="3" damage="1d1"/>
|
||||
</race>
|
||||
|
||||
<!-- for the shadowcall spell -->
|
||||
<race name="nightmare" magres="50" maxaura="0.000000" regaura="0.000000" weight="100" capacity="540" speed="1.0" hp="80" ac="10" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
|
||||
<ai splitsize="500" killpeasants="yes"/>
|
||||
<function name="name" value="namegeneric"/>
|
||||
<attack type="4" damage="1d4"/>
|
||||
<attack type="4" damage="1d4"/>
|
||||
<attack type="4" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="2" damage="1d10"/>
|
||||
</race>
|
||||
|
||||
<!-- for the shadowcall spell -->
|
||||
<race name="vampunicorn" magres="1.0" maxaura="0.000000" regaura="0.000000" weight="5000" capacity="2000" speed="1.0" hp="30" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
||||
<ai splitsize="5000" killpeasants="yes"/>
|
||||
<function name="name" value="namegeneric"/>
|
||||
<attack type="4" damage="2d10"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="2" damage="2d60"/>
|
||||
</race>
|
||||
|
||||
</races>
|
||||
|
|
|
@ -107,7 +107,6 @@
|
|||
<entry spell="rustweapon" level="3" />
|
||||
<entry spell="sacrifice_strength" level="15" />
|
||||
<entry spell="seduction" level="6" />
|
||||
<entry spell="shadowcall" level="12" />
|
||||
<entry spell="shadowknights" level="1" />
|
||||
<entry spell="shapeshift" level="3" />
|
||||
<entry spell="shockwave" level="5" />
|
||||
|
|
|
@ -665,9 +665,6 @@
|
|||
<spell name="aura_of_fear" rank="5" index="175" combat="2">
|
||||
<resource name="aura" amount="12" cost="fixed"/>
|
||||
</spell>
|
||||
<spell name="shadowcall" rank="5" index="176" combat="1">
|
||||
<resource name="aura" amount="24" cost="fixed"/>
|
||||
</spell>
|
||||
<spell name="immolation" rank="5" index="180" combat="2">
|
||||
<resource name="aura" amount="24" cost="fixed"/>
|
||||
</spell>
|
||||
|
|
|
@ -1283,31 +1283,5 @@
|
|||
<attack type="4" damage="5d30"/>
|
||||
<attack type="6" spell="drain_skills" level="12"/>
|
||||
<attack type="6" spell="aura_of_fear" level="12"/>
|
||||
<precombatspell spell="shadowcall"/>
|
||||
</race>
|
||||
<race name="shadowbat" magres="80" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="1" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||
<ai splitsize="5000" killpeasants="yes"/>
|
||||
<function name="name" value="namegeneric"/>
|
||||
<attack type="4" damage="1d6"/>
|
||||
<attack type="3" damage="1d1"/>
|
||||
</race>
|
||||
<race name="nightmare" magres="50" maxaura="0.000000" regaura="0.000000" weight="100" capacity="540" speed="1.000000" hp="80" ac="10" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
|
||||
<ai splitsize="500" killpeasants="yes"/>
|
||||
<function name="name" value="namegeneric"/>
|
||||
<attack type="4" damage="1d4"/>
|
||||
<attack type="4" damage="1d4"/>
|
||||
<attack type="4" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="2" damage="1d10"/>
|
||||
</race>
|
||||
<race name="vampunicorn" magres="100" maxaura="0.000000" regaura="0.000000" weight="5000" capacity="2000" speed="1.000000" hp="30" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
||||
<ai splitsize="5000" killpeasants="yes"/>
|
||||
<function name="name" value="namegeneric"/>
|
||||
<attack type="4" damage="2d10"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="3" damage="1d4"/>
|
||||
<attack type="2" damage="2d60"/>
|
||||
</race>
|
||||
</races>
|
||||
|
|
|
@ -123,7 +123,6 @@
|
|||
<entry spell="rustweapon" level="3" />
|
||||
<entry spell="sacrifice_strength" level="15" />
|
||||
<entry spell="seduction" level="6" />
|
||||
<entry spell="shadowcall" level="12" />
|
||||
<entry spell="shadowknights" level="1" />
|
||||
<entry spell="shapeshift" level="3" />
|
||||
<entry spell="shockwave" level="5" />
|
||||
|
|
|
@ -471,9 +471,6 @@
|
|||
<spell name="aura_of_fear" rank="5" index="175" combat="2">
|
||||
<resource name="aura" amount="12" cost="fixed"/>
|
||||
</spell>
|
||||
<spell name="shadowcall" rank="5" index="176" combat="1">
|
||||
<resource name="aura" amount="24" cost="fixed"/>
|
||||
</spell>
|
||||
<spell name="mallorntreegrow" rank="5" index="177" far="true" variable="true">
|
||||
<resource name="aura" amount="6" cost="level"/>
|
||||
<resource name="mallorn" amount="1" cost="level"/>
|
||||
|
|
|
@ -43,7 +43,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include <assert.h>
|
||||
|
||||
typedef enum {
|
||||
TNONE = 0, TINTEGER = 1
|
||||
TNONE = 0, TINTEGER = 1, TREAL = 2
|
||||
} dict_type;
|
||||
|
||||
typedef struct dict_data {
|
||||
|
@ -72,11 +72,18 @@ static int dict_read(attrib * a, void *owner, gamedata *data)
|
|||
dd->name = strdup(name);
|
||||
READ_INT(store, &n);
|
||||
dd->type = (dict_type)n;
|
||||
if (dd->type != TINTEGER) {
|
||||
if (dd->type == TINTEGER) {
|
||||
READ_INT(store, &dd->data.i);
|
||||
}
|
||||
else if (dd->type == TREAL) {
|
||||
float flt;
|
||||
READ_FLT(store, &flt);
|
||||
dd->data.real = flt;
|
||||
}
|
||||
else {
|
||||
log_error("read dict, invalid type %d", n);
|
||||
return AT_READ_FAIL;
|
||||
}
|
||||
READ_INT(store, &dd->data.i);
|
||||
return AT_READ_DEPR;
|
||||
}
|
||||
|
||||
|
@ -95,6 +102,16 @@ static void dict_done(attrib * a)
|
|||
free(a->data.v);
|
||||
}
|
||||
|
||||
static void upgrade_keyval(const dict_data *dd, int keyval[], int v) {
|
||||
if (strcmp(dd->name, "embassy_muschel") == 0) {
|
||||
keyval[0] = atoi36("mupL");
|
||||
keyval[1] = v;
|
||||
}
|
||||
else {
|
||||
log_error("dict conversion, bad entry %s", dd->name);
|
||||
}
|
||||
}
|
||||
|
||||
static void dict_upgrade(attrib **alist, attrib *abegin) {
|
||||
int n = 0, *keys = 0;
|
||||
int i = 0, val[8];
|
||||
|
@ -105,18 +122,17 @@ static void dict_upgrade(attrib **alist, attrib *abegin) {
|
|||
}
|
||||
for (a = abegin; a && a->type == abegin->type; a = a->next) {
|
||||
dict_data *dd = (dict_data *)a->data.v;
|
||||
if (dd->type != TINTEGER) {
|
||||
log_error("dict conversion, bad type %d for %s", dd->type, dd->name);
|
||||
if (dd->type == TINTEGER) {
|
||||
upgrade_keyval(dd, val + i * 2, dd->data.i);
|
||||
++i;
|
||||
}
|
||||
else if (dd->type == TREAL) {
|
||||
upgrade_keyval(dd, val + i * 2, (int)dd->data.real);
|
||||
++i;
|
||||
}
|
||||
else {
|
||||
if (strcmp(dd->name, "embassy_muschel")==0) {
|
||||
val[i * 2] = atoi36("mupL");
|
||||
val[i * 2 + 1] = dd->data.i;
|
||||
++i;
|
||||
}
|
||||
else {
|
||||
log_error("dict conversion, bad entry %s", dd->name);
|
||||
}
|
||||
log_error("dict conversion, bad type %d for %s", dd->type, dd->name);
|
||||
assert(!"invalid input");
|
||||
}
|
||||
if (i == 4) {
|
||||
keys = realloc(keys, sizeof(int) * (n + i + 1));
|
||||
|
|
|
@ -277,7 +277,6 @@ void free_races(void) {
|
|||
free(at->data.dice);
|
||||
}
|
||||
}
|
||||
spellref_free(races->precombatspell);
|
||||
free(xrefs);
|
||||
xrefs = 0;
|
||||
free(races->_name);
|
||||
|
@ -337,7 +336,6 @@ race *rc_create(const char *zName)
|
|||
assert(strchr(zName, ' ') == NULL);
|
||||
}
|
||||
rc->_name = strdup(zName);
|
||||
rc->precombatspell = NULL;
|
||||
|
||||
rc->attack[0].type = AT_COMBATSPELL;
|
||||
for (i = 1; i < RACE_ATTACKS; ++i)
|
||||
|
|
|
@ -138,7 +138,6 @@ extern "C" {
|
|||
int df_default; /* Verteidigungsskill Unbewaffnet (default: -2) */
|
||||
int at_bonus; /* Ver<65>ndert den Angriffsskill (default: 0) */
|
||||
int df_bonus; /* Ver<65>ndert den Verteidigungskill (default: 0) */
|
||||
struct spellref *precombatspell;
|
||||
signed char *study_speed; /* study-speed-bonus in points/turn (0=30 Tage) */
|
||||
int flags;
|
||||
int battle_flags;
|
||||
|
|
|
@ -1849,17 +1849,6 @@ static int parse_races(xmlDocPtr doc)
|
|||
}
|
||||
xmlXPathFreeObject(result);
|
||||
|
||||
/* reading eressea/races/race/precombatspell */
|
||||
xpath->node = node;
|
||||
result = xmlXPathEvalExpression(BAD_CAST "precombatspell", xpath);
|
||||
assert(rc->precombatspell == NULL
|
||||
|| !"precombatspell is already initialized");
|
||||
for (k = 0; k != result->nodesetval->nodeNr; ++k) {
|
||||
xmlNodePtr node = result->nodesetval->nodeTab[k];
|
||||
rc->precombatspell = xml_spellref(node, "spell");
|
||||
}
|
||||
xmlXPathFreeObject(result);
|
||||
|
||||
/* reading eressea/races/race/attack */
|
||||
xpath->node = node;
|
||||
result = xmlXPathEvalExpression(BAD_CAST "attack", xpath);
|
||||
|
|
|
@ -561,13 +561,6 @@ const spell *get_combatspell(const unit * u, int nr)
|
|||
if (m) {
|
||||
return m->combatspells[nr].sp;
|
||||
}
|
||||
else {
|
||||
const race * rc = u_race(u);
|
||||
if (rc->precombatspell) {
|
||||
return spellref_get(rc->precombatspell);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -6596,7 +6596,6 @@ static spelldata spell_functions[] = {
|
|||
{ "powerful_dragonbreath", sp_dragonodem, 0 },
|
||||
{ "drain_skills", sp_dragonodem, 0 },
|
||||
{ "aura_of_fear", sp_flee, 0 },
|
||||
{ "shadowcall", sp_shadowcall, 0 },
|
||||
{ "immolation", sp_immolation, 0 },
|
||||
{ "firestorm", sp_immolation, 0 },
|
||||
{ "coldfront", sp_immolation, 0 },
|
||||
|
|
|
@ -815,42 +815,6 @@ int sp_drainodem(fighter * fi, int level, double power, spell * sp)
|
|||
/* ------------------------------------------------------------- */
|
||||
/* PRECOMBAT */
|
||||
|
||||
int sp_shadowcall(struct castorder * co)
|
||||
{
|
||||
fighter * fi = co->magician.fig;
|
||||
int level = co->level;
|
||||
double power = co->force;
|
||||
battle *b = fi->side->battle;
|
||||
region *r = b->region;
|
||||
unit *mage = fi->unit;
|
||||
attrib *a;
|
||||
int force = (int)(get_force(power, 3) / 2);
|
||||
unit *u;
|
||||
const char *rcnames[3] = { "shadowbat", "nightmare", "vampunicorn" };
|
||||
const race *rc = rc_find(rcnames[rng_int() % 3]);
|
||||
message *msg;
|
||||
|
||||
u = create_unit(r, mage->faction, force, rc, 0, NULL, mage);
|
||||
setstatus(u, ST_FIGHT);
|
||||
|
||||
set_level(u, SK_WEAPONLESS, (int)(power / 2));
|
||||
set_level(u, SK_STAMINA, (int)(power / 2));
|
||||
u->hp = u->number * unit_max_hp(u);
|
||||
|
||||
a = a_new(&at_unitdissolve);
|
||||
a->data.ca[0] = 0;
|
||||
a->data.ca[1] = 100;
|
||||
a_add(&u->attribs, a);
|
||||
|
||||
make_fighter(b, u, fi->side, is_attacker(fi));
|
||||
msg =
|
||||
msg_message("sp_shadowcall_effect", "mage amount race", mage, u->number,
|
||||
u_race(u));
|
||||
message_all(b, msg);
|
||||
msg_release(msg);
|
||||
return level;
|
||||
}
|
||||
|
||||
static fighter *summon_allies(const fighter *fi, const race *rc, int number) {
|
||||
attrib *a;
|
||||
unit *mage = fi->unit;
|
||||
|
|
|
@ -49,7 +49,6 @@ extern "C" {
|
|||
int sp_armorshield(struct castorder * co);
|
||||
int sp_stun(struct castorder * co);
|
||||
int sp_undeadhero(struct castorder * co);
|
||||
int sp_shadowcall(struct castorder * co);
|
||||
int sp_immolation(struct castorder * co);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
Loading…
Reference in New Issue