Implemented stupid agressive and coward pathing.

This commit is contained in:
Linus Probert 2017-12-18 09:59:01 +01:00
parent 3a464d8ea6
commit c88c64f4b8
9 changed files with 103 additions and 20 deletions

View File

@ -47,7 +47,6 @@ add_executable(breakhack
src/stats src/stats
src/actiontext src/actiontext
src/random src/random
src/pathfind
) )
target_link_libraries(breakhack target_link_libraries(breakhack

View File

@ -10,10 +10,13 @@ x Nicer enemy hits (Text textures, healthbars?)
- This could need some love later on. (Misses seem to be broken) (Add hits to stats) - This could need some love later on. (Misses seem to be broken) (Add hits to stats)
x Moving enemies x Moving enemies
x Stupid roaming enemies x Stupid roaming enemies
- Smart agressive enemies x Smart agressive enemies
- Fleeing enemies x Fleeing enemies
- Add hooks to lua
- Lower levels - Lower levels
o XP o XP
- Some xp amount logic
- Level threshholds
- gui - gui
- Items - Items
- More gui - More gui

View File

@ -158,6 +158,7 @@ void run()
position_to_matrix_coords(&gPlayer->sprite->pos); position_to_matrix_coords(&gPlayer->sprite->pos);
gRoomMatrix->spaces[rp.x][rp.y].occupied = true; gRoomMatrix->spaces[rp.x][rp.y].occupied = true;
gRoomMatrix->spaces[rp.x][rp.y].player = gPlayer; gRoomMatrix->spaces[rp.x][rp.y].player = gPlayer;
gRoomMatrix->playerRoomPos = rp;
map_move_monsters(gMap, gRoomMatrix); map_move_monsters(gMap, gRoomMatrix);
} }

View File

@ -30,6 +30,7 @@ monster_create(SDL_Renderer *renderer)
m->sprite = sprite_create(); m->sprite = sprite_create();
m->sprite->clip = (SDL_Rect) { 0, 0, 16, 16 }; m->sprite->clip = (SDL_Rect) { 0, 0, 16, 16 };
m->stats = (Stats) { 11, 1, 0, 0, 1, 1 }; m->stats = (Stats) { 11, 1, 0, 0, 1, 1 };
m->state = AGRESSIVE;
monster_load_texts(m, renderer); monster_load_texts(m, renderer);
@ -55,6 +56,11 @@ has_collided(Monster *monster, RoomMatrix *matrix)
Position roomPos = position_to_matrix_coords(&monster->sprite->pos); Position roomPos = position_to_matrix_coords(&monster->sprite->pos);
RoomSpace *space = &matrix->spaces[roomPos.x][roomPos.y]; RoomSpace *space = &matrix->spaces[roomPos.x][roomPos.y];
if (space->player) {
stats_fight(&monster->stats, &space->player->stats);
}
return space->occupied; return space->occupied;
} }
@ -102,19 +108,14 @@ move_down(Monster *m, RoomMatrix *rm)
return true; return true;
} }
void static void
monster_move(Monster *m, RoomMatrix *rm) monster_drunk_walk(Monster *m, RoomMatrix *rm)
{ {
unsigned int i, maxMoveAttempts = 6; unsigned int i, maxMoveAttempts = 6;
Position monsterRoomPos;
if (get_random(2) == 0) if (get_random(2) == 0)
return; return;
monsterRoomPos = position_to_matrix_coords(&m->sprite->pos);
rm->spaces[monsterRoomPos.x][monsterRoomPos.y].occupied = false;
rm->spaces[monsterRoomPos.x][monsterRoomPos.y].monster = NULL;
for (i = 0; i < maxMoveAttempts; ++i) { for (i = 0; i < maxMoveAttempts; ++i) {
int move = get_random(3); int move = get_random(3);
if (move == 0 && move_left(m, rm)) if (move == 0 && move_left(m, rm))
@ -126,6 +127,78 @@ monster_move(Monster *m, RoomMatrix *rm)
else if (move == 3 && move_down(m, rm)) else if (move == 3 && move_down(m, rm))
break; break;
} }
}
static void
monster_agressive_walk(Monster *m, RoomMatrix *rm)
{
int x_dist, y_dist;
Position mPos;
mPos = position_to_matrix_coords(&m->sprite->pos);
x_dist = mPos.x - rm->playerRoomPos.x;
y_dist = mPos.y - rm->playerRoomPos.y;
if (abs(x_dist) > abs(y_dist)) {
if (x_dist > 0)
move_left(m, rm);
else
move_right(m, rm);
} else {
if (y_dist > 0)
move_up(m, rm);
else
move_down(m, rm);
}
}
static void
monster_coward_walk(Monster *m, RoomMatrix *rm)
{
int x_dist, y_dist;
Position mPos;
mPos = position_to_matrix_coords(&m->sprite->pos);
x_dist = mPos.x - rm->playerRoomPos.x;
y_dist = mPos.y - rm->playerRoomPos.y;
if (abs(x_dist) > abs(y_dist)) {
if (x_dist > 0)
move_right(m, rm);
else
move_left(m, rm);
} else {
if (y_dist > 0)
move_down(m, rm);
else
move_up(m, rm);
}
}
void
monster_move(Monster *m, RoomMatrix *rm)
{
Position monsterRoomPos;
monsterRoomPos = position_to_matrix_coords(&m->sprite->pos);
rm->spaces[monsterRoomPos.x][monsterRoomPos.y].occupied = false;
rm->spaces[monsterRoomPos.x][monsterRoomPos.y].monster = NULL;
switch (m->state) {
case PASSIVE:
monster_drunk_walk(m, rm);
break;
case AGRESSIVE:
monster_agressive_walk(m, rm);
break;
case COWARD:
monster_coward_walk(m, rm);
break;
};
monster_update_pos(m, m->sprite->pos); monster_update_pos(m, m->sprite->pos);

View File

@ -6,11 +6,14 @@
#include "stats.h" #include "stats.h"
#include "actiontext.h" #include "actiontext.h"
typedef enum { PASSIVE, AGRESSIVE, COWARD } State;
typedef struct Monster_t { typedef struct Monster_t {
Sprite *sprite; Sprite *sprite;
ActionText *hitText; ActionText *hitText;
ActionText *missText; ActionText *missText;
Stats stats; Stats stats;
State state;
} Monster; } Monster;
Monster* monster_create(SDL_Renderer*); Monster* monster_create(SDL_Renderer*);

View File

@ -31,7 +31,6 @@ has_collided(Player *player, RoomMatrix *matrix)
space->monster->hitText->active = true; space->monster->hitText->active = true;
space->monster->missText->active = false; space->monster->missText->active = false;
} else { } else {
// TODO(Linus): The misses seem to be missing
space->monster->missText->active = true; space->monster->missText->active = true;
space->monster->hitText->active = false; space->monster->hitText->active = false;
} }
@ -48,8 +47,6 @@ has_collided(Player *player, RoomMatrix *matrix)
static void static void
player_step(Player *p, RoomMatrix* m) player_step(Player *p, RoomMatrix* m)
{ {
Position pos = position_to_matrix_coords(&p->sprite->pos);
m->spaces[pos.x][pos.y].occupied = true;
p->total_steps++; p->total_steps++;
p->steps++; p->steps++;
} }
@ -181,10 +178,10 @@ player_print(Player *p)
printf("\n"); printf("\n");
printf("--------=== <[ Player Stats ]> ===--------\n"); printf("--------=== <[ Player Stats ]> ===--------\n");
printf("HP: %u\n", p->stats.hp); printf("HP: %d\n", p->stats.hp);
printf("Level: %u XP: %u\n", p->stats.lvl, p->xp); printf("Level: %d XP: %d\n", p->stats.lvl, p->xp);
printf("Pos: %dx%d RoomPos: %dx%d\n", pos.x, pos.y, roomPos.x, roomPos.y); printf("Pos: %dx%d RoomPos: %dx%d\n", pos.x, pos.y, roomPos.x, roomPos.y);
printf("Steps: %u\n", p->total_steps); printf("Steps: %d\n", p->total_steps);
printf("------------------------------------------\n"); printf("------------------------------------------\n");
} }

View File

@ -157,6 +157,7 @@ void roommatrix_reset(RoomMatrix *m)
} }
} }
m->roomPos = (Position) { 0, 0 }; m->roomPos = (Position) { 0, 0 };
m->playerRoomPos = (Position) { 1, 1 };
} }
void roommatrix_destroy(RoomMatrix *m) void roommatrix_destroy(RoomMatrix *m)

View File

@ -22,6 +22,7 @@ typedef struct {
typedef struct { typedef struct {
RoomSpace spaces[MAP_ROOM_WIDTH][MAP_ROOM_HEIGHT]; RoomSpace spaces[MAP_ROOM_WIDTH][MAP_ROOM_HEIGHT];
Position roomPos; Position roomPos;
Position playerRoomPos;
} RoomMatrix; } RoomMatrix;
RoomMatrix* roommatrix_create(); RoomMatrix* roommatrix_create();

View File

@ -8,7 +8,7 @@
unsigned int unsigned int
stats_fight(Stats *attacker, Stats *defender) stats_fight(Stats *attacker, Stats *defender)
{ {
unsigned int atkRoll, defRoll, dmgRoll; int atkRoll, defRoll, dmgRoll;
bool critical = false; bool critical = false;
atkRoll = get_random(19) + 1; atkRoll = get_random(19) + 1;
@ -18,14 +18,19 @@ stats_fight(Stats *attacker, Stats *defender)
defRoll = (get_random(19) + 1) + defender->def; defRoll = (get_random(19) + 1) + defender->def;
dmgRoll = 0; dmgRoll = 0;
//printf("Attacking: %u, Defending: %u\n", atkRoll, defRoll); printf("\n");
printf("-----------[ FIGHT ]---------\n");
printf("Attacking: %d Defending: %d\n", atkRoll, defRoll);
if (atkRoll > defRoll) { if (atkRoll > defRoll) {
dmgRoll = (rand() % 8) + attacker->dmg; dmgRoll = (rand() % attacker->dmg) + 1;
defender->hp -= dmgRoll; defender->hp -= dmgRoll;
if (critical) if (critical)
defender->hp -= dmgRoll; defender->hp -= dmgRoll;
} }
//printf("Attacker hp: %u, Defender hp: %u\n", attacker->hp, defender->hp);
printf("Attacker hp: %d Defender hp: %d\n", attacker->hp, defender->hp);
printf("-----------------------------\n");
return dmgRoll; return dmgRoll;
} }