forked from github/server
increase magic power for low levels in E3 (instead of divide by 2 sometimes giving powers of < 1.0, cap it below at 1)
several spells have now had problems with powers lower than they were ever designed for, including shapeshift also added a test and some framework for shapeshift spell (in E2). https://bugs.eressea.de/view.php?id=1588
This commit is contained in:
parent
ce94c9805d
commit
b00d7b6d5a
|
@ -2,3 +2,4 @@ require 'tests.e2.shiplanding'
|
||||||
require 'tests.e2.e2features'
|
require 'tests.e2.e2features'
|
||||||
require 'tests.e2.movement'
|
require 'tests.e2.movement'
|
||||||
require 'tests.e2.guard'
|
require 'tests.e2.guard'
|
||||||
|
require 'tests.e2.spells'
|
||||||
|
|
|
@ -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
|
|
@ -1868,7 +1868,7 @@ static void do_extra_spell(troop at, const att * a)
|
||||||
else {
|
else {
|
||||||
int level = a->level;
|
int level = a->level;
|
||||||
assert(a->level > 0);
|
assert(a->level > 0);
|
||||||
cast_combatspell(at, sp, level, level * MagicPower());
|
cast_combatspell(at, sp, level, MagicPower((float)level));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,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>
|
||||||
|
@ -57,6 +58,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);
|
||||||
|
@ -533,7 +545,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, MagicPower((float)level), 0, 0, 0);
|
||||||
sp->cast(&co);
|
sp->cast(&co);
|
||||||
free_castorder(&co);
|
free_castorder(&co);
|
||||||
}
|
}
|
||||||
|
@ -1058,6 +1070,7 @@ void tolua_unit_open(lua_State * L)
|
||||||
#ifdef BSON_ATTRIB
|
#ifdef BSON_ATTRIB
|
||||||
tolua_variable(L, TOLUA_CAST "attribs", &tolua_unit_get_attribs, 0);
|
tolua_variable(L, TOLUA_CAST "attribs", &tolua_unit_get_attribs, 0);
|
||||||
#endif
|
#endif
|
||||||
|
tolua_function(L, TOLUA_CAST "show", &tolua_bufunit);
|
||||||
}
|
}
|
||||||
tolua_endmodule(L);
|
tolua_endmodule(L);
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,14 +117,17 @@ static float MagicRegeneration(void)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
float MagicPower(void)
|
float MagicPower(float force)
|
||||||
{
|
{
|
||||||
static float value = -1.0;
|
static float value = -1.0;
|
||||||
|
if (force <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (value < 0) {
|
if (value < 0) {
|
||||||
const char *str = get_param(global.parameters, "magic.power");
|
const char *str = get_param(global.parameters, "magic.power");
|
||||||
value = str ? (float)atof(str) : 1.0f;
|
value = str ? (float)atof(str) : 1.0f;
|
||||||
}
|
}
|
||||||
return value;
|
return _max(value * force, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a_readicastle(attrib * a, void *owner, struct storage *store)
|
static int a_readicastle(attrib * a, void *owner, struct storage *store)
|
||||||
|
@ -1074,7 +1077,7 @@ spellpower(region * r, unit * u, const spell * sp, int cast_level, struct order
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
force = force * MagicPower();
|
force = MagicPower(force);
|
||||||
|
|
||||||
return _max(force, 0);
|
return _max(force, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -360,7 +360,7 @@ 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 float MagicPower(void);
|
float MagicPower(float force);
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue