kill the old curses enum and oldcursename.

This commit is contained in:
Enno Rehling 2017-08-21 20:48:00 +02:00
parent 7985ebe511
commit fc4bde47f6
16 changed files with 127 additions and 156 deletions

View File

@ -20,6 +20,8 @@ without prior permission by the authors of Eressea.
#define BUFFERSIZE 32768 #define BUFFERSIZE 32768
#define RESOURCECOMPAT #define RESOURCECOMPAT
#include <spells/regioncurse.h>
/* modules include */ /* modules include */
#include <modules/score.h> #include <modules/score.h>
@ -1361,7 +1363,7 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r)
if (skill_enabled(SK_ENTERTAINMENT)) { if (skill_enabled(SK_ENTERTAINMENT)) {
fprintf(F, "%d;Unterh\n", entertainmoney(r)); fprintf(F, "%d;Unterh\n", entertainmoney(r));
} }
if (is_cursed(r->attribs, C_RIOT, 0)) { if (is_cursed(r->attribs, &ct_riotzone)) {
fputs("0;Rekruten\n", F); fputs("0;Rekruten\n", F);
} }
else { else {
@ -1419,7 +1421,7 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r)
cr_output_curses_compat(F, f, r, TYP_REGION); cr_output_curses_compat(F, f, r, TYP_REGION);
cr_borders(r, f, r->seen.mode, F); cr_borders(r, f, r->seen.mode, F);
if (r->seen.mode == seen_unit && is_astral(r) if (r->seen.mode == seen_unit && is_astral(r)
&& !is_cursed(r->attribs, C_ASTRALBLOCK, 0)) { && !is_cursed(r->attribs, &ct_astralblock)) {
/* Sonderbehandlung Teleport-Ebene */ /* Sonderbehandlung Teleport-Ebene */
region_list *rl = astralregions(r, inhabitable); region_list *rl = astralregions(r, inhabitable);

View File

@ -40,6 +40,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <attributes/racename.h> #include <attributes/racename.h>
#include <spells/buildingcurse.h> #include <spells/buildingcurse.h>
#include <spells/regioncurse.h> #include <spells/regioncurse.h>
#include <spells/unitcurse.h>
/* kernel includes */ /* kernel includes */
#include <kernel/ally.h> #include <kernel/ally.h>
@ -118,14 +119,14 @@ int entertainmoney(const region * r)
{ {
double n; double n;
if (is_cursed(r->attribs, C_DEPRESSION, 0)) { if (is_cursed(r->attribs, &ct_depression)) {
return 0; return 0;
} }
n = rmoney(r) / (double)ENTERTAINFRACTION; n = rmoney(r) / (double)ENTERTAINFRACTION;
if (is_cursed(r->attribs, C_GENEROUS, 0)) { if (is_cursed(r->attribs, &ct_generous)) {
n *= get_curseeffect(r->attribs, C_GENEROUS, 0); n *= get_curseeffect(r->attribs, &ct_generous);
} }
return (int)n; return (int)n;
@ -502,7 +503,7 @@ static void recruit(unit * u, struct order *ord, request ** recruitorders)
return; return;
} }
} }
if (is_cursed(r->attribs, C_RIOT, 0)) { if (is_cursed(r->attribs, &ct_riotzone)) {
/* Die Region befindet sich in Aufruhr */ /* Die Region befindet sich in Aufruhr */
cmistake(u, ord, 237, MSG_EVENT); cmistake(u, ord, 237, MSG_EVENT);
return; return;
@ -652,7 +653,7 @@ static int forget_cmd(unit * u, order * ord)
skill_t sk; skill_t sk;
const char *s; const char *s;
if (is_cursed(u->attribs, C_SLAVE, 0)) { if (is_cursed(u->attribs, &ct_slavery)) {
/* charmed units shouldn't be losing their skills */ /* charmed units shouldn't be losing their skills */
return 0; return 0;
} }
@ -2589,7 +2590,7 @@ void entertain_cmd(unit * u, struct order *ord)
cmistake(u, ord, 69, MSG_INCOME); cmistake(u, ord, 69, MSG_INCOME);
return; return;
} }
if (is_cursed(r->attribs, C_DEPRESSION, 0)) { if (is_cursed(r->attribs, &ct_depression)) {
cmistake(u, ord, 28, MSG_INCOME); cmistake(u, ord, 28, MSG_INCOME);
return; return;
} }
@ -3028,7 +3029,7 @@ void produce(struct region *r)
continue; continue;
if (u_race(u) == rc_insect && r_insectstalled(r) && if (u_race(u) == rc_insect && r_insectstalled(r) &&
!is_cursed(u->attribs, C_KAELTESCHUTZ, 0)) !is_cursed(u->attribs, &ct_insectfur))
continue; continue;
if (fval(u, UFL_LONGACTION) && u->thisorder == NULL) { if (fval(u, UFL_LONGACTION) && u->thisorder == NULL) {

View File

@ -17,6 +17,11 @@
#include "economy.h" #include "economy.h"
#include "laws.h" #include "laws.h"
#include <spells/unitcurse.h>
/* attributes includes */
#include <attributes/racename.h>
/* kernel includes */ /* kernel includes */
#include <kernel/ally.h> #include <kernel/ally.h>
#include <kernel/build.h> #include <kernel/build.h>
@ -33,9 +38,6 @@
#include <kernel/terrain.h> #include <kernel/terrain.h>
#include <kernel/unit.h> #include <kernel/unit.h>
/* attributes includes */
#include <attributes/racename.h>
/* util includes */ /* util includes */
#include <util/attrib.h> #include <util/attrib.h>
#include <util/base36.h> #include <util/base36.h>
@ -286,7 +288,7 @@ static bool can_give_men(const unit *u, const unit *dst, order *ord, message **m
/* hungry people cannot be given away */ /* hungry people cannot be given away */
if (msg) *msg = msg_error(u, ord, 73); if (msg) *msg = msg_error(u, ord, 73);
} }
else if (fval(u, UFL_LOCKED) || is_cursed(u->attribs, C_SLAVE, 0)) { else if (fval(u, UFL_LOCKED) || is_cursed(u->attribs, &ct_slavery)) {
if (msg) *msg = msg_error(u, ord, 74); if (msg) *msg = msg_error(u, ord, 74);
} }
else { else {
@ -329,7 +331,7 @@ message * give_men(int n, unit * u, unit * u2, struct order *ord)
else if (unit_has_cursed_item(u2)) { else if (unit_has_cursed_item(u2)) {
error = 78; error = 78;
} }
else if (fval(u2, UFL_LOCKED) || is_cursed(u2->attribs, C_SLAVE, 0)) { else if (fval(u2, UFL_LOCKED) || is_cursed(u2->attribs, &ct_slavery)) {
error = 75; error = 75;
} }
else if (!ucontact(u2, u)) { else if (!ucontact(u2, u)) {

View File

@ -141,10 +141,11 @@ static int read_ccompat(const char *cursename, struct storage *store)
struct compat { struct compat {
const char *name; const char *name;
const char *tokens; const char *tokens;
} *seek, old_curses[] = { { } *seek, old_curses[] = {
"disorientationzone", "" }, { { "disorientationzone", "" },
"shipdisorientation", "" }, { { "shipdisorientation", "" },
NULL, NULL } }; { NULL, NULL }
};
for (seek = old_curses; seek->name; ++seek) { for (seek = old_curses; seek->name; ++seek) {
if (strcmp(seek->tokens, cursename) == 0) { if (strcmp(seek->tokens, cursename) == 0) {
const char *p; const char *p;
@ -723,51 +724,6 @@ bool is_cursed_with(const attrib * ap, const curse * c)
return false; return false;
} }
/* ------------------------------------------------------------- */
/* cursedata */
/* ------------------------------------------------------------- */
static const char *oldnames[MAXCURSE] = {
/* OBS: when removing curses, remember to update read_ccompat() */
"fogtrap",
"antimagiczone",
"farvision",
"gbdream",
"auraboost",
"maelstrom",
"blessedharvest",
"drought",
"badlearn",
"stormwind",
"flyingship",
"nodrift",
"depression",
"magicwalls",
"strongwall",
"astralblock",
"generous",
"peacezone",
"magicstreet",
"magicrunes",
"badmagicresistancezone",
"goodmagicresistancezone",
"slavery",
"calmmonster",
"oldrace",
"fumble",
"riotzone",
"godcursezone",
"speed",
"orcish",
"magicboost",
"insectfur"
};
const char *oldcursename(int id)
{
return oldnames[id];
}
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
message *cinfo_simple(const void *obj, objtype_t typ, const struct curse * c, message *cinfo_simple(const void *obj, objtype_t typ, const struct curse * c,
int self) int self)

View File

@ -303,14 +303,13 @@ extern "C" {
bool curse_active(const struct curse *c); bool curse_active(const struct curse *c);
/*** COMPATIBILITY MACROS. DO NOT USE FOR NEW CODE, REPLACE IN OLD CODE: */ /*** COMPATIBILITY MACROS. DO NOT USE FOR NEW CODE, REPLACE IN OLD CODE: */
const char *oldcursename(int id);
struct message *cinfo_simple(const void *obj, objtype_t typ, struct message *cinfo_simple(const void *obj, objtype_t typ,
const struct curse *c, int self); const struct curse *c, int self);
int curse_cansee(const struct curse *c, const struct faction *viewer, objtype_t typ, const void *obj, int self); int curse_cansee(const struct curse *c, const struct faction *viewer, objtype_t typ, const void *obj, int self);
#define is_cursed(a, id, id2) \ #define is_cursed(a, ctype) \
(a && curse_active(get_curse(a, ct_find(oldcursename(id))))) (a && curse_active(get_curse(a, ctype)))
#define get_curseeffect(a, id, id2) \ #define get_curseeffect(a, ctype) \
curse_geteffect(get_curse(a, ct_find(oldcursename(id)))) curse_geteffect(get_curse(a, ctype))
/* eressea-defined attribute-type flags */ /* eressea-defined attribute-type flags */
#define ATF_CURSE ATF_USER_DEFINED #define ATF_CURSE ATF_USER_DEFINED

View File

@ -33,6 +33,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "terrain.h" #include "terrain.h"
#include "unit.h" #include "unit.h"
#include <spells/unitcurse.h>
#include <attributes/otherfaction.h>
/* util includes */ /* util includes */
#include <util/attrib.h> #include <util/attrib.h>
#include <util/base36.h> #include <util/base36.h>
@ -49,8 +52,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <util/rng.h> #include <util/rng.h>
#include <util/variant.h> #include <util/variant.h>
#include <attributes/otherfaction.h>
#include <selist.h> #include <selist.h>
#include <storage.h> #include <storage.h>
@ -730,7 +731,7 @@ int count_faction(const faction * f, int flags)
} }
} }
else if (flags&COUNT_MIGRANTS) { else if (flags&COUNT_MIGRANTS) {
if (!is_cursed(u->attribs, C_SLAVE, 0)) { if (!is_cursed(u->attribs, &ct_slavery)) {
n += x; n += x;
} }
} }

View File

@ -430,7 +430,7 @@ static void horses(region * r)
maxhorses = MAX(0, maxhorses); maxhorses = MAX(0, maxhorses);
horses = rhorses(r); horses = rhorses(r);
if (horses > 0) { if (horses > 0) {
if (is_cursed(r->attribs, C_CURSED_BY_THE_GODS, 0)) { if (is_cursed(r->attribs, &ct_godcursezone)) {
rsethorses(r, (int)(horses * 0.9)); rsethorses(r, (int)(horses * 0.9));
} }
else if (maxhorses) { else if (maxhorses) {
@ -583,7 +583,7 @@ growing_trees(region * r, const int current_season, const int last_weeks_season)
a_removeall(&r->attribs, &at_germs); a_removeall(&r->attribs, &at_germs);
} }
if (is_cursed(r->attribs, C_CURSED_BY_THE_GODS, 0)) { if (is_cursed(r->attribs, &ct_godcursezone)) {
rsettrees(r, 1, (int)(rtrees(r, 1) * 0.9)); rsettrees(r, 1, (int)(rtrees(r, 1) * 0.9));
rsettrees(r, 2, (int)(rtrees(r, 2) * 0.9)); rsettrees(r, 2, (int)(rtrees(r, 2) * 0.9));
return; return;
@ -640,7 +640,7 @@ growing_trees(region * r, const int current_season, const int last_weeks_season)
} }
else if (current_season == SEASON_SPRING) { else if (current_season == SEASON_SPRING) {
if (is_cursed(r->attribs, C_CURSED_BY_THE_GODS, 0)) if (is_cursed(r->attribs, &ct_godcursezone))
return; return;
/* in at_germs merken uns die Zahl der Samen und Sprößlinge, die /* in at_germs merken uns die Zahl der Samen und Sprößlinge, die
@ -2924,8 +2924,9 @@ static void ageing(void)
change_effect(u, oldpotiontype[P_BERSERK], -1 * MIN(u->number, i)); change_effect(u, oldpotiontype[P_BERSERK], -1 * MIN(u->number, i));
} }
if (is_cursed(u->attribs, C_OLDRACE, 0)) { if (u->attribs) {
curse * c = get_curse(u->attribs, &ct_oldrace); curse * c = get_curse(u->attribs, &ct_oldrace);
if (c && curse_active(c)) {
if (c->duration == 1 && !(c_flags(c) & CURSE_NOAGE)) { if (c->duration == 1 && !(c_flags(c) & CURSE_NOAGE)) {
u_setrace(u, get_race(curse_geteffect_int(c))); u_setrace(u, get_race(curse_geteffect_int(c)));
u->irace = NULL; u->irace = NULL;
@ -2933,6 +2934,7 @@ static void ageing(void)
} }
} }
} }
}
/* Borders */ /* Borders */
age_borders(); age_borders();
@ -3789,7 +3791,7 @@ void process(void)
} }
else if (u_race(u) == get_race(RC_INSECT) else if (u_race(u) == get_race(RC_INSECT)
&& r_insectstalled(r) && r_insectstalled(r)
&& !is_cursed(u->attribs, C_KAELTESCHUTZ, 0)) { && !is_cursed(u->attribs, &ct_insectfur)) {
ord = NULL; ord = NULL;
} }
else if (LongHunger(u)) { else if (LongHunger(u)) {

View File

@ -35,6 +35,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <triggers/clonedied.h> #include <triggers/clonedied.h>
#include <spells/regioncurse.h> #include <spells/regioncurse.h>
#include <spells/buildingcurse.h>
#include <spells/unitcurse.h> #include <spells/unitcurse.h>
#include <kernel/ally.h> #include <kernel/ally.h>
@ -699,7 +700,7 @@ int max_spellpoints(const region * r, const unit * u)
if (rtype && i_get(u->items, rtype->itype) > 0) { if (rtype && i_get(u->items, rtype->itype) > 0) {
msp += use_item_aura(r, u); msp += use_item_aura(r, u);
} }
n = get_curseeffect(u->attribs, C_AURA, 0); n = get_curseeffect(u->attribs, &ct_auraboost);
if (n > 0) { if (n > 0) {
msp = (msp * n) / 100; msp = (msp * n) / 100;
} }
@ -1251,8 +1252,7 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus)
} }
if (a) { if (a) {
const struct curse_type *ct_resist = ct_find(oldcursename(C_RESIST_MAGIC)); curse * c = get_curse(a, &ct_magicrunes);
curse * c = get_curse(a, ct_resist);
int effect = curse_geteffect_int(c); int effect = curse_geteffect_int(c);
prob = frac_add(prob, frac_make(effect, 100)); prob = frac_add(prob, frac_make(effect, 100));
} }
@ -1320,10 +1320,10 @@ bool fumble(region * r, unit * u, const spell * sp, int cast_grade)
if (mage->magietyp == M_DRAIG) { if (mage->magietyp == M_DRAIG) {
fumble_chance += CHAOSPATZERCHANCE; fumble_chance += CHAOSPATZERCHANCE;
} }
if (is_cursed(u->attribs, C_MBOOST, 0)) { if (is_cursed(u->attribs, &ct_magicboost)) {
fumble_chance += CHAOSPATZERCHANCE; fumble_chance += CHAOSPATZERCHANCE;
} }
if (is_cursed(u->attribs, C_FUMBLE, 0)) { if (is_cursed(u->attribs, &ct_fumble)) {
fumble_chance += CHAOSPATZERCHANCE; fumble_chance += CHAOSPATZERCHANCE;
} }
@ -1503,7 +1503,7 @@ void regenerate_aura(void)
reg_aura *= btype->auraregen; reg_aura *= btype->auraregen;
/* Bonus/Malus durch Zauber */ /* Bonus/Malus durch Zauber */
mod = get_curseeffect(u->attribs, C_AURA, 0); mod = get_curseeffect(u->attribs, &ct_auraboost);
if (mod > 0) { if (mod > 0) {
reg_aura = (reg_aura * mod) / 100.0; reg_aura = (reg_aura * mod) / 100.0;
} }
@ -2795,7 +2795,7 @@ void magic(void)
continue; continue;
if (u_race(u) == rc_insect && r_insectstalled(r) && if (u_race(u) == rc_insect && r_insectstalled(r) &&
!is_cursed(u->attribs, C_KAELTESCHUTZ, 0)) !is_cursed(u->attribs, &ct_insectfur))
continue; continue;
if (fval(u, UFL_WERE | UFL_LONGACTION)) { if (fval(u, UFL_WERE | UFL_LONGACTION)) {

View File

@ -20,6 +20,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <platform.h> #include <platform.h>
#include "morale.h" #include "morale.h"
#include <spells/regioncurse.h>
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/curse.h> #include <kernel/curse.h>
#include <kernel/region.h> #include <kernel/region.h>
@ -53,7 +55,7 @@ void morale_update(region *r) {
if (stability > MORALE_COOLDOWN && r->land->ownership->owner if (stability > MORALE_COOLDOWN && r->land->ownership->owner
&& morale < MORALE_MAX) { && morale < MORALE_MAX) {
double ch = popularity(); double ch = popularity();
if (is_cursed(r->attribs, C_GENEROUS, 0)) { if (is_cursed(r->attribs, &ct_generous)) {
ch *= 1.2; /* 20% improvement */ ch *= 1.2; /* 20% improvement */
} }
if (stability >= MORALE_AVERAGE * 2 || chance(ch)) { if (stability >= MORALE_AVERAGE * 2 || chance(ch)) {

View File

@ -34,6 +34,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <spells/flyingship.h> #include <spells/flyingship.h>
#include <spells/unitcurse.h> #include <spells/unitcurse.h>
#include <spells/regioncurse.h> #include <spells/regioncurse.h>
#include <spells/shipcurse.h>
/* attributes includes */ /* attributes includes */
#include <attributes/follow.h> #include <attributes/follow.h>
@ -673,7 +674,7 @@ static bool is_freezing(const unit * u)
{ {
if (u_race(u) != get_race(RC_INSECT)) if (u_race(u) != get_race(RC_INSECT))
return false; return false;
if (is_cursed(u->attribs, C_KAELTESCHUTZ, 0)) if (is_cursed(u->attribs, &ct_insectfur))
return false; return false;
return true; return true;
} }
@ -832,7 +833,7 @@ static void drifting_ships(region * r)
} }
/* Schiff schon abgetrieben oder durch Zauber geschützt? */ /* Schiff schon abgetrieben oder durch Zauber geschützt? */
if (!drift || fval(sh, SF_DRIFTED) || is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) { if (!drift || fval(sh, SF_DRIFTED) || is_cursed(sh->attribs, &ct_nodrift)) {
shp = &sh->next; shp = &sh->next;
continue; continue;
} }
@ -1803,7 +1804,7 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting)
} }
if (rng_int() % 10000 < stormchance * sh->type->storm if (rng_int() % 10000 < stormchance * sh->type->storm
&& fval(current_point->terrain, SEA_REGION)) { && fval(current_point->terrain, SEA_REGION)) {
if (!is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) { if (!is_cursed(sh->attribs, &ct_nodrift)) {
region *rnext = NULL; region *rnext = NULL;
bool storm = true; bool storm = true;
int d_offset = rng_int() % MAXDIRECTIONS; int d_offset = rng_int() % MAXDIRECTIONS;
@ -1920,9 +1921,10 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting)
last_point = current_point; last_point = current_point;
current_point = next_point; current_point = next_point;
if (!fval(current_point->terrain, SEA_REGION) if (!fval(next_point->terrain, SEA_REGION)
&& !is_cursed(sh->attribs, C_SHIP_FLYING, 0)) && !is_cursed(sh->attribs, &ct_flyingship)) {
break; break;
}
token = getstrtoken(); token = getstrtoken();
error = movewhere(u, token, current_point, &next_point); error = movewhere(u, token, current_point, &next_point);
if (error || next_point == NULL) { if (error || next_point == NULL) {
@ -1958,7 +1960,7 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting)
set_order(&u->thisorder, NULL); set_order(&u->thisorder, NULL);
set_coast(sh, last_point, current_point); set_coast(sh, last_point, current_point);
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0)) { if (is_cursed(sh->attribs, &ct_flyingship)) {
ADDMSG(&f->msgs, msg_message("shipfly", "ship from to", sh, ADDMSG(&f->msgs, msg_message("shipfly", "ship from to", sh,
starting_point, current_point)); starting_point, current_point));
} }

View File

@ -27,12 +27,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "chaos.h" #include "chaos.h"
#include "study.h" #include "study.h"
#include <spells/unitcurse.h>
#include <spells/regioncurse.h>
/* attributes includes */ /* attributes includes */
#include <attributes/racename.h> #include <attributes/racename.h>
#include <attributes/reduceproduction.h> #include <attributes/reduceproduction.h>
#include <spells/unitcurse.h>
/* kernel includes */ /* kernel includes */
#include <kernel/building.h> #include <kernel/building.h>
#include <kernel/curse.h> #include <kernel/curse.h>
@ -651,7 +652,7 @@ static void godcurse(void)
region *r; region *r;
for (r = regions; r; r = r->next) { for (r = regions; r; r = r->next) {
if (is_cursed(r->attribs, C_CURSED_BY_THE_GODS, 0)) { if (is_cursed(r->attribs, &ct_godcursezone)) {
unit *u; unit *u;
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
skill *sv = u->skills; skill *sv = u->skills;

View File

@ -29,6 +29,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "monsters.h" #include "monsters.h"
#include "travelthru.h" #include "travelthru.h"
#include <spells/regioncurse.h>
#include <spells/buildingcurse.h>
/* modules includes */ /* modules includes */
#include <modules/score.h> #include <modules/score.h>
@ -46,8 +49,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "calendar.h" #include "calendar.h"
#include "teleport.h" #include "teleport.h"
#include <spells/buildingcurse.h>
/* kernel includes */ /* kernel includes */
#include <kernel/ally.h> #include <kernel/ally.h>
#include <kernel/connection.h> #include <kernel/connection.h>
@ -1187,7 +1188,7 @@ void report_region(struct stream *out, const region * r, faction * f)
paragraph(out, buf, 0, 0, 0); paragraph(out, buf, 0, 0, 0);
if (r->seen.mode == seen_unit && is_astral(r) && if (r->seen.mode == seen_unit && is_astral(r) &&
!is_cursed(r->attribs, C_ASTRALBLOCK, 0)) { !is_cursed(r->attribs, &ct_astralblock)) {
/* Sonderbehandlung Teleport-Ebene */ /* Sonderbehandlung Teleport-Ebene */
region_list *rl = astralregions(r, inhabitable); region_list *rl = astralregions(r, inhabitable);
region_list *rl2; region_list *rl2;

View File

@ -1785,7 +1785,7 @@ static int sp_treewalkenter(castorder * co)
} }
rt = r_standard_to_astral(r); rt = r_standard_to_astral(r);
if (rt == NULL || is_cursed(rt->attribs, C_ASTRALBLOCK, 0) if (rt == NULL || is_cursed(rt->attribs, &ct_astralblock)
|| fval(rt->terrain, FORBIDDEN_REGION)) { || fval(rt->terrain, FORBIDDEN_REGION)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
@ -1901,7 +1901,7 @@ static int sp_treewalkexit(castorder * co)
"spellfail_astralonly", "")); "spellfail_astralonly", ""));
return 0; return 0;
} }
if (is_cursed(r->attribs, C_ASTRALBLOCK, 0)) { if (is_cursed(r->attribs, &ct_astralblock)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
return 0; return 0;
@ -2264,12 +2264,12 @@ static int sp_stormwinds(castorder * co)
sh = pa->param[n]->data.sh; sh = pa->param[n]->data.sh;
/* mit C_SHIP_NODRIFT haben wir kein Problem */ /* mit C_SHIP_NODRIFT haben wir kein Problem */
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0)) { if (is_cursed(sh->attribs, &ct_flyingship)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"error_spell_on_flying_ship", "ship", sh)) "error_spell_on_flying_ship", "ship", sh))
continue; continue;
} }
if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0)) { if (is_cursed(sh->attribs, &ct_shipspeedup)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"error_spell_on_ship_already", "ship", sh)) "error_spell_on_ship_already", "ship", sh))
continue; continue;
@ -2338,7 +2338,7 @@ static int sp_earthquake(castorder * co)
while (*blist) { while (*blist) {
building *burg = *blist; building *burg = *blist;
if (burg->size != 0 && !is_cursed(burg->attribs, C_MAGICWALLS, 0)) { if (burg->size != 0 && !is_cursed(burg->attribs, &ct_magicwalls)) {
/* Magieresistenz */ /* Magieresistenz */
if (!target_resists_magic(mage, burg, TYP_BUILDING, 0)) { if (!target_resists_magic(mage, burg, TYP_BUILDING, 0)) {
kaputt = MIN(10 * cast_level, burg->size / 4); kaputt = MIN(10 * cast_level, burg->size / 4);
@ -2798,7 +2798,7 @@ static int sp_unholypower(castorder * co)
* korrekt abgefangen wird. Besser (aber nicht gerade einfach) * korrekt abgefangen wird. Besser (aber nicht gerade einfach)
* waere es, eine solche Konstruktion irgendwie zu kapseln. */ * waere es, eine solche Konstruktion irgendwie zu kapseln. */
if (fval(u, UFL_LOCKED) || fval(u, UFL_HUNGER) if (fval(u, UFL_LOCKED) || fval(u, UFL_HUNGER)
|| is_cursed(u->attribs, C_SLAVE, 0)) { || is_cursed(u->attribs, &ct_slavery)) {
cmistake(mage, co->order, 74, MSG_MAGIC); cmistake(mage, co->order, 74, MSG_MAGIC);
continue; continue;
} }
@ -3186,7 +3186,7 @@ static int sp_chaossuction(castorder * co)
cmistake(mage, co->order, 216, MSG_MAGIC); cmistake(mage, co->order, 216, MSG_MAGIC);
return 0; return 0;
} }
else if (is_cursed(rt->attribs, C_ASTRALBLOCK, 0)) { else if (is_cursed(rt->attribs, &ct_astralblock)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
return 0; return 0;
@ -3233,7 +3233,7 @@ static int sp_magicboost(castorder * co)
trigger *tsummon; trigger *tsummon;
/* fehler, wenn schon ein boost */ /* fehler, wenn schon ein boost */
if (is_cursed(mage->attribs, C_MBOOST, 0)) { if (is_cursed(mage->attribs, &ct_magicboost)) {
report_failure(mage, co->order); report_failure(mage, co->order);
return 0; return 0;
} }
@ -3748,7 +3748,7 @@ static int sp_rallypeasantmob(castorder * co)
} }
} }
c = get_curse(r->attribs, ct_find(oldcursename(C_RIOT))); c = get_curse(r->attribs, &ct_riotzone);
if (c != NULL) { if (c != NULL) {
remove_curse(&r->attribs, c); remove_curse(&r->attribs, c);
} }
@ -3964,7 +3964,7 @@ static int sp_generous(castorder * co)
double effect; double effect;
message *msg[2] = { NULL, NULL }; message *msg[2] = { NULL, NULL };
if (is_cursed(r->attribs, C_DEPRESSION, 0)) { if (is_cursed(r->attribs, &ct_depression)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_generous", "")); "spellfail_generous", ""));
return 0; return 0;
@ -4662,7 +4662,29 @@ int sp_analysedream(castorder * co)
return cast_level; return cast_level;
} }
static int sp_gbdreams(castorder * co, const char *curse_name, int effect); static int sp_gbdreams(castorder * co, int effect)
{
int duration;
unit *mage = co->magician.u;
int cast_level = co->level;
double power = co->force;
region *r = co_get_region(co);
/* wirkt erst in der Folgerunde, soll mindestens eine Runde wirken,
* also duration+2 */
duration = (int)MAX(1, power / 2); /* Stufe 1 macht sonst mist */
duration = 2 + rng_int() % duration;
/* Nichts machen als ein entsprechendes Attribut in die Region legen. */
create_curse(mage, &r->attribs, &ct_gbdream, power, duration, effect, 0);
/* Erfolg melden */
ADDMSG(&mage->faction->msgs, msg_message("regionmagic_effect",
"unit region command", mage, mage->region, co->order));
return cast_level;
}
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* Name: Schlechte Traeume /* Name: Schlechte Traeume
@ -4679,7 +4701,7 @@ static int sp_gbdreams(castorder * co, const char *curse_name, int effect);
* */ * */
int sp_baddreams(castorder * co) int sp_baddreams(castorder * co)
{ {
return sp_gbdreams(co, "gbdream", -1); return sp_gbdreams(co, -1);
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -4696,30 +4718,7 @@ int sp_baddreams(castorder * co)
*/ */
int sp_gooddreams(castorder * co) int sp_gooddreams(castorder * co)
{ {
return sp_gbdreams(co, "gbdream", 1); return sp_gbdreams(co, 1);
}
static int sp_gbdreams(castorder * co, const char *curse_name, int effect)
{
int duration;
unit *mage = co->magician.u;
int cast_level = co->level;
double power = co->force;
region *r = co_get_region(co);
/* wirkt erst in der Folgerunde, soll mindestens eine Runde wirken,
* also duration+2 */
duration = (int)MAX(1, power / 2); /* Stufe 1 macht sonst mist */
duration = 2 + rng_int() % duration;
/* Nichts machen als ein entsprechendes Attribut in die Region legen. */
create_curse(mage, &r->attribs, ct_find(curse_name), power, duration, effect, 0);
/* Erfolg melden */
ADDMSG(&mage->faction->msgs, msg_message("regionmagic_effect",
"unit region command", mage, mage->region, co->order));
return cast_level;
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -5075,8 +5074,8 @@ int sp_enterastral(castorder * co)
return 0; return 0;
} }
if (is_cursed(rt->attribs, C_ASTRALBLOCK, 0) if (is_cursed(rt->attribs, &ct_astralblock)
|| is_cursed(ro->attribs, C_ASTRALBLOCK, 0)) { || is_cursed(ro->attribs, &ct_astralblock)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
return 0; return 0;
@ -5202,8 +5201,8 @@ int sp_pullastral(castorder * co)
return 0; return 0;
} }
if (is_cursed(rt->attribs, C_ASTRALBLOCK, 0) if (is_cursed(rt->attribs, &ct_astralblock)
|| is_cursed(ro->attribs, C_ASTRALBLOCK, 0)) { || is_cursed(ro->attribs, &ct_astralblock)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
return 0; return 0;
@ -5346,8 +5345,8 @@ int sp_leaveastral(castorder * co)
return 0; return 0;
} }
if (ro == NULL || is_cursed(ro->attribs, C_ASTRALBLOCK, 0) if (ro == NULL || is_cursed(ro->attribs, &ct_astralblock)
|| is_cursed(rt->attribs, C_ASTRALBLOCK, 0)) { || is_cursed(rt->attribs, &ct_astralblock)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
return 0; return 0;
@ -5486,7 +5485,7 @@ int sp_fetchastral(castorder * co)
ro = u->region; ro = u->region;
} }
if (is_cursed(ro->attribs, C_ASTRALBLOCK, 0)) { if (is_cursed(ro->attribs, &ct_astralblock)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellfail_astralblock", "")); "spellfail_astralblock", ""));
continue; continue;
@ -5599,7 +5598,7 @@ int sp_showastral(castorder * co)
for (rl2 = rl; rl2; rl2 = rl2->next) { for (rl2 = rl; rl2; rl2 = rl2->next) {
region *r2 = rl2->data; region *r2 = rl2->data;
if (!is_cursed(r2->attribs, C_ASTRALBLOCK, 0)) { if (!is_cursed(r2->attribs, &ct_astralblock)) {
for (u = r2->units; u; u = u->next) { for (u = r2->units; u; u = u->next) {
if (u_race(u) != get_race(RC_SPECIAL) && u_race(u) != get_race(RC_SPELL)) if (u_race(u) != get_race(RC_SPECIAL) && u_race(u) != get_race(RC_SPELL))
n++; n++;
@ -5619,7 +5618,7 @@ int sp_showastral(castorder * co)
"Nebel zu erkennen sind ", unitname(mage)); "Nebel zu erkennen sind ", unitname(mage));
for (rl2 = rl; rl2; rl2 = rl2->next) { for (rl2 = rl; rl2; rl2 = rl2->next) {
if (!is_cursed(rl2->data->attribs, C_ASTRALBLOCK, 0)) { if (!is_cursed(rl2->data->attribs, &ct_astralblock)) {
for (u = rl2->data->units; u; u = u->next) { for (u = rl2->data->units; u; u = u->next) {
if (u_race(u) != get_race(RC_SPECIAL) && u_race(u) != get_race(RC_SPELL)) { if (u_race(u) != get_race(RC_SPECIAL) && u_race(u) != get_race(RC_SPELL)) {
c++; c++;
@ -5677,7 +5676,7 @@ int sp_viewreality(castorder * co)
/* Irgendwann mal auf Curses u/o Attribut umstellen. */ /* Irgendwann mal auf Curses u/o Attribut umstellen. */
for (rl2 = rl; rl2; rl2 = rl2->next) { for (rl2 = rl; rl2; rl2 = rl2->next) {
region *rt = rl2->data; region *rt = rl2->data;
if (!is_cursed(rt->attribs, C_ASTRALBLOCK, 0)) { if (!is_cursed(rt->attribs, &ct_astralblock)) {
u = u =
create_unit(rt, mage->faction, 1, get_race(RC_SPELL), 0, create_unit(rt, mage->faction, 1, get_race(RC_SPELL), 0,
"spell/viewreality", NULL); "spell/viewreality", NULL);
@ -5735,7 +5734,7 @@ int sp_disruptastral(castorder * co)
int inhab_regions = 0; int inhab_regions = 0;
region_list *trl = NULL; region_list *trl = NULL;
if (is_cursed(r2->attribs, C_ASTRALBLOCK, 0)) if (is_cursed(r2->attribs, &ct_astralblock))
continue; continue;
if (r2->units != NULL) { if (r2->units != NULL) {

View File

@ -66,11 +66,11 @@ int sp_flying_ship(castorder * co)
cno = levitate_ship(sh, mage, power, 1); cno = levitate_ship(sh, mage, power, 1);
if (cno == 0) { if (cno == 0) {
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0)) { if (is_cursed(sh->attribs, &ct_flyingship)) {
/* Auf dem Schiff befindet liegt bereits so ein Zauber. */ /* Auf dem Schiff befindet liegt bereits so ein Zauber. */
cmistake(mage, co->order, 211, MSG_MAGIC); cmistake(mage, co->order, 211, MSG_MAGIC);
} }
else if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0)) { else if (is_cursed(sh->attribs, &ct_shipspeedup)) {
/* Es ist zu gefaehrlich, ein sturmgepeitschtes Schiff fliegen zu lassen. */ /* Es ist zu gefaehrlich, ein sturmgepeitschtes Schiff fliegen zu lassen. */
cmistake(mage, co->order, 210, MSG_MAGIC); cmistake(mage, co->order, 210, MSG_MAGIC);
} }
@ -127,7 +127,7 @@ static int flyingship_age(curse * c)
return 0; return 0;
} }
static struct curse_type ct_flyingship = { "flyingship", const struct curse_type ct_flyingship = { "flyingship",
CURSETYP_NORM, 0, NO_MERGE, cinfo_ship, NULL, flyingship_read, CURSETYP_NORM, 0, NO_MERGE, cinfo_ship, NULL, flyingship_read,
flyingship_write, NULL, flyingship_age flyingship_write, NULL, flyingship_age
}; };
@ -153,7 +153,7 @@ static curse *shipcurse_flyingship(ship * sh, unit * mage, double power, int dur
if (curse_active(get_curse(sh->attribs, &ct_flyingship))) { if (curse_active(get_curse(sh->attribs, &ct_flyingship))) {
return NULL; return NULL;
} }
if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0)) { if (is_cursed(sh->attribs, &ct_shipspeedup)) {
return NULL; return NULL;
} }
} }

View File

@ -12,6 +12,9 @@ extern "C" {
struct castorder; struct castorder;
struct ship; struct ship;
struct unit; struct unit;
struct curse_type;
extern const struct curse_type ct_flyingship;
int sp_flying_ship(struct castorder * co); int sp_flying_ship(struct castorder * co);

View File

@ -764,7 +764,7 @@ int study_cmd(unit * u, order * ord)
teach->value += u->number * 10; teach->value += u->number * 10;
} }
if (is_cursed(r->attribs, C_BADLEARN, 0)) { if (is_cursed(r->attribs, &ct_badlearn)) {
teach->value -= u->number * 10; teach->value -= u->number * 10;
} }