diff --git a/rogueviz-magiccube.cpp b/rogueviz-magiccube.cpp new file mode 100644 index 00000000..b4fcbf46 --- /dev/null +++ b/rogueviz-magiccube.cpp @@ -0,0 +1,175 @@ +namespace hr { + +void performMarkCommand(cell *c); + +namespace crystal { + typedef array coord; + heptagon *get_heptagon_at(coord c); + coord get_coord(heptagon *h); + void set_crystal(int sides); + } + +void curvepoint(const hyperpoint& H1); +dqi_poly& queuecurve(color_t linecol, color_t fillcol, PPR prio); + +namespace magic { + +bool on = false; + +int back = 0x202020; + +int magiccolors[14] = { 0xFFFFFF, 0xFFFF00, 0x0000FF, 0x00FF00, 0xFF0000, 0xFF8000, 0x800080, 0x808080, 0x00FFFF, 0x80FFFF, 0x4040C0, 0x40C040, 0xC04040, 0xC0A040 }; + +int dim() { return ginf[gCrystal].sides / 2; } + +void build(crystal::coord co, int at) { + if(at < dim()) { + for(int z: {0,2,-2,4,-4}) co[at] = z, build(co, at+1); + return; + } + for(int i=0; icmove(i); + + int twos = 0, index = 0; + for(int a=0; ac7; + setdist(c, 7, NULL); + if(twos == 0) + c->landparam = back; + else if(twos == 1) + c->landparam = magiccolors[index]; + + println(hlog, co, " twos = ", twos, " index = ", index, " set = ", format("%06X", c->landparam)); + + } + +void magic(int sides) { + stop_game(); + crystal::set_crystal(sides); + set_variation(eVariation::pure); + firstland = specialland = laCanvas; + patterns::whichCanvas = 'g'; + patterns::canvasback = 0; + need_reset_geometry = true; + start_game(); + + build(crystal::c0, 0); + on = true; + } + +void curveline(hyperpoint a, hyperpoint b, int lev) { + if(lev>0) { + hyperpoint c = mid(a, b); + curveline(a, c, lev-1); + curveline(c, b, lev-1); + } + curvepoint(b); + } + +bool magic_markers(cell *c, const transmatrix& V) { + if(!on) return false; + timerghost = false; + if(c->landparam == back) { + for(int i=0; imove(i); + if(c2->landparam != back) { + hyperpoint h1 = V * get_corner_position(c, i, 3/.9); + hyperpoint h2 = V * get_corner_position(c, i+1, 3/.9); + curvepoint(h1); + curveline(h1, h2, 3); + hyperpoint h3 = V * get_corner_position(c, i, 3/.7); + hyperpoint h4 = V * get_corner_position(c, i+1, 3/.7); + curvepoint(h4); + curveline(h4, h3, 3); + queuecurve(0xFF, (c2->landparam << 8) | 0xFF, PPR::LINE); + } + } + } + else c->wall = waInvisibleFloor; + return false; + } + +int readArgs() { + using namespace arg; + + if(0) ; + else if(argis("-magic")) { + PHASEFROM(2); + shift(); magic(argi()); + } + else return 1; + return 0; + } + +void twos_to_fours(vector& zeros, crystal::coord co, int d) { + if(d == dim()) { + int facetable[5][5]; + for(int x=0; x<5; x++) + for(int y=0; y<5; y++) { + co[zeros[0]] = 2*x-4; + co[zeros[1]] = 2*y-4; + facetable[y][x] = crystal::get_heptagon_at(co)->c7->landparam; + } + for(int x=0; x<5; x++) + for(int y=0; y<5; y++) { + co[zeros[0]] = 2*y-4; + co[zeros[1]] = 4-2*x; + crystal::get_heptagon_at(co)->c7->landparam = facetable[y][x]; + } + } + else { + twos_to_fours(zeros, co, d+1); + if(co[d] == 2 || co[d] == -2) { + co[d] *= 2; + twos_to_fours(zeros, co, d+1); + } + } + } + +bool magic_rotate(cell *c) { + if(!on) return false; + if(c->landparam != back) return false; + vector zeros; + auto co = crystal::get_coord(c->master); + println(hlog, "co = ", co); + for(int i=0; i