more fixes, mainly to Euclidean

This commit is contained in:
Zeno Rogue 2017-10-29 17:12:40 +01:00
parent e8fc2f6674
commit b214f3e97e
6 changed files with 100 additions and 67 deletions

View File

@ -4,13 +4,16 @@
// Copyright (C) 2011-2012 Zeno Rogue, see 'hyper.cpp' for details
ld tessf, crossf, hexf, hcrossf, hexhexdist;
ld tessf, crossf, hexf, hcrossf, hexhexdist, hexvdist, hepvdist, rhexf;
// tessf: distance from heptagon center to another heptagon center
// hexf: distance from heptagon center to heptagon vertex
// hexf: distance from heptagon center to small heptagon vertex
// hcrossf: distance from heptagon center to big heptagon vertex
// crossf: distance from heptagon center to adjacent hexagon center
// crossf: distance from heptagon center to adjacent cell center (either hcrossf or tessf)
// hexhexdist: distance between adjacent hexagon vertices
// hexvdist: distance between hexagon vertex and hexagon center
// hepvdist: distance between heptagon vertex and hexagon center (either hcrossf or something else)
// rhexf: distance from heptagon center to heptagon vertex (either hexf or hcrossf)
#define ALPHA (M_PI*2/S7)
@ -51,8 +54,14 @@ void precalc() {
// dynamicval<eGeometry> g(geometry, gNormal);
// precalc(); }
// for(int i=0; i<S84; i++) spinmatrix[i] = spin(i * M_PI / S42);
hcrossf = hexhexdist = hexf = hexf7;
tessf = hexf * sqrt(3);
crossf = .5;
tessf = crossf * sqrt(3);
hexf = tessf/3;
hcrossf = crossf;
hexhexdist = crossf;
hexvdist = hexf;
hepvdist = crossf;
rhexf = hexf;
goto finish;
}
@ -101,13 +110,13 @@ void precalc() {
}
hexf = fmin;
rhexf = purehepta ? hcrossf : hexf;
if(!euclid && !purehepta && !(S7&1))
hexshift = ALPHA/2 + ALPHA * ((S7-1)/2) + M_PI;
finish:
printf("S7=%d S6=%d hexf = " LDF" hcross = " LDF" tessf = " LDF" hexshift = " LDF "\n", S7, S6, hexf, hcrossf, tessf, hexshift);
for(int i=0; i<S42; i++)
Crad[i] = spin(2*M_PI*i/S42) * xpush(.4) * C0;
for(int d=0; d<S7; d++)
@ -121,6 +130,12 @@ void precalc() {
hexhexdist = hdist(xpush(crossf) * C0, spin(M_PI*2/S7) * xpush(crossf) * C0);
hexvdist = hdist(tC0(xpush(hexf)), spin(ALPHA/2) * tC0(xpush(hcrossf)));
printf("S7=%d S6=%d hexf = " LDF" hcross = " LDF" tessf = " LDF" hexshift = " LDF " hexhex = " LDF " hexv = " LDF "\n", S7, S6, hexf, hcrossf, tessf, hexshift,
hexhexdist, hexvdist);
for(int i=0; i<S84; i++) spinmatrix[i] = spin(i * M_PI / S42);
}

View File

@ -2811,9 +2811,9 @@ void floorShadow(cell *c, const transmatrix& V, int col, bool warp) {
else if(warp) {
if(euclid) {
if(ishex1(c))
queuepolyat(V * pispin * applyPatterndir(c), shTriheptaEucShadow[0], col, PPR_WALLSHADOW);
queuepolyat(V * pispin, shTriheptaFloorShadow[0], col, PPR_WALLSHADOW);
else
queuepolyat(V * applyPatterndir(c), shTriheptaEucShadow[ctof(c)], col, PPR_WALLSHADOW);
queuepolyat(V, shTriheptaFloorShadow[ctof(c)], col, PPR_WALLSHADOW);
}
else
queuepolyat(V * applyPatterndir(c), shTriheptaFloorShadow[ctof(c)], col, PPR_WALLSHADOW);
@ -2826,10 +2826,14 @@ void floorShadow(cell *c, const transmatrix& V, int col, bool warp) {
void plainfloor(cell *c, bool warp, const transmatrix &V, int col, int prio) {
if(warp) {
if(euclid) {
if(ishex1(c))
queuepolyat(V * pispin * applyPatterndir(c), shTriheptaEuc[0], col, prio);
/* if(ishex1(c))
queuepolyat(V * pispin * applyPatterndir(c), shTriheptaFloor[0], col, prio);
else
queuepolyat(V * applyPatterndir(c), shTriheptaEuc[ctof(c)], col, prio);
queuepolyat(V * applyPatterndir(c), shTriheptaFloor[ctof(c)], col, prio); */
if(ishex1(c))
queuepolyat(V * pispin, shTriheptaFloor[ctof(c)], col, prio);
else
queuepolyat(V, shTriheptaFloor[ctof(c)], col, prio);
}
else
queuepolyat(V * applyPatterndir(c), shTriheptaFloor[sphere ? ctof(c) : mapeditor::nopattern(c)], col, prio);
@ -2843,9 +2847,9 @@ void fullplainfloor(cell *c, bool warp, const transmatrix &V, int col, int prio)
if(warp) {
if(euclid) {
if(ishex1(c))
queuepolyat(V * pispin * applyPatterndir(c), shTriheptaEuc[0], col, prio);
queuepolyat(V * pispin, shTriheptaFloor[0], col, prio);
else
queuepolyat(V * applyPatterndir(c), shTriheptaEuc[ctof(c)], col, prio);
queuepolyat(V, shTriheptaFloor[ctof(c)], col, prio);
}
else
queuepolyat(V * applyPatterndir(c), shTriheptaFloor[sphere ? ctof(c) : mapeditor::nopattern(c)], col, prio);
@ -2859,9 +2863,9 @@ void qplainfloor(cell *c, bool warp, const transmatrix &V, int col) {
if(warp) {
if(euclid) {
if(ishex1(c))
qfloor(c, V, pispin * applyPatterndir(c), shTriheptaEuc[0], col);
qfloor(c, V, applyPatterndir(c) * pispin, shTriheptaFloor[0], col);
else
qfloor(c, V, applyPatterndir(c), shTriheptaEuc[ctof(c)], col);
qfloor(c, V, applyPatterndir(c), shTriheptaFloor[ctof(c)], col);
}
else
qfloor(c, V, applyPatterndir(c), shTriheptaFloor[sphere ? ctof(c) : mapeditor::nopattern(c)], col);
@ -3064,8 +3068,8 @@ static const int trapcol[4] = {0x904040, 0xA02020, 0xD00000, 0x303030};
static const int terracol[8] = {0xD000, 0xE25050, 0xD0D0D0, 0x606060, 0x303030, 0x181818, 0x0080, 0x8080};
void qfloor_eswap(cell *c, const transmatrix& V, const hpcshape& sh, int col) {
if(euclid && ishex1(c))
qfloor(c, V * pispin, sh, col);
if(euclid && ishex1(c))
qfloor(c, V, pispin, sh, col);
else
qfloor(c, V, sh, col);
};
@ -3448,10 +3452,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
}
else if(mapeditor::whichShape == '8') {
if(euclid)
qfloor(c, Vf, shTriheptaEuc[ctof012(c)], darkena(fcol, fd, 0xFF));
else
qfloor(c, Vf, shTriheptaFloor[ctof(c)], darkena(fcol, fd, 0xFF));
qfloor_eswap(c, Vf, shTriheptaFloor[ctof(c)], darkena(fcol, fd, 0xFF));
}
else if(mapeditor::whichShape == '6') {
@ -3587,8 +3588,8 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
qfloor(c, Vf, shHeptaMarker, darkena(fcol, 0, 0x40));
}
else if(isWarped(c) && euclid)
qfloor(c, Vf, shTriheptaEuc[ctof012(c)], darkena(fcol, fd, 0xFF));
else if(isWarped(c) && euclid)
qfloor_eswap(c, Vf, shTriheptaFloor[ctof(c)], darkena(fcol, fd, 0xFF));
else if(isWarped(c) && !purehepta && !shmup::on) {
int np = mapeditor::nopattern(c);
@ -3676,7 +3677,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
qfloor(c, Vf, CLOUDFLOOR, darkena(fcol, fd, 0xFF));
else if(c->land == laVolcano)
qfloor(c, Vf, LAVAFLOOR, darkena(fcol, fd, 0xFF));
qfloor_eswap(c, Vf, LAVAFLOOR, darkena(fcol, fd, 0xFF));
else if(c->land == laRose)
qfloor_eswap(c, Vf, ROSEFLOOR, darkena(fcol, fd, 0xFF));
@ -4412,29 +4413,31 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
// hyper heptagonal: 0.6150
// hyper: 0.3798
int prec = sphere ? 3 : 1;
if(purehepta) {
double x = sphere?.645:.6150;
double x = hcrossf;
for(int t=0; t<S7; t++)
if(c->mov[t] && c->mov[t] < c)
queueline(V * ddspin(c,t,-6) * xpush0(x),
V * ddspin(c,t,6) * xpush0(x),
gridcolor(c, c->mov[t]), 1);
queueline(V * ddspin(c,t,-S6) * xpush0(x),
V * ddspin(c,t,S6) * xpush0(x),
gridcolor(c, c->mov[t]), prec);
}
else if(isWarped(c)) {
double x = sphere?.3651:euclid?.2611:.2849;
if(!ishept(c)) for(int t=0; t<6; t++) if(c->mov[t] && ishept(c->mov[t]))
double x = hexhexdist/2;
if(!ishept(c)) for(int t=0; t<S6; t++) if(c->mov[t] && ishept(c->mov[t]))
queueline(V * ddspin(c,t,-S14) * xpush0(x),
V * ddspin(c,t,+S14) * xpush0(x),
gridcolor(c, c->mov[t]), 1);
gridcolor(c, c->mov[t]), prec);
}
else if(ishept(c) && !euclid) ;
else {
double x = sphere?.401:euclid?.3 : .328;
for(int t=0; t<6; t++)
double x = hexvdist;
for(int t=0; t< S6; t++)
if(euclid ? c->mov[t]<c : (((t^1)&1) || c->mov[t] < c))
queueline(V * ddspin(c,t,-S7) * xpush0(x),
V * ddspin(c,t,+S7) * xpush0(x),
gridcolor(c, c->mov[t]), 1);
gridcolor(c, c->mov[t]), prec);
}
vid.linewidth /= 3;
}

View File

@ -347,6 +347,10 @@ else if(args()[0] == '-' && args()[1] == x && args()[2] == '0') { showstartmenu
PHASEFROM(2);
shift(); sightrange = argi(); overgenerate = true; autocheat = true;
}
else if(argis("-we")) {
PHASEFROM(2);
shift(); whatever = argf(); resetGeometry();
}
else if(argis("-rch")) {
PHASEFROM(2);
reptilecheat = true; autocheat = true; firstland = laReptile;

View File

@ -238,7 +238,8 @@ transmatrix sphereflip; // on the sphere, flip
heptspin viewctr; // heptagon and rotation where the view is centered at
bool playerfound; // has player been found in the last drawing?
double eurad = 0.52;
#define eurad crossf
double q3 = sqrt(double(3));
bool outofmap(hyperpoint h) {

View File

@ -374,7 +374,7 @@ void giantLandSwitch(cell *c, int d, cell *from) {
if(y0 == 3 || y0 == 4) v=24; else v=0;
}
else v = emeraldval(c);
if(v == 0) c->wall = waStone;
if(v == 0 && !euclid) c->wall = waStone;
else {
v &= ~3;
if((v == 24 || v == 32 || v == 56))

View File

@ -737,7 +737,7 @@ void bshape(hpcshape& sh, int p) {
vector<array<int, 3>> symmetriesAt;
#ifdef SCALETUNER
#ifndef SCALETUNER
static const
#endif
double bscale7 = 1, brot7 = 0, bscale6 = 1, brot6 = 0;
@ -759,10 +759,11 @@ void bshape(hpcshape& sh, int p, double shzoom, int shapeid, double bonus = 0) {
int rots2 = rots;
if(rots == 7) {
rots2 = S7;
if(rots2 != 7) bonus += M_PI;
if(rots2 != 7 && !euclid) bonus += M_PI;
shzoomx *= bscale7;
shzoomy *= bscale7;
bonus += brot7;
if(euclid) shzoomx *= .9, shzoomy *= .9, bonus += .3;
}
if(rots == 3) {
rots2 = S3;
@ -857,16 +858,28 @@ void buildpolys() {
// scales
scalef = purehepta ? crossf / hcrossf7 : hcrossf / hcrossf7;
double scalef2 = purehepta ? crossf / hcrossf7 * .88 : euclid ? 1 : hcrossf / hcrossf7;
if(euclid) scalef *= .52/crossf;
double scalef2 = purehepta ? crossf / hcrossf7 * .88 : euclid ? scalef : hcrossf / hcrossf7;
double spzoom = sphere ? 1.4375 : 1;
double spzoom6 = sphere ? 1.2375 : 1;
double spzoom7 = sphere ? .8 : 1;
double spzoomd7 = (purehepta && sphere) ? 1 : spzoom7;
double fac80 = geometry == g45 ? 1.4 : geometry == g46 ? 1.2 : .8;
double fac80 = geometry == g45 ? 1.4 : geometry == g46 ? 1.2 : geometry == gOctagon ? .7 : .8;
double fac94 = euclid ? .8 : (S6==4) ? (purehepta ? 1.1 : .9) : .94;
if(euclid) fac80 = fac94 = .9;
if(geometry == g47 || geometry == gSmallSphere || geometry == gTinySphere)
fac80 *= 1.2, fac94 *= .94;
if(geometry == gTinySphere)
fac80 *= 1.2, fac94 *= .94;
auto MF = [] (double f, int i) { return (f*i)/8; };
@ -897,6 +910,10 @@ void buildpolys() {
double trihepta0 = scalef*spzoom6*(.2776+p) * SCA4(1.3) * SCA46(.975) * SCA47(.85) * bscale6 * (S7==8?.9:1);
double trihepta1 = (sphere ? .54 : scalef*spzoom6*(.5273-2*p) * SCA4(.8) * SCA46(1.075)) * (sphere&&S7==4?1.3:1) * bscale7;
double eps = hexhexdist * .05;
if(euclid) trihepta0 = hexhexdist * .5 - eps * sqrt(3)/2, trihepta1 = hexhexdist * sqrt(3)/2 - eps; // .5-.1; .75-.05
if(sphere&&S7==3) trihepta0 *= 1.3, trihepta1 *= 1.6;
@ -915,20 +932,12 @@ void buildpolys() {
bshape(shTriheptaFloorShadow[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12 + tshift1, trihepta1*SHADMUL) * C0);
{double x = sphere?.401:euclid?.3 : .328;
{double x = hexvdist;
bshape(shFullFloor[0], PPR_FLOOR);
if(a4) x = hcrossf * .7;
if(a4 && S7 == 6) x *= .9125;
if(a4 && S7 == 7) x *= .85;
if(sphere&&S7==4) x*= 1.7;
if(sphere&&S7==3) x*= 2.55;
x *= bscale6;
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, x) * C0);
x = purehepta ? 0.62 : sphere ? .345 : euclid ? .3 : 0.38;
if(a4) x = purehepta ? hcrossf: hexf;
if(sphere&&S7==4) x*= 1.3;
if(sphere&&S7==3) x*= 1.5;
x = rhexf;
x *= bscale7;
bshape(shFullFloor[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12+td, x) * C0);
@ -1340,7 +1349,7 @@ void buildpolys() {
double espzoom6 = spzoom6, espzoomd7 = spzoomd7;
if(euclid) espzoom6 *= 1.5, espzoomd7 *= 1.2;
// if(euclid) espzoom6 *= 1.5, espzoomd7 *= 1.2;
double octroll = S7 == 8 ? .2 : (S7 == 6 && a4) ? -.2 : (S7 == 7 && a4) ? .1 : 0;
@ -1358,7 +1367,7 @@ void buildpolys() {
bshape(shCloudFloor[0], PPR_FLOOR, scalef2*spzoom6*(sphere?.9:1)*ffscale2, 3, ffspin2);
bshape(shCloudFloor[1], PPR_FLOOR, scalef2*spzoomd7*ffscale2*SCAP4(1.5), 4, octroll);
bshape(shCloudFloor[2], PPR_FLOOR, scalef2*spzoom6*.9, 3);
bshape(shCloudFloor[2], PPR_FLOOR, euclid ? scalef2 : scalef2*spzoom6*.9, 3);
bshape(shCrossFloor[0], PPR_FLOOR, scalef*espzoom6*(sphere?.9:1)*ffscale2, 5, ffspin2);
bshape(shCrossFloor[1], PPR_FLOOR, scalef*espzoomd7*(sphere?.9:1)*ffscale2 * SCA47(1.3), 6, octroll);
@ -1368,21 +1377,21 @@ void buildpolys() {
bshape(shChargedFloor[2], PPR_FLOOR, scalef*espzoom6, 7);
bshape(shChargedFloor[3], 12, spzoomd7 * (sphere&&purehepta?.9:1) * SCA4(1.2), 10); // purehepta variant
bshape(shSStarFloor[0], PPR_FLOOR, scalef*spzoom6*(euclid?1.4:sphere?.8:1)*ffscale2, 11, ROT4(.775));
bshape(shSStarFloor[1], PPR_FLOOR, scalef*spzoomd7*(euclid?1.2:1)*SCA4(.85), 12, octroll);
bshape(shSStarFloor[0], PPR_FLOOR, scalef*spzoom6*(sphere?.8:1)*ffscale2, 11, ROT4(.775));
bshape(shSStarFloor[1], PPR_FLOOR, scalef*spzoomd7*SCA4(.85), 12, octroll);
bshape(shOverFloor[0], PPR_FLOOR, scalef*spzoom, 13);
if(purehepta) bshape(shOverFloor[1], PPR_FLOOR, sphere ? .83 : 1, 14, octroll);
else bshape(shOverFloor[1], PPR_FLOOR, scalef*spzoom7, 15);
bshape(shOverFloor[2], PPR_FLOOR, 1*spzoom7, 16);
bshape(shOverFloor[2], PPR_FLOOR, euclid?scalef*1.2:spzoom7, 16);
bshape(shTriFloor[0], PPR_FLOOR, scalef*espzoom6*(sphere?.9:1)*ffscale2*SCA4(0.9), 17, ffspin2 + ROT47(.1));
bshape(shTriFloor[1], PPR_FLOOR, scalef*espzoomd7*ffscale2*SCA4(1.2)*SCA47(1.5), 18, octroll + ROT4(.25) - ROT47(.1) + ROTS4(.7));
bshape(shFeatherFloor[0], PPR_FLOOR, scalef*spzoom6*ffscale2, 19, ffspin2);
if(purehepta) bshape(shFeatherFloor[1], PPR_FLOOR, sphere ? .83 : SCAP4(1.1), 20);
else bshape(shFeatherFloor[1], PPR_FLOOR, scalef*spzoom7*(sphere?1.1:1)*ffscale2*(a4?1.1:1), 21, sphere?1.3:0);
bshape(shFeatherFloor[2], PPR_FLOOR, 1, 22); // Euclidean variant
bshape(shFeatherFloor[2], PPR_FLOOR, scalef*1.1, 22); // Euclidean variant
bshape(shBarrowFloor[0], PPR_FLOOR, spzoom6 * (S7==8?1.4:1) * SCA467(1.7) * SCA46(.8), 23);
bshape(shBarrowFloor[1], PPR_FLOOR, (sphere&&purehepta?.9:1) * spzoomd7 * (S7==8?1.5:1) * SCA4(1.15) * SCA467(1.9) * SCA46(.8), 24, octroll - ROT47(.1));
bshape(shBarrowFloor[2], PPR_FLOOR, sphere?.9:1, 25);
bshape(shBarrowFloor[2], PPR_FLOOR, (sphere||euclid)?.9:1, 25);
bshape(shNewFloor[0], PPR_FLOOR, scalef*espzoom6 * ffscale2, 26, ffspin2);
bshape(shNewFloor[1], PPR_FLOOR, scalef*espzoomd7 * ffscale2, 27, octroll);
@ -1406,7 +1415,7 @@ void buildpolys() {
bshape(shSeabed[1], PPR_FLOOR, scalef*spzoom6, 335);
bshape(shCloudSeabed[0], PPR_FLOOR, scalef*spzoom6 * SCA46(.8) * SCA47(.75), 336);
bshape(shCloudSeabed[1], PPR_FLOOR, scalef*spzoom6 * SCA46(.5) * SCA47(.6), 337, ROT46(-.2));
bshape(shCloudSeabed[2], PPR_FLOOR, scalef*espzoom6*0.825, 337);
bshape(shCloudSeabed[2], PPR_FLOOR, scalef*espzoom6, 337);
bshape(shCaveSeabed[0], PPR_FLOOR, scalef*spzoom6, 338);
bshape(shCaveSeabed[1], PPR_FLOOR, scalef*spzoom6, 339);
@ -1439,7 +1448,7 @@ void buildpolys() {
bshape(shTriheptaEucShadow[1], PPR_FLOOR, scalef*SHADMUL, 43);
bshape(shTriheptaEucShadow[2], PPR_FLOOR, scalef*SHADMUL, 44);
bshape(shPalaceFloor[0], PPR_FLOOR, scalef*espzoom6*ffscale2, 45, ROT4(.775));
bshape(shPalaceFloor[1], PPR_FLOOR, scalef*espzoomd7*(euclid?1.1:1)*SCA4(.85), 46, (euclid ? M_PI/2-.4 : S7==8 ? -.6 : 0) + ROT46(-.3));
bshape(shPalaceFloor[1], PPR_FLOOR, scalef*espzoomd7*SCA4(.85), 46, (euclid ? 0 : S7==8 ? -.6 : 0) + ROT46(-.3));
bshape(shMercuryBridge[0], PPR_FLOOR, scalef*spzoom6, 365);
bshape(shMercuryBridge[1], PPR_FLOOR, scalef*spzoomd7, 366);
@ -1452,22 +1461,22 @@ void buildpolys() {
bshape(shDemonFloor[0], PPR_FLOOR, scalef*espzoom6*(sphere?.9:1) * ffscale2, 51, ffspin2);
bshape(shCaveFloor[0], PPR_FLOOR, scalef*spzoom6 * ffscale2, 52, ffspin2);
bshape(shCaveFloor[1], PPR_FLOOR, scalef*spzoomd7 * ffscale2 * (sphere?.9:1) * SCAP4(1.6), 53, octroll);
bshape(shCaveFloor[2], PPR_FLOOR, 1, 54); // Euclidean variant
bshape(shCaveFloor[2], PPR_FLOOR, scalef*1.1, 54); // Euclidean variant
bshape(shDesertFloor[0], PPR_FLOOR, scalef*espzoom6*ffscale6, 55, ffspin6);
bshape(shDesertFloor[1], PPR_FLOOR, scalef*espzoomd7*(sphere?.9:1), 56, octroll+ffspin7);
for(int i=1; i<=3; i++) for(int j=0; j<2; j++)
zoomShape(shDesertFloor[j], shRedRockFloor[i-1][j], 1 - .1 * i, PPR_FLOORa+i);
bshape(shPowerFloor[0], PPR_FLOOR_DRAGON, scalef*espzoom6*(sphere?.8:1)*ffscale2, 57, ffspin2);
bshape(shPowerFloor[1], PPR_FLOOR_DRAGON, scalef*espzoomd7*ffscale2, 58, euclid?M_PI/2:octroll);
bshape(shPowerFloor[1], PPR_FLOOR_DRAGON, scalef*espzoomd7*ffscale2, 58, octroll);
bshape(shRoseFloor[2], PPR_FLOOR, 1, 173); // purehepta
bshape(shRoseFloor[0], PPR_FLOOR, 1, 174);
bshape(shRoseFloor[1], PPR_FLOOR, scalef * SCAP4(.85), 175, (purehepta && a4 ? M_PI/8 : 0));
bshape(shTurtleFloor[0], PPR_FLOOR, (sphere?.9*1.3: a4 ? 1.6 : S7==8 ? 1.3 : 1) * SCA46(1.4) * SCA47(1.4), 176);
bshape(shTurtleFloor[1], PPR_FLOOR, scalef * (euclid?1.2:a4?.9:1) * SCA47(1.3), 177, (euclid ? M_PI/2 : octroll) - ROT47(.1));
bshape(shTurtleFloor[0], PPR_FLOOR, (euclid?.9:1) * (sphere?.9*1.3: a4 ? 1.6 : S7==8 ? 1.3 : 1) * SCA46(1.4) * SCA47(1.4), 176);
bshape(shTurtleFloor[1], PPR_FLOOR, (euclid?.9:1) * scalef * (a4?.9:1) * SCA47(1.3), 177, octroll - ROT47(.1));
bshape(shTurtleFloor[2], PPR_FLOOR, sphere && purehepta ? .9 : 1, 178); // purehepta
bshape(shDragonFloor[0], PPR_FLOOR_DRAGON, (S7==8?1.3:1) * SCA4(1.6), 181, ffspin2);
bshape(shDragonFloor[1], PPR_FLOOR_DRAGON, (sphere ? .9:1) * (S7==8?1.1:1) * SCA4(.9) * scalef, 182, octroll);
bshape(shDragonFloor[2], PPR_FLOOR, 1, 183);
bshape(shDragonFloor[2], PPR_FLOOR, scalef * 1.1, 183);
bshape(shZebra[0], PPR_FLOOR, scalef, 162);
bshape(shZebra[1], PPR_FLOOR, scalef, 163);
bshape(shZebra[2], PPR_FLOOR, scalef, 164);
@ -1489,7 +1498,7 @@ void buildpolys() {
bshape(shTower[7], PPR_FLOOR_TOWER, 1, 203); // purehepta 7
bshape(shTower[8], PPR_FLOOR_TOWER, 1, 204); // purehepta 11
bshape(shTower[9], PPR_FLOOR_TOWER, 1, 205); // purehepta 15
bshape(shTower[10], PPR_FLOOR_TOWER, 1, 206); // Euclidean
bshape(shTower[10], PPR_FLOOR_TOWER, scalef, 206); // Euclidean
// structures & walls
bshape(shBoatOuter, PPR_STRUCT0, scalef, 154);
@ -2967,12 +2976,13 @@ NEWSHAPE
#define ROSEFLOOR shRoseFloor[ct6]
#define ECT (euclid?2:ct6)
#define ECTH (euclid || purehepta?2:ct6)
// no eswap
#define PLAINFLOOR shFloor[ct6]
#define FULLFLOOR shFullFloor[ct6]
#define CAVEFLOOR shCaveFloor[ECT]
#define OVERFLOOR shOverFloor[ECT]
#define OVERFLOOR shOverFloor[ECTH]
#define CLOUDFLOOR shCloudFloor[ECT]
#define FEATHERFLOOR shFeatherFloor[ECT]
#define MFLOOR1 shMFloor[ct6]