1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2026-03-12 16:19:43 +00:00

the naga warrior now gives an axe as loot

This commit is contained in:
Zeno Rogue
2025-12-22 14:26:35 +01:00
parent b291d4a146
commit e83efe35fa
5 changed files with 67 additions and 1 deletions

View File

@@ -660,6 +660,20 @@ struct disnake : public snake {
virtual void hs(stater& s) override { snake::hs(s); s.act("respawn", respawn, {0, 0}); }
};
struct naga_warrior : public snake {
string glyph() override { return "N"; }
color_t color() override { return 0x20D020FF; }
string get_name() override { return "naga warrior"; }
string get_help() override { return "A nasty snake, wielding an axe."; }
int base_xp() override { return 200; }
int max_hp() override { return 500; }
xy siz() override { return {25, 25}; }
void act() override;
void attacked(int s) override;
void draw() override;
virtual int chop() { return 32; }
};
struct kestrel : public enemy {
xy respawn_vel;
xy siz() override { return {10, 10}; }

View File

@@ -533,6 +533,48 @@ void snake::attacked(int dmg) {
if(where.x > m.where.x) vel.x = +abs(vel.x);
}
void naga_warrior::act() {
stay_on_screen();
kino();
if(on_floor) {
auto dat = get_dat();
if(abs(vel.x) < 1e-6) {
dir = -dir;
}
vel.x = zero_vel.x + dat.d * dat.modv * dir;
}
if(gmod(gframeid, 100) == 0) {
bbox b = get_pixel_bbox_at(xy{where.x + dir * dsiz().x, where.y});
if(intersect(b, m.get_pixel_bbox()) && gframeid > invinc_end) {
if(m.reduce_hp(chop())) addMessage("The " + get_name() + " chops you!");
}
}
if(intersect(get_pixel_bbox(), m.get_pixel_bbox()) && gframeid > invinc_end) {
if(m.reduce_hp(bite())) addMessage("The " + get_name() + " bites you!");
}
}
void naga_warrior::draw() {
entity::draw();
int t = gmod(gframeid, 100);
if(t <= 50) {
bbox b = get_pixel_bbox_at(xy{where.x + dir * (1-0.01 * t) * dsiz().x, where.y});
auto col = 0xFFFFFFFF;
auto& alpha = part(col, 0);
alpha = max<int> (0, alpha - 5 * t);
asciiletter(
b.minx, b.miny,
b.maxx, b.maxy,
dir == -1 ? "(" : ")", col
);
}
}
void naga_warrior::attacked(int dmg) {
enemy::attacked(dmg); // do not reverse on being attacked!
}
void hint::act() {
bool cur = intersect(get_pixel_bbox(), m.get_pixel_bbox());
if(gframeid < 300) cur = 0;

View File

@@ -274,6 +274,12 @@ void load_room(fhstream& f, cell *c) {
b->respawn_dir = get_int();
r.entities.emplace_back(std::move(b));
}
else if(cap == "NAGA") {
auto b = std::make_unique<naga_warrior>(); nam(*b);
b->respawn = get_xy();
b->respawn_dir = get_int();
r.entities.emplace_back(std::move(b));
}
else if(cap == "FERRIS") {
ld cx = get_ld(), cy = get_ld(), radius = get_ld(); int qty = get_int();

View File

@@ -2828,7 +2828,10 @@ MAP
#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b
################################################################################
#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b
SNAKE Axeman 300 200 1
NAGA Axer 300 200 1
LOOT 1
axe
This axe is a powerful weapon!
OK
MOVE 4 Guinea Pig Pen

View File

@@ -207,6 +207,7 @@ void init_scales() {
letterscales[')'] = euscale(2.5, 1);
letterscales['('] = euscale(2.5, 1);
letterscales['F'] = euscale(2.1, 1.3);
letterscales['N'] = euscale(1.6, 1.3);
letterscales['C'] = euscale(1.8, 1.3);
letterscales['f'] = euscale(2.5, 1.3);
letterscales['/'] = euscale(4, 1.2);