diff --git a/classes.cpp b/classes.cpp index 46386dc7..ebdd0c48 100644 --- a/classes.cpp +++ b/classes.cpp @@ -1241,7 +1241,7 @@ enum eItem { itNone, itDiamond, itGold, itSpice, itRuby, itElixir, itShard, itBo // --- wall types --- -const int walltypes = 103; +const int walltypes = 104; struct walltype { char glyph; @@ -1427,6 +1427,7 @@ walltype winf[walltypes] = { { 'S', 0xB0B0B0, "warrior statue", NODESCYET}, { '=', 0xB0B0B0, "bubbling slime", NODESCYET}, { '^', 0xD00000, "arrow trap", NODESCYET}, + { '=', 0xE2E2E2, "mercury river", NODESCYET}, }; enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCavefloor, waDeadTroll, waDune, @@ -1460,12 +1461,12 @@ enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCav waPetrifiedBridge, waTempBridgeBlocked, waTerraWarrior, waBubble, - waArrowTrap + waArrowTrap, waMercury }; // --- land types --- -const int landtypes = 76; +const int landtypes = 77; struct landtype { int color; @@ -1651,6 +1652,7 @@ const landtype linf[landtypes] = { { 0xA06000, "Alchemy II", NODESCYET}, { 0x8080FF, "Blizzard", NODESCYET}, { 0x207068, "Hunting Ground", NODESCYET}, + { 0xE2725B, "Terracotta Army", NODESCYET}, { 0xE2725B, "Terracotta Army", NODESCYET} }; @@ -1671,7 +1673,7 @@ enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle laPrairie, laBull, laCrossroads5, laCA, laMirrorWall, laMirrored, laMirrorWall2, laMirrored2, laMirrorOld, - laAlchemy2, laBlizzard, laDogPlains, laTerracotta + laAlchemy2, laBlizzard, laDogPlains, laTerracotta, laMercuryRiver }; // cell information for the game diff --git a/flags.cpp b/flags.cpp index 3380f235..2a7b3ede 100644 --- a/flags.cpp +++ b/flags.cpp @@ -24,7 +24,8 @@ bool isWatery(cell *c) { } bool isChasmy(cell *c) { - return c->wall == waChasm || c->wall == waSulphur || c->wall == waSulphurC || c->wall == waBubble; + return c->wall == waChasm || c->wall == waSulphur || c->wall == waSulphurC || c->wall == waBubble || + c->wall == waMercury; } bool isWateryOrBoat(cell *c) { @@ -588,6 +589,13 @@ bool survivesWater(eMonster m) { m == moTortoise; // Tortoises and Ivies survive, but don't go through water } +// survives Mercury or Sulphur +bool survivesPoison(eMonster m, eWall p) { + return + isGhost(m) || m == moWitchGhost || m == moShadow || + isBird(m) || m == moAirElemental || isDragon(m); + } + // flying even if stunned bool isPermanentFlying(eMonster m) { return m == moAirElemental || isGhost(m); diff --git a/game.cpp b/game.cpp index d6828186..10c2d441 100644 --- a/game.cpp +++ b/game.cpp @@ -5123,10 +5123,16 @@ void moverefresh(bool turn = true) { playSound(c, "click"); } else if(isChasmy(c) || isWatery(c)) { - c->wall = waReptileBridge; + if(c->wall == waMercury) { + fallMonster(c, AF_FALL); + c->wall = waNone; + } + else { + c->wall = waReptileBridge; + c->wparam = reptilemax(); + c->monst = moNone; + } c->item = itNone; - c->wparam = reptilemax(); - c->monst = moNone; playSound(c, "click"); } } @@ -5199,6 +5205,20 @@ void moverefresh(bool turn = true) { fallMonster(c, AF_FALL); } } + else if(c->wall == waSulphur || c->wall == waSulphurC || c->wall == waMercury) { + if(c->monst && !survivesPoison(c->monst, c->wall)) { + playSound(c, "splash"+pick12()); + if(isNonliving(c->monst)) + addMessage(XLAT("%The1 sinks!", c->monst)); + else + addMessage(XLAT("%The1 drowns!", c->monst)); + if(isBull(c->monst)) { + addMessage(XLAT("%The1 is filled!", c->wall)); + c->wall = waNone; + } + fallMonster(c, AF_FALL); + } + } else if(!isWateryOrBoat(c)) { if(c->monst == moGreaterShark) c->monst = moGreaterM; diff --git a/graph.cpp b/graph.cpp index 8eefb314..d358aa28 100644 --- a/graph.cpp +++ b/graph.cpp @@ -2353,7 +2353,7 @@ void setcolors(cell *c, int& wcol, int &fcol) { case laBurial: case laTrollheim: case laBarrier: case laOceanWall: case laCrossroads2: case laCrossroads3: case laCrossroads4: case laCrossroads5: case laRose: case laPower: case laWildWest: case laHalloween: case laRedRock: - case laDragon: case laStorms: case laTerracotta: + case laDragon: case laStorms: case laTerracotta: case laMercuryRiver: fcol = linf[c->land].color; break; case laDesert: fcol = 0xEDC9AF; break; @@ -2616,7 +2616,7 @@ void setcolors(cell *c, int& wcol, int &fcol) { fcol = wcol = winf[c->wall].color; */ // floors become fcol - if(c->wall == waSulphur || c->wall == waSulphurC || c->wall == waPlatform) + if(c->wall == waSulphur || c->wall == waSulphurC || c->wall == waPlatform || c->wall == waMercury) fcol = wcol; if(isAlch(c)) { @@ -2824,8 +2824,8 @@ void placeSidewall(cell *c, int i, int sidepar, const transmatrix& V, bool warp, if(shmup::on || purehepta) warp = false; if(warp && !ishept(c) && (!c->mov[i] || !ishept(c->mov[i]))) return; int prio; - if(mirr) prio = PPR_GLASS - 2; - else if(sidepar == SIDE_WALL) prio = PPR_WALL3 - 2; + /* if(mirr) prio = PPR_GLASS - 2; + else */ if(sidepar == SIDE_WALL) prio = PPR_WALL3 - 2; else if(sidepar == SIDE_WTS3) prio = PPR_WALL3 - 2; else if(sidepar == SIDE_LAKE) prio = PPR_LAKEWALL; else if(sidepar == SIDE_LTOB) prio = PPR_INLAKEWALL; @@ -2834,8 +2834,10 @@ void placeSidewall(cell *c, int i, int sidepar, const transmatrix& V, bool warp, transmatrix V2 = V * ddspin(c, i); - int aw = away(V2); prio += aw; + /* int aw = away(V2); prio += aw; if(!detaillevel && aw < 0) return; + */ + // queuepoly(V2 * xpush(.1), shSnowball, aw ? 0xFFFFFFFF : 0xFF0000FF); // prio += c->cpdist - c->mov[i]->cpdist; @@ -3255,6 +3257,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { c->land == laReptile ? 0 : c->land == laDogPlains ? 1 : c->land == laTerracotta ? 1 : + c->land == laMercuryRiver ? 0 : 2; if(c->land == laAlchemy2) { @@ -3870,7 +3873,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { int col = winf[waGlass].color; int dcol = darkena(col, 0, 0x80); transmatrix Vdepth = mscale((*Vdp), geom3::WALL); - queuepolyat(Vdepth, shMFloor[ct6], dcol, PPR_GLASS); + queuepolyat(Vdepth, shMFloor[ct6], dcol, PPR_WALL); // GLASS if(validsidepar[SIDE_WALL]) forCellIdEx(c2, i, c) placeSidewall(c, i, SIDE_WALL, (*Vdp), false, true, dcol); } @@ -3982,7 +3985,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { int col = winf[c->wall].color; int dcol = darkena(col, 0, 0xC0); transmatrix Vdepth = mscale((*Vdp), geom3::WALL); - queuepolyat(Vdepth, shMFloor[ct6], dcol, PPR_GLASS); + queuepolyat(Vdepth, shMFloor[ct6], dcol, PPR_WALL); // GLASS if(validsidepar[SIDE_WALL]) forCellIdEx(c2, i, c) placeSidewall(c, i, SIDE_WALL, (*Vdp), false, true, dcol); } @@ -4011,7 +4014,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { queuepoly(V, shBigCarpet3, darkena(0xC09F00, 0, 0xFF)); } - else if(xch != '.' && xch != '+' && xch != '>' && xch != ':'&& xch != '-' && xch != ';' && c->wall != waSulphur && xch != ',') + else if(xch != '.' && xch != '+' && xch != '>' && xch != ':'&& xch != '-' && xch != ';' && c->wall != waSulphur && c->wall != waMercury && xch != ',') error = true; } @@ -4311,7 +4314,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { #endif } - if(c->bardir != NODIR && c->bardir != NOBARRIERS && c->land != laHauntedWall && + if(vid.grid && c->bardir != NODIR && c->bardir != NOBARRIERS && c->land != laHauntedWall && c->barleft != NOWALLSEP_USED) { int col = darkena(0x505050, 0, 0xFF); queueline(tC0(V), V*tC0(heptmove[c->bardir]), col, 2); diff --git a/landgen.cpp b/landgen.cpp index b6b10385..9c5b98ba 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -223,7 +223,7 @@ int isNative(eLand l, eMonster m) { case laAlchemy2: return m == moLemur ? 2 : 0; - case laTerracotta: + case laTerracotta: case laMercuryRiver: return m == moJiangshi ? 2 : m == moTerraWarrior ? 1 : 0; case laBlizzard: @@ -321,7 +321,7 @@ eItem treasureType(eLand l) { case laPrairie: return itGreenGrass; case laAlchemy2: return itAlchemy2; - case laTerracotta: return itTerra; + case laTerracotta: case laMercuryRiver: return itTerra; case laBlizzard: return itBlizzard; case laDogPlains: return itDogPlains; @@ -783,7 +783,7 @@ bool landUnlocked(eLand l) { case laDogPlains: return true; - case laTerracotta: + case laTerracotta: case laMercuryRiver: return gold() >= 60; case laBlizzard: @@ -988,6 +988,10 @@ void setbarrier(cell *c) { c->land = laMirrorWall2; else if(c->barleft == laMirrored || c->barright == laMirrored) c->land = laMirrorWall; + else if(c->barleft == laTerracotta && c->barright == laTerracotta) { + c->land = laMercuryRiver; + c->wall = waMercury; + } else { c->wall = waBarrier; c->land = laBarrier; @@ -1440,7 +1444,8 @@ void extendCR5(cell *c) { bool isbar4(cell *c) { return c->wall == waBarrier || c->land == laElementalWall || - c->land == laMirrorWall || c->land == laMirrorWall2; + c->land == laMirrorWall || c->land == laMirrorWall2 || + c->land == laMercuryRiver; } void extendBarrier(cell *c) { @@ -1453,7 +1458,7 @@ void extendBarrier(cell *c) { // printf("build barrier at %p", c); if(c->land == laBarrier || c->land == laElementalWall || c->land == laHauntedWall || c->land == laOceanWall || - c->land == laMirrorWall || c->land == laMirrorWall2) { + c->land == laMirrorWall || c->land == laMirrorWall2 || c->land == laMercuryRiver) { // printf("-> ready\n"); return; } @@ -1718,7 +1723,8 @@ hookset *hooks_nextland; eLand getNewLand(eLand old) { - if(old == laMirror && !chaosmode && hrand(10) < 8) return laMirrored; + if(old == laMirror && !chaosmode && hrand(10) >= (tactic::on ? 0 : markOrb(itOrbLuck) ? 5 : 2)) return laMirrored; + if(old == laTerracotta && !chaosmode && hrand(5) >= (tactic::on ? 0 : markOrb(itOrbLuck) ? 2 : 1)) return laTerracotta; eLand l = callhandlers(laNone, hooks_nextland, old); if(l) return l; @@ -3180,6 +3186,8 @@ void buildBigStuff(cell *c, cell *from) { c->land == laCrossroads2 ? 10000 : c->land == laCrossroads5 ? 10000 : c->land == laCrossroads4 ? 0 : + (c->land == laMirror && !yendor::generating) ? 6000 : + c->land == laTerracotta ? 250 : (tactic::on && !tactic::trailer) ? 0 : c->land == laCaribbean ? 500 : (c->land == laWarpSea || c->land == laWarpCoast) ? 500 : @@ -3190,7 +3198,6 @@ void buildBigStuff(cell *c, cell *from) { (c->land == laGraveyard && items[itBone] >= 10) ? 120 : c->land == laOcean ? (deepOcean ? (purehepta ? 250 : 2000) : 0) : c->land == laDragon ? 120 : - (c->land == laMirror && !yendor::generating) ? 6000 : 50)) { @@ -4046,16 +4053,19 @@ void setdist(cell *c, int d, cell *from) { cwstep(cw); cc[3] = cw.c; cwrevstep(cw); cc[4] = cw.c; cwrevstep(cw2); cc[1] = cw2.c; cwrevstep(cw2); cc[0] = cw2.c; bool ok = true; - for(int i=1; i<4; i++) { - forCellEx(c2, cc[i]) if(c2->wall == waArrowTrap) ok = false; + for(int i=0; i<5; i++) { if(cc[i]->land != laNone && cc[i]->land != laTerracotta) ok = false; if(cc[i]->bardir != NODIR) ok = false; - cc[i]->bardir = NOBARRIERS; + } + for(int i=1; i<4; i++) { + forCellEx(c2, cc[i]) if(c2->wall == waArrowTrap) ok = false; } if(ok) { for(int i=1; i<4; i++) cc[i]->wall = waArrowTrap, cc[i]->wparam = 0; + for(int i=0; i<5; i++) + cc[i]->bardir = NOBARRIERS; cc[0]->wall = waStone; cc[4]->wall = waStone; } diff --git a/polygons.cpp b/polygons.cpp index 0476d4cc..3c8750d6 100644 --- a/polygons.cpp +++ b/polygons.cpp @@ -556,7 +556,7 @@ void drawqueue() { #else - int qp[PPR_MAX]; + int qp[PPR_MAX], qp0[PPR_MAX]; for(int a=0; au.poly.V * xpush0(.1), C0) + > intval(p2->u.poly.V * xpush0(.1), C0); + }); #endif profile_stop(3);