2017-11-30 21:00:47 +01:00
|
|
|
#include <string.h>
|
|
|
|
#include "player.h"
|
|
|
|
|
2017-12-12 11:20:08 +01:00
|
|
|
static Stats classStats[] = {
|
|
|
|
(Stats) { 11, 11, 11, 1 }, /* ENGINEER */
|
|
|
|
(Stats) { 11, 11, 11, 1 }, /* MAGE */
|
|
|
|
(Stats) { 11, 11, 11, 1 }, /* PALADIN */
|
|
|
|
(Stats) { 11, 11, 11, 2 }, /* ROGUE */
|
|
|
|
(Stats) { 11, 11, 11, 1 }, /* WARRIOR */
|
|
|
|
};
|
|
|
|
|
|
|
|
static bool
|
|
|
|
has_collided(Sprite *sprite, RoomMatrix *matrix)
|
2017-12-05 15:03:20 +01:00
|
|
|
{
|
2017-12-06 11:44:17 +01:00
|
|
|
Position roomCoord = position_to_room_coords(&sprite->pos);
|
|
|
|
if (roomCoord.x != matrix->roomPos.x || roomCoord.y != matrix->roomPos.y) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
Position matrixPos = position_to_matrix_coords(&sprite->pos);
|
|
|
|
return matrix->spaces[matrixPos.x][matrixPos.y].occupied;
|
2017-12-05 15:03:20 +01:00
|
|
|
}
|
|
|
|
|
2017-12-12 11:20:08 +01:00
|
|
|
static void
|
|
|
|
move_left(Sprite *sprite, RoomMatrix *matrix)
|
2017-12-05 15:03:20 +01:00
|
|
|
{
|
2017-12-11 08:23:30 +01:00
|
|
|
sprite->textures[0]->clip.y = 16;
|
2017-12-05 15:03:20 +01:00
|
|
|
sprite->pos.x -= TILE_DIMENSION;
|
|
|
|
if (has_collided(sprite, matrix))
|
|
|
|
sprite->pos.x += TILE_DIMENSION;
|
|
|
|
}
|
|
|
|
|
|
|
|
static
|
|
|
|
void move_right(Sprite *sprite, RoomMatrix *matrix)
|
|
|
|
{
|
2017-12-11 08:23:30 +01:00
|
|
|
sprite->textures[0]->clip.y = 32;
|
2017-12-05 15:03:20 +01:00
|
|
|
sprite->pos.x += TILE_DIMENSION;
|
|
|
|
if (has_collided(sprite, matrix))
|
|
|
|
sprite->pos.x -= TILE_DIMENSION;
|
|
|
|
}
|
|
|
|
|
|
|
|
static
|
|
|
|
void move_up(Sprite *sprite, RoomMatrix *matrix)
|
|
|
|
{
|
2017-12-11 08:23:30 +01:00
|
|
|
sprite->textures[0]->clip.y = 48;
|
2017-12-05 15:03:20 +01:00
|
|
|
sprite->pos.y -= TILE_DIMENSION;
|
|
|
|
if (has_collided(sprite, matrix))
|
|
|
|
sprite->pos.y += TILE_DIMENSION;
|
|
|
|
}
|
|
|
|
|
|
|
|
static
|
|
|
|
void move_down(Sprite *sprite, RoomMatrix *matrix)
|
|
|
|
{
|
2017-12-11 08:23:30 +01:00
|
|
|
sprite->textures[0]->clip.y = 0;
|
2017-12-05 15:03:20 +01:00
|
|
|
sprite->pos.y += TILE_DIMENSION;
|
|
|
|
if (has_collided(sprite, matrix))
|
|
|
|
sprite->pos.y -= TILE_DIMENSION;
|
|
|
|
}
|
|
|
|
|
|
|
|
static
|
|
|
|
void handle_player_input(Sprite *sprite, RoomMatrix *matrix, SDL_Event *event)
|
2017-11-30 21:00:47 +01:00
|
|
|
{
|
|
|
|
static unsigned int step = 1;
|
|
|
|
|
|
|
|
if (event->type == SDL_KEYDOWN) {
|
|
|
|
switch (event->key.keysym.sym) {
|
2017-12-05 15:03:20 +01:00
|
|
|
case SDLK_LEFT:
|
|
|
|
move_left(sprite, matrix);
|
|
|
|
break;
|
|
|
|
case SDLK_RIGHT:
|
|
|
|
move_right(sprite, matrix);
|
|
|
|
break;
|
|
|
|
case SDLK_UP:
|
|
|
|
move_up(sprite, matrix);
|
|
|
|
break;
|
|
|
|
case SDLK_DOWN:
|
|
|
|
move_down(sprite, matrix);
|
|
|
|
break;
|
2017-11-30 21:00:47 +01:00
|
|
|
}
|
2017-12-11 08:23:30 +01:00
|
|
|
sprite->textures[0]->clip.x = 16*step;
|
2017-11-30 21:00:47 +01:00
|
|
|
if (step == 3)
|
|
|
|
step = 0;
|
|
|
|
else
|
|
|
|
++step;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-12 11:20:08 +01:00
|
|
|
Player*
|
|
|
|
player_create(class_t class, SDL_Renderer *renderer)
|
2017-11-30 21:00:47 +01:00
|
|
|
{
|
2017-12-12 11:20:08 +01:00
|
|
|
Player *player = malloc(sizeof(Player));
|
|
|
|
player->sprite = sprite_create();
|
2017-11-30 21:00:47 +01:00
|
|
|
|
2017-12-12 11:20:08 +01:00
|
|
|
char asset[100];
|
2017-11-30 21:00:47 +01:00
|
|
|
switch (class) {
|
|
|
|
case ENGINEER:
|
|
|
|
strcpy(asset, "assets/Commissions/Engineer.png");
|
2017-12-12 11:20:08 +01:00
|
|
|
player->stats = classStats[ENGINEER];
|
2017-11-30 21:00:47 +01:00
|
|
|
break;
|
|
|
|
case MAGE:
|
|
|
|
strcpy(asset, "assets/Commissions/Mage.png");
|
2017-12-12 11:20:08 +01:00
|
|
|
player->stats = classStats[MAGE];
|
2017-11-30 21:00:47 +01:00
|
|
|
break;
|
|
|
|
case PALADIN:
|
|
|
|
strcpy(asset, "assets/Commissions/Paladin.png");
|
2017-12-12 11:20:08 +01:00
|
|
|
player->stats = classStats[PALADIN];
|
2017-11-30 21:00:47 +01:00
|
|
|
break;
|
|
|
|
case ROGUE:
|
|
|
|
strcpy(asset, "assets/Commissions/Rogue.png");
|
2017-12-12 11:20:08 +01:00
|
|
|
player->stats = classStats[ROGUE];
|
2017-11-30 21:00:47 +01:00
|
|
|
break;
|
|
|
|
case WARRIOR:
|
|
|
|
strcpy(asset, "assets/Commissions/Warrior.png");
|
2017-12-12 11:20:08 +01:00
|
|
|
player->stats = classStats[WARRIOR];
|
2017-11-30 21:00:47 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2017-12-12 11:20:08 +01:00
|
|
|
sprite_load_texture(player->sprite, asset, 0, renderer);
|
|
|
|
player->sprite->pos = (Position) { TILE_DIMENSION, TILE_DIMENSION };
|
|
|
|
player->sprite->textures[0]->clip = (SDL_Rect) { 0, 0, 16, 16 };
|
|
|
|
player->sprite->textures[0]->dim = (Dimension) {
|
|
|
|
TILE_DIMENSION, TILE_DIMENSION };
|
|
|
|
player->sprite->handle_event = &handle_player_input;
|
2017-11-30 21:00:47 +01:00
|
|
|
|
|
|
|
return player;
|
|
|
|
}
|
2017-12-12 11:20:08 +01:00
|
|
|
|
|
|
|
void
|
|
|
|
player_destroy(Player *player)
|
|
|
|
{
|
|
|
|
if (player->sprite)
|
|
|
|
sprite_destroy(player->sprite);
|
|
|
|
|
|
|
|
free(player);
|
|
|
|
}
|