Completes #42 Add boss 2 & 3
- Adds "The Shadow" - Adds the "assassin" behaviour - Adds some assassins to levels > 15
This commit is contained in:
parent
449cc362a0
commit
52913af237
|
@ -46,7 +46,8 @@ local behaviour = {
|
||||||
coward = 4,
|
coward = 4,
|
||||||
sentinel = 5,
|
sentinel = 5,
|
||||||
fire_demon = 6,
|
fire_demon = 6,
|
||||||
sorcerer = 7
|
sorcerer = 7,
|
||||||
|
assassin = 8
|
||||||
}
|
}
|
||||||
|
|
||||||
local stats = {
|
local stats = {
|
||||||
|
@ -239,12 +240,23 @@ for i=1,#orcs do
|
||||||
orcs[i] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, orcs[i])
|
orcs[i] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, orcs[i])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local assassins = {
|
||||||
|
{ stats.misc, 1*16, 6*16, "A Reaper", behaviour.assassin },
|
||||||
|
{ stats.misc, 0*16, 7*16, "An Assassin", behaviour.assassin },
|
||||||
|
{ stats.misc, 1*16, 7*16, "A Royal Assassin", behaviour.assassin },
|
||||||
|
}
|
||||||
|
for i=1,#assassins do
|
||||||
|
assassins[i] = concat({ texturePaths.undead0, texturePaths.undead1 }, assassins[i])
|
||||||
|
end
|
||||||
|
|
||||||
local bosses = {
|
local bosses = {
|
||||||
{ stats.boss, 16, 5*16, "The Hell Hound", behaviour.fire_demon, true },
|
{ stats.boss, 16, 5*16, "The Hell Hound", behaviour.fire_demon, true },
|
||||||
{ stats.boss, 16, 23*16, "The Cleric", behaviour.sorcerer, true },
|
{ stats.boss, 16, 23*16, "The Cleric", behaviour.sorcerer, true },
|
||||||
|
{ stats.boss, 16, 8*16, "The Shadow", behaviour.assassin, true },
|
||||||
}
|
}
|
||||||
bosses[1] = concat({ texturePaths.dog0, texturePaths.dog1 }, bosses[1])
|
bosses[1] = concat({ texturePaths.dog0, texturePaths.dog1 }, bosses[1])
|
||||||
bosses[2] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, bosses[2])
|
bosses[2] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, bosses[2])
|
||||||
|
bosses[3] = concat({ texturePaths.undead0, texturePaths.undead1 }, bosses[3])
|
||||||
|
|
||||||
local platino = {
|
local platino = {
|
||||||
{
|
{
|
||||||
|
@ -282,6 +294,7 @@ if(CURRENT_LEVEL > 0) then
|
||||||
enemies = {}
|
enemies = {}
|
||||||
enemies = concat(enemies, undead)
|
enemies = concat(enemies, undead)
|
||||||
enemies = concat(enemies, orcs)
|
enemies = concat(enemies, orcs)
|
||||||
|
enemies = concat(enemies, assassins)
|
||||||
elseif (CURRENT_LEVEL > 10) then
|
elseif (CURRENT_LEVEL > 10) then
|
||||||
enemies = {}
|
enemies = {}
|
||||||
enemies = concat(enemies, undead)
|
enemies = concat(enemies, undead)
|
||||||
|
|
|
@ -106,6 +106,7 @@ monster_behaviour_check_post_hit(Monster *m)
|
||||||
monster_state_change(m, SCARED);
|
monster_state_change(m, SCARED);
|
||||||
break;
|
break;
|
||||||
case GUERILLA:
|
case GUERILLA:
|
||||||
|
case ASSASSIN:
|
||||||
case SORCERER:
|
case SORCERER:
|
||||||
case FIRE_DEMON:
|
case FIRE_DEMON:
|
||||||
break;
|
break;
|
||||||
|
@ -115,6 +116,48 @@ monster_behaviour_check_post_hit(Monster *m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
damage_surroundings(Monster *m, RoomMatrix *rm)
|
||||||
|
{
|
||||||
|
Position roomPos = position_to_matrix_coords(&m->sprite->pos);
|
||||||
|
for (Sint32 i = -1; i <= 1; ++i) {
|
||||||
|
for (Sint32 j = -1; j <= 1; ++j) {
|
||||||
|
if (i == 0 && j == 0)
|
||||||
|
continue;
|
||||||
|
RoomSpace *r = &rm->spaces[roomPos.x + i][roomPos.y + j];
|
||||||
|
if (r->monster) {
|
||||||
|
int dmg = stats_fight(&m->stats, &r->monster->stats);
|
||||||
|
monster_hit(r->monster, dmg);
|
||||||
|
gui_log("%s takes %d damage from the explosion", r->monster->label, dmg);
|
||||||
|
} else if (r->player) {
|
||||||
|
int dmg = stats_fight(&m->stats, &r->player->stats);
|
||||||
|
player_hit(r->player, dmg);
|
||||||
|
gui_log("You take %d damage from the explosion", dmg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sorcerer_blast(Monster *m, RoomMatrix *rm)
|
||||||
|
{
|
||||||
|
gui_log("%s creates a magical explosion", m->label);
|
||||||
|
particle_engine_eldritch_explosion(m->sprite->pos, DIM(TILE_DIMENSION, TILE_DIMENSION));
|
||||||
|
|
||||||
|
damage_surroundings(m, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
assassin_cloak_effect(Monster *m, bool cloak)
|
||||||
|
{
|
||||||
|
if (cloak)
|
||||||
|
gui_log("%s dissappears from sight", m->label);
|
||||||
|
else
|
||||||
|
gui_log("%s reappears, filled with rage", m->label);
|
||||||
|
particle_engine_fire_explosion(m->sprite->pos, DIM(TILE_DIMENSION, TILE_DIMENSION));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
monster_behaviour_check_post_attack(Monster *m)
|
monster_behaviour_check_post_attack(Monster *m)
|
||||||
{
|
{
|
||||||
|
@ -124,6 +167,10 @@ monster_behaviour_check_post_attack(Monster *m)
|
||||||
case FIRE_DEMON:
|
case FIRE_DEMON:
|
||||||
monster_state_change(m, SCARED);
|
monster_state_change(m, SCARED);
|
||||||
break;
|
break;
|
||||||
|
case ASSASSIN:
|
||||||
|
assassin_cloak_effect(m, true);
|
||||||
|
monster_state_change(m, SCARED);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -163,6 +210,13 @@ monster_behaviour_check(Monster *m, RoomMatrix *rm)
|
||||||
monster_state_change(m, AGRESSIVE);
|
monster_state_change(m, AGRESSIVE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ASSASSIN:
|
||||||
|
if (m->state.stepsSinceChange > 5
|
||||||
|
&& m->state.current == SCARED) {
|
||||||
|
assassin_cloak_effect(m, false);
|
||||||
|
monster_state_change(m, AGRESSIVE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SENTINEL:
|
case SENTINEL:
|
||||||
handle_sentinel_behaviour(m, rm);
|
handle_sentinel_behaviour(m, rm);
|
||||||
break;
|
break;
|
||||||
|
@ -382,31 +436,6 @@ monster_coward_walk(Monster *m, RoomMatrix *rm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
sorcerer_blast(Monster *m, RoomMatrix *rm)
|
|
||||||
{
|
|
||||||
gui_log("%s creates a magical explosion", m->label);
|
|
||||||
particle_engine_eldritch_explosion(m->sprite->pos, DIM(TILE_DIMENSION, TILE_DIMENSION));
|
|
||||||
|
|
||||||
Position roomPos = position_to_matrix_coords(&m->sprite->pos);
|
|
||||||
for (Sint32 i = -1; i <= 1; ++i) {
|
|
||||||
for (Sint32 j = -1; j <= 1; ++j) {
|
|
||||||
if (i == 0 && j == 0)
|
|
||||||
continue;
|
|
||||||
RoomSpace *r = &rm->spaces[roomPos.x + i][roomPos.y + j];
|
|
||||||
if (r->monster) {
|
|
||||||
int dmg = stats_fight(&m->stats, &r->monster->stats);
|
|
||||||
monster_hit(r->monster, dmg);
|
|
||||||
gui_log("%s takes %d damage from the explosion", r->monster->label, dmg);
|
|
||||||
} else if (r->player) {
|
|
||||||
int dmg = stats_fight(&m->stats, &r->player->stats);
|
|
||||||
player_hit(r->player, dmg);
|
|
||||||
gui_log("You take %d damage from the explosion", dmg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
monster_move(Monster *m, RoomMatrix *rm, Map *map)
|
monster_move(Monster *m, RoomMatrix *rm, Map *map)
|
||||||
{
|
{
|
||||||
|
@ -644,6 +673,9 @@ monster_render(Monster *m, Camera *cam)
|
||||||
if (m->stats.hp <= 0)
|
if (m->stats.hp <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (m->behaviour == ASSASSIN && m->state.current != AGRESSIVE)
|
||||||
|
return;
|
||||||
|
|
||||||
sprite_render(m->sprite, cam);
|
sprite_render(m->sprite, cam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,6 +685,9 @@ monster_render_top_layer(Monster *m, Camera *cam)
|
||||||
if (m->stats.hp <= 0)
|
if (m->stats.hp <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (m->behaviour == ASSASSIN && m->state.current != AGRESSIVE)
|
||||||
|
return;
|
||||||
|
|
||||||
if (m->stateIndicator.displayCount != 0)
|
if (m->stateIndicator.displayCount != 0)
|
||||||
sprite_render(m->stateIndicator.sprite, cam);
|
sprite_render(m->stateIndicator.sprite, cam);
|
||||||
}
|
}
|
||||||
|
@ -664,6 +699,7 @@ monster_set_behaviour(Monster *m, MonsterBehaviour behaviour)
|
||||||
switch (behaviour) {
|
switch (behaviour) {
|
||||||
case HOSTILE:
|
case HOSTILE:
|
||||||
case GUERILLA:
|
case GUERILLA:
|
||||||
|
case ASSASSIN:
|
||||||
case SORCERER:
|
case SORCERER:
|
||||||
case COWARD:
|
case COWARD:
|
||||||
case FIRE_DEMON:
|
case FIRE_DEMON:
|
||||||
|
|
|
@ -36,7 +36,8 @@ typedef enum {
|
||||||
COWARD,
|
COWARD,
|
||||||
SENTINEL,
|
SENTINEL,
|
||||||
FIRE_DEMON,
|
FIRE_DEMON,
|
||||||
SORCERER
|
SORCERER,
|
||||||
|
ASSASSIN
|
||||||
} MonsterBehaviour;
|
} MonsterBehaviour;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
Loading…
Reference in New Issue