forked from github/server
Bug 2612 Zauberreparatur.
This commit is contained in:
parent
a6ea80f5f8
commit
17fbd0d67d
|
@ -234,8 +234,6 @@ function test_familiar_school()
|
||||||
local u = unit.create(f, r)
|
local u = unit.create(f, r)
|
||||||
u.magic = "draig"
|
u.magic = "draig"
|
||||||
u:set_skill("magic", 10)
|
u:set_skill("magic", 10)
|
||||||
u.aura = 200
|
|
||||||
u:add_spell("fireball")
|
|
||||||
local uf = unit.create(f, r)
|
local uf = unit.create(f, r)
|
||||||
uf.race = "lynx"
|
uf.race = "lynx"
|
||||||
u.familiar = uf
|
u.familiar = uf
|
||||||
|
@ -247,3 +245,18 @@ function test_familiar_school()
|
||||||
assert_equal(0, uf.aura)
|
assert_equal(0, uf.aura)
|
||||||
assert_nil(uf.magic)
|
assert_nil(uf.magic)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function test_astral_disruption()
|
||||||
|
local r = region.create(0, 0, "plain")
|
||||||
|
local r2 = r:get_astral('fog')
|
||||||
|
local f = faction.create("human")
|
||||||
|
local u = unit.create(f, r)
|
||||||
|
local uh = unit.create(get_monsters(), r2, 1, "braineater")
|
||||||
|
u.magic = "draig"
|
||||||
|
u:set_skill("magic", 100) -- level 100 should beat magic resistance
|
||||||
|
u.aura = 200
|
||||||
|
u:add_spell("astral_disruption")
|
||||||
|
u:add_order('ZAUBERE STUFE 1 "Stoere Astrale Integritaet"')
|
||||||
|
process_orders()
|
||||||
|
assert_equal(r, uh.region)
|
||||||
|
end
|
||||||
|
|
|
@ -587,10 +587,10 @@ static int tolua_region_getastral(lua_State * L)
|
||||||
|
|
||||||
if (!rt) {
|
if (!rt) {
|
||||||
const char *tname = tolua_tostring(L, 2, NULL);
|
const char *tname = tolua_tostring(L, 2, NULL);
|
||||||
|
const terrain_type *terrain = get_terrain(tname ? tname : "fog");
|
||||||
plane *pl = get_astralplane();
|
plane *pl = get_astralplane();
|
||||||
rt = new_region(real2tp(r->x), real2tp(r->y), pl, 0);
|
rt = new_region(real2tp(r->x), real2tp(r->y), pl, 0);
|
||||||
if (tname) {
|
if (terrain) {
|
||||||
const terrain_type *terrain = get_terrain(tname);
|
|
||||||
terraform_region(rt, terrain);
|
terraform_region(rt, terrain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
27
src/spells.c
27
src/spells.c
|
@ -5554,7 +5554,14 @@ int sp_viewreality(castorder * co)
|
||||||
return cast_level;
|
return cast_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/**
|
||||||
|
* Zauber: Störe astrale Integrität
|
||||||
|
*
|
||||||
|
* Dieser Zauber bewirkt eine schwere Störung des Astralraums. Innerhalb eines
|
||||||
|
* astralen Radius von Stufe/5 Regionen werden alle Astralwesen, die dem Zauber
|
||||||
|
* nicht wiederstehen können, aus der astralen Ebene geschleudert. Der astrale
|
||||||
|
* Kontakt mit allen betroffenen Regionen ist für Stufe/3 Wochen gestört.
|
||||||
|
*/
|
||||||
int sp_disruptastral(castorder * co)
|
int sp_disruptastral(castorder * co)
|
||||||
{
|
{
|
||||||
region_list *rl, *rl2;
|
region_list *rl, *rl2;
|
||||||
|
@ -5584,20 +5591,20 @@ int sp_disruptastral(castorder * co)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rl = list_all_in_range(rt, (short)(power / 5));
|
rl = list_all_in_range(rt, (int)(power / 5));
|
||||||
|
|
||||||
for (rl2 = rl; rl2 != NULL; rl2 = rl2->next) {
|
for (rl2 = rl; rl2 != NULL; rl2 = rl2->next) {
|
||||||
attrib *a;
|
attrib *a;
|
||||||
double effect;
|
double effect;
|
||||||
region *r2 = rl2->data;
|
region *r2 = rl2->data;
|
||||||
int inhab_regions = 0;
|
int inhab_regions = 0;
|
||||||
region_list *trl = NULL;
|
region *rtargets[MAX_SCHEMES];
|
||||||
|
|
||||||
if (is_cursed(r2->attribs, &ct_astralblock))
|
if (is_cursed(r2->attribs, &ct_astralblock))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (r2->units != NULL) {
|
if (r2->units != NULL) {
|
||||||
inhab_regions = get_astralregions(r, inhabitable, NULL);
|
inhab_regions = get_astralregions(r2, inhabitable, rtargets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Nicht-Permanente Tore zerstoeren */
|
/* Nicht-Permanente Tore zerstoeren */
|
||||||
|
@ -5613,17 +5620,10 @@ int sp_disruptastral(castorder * co)
|
||||||
|
|
||||||
/* Einheiten auswerfen */
|
/* Einheiten auswerfen */
|
||||||
|
|
||||||
if (trl != NULL) {
|
if (inhab_regions) {
|
||||||
for (u = r2->units; u; u = u->next) {
|
for (u = r2->units; u; u = u->next) {
|
||||||
region_list *trl2 = trl;
|
|
||||||
region *tr;
|
|
||||||
int c = rng_int() % inhab_regions;
|
int c = rng_int() % inhab_regions;
|
||||||
|
region *tr = rtargets[c];
|
||||||
/* Zufaellige Zielregion suchen */
|
|
||||||
while (c-- != 0) {
|
|
||||||
trl2 = trl2->next;
|
|
||||||
}
|
|
||||||
tr = trl2->data;
|
|
||||||
|
|
||||||
if (!is_magic_resistant(mage, u, 0) && can_survive(u, tr)) {
|
if (!is_magic_resistant(mage, u, 0) && can_survive(u, tr)) {
|
||||||
message *msg = msg_message("disrupt_astral", "unit region", u, tr);
|
message *msg = msg_message("disrupt_astral", "unit region", u, tr);
|
||||||
|
@ -5634,7 +5634,6 @@ int sp_disruptastral(castorder * co)
|
||||||
move_unit(u, tr, NULL);
|
move_unit(u, tr, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free_regionlist(trl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Kontakt unterbinden */
|
/* Kontakt unterbinden */
|
||||||
|
|
Loading…
Reference in New Issue