mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-09-05 11:57:58 +00:00
more interesting dice in alt tilings
This commit is contained in:
40
complex2.cpp
40
complex2.cpp
@@ -952,6 +952,8 @@ EX namespace dice {
|
|||||||
highest_hardness = max(highest_hardness, hardness[i]);
|
highest_hardness = max(highest_hardness, hardness[i]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EX int get_facesides(struct die_structure* ds) { return ds->facesides; }
|
||||||
|
|
||||||
die_structure d20(5, {
|
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},
|
{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_data {
|
||||||
struct die_structure *which;
|
struct die_structure *which;
|
||||||
int val; /* the current face value */
|
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;
|
bool mirrored;
|
||||||
int happy();
|
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)))
|
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())
|
if(dirs.empty())
|
||||||
dd.dir = hrand(c->type);
|
dd.dir = hrand(c->type) * ds->facesides;
|
||||||
else
|
else
|
||||||
dd.dir = hrand_elt(dirs);
|
dd.dir = hrand_elt(dirs) * ds->facesides;
|
||||||
vector<int> sides;
|
vector<int> sides;
|
||||||
for(int i=0; i<ds->faces; i++)
|
for(int i=0; i<ds->faces; i++)
|
||||||
if(ds->hardness[i] >= min_hardness && ds->hardness[i] <= max_hardness)
|
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) {
|
EX bool can_roll(int sides, int cur, movei mi) {
|
||||||
if(mi.t->type % sides) return false;
|
if(gcd(mi.t->type, sides) == 1) return false;
|
||||||
if((cur - mi.d) % (mi.s->type / sides)) return false;
|
if((cur - mi.d * sides) % mi.s->type) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1122,7 +1124,7 @@ EX namespace dice {
|
|||||||
else if(pct2 < 40 + hard) {
|
else if(pct2 < 40 + hard) {
|
||||||
c->monst = moAnimatedDie;
|
c->monst = moAnimatedDie;
|
||||||
generate_specific(c, &d20, 0, 99);
|
generate_specific(c, &d20, 0, 99);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EX die_data roll_effect(movei mi, die_data dd) {
|
EX die_data roll_effect(movei mi, die_data dd) {
|
||||||
@@ -1139,9 +1141,9 @@ EX namespace dice {
|
|||||||
|
|
||||||
int si = dw->facesides;
|
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];
|
int val1 = dw->sides[val][sideid];
|
||||||
|
|
||||||
@@ -1150,15 +1152,15 @@ EX namespace dice {
|
|||||||
int sideid1 = dw->spins[val][sideid];
|
int sideid1 = dw->spins[val][sideid];
|
||||||
|
|
||||||
int t1 = cto->type;
|
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();
|
int rdir1 = mi.rev_dir_force();
|
||||||
|
|
||||||
bool mirror1 = dd.mirrored ^ mi.mirror();
|
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 * si1);
|
||||||
|
|
||||||
dir1 = gmod(dir1, t1);
|
|
||||||
|
|
||||||
dd.mirrored = mirror1;
|
dd.mirrored = mirror1;
|
||||||
dd.val = val1;
|
dd.val = val1;
|
||||||
@@ -1239,16 +1241,22 @@ EX namespace dice {
|
|||||||
else if(!lmouseover_distant || !on(lmouseover_distant)) if(CAP_EXTFONT || vid.usingGL == false) {
|
else if(!lmouseover_distant || !on(lmouseover_distant)) if(CAP_EXTFONT || vid.usingGL == false) {
|
||||||
queuestr(V, .5, its(val+1), 0xFFFFFFFF);
|
queuestr(V, .5, its(val+1), 0xFFFFFFFF);
|
||||||
auto& side = dw->sides[val];
|
auto& side = dw->sides[val];
|
||||||
|
auto fs = isize(side);
|
||||||
for(int i=0; i<si; i++) {
|
for(int i=0; i<si; i++) {
|
||||||
int d = dir + c->type * i / isize(side);
|
int d = dir + c->type * i;
|
||||||
d = gmod(d, c->type);
|
int err = d % fs;
|
||||||
|
d = gmod(d / fs, c->type);
|
||||||
hyperpoint nxt = tC0(currentmap->adj(c, d));
|
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);
|
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;
|
if(dd.mirrored) V1 = V1 * MirrorY;
|
||||||
|
|
||||||
// loop:
|
// loop:
|
||||||
|
@@ -1037,7 +1037,10 @@ EX namespace mapstream {
|
|||||||
auto& dat = dice::data[c];
|
auto& dat = dice::data[c];
|
||||||
dat.which = dice::get_by_id(f.read_char());
|
dat.which = dice::get_by_id(f.read_char());
|
||||||
dat.val = 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)
|
if(f.vernum >= 0xA902)
|
||||||
dat.mirrored = f.read_char();
|
dat.mirrored = f.read_char();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user