1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-08-28 16:32:18 +00:00

more interesting dice in alt tilings

This commit is contained in:
Zeno Rogue 2025-08-19 00:35:13 +02:00
parent d7a2545761
commit 43d15fa408
2 changed files with 28 additions and 17 deletions

View File

@ -952,6 +952,8 @@ EX namespace dice {
highest_hardness = max(highest_hardness, hardness[i]);
}
};
EX int get_facesides(struct die_structure* ds) { return ds->facesides; }
die_structure d20(5, {
{13-1, 7-1, 19-1}, {20-1, 12-1, 18-1}, {19-1, 17-1, 16-1}, {14-1, 18-1, 11-1}, {13-1, 18-1, 15-1},
@ -981,7 +983,7 @@ EX namespace dice {
struct die_data {
struct die_structure *which;
int val; /* the current face value */
int dir; /* which direction is the first side (which->sides[val][0]) of the current face */
int dir; /* which direction is the first side (which->sides[val][0]) of the current face, multipled by facesides */
bool mirrored;
int happy();
};
@ -1016,9 +1018,9 @@ EX namespace dice {
for(int j=0; j<c->type; j++) if(can_roll(ds->facesides, i, movei(c, j)))
dirs.push_back(i);
if(dirs.empty())
dd.dir = hrand(c->type);
dd.dir = hrand(c->type) * ds->facesides;
else
dd.dir = hrand_elt(dirs);
dd.dir = hrand_elt(dirs) * ds->facesides;
vector<int> sides;
for(int i=0; i<ds->faces; i++)
if(ds->hardness[i] >= min_hardness && ds->hardness[i] <= max_hardness)
@ -1036,8 +1038,8 @@ EX namespace dice {
}
EX bool can_roll(int sides, int cur, movei mi) {
if(mi.t->type % sides) return false;
if((cur - mi.d) % (mi.s->type / sides)) return false;
if(gcd(mi.t->type, sides) == 1) return false;
if((cur - mi.d * sides) % mi.s->type) return false;
return true;
}
@ -1122,7 +1124,7 @@ EX namespace dice {
else if(pct2 < 40 + hard) {
c->monst = moAnimatedDie;
generate_specific(c, &d20, 0, 99);
}
}
}
EX die_data roll_effect(movei mi, die_data dd) {
@ -1139,9 +1141,9 @@ EX namespace dice {
int si = dw->facesides;
if(t % si) { println(hlog, "error: bad roll"); return dd; }
if(gcd(t, si) == 1) { println(hlog, "error: bad roll ", tie(t, si)); return dd; }
int sideid = gmod((rdir - dir) * (dd.mirrored?-1:1) * si / t, si);
int sideid = gmod((rdir * si - dir) * (dd.mirrored?-1:1) / t, si);
int val1 = dw->sides[val][sideid];
@ -1150,15 +1152,15 @@ EX namespace dice {
int sideid1 = dw->spins[val][sideid];
int t1 = cto->type;
if(t1 % si1) { println(hlog, "error: bad roll target"); return dd; }
if(gcd(t1, si1) == 1) { println(hlog, "error: bad roll target"); return dd; }
int rdir1 = mi.rev_dir_force();
bool mirror1 = dd.mirrored ^ mi.mirror();
int dir1 = rdir1 * si1 - (mirror1?-1:1) * sideid1 * t1;
int dir1 = rdir1 - (mirror1?-1:1) * sideid1 * t1 / si1;
dir1 = gmod(dir1, t1);
dir1 = gmod(dir1, t1 * si1);
dd.mirrored = mirror1;
dd.val = val1;
@ -1239,16 +1241,22 @@ EX namespace dice {
else if(!lmouseover_distant || !on(lmouseover_distant)) if(CAP_EXTFONT || vid.usingGL == false) {
queuestr(V, .5, its(val+1), 0xFFFFFFFF);
auto& side = dw->sides[val];
auto fs = isize(side);
for(int i=0; i<si; i++) {
int d = dir + c->type * i / isize(side);
d = gmod(d, c->type);
int d = dir + c->type * i;
int err = d % fs;
d = gmod(d / fs, c->type);
hyperpoint nxt = tC0(currentmap->adj(c, d));
if(err) {
auto nxt1 = tC0(currentmap->adj(c, (d+1) % c->type));
nxt = normalize(nxt * (fs - err) + nxt1 * err);
}
hyperpoint mid = normalize(C0 * 1.3 + nxt * -.3);
queuestr(V * rgpushxto0(mid), .25, its(side[i]+1), 0xFFFFFFFF);
queuestr(V * rgpushxto0(mid), .25, its(side[i]+1), 0xFFFFFF);
}
}
shiftmatrix V1 = V * ddspin(c, dir, M_PI);
shiftmatrix V1 = V * ddspin(c, 0, M_PI - TAU * dir / c->type / si);
if(dd.mirrored) V1 = V1 * MirrorY;
// loop:

View File

@ -1037,7 +1037,10 @@ EX namespace mapstream {
auto& dat = dice::data[c];
dat.which = dice::get_by_id(f.read_char());
dat.val = f.read_char();
dat.dir = fixspin(rspin, f.read_char(), c->type, f.vernum);
dat.dir = f.read_char();
auto fs = get_facesides(dat.which);
if(f.vernum < 0xAA23) dat.dir *= fs;
dat.dir = fixspin(rspin, dat.dir / fs, c->type, f.vernum) * fs + (dat.dir % fs);
if(f.vernum >= 0xA902)
dat.mirrored = f.read_char();
}