diff --git a/.vimrc b/.vimrc index ed5989c..1c60932 100644 --- a/.vimrc +++ b/.vimrc @@ -1,3 +1,6 @@ nnoremap :Make + au FileType c setl makeprg=ninja\ -C\ build +au FileType h setl makeprg=ninja\ -C\ build + let g:syntastic_c_include_dirs = [ 'linkedlist', 'hashtable' ] diff --git a/TODO.txt b/TODO.txt index 5da46ba..0893e04 100644 --- a/TODO.txt +++ b/TODO.txt @@ -7,13 +7,16 @@ x Add enemies (generated through lua) x Move "clip" from texture to sprite x Hitting enemies 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. + - Add hits to stats + - Player hits x Moving enemies x Stupid roaming enemies x Smart agressive enemies x Fleeing enemies - - Add hooks to lua -- Lower levels + x Add hooks to lua + x Add movement depending on state (aggro, scared, passive) +- Lower dungeon levels o XP - Some xp amount logic - Level threshholds diff --git a/data/monstergen.lua b/data/monstergen.lua index 4dff4cb..09734b5 100644 --- a/data/monstergen.lua +++ b/data/monstergen.lua @@ -36,6 +36,13 @@ local texturePaths = { undead1 = "assets/Characters/Undead1.png", } + +local state = { + passive = 0, + agressive = 1, + scared = 2, +} + local enemies = { -- PESTS @@ -87,32 +94,33 @@ local enemies = { { texturePaths.pest0, texturePaths.pest1, 48, 112 }, -- UNDEAD - { texturePaths.undead0, texturePaths.undead1, 0, 0 }; - { texturePaths.undead0, texturePaths.undead1, 16, 0 }; - { texturePaths.undead0, texturePaths.undead1, 32, 0 }; - { texturePaths.undead0, texturePaths.undead1, 48, 0 }; - { texturePaths.undead0, texturePaths.undead1, 64, 0 }; - { texturePaths.undead0, texturePaths.undead1, 80, 0 }; - { texturePaths.undead0, texturePaths.undead1, 96, 0 }; - { texturePaths.undead0, texturePaths.undead1, 112, 0 }; + { texturePaths.undead0, texturePaths.undead1, 0, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 16, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 32, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 48, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 64, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 80, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 96, 0, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 112, 0, state.passive, state.agressive }; - { texturePaths.undead0, texturePaths.undead1, 0, 16 }; - { texturePaths.undead0, texturePaths.undead1, 16, 16 }; - { texturePaths.undead0, texturePaths.undead1, 32, 16 }; - { texturePaths.undead0, texturePaths.undead1, 48, 16 }; - { texturePaths.undead0, texturePaths.undead1, 64, 16 }; - { texturePaths.undead0, texturePaths.undead1, 80, 16 }; - { texturePaths.undead0, texturePaths.undead1, 96, 16 }; - { texturePaths.undead0, texturePaths.undead1, 112, 16 }; + { texturePaths.undead0, texturePaths.undead1, 0, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 16, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 32, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 48, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 64, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 80, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 96, 16, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 112, 16, state.passive, state.agressive }; - { texturePaths.undead0, texturePaths.undead1, 0, 32 }; - { texturePaths.undead0, texturePaths.undead1, 16, 32 }; - { texturePaths.undead0, texturePaths.undead1, 32, 32 }; - { texturePaths.undead0, texturePaths.undead1, 48, 32 }; - { texturePaths.undead0, texturePaths.undead1, 64, 32 }; - { texturePaths.undead0, texturePaths.undead1, 80, 32 }; - { texturePaths.undead0, texturePaths.undead1, 96, 32 }; - { texturePaths.undead0, texturePaths.undead1, 112, 32 }; + { texturePaths.undead0, texturePaths.undead1, 0, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 16, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 32, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 48, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 64, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 80, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 96, 32, state.passive, state.agressive }; + { texturePaths.undead0, texturePaths.undead1, 112, 32, + state.passive, state.scared }; } local function repack(data) @@ -121,6 +129,8 @@ local function repack(data) texturePath2 = data[2], clipX = data[3], clipY = data[4], + nstate = data[5] or state.passive, + cstate = data[6] or state.scared } end diff --git a/src/map_lua.c b/src/map_lua.c index bd9c17c..38df7cb 100644 --- a/src/map_lua.c +++ b/src/map_lua.c @@ -149,7 +149,7 @@ l_add_monster(lua_State *L) { Monster *monster; Map *map; - int x, y, clip_x, clip_y; + int x, y, clip_x, clip_y, nstate, cstate; const char *texture_path_1, *texture_path_2; Texture *texture1, *texture2; SDL_Renderer *renderer; @@ -167,11 +167,15 @@ l_add_monster(lua_State *L) lua_getfield(L, 4, "texturePath2"); lua_getfield(L, 4, "clipX"); lua_getfield(L, 4, "clipY"); + lua_getfield(L, 4, "nstate"); + lua_getfield(L, 4, "cstate"); - texture_path_1 = luaL_checkstring(L, -4); - texture_path_2 = luaL_checkstring(L, -3); - clip_x = luaL_checkinteger(L, -2); - clip_y = luaL_checkinteger(L, -1); + texture_path_1 = luaL_checkstring(L, -6); + texture_path_2 = luaL_checkstring(L, -5); + clip_x = luaL_checkinteger(L, -4); + clip_y = luaL_checkinteger(L, -3); + nstate = luaL_checkinteger(L, -2); + cstate = luaL_checkinteger(L, -1); texture1 = map_add_monster_texture(map, texture_path_1, renderer); texture2 = map_add_monster_texture(map, texture_path_2, renderer); @@ -186,6 +190,9 @@ l_add_monster(lua_State *L) monster_update_pos(monster, (Position) { x, y }); sprite_set_texture(monster->sprite, texture1, 0); sprite_set_texture(monster->sprite, texture2, 1); + monster->state.normal = nstate; + monster->state.challenge = cstate; + monster->state.current = nstate; map_add_monster(map, monster); diff --git a/src/monster.c b/src/monster.c index d11517f..b24a2a5 100644 --- a/src/monster.c +++ b/src/monster.c @@ -30,7 +30,9 @@ monster_create(SDL_Renderer *renderer) m->sprite = sprite_create(); m->sprite->clip = (SDL_Rect) { 0, 0, 16, 16 }; m->stats = (Stats) { 11, 1, 0, 0, 1, 1 }; - m->state = AGRESSIVE; + m->state.normal = PASSIVE; + m->state.challenge = AGRESSIVE; + m->state.current = m->state.normal; monster_load_texts(m, renderer); @@ -113,7 +115,7 @@ monster_drunk_walk(Monster *m, RoomMatrix *rm) { unsigned int i, maxMoveAttempts = 6; - if (get_random(2) == 0) + if (get_random(5) >= 2) return; for (i = 0; i < maxMoveAttempts; ++i) { @@ -188,14 +190,14 @@ monster_move(Monster *m, RoomMatrix *rm) rm->spaces[monsterRoomPos.x][monsterRoomPos.y].occupied = false; rm->spaces[monsterRoomPos.x][monsterRoomPos.y].monster = NULL; - switch (m->state) { + switch (m->state.current) { case PASSIVE: monster_drunk_walk(m, rm); break; case AGRESSIVE: monster_agressive_walk(m, rm); break; - case COWARD: + case SCARED: monster_coward_walk(m, rm); break; }; @@ -207,6 +209,20 @@ monster_move(Monster *m, RoomMatrix *rm) rm->spaces[monsterRoomPos.x][monsterRoomPos.y].monster = m; } +void +monster_hit(Monster *monster, unsigned int dmg) +{ + if (dmg > 0) { + monster->hitText->active = true; + monster->missText->active = false; + } else { + monster->missText->active = true; + monster->hitText->active = false; + } + + monster->state.current = monster->state.challenge; +} + void monster_render(Monster *m, Camera *cam) { diff --git a/src/monster.h b/src/monster.h index 47e9a86..412c9fa 100644 --- a/src/monster.h +++ b/src/monster.h @@ -6,7 +6,13 @@ #include "stats.h" #include "actiontext.h" -typedef enum { PASSIVE, AGRESSIVE, COWARD } State; +typedef enum { PASSIVE, AGRESSIVE, SCARED } StateType; + +typedef struct { + StateType current; + StateType normal; + StateType challenge; +} State; typedef struct Monster_t { Sprite *sprite; @@ -24,6 +30,8 @@ void monster_move(Monster*, RoomMatrix*); void monster_render(Monster*, Camera*); +void monster_hit(Monster*, unsigned int dmg); + void monster_destroy(Monster*); #endif // MONSTER_H_ diff --git a/src/player.c b/src/player.c index 8a9751c..e73a10a 100644 --- a/src/player.c +++ b/src/player.c @@ -27,13 +27,7 @@ has_collided(Player *player, RoomMatrix *matrix) if (space->monster != NULL) { unsigned int hit = stats_fight(&player->stats, &space->monster->stats); - if (hit > 0) { - space->monster->hitText->active = true; - space->monster->missText->active = false; - } else { - space->monster->missText->active = true; - space->monster->hitText->active = false; - } + monster_hit(space->monster, hit); if (space->monster->stats.hp <= 0) { // TODO(Linus): This needs some love later on.