Files
cc3k/src/enemies.cc

90 lines
2.5 KiB
C++

#include "enemies.h"
#include "constants.h"
#include "enemies/dragon.h"
#include "enemies/dwarf.h"
#include "enemies/elf.h"
#include "enemies/halfling.h"
#include "enemies/human.h"
#include "enemies/merchant.h"
#include "enemies/orc.h"
void new_dragon(RNG *rng, std::unique_ptr<enemy_base> &p,
const position &pos, const position &fallback,
const feature enabled_features, int which_room) {
const position nil{0, 0};
if (pos != nil)
p = std::make_unique<dragon>(rng, enabled_features,
pos, which_room);
else
p = std::make_unique<dragon>(rng, enabled_features,
fallback, which_room);
}
const int EXCNT = 6;
const race EXCHOICES[EXCNT] = {
rhuman, rdwarf, rhalfling, relf, rorc, rmerchant
};
const int CNT = 18;
const race CHOICES[CNT] = {
rhuman, rhuman, rhuman, rhuman,
rdwarf, rdwarf, rdwarf,
rhalfling, rhalfling, rhalfling, rhalfling, rhalfling,
relf, relf,
rorc, rorc,
rmerchant, rmerchant
};
enum race get_extra_race(RNG *rng) {
return EXCHOICES[rng->rand_under(EXCNT)];
}
enum race get_normal_race(RNG *rng) {
return CHOICES[rng->rand_under(CNT)];
}
void new_enemy(RNG *rng, std::unique_ptr<enemy_base> &p,
const position &pos, const feature enabled_features,
int which_room) {
using std::make_unique;
enum race r;
if (enabled_features & FEATURE_EXTRA_STUFF)
r = get_extra_race(rng);
else
r = get_normal_race(rng);
p = nullptr;
switch (r) {
case rdwarf:
p = make_unique<dwarf>(rng, enabled_features, pos, which_room);
break;
case rhuman:
p = make_unique<human>(rng, enabled_features, pos, which_room);
break;
case relf:
p = make_unique<elf>(rng, enabled_features, pos, which_room);
break;
case rorc:
p = make_unique<orc>(rng, enabled_features, pos, which_room);
break;
case rmerchant:
p = make_unique<merchant>(rng, enabled_features, pos, which_room);
break;
case rhalfling:
p = make_unique<halfling>(rng, enabled_features, pos, which_room);
break;
default:
break;
}
}