Merge pull request #503 from ennorehling/refactor-cfindhash

Kill cfindhash and the old Alp spell
This commit is contained in:
Enno Rehling 2016-03-26 14:53:03 +01:00
commit 29b715d128
21 changed files with 6 additions and 570 deletions

View File

@ -2906,23 +2906,6 @@
<text locale="en">toad</text> <text locale="en">toad</text>
</string> </string>
<string name="alp">
<text locale="de">Alp</text>
<text locale="en">nightmare</text>
</string>
<string name="alp_p">
<text locale="de">Alps</text>
<text locale="en">nightmaress</text>
</string>
<string name="alp_d">
<text locale="de">Alps</text>
<text locale="en">nightmares</text>
</string>
<string name="alp_x">
<text locale="de">Alp</text>
<text locale="en">nightmare</text>
</string>
<string name="mountainguard"> <string name="mountainguard">
<text locale="de">Bergwächter</text> <text locale="de">Bergwächter</text>
<text locale="en">mountainguard</text> <text locale="en">mountainguard</text>
@ -4357,10 +4340,6 @@
<text locale="de">Traumdeuten</text> <text locale="de">Traumdeuten</text>
<text locale="en">Mind Probe</text> <text locale="en">Mind Probe</text>
</string> </string>
<string name="summon_alp">
<text locale="de">Alp</text>
<text locale="en">Nightmare</text>
</string>
<string name="create_dreameye"> <string name="create_dreameye">
<text locale="de">Erschaffe ein Traumauge</text> <text locale="de">Erschaffe ein Traumauge</text>
<text locale="en">Create a Visioneye</text> <text locale="en">Create a Visioneye</text>
@ -6424,25 +6403,6 @@
target's faction, skills and possessions will no target's faction, skills and possessions will no
longer be unknown.</text> longer be unknown.</text>
</string> </string>
<string name="summon_alp">
<text locale="de">Der Magier beschwört ein kleines Monster, einen Alp. Dieses bewegt sich
langsam auf sein Opfer zu (das sich an einem beliebigen Ort an der Welt
befinden kann, der Magier oder seine Partei braucht es nicht zu sehen).
Sobald das Opfer erreicht ist, wird es gnadenlos gequält, und nur durch
einen starken Gegenzauber oder den Tod des beschwörenden Magiers kann
das Opfer wieder Frieden finden. Bei der Beschwörung des Alps verliert
der Magier einen kleinen Teil seiner Aura für immer.</text>
<text locale="en">The magician spawns a little monster, a nightmare. The nightmare slowly
approaches its victim (which may be at an arbitrary place in eressea, it
is not needed for the magician or his party to see the victim). As soon
as
the victim is reached the nightmare starts to torment it without mercy,
only a powerfull counter spell or the death of the casting magician can
redeem
the victim. When spawning the nightmare the magician loses a small amount
of
his aura forever.</text>
</string>
<string name="create_dreameye"> <string name="create_dreameye">
<text locale="de">Ein mit diesem Zauber belegtes Drachenauge, welches zum Abendmahle <text locale="de">Ein mit diesem Zauber belegtes Drachenauge, welches zum Abendmahle
verzehrt wird, erlaubt es dem Benutzer, in die Träume einer anderen verzehrt wird, erlaubt es dem Benutzer, in die Träume einer anderen
@ -7354,11 +7314,6 @@
<text locale="en">fire dragon</text> <text locale="en">fire dragon</text>
</string> </string>
<string name="trigger_alp_destroy">
<text locale="de">Ein Alp starb, ohne sein Ziel zu erreichen.</text>
<text locale="en">An alp died before it reached its target.</text>
</string>
<string name="unarmed"> <string name="unarmed">
<text locale="de">unbewaffnet</text> <text locale="de">unbewaffnet</text>
<text locale="en">unarmed</text> <text locale="en">unarmed</text>

View File

@ -65,13 +65,6 @@
<text locale="de">$unit($owner) bittet $unit($unit), $building($building) zu verlassen.</text> <text locale="de">$unit($owner) bittet $unit($unit), $building($building) zu verlassen.</text>
<text locale="en">$unit($owner) asks $unit($unit) to leave $building($building).</text> <text locale="en">$unit($owner) asks $unit($unit) to leave $building($building).</text>
</message> </message>
<message name="alp_destroyed" section="events">
<type>
<arg name="region" type="region"/>
</type>
<text locale="de">Ein Alp starb in $region($region), ohne sein Ziel zu erreichen.</text>
<text locale="en">An alp died in $region($region) before reaching its target.</text>
</message>
<message name="nr_claims" section="nr"> <message name="nr_claims" section="nr">
<type> <type>
<arg name="items" type="items"/> <arg name="items" type="items"/>
@ -1277,11 +1270,6 @@
<text locale="en">"$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous."</text> <text locale="en">"$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous."</text>
</message> </message>
<message name="alp_success" section="events">
<text locale="de">"Ein Alp hat sein Opfer gefunden und springt auf den Rücken von $unit($target)!"</text>
<text locale="en">"An evil spirit has found its victim and mounts the back of $unit($target)!"</text>
</message>
<message name="curseinfo::auraboost_0" section="events"> <message name="curseinfo::auraboost_0" section="events">
<type> <type>
<arg name="unit" type="unit"/> <arg name="unit" type="unit"/>
@ -1469,16 +1457,6 @@
<text locale="en">"$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty."</text> <text locale="en">"$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty."</text>
</message> </message>
<message name="summon_alp_effect" section="magic">
<type>
<arg name="mage" type="unit"/>
<arg name="alp" type="unit"/>
<arg name="target" type="unit"/>
</type>
<text locale="de">"$unit($mage) beschwört den Alp $unit($alp) für $unit($target)."</text>
<text locale="en">"$unit($mage) summons the alp $unit($alp) for $unit($target)."</text>
</message>
<message name="healing_effect_0" section="magic"> <message name="healing_effect_0" section="magic">
<type> <type>
<arg name="mage" type="unit"/> <arg name="mage" type="unit"/>

View File

@ -672,11 +672,6 @@
<skill name="stamina" modifier="-10"/> <skill name="stamina" modifier="-10"/>
<attack type="4" damage="1d2"/> <attack type="4" damage="1d2"/>
</race> </race>
<race name="alp" magres="0.950000" maxaura="1.0" regaura="1.0" weight="0" capacity="0" speed="1.500000" hp="20" ac="2" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="2" defensemodifier="20" fly="yes" walk="yes" canlearn="no" canteach="no">
<ai splitsize="1"/>
<function name="name" value="namegeneric"/>
<attack type="1" damage="1d4"/>
</race>
<race name="mountainguard" unarmedguard="yes" magres="0.500000" maxaura="1.0" regaura="0.500000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" canlearn="no" teach="no" noweapons="yes"> <race name="mountainguard" unarmedguard="yes" magres="0.500000" maxaura="1.0" regaura="0.500000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" canlearn="no" teach="no" noweapons="yes">
<ai splitsize="1"/> <ai splitsize="1"/>
<function name="name" value="namegeneric"/> <function name="name" value="namegeneric"/>

View File

@ -671,11 +671,6 @@
<skill name="stamina" modifier="-10"/> <skill name="stamina" modifier="-10"/>
<attack type="4" damage="1d2"/> <attack type="4" damage="1d2"/>
</race> </race>
<race name="alp" magres="0.950000" maxaura="1.000000" regaura="1.000000" recruitcost="50000" weight="0" capacity="0" speed="1.500000" hp="20" ac="2" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="2" defensemodifier="20" fly="yes" walk="yes" canlearn="no" canteach="no">
<ai splitsize="1"/>
<function name="name" value="namegeneric"/>
<attack type="1" damage="1d4"/>
</race>
<race name="mountainguard" unarmedguard="yes" magres="0.500000" maxaura="1.000000" regaura="0.500000" recruitcost="50000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" canlearn="no" teach="no" noweapons="yes"> <race name="mountainguard" unarmedguard="yes" magres="0.500000" maxaura="1.000000" regaura="0.500000" recruitcost="50000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" canlearn="no" teach="no" noweapons="yes">
<ai splitsize="1"/> <ai splitsize="1"/>
<function name="name" value="namegeneric"/> <function name="name" value="namegeneric"/>

View File

@ -142,7 +142,6 @@
<entry spell="stonegolem" level="1" /> <entry spell="stonegolem" level="1" />
<entry spell="stormwinds" level="6" /> <entry spell="stormwinds" level="6" />
<entry spell="strongwall" level="8" /> <entry spell="strongwall" level="8" />
<!-- <entry spell="summon_alp" level="15" /> -->
<entry spell="summondragon" level="11" /> <entry spell="summondragon" level="11" />
<entry spell="summonent" level="10" /> <entry spell="summonent" level="10" />
<entry spell="summon_familiar" level="9" /> <entry spell="summon_familiar" level="9" />

View File

@ -8,7 +8,6 @@
<entry spell="transferauratraum" level="3" /> <entry spell="transferauratraum" level="3" />
<entry spell="disturbingdreams" level="6" /> <entry spell="disturbingdreams" level="6" />
<entry spell="sleep" level="7" /> <entry spell="sleep" level="7" />
<!-- <entry spell="summon_alp" level="15" /> -->
<entry spell="mindblast" level="11" /> <entry spell="mindblast" level="11" />
<entry spell="reanimate" level="5" /> <entry spell="reanimate" level="5" />
<entry spell="shapeshift" level="3" /> <entry spell="shapeshift" level="3" />

View File

@ -188,13 +188,6 @@
<resource name="h12" amount="1" cost="fixed"/> <resource name="h12" amount="1" cost="fixed"/>
<resource name="h20" amount="1" cost="fixed"/> <resource name="h20" amount="1" cost="fixed"/>
</spell> </spell>
<!--
<spell name="summon_alp" rank="5" index="58" parameters="u" target_global="true">
<resource name="aura" amount="350" cost="fixed"/>
<resource name="permaura" amount="5" cost="fixed"/>
<resource name="h8" amount="1" cost="fixed"/>
</spell>
-->
<spell name="windshield" rank="5" index="59" variable="true" combat="1"> <spell name="windshield" rank="5" index="59" variable="true" combat="1">
<resource name="aura" amount="2" cost="level"/> <resource name="aura" amount="2" cost="level"/>
</spell> </spell>

View File

@ -71,25 +71,6 @@ function test_rename()
assert_equal(u:get_item("ao_healing"), 1) assert_equal(u:get_item("ao_healing"), 1)
end end
function DISABLE_test_alp()
local r = region.create(0,0, "plain")
local f = faction.create("noreply@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
local u2 = unit.create(f, r, 1)
u.race = "elf"
u:set_skill("magic", 10)
u:add_item("money", 3010)
u.magic = "illaun"
u.aura = 200
u.ship = s1
u:add_spell("summon_alp")
u:clear_orders()
u:add_order("ZAUBERE 'Alp' " .. itoa36(u2.id))
process_orders()
print(get_turn(), f)
write_reports()
end
function test_unit_limit_is_1500() function test_unit_limit_is_1500()
local r = region.create(0,0, "plain") local r = region.create(0,0, "plain")
local f = faction.create("noreply@eressea.de", "human", "de") local f = faction.create("noreply@eressea.de", "human", "de")

View File

@ -98,16 +98,6 @@ static void cunhash(curse * c)
} }
} }
curse *cfindhash(int i)
{
curse *old;
for (old = cursehash[i % MAXENTITYHASH]; old; old = old->nexthash)
if (old->no == i)
return old;
return NULL;
}
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* at_curse */ /* at_curse */
void curse_init(attrib * a) void curse_init(attrib * a)
@ -389,9 +379,13 @@ curse *get_curse(attrib * ap, const curse_type * ctype)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* findet einen curse global anhand seiner 'curse-Einheitnummer' */ /* findet einen curse global anhand seiner 'curse-Einheitnummer' */
curse *findcurse(int cid) curse *findcurse(int i)
{ {
return cfindhash(cid); curse *old;
for (old = cursehash[i % MAXENTITYHASH]; old; old = old->nexthash)
if (old->no == i)
return old;
return NULL;
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -700,32 +694,6 @@ bool is_cursed_with(const attrib * ap, const curse * c)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* cursedata */ /* cursedata */
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/*
* typedef struct curse_type {
* const char *cname; (Name der Zauberwirkung, Identifizierung des curse)
* int typ;
* spread_t spread;
* unsigned int mergeflags;
* int (*curseinfo)(const struct locale*, const void*, int, curse*, int);
* void (*change_vigour)(curse*, double);
* int (*read)(struct storage * store, curse * c);
* int (*write)(struct storage * store, const curse * c);
* } curse_type;
*/
int resolve_curse(variant id, void *address)
{
int result = 0;
curse *c = NULL;
if (id.i != 0) {
c = cfindhash(id.i);
if (c == NULL) {
result = -1;
}
}
*(curse **)address = c;
return result;
}
static const char *oldnames[MAXCURSE] = { static const char *oldnames[MAXCURSE] = {
/* OBS: when removing curses, remember to update read_ccompat() */ /* OBS: when removing curses, remember to update read_ccompat() */

View File

@ -286,8 +286,6 @@ extern "C" {
void ct_register(const curse_type *); void ct_register(const curse_type *);
void ct_checknames(void); void ct_checknames(void);
curse *cfindhash(int i);
curse *findcurse(int curseid); curse *findcurse(int curseid);
void curse_init(struct attrib *a); void curse_init(struct attrib *a);
@ -296,7 +294,6 @@ extern "C" {
double destr_curse(struct curse *c, int cast_level, double force); double destr_curse(struct curse *c, int cast_level, double force);
int resolve_curse(variant data, void *address);
bool is_cursed_with(const struct attrib *ap, const struct curse *c); bool is_cursed_with(const struct attrib *ap, const struct curse *c);
/* gibt true, wenn der Curse nicht NULL oder inaktiv ist */ /* gibt true, wenn der Curse nicht NULL oder inaktiv ist */

View File

@ -1876,7 +1876,6 @@ int newunitid(void)
start_random_no = random_unit_no; start_random_no = random_unit_no;
while (ufindhash(random_unit_no) || dfindhash(random_unit_no) while (ufindhash(random_unit_no) || dfindhash(random_unit_no)
|| cfindhash(random_unit_no)
|| forbiddenid(random_unit_no)) { || forbiddenid(random_unit_no)) {
random_unit_no++; random_unit_no++;
if (random_unit_no == MAX_UNIT_NR + 1) { if (random_unit_no == MAX_UNIT_NR + 1) {

View File

@ -25,9 +25,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "give.h" #include "give.h"
#include "move.h" #include "move.h"
/* triggers includes */
#include <triggers/removecurse.h>
/* attributes includes */ /* attributes includes */
#include <attributes/targetregion.h> #include <attributes/targetregion.h>
#include <attributes/hate.h> #include <attributes/hate.h>

View File

@ -28,9 +28,6 @@
#include "keyword.h" #include "keyword.h"
#include "study.h" #include "study.h"
/* triggers includes */
#include <triggers/removecurse.h>
/* attributes includes */ /* attributes includes */
#include <attributes/targetregion.h> #include <attributes/targetregion.h>
#include <attributes/hate.h> #include <attributes/hate.h>

View File

@ -30,7 +30,6 @@
#include <spells/unitcurse.h> #include <spells/unitcurse.h>
#include <spells/shipcurse.h> #include <spells/shipcurse.h>
#include <spells/combatspells.h> #include <spells/combatspells.h>
#include <spells/alp.h>
#include <spells/flyingship.h> #include <spells/flyingship.h>
/* kernel includes */ /* kernel includes */
@ -6510,7 +6509,6 @@ static spelldata spell_functions[] = {
{ "bad_dreams", sp_baddreams, 0 }, { "bad_dreams", sp_baddreams, 0 },
{ "mindblast", sp_mindblast_temp, 0 }, { "mindblast", sp_mindblast_temp, 0 },
{ "orkdream", sp_sweetdreams, 0 }, { "orkdream", sp_sweetdreams, 0 },
{ "summon_alp", sp_summon_alp, 0 }, // TODO: this spell is disabled everywhere
/* M_CERDDOR */ /* M_CERDDOR */
{ "appeasement", sp_denyattack, 0 }, { "appeasement", sp_denyattack, 0 },
{ "song_of_healing", sp_healing, 0 }, { "song_of_healing", sp_healing, 0 },
@ -6707,9 +6705,6 @@ void register_spells(void)
at_register(&at_wdwpyramid); at_register(&at_wdwpyramid);
at_register(&at_deathcloud_compat); at_register(&at_deathcloud_compat);
/* sp_summon_alp */
register_alp();
/* init_firewall(); */ /* init_firewall(); */
ct_register(&ct_firewall); ct_register(&ct_firewall);
ct_register(&ct_deathcloud); ct_register(&ct_deathcloud);

View File

@ -1,6 +1,5 @@
PROJECT(spells C) PROJECT(spells C)
SET(_FILES SET(_FILES
alp.c
borders.c borders.c
buildingcurse.c buildingcurse.c
combatspells.c combatspells.c

View File

@ -1,204 +0,0 @@
/*
*
* Eressea PB(E)M host Copyright (C) 1998-2015
* 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.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.
*/
#include <platform.h>
#include <kernel/config.h>
#include "alp.h"
#include <kernel/curse.h>
#include <kernel/faction.h>
#include <kernel/messages.h>
#include <kernel/race.h>
#include <kernel/region.h>
#include <kernel/unit.h>
/* util includes */
#include <util/attrib.h>
#include <util/event.h>
#include <util/gamedata.h>
#include <util/resolve.h>
#include <util/umlaut.h>
#include "monster.h"
#include <storage.h>
#include <triggers/createcurse.h>
#include <triggers/killunit.h>
#include <triggers/removecurse.h>
#include <triggers/unitmessage.h>
/* libc includes */
#include <stdlib.h>
#include <string.h>
#include <assert.h>
extern const char *directions[];
typedef struct alp_data {
unit *mage;
unit *target; // TODO: remove, use attribute-owner?
} alp_data;
static void alp_init(attrib * a)
{
a->data.v = calloc(sizeof(alp_data), 1);
}
static void alp_done(attrib * a)
{
free(a->data.v);
}
static int alp_verify(attrib * a, void *owner)
{
alp_data *ad = (alp_data *)a->data.v;
unused_arg(owner);
if (ad->mage && ad->target)
return 1;
return 0; /* remove the attribute */
}
static void
alp_write(const attrib * a, const void *owner, struct storage *store)
{
alp_data *ad = (alp_data *)a->data.v;
write_unit_reference(ad->mage, store);
write_unit_reference(ad->target, store);
}
static int alp_read(attrib * a, void *owner, struct gamedata *data)
{
alp_data *ad = (alp_data *)a->data.v;
int rm = read_reference(&ad->mage, data, read_unit_reference, resolve_unit);
int rt =
read_reference(&ad->target, data, read_unit_reference, resolve_unit);
if (rt == 0 && rm == 0 && (!ad->target || !ad->mage)) {
/* the target or mage disappeared. */
return AT_READ_FAIL;
}
return AT_READ_OK;
}
static attrib_type at_alp = {
"alp",
alp_init,
alp_done,
alp_verify,
alp_write,
alp_read,
NULL,
ATF_UNIQUE
};
int sp_summon_alp(struct castorder *co)
{
unit *alp, *opfer;
region *r = co_get_region(co);
unit *mage = co->magician.u;
int cast_level = co->level;
spellparameter *pa = co->par;
const struct race *rc = get_race(RC_ALP);
struct faction *f = get_monsters();
struct message *msg;
opfer = pa->param[0]->data.u;
/* Der Alp gehört den Monstern, darum erhält der Magier auch keine
* Regionsberichte von ihm. Er erhält aber später eine Mitteilung,
* sobald der Alp sein Opfer erreicht hat.
*/
alp = create_unit(r, f, 1, rc, 0, NULL, NULL);
set_level(alp, SK_STEALTH, 7);
setstatus(alp, ST_FLEE); /* flieht */
{
attrib *a = a_add(&alp->attribs, a_new(&at_alp));
alp_data *ad = (alp_data *)a->data.v;
ad->mage = mage;
ad->target = opfer;
}
{
/* Wenn der Alp stirbt, den Magier nachrichtigen */
add_trigger(&alp->attribs, "destroy", trigger_unitmessage(mage,
"trigger_alp_destroy", MSG_EVENT, ML_INFO));
/* Wenn Opfer oder Magier nicht mehr existieren, dann stirbt der Alp */
add_trigger(&mage->attribs, "destroy", trigger_killunit(alp));
add_trigger(&opfer->attribs, "destroy", trigger_killunit(alp));
}
msg = msg_message("summon_alp_effect", "mage alp target", mage, alp, opfer);
r_addmessage(r, mage->faction, msg);
msg_release(msg);
return cast_level;
}
void alp_findet_opfer(unit * alp, region * r)
{
curse *c;
attrib *a = a_find(alp->attribs, &at_alp);
alp_data *ad = (alp_data *)a->data.v;
unit *mage = ad->mage;
unit *opfer = ad->target;
float effect;
message *msg;
assert(opfer);
assert(mage);
/* Magier und Opfer Bescheid geben */
msg = msg_message("alp_success", "target", opfer);
add_message(&mage->faction->msgs, msg);
r_addmessage(opfer->region, opfer->faction, msg);
msg_release(msg);
/* Relations werden in destroy_unit(alp) automatisch gelöscht.
* Die Aktionen, die beim Tod des Alps ausgelöst werden sollen,
* müssen jetzt aber deaktiviert werden, sonst werden sie gleich
* beim destroy_unit(alp) ausgelöst.
*/
a_removeall(&alp->attribs, &at_eventhandler);
/* Alp umwandeln in Curse */
effect = -2;
c =
create_curse(mage, &opfer->attribs, ct_find("worse"), 2, 2, effect,
opfer->number);
/* solange es noch keine spezielle alp-Antimagie gibt, reagiert der
* auch auf normale */
set_number(alp, 0);
/* wenn der Magier stirbt, wird der Curse wieder vom Opfer genommen */
add_trigger(&mage->attribs, "destroy", trigger_removecurse(c, opfer));
}
void register_alp(void)
{
at_register(&at_alp);
}
unit *alp_target(unit * alp)
{
alp_data *ad;
unit *target = NULL;
attrib *a = a_find(alp->attribs, &at_alp);
if (a) {
ad = (alp_data *)a->data.v;
target = ad->target;
}
return target;
}

View File

@ -1,53 +0,0 @@
/*
*
*
* 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.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 ALP_H
#define ALP_H
#ifdef __cplusplus
extern "C" {
#endif
struct castorder;
struct region;
struct unit;
/* ------------------------------------------------------------- */
/* Name: Alp
* Stufe: 15
* Gebiet: Illaun
* Wirkung:
* Erschafft ein kleines Monster (den Alp). Dieser bewegt sich jede
* zweite Runde auf eine Zieleinheit zu. Sobald das Ziel erreicht ist,
* verwandelt es sich in einen Curse auf die Einheit, welches -2 auf
* alle Talente bewirkt.
*
* Fähigkeiten (factypes.c):
* Der Alp hat mittlere Tarnung (T7) und exzellente Verteidigung
* (+20, 99% Magieresistenz, siehe factypes.c)
*
* TODO: Der Alp-Curse sollte sich durch besondere Antimagie (Tybied)
* entfernen lassen.
*
* (UNITSPELL | SEARCHGLOBAL | TESTRESISTANCE)
*/
extern int sp_summon_alp(struct castorder *co);
extern void register_alp(void);
struct unit *alp_target(struct unit *alp);
void alp_findet_opfer(struct unit *alp, struct region *r);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -8,7 +8,6 @@ createunit.c
gate.c gate.c
giveitem.c giveitem.c
killunit.c killunit.c
removecurse.c
shock.c shock.c
timeout.c timeout.c
triggers.c triggers.c

View File

@ -1,111 +0,0 @@
/*
Copyright (c) 1998-2015, 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.
**/
#include <platform.h>
#include <kernel/config.h>
#include "removecurse.h"
/* kernel includes */
#include <kernel/curse.h>
#include <kernel/unit.h>
/* util includes */
#include <util/attrib.h>
#include <util/base36.h>
#include <util/event.h>
#include <util/gamedata.h>
#include <util/log.h>
#include <util/resolve.h>
#include <storage.h>
/* ansi includes */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
typedef struct removecurse_data {
curse *curse;
unit *target;
} removecurse_data;
static void removecurse_init(trigger * t)
{
t->data.v = calloc(sizeof(removecurse_data), 1);
}
static void removecurse_free(trigger * t)
{
free(t->data.v);
}
static int removecurse_handle(trigger * t, void *data)
{
/* call an event handler on removecurse.
* data.v -> ( variant event, int timer )
*/
removecurse_data *td = (removecurse_data *)t->data.v;
if (td->curse && td->target) {
if (!remove_curse(&td->target->attribs, td->curse)) {
log_error("could not perform removecurse::handle()\n");
}
}
unused_arg(data);
return 0;
}
static void removecurse_write(const trigger * t, struct storage *store)
{
removecurse_data *td = (removecurse_data *)t->data.v;
WRITE_TOK(store, td->target ? itoa36(td->target->no) : 0);
WRITE_INT(store, td->curse ? td->curse->no : 0);
}
static variant read_curse_reference(struct gamedata *data) {
return read_int(data->store);
}
static int removecurse_read(trigger * t, gamedata *data)
{
removecurse_data *td = (removecurse_data *)t->data.v;
read_reference(&td->target, data, read_unit_reference, resolve_unit);
read_reference(&td->curse, data, read_curse_reference, resolve_curse);
return AT_READ_OK;
}
trigger_type tt_removecurse = {
"removecurse",
removecurse_init,
removecurse_free,
removecurse_handle,
removecurse_write,
removecurse_read
};
trigger *trigger_removecurse(curse * c, unit * target)
{
trigger *t = t_new(&tt_removecurse);
removecurse_data *td = (removecurse_data *)t->data.v;
td->curse = c;
td->target = target;
return t;
}

View File

@ -1,40 +0,0 @@
/*
Copyright (c) 1998-2015, 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 REMOVECURSE_H
#define REMOVECURSE_H
#ifdef __cplusplus
extern "C" {
#endif
/* all types we use are defined here to reduce dependencies */
struct trigger_type;
struct trigger;
struct unit;
struct curse;
extern struct trigger_type tt_removecurse;
extern struct trigger *trigger_removecurse(struct curse *c,
struct unit *target);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -28,7 +28,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <triggers/unguard.h> #include <triggers/unguard.h>
#include <triggers/giveitem.h> #include <triggers/giveitem.h>
#include <triggers/killunit.h> #include <triggers/killunit.h>
#include <triggers/removecurse.h>
#include <triggers/shock.h> #include <triggers/shock.h>
#include <triggers/timeout.h> #include <triggers/timeout.h>
#include <triggers/unitmessage.h> #include <triggers/unitmessage.h>
@ -50,7 +49,6 @@ void register_triggers(void)
tt_register(&tt_unguard); tt_register(&tt_unguard);
tt_register(&tt_giveitem); tt_register(&tt_giveitem);
tt_register(&tt_killunit); tt_register(&tt_killunit);
tt_register(&tt_removecurse);
tt_register(&tt_shock); tt_register(&tt_shock);
tt_register(&tt_unitmessage); tt_register(&tt_unitmessage);
tt_register(&tt_timeout); tt_register(&tt_timeout);