Replaced state logic with behaviours instead.

This commit is contained in:
Linus Probert 2018-05-19 17:55:10 +02:00
parent b905232d5e
commit 186cc7b514
4 changed files with 191 additions and 117 deletions

View File

@ -37,10 +37,12 @@ local texturePaths = {
} }
local state = { local behaviour = {
passive = 0, pacifist = 0,
agressive = 1, normal = 1,
scared = 2, hostile = 2,
guerilla = 3,
coward = 4
} }
local stats = { local stats = {
@ -89,31 +91,31 @@ local pests = {
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 0, "A Beetle" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 0, "A Beetle" },
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 0, "A Large Grub" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 0, "A Large Grub" },
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 0, "A Small Grub" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 0, "A Small Grub" },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 96, 0, "A Slim Worm" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 96, 0, "A Slim Worm", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 112, 0, "A Fat Worm" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 112, 0, "A Fat Worm", behaviour.pacifist },
--{ texturePaths.pest0, texturePaths.pest1, 0, 16, "Female Dragonfly" }, --{ texturePaths.pest0, texturePaths.pest1, 0, 16, "Female Dragonfly" },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 16, "A Fly" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 16, "A Fly", behaviour.pacifist },
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 16, "A Larva" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 16, "A Larva" },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 16, "A Moth" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 16, "A Moth", behaviour.pacifist },
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 16 }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 16 },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 16, "A Gnat" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 16, "A Gnat", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 32, "A Small Spider" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 32, "A Small Spider", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 32, "A Medium Spider" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 32, "A Medium Spider", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 32, "A Large Spider" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 32, "A Large Spider", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 32, "A Small Scorpion" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 32, "A Small Scorpion", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 32, "A Medium Scorpion" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 32, "A Medium Scorpion", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 32, "A Large Scorpion" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 32, "A Large Scorpion", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 48, "A Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 48, "A Slug", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 48, "A Large Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 48, "A Large Slug", behaviour.pacifist },
--{ texturePaths.pest0, texturePaths.pest1, 32, 48 }, --{ texturePaths.pest0, texturePaths.pest1, 32, 48 },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 48, "A Red Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 48, "A Red Slug", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 48, "A Large Red Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 48, "A Large Red Slug", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 64, "A Giant Brown Ant" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 64, "A Giant Brown Ant", behaviour.pacifist },
{ texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 64, "A Giant Black Ant" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 64, "A Giant Black Ant", behaviour.pacifist },
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 64, "A Giant Gold Ant" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 64, "A Giant Gold Ant" },
--{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 64, "A Giant Silver Ant" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 64, "A Giant Silver Ant" },
@ -134,61 +136,61 @@ local pests = {
local undead = { local undead = {
-- UNDEAD -- UNDEAD
--{ texturePaths.undead0, texturePaths.undead1, 0, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 0, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 16, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 16, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 32, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 32, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 48, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 48, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 64, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 64, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 80, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 80, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 96, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 96, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 112, 0, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 112, 0, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 0, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 0, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 16, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 16, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 32, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 32, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 48, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 48, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 64, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 64, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 80, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 80, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 96, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 96, 16, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 112, 16, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 112, 16, "", behaviour.normal };
{ texturePaths.undead0, texturePaths.undead1, stats.undead, 0, 32, "A Skeleton", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 0, 32, "A Skeleton", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 16, 32, "An Umber Skeleton", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 16, 32, "An Umber Skeleton", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 32, 32, "A Caustic Skeleton", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 32, 32, "A Caustic Skeleton", behaviour.normal };
{ texturePaths.undead0, texturePaths.undead1, stats.undead, 48, 32, "A Black Skeleton", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 48, 32, "A Black Skeleton", behaviour.normal };
{ texturePaths.undead0, texturePaths.undead1, stats.undead, 64, 32, "A Zombie", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 64, 32, "A Zombie", behaviour.normal };
{ texturePaths.undead0, texturePaths.undead1, stats.undead, 80, 32, "A Zombie", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 80, 32, "A Zombie", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 96, 32, "", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 96, 32, "", behaviour.normal };
--{ texturePaths.undead0, texturePaths.undead1, 112, 32, "", state.passive, state.scared }; --{ texturePaths.undead0, texturePaths.undead1, 112, 32, "", behaviour.normal };
} }
local dogs = { local dogs = {
{ texturePaths.dog0, texturePaths.dog1, stats.dog, 0, 16, "A Rabid Dog", state.passive, state.agressive }; { texturePaths.dog0, texturePaths.dog1, stats.dog, 0, 16, "A Rabid Dog", behaviour.normal };
{ texturePaths.dog0, texturePaths.dog1, stats.dog, 16, 16, "An Angry Rabid Dog", state.agressive, state.agressive }; { texturePaths.dog0, texturePaths.dog1, stats.dog, 16, 16, "An Angry Rabid Dog", behaviour.hostile };
} }
local reptile = { local reptile = {
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 0, 64, "A Small Brown Snake", state.passive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.default, 0, 64, "A Small Brown Snake", behaviour.coward };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 16, 64, "A Medium Brown Snake", state.passive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.default, 16, 64, "A Medium Brown Snake", behaviour.guerilla };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 32, 64, "A Large Brown Snake", state.passive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.default, 32, 64, "A Large Brown Snake", behaviour.hostile };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 48, 64, "A Small Black Snake", state.agressive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.default, 48, 64, "A Small Black Snake", behaviour.coward };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 64, 64, "A Medium Black Snake", state.agressive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.default, 64, 64, "A Medium Black Snake", behaviour.guerilla };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 80, 64, "A Large Black Snake", state.agressive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.default, 80, 64, "A Large Black Snake", behaviour.hostile };
} }
local platino = { local platino = {
{ texturePaths.reptile0, texturePaths.reptile1, stats.platino, 48, 12*16, "Platino", state.agressive, state.agressive }; { texturePaths.reptile0, texturePaths.reptile1, stats.platino, 48, 12*16, "Platino", behaviour.hostile };
} }
local demon = { local demon = {
{ texturePaths.demon0, texturePaths.demon1, stats.default, 0, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 0, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 16, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 16, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 32, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 32, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 48, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 48, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 64, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 64, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 80, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 80, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 96, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 96, 0, "A Demon", behaviour.hostile };
{ texturePaths.demon0, texturePaths.demon1, stats.default, 112, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 112, 0, "A Demon", behaviour.hostile };
} }
local function concat(table1, table2) local function concat(table1, table2)
@ -206,8 +208,7 @@ local function repack(data)
clipX = data[4], clipX = data[4],
clipY = data[5], clipY = data[5],
label = data[6] or "", label = data[6] or "",
nstate = data[7] or state.passive, behaviour = data[7] or behaviour.normal,
cstate = data[8] or state.scared,
} }
end end

View File

@ -281,7 +281,7 @@ l_add_monster(lua_State *L)
{ {
Monster *monster; Monster *monster;
Map *map; Map *map;
int x, y, clip_x, clip_y, nstate, cstate; int x, y, clip_x, clip_y, behaviour;
const char *texture_path_1, *texture_path_2, *tmp_label; const char *texture_path_1, *texture_path_2, *tmp_label;
char *label; char *label;
Texture *texture1, *texture2; Texture *texture1, *texture2;
@ -301,17 +301,15 @@ l_add_monster(lua_State *L)
lua_getfield(L, 4, "stats"); lua_getfield(L, 4, "stats");
lua_getfield(L, 4, "clipX"); lua_getfield(L, 4, "clipX");
lua_getfield(L, 4, "clipY"); lua_getfield(L, 4, "clipY");
lua_getfield(L, 4, "nstate"); lua_getfield(L, 4, "behaviour");
lua_getfield(L, 4, "cstate");
tmp_label = luaL_checkstring(L, -8); tmp_label = luaL_checkstring(L, -7);
texture_path_1 = luaL_checkstring(L, -7); texture_path_1 = luaL_checkstring(L, -6);
texture_path_2 = luaL_checkstring(L, -6); texture_path_2 = luaL_checkstring(L, -5);
stats = lua_checkstats(L, -5); stats = lua_checkstats(L, -4);
clip_x = (int) luaL_checkinteger(L, -4); clip_x = (int) luaL_checkinteger(L, -3);
clip_y = (int) luaL_checkinteger(L, -3); clip_y = (int) luaL_checkinteger(L, -2);
nstate = (int) luaL_checkinteger(L, -2); behaviour = (int) luaL_checkinteger(L, -1);
cstate = (int) luaL_checkinteger(L, -1);
texture1 = texturecache_add(texture_path_1); texture1 = texturecache_add(texture_path_1);
texture2 = texturecache_add(texture_path_2); texture2 = texturecache_add(texture_path_2);
@ -328,7 +326,7 @@ l_add_monster(lua_State *L)
monster_update_pos(monster, (Position) { x, y }); monster_update_pos(monster, (Position) { x, y });
sprite_set_texture(monster->sprite, texture1, 0); sprite_set_texture(monster->sprite, texture1, 0);
sprite_set_texture(monster->sprite, texture2, 1); sprite_set_texture(monster->sprite, texture2, 1);
monster_set_states(monster, nstate, cstate); monster_set_behaviour(monster, behaviour);
if (strlen(label)) { if (strlen(label)) {
monster->label = label; monster->label = label;
monster->lclabel = to_lower(label); monster->lclabel = to_lower(label);

View File

@ -34,6 +34,82 @@
#include "actiontextbuilder.h" #include "actiontextbuilder.h"
#include "texturecache.h" #include "texturecache.h"
static void
monster_set_sprite_clip_for_current_state(Monster *m)
{
switch (m->state.current) {
case AGRESSIVE:
m->stateIndicator.sprite->clip = CLIP16(16 * 11, 16 * 3);
break;
case STATIONARY:
case PASSIVE:
m->stateIndicator.sprite->clip = CLIP16(16 * 10, 16);
break;
case SCARED:
m->stateIndicator.sprite->clip = CLIP16(16 * 12, 16 * 3);
break;
default:
break;
}
}
static void
monster_state_change(Monster *m, StateType newState)
{
if (m->state.current == newState)
return;
m->state.current = newState;
m->state.stepsSinceChange = 0;
m->stateIndicator.displayCount = 5;
monster_set_sprite_clip_for_current_state(m);
}
static void
monster_behaviour_check_post_hit(Monster *m)
{
switch (m->behaviour) {
case NORMAL:
monster_state_change(m, AGRESSIVE);
break;
case PACIFIST:
case COWARD:
monster_state_change(m, SCARED);
break;
default:
break;
}
}
static void
monster_behaviour_check_post_attack(Monster *m)
{
switch (m->behaviour) {
case GUERILLA:
monster_state_change(m, SCARED);
break;
default:
break;
}
}
static void
monster_behaviour_check(Monster *m, RoomMatrix *rm)
{
UNUSED(rm);
switch (m->behaviour) {
case GUERILLA:
if (m->state.stepsSinceChange > 8
&& m->state.current == SCARED) {
monster_state_change(m, AGRESSIVE);
}
break;
default:
break;
}
}
Monster* Monster*
monster_create(void) monster_create(void)
{ {
@ -61,7 +137,7 @@ monster_create(void)
m->stateIndicator.sprite->dim = GAME_DIMENSION; m->stateIndicator.sprite->dim = GAME_DIMENSION;
m->stateIndicator.displayCount = 0; m->stateIndicator.displayCount = 0;
m->stateIndicator.shownOnPlayerRoomEnter = false; m->stateIndicator.shownOnPlayerRoomEnter = false;
monster_set_states(m, PASSIVE, AGRESSIVE); monster_set_behaviour(m, NORMAL);
return m; return m;
} }
@ -98,6 +174,7 @@ has_collided(Monster *monster, RoomMatrix *matrix, Vector2d direction)
} else { } else {
gui_log("%s missed you", monster->label); gui_log("%s missed you", monster->label);
} }
monster_behaviour_check_post_attack(monster);
} }
return space->occupied || space->lethal; return space->occupied || space->lethal;
@ -239,6 +316,8 @@ monster_move(Monster *m, RoomMatrix *rm)
rm->spaces[monsterRoomPos.x][monsterRoomPos.y].occupied = false; rm->spaces[monsterRoomPos.x][monsterRoomPos.y].occupied = false;
rm->spaces[monsterRoomPos.x][monsterRoomPos.y].monster = NULL; rm->spaces[monsterRoomPos.x][monsterRoomPos.y].monster = NULL;
monster_behaviour_check(m, rm);
switch (m->state.current) { switch (m->state.current) {
case PASSIVE: case PASSIVE:
monster_drunk_walk(m, rm); monster_drunk_walk(m, rm);
@ -249,6 +328,9 @@ monster_move(Monster *m, RoomMatrix *rm)
case SCARED: case SCARED:
monster_coward_walk(m, rm); monster_coward_walk(m, rm);
break; break;
case STATIONARY:
default:
break;
}; };
monster_update_pos(m, m->sprite->pos); monster_update_pos(m, m->sprite->pos);
@ -261,6 +343,7 @@ monster_move(Monster *m, RoomMatrix *rm)
if (m->steps >= m->stats.speed) { if (m->steps >= m->stats.speed) {
if (m->stateIndicator.displayCount > 0) if (m->stateIndicator.displayCount > 0)
m->stateIndicator.displayCount -= 1; m->stateIndicator.displayCount -= 1;
m->state.stepsSinceChange += 1;
m->steps = 0; m->steps = 0;
return true; return true;
} }
@ -284,36 +367,6 @@ monster_update(Monster *m, UpdateData *data)
} }
} }
static void
monster_set_sprite_clip_for_current_state(Monster *m)
{
switch (m->state.current) {
case AGRESSIVE:
m->stateIndicator.sprite->clip = CLIP16(16 * 11, 16 * 3);
break;
case PASSIVE:
m->stateIndicator.sprite->clip = CLIP16(16 * 10, 16);
break;
case SCARED:
m->stateIndicator.sprite->clip = CLIP16(16 * 12, 16 * 3);
break;
default:
break;
}
}
static void
monster_state_change(Monster *m)
{
if (m->state.current == m->state.challenge)
return;
m->state.current = m->state.challenge;
m->stateIndicator.displayCount = 5;
monster_set_sprite_clip_for_current_state(m);
}
void void
monster_hit(Monster *monster, unsigned int dmg) monster_hit(Monster *monster, unsigned int dmg)
{ {
@ -333,8 +386,7 @@ monster_hit(Monster *monster, unsigned int dmg)
C_YELLOW, C_YELLOW,
&monster->sprite->pos); &monster->sprite->pos);
} }
monster_behaviour_check_post_hit(monster);
monster_state_change(monster);
} }
void void
@ -410,11 +462,21 @@ monster_render(Monster *m, Camera *cam)
} }
void void
monster_set_states(Monster *m, StateType normal, StateType challenge) monster_set_behaviour(Monster *m, MonsterBehaviour behaviour)
{ {
m->state.normal = normal; m->behaviour = behaviour;
m->state.current = normal; switch (behaviour) {
m->state.challenge = challenge; case HOSTILE:
case GUERILLA:
case COWARD:
m->state.current = AGRESSIVE;
break;
case PACIFIST:
case NORMAL:
default:
m->state.current = PASSIVE;
break;
}
monster_set_sprite_clip_for_current_state(m); monster_set_sprite_clip_for_current_state(m);
} }

View File

@ -28,12 +28,24 @@
struct UpdateData_t; struct UpdateData_t;
typedef enum { PASSIVE, AGRESSIVE, SCARED } StateType; typedef enum {
PACIFIST,
NORMAL,
HOSTILE,
GUERILLA,
COWARD
} MonsterBehaviour;
typedef enum {
PASSIVE,
AGRESSIVE,
SCARED,
STATIONARY
} StateType;
typedef struct { typedef struct {
StateType current; StateType current;
StateType normal; unsigned int stepsSinceChange;
StateType challenge;
} State; } State;
typedef struct MonsterStateIndicator { typedef struct MonsterStateIndicator {
@ -49,6 +61,7 @@ typedef struct Monster_t {
Stats stats; Stats stats;
State state; State state;
MonsterStateIndicator stateIndicator; MonsterStateIndicator stateIndicator;
MonsterBehaviour behaviour;
unsigned int steps; unsigned int steps;
} Monster; } Monster;
@ -76,7 +89,7 @@ void
monster_drop_loot(Monster*, Map*, Player*); monster_drop_loot(Monster*, Map*, Player*);
void void
monster_set_states(Monster *, StateType normal, StateType challenge); monster_set_behaviour(Monster *, MonsterBehaviour m);
void void
monster_destroy(Monster*); monster_destroy(Monster*);