Added monster stats generation to lua.

This commit is contained in:
Linus_Probert 2018-02-20 14:22:26 +01:00
parent 548eecf3c0
commit 94363a2e95
5 changed files with 194 additions and 63 deletions

View File

@ -43,41 +43,79 @@ local state = {
scared = 2, scared = 2,
} }
local stats = {
default = {
hp = 12,
dmg = 2,
atk = 0,
def = 0,
speed = 1
},
pest = {
hp = 6,
dmg = 1,
atk = 0,
def = 0,
speed = 1
},
dog = {
hp = 12,
dmg = 2,
atk = 0,
def = 0,
speed = 1
},
undead = {
hp = 24,
dmg = 1,
atk = 0,
def = 0,
speed = 1
},
platino = {
hp = 60,
dmg = 60,
atk = 60,
def = 60,
speed = 3
}
}
local pests = { local pests = {
-- PESTS -- PESTS
{ texturePaths.pest0, texturePaths.pest1, 0, 0, "A Beetle" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 0, "A Beetle" },
{ texturePaths.pest0, texturePaths.pest1, 16, 0, "A Beetle" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 0, "A Beetle" },
{ texturePaths.pest0, texturePaths.pest1, 32, 0, "A Beetle" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 0, "A Beetle" },
{ texturePaths.pest0, texturePaths.pest1, 48, 0, "A Beetle" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 0, "A Beetle" },
{ texturePaths.pest0, texturePaths.pest1, 64, 0, "A Large Grub" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 0, "A Large Grub" },
{ texturePaths.pest0, texturePaths.pest1, 80, 0, "A Small Grub" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 0, "A Small Grub" },
{ texturePaths.pest0, texturePaths.pest1, 96, 0, "A Slim Worm" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 96, 0, "A Slim Worm" },
{ texturePaths.pest0, texturePaths.pest1, 112, 0, "A Fat Worm" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 112, 0, "A Fat Worm" },
--{ texturePaths.pest0, texturePaths.pest1, 0, 16, "Female Dragonfly" }, --{ texturePaths.pest0, texturePaths.pest1, 0, 16, "Female Dragonfly" },
{ texturePaths.pest0, texturePaths.pest1, 16, 16, "A Fly" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 16, "A Fly" },
{ texturePaths.pest0, texturePaths.pest1, 32, 16, "A Larva" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 16, "A Larva" },
{ texturePaths.pest0, texturePaths.pest1, 48, 16, "A Moth" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 16, "A Moth" },
--{ texturePaths.pest0, texturePaths.pest1, 64, 16 }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 16 },
{ texturePaths.pest0, texturePaths.pest1, 80, 16, "A Gnat" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 16, "A Gnat" },
{ texturePaths.pest0, texturePaths.pest1, 0, 32, "A Small Spider" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 32, "A Small Spider" },
{ texturePaths.pest0, texturePaths.pest1, 16, 32, "A Medium Spider" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 32, "A Medium Spider" },
{ texturePaths.pest0, texturePaths.pest1, 32, 32, "A Large Spider" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 32, "A Large Spider" },
{ texturePaths.pest0, texturePaths.pest1, 48, 32, "A Small Scorpion" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 32, "A Small Scorpion" },
{ texturePaths.pest0, texturePaths.pest1, 64, 32, "A Medium Scorpion" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 32, "A Medium Scorpion" },
{ texturePaths.pest0, texturePaths.pest1, 80, 32, "A Large Scorpion" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 80, 32, "A Large Scorpion" },
{ texturePaths.pest0, texturePaths.pest1, 0, 48, "A Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 48, "A Slug" },
{ texturePaths.pest0, texturePaths.pest1, 16, 48, "A Large Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 48, "A Large Slug" },
--{ texturePaths.pest0, texturePaths.pest1, 32, 48 }, --{ texturePaths.pest0, texturePaths.pest1, 32, 48 },
{ texturePaths.pest0, texturePaths.pest1, 48, 48, "A Red Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 48, "A Red Slug" },
{ texturePaths.pest0, texturePaths.pest1, 64, 48, "A Large Red Slug" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 64, 48, "A Large Red Slug" },
{ texturePaths.pest0, texturePaths.pest1, 0, 64, "A Giant Brown Ant" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 0, 64, "A Giant Brown Ant" },
{ texturePaths.pest0, texturePaths.pest1, 16, 64, "A Giant Black Ant" }, { texturePaths.pest0, texturePaths.pest1, stats.pest, 16, 64, "A Giant Black Ant" },
{ texturePaths.pest0, texturePaths.pest1, 32, 64, "A Giant Gold Ant" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 32, 64, "A Giant Gold Ant" },
{ texturePaths.pest0, texturePaths.pest1, 48, 64, "A Giant Silver Ant" }, --{ texturePaths.pest0, texturePaths.pest1, stats.pest, 48, 64, "A Giant Silver Ant" },
--{ texturePaths.pest0, texturePaths.pest1, 0, 80 }, --{ texturePaths.pest0, texturePaths.pest1, 0, 80 },
--{ texturePaths.pest0, texturePaths.pest1, 16, 80 }, --{ texturePaths.pest0, texturePaths.pest1, 16, 80 },
@ -114,25 +152,43 @@ local undead = {
--{ texturePaths.undead0, texturePaths.undead1, 96, 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, 112, 16, "", state.passive, state.agressive };
{ texturePaths.undead0, texturePaths.undead1, 0, 32, "A Skeleton", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 0, 32, "A Skeleton", state.passive, state.agressive };
{ texturePaths.undead0, texturePaths.undead1, 16, 32, "An Umber Skeleton", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 16, 32, "An Umber Skeleton", state.passive, state.agressive };
{ texturePaths.undead0, texturePaths.undead1, 32, 32, "A Caustic Skeleton", state.passive, state.agressive }; --{ texturePaths.undead0, texturePaths.undead1, 32, 32, "A Caustic Skeleton", state.passive, state.agressive };
{ texturePaths.undead0, texturePaths.undead1, 48, 32, "A Black Skeleton", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 48, 32, "A Black Skeleton", state.passive, state.agressive };
--{ texturePaths.undead0, texturePaths.undead1, 64, 32, "", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 64, 32, "A Zombie", state.passive, state.agressive };
--{ texturePaths.undead0, texturePaths.undead1, 80, 32, "", state.passive, state.agressive }; { texturePaths.undead0, texturePaths.undead1, stats.undead, 80, 32, "A Zombie", state.passive, state.agressive };
--{ texturePaths.undead0, texturePaths.undead1, 96, 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 }; --{ texturePaths.undead0, texturePaths.undead1, 112, 32, "", state.passive, state.scared };
} }
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, "An Angry Rabid Dog", state.agressive, state.agressive };
}
local reptile = {
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 0, 64, "A Small Brown Snake", state.passive, state.agressive };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 16, 64, "A Medium Brown Snake", state.passive, state.agressive };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 32, 64, "A Large Brown Snake", state.passive, state.agressive };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 48, 64, "A Small Black Snake", state.agressive, state.agressive };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 64, 64, "A Medium Black Snake", state.agressive, state.agressive };
{ texturePaths.reptile0, texturePaths.reptile1, stats.default, 80, 64, "A Large Black Snake", state.agressive, state.agressive };
}
local platino = {
{ texturePaths.reptile0, texturePaths.reptile1, stats.platino, 48, 12*16, "Platino", state.agressive, state.agressive };
}
local demon = { local demon = {
{ texturePaths.demon0, texturePaths.demon1, 0, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 0, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 16, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 16, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 32, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 32, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 48, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 48, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 64, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 64, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 80, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 80, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 96, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 96, 0, "A Demon", state.agressive, state.agressive };
{ texturePaths.demon0, texturePaths.demon1, 112, 0, "A Demon", state.agressive, state.agressive }; { texturePaths.demon0, texturePaths.demon1, stats.default, 112, 0, "A Demon", state.agressive, state.agressive };
} }
local function concat(table1, table2) local function concat(table1, table2)
@ -146,11 +202,12 @@ local function repack(data)
return { return {
texturePath1 = data[1], texturePath1 = data[1],
texturePath2 = data[2], texturePath2 = data[2],
clipX = data[3], stats = data[3],
clipY = data[4], clipX = data[4],
label = data[5] or "", clipY = data[5],
nstate = data[6] or state.passive, label = data[6] or "",
cstate = data[7] or state.scared, nstate = data[7] or state.passive,
cstate = data[8] or state.scared,
} }
end end
@ -159,17 +216,34 @@ local enemies = {}
if(CURRENT_LEVEL > 0 and CURRENT_LEVEL < 10) then if(CURRENT_LEVEL > 0 and CURRENT_LEVEL < 10) then
if (CURRENT_LEVEL == 1) then if (CURRENT_LEVEL == 1) then
enemies = concat(enemies, pests) enemies = concat(enemies, pests)
enemies = concat(enemies, dogs)
elseif (CURRENT_LEVEL > 5) then
enemies = {}
enemies = concat(enemies, demon)
enemies = concat(enemies, undead) enemies = concat(enemies, undead)
enemies = concat(enemies, reptile)
elseif (CURRENT_LEVEL > 3) then
enemies = {}
enemies = concat(enemies, undead)
enemies = concat(enemies, reptile)
enemies = concat(enemies, dogs)
elseif (CURRENT_LEVEL > 2) then elseif (CURRENT_LEVEL > 2) then
enemies = {} enemies = {}
enemies = concat(enemies, undead) enemies = concat(enemies, undead)
enemies = concat(enemies, demon) enemies = concat(enemies, reptile)
enemies = concat(enemies, dogs)
elseif (CURRENT_LEVEL > 1) then elseif (CURRENT_LEVEL > 1) then
enemies = {} enemies = {}
enemies = concat(enemies, undead) enemies = concat(enemies, undead)
enemies = concat(enemies, reptile)
enemies = concat(enemies, dogs)
end end
end end
if random(100) == 1 then
enemies = concat(enemies, platino);
end
function module.add_monster_to_room(map, roomx, roomy) function module.add_monster_to_room(map, roomx, roomy)
local count = random(3) local count = random(3)
for i=0,count do for i=0,count do

View File

@ -27,6 +27,7 @@
#include "map_lua.h" #include "map_lua.h"
#include "util.h" #include "util.h"
#include "stats.h"
static static
lua_State* load_lua_state(void) lua_State* load_lua_state(void)
@ -150,7 +151,7 @@ extract_tile_data(lua_State *L,
levelExit = lua_toboolean(L, -1); levelExit = lua_toboolean(L, -1);
// Clear the stack // Clear the stack
lua_pop(L, 6); lua_pop(L, 7);
Position tilePos = (Position) { tile_x, tile_y }; Position tilePos = (Position) { tile_x, tile_y };
SDL_Rect clip = (SDL_Rect) { tile_clip_x, tile_clip_y, 16, 16 }; SDL_Rect clip = (SDL_Rect) { tile_clip_x, tile_clip_y, 16, 16 };
@ -166,6 +167,40 @@ extract_tile_data(lua_State *L,
f_add_tile(map, &tilePos, tile); f_add_tile(map, &tilePos, tile);
} }
static Stats
lua_checkstats(lua_State *L, int index)
{
debug("Reading stats: %d", index);
// Confirm table
luaL_checktype(L, index, LUA_TTABLE);
// Push to top of stack
lua_pushvalue(L, index);
// Stack: -1 => table
int tableIndex = lua_gettop(L);
debug("Table index: %d", tableIndex);
lua_getfield(L, tableIndex, "hp");
lua_getfield(L, tableIndex, "dmg");
lua_getfield(L, tableIndex, "atk");
lua_getfield(L, tableIndex, "def");
lua_getfield(L, tableIndex, "speed");
int hp = luaL_checkinteger(L, -5);
int dmg = luaL_checkinteger(L, -4);
int atk = luaL_checkinteger(L, -3);
int def = luaL_checkinteger(L, -2);
int speed = luaL_checkinteger(L, -1);
// Reset the stack
lua_pop(L, 6);
Stats stats = { hp, hp, dmg, atk, def, speed, 1 };
return stats;
}
static static
int l_tile_occupied(lua_State *L) int l_tile_occupied(lua_State *L)
{ {
@ -217,6 +252,7 @@ l_add_monster(lua_State *L)
char *label; char *label;
Texture *texture1, *texture2; Texture *texture1, *texture2;
SDL_Renderer *renderer; SDL_Renderer *renderer;
Stats stats;
renderer = luaL_checksdlrenderer(L); renderer = luaL_checksdlrenderer(L);
map = luaL_checkmap(L, 1); map = luaL_checkmap(L, 1);
@ -230,14 +266,16 @@ l_add_monster(lua_State *L)
lua_getfield(L, 4, "label"); lua_getfield(L, 4, "label");
lua_getfield(L, 4, "texturePath1"); lua_getfield(L, 4, "texturePath1");
lua_getfield(L, 4, "texturePath2"); lua_getfield(L, 4, "texturePath2");
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, "nstate");
lua_getfield(L, 4, "cstate"); lua_getfield(L, 4, "cstate");
tmp_label = luaL_checkstring(L, -7); tmp_label = luaL_checkstring(L, -8);
texture_path_1 = luaL_checkstring(L, -6); texture_path_1 = luaL_checkstring(L, -7);
texture_path_2 = luaL_checkstring(L, -5); texture_path_2 = luaL_checkstring(L, -6);
stats = lua_checkstats(L, -5);
clip_x = (int) luaL_checkinteger(L, -4); clip_x = (int) luaL_checkinteger(L, -4);
clip_y = (int) luaL_checkinteger(L, -3); clip_y = (int) luaL_checkinteger(L, -3);
nstate = (int) luaL_checkinteger(L, -2); nstate = (int) luaL_checkinteger(L, -2);
@ -251,7 +289,7 @@ l_add_monster(lua_State *L)
texture1->dim = (Dimension) { TILE_DIMENSION, TILE_DIMENSION }; texture1->dim = (Dimension) { TILE_DIMENSION, TILE_DIMENSION };
texture2->dim = (Dimension) { TILE_DIMENSION, TILE_DIMENSION }; texture2->dim = (Dimension) { TILE_DIMENSION, TILE_DIMENSION };
lua_pop(L, 6); lua_pop(L, 8);
monster = monster_create(renderer); monster = monster_create(renderer);
monster->sprite->clip = (SDL_Rect) { clip_x, clip_y, 16, 16 }; monster->sprite->clip = (SDL_Rect) { clip_x, clip_y, 16, 16 };
@ -266,6 +304,8 @@ l_add_monster(lua_State *L)
monster->lclabel = to_lower(label); monster->lclabel = to_lower(label);
} }
monster->stats = stats;
map_add_monster(map, monster); map_add_monster(map, monster);
return 0; return 0;

View File

@ -54,7 +54,17 @@ monster_create(SDL_Renderer *renderer)
Monster *m = ec_malloc(sizeof(Monster)); Monster *m = ec_malloc(sizeof(Monster));
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) { 12, 12, 1, 0, 0, 1, 1 };
m->stats = (Stats) {
12, // Max HP
12, // hp
2, // dmg
0, // atk
0, // def
1, // speed
1 // lvl
};
m->state.normal = PASSIVE; m->state.normal = PASSIVE;
m->state.challenge = AGRESSIVE; m->state.challenge = AGRESSIVE;
m->state.current = m->state.normal; m->state.current = m->state.normal;

View File

@ -30,11 +30,11 @@
#include "mixer.h" #include "mixer.h"
#include "random.h" #include "random.h"
#define ENGINEER_STATS { 12, 12, 5, 7, 2, 1, 1 } #define ENGINEER_STATS { 12, 12, 5, 7, 2, 2, 1 }
#define MAGE_STATS { 12, 12, 5, 7, 2, 1, 1 } #define MAGE_STATS { 12, 12, 5, 7, 1, 2, 1 }
#define PALADIN_STATS { 12, 12, 8, 9, 2, 1, 1 } #define PALADIN_STATS { 12, 12, 8, 9, 3, 1, 1 }
#define ROGUE_STATS { 12, 12, 5, 7, 3, 2, 1 } #define ROGUE_STATS { 12, 12, 5, 7, 1, 2, 1 }
#define WARRIOR_STATS { 12, 12, 8, 9, 2, 1, 1 } #define WARRIOR_STATS { 12, 12, 8, 9, 3, 1, 1 }
static void static void
player_levelup(Player *player) player_levelup(Player *player)
@ -42,10 +42,9 @@ player_levelup(Player *player)
mixer_play_effect(LEVEL_UP); mixer_play_effect(LEVEL_UP);
player->stats.lvl += 1; player->stats.lvl += 1;
player->stats.maxhp += 3; player->stats.maxhp += 9;
player->stats.dmg += 5; player->stats.dmg += 5;
player->stats.atk += 1; player->stats.atk += 1;
player->stats.def += 1;
// Limit health to 3 rows of hearts // Limit health to 3 rows of hearts
if (player->stats.maxhp > 72) if (player->stats.maxhp > 72)

View File

@ -21,6 +21,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <SDL2/SDL_ttf.h> #include <SDL2/SDL_ttf.h>
#include "gui.h"
#include "stats.h" #include "stats.h"
#include "random.h" #include "random.h"
#include "util.h" #include "util.h"
@ -42,10 +43,17 @@ stats_fight(Stats *attacker, Stats *defender)
debug("-----------[ FIGHT ]---------"); debug("-----------[ FIGHT ]---------");
debug("Attacking: %d Defending: %d", atkRoll, defRoll); debug("Attacking: %d Defending: %d", atkRoll, defRoll);
if (atkRoll > defRoll) { if (atkRoll >= defRoll) {
dmgRoll = get_random(attacker->dmg - 1) + 1; if (attacker->dmg > 0)
if (critical) dmgRoll = get_random(attacker->dmg) + 1;
else
dmgRoll = get_random(attacker->dmg - 1) + 1;
if (critical) {
dmgRoll = dmgRoll * 2; dmgRoll = dmgRoll * 2;
gui_log("You have scored a critical hit");
}
defender->hp -= dmgRoll; defender->hp -= dmgRoll;
} }