Grimtooth and Sunsword invoke can be paid with magic power
If the invoke timeout hasn't run out, the effect will take 25 pw, the same as a lvl 5 spell. If hero doesn't have that much, then the invoke fails.
This commit is contained in:
@@ -1510,6 +1510,7 @@ if a tree and a boulder or statue were at the same location, applying an axe
|
|||||||
would break the boulder or statue rather than chop the tree
|
would break the boulder or statue rather than chop the tree
|
||||||
avoid premapping outside Sokoban map to prevent showing stone glyphs
|
avoid premapping outside Sokoban map to prevent showing stone glyphs
|
||||||
Grimtooth is permanently poisoned, protects from poison, and can fling poison
|
Grimtooth is permanently poisoned, protects from poison, and can fling poison
|
||||||
|
invoke cost for Grimtooth and Sunsword can be paid with magic power
|
||||||
cursed magic whistle can teleport you to your pet
|
cursed magic whistle can teleport you to your pet
|
||||||
Fire and Frost Brand can be invoked for expert level fireball or cone of cold
|
Fire and Frost Brand can be invoked for expert level fireball or cone of cold
|
||||||
wielding Trollsbane grants hungerless regeneration
|
wielding Trollsbane grants hungerless regeneration
|
||||||
|
|||||||
+46
-9
@@ -40,6 +40,8 @@ staticfn int invoke_banish(struct obj *) NONNULLARG1;
|
|||||||
staticfn int invoke_fling_poison(struct obj *) NONNULLARG1;
|
staticfn int invoke_fling_poison(struct obj *) NONNULLARG1;
|
||||||
staticfn int invoke_storm_spell(struct obj *) NONNULLARG1;
|
staticfn int invoke_storm_spell(struct obj *) NONNULLARG1;
|
||||||
staticfn int invoke_blinding_ray(struct obj *) NONNULLARG1;
|
staticfn int invoke_blinding_ray(struct obj *) NONNULLARG1;
|
||||||
|
staticfn int arti_invoke_cost_pw(struct obj *) NONNULLARG1;
|
||||||
|
staticfn boolean arti_invoke_cost(struct obj *) NONNULLARG1;
|
||||||
staticfn int arti_invoke(struct obj *);
|
staticfn int arti_invoke(struct obj *);
|
||||||
staticfn boolean Mb_hit(struct monst * magr, struct monst *mdef,
|
staticfn boolean Mb_hit(struct monst * magr, struct monst *mdef,
|
||||||
struct obj *, int *, int, boolean, char *);
|
struct obj *, int *, int, boolean, char *);
|
||||||
@@ -2083,6 +2085,48 @@ invoke_blinding_ray(struct obj *obj)
|
|||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return the amount of Pw invoking an object costs.
|
||||||
|
return a negative value, if obj invoking cannot be paid with Pw */
|
||||||
|
staticfn int
|
||||||
|
arti_invoke_cost_pw(struct obj *obj)
|
||||||
|
{
|
||||||
|
const struct artifact *oart = get_artifact(obj);
|
||||||
|
|
||||||
|
if (oart->inv_prop == FLING_POISON
|
||||||
|
|| oart->inv_prop == BLINDING_RAY) {
|
||||||
|
/* pretend it's a level 5 spell */
|
||||||
|
return SPELL_LEV_PW(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return TRUE if artifact object's invoke cost can be paid (and pay it) */
|
||||||
|
staticfn boolean
|
||||||
|
arti_invoke_cost(struct obj *obj)
|
||||||
|
{
|
||||||
|
if (obj->age > svm.moves) {
|
||||||
|
int pw_cost = arti_invoke_cost_pw(obj);
|
||||||
|
|
||||||
|
if (pw_cost < 0 || u.uen < pw_cost) {
|
||||||
|
/* the artifact is tired :-) */
|
||||||
|
You_feel("that %s %s ignoring you.", the(xname(obj)),
|
||||||
|
otense(obj, "are"));
|
||||||
|
/* and just got more so; patience is essential... */
|
||||||
|
obj->age += (long) d(3, 10);
|
||||||
|
return FALSE;
|
||||||
|
} else {
|
||||||
|
/* you pay invoke cost with your own magic */
|
||||||
|
You_feel("drained...");
|
||||||
|
u.uen -= pw_cost;
|
||||||
|
disp.botl = TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
obj->age = svm.moves + rnz(100);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
staticfn int
|
staticfn int
|
||||||
arti_invoke(struct obj *obj)
|
arti_invoke(struct obj *obj)
|
||||||
{
|
{
|
||||||
@@ -2102,17 +2146,10 @@ arti_invoke(struct obj *obj)
|
|||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* It's a special power, not "just" a property */
|
||||||
if (oart->inv_prop > LAST_PROP) {
|
if (oart->inv_prop > LAST_PROP) {
|
||||||
/* It's a special power, not "just" a property */
|
if (!arti_invoke_cost(obj))
|
||||||
if (obj->age > svm.moves) {
|
|
||||||
/* the artifact is tired :-) */
|
|
||||||
You_feel("that %s %s ignoring you.", the(xname(obj)),
|
|
||||||
otense(obj, "are"));
|
|
||||||
/* and just got more so; patience is essential... */
|
|
||||||
obj->age += (long) d(3, 10);
|
|
||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
}
|
|
||||||
obj->age = svm.moves + rnz(100);
|
|
||||||
|
|
||||||
switch (oart->inv_prop) {
|
switch (oart->inv_prop) {
|
||||||
case TAMING: res = invoke_taming(obj); break;
|
case TAMING: res = invoke_taming(obj); break;
|
||||||
|
|||||||
Reference in New Issue
Block a user