Merge branch 'ennorehling-feature/bug-1588-magicpower-limit' into develop

normalize use of MagicPower, only use it when setting castorder.force
This commit is contained in:
Enno Rehling 2015-08-06 19:53:53 +02:00
commit 2305466853
10 changed files with 76 additions and 193 deletions

View File

@ -1,3 +1,4 @@
require 'tests.e2.spells'
require 'tests.e2.undead' require 'tests.e2.undead'
require 'tests.e2.shiplanding' require 'tests.e2.shiplanding'
require 'tests.e2.e2features' require 'tests.e2.e2features'

View File

@ -0,0 +1,28 @@
require "lunit"
module("tests.e2.spells", package.seeall, lunit.testcase)
function setup()
eressea.free_game()
eressea.settings.set("nmr.removenewbie", "0")
eressea.settings.set("nmr.timeout", "0")
eressea.settings.set("NewbieImmunity", "0")
eressea.settings.set("rules.economy.food", "4")
end
function test_shapeshift()
local r = region.create(42, 0, "plain")
local f = faction.create("noreply@eressea.de", "demon", "de")
local u1 = unit.create(f, r, 1)
local u2 = unit.create(f, r, 1)
u1:clear_orders()
u1.magic = "gray"
u1:set_skill("magic", 2)
u1.aura = 1
u1:add_spell("shapeshift")
u1:add_order("ZAUBERE STUFE 1 Gestaltwandlung " .. itoa36(u2.id) .. " Goblin")
process_orders()
assert_equal(f.race, u2.race)
s = u2:show()
assert_equal("1 Goblin", string.sub(s, string.find(s, "1 Goblin")))
end

View File

@ -1869,9 +1869,8 @@ static void do_extra_spell(troop at, const att * a)
log_error("spell '%s' has no function.\n", sp->sname); log_error("spell '%s' has no function.\n", sp->sname);
} }
else { else {
double force = a->level * MagicPower();
assert(a->level > 0); assert(a->level > 0);
cast_combatspell(at, sp, a->level, force); cast_combatspell(at, sp, a->level, a->level);
} }
} }

View File

@ -17,6 +17,7 @@ without prior permission by the authors of Eressea.
#include "alchemy.h" #include "alchemy.h"
#include "bindings.h" #include "bindings.h"
#include "move.h" #include "move.h"
#include "reports.h"
/* attributes includes */ /* attributes includes */
#include <attributes/racename.h> #include <attributes/racename.h>
@ -54,6 +55,17 @@ without prior permission by the authors of Eressea.
#include <stdlib.h> #include <stdlib.h>
#include <limits.h> #include <limits.h>
static int tolua_bufunit(lua_State * L) {
char buf[8192];
unit *self = (unit *)tolua_tousertype(L, 1, 0);
int mode = (int)tolua_tonumber(L, 2, see_unit);
if (!self) return 0;
bufunit(self->faction, self, 0, mode, buf, sizeof(buf));
tolua_pushstring(L, buf);
return 1;
}
static int tolua_unit_get_objects(lua_State * L) static int tolua_unit_get_objects(lua_State * L)
{ {
unit *self = (unit *)tolua_tousertype(L, 1, 0); unit *self = (unit *)tolua_tousertype(L, 1, 0);
@ -513,7 +525,7 @@ static void unit_castspell(unit * u, const char *name, int level)
} }
else { else {
castorder co; castorder co;
create_castorder(&co, u, 0, sp, u->region, level, level * MagicPower(), 0, 0, 0); create_castorder(&co, u, 0, sp, u->region, level, (double)level, 0, 0, 0);
sp->cast(&co); sp->cast(&co);
free_castorder(&co); free_castorder(&co);
} }
@ -1034,6 +1046,7 @@ void tolua_unit_open(lua_State * L)
tolua_variable(L, TOLUA_CAST "hp_max", &tolua_unit_get_hpmax, 0); tolua_variable(L, TOLUA_CAST "hp_max", &tolua_unit_get_hpmax, 0);
tolua_variable(L, TOLUA_CAST "objects", &tolua_unit_get_objects, 0); tolua_variable(L, TOLUA_CAST "objects", &tolua_unit_get_objects, 0);
tolua_function(L, TOLUA_CAST "show", &tolua_bufunit);
} }
tolua_endmodule(L); tolua_endmodule(L);
} }

View File

@ -120,7 +120,6 @@ extern "C" {
extern int num_races; extern int num_races;
typedef struct race { typedef struct race {
struct param *parameters;
char *_name; char *_name;
float magres; float magres;
double maxaura; /* Faktor auf Maximale Aura */ double maxaura; /* Faktor auf Maximale Aura */
@ -141,6 +140,7 @@ extern "C" {
int df_default; /* Verteidigungsskill Unbewaffnet (default: -2) */ int df_default; /* Verteidigungsskill Unbewaffnet (default: -2) */
int at_bonus; /* Verändert den Angriffsskill (default: 0) */ int at_bonus; /* Verändert den Angriffsskill (default: 0) */
int df_bonus; /* Verändert den Verteidigungskill (default: 0) */ int df_bonus; /* Verändert den Verteidigungskill (default: 0) */
struct param *parameters; // additional properties, for an example see natural_armor
const struct spell *precombatspell; const struct spell *precombatspell;
signed char *study_speed; /* study-speed-bonus in points/turn (0=30 Tage) */ signed char *study_speed; /* study-speed-bonus in points/turn (0=30 Tage) */
int flags; int flags;

View File

@ -1,176 +0,0 @@
/*
* +-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
* | | Enno Rehling <enno@eressea.de>
* | Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
* | (c) 1998 - 2005 |
* | | This program may not be used, modified or distributed
* +-------------------+ without prior permission by the authors of Eressea.
*
*/
#ifndef H_KRNL_SPELLID
#define H_KRNL_SPELLID
/* Sprüche. Neue NUR hinten anfügen, oder das Datenfile geht kaputt */
enum {
SPL_NOSPELL = 0,
SPL_FIREBALL = 4,
SPL_HAGEL,
SPL_RUSTWEAPON,
SPL_COMBATRUST,
SPL_TREEGROW,
SPL_HEALING,
SPL_HEALINGSONG,
SPL_BADDREAMS,
SPL_GOODDREAMS,
SPL_DREAMREADING,
SPL_SWEETDREAMS,
SPL_TIREDSOLDIERS,
SPL_PLAGUE,
SPL_MAGICBOOST,
SPL_CHAOSROW,
SPL_SONG_OF_CONFUSION,
SPL_FLEE,
SPL_SONG_OF_FEAR,
SPL_BERSERK,
SPL_BLOODTHIRST,
SPL_MAELSTROM,
SPL_TRANSFERAURA_DRUIDE = 27,
SPL_TRANSFERAURA_BARDE,
SPL_TRANSFERAURA_CHAOS,
SPL_TRANSFERAURA_TRAUM,
SPL_TRANSFERAURA_ASTRAL,
SPL_STONEGOLEM,
SPL_IRONGOLEM,
SPL_SUMMONSHADOW,
SPL_SUMMONSHADOWLORDS,
SPL_REELING_ARROWS,
SPL_ANTIMAGICZONE = 37,
SPL_KAELTESCHUTZ = 39,
SPL_STEALAURA,
SPL_SUMMONUNDEAD,
SPL_AURALEAK,
SPL_GREAT_DROUGHT,
SPL_STRONG_WALL,
SPL_HOMESTONE,
SPL_DROUGHT,
SPL_FOREST_FIRE = 47,
SPL_SUMMONENT = 49,
SPL_DISTURBINGDREAMS,
SPL_DENYATTACK,
SPL_SLEEP,
SPL_EARTHQUAKE,
SPL_IRONKEEPER,
SPL_STORMWINDS,
SPL_GOODWINDS,
SPL_FLYING_SHIP,
SPL_SUMMON_ALP,
SPL_WINDSHIELD,
SPL_RAISEPEASANTS,
SPL_DEPRESSION,
SPL_HEADACHE = 62,
SPL_ENTERASTRAL = 64,
SPL_LEAVEASTRAL,
SPL_SHOWASTRAL,
SPL_VERSTEINERN,
SPL_TREEWALKENTER,
SPL_TREEWALKEXIT,
SPL_CHAOSSUCTION,
SPL_VIEWREALITY,
SPL_DISRUPTASTRAL,
SPL_SEDUCE,
SPL_PUMP,
SPL_CALM_MONSTER,
SPL_HERO,
SPL_FRIGHTEN,
SPL_MINDBLAST,
SPL_SPEED,
SPL_SPEED2,
SPL_FIREDRAGONODEM,
SPL_DRAGONODEM,
SPL_WYRMODEM, /* 83 */
SPL_MAGICSTREET,
SPL_REANIMATE,
SPL_RECRUIT,
SPL_GENEROUS,
SPL_PERMTRANSFER,
SPL_SONG_OF_PEACE,
SPL_MIGRANT,
SPL_RALLYPEASANTMOB,
SPL_RAISEPEASANTMOB,
SPL_ILL_SHAPESHIFT,
SPL_WOLFHOWL,
SPL_FOG_OF_CONFUSION,
SPL_DREAM_OF_CONFUSION,
SPL_RESISTMAGICBONUS,
SPL_KEEPLOOT,
SPL_SCHILDRUNEN,
SPL_SONG_RESISTMAGIC,
SPL_SONG_SUSCEPTMAGIC,
SPL_ANALYSEMAGIC,
SPL_ANALYSEDREAM,
SPL_UNIT_ANALYSESONG,
SPL_OBJ_ANALYSESONG,
SPL_TYBIED_DESTROY_MAGIC,
SPL_DESTROY_MAGIC,
SPL_METEORRAIN,
SPL_REDUCESHIELD,
SPL_ARMORSHIELD,
SPL_DEATHCLOUD,
SPL_ORKDREAM,
SPL_SUMMONDRAGON = 113,
SPL_MOVECASTLE = 116,
SPL_BLESSSTONECIRCLE,
SPL_ILLAUN_FAMILIAR,
SPL_GWYRRD_FAMILIAR,
SPL_DRAIG_FAMILIAR,
SPL_CERDDOR_FAMILIAR,
SPL_TYBIED_FAMILIAR,
SPL_SONG_OF_ENSLAVE = 123,
SPL_FUMBLECURSE = 136,
SPL_ICASTLE,
SPL_GWYRRD_DESTROY_MAGIC,
SPL_DRAIG_DESTROY_MAGIC,
SPL_ILLAUN_DESTROY_MAGIC,
SPL_CERDDOR_DESTROY_MAGIC,
SPL_GWYRRD_ARMORSHIELD,
SPL_DRAIG_FUMBLESHIELD,
SPL_GWYRRD_FUMBLESHIELD,
SPL_CERDDOR_FUMBLESHIELD,
SPL_TYBIED_FUMBLESHIELD,
SPL_SHADOWKNIGHTS = 147,
SPL_ITEMCLOAK = 150,
SPL_FIREWALL,
SPL_WISPS,
SPL_SPARKLE_CHAOS,
SPL_SPARKLE_DREAM = 154,
SPL_PULLASTRAL = 156,
SPL_FETCHASTRAL = 157,
SPL_SHOCKWAVE = 163,
SPL_UNDEADHERO = 164,
SPL_BECOMEWYRM = 166,
SPL_ETERNIZEWALL,
SPL_PUTTOREST,
SPL_UNHOLYPOWER,
SPL_HOLYGROUND,
SPL_BLOODSACRIFICE,
SPL_MALLORN,
SPL_CLONECOPY,
SPL_DRAINODEM,
SPL_AURA_OF_FEAR,
SPL_SHADOWCALL,
SPL_MALLORNTREEGROW = 177,
SPL_BIGRECRUIT = 179,
SPL_IMMOLATION,
SPL_FIREODEM, /* 181 */
SPL_ICEODEM,
SPL_ACIDODEM,
/* no longer used, but kept for reference: */
XMLSPL_WDWPYRAMID_TRAUM = 184,
XMLSPL_WDWPYRAMID_ASTRAL = 185,
XMLSPL_WDWPYRAMID_DRUIDE = 186,
XMLSPL_WDWPYRAMID_BARDE = 187,
XMLSPL_WDWPYRAMID_CHAOS = 188
};
#endif

View File

@ -118,14 +118,14 @@ static float MagicRegeneration(void)
return value; return value;
} }
double MagicPower(void) static double MagicPower(double force)
{ {
static double value = -1.0; if (force > 0) {
if (value < 0) {
const char *str = get_param(global.parameters, "magic.power"); const char *str = get_param(global.parameters, "magic.power");
value = str ? atof(str) : 1.0; double value = str ? atof(str) : 1.0;
return _max(value * force, 1.0f);
} }
return value; return 0;
} }
static int a_readicastle(attrib * a, void *owner, struct storage *store) static int a_readicastle(attrib * a, void *owner, struct storage *store)
@ -1075,8 +1075,6 @@ spellpower(region * r, unit * u, const spell * sp, int cast_level, struct order
} }
} }
force = force * MagicPower();
return _max(force, 0); return _max(force, 0);
} }
@ -2074,7 +2072,7 @@ castorder *create_castorder(castorder * co, unit *caster, unit * familiar, const
co->_familiar = familiar; co->_familiar = familiar;
co->sp = sp; co->sp = sp;
co->level = lev; co->level = lev;
co->force = force; co->force = MagicPower(force);
co->_rtarget = r ? r : (familiar ? familiar->region : (caster ? caster->region : 0)); co->_rtarget = r ? r : (familiar ? familiar->region : (caster ? caster->region : 0));
co->distance = range; co->distance = range;
co->order = copy_order(ord); co->order = copy_order(ord);
@ -2824,7 +2822,7 @@ void magic(void)
continue; continue;
} }
co->force = spellpower(target_r, u, sp, co->level, ord); co->force = MagicPower(spellpower(target_r, u, sp, co->level, ord));
/* die Stärke kann durch Antimagie auf 0 sinken */ /* die Stärke kann durch Antimagie auf 0 sinken */
if (co->force <= 0) { if (co->force <= 0) {
co->force = 0; co->force = 0;

View File

@ -360,7 +360,6 @@ extern "C" {
extern void write_spells(struct quicklist *slist, struct storage *store); extern void write_spells(struct quicklist *slist, struct storage *store);
extern void read_spells(struct quicklist **slistp, magic_t mtype, extern void read_spells(struct quicklist **slistp, magic_t mtype,
struct storage *store); struct storage *store);
extern double MagicPower(void);
extern struct spellbook * get_spellbook(const char * name); extern struct spellbook * get_spellbook(const char * name);
extern void free_spellbooks(void); extern void free_spellbooks(void);

View File

@ -36,7 +36,6 @@
#include <kernel/connection.h> #include <kernel/connection.h>
#include <kernel/building.h> #include <kernel/building.h>
#include <kernel/curse.h> #include <kernel/curse.h>
#include <kernel/spellid.h>
#include <kernel/faction.h> #include <kernel/faction.h>
#include <kernel/item.h> #include <kernel/item.h>
#include <kernel/messages.h> #include <kernel/messages.h>
@ -6647,7 +6646,6 @@ static spelldata spell_functions[] = {
{ "firestorm", sp_immolation, 0 }, { "firestorm", sp_immolation, 0 },
{ "coldfront", sp_immolation, 0 }, { "coldfront", sp_immolation, 0 },
{ "acidrain", sp_immolation, 0 }, { "acidrain", sp_immolation, 0 },
/* SPL_NOSPELL MUSS der letzte Spruch der Liste sein */
{ 0, 0, 0 } { 0, 0, 0 }
}; };

View File

@ -25,7 +25,6 @@
#include <kernel/region.h> #include <kernel/region.h>
#include <kernel/unit.h> #include <kernel/unit.h>
#include <kernel/spell.h> #include <kernel/spell.h>
#include <kernel/spellid.h>
#include <kernel/race.h> #include <kernel/race.h>
#include <kernel/terrain.h> #include <kernel/terrain.h>
@ -47,6 +46,30 @@
#define EFFECT_HEALING_SPELL 5 #define EFFECT_HEALING_SPELL 5
// Some spells with a fixed, known ID (in XML).
// TODO: this method of identifying spells is error-prone, do not use it for new spells.
enum {
SPL_FIREBALL = 4,
SPL_HAGEL = 5,
SPL_CHAOSROW = 18,
SPL_FLEE = 20,
SPL_SONG_OF_FEAR = 21,
SPL_BERSERK = 22,
SPL_BLOODTHIRST = 23,
SPL_WINDSHIELD = 59,
SPL_HERO = 76,
SPL_METEORRAIN = 108,
SPL_REDUCESHIELD = 109,
SPL_ARMORSHIELD = 110,
SPL_DRAIG_FUMBLESHIELD = 143,
SPL_GWYRRD_FUMBLESHIELD = 144,
SPL_CERDDOR_FUMBLESHIELD = 145,
SPL_TYBIED_FUMBLESHIELD = 146,
SPL_SHADOWKNIGHTS = 147,
SPL_SHOCKWAVE = 163,
SPL_AURA_OF_FEAR = 175
};
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
/* Kampfzauberfunktionen */ /* Kampfzauberfunktionen */