Completes #8 First boss

- Adds "The Hell Hound" to level 5
This commit is contained in:
Linus Probert 2018-08-15 07:19:44 +02:00
parent 915ea59ca3
commit 6af8d9dd8f
9 changed files with 109 additions and 31 deletions

View File

@ -49,7 +49,11 @@ local function generate_path ()
local direction = 0 local direction = 0
local lastDirection = 0 local lastDirection = 0
local coridoor_count = 0 local coridoor_count = 0
local bossLevel = CURRENT_LEVEL % 5 == 0
local coverage = 9 + CURRENT_LEVEL local coverage = 9 + CURRENT_LEVEL
if bossLevel then
coverage = 5
end
-- Create the first room -- Create the first room
map_matrix[cx][cy] = room_builder.create_empty_room() map_matrix[cx][cy] = room_builder.create_empty_room()
@ -110,15 +114,23 @@ local function generate_path ()
map_matrix[cx][cy].goal = true map_matrix[cx][cy].goal = true
map_matrix[cx][cy].type = "room" map_matrix[cx][cy].type = "room"
local roomCount = 0
local bossAdded = false
-- Build all the rooms -- Build all the rooms
for i=1,10 do for i=1,10 do
for j=1,10 do for j=1,10 do
room = map_matrix[i][j] room = map_matrix[i][j]
if room then if room then
roomCount = roomCount + 1
room_builder.build_room(room) room_builder.build_room(room)
monster_gen.add_monsters_to_room(room, i-1, j-1) monster_gen.add_monsters_to_room(room, i-1, j-1)
trap_gen.add_traps_to_room(room, i-1, j-1) trap_gen.add_traps_to_room(room, i-1, j-1)
chest_gen.add_chests_to_room(room, i-1, j-1) chest_gen.add_chests_to_room(room, i-1, j-1)
if roomCount > 3 and bossLevel and not bossAdded then
bossAdded = true
monster_gen.add_boss_to_room(room, i-1, j-1)
end
end end
end end
end end

View File

@ -405,6 +405,7 @@ local function room_tile_available(room, rx, ry)
and not room.decor[rx][ry] and not room.decor[rx][ry]
and (room.tiles[rx][ry] and (room.tiles[rx][ry]
and not room.tiles[rx][ry][5] and not room.tiles[rx][ry][5]
and not room.tiles[rx][ry][7]
and not room.tiles[rx][ry][8]) and not room.tiles[rx][ry][8])
end end

View File

@ -44,7 +44,8 @@ local behaviour = {
hostile = 2, hostile = 2,
guerilla = 3, guerilla = 3,
coward = 4, coward = 4,
sentinel = 5 sentinel = 5,
fire_demon = 6
} }
local stats = { local stats = {
@ -83,6 +84,13 @@ local stats = {
def = 0, def = 0,
speed = 1 speed = 1
}, },
boss = {
hp = 60,
dmg = 4,
atk = 1,
def = 0,
speed = 1
},
platino = { platino = {
hp = 60, hp = 60,
dmg = 60, dmg = 60,
@ -137,49 +145,54 @@ end
local undead = { local undead = {
-- UNDEAD -- UNDEAD
{ stats.undead, 0, 32, "A Skeleton", behaviour.normal }; { stats.undead, 0, 32, "A Skeleton", behaviour.normal },
{ stats.undead, 48, 32, "A Black Skeleton", behaviour.normal }; { stats.undead, 48, 32, "A Black Skeleton", behaviour.normal },
{ stats.undead, 64, 32, "A Zombie", behaviour.normal }; { stats.undead, 64, 32, "A Zombie", behaviour.normal },
{ stats.undead, 80, 32, "A Zombie", behaviour.normal }; { stats.undead, 80, 32, "A Zombie", behaviour.normal }
} }
for i=1,#undead do for i=1,#undead do
undead[i] = concat({ texturePaths.undead0, texturePaths.undead1 }, undead[i]) undead[i] = concat({ texturePaths.undead0, texturePaths.undead1 }, undead[i])
end end
local dogs = { local dogs = {
{ stats.dog, 0, 16, "A Rabid Dog", behaviour.normal }; { stats.dog, 0, 16, "A Rabid Dog", behaviour.normal },
{ stats.dog, 16, 16, "An Angry Rabid Dog", behaviour.hostile }; { stats.dog, 16, 16, "An Angry Rabid Dog", behaviour.hostile }
} }
for i=1,#dogs do for i=1,#dogs do
dogs[i] = concat({ texturePaths.dog0, texturePaths.dog1 }, dogs[i]) dogs[i] = concat({ texturePaths.dog0, texturePaths.dog1 }, dogs[i])
end end
local reptile = { local reptile = {
{ stats.default, 0, 64, "A Small Brown Snake", behaviour.coward }; { stats.default, 0, 64, "A Small Brown Snake", behaviour.coward },
{ stats.default, 16, 64, "A Medium Brown Snake", behaviour.guerilla }; { stats.default, 16, 64, "A Medium Brown Snake", behaviour.guerilla },
{ stats.default, 32, 64, "A Large Brown Snake", behaviour.hostile }; { stats.default, 32, 64, "A Large Brown Snake", behaviour.hostile },
{ stats.default, 48, 64, "A Small Black Snake", behaviour.coward }; { stats.default, 48, 64, "A Small Black Snake", behaviour.coward },
{ stats.default, 64, 64, "A Medium Black Snake", behaviour.guerilla }; { stats.default, 64, 64, "A Medium Black Snake", behaviour.guerilla },
{ stats.default, 80, 64, "A Large Black Snake", behaviour.hostile }; { stats.default, 80, 64, "A Large Black Snake", behaviour.hostile },
} }
for i=1,#reptile do for i=1,#reptile do
reptile[i] = concat({ texturePaths.reptile0, texturePaths.reptile1 }, reptile[i]) reptile[i] = concat({ texturePaths.reptile0, texturePaths.reptile1 }, reptile[i])
end end
local demon = { local demon = {
{ stats.default, 0, 0, "A Demon", behaviour.hostile }; { stats.default, 0, 0, "A Demon", behaviour.hostile },
{ stats.default, 16, 0, "A Demon", behaviour.hostile }; { stats.default, 16, 0, "A Demon", behaviour.hostile },
{ stats.default, 32, 0, "A Demon", behaviour.hostile }; { stats.default, 32, 0, "A Demon", behaviour.hostile },
{ stats.default, 48, 0, "A Demon", behaviour.hostile }; { stats.default, 48, 0, "A Demon", behaviour.hostile },
{ stats.default, 64, 0, "A Demon", behaviour.hostile }; { stats.default, 64, 0, "A Demon", behaviour.hostile },
{ stats.default, 80, 0, "A Demon", behaviour.hostile }; { stats.default, 80, 0, "A Demon", behaviour.hostile },
{ stats.default, 96, 0, "A Demon", behaviour.hostile }; { stats.default, 96, 0, "A Demon", behaviour.hostile },
{ stats.default, 112, 0, "A Demon", behaviour.hostile }; { stats.default, 112, 0, "A Demon", behaviour.hostile },
} }
for i=1,#demon do for i=1,#demon do
demon[i] = concat({ texturePaths.demon0, texturePaths.demon1 }, demon[i]) demon[i] = concat({ texturePaths.demon0, texturePaths.demon1 }, demon[i])
end end
local bosses = {
{ stats.boss, 16, 5*16, "The Hell Hound", behaviour.fire_demon, true }
}
bosses[1] = concat({ texturePaths.dog0, texturePaths.dog1 }, bosses[1])
local platino = { local platino = {
{ {
texturePaths.reptile0, texturePaths.reptile0,
@ -201,6 +214,7 @@ local function repack(data)
clipY = data[5], clipY = data[5],
label = data[6] or "", label = data[6] or "",
behaviour = data[7] or behaviour.normal, behaviour = data[7] or behaviour.normal,
boss = data[8] or false,
} }
end end
@ -239,7 +253,7 @@ if(CURRENT_LEVEL > 0 and CURRENT_LEVEL < 10) then
end end
if random(100) == 1 then if random(100) == 1 then
enemies = concat(enemies, platino); enemies = concat(enemies, platino)
end end
function module.add_monsters_to_room(room, roomx, roomy) function module.add_monsters_to_room(room, roomx, roomy)
@ -264,6 +278,25 @@ function module.add_monsters_to_room(room, roomx, roomy)
end end
end end
function module.add_boss_to_room(room, roomx, roomy)
local boss = bosses[1]
local success = false
while not success do
local rx = random(13) + 1
local ry = random(9) + 1
if room_builder.is_tile_avilable(room, rx, ry) then
local x = (roomx * 512) + rx * 32
local y = (roomy * 384) + ry * 32
room.monsters[rx][ry] = {
x,
y,
boss
}
success = true
end
end
end
function module.load_monsters(map, monsters) function module.load_monsters(map, monsters)
for i=0,15 do for i=0,15 do
for j=0,11 do for j=0,11 do

View File

@ -216,6 +216,14 @@ startGame(void *unused)
player_destroy(gPlayer); player_destroy(gPlayer);
gPlayer = player_create(WARRIOR, gRenderer); gPlayer = player_create(WARRIOR, gRenderer);
mixer_play_music(GAME_MUSIC0 + get_random(2)); mixer_play_music(GAME_MUSIC0 + get_random(2));
#ifdef DEBUG
// This block is for testing
cLevel = 1;
if (cLevel % 5 == 0)
mixer_play_music(BOSS_MUSIC0);
for (size_t i = 1; i < cLevel; ++i)
player_levelup(gPlayer);
#endif // DEBUG
resetGame(); resetGame();
gui_clear_message_log(); gui_clear_message_log();
gui_log("The Dungeon Crawl begins!"); gui_log("The Dungeon Crawl begins!");

View File

@ -358,6 +358,7 @@ l_add_monster(lua_State *L)
int x, y, clip_x, clip_y, behaviour; 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;
bool boss;
Texture *texture1, *texture2; Texture *texture1, *texture2;
Stats stats; Stats stats;
@ -376,14 +377,16 @@ l_add_monster(lua_State *L)
lua_getfield(L, 4, "clipX"); lua_getfield(L, 4, "clipX");
lua_getfield(L, 4, "clipY"); lua_getfield(L, 4, "clipY");
lua_getfield(L, 4, "behaviour"); lua_getfield(L, 4, "behaviour");
lua_getfield(L, 4, "boss");
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, -4); stats = lua_checkstats(L, -5);
clip_x = (int) luaL_checkinteger(L, -3); clip_x = (int) luaL_checkinteger(L, -4);
clip_y = (int) luaL_checkinteger(L, -2); clip_y = (int) luaL_checkinteger(L, -3);
behaviour = (int) luaL_checkinteger(L, -1); behaviour = (int) luaL_checkinteger(L, -2);
boss = (bool) lua_toboolean(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);
@ -404,6 +407,7 @@ l_add_monster(lua_State *L)
} }
monster->stats = stats; monster->stats = stats;
monster->boss = boss;
map_add_monster(map, monster); map_add_monster(map, monster);

View File

@ -199,6 +199,7 @@ monster_create(void)
m->stateIndicator.displayCount = 0; m->stateIndicator.displayCount = 0;
m->stateIndicator.shownOnPlayerRoomEnter = false; m->stateIndicator.shownOnPlayerRoomEnter = false;
m->state.forceCount = 0; m->state.forceCount = 0;
m->boss = false;
monster_set_behaviour(m, NORMAL); monster_set_behaviour(m, NORMAL);
return m; return m;
@ -532,6 +533,15 @@ monster_drop_loot(Monster *monster, Map *map, Player *player)
unsigned int item_count = 0; unsigned int item_count = 0;
bool player_full_health = player->stats.hp >= player->stats.maxhp; bool player_full_health = player->stats.hp >= player->stats.maxhp;
if (monster->boss) {
Artifact *a = artifact_create_random(player, 2);
a->sprite->pos = monster->sprite->pos;
linkedlist_append(&map->artifacts, a);
Item *treasure = item_builder_build_item(TREASURE, map->level*2);
treasure->sprite->pos = monster->sprite->pos;
linkedlist_append(&map->items, treasure);
}
if (get_random(19) == 0) { if (get_random(19) == 0) {
Artifact *a = artifact_create_random(player, 1); Artifact *a = artifact_create_random(player, 1);
a->sprite->pos = monster->sprite->pos; a->sprite->pos = monster->sprite->pos;

View File

@ -70,6 +70,7 @@ typedef struct Monster {
MonsterStateIndicator stateIndicator; MonsterStateIndicator stateIndicator;
MonsterBehaviour behaviour; MonsterBehaviour behaviour;
unsigned int steps; unsigned int steps;
bool boss;
} Monster; } Monster;
Monster* monster_create(void); Monster* monster_create(void);

View File

@ -295,8 +295,6 @@ void roommatrix_destroy(RoomMatrix *m)
linkedlist_pop(&space->items); linkedlist_pop(&space->items);
while (space->artifacts) while (space->artifacts)
linkedlist_pop(&space->artifacts); linkedlist_pop(&space->artifacts);
while (space->objects)
linkedlist_pop(&space->objects);
} }
} }

View File

@ -35,11 +35,22 @@
#define info(...) do {} while(0) #define info(...) do {} while(0)
#endif // DEBUG #endif // DEBUG
#define error(...) log_print(stderr, "ERROR", __FNAME__, __LINE__, __func__, __VA_ARGS__) #define error(...) log_print(stderr, "ERROR", __FNAME__, __LINE__, __func__, __VA_ARGS__)
#ifdef DEBUG
#define fatal(...) \
{ \
log_print(stderr, "FATAL", __FNAME__, __LINE__, __func__, __VA_ARGS__); \
printf("\n- Press any key to close -\n"); \
getchar(); \
exit(-1); \
}
#else
#define fatal(...) \ #define fatal(...) \
{ \ { \
log_print(stderr, "FATAL", __FNAME__, __LINE__, __func__, __VA_ARGS__); \ log_print(stderr, "FATAL", __FNAME__, __LINE__, __func__, __VA_ARGS__); \
exit(-1); \ exit(-1); \
} }
#endif // DEBUG
void void
log_print(FILE *out, log_print(FILE *out,