1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-07-08 12:22:49 +00:00

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

View File

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

View File

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

View File

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

View File

@ -944,8 +944,10 @@ enum PPR {
PPR_HEPTAMARK, PPR_HEPTAMARK,
PPR_ITEM, PPR_ITEMa, PPR_ITEMb, PPR_ITEM, PPR_ITEMa, PPR_ITEMb,
PPR_BIGSTATUE, 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_WALL3m, PPR_WALL3s, PPR_WALL3p, PPR_WALL3, PPR_WALL3A,
PPR_HIDDEN, PPR_GIANTSHADOW, PPR_HIDDEN, PPR_GIANTSHADOW,
PPR_TENTACLE0, PPR_TENTACLE1, PPR_TENTACLE0, PPR_TENTACLE1,
PPR_ONTENTACLE, PPR_ONTENTACLE_EYES, PPR_ONTENTACLE_EYES2, 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 bonus, eItem orb);
void sideAttack(cell *mf, int dir, eMonster who, int bonuskill); void sideAttack(cell *mf, int dir, eMonster who, int bonuskill);
void warpfloor(cell *c, const transmatrix& V, int col, int prio, bool warp); 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: case laPrairie:
return (m == moRagingBull || m == moHerdBull || m == moGadfly) ? 1 : 0; return (m == moRagingBull || m == moHerdBull || m == moGadfly) ? 1 : 0;
case laAlchemy2: case laVolcano:
return m == moLemur ? 2 : 0; return (m == moLavaWolf || m == moSalamander) ? 2 : 0;
case laTerracotta: case laMercuryRiver: case laTerracotta: case laMercuryRiver:
return m == moJiangshi ? 2 : m == moTerraWarrior ? 1 : 0; return m == moJiangshi ? 2 : m == moTerraWarrior ? 1 : 0;
@ -320,7 +320,7 @@ eItem treasureType(eLand l) {
case laBull: return itBull; case laBull: return itBull;
case laPrairie: return itGreenGrass; case laPrairie: return itGreenGrass;
case laAlchemy2: return itAlchemy2; case laVolcano: return itLavaLily;
case laTerracotta: case laMercuryRiver: return itTerra; case laTerracotta: case laMercuryRiver: return itTerra;
case laBlizzard: return itBlizzard; case laBlizzard: return itBlizzard;
case laDogPlains: return itDogPlains; case laDogPlains: return itDogPlains;
@ -777,7 +777,7 @@ bool landUnlocked(eLand l) {
case laBull: case laBull:
return gold() >= R90; return gold() >= R90;
case laAlchemy2: case laVolcano:
return gold() >= R30 && items[itElixir] >= U10; return gold() >= R30 && items[itElixir] >= U10;
case laDogPlains: case laDogPlains:
@ -4025,8 +4025,12 @@ void setdist(cell *c, int d, cell *from) {
if(c->land == laAlchemist) if(c->land == laAlchemist)
c->wall = (randomPatternsMode ? RANDPAT : hrand(2)) ? waFloorA : waFloorB; c->wall = (randomPatternsMode ? RANDPAT : hrand(2)) ? waFloorA : waFloorB;
if(c->land == laAlchemy2) if(c->land == laVolcano) {
c->wall = waSlime1; c->wall = waNone;
if(hrand(20000) < (items[itLavaLily] + hard))
c->monst = moSalamander,
c->hitpoints = 3;
}
if(c->land == laBlizzard) { if(c->land == laBlizzard) {
bool windless = true; bool windless = true;
@ -5084,11 +5088,11 @@ void setdist(cell *c, int d, cell *from) {
c->monst = pick(moVoidBeast, moIceGolem); c->monst = pick(moVoidBeast, moIceGolem);
} }
if(c->land == laAlchemy2) { if(c->land == laVolcano) {
if(hrand(5000) < PT(100 + 2 * kills[moLemur], 200) && notDippingFor(itAlchemy2)) if(hrand(5000) < PT(100 + 2 * kills[moLavaWolf], 200) && notDippingFor(itLavaLily))
c->item = itAlchemy2; c->item = itLavaLily;
if(hrand(8000) < 2 * (items[itAlchemy2] + hard)) if(hrand(8000) < (items[itLavaLily] + hard))
c->monst = moLemur; c->monst = moLavaWolf;
} }
if(c->land == laTerracotta) { if(c->land == laTerracotta) {

View File

@ -1266,3 +1266,20 @@ bool isShmupLifeOrb(eItem it) {
it == itOrbUndeath || it == itOrbLove || it == itOrbUndeath || it == itOrbLove ||
it == itOrbDomination; 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], shFloorShadow[2], shTriheptaFloorShadow[2], shTriheptaEucShadow[3],
shWall[2], shMineMark[2], shFan, shWall[2], shMineMark[2], shFan,
shStarFloor[2], shCloudFloor[2], shTriFloor[2], shZebra[5], shStarFloor[2], shCloudFloor[2], shTriFloor[2], shZebra[5],
shButterflyFloor[2], shButterflyFloor[2], shLavaFloor[2],
shTower[11], shTower[11],
shTurtleFloor[3], shDragonFloor[3], shRoseFloor[3], shTurtleFloor[3], shDragonFloor[3], shRoseFloor[3],
shChargedFloor[4], shSStarFloor[2], shOverFloor[3], shChargedFloor[4], shSStarFloor[2], shOverFloor[3],
@ -1307,6 +1307,9 @@ void buildpolys() {
bshape(shButterflyFloor[0], PPR_FLOOR, scalef*spzoom6, 325); bshape(shButterflyFloor[0], PPR_FLOOR, scalef*spzoom6, 325);
bshape(shButterflyFloor[1], PPR_FLOOR, scalef*spzoomd7, 326); 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[0], PPR_FLOOR, scalef*spzoom6, 329);
bshape(shHalfFloor[1], PPR_FLOOR, scalef*spzoom6, 327); bshape(shHalfFloor[1], PPR_FLOOR, scalef*spzoom6, 327);
bshape(shHalfFloor[2], PPR_FLOOR, scalef*spzoom6, 331); 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, 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, 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 NEWSHAPE
}; };