RogueLife/src/skills.c

78 lines
2.1 KiB
C

#include <gint/defs/util.h>
#include "skills.h"
#include "comp/fighter.h"
#include "comp/physical.h"
#include "comp/visible.h"
#include "enemies.h"
#include "aoe.h"
fixed_t skill_cooldown(int skill)
{
if(skill == SKILL_DASH)
return fix(1.0);
else if(skill == AOE_PROJECTILE)
return fix(2.0);
else if(skill == AOE_SHOCK)
return fix(4.0);
else if(skill == AOE_JUDGEMENT)
return fix(3.0);
else if(skill == AOE_BULLET)
return fix(4.0);
return fix(0.0);
}
void skill_use(game_t *game, entity_t *e, int slot, vec2 dir)
{
fighter_t *f = getcomp(e, fighter);
int skill = f->skills[slot];
if(skill < 0 || f->actions_cooldown[slot] > 0)
return;
f->actions_cooldown[slot] = skill_cooldown(skill);
if(skill == AOE_PROJECTILE) {
entity_t *aoe = aoe_make_attack(AOE_PROJECTILE, e, dir);
game_add_entity(game, aoe);
if(!f->enemy_data)
visible_set_anim(e, &anims_player_Attack, 2);
else
visible_set_anim(e, f->enemy_data->anim_attack, 2);
}
else if(skill == AOE_SHOCK) {
entity_t *aoe = aoe_make_attack(AOE_SHOCK, e, dir);
game_add_entity(game, aoe);
if(!f->enemy_data)
visible_set_anim(e, &anims_player_Attack, 2);
else
visible_set_anim(e, f->enemy_data->anim_attack, 2);
f->current_attack = aoe;
f->attack_follows_movement = true;
fighter_stun(e, fix(0.5));
game_shake(game, 5, fix(0.7));
}
else if(skill == AOE_JUDGEMENT) {
entity_t *aoe = aoe_make_attack(AOE_JUDGEMENT, e, dir);
game_add_entity(game, aoe);
if(!f->enemy_data)
visible_set_anim(e, &anims_player_Attack, 2);
else
visible_set_anim(e, f->enemy_data->anim_attack, 2);
game_shake(game, 3, fix(1.3));
}
else if(skill == AOE_BULLET) {
entity_t *aoe = aoe_make_attack(AOE_BULLET, e, dir);
game_add_entity(game, aoe);
if(!f->enemy_data)
visible_set_anim(e, &anims_player_Attack, 2);
else
visible_set_anim(e, f->enemy_data->anim_attack, 2);
}
}