From e6dd27f5bf2d653aba29c89122e83937a63149d6 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 16 Jun 2021 11:12:42 +0200 Subject: [PATCH] dice:: now work correctly in non-orientable spaces --- complex2.cpp | 12 ++++++++---- mapeditor.cpp | 3 +++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/complex2.cpp b/complex2.cpp index aebdbc25..2b921d8a 100644 --- a/complex2.cpp +++ b/complex2.cpp @@ -963,6 +963,7 @@ EX namespace dice { struct die_structure *which; int val; int dir; + bool mirrored; int happy(); }; #endif @@ -1113,12 +1114,11 @@ EX namespace dice { auto& dw = dd.which; - int si = isize(dw->sides[val]); + int si = dw->facesides; if(t % si) { println(hlog, "error: bad roll"); return dd; } - int sideid = (rdir - dir) * si / t; - if(sideid < 0) sideid += si; + int sideid = gmod((rdir - dir) * (dd.mirrored?-1:1) * si / t, si); int val1 = dw->sides[val][sideid]; @@ -1131,10 +1131,13 @@ EX namespace dice { int rdir1 = mi.rev_dir_force(); - int dir1 = rdir1 - sideid1 * t1 / si1; + bool mirror1 = dd.mirrored ^ mi.mirror(); + + int dir1 = rdir1 - (mirror1?-1:1) * sideid1 * t1 / si1; dir1 = gmod(dir1, t1); + dd.mirrored = mirror1; dd.val = val1; dd.dir = dir1; return dd; @@ -1211,6 +1214,7 @@ EX namespace dice { #endif shiftmatrix V1 = V * ddspin(c, dir) * spin(M_PI); + if(dd.mirrored) V1 = V1 * MirrorY; // loop: diff --git a/mapeditor.cpp b/mapeditor.cpp index 49042f63..e6ecd83f 100644 --- a/mapeditor.cpp +++ b/mapeditor.cpp @@ -677,6 +677,7 @@ EX namespace mapstream { f.write_char(dice::get_die_id(dat.which)); f.write_char(dat.val); f.write_char(dat.dir); + f.write_char(dat.mirrored); } // f.write_char(c->barleft); // f.write_char(c->barright); @@ -833,6 +834,8 @@ EX namespace mapstream { 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); + if(f.vernum >= 0xA902) + dat.mirrored = f.read_char(); } // c->barleft = (eLand) f.read_char(); // c->barright = (eLand) f.read_char();