1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-07-06 19:42:50 +00:00

dice:: improvements to generalization

This commit is contained in:
Zeno Rogue 2021-05-29 16:22:40 +02:00
parent 6fb5cc879e
commit ecf71826c3

View File

@ -973,13 +973,6 @@ EX namespace dice {
EX map<cell*, die_data> data; EX map<cell*, die_data> data;
EX void generate_random(cell *c) {
auto& dd = data[c];
dd.which = pick(&d4, &d8, &d20);
dd.val = hrand(dd.which->faces);
dd.dir = 1 + hrand(3) * 2;
}
EX void generate_specific(cell *c, die_structure *ds, int min_hardness, int max_hardness) { EX void generate_specific(cell *c, die_structure *ds, int min_hardness, int max_hardness) {
auto& dd = data[c]; auto& dd = data[c];
dd.which = ds; dd.which = ds;
@ -988,6 +981,9 @@ EX namespace dice {
for(int i=0; i<c->type; i++) for(int i=0; i<c->type; i++)
for(int j=0; j<c->type; j++) if(can_roll(ds->facesides, i, movei(c, j))) for(int j=0; j<c->type; j++) if(can_roll(ds->facesides, i, movei(c, j)))
dirs.push_back(i); dirs.push_back(i);
if(dirs.empty())
dd.dir = hrand(c->type);
else
dd.dir = hrand_elt(dirs); dd.dir = hrand_elt(dirs);
vector<int> sides; vector<int> sides;
for(int i=0; i<ds->faces; i++) for(int i=0; i<ds->faces; i++)
@ -997,13 +993,12 @@ EX namespace dice {
} }
EX int die_possible(cell *c) { EX int die_possible(cell *c) {
if(c->type == 6) vector<int> res;
return 3; for(int i: {3, 4, 5})
if(c->type == 4 || c->type == 8) if((c->type % i) == 0)
return 4; res.push_back(i);
if(c->type == 5) if(res.empty()) return 0;
return 5; return hrand_elt(res);
return 0;
} }
EX bool can_roll(int sides, int cur, movei mi) { EX bool can_roll(int sides, int cur, movei mi) {
@ -1024,17 +1019,25 @@ EX namespace dice {
int pct = hrand(100); int pct = hrand(100);
int pct2 = hrand(6000); int pct2 = hrand(6000);
if(dp == 4) { if(dp == 4) {
if(pct < 10) { if(pct < 20) {
c->wall = waRichDie; c->wall = (pct < (items[itOrbLuck] ? 9 : 11)) ? waRichDie : waHappyDie;
generate_specific(c, &d6, 1, 2); generate_specific(c, &d6, 1, 2);
} }
if(pct2 < 40 + hard) {
c->monst = moAnimatedDie;
generate_specific(c, &d6, 0, 99);
}
return; return;
} }
if(dp == 5) { if(dp == 5) {
if(pct < 10) { if(pct < 20) {
c->wall = waRichDie; c->wall = (pct < (items[itOrbLuck] ? 9 : 11)) ? waRichDie : waHappyDie;
generate_specific(c, &d12, 2, 3); generate_specific(c, &d12, 2, 3);
} }
if(pct2 < 40 + hard) {
c->monst = moAnimatedDie;
generate_specific(c, &d12, 0, 99);
}
return; return;
} }
if(pct < 3) { if(pct < 3) {
@ -1211,10 +1214,11 @@ EX namespace dice {
add_to_queue(S, val); add_to_queue(S, val);
ld dieradius = scale / 2; ld dieradius = cgi.scalefactor * scale / 2;
if(dw->faces == 20) dieradius /= 1.3; if(dw->faces == 20) dieradius /= 1.3;
if(dw->faces == 8) dieradius /= 1.15; if(dw->faces == 8) dieradius /= 1.15;
if(dw->faces == 12) dieradius /= 1.15;
ld base_to_base; ld base_to_base;