1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-11-07 09:13:02 +00:00

lots of work on the new geometries

This commit is contained in:
Zeno Rogue
2017-10-29 01:57:34 +02:00
parent ac37df87a5
commit 016ade10c6
21 changed files with 876 additions and 443 deletions

View File

@@ -630,13 +630,13 @@ void drawqueue() {
hpcshape
shFloorSide[SIDEPARS][2], shSemiFloorSide[SIDEPARS], shTriheptaSide[SIDEPARS][2], shMFloorSide[SIDEPARS][2],
shFullFloor[2],
shSeabed[2], shCloudSeabed[2], shCaveSeabed[2],
shSeabed[2], shCloudSeabed[3], shCaveSeabed[2],
shWave[8][2],
shFloor[2], shBFloor[2], shMFloor2[2], shMFloor3[2], shMFloor4[2],
shCircleFloor,
shFloorShadow[2], shTriheptaFloorShadow[2], shTriheptaEucShadow[3],
shWall[2], shMineMark[2], shFan,
shStarFloor[2], shCloudFloor[2], shTriFloor[2], shZebra[5],
shStarFloor[3], shCloudFloor[3], shTriFloor[2], shZebra[5],
shButterflyFloor[2], shLavaFloor[2],
shTower[11],
shTurtleFloor[3], shDragonFloor[3], shRoseFloor[3],
@@ -748,10 +748,11 @@ struct usershape {
usershape *usershapes[USERSHAPEGROUPS][USERSHAPEIDS];
void drawTentacle(hpcshape &h, ld rad, ld var, ld divby) {
double tlength = max(crossf, hexhexdist);
for(int i=0; i<=20; i++)
hpcpush(ddi(S21, rad + var * sin(i * M_PI/divby)) * ddi(0, crossf * i/20.) * C0);
hpcpush(ddi(S21, rad + var * sin(i * M_PI/divby)) * ddi(0, tlength * i/20.) * C0);
for(int i=20; i>=0; i--)
hpcpush(ddi(S21*3, rad - var * sin(i * M_PI/divby)) * ddi(0, crossf * i/20.) * C0);
hpcpush(ddi(S21*3, rad - var * sin(i * M_PI/divby)) * ddi(0, tlength * i/20.) * C0);
}
hyperpoint hpxd(ld d, ld x, ld y, ld z) {
@@ -781,16 +782,14 @@ void bshape(hpcshape& sh, int p) {
first = true;
}
hyperpoint spfix(int rots, hyperpoint h) {
if(!sphere) return h;
if(rots != 7) return h;
double d = atan2(h[0], h[1]);
return spin(M_PI + M_PI * 4/35 * d) * h;
}
vector<array<int, 3>> symmetriesAt;
void bshape(hpcshape& sh, int p, double shzoom, int shapeid, double bonus8 = 0) {
#ifdef SCALETUNER
static const
#endif
double bscale7 = 1, brot7 = 0, bscale6 = 1, brot6 = 0;
void bshape(hpcshape& sh, int p, double shzoom, int shapeid, double bonus = 0) {
bshape(sh, p);
int whereis = 0;
while(polydata[whereis] != NEWSHAPE || polydata[whereis+1] != shapeid) whereis++;
@@ -805,20 +804,44 @@ void bshape(hpcshape& sh, int p, double shzoom, int shapeid, double bonus8 = 0)
double shzoomy = shzoom;
if(shzoom == WOLF) shzoomx = 1.5 * (purehepta ? crossf / hcrossf : 1), shzoomy = 1.6 * (purehepta ? crossf / hcrossf : 1);
int rots2 = rots;
double bonus = 0;
if(rots == 7) {
rots2 = S7;
if((S7&1) == 0)
bonus = bonus8;
if(rots2 != 7) bonus += M_PI;
shzoomx *= bscale7;
shzoomy *= bscale7;
bonus += brot7;
}
if(rots == 3) {
rots2 = S3;
shzoomx *= bscale6;
shzoomy *= bscale6;
if(S6 == 8) bonus += .4;
bonus += brot6;
}
if(rots == 6) {
rots2 = S6;
shzoomx *= bscale6;
shzoomy *= bscale6;
if(S6 == 8) bonus += .4;
bonus += brot6;
}
double bonusf = /* sphere ? M_PI*4/35 : */ (rots-rots2+.0) / rots2;
auto ipoint = [&] (int i, int mul) {
hyperpoint h = hpxy(polydata[whereis+2*i] * shzoomx, polydata[whereis+2*i+1] * shzoomy * mul);
if(rots == rots2 && !bonus) return h;
double d = atan2(h[0], h[1]);
return spin(bonus + bonusf * d) * h;
};
for(int r=0; r<rots2; r++) {
for(int i=0; i<qty; i++)
hpcpush(spin(bonus+2*M_PI*r/rots2) * spfix(rots, hpxy(polydata[whereis+2*i] * shzoomx, polydata[whereis+2*i+1] * shzoomy)));
hpcpush(spin(2*M_PI*r/rots2) * ipoint(i, 1));
if(sym == 2)
for(int i=qty-1; i>=0; i--)
hpcpush(spin(bonus+2*M_PI*r/rots2) * spfix(rots, hpxy(polydata[whereis+2*i] * shzoomx, -polydata[whereis+2*i+1] * shzoomy)));
hpcpush(spin(2*M_PI*r/rots2) * ipoint(i, -1));
}
hpcpush(spin(bonus) * spfix(rots, hpxy(polydata[whereis] * shzoomx, polydata[whereis+1] * shzoomy)));
hpcpush(ipoint(0, 1));
}
void copyshape(hpcshape& sh, hpcshape& orig, int p) {
@@ -889,8 +912,8 @@ void buildpolys() {
double spzoom7 = sphere ? .8 : 1;
double spzoomd7 = (purehepta && sphere) ? 1 : spzoom7;
double fac80 = AT45 ? 1.4 : AT46 ? 1.2 : .8;
double fac94 = euclid ? .8 : AT456 ? (purehepta ? 1.1 : .9) : .94;
double fac80 = geometry == g45 ? 1.4 : geometry == g46 ? 1.2 : .8;
double fac94 = euclid ? .8 : (S6==4) ? (purehepta ? 1.1 : .9) : .94;
auto MF = [] (double f, int i) { return (f*i)/8; };
@@ -901,39 +924,79 @@ void buildpolys() {
double p = -.006;
int td = ((purehepta || euclid) && !(S7&1)) ? S42+S6 : 0;
bool a4 = S6 == 8;
#define SCA4(x) (a4?x:1)
#define ROT4(x) (a4?x:0)
#define SCA46(x) (a4 && S7 == 6?x:1)
#define SCA47(x) (a4 && S7 == 7?x:1)
#define SCA467(x) (a4 && S7 >= 6?x:1)
#define ROT46(x) (a4 && S7 == 6?x:0)
#define ROT47(x) (a4 && S7 == 7?x:0)
#define ROT467(x) (a4 && S7 >= 6?x:0)
#define ROTS4(x) (sphere && S7 == 4?x:0)
#define SCAP4(x) (a4&&purehepta?x:1)
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;
if(sphere&&S7==3) trihepta0 *= 1.3, trihepta1 *= 1.6;
int tshift0 = (a4?S14:0);
int tshift1 = td + (!(S7&1)) ? S6:0; // +S6+(a4&(S7&1)?S6:0);
bshape(shTriheptaFloor[0], PPR_FLOOR);
for(int t=0; t<=3; t++) hpcpush(ddi(t*S28, scalef*spzoom6*(.2776+p)) * C0);
for(int t=0; t<=S3; t++) hpcpush(ddi(t*S28 + tshift0, trihepta0) * C0);
bshape(shTriheptaFloor[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, sphere ? .54 : scalef*spzoom6*(.5273-2*p)) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12 + tshift1, trihepta1) * C0);
bshape(shTriheptaFloorShadow[0], PPR_FLOOR);
for(int t=0; t<=3; t++) hpcpush(ddi(t*S28, scalef*spzoom6*.2776*SHADMUL) * C0);
for(int t=0; t<=S3; t++) hpcpush(ddi(t*S28 + tshift0, trihepta0*SHADMUL) * C0);
bshape(shTriheptaFloorShadow[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, sphere ? .54 : scalef*spzoom6*.5273*SHADMUL) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12 + tshift1, trihepta1*SHADMUL) * C0);
{double x = sphere?.401:euclid?.3 : .328;
bshape(shFullFloor[0], PPR_FLOOR);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, x) * C0);
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 : 0.38;
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 *= bscale7;
bshape(shFullFloor[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, x) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12+td, x) * C0);
}
int td = ((purehepta || euclid) && !(S7&1)) ? S42+S6 : 0;
bool strict = false;
if(a4 && purehepta) fac94 *= 1.1;
double floorrad0 = shexf*fac80*spzoom;
double floorrad1 = strict ? hcrossf : euclid ? shexf*fac80*spzoom : shexf*fac94;
bshape(shFloor[0], PPR_FLOOR);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*fac80*spzoom) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, floorrad0) * C0);
bshape(shCircleFloor, PPR_FLOOR);
for(int t=0; t<=84; t+=2) hpcpush(ddi(t, shexf*.7*spzoom) * C0);
bshape(shFloor[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12 + td, strict ? hcrossf : euclid ? shexf*fac80*spzoom : shexf*fac94) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12 + td, floorrad1) * C0);
for(int i=0; i<3; i++) for(int j=0; j<3; j++) shadowmulmatrix[i][j] =
i==2&&j==2 ? 1:
@@ -941,10 +1004,10 @@ void buildpolys() {
0;
bshape(shFloorShadow[0], PPR_FLOOR);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*fac80*spzoom*SHADMUL) * C0);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, floorrad0*SHADMUL) * C0);
bshape(shFloorShadow[1], PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*fac94*SHADMUL) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, floorrad1*SHADMUL) * C0);
// sidewalls for the 3D mode
for(int k=0; k<SIDEPARS; k++) {
@@ -959,31 +1022,31 @@ void buildpolys() {
validsidepar[k] = (dlow > 0 && dhi > 0) || (dlow < 0 && dhi < 0);
bshape(shFloorSide[k][0], PPR_LAKEWALL);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S14-S7, shexf*fac80*spzoom) * C0);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S14-S7, floorrad0) * C0);
chasmifyPoly(dlow, dhi, k);
bshape(shFloorSide[k][1], PPR_LAKEWALL);
for(int t=0; t<=1; t++) hpcpush(ddi(t*12-6, shexf*fac94) * C0);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S12-S6, floorrad1) * C0);
chasmifyPoly(dlow, dhi, k);
bshape(shSemiFloorSide[k], PPR_LAKEWALL);
for(int t=0; t<=3; t+=3) hpcpush(ddi(S7 + (3+t)*S14, shexf*fac80*spzoom) * C0);
for(int t=0; t<=3; t+=3) hpcpush(ddi(S7 + (3+t)*S14, floorrad0) * C0);
chasmifyPoly(dlow, dhi, k);
bshape(shTriheptaSide[k][0], PPR_LAKEWALL);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S28-S14, scalef*spzoom6*.2776) * C0);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S28-S14, trihepta0) * C0);
chasmifyPoly(dlow, dhi, k);
bshape(shTriheptaSide[k][1], PPR_LAKEWALL);
for(int t=0; t<=1; t++) hpcpush(ddi(t*12-6, sphere ?.54 : scalef*spzoom6*.5273) * C0);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S12-S6, trihepta1) * C0);
chasmifyPoly(dlow, dhi, k);
bshape(shMFloorSide[k][0], PPR_LAKEWALL);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S14-S7, shexf*MF(fac80,7)*spzoom) * C0);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S14-S7, MF(floorrad0,7)) * C0);
chasmifyPoly(dlow, dhi, k);
bshape(shMFloorSide[k][1], PPR_LAKEWALL);
for(int t=0; t<=1; t++) hpcpush(ddi(t*12-6, shexf*MF(fac94,7)) * C0);
for(int t=0; t<=1; t++) hpcpush(ddi(t*S12-S6, MF(floorrad1,7)) * C0);
chasmifyPoly(dlow, dhi, k);
}
@@ -993,28 +1056,28 @@ void buildpolys() {
}
bshape(shMFloor[0], PPR_FLOORa);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,7)*spzoom) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,7)*spzoom) * C0);
bshape(shMFloor[1], PPR_FLOORa);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*MF(fac94,7)) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(td + t*S12, shexf*MF(fac94,7)) * C0);
bshape(shMFloor2[0], PPR_FLOORb);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,6)*spzoom) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,6)*spzoom) * C0);
bshape(shMFloor2[1], PPR_FLOORb);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*MF(fac94,6)) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(td + t*S12, shexf*MF(fac94,6)) * C0);
bshape(shMFloor3[0], PPR_FLOORc);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,5)*spzoom) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,5)*spzoom) * C0);
bshape(shMFloor3[1], PPR_FLOORc);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*MF(fac94,5)) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(td + t*S12, shexf*MF(fac94,5)) * C0);
bshape(shMFloor4[0], PPR_FLOORd);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,4)*spzoom) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*MF(fac80,4)*spzoom) * C0);
bshape(shMFloor4[1], PPR_FLOORd);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*MF(fac94,4)) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(td + t*S12, shexf*MF(fac94,4)) * C0);
bshape(shBigCarpet1, PPR_GFLOORa);
//for(int t=0; t<=7; t++) hpcpush(ddi(t*12, -shexf*3.5) * C0);
@@ -1029,16 +1092,16 @@ void buildpolys() {
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12*3, -shexf*1.7) * C0);
bshape(shBFloor[0], PPR_BFLOOR);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*.1) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*.1) * C0);
bshape(shBFloor[1], PPR_BFLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*.1) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12, shexf*.1) * C0);
bshape(shMineMark[0], PPR_MINEMARK);
for(int t=0; t<=6; t++) hpcpush(ddi(S7 + t*S14, shexf*.1) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(S7 + t*S14, shexf*.1) * C0);
bshape(shMineMark[1], PPR_MINEMARK);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*.1) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12, shexf*.1) * C0);
for(int d=0; d<2; d++) {
bshape(shSemiBFloor[d], PPR_BFLOOR);
@@ -1120,30 +1183,35 @@ void buildpolys() {
for(int t=0; t<=4; t++) {
hpcpush(ddi(t*S28, shexf*.5) * C0);
}
double disksize = crossf;
if(purehepta && S7 == 8) disksize *= 2;
else if(S7 == 8) disksize *= 1.5;
else if(purehepta && S6 == 8) disksize *= 1.5;
bshape(shDisk, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .2) * C0);
hpcpush(ddi(i, disksize * .2) * C0);
bshape(shDiskT, PPR_ITEM);
for(int i=0; i<=S84; i+=S28)
hpcpush(ddi(i, crossf * .2) * C0);
hpcpush(ddi(i, disksize * .2) * C0);
bshape(shDiskS, PPR_ITEM);
for(int i=0; i<=S84; i+=S21) {
hpcpush(ddi(i, crossf * .2) * C0);
hpcpush(ddi(i+S21/3, crossf * .1) * C0);
hpcpush(ddi(i+S21-S21/3, crossf * .1) * C0);
hpcpush(ddi(i, disksize * .2) * C0);
hpcpush(ddi(i+S21/3, disksize * .1) * C0);
hpcpush(ddi(i+S21-S21/3, disksize * .1) * C0);
}
bshape(shDiskM, PPR_ITEM);
for(int i=0; i<=S84; i+=3) {
hpcpush(ddi(i, crossf * .1) * C0);
hpcpush(ddi(i, disksize * .1) * C0);
}
bshape(shDiskSq, PPR_ITEM);
for(int i=0; i<=S84; i+=21) {
hpcpush(ddi(i, crossf * .15) * C0);
hpcpush(ddi(i, disksize * .15) * C0);
}
bshape(shEgg, PPR_ITEM);
@@ -1152,55 +1220,55 @@ void buildpolys() {
bshape(shRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * .30) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .30) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shSpikedRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * (i&1?.35:.30)) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * (i&1?.35:.30)) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shTargetRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * (i >= S42-6 && i <= S42+6 ?.36:.30)) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * (i >= S42-6 && i <= S42+6 ?.36:.30)) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shSpearRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--) {
int d = i - S42;
if(d<0) d = -d;
d = 8 - 2 * d;
if(d<0) d = 0;
hpcpush(ddi(i, crossf * (.3 + .04 * d)) * C0);
hpcpush(ddi(i, disksize * (.3 + .04 * d)) * C0);
}
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
/* three nice spikes
bshape(shLoveRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--) {
int j = i*3 % S84;
int d = j - S42;
if(d<0) d = -d;
d = 8 - 2 * d;
if(d<0) d = 0;
hpcpush(ddi(i, crossf * (.3 + .02 * d)) * C0);
hpcpush(ddi(i, disksize * (.3 + .02 * d)) * C0);
}
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
*/
bshape(shLoveRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--) {
int j = i*3 % S84;
double d = j - S42;
@@ -1209,37 +1277,37 @@ void buildpolys() {
d = 8 - 2 * d;
if(d<0) d = 0;
if(d >= 6) d -= (d-6)/3;
hpcpush(ddi(i, crossf * (.27 + .02 * d)) * C0);
hpcpush(ddi(i, disksize * (.27 + .02 * d)) * C0);
}
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shSawRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * (.3 + (i&3) * .02)) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * (.3 + (i&3) * .02)) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shGearRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * ((i%6<3)?.3:.36)) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * ((i%6<3)?.3:.36)) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shPeaceRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * (i%28 < 7?.36 : .3)) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * (i%28 < 7?.36 : .3)) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shHeptaRing, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
hpcpush(ddi(i, crossf * .25) * C0);
hpcpush(ddi(i, disksize * .25) * C0);
for(int i=S84; i>=0; i--)
hpcpush(ddi(i, crossf * (i%12 < 3?.4 : .27)) * C0);
hpcpush(ddi(0, crossf * .25) * C0);
hpcpush(ddi(i, disksize * (i%12 < 3?.4 : .27)) * C0);
hpcpush(ddi(0, disksize * .25) * C0);
bshape(shCompass1, PPR_ITEM);
for(int i=0; i<=S84; i+=3)
@@ -1274,25 +1342,25 @@ void buildpolys() {
hpcpush(ddi(i, crossf * (0.7 + .2 * sin(i * M_PI * 2 / S84 * 9))) * C0);
bshape(shHeptaMarker, PPR_HEPTAMARK);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, shexf*.2) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12, shexf*.2) * C0);
bshape(shSnowball, PPR_ITEM);
for(int t=0; t<=S7*4; t++) hpcpush(ddi(t*3, shexf*.1) * C0);
for(int t=0; t<=S7*4; t++) hpcpush(ddi(t*S3, shexf*.1) * C0);
bshape(shBigHepta, PPR_FLOOR);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*12, -shexf*1.5) * C0);
for(int t=0; t<=S7; t++) hpcpush(ddi(t*S12, -shexf*1.5) * C0);
bshape(shBigHex, PPR_FLOOR);
for(int t=0; t<=6; t++) hpcpush(ddi(t*S14, -shexf*1.3) * C0);
for(int t=0; t<=S6; t++) hpcpush(ddi(t*S14, -shexf*1.3) * C0);
bshape(shBigTriangle, PPR_FLOOR);
for(int t=0; t<=3; t++) hpcpush(ddi(t*S28, -shexf*1.5) * C0);
for(int t=0; t<=S3; t++) hpcpush(ddi(t*S28, -shexf*1.5) * C0);
bshape(shBigHexTriangleRev, PPR_FLOOR);
for(int t=0; t<=3; t++) hpcpush(ddi(t*S28, -shexf*1.3) * C0);
for(int t=0; t<=S3; t++) hpcpush(ddi(t*S28, -shexf*1.3) * C0);
bshape(shBigHexTriangle, PPR_FLOOR);
for(int t=0; t<=3; t++) hpcpush(ddi(S14+t*S28, -shexf*1.3) * C0);
for(int t=0; t<=S3; t++) hpcpush(ddi(S14+t*S28, -shexf*1.3) * C0);
bshape(shRose, PPR_ITEM);
for(int t=0; t<S84; t++)
@@ -1310,47 +1378,69 @@ void buildpolys() {
}
// hand-drawn shapes
// floors:
bshape(shStarFloor[0], PPR_FLOOR, scalef2*spzoom6, 1);
if(euclid)
bshape(shStarFloor[1], PPR_FLOOR, scalef2*spzoom6, 1);
else
bshape(shStarFloor[1], PPR_FLOOR, scalef2*spzoomd7, 2, .9);
bshape(shCloudFloor[0], PPR_FLOOR, scalef2*spzoom6, 3);
bshape(shCloudFloor[1], PPR_FLOOR, scalef2*spzoomd7, 4, .17);
bshape(shCrossFloor[0], PPR_FLOOR, scalef*spzoom6, 5);
bshape(shCrossFloor[1], PPR_FLOOR, scalef*spzoomd7, 6);
bshape(shChargedFloor[0], PPR_FLOOR, scalef*spzoom6, 8);
if(S7 == 8) spzoom6 *= .9;
if(a4 && !purehepta) spzoom6 *= 1.9, spzoom7 *= .9, spzoomd7 *= .9;
if(a4 && !purehepta && S7 == 6) spzoom6 *= .9;
if(a4 && !purehepta && S7 == 7) spzoom6 *= .85;
double espzoom6 = spzoom6, espzoomd7 = spzoomd7;
if(euclid) espzoom6 *= 1.5, espzoomd7 *= 1.2;
double octroll = S7 == 8 ? .2 : (S7 == 6 && a4) ? -.2 : (S7 == 7 && a4) ? .1 : 0;
double ffscale6 = SCA4(.675);
double ffspin6 = ROT4(.125);
double ffspin7 = ROT4(-.45);
double ffscale2 = SCA4(.7);
double ffspin2 = ROT4(M_PI/4);
// floors:
bshape(shStarFloor[0], PPR_FLOOR, scalef2*spzoom6*ffscale2, 1, ffspin2);
bshape(shStarFloor[1], PPR_FLOOR, scalef2*spzoomd7*ffscale2*SCAP4(1.5), 2, octroll);
bshape(shStarFloor[2], PPR_FLOOR, scalef2*spzoom6, 1);
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(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);
bshape(shChargedFloor[0], PPR_FLOOR, scalef*espzoom6*(sphere?.9:1)*ffscale2, 7, ffspin2);
bshape(shChargedFloor[1], PPR_FLOOR, scalef*spzoomd7, 9);
bshape(shChargedFloor[2], PPR_FLOOR, scalef*spzoom6, 7);
bshape(shChargedFloor[3], 12, spzoomd7 * (sphere&&purehepta?.9:1), 10); // purehepta variant
bshape(shSStarFloor[0], PPR_FLOOR, scalef*spzoom6, 11);
bshape(shSStarFloor[1], PPR_FLOOR, scalef*spzoomd7, 12);
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(shOverFloor[0], PPR_FLOOR, scalef*spzoom, 13);
if(purehepta) bshape(shOverFloor[1], PPR_FLOOR, sphere ? .83 : 1, 14);
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(shTriFloor[0], PPR_FLOOR, scalef*spzoom6, 17);
bshape(shTriFloor[1], PPR_FLOOR, scalef*spzoomd7, 18);
bshape(shFeatherFloor[0], PPR_FLOOR, scalef*spzoom6, 19);
if(purehepta) bshape(shFeatherFloor[1], PPR_FLOOR, sphere ? .83 : 1, 20);
else bshape(shFeatherFloor[1], PPR_FLOOR, scalef*spzoom7, 21);
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(shBarrowFloor[0], PPR_FLOOR, spzoom6, 23);
bshape(shBarrowFloor[1], PPR_FLOOR, (sphere&&purehepta?.9:1) * spzoomd7, 24);
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(shNewFloor[0], PPR_FLOOR, scalef*spzoom6, 26);
bshape(shNewFloor[1], PPR_FLOOR, scalef*spzoomd7, 27);
bshape(shTrollFloor[0], PPR_FLOOR, 1*spzoom6, 28);
bshape(shTrollFloor[1], PPR_FLOOR, 1*spzoomd7, 29);
bshape(shNewFloor[0], PPR_FLOOR, scalef*espzoom6 * ffscale2, 26, ffspin2);
bshape(shNewFloor[1], PPR_FLOOR, scalef*espzoomd7 * ffscale2, 27, octroll);
bshape(shButterflyFloor[0], PPR_FLOOR, scalef*spzoom6, 325);
bshape(shButterflyFloor[1], PPR_FLOOR, scalef*spzoomd7, 326);
bshape(shTrollFloor[0], PPR_FLOOR, 1*spzoom6*(S7==8?1.4:1)*SCA467(1.6) * SCA46(.8), 28);
bshape(shTrollFloor[1], PPR_FLOOR, 1*spzoomd7*(S7==8?1.6:1)*SCA467(2.4) * SCA46(.8), 29, octroll);
bshape(shLavaFloor[0], PPR_FLOOR, scalef*spzoom6, 359);
bshape(shLavaFloor[1], PPR_FLOOR, scalef*spzoomd7, 360);
bshape(shButterflyFloor[0], PPR_FLOOR, scalef*espzoom6*(sphere?.9:1)*ffscale2, 325, ffspin2);
bshape(shButterflyFloor[1], PPR_FLOOR, scalef*espzoomd7*ffscale2, 326, sphere?.7:0);
bshape(shLavaFloor[0], PPR_FLOOR, scalef*espzoom6 * ffscale2, 359, ffspin2);
bshape(shLavaFloor[1], PPR_FLOOR, scalef*espzoomd7 * ffscale2 * SCA467(1.4), 360, octroll);
bshape(shHalfFloor[0], PPR_FLOOR, scalef*spzoom6, 329);
bshape(shHalfFloor[1], PPR_FLOOR, scalef*spzoom6, 327);
@@ -1361,8 +1451,9 @@ void buildpolys() {
bshape(shSeabed[0], PPR_FLOOR, scalef*spzoom6, 334);
bshape(shSeabed[1], PPR_FLOOR, scalef*spzoom6, 335);
bshape(shCloudSeabed[0], PPR_FLOOR, scalef*spzoom6, 336);
bshape(shCloudSeabed[1], PPR_FLOOR, scalef*spzoom6, 337);
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(shCaveSeabed[0], PPR_FLOOR, scalef*spzoom6, 338);
bshape(shCaveSeabed[1], PPR_FLOOR, scalef*spzoom6, 339);
@@ -1388,41 +1479,41 @@ void buildpolys() {
bshape(shTriheptaFloor2[0], PPR_FLOOR, scalef, 40);
bshape(shTriheptaFloor2[1], PPR_FLOOR, scalef, 41);
bshape(shSemiFloorShadow, PPR_FLOOR, scalef, 263);
bshape(shTriheptaEuc[0], PPR_FLOOR, scalef, 42);
bshape(shTriheptaEuc[1], PPR_FLOOR, scalef, 43);
bshape(shTriheptaEuc[2], PPR_FLOOR, scalef, 44);
bshape(shTriheptaEuc[0], PPR_FLOOR, scalef * 1.5, 42);
bshape(shTriheptaEuc[1], PPR_FLOOR, scalef * 1.5, 43);
bshape(shTriheptaEuc[2], PPR_FLOOR, scalef * 1.5, 44);
bshape(shTriheptaEucShadow[0], PPR_FLOOR, scalef*SHADMUL, 42);
bshape(shTriheptaEucShadow[1], PPR_FLOOR, scalef*SHADMUL, 43);
bshape(shTriheptaEucShadow[2], PPR_FLOOR, scalef*SHADMUL, 44);
bshape(shPalaceFloor[0], PPR_FLOOR, scalef*spzoom6, 45);
bshape(shPalaceFloor[1], PPR_FLOOR, scalef*spzoomd7, 46);
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(shMercuryBridge[0], PPR_FLOOR, scalef*spzoom6, 365);
bshape(shMercuryBridge[1], PPR_FLOOR, scalef*spzoomd7, 366);
bshape(shWindArrow, PPR_HEPTAMARK, scalef, 367);
bshape(shPalaceGate, PPR_STRUCT1, scalef, 47);
bshape(shSemiFeatherFloor[0], PPR_FLOOR, scalef*spzoom6, 48);
bshape(shSemiFeatherFloor[1], PPR_FLOOR, scalef*spzoom6, 49);
bshape(shDemonFloor[1], PPR_FLOOR, scalef*spzoomd7, 50);
bshape(shDemonFloor[0], PPR_FLOOR, scalef*spzoom6, 51);
bshape(shCaveFloor[0], PPR_FLOOR, scalef*spzoom6, 52);
bshape(shCaveFloor[1], PPR_FLOOR, scalef*spzoomd7, 53);
bshape(shDemonFloor[1], PPR_FLOOR, scalef*espzoomd7*(sphere?.9:1) * ffscale2 * SCAP4(1.6), 50, (sphere?M_PI:S7==8?.2:0));
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(shDesertFloor[0], PPR_FLOOR, scalef*spzoom6, 55);
bshape(shDesertFloor[1], PPR_FLOOR, scalef*spzoomd7, 56, 2.7);
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*spzoom6, 57);
bshape(shPowerFloor[1], PPR_FLOOR_DRAGON, scalef*spzoomd7, 58);
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(shRoseFloor[2], PPR_FLOOR, 1, 173); // purehepta
bshape(shRoseFloor[0], PPR_FLOOR, 1, 174);
bshape(shRoseFloor[1], PPR_FLOOR, scalef, 175);
bshape(shTurtleFloor[0], PPR_FLOOR, 1, 176);
bshape(shTurtleFloor[1], PPR_FLOOR, scalef, 177);
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[2], PPR_FLOOR, sphere && purehepta ? .9 : 1, 178); // purehepta
bshape(shDragonFloor[0], PPR_FLOOR_DRAGON, 1, 181);
bshape(shDragonFloor[1], PPR_FLOOR_DRAGON, scalef, 182);
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(shZebra[0], PPR_FLOOR, scalef, 162);
bshape(shZebra[1], PPR_FLOOR, scalef, 163);
@@ -1849,6 +1940,7 @@ bool isSpecial(const hpcshape &h) {
}
const hpcshape& getSeabed(const hpcshape& c) {
if(&c == &shCloudFloor[2]) return shCloudSeabed[2];
if(purehepta || euclid || sphere) return c;
if(&c == &shFloor[0]) return shFullFloor[0];
if(&c == &shFloor[1]) return shFullFloor[1];
@@ -2902,3 +2994,38 @@ NEWSHAPE, 367, 1, 2, -0.096569,0.019944, 0.040859,0.019906, 0.037742,0.058710, 0
NEWSHAPE
};
/* floors */
// need eswap
#define DESERTFLOOR (purehepta ? shCloudFloor : shDesertFloor)[ct6]
#define BUTTERFLYFLOOR (purehepta ? shFloor : shButterflyFloor)[ct6]
#define PALACEFLOOR (purehepta?shFloor:shPalaceFloor)[ct6]
#define SSTARFLOOR (purehepta ? shCloudFloor : shSStarFloor)[ct6] // untested
#define POWERFLOOR (purehepta ? shStarFloor : shPowerFloor)[ct6] // untested
#define CHARGEDFLOOR (purehepta ? shChargedFloor[3] : ct6 ? shFloor[1] : shChargedFloor[0]) // scale!
#define DEMONFLOOR shDemonFloor[ct6] // untested
#define NEWFLOOR (purehepta ? shCloudFloor : shNewFloor)[ct6] // untested
#define CROSSFLOOR (purehepta ? shFloor : shCrossFloor)[ct6] // untested
#define TROLLFLOOR shTrollFloor[ct6] // tested?
#define BARROWFLOOR shBarrowFloor[euclid?0:purehepta?2:ct6]
#define LAVAFLOOR (purehepta ? shFloor : shLavaFloor)[ct6]
#define TRIFLOOR ((purehepta ? shFloor : shTriFloor)[ct6])
#define TURTLEFLOOR shTurtleFloor[ct6]
#define ROSEFLOOR shRoseFloor[ct6]
#define ECT (euclid?2:ct6)
// no eswap
#define PLAINFLOOR shFloor[ct6]
#define FULLFLOOR shFullFloor[ct6]
#define CAVEFLOOR shCaveFloor[ECT]
#define OVERFLOOR shOverFloor[ECT]
#define CLOUDFLOOR shCloudFloor[ECT]
#define FEATHERFLOOR shFeatherFloor[ECT]
#define MFLOOR1 shMFloor[ct6]
#define MFLOOR2 shMFloor2[ct6]
#define STARFLOOR shStarFloor[ECT]
#define DRAGONFLOOR shDragonFloor[ECT]
// fix Warp
// fix Kraken