diff --git a/src/player.c b/src/player.c index ad74633..dad4bbf 100644 --- a/src/player.c +++ b/src/player.c @@ -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; } diff --git a/src/roommatrix.c b/src/roommatrix.c index 4cc8103..002b1ed 100644 --- a/src/roommatrix.c +++ b/src/roommatrix.c @@ -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)); diff --git a/src/skill.c b/src/skill.c index c2a64ed..77f737d 100644 --- a/src/skill.c +++ b/src/skill.c @@ -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; diff --git a/src/skill.h b/src/skill.h index 053cbef..0e1ae7b 100644 --- a/src/skill.h +++ b/src/skill.h @@ -29,6 +29,7 @@ struct Player_t; enum SkillType { FLURRY, + CHARGE, SIP_HEALTH };