From ecf71826c3f4c35dea8950bcef6808f3ea6809b8 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 29 May 2021 16:22:40 +0200 Subject: [PATCH] dice:: improvements to generalization --- complex2.cpp | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/complex2.cpp b/complex2.cpp index 687d0828..7422ad2a 100644 --- a/complex2.cpp +++ b/complex2.cpp @@ -973,13 +973,6 @@ EX namespace dice { EX map 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) { auto& dd = data[c]; dd.which = ds; @@ -988,7 +981,10 @@ EX namespace dice { for(int i=0; itype; i++) for(int j=0; jtype; j++) if(can_roll(ds->facesides, i, movei(c, j))) dirs.push_back(i); - dd.dir = hrand_elt(dirs); + if(dirs.empty()) + dd.dir = hrand(c->type); + else + dd.dir = hrand_elt(dirs); vector sides; for(int i=0; ifaces; i++) if(ds->hardness[i] >= min_hardness && ds->hardness[i] <= max_hardness) @@ -997,13 +993,12 @@ EX namespace dice { } EX int die_possible(cell *c) { - if(c->type == 6) - return 3; - if(c->type == 4 || c->type == 8) - return 4; - if(c->type == 5) - return 5; - return 0; + vector res; + for(int i: {3, 4, 5}) + if((c->type % i) == 0) + res.push_back(i); + if(res.empty()) return 0; + return hrand_elt(res); } EX bool can_roll(int sides, int cur, movei mi) { @@ -1024,17 +1019,25 @@ EX namespace dice { int pct = hrand(100); int pct2 = hrand(6000); if(dp == 4) { - if(pct < 10) { - c->wall = waRichDie; + if(pct < 20) { + c->wall = (pct < (items[itOrbLuck] ? 9 : 11)) ? waRichDie : waHappyDie; generate_specific(c, &d6, 1, 2); } + if(pct2 < 40 + hard) { + c->monst = moAnimatedDie; + generate_specific(c, &d6, 0, 99); + } return; } if(dp == 5) { - if(pct < 10) { - c->wall = waRichDie; + if(pct < 20) { + c->wall = (pct < (items[itOrbLuck] ? 9 : 11)) ? waRichDie : waHappyDie; generate_specific(c, &d12, 2, 3); } + if(pct2 < 40 + hard) { + c->monst = moAnimatedDie; + generate_specific(c, &d12, 0, 99); + } return; } if(pct < 3) { @@ -1211,10 +1214,11 @@ EX namespace dice { 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 == 8) dieradius /= 1.15; + if(dw->faces == 12) dieradius /= 1.15; ld base_to_base;