themed Alchemy2 as Volcanic Wasteland

This commit is contained in:
Zeno Rogue 2017-10-08 11:12:03 +02:00
parent 99d27f608d
commit 362abea781
8 changed files with 145 additions and 53 deletions

View File

@ -346,7 +346,7 @@ const char *mirroreddesc =
"Mirror walls reflect Mimics, lightning bolts, and "
"missiles perfectly.";
const int motypes = 150;
const int motypes = 151;
struct monstertype {
char glyph;
@ -700,10 +700,11 @@ monstertype minf[motypes] = {
{ 'T', 0xE2725B, "Terracotta Warrior", NODESC},
{ 'J', 0x50A030, "Jiangshi", NODESC},
{ 'B', 0xA00000, "Void Beast", NODESC},
{ 'L', 0xA00000, "Lemur", NODESC},
{ 'W', 0xA00000, "Lava Wolf", NODESC},
{ 'W', 0x202020, "Hunting Dog (guarding)", NODESC},
{ 'G', 0xC0C0FF, "Ice Golem", NODESC},
{ 'B', 0xC0C0FF, "Sand Bird", NODESC},
{ 'S', 0xA00000, "Salamander", NODESC},
// shmup specials
{ '@', 0xC0C0C0, "Rogue", "In the Shoot'em Up mode, you are armed with thrown Knives."},
@ -765,8 +766,8 @@ enum eMonster {
moVampire, moBat, moReptile,
moHerdBull, moRagingBull, moSleepBull,
moButterfly, moNarciss, moMirrorSpirit,
moHunterDog, moTerraWarrior, moJiangshi, moVoidBeast, moLemur, moHunterGuard,
moIceGolem, moSandBird,
moHunterDog, moTerraWarrior, moJiangshi, moVoidBeast, moLavaWolf, moHunterGuard,
moIceGolem, moSandBird, moSalamander,
// shmup specials
moPlayer, moBullet, moFlailBullet, moFireball, moTongue, moAirball,
// temporary
@ -801,7 +802,7 @@ genderswitch_t genderswitch[NUM_GS] = {
// --- items ---
const int ittypes = 119;
const int ittypes = 120;
struct itemtype {
char glyph;
@ -1194,13 +1195,14 @@ itemtype iinf[ittypes] = {
},
{ 'O', 0xF0F0F0, "your orbs",
"Click this to see your orbs."},
{ '$', 0xD0D000, "Sage's Stone", NODESCYET},
{ '%', 0xE0E000, "Lava Lily", NODESCYET},
{ '*', 0x40E0D0, "Turquoise", NODESCYET},
{ '*', 0x009090, "Forgotten Relic", NODESCYET},
{ '(', 0xFFE080, "Ancient Weapon", NODESCYET},
{ 'o', 0x307080, "Orb of the Side I", NODESCYET},
{ 'o', 0x30A080, "Orb of the Side II", NODESCYET},
{ 'o', 0x30D080, "Orb of the Side III", NODESCYET},
{ 'o', 0xD08030, "Orb of Lava", NODESCYET},
};
enum eItem { itNone, itDiamond, itGold, itSpice, itRuby, itElixir, itShard, itBone, itHell, itStatue,
@ -1235,13 +1237,14 @@ enum eItem { itNone, itDiamond, itGold, itSpice, itRuby, itElixir, itShard, itBo
itSlime, itAmethyst, itOrbRecall, itDodeca, itOrbDash, itGreenGrass, itOrbHorns,
itOrbBull, itBull, itOrbMirror,
itInventory,
itAlchemy2, itDogPlains, itBlizzard, itTerra,
itOrbSide1, itOrbSide2, itOrbSide3
itLavaLily, itDogPlains, itBlizzard, itTerra,
itOrbSide1, itOrbSide2, itOrbSide3,
itOrbLava
};
// --- wall types ---
const int walltypes = 104;
const int walltypes = 105;
struct walltype {
char glyph;
@ -1428,6 +1431,7 @@ walltype winf[walltypes] = {
{ '=', 0xB0B0B0, "bubbling slime", NODESCYET},
{ '^', 0xD00000, "arrow trap", NODESCYET},
{ '=', 0xE2E2E2, "mercury river", NODESCYET},
{ '&', 0xD00000, "magma", NODESCYET},
};
enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCavefloor, waDeadTroll, waDune,
@ -1461,7 +1465,7 @@ enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCav
waPetrifiedBridge,
waTempBridgeBlocked,
waTerraWarrior, waBubble,
waArrowTrap, waMercury
waArrowTrap, waMercury, waMagma
};
// --- land types ---
@ -1649,7 +1653,7 @@ const landtype linf[landtypes] = {
{ 0xC8C8FF, "Reflection", mirroreddesc},
{ 0xC8C8FF, "Mirror Land",
"A strange land which contains mirrors and mirages, protected by Mirror Rangers."},
{ 0xA06000, "Alchemy II", NODESCYET},
{ 0xA06000, "Volcanic Wasteland", NODESCYET},
{ 0x8080FF, "Blizzard", NODESCYET},
{ 0x207068, "Hunting Ground", NODESCYET},
{ 0xE2725B, "Terracotta Army", NODESCYET},
@ -1673,7 +1677,7 @@ enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle
laPrairie, laBull, laCrossroads5, laCA,
laMirrorWall, laMirrored, laMirrorWall2, laMirrored2,
laMirrorOld,
laAlchemy2, laBlizzard, laDogPlains, laTerracotta, laMercuryRiver
laVolcano, laBlizzard, laDogPlains, laTerracotta, laMercuryRiver
};
// cell information for the game

View File

@ -113,7 +113,7 @@ bool isMetalBeast(eMonster m) {
bool isStunnable(eMonster m) {
return m == moPalace || m == moFatGuard || m == moSkeleton || isPrincess(m) ||
isMetalBeast(m) || m == moTortoise || isDragon(m) ||
m == moReptile || m == moTerraWarrior;
m == moReptile || m == moTerraWarrior || m == moSalamander;
}
bool hasHitpoints(eMonster m) {
@ -270,7 +270,7 @@ int itemclass(eItem i) {
i == itKraken || i == itBarrow || i == itTrollEgg || i == itTreat ||
i == itSlime || i == itAmethyst || i == itDodeca ||
i == itGreenGrass || i == itBull ||
i == itAlchemy2 || i == itDogPlains ||
i == itLavaLily || i == itDogPlains ||
i == itBlizzard || i == itTerra
)
return IC_TREASURE;
@ -286,13 +286,13 @@ bool isAlch(eWall w) {
return w == waFloorA || w == waFloorB;
}
bool isAlch2(eWall w, bool bubbletoo) {
/* bool isAlch2(eWall w, bool bubbletoo) {
return w == waSlime1 || w == waSlime2 || (bubbletoo && w == waBubble);
}
} */
bool isAlch2(cell *c, bool bubbletoo) {
/* bool isAlch2(cell *c, bool bubbletoo) {
return isAlch2(c->wall, bubbletoo);
}
} */
bool isAlch(cell *c) { return isAlch(c->wall); }
@ -309,7 +309,7 @@ bool realred(eWall w) {
int snakelevel(eWall w) {
if(w == waRed1 || w == waDeadfloor2 || w == waRubble || w == waGargoyleFloor ||
w == waGargoyleBridge || w == waTempFloor || w == waTempBridge || w == waRoundTable ||
w == waPetrifiedBridge)
w == waPetrifiedBridge || w == waMagma)
return 1;
if(w == waRed2) return 2;
if(w == waRed3) return 3;
@ -334,7 +334,7 @@ bool isWall(cell *w) {
w->wall == waWeakBranch || w->wall == waCanopy || w->wall == waTower ||
w->wall == waSmallBush || w->wall == waBigBush ||
w->wall == waReptile || w->wall == waReptileBridge || w->wall == waInvisibleFloor ||
w->wall == waSlime1 || w->wall == waSlime2 || w->wall == waArrowTrap)
w->wall == waSlime1 || w->wall == waSlime2 || w->wall == waArrowTrap || w->wall == waMagma)
return false;
if(isWatery(w) || isChasmy(w) || isFire(w)) return false;
return true;
@ -376,7 +376,9 @@ bool normalMover(eMonster m) {
m == moRoseBeauty || m == moWolf ||
m == moResearcher || m == moRagingBull ||
m == moNarciss || m == moMirrorSpirit ||
m == moHunterDog || m == moTerraWarrior || m == moJiangshi || m == moLemur || m == moHunterGuard ||
m == moHunterDog || m == moTerraWarrior || m == moJiangshi ||
m == moLavaWolf || m == moSalamander ||
m == moHunterGuard ||
m == moIceGolem || slowMover(m);
}
@ -605,7 +607,7 @@ bool survivesFire(eMonster m) {
return
isGhost(m) || m == moWitchWinter || m == moWitchGhost ||
m == moBomberbird || m == moTameBomberbird || m == moTameBomberbirdMoved ||
(isFriendly(m) && markOrb(itOrbWinter)) || isWorm(m) || m == moFireElemental ||
(isFriendly(m) && markOrb(itOrbWinter)) || m == moFireElemental ||
isDragon(m) || m == moShadow;
}

View File

@ -334,6 +334,8 @@ int* killtable[] = {
&kills[moGadfly], &kills[moButterfly],
&kills[moNarciss], &kills[moMirrorSpirit],
&kills[moHunterDog], &kills[moIceGolem], &kills[moVoidBeast],
&kills[moJiangshi], &kills[moTerraWarrior],
&kills[moSalamander], &kills[moLavaWolf],
NULL
};
@ -520,7 +522,8 @@ bool passable(cell *w, cell *from, flagtype flags) {
return F(P_MIRRORWALL);
if(F(P_BULLET)) {
if(isFire(w) || w->wall == waBonfireOff || cellHalfvine(w) ||
if(isFire(w) || w->wall == waBonfireOff || cellHalfvine(w) ||
w->wall == waMagma ||
w->wall == waAncientGrave || w->wall == waFreshGrave || w->wall == waRoundTable)
return true;
}
@ -558,7 +561,7 @@ bool passable(cell *w, cell *from, flagtype flags) {
if(isThorny(w->wall) && F(P_BLOW | P_DEADLY)) return true;
if(isFire(w)) {
if(isFire(w) || w->wall == waMagma) {
if(!F(P_AETHER | P_WINTER | P_BLOW | P_JUMP1 | P_BULLET | P_DEADLY)) return false;
}
@ -1682,9 +1685,10 @@ void stunMonster(cell *c2) {
c2->monst == moVizier ? 1 :
c2->monst == moHedge ? 1 :
c2->monst == moFlailer ? 1 :
c2->monst == moSalamander ? 6 :
3);
if(c2->monst != moSkeleton && !isMetalBeast(c2->monst) && c2->monst != moTortoise &&
c2->monst != moReptile) {
c2->monst != moReptile && c2->monst != moSalamander) {
c2->hitpoints--;
if(c2->monst == moPrincess)
playSound(c2, princessgender() ? "hit-princess" : "hit-prince");
@ -2432,10 +2436,12 @@ void checkTide(cell *c) {
if(isFire(c) && t >= tidalphase)
c->wall = waSea;
}
if(isAlch2(c, true)) {
if(c->land == laVolcano) {
int id = alchemyval(c, 0);
if(id < 96) c->wall = waBubble;
else c->wall = waSlime1;
if(id < 96) {
if(c->wall == waNone) c->wall = waMagma;
}
else if(c->wall == waMagma) c->wall = waNone;
}
}
@ -4703,7 +4709,7 @@ int movevalue(eMonster m, cell *c, cell *c2, flagtype flags) {
isActiveEnemy(c2,m) ? 12000 :
(c2->monst == moSkeleton || c2->monst == moMetalBeast ||
c2->monst == moReptile || c2->monst == moTortoise ||
c2->monst == moTerraWarrior) ? -400 :
c2->monst == moSalamander || c2->monst == moTerraWarrior) ? -400 :
isIvy(c2) ? 8000 :
isInactiveEnemy(c2,m) ? 1000 :
-500;
@ -5175,7 +5181,7 @@ void moverefresh(bool turn = true) {
}
else if(isFire(c)) {
if(c->monst && !survivesFire(c->monst)) {
if(c->monst && !survivesFire(c->monst) && !isWorm(c->monst)) {
addMessage(XLAT("%The1 burns!", c->monst));
if(isBull(c->monst)) {
addMessage(XLAT("Fire is extinguished!"));
@ -5219,6 +5225,17 @@ void moverefresh(bool turn = true) {
fallMonster(c, AF_FALL);
}
}
else if(c->wall == waMagma) {
if(c->monst == moSalamander) c->stuntime = max<int>(c->stuntime, 1);
else if(c->monst && !survivesPoison(c->monst, c->wall)) {
playSound(c, "splash"+pick12());
if(isNonliving(c->monst))
addMessage(XLAT("%The1 is destroyed by lava!", c->monst));
else
addMessage(XLAT("%The1 is killed by lava!", c->monst));
fallMonster(c, AF_FALL);
}
}
else if(!isWateryOrBoat(c)) {
if(c->monst == moGreaterShark)
c->monst = moGreaterM;
@ -5300,6 +5317,9 @@ void moveNormals(eMonster param) {
void movemonsters() {
DEBT("lava1");
orboflava(1);
sagefresh = true;
turncount++;
@ -5376,6 +5396,9 @@ void movemonsters() {
DEBT("fresh");
moverefresh();
DEBT("lava2");
orboflava(2);
DEBT("shadow");
moveshadow();
@ -6907,6 +6930,7 @@ bool movepcto(int d, int subdir, bool checkonly) {
drawParticles(c2, winf[c2->wall].color, 8);
addMessage(XLAT("You chop down the tree."));
playSound(c2, "hit-axe" + pick123());
c2->wall = waSmallTree;
sideAttack(cwt.c, d, moPlayer, 0);
}
else {

View File

@ -947,7 +947,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
queuepoly(VHEAD, shPFace, facecolor);
}
else if(m == moWolf || m == moRedFox || m == moWolfMoved) {
else if(m == moWolf || m == moRedFox || m == moWolfMoved || m == moLavaWolf) {
ShadowV(V, shWolfBody);
if(mmspatial || footphase)
animallegs(VALEGS, moWolf, darkena(col, 0, 0xFF), footphase);
@ -978,6 +978,17 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
queuepoly(VAHEAD * Mirror, shReptileEye, darkena(col, 3, 0xFF));
queuepoly(VABODY, shReptileTail, darkena(col, 2, 0xFF));
}
else if(m == moSalamander) {
ShadowV(V, shReptileBody);
animallegs(VALEGS, moReptile, darkena(0xD00000, 1, 0xFF), footphase);
queuepoly(VABODY, shReptileBody, darkena(0xD00000, 0, 0xFF));
queuepoly(VAHEAD, shReptileHead, darkena(0xD00000, 1, 0xFF));
queuepoly(VAHEAD, shReptileEye, darkena(0xD00000, 0, 0xFF));
queuepoly(VAHEAD * Mirror, shReptileEye, darkena(0xD00000, 0, 0xFF));
queuepoly(VABODY, shReptileTail, darkena(0xD08000, 0, 0xFF));
}
else if(m == moVineBeast) {
ShadowV(V, shWolfBody);
if(mmspatial || footphase)
@ -1211,7 +1222,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
queuepoly(VHEAD, shPFace, darkena(col, 1, 0x90));
queuepoly(VHEAD, shArmor, darkena(col, 0, 0xC0));
}
else if(m == moJiangshi || m == moLemur) {
else if(m == moJiangshi) {
ShadowV(V, shJiangShi);
auto z2 = geom3::lev_to_factor(abs(sin(footphase * M_PI * 2)) * geom3::human_height);
auto V0 = V;
@ -2363,6 +2374,26 @@ void setcolors(cell *c, int& wcol, int &fcol) {
case laGraveyard: fcol = 0x107010; break;
case laWineyard: fcol = 0x006000; break;
case laLivefjord: fcol = 0x306030; break;
case laVolcano: {
int id = alchemyval(c, -1)/4;
if(c->wall == waMagma) {
if(id == 95/4-1) fcol = wcol = 0x200000;
else if(id == 95/4) fcol = wcol = 0x100000;
else if(id < 48/4) fcol = wcol = gradient(0xF0F000, 0xF00000, 0, id, 48/4);
else if(id < 96/4) fcol = wcol = gradient(0xF00000, 0x400000, 48/4, id, 95/4-2);
}
else {
fcol = wcol = 0x404040;
if(id == 255/4) fcol = 0xA0A040;
if(id == 255/4-1) fcol = 0x606040;
}
/* {
if(id/4 == 255/4) fd = 0;
if(id/4 == 95/4-1 || id/4 == 255/4-1) fd = 1;
} */
break;
}
case laMinefield:
fcol = 0x80A080;
@ -2626,14 +2657,14 @@ void setcolors(cell *c, int& wcol, int &fcol) {
fcol = wcol;
}
if(isAlch2(c, true)) {
/* if(false && isAlch2(c, true)) {
int id = alchemyval(c, -1);
if(id < 96)
wcol = gradient(0x800000, 0xFF0000, 0, id, 96);
else
wcol = gradient(0x00FF00, 0xFFFF00, 96, id, 255);
fcol = wcol;
}
} */
if(c->wall == waDeadTroll2 || c->wall == waPetrified || c->wall == waPetrifiedBridge) {
eMonster m = eMonster(c->wparam);
@ -3260,12 +3291,8 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
c->land == laMercuryRiver ? 0 :
2;
if(c->land == laAlchemy2) {
int id = alchemyval(c, -1);
if(id/4 == 95/4 || id/4 == 255/4) fd = 0;
if(id/4 == 95/4-1 || id/4 == 255/4-1) fd = 1;
}
if(c->wall == waMagma) fd = 0;
poly_outline = OUTLINE_DEFAULT;
int sl = snakelevel(c);
@ -3548,6 +3575,9 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
else if(c->land == laAlchemist)
qfloor(c, Vf, shCloudFloor[ct6], darkena(fcol, fd, 0xFF));
else if(c->land == laVolcano && !eoh)
qfloor(c, Vf, shLavaFloor[ct6], darkena(fcol, fd, 0xFF));
else if(c->land == laRose)
qfloor(c, Vf, shRoseFloor[purehepta ? 2 : ct6], darkena(fcol, fd, 0xFF));

View File

@ -944,8 +944,10 @@ enum PPR {
PPR_HEPTAMARK,
PPR_ITEM, PPR_ITEMa, PPR_ITEMb,
PPR_BIGSTATUE,
PPR_GLASSm, PPR_GLASSs, PPR_GLASSp, PPR_GLASS,
PPR_WALL3m, PPR_WALL3s, PPR_WALL3p, PPR_WALL3, PPR_WALL3A,
// PPR_WALL3m, PPR_WALL3s, PPR_WALL3p, PPR_WALL3, PPR_WALL3A,
PPR_HIDDEN, PPR_GIANTSHADOW,
PPR_TENTACLE0, PPR_TENTACLE1,
PPR_ONTENTACLE, PPR_ONTENTACLE_EYES, PPR_ONTENTACLE_EYES2,
@ -1550,3 +1552,5 @@ void produceGhost(cell *c, eMonster victim, eMonster who);
void sideAttack(cell *mf, int dir, eMonster who, int bonus, eItem orb);
void sideAttack(cell *mf, int dir, eMonster who, int bonuskill);
void warpfloor(cell *c, const transmatrix& V, int col, int prio, bool warp);
void orboflava(int i);

View File

@ -220,8 +220,8 @@ int isNative(eLand l, eMonster m) {
case laPrairie:
return (m == moRagingBull || m == moHerdBull || m == moGadfly) ? 1 : 0;
case laAlchemy2:
return m == moLemur ? 2 : 0;
case laVolcano:
return (m == moLavaWolf || m == moSalamander) ? 2 : 0;
case laTerracotta: case laMercuryRiver:
return m == moJiangshi ? 2 : m == moTerraWarrior ? 1 : 0;
@ -320,7 +320,7 @@ eItem treasureType(eLand l) {
case laBull: return itBull;
case laPrairie: return itGreenGrass;
case laAlchemy2: return itAlchemy2;
case laVolcano: return itLavaLily;
case laTerracotta: case laMercuryRiver: return itTerra;
case laBlizzard: return itBlizzard;
case laDogPlains: return itDogPlains;
@ -777,7 +777,7 @@ bool landUnlocked(eLand l) {
case laBull:
return gold() >= R90;
case laAlchemy2:
case laVolcano:
return gold() >= R30 && items[itElixir] >= U10;
case laDogPlains:
@ -4025,8 +4025,12 @@ void setdist(cell *c, int d, cell *from) {
if(c->land == laAlchemist)
c->wall = (randomPatternsMode ? RANDPAT : hrand(2)) ? waFloorA : waFloorB;
if(c->land == laAlchemy2)
c->wall = waSlime1;
if(c->land == laVolcano) {
c->wall = waNone;
if(hrand(20000) < (items[itLavaLily] + hard))
c->monst = moSalamander,
c->hitpoints = 3;
}
if(c->land == laBlizzard) {
bool windless = true;
@ -5084,11 +5088,11 @@ void setdist(cell *c, int d, cell *from) {
c->monst = pick(moVoidBeast, moIceGolem);
}
if(c->land == laAlchemy2) {
if(hrand(5000) < PT(100 + 2 * kills[moLemur], 200) && notDippingFor(itAlchemy2))
c->item = itAlchemy2;
if(hrand(8000) < 2 * (items[itAlchemy2] + hard))
c->monst = moLemur;
if(c->land == laVolcano) {
if(hrand(5000) < PT(100 + 2 * kills[moLavaWolf], 200) && notDippingFor(itLavaLily))
c->item = itLavaLily;
if(hrand(8000) < (items[itLavaLily] + hard))
c->monst = moLavaWolf;
}
if(c->land == laTerracotta) {

View File

@ -1266,3 +1266,20 @@ bool isShmupLifeOrb(eItem it) {
it == itOrbUndeath || it == itOrbLove ||
it == itOrbDomination;
}
void makelava(cell *c, int i) {
if(!pseudohept(c)) return;
if(isPlayerOn(c)) return;
if(c->wall == waFire && c->wparam < i)
c->wparam = i;
else makeflame(c, i, false);
}
void orboflava(int i) {
if(items[itOrbLava])
for(cell *c: dcal) {
if(c->cpdist > 5) break;
if(!c->monst || isFriendly(c) || survivesFire(c->monst)) continue;
forCellEx(c2, c) makelava(c2, i);
}
}

View File

@ -631,7 +631,7 @@ hpcshape
shFloorShadow[2], shTriheptaFloorShadow[2], shTriheptaEucShadow[3],
shWall[2], shMineMark[2], shFan,
shStarFloor[2], shCloudFloor[2], shTriFloor[2], shZebra[5],
shButterflyFloor[2],
shButterflyFloor[2], shLavaFloor[2],
shTower[11],
shTurtleFloor[3], shDragonFloor[3], shRoseFloor[3],
shChargedFloor[4], shSStarFloor[2], shOverFloor[3],
@ -1307,6 +1307,9 @@ void buildpolys() {
bshape(shButterflyFloor[0], PPR_FLOOR, scalef*spzoom6, 325);
bshape(shButterflyFloor[1], PPR_FLOOR, scalef*spzoomd7, 326);
bshape(shLavaFloor[0], PPR_FLOOR, scalef*spzoom6, 359);
bshape(shLavaFloor[1], PPR_FLOOR, scalef*spzoomd7, 360);
bshape(shHalfFloor[0], PPR_FLOOR, scalef*spzoom6, 329);
bshape(shHalfFloor[1], PPR_FLOOR, scalef*spzoom6, 327);
bshape(shHalfFloor[2], PPR_FLOOR, scalef*spzoom6, 331);
@ -2831,6 +2834,10 @@ NEWSHAPE, 356, 1, 2, 0.038226,0.003813, 0.036965,0.050265, 0.023804,0.086855, 0.
NEWSHAPE, 357, 1, 2, -0.056345,0.025535, -0.042089,0.052635, 0.008058,0.053871, 0.047795,0.029085,
NEWSHAPE, 358, 1, 2, -0.045357,0.025586, -0.031505,0.043770, 0.005524,0.044623, 0.033574,0.024080,
NEWSHAPE, 359, 3, 1, -0.266809,0.074675, -0.122340,0.044980, -0.116509,0.053995, -0.263332,0.086012, -0.243276,0.226327, -0.046949,0.233904, -0.045697,0.176132, 0.043359,0.148557, 0.174518,-0.035928, 0.185648,-0.026857, 0.048860,0.153622, -0.026215,0.175210, -0.030599,0.236932, 0.114203,0.249675,
NEWSHAPE, 360, 7, 1, -0.118455,0.162875, -0.179457,0.274805, -0.139062,0.404961, -0.014470,0.358081, 0.088081,0.314743, 0.043390,0.203194, -0.025414,0.211780, -0.019156,0.324240, -0.044420,0.213922, -0.097269,0.172336, -0.097226,0.166975, -0.013745,0.197716,
NEWSHAPE
};