From b0d52f4aeee882c61121a8dfe9128175ceaa641f Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 16 May 2025 16:51:43 +0200 Subject: [PATCH] ru:: frogs and giant frogs and giant frog cave --- rogueviz/ru/classes.cpp | 25 ++++++++++ rogueviz/ru/entity.cpp | 54 +++++++++++++++++++++ rogueviz/ru/map.ru | 102 ++++++++++++++++++++++++++++++++++++++++ rogueviz/ru/render.cpp | 1 + rogueviz/ru/save.cpp | 12 +++++ 5 files changed, 194 insertions(+) diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index 71378c61..d1fa47e2 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -381,6 +381,31 @@ struct boar : public enemy { int max_hp() { return 60; } }; +struct frog : public enemy { + int jphase, jump_at; + xy siz() override { return {10, 10}; } + string glyph() override { return "F"; } + virtual ld maxvel() { return 3; } + ld maxrange() { return 50; } + color_t color() override { return 0x208020FF; } + void act() override; + void attacked(int s) override; + string get_name() override { return "frog"; } + string get_help() override { return "What a nice frog."; } + int base_xp() { return 30; } + int max_hp() { return 30; } + }; + +struct giantfrog : public frog { + int jphase, jump_at; + xy siz() override { return {36, 36}; } + string get_name() override { return "giant frog"; } + string get_help() override { return "Beware their jumps."; } + int base_xp() { return 200; } + int max_hp() { return 200; } + ld maxvel() { return 5; } + }; + struct ghost : public enemy { int xp, hp; bool flipped; diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index dda60d4d..956ce772 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -320,6 +320,60 @@ void boar::attacked(int dmg) { if(on_floor) vel.x = dat.d * dat.modv * s * 2, vel.y = -dat.d * dat.modv * 2.5; } +void frog::act() { + stay_on_screen(); + kino(); + if(intersect(get_pixel_bbox(), m.get_pixel_bbox())) { + int s = where.x < m.where.x ? -1 : 1; + if(m.reduce_hp(20)) addMessage("The giant frog crushes you!"); + auto dat = get_dat(); + auto mdat = m.get_dat(); + if(m.on_floor) m.vel.x = mdat.d * mdat.modv * -s * 1.5, m.vel.y = -mdat.d * mdat.modv * 2; + if(on_floor) vel.x = dat.d * dat.modv * s * 1.5; + } + if(on_floor) { + vel.x = 0; + if(gframeid > invinc_end) { + auto dat = get_dat(); + if(jphase == 0 && gframeid >= jump_at && intersect(extend(get_pixel_bbox(), 100 * dat.d, 100 * dat.d, 20 * dat.d, 20 * dat.d), m.get_pixel_bbox())) { + vel.y = -2 * dat.modv; + jphase = 1; + } + else if(jphase == 1) { + auto p = where; + ld v = maxvel(); + array fp; + for(int i=0; i<2; i++) { + where = p, vel.x = (i ? v : -v) * dat.modv, vel.y = -v * dat.modv; + int it = 0; + do { stay_on_screen(); kino(); } while(!on_floor && it++ < 5000); + fp[i] = where; + } + ld dist = max(abs(fp[0].x - p.x), abs(fp[1].x - p.x)); + where = p; + jphase = 2; + println(hlog, tuple(fp[0].x, fp[0].y, fp[1].x, fp[1].y)); + vel.y = -v * dat.modv; + if(dist == 0) return; + ld il = (m.where.x - where.x) / dist; + if(il > 1) il = 1 - (rand() % 100) / 1000; + if(il < -1) il = -1 + (rand() % 100) / 1000; + vel.x = il * v * dat.modv; + } + else if(jphase == 2) { + jphase = 0; jump_at = gframeid + game_fps * (maxvel() > 4 ? 2 : 0) + rand() % game_fps; + } + } + } + } + +void frog::attacked(int dmg) { + enemy::attacked(dmg); + auto dat = get_dat(); + int s = where.x < m.where.x ? -1 : 1; + if(on_floor) vel.x = dat.d * dat.modv * s * 2, vel.y = -dat.d * dat.modv * 2.5; + } + void ghost::act() { hyperpoint g = to_hyper(where); hyperpoint h = to_hyper(m.where); diff --git a/rogueviz/ru/map.ru b/rogueviz/ru/map.ru index 0f6969ea..512cc6a2 100644 --- a/rogueviz/ru/map.ru +++ b/rogueviz/ru/map.ru @@ -1274,3 +1274,105 @@ BAT 300 220 BAT 400 220 BAT 500 220 OK + +MOVE 2 Bat Cave +ROOM Frog Fountain +# wall +. air +! magic fountain +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#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b +OK + +MOVE 2 Frog Fountain +ROOM Frog Cave +# wall +. air +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#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b +FROG 245 154 +FROG 345 154 +FROG 445 154 +GIANTFROG 145 154 +LOOT 1 +fire +The giant frog extract will let you produce fire! But you need to take it to a magic fountain first. +OK diff --git a/rogueviz/ru/render.cpp b/rogueviz/ru/render.cpp index e9648357..1a6f8bb8 100644 --- a/rogueviz/ru/render.cpp +++ b/rogueviz/ru/render.cpp @@ -208,6 +208,7 @@ void init_scales() { letterscales['~'] = eupush(0, -0.4) * euscale(1.5, 1.2); letterscales[')'] = euscale(2.5, 1); letterscales['('] = euscale(2.5, 1); + letterscales['F'] = euscale(2.1, 1.3); } void asciiletter(ld minx, ld miny, ld maxx, ld maxy, const string& ch, color_t col) { diff --git a/rogueviz/ru/save.cpp b/rogueviz/ru/save.cpp index 53e486ea..9aff9aa9 100644 --- a/rogueviz/ru/save.cpp +++ b/rogueviz/ru/save.cpp @@ -168,6 +168,18 @@ void load_room(fhstream& f, cell *c) { b->respawn = b->where; b->postfix(); r.entities.emplace_back(std::move(b)); } + else if(cap == "GIANTFROG") { + auto b = std::make_unique(); + sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y); + b->respawn = b->where; b->postfix(); + r.entities.emplace_back(std::move(b)); + } + else if(cap == "FROG") { + auto b = std::make_unique(); + sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y); + b->respawn = b->where; b->postfix(); + r.entities.emplace_back(std::move(b)); + } else if(cap == "BAT") { auto b = std::make_unique(); sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y);