Replaced state logic with behaviours instead.
This commit is contained in:
parent
b905232d5e
commit
186cc7b514
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
136
src/monster.c
136
src/monster.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
Loading…
Reference in New Issue