1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-27 14:37:16 +00:00

curses thrown are now animated

This commit is contained in:
Zeno Rogue 2021-06-06 10:35:55 +02:00
parent 4a4a0fc217
commit f94163bb78
3 changed files with 32 additions and 2 deletions

View File

@ -2698,7 +2698,15 @@ void celldrawer::draw() {
draw_item_full(); draw_item_full();
draw_monster_full(); draw_monster_full();
if(animations[LAYER_THROW].count(c)) {
shiftmatrix Vthrow = V;
ld footphase;
applyAnimation(c, Vthrow, footphase, LAYER_THROW);
eItem it = animations[LAYER_THROW][c].thrown_item;
drawItemType(it, c, Vthrow, iinf[it].color, 0, false);
}
#if CAP_TEXTURE #if CAP_TEXTURE
if(!texture::using_aura()) if(!texture::using_aura())
#endif #endif

View File

@ -5477,14 +5477,16 @@ struct animation {
int attacking; /** 0 = no attack animation, 1 = first phase, 2 = second phase, 3 = hugging */ int attacking; /** 0 = no attack animation, 1 = first phase, 2 = second phase, 3 = hugging */
transmatrix attackat; transmatrix attackat;
bool mirrored; bool mirrored;
eItem thrown_item; /** for thrown items */
}; };
// we need separate animation layers for Orb of Domination and Tentacle+Ghost, // we need separate animation layers for Orb of Domination and Tentacle+Ghost,
// and also to mark Boats // and also to mark Boats
#define ANIMLAYERS 3 #define ANIMLAYERS 4
#define LAYER_BIG 0 // for worms and krakens #define LAYER_BIG 0 // for worms and krakens
#define LAYER_SMALL 1 // for others #define LAYER_SMALL 1 // for others
#define LAYER_BOAT 2 // mark that a boat has moved #define LAYER_BOAT 2 // mark that a boat has moved
#define LAYER_THROW 3 // for thrown items
#endif #endif
EX array<map<cell*, animation>, ANIMLAYERS> animations; EX array<map<cell*, animation>, ANIMLAYERS> animations;
@ -5527,6 +5529,25 @@ EX void animateMovement(const movei& m, int layer) {
a.mirrored = !a.mirrored; a.mirrored = !a.mirrored;
} }
EX void animate_item_throw(cell *from, cell *to, eItem it) {
bool steps = false;
again:
if(from != to) {
forCellIdEx(c1, i, from) if(celldistance(c1, to) < celldistance(from, to)) {
animateMovement(movei(from, i), LAYER_THROW);
from = c1;
steps = true;
goto again;
}
}
if(steps) {
animation& a = animations[LAYER_THROW][to];
a.thrown_item = it;
}
}
EX void animateAttackOrHug(const movei& m, int layer, int phase, ld ratio, ld delta) { EX void animateAttackOrHug(const movei& m, int layer, int phase, ld ratio, ld delta) {
LATE( animateAttack(m, layer); ) LATE( animateAttack(m, layer); )
if(vid.mspeed >= 5) return; // no animations! if(vid.mspeed >= 5) return; // no animations!

View File

@ -1912,6 +1912,7 @@ EX void specialMoves() {
int d = celldistance(c,t); int d = celldistance(c,t);
if(d <= firerange) { if(d <= firerange) {
addMessage(XLAT("%The1 curses you with %the2!", m, c->item)); addMessage(XLAT("%The1 curses you with %the2!", m, c->item));
animate_item_throw(c, t, c->item);
items[c->item] += orbcharges(c->item); items[c->item] += orbcharges(c->item);
c->item = itNone; c->item = itNone;
c->stuntime = 1; c->stuntime = 1;