Adds the charge skill

This commit is contained in:
Linus Probert 2018-03-01 13:48:03 +01:00
parent 06cdebc3b3
commit 7e596a251e
4 changed files with 83 additions and 9 deletions

View File

@ -259,17 +259,13 @@ check_skill_activation(Player *player, RoomMatrix *matrix, SDL_Event *event)
unsigned int selected = 0;
if (keyboard_press(SDLK_1, event)) {
selected = 1;
}
else if (keyboard_press(SDLK_2, event)) {
} else if (keyboard_press(SDLK_2, event)) {
selected = 2;
}
else if (keyboard_press(SDLK_3, event)) {
} else if (keyboard_press(SDLK_3, event)) {
selected = 3;
}
else if (keyboard_press(SDLK_4, event)) {
} else if (keyboard_press(SDLK_4, event)) {
selected = 4;
}
else if (keyboard_press(SDLK_5, event)) {
} else if (keyboard_press(SDLK_5, event)) {
selected = 5;
}
@ -391,6 +387,7 @@ player_create(class_t class, SDL_Renderer *renderer)
m_strcpy(asset, 100, "Commissions/Warrior.png");
player->stats = (Stats) WARRIOR_STATS;
player->skills[0] = skill_create(FLURRY);
player->skills[1] = skill_create(CHARGE);
break;
}

View File

@ -24,7 +24,7 @@
#include "player.h"
#include "item.h"
RoomMatrix* roommatrix_create()
RoomMatrix* roommatrix_create(void)
{
int i, j;
RoomMatrix *m = ec_malloc(sizeof(RoomMatrix));

View File

@ -29,6 +29,19 @@
#include "gui.h"
#include "random.h"
static void
set_player_clip_for_direction(Player *player, Vector2d *direction)
{
if (direction->y > 0) // Down
player->sprite->clip.y = 0;
else if (direction->y < 0) // Up
player->sprite->clip.y = 48;
else if (direction->x < 0) // Left
player->sprite->clip.y = 16;
else if (direction->x < 0) // Right
player->sprite->clip.y = 32;
}
static Skill *
create_default(const char *s_label, Sprite *s)
{
@ -54,6 +67,8 @@ skill_use_flurry(Skill *skill, SkillData *data)
targetPos.x += (int) data->direction.x;
targetPos.y += (int) data->direction.y;
set_player_clip_for_direction(data->player, &data->direction);
Monster *monster = data->matrix->spaces[targetPos.x][targetPos.y].monster;
mixer_play_effect(TRIPPLE_SWING);
if (monster) {
@ -76,6 +91,8 @@ skill_use_flurry(Skill *skill, SkillData *data)
mixer_play_effect(TRIPPLE_SWORD_HIT);
}
data->player->hits += hitCount;
} else {
gui_log("You swing at thin air with a flurry of strikes");
}
@ -122,6 +139,63 @@ create_sip_health(void)
return skill;
}
static bool
skill_charge(Skill *skill, SkillData *data)
{
Player *player = data->player;
RoomMatrix *matrix = data->matrix;
Position playerPos = position_to_matrix_coords(&player->sprite->pos);
Position destination = playerPos;
unsigned int steps = 0;
// Find collider
do {
destination.x += (int) data->direction.x;
destination.y += (int) data->direction.y;
steps++;
} while (!matrix->spaces[destination.x][destination.y].occupied
|| destination.x == MAP_ROOM_WIDTH || destination.x < 0
|| destination.y == MAP_ROOM_HEIGHT ||destination.y < 0);
// Move player
steps--;
player->sprite->pos.x += (steps * TILE_DIMENSION) * (int) data->direction.x;
player->sprite->pos.y += (steps * TILE_DIMENSION) * (int) data->direction.y;
set_player_clip_for_direction(data->player, &data->direction);
if (matrix->spaces[destination.x][destination.y].monster) {
Monster *monster = matrix->spaces[destination.x][destination.y].monster;
Stats tmpStats = player->stats;
tmpStats.dmg *= steps > 0 ? steps : 1;
mixer_play_effect(SWING0 + get_random(3) - 1);
unsigned int dmg = stats_fight(&tmpStats, &monster->stats);
if (dmg > 0) {
gui_log("You charged %s for %u damage", monster->lclabel, dmg);
monster_hit(monster, dmg);
mixer_play_effect(SWORD_HIT);
}
}
return true;
}
static Skill *
create_charge(void)
{
Texture *t = texturecache_add("Commissions/Warrior.png");
Sprite *s = sprite_create();
sprite_set_texture(s, t, 0);
s->dim = DEFAULT_DIMENSION;
s->clip = CLIP16(48, 32);
s->fixed = true;
Skill *skill = create_default("Charge", s);
skill->use = skill_charge;
return skill;
}
Skill*
skill_create(enum SkillType t)
{
@ -130,6 +204,8 @@ skill_create(enum SkillType t)
return create_flurry();
case SIP_HEALTH:
return create_sip_health();
case CHARGE:
return create_charge();
default:
fatal("Unknown SkillType %u", (unsigned int) t);
return NULL;

View File

@ -29,6 +29,7 @@ struct Player_t;
enum SkillType {
FLURRY,
CHARGE,
SIP_HEALTH
};