From e83efe35fa071e1f7f06a48bd68e16f6bff7d8d6 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Mon, 22 Dec 2025 14:26:35 +0100 Subject: [PATCH] the naga warrior now gives an axe as loot --- rogueviz/ru/classes.cpp | 14 +++++++++++++ rogueviz/ru/entity.cpp | 42 ++++++++++++++++++++++++++++++++++++++ rogueviz/ru/load-world.cpp | 6 ++++++ rogueviz/ru/map.ru | 5 ++++- rogueviz/ru/render.cpp | 1 + 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index 04f3a90f..cd2c5aa6 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -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}; } diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index ffe5935c..0a69de7f 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -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 (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; diff --git a/rogueviz/ru/load-world.cpp b/rogueviz/ru/load-world.cpp index b91c51c9..7533fa6f 100644 --- a/rogueviz/ru/load-world.cpp +++ b/rogueviz/ru/load-world.cpp @@ -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(); 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(); diff --git a/rogueviz/ru/map.ru b/rogueviz/ru/map.ru index 0f9c1d75..87f9386d 100644 --- a/rogueviz/ru/map.ru +++ b/rogueviz/ru/map.ru @@ -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 diff --git a/rogueviz/ru/render.cpp b/rogueviz/ru/render.cpp index 6212cb20..7b43dfa6 100644 --- a/rogueviz/ru/render.cpp +++ b/rogueviz/ru/render.cpp @@ -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);