Heart of Ahriman hack (trunk only)
From a four year old news posting: hero was levitating via #invoke
on the Heart of Ahriman, then dropping that artifact yielded:
You drop a gray stone named The Heart of Ahriman.
You float gently to the floor.
A gray stone named The Heart of Ahriman hits the floor.
That might be strictly correct, assuming that both hero and stone fall at
the same speed; if the stone was dropped from perhaps waist height then
the hero's feet would touch first. But it looks strange, like a cartoon
where something hangs in midair until someone notices that it should fall.
Removing the artifact from inventory causes the #invoke property to
toggle off. Unfortunately it has to be done here before the object can
be placed at its destination. Modifying message order seemed unviable;
this fix fiddles with the Levitation property in order to defer hero's
descent until after object handling is finished. Now same setup gives:
You drop a gray stone named The Heart of Ahriman.
A gray stone named The Heart of Ahriman hits the floor.
You float gently to the floor.
You see here a gray stone named The Heart of Ahriman.
This commit is contained in:
7
src/do.c
7
src/do.c
@@ -484,6 +484,12 @@ register struct obj *obj;
|
||||
}
|
||||
#endif
|
||||
if (!can_reach_floor(TRUE)) {
|
||||
/* we might be levitating due to #invoke Heart of Ahriman;
|
||||
if so, levitation would end during call to freeinv()
|
||||
and we want hitfloor() to happen before float_down() */
|
||||
boolean levhack = finesse_ahriman(obj);
|
||||
|
||||
if (levhack) ELevitation = W_ART; /* other than W_ARTI */
|
||||
if(flags.verbose) You("drop %s.", doname(obj));
|
||||
#ifndef GOLDOBJ
|
||||
if (obj->oclass != COIN_CLASS || obj == invent) freeinv(obj);
|
||||
@@ -493,6 +499,7 @@ register struct obj *obj;
|
||||
freeinv(obj);
|
||||
#endif
|
||||
hitfloor(obj);
|
||||
if (levhack) float_down(I_SPECIAL|TIMEOUT, W_ARTI|W_ART);
|
||||
return(1);
|
||||
}
|
||||
if (!IS_ALTAR(levl[u.ux][u.uy].typ) && flags.verbose)
|
||||
|
||||
Reference in New Issue
Block a user