1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-10-25 10:57:59 +00:00

more work into Terracotta Army

This commit is contained in:
Zeno Rogue
2017-10-04 21:26:26 +02:00
parent cbd3805361
commit 6d3fcf0a5d
7 changed files with 136 additions and 111 deletions

View File

@@ -179,72 +179,31 @@ void drawBlizzards() {
bc->c->aitmp = bc->tmp; bc->c->aitmp = bc->tmp;
} }
#if 0 vector<cell*> arrowtraps;
{
int v0 = windmap::at(c);
const bool method2 = true;
auto a = [] (cell *c) { void drawArrowTraps() {
ld dx=0, dy=0; for(cell *c: arrowtraps) {
int v0 = windmap::at(c); auto r = traplimits(c);
forCellIdEx(c2, i, c) {
int v1 = windmap::at(c->mov[i]);
if(!c2) continue;
int xv1 = (v1 - v0) & 255;
if(xv1 >= 128) xv1 -= 256;
int hdir = displaydir(c, i);
dx += sin(hdir * M_PI / 42) * xv1;
dy += cos(hdir * M_PI / 42) * xv1;
}
return atan2(dx, dy);
};
ld alpha = a(c); try {
transmatrix& t0 = gmatrix.at(r[0]);
transmatrix& t1 = gmatrix.at(r[1]);
double xx = M_PI / (1 + sqrt(5)); queueline(tC0(t0), tC0(t1), 0xFF0000FF, 4, PPR_ITEM);
if((c->wparam & 7) == 3) {
forCellIdEx(c2, i, c) { // queueline(t0 * randomPointIn(r[0]->type), t1 * randomPointIn(r[1]->type), 0xFFFFFFFF, 4, PPR_ITEM);
int v1 = windmap::at(c2); int tt = ticks % 401;
int xv1 = (v1 - v0) & 255;
if(xv1 >= windmap::NOWINDBELOW && xv1 < windmap::NOWINDFROM) {
// method2 ? (ticks/16) - v0 : ticks/4;
double xcph = (ticks/16.) - v0;
xcph -= floor(xcph / 256) * 256;
ld beta = a(c2);
for(int u=0; u<(method2 ? 16 : 1); u++) {
xcph += 16; if(xcph >= 256) xcph -= 256;
if(method2 ? xcph < xv1 : true) {
int hdir = displaydir(c, i);
int aircol = 0xFFFFFF00; // 0xD0D0FFFF;
aircol += int(255. * windmap::NOWINDBELOW / xv1); // (1-exp(-xv1 / 50.)));
double at = method2 ? xcph*1./xv1 : xcph / 256.;
double ldist =
purehepta ? tessf :
c->type == 6 && c2->type == 6 ? hexhexdist :
crossf;
/* transmatrix alphamatrix = (*Vdp) * spin(M_PI/2) * xpush(sin(u*xx) * ldist/4) * spin(-M_PI/2) * spin(alpha) * xpush(ldist*at);
transmatrix betamatrix = (*Vdp) * spin(hdir*M_PI/42) * xpush(ldist) *
spin(-displaydir(c2, c->spn(i))*M_PI/S42) *
spin(M_PI/2) * xpush(-sin(u*xx)*ldist/4) * spin(-M_PI/2) *
spin(beta) * xpush(ldist * (1-at));
hyperpoint t = inverse(alphamatrix) * tC0(betamatrix);
transmatrix tpartial = alphamatrix * rspintox(t) * xpush(hdist0(t) * at * at * (3-2*at)); */
poly_outline = OUTLINE_TRANS;
transmatrix V0 = spin((hdir) * M_PI / S42);
// queuepoly(tpartial, shSnowball, aircol);
queuepoly((*Vdp) * V0 * xpush(at*ldist), shSnowball, aircol);
poly_outline = OUTLINE_DEFAULT;
}
}
for(int u=0; u<2; u++) {
transmatrix& tu = u ? t0 : t1;
transmatrix& tv = u ? t1 : t0;
hyperpoint trel = inverse(tu) * tC0(tv);
transmatrix tpartial = tu * rspintox(trel) * xpush(hdist0(trel) * tt / 401.0);
queuepoly(tpartial * ypush(.05), shTrapArrow, 0xFFFFFFFF);
} }
} }
} }
#endif catch(out_of_range) {}
}
}

View File

@@ -697,7 +697,7 @@ monstertype minf[motypes] = {
"more reflections will come out of the mirror. Use Mimics to destroy them." "more reflections will come out of the mirror. Use Mimics to destroy them."
}, },
{ 'W', 0x202020, "Hunting Dog", NODESC}, { 'W', 0x202020, "Hunting Dog", NODESC},
{ 'T', 0xA0A0A0, "Terracotta Warrior", NODESC}, { 'T', 0xE2725B, "Terracotta Warrior", NODESC},
{ 'H', 0xA0A0A0, "Mercury Warrior", NODESC}, { 'H', 0xA0A0A0, "Mercury Warrior", NODESC},
{ 'B', 0xA00000, "Void Beast", NODESC}, { 'B', 0xA00000, "Void Beast", NODESC},
{ 'L', 0xA00000, "Lemur", NODESC}, { 'L', 0xA00000, "Lemur", NODESC},
@@ -1651,7 +1651,7 @@ const landtype linf[landtypes] = {
{ 0xA06000, "Alchemy II", NODESCYET}, { 0xA06000, "Alchemy II", NODESCYET},
{ 0x8080FF, "Blizzard", NODESCYET}, { 0x8080FF, "Blizzard", NODESCYET},
{ 0x207068, "Hunting Ground", NODESCYET}, { 0x207068, "Hunting Ground", NODESCYET},
{ 0x888888, "Terracotta Army", NODESCYET} { 0xE2725B, "Terracotta Army", NODESCYET}
}; };
enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle, laAlchemist, laMirror, laGraveyard, enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle, laAlchemist, laMirror, laGraveyard,

View File

@@ -101,7 +101,8 @@ bool isNonliving(eMonster m) {
m == moMimic || m == moGolem || m == moGolemMoved || m == moMimic || m == moGolem || m == moGolemMoved ||
m == moZombie || m == moGhost || m == moShadow || m == moSkeleton || m == moZombie || m == moGhost || m == moShadow || m == moSkeleton ||
m == moEvilGolem || m == moIllusion || m == moEarthElemental || m == moEvilGolem || m == moIllusion || m == moEarthElemental ||
m == moWaterElemental || m == moDraugr; m == moWaterElemental || m == moDraugr || m == moTerraWarrior ||
m == moIceGolem || m == moVoidBeast;
} }
bool isMetalBeast(eMonster m) { bool isMetalBeast(eMonster m) {
@@ -111,11 +112,11 @@ bool isMetalBeast(eMonster m) {
bool isStunnable(eMonster m) { bool isStunnable(eMonster m) {
return m == moPalace || m == moFatGuard || m == moSkeleton || isPrincess(m) || return m == moPalace || m == moFatGuard || m == moSkeleton || isPrincess(m) ||
isMetalBeast(m) || m == moTortoise || isDragon(m) || isMetalBeast(m) || m == moTortoise || isDragon(m) ||
m == moReptile; m == moReptile || m == moTerraWarrior;
} }
bool hasHitpoints(eMonster m) { bool hasHitpoints(eMonster m) {
return m == moPalace || m == moFatGuard || m == moVizier || isPrincess(m); return m == moPalace || m == moFatGuard || m == moVizier || isPrincess(m) || m == moTerraWarrior;
} }
bool isMountable(eMonster m) { bool isMountable(eMonster m) {

View File

@@ -1108,6 +1108,10 @@ int monstersnear(stalemate1& sm) {
elec::builder b; elec::builder b;
if(elec::affected(c)) { which = moLightningBolt; res++; } if(elec::affected(c)) { which = moLightningBolt; res++; }
if(c->wall == waArrowTrap && c->wparam == 2) {
which = moArrowTrap; res++;
}
if(sm.who == moPlayer || items[itOrbEmpathy]) { if(sm.who == moPlayer || items[itOrbEmpathy]) {
fast = (items[itOrbSpeed] && (items[itOrbSpeed] & 1)); fast = (items[itOrbSpeed] && (items[itOrbSpeed] & 1));
} }
@@ -1662,15 +1666,10 @@ bool mayExplodeMine(cell *c, eMonster who) {
} }
void stunMonster(cell *c2) { void stunMonster(cell *c2) {
if(c2->monst != moSkeleton && !isMetalBeast(c2->monst) && c2->monst != moTortoise &&
c2->monst != moReptile) {
c2->hitpoints--;
if(c2->monst == moPrincess)
playSound(c2, princessgender() ? "hit-princess" : "hit-prince");
}
int newtime = ( int newtime = (
c2->monst == moFatGuard ? 2 : c2->monst == moFatGuard ? 2 :
c2->monst == moSkeleton && c2->land != laPalace && c2->land != laHalloween ? 7 : c2->monst == moSkeleton && c2->land != laPalace && c2->land != laHalloween ? 7 :
c2->monst == moTerraWarrior ? min(c2->stuntime + 8 - c2->hitpoints, 7) :
isMetalBeast(c2->monst) ? 7 : isMetalBeast(c2->monst) ? 7 :
c2->monst == moTortoise ? 7 : c2->monst == moTortoise ? 7 :
c2->monst == moReptile ? 7 : c2->monst == moReptile ? 7 :
@@ -1684,6 +1683,12 @@ void stunMonster(cell *c2) {
c2->monst == moHedge ? 1 : c2->monst == moHedge ? 1 :
c2->monst == moFlailer ? 1 : c2->monst == moFlailer ? 1 :
3); 3);
if(c2->monst != moSkeleton && !isMetalBeast(c2->monst) && c2->monst != moTortoise &&
c2->monst != moReptile) {
c2->hitpoints--;
if(c2->monst == moPrincess)
playSound(c2, princessgender() ? "hit-princess" : "hit-prince");
}
if(c2->stuntime < newtime) c2->stuntime = newtime; if(c2->stuntime < newtime) c2->stuntime = newtime;
if(isBull(c2->monst)) c2->mondir = NODIR; if(isBull(c2->monst)) c2->mondir = NODIR;
checkStunKill(c2); checkStunKill(c2);
@@ -2921,6 +2926,29 @@ void destroyWeakBranch(cell *cf, cell *ct, eMonster who) {
} }
} }
bool isCentralTrap(cell *c) {
if(c->wall != waArrowTrap) return false;
int i = 0;
forCellEx(c2, c) if(c2->wall == waArrowTrap) i++;
return i == 2;
}
array<cell*, 2> traplimits(cell *c) {
array<cell*, 2> res;
int q = 0;
for(int d=0; d<c->type; d++) {
cellwalker cw(c, d);
cwstep(cw);
if(cw.c->wall != waArrowTrap) continue;
cwspin(cw, cw.c->type/2);
if((cw.c->type&1) && cwpeek(cw, 0)->wall != waStone) cwspin(cw, 1);
cwstep(cw);
res[q++] = cw.c;
}
while(q<2) res[q++] = NULL;
return res;
}
void activateArrowTrap(cell *c) { void activateArrowTrap(cell *c) {
if(c->wall == waArrowTrap && c->wparam == 0) { if(c->wall == waArrowTrap && c->wparam == 0) {
c->wparam = 1; c->wparam = 1;
@@ -4674,7 +4702,8 @@ int movevalue(eMonster m, cell *c, cell *c2, flagtype flags) {
(m == moPrincessArmed && isPrincess(c2->monst)) ? 14000 : // jealousy! (m == moPrincessArmed && isPrincess(c2->monst)) ? 14000 : // jealousy!
isActiveEnemy(c2,m) ? 12000 : isActiveEnemy(c2,m) ? 12000 :
(c2->monst == moSkeleton || c2->monst == moMetalBeast || (c2->monst == moSkeleton || c2->monst == moMetalBeast ||
c2->monst == moReptile || c2->monst == moTortoise) ? -400 : c2->monst == moReptile || c2->monst == moTortoise ||
c2->monst == moTerraWarrior) ? -400 :
isIvy(c2) ? 8000 : isIvy(c2) ? 8000 :
isInactiveEnemy(c2,m) ? 1000 : isInactiveEnemy(c2,m) ? 1000 :
-500; -500;
@@ -6465,15 +6494,28 @@ namespace orbbull {
} }
} }
// predictable or not
static constexpr bool randterra = false;
void terracotta() { void terracotta() {
for(int i=0; i<numplayers(); i++) for(int i=0; i<numplayers(); i++)
forCellEx(c2, playerpos(i)) forCellEx(c2, playerpos(i))
if(c2->wall == waTerraWarrior) { if(c2->wall == waTerraWarrior) {
bool live = false;
if(randterra) {
c2->landparam++; c2->landparam++;
if((c2->landparam == 3 && hrand(3) == 0) || if((c2->landparam == 3 && hrand(3) == 0) ||
(c2->landparam == 4 && hrand(2) == 0) || (c2->landparam == 4 && hrand(2) == 0) ||
c2->landparam == 5) c2->landparam == 5)
live = true;
}
else {
c2->landparam--;
live = !c2->landparam;
}
if(live)
c2->monst = moTerraWarrior, c2->monst = moTerraWarrior,
c2->hitpoints = 7,
c2->wall = waNone; c2->wall = waNone;
} }
} }
@@ -6626,7 +6668,7 @@ void killFriendlyIvy() {
} }
bool monsterPushable(cell *c2) { bool monsterPushable(cell *c2) {
return (c2->monst != moFatGuard && !(isMetalBeast(c2->monst) && c2->stuntime < 2) && c2->monst != moTortoise); return (c2->monst != moFatGuard && !(isMetalBeast(c2->monst) && c2->stuntime < 2) && c2->monst != moTortoise && c2->monst != moTerraWarrior);
} }
bool movepcto(int d, int subdir, bool checkonly) { bool movepcto(int d, int subdir, bool checkonly) {

View File

@@ -649,15 +649,18 @@ bool drawItemType(eItem it, cell *c, const transmatrix& V, int icol, int ticks,
return false; return false;
} }
void drawTerraWarrior(const transmatrix& V, int t, double footphase) { void drawTerraWarrior(const transmatrix& V, int t, int hp, double footphase) {
int col = 0xC0C0C0;
int col2 = t > 6 ? 0x4040C0 : 0x6060A0;
ShadowV(V, shPBody); ShadowV(V, shPBody);
otherbodyparts(V, darkena(t > 4 ? col2 : col, 0, 0xF0), moDesertman, footphase); int col = linf[laTerracotta].color;
queuepoly(VBODY, shPBody, darkena(t > 0 ? col2 : col, 0, 0xF0)); int bcol = darkena(false ? 0xC0B23E : col, 0, 0xFF);
queuepoly(VBODY, shPrinceDress, darkena(t > 1 ? col2 : col, 0, 0xF0)); otherbodyparts(V, bcol, moDesertman, footphase);
if(!peace::on) queuepoly(VBODY * Mirror, shPSword, darkena(t > 2 ? col2 : col, 0, 0xF0)); queuepoly(VBODY, shPBody, bcol);
queuepoly(VHEAD, shTurban1, darkena(t > 3 ? col2 : col, 0, 0xF0)); if(!peace::on) queuepoly(VBODY * Mirror, shPSword, darkena(0xC0C0C0, 0, 0xFF));
queuepoly(VBODY, shTerraArmor1, darkena(t > 0 ? 0x4040FF : col, 0, 0xFF));
if(hp >= 4) queuepoly(VBODY, shTerraArmor2, darkena(t > 1 ? 0xC00000 : col, 0, 0xFF));
if(hp >= 2) queuepoly(VBODY, shTerraArmor3, darkena(t > 2 ? 0x612600 : col, 0, 0xFF));
queuepoly(VHEAD, shTerraHead, darkena(t > 4 ? 0x202020 : t > 3 ? 0x504040 : col, 0, 0xFF));
queuepoly(VHEAD, shPFace, bcol);
} }
bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, double footphase) { bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, double footphase) {
@@ -1088,7 +1091,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
queuepoly(VBODY, shPBody, c); queuepoly(VBODY, shPBody, c);
} }
else if(m == moTerraWarrior) else if(m == moTerraWarrior)
drawTerraWarrior(V, 7, footphase); drawTerraWarrior(V, 7, (where ? where->hitpoints : 7), footphase);
else if(m == moDesertman) { else if(m == moDesertman) {
otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase); otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase);
ShadowV(V, shPBody); ShadowV(V, shPBody);
@@ -1207,14 +1210,15 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
queuepoly(VHEAD, shPFace, darkena(col, 1, 0x90)); queuepoly(VHEAD, shPFace, darkena(col, 1, 0x90));
queuepoly(VHEAD, shArmor, darkena(col, 0, 0xC0)); queuepoly(VHEAD, shArmor, darkena(col, 0, 0xC0));
} }
else if(m == moTerraWarrior || m == moMercuryGuy || m == moLemur) { else if(m == moMercuryGuy || m == moLemur) {
ShadowV(V, shPBody); ShadowV(V, shPBody);
otherbodyparts(V, darkena(col, 0, 0xF0), m, footphase); otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase);
queuepoly(VBODY, shPBody, darkena(col, 0, 0xF0)); queuepoly(VBODY, shPBody, darkena(col, 0, 0x80));
if(!peace::on) queuepoly(VBODY * Mirror, shPSword, darkena(col, 0, 0xF0)); if(!peace::on) queuepoly(VBODY * Mirror, shPSword, darkena(col, 0, 0xF0));
queuepoly(VHEAD, shPHead, darkena(col, 1, 0xF0)); queuepoly(VHEAD, shTerraHead, darkena(col, 0, 0x80));
queuepoly(VHEAD, shPFace, darkena(col, 1, 0xF0)); queuepoly(VHEAD, shPFace, darkena(col, 0, 0x80));
queuepoly(VHEAD, shArmor, darkena(col, 0, 0xF0)); queuepoly(VBODY, shTerraArmor1, darkena(col, 1, 0x40));
queuepoly(VBODY, shTerraArmor2, darkena(col, 1, 0x40));
} }
else if(m == moGhost || m == moSeep || m == moFriendlyGhost) { else if(m == moGhost || m == moSeep || m == moFriendlyGhost) {
if(m == moFriendlyGhost) col = fghostcolor(ticks, where); if(m == moFriendlyGhost) col = fghostcolor(ticks, where);
@@ -2345,7 +2349,7 @@ void setcolors(cell *c, int& wcol, int &fcol) {
case laBurial: case laTrollheim: case laBarrier: case laOceanWall: case laBurial: case laTrollheim: case laBarrier: case laOceanWall:
case laCrossroads2: case laCrossroads3: case laCrossroads4: case laCrossroads5: case laCrossroads2: case laCrossroads3: case laCrossroads4: case laCrossroads5:
case laRose: case laPower: case laWildWest: case laHalloween: case laRedRock: case laRose: case laPower: case laWildWest: case laHalloween: case laRedRock:
case laDragon: case laStorms: case laDragon: case laStorms: case laTerracotta:
fcol = linf[c->land].color; break; fcol = linf[c->land].color; break;
case laDesert: fcol = 0xEDC9AF; break; case laDesert: fcol = 0xEDC9AF; break;
@@ -2467,10 +2471,6 @@ void setcolors(cell *c, int& wcol, int &fcol) {
if(pseudohept(c)) fcol = fcol * 3/4; if(pseudohept(c)) fcol = fcol * 3/4;
break; break;
case laTerracotta:
fcol = 0x909090;
break;
case laIvoryTower: case laIvoryTower:
fcol = 0x10101 * (32 + (c->landparam&1) * 32) - 0x000010; fcol = 0x10101 * (32 + (c->landparam&1) * 32) - 0x000010;
break; break;
@@ -3249,6 +3249,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
c->land == laTrollheim ? 2 : c->land == laTrollheim ? 2 :
c->land == laReptile ? 0 : c->land == laReptile ? 0 :
c->land == laDogPlains ? 1 : c->land == laDogPlains ? 1 :
c->land == laTerracotta ? 1 :
2; 2;
if(c->land == laAlchemy2) { if(c->land == laAlchemy2) {
@@ -3763,7 +3764,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
} }
if(c->wall == waTerraWarrior) if(c->wall == waTerraWarrior)
drawTerraWarrior(V, c->landparam & 7, 0); drawTerraWarrior(V, randterra ? (c->landparam & 7) : (5 - (c->landparam & 7)), 7, 0);
else if(c->wall == waBoat || c->wall == waStrandedBoat) { else if(c->wall == waBoat || c->wall == waStrandedBoat) {
double footphase; double footphase;
@@ -3961,7 +3962,9 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
else if(c->wall == waArrowTrap) { else if(c->wall == waArrowTrap) {
int trapcol[4] = {0x904040, 0xA02020, 0xD00000, 0x303030}; int trapcol[4] = {0x904040, 0xA02020, 0xD00000, 0x303030};
if(c->wparam >= 2)
queuepoly(V, shDisk, darkena(trapcol[c->wparam&3], 0, 0xFF)); queuepoly(V, shDisk, darkena(trapcol[c->wparam&3], 0, 0xFF));
if(isCentralTrap(c)) arrowtraps.push_back(c);
} }
else if(xch == '%') { else if(xch == '%') {
@@ -4645,6 +4648,8 @@ void drawthemap() {
// playerfoundL = false; // playerfoundL = false;
// playerfoundR = false; // playerfoundR = false;
arrowtraps.clear();
sphereflip = Id; sphereflip = Id;
profile_start(1); profile_start(1);
if(euclid) if(euclid)
@@ -4660,6 +4665,7 @@ void drawthemap() {
hsOrigin, ypush(vid.yshift) * sphereflip * View); hsOrigin, ypush(vid.yshift) * sphereflip * View);
} }
drawBlizzards(); drawBlizzards();
drawArrowTraps();
ivoryz = false; ivoryz = false;
linepatterns::drawAll(); linepatterns::drawAll();

View File

@@ -4062,7 +4062,7 @@ void setdist(cell *c, int d, cell *from) {
} }
if(pseudohept(c) && hrand(100) < 40 && c->wall == waNone) { if(pseudohept(c) && hrand(100) < 40 && c->wall == waNone) {
c->wall = waTerraWarrior; c->wall = waTerraWarrior;
c->landparam = 0; c->landparam = randterra ? 0 : 3 + hrand(3);
} }
} }
@@ -4732,7 +4732,7 @@ void setdist(cell *c, int d, cell *from) {
if(d == 7 && c->land == laCaves && c->wall == waCavewall && hrand(5000) < items[itGold] + hard && !safety) if(d == 7 && c->land == laCaves && c->wall == waCavewall && hrand(5000) < items[itGold] + hard && !safety)
c->monst = moSeep; c->monst = moSeep;
if(d == 7 && c->land == laDogPlains) { if(d == 7 && c->land == laDogPlains && false) {
if(hrand(1000) < 10) { if(hrand(1000) < 10) {
if(openplains(c)) { if(openplains(c)) {
c->item = itDogPlains; c->item = itDogPlains;
@@ -5086,7 +5086,7 @@ void setdist(cell *c, int d, cell *from) {
forCellEx(c2, c) if(c2->wall == waTerraWarrior) nearwarrior = true; forCellEx(c2, c) if(c2->wall == waTerraWarrior) nearwarrior = true;
if(nearwarrior && hrand(5000) < PT(100 + 2 * kills[moMercuryGuy], 200) && notDippingFor(itTerra)) if(nearwarrior && hrand(5000) < PT(100 + 2 * kills[moMercuryGuy], 200) && notDippingFor(itTerra))
c->item = itTerra; c->item = itTerra;
if(hrand(8000) < 2 * (items[itTerra] + hard)) if(hrand(20000) < 2 * (items[itTerra] + hard))
c->monst = moMercuryGuy; c->monst = moMercuryGuy;
} }

View File

@@ -668,7 +668,7 @@ hpcshape
shPickAxe, shPike, shFlailBall, shFlailTrunk, shFlailChain, shPickAxe, shPike, shFlailBall, shFlailTrunk, shFlailChain,
shBook, shBookCover, shGrail, shBook, shBookCover, shGrail,
shBoatOuter, shBoatInner, shCompass1, shCompass2, shCompass3, shBoatOuter, shBoatInner, shCompass1, shCompass2, shCompass3,
shKnife, shTongue, shFlailMissile, shKnife, shTongue, shFlailMissile, shTrapArrow,
shPirateHook, shPirateHood, shEyepatch, shPirateX, shPirateHook, shPirateHood, shEyepatch, shPirateX,
// shScratch, // shScratch,
shHeptaMarker, shSnowball, shHeptaMarker, shSnowball,
@@ -698,6 +698,8 @@ hpcshape
shButterflyBody, shButterflyWing, shGadflyBody, shGadflyWing, shGadflyEye, shButterflyBody, shButterflyWing, shGadflyBody, shGadflyWing, shGadflyEye,
shTerraArmor1, shTerraArmor2, shTerraArmor3, shTerraHead, shTerraFace,
shDodeca; shDodeca;
#define USERLAYERS 8 #define USERLAYERS 8
@@ -1468,6 +1470,12 @@ void buildpolys() {
bshape(shReptileEye, PPR_MONSTER_EYE0, scalef, 304); bshape(shReptileEye, PPR_MONSTER_EYE0, scalef, 304);
bshape(shDodeca, PPR_ITEM, scalef, 305); bshape(shDodeca, PPR_ITEM, scalef, 305);
bshape(shTerraArmor1, PPR_MONSTER_BODY, scalef, 349);
bshape(shTerraArmor2, PPR_MONSTER_BODY, scalef, 350);
bshape(shTerraArmor3, PPR_MONSTER_BODY, scalef, 351);
bshape(shTerraHead, PPR_MONSTER_HEAD, scalef, 352);
bshape(shTerraFace, PPR_MONSTER_FACE, scalef, 353);
bshape(shPBody, PPR_MONSTER_BODY, scalef, 85); bshape(shPBody, PPR_MONSTER_BODY, scalef, 85);
bshape(shYeti, PPR_MONSTER_BODY, scalef, 86); bshape(shYeti, PPR_MONSTER_BODY, scalef, 86);
bshape(shPSword, PPR_MONSTER_WPN, scalef, 90); bshape(shPSword, PPR_MONSTER_WPN, scalef, 90);
@@ -1585,6 +1593,7 @@ void buildpolys() {
// missiles // missiles
bshape(shKnife, PPR_MISSILE, scalef, 87); bshape(shKnife, PPR_MISSILE, scalef, 87);
bshape(shTrapArrow, PPR_MISSILE, scalef, 354);
bshape(shTongue, PPR_MISSILE, scalef, 88); bshape(shTongue, PPR_MISSILE, scalef, 88);
bshape(shFlailMissile, PPR_MISSILE, scalef, 89); bshape(shFlailMissile, PPR_MISSILE, scalef, 89);
@@ -2784,6 +2793,14 @@ NEWSHAPE, 346, 3, 1, -0.239730,-0.007608, -0.223885,0.067283, -0.220256,0.133782
NEWSHAPE, 347, 3, 1, -0.224843,0.011231, -0.221774,0.155893, -0.237013,0.176616, -0.235167,0.161978, -0.233348,0.147389, -0.243466,0.116780, -0.268483,0.091378, -0.289413,0.094518, -0.303691,0.109465, -0.306027,0.164940, -0.298818,0.218829, -0.292029,0.245261, -0.240190,0.282931, -0.188317,0.284726, -0.152862,0.259042, -0.141074,0.232138, -0.099370,0.203720, -0.045785,0.208279, 0.009668,0.253588, 0.013535,0.280682, 0.018420,0.337425, 0.015783,0.401804, -0.001438,0.415925, 0.031579,0.404581, 0.041846,0.335206, 0.079240,0.235103, NEWSHAPE, 347, 3, 1, -0.224843,0.011231, -0.221774,0.155893, -0.237013,0.176616, -0.235167,0.161978, -0.233348,0.147389, -0.243466,0.116780, -0.268483,0.091378, -0.289413,0.094518, -0.303691,0.109465, -0.306027,0.164940, -0.298818,0.218829, -0.292029,0.245261, -0.240190,0.282931, -0.188317,0.284726, -0.152862,0.259042, -0.141074,0.232138, -0.099370,0.203720, -0.045785,0.208279, 0.009668,0.253588, 0.013535,0.280682, 0.018420,0.337425, 0.015783,0.401804, -0.001438,0.415925, 0.031579,0.404581, 0.041846,0.335206, 0.079240,0.235103,
NEWSHAPE, 348, 1, 1, 0.008663,-0.233609, 0.008598,-0.236670, 0.039937,-0.234457, 0.082195,-0.248873, 0.101194,-0.283516, 0.097960,-0.306736, 0.045069,-0.337983, -0.033666,-0.406661, -0.064823,-0.404114, -0.127271,-0.339591, -0.144421,-0.275485, -0.132327,-0.228734, -0.153707,-0.155774, -0.224124,-0.089714, -0.257905,-0.091799, -0.211227,-0.013730, -0.195172,0.041425, -0.206643,0.109302, -0.209261,0.110889, -0.223014,0.082642, -0.256628,0.053254, -0.296129,0.054121, -0.314621,0.068532, -0.315236,0.129961, -0.335346,0.232486, -0.317561,0.258195, -0.230459,0.280015, -0.166367,0.262815, -0.131926,0.228966, -0.058051,0.211001, 0.034367,0.238954, 0.049452,0.269252, 0.093723,0.189793, 0.133461,0.148311, 0.197980,0.124307, 0.200663,0.125781, 0.183077,0.151815, 0.174433,0.195619, 0.194935,0.229395, 0.216661,0.238204, 0.270167,0.208022, 0.369012,0.174175, 0.382384,0.145919, 0.357730,0.059576, 0.310788,0.012670, 0.264253,-0.000232, 0.211758,-0.055227, 0.189757,-0.149240, 0.208453,-0.177453, 0.117504,-0.176063, 0.061711,-0.189736, 0.008663,-0.233609, NEWSHAPE, 348, 1, 1, 0.008663,-0.233609, 0.008598,-0.236670, 0.039937,-0.234457, 0.082195,-0.248873, 0.101194,-0.283516, 0.097960,-0.306736, 0.045069,-0.337983, -0.033666,-0.406661, -0.064823,-0.404114, -0.127271,-0.339591, -0.144421,-0.275485, -0.132327,-0.228734, -0.153707,-0.155774, -0.224124,-0.089714, -0.257905,-0.091799, -0.211227,-0.013730, -0.195172,0.041425, -0.206643,0.109302, -0.209261,0.110889, -0.223014,0.082642, -0.256628,0.053254, -0.296129,0.054121, -0.314621,0.068532, -0.315236,0.129961, -0.335346,0.232486, -0.317561,0.258195, -0.230459,0.280015, -0.166367,0.262815, -0.131926,0.228966, -0.058051,0.211001, 0.034367,0.238954, 0.049452,0.269252, 0.093723,0.189793, 0.133461,0.148311, 0.197980,0.124307, 0.200663,0.125781, 0.183077,0.151815, 0.174433,0.195619, 0.194935,0.229395, 0.216661,0.238204, 0.270167,0.208022, 0.369012,0.174175, 0.382384,0.145919, 0.357730,0.059576, 0.310788,0.012670, 0.264253,-0.000232, 0.211758,-0.055227, 0.189757,-0.149240, 0.208453,-0.177453, 0.117504,-0.176063, 0.061711,-0.189736, 0.008663,-0.233609,
NEWSHAPE, 349, 1, 2, -0.121972,-0.043111, -0.114642,-0.068365, -0.088391,-0.109437, -0.091010,-0.186252, -0.070420,-0.268876, -0.057667,-0.278726, -0.022404,-0.276319, 0.004269,-0.280716, 0.026650,-0.269700, 0.029709,-0.230247, 0.015894,-0.219344, -0.003181,-0.226933, -0.023333,-0.226963, -0.014779,-0.180514, -0.018939,-0.137833, 0.007353,-0.112396, 0.031445,-0.054504,
NEWSHAPE, 350, 1, 2, -0.125160,-0.046277, -0.115709,-0.070478, -0.085233,-0.111539, -0.094180,-0.184127, -0.071510,-0.271096, -0.054491,-0.283139, -0.006399,-0.274075, -0.002121,-0.225846, -0.022277,-0.229136, -0.014789,-0.188031, -0.018940,-0.138896, 0.010503,-0.110284, 0.034592,-0.055557,
NEWSHAPE, 351, 1, 2, -0.121946,-0.031538, -0.111405,-0.049397, -0.096675,-0.069354, -0.087345,-0.111549, -0.015775,-0.131461, -0.086284,-0.110485, -0.103742,-0.183136, -0.083551,-0.182966, -0.069423,-0.115705, -0.082446,-0.182860, -0.056507,-0.184308, -0.046776,-0.124036, -0.055447,-0.183766, -0.033783,-0.184751, -0.028908,-0.130351, -0.033253,-0.184213, -0.004225,-0.188021, -0.009468,-0.136762, -0.003150,-0.102889, -0.000000,-0.075460, -0.095569,-0.069314, -0.000000,-0.075500, 0.026212,-0.067103, 0.037193,-0.053432, -0.109760,-0.048841, 0.019376,-0.051845, 0.019363,0.000523, 0.020425,-0.052894, 0.037736,-0.052411, 0.036122,-0.020417, -0.121335,-0.020485, 0.034027,-0.019893, 0.002093,-0.019887, 0.001048,-0.077037, 0.001047,-0.021457, 0.001570,0.001047, 0.003140,-0.019887, 0.034027,-0.020416,
NEWSHAPE, 352, 1, 2, 0.060794,0.001192, 0.058426,0.023847, 0.050054,0.030986, 0.042896,0.038130, 0.044109,0.042917, 0.032180,0.050058, 0.017884,0.059612, 0.005963,0.064401, -0.009546,0.068015, -0.022689,0.070455, -0.044247,0.070556, -0.053847,0.068206, -0.047819,0.065752, -0.040573,0.056087, -0.040563,0.053686, -0.053753,0.053753, -0.067016,0.056246, -0.076602,0.051418, -0.065710,0.040621, -0.063272,0.034621, -0.064461,0.031037, -0.074098,0.028683, -0.094756,0.031185, -0.082872,0.019931, -0.074452,0.013632,
NEWSHAPE, 353, 1, 2, -0.006280,-0.006803, -0.001570,-0.039786, 0.007333,-0.062332, 0.014659,-0.042408, 0.019888,-0.016748, 0.027740,-0.009945,
NEWSHAPE, 354, 1, 2, 0.250609,-0.000793, 0.091262,-0.024449, 0.090008,-0.008476, -0.131783,-0.007990, -0.229492,-0.028849, -0.208244,0.002239,
NEWSHAPE NEWSHAPE
}; };