2021-06-09 20:47:39 +02:00
|
|
|
#include "anim.h"
|
|
|
|
#include <gint/display.h>
|
|
|
|
|
2021-12-25 11:47:22 +01:00
|
|
|
/* Definition of simple and direction animations. */
|
2021-10-23 16:46:33 +02:00
|
|
|
|
2021-12-25 11:47:22 +01:00
|
|
|
#define ANIM1(name) \
|
|
|
|
extern anim_frame_t frames_ ## name[]; \
|
|
|
|
anim_t anims_ ## name = { 1, { frames_ ## name }};
|
|
|
|
|
|
|
|
#define ANIM_2DIRECTIONAL(prefix, suffix) \
|
|
|
|
extern anim_frame_t frames_ ## prefix ## _left ## suffix[]; \
|
|
|
|
extern anim_frame_t frames_ ## prefix ## _right ## suffix[]; \
|
|
|
|
anim_t anims_ ## prefix ## suffix = { 2, { \
|
|
|
|
frames_ ## prefix ## _left ## suffix, \
|
|
|
|
frames_ ## prefix ## _right ## suffix, \
|
|
|
|
}}; \
|
2021-06-10 22:48:27 +02:00
|
|
|
|
2021-08-28 13:52:14 +02:00
|
|
|
#define ANIM_4DIRECTIONAL(prefix, suffix) \
|
2021-12-25 11:47:22 +01:00
|
|
|
extern anim_frame_t frames_ ## prefix ## _up ## suffix[]; \
|
|
|
|
extern anim_frame_t frames_ ## prefix ## _right ## suffix[]; \
|
|
|
|
extern anim_frame_t frames_ ## prefix ## _down ## suffix[]; \
|
|
|
|
extern anim_frame_t frames_ ## prefix ## _left ## suffix[]; \
|
|
|
|
anim_t anims_ ## prefix ## suffix = { 4, { \
|
|
|
|
frames_ ## prefix ## _up ## suffix, \
|
|
|
|
frames_ ## prefix ## _right ## suffix, \
|
|
|
|
frames_ ## prefix ## _down ## suffix, \
|
|
|
|
frames_ ## prefix ## _left ## suffix, \
|
|
|
|
}};
|
|
|
|
|
|
|
|
/* Make suffix optional */
|
|
|
|
#define ANIM2(prefix, ...) \
|
|
|
|
ANIM_2DIRECTIONAL(prefix, __VA_OPT__(_ ## __VA_ARGS__))
|
|
|
|
#define ANIM4(prefix, ...) \
|
|
|
|
ANIM_4DIRECTIONAL(prefix, __VA_OPT__(_ ## __VA_ARGS__))
|
|
|
|
|
|
|
|
/* Basic skills */
|
|
|
|
ANIM1(skill_hit);
|
2022-02-03 17:39:57 +01:00
|
|
|
ANIM2(skill_projectile);
|
2021-12-25 11:47:22 +01:00
|
|
|
ANIM1(skill_teleport);
|
|
|
|
ANIM1(skill_shock);
|
|
|
|
ANIM1(skill_judgement);
|
|
|
|
/* Directional skills */
|
|
|
|
ANIM4(skill_swing);
|
|
|
|
ANIM4(skill_impale);
|
|
|
|
ANIM4(skill_bullet);
|
|
|
|
|
|
|
|
/* Enemies */
|
|
|
|
ANIM2(slime, Idle);
|
|
|
|
ANIM2(slime, Walking);
|
|
|
|
ANIM2(slime, Hit);
|
|
|
|
ANIM2(slime, Death);
|
|
|
|
ANIM2(bat, Idle);
|
|
|
|
ANIM2(bat, Hit);
|
|
|
|
ANIM2(bat, Death);
|
2021-12-25 18:21:31 +01:00
|
|
|
ANIM2(gunslinger, Idle);
|
|
|
|
ANIM2(gunslinger, Walking);
|
|
|
|
ANIM2(gunslinger, Reloading);
|
|
|
|
ANIM2(gunslinger, Fire);
|
|
|
|
ANIM2(gunslinger, Hit);
|
|
|
|
ANIM2(gunslinger, Death);
|
2021-12-30 10:16:15 +01:00
|
|
|
ANIM2(fire_slime, Idle);
|
|
|
|
ANIM2(fire_slime, Walking);
|
|
|
|
ANIM2(fire_slime, Hit);
|
|
|
|
ANIM2(fire_slime, Death);
|
2021-12-25 11:47:22 +01:00
|
|
|
|
|
|
|
/* Player */
|
|
|
|
ANIM4(player, Idle);
|
|
|
|
ANIM4(player, Walking);
|
|
|
|
ANIM4(player, Attack);
|
|
|
|
ANIM4(player, Hit);
|
2021-08-28 13:52:14 +02:00
|
|
|
|
2021-06-10 22:48:27 +02:00
|
|
|
/* Animation functions. */
|
|
|
|
|
2021-12-25 11:47:22 +01:00
|
|
|
fixed_t (anim_duration)(anim_t const *anim)
|
2021-06-10 22:48:27 +02:00
|
|
|
{
|
2021-12-25 11:47:22 +01:00
|
|
|
anim_frame_t const *frame = anim->start[0];
|
2021-06-10 22:48:27 +02:00
|
|
|
int ms = 0;
|
|
|
|
int i = 0;
|
|
|
|
|
2021-12-25 11:47:22 +01:00
|
|
|
while(frame == anim->start[0] + i) {
|
2021-06-10 22:48:27 +02:00
|
|
|
ms += frame->duration;
|
|
|
|
frame = frame->next;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return fix(ms) / 1000;
|
|
|
|
}
|
|
|
|
|
2021-12-25 11:47:22 +01:00
|
|
|
bool anim_in(anim_frame_t const *frame, anim_t const *anim, int index)
|
|
|
|
{
|
|
|
|
if(index >= anim->directions)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
anim_frame_t *f = anim->start[index];
|
|
|
|
|
|
|
|
for(int i = 0; f == anim->start[index] + i; i++) {
|
|
|
|
if(f == frame)
|
|
|
|
return true;
|
|
|
|
f = f->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2021-06-09 20:47:39 +02:00
|
|
|
void anim_frame_render(int x, int y, anim_frame_t const *frame)
|
|
|
|
{
|
2021-06-25 12:07:22 +02:00
|
|
|
if(!frame) return;
|
2021-06-09 20:47:39 +02:00
|
|
|
dsubimage(x - frame->cx, y - frame->cy, frame->sheet,
|
|
|
|
frame->x, frame->y, frame->w, frame->h, DIMAGE_NONE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void anim_state_update(anim_state_t *state, fixed_t dt)
|
|
|
|
{
|
|
|
|
if(!state->frame) return;
|
|
|
|
|
|
|
|
state->elapsed += fround(dt * 1000);
|
|
|
|
if(state->elapsed < state->frame->duration) return;
|
|
|
|
|
|
|
|
/* Switch to next frame */
|
2021-08-30 17:48:44 +02:00
|
|
|
state->elapsed -= state->frame->duration;
|
2021-06-25 12:07:22 +02:00
|
|
|
state->frame = state->frame->next;
|
2021-06-09 20:47:39 +02:00
|
|
|
}
|