1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-06-27 07:22:51 +00:00

ru:: rings with shuffled names

This commit is contained in:
Zeno Rogue 2025-05-05 11:30:47 +02:00
parent 129d3bbe89
commit 69b5950792
5 changed files with 118 additions and 25 deletions

View File

@ -31,11 +31,14 @@ struct power {
hr::function<color_t()> get_color; hr::function<color_t()> get_color;
hr::function<void(int)> picked_up; hr::function<void(int)> picked_up;
hr::function<void()> refill; hr::function<void()> refill;
hr::function<void()> reshuffle;
power& is_starting(); power& is_starting();
power& be_weapon(); power& be_weapon();
power& be_resource(string plural); power& be_resource(string plural);
power& while_paused(); power& while_paused();
power& identified_name(string, string); power& identified_name(string, string);
power& be_wearable(string wear_effect, string remove_effect);
power& be_jewelry(string jtype, string desc);
}; };
extern vector<power> powers; extern vector<power> powers;

View File

@ -146,5 +146,6 @@ void render_room_objects(room *r);
void asciiletter(ld minx, ld miny, ld maxx, ld maxy, const string& ch, color_t col); void asciiletter(ld minx, ld miny, ld maxx, ld maxy, const string& ch, color_t col);
void render_the_map(); void render_the_map();
void shuffle_all();
} }

View File

@ -20,6 +20,7 @@ void check_fountains() {
for(auto& p: powers) p.refill(); for(auto& p: powers) p.refill();
for(auto& r: rooms) for(auto& e: r.second.entities) e->regenerate(); for(auto& r: rooms) for(auto& e: r.second.entities) e->regenerate();
current_target = nullptr; current_target = nullptr;
shuffle_all();
} }
swap(on_fountain, next_on_fountain); swap(on_fountain, next_on_fountain);
} }

View File

@ -17,9 +17,16 @@ power& power::identified_name(string s, string desc) {
return self; return self;
} }
string addqof(string base, power *p) {
if(p->qty_filled > 1) base = "+" + its(p->qty_filled) + " " + base;
if(p->qty_owned > p->qty_filled) base = base + " " + "(+" + its(p->qty_owned - p->qty_filled) + ")";
return base;
}
power& power::be_weapon() { power& power::be_weapon() {
picked_up = [this] (int x) { qty_owned += x; qty_filled = max(qty_filled, x); }; picked_up = [this] (int x) { qty_owned += x; qty_filled = max(qty_filled, x); };
auto gn = get_name; get_name = [gn, this] { return "+" + its(qty_filled-1) + " " + gn() + " (+" + its(qty_owned-qty_filled) + ")"; }; auto gn = get_name; get_name = [gn, this] { return addqof(gn(), this); };
return self; return self;
} }
@ -28,6 +35,54 @@ power& power::be_resource(string s) {
return self; return self;
} }
using flavor = pair<string, color_t>;
vector<flavor> jewelry_colors = {
{"steel", 0xA0A0C0FF},
{"amethyst", 0xC060C0FF},
{"ruby", 0xC06060FF},
{"sapphire", 0x6060C0FF},
{"emerald", 0x60C060FF},
};
int next_jewelry;
power& power::be_jewelry(string jtype, string xdesc) {
int nj = next_jewelry++;
picked_up = [this] (int x) { qty_owned += x; qty_filled = max(qty_filled, x); };
get_color = [nj] { return jewelry_colors[nj].second; };
get_name = [nj, this, jtype] {
string fname = jewelry_colors[nj].first + " " + jtype;
if(flags & IDENTIFIED) fname = fname + " of " + name;
fname = addqof(fname, this);
return fname;
};
get_desc = [this, xdesc] {
return (flags & IDENTIFIED) ? desc : xdesc;
};
return self;
}
power& power::be_wearable(string wear_effect, string remove_effect) {
auto gn = get_name;
get_name = [this, gn] {
string s = gn();
if(flags & ACTIVE) s += " (worn)";
return s;
};
auto ac = act;
act = [this, ac, wear_effect, remove_effect] (data& d) {
if(d.keystate == 1) {
d.p->flags ^= ACTIVE;
string msg = (d.p->flags & ACTIVE) ? wear_effect : remove_effect;
if(msg.find("%") != string::npos) msg.replace(msg.find("%"), 1, get_name());
addMessage(msg);
}
ac(d);
};
return self;
}
vector<power> powers; vector<power> powers;
void power::init() { void power::init() {
@ -42,6 +97,7 @@ void power::init() {
get_glyph = [this] { return glyph; }; get_glyph = [this] { return glyph; };
picked_up = [this] (int x) { qty_filled += x; qty_owned += x; }; picked_up = [this] (int x) { qty_filled += x; qty_owned += x; };
refill = [this] {}; refill = [this] {};
reshuffle = [this] {};
} }
power& gen_power(int key, string name, string desc, string glyph, color_t color, powerfun pf) { power& gen_power(int key, string name, string desc, string glyph, color_t color, powerfun pf) {
@ -155,28 +211,19 @@ void gen_powers() {
"This strange ring is too small to put on your finger, but maybe you could put it on your small toe?", "This strange ring is too small to put on your finger, but maybe you could put it on your small toe?",
"=", 0xe1cbbeFF, "=", 0xe1cbbeFF,
[] (data& d) { [] (data& d) {
if(d.keystate == 1) {
d.p->flags ^= ACTIVE;
if(d.p->flags & ACTIVE) addMessage("You put the " + d.p->get_name() + " on your toe.");
else addMessage("You remove the " + d.p->get_name() + " from your toe.");
}
if(d.p->flags & ACTIVE) m.next_coyote_time += 30; if(d.p->flags & ACTIVE) m.next_coyote_time += 30;
if(!(d.p->flags & IDENTIFIED) && (gframeid <= m.on_floor_when + m.coyote_time) && !m.on_floor) { if(!(d.p->flags & IDENTIFIED) && (gframeid <= m.on_floor_when + m.coyote_time) && !m.on_floor) {
d.p->flags |= IDENTIFIED; d.p->flags |= IDENTIFIED;
addMessage("You feel a strange magical force wanting to hold your foot from below."); addMessage("You feel a strange magical force wanting to hold your foot from below.");
} }
} }
).identified_name("Toe Ring of the Coyote", "This ring, worn on a toe, will let you still jump after running off a platform. Just make sure that you run off with the foot that you are wearing this ring on!"), ).identified_name("Toe Ring of the Coyote", "This ring, worn on a toe, will let you still jump after running off a platform. Just make sure that you run off with the foot that you are wearing this ring on!")
.be_wearable("You put the % on your toe.", "You remove the % from your toe.");
gen_power('g', "Golden Shoelaces", gen_power('g', "Golden Shoelaces",
"These shoelaces might bind you into place or give you freedom... or they could just be mundane shoelaces for rich people... one way to tell.", "These shoelaces might bind you into place or give you freedom... or they could just be mundane shoelaces for rich people... one way to tell.",
"=", 0xFFD500FF, "=", 0xFFD500FF,
[] (data& d) { [] (data& d) {
if(d.keystate == 1) {
d.p->flags ^= ACTIVE;
if(d.p->flags & ACTIVE) addMessage("You put the Golden Shoelaces on your boots.");
else addMessage("You remove the Golden Shoelaces from your boots.");
}
if(d.p->flags & ACTIVE) { if(d.p->flags & ACTIVE) {
m.next_jump_control++; m.next_jump_control++;
auto& ids = d.p->id_status; auto& ids = d.p->id_status;
@ -202,22 +249,56 @@ void gen_powers() {
} }
} }
} }
).identified_name("Golden Shoelaces", "Normally you cannot control your jumps while you are flying. These shoelaces allow you some control over your jumps."), ).identified_name("Golden Shoelaces", "Normally you cannot control your jumps while you are flying. These shoelaces allow you some control over your jumps.")
.be_wearable("You put the Golden Shoelaces on your boots.", "You remove the Golden Shoelaces on your boots.");
gen_power('r', "steel ring", gen_power('r', "strength",
"Is it safe to put this ring on?", "Wearing this ring will raise your strength.",
"=", 0xC04040FF, "=", 0xC04040FF,
[] (data& d) { [] (data& d) {
if(d.p->flags & ACTIVE) if(d.p->flags & ACTIVE) {
m.next_stats[stat::str] += d.p->qty_filled; m.next_stats[stat::str] += d.p->qty_filled;
if(d.keystate == 1) {
d.p->flags ^= ACTIVE;
d.p->flags |= IDENTIFIED; d.p->flags |= IDENTIFIED;
if(d.p->flags & ACTIVE) addMessage("You put the Ring of Strength on your finger.");
else addMessage("You remove the Ring of Strength from your finger.");
} }
} }
).identified_name("Ring of Strength", "This will raise your strength!"), ).be_jewelry("ring", "You need to wear this ring to know what it does.")
.be_wearable("You put the % on your finger. You feel stronger!", "You remove the %. You feel weaker..."),
gen_power('j', "toughness",
"Wearing this ring will raise your toughness.",
"=", 0xC04040FF,
[] (data& d) {
if(d.p->flags & ACTIVE) {
m.next_stats[stat::str] += d.p->qty_filled;
d.p->flags |= IDENTIFIED;
}
}
).be_jewelry("ring", "You need to wear this ring to know what it does.")
.be_wearable("You put the % on your finger. You feel tougher!", "You remove the %. You feel weaker..."),
gen_power('y', "wisdom",
"Wearing this ring will raise your wisdom.",
"=", 0xC04040FF,
[] (data& d) {
if(d.p->flags & ACTIVE) {
m.next_stats[stat::str] += d.p->qty_filled;
d.p->flags |= IDENTIFIED;
}
}
).be_jewelry("ring", "You need to wear this ring to know what it does.")
.be_wearable("You put the % on your finger. You feel wiser!", "You remove the %. You feel stupid..."),
gen_power('x', "dexterity",
"Wearing this ring will raise your dexterity.",
"=", 0xC04040FF,
[] (data& d) {
if(d.p->flags & ACTIVE) {
m.next_stats[stat::str] += d.p->qty_filled;
d.p->flags |= IDENTIFIED;
}
}
).be_jewelry("ring", "You need to wear this ring to know what it does.")
.be_wearable("You put the % on your finger. You feel better with bows!", "You remove the %. You feel worse with bows..."),
gen_power('g', "gold", gen_power('g', "gold",
"For some weird reason, people love gold, and they will give you anything if you give them enough gold.\n\n" "For some weird reason, people love gold, and they will give you anything if you give them enough gold.\n\n"
@ -261,14 +342,14 @@ void draw_inventory() {
next_y += st * 1.5; next_y += st * 1.5;
for(auto& p: powers) if(p.qty_owned) { for(auto& p: powers) if(p.qty_owned) {
string key = p.key == ' ' ? "" : dialog::keyname(p.key); string key = p.key == ' ' ? "" : dialog::keyname(p.key);
if(displaystr(100, next_y, 0, vid.fsize, key, p.color >> 8, 16)) getcstat = p.key; if(displaystr(100, next_y, 0, vid.fsize, key, p.get_color() >> 8, 16)) getcstat = p.key;
if(displaystr(130, next_y, 0, vid.fsize, p.get_glyph(), p.color >> 8, 8)) getcstat = p.key; if(displaystr(130, next_y, 0, vid.fsize, p.get_glyph(), p.get_color() >> 8, 8)) getcstat = p.key;
if(displaystr(160, next_y, 0, vid.fsize, p.get_name(), p.color >> 8, 0)) getcstat = p.key; if(displaystr(160, next_y, 0, vid.fsize, p.get_name(), p.get_color() >> 8, 0)) getcstat = p.key;
next_y += st; next_y += st;
dialog::add_key_action(p.key, [&p] { pushScreen([&p] { dialog::add_key_action(p.key, [&p] { pushScreen([&p] {
render_the_map(); render_the_map();
draw_inventory_frame(); draw_inventory_frame();
dialog::init(p.get_name(), p.color); dialog::init(p.get_name(), p.get_color() >> 8);
dialog::addHelp(p.get_desc()); dialog::addHelp(p.get_desc());
dialog::addItem("press a key to redefine", SDLK_ESCAPE); dialog::addItem("press a key to redefine", SDLK_ESCAPE);
dialog::display(); dialog::display();
@ -283,4 +364,10 @@ void draw_inventory() {
} }
} }
void shuffle_all() {
auto& jc = jewelry_colors;
for(int i=1; i<isize(jc); i++) swap(jc[i], jc[rand() % (i+1)]);
for(auto& p: powers) p.reshuffle();
}
} }

View File

@ -356,6 +356,7 @@ void enable() {
set_sval(); set_sval();
init_scales(); init_scales();
gen_powers(); gen_powers();
shuffle_all();
hyperpoint aleft = deparabolic13(to_hyper(l_margin_at, yctr)); hyperpoint aleft = deparabolic13(to_hyper(l_margin_at, yctr));
hyperpoint aright = deparabolic13(to_hyper(r_margin_at, yctr)); hyperpoint aright = deparabolic13(to_hyper(r_margin_at, yctr));