#include "rogueviz.h" namespace rogueviz { #if CAP_CRYSTAL namespace magic { int back = 0x202020; int magiccolors[14] = { 0xFFFFFF, 0xFFFF00, 0x0000FF, 0x00FF00, 0xFF0000, 0xFF8000, 0x800080, 0x808080, 0x00FFFF, 0x80FFFF, 0x4040C0, 0x40C040, 0xC04040, 0xC0A040 }; void build(crystal::coord co, int at) { if(at < crystal::get_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]; if(WDIM == 3) c->wall = waWaxWall; } println(hlog, co, " twos = ", twos, " index = ", index, " set = ", format("%06X", c->landparam)); } void magic(int sides) { stop_game(); if(sides < 0) set_geometry(gCrystal344); else crystal::set_crystal(sides); set_variation(eVariation::pure); firstland = specialland = laCanvas; patterns::whichCanvas = 'g'; patterns::canvasback = back; check_cgi(); start_game(); build(crystal::c0, 0); vizid = (void*) &magic; } 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(vizid != &magic) return false; timerghost = false; if(c->landparam == back) { if(GDIM == 2) { auto co = crystal::get_coord(c->master); for(int a=0; a= 6 || co[a] <= -6) c->landparam = 0; } if(GDIM == 2) 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 = GDIM == 2 ? waInvisibleFloor : waWaxWall; } return false; } int readArgs() { using namespace arg; if(0) ; else if(argis("-magic")) { PHASEFROM(2); shift(); magic(argi()); } else if(argis("-magic3")) { PHASEFROM(2); magic(-1); } else return 1; return 0; } void twos_to_fours(vector& zeros, crystal::coord co, int d) { if(d == crystal::get_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(vizid != &magic) 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